Argyll CMS change log ===================== Version 0.70 changes - open version (beta) -------------------- [Beta 8 Snapshot 2008/1/15] * Added -S and -L options to spectro/dispwin for Unix/X11 systems, to allow setting and using the _ICC_PROFILE root window property to store the displays profile and calibration. * Changed MSWindows and OS X dispwin/dispcal/dispread test window to be title and borderless, and also have an option (-B) to mask the whole screen behind the test window with black. * Added a "create intersection gamut" method to the gamut class, and also added a companion -i/-I flag to viewgam to print out the intersecting volume of the first two gamuts, and oprionaly save the intersecting gamut. Improved robustness of the gamut "radial" point test methods slightly. * Fixed spotread so that it doesn't display any color information when reading the Huey ambient sensor, and added an option (-T) to show color temperature for each reading. * Added gamut volume report (with -v) to tiffgamut. * Changed spectro/spyd2setup.h to only set the loaded flag after sucessfuly loaded a firmware file. * Changed numlib/numsup.c error, warning and verbose functions into function pointers so that they can be overridden by callers of library functions that make use of them (lprof). * Switched icc and cgats library from the "BSD like" license to the "MIT" license. * Added better DTP22 support to driver and printtarg.c (thanks to Nigel Rowe) * Fixed spectro/ntio.c to cope gracefully with systems that don't have any serial ports. * Renamed spectro/printread to spectro/chartread. * Fixed problem in spectro/usbio.c where on some systems usb_detach_kernel_driver_np() needs to be called before usb_set_configuration(). * Added option to dispread to allow a shell callout with each color being tested, to allow relaying the test patch value to a remote display via a script. * Removed spectro/filmread.c and target/filmtarg.c until their licensing compatibility with GPLv3 is figured out. * Added -W parameter to instrument using programs, that allows overriding the default serial flow control protocol. This may allow working around problems caused by flow control not working on certain systems. * Added quick ICC profile creation to dispcal, so that single operation calibration & profile is now possible. * Fixed some bugs in cctiff handling of Lab PCS and/or -p operation. * Added a new test chart type to render/timage, for testing profile B2A tables. * Added -V option to spectro/dispwin, that verifies the currently loaded calibration. * Added (yet another!) variation of the spectral field names to support colorport output, to profile/logo2cgats. * Fixed problem with dispcal -u (and possibly other cases, ie. profile) where an out of range VideoLUT calibration value can wrap around rather than saturating. * Improved black point setting in dispcal, so that it doesn't get lighter if the white point is reset during the run. Also changed the white point cliping to use the device model, rather than relying in the cube clipping code, which was not so accurate. * Modified profout per channel curve algorithm to be encapsulated in an independent module (xicc/xfit.c), and to create input curves that adjust the curve shape and clut grid locations independently of each other. This has similar performance to the old code in many cases, but reduces fit errors for certain types of device characteristics. [Beta 7 Snapshot 2007/10/15] * Fixed minor bug in icc.c - was double freeing while a V4 profile was being rejected. Also changed SYMETRICAL_DEFAULT_LAB_RANGE B2A input curve tweak for 16 bit - the range can be almost -128 to 128 and still remain symetrical. * Improved robustness of dispcal in zeroing in on the neutral patches. Got Jacobian matrix refinement going, added device value clipping, and made it revert back to the best ever value as a worst case result. Tested all the colorimeters on every platform, fixed bugs with spyder on different platforms (USB bugs ?). * Tweaked spyder driver to improve repeatability for low light conditions - made integration time adaptive. * Added Huey colorimeter support, including driving it through the HID drivers on MSWindows and OS X. * Added Spyder 2 Colorimeter support, including the firware transfer utility spyd2en, to allow the end user to get their instrument workings. * Fixed a problem in dispwin/dispcal/dispread not keeping the Gnome screensaver at bay. * Fixed very minor error in profile that caused a crash if -taw was used without a -s. * Hopefully fixed the last lingering issues with the gamut function "split plane" problem. Improved the split plane choice criteria too, reducing the structure size and (presumably) improving interogation speed slightly. (Visualizing things always helps a lot!) [Beta 6 Snapshot 2007/9/15] * Fixed bugs in dispcal target curve - the curves didn't seem to be as neutral as they should be. * Changed HCFR setup to assume no special 2mm apatures on its sensors, since this is the default hardware configuration. * Added support for more scan targets. The list is now: IT8.7/2, ColorCheckerDC, ColorCheckerSG, Eye-One Pro Scan Target 1.4 and HutchColor HCT. * Fixed bug in printread -xl :- XYZ wasn't being scaled to 100 (thanks to Duane Ruck for pointing this out). * Fixed bug that affected printread handling a chart with the patch location identifier that has patch location before strip location. This was affecting reading the Eye-One Pro Scan Target 1.4 chart. * Added a -a flag to printread, to cause the patch locations to be saved to the output, so that a chart read can be used to create a scan/input CIE reference file. * Added good/bad beeps to printread for the Eye-One Pro, to speed up chart reading. * Added a -B flag to print read, to disable bi-directional strip recognition if the reference patch values are not to be relied upon. * Modified i1pro patch recognition to make it more sensitive to differences in just some wavelength bands - this fixes Eye-One Scan Target 1.4 patch recognition, and generally helps robustness for all charts. * Supressed "There is at least one patch with an very unexpected response!" warning in printread unless the expected values were created using a specific device model such as an ICC or MPP profile in targen. [Beta5a Snapshot 2007/9/10] * Fixed bug that had crept into profile/profout.c that wreckes the contents of the gamut lut. * Added a manual chart recognition fiducial marks to print charts that are intended to be scanned in (printtar -s), so that manual chart recognition can be used on these too. [Beta5 Snapshot 2007/8/28] * Fixed serious bug in dispcal & dispread on Linux - screensaver suppression using fork() was causing programs to execute twice at the same time. * Changed spectro/dispcal.c calibration algorithm to be faster, more precise, and more robust. Improved handling of "native white" mode to better hit the target 1.0 RGB values. This should contain the worst case errors better. * Changed printtarg to pad i1 test chart last row, since the printread logic can't cope otherwise. * Added a manual chart recognition option (-F) to scanin, that makes use of fiducial marks defined in the .cht file. * Added a -G gamma option to scanin/scanin to allow some flexibility in the face of extreme device behaviour. * (Hopefully) fixed DTP02Q thanks to feedback from Udo Lembke. * Changed all of my code and other GPL code that allows upgrading, to the GPL Version 3 license. Corrected "licence" to "license" in many (but probably not all) places. * Modified DTP51 driver to ignore a "bad command" error to the GI command (allow for old firmware ?) * Modifed dtp20 on-line reading to be more forgiving of unexpected status after a strip read. * Added some fudge scale factors for i1pro emission and ambient modes. I'm not sure at the moment where the real scale factors come from, so I've roughly matched the scale to what the GM driver returns. Also add fudge factor for i1display2 ambient mode. * Fixed some bugs that had crept into DTP20 offline chart reading (not reading, heap corruption on free). * Added diagnostic for DTP20 offline chart reading to hint at what strip hasn't been read. * Changed printtarg to optimise contrast between test patches and spacers. * Added "aproximate least squares" setting mode to icc set_lut and rspl set_rspl to improve average accuract when setting interpolation arrays from a function (ie. when inverting A2B). * Added a "display with normalized brightness" to spot read to make it easier to verify spot readings for a display profile. * Fixed "r" and "rl" intents so that the white points are linearly mapped, as is the normal expectation with relative colorimetric intents. [Beta4 Snapshot 2007/5/16] * Fixed icclib to handle unknown tag types now, as well as cope more gracefully with ProfileMaker4 profiles that have an illegal flag value in their data tagtype flag field. * Modified gamut mapping to improve coherence of mapping outside the source gamut when used to create B2A table. * Created first cut of VRML debug plot library in plot/vrml.c, and switched gamut/gammap.c to use it. Other diagnostics could be switched to use it too (ie gamut/gamut.c). * Modified ciecam02 to improve handling of imaginary colors, and coherence in those regions. * Added a delay between setting a screen color (spectro/dispwin.c) and starting to read the patch with a display instrument. * Fixed issue on OS X with locating displays - IO dictionary string handling. * Made the dispcal/dispread calibration a bit friendlier if the instrument doesn't actually support calibration. * Added profile comment options to link/icclink. * Fixed bugs in xicc/xicc.c and xicc/xlut.c that were affecting how black generation was controlled by the input luminence value for a -kp option. This affected profile/profile the most, but could also have changed how link/icclink -G generates black as well. The black generation should now match quite closelgy between the B2A tables generated by profile/profile, and the black generation generated by link/icclink -G. * Added "patch by patch" mode to print read, that allows reading media where strip recognition is unreliable. * Added patch consistency tolerance modifier to printread and the i1pro driver. [Beta3 Snapshot 2007/4/10] * Modified i1pro driver to do scan measurements with single USB read, to avoid read latency issues. * Added display/emission distinction for i1pro, to speed up display measurement, while still allowing general ambient measurements to be adaptive. Added display mode to spotread. * Added workaround to the i1pro rev D crashing on close under Linux. It's reset rather than closed. * Modified libusb-win32 to fix problem with i1pro rev D crashing on a get_configuration. * Reworked scan patch recognition to work for reflective or emissive scans, and to be more tolerant of noisy media. * Added support for emission scans to i1pro and printreaf. * Fixed ref/*.sp files, as well as adding back in D50*.sp variations that seem to have gone missing. * Change i1pro trigger/read logic to ensure that process scheduling latency doesn't cause the read to be late, causing read failure. Add trigger/read timing diagnostics. * Fix i1pro switch thread cleanup to avoid memory access fault. * Tweak xicc/xspect.c FWA to have better estimation accuracy with a range of paper stocks, as verified by xicc/spectest2.c and xicc/spectest.c * Fixed spotread to display FWA corrected spectra correctly, as well as fix some bugs with the reference spectra. [Beta2 Snapshot 2007/3/29] * Fixed gcc 3.3 optimiser problems on OS X which were causing crashes in spotread -S and i1pro high res. * Modified spec2cie to look for specific device values to identify white, since some devices fool looking for maximum Y. * Fix triggering to make FWA spotreads work. * Fix bug in Spectrolino calibration with filter messages work properly. * Fix bugs with DTP41 and DTP51 triggering. * Change how rows per strip are stored in .ti2 file, to remove base 62 limit. * Increase scope of target/printtarg scale options, and add extra scale for spacers. * Changed Linux serial port location to look for /dev/ttyUSB* as well as /dev/ttyS*, and only offer them if they can be opened. * Fix i1pro driver so that it does not return spectral data unless asked. [Beta1 Snapshot 2007/3/22] * Finished i1pro driver by adding highres spectral mode (+ matching changes in dispcal, dispread, printread, spotread), and making the calibrations non-volatile so that they can be retained between utility starts. * Changed the default observer backto the 1931 2 degree observer in various programs (profile etc.), so there is less surprise at the discrepancy between the default instrument values and the values when spectral data is used. * Changed profile/logo2cgats so that it uses a heuristic to determine if the spectral data needs scaling by 1.0 or 100.0, since it seems the type of file cannot be relied upon as an indicator. * Fixed link/icclink to record a more accurate summary of overall intent in the header. * Re-worked tweak/refine.c slightly, to try and improve how it copes with out of gamut points. Added automatic extra weight (5) for lightest patch. * Added new black generation feature to link/icclink. It can now take the output inking from that of the output profile B2A table, just like revfix. * Fix bug in link/icclink - the changeover to using K target rather than locus had a bug in it. It was still partially defaulting to locus rather than K value target (some C library has a global called locus ?) * Made it so Eye-One pro can recognise strips when read in either direction. * Re-worked instrument calibration and measurement triggering to support instrument operated buttons. * Added support for DTP20 spectrometer. * Added support for Eye-One Pro spectrometer. * Fixed bug in profile where RGB space profiles didn't handle FWA correctly. * Fixed some bugs in cctiff that were causing inacurate results. * Added support for the DTP22/Digital Swatchbook. * Changed serial port driven instruments type to be automatically recognized, eliminating the need for the -i option on all the instrument using utilities (dispcal, dispread, printread, spotread). * Reworked gamut hull triangulation, hopefully making it more robust against any numerical issues. * Fix bug in printtarg that caused green spacers instead of white ones. * Added -c flag to spectro/dispwin. This clears a display calibration. * Added support for Eye-One Display 1 and 2 colorimeters. * Added extra configuration for DTP92 to cope with a firmware bug for certain early DTP92Q instruments. * Fixed bug in logo2cgats - X-Rite ColorPort spectral data is already scaled to 100, so only do this for Gretag files. * Added the -m flag to scanin/scanin, to allow it to return true mean values, rather than robust mean values (but see latter bugfix). * Fixed a bug in profile/profout.c that caused some matrix shaper profile to generate colorant XYZ values slightly less than 0.0, due to numerical inacuracy, triggering an assert. * Added a new option to spectro/spot read to allow use of the Spectrolino with filters fitted. * Added error handler to spectro/dispwin.c, so that there is not a fatal error triggered in just listing the screens on an X11 system running TwinView or MergedFB. * Fixed problem with USB/DTP94 that caused instrument coms to fail after doing calibration. * Fix bug in render/timage.c that caused central wedge to be corrupted. Version 0.60 changes (July 17 2006) -------------------- * Changed both gamut mapping intents, and enumerated viewing conditions to be symbolic mnemonics, so that the options don't change as intents and viewing conditions are added, deleted or re-ordered. Selection of intents or viewinging conditions using a numerical enumerator is no longer supported, to help catch problems caused by changes to the list with this releas. * Fixed bug in profile/profile.c when creation XYZ PCS LUT profiles - the gamut tag was being created with the wrong color space, and often this would cause an internal fault in gamut surface creation. * Changed profile/profile so that if a source gamut/profile is supplied for display LUT type profile creation, an ICC V2.4.0 profile is created with all 3 intent tables, rather than the single colorimetric intent that is default for ICC V2.2.0 and earlier. Fixed icc/icc.c to properly support the possibility of a full set of intent Luts in display and input profiles. (Profile does not yet support intents for input profiles.) * Added new intent to link/icclink and profile/profile.c, that does an absolute colorimetric link, but will scale the brightness down if needed to avoid clipping the source white point. This is useful in soft-proofing situatations. * Went through with both gcc -Wall, and Vc++ -w3 and reduced the number of waring messages. Fixed some very minor bugs along the way. * Made additional changes to spectro/dispcal.c, to improve behaviour when adjusting controls with and without targets. When adjusting without a white target, the control hints now help you adjust to be on the chosen black body or daylight locus. * Changed profile smoothing factors that are different for the L* a* and b* channels. * Made profile/profile.c label the profile with the platform it was created on. * Improved the device model used by dispcal, including optimising the model, so that it zero's in on calibration faster, and handles the black point more accurately. Added a variable -k option to dispcal. * Added display controls addjustment mode to dispcal, and altered the target gamma curve to better take the black point into account. * Added report option to dispcal, to measure and report on the current display behaviour. * Added verification mode to dispcal (-E), to allow checking how well a display meets its calibration targets. * Added -N option to dispcal, dispread and spotread to allow instrument calibration to be bypassed. This makes repeatedly operating some instruments (ie. Spectrolino) more convenient in emission mode. * Added a "load video LUT" mode to dispwin, so it can now be used to initialse the displays from either ICC profiles, or Argyll .cal files. Can be used on all platforms (but particularly MSWindows and X11) in startup scripts. * Fixed bug in X11 disable screensaver, and disabled the cursor over the test window. * Added proper multiscreen support on all platforms (Even X11 Xinerama!). * Fixed bug in dispcal that was causing the achievable brightness calculation to misbehave. * Added -u "update" option to dispcal, to speed up maintenance of display calibration. * Added separate options in dispcal for a daylight or black body color temperature target. * Added "plot spectra" option to spotread. * Added support for the X-Rite DTP94 (AKA OPTIX) to spotread, dispcal, dispread. Added -y option to allow specifying whether a CRT or LCD is being read. * Streamlined instalation (particularly on Unix and OSX), so that tifflib and libusb don't need special handling. Changes to Jambase to accomodate this. * Added support for USB connected instruments using libusb. * Added support in profile/logo2cgats for converting from X-Rite ColorPort format. * Added extra facilities to imdi to suppport arbitrary colorant order, arbitrary pixel padding, reduced runtime code size and improved cross platform compatibility. * Added warnings in all the instrument driver code, that instrument companies are not to be expected to support anything involving these drivers. * Completed new version of cctiff, that deals with an arbitrary sequence of profiles, as well as supporting L*a*B* encoded TIFF I/O. * Added alternate sort algorithm to imdi/cgen.c, for 16 bit input support, speeding up higher dimensional input conversions. * Changed icc/iccdump so that the -t parameter can be specified multiple times. * Added extra PCS curve for BtoA table of XYZ LUT profiles :- this greatly improves the accuracy of the BtoA lookup of XYZ LUT profiles. * Added greytiff utlity to binary distribution, and also added option to convert using CIECAM02 space, for lighter chromatic colors. * Added ColorantTable tag to profiles created by profile/profile. * Added a new option to dispcal and dispread, to allow the test window to be positioned and sized. This allows some people to cope with multiple displays better, and may give some flexibility in applying these utilities to projectors etc. * Added three stage overal conversions to icc/icclib.c, for monochrome, matrix and lut conversion classes. This is to make it convenient to split up every conversion into input per component, core intercomponent conversion, and per component output, to match the capabilities of imdi. * Modifed xicc/xicclu, xicc/revfix.c, profile/profile.c and link/icclink.c, to default the -k black generation to setting black level targets, instead of locus targets. In pratcice it seems easier to create smooth black curves this way, especially when meshing with the black behaviour forced by ink limits and L target levels. Backward compatibility with the previous controls is provided via the -K flag. Default black generation has generally been switched to -kr. xicc/xicclu has had the -kq option added, so that the behaviour of icclink -kq can be explored. Some bugs in -kq may have been fixed. * Added full verbosity levels to icc/icclu and xicc/icclu, so that -v0 can be used to capture batch output that is ready for further batch processing. * Enabled proper gamut tag creation in profiles. * Fixed numerical issue in xicc/xicc.c:icxdCIE94sq(), that was causing profile to fail when optimising matrix and curves. * Bumped up the default profile smoothing factors, as the resulting gamut boundaries were noticably bumpy. Default profile -r is 0.5%, and internal factors within rspl/scat.c have also been increased. This seems to be favouring smoothness over accuracy somewhat, but is still on the shallow part of the "knee", where further increasing smoothness would start to strongly decrease fit. * Fixed problem in profile (xicc/xlut.c) in locating the black point. Doing one search is not robust given the behaviour of many profiles, so several searches are now used to avoid local minima. The same fix is applied to xicc/mpp.c (Thanks to Gerhard Fuernkranz for discovering the problem.) * Fixed target/targen, link/icclink, xicc/iccgamut, xicc/fakeCMY, xicc/revfx, xicc/xfbview and xicc/xicclu to have estimated default ink limit values. Added input profile ink limit options to link/icclink. * Added a function to icc/icc.c to estimate the total link limit and per channel limits of an ICC profile. This is to workaround the lack of a standard tag in the ICC profiles. A function built on top of this in xicc/xicc.c (icxDefaultLimits()) established default total and black ink limits for a profile. * Modified gammap.c & nearsmth.c to increase the control over gamut mapping, and add new features. The controll weightings within gammap.c are now tables rather than #defines, and can be segmented by color, to fine tune particular areas. Only yellow uses this feature, to keep the gamut mapping universal. Two aditional features have been added, cusp mapping, that applies a degree of rotation to areas surounding source primary/secondary colorant cusps to partially align them with the destination cusps. The radius of influence of this mapping is settable. Another factor called "elevation" has been added, that simulates the effect of inflating the source gamut, allowing more complience in the mapping of the control vectors. Just perceptual and saturation tables are present. In nearsmth, expansion of the gamut is finessed a little by termporarily reversing the direction of the mapping when expansion is present. There are lots of other changes in nearsmth.c aimed at improving the robustness and behaviour of the nearsmooth function. The gammap tuning factors are aimed at providing good saturation while maintaining smoothness at the gamut surface. * Added code to the gamut hull finding, to locate and store the primary and secondary colorant "cusps" in the gamut file, as well as adding options to the various vrml utilities to mark the cusps. The cusps can be used within the new gamut mapping to align or partially align the colorants of the source to the destination. * Modified gamut boundary code to improve detail and acuracy of the gamut hulls. The smoothness of the destination hull affects the smoothness of the resulting gamut mapping to some degree. * Changed gamut mapping so that "full" neutral axis alignment no longer aligns the black point a*b* to the destination. The L/J range is mapped as if the black points are fully aligned, so the contrast ratio is not compromised. This approach seems to give a better subjective neutral result. (There appears to be no such thing as black point hue adaptation.) * Modified enumerated viewing conditions list to tweak ambient values slihtly, and introduce "monitor in bright work environment". * Added new option to spectro/fakeread to allow manipulation of the black point of the fake readings, to allow creation of test profiles with different black points. * Added another numerical problem workaround to xicc/cam02.c, to deal with Jab->XYZ issues when J == 0 * Created utility render/itest to generate RGB test images for checking gamut mapping behaviour. * Created new sub project "render", for a simple 2d raster rendering system. This is intended for use in generating test images, as well as rendering measurment test charts directly to rasters, rather than just postscript. * Added a -m option to target/printtarg, so that the paper margins can be increased from the default. * Added documentation for the .ti3 and .cal file formats. * Fixed bug in spectro/unixio.c, which caused long strips read on the DTP41 on OSX or Linux to fail when spectral readings were enabled. The canonical input buffer size was being exceeded. Switched to non-canonical input mode. (Also seemed to fix problem with Xon/Xoff flow control on OSX.) * Added flow control to serio I/O, to make instrument communications more robust. Hardware handshaking seems to be the most reliable (but see above). * Converted icc/fbtest into profile/invprofcheck, and added some more features to make it comparible to profile/profcheck. * Added VRML L*a*b* axis labels to gamut/viewgam, profile/*profcheck. * Increased gamut mapping RSPL smoothness, to compensate for RSPL changes in V0.53. Smooths out bumps in saturation mapping somewhat better, and should eliminate the "non-monotonic" warning message. Version 0.53 changes (December 2005) -------------------- * Fixed serious bug in target/ofps.c, that made the default distribution of points very non-optimal. * Added CIEDE2000 Delta E function to icc/icc.c, and also added this as an option to profile/profcheck, profile/mppcheck and profile/verify. * Added new utilities rspl/smtmpp.c and profile/splitcgats.c to allow testing and verification of profile optimised smoothness factors with more realistic device data. Use splitcgats in combination with profcheck and the hidden "-rs" flag in profile to cross validate the optimised smoothness factors. * Added new "-r" parameter to profile/profile to allow the profile smoothness factor to be adjusted to suite the uncertaintly of the device and instrument readings. * Created more in depth simulation of device behaviour to verify profiling operation (rspl/smtnd.c). Running this indicated that no single smoothness factor will suite all combinations of dimension, number of sample points and sample point uncertainty. Create a interpolation table lookup to provide an "optimised" smoothness factor, determined from the simulations. Used new profile/splitcgats to cross validate * Fixed serious bug in rspl/scat.c - new smoothness tracking factors were seriously wrong. Figured out correct approach and fixed it. Will affect various components including profile, icclink and refine. * Added support for hexagonal layout of charts on XY instruments. Supports aprox 14% more patches on the same sized chart. Changed default patch size for Spectrolino to 7mm, since this fits more patches on a page while remaining more reliable than the 6mm patches used in charts such as the ECI2002. (Changes to target/printtarg and spectro/printread) * Added extra check code for argument handling in link/icclink.c - we now switch to appropriate linking mode if options that require it are selected. * Added better algorithm for weakly tending rspl's to a particular mapping. Added weak default function API to scattered fit, and now make use of this in tweak/refine. This should eliminate an "overshoot" issue that was present with the simple grid of weak mapping points previously used (Thanks to Gerhard Fuernkranz for pointing out the problem.) Affects tweak/refine. tweak/refine has also been afected by problems with RSPL scattered data fit functionality - see above. * Modified spectro/dispcal.c to more acurately compute clip of target white with device gamut, and also use matrix to compute aprox. inverse more quickly and acurately, to give faster and more accurate convergence. Needs some more testing, may not work well on real monitors ? * Started adding support for ICC V4 Lab encoding into icc.c Version 0.52 changes -------------------- * Added a display calibration utility, dispcal, to create appropriate display lookup curves. Modified dispread and profile to carry the display curves through to the vcgt tag in the profile. Not extensively tested yet. * Added spectro/spec2cie.c from Gerhard Fuernkranz. * Changed clut profile input and output curve optimisation code to use conjgrad() instead of powell(). Aim was to speed up profiling, but speed seems to be about even. Added "optimise all" step since conjgrad() makes this feasible, getting slightly better fit. * Modified the rspl code to support non-equal grid resolutions. This was to support display calibration, but may come in handy for support of V4 profiles. Noticed that the smoothness tracking with different resolutions and dimensions wasn't working very well. Improved the test code (c1, t2d, t3d) to help reveal this, and fixed the problem. Now operates faster, more accurately, more smooth output with a better fit to the input points. Should improve the quality of forward profiles somewhat. The fitting error is more noticably improved from -ql through -qu. Gamut mapping seems to be a little smoother. * Completed the tweak/refine tool, useful for improving the accuracy of proofing systems. Changes were made to profile, icclink and revfix to support simple use of abstract correction profiles created using refine. * Added option to printread, to allow CIE data to be saved as D50 L*a*b*, for more flexibility for other purposes. * Fixed minor bug in DTP51 reading, where the guide setting was wrong for strips with less than the 6 passes. Also added fix code for DTP51 "off by one" patch problem - the error should be corrected automatically. * Fixed problem in reverse lookup of per channel curves, that affected performance of profile and icclink -G. This problem became evident when CAM was switched to CIECAM02. Note this problem seems only significant when CIECAM02 is used, ie. when the -c and -d flags are used to specify viewing conditions. * Added support for alternate test patch indexing, to better support non Argyll test charts (ie. ECI2002) * Renamed printspot to spotread, and expanded the range of instrument modes supported. * Added emmisive measurement mode support to printspot. * Added independent Gretag Spectrlino/SpectroScan interface library to cleanup some minor problems, and add some more features (such as a fake transmission measurement mode using a light table, etc.) * Added extra option to targen that allows creating test points targetted at a specified portion of the devices colorspace. * Fixed problem with imid & cctiff, where a profile that returns device values > 1.0 causes pixel value wraparound. * Added an extra option to printtarg to scale the size of the test patches. This can be used to allow for coarse screening, poor registration, and packing more test patches onto a page. * Added extra support in fakeread to allow monochrome test charts to be faked using RGB/CMYK profiles. * Added extra options to printtarg, to allow greyscale test charts to be represented in a number of different postscript color representations. * Fixed bug in targen when > 4 colorants are used, and -v is turned on. Diagnostic fails for > 4 colorants. (Thanks to Andrej Javorsek). * Fixed bugs in matrix/shaper profiling :- -ve offsets in shaper don't make any sense, so removed them; weighting of parameter values was faulty, so suppression of unsconstrained bumps in curves wasn't always effective. This change may improve matrix/shaper profile quality slightly. Version 0.51 changes -------------------- * Added new option to xicc/xicclu to allow plotting of the neutral axis to examine black generation behaviour. * scanin has problems with new correlation code. Revert to old code until problems are figured out. * Added support for a black channel ink limit in nearly all utilities that currently support a total ink limit. * Created cam02plot to explore discontinuities in CIECAM02 conversions. To support this, the usage of Helmholtz-Kohlraush effect is now a runtime flag. * A few changes in icc/ moving towards V4 support * Modify Jamfiles to support a more restricted "install" of executables and other files to bin/ Version 0.5 changes ------------------- * Got the GUI and serial coms dependent parts running under Mac OSX. Changes to Jambase and Jamfiles to make this work. * Modified Jambase to allow for Mac OSX Carbon GUI applications needing a minimal resource fork to run properly. * Added incremental rspl scattered point suport, to allow for us in an error driven targen point generation routine. * Added "EXTRAFIT" option to rspl, that allows for better fitting to scattered data points that have a high error after normal fitting. May improve profile accuracy when large test charts are used. * Add a special purpose "-f" and "-F" option to icclink, that causes K only or all output for RGB/CMY in to CMYK out devices for neutral (R=G=B) input. * Switched around gamut mapping high level controls into a simple "Perceptual" and "Saturation" set of pre-canned surface point weighting values. This allows more detail in setting the two different styles. A saturation enhancement control has also been made available, although this may need a little more work to be fully effective. * Switched over to CIECAM02 for better blue gamut mappings. Fix CIECAM02 so that it is robust given arbitrary Jab input values. * Fixed bug in gretag spectroscan print chart reader - it wasn't recalibrating every 50 readings. * Added support in spectro/fakeread.c for a "separation" device link profile to preceed the real device profile. This allows simulating the response of a device that used an explicit separation in its rendering pipeline. * Creating a hack CMY to CMYK separation creation support tool called xicc/fakeCMY.c This creates a dummy CMY->PCS .ti3 file from a CMYK device profile, that can then be turned into a CMY device profile that can then be linked with the CMYK device profile to create a CMY->CMYK device link separation profile. This program will be redundant when profile/sepgen is completed. * Add support for the Spectrocam illuminant spectrum (Xenon Lamp), even though this instrument is not supported directly. This allows the FWA to be used on spectral readings from this instrument. (Thanks to Gerhard Fuernkranz for providing this information). * Add method to gamut object to compute a gamuts volume, and report the total volume in xicc/iccgamut if verbose is set. * Modified scanin to work with scan of Gretag ColorCheckerDC. Needed to modify edge detection filter to reduce noise, modify edge matching code to support a wider range of scales, change matching logic to ignore target edges with no matching reference edge, stop using crossings as part of edge matching. * Added new entries to test chart recognition template, to allow scanin to determine correct rotation, even when the chart has no asymetric elements. This works similarly to the strip reading code, in checking correlation between expected and measured color values. Printtarg has also been modified to support this new scan recognition template entries. * Fixed up Gretag Spectroscan operation so that emission readings (for displays) etc. modes are correctly set and calibrated. * Added new facility to cgats library, to allow for a wildcard table keyword, as well as a variable "CGATS.XX" table keyword. * Switched to CIE94 delta E for shaper/matrix profile model fitting. * Introduce new flag ICX_CAM_CLIP to xicc, to allow full accuracy lookups within gamut, and clipping in CAM Jab space for out of gamut values. Turned this flag on in profile/profile, to improve clipping behaviour of colorimetric B2A table, and in link/icclink, to do the same for absolute and appearance indents. * fix argument '-t' processing error in profile/profile.c * gamut/gammap.c: Change over to better vector alignment code. * Improved some of the black point handling precision in icclink to reduce some innacuracies noticed by Gerhard Fuernkranz. * Modified Absolute Appearance intent to use a common white point between the input and output profiles, as well as scaling it to Y = 1.0, to try and prevent Jab values exceeding J = 100.0 * Improved profile/logo2cgats to cope with the latest formats of data files from Gretag. They seems to have moved over to including the device values in the readings file, just like Argyll :-). * Changed rspl/rev.c so that instead of failing when it runs out of room to cache all the cells being searched in a query, it proceeds with the search in chunks. This allows the memory usage to be curtailed, without risking the reverse lookup being aborted. There will be a slight performance loss if this happens though. * Fixed imdi/cctiff when linking profiles, to not use explicit per channel curves when the PCS is XYZ. This was causing excessive quantization, because XYZ is a non-perceptual space. (Same problem noticed in link/icclink some time ago!) * Fixed old bug in target/ppoint.c, that caused a crash under Linux in targen. (Thanks to Greg Sullivan for bringing this to my attention.) * Improved robustness of cam97s3 some more, some cases encountered in b2a table creation triggered problems with out of range values. * Added grid range override for gamut creation, to assist uniform handling of gamut compression in b2a table creation. * Added perceptual and saturation gamut mapping support to the profile creator (profile.c, profout.c). This takes an input profile as a parameter, to determine the necessary gamut mapping. * Added new function to icclib to allow setting of up to 3 Lut tags simultaniously. This is to allow the multiple intent B2A table values to be set while getting the best possible speed of inverse A2B lookup. * Added two new functions (fwd_relpcs_outpcs, bwd_outpcs_relpcs) to xicclu, to allow converting between native relative PCS and the appearance space configured in the space conversion. This is to allow converting to/from source/destination CAM Jab space for gamut mapping during profile creation. * 2003/12/9 Unstable release * Started HTML documentation in the doc directory. This is work in progress, and is not yet complete. See doc/Index.html * Changed per channel curve algorithm in xicc/profout.c, xicc/mpp.c and xicc/xmatrix.c, to improve accuracy of profile, and markedly reduce "wiggles" in certain cases, as well as improving the accuracy of the profile compared to the "true" underlying device characteristic. Changed how the white point is preserved once again, this time by simply adjusting the order 0 a*b* curve harmonic to map 0.0 to 0.0. Tuned curve weighting. Checked that the rspl scatterd data smoothing default is still an approproate compromise. * Added support for a TI3 file as reference for profile/fakeread, to improve reference set generation. * Fixed a bug that was causing the A2B output curve ranges to be excessive (160%, rather than the intended 110%). Altered profile/profile.c to remove the code that disables the use of A2B output curves when a high quality B2A is needed, now that there is a way of ensuring that the a*b* curves go through 0.0. * Tweaked xicc/mpp.c to improve accuracy with a very small number of points, by improving the sophistication of its estimation of ink 100% overlap values in the "anchor points" (which become defaults if measured values are missing), as well as strengthening the weight given to minimising the transfer curve and ink interaction "shape" values. * Added comment support in icclink, similar to that in profile. * Added support for MPP profile in profile/fakeread, to permit a simple way of creating an ICC profile from an MPP profile for <= 4 colorants. Spectral values can be generated using an MPP profile. This provides a path to creating a useful profile when very few measurements are available. * Changed -n flag in profile/profile.c to allow disabling input (-ni) and/or output (-no) clut lut curves. This allows testing of the effects of per channel curves. * Added -r flag to link/icclink.c to allow overriding the device link clut resolution. * Add some filtering to the K locus curve generation in profile, icclink etc., to smooth out mixing behaviour. Transition to ink limiting isn't smoothed at the moment. This may improve problems with banded colorization, but only if high resolution, reverse AtoB linking is being performed. * Correct Gamut boundary table support has been added to profile/profout.c, but isn't enabled or debugged yet. * Add spectral lookup support to mpplu.c utility. * Fix bug in spectro/dispread.c - we hadn't updated it for the latest .ti1 format. * Added a special "simple" mpp model mode to profile/mpprof.c and xicc/mpp.c, to support a more simple Neugenbauer like model for possible proofing standards use. * Added support in diagnostic plot for up to 6 curves, with do_plot6() function. * Disable USE_MERGE_CLUT_OPT from icclink, since it compromises accuracy, without a noticable improvement in speed. * Added simple link support into cctiff for convenience, and to serve as an example of how to link and convert pixel data in one step. * 2003/4/23 Unstable release * Modify gamut/gamut.c to #undefine ADD_EXTRA. This code doesn't seem to add much, and seems to go crazy with some profiles, using endless amounts of memory. * Changed rev.c allocation code to make sure doubles get allocated on their natural boundaries. This may fix problems with some processors (MIPS). (Thanks to Daniel Borenstein for pointing out the issue.). * Changed Absolute intent to clip in CIECAM97 space, for improved out of gamut color handling. (link/icclink.c, xicc/xicc.h, xicc/xicc.c, xicc/xlut.x xicc/xicclu.x). CIECAM97 is tricked into an absolute mode by forcing a D50 adapted white point for both source and destination profiles. The other appearance parameters still have an effect. * Hopefully removed the last problems involving the confusion about whether RGB device values ranges are 0-100 or 0-255. Argyll should now be consistent in using 0-100 for all its CGATS data files. [Changes mainly to scanin/scanin.c, plus warning code in profile/profout.c and profile/profin.c] * Added support in targen for using an mpp model to set test point distribution. * MPP profile format and creation now complete. Using much more complicated derivative minimisation equations to get adequate speed out of it. Overall accuracy of the profiles hasn't yet been established. * 2003/2/8 Unstable release * Added a slight refinement to the CIECAM97 model - rather than using linear interpolation for computing the eccentricity factor, use a spline blend to smooth out the slight "kink" at the knot points. * Updates mpp.c - work in progress. * 2002/12/25 Unstable release * Completed Gretag Macbeth Spectroscan support for print profiling. Most changess in spectro/printread.c, spectro/gretag.[ch] and spectro/spm.[ch]. * Tuned gamut mapping to improve perceptual. Fixed gamut/gammap.c so that separate luminance, chrominance and hue weighting works properly. Added variable chrominance weighting so that blues will be mapped with high L weight, while yellows will map to closest. This exploits the extra blue lightness added by allowing for the Helmholtz-Kohlraush effect in conversion to CIECAM97 Jab colorspace. Tweaked xicc/xicc.c gamut mapping control parameters to improve perceptual and saturation gamut mapping. Made extra gamut mapping surface point code in gamut/gamut.c more robust so that it can be turned on by default (since disabled again). * Added Helmholtz-Kohlraush effect modeling in xicc/cam97s3, using the equation from Bradford-Hunt 96C, as detailed in Mark Fairchilds "Color Appearance Models". CIECAM97 was derived from Bradford-Hunt 96S Simple model. It turns out that this effect is crucuial in gamut mapping CRT blues onto printing blues, and making sure that they take into account the subjective lightness of the highly saturated CRT blue. * Added more elaborate "thru Black" controll to link/icclink.c, allowing a CMYK to CMYK with a partial through black. This is implemented using two "upper" and "lower" limit black generation curves. * Added hack program profile/logo3 to allow for a smaller number of test sheets read on the Spectrolino. * Added new test point generation module target/ifarp.c, an "Incremental Far Point" generation algorithm, intended for N dimention test chart generation. This is none too quick, but seems to generate reasonably well distributed test points at a steady rate. Any reasonable algorithm in N dimensions needs to create test points starting with some in gamut "seed" point, as the valid gamut space becomes smaller and smaller as N increases. * 2002/12/2 Unstable release * Increased imdi code to handle at least 8 channels in and out. Added tables to generate all possible dimension combinations in and out from 3 to 8. Added -q and -s flags to itest to increase testing speed. * Added full 16 bit processing support to the imdi code. This also allows the handling of > 4 channel input conversions. Configured generation of 8 bit to 16 bit conversion kernels. The per channel output table value is 16 bits, useful for final device linearisation without the penalty of 16 bit precision thruout. Cleaned up the cgen code to more gracefully handle the differences between sort and simplex table code, as well as better handle 64 bit capability properly. * Changes imdi_gen to, by default generate all the imdi kernel code in a single file, reducing clutter. The -i flag invokes the previous behaviour. * Added -w flag to icclink, which enables a white point matching hack during linking. If set, the white points are forced to match regardless of the intent or gamut mapping. * Modified rspl to separate out the functions that are limited in the maximum input dimensions, and those that aren't, so that some rspl functionality can be used with larger numbers of colors. This translates through to increased number of colors support in some of xicc. * Fixed memory leak in imdi/imdi_tab.c (thanks to Krzysztof Spera) * Merged back basic changes to support compiling under Mac OSX. GUI and serial port dependent code isn't finished though. * Made allowance in CGATS and icc library for compiling without support of the usual system file and memory allocation calls, to increase flexibility when using these libraries in non standard environments. * Changed CGATS library to support alternate allocator and/or file I/O, for broader system compatibiliy. Added error return codes for all methods, to eliminate any calls to error(). Added new method error() to avoid having to check every method for a return code. * Finished first cut at the model printer profile object (xicc/mpp.[ch], profile/mpprof.c), that supports profiling N color printing devices. Note that ink modeling is not supported at the moment, but there is enough support for optimised seprations. * Added -u flag to profile/profile, that forces input Lut based profiles to be stored as an absolute profile. This is non-standard, but very useful for avoiding Lab range clipping when using a scanner as a colorimiter. * Added hack program profile/logo4 to convert four separate spectral files read using the logo software, to a single argyll .ti3 file. This won't be needed once Argyll can run the SpectroScan directly. * Added numerical library support for a Sobol sub-random multi-dimentional sequence generator, to support an alternate means of creating greater than 4 dimentional test chart values, plus first cut point support using it in target/qrand.c (This doesn't seem useful in practice though.) * Added -s option to iccdump to enable searching and dumping embedded profiles. * Fix bug in profile white point adjustment (xlut.c). The actual white point didn't match the specified white point to the degree of accuracy desired. There may also have been issues with clipping values in Lab PCS. * Added option to spectral to CIE module to compensate for the presense of FWA (Fluorescent Whitener Additive) in paper. This improves the accuracy of the CIE color values when a media measured under one illuminant is going to be viewer under a different illuminant. This works if you are using a spectral measurment instrument. (See poster in proceedings of the IS&T/SID 11th Color Imaging Conference, November 2003 page 248). * Added shaper/matrix input profile support. (profile/profin.c, xicc/xmatrix.c) This may be more accurate for scanner profiles, given the poor coverage of test points provided by an IT8 chart (but doesn't appear to be in practice). * Added support in scanin.c and scanrd.c for processing 16 bit TIFFs, allowing for higher precision scans (useful when using the scanner as a crude colorimeter). * Added support in scanin.c and scanrd.c for using a scan of a print test chart, plus a profile for the scanner, to act as a crude colorimeter in printer calibration. This new mode handles multi-page test charts. * Added support in printtarg, for producing a scan recognition template (.cht) for each page. * Added patch optimisation module to target/printtarg, to arrange patches to maximise their contrast for strip reading instruments. * Removed the color directory, since it's functionality has been taken over by the xcolorants library, and the (yet to be completed) MPP profile library. * Added DTP41T (tranmission) support in target/printtarg.c and spectro/printread.c etc. * Made changes to target/targen.c, target/printtarg.c and spectro/printread.c to be able to generate and then read >4 color test charts, to be able to characterise 6 to 8 color devices. * Added support in xicc/xspect.c for measuring StatusT and Visual density from a spectral reading, as well as an aproximate XYZ to density conversion, to support spectrometer patch spacer contrast determination. Also added an XYZ to sRGB conversion function to support RGB previews of N color devices, as well as scanner recognition template files. * Expanded xicc/xcolorants.c to incorporate an approximate device model for arbitrary colorant combinations. This is used to be able to approximate expected density readings, as well as preview colors and scanner recognition templates. * Create a new test point creation module, target/simplat.c, to create higher dimentional, regular simplex latice test pointsi (this seems rather slow and has difficulty arriving at the desired number of test points.) Fourth snapshot changes: ------------------------ * Removed gamut/iccgamut, and renamed xicc/xiccgamut to xicc/iccgamut. * Modified tiffgamut to be able to emit CIECAM97 style colorspace gamuts, so that it can be used to generate appropriate gamut files as input to icclink. Moved it to the xicc subdirectory, as it depends on xicc, just like xiccgamut. * Fixed up icclink.c, gammap.c and nearsmth.c to more correctly handle gammut mapping for a particular image gamut, rather than a source colorspace. * Added text description option to profile utility. * Made significant modifications to the perceptual gamut mapping. Turned gammap into an object, rather than merely returning a rspl to allow for a separate L mapping step. Added #define to control this. Made the source to destination surface point a weighted optimisation algorithm for more control over the absolute vs. relative error introduced, and setup some initial weighting values. This is intended to combat the tendency of the "smallest absolute error" mapping to map many to one in the most saturated regions, leading to a loss of detail. The weighting scheme could probably use some more fine tuning, or even some alteration to make it vary with respect to (say) the absolute L value, or the absolute C value. * Added first cut at a model based forward profile creation (profile/mpprof.c). This is intended for profiling 6 or more color devices, and using as the profile driving optimised separations. * Added xcolorants resource to allow specifying and defining device colorant combinations. This is needed as a foundation to profiling 6 or more color printing devices. * Tweaked targen to concentrate test patch points at regions of higher curvature. This should improve profiling efficiency slightly. * Fix bug in xlut.c where creating a gamut cleared any ink limit set on a rspl. This caused the ink limit to be ignored in any icclink that used gamut mapping. * Modified printtarg.c to try and get more reliable DTP41 operation. Switch to black and white patch spacers by default. It's difficult to know what the instrument really requires to reliably pick up the test spacers. * Fixed bug in gamut where it was still hanging on to vertex points that disapear below the log convex hull. This has no consequences. * Added option in icclink to allow specifying an explicit source gamut for the gamut mapping. This allows tailoring the gamut compression to be optimised for a particular image. * Added profile checking utility, that checks measured device points against an icc profile. * Fixed probem with linking when any of the profiles native PCS is XYX. The device linearisation curve should not be preserved if the native device profile PCS is XYZ. * Fixed bug in xmatrix.c & xmono.c when finding the gamuts of matrix and mono transforms when a Bwd transform is used. Showed up in icclink when the output profile was a matrix of monochrome transform. * Fixed bug in icclib when PCS overide is used with a Bwd transform. Similar problem to above for matrix & mono profiles, but at the icclib level. * Added function in icclink.c to allow the generation of a device linearisation curve for XYZ profiles. This was expected to improve the result when linking to XYZ profiles, but currently seems to make things worse. This feature is therefore off by default. :-( (This should be changed to work the same as the current xlut.c profile code!) * Added preliminary support in printtarg for the SpectroScan spectrodensitometer. Also added preliminary support for scanner recognisable test charts. * Added option to icclink to turn off the use of linearisation curves in the output link, since this sometimes seems to make the accuracy worse given profiles with odd device linearisation curves. * Added custom page size support to printtarg. * Modified icc library defines to use INR32 rather than INT32 definition, to avoid clashes with system typdefs etc. * Added CIE94 delta E support to profchek utility, changed peak reading to be peak delta E rather than peak individual L, a or b, and made the same change in the check code in profout.c * Added utility to do reflective spot readings using appropriate instrument (printspot). DTP41 supported. * Fixed bug in profile.c that meant that the spectral mode was ignored unless an observer was specified (ie. it wasn't defaulting to 1978_2). * Modified targen.c so that when a previous profile is used to pre-condition test points, the neutral axis has a higher density of points, in line with the higher sensitivity the CIE94 delta E formula has in this region. This should improve the tolerance of the resulting profile in the important neutral gray area. * Fixed bug in printread.c that is triggered when more than 26 strips are being read. * Modified targen.c so that the 4 dimentional auxiliary chanel weighting (ie. K chanel in CMYK) is 150% of the Lab spacing, rather than being 50% of it, when ICC profile pre-conditioning is being used. This seems to improve both the worst case, and average error of the resulting profile for at least some devices. * Switched to (now working) xlut2.c code, for creating clut based profiles. This version creates both input and output 1D luts by optimising the accuracy of the profile for a linear clut. The result seems to be more accurate profiles, since the underlying device characteristic is better modeled. It also seems to aleviate some of the issues when linking and preserving the device 1D luts in the linked profile. * Added verification function to icclink.c, to check the accuracy of a link profile. * Fixed numsup.c 2d array malloc/free to be more efficient by allocating the main array as a single block. * Fixed bugs in handling XYZ lut based profiles. * Fixed bug in setting white and black points for input profiles. * Added support for selecting algorithm type for all types of profiles - input, display and output. (XYZ lut doesn't seem to work properly yet though!) * Merged Raph Levien's cleanups to icc.c, to quiet gcc warnings. * Improved new xlut2.c to handle pathalogical input data from gridded charts. The order of the curves is now adjusted so that it is not greater than what can be supported by the data. Also changed shaper curve parameter action to be more progressive, and tied the parameters into the optimisation goal so that parameters that have no effect are minimised, resulting in less "ringing". Fixed bug in shaper curve transform that was clipping parameters, resulting in gross errors before the white point was exactly fixed on. * Added new features to profcheck: Sorting feature to indicate support for a particular device->pcs value, + VRML output of errors between profile and datapoints. * Modified scanin/scanrd to allow for Grey and CMYK .tiff files, as well as just outputing a CGATS data file, rather than only performing the data collection needed for and RGB scan calibration. This is useful for capturing the patch values from a test chart only available as a TIFF file. Removed automatic extention stuff. * Added black wedge generation to targen, and extra checking to elminate redundant test patches. * Added EPS output support to printtarg. * Added a couple of options to cctiff to aid diagnostics. Third snapshot changes: ---------------------- * Changed targen to allow full spread test points to take account of the others sorts of test points. * Changed icclib to use the Bradford chromatic adaption for white point shifting in profile creation and absolute profiles lookup. This creates some minor incompatiblity with profiles produced with earlier versions, but is likely to be more compatible with other CMMs. * Added support in icclib for abstract file accesor type (icmFile), and included implementations for standard file and memory image. * Added support in icclib for abstract memory allocator, and included implementation for standard alloc/free. * 25/2/2001 Changed targen to use ICC profile for perceptual even point generation. Includes support for Gray and RGB as well as CMYK perceptual support. * Film profiling using the Spectroscan-T care of Niel Okamoto. * Print charts suitable for the Xrite DTP41 are now supported, and print chart reading using the DTP41 is now supported. * Added DTP92 support and Lut and matrix profile support for display profiles. * Added spectral reading support to the DTP41 readings. * Added support in profile for using spectral data with choice of observers and builtin or loadable illuminant spectra. * Modified the gammap code to precicely match the white and black points. Solves "background color" problems in linking RGB and CMYK etc. * Changed K generation curve parameters to be easier to control. Have two breakpoints and curve shape along the luminance axis. * Added more sophisticated auxiliary chanel locus finder in rspl/rev.c, to be able to detect profile anomolies (not made use of in current code). * Added underlying support for optimised separations into 4 to 8 separations in rspl/opt.[ch] . This is intended to be used internally as an option for driving a CMYK device, and also explicitly to support 6 or more color devices. Not tested or made use of just yet. * Added development area for Java GUI development. The intention is to use Java as a sophisticated scripting front end, to make the command line commands more palatable. Second snapshot changes: ---------------------- Neil Okamoto has contributed support for generating RGB TIFF targets suitable for film recorder output, as well as Gretag Spectrolino support for reading them in again. The target patch generation now uses ICC profile to pre-condition the test points. This now works for RGB and Grey targets. Finished port to Linux. Cleaned up build automation somewhat. Added RGB output device profile generation support. Added RGB scanner device profile generation support. Added a couple of spectrometer conversion utilities for raw data files from other CMSs. Added gamut boundary mapping and visualization tools (VRML) Added CIECAM97s Color Appearance Model (CAM) colorspace support. Added experimental gamut mapping code. Enhanced linker to use CAM and gamut mapping. Numerous bug fixes and enhancement.