#include "MagickCore/option.h"
#include "MagickCore/pixel.h"
#include "MagickCore/pixel-accessor.h"
+#include "MagickCore/pixel-private.h"
#include "MagickCore/resample.h"
#include "MagickCore/resample-private.h"
#include "MagickCore/registry.h"
/* From "Digital Image Warping" by George Wolberg, page 50 */
double determinant;
- determinant=1.0/(coeff[0]*coeff[4]-coeff[1]*coeff[3]);
+ determinant=MagickEpsilonReciprocal(coeff[0]*coeff[4]-coeff[1]*coeff[3]);
inverse[0]=determinant*coeff[4];
inverse[1]=determinant*(-coeff[1]);
inverse[2]=determinant*(coeff[1]*coeff[5]-coeff[2]*coeff[4]);
/* From "Digital Image Warping" by George Wolberg, page 53 */
double determinant;
- determinant=1.0/(coeff[0]*coeff[4]-coeff[3]*coeff[1]);
+ determinant=MagickEpsilonReciprocal(coeff[0]*coeff[4]-coeff[3]*coeff[1]);
inverse[0]=determinant*(coeff[4]-coeff[7]*coeff[5]);
inverse[1]=determinant*(coeff[7]*coeff[2]-coeff[1]);
inverse[2]=determinant*(coeff[1]*coeff[5]-coeff[4]*coeff[2]);
}
else
{
- Image
- *resize_alpha;
-
/*
Image has transparency so handle colors and alpha separatly.
Basically we need to separate Virtual-Pixel alpha in the resized
distort alpha channel separately
*/
+ Image
+ *resize_alpha;
+
(void) SetImageAlphaChannel(tmp_image,ExtractAlphaChannel,exception);
(void) SetImageAlphaChannel(tmp_image,OpaqueAlphaChannel,exception);
resize_alpha=DistortImage(tmp_image,AffineDistortion,12,distort_args,
s.x = (double) image->page.x;
s.y = (double) image->page.y;
scale=inverse[6]*s.x+inverse[7]*s.y+1.0;
- scale=1.0/(fabs(scale) < MagickEpsilon ? MagickEpsilon : scale);
+ scale=MagickEpsilonReciprocal(scale);
d.x = scale*(inverse[0]*s.x+inverse[1]*s.y+inverse[2]);
d.y = scale*(inverse[3]*s.x+inverse[4]*s.y+inverse[5]);
InitalBounds(d);
s.x = (double) image->page.x+image->columns;
s.y = (double) image->page.y;
scale=inverse[6]*s.x+inverse[7]*s.y+1.0;
- scale=1.0/(fabs(scale) < MagickEpsilon ? MagickEpsilon : scale);
+ scale=MagickEpsilonReciprocal(scale);
d.x = scale*(inverse[0]*s.x+inverse[1]*s.y+inverse[2]);
d.y = scale*(inverse[3]*s.x+inverse[4]*s.y+inverse[5]);
ExpandBounds(d);
s.x = (double) image->page.x;
s.y = (double) image->page.y+image->rows;
scale=inverse[6]*s.x+inverse[7]*s.y+1.0;
- scale=1.0/(fabs(scale) < MagickEpsilon ? MagickEpsilon : scale);
+ scale=MagickEpsilonReciprocal(scale);
d.x = scale*(inverse[0]*s.x+inverse[1]*s.y+inverse[2]);
d.y = scale*(inverse[3]*s.x+inverse[4]*s.y+inverse[5]);
ExpandBounds(d);
s.x = (double) image->page.x+image->columns;
s.y = (double) image->page.y+image->rows;
scale=inverse[6]*s.x+inverse[7]*s.y+1.0;
- scale=1.0/(fabs(scale) < MagickEpsilon ? MagickEpsilon : scale);
+ scale=MagickEpsilonReciprocal(scale);
d.x = scale*(inverse[0]*s.x+inverse[1]*s.y+inverse[2]);
d.y = scale*(inverse[3]*s.x+inverse[4]*s.y+inverse[5]);
ExpandBounds(d);
output_scaling = 1.0;
if (artifact != (const char *) NULL) {
output_scaling = fabs(StringToDouble(artifact,(char **) NULL));
- geometry.width *= (size_t) output_scaling;
- geometry.height *= (size_t) output_scaling;
- geometry.x *= (ssize_t) output_scaling;
- geometry.y *= (ssize_t) output_scaling;
+ geometry.width=(size_t) (output_scaling*geometry.width+0.5);
+ geometry.height=(size_t) (output_scaling*geometry.height+0.5);
+ geometry.x=(ssize_t) (output_scaling*geometry.x+0.5);
+ geometry.y=(ssize_t) (output_scaling*geometry.y+0.5);
if ( output_scaling < 0.1 ) {
coeff = (double *) RelinquishMagickMemory(coeff);
(void) ThrowMagickException(exception,GetMagickModule(),OptionError,
distort_image=DestroyImage(distort_image);
return((Image *) NULL);
}
- distort_image->page.x=geometry.x;
- distort_image->page.y=geometry.y;
+ if ((IsPixelInfoGray(&distort_image->background_color) == MagickFalse) &&
+ (IsGrayColorspace(distort_image->colorspace) != MagickFalse))
+ (void) TransformImageColorspace(distort_image,RGBColorspace,exception);
if (distort_image->background_color.matte != MagickFalse)
distort_image->matte=MagickTrue;
+ distort_image->page.x=geometry.x;
+ distort_image->page.y=geometry.y;
{ /* ----- MAIN CODE -----
Sample the source image to each pixel in the distort image.
*distort_image,
*rotate_image;
- MagickRealType
+ double
angle;
PointInfo
distort_image=CloneImage(image,0,0,MagickTrue,exception);
if (distort_image == (Image *) NULL)
return((Image *) NULL);
- if (IsGrayColorspace(image->colorspace) != MagickFalse)
- (void) TransformImageColorspace(distort_image,sRGBColorspace,exception);
(void) SetImageVirtualPixelMethod(distort_image,BackgroundVirtualPixelMethod,
exception);
rotate_image=DistortImage(distort_image,ScaleRotateTranslateDistortion,1,