1 #ifndef _DATATYPES_H_
2 #define _DATATYPES_H_
3 
4 #include <stddef.h>
5 #include "imconfig.h"
6 
7 #define MAXCHANNELS 4
8 
9 /*
10 =item im_context_t
11 =category Data Types
12 
13 Imager's per-thread context.
14 
15 =cut
16 */
17 
18 typedef struct im_context_tag *im_context_t;
19 
20 /*
21 =item im_slot_t
22 =category Data Types
23 
24 Represents a slot in the context object.
25 
26 =cut
27 */
28 
29 typedef ptrdiff_t im_slot_t;
30 typedef void (*im_slot_destroy_t)(void *);
31 
32 /* just so we can use our own input typemap */
33 typedef double im_double;
34 typedef float im_float;
35 
36 /* used for palette indices in some internal code (which might be
37    exposed at some point
38 */
39 typedef unsigned char i_palidx;
40 
41 /* We handle 2 types of sample, this is hopefully the most common, and the
42    smaller of the ones we support */
43 typedef unsigned char i_sample_t;
44 
45 typedef struct { i_sample_t gray_color; } gray_color;
46 typedef struct { i_sample_t r,g,b; } rgb_color;
47 typedef struct { i_sample_t r,g,b,a; } rgba_color;
48 typedef struct { i_sample_t c,m,y,k; } cmyk_color;
49 
50 typedef int undef_int; /* special value to put in typemaps to retun undef on 0 and 1 on 1 */
51 
52 /*
53 =item i_img_dim
54 =category Data Types
55 =synopsis i_img_dim x, y;
56 =order 90
57 
58 A signed integer type that represents an image dimension or ordinate.
59 
60 May be larger than int on some platforms.
61 
62 =cut
63 */
64 
65 typedef ptrdiff_t i_img_dim;
66 
67 /*
68 =item i_img_dim_u
69 =category Data Types
70 =synopsis i_img_dim_u limit;
71 =order 90
72 
73 An unsigned variant of L</i_img_dim>.
74 
75 =cut
76 */
77 
78 typedef size_t i_img_dim_u;
79 
80 #define i_img_dim_MAX ((i_img_dim)(~(i_img_dim_u)0 >> 1))
81 
82 /*
83 =item i_color
84 =category Data Types
85 =synopsis i_color black;
86 =synopsis black.rgba.r = black.rgba.g = black.rgba.b = black.rgba.a = 0;
87 
88 Type for 8-bit/sample color.
89 
90 Samples as per;
91 
92   i_color c;
93 
94 i_color is a union of:
95 
96 =over
97 
98 =item *
99 
100 gray - contains a single element gray_color, eg. C<c.gray.gray_color>
101 
102 =item *
103 
104 C<rgb> - contains three elements C<r>, C<g>, C<b>, eg. C<c.rgb.r>
105 
106 =item *
107 
108 C<rgba> - contains four elements C<r>, C<g>, C<b>, C<a>, eg. C<c.rgba.a>
109 
110 =item *
111 
112 C<cmyk> - contains four elements C<c>, C<m>, C<y>, C<k>,
113 eg. C<c.cmyk.y>.  Note that Imager never uses CMYK colors except when
114 reading/writing files.
115 
116 =item *
117 
118 channels - an array of four channels, eg C<c.channels[2]>.
119 
120 =back
121 
122 =cut
123 */
124 
125 typedef union {
126   gray_color gray;
127   rgb_color rgb;
128   rgba_color rgba;
129   cmyk_color cmyk;
130   i_sample_t channel[MAXCHANNELS];
131   unsigned int ui;
132 } i_color;
133 
134 /* this is the larger sample type, it should be able to accurately represent
135    any sample size we use */
136 typedef double i_fsample_t;
137 
138 typedef struct { i_fsample_t gray_color; } i_fgray_color_t;
139 typedef struct { i_fsample_t r, g, b; } i_frgb_color_t;
140 typedef struct { i_fsample_t r, g, b, a; } i_frgba_color_t;
141 typedef struct { i_fsample_t c, m, y, k; } i_fcmyk_color_t;
142 
143 /*
144 =item i_fcolor
145 =category Data Types
146 
147 This is the double/sample color type.
148 
149 Its layout exactly corresponds to i_color.
150 
151 =cut
152 */
153 
154 typedef union {
155   i_fgray_color_t gray;
156   i_frgb_color_t rgb;
157   i_frgba_color_t rgba;
158   i_fcmyk_color_t cmyk;
159   i_fsample_t channel[MAXCHANNELS];
160 } i_fcolor;
161 
162 typedef enum {
163   i_direct_type, /* direct colour, keeps RGB values per pixel */
164   i_palette_type /* keeps a palette index per pixel */
165 } i_img_type_t;
166 
167 typedef enum {
168   /* bits per sample, not per pixel */
169   /* a paletted image might have one bit per sample */
170   i_8_bits = 8,
171   i_16_bits = 16,
172   i_double_bits = sizeof(double) * 8
173 } i_img_bits_t;
174 
175 typedef struct {
176   char *name; /* name of a given tag, might be NULL */
177   int code; /* number of a given tag, -1 if it has no meaning */
178   char *data; /* value of a given tag if it's not an int, may be NULL */
179   int size; /* size of the data */
180   int idata; /* value of a given tag if data is NULL */
181 } i_img_tag;
182 
183 typedef struct {
184   int count; /* how many tags have been set */
185   int alloc; /* how many tags have been allocated for */
186   i_img_tag *tags;
187 } i_img_tags;
188 
189 typedef struct i_img_ i_img;
190 typedef int (*i_f_ppix_t)(i_img *im, i_img_dim x, i_img_dim y, const i_color *pix);
191 typedef int (*i_f_ppixf_t)(i_img *im, i_img_dim x, i_img_dim y, const i_fcolor *pix);
192 typedef i_img_dim (*i_f_plin_t)(i_img *im, i_img_dim x, i_img_dim r, i_img_dim y, const i_color *vals);
193 typedef i_img_dim (*i_f_plinf_t)(i_img *im, i_img_dim x, i_img_dim r, i_img_dim y, const i_fcolor *vals);
194 typedef int (*i_f_gpix_t)(i_img *im, i_img_dim x, i_img_dim y, i_color *pix);
195 typedef int (*i_f_gpixf_t)(i_img *im, i_img_dim x, i_img_dim y, i_fcolor *pix);
196 typedef i_img_dim (*i_f_glin_t)(i_img *im, i_img_dim x, i_img_dim r, i_img_dim y, i_color *vals);
197 typedef i_img_dim (*i_f_glinf_t)(i_img *im, i_img_dim x, i_img_dim r, i_img_dim y, i_fcolor *vals);
198 
199 typedef i_img_dim (*i_f_gsamp_t)(i_img *im, i_img_dim x, i_img_dim r, i_img_dim y, i_sample_t *samp,
200                            const int *chans, int chan_count);
201 typedef i_img_dim (*i_f_gsampf_t)(i_img *im, i_img_dim x, i_img_dim r, i_img_dim y, i_fsample_t *samp,
202                             const int *chan, int chan_count);
203 
204 typedef i_img_dim (*i_f_gpal_t)(i_img *im, i_img_dim x, i_img_dim r, i_img_dim y, i_palidx *vals);
205 typedef i_img_dim (*i_f_ppal_t)(i_img *im, i_img_dim x, i_img_dim r, i_img_dim y, const i_palidx *vals);
206 typedef int (*i_f_addcolors_t)(i_img *im, const i_color *colors, int count);
207 typedef int (*i_f_getcolors_t)(i_img *im, int i, i_color *, int count);
208 typedef int (*i_f_colorcount_t)(i_img *im);
209 typedef int (*i_f_maxcolors_t)(i_img *im);
210 typedef int (*i_f_findcolor_t)(i_img *im, const i_color *color, i_palidx *entry);
211 typedef int (*i_f_setcolors_t)(i_img *im, int index, const i_color *colors,
212                               int count);
213 
214 typedef void (*i_f_destroy_t)(i_img *im);
215 
216 typedef i_img_dim (*i_f_gsamp_bits_t)(i_img *im, i_img_dim x, i_img_dim r, i_img_dim y, unsigned *samp,
217                            const int *chans, int chan_count, int bits);
218 typedef i_img_dim (*i_f_psamp_bits_t)(i_img *im, i_img_dim x, i_img_dim r, i_img_dim y, unsigned const *samp,
219 				 const int *chans, int chan_count, int bits);
220 typedef i_img_dim
221 (*i_f_psamp_t)(i_img *im, i_img_dim x, i_img_dim r, i_img_dim y,
222 		const i_sample_t *samp, const int *chan, int chan_count);
223 typedef i_img_dim
224 (*i_f_psampf_t)(i_img *im, i_img_dim x, i_img_dim r, i_img_dim y,
225 		const i_fsample_t *samp, const int *chan, int chan_count);
226 
227 /*
228 =item i_img
229 =category Data Types
230 =synopsis i_img *img;
231 =order 10
232 
233 This is Imager's image type.
234 
235 It contains the following members:
236 
237 =over
238 
239 =item *
240 
241 C<channels> - the number of channels in the image
242 
243 =item *
244 
245 C<xsize>, C<ysize> - the width and height of the image in pixels
246 
247 =item *
248 
249 C<bytes> - the number of bytes used to store the image data.  Undefined
250 where virtual is non-zero.
251 
252 =item *
253 
254 C<ch_mask> - a mask of writable channels.  eg. if this is 6 then only
255 channels 1 and 2 are writable.  There may be bits set for which there
256 are no channels in the image.
257 
258 =item *
259 
260 C<bits> - the number of bits stored per sample.  Should be one of
261 i_8_bits, i_16_bits, i_double_bits.
262 
263 =item *
264 
265 C<type> - either i_direct_type for direct color images, or i_palette_type
266 for paletted images.
267 
268 =item *
269 
270 C<virtual> - if zero then this image is-self contained.  If non-zero
271 then this image could be an interface to some other implementation.
272 
273 =item *
274 
275 C<idata> - the image data.  This should not be directly accessed.  A new
276 image implementation can use this to store its image data.
277 i_img_destroy() will myfree() this pointer if it's non-null.
278 
279 =item *
280 
281 C<tags> - a structure storing the image's tags.  This should only be
282 accessed via the i_tags_*() functions.
283 
284 =item *
285 
286 C<ext_data> - a pointer for use internal to an image implementation.
287 This should be freed by the image's destroy handler.
288 
289 =item *
290 
291 C<im_data> - data internal to Imager.  This is initialized by
292 i_img_init().
293 
294 =item *
295 
296 i_f_ppix, i_f_ppixf, i_f_plin, i_f_plinf, i_f_gpix, i_f_gpixf,
297 i_f_glin, i_f_glinf, i_f_gsamp, i_f_gampf - implementations for each
298 of the required image functions.  An image implementation should
299 initialize these between calling i_img_alloc() and i_img_init().
300 
301 =item *
302 
303 i_f_gpal, i_f_ppal, i_f_addcolors, i_f_getcolors, i_f_colorcount,
304 i_f_maxcolors, i_f_findcolor, i_f_setcolors - implementations for each
305 paletted image function.
306 
307 =item *
308 
309 i_f_destroy - custom image destruction function.  This should be used
310 to release memory if necessary.
311 
312 =item *
313 
314 i_f_gsamp_bits - implements i_gsamp_bits() for this image.
315 
316 =item *
317 
318 i_f_psamp_bits - implements i_psamp_bits() for this image.
319 
320 =item *
321 
322 i_f_psamp - implements psamp() for this image.
323 
324 =item *
325 
326 i_f_psampf - implements psamp() for this image.
327 
328 =item *
329 
330 C<im_data> - image specific data internal to Imager.
331 
332 =item *
333 
334 C<context> - the Imager API context this image belongs to.
335 
336 =back
337 
338 =cut
339 */
340 
341 struct i_img_ {
342   int channels;
343   i_img_dim xsize,ysize;
344   size_t bytes;
345   unsigned int ch_mask;
346   i_img_bits_t bits;
347   i_img_type_t type;
348   int virtual; /* image might not keep any data, must use functions */
349   unsigned char *idata; /* renamed to force inspection of existing code */
350                         /* can be NULL if virtual is non-zero */
351   i_img_tags tags;
352 
353   void *ext_data;
354 
355   /* interface functions */
356   i_f_ppix_t i_f_ppix;
357   i_f_ppixf_t i_f_ppixf;
358   i_f_plin_t i_f_plin;
359   i_f_plinf_t i_f_plinf;
360   i_f_gpix_t i_f_gpix;
361   i_f_gpixf_t i_f_gpixf;
362   i_f_glin_t i_f_glin;
363   i_f_glinf_t i_f_glinf;
364   i_f_gsamp_t i_f_gsamp;
365   i_f_gsampf_t i_f_gsampf;
366 
367   /* only valid for type == i_palette_type */
368   i_f_gpal_t i_f_gpal;
369   i_f_ppal_t i_f_ppal;
370   i_f_addcolors_t i_f_addcolors;
371   i_f_getcolors_t i_f_getcolors;
372   i_f_colorcount_t i_f_colorcount;
373   i_f_maxcolors_t i_f_maxcolors;
374   i_f_findcolor_t i_f_findcolor;
375   i_f_setcolors_t i_f_setcolors;
376 
377   i_f_destroy_t i_f_destroy;
378 
379   /* as of 0.61 */
380   i_f_gsamp_bits_t i_f_gsamp_bits;
381   i_f_psamp_bits_t i_f_psamp_bits;
382 
383   /* as of 0.88 */
384   i_f_psamp_t i_f_psamp;
385   i_f_psampf_t i_f_psampf;
386 
387   void *im_data;
388 
389   /* 0.91 */
390   im_context_t context;
391 };
392 
393 /* ext_data for paletted images
394  */
395 typedef struct {
396   int count; /* amount of space used in palette (in entries) */
397   int alloc; /* amount of space allocated for palette (in entries) */
398   i_color *pal;
399   int last_found;
400 } i_img_pal_ext;
401 
402 /* Helper datatypes
403   The types in here so far are:
404 
405   doubly linked bucket list - pretty efficient
406   octtree - no idea about goodness
407 
408   needed: hashes.
409 
410 */
411 
412 /* bitmap mask */
413 
414 struct i_bitmap {
415   i_img_dim xsize,ysize;
416   char *data;
417 };
418 
419 struct i_bitmap* btm_new(i_img_dim xsize,i_img_dim ysize);
420 void btm_destroy(struct i_bitmap *btm);
421 int btm_test(struct i_bitmap *btm,i_img_dim x,i_img_dim y);
422 void btm_set(struct i_bitmap *btm,i_img_dim x,i_img_dim y);
423 
424 
425 /* Stack/Linked list */
426 
427 struct llink {
428   struct llink *p,*n;
429   void *data;
430   int fill;		/* Number used in this link */
431 };
432 
433 struct llist {
434   struct llink *h,*t;
435   int multip;		/* # of copies in a single chain  */
436   size_t ssize;		/* size of each small element     */
437   int count;           /* number of elements on the list */
438 };
439 
440 
441 /* Lists */
442 
443 struct llist *llist_new( int multip, size_t ssize );
444 void llist_destroy( struct llist *l );
445 void llist_push( struct llist *l, const void *data );
446 void llist_dump( struct llist *l );
447 int llist_pop( struct llist *l,void *data );
448 
449 
450 
451 
452 /* Octtree */
453 
454 struct octt {
455   struct octt *t[8];
456   int cnt;
457 };
458 
459 struct octt *octt_new(void);
460 int octt_add(struct octt *ct,unsigned char r,unsigned char g,unsigned char b);
461 void octt_dump(struct octt *ct);
462 void octt_count(struct octt *ct,int *tot,int max,int *overflow);
463 void octt_delete(struct octt *ct);
464 void octt_histo(struct octt *ct, unsigned int **col_usage_it_adr);
465 
466 /* font bounding box results */
467 enum bounding_box_index_t {
468   BBOX_NEG_WIDTH,
469   BBOX_GLOBAL_DESCENT,
470   BBOX_POS_WIDTH,
471   BBOX_GLOBAL_ASCENT,
472   BBOX_DESCENT,
473   BBOX_ASCENT,
474   BBOX_ADVANCE_WIDTH,
475   BBOX_RIGHT_BEARING,
476   BOUNDING_BOX_COUNT
477 };
478 
479 /*
480 =item i_polygon_t
481 =category Data Types
482 
483 Represents a polygon.  Has the following members:
484 
485 =over
486 
487 =item *
488 
489 C<x>, C<y> - arrays of x and y locations of vertices.
490 
491 =item *
492 
493 C<count> - the number of entries in the C<x> and C<y> arrays.
494 
495 =back
496 
497 =cut
498 */
499 
500 typedef struct i_polygon_tag {
501   const double *x;
502   const double *y;
503   size_t count;
504 } i_polygon_t;
505 
506 /*
507 =item i_poly_fill_mode_t
508 =category Data Types
509 
510 Control how polygons are filled.  Has the following values:
511 
512 =over
513 
514 =item *
515 
516 C<i_pfm_evenodd> - simple even-odd fills.
517 
518 =item *
519 
520 C<i_pfm_nonzero> - non-zero winding rule fills.
521 
522 =back
523 
524 =cut
525 */
526 
527 typedef enum i_poly_fill_mode_tag {
528   i_pfm_evenodd,
529   i_pfm_nonzero
530 } i_poly_fill_mode_t;
531 
532 /* Generic fills */
533 struct i_fill_tag;
534 
535 typedef void (*i_fill_with_color_f)
536 (struct i_fill_tag *fill, i_img_dim x, i_img_dim y, i_img_dim width, int channels,
537       i_color *data);
538 typedef void (*i_fill_with_fcolor_f)
539      (struct i_fill_tag *fill, i_img_dim x, i_img_dim y, i_img_dim width, int channels,
540       i_fcolor *data);
541 typedef void (*i_fill_destroy_f)(struct i_fill_tag *fill);
542 
543 /* combine functions modify their target and are permitted to modify
544    the source to prevent having to perform extra copying/memory
545    allocations, etc
546    The out array has I<channels> channels.
547 
548    The in array has I<channels> channels + an alpha channel if one
549    isn't included in I<channels>.
550 */
551 
552 typedef void (*i_fill_combine_f)(i_color *out, i_color *in, int channels,
553                                  i_img_dim count);
554 typedef void (*i_fill_combinef_f)(i_fcolor *out, i_fcolor *in, int channels,
555                                   i_img_dim count);
556 
557 /* fountain fill types */
558 typedef enum {
559   i_fst_linear,
560   i_fst_curved,
561   i_fst_sine,
562   i_fst_sphere_up,
563   i_fst_sphere_down,
564   i_fst_end
565 } i_fountain_seg_type;
566 typedef enum {
567   i_fc_direct,
568   i_fc_hue_up,
569   i_fc_hue_down,
570   i_fc_end
571 } i_fountain_color;
572 typedef struct {
573   double start, middle, end;
574   i_fcolor c[2];
575   i_fountain_seg_type type;
576   i_fountain_color color;
577 } i_fountain_seg;
578 typedef enum {
579   i_fr_none,
580   i_fr_sawtooth,
581   i_fr_triangle,
582   i_fr_saw_both,
583   i_fr_tri_both
584 } i_fountain_repeat;
585 typedef enum {
586   i_ft_linear,
587   i_ft_bilinear,
588   i_ft_radial,
589   i_ft_radial_square,
590   i_ft_revolution,
591   i_ft_conical,
592   i_ft_end
593 } i_fountain_type;
594 typedef enum {
595   i_fts_none,
596   i_fts_grid,
597   i_fts_random,
598   i_fts_circle
599 } i_ft_supersample;
600 
601 /*
602 =item i_fill_t
603 =category Data Types
604 =synopsis i_fill_t *fill;
605 
606 This is the "abstract" base type for Imager's fill types.
607 
608 Unless you're implementing a new fill type you'll typically treat this
609 as an opaque type.
610 
611 =cut
612 */
613 
614 typedef struct i_fill_tag
615 {
616   /* called for 8-bit/sample image (and maybe lower) */
617   /* this may be NULL, if so call fill_with_fcolor */
618   i_fill_with_color_f f_fill_with_color;
619 
620   /* called for other sample sizes */
621   /* this must be non-NULL */
622   i_fill_with_fcolor_f f_fill_with_fcolor;
623 
624   /* called if non-NULL to release any extra resources */
625   i_fill_destroy_f destroy;
626 
627   /* if non-zero the caller will fill data with the original data
628      from the image */
629   i_fill_combine_f combine;
630   i_fill_combinef_f combinef;
631 } i_fill_t;
632 
633 typedef enum {
634   ic_none,
635   ic_normal,
636   ic_multiply,
637   ic_dissolve,
638   ic_add,
639   ic_subtract,
640   ic_diff,
641   ic_lighten,
642   ic_darken,
643   ic_hue,
644   ic_sat,
645   ic_value,
646   ic_color
647 } i_combine_t;
648 
649 /*
650 =item i_mutex_t
651 X<i_mutex>
652 =category mutex
653 =synopsis i_mutex_t mutex;
654 
655 Opaque type for Imager's mutex API.
656 
657 =cut
658  */
659 typedef struct i_mutex_tag *i_mutex_t;
660 
661 /*
662    describes an axis of a MM font.
663    Modelled on FT2's FT_MM_Axis.
664    It would be nice to have a default entry too, but FT2
665    doesn't support it.
666 */
667 typedef struct i_font_mm_axis_tag {
668   char const *name;
669   int minimum;
670   int maximum;
671 } i_font_mm_axis;
672 
673 #define IM_FONT_MM_MAX_AXES 4
674 
675 /*
676    multiple master information for a font, if any
677    modelled on FT2's FT_Multi_Master.
678 */
679 typedef struct i_font_mm_tag {
680   int num_axis;
681   int num_designs; /* provided but not necessarily useful */
682   i_font_mm_axis axis[IM_FONT_MM_MAX_AXES];
683 } i_font_mm;
684 
685 #ifdef HAVE_LIBTT
686 
687 struct TT_Fonthandle_;
688 
689 typedef struct TT_Fonthandle_ TT_Fonthandle;
690 
691 #endif
692 
693 /*
694 =item i_transp
695 =category Data Types
696 
697 An enumerated type for controlling how transparency is handled during
698 quantization.
699 
700 This has the following possible values:
701 
702 =over
703 
704 =item *
705 
706 C<tr_none> - ignore the alpha channel
707 
708 =item *
709 
710 C<tr_threshold> - simple transparency thresholding.
711 
712 =item *
713 
714 C<tr_errdiff> - use error diffusion to control which pixels are
715 transparent.
716 
717 =item *
718 
719 C<tr_ordered> - use ordered dithering to control which pixels are
720 transparent.
721 
722 =back
723 
724 =cut
725 */
726 
727 /* transparency handling for quantized output */
728 typedef enum i_transp_tag {
729   tr_none, /* ignore any alpha channel */
730   tr_threshold, /* threshold the transparency - uses tr_threshold */
731   tr_errdiff, /* error diffusion */
732   tr_ordered /* an ordered dither */
733 } i_transp;
734 
735 /*
736 =item i_make_colors
737 =category Data Types
738 
739 An enumerated type used to control the method used for produce the
740 color map:
741 
742 =over
743 
744 =item *
745 
746 C<mc_none> - the user supplied map is used.
747 
748 =item *
749 
750 C<mc_web_map> - use the classic web map.  Any existing fixed colors
751 are ignored.
752 
753 =item *
754 
755 C<mc_median_cut> - use median cut
756 
757 =item *
758 
759 C<mono> - use a fixed black and white map.
760 
761 =item *
762 
763 C<gray> - 256 step gray map.
764 
765 =item *
766 
767 C<gray4> - 4 step gray map.
768 
769 =item *
770 
771 C<gray16> - 16 step gray map.
772 
773 =back
774 
775 =cut
776 */
777 
778 typedef enum i_make_colors_tag {
779   mc_none, /* user supplied colour map only */
780   mc_web_map, /* Use the 216 colour web colour map */
781   mc_addi, /* Addi's algorithm */
782   mc_median_cut, /* median cut - similar to giflib, hopefully */
783   mc_mono, /* fixed mono color map */
784   mc_gray, /* 256 gray map */
785   mc_gray4, /* four step gray map */
786   mc_gray16, /* sixteen step gray map */
787   mc_mask = 0xFF /* (mask for generator) */
788 } i_make_colors;
789 
790 /*
791 =item i_translate
792 =category Data Types
793 
794 An enumerated type that controls how colors are translated:
795 
796 =over
797 
798 =item *
799 
800 C<pt_giflib> - obsolete, forces C<make_colors> to use median cut and
801 acts like C<pt_closest>.
802 
803 =item *
804 
805 C<pt_closest> - always use the closest color.
806 
807 =item *
808 
809 C<pt_perturb> - add random values to each sample and find the closest
810 color.
811 
812 =item *
813 
814 C<pt_errdiff> - error diffusion dither.
815 
816 =back
817 
818 =cut
819 */
820 
821 /* controls how we translate the colours */
822 typedef enum i_translate_tag {
823   pt_giflib, /* get gif lib to do it (ignores make_colours) */
824   pt_closest, /* just use the closest match within the hashbox */
825   pt_perturb, /* randomly perturb the data - uses perturb_size*/
826   pt_errdiff /* error diffusion dither - uses errdiff */
827 } i_translate;
828 
829 /*
830 =item i_errdiff
831 =category Data Types
832 
833 Controls the type of error diffusion to use:
834 
835 =over
836 
837 =item *
838 
839 C<ed_floyd> - floyd-steinberg
840 
841 =item *
842 
843 C<ed_jarvis> - Jarvis, Judice and Ninke
844 
845 =item *
846 
847 C<ed_stucki> - Stucki
848 
849 =item *
850 
851 C<ed_custom> - not usable for transparency dithering, allows a custom
852 error diffusion map to be used.
853 
854 =item *
855 
856 C<ed_bidir> - or with the error diffusion type to use alternate
857 directions on each line of the dither.
858 
859 =back
860 
861 =cut
862 */
863 
864 /* Which error diffusion map to use */
865 typedef enum i_errdiff_tag {
866   ed_floyd, /* floyd-steinberg */
867   ed_jarvis, /* Jarvis, Judice and Ninke */
868   ed_stucki, /* Stucki */
869   ed_custom, /* the map found in ed_map|width|height|orig */
870   ed_mask = 0xFF, /* mask to get the map */
871   ed_bidir = 0x100 /* change direction for each row */
872 } i_errdiff;
873 
874 /*
875 =item i_ord_dith
876 =category Data Types
877 
878 Which ordered dither map to use, currently only available for
879 transparency.  Values are:
880 
881 =over
882 
883 =item *
884 
885 C<od_random> - a pre-generated random map.
886 
887 =item *
888 
889 C<od_dot8> - large dot dither.
890 
891 =item *
892 
893 C<od_dot4> - smaller dot dither
894 
895 =item *
896 
897 C<od_hline> - horizontal line dither.
898 
899 =item *
900 
901 C<od_vline> - vertical line dither.
902 
903 =item *
904 
905 C<od_slashline> - C</> line dither.
906 
907 =item *
908 
909 C<od_backline> - C<\> line dither.
910 
911 =item *
912 
913 C<od_tiny> - small checkbox dither
914 
915 =item *
916 
917 C<od_custom> - custom dither map.
918 
919 =back
920 
921 =cut
922 
923    I don't know of a way to do ordered dither of an image against some
924    general palette
925  */
926 typedef enum i_ord_dith_tag
927 {
928   od_random, /* sort of random */
929   od_dot8, /* large dot */
930   od_dot4,
931   od_hline,
932   od_vline,
933   od_slashline, /* / line dither */
934   od_backline, /* \ line dither */
935   od_tiny, /* small checkerbox */
936   od_custom /* custom 8x8 map */
937 } i_ord_dith;
938 
939 /*
940 =item i_quantize
941 =category Data Types
942 
943 A structure type used to supply image quantization, ie. when
944 converting a direct color image to a paletted image.
945 
946 This has the following members:
947 
948 =over
949 
950 =item *
951 
952 C<transp> - how to handle transparency, see L</i_transp>.
953 
954 =item *
955 
956 C<threshold> - when C<transp> is C<tr_threshold>, this is the alpha
957 level at which pixels become transparent.
958 
959 =item *
960 
961 C<tr_errdiff> - when C<transp> is C<tr_errdiff> this controls the type
962 of error diffusion to be done.  This may not be C<ed_custom> for this
963 member.
964 
965 =item *
966 
967 C<tr_orddith> - when C<transp> is C<tr_ordered> this controls the
968 patten used for dithering transparency.
969 
970 =item *
971 
972 C<tr_custom> - when C<tr_orddith> is C<tr_custom> this is the ordered
973 dither mask.
974 
975 =item *
976 
977 C<make_colors> - the method used to generate the color palette, see
978 L</i_make_colors>.
979 
980 =item *
981 
982 C<mc_colors> - an array of C<mc_size> L</i_color> entries used to
983 define the fixed colors (controlled by C<mc_count> and to return the
984 generated color list.
985 
986 =item *
987 
988 C<mc_size> - the size of the buffer allocated to C<mc_colors> in
989 C<sizeof(i_color)> units.
990 
991 =item *
992 
993 C<mc_count> - the number of initialized colors in C<mc_colors>.
994 
995 =item *
996 
997 C<translate> - how RGB colors are translated to palette indexes, see
998 L</i_translate>.
999 
1000 =item *
1001 
1002 C<errdiff> - when C<translate> is C<pt_errdiff> this controls the type
1003 of error diffusion to be done.
1004 
1005 =item *
1006 
1007 C<ed_map>, C<ed_width>, C<ed_height>, C<ed_orig> - when C<errdiff> is
1008 C<ed_custom> this controls the error diffusion map.  C<ed_map> is an
1009 array of C<ed_width * ed_height> integers.  C<ed_orig> is the position
1010 of the current pixel in the error diffusion map, always on the top
1011 row.
1012 
1013 =item *
1014 
1015 C<perturb> - the amount to perturb pixels when C<translate> is
1016 C<mc_perturb>.
1017 
1018 =back
1019 
1020 =cut
1021 */
1022 typedef struct i_quantize_tag {
1023   int version;
1024 
1025   /* how to handle transparency */
1026   i_transp transp;
1027   /* the threshold at which to make pixels opaque */
1028   int tr_threshold;
1029   i_errdiff tr_errdiff;
1030   i_ord_dith tr_orddith;
1031   unsigned char tr_custom[64];
1032 
1033   /* how to make the colour map */
1034   i_make_colors make_colors;
1035 
1036   /* any existing colours
1037      mc_existing is an existing colour table
1038      mc_count is the number of existing colours
1039      mc_size is the total size of the array that mc_existing points
1040      at - this must be at least 256
1041   */
1042   i_color *mc_colors;
1043   int mc_size;
1044   int mc_count;
1045 
1046   /* how we translate the colours */
1047   i_translate translate;
1048 
1049   /* the error diffusion map to use if translate is mc_errdiff */
1050   i_errdiff errdiff;
1051   /* the following define the error diffusion values to use if
1052      errdiff is ed_custom.  ed_orig is the column on the top row that
1053      represents the current
1054   */
1055   int *ed_map;
1056   int ed_width, ed_height, ed_orig;
1057 
1058   /* the amount of perturbation to use for translate is mc_perturb */
1059   int perturb;
1060   /* version 2 members after here */
1061 } i_quantize;
1062 
1063 /* distance measures used by some filters */
1064 enum {
1065   i_dmeasure_euclidean = 0,
1066   i_dmeasure_euclidean_squared = 1,
1067   i_dmeasure_manhatten = 2,
1068   i_dmeasure_limit = 2,
1069 };
1070 
1071 #include "iolayert.h"
1072 
1073 /* error message information returned by im_errors() */
1074 
1075 typedef struct {
1076   char *msg;
1077   int code;
1078 } i_errmsg;
1079 
1080 typedef struct i_render_tag i_render;
1081 
1082 /*
1083 =item i_color_model_t
1084 =category Data Types
1085 =order 95
1086 
1087 Returned by L</i_img_color_model(im)> to indicate the color model of
1088 the image.
1089 
1090 An enumerated type with the following possible values:
1091 
1092 =over
1093 
1094 =item *
1095 
1096 C<icm_unknown> - the image has no usable color data.  In future
1097 versions of Imager this will be returned in a few limited cases,
1098 eg. when the source image is CMYK and the user has requested no color
1099 translation is done.
1100 
1101 =item *
1102 
1103 C<icm_gray> - gray scale with no alpha channel.
1104 
1105 =item *
1106 
1107 C<icm_gray_alpha> - gray scale with an alpha channel.
1108 
1109 =item *
1110 
1111 C<icm_rgb> - RGB
1112 
1113 =item *
1114 
1115 C<icm_rgb_alpha> - RGB with an alpha channel.
1116 
1117 =back
1118 
1119 =cut
1120 */
1121 
1122 typedef enum {
1123   icm_unknown,
1124   icm_gray,
1125   icm_gray_alpha,
1126   icm_rgb,
1127   icm_rgb_alpha
1128 } i_color_model_t;
1129 
1130 #ifdef IMAGER_FORMAT_ATTR
1131 #define I_FORMAT_ATTR(format_index, va_index) \
1132   __attribute ((format (printf, format_index, va_index)))
1133 #else
1134 #define I_FORMAT_ATTR(format_index, va_index)
1135 #endif
1136 
1137 #ifdef _MSC_VER
1138 #  ifndef vsnprintf
1139 #  define vsnprintf _vsnprintf
1140 #  endif
1141 #  ifndef snprintf
1142 #  define snprintf _snprintf
1143 #  endif
1144 #endif
1145 
1146 /*
1147 =item i_DF
1148 =category Data Types
1149 =synopsis printf("left %" i_DF "\n", i_DFc(x));
1150 =order 95
1151 
1152 This is a constant string that can be used with functions like
1153 printf() to format i_img_dim values after they're been cast with i_DFc().
1154 
1155 Does not include the leading C<%>.
1156 
1157 =cut
1158 
1159 =item i_DFc
1160 =category Data Types
1161 =order 95
1162 
1163 Cast an C<i_img_dim> value to a type for use with the i_DF format
1164 string.
1165 
1166 =cut
1167 
1168 =item i_DFp
1169 =category Data Types
1170 =synopsis printf("point (" i_DFp ")\n", i_DFcp(x, y));
1171 =order 95
1172 
1173 Format a pair of C<i_img_dim> values.  This format string I<does>
1174 include the leading C<%>.
1175 
1176 =cut
1177 
1178 =item i_DFcp
1179 =category Data Types
1180 =order 95
1181 
1182 Casts two C<i_img_dim> values for use with the i_DF (or i_DFp) format.
1183 
1184 =cut
1185  */
1186 
1187 #define i_DFc(x) ((i_dim_format_t)(x))
1188 #define i_DFcp(x, y) i_DFc(x), i_DFc(y)
1189 #define i_DFp "%" i_DF ", %" i_DF
1190 
1191 #endif
1192 
1193