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

Reply via email to