This page contains the summary of GBR2GREYSCALE release dates, versions and changes/fixes made for that release.
This version fixes an issue in the Boolean engine related to polygons (which may be the result of intermediate calculations) having short edges (< 5 DBU). This was manifest as dropped data as was the result of the presence of redundant data in the Gerber stream (several coincident pads instantiated at the same location across paint and scratch layers).
This version reflects enhancements to the new recovery flow in the
boolean library introduced (and described) in the v2.10f release notes.
These improvements which do not impact throughput and sometimes
even improve it will be propagated in other Artwork products as they are
released. These improvements should have favorable impact on those flows
where booleanization and especially erosion occur.
This version fixes a bug in the boolean library. A new approach was introduced in the Boolean library in detecting serious data loss. This release represents the first cut in a new recovery strategy when data loss is detected. It is expected that this new detection/recovery method will be further enhanced in the next couple of months.
This version fixes a bug in the boolean library when handling two nearly identical polygons in a much larger data set that manifested as a crash in the boolean engine. The library was fooled into thinking that it was handling a "butterfly" configuration when in fact it was not.
Zombie Process Issue
This release addresses an issue of a zombie process as the result of a
user cancel. In particular Gerber2Greyscale launches the GbrUnionMgr to
support erosion. GbrUnionMgr will in turn spawn a copy of Boolw64f which
can be exploder limited for very large (intermediate GDS) files.
Under the right conditions (after scanning the input file) Boolw64f will
launch Boolql64 which is based on QISLIB (the precursor to QisMLib).
It's exploder is quad tree based so it lends itself to improved
throughput for larger data sets.
Previously, if Boolql64 was active and GbrUnionMgr was killed or if Boolw64f was terminated for any reason Boolql64 would be unaware of this and would attempt run to completion.
With this new release Boolql64 monitors the execution state of its parent and kill itself if the parent is no longer running.
This version fixes an issue where a zero length round draw was converted to a flash in the context of erosion which manifested as a crash in the boolean engine while dereferencing a GDS cell that did not exist.
The missing cell definition in turn was the result of an indexing bug when looking up the Dcode for the zero length draw replacement as a flash.
The Gerber preprocessor shared no fault in this problematic flow, rather the issue lay with a module that appears between the preprocessor and the boolean engine.
Gerber2Greyscale exhibited a behavior where the preprocessor was stuck in an endless loop.
The preprocessor aims to minimize the total number of Dcode and custom Dcode (RS274X macros) definitions and uses the -macro_tol:value command line option.
In this case, the customer specified the macro tolerance to be 0.000005 mm (5 nm)
in which case it was unable to coalesce many of the 12540 Dcode definitions which in this case 12341 were line macros involving a single line draw construct.
By default the maximum number of Dcode definitions is 9999.
There are two workarounds to this issue, (1) either relax the macro tolerance or (2) allow for a larger number of Dcode definitions.
The Split274x preprocessor breaks up polygons according to the user specified -maxpts:number command line option. For the Gerber file associated with this issue a round hole was lost during this boolean issue. This data loss attributable to the boolean library was recognized and repaired in the preprocessor. The boolean library was not changed.
The built in error reporting system had a bug which was introduced on 29 January 2024 causing the program to crash. This has now been fixed.
This version is an upgraded version of v2.10 (it has some newer modules in addition to Gbr2greyscale DLL and EXE). The header file has not changed. In this version the Windows CopyFile API was replaced with MoveFile, preceeded by a DeleteFile of the target file, to improve throughput.
This release fixes an issue that manifests as serious data loss for a particular
Gerber file when compensation is invoked. The data loss occurs
during unionization before compensation. This data loss is the result of
the input Gerber being very "dirty".
A new flow was added to handle this class of data in an effort to remove
degeneracies in the intermediate boolean results. This flow can be
invoked from the Gerber2Greyscale command line with -dirtydata or
-dirtydata:N (N = 0 or 1).
-dirtydata:0 is equivalent to not invoking this mode.
-dirtydata and -dirtydata:1 are equivalent and invoke the new flow.
When using the library this new flow can be invoked by setting the member mDirtyData of struct sGREYSETTING to 1. As such, a new header file igbriplib.h is provided with the package. Regression
testing was performed with the production command line executable
gbr2greyscale64.exe as well as the executable built from the sample code
provided in the package with the new flow active and not. This new flow
appears to mitigate the degeneracies associated with the data found in
the customer file and does not seem to impact throughput. In fact, some
improvements in fidelity were discovered during regression testing.
An alternative flow (mDirtyData == 2) is being developed and is part of
this release but its use is discouraged at this time. It is thought that
this alternative flow will provide a yet more robust model in mitigating
bad boolean behaviors but it is expected to be slower.
The gdscompact engine was added to the unionization flow in August of 2006 to improve
throughput when encountering RS274X (S)tep and (R)epeat mass parameters
specifying more than one column or one row. Now with all flows, new and
old, invocation of the gdscompact engine is disabled when erosion has
been invoked.
It was discovered during careful examination of the new vs. old flows that this optimization can (but most often not) generate spurious results associated with erosion. For simple unionization (no
erosion) this optimization is not turned off. If necessary this restriction can be defeated by providing --skip_gdscompact as a Gerber2Greyscale command line option or setting the member
mSkipGdscompact of struct sGREYSETTING to -1. The values to both new member variables mDirtyData and mSkipGdscompact can be set via the environment variables ACS_DIRTYDATA and ACS_SKIP_GDSCOMPACT
respectively. This can be helpful in affecting desired flows without any
changes to test scripts, command line options or APIs.
This version contains the same Gbr2Tiff modules as in GBRIP Version 8.12a (released 16 January 2024).
This release includes the updated header file igbriplib.h which was not provided with the previous 2.08 package.
This release fixed an issue where customer supplied extremely long file names that
exceeded the WIN32 maximum of 260 characters. This was achieved by not
making use of the customer supplied output base name but rather a
(short) unique temporary name for all intermediate steps. At the end the
output is copied from the working folder to the target folder with the
user supplied base name by way of the Windows CopyFile API and signally
to the OS to make use of the names literally by prefixing them with the
"\\?\". Use of this technique does not allow for the use of relative
path names which required some attention in providing this fix.
This release contains the same Gbr2Tiff modules as in GBRIP Version 8.12 (released 24 October 2023).
A problem was reported such that when using the GBR2GREYSCALE DLL the
working folder could not be cleaned up because log files associated with
the split274x Gerber preprocessor were not closed.
In addition to this issue, a memory leak associated with a boolean function (window break)
was fixed.
These issues would not be apparent in the use of the EXE
version of GBR2GREYSCALE.
This release contains the same Gbr2Tiff modules as in GBRIP Version 8.11a (released
27 September 2023).
This new version of Gerber2Greyscale makes use of that new version of split274x and the latest boolean engine.
This version addresses a problem when the boolean engine is invoked (as in the case of erosion). A customer ODB++ file and the associated Gerber file had many redundant lines and pads. Specifically, the first internal paint layer (there were 56 layers in total) of the Gerber file contained 13919 drawables of which only 487 were unique. The boolean engine makes estimates of the data complexity by counting vertices and intersections between edges. The overlapping identical polygons played havoc with the boolean engine's complexity estimator while the boolean library had to do a lot of extra work to remove the degeneracies introduced by these perfectly overlapping polygons. Where before the job associated with the aforementioned Gerber file never completed, the entire job finishes in under 30 seconds.
This version contains the same Gbr2Tiff modules as in GBRIP Version 8.10 (released 27 July 2023).
This version has throughput improvements in unionization and sizing (new boolean engine and library) when the Gerber file to be rasterized is large (>> 250 MB). Customer reported that v2.07e was more than 19x slower than v2.07b for the files in question.
This version contains the same Gbr2Tiff modules as in GBRIP v8.07 (released October 1, 2022).
This version fixed an issue where a particular Gerber file is processed incorrectly
by the Gerber preprocessor. The "problem" was manifest in that the autowindow feature provided incorrect (much larger) extents than the
original data. This error happened only under the (default) condition
that rounded ended arc draws are outlined (converted to polygons).
This issue in the preprocessor has been corrected. Module testing of the new
Gerber preprocessor which represents 4382 tests (1451 Gerber files x 2
execution modes and 740 Gerber file x 2 execution modes) yielded no differences except with respect to this new problem file.
This version has throughput improvements over the previous release where regression testing used to take 7 hours. This time has been reduced to 4:50 (hh:mm). This improvement in throughput shows up in a number of "corner" cases that are part of the Gerber2Greyscale regression test. Even though these "corner" cases are taken from production data the speed up will not be manifest otherwise.
This version fixed an issue where a Gerber file that is constructed of a hatch pattern where many of the pathlike features that make up the hatch have rounded ends on one side and "flush" on the other. The observed bad behavior appeared to be excessive throughput times. This behavior only manifested itself with erosion (compensation) otherwise throughput was reasonable. Erosion is achieved by way of a boolean engine and throughput goes as N^2 with complexity. Complexity is measured in terms of vertex counts and the number intersections. Throughput can be improved by linearization (avoiding the N^2 regime) by dividing the problem set into smaller domains. This data set fooled the algorithm used to measure complexity resulting in not adequately dividing the problem set into enough domains.
Fixed an issue where when using the Gbr2Greyscale DLL the input file handle was not closed/released by the Gerber preprocessor. This issue did not manifest itself when the -nosplit command line option was used.
File name with CommaFixed a problem when a file name or folder name had a comma. This problem manifested itself as a problem because comma is used as a delimiter in the job file (a dynamically created resource file) for the actual import of the Gerber data into various modules. If the path or base name contained one or more commas this would/could cause some confusion when reading the job file.
This version fixes an anomalous behavior in the Gerber preprocessor where "MoveTo"s are implemented with circular turned ON and the -outline_arc_draws option is active but linear/circular interpolation (G[0123]) is not shown explicitly.
Fixes an issue related to circular trace arc draws. Gbr2greyscale now implements the same policy in the Gerber preprocessor in the support of circular trace arc draws that was introduced in GbrRip Version 7.65. This behavior can be turned off with the -outline_arc_draws command line option.
Selection of ROI (region of interest) could result in highly different throughput. The difference in speed had to do with whether or not partition boundaries interacted with the members of the holes of polygons where the hole count was large (> 50000), resulting in an N^2 problem. An optimization in the core boolean library removes this N^2 problem.
This version fixes all known issues presented by small "pits" and gaps associated
with data partitioning that were the product of negative sizing. A bug in the boolean engine was fixed that depending on user settings resulted in dropped data or a crash.
This version of Gbr2Greyscale effectively contains GBR2TIFF v8.03 which includes the latest version of split274x the Gerber file preprocessor, a module that
is also used by Gbr2Greyscale (depending on the data flow path). This version of split274x fixes a bug that for certain conditions resulted in
the wrong amount of erosion in the final output.
This version fixes a bug in the boolean engine where the interactions between polygon data generated from arc data generate small artifacts (gaps and pseudo cutlines). This resulted in dropped data (in this case pads) when the nonconforming unionized data is passed to the sizing module. The sizing module requires "clean/legal" data (assumed to be the case as it is passed from the upstream boolean flow). Now pseudo cutlines are removed from the unionized output.
This version fixes a problem introduced with version 2.02 in regards to optimization to improve throughput for paint and scratch.
Fixups for Boolean operations that resulted in dropped layout geometries; in particular, an improved recovery method for polygon repair during unionization for intermediate Boolean results.
This version has a new header file with changes to allow the user to know the dimensions of a dithered image..
Big TIFFGBR2GREYSCALE now supports Big TIFF.
Big TIFF is turned on with the -bigtiff command line option.
This version has a new header file so the user should be able to build and run the sample program successfully.
Fixed the issue of dropped data.
Fixed the issue where there are missing data in the output when erosion (sizing) is used.
Fixed the issue where there are missing data in the output.
Fixed the issue where extra data appear on the edge of a small path. This was fixed by handling draws that cross raster boundaries specially.
Fixed the issue where data was missing in the output. This was caused by a flash that had no dcode assignment. If there is a flash/draw without a dcode assignment (G54), dcode 10 is used as default. In this case, the input Gerber file did not have dcode 10 defined. This caused the rasterizer to drop the data and miscalculate the extent of the file. In order to fix this issue, the software now defines dcode 10 as a zero width circle if it's undefined and referenced.
Fixed the issue where unwanted circles appear in the output due to a state problem as a result of remembering the last position within G36/G37 blocks when G36/G37 blocks appear between draw data.
Fixed the issue where an arc appears in the output when shrink is used.
Fixed the output header to reflect DPI with decimal values.
Updated some modules to increase the maximum number of internal Gerber layers (LPD/LPC/SR) supported from 262144 to 1048576 for 64 bit. For 32 bit this limit is unchanged.
Fixed an issue where the top part of the output was missing pixels.
Updated boolean library to the latest (v2.645).
This version includes support for optional argument -super:18|28|48
This version has an updated pre-processor to fix a bug where it crashes when ran several
times consecutively. This was caused by file handles that were not closed after each run.
Added functionality to support non-standard comments instead of flagging the Gerber file as invalid.
Fixed an issue where two round flashes were merged together. A state
problem related to modality where the last G36/G37 coordinate was not
used in computing the position of the subsequent flash was fixed. This
was a previously un-handled case where the last G36/G37 polygon was a 360
arc. Because the start and end coordinates were the same the code that
collects G36/G37 data blocks when separating draw and flash data from
polygon (area fill) data incorrectly computed the position of the
position of the misplaced flash.
Fixed the issue where temporary files were left open and locked when
the pre-processor crashed. These files will now be unlocked and
removable in the event of a crash.
A crash which was caused by the presence of non-Gerber records in
the Gerber file. This class of data is now trapped and a message to the
effect that the input file is either not a Gerber file or corrupt is
issued. IN addition, the offending data and line number are reported in
the log file. This condition is treated to be fatal and will result in
no output.
Gerber data extents that are defined by circular data are now
computed properly. Previously, this could result in a raster image that
appeared to be truncated in the event of auto windowing.
Fixed the issue where data was dropped.
Fixed the issue where many errors are reported when ripping a GBR file. This was caused by how the tool converts paths with 2 points both of which are in the same coordinate. We now convert those paths into flashes.
Fixed the issue where some scratch data are dropped. This was caused by a bug in repairing an illegal polygon. A part of the polygon was hidden because its orientation was mistakenly changed.
This version fixed the issue where a Gerber file with many layers (> 35K) fails if ran with sizing.
This version fixed the issue where there is an output offset discrepancy when a
Gerber file is ran with and without sizing. This was caused by a dropped
scratch data on the border of the Gerber file during sizing.
.
Modified the code so that inverse is performed during plotting to improve timing.
The latest split274x fixes an issue where output data is incorrectly drawn. This was previously caused by a bug in resolving the input Gerber's G36 and G37 state.
Added support for command codes in lower case.
This version fixed an issue where data is either dropped or the program crashes when converting a Gerber data with poorly constructed polygons.
Fixed an issue in the buffered reading scheme for Gerber in GBRPLT.DLL. The problem is related to stale data (from previous runs or previous file reads) that resides beyond the end of an active buffer that coincides with "white space".
Too many layersFixed an issue where data was dropped because of too many Gerber layers. We increased the allowed maximum layer number to 256k in order to fix this issue.
Fixed an issue where some arcs were not sized properly if processed without shrink.
Fixed an issue where the margin of an IPNEG Gerber file differs when processed with or without shrink.
Added the optional argument to invert margin only. It can be used in the command line by specifying "-inverse_margin" or in the library by adding it to sGREYSETTING's mRArgNum and mRArgs.
This will allow the user to invert the polarity of the margin around the artwork. This new command line will complement the existing -inverse option which inverts the polarity of all the output (margin and artwork).
In the event when both of these options are used, the margins will stay the same and the artwork will get inverted.
This version fixes a reported problem where borders are incorrectly identified and margins are not inverted when the input Gerber file is:
Added the chord error argument in the pre-processor. The mChordError parameter in sGREYSETTING or the -chord_error:val command line argument will automatically be passed to the pre-processor.
The chord error, if passed, will override the arc resolution control. This will help cut down the pre-processing time without sacrificing the smoothness of large arcs.
Fixed the bug where GBR2GREYSCALE failed to convert Incremental Gerber files. The pre-processor now converts trailing zero and incremental Gerber files to leading zero and absolute RS274X instead of preserving them.
Decimal format Gerber files are no longer supported.
A new parameter was added to pass additional arguments to the pre-processor. It can be used on the command line by specifying "-splitargs opt_args" or in the library by populating sGREYSETTING's mSArgNum and mSArgs. This can be used to speed up the rip.
Fixed an issue where a single polygon, made up of digitized areas connected by "cutlines", is dropped. The Boolean function that processed/repaired holes and cutlines was updated.
Fixed an bug where data was dropped when an input Gerber file with Negative Image Polarity (IPNEG) starts with a "Level Polarity Dark" (LPD).
Fixed a problem where split274x was not able to handle polygons with large vertex count.
Fixed an error where a Gerber file with an axis select that assigns output device axis A to data axis Y and axis B to data axis X (ASAYBX) is not rotated properly.
Fixed an issue where high enumerated Dcodes were not handled properly - the default maximal value is 9999.
The latest version removes references (draws and flashes) to Dcodes that are not defined -
this condition caused GBRPLT.DLL to fail in the previous release.
This version fixed the issue of integer overflow with the Gerber input file.
Updated GBRIP to prevent messages from popping up when "-silent" option is specified.
The failure message will be recorded in the log file.
Updated GBRIP to fix the issue where some of the surface data were not scaled properly.
Added optional argument -ignore_deprecated to ignore axis select and mirror mass parameters. Added member to sGREYSETTING: mIgnoreDep (default is false on Init).
%ICAS% was dropped - this has been fixed.
(2) Fixed the issue where a round is erroneously converted into a rectangle.
(3) Fixed the issue where the raster crashes when the "-nosplitshrink" option is not used.
Fixed a program crash that occurred when converting and qualifying a large vertex count polygon.A handler was added for this type of hard crash when qualifying the input data (implies NOT -nosplit). We will be adding the handler to other modules in our flow in the near future.
Added support for ASAYBX Mass ParameterFixed a reported problem where raster output is incorrect due to the XY axis swap designated (ASAYBX) mass parameter.
Fixed conditioning flow to report an error if the file format is wrong. We added a check to make sure that the designated mass parameter is not out of place.
A new command line argument has been added:
-conditioning_retry:<num>
and a new member of sGREYSETTING, mCondRetry, which enables the "rerun" of input data conditioning a number of times to try to fix bad input data. This data fixing is done ahead of the rasterizer module (which has its own data conditioning routines). This argument should not be used regularly but rather in cases where the input data has been found to be particularly "dirty" - for example, several duplicate points that result in dropped polygons. A good starting value for <num> is 2.
This version fix an issue where an optimization introduced in v1.40 for handling full circles (circular data with the same starting and ending point) caused a problem across internal layers in the handling of G36/G37 while conditioning (split274x) the input Gerber file.
New -erraswarn command line option. When set, dropped polygons will not cause the program to fail.At the same time, the program will append conditioning error/warning messages to log file. Dropped polygons if any will be reported.
New -nowarn command line option. This option excludes conditioning warning (warning messages from our split274x call) messages in the log file. Actual conversion errors will still appear in the log file.
New -norip command line option. This option does not create any RIP output and logs the image info in the log file.
Fixed issues where some openings in the ground plane were dropped.
Fixed an issue when command line included a window with margin and inverse command line options.
Added support for "-margin" with "-window". The optional argument "-aw:[l,r,b,t]" must be used if no window is specified. The optional argument "-margin:[val|l,r,b,t]" must be used with "-window:[LLx,LLy,URx,URy]". There is curently an issue with margin and inverse which we will fix in the next release.
Default log file is moved to work directory instead of output directory.
Log File Name/Location ArgumentAdded optional argument "-log:[logpath]" to specify a log file name.
Updates to members of sGREYSETTINGAdded members to sGREYSETTING: mLogFile (default init value should be set to "") and mNoHeader (default init value should be set to false). These will be initialized when the struct's init function is called.
Unit values on the command line carrying an exponent in their expression (for example 1.0e-005) were not handled properly. This has now been fixed.
Catch error from rasterizer and include a more informative error message in the log file.
Previously error handling on RIP errors did not depend on the exit code from GBR2TIFF, but depended on parsing the rasterizer log file. Now the exit code is checked and then the log file is checked. This provides a more robust method for checking for RIP failures. Until recently the only failure modes that presented themselves were either in parsing of the gerber file proper or in unionizing the gerber file as required by sizing. Recently some new test cases exposed a deficiency in error handling at the back end, i.e.while rasterizing. This has been corrected.
Catch a gbrunion output that is greater than 2GB and give an error. This is true even if -erraswarn is set or -maxerr is greater than 0.
Currently the rasterizer does not support gerber files greater than 2 GB that are the result of unionization which is required for sizing. This condition is now trapped and reported as a failure. Unionized file sizes can be minimized by making use of the -circularize command line option in gerber2grey.
Added new option -nosplit avoids input file validation. This should only be used if the input is known to be "good", this means there are no multiply defined apertures, the maximum number of macros and dcode definitions does not exceed 10000 and dcode enumeration does not exceed 10K. Consistency between G74/G75 codes and I/J values should be correct. Format statement precision does not exceed 8 places, typically 2.6 for inch and 3.5 for mm data. Data range is consistent with format statement.
Added new option -nosplitshrink performs file validation but does not compensate G36/G37 data by 1/2 pixel size.
Added an "Init" function for sGREYSETTING struct to initialize settings with their default values
Updated sample code (including C# sample code):
Use specified thrnum for sizing (not limited to 4).
Added -maxerr and -erraswarn optional arguments (int mMaxErr and bool mErrAsWarn in the API).
Speed improvements.
Catch gbrunion error when -silent is turned off.
Added a length parameter in the Gbrip_GetErrStr function. Default is 256 but it must be set to the error string buffer's length to avoid memory corruption.
Added a new function Gbrip_GetOutInfo to get the output image's information. This will be stored in a sGBRIPOUTINFO struct and has the following members: mUnit, mShift, mImgXY, mScale, mRowCnt, mRowSz, mRowByte, mBitmapBytes.
The API changes can be found in the header igbriplib.h located in the installation folder's source directory.
Intercept error pop-up and write the error message in the log file.
Invalid Gerber files are detected in the front end and not rasterized.
No pop-up on silent mode. Error messages are output in the log file and the executable returns 1. The executable returns zero on success and non-zero on failure. The return value "one" means that the input arguments are not valid and negative return codes mean that the run failed.
Added support to Gerber with dcode up to MAXINT.
Fixed the issue where margins are not inverted with "-inverse" mode on.
Scale is applied to the margin.
This version is 5 to 10 times faster on customer files when sizing is used.
New LicensingThis version is up to date with the latest Flex node locked licensing.
Added Gbrip_GetExtent function to get the extent of the input Gerber file without rasterization. The usage of this function is added in the sample source code that is included in the package.
New Margin optionAdded margin capability with the new argument -aw:[left,right,bottom,top] where
left, right, bottom and top values are the margins in the specified unit (-unit:mm or -unit:inch).
Usage:
Added gbr_rip softkey - gbr2greyscale (32 or 64 bit) are the only key codes needed.
Added a new 64 bit release. Includes C# sample source code.
LicensingAdded gbrunion softkey so we no longer need the GBRUNION (2757/2756) key for sizing.
Added C# sample codeAs more of our OEM partners use C# we are adding C# sample source code to demonstrate what is needed when programming in C#.
Added the ability to independently control the edge bias in X and Y.
Window with SizingPrevious version did not pass the window size to the boolean sizing engine -- this resulted in very slow sizing when doing only a small part of the layout. This has been fixed.
Added C# sample codeAs more of our OEM partners use C# we are adding C# sample source code to demonstrate what is needed when programming in C#.
Added sample code in source folder and batch file in examples folder for programmers who want to call the library from their C/C++ application.
Disabled Ricoh bitmap orientationThe standard version of GBR2GREYSCALE included an non-standard bitmap arrangement that was specific to Ricoh. This has been removed in the non-Ricoh version.
Fixed flex node licensing issue.
Fixed a bug that causes a crash (same as GBRIP).
This release doesn't have a sample code - it will be added in the next release.
The issue where the output image is flipped when -super:0 is specified has been fixed.