xref: /plan9/sys/src/cmd/gs/src/gsiparam.h (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
13ff48bf5SDavid du Colombier /* Copyright (C) 1996, 2000 Aladdin Enterprises.  All rights reserved.
27dd7cddfSDavid du Colombier 
3*593dc095SDavid du Colombier   This software is provided AS-IS with no warranty, either express or
4*593dc095SDavid du Colombier   implied.
57dd7cddfSDavid du Colombier 
6*593dc095SDavid du Colombier   This software is distributed under license and may not be copied,
7*593dc095SDavid du Colombier   modified or distributed except as expressly authorized under the terms
8*593dc095SDavid du Colombier   of the license contained in the file LICENSE in this distribution.
97dd7cddfSDavid du Colombier 
10*593dc095SDavid du Colombier   For more information about licensing, please refer to
11*593dc095SDavid du Colombier   http://www.ghostscript.com/licensing/. For information on
12*593dc095SDavid du Colombier   commercial licensing, go to http://www.artifex.com/licensing/ or
13*593dc095SDavid du Colombier   contact Artifex Software, Inc., 101 Lucas Valley Road #110,
14*593dc095SDavid du Colombier   San Rafael, CA  94903, U.S.A., +1(415)492-9861.
157dd7cddfSDavid du Colombier */
167dd7cddfSDavid du Colombier 
17*593dc095SDavid du Colombier /* $Id: gsiparam.h,v 1.8 2002/08/22 07:12:29 henrys Exp $ */
187dd7cddfSDavid du Colombier /* Image parameter definition */
197dd7cddfSDavid du Colombier 
207dd7cddfSDavid du Colombier #ifndef gsiparam_INCLUDED
217dd7cddfSDavid du Colombier #  define gsiparam_INCLUDED
227dd7cddfSDavid du Colombier 
237dd7cddfSDavid du Colombier #include "gsccolor.h"		/* for GS_CLIENT_COLOR_MAX_COMPONENTS */
247dd7cddfSDavid du Colombier #include "gsmatrix.h"
257dd7cddfSDavid du Colombier #include "gsstype.h"		/* for extern_st */
267dd7cddfSDavid du Colombier 
277dd7cddfSDavid du Colombier /* ---------------- Image parameters ---------------- */
287dd7cddfSDavid du Colombier 
297dd7cddfSDavid du Colombier /*
307dd7cddfSDavid du Colombier  * Unfortunately, we defined the gs_image_t type as designating an ImageType
317dd7cddfSDavid du Colombier  * 1 image or mask before we realized that there were going to be other
327dd7cddfSDavid du Colombier  * ImageTypes.  We could redefine this type to include a type field without
337dd7cddfSDavid du Colombier  * perturbing clients, but it would break implementations of driver
347dd7cddfSDavid du Colombier  * begin_image procedures, since they are currently only prepared to handle
357dd7cddfSDavid du Colombier  * ImageType 1 images and would have to be modified to check the ImageType.
367dd7cddfSDavid du Colombier  * Therefore, we use gs_image_common_t for an abstract image type, and
377dd7cddfSDavid du Colombier  * gs_image<n>_t for the various ImageTypes.
387dd7cddfSDavid du Colombier  */
397dd7cddfSDavid du Colombier 
407dd7cddfSDavid du Colombier /*
417dd7cddfSDavid du Colombier  * Define the data common to all image types.  The type structure is
427dd7cddfSDavid du Colombier  * opaque here, defined in gxiparam.h.
437dd7cddfSDavid du Colombier  */
447dd7cddfSDavid du Colombier #ifndef gx_image_type_DEFINED
457dd7cddfSDavid du Colombier #  define gx_image_type_DEFINED
467dd7cddfSDavid du Colombier typedef struct gx_image_type_s gx_image_type_t;
477dd7cddfSDavid du Colombier 
487dd7cddfSDavid du Colombier #endif
497dd7cddfSDavid du Colombier #define gs_image_common\
507dd7cddfSDavid du Colombier 	const gx_image_type_t *type;\
517dd7cddfSDavid du Colombier 		/*\
527dd7cddfSDavid du Colombier 		 * Define the transformation from user space to image space.\
537dd7cddfSDavid du Colombier 		 */\
547dd7cddfSDavid du Colombier 	gs_matrix ImageMatrix
557dd7cddfSDavid du Colombier typedef struct gs_image_common_s {
567dd7cddfSDavid du Colombier     gs_image_common;
577dd7cddfSDavid du Colombier } gs_image_common_t;
587dd7cddfSDavid du Colombier 
597dd7cddfSDavid du Colombier #define public_st_gs_image_common() /* in gximage.c */\
607dd7cddfSDavid du Colombier   gs_public_st_simple(st_gs_image_common, gs_image_common_t,\
617dd7cddfSDavid du Colombier     "gs_image_common_t")
627dd7cddfSDavid du Colombier 
637dd7cddfSDavid du Colombier /*
647dd7cddfSDavid du Colombier  * Define the maximum number of components in image data.
657dd7cddfSDavid du Colombier  * The +1 is for either color + alpha or mask + color.
667dd7cddfSDavid du Colombier  */
677dd7cddfSDavid du Colombier #define GS_IMAGE_MAX_COLOR_COMPONENTS GS_CLIENT_COLOR_MAX_COMPONENTS
687dd7cddfSDavid du Colombier #define GS_IMAGE_MAX_COMPONENTS (GS_IMAGE_MAX_COLOR_COMPONENTS + 1)
697dd7cddfSDavid du Colombier /* Backward compatibility */
707dd7cddfSDavid du Colombier #define gs_image_max_components GS_IMAGE_MAX_COMPONENTS
717dd7cddfSDavid du Colombier 
727dd7cddfSDavid du Colombier /*
737dd7cddfSDavid du Colombier  * Define the maximum number of planes in image data.  Since we support
747dd7cddfSDavid du Colombier  * allocating a plane for each bit, the maximum value is the maximum number
757dd7cddfSDavid du Colombier  * of components (see above) times the maximum depth per component
767dd7cddfSDavid du Colombier  * (currently 8 for multi-component bit-planar images, but could be 16
777dd7cddfSDavid du Colombier  * someday; 32 or maybe 64 for DevicePixel images).
787dd7cddfSDavid du Colombier  */
797dd7cddfSDavid du Colombier #define GS_IMAGE_MAX_PLANES (GS_IMAGE_MAX_COMPONENTS * 8)
807dd7cddfSDavid du Colombier /* Backward compatibility */
817dd7cddfSDavid du Colombier #define gs_image_max_planes GS_IMAGE_MAX_PLANES
827dd7cddfSDavid du Colombier 
837dd7cddfSDavid du Colombier /*
847dd7cddfSDavid du Colombier  * Define the structure for defining data common to ImageType 1 images,
857dd7cddfSDavid du Colombier  * ImageType 3 DataDicts and MaskDicts, and ImageType 4 images -- i.e.,
867dd7cddfSDavid du Colombier  * all the image types that use explicitly supplied data.  It follows
877dd7cddfSDavid du Colombier  * closely the discussion on pp. 219-223 of the PostScript Language
887dd7cddfSDavid du Colombier  * Reference Manual, Second Edition, with the following exceptions:
897dd7cddfSDavid du Colombier  *
907dd7cddfSDavid du Colombier  *      DataSource and MultipleDataSources are not members of this
917dd7cddfSDavid du Colombier  *      structure, since the structure doesn't take a position on
927dd7cddfSDavid du Colombier  *      how the data are actually supplied.
937dd7cddfSDavid du Colombier  */
947dd7cddfSDavid du Colombier #define gs_data_image_common\
957dd7cddfSDavid du Colombier 	gs_image_common;\
967dd7cddfSDavid du Colombier 		/*\
977dd7cddfSDavid du Colombier 		 * Define the width of source image in pixels.\
987dd7cddfSDavid du Colombier 		 */\
997dd7cddfSDavid du Colombier 	int Width;\
1007dd7cddfSDavid du Colombier 		/*\
1017dd7cddfSDavid du Colombier 		 * Define the height of source image in pixels.\
1027dd7cddfSDavid du Colombier 		 */\
1037dd7cddfSDavid du Colombier 	int Height;\
1047dd7cddfSDavid du Colombier 		/*\
1057dd7cddfSDavid du Colombier 		 * Define B, the number of bits per pixel component.\
1067dd7cddfSDavid du Colombier 		 * Currently this must be 1 for masks.\
1077dd7cddfSDavid du Colombier 		 */\
1087dd7cddfSDavid du Colombier 	int BitsPerComponent;\
1097dd7cddfSDavid du Colombier 		/*\
1107dd7cddfSDavid du Colombier 		 * Define the linear remapping of the input values.\
1117dd7cddfSDavid du Colombier 		 * For the I'th pixel component, we start by treating\
1127dd7cddfSDavid du Colombier 		 * the B bits of component data as a fraction F between\
1137dd7cddfSDavid du Colombier 		 * 0 and 1; the actual component value is then\
1147dd7cddfSDavid du Colombier 		 * Decode[I*2] + F * (Decode[I*2+1] - Decode[I*2]).\
1157dd7cddfSDavid du Colombier 		 * For masks, only the first two entries are used;\
1167dd7cddfSDavid du Colombier 		 * they must be 1,0 for write-0s masks, 0,1 for write-1s.\
1177dd7cddfSDavid du Colombier 		 */\
1187dd7cddfSDavid du Colombier 	float Decode[GS_IMAGE_MAX_COMPONENTS * 2];\
1197dd7cddfSDavid du Colombier 		/*\
1207dd7cddfSDavid du Colombier 		 * Define whether to smooth the image.\
1217dd7cddfSDavid du Colombier 		 */\
1227dd7cddfSDavid du Colombier 	bool Interpolate
1237dd7cddfSDavid du Colombier typedef struct gs_data_image_s {
1247dd7cddfSDavid du Colombier     gs_data_image_common;
1257dd7cddfSDavid du Colombier } gs_data_image_t;
1267dd7cddfSDavid du Colombier 
1277dd7cddfSDavid du Colombier #define public_st_gs_data_image() /* in gximage.c */\
1287dd7cddfSDavid du Colombier   gs_public_st_simple(st_gs_data_image, gs_data_image_t,\
1297dd7cddfSDavid du Colombier     "gs_data_image_t")
1307dd7cddfSDavid du Colombier 
1317dd7cddfSDavid du Colombier /*
1327dd7cddfSDavid du Colombier  * Define the data common to ImageType 1 images, ImageType 3 DataDicts,
1337dd7cddfSDavid du Colombier  * and ImageType 4 images -- i.e., all the image types that provide pixel
1347dd7cddfSDavid du Colombier  * (as opposed to mask) data.  The following are added to the PostScript
1357dd7cddfSDavid du Colombier  * image parameters:
1367dd7cddfSDavid du Colombier  *
1377dd7cddfSDavid du Colombier  *      format is not PostScript or PDF standard: it is normally derived
1387dd7cddfSDavid du Colombier  *      from MultipleDataSources.
1397dd7cddfSDavid du Colombier  *
1407dd7cddfSDavid du Colombier  *      ColorSpace is added from PDF.
1417dd7cddfSDavid du Colombier  *
1427dd7cddfSDavid du Colombier  *      CombineWithColor is not PostScript or PDF standard: see the
1437dd7cddfSDavid du Colombier  *      RasterOp section of Language.htm for a discussion of
1447dd7cddfSDavid du Colombier  *      CombineWithColor.
1457dd7cddfSDavid du Colombier  */
1467dd7cddfSDavid du Colombier typedef enum {
1477dd7cddfSDavid du Colombier     /* Single plane, chunky pixels. */
1487dd7cddfSDavid du Colombier     gs_image_format_chunky = 0,
1497dd7cddfSDavid du Colombier     /* num_components planes, chunky components. */
1507dd7cddfSDavid du Colombier     gs_image_format_component_planar = 1,
1517dd7cddfSDavid du Colombier     /* BitsPerComponent * num_components planes, 1 bit per plane */
1527dd7cddfSDavid du Colombier     gs_image_format_bit_planar = 2
1537dd7cddfSDavid du Colombier } gs_image_format_t;
1547dd7cddfSDavid du Colombier 
1557dd7cddfSDavid du Colombier /* Define an opaque type for a color space. */
1567dd7cddfSDavid du Colombier #ifndef gs_color_space_DEFINED
1577dd7cddfSDavid du Colombier #  define gs_color_space_DEFINED
1587dd7cddfSDavid du Colombier typedef struct gs_color_space_s gs_color_space;
1597dd7cddfSDavid du Colombier 
1607dd7cddfSDavid du Colombier #endif
1617dd7cddfSDavid du Colombier 
1627dd7cddfSDavid du Colombier #define gs_pixel_image_common\
1637dd7cddfSDavid du Colombier 	gs_data_image_common;\
1647dd7cddfSDavid du Colombier 		/*\
1657dd7cddfSDavid du Colombier 		 * Define how the pixels are divided up into planes.\
1667dd7cddfSDavid du Colombier 		 */\
1677dd7cddfSDavid du Colombier 	gs_image_format_t format;\
1687dd7cddfSDavid du Colombier 		/*\
1697dd7cddfSDavid du Colombier 		 * Define the source color space (must be NULL for masks).\
1707dd7cddfSDavid du Colombier 		 */\
1717dd7cddfSDavid du Colombier 	const gs_color_space *ColorSpace;\
1727dd7cddfSDavid du Colombier 		/*\
1737dd7cddfSDavid du Colombier 		 * Define whether to use the drawing color as the\
1747dd7cddfSDavid du Colombier 		 * "texture" for RasterOp.  For more information,\
1757dd7cddfSDavid du Colombier 		 * see the discussion of RasterOp in Language.htm.\
1767dd7cddfSDavid du Colombier 		 */\
1777dd7cddfSDavid du Colombier 	bool CombineWithColor
1787dd7cddfSDavid du Colombier typedef struct gs_pixel_image_s {
1797dd7cddfSDavid du Colombier     gs_pixel_image_common;
1807dd7cddfSDavid du Colombier } gs_pixel_image_t;
1817dd7cddfSDavid du Colombier 
1827dd7cddfSDavid du Colombier extern_st(st_gs_pixel_image);
1837dd7cddfSDavid du Colombier #define public_st_gs_pixel_image() /* in gximage.c */\
1847dd7cddfSDavid du Colombier   gs_public_st_ptrs1(st_gs_pixel_image, gs_pixel_image_t,\
1857dd7cddfSDavid du Colombier     "gs_data_image_t", pixel_image_enum_ptrs, pixel_image_reloc_ptrs,\
1867dd7cddfSDavid du Colombier     ColorSpace)
1877dd7cddfSDavid du Colombier 
1887dd7cddfSDavid du Colombier /*
1897dd7cddfSDavid du Colombier  * Define an ImageType 1 image.  ImageMask is an added member from PDF.
1907dd7cddfSDavid du Colombier  * adjust and Alpha are not PostScript or PDF standard.
1917dd7cddfSDavid du Colombier  */
1927dd7cddfSDavid du Colombier typedef enum {
1937dd7cddfSDavid du Colombier     /* No alpha.  This must be 0 for true-false tests. */
1947dd7cddfSDavid du Colombier     gs_image_alpha_none = 0,
1957dd7cddfSDavid du Colombier     /* Alpha precedes color components. */
1967dd7cddfSDavid du Colombier     gs_image_alpha_first,
1977dd7cddfSDavid du Colombier     /* Alpha follows color components. */
1987dd7cddfSDavid du Colombier     gs_image_alpha_last
1997dd7cddfSDavid du Colombier } gs_image_alpha_t;
2007dd7cddfSDavid du Colombier 
2017dd7cddfSDavid du Colombier typedef struct gs_image1_s {
2027dd7cddfSDavid du Colombier     gs_pixel_image_common;
2037dd7cddfSDavid du Colombier     /*
2047dd7cddfSDavid du Colombier      * Define whether this is a mask or a solid image.
2057dd7cddfSDavid du Colombier      * For masks, Alpha must be 'none'.
2067dd7cddfSDavid du Colombier      */
2077dd7cddfSDavid du Colombier     bool ImageMask;
2087dd7cddfSDavid du Colombier     /*
2097dd7cddfSDavid du Colombier      * Define whether to expand each destination pixel, to make
2107dd7cddfSDavid du Colombier      * masked characters look better.  Only used for masks.
2117dd7cddfSDavid du Colombier      */
2127dd7cddfSDavid du Colombier     bool adjust;
2137dd7cddfSDavid du Colombier     /*
2147dd7cddfSDavid du Colombier      * Define whether there is an additional component providing
2157dd7cddfSDavid du Colombier      * alpha information for each pixel, in addition to the
2167dd7cddfSDavid du Colombier      * components implied by the color space.
2177dd7cddfSDavid du Colombier      */
2187dd7cddfSDavid du Colombier     gs_image_alpha_t Alpha;
2197dd7cddfSDavid du Colombier } gs_image1_t;
2207dd7cddfSDavid du Colombier 
2213ff48bf5SDavid du Colombier /* The descriptor is public for soft masks. */
2223ff48bf5SDavid du Colombier extern_st(st_gs_image1);
2233ff48bf5SDavid du Colombier #define public_st_gs_image1()	/* in gximage1.c */\
2243ff48bf5SDavid du Colombier   gs_public_st_suffix_add0(st_gs_image1, gs_image1_t, "gs_image1_t",\
2257dd7cddfSDavid du Colombier     image1_enum_ptrs, image1_reloc_ptrs, st_gs_pixel_image)
2267dd7cddfSDavid du Colombier 
2277dd7cddfSDavid du Colombier /*
2287dd7cddfSDavid du Colombier  * In standard PostScript Level 1 and 2, this is the only defined ImageType.
2297dd7cddfSDavid du Colombier  */
2307dd7cddfSDavid du Colombier typedef gs_image1_t gs_image_t;
2317dd7cddfSDavid du Colombier 
2327dd7cddfSDavid du Colombier /*
2337dd7cddfSDavid du Colombier  * Define procedures for initializing the standard forms of image structures
2347dd7cddfSDavid du Colombier  * to default values.  Note that because these structures may add more
2357dd7cddfSDavid du Colombier  * members in the future, all clients constructing gs_*image*_t values
2367dd7cddfSDavid du Colombier  * *must* start by initializing the value by calling one of the following
2377dd7cddfSDavid du Colombier  * procedures.  Note also that these procedures do not set the image type.
2387dd7cddfSDavid du Colombier  */
2397dd7cddfSDavid du Colombier void
2407dd7cddfSDavid du Colombier   /*
2417dd7cddfSDavid du Colombier    * Sets ImageMatrix to the identity matrix.
2427dd7cddfSDavid du Colombier    */
243*593dc095SDavid du Colombier      gs_image_common_t_init(gs_image_common_t * pic),
244*593dc095SDavid du Colombier   /*
2457dd7cddfSDavid du Colombier    * Also sets Width = Height = 0, BitsPerComponent = 1,
2467dd7cddfSDavid du Colombier    * format = chunky, Interpolate = false.
2477dd7cddfSDavid du Colombier    * If num_components = N > 0, sets the first N elements of Decode to (0, 1);
2487dd7cddfSDavid du Colombier    * if num_components = N < 0, sets the first -N elements of Decode to (1, 0);
2497dd7cddfSDavid du Colombier    * if num_components = 0, doesn't set Decode.
2507dd7cddfSDavid du Colombier    */
251*593dc095SDavid du Colombier      gs_data_image_t_init(gs_data_image_t * pim, int num_components),
2527dd7cddfSDavid du Colombier   /*
2537dd7cddfSDavid du Colombier    * Also sets CombineWithColor = false, ColorSpace = color_space, Alpha =
2547dd7cddfSDavid du Colombier    * none.  num_components is obtained from ColorSpace; if ColorSpace =
2557dd7cddfSDavid du Colombier    * NULL or ColorSpace is a Pattern space, num_components is taken as 0
2567dd7cddfSDavid du Colombier    * (Decode is not initialized).
2577dd7cddfSDavid du Colombier    */
258*593dc095SDavid du Colombier     gs_pixel_image_t_init(gs_pixel_image_t * pim,
259*593dc095SDavid du Colombier 			  const gs_color_space * color_space);
2607dd7cddfSDavid du Colombier 
2617dd7cddfSDavid du Colombier /*
2627dd7cddfSDavid du Colombier  * Initialize an ImageType 1 image (or imagemask).  Also sets ImageMask,
2637dd7cddfSDavid du Colombier  * adjust, and Alpha, and the image type.  For masks, write_1s = false
2647dd7cddfSDavid du Colombier  * paints 0s, write_1s = true paints 1s.  This is consistent with the
2657dd7cddfSDavid du Colombier  * "polarity" operand of the PostScript imagemask operator.
2667dd7cddfSDavid du Colombier  *
2677dd7cddfSDavid du Colombier  * init and init_mask initialize adjust to true.  This is a bad decision
2687dd7cddfSDavid du Colombier  * which unfortunately we can't undo without breaking backward
2697dd7cddfSDavid du Colombier  * compatibility.  That is why we added init_adjust and init_mask_adjust.
2707dd7cddfSDavid du Colombier  * Note that for init and init_adjust, adjust is only relevant if
2717dd7cddfSDavid du Colombier  * pim->ImageMask is true.
2727dd7cddfSDavid du Colombier  */
273*593dc095SDavid du Colombier void gs_image_t_init_adjust(gs_image_t * pim, const gs_color_space * pcs,
274*593dc095SDavid du Colombier 			    bool adjust);
2757dd7cddfSDavid du Colombier #define gs_image_t_init(pim, pcs)\
2767dd7cddfSDavid du Colombier   gs_image_t_init_adjust(pim, pcs, true)
277*593dc095SDavid du Colombier void gs_image_t_init_mask_adjust(gs_image_t * pim, bool write_1s,
278*593dc095SDavid du Colombier 				 bool adjust);
2797dd7cddfSDavid du Colombier #define gs_image_t_init_mask(pim, write_1s)\
2807dd7cddfSDavid du Colombier   gs_image_t_init_mask_adjust(pim, write_1s, true)
2817dd7cddfSDavid du Colombier 
2827dd7cddfSDavid du Colombier 
2837dd7cddfSDavid du Colombier /****** REMAINDER OF FILE UNDER CONSTRUCTION. PROCEED AT YOUR OWN RISK. ******/
2847dd7cddfSDavid du Colombier 
2857dd7cddfSDavid du Colombier #if 0
2867dd7cddfSDavid du Colombier 
2877dd7cddfSDavid du Colombier /* ---------------- Services ---------------- */
2887dd7cddfSDavid du Colombier 
2897dd7cddfSDavid du Colombier /*
2907dd7cddfSDavid du Colombier    In order to make the driver's life easier, we provide the following callback
2917dd7cddfSDavid du Colombier    procedure:
2927dd7cddfSDavid du Colombier  */
2937dd7cddfSDavid du Colombier 
294*593dc095SDavid du Colombier int gx_map_image_color(gx_device * dev,
2957dd7cddfSDavid du Colombier 		       const gs_image_t * pim,
2967dd7cddfSDavid du Colombier 		       const gx_color_rendering_info * pcri,
2977dd7cddfSDavid du Colombier 		       const uint components[GS_IMAGE_MAX_COMPONENTS],
298*593dc095SDavid du Colombier 		       gx_drawing_color * pdcolor);
2997dd7cddfSDavid du Colombier 
3007dd7cddfSDavid du Colombier /*
3017dd7cddfSDavid du Colombier   Map a source color to a drawing color.  The components are simply the
3027dd7cddfSDavid du Colombier   pixel component values from the input data, i.e., 1 to
3037dd7cddfSDavid du Colombier   GS_IMAGE_MAX_COMPONENTS B-bit numbers from the source data.  Return 0 if
3047dd7cddfSDavid du Colombier   the operation succeeded, or a negative error code.
3057dd7cddfSDavid du Colombier  */
3067dd7cddfSDavid du Colombier 
3077dd7cddfSDavid du Colombier #endif /*************************************************************** */
3087dd7cddfSDavid du Colombier 
3097dd7cddfSDavid du Colombier #endif /* gsiparam_INCLUDED */
310