]> granicus.if.org Git - php/commitdiff
MFB: sync with libgd: improve _gdImageFillTiled()
authorNuno Lopes <nlopess@php.net>
Fri, 15 Jun 2007 19:50:05 +0000 (19:50 +0000)
committerNuno Lopes <nlopess@php.net>
Fri, 15 Jun 2007 19:50:05 +0000 (19:50 +0000)
ext/gd/libgd/gd.c

index 30e0d78e2d371890646ec3fba94b32f79d31dbf7..8e154182c4ccf6550254418640116c901ed7c570 100644 (file)
@@ -1941,7 +1941,7 @@ struct seg {int y, xl, xr, dy;};
 #define FILL_POP(Y, XL, XR, DY) \
     {sp--; Y = sp->y+(DY = sp->dy); XL = sp->xl; XR = sp->xr;}
 
-void _gdImageFillTiled(gdImagePtr im, int x, int y, int nc);
+static void _gdImageFillTiled(gdImagePtr im, int x, int y, int nc);
 
 void gdImageFill(gdImagePtr im, int x, int y, int nc)
 {
@@ -2042,16 +2042,16 @@ done:
        im->alphaBlendingFlag = alphablending_bak;      
 }
 
-void _gdImageFillTiled(gdImagePtr im, int x, int y, int nc)
+static void _gdImageFillTiled(gdImagePtr im, int x, int y, int nc)
 {
-       int i,l, x1, x2, dy;
+       int l, x1, x2, dy;
        int oc;   /* old pixel value */
        int tiled;
        int wx2,wy2;
        /* stack of filled segments */
        struct seg *stack;
        struct seg *sp;
-       char **pts;
+       char *pts;
 
        if (!im->tile) {
                return;
@@ -2061,11 +2061,7 @@ void _gdImageFillTiled(gdImagePtr im, int x, int y, int nc)
        tiled = nc==gdTiled;
 
        nc =  gdImageTileGet(im,x,y);
-       pts = (char **) ecalloc(im->sy, sizeof(char*));
-
-       for (i=0; i<im->sy;i++) {
-               pts[i] = (char *) ecalloc(im->sx, sizeof(char));
-       }
+       pts = (char *) ecalloc(im->sy * im->sx, sizeof(char));
 
        stack = (struct seg *)safe_emalloc(sizeof(struct seg), ((int)(im->sy*im->sx)/4), 1);
        sp = stack;
@@ -2078,9 +2074,9 @@ void _gdImageFillTiled(gdImagePtr im, int x, int y, int nc)
        FILL_PUSH(y+1, x, x, -1);
        while (sp>stack) {
                FILL_POP(y, x1, x2, dy);
-               for (x=x1; x>=0 && (!pts[y][x] && gdImageGetPixel(im,x,y)==oc); x--) {
+               for (x=x1; x>=0 && (!pts[y + x*wx2] && gdImageGetPixel(im,x,y)==oc); x--) {
                        nc = gdImageTileGet(im,x,y);
-                       pts[y][x]=1;
+                       pts[y + x*wx2]=1;
                        gdImageSetPixel(im,x, y, nc);
                }
                if (x>=x1) {
@@ -2094,9 +2090,9 @@ void _gdImageFillTiled(gdImagePtr im, int x, int y, int nc)
                }
                x = x1+1;
                do {
-                       for (; x<wx2 && (!pts[y][x] && gdImageGetPixel(im,x, y)==oc) ; x++) {
+                       for (; x<wx2 && (!pts[y + x*wx2] && gdImageGetPixel(im,x, y)==oc) ; x++) {
                                nc = gdImageTileGet(im,x,y);
-                               pts[y][x]=1;
+                               pts[y + x*wx2]=1;
                                gdImageSetPixel(im, x, y, nc);
                        }
                        FILL_PUSH(y, l, x-1, dy);
@@ -2104,13 +2100,11 @@ void _gdImageFillTiled(gdImagePtr im, int x, int y, int nc)
                        if (x>x2+1) {
                                FILL_PUSH(y, x2+1, x-1, -dy);
                        }
-skip:                  for (x++; x<=x2 && (pts[y][x] || gdImageGetPixel(im,x, y)!=oc); x++);
+skip:                  for (x++; x<=x2 && (pts[y + x*wx2] || gdImageGetPixel(im,x, y)!=oc); x++);
                        l = x;
                } while (x<=x2);
        }
-       for (i=0; i<im->sy;i++) {
-               efree(pts[i]);
-       }
+
        efree(pts);
        efree(stack);
 }