xref: /plan9/sys/src/cmd/gs/src/gdevpsds.h (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
1 /* Copyright (C) 1997, 2000 Aladdin Enterprises.  All rights reserved.
2 
3   This software is provided AS-IS with no warranty, either express or
4   implied.
5 
6   This software is distributed under license and may not be copied,
7   modified or distributed except as expressly authorized under the terms
8   of the license contained in the file LICENSE in this distribution.
9 
10   For more information about licensing, please refer to
11   http://www.ghostscript.com/licensing/. For information on
12   commercial licensing, go to http://www.artifex.com/licensing/ or
13   contact Artifex Software, Inc., 101 Lucas Valley Road #110,
14   San Rafael, CA  94903, U.S.A., +1(415)492-9861.
15 */
16 
17 /* $Id: gdevpsds.h,v 1.12 2005/02/26 18:07:43 igor Exp $ */
18 /* Image processing stream interface for PostScript and PDF writers */
19 
20 #ifndef gdevpsds_INCLUDED
21 #  define gdevpsds_INCLUDED
22 
23 #include "strimpl.h"
24 #include "gsiparam.h"
25 
26 /* ---------------- Depth conversion ---------------- */
27 
28 /* Convert between 1/2/4/12 bits and 8 bits. */
29 typedef struct stream_1248_state_s {
30     stream_state_common;
31     /* The following are set at initialization time. */
32     uint samples_per_row;	/* >0 */
33     int bits_per_sample;	/* 1, 2, 4, 12 */
34     /* The following are updated dynamically. */
35     uint left;			/* # of samples left in current row */
36 } stream_1248_state;
37 
38 /* Convert N (1, 2, 4, 12) bits to 8. */
39 extern const stream_template s_1_8_template;
40 extern const stream_template s_2_8_template;
41 extern const stream_template s_4_8_template;
42 extern const stream_template s_12_8_template;
43 
44 /* Reduce 8 bits to N (1, 2, 4). */
45 /* We do not currently support converting 8 bits to 12. */
46 extern const stream_template s_8_1_template;
47 extern const stream_template s_8_2_template;
48 extern const stream_template s_8_4_template;
49 
50 /* Initialize an expansion or reduction stream. */
51 int s_1248_init(stream_1248_state *ss, int Columns, int samples_per_pixel);
52 
53 /* ---------------- Color space conversion ---------------- */
54 
55 /* Convert (8-bit) CMYK to RGB. */
56 typedef struct stream_C2R_state_s {
57     stream_state_common;
58     /* The following are set at initialization time. */
59     const gs_imager_state *pis;	/* for UCR & BG */
60 } stream_C2R_state;
61 
62 #define private_st_C2R_state()	/* in gdevpsds.c */\
63   gs_private_st_ptrs1(st_C2R_state, stream_C2R_state, "stream_C2R_state",\
64     c2r_enum_ptrs, c2r_reloc_ptrs, pis)
65 extern const stream_template s_C2R_template;
66 
67 /* Initialize a CMYK => RGB conversion stream. */
68 int s_C2R_init(stream_C2R_state *ss, const gs_imager_state *pis);
69 
70 /* Convert an image to indexed form (IndexedEncode filter). */
71 typedef struct stream_IE_state_s {
72     stream_state_common;
73     /* The client sets the following before initializing the stream. */
74     int BitsPerComponent;	/* 1, 2, 4, 8 */
75     int NumComponents;
76     int Width;			/* pixels per scan line, > 0 */
77     int BitsPerIndex;		/* 1, 2, 4, 8 */
78     /*
79      * Note: this is not quite the same as the Decode array for images:
80      * [0..1] designates the range of the corresponding component of the
81      * color space, not the literal values 0..1.  This is the same for
82      * all color spaces except Lab, where the default values here are
83      * [0 1 0 1 0 1] rather than [0 100 amin amax bmin bmax].
84      */
85     const float *Decode;
86     /*
87      * The client must provide a Table whose size is at least
88      * ((1 << BitsPerIndex) + 1) * NumComponents.  After the stream is
89      * closed, the first (N + 1) * NumComponents bytes of the Table
90      * will hold the palette, where N is the contents of the last byte of
91      * the Table.
92      */
93     gs_bytestring Table;
94     /* The following change dynamically. */
95     int hash_table[400];	/* holds byte offsets in Table */
96     int next_index;		/* next Table offset to assign */
97     uint byte_in;
98     int in_bits_left;
99     int next_component;
100     uint byte_out;
101     int x;
102 } stream_IE_state;
103 
104 #define private_st_IE_state()	/* in gdevpsds.c */\
105   gs_public_st_composite(st_IE_state, stream_IE_state, "stream_IE_state",\
106     ie_state_enum_ptrs, ie_state_reloc_ptrs)
107 
108 extern const stream_template s_IE_template;
109 
110 /* ---------------- Downsampling ---------------- */
111 
112 /* Downsample, possibly with anti-aliasing. */
113 #define stream_Downsample_state_common\
114 	stream_state_common;\
115 		/* The client sets the following before initialization. */\
116 	int Colors;\
117 	int WidthIn, HeightIn;\
118 	int XFactor, YFactor;\
119 	bool AntiAlias;\
120 	bool padX, padY;	/* keep excess samples */\
121 		/* The following are updated dynamically. */\
122 	int x, y		/* position within input image */
123 #define s_Downsample_set_defaults_inline(ss)\
124   ((ss)->AntiAlias = (ss)->padX = (ss)->padY = false)
125 typedef struct stream_Downsample_state_s {
126     stream_Downsample_state_common;
127 } stream_Downsample_state;
128 
129 /* Return the number of samples after downsampling. */
130 int s_Downsample_size_out(int size_in, int factor, bool pad);
131 
132 /* Subsample */
133 typedef struct stream_Subsample_state_s {
134     stream_Downsample_state_common;
135 } stream_Subsample_state;
136 extern const stream_template s_Subsample_template;
137 
138 /* Average */
139 typedef struct stream_Average_state_s {
140     stream_Downsample_state_common;
141     uint sum_size;
142     uint copy_size;
143     uint *sums;			/* accumulated sums for average */
144 } stream_Average_state;
145 
146 #define private_st_Average_state()	/* in gdevpsds.c */\
147   gs_private_st_ptrs1(st_Average_state, stream_Average_state,\
148     "stream_Average_state", avg_enum_ptrs, avg_reloc_ptrs, sums)
149 extern const stream_template s_Average_template;
150 
151 /* ---------------- Image compression chooser ---------------- */
152 
153 typedef struct stream_compr_chooser_state_s {
154     stream_state_common;
155     uint choice;
156     uint width, height, depth, bits_per_sample;
157     uint samples_count, bits_left;
158     ulong packed_data;
159     byte *sample;
160     ulong upper_plateaus, lower_plateaus;
161     ulong gradients;
162 } stream_compr_chooser_state;
163 
164 #define private_st_compr_chooser_state()	/* in gdevpsds.c */\
165   gs_private_st_ptrs1(st_compr_chooser_state, stream_compr_chooser_state, \
166     "stream_compr_chooser_state",\
167     compr_chooser_enum_ptrs, compr_chooser_reloc_ptrs, sample)
168 
169 extern const stream_template s_compr_chooser_template;
170 
171 /* Set image dimensions. */
172 int
173 s_compr_chooser_set_dimensions(stream_compr_chooser_state * st, int width,
174 			       int height, int depth, int bits_per_sample);
175 
176 /* Get choice */
177 uint s_compr_chooser__get_choice(stream_compr_chooser_state *st, bool force);
178 
179 /* ---------------- Am image color conversion filter ---------------- */
180 
181 #ifndef gx_device_DEFINED
182 #  define gx_device_DEFINED
183 typedef struct gx_device_s gx_device;
184 #endif
185 
186 typedef struct stream_image_colors_state_s stream_image_colors_state;
187 
188 struct stream_image_colors_state_s {
189     stream_state_common;
190     uint width, height, depth, bits_per_sample;
191     byte output_bits_buffer;
192     uint output_bits_buffered;
193     uint output_component_bits_written;
194     uint output_component_index;
195     uint output_depth, output_bits_per_sample;
196     uint raster;
197     uint row_bits;
198     uint row_bits_passed;
199     uint row_alignment_bytes;
200     uint row_alignment_bytes_left;
201     uint input_component_index;
202     uint input_bits_buffer;
203     uint input_bits_buffered;
204     uint input_color[GS_IMAGE_MAX_COLOR_COMPONENTS];
205     uint output_color[GS_IMAGE_MAX_COLOR_COMPONENTS];
206     uint MaskColor[GS_IMAGE_MAX_COLOR_COMPONENTS * 2];
207     float Decode[GS_IMAGE_MAX_COLOR_COMPONENTS * 2];
208     const gs_color_space *pcs;
209     gx_device *pdev;
210     const gs_imager_state *pis;
211     int (*convert_color)(stream_image_colors_state *);
212 };
213 
214 #define private_st_image_colors_state()	/* in gdevpsds.c */\
215   gs_private_st_ptrs3(st_stream_image_colors_state, stream_image_colors_state,\
216     "stream_image_colors_state", stream_image_colors_enum_ptrs,\
217     stream_image_colors_reloc_ptrs, pcs, pdev, pis)
218 
219 extern const stream_template s_image_colors_template;
220 
221 void s_image_colors_set_dimensions(stream_image_colors_state * st,
222 			       int width, int height, int depth, int bits_per_sample);
223 
224 void s_image_colors_set_mask_colors(stream_image_colors_state * ss, uint *MaskColor);
225 
226 void s_image_colors_set_color_space(stream_image_colors_state * ss, gx_device *pdev,
227 			       const gs_color_space *pcs, const gs_imager_state *pis,
228 			       float *Decode);
229 
230 extern const stream_template s__image_colors_template;
231 
232 #endif /* gdevpsds_INCLUDED */
233