ref: f0ac2d01765f938a4f3656efef440cf2c1bca69d
dir: /sys/src/cmd/gs/icclib/NOTES/
This directory contains a subset of the icclib 2.0 distribution for use with Ghostscript. The full version of icclib is available from Graeme Gill's website: http://web.access.net.au/argyll/color.html In the near future, we expect to treat icclib much the same way we do libjpeg and friends. At that point, it will be available from the Ghostscript download locations, but won't actually be included in the Ghostscript distribution proper, or in the source tree. Raph Levien 18 October 2001 Release notes by Jan Stoeckenius follow (lightly edited by Raph Levien to reflect the icclib 2.0 integration): This patch integrates Graeme W. Gill's icclib code into ghostscript, to support ICCBased color spaces for both PostScript and PDF. The PDF support is as documented in version 1.3 of PDF; see the "PDR Reference", 2nd. ed., Sec. 4.5.4 (pp. 165 - 180). Support for PostScript is essentially identical. An ICCBased color space is array of the form: [ /ICCBased <dictionary> ] The recognized entries in the dictionary are: N integer (Required) The number of color space components, as in the PDF dictionary. This may be 1, 3, or 4. Alternate array or (Optional) The alternative color space to use if name the ICC profile is not useable (for any reason). If this entry is not provided, its default value is determined by N, using the rule 1 ==> DeviceGray, 3 ==> DeviceRGB, 4 ==> DeviceCMYK. All this is the same as in the PDF dictionary. Range array (Optional) An array of 2 * N numbers, which obey the relationship Range[2 * i] <= Range[2 * i + 1]. The i'th component of a color, c[i], is constrained such that: Range[2 * i] <= c[i] <= Range[2 * i + 1] If this entry is not provided, its default value is an array of length 2 * N with the form [ 0 1 0 1 ... ]. All of this is the same as for the PDF dictionary. DataSource file or (Required)The ICC profile data. If this is a string file it must be positionable. With the exception of running out of memory, most errors discovered while reading the profile will result in the alternative space being used. New Files: src/gsicc.c Implementation of the methods associated with the ICCBased color space structure (a gs_color_space_s structure of type gs_color_space_index_CIEICC). The gs_cspace_build_CIEICC procedure is also implemented in this file. src/gsicc.h Definition of the gs_cie_icc_s structure, which is the essential parameter structure for ICCBased color spaces. The files in this structure are all straightforward, except for the file_id field. This latter field is compared with the read_id and write_id of a stream, to verify that the stream is still valid. This is the same mechanism as is used by the ref structure, and for the same reason. src/zicc.c Implementation of the .seticcspace operator, which is used to set the current color space to be an ICCBased color space. src/icclib.mak Makefile for building the icclib code (which is in a separate directory). The mechanism used is identical to that used by zlib.mak. lib/gs_icc.ps Implementation of the ICCBased color space specific routine in colorspacedict. This routine is much more extensive that those used for the other color spaces, both due to the greater complexity of the color space and because we have chosen to implement much of the error checking in this routine. NB: To disable support for ICCBased color spaces, replace "NOCIE" in this file with "true". Though ICCBased will still be a recognized color space family, the alternative space will always be used. gs_icclib/icc.c gs_icclib/icc.h gs_icclib/icc9809.h The gs_icclib directory is the default location of the icclib code. The files in this directory are identical to those of the usual distribution of this library. Modified Files: src/gdevpdfc.c Added support for ICCBased color spaces to the pdf_color_space procedure. These are effectively translated into themselves, with the DataSource component replaced by a (PDF) stream. src/gdevpx.c Added ICCBased to the set of color spaces that pclxl_can_handle_color_space reports as one that cannot be handled. src/gscie.c Added support for ICCBased color spaces in the cie_cs_common_abc procedure. Also exported gx_cie_common_complete (previously cie_common_complete) and gx_cie_load_common_cache (previously cie_load_common_cache) for use in gsicc.c. src/gscie.h Modified the definitions of st_cie_common and st_cie_common_elements to be public. src/gsciemap.c Removed the definition of the macro CIE_CHECK_RENDERING (it is now in gxcie.h). Exported gx_cie_remap_finish (previously cie_remap_finish) for use in gsicc.c. src/gscolor.c Added support for ICCBased color spaces in gs_currentrgbcolor. src/gscolor1.c Added support for ICCBased color spaces in gs_currentcmykcolor. src/gscscie.c Exported st_cie_common, st_cie_common_elements, gx_concrete_space_CIE, gx_install_CIE, gx_set_common_cie_defaults (previously set_common_cie_defaults), and gx_build_cie_space (previously build_cie_space) for use in gsicc.c. src/gscspace.h Added the gs_icc_params data structure (for ICCBased color spaces), and the associated type indicator (gs_color_space_index_CIEICC). Also broke what had been the gs_base_color_space structure into two, with gs_small_base_color_space covering all the prior base color spaces, and gs_base_color_space covering these and the ICCBased color space. See the comments in the file for an explanation as to why this was necessary. src/gscssub.c Added code to allow ICCBased color spaces to be substituted for the device specific color spaces. This is necessary to support the DefaultDevice* color spaces in PDF. src/gxcie.h Moved the definition of the CIE_CHECK_RENDERING macro to this file (it was in gsciemap.c). Added prototypes for st_cie_common, st_cie_common_elemets_t, gx_set_common_cie_defaults, gx_cie_load_common_cache, gx_cie_common_complete, gx_install_CIE, gx__build_cie_space, and gs_concrete_cspace_CIE. src/gxshade.c Added support for ICCBased color spaces in shade_init_fill_state. src/icie.h Added a prototype for cie_set_finish. src/zcie.c Exported cie_set_finish (previously set_cie_finish) for use in zicc.c (the name change maintains consistency with other exported CIE-specific interpreter routines). src/lib.mak Added the sicclib.dev feature device, and the associated compilation directives and dependency lists. Also updated the dependency lists for gscie.c and gxshade.c (both now require gsicc.h). src/int.mak Added the icc.dev feature device, and the associated compilation directives and dependency lists. This pdf.dev feature device now lists icc.dev as a prerequisite. src/devs.mak Updated the dependency list for gdevpdfc.c. src/bcwin32.mak src/dvx-gcc.mak src/msvc32.mak src/msvclib.mak src/openvms.mak src/os2.mak src/ugcclib.mak src/unix-gcc.mak src/unixansi.mak src/unixtrad.mak src/watc.mak src/watclib.mak src/watcw32.mak Added a default definition for ICCSRCDIR, the source directory for the icclib code. src/gs.mak Added default definitions for ICCGENDIR, ICCOBJDIR, ICCI_ (ICC specific include directories), and ICCF_ (currently empty). lib/pdf_draw.ps Added ICCBased color space specific procedures for csncompdict and defaultdecodedict. Modified the ICCBased color space procedure in csrdict to map a PDF-form color space to the PostScript form. lib/pdf__ops.ps Added ICCBased color space specific procedure to CSdict and Cdict. Additional notes by Jan Stoeckenius: 1. The color produced when ICCBased color spaces are employed is dependent on the installed color rendering dictionary. For the default X11 device, this dictionary does not provide correction for the relative white point (at least, not as far as we can tell). ICC profiles use the D50 white point. In the absence of white point adjustment, "white" in the associated color space appears to be a moderate yellow on the output device (other colors are similarly "red-shifted"). This arrangement has the advantage of making it obvious when ICCBased color spaces are supported (useful for testing). On the other hand, the output is probably not what the user intended. If you have any devices with known "good" color rendering dictionaries, it would be useful to test ICCBased color space support on those devices as soon as possible. 2. The tests we have run do not exercise the memory handling facilities in ghostscript to any extent. The support for ICCBased color spaces involves two new structures, for which we have provided structure descriptors. We believe these have been correctly constructed, and that the one reference-counted structure is being handled properly, but we have no simple way of testing for this. 3. Changes were required in an unexpectedly large number of files (9 new files, 34 existing files [these figures refer to the integration into 7.00 - RLL]), though in many cases only a few lines needed to be modified. The primary reason for this is that the graphic library color space code severely violates the principles of object-oriented programming. Color space objects have a visible type indicator, and this type is directly used in many places. When adding a new color space type, it was not sufficient to create the associated methods. We also had to search the code for all places in which a color space type indicator was explicitly accessed. We believe we have found all the places where this occurs, and have modified them appropriately (see the ReleaseNotes file for details). On the other hand, we have not come remotely close to testing all of these changes, nor is there any easy test to see if there are places we missed. When Peter was the only person working on the graphic library, this situation was bothersome but probably not critical. In the new environment in which ghostscript is being developed, we believe this situation will lead to serious problems. We recommend that a project be started to make the color space code much more object- oriented, by creating color space methods for all of the required color space properties. 4. The current method of "inline" storage of alternative/base color spaces is becoming hard to maintain. Strictly speaking, ICCBased color spaces cannot be implemented within this mechanism: the color spaces may be (and are) used as alternative color spaces for Separation and DeviceN color spaces, and may in turn access such color spaces as their own alternative color space. We hacked around this problem by disallowing the latter possibility, and introducing yet another layer in the color space hierarchy. The class gs_base_color_space is now split into gs_small_base_color_space (all of the previous base color spaces) and gs_base_color_space (gs_small_base_color_space and ICCBased color spaces). This is an unholy mess, but at least it seems to be functional. As the number of layers in the color space hierarchy grows, so does the potential for serious and well-hidden problems. The reason is that pointers to alternative/base color spaces may point into the middle of an object. If such a pointer is accessible via the heap, and is subject to relocation, the location of the structure descriptor will be read incorrectly. By the time this error is apparent, much of the affected memory may be overwritten. Tracing such problems is typically quite time-consuming. The original guard against this problem was to perform all color space assignments by value. This worked when Peter was the only person regularly changing the code, and may continue to work under the current arrangement. We believe, however, that this situation will cause trouble in the future. We recommend that the current color space mechanism be discarded. A new mechanism should allow alternative/base color spaces to be included by reference rather than by value. Such a mechanism should also move the generic color space parameters (number of components, additive/subtractive indicator, etc.) into the base structure, even if these parameters are fixed for certain color spaces. 5. The PDF device code currently attempts to translate PostScript's CIEBased color spaces into the more restrictive set of CIE color spaces in PDF. Many color spaces cannot be translated directly, and the code will fail if such a color space is encountered. We have generalized this code to handle ICCBased color spaces, which effectively are translated to themselves. A much more complete solution could be provided by mapping PostScript's CIEBased color spaces into ICCBased color spaces in PDF. Essentially all CIEBased color spaces could be handled in this manner (via sample and generation of a lookup table).