Commits

pajoye  committed 4d52bd1

- #3, gdImageRectanle draws the corners twice

  • Participants
  • Parent commits 44bbfeb

Comments (0)

Files changed (3)

 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
 #1, Initialize values this also provides a 5x speedup in the imagefttext.phpt 
     test, because without this patch it never got cache hits (Nuno Lopes)
-#2, imagefill, multiple segfaults with complex patterns, transparent colors
+#2, gdImageFill, multiple segfaults with complex patterns, transparent colors
   or invalid color index
+#3, gdImageRectangle draws corners twice (affects rectangles with alpha 
+    channel)
 	gdFree(stack);
 }
 
-
 BGD_DECLARE(void) gdImageRectangle (gdImagePtr im, int x1, int y1, int x2, int y2, int color)
 {
-  int x1h = x1, x1v = x1, y1h = y1, y1v = y1, x2h = x2, x2v = x2, y2h = y2,
-    y2v = y2;
-  int thick = im->thick;
-  if (thick > 1)
-    {
-      int half = thick / 2;
-      int half1 = thick - half;
+	int x1h = x1, x1v = x1, y1h = y1, y1v = y1, x2h = x2, x2v = x2, y2h = y2, y2v = y2;
+	int thick = im->thick;
+	int half1 = 1;
+	int t;
+
+	if (y2 < y1) {
+		t=y1;
+		y1 = y2;
+		y2 = t;
+
+		t = x1;
+		x1 = x2;
+		x2 = t;
+	}
+
+	x1h = x1; x1v = x1; y1h = y1; y1v = y1; x2h = x2; x2v = x2; y2h = y2; y2v = y2;
+	if (thick > 1) {
+		int cx, cy, x1ul, y1ul, x2lr, y2lr;
+		int half = thick >> 1;
+		half1 = thick - half;
+		x1ul = x1 - half;
+		y1ul = y1 - half;
+		
+		x2lr = x2 + half;
+		y2lr = y2 + half;
+
+		cy = y1ul + thick;
+		while (cy-- > y1ul) {
+			cx = x1ul - 1;
+			while (cx++ < x2lr) {
+				gdImageSetPixel(im, cx, cy, color);
+			}
+		}
 
-      if (y1 < y2)
-	{
-	  y1v = y1h - half;
-	  y2v = y2h + half1 - 1;
-	}
-      else
-	{
-	  y1v = y1h + half1 - 1;
-	  y2v = y2h - half;
-	}
-    }
+		cy = y2lr - thick;
+		while (cy++ < y2lr) {
+			cx = x1ul - 1;
+			while (cx++ < x2lr) {
+				gdImageSetPixel(im, cx, cy, color);
+			}
+		}
+
+		cy = y1ul + thick - 1;
+		while (cy++ < y2lr -thick) {
+			cx = x1ul - 1;
+			while (cx++ < x1ul + thick) {
+				gdImageSetPixel(im, cx, cy, color);
+			}
+		}
 
-  gdImageLine (im, x1h, y1h, x2h, y1h, color);
-  gdImageLine (im, x1h, y2h, x2h, y2h, color);
-  gdImageLine (im, x1v, y1v, x1v, y2v, color);
-  gdImageLine (im, x2v, y1v, x2v, y2v, color);
+		cy = y1ul + thick - 1;
+		while (cy++ < y2lr -thick) {
+			cx = x2lr - thick - 1;
+			while (cx++ < x2lr) {
+				gdImageSetPixel(im, cx, cy, color);
+			}
+		}
+
+		return;
+	} else {
+		y1v = y1h + 1;
+		y2v = y2h - 1;
+		gdImageLine(im, x1h, y1h, x2h, y1h, color);
+		gdImageLine(im, x1h, y2h, x2h, y2h, color);
+		gdImageLine(im, x1v, y1v, x1v, y2v, color);
+		gdImageLine(im, x2v, y1v, x2v, y2v, color);
+	}
 }
 
 BGD_DECLARE(void) gdImageFilledRectangle (gdImagePtr im, int x1, int y1, int x2, int y2,

File src/tests/bug00003.c

+#include "gd.h"
+
+int main()
+{
+ 	gdImagePtr im;
+	FILE *fp;
+
+
+	im = gdImageCreateTrueColor(100,100);
+	gdImageRectangle(im, 2,2, 80,95, 0x50FFFFFF);
+	fp = fopen("a.png", "wb");
+ 	/* Write img to stdout */
+ 	gdImagePng(im,fp);
+	fclose(fp);
+
+ 	/* Destroy it */
+ 	gdImageDestroy(im);
+
+ 	return 0;
+}