13ff48bf5SDavid du Colombier /* Copyright (C) 1997, 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: gdevpsds.h,v 1.12 2005/02/26 18:07:43 igor Exp $ */ 187dd7cddfSDavid du Colombier /* Image processing stream interface for PostScript and PDF writers */ 197dd7cddfSDavid du Colombier 207dd7cddfSDavid du Colombier #ifndef gdevpsds_INCLUDED 217dd7cddfSDavid du Colombier # define gdevpsds_INCLUDED 227dd7cddfSDavid du Colombier 237dd7cddfSDavid du Colombier #include "strimpl.h" 24*593dc095SDavid du Colombier #include "gsiparam.h" 257dd7cddfSDavid du Colombier 263ff48bf5SDavid du Colombier /* ---------------- Depth conversion ---------------- */ 273ff48bf5SDavid du Colombier 287dd7cddfSDavid du Colombier /* Convert between 1/2/4/12 bits and 8 bits. */ 297dd7cddfSDavid du Colombier typedef struct stream_1248_state_s { 307dd7cddfSDavid du Colombier stream_state_common; 317dd7cddfSDavid du Colombier /* The following are set at initialization time. */ 327dd7cddfSDavid du Colombier uint samples_per_row; /* >0 */ 337dd7cddfSDavid du Colombier int bits_per_sample; /* 1, 2, 4, 12 */ 347dd7cddfSDavid du Colombier /* The following are updated dynamically. */ 357dd7cddfSDavid du Colombier uint left; /* # of samples left in current row */ 367dd7cddfSDavid du Colombier } stream_1248_state; 377dd7cddfSDavid du Colombier 387dd7cddfSDavid du Colombier /* Convert N (1, 2, 4, 12) bits to 8. */ 397dd7cddfSDavid du Colombier extern const stream_template s_1_8_template; 407dd7cddfSDavid du Colombier extern const stream_template s_2_8_template; 417dd7cddfSDavid du Colombier extern const stream_template s_4_8_template; 427dd7cddfSDavid du Colombier extern const stream_template s_12_8_template; 437dd7cddfSDavid du Colombier 447dd7cddfSDavid du Colombier /* Reduce 8 bits to N (1, 2, 4). */ 457dd7cddfSDavid du Colombier /* We do not currently support converting 8 bits to 12. */ 467dd7cddfSDavid du Colombier extern const stream_template s_8_1_template; 477dd7cddfSDavid du Colombier extern const stream_template s_8_2_template; 487dd7cddfSDavid du Colombier extern const stream_template s_8_4_template; 497dd7cddfSDavid du Colombier 507dd7cddfSDavid du Colombier /* Initialize an expansion or reduction stream. */ 51*593dc095SDavid du Colombier int s_1248_init(stream_1248_state *ss, int Columns, int samples_per_pixel); 523ff48bf5SDavid du Colombier 533ff48bf5SDavid du Colombier /* ---------------- Color space conversion ---------------- */ 547dd7cddfSDavid du Colombier 557dd7cddfSDavid du Colombier /* Convert (8-bit) CMYK to RGB. */ 567dd7cddfSDavid du Colombier typedef struct stream_C2R_state_s { 577dd7cddfSDavid du Colombier stream_state_common; 587dd7cddfSDavid du Colombier /* The following are set at initialization time. */ 597dd7cddfSDavid du Colombier const gs_imager_state *pis; /* for UCR & BG */ 607dd7cddfSDavid du Colombier } stream_C2R_state; 617dd7cddfSDavid du Colombier 627dd7cddfSDavid du Colombier #define private_st_C2R_state() /* in gdevpsds.c */\ 637dd7cddfSDavid du Colombier gs_private_st_ptrs1(st_C2R_state, stream_C2R_state, "stream_C2R_state",\ 647dd7cddfSDavid du Colombier c2r_enum_ptrs, c2r_reloc_ptrs, pis) 657dd7cddfSDavid du Colombier extern const stream_template s_C2R_template; 667dd7cddfSDavid du Colombier 673ff48bf5SDavid du Colombier /* Initialize a CMYK => RGB conversion stream. */ 68*593dc095SDavid du Colombier int s_C2R_init(stream_C2R_state *ss, const gs_imager_state *pis); 693ff48bf5SDavid du Colombier 703ff48bf5SDavid du Colombier /* Convert an image to indexed form (IndexedEncode filter). */ 713ff48bf5SDavid du Colombier typedef struct stream_IE_state_s { 723ff48bf5SDavid du Colombier stream_state_common; 733ff48bf5SDavid du Colombier /* The client sets the following before initializing the stream. */ 743ff48bf5SDavid du Colombier int BitsPerComponent; /* 1, 2, 4, 8 */ 753ff48bf5SDavid du Colombier int NumComponents; 763ff48bf5SDavid du Colombier int Width; /* pixels per scan line, > 0 */ 773ff48bf5SDavid du Colombier int BitsPerIndex; /* 1, 2, 4, 8 */ 783ff48bf5SDavid du Colombier /* 793ff48bf5SDavid du Colombier * Note: this is not quite the same as the Decode array for images: 803ff48bf5SDavid du Colombier * [0..1] designates the range of the corresponding component of the 813ff48bf5SDavid du Colombier * color space, not the literal values 0..1. This is the same for 823ff48bf5SDavid du Colombier * all color spaces except Lab, where the default values here are 833ff48bf5SDavid du Colombier * [0 1 0 1 0 1] rather than [0 100 amin amax bmin bmax]. 843ff48bf5SDavid du Colombier */ 853ff48bf5SDavid du Colombier const float *Decode; 863ff48bf5SDavid du Colombier /* 873ff48bf5SDavid du Colombier * The client must provide a Table whose size is at least 883ff48bf5SDavid du Colombier * ((1 << BitsPerIndex) + 1) * NumComponents. After the stream is 893ff48bf5SDavid du Colombier * closed, the first (N + 1) * NumComponents bytes of the Table 903ff48bf5SDavid du Colombier * will hold the palette, where N is the contents of the last byte of 913ff48bf5SDavid du Colombier * the Table. 923ff48bf5SDavid du Colombier */ 933ff48bf5SDavid du Colombier gs_bytestring Table; 943ff48bf5SDavid du Colombier /* The following change dynamically. */ 953ff48bf5SDavid du Colombier int hash_table[400]; /* holds byte offsets in Table */ 963ff48bf5SDavid du Colombier int next_index; /* next Table offset to assign */ 973ff48bf5SDavid du Colombier uint byte_in; 983ff48bf5SDavid du Colombier int in_bits_left; 993ff48bf5SDavid du Colombier int next_component; 1003ff48bf5SDavid du Colombier uint byte_out; 1013ff48bf5SDavid du Colombier int x; 1023ff48bf5SDavid du Colombier } stream_IE_state; 1033ff48bf5SDavid du Colombier 1043ff48bf5SDavid du Colombier #define private_st_IE_state() /* in gdevpsds.c */\ 1053ff48bf5SDavid du Colombier gs_public_st_composite(st_IE_state, stream_IE_state, "stream_IE_state",\ 1063ff48bf5SDavid du Colombier ie_state_enum_ptrs, ie_state_reloc_ptrs) 1073ff48bf5SDavid du Colombier 1083ff48bf5SDavid du Colombier extern const stream_template s_IE_template; 1093ff48bf5SDavid du Colombier 1103ff48bf5SDavid du Colombier /* ---------------- Downsampling ---------------- */ 1117dd7cddfSDavid du Colombier 1127dd7cddfSDavid du Colombier /* Downsample, possibly with anti-aliasing. */ 1137dd7cddfSDavid du Colombier #define stream_Downsample_state_common\ 1147dd7cddfSDavid du Colombier stream_state_common;\ 1157dd7cddfSDavid du Colombier /* The client sets the following before initialization. */\ 1167dd7cddfSDavid du Colombier int Colors;\ 1173ff48bf5SDavid du Colombier int WidthIn, HeightIn;\ 1187dd7cddfSDavid du Colombier int XFactor, YFactor;\ 1197dd7cddfSDavid du Colombier bool AntiAlias;\ 1207dd7cddfSDavid du Colombier bool padX, padY; /* keep excess samples */\ 1217dd7cddfSDavid du Colombier /* The following are updated dynamically. */\ 1227dd7cddfSDavid du Colombier int x, y /* position within input image */ 1237dd7cddfSDavid du Colombier #define s_Downsample_set_defaults_inline(ss)\ 1247dd7cddfSDavid du Colombier ((ss)->AntiAlias = (ss)->padX = (ss)->padY = false) 1257dd7cddfSDavid du Colombier typedef struct stream_Downsample_state_s { 1267dd7cddfSDavid du Colombier stream_Downsample_state_common; 1277dd7cddfSDavid du Colombier } stream_Downsample_state; 1287dd7cddfSDavid du Colombier 1293ff48bf5SDavid du Colombier /* Return the number of samples after downsampling. */ 130*593dc095SDavid du Colombier int s_Downsample_size_out(int size_in, int factor, bool pad); 1313ff48bf5SDavid du Colombier 1327dd7cddfSDavid du Colombier /* Subsample */ 1337dd7cddfSDavid du Colombier typedef struct stream_Subsample_state_s { 1347dd7cddfSDavid du Colombier stream_Downsample_state_common; 1357dd7cddfSDavid du Colombier } stream_Subsample_state; 1367dd7cddfSDavid du Colombier extern const stream_template s_Subsample_template; 1377dd7cddfSDavid du Colombier 1387dd7cddfSDavid du Colombier /* Average */ 1397dd7cddfSDavid du Colombier typedef struct stream_Average_state_s { 1407dd7cddfSDavid du Colombier stream_Downsample_state_common; 1417dd7cddfSDavid du Colombier uint sum_size; 1427dd7cddfSDavid du Colombier uint copy_size; 1437dd7cddfSDavid du Colombier uint *sums; /* accumulated sums for average */ 1447dd7cddfSDavid du Colombier } stream_Average_state; 1457dd7cddfSDavid du Colombier 1467dd7cddfSDavid du Colombier #define private_st_Average_state() /* in gdevpsds.c */\ 1477dd7cddfSDavid du Colombier gs_private_st_ptrs1(st_Average_state, stream_Average_state,\ 1487dd7cddfSDavid du Colombier "stream_Average_state", avg_enum_ptrs, avg_reloc_ptrs, sums) 1497dd7cddfSDavid du Colombier extern const stream_template s_Average_template; 1507dd7cddfSDavid du Colombier 151*593dc095SDavid du Colombier /* ---------------- Image compression chooser ---------------- */ 152*593dc095SDavid du Colombier 153*593dc095SDavid du Colombier typedef struct stream_compr_chooser_state_s { 154*593dc095SDavid du Colombier stream_state_common; 155*593dc095SDavid du Colombier uint choice; 156*593dc095SDavid du Colombier uint width, height, depth, bits_per_sample; 157*593dc095SDavid du Colombier uint samples_count, bits_left; 158*593dc095SDavid du Colombier ulong packed_data; 159*593dc095SDavid du Colombier byte *sample; 160*593dc095SDavid du Colombier ulong upper_plateaus, lower_plateaus; 161*593dc095SDavid du Colombier ulong gradients; 162*593dc095SDavid du Colombier } stream_compr_chooser_state; 163*593dc095SDavid du Colombier 164*593dc095SDavid du Colombier #define private_st_compr_chooser_state() /* in gdevpsds.c */\ 165*593dc095SDavid du Colombier gs_private_st_ptrs1(st_compr_chooser_state, stream_compr_chooser_state, \ 166*593dc095SDavid du Colombier "stream_compr_chooser_state",\ 167*593dc095SDavid du Colombier compr_chooser_enum_ptrs, compr_chooser_reloc_ptrs, sample) 168*593dc095SDavid du Colombier 169*593dc095SDavid du Colombier extern const stream_template s_compr_chooser_template; 170*593dc095SDavid du Colombier 171*593dc095SDavid du Colombier /* Set image dimensions. */ 172*593dc095SDavid du Colombier int 173*593dc095SDavid du Colombier s_compr_chooser_set_dimensions(stream_compr_chooser_state * st, int width, 174*593dc095SDavid du Colombier int height, int depth, int bits_per_sample); 175*593dc095SDavid du Colombier 176*593dc095SDavid du Colombier /* Get choice */ 177*593dc095SDavid du Colombier uint s_compr_chooser__get_choice(stream_compr_chooser_state *st, bool force); 178*593dc095SDavid du Colombier 179*593dc095SDavid du Colombier /* ---------------- Am image color conversion filter ---------------- */ 180*593dc095SDavid du Colombier 181*593dc095SDavid du Colombier #ifndef gx_device_DEFINED 182*593dc095SDavid du Colombier # define gx_device_DEFINED 183*593dc095SDavid du Colombier typedef struct gx_device_s gx_device; 184*593dc095SDavid du Colombier #endif 185*593dc095SDavid du Colombier 186*593dc095SDavid du Colombier typedef struct stream_image_colors_state_s stream_image_colors_state; 187*593dc095SDavid du Colombier 188*593dc095SDavid du Colombier struct stream_image_colors_state_s { 189*593dc095SDavid du Colombier stream_state_common; 190*593dc095SDavid du Colombier uint width, height, depth, bits_per_sample; 191*593dc095SDavid du Colombier byte output_bits_buffer; 192*593dc095SDavid du Colombier uint output_bits_buffered; 193*593dc095SDavid du Colombier uint output_component_bits_written; 194*593dc095SDavid du Colombier uint output_component_index; 195*593dc095SDavid du Colombier uint output_depth, output_bits_per_sample; 196*593dc095SDavid du Colombier uint raster; 197*593dc095SDavid du Colombier uint row_bits; 198*593dc095SDavid du Colombier uint row_bits_passed; 199*593dc095SDavid du Colombier uint row_alignment_bytes; 200*593dc095SDavid du Colombier uint row_alignment_bytes_left; 201*593dc095SDavid du Colombier uint input_component_index; 202*593dc095SDavid du Colombier uint input_bits_buffer; 203*593dc095SDavid du Colombier uint input_bits_buffered; 204*593dc095SDavid du Colombier uint input_color[GS_IMAGE_MAX_COLOR_COMPONENTS]; 205*593dc095SDavid du Colombier uint output_color[GS_IMAGE_MAX_COLOR_COMPONENTS]; 206*593dc095SDavid du Colombier uint MaskColor[GS_IMAGE_MAX_COLOR_COMPONENTS * 2]; 207*593dc095SDavid du Colombier float Decode[GS_IMAGE_MAX_COLOR_COMPONENTS * 2]; 208*593dc095SDavid du Colombier const gs_color_space *pcs; 209*593dc095SDavid du Colombier gx_device *pdev; 210*593dc095SDavid du Colombier const gs_imager_state *pis; 211*593dc095SDavid du Colombier int (*convert_color)(stream_image_colors_state *); 212*593dc095SDavid du Colombier }; 213*593dc095SDavid du Colombier 214*593dc095SDavid du Colombier #define private_st_image_colors_state() /* in gdevpsds.c */\ 215*593dc095SDavid du Colombier gs_private_st_ptrs3(st_stream_image_colors_state, stream_image_colors_state,\ 216*593dc095SDavid du Colombier "stream_image_colors_state", stream_image_colors_enum_ptrs,\ 217*593dc095SDavid du Colombier stream_image_colors_reloc_ptrs, pcs, pdev, pis) 218*593dc095SDavid du Colombier 219*593dc095SDavid du Colombier extern const stream_template s_image_colors_template; 220*593dc095SDavid du Colombier 221*593dc095SDavid du Colombier void s_image_colors_set_dimensions(stream_image_colors_state * st, 222*593dc095SDavid du Colombier int width, int height, int depth, int bits_per_sample); 223*593dc095SDavid du Colombier 224*593dc095SDavid du Colombier void s_image_colors_set_mask_colors(stream_image_colors_state * ss, uint *MaskColor); 225*593dc095SDavid du Colombier 226*593dc095SDavid du Colombier void s_image_colors_set_color_space(stream_image_colors_state * ss, gx_device *pdev, 227*593dc095SDavid du Colombier const gs_color_space *pcs, const gs_imager_state *pis, 228*593dc095SDavid du Colombier float *Decode); 229*593dc095SDavid du Colombier 230*593dc095SDavid du Colombier extern const stream_template s__image_colors_template; 231*593dc095SDavid du Colombier 2327dd7cddfSDavid du Colombier #endif /* gdevpsds_INCLUDED */ 233