From f70f909b81f1b22be16a68856e56a975bd4c5454 Mon Sep 17 00:00:00 2001 From: Cristy Date: Mon, 19 Oct 2015 08:33:32 -0400 Subject: [PATCH] Add support for gradient:extent define --- MagickCore/draw.c | 6 ++++-- MagickCore/paint.c | 28 ++++++++++++++++++++++++---- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/MagickCore/draw.c b/MagickCore/draw.c index 56c6e642e..b52b03da7 100644 --- a/MagickCore/draw.c +++ b/MagickCore/draw.c @@ -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)); } } diff --git a/MagickCore/paint.c b/MagickCore/paint.c index 1d0ac0136..a3476fb92 100644 --- a/MagickCore/paint.c +++ b/MagickCore/paint.c @@ -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; /* -- 2.50.1