7 image.c - implements most of the basic functions of Imager and much of the rest
13 c = i_color_new(red, green, blue, alpha);
21 image.c implements the basic functions to create and destroy image and
22 color objects for Imager.
24 =head1 FUNCTION REFERENCE
26 Some of these functions are internal.
37 #define minmax(a,b,i) ( ((a>=i)?a: ( (b<=i)?b:i )) )
39 /* Hack around an obscure linker bug on solaris - probably due to builtin gcc thingies */
40 static void fake(void) { ceil(1); }
42 static int i_ppix_d(i_img *im, int x, int y, const i_color *val);
43 static int i_gpix_d(i_img *im, int x, int y, i_color *val);
44 static int i_glin_d(i_img *im, int l, int r, int y, i_color *vals);
45 static int i_plin_d(i_img *im, int l, int r, int y, const i_color *vals);
46 static int i_ppixf_d(i_img *im, int x, int y, const i_fcolor *val);
47 static int i_gpixf_d(i_img *im, int x, int y, i_fcolor *val);
48 static int i_glinf_d(i_img *im, int l, int r, int y, i_fcolor *vals);
49 static int i_plinf_d(i_img *im, int l, int r, int y, const i_fcolor *vals);
50 static int i_gsamp_d(i_img *im, int l, int r, int y, i_sample_t *samps, const int *chans, int chan_count);
51 static int i_gsampf_d(i_img *im, int l, int r, int y, i_fsample_t *samps, const int *chans, int chan_count);
55 =category Image Implementation
57 Allocates a new i_img structure.
59 When implementing a new image type perform the following steps in your
60 image object creation function:
66 allocate the image with i_img_alloc().
70 initialize any function pointers or other data as needed, you can
71 overwrite the whole block if you need to.
75 initialize Imager's internal data by calling i_img_init() on the image
85 return mymalloc(sizeof(i_img));
90 =category Image Implementation
92 Imager interal initialization of images.
94 Currently this does very little, in the future it may be used to
95 support threads, or color profiles.
101 i_img_init(i_img *img) {
106 =item ICL_new_internal(r, g, b, a)
108 Return a new color object with values passed to it.
110 r - red component (range: 0 - 255)
111 g - green component (range: 0 - 255)
112 b - blue component (range: 0 - 255)
113 a - alpha component (range: 0 - 255)
119 ICL_new_internal(unsigned char r,unsigned char g,unsigned char b,unsigned char a) {
122 mm_log((1,"ICL_new_internal(r %d,g %d,b %d,a %d)\n", r, g, b, a));
124 if ( (cl=mymalloc(sizeof(i_color))) == NULL) i_fatal(2,"malloc() error\n");
129 mm_log((1,"(%p) <- ICL_new_internal\n",cl));
135 =item ICL_set_internal(cl, r, g, b, a)
137 Overwrite a color with new values.
139 cl - pointer to color object
140 r - red component (range: 0 - 255)
141 g - green component (range: 0 - 255)
142 b - blue component (range: 0 - 255)
143 a - alpha component (range: 0 - 255)
149 ICL_set_internal(i_color *cl,unsigned char r,unsigned char g,unsigned char b,unsigned char a) {
150 mm_log((1,"ICL_set_internal(cl* %p,r %d,g %d,b %d,a %d)\n",cl,r,g,b,a));
152 if ( (cl=mymalloc(sizeof(i_color))) == NULL)
153 i_fatal(2,"malloc() error\n");
158 mm_log((1,"(%p) <- ICL_set_internal\n",cl));
164 =item ICL_add(dst, src, ch)
166 Add src to dst inplace - dst is modified.
168 dst - pointer to destination color object
169 src - pointer to color object that is added
170 ch - number of channels
176 ICL_add(i_color *dst,i_color *src,int ch) {
179 tmp=dst->channel[i]+src->channel[i];
180 dst->channel[i]= tmp>255 ? 255:tmp;
187 Dump color information to log - strictly for debugging.
189 cl - pointer to color object
195 ICL_info(i_color const *cl) {
196 mm_log((1,"i_color_info(cl* %p)\n",cl));
197 mm_log((1,"i_color_info: (%d,%d,%d,%d)\n",cl->rgba.r,cl->rgba.g,cl->rgba.b,cl->rgba.a));
203 Destroy ancillary data for Color object.
205 cl - pointer to color object
211 ICL_DESTROY(i_color *cl) {
212 mm_log((1,"ICL_DESTROY(cl* %p)\n",cl));
217 =item i_fcolor_new(double r, double g, double b, double a)
221 i_fcolor *i_fcolor_new(double r, double g, double b, double a) {
224 mm_log((1,"i_fcolor_new(r %g,g %g,b %g,a %g)\n", r, g, b, a));
226 if ( (cl=mymalloc(sizeof(i_fcolor))) == NULL) i_fatal(2,"malloc() error\n");
231 mm_log((1,"(%p) <- i_fcolor_new\n",cl));
237 =item i_fcolor_destroy(i_fcolor *cl)
241 void i_fcolor_destroy(i_fcolor *cl) {
246 =item IIM_base_8bit_direct (static)
248 A static i_img object used to initialize direct 8-bit per sample images.
252 static i_img IIM_base_8bit_direct =
254 0, /* channels set */
255 0, 0, 0, /* xsize, ysize, bytes */
258 i_direct_type, /* type */
261 { 0, 0, NULL }, /* tags */
264 i_ppix_d, /* i_f_ppix */
265 i_ppixf_d, /* i_f_ppixf */
266 i_plin_d, /* i_f_plin */
267 i_plinf_d, /* i_f_plinf */
268 i_gpix_d, /* i_f_gpix */
269 i_gpixf_d, /* i_f_gpixf */
270 i_glin_d, /* i_f_glin */
271 i_glinf_d, /* i_f_glinf */
272 i_gsamp_d, /* i_f_gsamp */
273 i_gsampf_d, /* i_f_gsampf */
277 NULL, /* i_f_addcolors */
278 NULL, /* i_f_getcolors */
279 NULL, /* i_f_colorcount */
280 NULL, /* i_f_maxcolors */
281 NULL, /* i_f_findcolor */
282 NULL, /* i_f_setcolors */
284 NULL, /* i_f_destroy */
287 NULL, /* i_f_psamp_bits */
290 /*static void set_8bit_direct(i_img *im) {
291 im->i_f_ppix = i_ppix_d;
292 im->i_f_ppixf = i_ppixf_d;
293 im->i_f_plin = i_plin_d;
294 im->i_f_plinf = i_plinf_d;
295 im->i_f_gpix = i_gpix_d;
296 im->i_f_gpixf = i_gpixf_d;
297 im->i_f_glin = i_glin_d;
298 im->i_f_glinf = i_glinf_d;
301 im->i_f_addcolor = NULL;
302 im->i_f_getcolor = NULL;
303 im->i_f_colorcount = NULL;
304 im->i_f_findcolor = NULL;
308 =item IIM_new(x, y, ch)
310 =item i_img_8_new(x, y, ch)
312 =category Image creation/destruction
314 =synopsis i_img *img = i_img_8_new(width, height, channels);
316 Creates a new image object I<x> pixels wide, and I<y> pixels high with
324 IIM_new(int x,int y,int ch) {
326 mm_log((1,"IIM_new(x %d,y %d,ch %d)\n",x,y,ch));
328 im=i_img_empty_ch(NULL,x,y,ch);
330 mm_log((1,"(%p) <- IIM_new\n",im));
336 IIM_DESTROY(i_img *im) {
337 mm_log((1,"IIM_DESTROY(im* %p)\n",im));
345 Create new image reference - notice that this isn't an object yet and
346 this should be fixed asap.
356 mm_log((1,"i_img_struct()\n"));
360 *im = IIM_base_8bit_direct;
370 mm_log((1,"(%p) <- i_img_struct\n",im));
375 =item i_img_empty(im, x, y)
377 Re-new image reference (assumes 3 channels)
380 x - xsize of destination image
381 y - ysize of destination image
383 **FIXME** what happens if a live image is passed in here?
385 Should this just call i_img_empty_ch()?
391 i_img_empty(i_img *im,int x,int y) {
392 mm_log((1,"i_img_empty(*im %p, x %d, y %d)\n",im, x, y));
393 return i_img_empty_ch(im, x, y, 3);
397 =item i_img_empty_ch(im, x, y, ch)
399 Re-new image reference
402 x - xsize of destination image
403 y - ysize of destination image
404 ch - number of channels
410 i_img_empty_ch(i_img *im,int x,int y,int ch) {
413 mm_log((1,"i_img_empty_ch(*im %p, x %d, y %d, ch %d)\n", im, x, y, ch));
415 if (x < 1 || y < 1) {
416 i_push_error(0, "Image sizes must be positive");
419 if (ch < 1 || ch > MAXCHANNELS) {
420 i_push_errorf(0, "channels must be between 1 and %d", MAXCHANNELS);
423 /* check this multiplication doesn't overflow */
425 if (bytes / y / ch != x) {
426 i_push_errorf(0, "integer overflow calculating image allocation");
433 memcpy(im, &IIM_base_8bit_direct, sizeof(i_img));
434 i_tags_new(&im->tags);
438 im->ch_mask = MAXINT;
440 if ( (im->idata=mymalloc(im->bytes)) == NULL)
441 i_fatal(2,"malloc() error\n");
442 memset(im->idata,0,(size_t)im->bytes);
448 mm_log((1,"(%p) <- i_img_empty_ch\n",im));
453 =item i_img_exorcise(im)
463 i_img_exorcise(i_img *im) {
464 mm_log((1,"i_img_exorcise(im* 0x%x)\n",im));
465 i_tags_destroy(&im->tags);
467 (im->i_f_destroy)(im);
468 if (im->idata != NULL) { myfree(im->idata); }
474 im->i_f_ppix=i_ppix_d;
475 im->i_f_gpix=i_gpix_d;
476 im->i_f_plin=i_plin_d;
477 im->i_f_glin=i_glin_d;
482 =item i_img_destroy(img)
484 =category Image creation/destruction
485 =synopsis i_img_destroy(img)
487 Destroy an image object
493 i_img_destroy(i_img *im) {
494 mm_log((1,"i_img_destroy(im %p)\n",im));
496 if (im) { myfree(im); }
500 =item i_img_info(im, info)
504 Return image information
507 info - pointer to array to return data
509 info is an array of 4 integers with the following values:
514 info[3] - channel mask
521 i_img_info(i_img *im,int *info) {
522 mm_log((1,"i_img_info(im 0x%x)\n",im));
524 mm_log((1,"i_img_info: xsize=%d ysize=%d channels=%d mask=%ud\n",im->xsize,im->ysize,im->channels,im->ch_mask));
525 mm_log((1,"i_img_info: idata=0x%d\n",im->idata));
528 info[2] = im->channels;
529 info[3] = im->ch_mask;
539 =item i_img_setmask(im, ch_mask)
540 =category Image Information
541 =synopsis // only channel 0 writeable
542 =synopsis i_img_setmask(img, 0x01);
544 Set the image channel mask for I<im> to I<ch_mask>.
546 The image channel mask gives some control over which channels can be
547 written to in the image.
552 i_img_setmask(i_img *im,int ch_mask) { im->ch_mask=ch_mask; }
556 =item i_img_getmask(im)
557 =category Image Information
558 =synopsis int mask = i_img_getmask(img);
560 Get the image channel mask for I<im>.
565 i_img_getmask(i_img *im) { return im->ch_mask; }
568 =item i_img_getchannels(im)
569 =category Image Information
570 =synopsis int channels = i_img_getchannels(img);
572 Get the number of channels in I<im>.
577 i_img_getchannels(i_img *im) { return im->channels; }
580 =item i_img_get_width(im)
581 =category Image Information
582 =synopsis i_img_dim width = i_img_get_width(im);
584 Returns the width in pixels of the image.
589 i_img_get_width(i_img *im) {
594 =item i_img_get_height(im)
595 =category Image Information
596 =synopsis i_img_dim height = i_img_get_height(im);
598 Returns the height in pixels of the image.
603 i_img_get_height(i_img *im) {
608 =item i_copyto_trans(im, src, x1, y1, x2, y2, tx, ty, trans)
612 (x1,y1) (x2,y2) specifies the region to copy (in the source coordinates)
613 (tx,ty) specifies the upper left corner for the target image.
614 pass NULL in trans for non transparent i_colors.
620 i_copyto_trans(i_img *im,i_img *src,int x1,int y1,int x2,int y2,int tx,int ty,const i_color *trans) {
622 int x,y,t,ttx,tty,tt,ch;
624 mm_log((1,"i_copyto_trans(im* %p,src 0x%x, x1 %d, y1 %d, x2 %d, y2 %d, tx %d, ty %d, trans* 0x%x)\n",
625 im, src, x1, y1, x2, y2, tx, ty, trans));
627 if (x2<x1) { t=x1; x1=x2; x2=t; }
628 if (y2<y1) { t=y1; y1=y2; y2=t; }
640 for(ch=0;ch<im->channels;ch++) if (trans->channel[ch]!=pv.channel[ch]) tt++;
641 if (tt) i_ppix(im,ttx,tty,&pv);
642 } else i_ppix(im,ttx,tty,&pv);
654 Creates a new image that is a copy of src.
656 Tags are not copied, only the image data.
666 i_img *im = i_sametype(src, src->xsize, src->ysize);
668 mm_log((1,"i_copy(src %p)\n", src));
675 if (src->type == i_direct_type) {
676 if (src->bits == i_8_bits) {
678 pv = mymalloc(sizeof(i_color) * x1);
680 for (y = 0; y < y1; ++y) {
681 i_glin(src, 0, x1, y, pv);
682 i_plin(im, 0, x1, y, pv);
689 pv = mymalloc(sizeof(i_fcolor) * x1);
690 for (y = 0; y < y1; ++y) {
691 i_glinf(src, 0, x1, y, pv);
692 i_plinf(im, 0, x1, y, pv);
700 vals = mymalloc(sizeof(i_palidx) * x1);
701 for (y = 0; y < y1; ++y) {
702 i_gpal(src, 0, x1, y, vals);
703 i_ppal(im, 0, x1, y, vals);
724 if ((x >= 2.0) || (x <= -2.0)) return (0.0);
725 else if (x == 0.0) return (1.0);
726 else return(sin(PIx) / PIx * sin(PIx2) / PIx2);
731 =item i_scaleaxis(im, value, axis)
733 Returns a new image object which is I<im> scaled by I<value> along
734 wither the x-axis (I<axis> == 0) or the y-axis (I<axis> == 1).
740 i_scaleaxis(i_img *im, float Value, int Axis) {
741 int hsize, vsize, i, j, k, l, lMax, iEnd, jEnd;
742 int LanczosWidthFactor;
743 float *l0, *l1, OldLocation;
746 float F, PictureValue[MAXCHANNELS];
748 i_color val,val1,val2;
752 mm_log((1,"i_scaleaxis(im %p,Value %.2f,Axis %d)\n",im,Value,Axis));
756 hsize = (int)(0.5 + im->xsize * Value);
759 Value = 1.0 / im->xsize;
767 vsize = (int)(0.5 + im->ysize * Value);
771 Value = 1.0 / im->ysize;
778 new_img = i_img_empty_ch(NULL, hsize, vsize, im->channels);
780 i_push_error(0, "cannot create output image");
784 /* 1.4 is a magic number, setting it to 2 will cause rather blurred images */
785 LanczosWidthFactor = (Value >= 1) ? 1 : (int) (1.4/Value);
786 lMax = LanczosWidthFactor << 1;
788 l0 = mymalloc(lMax * sizeof(float));
789 l1 = mymalloc(lMax * sizeof(float));
791 for (j=0; j<jEnd; j++) {
792 OldLocation = ((float) j) / Value;
793 T = (int) (OldLocation);
794 F = OldLocation - (float) T;
796 for (l = 0; l<lMax; l++) {
797 l0[lMax-l-1] = Lanczos(((float) (lMax-l-1) + F) / (float) LanczosWidthFactor);
798 l1[l] = Lanczos(((float) (l+1) - F) / (float) LanczosWidthFactor);
801 /* Make sure filter is normalized */
803 for(l=0; l<lMax; l++) {
807 t /= (float)LanczosWidthFactor;
809 for(l=0; l<lMax; l++) {
816 for (i=0; i<iEnd; i++) {
817 for (k=0; k<im->channels; k++) PictureValue[k] = 0.0;
818 for (l=0; l<lMax; l++) {
821 mx = (mx < 0) ? 0 : mx;
822 Mx = (Mx >= im->xsize) ? im->xsize-1 : Mx;
824 i_gpix(im, Mx, i, &val1);
825 i_gpix(im, mx, i, &val2);
827 for (k=0; k<im->channels; k++) {
828 PictureValue[k] += l1[l] * val1.channel[k];
829 PictureValue[k] += l0[lMax-l-1] * val2.channel[k];
832 for(k=0;k<im->channels;k++) {
833 psave = (short)(0.5+(PictureValue[k] / LanczosWidthFactor));
834 val.channel[k]=minmax(0,255,psave);
836 i_ppix(new_img, j, i, &val);
841 for (i=0; i<iEnd; i++) {
842 for (k=0; k<im->channels; k++) PictureValue[k] = 0.0;
843 for (l=0; l < lMax; l++) {
846 mx = (mx < 0) ? 0 : mx;
847 Mx = (Mx >= im->ysize) ? im->ysize-1 : Mx;
849 i_gpix(im, i, Mx, &val1);
850 i_gpix(im, i, mx, &val2);
851 for (k=0; k<im->channels; k++) {
852 PictureValue[k] += l1[l] * val1.channel[k];
853 PictureValue[k] += l0[lMax-l-1] * val2.channel[k];
856 for (k=0; k<im->channels; k++) {
857 psave = (short)(0.5+(PictureValue[k] / LanczosWidthFactor));
858 val.channel[k] = minmax(0, 255, psave);
860 i_ppix(new_img, i, j, &val);
868 mm_log((1,"(%p) <- i_scaleaxis\n", new_img));
875 =item i_scale_nn(im, scx, scy)
877 Scale by using nearest neighbor
878 Both axes scaled at the same time since
879 nothing is gained by doing it in two steps
886 i_scale_nn(i_img *im, float scx, float scy) {
888 int nxsize,nysize,nx,ny;
892 mm_log((1,"i_scale_nn(im 0x%x,scx %.2f,scy %.2f)\n",im,scx,scy));
894 nxsize = (int) ((float) im->xsize * scx);
897 scx = 1.0 / im->xsize;
899 nysize = (int) ((float) im->ysize * scy);
902 scy = 1.0 / im->ysize;
904 im_assert(scx != 0 && scy != 0);
906 new_img=i_img_empty_ch(NULL,nxsize,nysize,im->channels);
908 for(ny=0;ny<nysize;ny++) for(nx=0;nx<nxsize;nx++) {
909 i_gpix(im,((float)nx)/scx,((float)ny)/scy,&val);
910 i_ppix(new_img,nx,ny,&val);
913 mm_log((1,"(0x%x) <- i_scale_nn\n",new_img));
919 =item i_sametype(i_img *im, int xsize, int ysize)
921 =category Image creation/destruction
922 =synopsis i_img *img = i_sametype(src, width, height);
924 Returns an image of the same type (sample size, channels, paletted/direct).
926 For paletted images the palette is copied from the source.
931 i_img *i_sametype(i_img *src, int xsize, int ysize) {
932 if (src->type == i_direct_type) {
933 if (src->bits == 8) {
934 return i_img_empty_ch(NULL, xsize, ysize, src->channels);
936 else if (src->bits == i_16_bits) {
937 return i_img_16_new(xsize, ysize, src->channels);
939 else if (src->bits == i_double_bits) {
940 return i_img_double_new(xsize, ysize, src->channels);
943 i_push_error(0, "Unknown image bits");
951 i_img *targ = i_img_pal_new(xsize, ysize, src->channels, i_maxcolors(src));
952 for (i = 0; i < i_colorcount(src); ++i) {
953 i_getcolors(src, i, &col, 1);
954 i_addcolors(targ, &col, 1);
962 =item i_sametype_chans(i_img *im, int xsize, int ysize, int channels)
964 =category Image creation/destruction
965 =synopsis i_img *img = i_sametype_chans(src, width, height, channels);
967 Returns an image of the same type (sample size).
969 For paletted images the equivalent direct type is returned.
974 i_img *i_sametype_chans(i_img *src, int xsize, int ysize, int channels) {
975 if (src->bits == 8) {
976 return i_img_empty_ch(NULL, xsize, ysize, channels);
978 else if (src->bits == i_16_bits) {
979 return i_img_16_new(xsize, ysize, channels);
981 else if (src->bits == i_double_bits) {
982 return i_img_double_new(xsize, ysize, channels);
985 i_push_error(0, "Unknown image bits");
991 =item i_transform(im, opx, opxl, opy, opyl, parm, parmlen)
993 Spatially transforms I<im> returning a new image.
995 opx for a length of opxl and opy for a length of opy are arrays of
996 operators that modify the x and y positions to retreive the pixel data from.
998 parm and parmlen define extra parameters that the operators may use.
1000 Note that this function is largely superseded by the more flexible
1001 L<transform.c/i_transform2>.
1003 Returns the new image.
1005 The operators for this function are defined in L<stackmach.c>.
1010 i_transform(i_img *im, int *opx,int opxl,int *opy,int opyl,double parm[],int parmlen) {
1012 int nxsize,nysize,nx,ny;
1016 mm_log((1,"i_transform(im 0x%x, opx 0x%x, opxl %d, opy 0x%x, opyl %d, parm 0x%x, parmlen %d)\n",im,opx,opxl,opy,opyl,parm,parmlen));
1019 nysize = im->ysize ;
1021 new_img=i_img_empty_ch(NULL,nxsize,nysize,im->channels);
1022 /* fprintf(stderr,"parm[2]=%f\n",parm[2]); */
1023 for(ny=0;ny<nysize;ny++) for(nx=0;nx<nxsize;nx++) {
1024 /* parm[parmlen-2]=(double)nx;
1025 parm[parmlen-1]=(double)ny; */
1030 /* fprintf(stderr,"(%d,%d) ->",nx,ny); */
1031 rx=i_op_run(opx,opxl,parm,parmlen);
1032 ry=i_op_run(opy,opyl,parm,parmlen);
1033 /* fprintf(stderr,"(%f,%f)\n",rx,ry); */
1034 i_gpix(im,rx,ry,&val);
1035 i_ppix(new_img,nx,ny,&val);
1038 mm_log((1,"(0x%x) <- i_transform\n",new_img));
1043 =item i_img_diff(im1, im2)
1045 Calculates the sum of the squares of the differences between
1046 correspoding channels in two images.
1048 If the images are not the same size then only the common area is
1049 compared, hence even if images are different sizes this function
1056 i_img_diff(i_img *im1,i_img *im2) {
1057 int x,y,ch,xb,yb,chb;
1061 mm_log((1,"i_img_diff(im1 0x%x,im2 0x%x)\n",im1,im2));
1063 xb=(im1->xsize<im2->xsize)?im1->xsize:im2->xsize;
1064 yb=(im1->ysize<im2->ysize)?im1->ysize:im2->ysize;
1065 chb=(im1->channels<im2->channels)?im1->channels:im2->channels;
1067 mm_log((1,"i_img_diff: xb=%d xy=%d chb=%d\n",xb,yb,chb));
1070 for(y=0;y<yb;y++) for(x=0;x<xb;x++) {
1071 i_gpix(im1,x,y,&val1);
1072 i_gpix(im2,x,y,&val2);
1074 for(ch=0;ch<chb;ch++) tdiff+=(val1.channel[ch]-val2.channel[ch])*(val1.channel[ch]-val2.channel[ch]);
1076 mm_log((1,"i_img_diff <- (%.2f)\n",tdiff));
1081 =item i_img_diffd(im1, im2)
1083 Calculates the sum of the squares of the differences between
1084 correspoding channels in two images.
1086 If the images are not the same size then only the common area is
1087 compared, hence even if images are different sizes this function
1090 This is like i_img_diff() but looks at floating point samples instead.
1096 i_img_diffd(i_img *im1,i_img *im2) {
1097 int x,y,ch,xb,yb,chb;
1101 mm_log((1,"i_img_diffd(im1 0x%x,im2 0x%x)\n",im1,im2));
1103 xb=(im1->xsize<im2->xsize)?im1->xsize:im2->xsize;
1104 yb=(im1->ysize<im2->ysize)?im1->ysize:im2->ysize;
1105 chb=(im1->channels<im2->channels)?im1->channels:im2->channels;
1107 mm_log((1,"i_img_diff: xb=%d xy=%d chb=%d\n",xb,yb,chb));
1110 for(y=0;y<yb;y++) for(x=0;x<xb;x++) {
1111 i_gpixf(im1,x,y,&val1);
1112 i_gpixf(im2,x,y,&val2);
1114 for(ch=0;ch<chb;ch++) {
1115 double sdiff = val1.channel[ch]-val2.channel[ch];
1116 tdiff += sdiff * sdiff;
1119 mm_log((1,"i_img_diffd <- (%.2f)\n",tdiff));
1124 /* just a tiny demo of haar wavelets */
1132 i_img *new_img,*new_img2;
1133 i_color val1,val2,dval1,dval2;
1141 /* horizontal pass */
1143 new_img=i_img_empty_ch(NULL,fx*2,fy*2,im->channels);
1144 new_img2=i_img_empty_ch(NULL,fx*2,fy*2,im->channels);
1147 for(y=0;y<my;y++) for(x=0;x<fx;x++) {
1148 i_gpix(im,x*2,y,&val1);
1149 i_gpix(im,x*2+1,y,&val2);
1150 for(ch=0;ch<im->channels;ch++) {
1151 dval1.channel[ch]=(val1.channel[ch]+val2.channel[ch])/2;
1152 dval2.channel[ch]=(255+val1.channel[ch]-val2.channel[ch])/2;
1154 i_ppix(new_img,x,y,&dval1);
1155 i_ppix(new_img,x+fx,y,&dval2);
1158 for(y=0;y<fy;y++) for(x=0;x<mx;x++) {
1159 i_gpix(new_img,x,y*2,&val1);
1160 i_gpix(new_img,x,y*2+1,&val2);
1161 for(ch=0;ch<im->channels;ch++) {
1162 dval1.channel[ch]=(val1.channel[ch]+val2.channel[ch])/2;
1163 dval2.channel[ch]=(255+val1.channel[ch]-val2.channel[ch])/2;
1165 i_ppix(new_img2,x,y,&dval1);
1166 i_ppix(new_img2,x,y+fy,&dval2);
1169 i_img_destroy(new_img);
1174 =item i_count_colors(im, maxc)
1176 returns number of colors or -1
1177 to indicate that it was more than max colors
1181 /* This function has been changed and is now faster. It's using
1182 * i_gsamp instead of i_gpix */
1184 i_count_colors(i_img *im,int maxc) {
1191 int xsize = im->xsize;
1192 int ysize = im->ysize;
1193 int samp_cnt = 3 * xsize;
1195 if (im->channels >= 3) {
1199 channels[0] = channels[1] = channels[2] = 0;
1200 samp_chans = channels;
1205 samp = (i_sample_t *) mymalloc( xsize * 3 * sizeof(i_sample_t));
1208 for(y = 0; y < ysize; ) {
1209 i_gsamp(im, 0, xsize, y++, samp, samp_chans, 3);
1210 for(x = 0; x < samp_cnt; ) {
1211 colorcnt += octt_add(ct, samp[x], samp[x+1], samp[x+2]);
1213 if (colorcnt > maxc) {
1224 /* sorts the array ra[0..n-1] into increasing order using heapsort algorithm
1225 * (adapted from the Numerical Recipes)
1227 /* Needed by get_anonymous_color_histo */
1229 hpsort(unsigned int n, unsigned *ra) {
1254 if (j < ir && ra[j] < ra[j+1]) j++;
1266 /* This function constructs an ordered list which represents how much the
1267 * different colors are used. So for instance (100, 100, 500) means that one
1268 * color is used for 500 pixels, another for 100 pixels and another for 100
1269 * pixels. It's tuned for performance. You might not like the way I've hardcoded
1270 * the maxc ;-) and you might want to change the name... */
1271 /* Uses octt_histo */
1273 i_get_anonymous_color_histo(i_img *im, unsigned int **col_usage, int maxc) {
1277 unsigned int *col_usage_it;
1282 int xsize = im->xsize;
1283 int ysize = im->ysize;
1284 int samp_cnt = 3 * xsize;
1287 samp = (i_sample_t *) mymalloc( xsize * 3 * sizeof(i_sample_t));
1289 if (im->channels >= 3) {
1293 channels[0] = channels[1] = channels[2] = 0;
1294 samp_chans = channels;
1298 for(y = 0; y < ysize; ) {
1299 i_gsamp(im, 0, xsize, y++, samp, samp_chans, 3);
1300 for(x = 0; x < samp_cnt; ) {
1301 colorcnt += octt_add(ct, samp[x], samp[x+1], samp[x+2]);
1303 if (colorcnt > maxc) {
1310 /* Now that we know the number of colours... */
1311 col_usage_it = *col_usage = (unsigned int *) mymalloc(colorcnt * sizeof(unsigned int));
1312 octt_histo(ct, &col_usage_it);
1313 hpsort(colorcnt, *col_usage);
1321 =head2 8-bit per sample image internal functions
1323 These are the functions installed in an 8-bit per sample image.
1327 =item i_ppix_d(im, x, y, col)
1331 This is the function kept in the i_f_ppix member of an i_img object.
1332 It does a normal store of a pixel into the image with range checking.
1334 Returns 0 if the pixel could be set, -1 otherwise.
1340 i_ppix_d(i_img *im, int x, int y, const i_color *val) {
1343 if ( x>-1 && x<im->xsize && y>-1 && y<im->ysize ) {
1344 for(ch=0;ch<im->channels;ch++)
1345 if (im->ch_mask&(1<<ch))
1346 im->idata[(x+y*im->xsize)*im->channels+ch]=val->channel[ch];
1349 return -1; /* error was clipped */
1353 =item i_gpix_d(im, x, y, &col)
1357 This is the function kept in the i_f_gpix member of an i_img object.
1358 It does normal retrieval of a pixel from the image with range checking.
1360 Returns 0 if the pixel could be set, -1 otherwise.
1366 i_gpix_d(i_img *im, int x, int y, i_color *val) {
1368 if (x>-1 && x<im->xsize && y>-1 && y<im->ysize) {
1369 for(ch=0;ch<im->channels;ch++)
1370 val->channel[ch]=im->idata[(x+y*im->xsize)*im->channels+ch];
1373 for(ch=0;ch<im->channels;ch++) val->channel[ch] = 0;
1374 return -1; /* error was cliped */
1378 =item i_glin_d(im, l, r, y, vals)
1380 Reads a line of data from the image, storing the pixels at vals.
1382 The line runs from (l,y) inclusive to (r,y) non-inclusive
1384 vals should point at space for (r-l) pixels.
1386 l should never be less than zero (to avoid confusion about where to
1387 put the pixels in vals).
1389 Returns the number of pixels copied (eg. if r, l or y is out of range)
1395 i_glin_d(i_img *im, int l, int r, int y, i_color *vals) {
1397 unsigned char *data;
1398 if (y >=0 && y < im->ysize && l < im->xsize && l >= 0) {
1401 data = im->idata + (l+y*im->xsize) * im->channels;
1403 for (i = 0; i < count; ++i) {
1404 for (ch = 0; ch < im->channels; ++ch)
1405 vals[i].channel[ch] = *data++;
1415 =item i_plin_d(im, l, r, y, vals)
1417 Writes a line of data into the image, using the pixels at vals.
1419 The line runs from (l,y) inclusive to (r,y) non-inclusive
1421 vals should point at (r-l) pixels.
1423 l should never be less than zero (to avoid confusion about where to
1424 get the pixels in vals).
1426 Returns the number of pixels copied (eg. if r, l or y is out of range)
1432 i_plin_d(i_img *im, int l, int r, int y, const i_color *vals) {
1434 unsigned char *data;
1435 if (y >=0 && y < im->ysize && l < im->xsize && l >= 0) {
1438 data = im->idata + (l+y*im->xsize) * im->channels;
1440 for (i = 0; i < count; ++i) {
1441 for (ch = 0; ch < im->channels; ++ch) {
1442 if (im->ch_mask & (1 << ch))
1443 *data = vals[i].channel[ch];
1455 =item i_ppixf_d(im, x, y, val)
1461 i_ppixf_d(i_img *im, int x, int y, const i_fcolor *val) {
1464 if ( x>-1 && x<im->xsize && y>-1 && y<im->ysize ) {
1465 for(ch=0;ch<im->channels;ch++)
1466 if (im->ch_mask&(1<<ch)) {
1467 im->idata[(x+y*im->xsize)*im->channels+ch] =
1468 SampleFTo8(val->channel[ch]);
1472 return -1; /* error was clipped */
1476 =item i_gpixf_d(im, x, y, val)
1482 i_gpixf_d(i_img *im, int x, int y, i_fcolor *val) {
1484 if (x>-1 && x<im->xsize && y>-1 && y<im->ysize) {
1485 for(ch=0;ch<im->channels;ch++) {
1487 Sample8ToF(im->idata[(x+y*im->xsize)*im->channels+ch]);
1491 return -1; /* error was cliped */
1495 =item i_glinf_d(im, l, r, y, vals)
1497 Reads a line of data from the image, storing the pixels at vals.
1499 The line runs from (l,y) inclusive to (r,y) non-inclusive
1501 vals should point at space for (r-l) pixels.
1503 l should never be less than zero (to avoid confusion about where to
1504 put the pixels in vals).
1506 Returns the number of pixels copied (eg. if r, l or y is out of range)
1512 i_glinf_d(i_img *im, int l, int r, int y, i_fcolor *vals) {
1514 unsigned char *data;
1515 if (y >=0 && y < im->ysize && l < im->xsize && l >= 0) {
1518 data = im->idata + (l+y*im->xsize) * im->channels;
1520 for (i = 0; i < count; ++i) {
1521 for (ch = 0; ch < im->channels; ++ch)
1522 vals[i].channel[ch] = Sample8ToF(*data++);
1532 =item i_plinf_d(im, l, r, y, vals)
1534 Writes a line of data into the image, using the pixels at vals.
1536 The line runs from (l,y) inclusive to (r,y) non-inclusive
1538 vals should point at (r-l) pixels.
1540 l should never be less than zero (to avoid confusion about where to
1541 get the pixels in vals).
1543 Returns the number of pixels copied (eg. if r, l or y is out of range)
1549 i_plinf_d(i_img *im, int l, int r, int y, const i_fcolor *vals) {
1551 unsigned char *data;
1552 if (y >=0 && y < im->ysize && l < im->xsize && l >= 0) {
1555 data = im->idata + (l+y*im->xsize) * im->channels;
1557 for (i = 0; i < count; ++i) {
1558 for (ch = 0; ch < im->channels; ++ch) {
1559 if (im->ch_mask & (1 << ch))
1560 *data = SampleFTo8(vals[i].channel[ch]);
1572 =item i_gsamp_d(i_img *im, int l, int r, int y, i_sample_t *samps, int *chans, int chan_count)
1574 Reads sample values from im for the horizontal line (l, y) to (r-1,y)
1575 for the channels specified by chans, an array of int with chan_count
1578 Returns the number of samples read (which should be (r-l) * bits_set(chan_mask)
1584 i_gsamp_d(i_img *im, int l, int r, int y, i_sample_t *samps,
1585 const int *chans, int chan_count) {
1586 int ch, count, i, w;
1587 unsigned char *data;
1589 if (y >=0 && y < im->ysize && l < im->xsize && l >= 0) {
1592 data = im->idata + (l+y*im->xsize) * im->channels;
1597 /* make sure we have good channel numbers */
1598 for (ch = 0; ch < chan_count; ++ch) {
1599 if (chans[ch] < 0 || chans[ch] >= im->channels) {
1600 i_push_errorf(0, "No channel %d in this image", chans[ch]);
1604 for (i = 0; i < w; ++i) {
1605 for (ch = 0; ch < chan_count; ++ch) {
1606 *samps++ = data[chans[ch]];
1609 data += im->channels;
1613 if (chan_count <= 0 || chan_count > im->channels) {
1614 i_push_errorf(0, "chan_count %d out of range, must be >0, <= channels",
1618 for (i = 0; i < w; ++i) {
1619 for (ch = 0; ch < chan_count; ++ch) {
1620 *samps++ = data[ch];
1623 data += im->channels;
1635 =item i_gsampf_d(i_img *im, int l, int r, int y, i_fsample_t *samps, int *chans, int chan_count)
1637 Reads sample values from im for the horizontal line (l, y) to (r-1,y)
1638 for the channels specified by chan_mask, where bit 0 is the first
1641 Returns the number of samples read (which should be (r-l) * bits_set(chan_mask)
1647 i_gsampf_d(i_img *im, int l, int r, int y, i_fsample_t *samps,
1648 const int *chans, int chan_count) {
1649 int ch, count, i, w;
1650 unsigned char *data;
1651 for (ch = 0; ch < chan_count; ++ch) {
1652 if (chans[ch] < 0 || chans[ch] >= im->channels) {
1653 i_push_errorf(0, "No channel %d in this image", chans[ch]);
1656 if (y >=0 && y < im->ysize && l < im->xsize && l >= 0) {
1659 data = im->idata + (l+y*im->xsize) * im->channels;
1664 /* make sure we have good channel numbers */
1665 for (ch = 0; ch < chan_count; ++ch) {
1666 if (chans[ch] < 0 || chans[ch] >= im->channels) {
1667 i_push_errorf(0, "No channel %d in this image", chans[ch]);
1671 for (i = 0; i < w; ++i) {
1672 for (ch = 0; ch < chan_count; ++ch) {
1673 *samps++ = Sample8ToF(data[chans[ch]]);
1676 data += im->channels;
1680 if (chan_count <= 0 || chan_count > im->channels) {
1681 i_push_errorf(0, "chan_count %d out of range, must be >0, <= channels",
1685 for (i = 0; i < w; ++i) {
1686 for (ch = 0; ch < chan_count; ++ch) {
1687 *samps++ = Sample8ToF(data[ch]);
1690 data += im->channels;
1703 =head2 Image method wrappers
1705 These functions provide i_fsample_t functions in terms of their
1706 i_sample_t versions.
1710 =item i_ppixf_fp(i_img *im, int x, int y, i_fcolor *pix)
1715 int i_ppixf_fp(i_img *im, int x, int y, const i_fcolor *pix) {
1719 for (ch = 0; ch < im->channels; ++ch)
1720 temp.channel[ch] = SampleFTo8(pix->channel[ch]);
1722 return i_ppix(im, x, y, &temp);
1726 =item i_gpixf_fp(i_img *im, int x, int y, i_fcolor *pix)
1730 int i_gpixf_fp(i_img *im, int x, int y, i_fcolor *pix) {
1734 if (i_gpix(im, x, y, &temp)) {
1735 for (ch = 0; ch < im->channels; ++ch)
1736 pix->channel[ch] = Sample8ToF(temp.channel[ch]);
1744 =item i_plinf_fp(i_img *im, int l, int r, int y, i_fcolor *pix)
1748 int i_plinf_fp(i_img *im, int l, int r, int y, const i_fcolor *pix) {
1751 if (y >= 0 && y < im->ysize && l < im->xsize && l >= 0) {
1757 work = mymalloc(sizeof(i_color) * (r-l));
1758 for (i = 0; i < r-l; ++i) {
1759 for (ch = 0; ch < im->channels; ++ch)
1760 work[i].channel[ch] = SampleFTo8(pix[i].channel[ch]);
1762 ret = i_plin(im, l, r, y, work);
1777 =item i_glinf_fp(i_img *im, int l, int r, int y, i_fcolor *pix)
1781 int i_glinf_fp(i_img *im, int l, int r, int y, i_fcolor *pix) {
1784 if (y >= 0 && y < im->ysize && l < im->xsize && l >= 0) {
1790 work = mymalloc(sizeof(i_color) * (r-l));
1791 ret = i_plin(im, l, r, y, work);
1792 for (i = 0; i < r-l; ++i) {
1793 for (ch = 0; ch < im->channels; ++ch)
1794 pix[i].channel[ch] = Sample8ToF(work[i].channel[ch]);
1810 =item i_gsampf_fp(i_img *im, int l, int r, int y, i_fsample_t *samp, int *chans, int chan_count)
1814 int i_gsampf_fp(i_img *im, int l, int r, int y, i_fsample_t *samp,
1815 int const *chans, int chan_count) {
1818 if (y >= 0 && y < im->ysize && l < im->xsize && l >= 0) {
1824 work = mymalloc(sizeof(i_sample_t) * (r-l));
1825 ret = i_gsamp(im, l, r, y, work, chans, chan_count);
1826 for (i = 0; i < ret; ++i) {
1827 samp[i] = Sample8ToF(work[i]);
1845 =head2 Palette wrapper functions
1847 Used for virtual images, these forward palette calls to a wrapped image,
1848 assuming the wrapped image is the first pointer in the structure that
1849 im->ext_data points at.
1853 =item i_addcolors_forward(i_img *im, const i_color *colors, int count)
1857 int i_addcolors_forward(i_img *im, const i_color *colors, int count) {
1858 return i_addcolors(*(i_img **)im->ext_data, colors, count);
1862 =item i_getcolors_forward(i_img *im, int i, i_color *color, int count)
1866 int i_getcolors_forward(i_img *im, int i, i_color *color, int count) {
1867 return i_getcolors(*(i_img **)im->ext_data, i, color, count);
1871 =item i_setcolors_forward(i_img *im, int i, const i_color *color, int count)
1875 int i_setcolors_forward(i_img *im, int i, const i_color *color, int count) {
1876 return i_setcolors(*(i_img **)im->ext_data, i, color, count);
1880 =item i_colorcount_forward(i_img *im)
1884 int i_colorcount_forward(i_img *im) {
1885 return i_colorcount(*(i_img **)im->ext_data);
1889 =item i_maxcolors_forward(i_img *im)
1893 int i_maxcolors_forward(i_img *im) {
1894 return i_maxcolors(*(i_img **)im->ext_data);
1898 =item i_findcolor_forward(i_img *im, const i_color *color, i_palidx *entry)
1902 int i_findcolor_forward(i_img *im, const i_color *color, i_palidx *entry) {
1903 return i_findcolor(*(i_img **)im->ext_data, color, entry);
1909 =head2 Fallback handler
1913 =item i_gsamp_bits_fb
1919 i_gsamp_bits_fb(i_img *im, int l, int r, int y, unsigned *samps,
1920 const int *chans, int chan_count, int bits) {
1921 if (bits < 1 || bits > 32) {
1922 i_push_error(0, "Invalid bits, must be 1..32");
1926 if (y >=0 && y < im->ysize && l < im->xsize && l >= 0) {
1928 int ch, count, i, w;
1931 scale = 4294967295.0;
1933 scale = (double)(1 << bits) - 1;
1941 /* make sure we have good channel numbers */
1942 for (ch = 0; ch < chan_count; ++ch) {
1943 if (chans[ch] < 0 || chans[ch] >= im->channels) {
1944 i_push_errorf(0, "No channel %d in this image", chans[ch]);
1948 for (i = 0; i < w; ++i) {
1950 i_gpixf(im, l+i, y, &c);
1951 for (ch = 0; ch < chan_count; ++ch) {
1952 *samps++ = (unsigned)(c.channel[ch] * scale + 0.5);
1958 if (chan_count <= 0 || chan_count > im->channels) {
1959 i_push_error(0, "Invalid channel count");
1962 for (i = 0; i < w; ++i) {
1964 i_gpixf(im, l+i, y, &c);
1965 for (ch = 0; ch < chan_count; ++ch) {
1966 *samps++ = (unsigned)(c.channel[ch] * scale + 0.5);
1975 i_push_error(0, "Image position outside of image");
1983 =head2 Stream reading and writing wrapper functions
1987 =item i_gen_reader(i_gen_read_data *info, char *buf, int length)
1989 Performs general read buffering for file readers that permit reading
1990 to be done through a callback.
1992 The final callback gets two parameters, a I<need> value, and a I<want>
1993 value, where I<need> is the amount of data that the file library needs
1994 to read, and I<want> is the amount of space available in the buffer
1995 maintained by these functions.
1997 This means if you need to read from a stream that you don't know the
1998 length of, you can return I<need> bytes, taking the performance hit of
1999 possibly expensive callbacks (eg. back to perl code), or if you are
2000 reading from a stream where it doesn't matter if some data is lost, or
2001 if the total length of the stream is known, you can return I<want>
2008 i_gen_reader(i_gen_read_data *gci, char *buf, int length) {
2011 if (length < gci->length - gci->cpos) {
2013 memcpy(buf, gci->buffer+gci->cpos, length);
2014 gci->cpos += length;
2019 memcpy(buf, gci->buffer+gci->cpos, gci->length-gci->cpos);
2020 total += gci->length - gci->cpos;
2021 length -= gci->length - gci->cpos;
2022 buf += gci->length - gci->cpos;
2023 if (length < (int)sizeof(gci->buffer)) {
2027 && (did_read = (gci->cb)(gci->userdata, gci->buffer, length,
2028 sizeof(gci->buffer))) > 0) {
2030 gci->length = did_read;
2032 copy_size = i_min(length, gci->length);
2033 memcpy(buf, gci->buffer, copy_size);
2034 gci->cpos += copy_size;
2037 length -= copy_size;
2041 /* just read the rest - too big for our buffer*/
2043 while ((did_read = (gci->cb)(gci->userdata, buf, length, length)) > 0) {
2053 =item i_gen_read_data_new(i_read_callback_t cb, char *userdata)
2055 For use by callback file readers to initialize the reader buffer.
2057 Allocates, initializes and returns the reader buffer.
2059 See also L<image.c/free_gen_read_data> and L<image.c/i_gen_reader>.
2064 i_gen_read_data_new(i_read_callback_t cb, char *userdata) {
2065 i_gen_read_data *self = mymalloc(sizeof(i_gen_read_data));
2067 self->userdata = userdata;
2075 =item i_free_gen_read_data(i_gen_read_data *)
2081 void i_free_gen_read_data(i_gen_read_data *self) {
2086 =item i_gen_writer(i_gen_write_data *info, char const *data, int size)
2088 Performs write buffering for a callback based file writer.
2090 Failures are considered fatal, if a write fails then data will be
2097 i_gen_write_data *self,
2101 if (self->filledto && self->filledto+size > self->maxlength) {
2102 if (self->cb(self->userdata, self->buffer, self->filledto)) {
2110 if (self->filledto+size <= self->maxlength) {
2112 memcpy(self->buffer+self->filledto, data, size);
2113 self->filledto += size;
2116 /* doesn't fit - hand it off */
2117 return self->cb(self->userdata, data, size);
2121 =item i_gen_write_data_new(i_write_callback_t cb, char *userdata, int max_length)
2123 Allocates and initializes the data structure used by i_gen_writer.
2125 This should be released with L<image.c/i_free_gen_write_data>
2129 i_gen_write_data *i_gen_write_data_new(i_write_callback_t cb,
2130 char *userdata, int max_length)
2132 i_gen_write_data *self = mymalloc(sizeof(i_gen_write_data));
2134 self->userdata = userdata;
2135 self->maxlength = i_min(max_length, sizeof(self->buffer));
2136 if (self->maxlength < 0)
2137 self->maxlength = sizeof(self->buffer);
2144 =item i_free_gen_write_data(i_gen_write_data *info, int flush)
2146 Cleans up the write buffer.
2148 Will flush any left-over data if I<flush> is non-zero.
2150 Returns non-zero if flush is zero or if info->cb() returns non-zero.
2152 Return zero only if flush is non-zero and info->cb() returns zero.
2158 int i_free_gen_write_data(i_gen_write_data *info, int flush)
2160 int result = !flush ||
2161 info->filledto == 0 ||
2162 info->cb(info->userdata, info->buffer, info->filledto);
2168 struct magic_entry {
2169 unsigned char *magic;
2172 unsigned char *mask;
2176 test_magic(unsigned char *buffer, size_t length, struct magic_entry const *magic) {
2177 if (length < magic->magic_size)
2181 unsigned char *bufp = buffer,
2182 *maskp = magic->mask,
2183 *magicp = magic->magic;
2185 for (i = 0; i < magic->magic_size; ++i) {
2186 int mask = *maskp == 'x' ? 0xFF : *maskp == ' ' ? 0 : *maskp;
2189 if ((*bufp++ & mask) != (*magicp++ & mask))
2196 return !memcmp(magic->magic, buffer, magic->magic_size);
2201 =item i_test_format_probe(io_glue *data, int length)
2203 Check the beginning of the supplied file for a 'magic number'
2208 #define FORMAT_ENTRY(magic, type) \
2209 { (unsigned char *)(magic ""), sizeof(magic)-1, type }
2210 #define FORMAT_ENTRY2(magic, type, mask) \
2211 { (unsigned char *)(magic ""), sizeof(magic)-1, type, (unsigned char *)(mask) }
2214 i_test_format_probe(io_glue *data, int length) {
2215 static const struct magic_entry formats[] = {
2216 FORMAT_ENTRY("\xFF\xD8", "jpeg"),
2217 FORMAT_ENTRY("GIF87a", "gif"),
2218 FORMAT_ENTRY("GIF89a", "gif"),
2219 FORMAT_ENTRY("MM\0*", "tiff"),
2220 FORMAT_ENTRY("II*\0", "tiff"),
2221 FORMAT_ENTRY("BM", "bmp"),
2222 FORMAT_ENTRY("\x89PNG\x0d\x0a\x1a\x0a", "png"),
2223 FORMAT_ENTRY("P1", "pnm"),
2224 FORMAT_ENTRY("P2", "pnm"),
2225 FORMAT_ENTRY("P3", "pnm"),
2226 FORMAT_ENTRY("P4", "pnm"),
2227 FORMAT_ENTRY("P5", "pnm"),
2228 FORMAT_ENTRY("P6", "pnm"),
2229 FORMAT_ENTRY("/* XPM", "xpm"),
2230 FORMAT_ENTRY("\x8aMNG", "mng"),
2231 FORMAT_ENTRY("\x8aJNG", "jng"),
2232 /* SGI RGB - with various possible parameters to avoid false positives
2234 values are: 2 byte magic, rle flags (0 or 1), bytes/sample (1 or 2)
2236 FORMAT_ENTRY("\x01\xDA\x00\x01", "sgi"),
2237 FORMAT_ENTRY("\x01\xDA\x00\x02", "sgi"),
2238 FORMAT_ENTRY("\x01\xDA\x01\x01", "sgi"),
2239 FORMAT_ENTRY("\x01\xDA\x01\x02", "sgi"),
2241 FORMAT_ENTRY2("FORM ILBM", "ilbm", "xxxx xxxx"),
2243 /* different versions of PCX format
2244 http://www.fileformat.info/format/pcx/
2246 FORMAT_ENTRY("\x0A\x00\x01", "pcx"),
2247 FORMAT_ENTRY("\x0A\x02\x01", "pcx"),
2248 FORMAT_ENTRY("\x0A\x03\x01", "pcx"),
2249 FORMAT_ENTRY("\x0A\x04\x01", "pcx"),
2250 FORMAT_ENTRY("\x0A\x05\x01", "pcx"),
2252 /* FITS - http://fits.gsfc.nasa.gov/ */
2253 FORMAT_ENTRY("SIMPLE =", "fits"),
2255 /* PSD - Photoshop */
2256 FORMAT_ENTRY("8BPS\x00\x01", "psd"),
2258 /* EPS - Encapsulated Postscript */
2259 /* only reading 18 chars, so we don't include the F in EPSF */
2260 FORMAT_ENTRY("%!PS-Adobe-2.0 EPS", "eps"),
2263 FORMAT_ENTRY("\x52\xCC", "utah"),
2265 /* GZIP compressed, only matching deflate for now */
2266 FORMAT_ENTRY("\x1F\x8B\x08", "gzip"),
2268 /* bzip2 compressed */
2269 FORMAT_ENTRY("BZh", "bzip2"),
2271 static const struct magic_entry more_formats[] = {
2272 /* these were originally both listed as ico, but cur files can
2273 include hotspot information */
2274 FORMAT_ENTRY("\x00\x00\x01\x00", "ico"), /* Windows icon */
2275 FORMAT_ENTRY("\x00\x00\x02\x00", "cur"), /* Windows cursor */
2276 FORMAT_ENTRY2("\x00\x00\x00\x00\x00\x00\x00\x07",
2277 "xwd", " xxxx"), /* X Windows Dump */
2281 unsigned char head[18];
2284 io_glue_commit_types(data);
2285 rc = data->readcb(data, head, 18);
2286 if (rc == -1) return NULL;
2287 data->seekcb(data, -rc, SEEK_CUR);
2289 for(i=0; i<sizeof(formats)/sizeof(formats[0]); i++) {
2290 struct magic_entry const *entry = formats + i;
2292 if (test_magic(head, rc, entry))
2297 tga_header_verify(head))
2300 for(i=0; i<sizeof(more_formats)/sizeof(more_formats[0]); i++) {
2301 struct magic_entry const *entry = more_formats + i;
2303 if (test_magic(head, rc, entry))
2311 =item i_img_is_monochrome(img, &zero_is_white)
2313 Tests an image to check it meets our monochrome tests.
2315 The idea is that a file writer can use this to test where it should
2316 write the image in whatever bi-level format it uses, eg. pbm for pnm.
2318 For performance of encoders we require monochrome images:
2328 have a palette of two colors, containing only (0,0,0) and
2329 (255,255,255) in either order.
2333 zero_is_white is set to non-zero iff the first palette entry is white.
2339 i_img_is_monochrome(i_img *im, int *zero_is_white) {
2340 if (im->type == i_palette_type
2341 && i_colorcount(im) == 2) {
2343 i_getcolors(im, 0, colors, 2);
2344 if (im->channels == 3) {
2345 if (colors[0].rgb.r == 255 &&
2346 colors[0].rgb.g == 255 &&
2347 colors[0].rgb.b == 255 &&
2348 colors[1].rgb.r == 0 &&
2349 colors[1].rgb.g == 0 &&
2350 colors[1].rgb.b == 0) {
2354 else if (colors[0].rgb.r == 0 &&
2355 colors[0].rgb.g == 0 &&
2356 colors[0].rgb.b == 0 &&
2357 colors[1].rgb.r == 255 &&
2358 colors[1].rgb.g == 255 &&
2359 colors[1].rgb.b == 255) {
2364 else if (im->channels == 1) {
2365 if (colors[0].channel[0] == 255 &&
2366 colors[1].channel[0] == 0) {
2370 else if (colors[0].channel[0] == 0 &&
2371 colors[1].channel[0] == 255) {
2383 =item i_get_file_background(im, &bg)
2385 Retrieve the file write background color tag from the image.
2387 If not present, returns black.
2393 i_get_file_background(i_img *im, i_color *bg) {
2394 if (!i_tags_get_color(&im->tags, "i_background", 0, bg)) {
2396 bg->channel[0] = bg->channel[1] = bg->channel[2] = 0;
2398 /* always full alpha */
2399 bg->channel[3] = 255;
2403 =item i_get_file_backgroundf(im, &bg)
2405 Retrieve the file write background color tag from the image as a
2406 floating point color.
2408 Implemented in terms of i_get_file_background().
2410 If not present, returns black.
2416 i_get_file_backgroundf(i_img *im, i_fcolor *fbg) {
2419 i_get_file_background(im, &bg);
2420 fbg->rgba.r = Sample8ToF(bg.rgba.r);
2421 fbg->rgba.g = Sample8ToF(bg.rgba.g);
2422 fbg->rgba.b = Sample8ToF(bg.rgba.b);
2431 Arnar M. Hrafnkelsson <addi@umich.edu>
2433 Tony Cook <tony@develop-help.com>