- #3, gdImageRectanle draws the corners twice
parent
44bbfebf7a
commit
4d52bd1fa9
|
@ -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)
|
||||
|
|
88
src/gd.c
88
src/gd.c
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
}
|
Loading…
Reference in New Issue