pajoye Sat Feb 8 03:54:13 2003 EDT Modified files: (Branch: PHP_4_3) /php4/ext/gd/libgd gd.c gd.h Log: MFH: Add gdImageEllipse Replace gdImageFilledEllipse by a new function (backported from the new phpgd) the new gdImageFilledEllipse fix bug bug #22103 (ellipse part) Index: php4/ext/gd/libgd/gd.c diff -u php4/ext/gd/libgd/gd.c:1.24.2.2 php4/ext/gd/libgd/gd.c:1.24.2.3 --- php4/ext/gd/libgd/gd.c:1.24.2.2 Thu Jan 9 21:00:52 2003 +++ php4/ext/gd/libgd/gd.c Sat Feb 8 03:54:11 2003 @@ -1338,7 +1338,11 @@ void gdImageArc (gdImagePtr im, int cx, int cy, int w, int h, int s, int e, int color) { - gdImageFilledArc (im, cx, cy, w, h, s, e, color, gdNoFill); + if( (s%360)==(e%360) ){ + gdImageEllipse(im, cx, cy, w, h, color); + } else { + gdImageFilledArc (im, cx, cy, w, h, s, e, color, gdNoFill); + } } void @@ -1424,10 +1428,102 @@ } } -void -gdImageFilledEllipse (gdImagePtr im, int cx, int cy, int w, int h, int color) +/** + * Integer Ellipse functions (gdImageEllipse and gdImageFilledEllipse) + * Function added by Pierre-Alain Joye 02/08/2003 ([EMAIL PROTECTED]) + * See the ellipse function simplification for the equation + * as well as the midpoint algorithm. + */ + +void gdImageEllipse(gdImagePtr im, int mx, int my, int w, int h, int c) +{ + int x=0,mx1=0,mx2=0,my1=0,my2=0; + long aq,bq,dx,dy,r,rx,ry,a,b; + + a=w>>1; + b=h>>1; + gdImageSetPixel(im,mx+a, my, c); + gdImageSetPixel(im,mx-a, my, c); + mx1 = mx-a;my1 = my; + mx2 = mx+a;my2 = my; + + aq = a * a; + bq = b * b; + dx = aq << 1; + dy = bq << 1; + r = a * bq; + rx = r << 1; + ry = 0; + x = a; + while (x > 0){ + if (r > 0) { + my1++;my2--; + ry +=dx; + r -=ry; + } + if (r <= 0){ + x--; + mx1++;mx2--; + rx -=dy; + r +=rx; + } + gdImageSetPixel(im,mx1, my1, c); + gdImageSetPixel(im,mx1, my2, c); + gdImageSetPixel(im,mx2, my1, c); + gdImageSetPixel(im,mx2, my2, c); + } +} + +void gdImageFilledEllipse (gdImagePtr im, int mx, int my, int w, int h, int c) { - gdImageFilledArc (im, cx, cy, w, h, 0, 360, color, gdPie); + int x=0,mx1=0,mx2=0,my1=0,my2=0; + long aq,bq,dx,dy,r,rx,ry,a,b; + int i; + int old_y1,old_y2; + + a=w>>1; + b=h>>1; + + gdImageLine(im, mx-a, my, mx+a, my, c); + + mx1 = mx-a;my1 = my; + mx2 = mx+a;my2 = my; + + aq = a * a; + bq = b * b; + dx = aq << 1; + dy = bq << 1; + r = a * bq; + rx = r << 1; + ry = 0; + x = a; + old_y2=-1; + old_y1=-1; + while (x > 0){ + if (r > 0) { + my1++;my2--; + ry +=dx; + r -=ry; + } + if (r <= 0){ + x--; + mx1++;mx2--; + rx -=dy; + r +=rx; + } + if(old_y2!=my2){ + for(i=mx1;i<=mx2;i++){ + gdImageSetPixel(im,i,my1,c); + } + } + if(old_y2!=my2){ + for(i=mx1;i<=mx2;i++){ + gdImageSetPixel(im,i,my2,c); + } + } + old_y2 = my2; + old_y1 = my1; + } } void Index: php4/ext/gd/libgd/gd.h diff -u php4/ext/gd/libgd/gd.h:1.7.2.2 php4/ext/gd/libgd/gd.h:1.7.2.3 --- php4/ext/gd/libgd/gd.h:1.7.2.2 Sun Jan 5 19:47:47 2003 +++ php4/ext/gd/libgd/gd.h Sat Feb 8 03:54:11 2003 @@ -411,7 +411,7 @@ /* Best to free this memory with gdFree(), not free() */ void* gdImageGd2Ptr(gdImagePtr im, int cs, int fmt, int *size); -void gdImageEllipse(gdImagePtr im, int cx, int cy, int w, int h, int color); +void gdImageEllipse(gdImagePtr im, int cx, int cy, int w, int h, int c); /* Style is a bitwise OR ( | operator ) of these. gdArc and gdChord are mutually exclusive;
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php