1 #ifndef _IMG_IMG_CONV_H_
2 #define _IMG_IMG_CONV_H_
3 #include "Image.h"
4 #include <sys/types.h>
5 #include <limits.h>
6 #ifdef HAVE_UNISTD_H
7 #include <unistd.h>
8 #else
9 #include <io.h>
10 #include <fcntl.h>
11 #endif
12 
13 
14 #ifdef __cplusplus
15 extern "C" {
16 #endif
17 
18 
19 /* initializer routine */
20 extern void init_image_support(void);
21 
22 /* image basic routines */
23 #define LINE_SIZE(width,type) (((( width ) * (( type ) & imBPP) + 31) / 32) * 4)
24 extern Bool ic_stretch( int type, Byte * srcData, int srcW, int srcH, Byte * dstData, int w, int h, int scaling, char * error);
25 extern int  ic_stretch_suggest_type( int type, int scaling );
26 extern void ic_type_convert( Handle self, Byte * dstData, PRGBColor dstPal, int dstType, int * palSize, Bool palSize_only);
27 extern Bool itype_supported( int type);
28 extern Bool itype_importable( int type, int *newtype, void **from_proc, void **to_proc);
29 extern Bool iconvtype_supported( int conv);
30 
31 /* palette routines */
32 extern void cm_init_colormap( void);
33 extern void cm_reverse_palette( PRGBColor source, PRGBColor dest, int colors);
34 extern void cm_squeeze_palette( PRGBColor source, int srcColors, PRGBColor dest, int destColors);
35 extern Byte cm_nearest_color( RGBColor color, int palSize, PRGBColor palette);
36 extern void cm_fill_colorref( PRGBColor fromPalette, int fromColorCount, PRGBColor toPalette, int toColorCount, Byte * colorref);
37 extern U16* cm_study_palette( RGBColor * palette, int pal_size);
38 extern Bool cm_optimized_palette( Byte * data, int lineSize, int width, int height, RGBColor * palette, int * max_pal_size);
39 extern void cm_reduce_palette4( Byte * srcData, int srcLine, int width, int height, RGBColor * srcPalette, int srcPalSize, RGBColor * dstPalette, int * dstPalSize);
40 extern void cm_reduce_palette8( Byte * srcData, int srcLine, int width, int height, RGBColor * srcPalette, int srcPalSize, RGBColor * dstPalette, int * dstPalSize);
41 
42 /* bitstroke conversion routines */
43 extern void bc_mono_nibble( register Byte * source, register Byte * dest, register int count);
44 extern void bc_mono_nibble_cr( register Byte * source, register Byte * dest, register int count, register Byte * colorref);
45 extern void bc_mono_byte( register Byte * source, register Byte * dest, register int count);
46 extern void bc_mono_byte_cr( register Byte * source, register Byte * dest, register int count, register Byte * colorref);
47 extern void bc_mono_graybyte( register Byte * source, register Byte * dest, register int count, register PRGBColor palette);
48 extern void bc_mono_rgb( register Byte * source, Byte * dest, register int count, register PRGBColor palette);
49 extern void bc_nibble_mono_cr( register Byte * source, register Byte * dest, register int count, register Byte * colorref);
50 extern void bc_nibble_mono_ht( register Byte * source, register Byte * dest, register int count, register PRGBColor palette, int lineSeqNo);
51 extern void bc_nibble_mono_ed( Byte * source, Byte * dest, int count, PRGBColor palette, int * err_buf);
52 extern void bc_nibble_cr( register Byte * source, register Byte * dest, register int count, register Byte * colorref);
53 extern void bc_nibble_nibble_ht( register Byte * source, register Byte * dest, register int count, register PRGBColor palette, int lineSeqNo);
54 extern void bc_nibble_nibble_ed( Byte * source, Byte * dest, int count, PRGBColor palette, int * err_buf);
55 extern void bc_nibble_byte( register Byte * source, register Byte * dest, register int count);
56 extern void bc_nibble_graybyte( register Byte * source, register Byte * dest, register int count, register PRGBColor palette);
57 extern void bc_nibble_byte_cr( register Byte * source, register Byte * dest, register int count, register Byte * colorref);
58 extern void bc_nibble_rgb( register Byte * source, Byte * dest, register int count, register PRGBColor palette);
59 extern void bc_byte_mono_cr( register Byte * source, Byte * dest, register int count, register Byte * colorref);
60 extern void bc_byte_mono_ht( register Byte * source, register Byte * dest, register int count, PRGBColor palette, int lineSeqNo);
61 extern void bc_byte_mono_ed( Byte * source, Byte * dest, int count, PRGBColor palette, int * err_buf);
62 extern void bc_byte_nibble_cr( register Byte * source, Byte * dest, register int count, register Byte * colorref);
63 extern void bc_byte_nibble_ht( register Byte * source, Byte * dest, register int count, register PRGBColor palette, int lineSeqNo);
64 extern void bc_byte_nibble_ed( Byte * source, Byte * dest, int count, PRGBColor palette, int * err_buf);
65 extern void bc_byte_byte_ht( register Byte * source, Byte * dest, register int count, register PRGBColor palette, int lineSeqNo);
66 extern void bc_byte_byte_ed( Byte * source, Byte * dest, int count, PRGBColor palette, int * err_buf);
67 extern void bc_byte_cr( register Byte * source, register Byte * dest, register int count, register Byte * colorref);
68 extern void bc_byte_op( Byte * source, Byte * dest, int count, U16 * tree, PRGBColor src_palette, PRGBColor dst_palette, int * err_buf);
69 extern void bc_byte_nop( Byte * source, Byte * dest, int count, U16 * tree, PRGBColor src_palette, PRGBColor dst_palette);
70 extern void bc_byte_graybyte( register Byte * source, register Byte * dest, register int count, register PRGBColor palette);
71 extern void bc_byte_rgb( register Byte * source, Byte * dest, register int count, register PRGBColor palette);
72 extern void bc_graybyte_mono_ht( register Byte * source, register Byte * dest, register int count, int lineSeqNo);
73 extern void bc_graybyte_nibble_ht( register Byte * source, Byte * dest, register int count, int lineSeqNo);
74 extern void bc_graybyte_nibble_ed( Byte * source, Byte * dest, int count, int * err_buf);
75 extern void bc_graybyte_rgb( register Byte * source, Byte * dest, register int count);
76 extern void bc_rgb_mono_ht( register Byte * source, register Byte * dest, register int count, int lineSeqNo);
77 extern void bc_rgb_mono_ed( Byte * source, Byte * dest, int count, int * err_buf);
78 extern Byte rgb_color_to_16( register Byte b, register Byte g, register Byte r);
79 extern void bc_rgb_nibble( register Byte *source, Byte *dest, int count);
80 extern void bc_rgb_nibble_ht( register Byte * source, Byte * dest, register int count, int lineSeqNo);
81 extern void bc_rgb_nibble_ed( Byte * source, Byte * dest, int count, int * err_buf);
82 extern void bc_rgb_byte( Byte * source, register Byte * dest, register int count);
83 extern void bc_rgb_byte_ht( Byte * source, register Byte * dest, register int count, int lineSeqNo);
84 extern void bc_rgb_byte_ed( Byte * source, Byte * dest, int count, int * err_buf);
85 extern void bc_rgb_byte_op( RGBColor * src, Byte * dest, int count, U16 * tree, RGBColor * palette, int * err_buf);
86 extern void bc_rgb_byte_nop( RGBColor * src, Byte * dest, int count, U16 * tree, RGBColor * palette);
87 extern void bc_rgb_graybyte( Byte * source, register Byte * dest, register int count);
88 
89 /* bitstroke stretching types */
90 
91 typedef void StretchProc( void * srcData, void * dstData, int w, int x, int absx, long step);
92 typedef StretchProc *PStretchProc;
93 
94 #if !defined(sgi) || defined(__GNUC__)
95 #pragma pack(1)
96 #endif
97 typedef union _Fixed {
98 	int32_t l;
99 #if (BYTEORDER==0x4321) || (BYTEORDER==0x87654321)
100 	struct {
101 		int16_t  i;
102 		uint16_t f;
103 	} i;
104 #else
105 	struct {
106 		uint16_t f;
107 		int16_t  i;
108 	} i;
109 #endif
110 } Fixed;
111 #if !defined(sgi) || defined(__GNUC__)
112 #pragma pack()
113 #endif
114 
115 #define UINT16_PRECISION (1L<<(8*sizeof(uint16_t)))
116 
117 /* bitstroke stretching routines */
118 extern void bs_mono_in( uint8_t * srcData, uint8_t * dstData, int w, int x, int absx, long step);
119 extern void bs_nibble_in( uint8_t * srcData, uint8_t * dstData, int w, int x, int absx, long step);
120 extern void bs_uint8_t_in( uint8_t * srcData, uint8_t * dstData, int w, int x, int absx, long step);
121 extern void bs_int16_t_in( int16_t * srcData, int16_t * dstData, int w, int x, int absx, long step);
122 extern void bs_RGBColor_in( RGBColor * srcData, RGBColor * dstData, int w, int x, int absx, long step);
123 extern void bs_int32_t_in( int32_t * srcData, int32_t * dstData, int w, int x, int absx, long step);
124 extern void bs_float_in( float * srcData, float * dstData, int w, int x, int absx, long step);
125 extern void bs_double_in( double * srcData, double * dstData, int w, int x, int absx, long step);
126 extern void bs_Complex_in( Complex * srcData, Complex * dstData, int w, int x, int absx, long step);
127 extern void bs_DComplex_in( DComplex * srcData, DComplex * dstData, int w, int x, int absx, long step);
128 extern void bs_mono_out( uint8_t * srcData, uint8_t * dstData, int w, int x, int absx, long step);
129 extern void bs_nibble_out( uint8_t * srcData, uint8_t * dstData, int w, int x, int absx, long step);
130 extern void bs_uint8_t_out( uint8_t * srcData, uint8_t * dstData, int w, int x, int absx, long step);
131 extern void bs_int16_t_out( int16_t * srcData, int16_t * dstData, int w, int x, int absx, long step);
132 extern void bs_RGBColor_out( RGBColor * srcData, RGBColor * dstData, int w, int x, int absx, long step);
133 extern void bs_int32_t_out( int32_t * srcData, int32_t * dstData, int w, int x, int absx, long step);
134 extern void bs_float_out( float * srcData, float * dstData, int w, int x, int absx, long step);
135 extern void bs_double_out( double * srcData, double * dstData, int w, int x, int absx, long step);
136 extern void bs_Complex_out( Complex * srcData, Complex * dstData, int w, int x, int absx, long step);
137 extern void bs_DComplex_out( DComplex * srcData, DComplex * dstData, int w, int x, int absx, long step);
138 
139 /* bitstroke copy routines */
140 extern void bc_nibble_copy( Byte * source, Byte * dest, unsigned int from, unsigned int width);
141 extern void bc_mono_copy( Byte * source, Byte * dest, unsigned int from, unsigned int width);
142 
143 /* image conversion routines */
144 #define BC(from,to,conv) void ic_##from##_##to##_ict##conv( Handle self, Byte * dstData, PRGBColor dstPal, int dstType, int * dstPalSize, Bool palSize_only)
145 #define BC2(from,to) void ic_##from##_##to( Handle self, Byte * dstData, PRGBColor dstPal, int dstType, int * dstPalSize, Bool palSize_only)
146 
147 extern BC(mono,mono,None);
148 extern BC(mono,mono,Optimized);
149 extern BC(mono,nibble,None);
150 extern BC(mono,byte,None);
151 extern BC(mono,graybyte,None);
152 extern BC(mono,rgb,None);
153 extern BC(nibble,mono,None);
154 extern BC(nibble,mono,Ordered);
155 extern BC(nibble,mono,ErrorDiffusion);
156 extern BC(nibble,mono,Optimized);
157 extern BC(nibble,nibble,None);
158 extern BC(nibble,nibble,Posterization);
159 extern BC(nibble,nibble,Ordered);
160 extern BC(nibble,nibble,ErrorDiffusion);
161 extern BC(nibble,nibble,Optimized);
162 extern BC(nibble,byte,None);
163 extern BC(nibble,graybyte,None);
164 extern BC(nibble,rgb,None);
165 extern BC(byte,mono,None);
166 extern BC(byte,mono,Ordered);
167 extern BC(byte,mono,ErrorDiffusion);
168 extern BC(byte,mono,Optimized);
169 extern BC(byte,nibble,None);
170 extern BC(byte,nibble,Posterization);
171 extern BC(byte,nibble,Ordered);
172 extern BC(byte,nibble,ErrorDiffusion);
173 extern BC(byte,nibble,Optimized);
174 extern BC(byte,byte,None);
175 extern BC(byte,byte,Ordered);
176 extern BC(byte,byte,Posterization);
177 extern BC(byte,byte,ErrorDiffusion);
178 extern BC(byte,graybyte,None);
179 extern BC(byte,rgb,None);
180 extern BC(graybyte,mono,Ordered);
181 extern BC(graybyte,mono,ErrorDiffusion);
182 extern BC(graybyte,nibble,Ordered);
183 extern BC(graybyte,nibble,ErrorDiffusion);
184 extern BC(graybyte,rgb,None);
185 extern BC(rgb,mono,None);
186 extern BC(rgb,mono,Posterization);
187 extern BC(rgb,mono,Ordered);
188 extern BC(rgb,mono,ErrorDiffusion);
189 extern BC(rgb,mono,Optimized);
190 extern BC(rgb,nibble,None);
191 extern BC(rgb,nibble,Posterization);
192 extern BC(rgb,nibble,Ordered);
193 extern BC(rgb,nibble,ErrorDiffusion);
194 extern BC(rgb,nibble,Optimized);
195 extern BC(rgb,byte,None);
196 extern BC(rgb,byte,Posterization);
197 extern BC(rgb,byte,Ordered);
198 extern BC(rgb,byte,ErrorDiffusion);
199 extern BC(rgb,byte,Optimized);
200 extern BC(rgb,graybyte,None);
201 extern BC(byte,byte,Optimized);
202 extern BC(nibble,nibble,Optimized);
203 
204 extern BC2(Byte,Short);
205 extern BC2(Byte,Long);
206 extern BC2(Byte,float);
207 extern BC2(Byte,double);
208 extern BC2(Short,Byte);
209 extern BC2(Short,Long);
210 extern BC2(Short,float);
211 extern BC2(Short,double);
212 extern BC2(Long,Byte);
213 extern BC2(Long,Short);
214 extern BC2(Long,float);
215 extern BC2(Long,double);
216 extern BC2(float,Byte);
217 extern BC2(float,Short);
218 extern BC2(float,Long);
219 extern BC2(float,double);
220 extern BC2(double,Byte);
221 extern BC2(double,Short);
222 extern BC2(double,Long);
223 extern BC2(double,float);
224 
225 extern BC2(Byte,float_complex);
226 extern BC2(Byte,double_complex);
227 extern BC2(Short,float_complex);
228 extern BC2(Short,double_complex);
229 extern BC2(Long,float_complex);
230 extern BC2(Long,double_complex);
231 extern BC2(float,float_complex);
232 extern BC2(float,double_complex);
233 extern BC2(double,float_complex);
234 extern BC2(double,double_complex);
235 
236 extern BC2(double_complex,double);
237 extern BC2(double_complex,float);
238 extern BC2(double_complex,Long);
239 extern BC2(double_complex,Short);
240 extern BC2(double_complex,Byte);
241 extern BC2(float_complex,double);
242 extern BC2(float_complex,float);
243 extern BC2(float_complex,Long);
244 extern BC2(float_complex,Short);
245 extern BC2(float_complex,Byte);
246 
247 
248 /* image resampling routines */
249 extern void rs_Byte_Byte( Handle self, Byte * dstData, int dstType, double srcLo, double srcHi, double dstLo, double dstHi);
250 extern void rs_Short_Short( Handle self, Byte * dstData, int dstType, double srcLo, double srcHi, double dstLo, double dstHi);
251 extern void rs_Long_Long( Handle self, Byte * dstData, int dstType, double srcLo, double srcHi, double dstLo, double dstHi);
252 extern void rs_float_float( Handle self, Byte * dstData, int dstType, double srcLo, double srcHi, double dstLo, double dstHi);
253 extern void rs_double_double( Handle self, Byte * dstData, int dstType, double srcLo, double srcHi, double dstLo, double dstHi);
254 extern void rs_Short_Byte( Handle self, Byte * dstData, int dstType, double srcLo, double srcHi, double dstLo, double dstHi);
255 extern void rs_Long_Byte( Handle self, Byte * dstData, int dstType, double srcLo, double srcHi, double dstLo, double dstHi);
256 extern void rs_float_Byte( Handle self, Byte * dstData, int dstType, double srcLo, double srcHi, double dstLo, double dstHi);
257 extern void rs_double_Byte( Handle self, Byte * dstData, int dstType, double srcLo, double srcHi, double dstLo, double dstHi);
258 
259 /* extra convertors */
260 extern void bc_irgb_rgb( Byte * source, Byte * dest, int count);
261 extern void bc_ibgr_rgb( Byte * source, Byte * dest, int count);
262 extern void bc_bgri_rgb( Byte * source, Byte * dest, int count);
263 extern void bc_rgbi_rgb( Byte * source, Byte * dest, int count);
264 extern void bc_rgb_irgb( Byte * source, Byte * dest, int count);
265 extern void bc_rgb_rgbi( Byte * source, Byte * dest, int count);
266 extern void bc_rgb_ibgr( Byte * source, Byte * dest, int count);
267 extern void bc_rgb_bgri( Byte * source, Byte * dest, int count);
268 
269 
270 /* misc */
271 typedef void SimpleConvProc( Byte * srcData, Byte * dstData, int count);
272 typedef SimpleConvProc *PSimpleConvProc;
273 
274 typedef struct {
275 	ColorPixel color;
276 	ColorPixel backColor;
277 	int rop;
278 	Bool transparent;
279 	FillPattern pattern;
280 	Point patternOffset;
281 	unsigned char * linePattern;
282 	PBoxRegionRec region;
283 	Point translate;
284 } ImgPaintContext, *PImgPaintContext;
285 
286 extern void ibc_repad( Byte * source, Byte * dest, int srcLineSize, int dstLineSize, int srcDataSize, int dstDataSize, int srcBPP, int dstBPP, void * bit_conv_proc, Bool reverse);
287 extern void img_fill_dummy( PImage dummy, int w, int h, int type, Byte * data, RGBColor * palette);
288 extern Bool img_put( Handle dest, Handle src, int dstX, int dstY, int srcX, int srcY, int dstW, int dstH, int srcW, int srcH, int rop, PBoxRegionRec region, Byte * color);
289 extern Bool img_bar( Handle dest, int x, int y, int w, int h, PImgPaintContext ctx);
290 extern void img_integral_rotate( Handle self, Byte * new_data, int new_line_size, int degrees);
291 extern Bool img_generic_rotate( Handle self, float degrees, PImage dummy);
292 extern Bool img_2d_transform( Handle self, float *matrix, PImage dummy);
293 extern void img_mirror( Handle self, Bool vertically);
294 extern Bool img_mirror_raw( int type, int w, int h, Byte * data, Bool vertically);
295 extern void img_premultiply_alpha_constant( Handle self, int alpha);
296 extern void img_premultiply_alpha_map( Handle self, Handle alpha);
297 extern Bool img_polyline( Handle dest, int n_points, Point * points, PImgPaintContext ctx);
298 extern Bool img_flood_fill( Handle self, int x, int y, ColorPixel color, Bool single_border, PImgPaintContext ctx);
299 
300 /* regions */
301 typedef Bool RegionCallbackFunc( int x, int y, int w, int h, void * param);
302 
303 extern Box img_region_box(PBoxRegionRec region);
304 extern PBoxRegionRec img_region_alloc(PBoxRegionRec old_region, int n_boxes);
305 extern Bool img_region_foreach(
306 	PBoxRegionRec region,
307 	int x, int y, int w, int h,
308 	RegionCallbackFunc *cb, void *param
309 );
310 extern Bool img_point_in_region( int x, int y, PBoxRegionRec region);
311 
312 /* istXXX function */
313 typedef double FilterFunc( const double x );
314 typedef struct {
315 	unsigned int id;
316 	FilterFunc * filter;
317 	double support;
318 } FilterRec;
319 extern FilterRec ist_filters[];
320 
321 /* internal maps */
322 extern Byte     map_stdcolorref    [ 256];
323 extern Byte     div51              [ 256];
324 extern Byte     div51f             [ 256];
325 extern Byte     div17              [ 256];
326 extern Byte     mod51              [ 256];
327 extern int8_t   mod51f             [ 256];
328 extern Byte     mod17mul3          [ 256];
329 extern RGBColor cubic_palette      [ 256];
330 extern RGBColor cubic_palette8     [   8];
331 extern RGBColor cubic_palette16    [  16];
332 extern RGBColor stdmono_palette    [   2];
333 extern RGBColor std16gray_palette  [  16];
334 extern RGBColor std256gray_palette [ 256];
335 extern Byte     map_halftone8x8_51 [  64];
336 extern Byte     map_halftone8x8_64 [  64];
337 
338 
339 /* internal macros */
340 
341 #define dBCARGS                                                   \
342 	int i;                                                         \
343 	int width = var->w, height = var->h;                           \
344 	int srcType = var->type;                                       \
345 	int srcLine = LINE_SIZE(width,srcType);                        \
346 	int dstLine = LINE_SIZE(width,dstType);                        \
347 	Byte * srcData = var->data;                                    \
348 	Byte colorref[ 256]
349 
350 #define dBCLOOP \
351 	Byte * srcDataLoop = srcData + i * srcLine;\
352 	Byte * dstDataLoop = dstData + i * dstLine
353 
354 #if defined (__BORLANDC__)
355 #define BCWARN
356 #else
357 #define BCWARN                                                   \
358 	(void)srcType; (void)srcLine; (void)dstLine;                  \
359 	(void)srcData; (void)colorref; (void)i;
360 #endif
361 
362 
363 #define BCCONV srcData, dstData, width
364 #define BCCONVLOOP srcDataLoop, dstDataLoop, width
365 #define BCINCR srcData += srcLine; dstData += dstLine
366 
367 #define map_RGB_gray ((Byte*)std256gray_palette)
368 
369 #define PAL_FREE   0x8000
370 #define PAL_REF    0x4000
371 #define CELL_SIZE  64
372 
373 #ifdef __cplusplus
374 }
375 #endif
376 
377 #endif
378