xref: /plan9/sys/src/cmd/gs/src/gdevpsds.h (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
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