root/ext/gd/libgd/gd_color.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. gdImageColorMatch

   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  */
  15 int 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 * im2->colorsTotal, 0);
  37         memset( buf, 0, sizeof(unsigned long) * 5 * im2->colorsTotal );
  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 

/* [<][>][^][v][top][bottom][index][help] */