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