]> granicus.if.org Git - imagemagick/commitdiff
...
authorCristy <urban-warrior@imagemagick.org>
Fri, 2 Mar 2018 20:36:47 +0000 (15:36 -0500)
committerCristy <urban-warrior@imagemagick.org>
Fri, 2 Mar 2018 20:36:47 +0000 (15:36 -0500)
MagickCore/draw.c

index 1009ed563bea15000f5ef1d6a6fc13efedbb11dc..048430b0847122fa0a3754cd5545bfb345bc6039 100644 (file)
@@ -1656,6 +1656,46 @@ static MagickBooleanType DrawDashPolygon(const DrawInfo *draw_info,
 %
 */
 
+static size_t EllipsePoints(const PrimitiveInfo *primitive_info,
+  const PointInfo start,const PointInfo stop,const PointInfo degrees)
+{
+  double
+    delta,
+    step,
+    y;
+
+  PointInfo
+    angle;
+
+  register const PrimitiveInfo
+    *p;
+
+  size_t
+    number_points;
+
+  /*
+    Ellipses are just short segmented polys.
+  */
+  if ((fabs(stop.x) < DrawEpsilon) && (fabs(stop.y) < DrawEpsilon))
+    return(1);
+  delta=2.0/MagickMax(stop.x,stop.y);
+  step=MagickPI/8.0;
+  if ((delta >= 0.0) && (delta < (MagickPI/8.0)))
+    step=MagickPI/(4*(MagickPI/delta/2+0.5));
+  angle.x=DegreesToRadians(degrees.x);
+  y=degrees.y;
+  while (y < degrees.x)
+    y+=360.0;
+  angle.y=DegreesToRadians(y);
+  number_points=0;
+  for (p=primitive_info; angle.x < angle.y; angle.x+=step)
+  {
+    number_points++;
+    p+=p->coordinates;
+  }
+  return(number_points+1);
+}
+
 static inline MagickBooleanType IsPoint(const char *point)
 {
   char
@@ -3054,7 +3094,6 @@ MagickExport MagickBooleanType DrawImage(Image *image,const DrawInfo *draw_info,
       }
       case CirclePrimitive:
       case ArcPrimitive:
-      case EllipsePrimitive:
       {
         double
           alpha,
@@ -3076,6 +3115,13 @@ MagickExport MagickBooleanType DrawImage(Image *image,const DrawInfo *draw_info,
         points_extent=coordinates;
         break;
       }
+      case EllipsePrimitive:
+      {
+        points_extent=(double) EllipsePoints(primitive_info+j,
+          primitive_info[j].point,primitive_info[j+1].point,
+          primitive_info[j+2].point);
+        break;
+      }
       default:
         break;
     }