From: Cristy Date: Sun, 7 Jan 2018 00:03:00 +0000 (-0500) Subject: Support aspect ratio geometry, e.g. -crop 3:2 X-Git-Tag: 7.0.7-22~139 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=37925f9dc5cfbc8f2d2518f26c7dc5bc5d848e2f;p=imagemagick Support aspect ratio geometry, e.g. -crop 3:2 --- diff --git a/MagickCore/geometry.c b/MagickCore/geometry.c index 6ab272142..63c7b924a 100644 --- a/MagickCore/geometry.c +++ b/MagickCore/geometry.c @@ -129,12 +129,6 @@ MagickExport MagickStatusType GetGeometry(const char *geometry,ssize_t *x, c=(int)*p; switch (c) { - case '~': - { - flags|=TildeValue; - (void) CopyMagickString(p,p+1,MagickPathExtent); - break; - } case '%': { flags|=PercentValue; @@ -185,7 +179,6 @@ MagickExport MagickStatusType GetGeometry(const char *geometry,ssize_t *x, break; } case '-': - case '.': case ',': case '+': case '0': @@ -205,6 +198,18 @@ MagickExport MagickStatusType GetGeometry(const char *geometry,ssize_t *x, p++; break; } + case '.': + { + p++; + flags|=DecimalValue; + break; + } + case ':': + { + p++; + flags|=AspectRatioValue; + break; + } default: return(flags); } @@ -893,12 +898,6 @@ MagickExport MagickStatusType ParseGeometry(const char *geometry, } switch (c) { - case '~': - { - flags|=TildeValue; - (void) CopyMagickString(p,p+1,MagickPathExtent); - break; - } case '%': { flags|=PercentValue; @@ -962,7 +961,6 @@ MagickExport MagickStatusType ParseGeometry(const char *geometry, case '8': case '9': case '/': - case ':': case 215: case 'e': case 'E': @@ -976,6 +974,12 @@ MagickExport MagickStatusType ParseGeometry(const char *geometry, flags|=DecimalValue; break; } + case ':': + { + p++; + flags|=AspectRatioValue; + break; + } default: return(NoValue); } @@ -1237,41 +1241,31 @@ MagickExport MagickStatusType ParseGravityGeometry(const Image *image, region_info->width=(size_t) floor((scale.x*image->columns/100.0)+0.5); region_info->height=(size_t) floor((scale.y*image->rows/100.0)+0.5); } - if ((flags & TildeValue) != 0) + if ((flags & AspectRatioValue) != 0) { double - geometry_aspect, - image_aspect; + geometry_ratio, + image_ratio; GeometryInfo geometry_info; - MagickStatusType - status; - - PointInfo - scale; - /* Geometry is a relative to image size and aspect ratio. */ if (image->gravity != UndefinedGravity) flags|=XValue | YValue; - status=ParseGeometry(geometry,&geometry_info); - scale.x=geometry_info.rho; - scale.y=geometry_info.sigma; - if ((status & SigmaValue) == 0) - scale.y=scale.x; - geometry_aspect=scale.x/scale.y; - image_aspect=image->columns/(double) image->rows; + (void) ParseGeometry(geometry,&geometry_info); + geometry_ratio=geometry_info.rho; + image_ratio=image->columns/(double) image->rows; region_info->width=image->columns; region_info->height=image->rows; - if (geometry_aspect >= image_aspect) + if (geometry_ratio >= image_ratio) { - region_info->width=(size_t) floor((image->columns*geometry_aspect/ - image_aspect)+0.5); - region_info->height=(size_t) floor((image->rows*image_aspect/ - geometry_aspect)+0.5); + region_info->width=(size_t) floor((image->columns*geometry_ratio/ + image_ratio)+0.5); + region_info->height=(size_t) floor((image->rows*image_ratio/ + geometry_ratio)+0.5); } } /* @@ -1386,39 +1380,28 @@ MagickExport MagickStatusType ParseMetaGeometry(const char *geometry,ssize_t *x, former_width=(*width); former_height=(*height); } - if ((flags & TildeValue) != 0) + if ((flags & AspectRatioValue) != 0) { double - geometry_aspect, - image_aspect; + geometry_ratio, + image_ratio; GeometryInfo geometry_info; - MagickStatusType - status; - - PointInfo - scale; - /* Geometry is a relative to image size and aspect ratio. */ - status=ParseGeometry(geometry,&geometry_info); - scale.x=geometry_info.rho; - scale.y=geometry_info.sigma; - if ((status & SigmaValue) == 0) - scale.y=scale.x; - geometry_aspect=scale.x/scale.y; - image_aspect=former_width/(double) former_height; + (void) ParseGeometry(geometry,&geometry_info); + geometry_ratio=geometry_info.rho; + image_ratio=former_width/(double) former_height; *width=former_width; *height=former_height; - if (geometry_aspect >= image_aspect) + if (geometry_ratio >= image_ratio) { - *width=(size_t) floor((former_width*geometry_aspect/ - image_aspect)+0.5); - *height=(size_t) floor((former_height*image_aspect/ - geometry_aspect)+0.5); + *width=(size_t) floor((former_width*geometry_ratio/image_ratio)+0.5); + *height=(size_t) floor((former_height*image_ratio/geometry_ratio)+ + 0.5); } former_width=(*width); former_height=(*height); diff --git a/MagickCore/geometry.h b/MagickCore/geometry.h index e90ac8ee8..ff11e256b 100644 --- a/MagickCore/geometry.h +++ b/MagickCore/geometry.h @@ -56,7 +56,7 @@ typedef enum AreaValue = 0x20000, /* '@' resize to area - special use flag */ DecimalValue = 0x40000, /* '.' floating point numbers found */ SeparatorValue = 0x80000, /* 'x' separator found */ - TildeValue = 0x100000, /* '~' special handling needed */ + AspectRatioValue = 0x100000, /* '~' special handling needed */ #undef AllValues AllValues = 0x7fffffff } GeometryFlags;