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