[Contents] [Index] [Help] [Retrace] [Browse <] [Browse >]

The optional (but encouraged) property "CMAP" stores color map data as
triplets of red, green, and blue intensity values.  The n color map
entries ("color registers") are stored in the order 0 through n-1,
totaling 3n bytes. Thus n is the ckSize/3.  Normally, n would equal
2^(nPlanes).

A CMAP chunk contains a ColorMap array as defined below.  Note that these
typedefs assume a C compiler that implements packed arrays of 3-byte
elements.

    typedef struct {
        UBYTE red, green, blue;           /* color intensities 0..255 */
        } ColorRegister;                  /* size = 3 bytes           */

    typedef ColorRegister ColorMap[n];    /* size = 3n bytes          */

The color components red, green, and blue represent fractional intensity
values in the range 0 through 255 256ths.  White is (255, 255, 255) and
black is (0, 0, 0).  If your machine has less color resolution, use the
high order bits.  Shift each field right on reading (or left on writing)
and assign it to (from) a field in a local packed format like Color4,
below.  This achieves automatic conversion of images across environments
with different color resolutions.  On reading an ILBM, use defaults if the
color map is absent or has fewer color registers than you need.  Ignore
any extra color registers. (See Appendix E for a better way to write
colors)

The example type Color4 represents the format of a color register in
working memory of an Amiga computer, which has 4 bit video DACs.  (The
":4" tells smarter C compilers to pack the field into 4 bits.)

    typedef struct {
        unsigned pad1 :4, red :4, green :4, blue :4;
        } Color4;                /*   Amiga RAM format.  Not filed.  */

Remember that every chunk must be padded to an even length, so a color map
with an odd number of entries would be followed by a 0 byte, not included
in the ckSize.