- #4, gdImageFill rewrite fix, small images (< 4 pixels) crash

master
pajoye 2007-01-20 02:09:37 +00:00
parent 5cc903a073
commit 3aea4c25df
1 changed files with 27 additions and 0 deletions

View File

@ -1835,6 +1835,7 @@ BGD_DECLARE(void) gdImageFill(gdImagePtr im, int x, int y, int nc)
alphablending_bak = im->alphaBlendingFlag;
im->alphaBlendingFlag = 0;
if (nc==gdTiled) {
_gdImageFillTiled(im,x,y,nc);
im->alphaBlendingFlag = alphablending_bak;
@ -1848,6 +1849,29 @@ BGD_DECLARE(void) gdImageFill(gdImagePtr im, int x, int y, int nc)
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 @@ skip: for (x++; x<=x2 && (gdImageGetPixel(im, x, y)!=oc); x++);
l = x;
} while (x<=x2);
}
gdFree(stack);
done:
im->alphaBlendingFlag = alphablending_bak;
}