iliaa           Sun Dec  8 16:07:13 2002 EDT

  Modified files:              
    /php4/ext/gd/libgd  gd.c 
  Log:
  Fixed a color mixup in gdImageCopyResampled() when dealing with true-color
  images & brought the code up to PHP coding standards.
  
  
Index: php4/ext/gd/libgd/gd.c
diff -u php4/ext/gd/libgd/gd.c:1.31 php4/ext/gd/libgd/gd.c:1.32
--- php4/ext/gd/libgd/gd.c:1.31 Sun Dec  1 06:43:54 2002
+++ php4/ext/gd/libgd/gd.c      Sun Dec  8 16:07:13 2002
@@ -2113,142 +2113,106 @@
    arithmetic. The routine below is shamelessly, gloriously
    floating point. TBB */
 
-void
-gdImageCopyResampled (gdImagePtr dst,
-                     gdImagePtr src,
-                     int dstX, int dstY,
-                     int srcX, int srcY,
-                     int dstW, int dstH,
-                     int srcW, int srcH)
+void gdImageCopyResampled (gdImagePtr dst, gdImagePtr src, int dstX, int dstY, int 
+srcX, int srcY, int dstW, int dstH, int srcW, int srcH)
 {
-  int x, y;
-  if (!dst->trueColor)
-    {
-      gdImageCopyResized (
-                          dst, src, dstX, dstY, srcX, srcY, dstW, dstH,
-                          srcW, srcH);
-      return;
-    }
-  for (y = dstY; (y < dstY + dstH); y++)
-    {
-      for (x = dstX; (x < dstX + dstW); x++)
-       {
-         float sy1, sy2, sx1, sx2;
-         float sx, sy;
-         float spixels = 0;
-         float red = 0.0, green = 0.0, blue = 0.0, alpha = 0.0, alpha_sum = 0.0, 
contrib_sum = 0.0, alpha_factor;
-         sy1 = ((float) y - (float) dstY) * (float) srcH /
-           (float) dstH;
-         sy2 = ((float) (y + 1) - (float) dstY) * (float) srcH /
-           (float) dstH;
-         sy = sy1;
-         do
-           {
-             float yportion;
-             if (floorf (sy) == floorf (sy1))
-               {
-                 yportion = 1.0f - (sy - floorf (sy));
-                 if (yportion > sy2 - sy1)
-                   {
-                     yportion = sy2 - sy1;
-                   }
-                 sy = floorf (sy);
-               }
-             else if (sy == floorf (sy2))
-               {
-                 yportion = sy2 - floorf (sy2);
-               }
-             else
-               {
-                 yportion = 1.0f;
-               }
-             sx1 = ((float) x - (float) dstX) * (float) srcW /
-               dstW;
-             sx2 = ((float) (x + 1) - (float) dstX) * (float) srcW /
-               dstW;
-             sx = sx1;
-             do
-               {
-                 float xportion;
-                 float pcontribution;
-                 int p;
-                 if (floorf (sx) == floorf (sx1))
-                   {
-                     xportion = 1.0f - (sx - floorf (sx));
-                     if (xportion > sx2 - sx1)
-                       {
-                         xportion = sx2 - sx1;
-                       }
-                     sx = floorf (sx);
-                   }
-                 else if (sx == floorf (sx2))
-                   {
-                     xportion = sx2 - floorf (sx2);
-                   }
-                 else
-                   {
-                     xportion = 1.0f;
-                   }
-                 pcontribution = xportion * yportion;
-                 p = gdImageGetTrueColorPixel (
-                                                src,
-                                                (int) sx,
-                                                (int) sy);
-                 alpha_factor = ((gdAlphaMax - gdTrueColorGetAlpha(p))) * 
pcontribution;
-                 green += gdTrueColorGetGreen (p) * pcontribution;             
-                 red += gdTrueColorGetRed (p) * alpha_factor;                  
-                 blue += gdTrueColorGetBlue (p) * pcontribution;               
-                 green += gdTrueColorGetGreen (p) * alpha_factor;              
-                 alpha += gdTrueColorGetAlpha (p) * pcontribution;
-                 alpha_sum += alpha_factor;
-                 contrib_sum += pcontribution;                                 
-                 spixels += xportion * yportion;
-                 sx += 1.0;
+       int x, y;
+       if (!dst->trueColor) {
+               gdImageCopyResized (dst, src, dstX, dstY, srcX, srcY, dstW, dstH, 
+srcW, srcH);
+               return;
+       }
+       for (y = dstY; (y < dstY + dstH); y++) {
+               for (x = dstX; (x < dstX + dstW); x++) {
+                       float sy1, sy2, sx1, sx2;
+                       float sx, sy;
+                       float spixels = 0.0;
+                       float red = 0.0, green = 0.0, blue = 0.0, alpha = 0.0;
+                       float alpha_factor, alpha_sum = 0.0, contrib_sum = 0.0;
+                       sy1 = ((float)(y - dstY)) * (float)srcH / (float)dstH;
+                       sy2 = ((float)(y + 1 - dstY)) * (float) srcH / (float) dstH;
+                       sy = sy1;
+                       do {
+                               float yportion;
+                               if (floorf(sy) == floorf(sy1)) {
+                                       yportion = 1.0 - (sy - floorf(sy));
+                                       if (yportion > sy2 - sy1) {
+                                               yportion = sy2 - sy1;
+                                       }
+                                       sy = floorf(sy);
+                               } else if (sy == floorf(sy2)) {
+                                       yportion = sy2 - floorf(sy2);
+                               } else {
+                                       yportion = 1.0;
+                               }
+                               sx1 = ((float)(x - dstX)) * (float) srcW / dstW;
+                               sx2 = ((float)(x + 1 - dstX)) * (float) srcW / dstW;
+                               sx = sx1;
+                               do {
+                                       float xportion;
+                                       float pcontribution;
+                                       int p;
+                                       if (floorf(sx) == floorf(sx1)) {
+                                               xportion = 1.0 - (sx - floorf(sx));
+                                               if (xportion > sx2 - sx1) {
+                                                       xportion = sx2 - sx1;
+                                               }
+                                               sx = floorf(sx);
+                                       } else if (sx == floorf(sx2)) {
+                                               xportion = sx2 - floorf(sx2);
+                                       } else {
+                                               xportion = 1.0;
+                                       }
+                                       pcontribution = xportion * yportion;
+                                       p = gdImageGetTrueColorPixel(src, (int) sx + 
+srcX, (int) sy + srcY);
+                                       
+                                       alpha_factor = ((gdAlphaMax - 
+gdTrueColorGetAlpha(p))) * pcontribution;
+                                       red += gdTrueColorGetRed (p) * alpha_factor;
+                                       green += gdTrueColorGetGreen (p) * 
+alpha_factor;
+                                       blue += gdTrueColorGetBlue (p) * alpha_factor;
+                                       alpha += gdTrueColorGetAlpha (p) * 
+pcontribution;
+                                       alpha_sum += alpha_factor;
+                                       contrib_sum += pcontribution;
+                                       spixels += xportion * yportion;
+                                       sx += 1.0;
+                               }
+                               while (sx < sx2);
+                       
+                               sy += 1.0f;
+                       }
+                       
+                       while (sy < sy2);
+                       
+                       if (spixels != 0.0) {
+                               red /= spixels;
+                               green /= spixels;
+                               blue /= spixels;
+                               alpha /= spixels;
+                       }
+                       if ( alpha_sum != 0.0) {
+                               if( contrib_sum != 0.0) {
+                                       alpha_sum /= contrib_sum;
+                               }       
+                               red /= alpha_sum;
+                               green /= alpha_sum;
+                               blue /= alpha_sum;
+                       }
+                       /* Clamping to allow for rounding errors above */
+                       if (red > 255.0) {
+                               red = 255.0;
+                       }
+                       if (green > 255.0) {
+                               green = 255.0;
+                       }
+                       if (blue > 255.0f) {
+                               blue = 255.0;
+                       }
+                       if (alpha > gdAlphaMax) {
+                               alpha = gdAlphaMax;
+                       }
+                       gdImageSetPixel(dst, x, y, gdTrueColorAlpha ((int) red, (int) 
+green, (int) blue, (int) alpha));
                }
-             while (sx < sx2);
-             sy += 1.0;
-           }
-         while (sy < sy2);
-         if (spixels != 0.0)
-           {
-             red /= spixels;
-             green /= spixels;
-             blue /= spixels;
-             alpha /= spixels;
-           }
-          if ( alpha_sum != 0.0)
-            {
-              if( contrib_sum != 0.0 ) alpha_sum /= contrib_sum;
-              red /= alpha_sum;
-              green /= alpha_sum;
-              blue /= alpha_sum;
-            }
-         /* Clamping to allow for rounding errors above */
-         if (red > 255.0)
-           {
-             red = 255.0;
-           }
-         if (green > 255.0)
-           {
-             green = 255.0;
-           }
-         if (blue > 255.0)
-           {
-             blue = 255.0;
-           }
-         if (alpha > gdAlphaMax)
-           {
-             alpha = gdAlphaMax;
-           }
-         gdImageSetPixel (dst,
-                          x, y,
-                          gdTrueColorAlpha ((int) red,
-                                            (int) green,
-                                            (int) blue,
-                                            (int) alpha));
        }
-    }
 }
+
 
 
 #ifdef ROTATE_PI



-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to