cvs: gd /libgd gd.c
[email protected] ("Pierre-Alain Joye")
| Newsgroups | php.gd.cvs |
|---|---|
| Message-ID | <cvspajoye1169258977@cvsserver> |
pajoye Sat Jan 20 02:09:37 2007 UTC
Modified files:
/gd/libgd gd.c
Log:
- #4, gdImageFill rewrite fix, small images (< 4 pixels) crash
http://cvs.php.net/viewvc.cgi/gd/libgd/gd.c?r1=1.47&r2=1.48&diff_format=u
Index: gd/libgd/gd.c
diff -u gd/libgd/gd.c:1.47 gd/libgd/gd.c:1.48
--- gd/libgd/gd.c:1.47 Sat Jan 20 02:02:35 2007
+++ gd/libgd/gd.c Sat Jan 20 02:09:37 2007
@@ -1,4 +1,4 @@
-/* $Id: gd.c,v 1.47 2007/01/20 02:02:35 pajoye Exp $ */
+/* $Id: gd.c,v 1.48 2007/01/20 02:09:37 pajoye Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
@@ -1835,6 +1835,7 @@
alphablending_bak = im->alphaBlendingFlag;
im->alphaBlendingFlag = 0;
+
if (nc==gdTiled) {
_gdImageFillTiled(im,x,y,nc);
im->alphaBlendingFlag = alphablending_bak;
@@ -1848,6 +1849,29 @@
return;
}
+ /* Do not use the 4 neighbors implementation with
+ * small images
+ */
+ if (im->sx < 4) {
+ int ix = x, iy = y, c;
+ do {
+ c = gdImageGetPixel(im, ix, iy);
+ if (c != oc) {
+ goto done;
+ }
+ gdImageSetPixel(im, ix, iy, nc);
+ } while(ix++ < (im->sx -1));
+ ix = x; iy = y + 1;
+ do {
+ c = gdImageGetPixel(im, ix, iy);
+ if (c != oc) {
+ goto done;
+ }
+ gdImageSetPixel(im, ix, iy, nc);
+ } while(ix++ < (im->sx -1));
+ goto done;
+ }
+
stack = (struct seg *)gdMalloc(sizeof(struct seg) * ((int)(im->sy*im->sx)/4));
if (!stack) {
return;
@@ -1888,7 +1912,10 @@
l = x;
} while (x<=x2);
}
+
gdFree(stack);
+
+done:
im->alphaBlendingFlag = alphablending_bak;
}