]> granicus.if.org Git - imagemagick/commitdiff
Support ellipses for radial gradient
authorCristy <urban-warrior@imagemagick.org>
Sun, 18 Oct 2015 12:31:57 +0000 (08:31 -0400)
committerCristy <urban-warrior@imagemagick.org>
Sun, 18 Oct 2015 12:31:57 +0000 (08:31 -0400)
MagickCore/draw.c
MagickCore/draw.h
MagickCore/paint.c

index 9cd8d1555754d1d0d4897d36a28493b346d8ef05..56c6e642e25e93db4a886cacbf2093a913983941 100644 (file)
@@ -3236,20 +3236,18 @@ static inline double GetStopColorOffset(const GradientInfo *gradient,
     }
     case RadialGradient:
     {
-      double
-        length,
-        offset;
-
       PointInfo
         v;
 
-      v.x=(double) x-gradient->center.x;
-      v.y=(double) y-gradient->center.y;
-      length=sqrt(v.x*v.x+v.y*v.y);
       if (gradient->spread == RepeatSpread)
-        return(length);
-      offset=length/gradient->radius;
-      return(offset);
+        {
+          v.x=(double) x-gradient->center.x;
+          v.y=(double) y-gradient->center.y;
+          return(sqrt(v.x*v.x+v.y*v.y));
+        }
+      v.x=(double) (x-gradient->center.x)/gradient->radii.x;
+      v.y=(double) (y-gradient->center.y)/gradient->radii.y;
+      return(sqrt(v.x*v.x+v.y*v.y));
     }
   }
   return(0.0);
@@ -3263,7 +3261,6 @@ static int StopInfoCompare(const void *x,const void *y)
 
   stop_1=(StopInfo *) x;
   stop_2=(StopInfo *) y;
-  
   if (stop_1->offset > stop_2->offset)
     return(1);
   if (fabs(stop_1->offset-stop_2->offset) <= MagickEpsilon)
index ffdc7eb020e8ee2ddda44667a897f01614b90c57..11d3968ecc6bbed2b0dc42391e3cb86c21b5e573 100644 (file)
@@ -167,7 +167,8 @@ typedef struct _GradientInfo
     debug;
 
   PointInfo
-    center;
+    center,
+    radii;
 
   double
     radius;
index 806cb3679c353f34dea4a490327b72b61b25380b..42ce1645744c5e2cda8eb1b7602a95b08dc46c7b 100644 (file)
@@ -570,10 +570,13 @@ MagickExport MagickBooleanType GradientImage(Image *image,
   if (artifact != (const char *) NULL)
     (void) sscanf(artifact,"%lf%*[ ,]%lf",&gradient->center.x,
       &gradient->center.y);
-  gradient->radius=MagickMax(gradient->center.x,gradient->center.y);
+  gradient->radii.x=MagickMax(gradient->center.x,gradient->center.y);
+  gradient->radii.y=MagickMax(gradient->center.x,gradient->center.y);
   artifact=GetImageArtifact(image,"gradient:radius");
   if (artifact != (const char *) NULL)
-    gradient->radius=StringToDouble(artifact,(char **) NULL);
+    (void) sscanf(artifact,"%lf%*[ ,]%lf",&gradient->radii.x,
+      &gradient->radii.y);
+  gradient->radius=MagickMax(gradient->radii.x,gradient->radii.y);
   gradient->spread=method;
   /*
     Define the gradient to fill between the stops.