1 #if HAVE_GD_BUNDLED 2 # include "gd.h" 3 # include "gdhelpers.h" 4 #else 5 # include <gd.h> 6 # include "libgd/gdhelpers.h" 7 #endif 8 9 #include "gd_intern.h" 10 #include "php.h" 11 12 /* bring the palette colors in im2 to be closer to im1 13 * 14 */ gdImageColorMatch(gdImagePtr im1,gdImagePtr im2)15int gdImageColorMatch (gdImagePtr im1, gdImagePtr im2) 16 { 17 unsigned long *buf; /* stores our calculations */ 18 unsigned long *bp; /* buf ptr */ 19 int color, rgb; 20 int x,y; 21 int count; 22 23 if( !im1->trueColor ) { 24 return -1; /* im1 must be True Color */ 25 } 26 if( im2->trueColor ) { 27 return -2; /* im2 must be indexed */ 28 } 29 if( (im1->sx != im2->sx) || (im1->sy != im2->sy) ) { 30 return -3; /* the images are meant to be the same dimensions */ 31 } 32 if (im2->colorsTotal<1) { 33 return -4; /* At least 1 color must be allocated */ 34 } 35 36 buf = (unsigned long *)safe_emalloc(sizeof(unsigned long), 5 * gdMaxColors, 0); 37 memset( buf, 0, sizeof(unsigned long) * 5 * gdMaxColors ); 38 39 for (x=0; x<im1->sx; x++) { 40 for( y=0; y<im1->sy; y++ ) { 41 color = im2->pixels[y][x]; 42 rgb = im1->tpixels[y][x]; 43 bp = buf + (color * 5); 44 (*(bp++))++; 45 *(bp++) += gdTrueColorGetRed(rgb); 46 *(bp++) += gdTrueColorGetGreen(rgb); 47 *(bp++) += gdTrueColorGetBlue(rgb); 48 *(bp++) += gdTrueColorGetAlpha(rgb); 49 } 50 } 51 bp = buf; 52 for (color=0; color<im2->colorsTotal; color++) { 53 count = *(bp++); 54 if( count > 0 ) { 55 im2->red[color] = *(bp++) / count; 56 im2->green[color] = *(bp++) / count; 57 im2->blue[color] = *(bp++) / count; 58 im2->alpha[color] = *(bp++) / count; 59 } else { 60 bp += 4; 61 } 62 } 63 gdFree(buf); 64 return 0; 65 } 66 67 68