This directory contains a patched version of icclib 1.23 for use with
Ghostscript. The full version of icclib is available from Graeme
Gill's website: http://web.access.net.au/argyll/color.html

Hopefully, a future version of icclib will have the needed flexibility
to work in the Ghostscript environment unmodified. At that point, we
will either include the full icclib release, or simply reference it
as we do the zlib, jpeg, and libpng libraries.

Raph Levien
19 March 2001

Release notes by Jan Stoeckenius follow:

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/gs_stdio.h
    A stub version of stdio.h, which works with graphic library streams
    as opposed to the usual clib file buffer objects. This file is
    included only in gs_icclib/icc.c, which was written to work with the
    clib standard I/O library. The use of this header file is the only
    change required to allow that file to work with graphic library streams.

  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, with two small exceptions:

      1. In icc.c, inclusion of <stdio.h> is replaced with inclusion of
         <gs_stdio.h>.

      2. In icc.h, the following macro is added:

         /* macro to allow updating the file pointer on systems with memory relocation */
         #define icc_update_fp(icc, nfp)  ((icc)->fp = (nfp))

    The latter change is necessary as the profile stream is kept in
    relocatable memory.


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/stream.c
      Added the procedures sread and swrite, which implement the function of
      fread and fwrite for streams.

    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), 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).

