/* Portions Copyright (C) 2001 artofcode LLC.
   Portions Copyright (C) 1996, 2001 Artifex Software Inc.
   Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
   This software is based in part on the work of the Independent JPEG Group.
   All Rights Reserved.

   This software is distributed under license and may not be copied, modified
   or distributed except as expressly authorized under the terms of that
   license.  Refer to licensing information at http://www.artifex.com/ or
   contact Artifex Software, Inc., 101 Lucas Valley Road #110,
   San Rafael, CA  94903, (415)492-9861, for further information. */
/*$Id: pccid.h 2164 2004-12-30 20:18:44Z henrys $ */

#ifndef pccid_INCLUDED
#define  pccid_INCLUDED

#include "gx.h"
#include "gsstruct.h"
#include "pcommand.h"

typedef short           int16;
typedef unsigned short  uint16;

/*
 * Enumeration of the 5c color spaces.
 *
 * Note that there is no separate monochrome color space; the monochrome
 * simple color space is simply an RGB color space with a two-entry palette
 * (1-bit/index) containing white (0) and black (1).
 *
 * These values are defined by HP.
 */
typedef enum {
    pcl_cspace_White = -1,
    pcl_cspace_RGB = 0,
    pcl_cspace_CMY = 1,
    pcl_cspace_Colorimetric = 2,
    pcl_cspace_CIELab = 3,
    pcl_cspace_LumChrom = 4,
    pcl_cspace_num
} pcl_cspace_type_t;

/*
 * The pixel encoding enumeration.
 *
 * These values are defined by HP.
 */
typedef enum {
    pcl_penc_indexed_by_plane = 0,
    pcl_penc_indexed_by_pixel = 1,
    pcl_penc_direct_by_plane = 2,
    pcl_penc_direct_by_pixel = 3,
    pcl_penc_num
} pcl_encoding_type_t;

/*
 * The short form and various long-form configure image data structures.
 * Though the long form structures are similar to those defined by HP,
 * only pcl_cid_shortform is the same (the others must be different to
 * support alignment-sensitive processors).
 *
 * A GC memory descriptor is provided for pcl_cid_data_t object, though
 * it should seldom be used: the configure image data information is needed
 * only fleetingly while an indexed color space is created. Beyond that only
 * the header (short form) is needed, and this is so small it can be copied
 * into any objects that require it.
 *
 * NB: For the long form luminance-chrominance case, rows and columns of
 *     of the RGB ==> LumChrom transformation matrix must be transposed,
 *     to go from the column-vector view of HP to row-vector view used
 *     by the pc_mtx3_t data structure and the graphics library. The column
 *     vector form is stored in the matrix field of the pcl_cid_lum_chrom_t
 *     structure.
 */
#define pcl_cid_hdr_common                                      \
    byte    cspace;         /* actually pcl_cspace_type_t */    \
    byte    encoding;       /* actually pcl_encoding_type_t */  \
    byte    bits_per_index;                                     \
    byte    bits_per_primary[3]

typedef struct pcl_cid_hdr_s {
    pcl_cid_hdr_common;
} pcl_cid_hdr_t;

typedef struct pcl_cid_dev_long_s {
    pcl_cid_hdr_common;
    int16   white_ref[3];
    int16   black_ref[3];
} pcl_cid_dev_long_t;

typedef struct pcl_cid_minmax_s {
    struct {
        float   min_val, max_val;
    }       val_range[3];
} pcl_cid_minmax_t;

typedef struct pcl_cid_col_common_s {
    struct {
        float   x, y;
    }       chroma[4];
    struct {
        float   gamma, gain;
    }       nonlin[3];
} pcl_cid_col_common_t;

typedef struct pcl_cid_col_long_s {
    pcl_cid_hdr_common;
    pcl_cid_col_common_t    colmet;
    pcl_cid_minmax_t        minmax;
} pcl_cid_col_long_t;

typedef struct pcl_cid_Lab_long_s {
    pcl_cid_hdr_common;
    pcl_cid_minmax_t        minmax;
} pcl_cid_Lab_long_t;

typedef struct pcl_cid_lum_long_s {
    pcl_cid_hdr_common;
    float                   matrix[9];
    pcl_cid_minmax_t        minmax;
    pcl_cid_col_common_t    colmet;
} pcl_cid_lum_long_t;

/*
 * The unified PCL configure image data structure.
 */
typedef struct pcl_cid_data_s {
    uint16      len;
    byte        original_cspace;  /* the original color space if a substitution has occurred */
    union {
        pcl_cid_hdr_t       hdr;
        pcl_cid_dev_long_t  dev;
        pcl_cid_col_long_t  col;
        pcl_cid_Lab_long_t  lab;
        pcl_cid_lum_long_t  lum;
    }           u;
} pcl_cid_data_t;

#define private_st_cid_data_t()             \
    gs_private_st_simple( st_cid_data,      \
                          pcl_cid_data_t,   \
                          "pcl_cid_data_t"  \
                          )

/*
 * Functions for getting configuration parameters from the first six bytes of
 * the configure image data structure.
 */
pcl_cspace_type_t pcl_cid_get_cspace(const pcl_cid_data_t *pcid);

pcl_encoding_type_t pcl_cid_get_encoding(const pcl_cid_data_t *pcid);

byte pcl_cid_get_bits_per_index(const pcl_cid_data_t *pcid);

byte pcl_cid_get_bits_per_primary(const pcl_cid_data_t *pcid, int index);

/*
 * Implement the GL/2 IN command. This is probably better done via a reset flag,
 * but currently there are no reset flags that propagate out of GL/2.
 */
int     pcl_cid_IN(pcl_state_t * pcs);

/*
 * Entry point for the configure image data code.
 */
extern  const pcl_init_t    pcl_cid_init;

#endif		/* pccid_INCLUDED */
