From: Cristy Date: Sat, 17 Oct 2015 13:31:58 +0000 (-0400) Subject: Support gradient:direction and gradient:angle defines X-Git-Tag: 7.0.1-0~556 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=971aac4f549b1ff5321a6514714dae9354bfa459;p=imagemagick Support gradient:direction and gradient:angle defines --- diff --git a/MagickCore/paint.c b/MagickCore/paint.c index d370fb783..fc9b3c0e7 100644 --- a/MagickCore/paint.c +++ b/MagickCore/paint.c @@ -55,6 +55,7 @@ #include "MagickCore/gem-private.h" #include "MagickCore/monitor.h" #include "MagickCore/monitor-private.h" +#include "MagickCore/option.h" #include "MagickCore/paint.h" #include "MagickCore/pixel-accessor.h" #include "MagickCore/resource_.h" @@ -408,6 +409,16 @@ MagickExport MagickBooleanType FloodfillPaintImage(Image *image, % */ +static inline double MagickRound(double x) +{ + /* + Round the fraction to nearest integer. + */ + if ((x-floor(x)) < (ceil(x)-x)) + return(floor(x)); + return(ceil(x)); +} + MagickExport MagickBooleanType GradientImage(Image *image, const GradientType type,const SpreadMethod method,const StopInfo *stops, const size_t number_stops,ExceptionInfo *exception) @@ -418,18 +429,12 @@ MagickExport MagickBooleanType GradientImage(Image *image, DrawInfo *draw_info; - GeometryInfo - geometry_info; - GradientInfo *gradient; MagickBooleanType status; - MagickStatusType - flags; - /* Set gradient start-stop end points. */ @@ -449,18 +454,111 @@ MagickExport MagickBooleanType GradientImage(Image *image, (void) ParseAbsoluteGeometry(artifact,&gradient->bounding_box); gradient->gradient_vector.x2=(double) image->columns-1.0; gradient->gradient_vector.y2=(double) image->rows-1.0; - artifact=GetImageArtifact(image,"gradient:vector"); + artifact=GetImageArtifact(image,"gradient:direction"); + if (artifact != (const char *) NULL) + { + GravityType + direction; + + direction=(GravityType) ParseCommandOption(MagickGravityOptions, + MagickFalse,artifact); + switch (direction) + { + case NorthWestGravity: + { + gradient->gradient_vector.x1=(double) image->columns-1.0; + gradient->gradient_vector.y1=(double) image->rows-1.0; + gradient->gradient_vector.x2=0.0; + gradient->gradient_vector.y2=0.0; + break; + } + case NorthGravity: + { + gradient->gradient_vector.x1=0.0; + gradient->gradient_vector.y1=(double) image->rows-1.0; + gradient->gradient_vector.x2=0.0; + gradient->gradient_vector.y2=0.0; + break; + } + case NorthEastGravity: + { + gradient->gradient_vector.x1=0.0; + gradient->gradient_vector.y1=(double) image->rows-1.0; + gradient->gradient_vector.x2=(double) image->columns-1.0; + gradient->gradient_vector.y2=0.0; + break; + } + case WestGravity: + { + gradient->gradient_vector.x1=(double) image->columns-1.0; + gradient->gradient_vector.y1=0.0; + gradient->gradient_vector.x2=0.0; + gradient->gradient_vector.y2=0.0; + break; + } + case EastGravity: + { + gradient->gradient_vector.x1=0.0; + gradient->gradient_vector.y1=0.0; + gradient->gradient_vector.x2=(double) image->columns-1.0; + gradient->gradient_vector.y2=0.0; + break; + } + case SouthWestGravity: + { + gradient->gradient_vector.x1=(double) image->columns-1.0; + gradient->gradient_vector.y1=0.0; + gradient->gradient_vector.x2=0.0; + gradient->gradient_vector.y2=(double) image->rows-1.0; + break; + } + case SouthGravity: + { + gradient->gradient_vector.x1=0.0; + gradient->gradient_vector.y1=0.0; + gradient->gradient_vector.x2=0.0; + gradient->gradient_vector.y2=(double) image->columns-1.0; + break; + } + case SouthEastGravity: + { + gradient->gradient_vector.x1=0.0; + gradient->gradient_vector.y1=0.0; + gradient->gradient_vector.x2=(double) image->columns-1.0; + gradient->gradient_vector.y2=(double) image->rows-1.0; + break; + } + default: + break; + } + } + artifact=GetImageArtifact(image,"gradient:angle"); if (artifact != (const char *) NULL) { - flags=ParseGeometry(artifact,&geometry_info); - gradient->gradient_vector.x1=geometry_info.rho; - if ((flags & SigmaValue) != 0) - gradient->gradient_vector.y1=geometry_info.sigma; - if ((flags & XiValue) != 0) - gradient->gradient_vector.x2=geometry_info.xi; - if ((flags & PsiValue) != 0) - gradient->gradient_vector.y2=geometry_info.psi; + double + angle, + cosine, + distance, + sine; + + angle=StringToDouble(artifact,(char **) NULL); + cosine=cos(MagickPI*angle/180.0); + sine=sin(MagickPI*angle/180.0); + distance=fabs(sine*image->columns)+fabs(cosine*image->rows); + gradient->gradient_vector.x1=MagickRound(0.5*(image->columns-cosine* + distance)); + gradient->gradient_vector.y1=MagickRound(0.5*(image->rows-sine* + distance)); + gradient->gradient_vector.x2=MagickRound(0.5*(image->columns+cosine* + distance)); + gradient->gradient_vector.y2=MagickRound(0.5*(image->rows+sine* + distance)); } + artifact=GetImageArtifact(image,"gradient:vector"); + if (artifact != (const char *) NULL) + (void) sscanf(artifact,"%lf%*[ ,]%lf%*[ ,]%lf%*[ ,]%lf", + &gradient->gradient_vector.x1,&gradient->gradient_vector.y1, + &gradient->gradient_vector.x2,&gradient->gradient_vector.y2); else if ((type == LinearGradient) && (gradient->gradient_vector.y2 != 0.0)) gradient->gradient_vector.x2=0.0; @@ -468,12 +566,8 @@ MagickExport MagickBooleanType GradientImage(Image *image, gradient->center.y=(double) gradient->gradient_vector.y2/2.0; artifact=GetImageArtifact(image,"gradient:center"); if (artifact != (const char *) NULL) - { - flags=ParseGeometry(artifact,&geometry_info); - gradient->center.x=geometry_info.rho; - if ((flags & SigmaValue) != 0) - gradient->center.y=geometry_info.sigma; - } + (void) sscanf(artifact,"%lf%*[ ,]%lf",&gradient->center.x, + &gradient->center.y); gradient->radius=MagickMax(gradient->center.x,gradient->center.y); artifact=GetImageArtifact(image,"gradient:radius"); if (artifact != (const char *) NULL) diff --git a/MagickCore/quantize.c b/MagickCore/quantize.c index a572c2ee2..0bd90d93c 100644 --- a/MagickCore/quantize.c +++ b/MagickCore/quantize.c @@ -1140,7 +1140,7 @@ static void ClosestColor(const Image *image,CubeInfo *cube_info, distance+=pixel*pixel; if (distance <= cube_info->distance) { - pixel=alpha-beta; + pixel=p->alpha-q->beta; distance+=pixel*pixel; if (distance <= cube_info->distance) { diff --git a/config/configure.xml b/config/configure.xml index db9c5437c..d7ec58f7b 100644 --- a/config/configure.xml +++ b/config/configure.xml @@ -34,10 +34,10 @@ - + - + diff --git a/configure b/configure index 156811624..c8ac326fd 100755 --- a/configure +++ b/configure @@ -4379,7 +4379,7 @@ MAGICK_PATCHLEVEL_VERSION=0 MAGICK_VERSION=7.0.0-0 -MAGICK_GIT_REVISION=17004:1787358:20150926 +MAGICK_GIT_REVISION=17086:5b747d9:20151017 # Substitute library versioning diff --git a/utilities/import.1 b/utilities/import.1 index e7394f107..c2db70332 100644 --- a/utilities/import.1 +++ b/utilities/import.1 @@ -90,7 +90,7 @@ Miscellaneous Options: \-list type print a list of supported option arguments \-version print version information -By default, 'file' is written in the MIFF image format. To specify a particular image format, precede the filename with an image format name and a colon (i.e. ps:image) or specify the image type as the filename suffix (i.e. image.ps). Specify 'file' as '-' for standard input or output. +By default, 'file' is written in the Postscript image format. To specify a particular image format, precede the filename with an image format name and a colon (i.e. ps:image) or specify the image type as the filename suffix (i.e. image.ps). Specify 'file' as '-' for standard input or output. .SH SEE ALSO ImageMagick(1)