]> granicus.if.org Git - imagemagick/commitdiff
Add support for gradient:extent define
authorCristy <urban-warrior@imagemagick.org>
Mon, 19 Oct 2015 12:33:32 +0000 (08:33 -0400)
committerCristy <urban-warrior@imagemagick.org>
Mon, 19 Oct 2015 12:33:32 +0000 (08:33 -0400)
MagickCore/draw.c
MagickCore/paint.c

index 56c6e642e25e93db4a886cacbf2093a913983941..b52b03da7f89c4ccb729996946145dedbfbd83fc 100644 (file)
@@ -3245,8 +3245,10 @@ static inline double GetStopColorOffset(const GradientInfo *gradient,
           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;
+      v.x=(double) (x-gradient->center.x*
+        cos(DegreesToRadians(gradient->angle)))/gradient->radii.x;
+      v.y=(double) (y-gradient->center.y*
+        sin(DegreesToRadians(gradient->angle))/gradient->radii.y;
       return(sqrt(v.x*v.x+v.y*v.y));
     }
   }
index 1d0ac01360acf280f25197c02b2fa683296757bf..a3476fb9206150bedadfbc4f64b7e11de28b55e4 100644 (file)
@@ -539,8 +539,8 @@ MagickExport MagickBooleanType GradientImage(Image *image,
         sine;
 
       angle=StringToDouble(artifact,(char **) NULL);
-      cosine=cos(MagickPI*angle/180.0);
-      sine=sin(MagickPI*angle/180.0);
+      cosine=cos(DegreesToRadians(angle));
+      sine=sin(DegreesToRadians(angle));
       distance=fabs(sine*image->columns)+fabs(cosine*image->rows);
       gradient->gradient_vector.x1=MagickRound(0.5*(image->columns-cosine*
         distance));
@@ -556,8 +556,9 @@ MagickExport MagickBooleanType GradientImage(Image *image,
     (void) sscanf(artifact,"%lf%*[ ,]%lf%*[ ,]%lf%*[ ,]%lf",
       &gradient->gradient_vector.x1,&gradient->gradient_vector.y1,
       &gradient->gradient_vector.x2,&gradient->gradient_vector.y2);
-  if ((GetImageArtifact(image,"gradient:direction") == (const char *) NULL) &&
-      (GetImageArtifact(image,"gradient:angle") == (const char *) NULL) &&
+  if ((GetImageArtifact(image,"gradient:angle") == (const char *) NULL) &&
+      (GetImageArtifact(image,"gradient:direction") == (const char *) NULL) &&
+      (GetImageArtifact(image,"gradient:extent") == (const char *) NULL) &&
       (GetImageArtifact(image,"gradient:vector") == (const char *) NULL))
     if ((type == LinearGradient) && (gradient->gradient_vector.y2 != 0.0))
       gradient->gradient_vector.x2=0.0;
@@ -573,6 +574,25 @@ MagickExport MagickBooleanType GradientImage(Image *image,
   if (artifact != (const char *) NULL)
     (void) sscanf(artifact,"%lf%*[ ,]%lf",&gradient->radii.x,
       &gradient->radii.y);
+  artifact=GetImageArtifact(image,"gradient:extent");
+  if (artifact != (const char *) NULL)
+    {
+      if (LocaleCompare(artifact,"Diagonal") == 0)
+        {
+          gradient->radii.x=(double) image->columns-1.0;
+          gradient->radii.y=(double) image->rows-1.0;
+        }
+      if (LocaleCompare(artifact,"Ellipse") == 0)
+        {
+          gradient->radii.x=gradient->center.x;
+          gradient->radii.y=gradient->center.y;
+        }
+      if (LocaleCompare(artifact,"Mininum") == 0)
+        {
+          gradient->radii.x=MagickMin(gradient->center.x,gradient->center.y);
+          gradient->radii.y=gradient->radii.x;
+        }
+    }
   gradient->radius=MagickMax(gradient->radii.x,gradient->radii.y);
   gradient->spread=method;
   /*