- #3, gdImageRectanle draws the corners twice

master
pajoye 2006-09-28 08:16:30 +00:00
parent 44bbfebf7a
commit 4d52bd1fa9
3 changed files with 88 additions and 24 deletions

View File

@ -2,5 +2,7 @@ GDBUGS NEWS
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#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)

View File

@ -1871,33 +1871,75 @@ skip: for (x++; x<=x2 && (pts[y][x] || gdImageGetPixel(im,x, y)!=oc); x++);
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 (y1 < y2)
{
y1v = y1h - half;
y2v = y2h + half1 - 1;
}
else
{
y1v = y1h + half1 - 1;
y2v = y2h - half;
}
}
if (y2 < y1) {
t=y1;
y1 = y2;
y2 = t;
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);
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);
}
}
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);
}
}
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,

20
src/tests/bug00003.c Normal file
View File

@ -0,0 +1,20 @@
#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;
}