]> granicus.if.org Git - imagemagick/blobdiff - MagickCore/resize.c
(no commit message)
[imagemagick] / MagickCore / resize.c
index 8c330eb7525442bace8fc1c913b7c31f0486db9a..dee437eec52117a5c1f5e8dc8d0cb5ae92e86522 100644 (file)
 %                      MagickCore Image Resize Methods                        %
 %                                                                             %
 %                              Software Design                                %
-%                                John Cristy                                  %
+%                                   Cristy                                    %
 %                                 July 1992                                   %
 %                                                                             %
 %                                                                             %
-%  Copyright 1999-2013 ImageMagick Studio LLC, a non-profit organization      %
+%  Copyright 1999-2014 ImageMagick Studio LLC, a non-profit organization      %
 %  dedicated to making software imaging solutions freely available.           %
 %                                                                             %
 %  You may not use this file except in compliance with the License.  You may  %
@@ -44,6 +44,7 @@
 #include "MagickCore/blob.h"
 #include "MagickCore/cache.h"
 #include "MagickCore/cache-view.h"
+#include "MagickCore/channel.h"
 #include "MagickCore/color.h"
 #include "MagickCore/color-private.h"
 #include "MagickCore/draw.h"
@@ -60,6 +61,7 @@
 #include "MagickCore/property.h"
 #include "MagickCore/monitor.h"
 #include "MagickCore/monitor-private.h"
+#include "MagickCore/nt-base-private.h"
 #include "MagickCore/option.h"
 #include "MagickCore/pixel.h"
 #include "MagickCore/pixel-private.h"
@@ -94,6 +96,10 @@ struct _ResizeFilter
     blur,           /* x-scale (blur-sharpen) */
     coefficient[7]; /* cubic coefficents for BC-cubic filters */
 
+  ResizeWeightingFunctionType
+    filterWeightingType,
+    windowWeightingType;
+
   size_t
     signature;
 };
@@ -126,8 +132,7 @@ static double
 %
 %  The individual filter functions have this format...
 %
-%     static MagickRealtype *FilterName(const double x,
-%        const double support)
+%     static MagickRealtype *FilterName(const double x,const double support)
 %
 %  A description of each parameter follows:
 %
@@ -857,7 +862,7 @@ MagickPrivate ResizeFilter *AcquireResizeFilter(const Image *image,
   */
   assert(image != (const Image *) NULL);
   assert(image->signature == MagickSignature);
-  if( IfMagickTrue(image->debug) )
+  if (image->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
   assert(UndefinedFilter < filter && filter < SentinelFilter);
   assert(exception != (ExceptionInfo *) NULL);
@@ -873,7 +878,7 @@ MagickPrivate ResizeFilter *AcquireResizeFilter(const Image *image,
   window_type=mapping[filter].window;
   resize_filter->blur=1.0;
   /* Promote 1D Windowed Sinc Filters to a 2D Windowed Jinc filters */
-  if( IfMagickTrue(cylindrical) && (filter_type == SincFastFilter) &&
+  if ( IfMagickTrue(cylindrical) && (filter_type == SincFastFilter) &&
       (filter != SincFastFilter))
     filter_type=JincFilter;  /* 1D Windowed Sinc => 2D Windowed Jinc filters */
 
@@ -995,7 +1000,8 @@ MagickPrivate ResizeFilter *AcquireResizeFilter(const Image *image,
       value=StringToDouble(artifact,(char **) NULL)*MagickPI;
     /* Define coefficents for Kaiser Windowing Function */
     resize_filter->coefficient[0]=value;         /* alpha */
-    resize_filter->coefficient[1]=PerceptibleReciprocal(I0(value)); /* normalization */
+    resize_filter->coefficient[1]=PerceptibleReciprocal(I0(value));
+      /* normalization */
   }
 
   /* Support Overrides */
@@ -1010,47 +1016,49 @@ MagickPrivate ResizeFilter *AcquireResizeFilter(const Image *image,
         lobes=1;
       resize_filter->support=(double) lobes;
     }
-  /* Convert a Jinc function lobes value to a real support value */
   if (resize_filter->filter == Jinc)
     {
+      /*
+        Convert a Jinc function lobes value to a real support value.
+      */
       if (resize_filter->support > 16)
         resize_filter->support=jinc_zeros[15];  /* largest entry in table */
       else
-        resize_filter->support=jinc_zeros[((long)resize_filter->support)-1];
-
-      /* blur this filter so support is a integer value (lobes dependant) */
+        resize_filter->support=jinc_zeros[((long) resize_filter->support)-1];
+      /*
+        Blur this filter so support is a integer value (lobes dependant).
+      */
       if (filter_type == LanczosRadiusFilter)
-      {
-        resize_filter->blur *= floor(resize_filter->support)/
-                                       resize_filter->support;
-      }
+        resize_filter->blur*=floor(resize_filter->support)/
+          resize_filter->support;
     }
-  /* Expert Blur Override */
+  /*
+    Expert blur override.
+  */
   artifact=GetImageArtifact(image,"filter:blur");
   if (artifact != (const char *) NULL)
     resize_filter->blur*=StringToDouble(artifact,(char **) NULL);
   if (resize_filter->blur < MagickEpsilon)
     resize_filter->blur=(double) MagickEpsilon;
-
-  /* Expert override of the support setting */
+  /*
+    Expert override of the support setting.
+  */
   artifact=GetImageArtifact(image,"filter:support");
   if (artifact != (const char *) NULL)
     resize_filter->support=fabs(StringToDouble(artifact,(char **) NULL));
   /*
-    Scale windowing function separately to the support 'clipping'
-    window that calling operator is planning to actually use. (Expert
-    override)
+    Scale windowing function separately to the support 'clipping' window
+    that calling operator is planning to actually use. (Expert override)
   */
   resize_filter->window_support=resize_filter->support; /* default */
   artifact=GetImageArtifact(image,"filter:win-support");
   if (artifact != (const char *) NULL)
     resize_filter->window_support=fabs(StringToDouble(artifact,(char **) NULL));
   /*
-    Adjust window function scaling to match windowing support for
-    weighting function.  This avoids a division on every filter call.
+    Adjust window function scaling to match windowing support for weighting
+    function.  This avoids a division on every filter call.
   */
   resize_filter->scale/=resize_filter->window_support;
-
   /*
    * Set Cubic Spline B,C values, calculate Cubic coefficients.
   */
@@ -1084,9 +1092,13 @@ MagickPrivate ResizeFilter *AcquireResizeFilter(const Image *image,
               B=1.0-2.0*C; /* Calculate B to get a Keys cubic filter. */
             }
         }
-      /* Convert B,C values into Cubic Coefficents. See CubicBC(). */
       {
-        const double twoB = B+B;
+        const double
+          twoB = B+B;
+
+        /*
+          Convert B,C values into Cubic Coefficents. See CubicBC().
+        */
         resize_filter->coefficient[0]=1.0-(1.0/3.0)*B;
         resize_filter->coefficient[1]=-3.0+twoB+C;
         resize_filter->coefficient[2]=2.0-1.5*B-C;
@@ -1111,10 +1123,10 @@ MagickPrivate ResizeFilter *AcquireResizeFilter(const Image *image,
           x;
 
         /*
-          Set the weighting function properly when the weighting
-          function may not exactly match the filter of the same name.
-          EG: a Point filter is really uses a Box weighting function
-          with a different support than is typically used.
+          Set the weighting function properly when the weighting function
+          may not exactly match the filter of the same name.  EG: a Point
+          filter is really uses a Box weighting function with a different
+          support than is typically used.
         */
         if (resize_filter->filter == Box)       filter_type=BoxFilter;
         if (resize_filter->filter == Sinc)      filter_type=SincFilter;
@@ -1130,38 +1142,40 @@ MagickPrivate ResizeFilter *AcquireResizeFilter(const Image *image,
           Report Filter Details.
         */
         support=GetResizeFilterSupport(resize_filter);  /* practical_support */
-        (void) FormatLocaleFile(stdout,"# Resampling Filter (for graphing)\n#\n");
+        (void) FormatLocaleFile(stdout,
+          "# Resampling Filter (for graphing)\n#\n");
         (void) FormatLocaleFile(stdout,"# filter = %s\n",
-             CommandOptionToMnemonic(MagickFilterOptions,filter_type));
+          CommandOptionToMnemonic(MagickFilterOptions,filter_type));
         (void) FormatLocaleFile(stdout,"# window = %s\n",
-             CommandOptionToMnemonic(MagickFilterOptions,window_type));
+          CommandOptionToMnemonic(MagickFilterOptions,window_type));
         (void) FormatLocaleFile(stdout,"# support = %.*g\n",
-             GetMagickPrecision(),(double) resize_filter->support);
+          GetMagickPrecision(),(double) resize_filter->support);
         (void) FormatLocaleFile(stdout,"# window-support = %.*g\n",
-             GetMagickPrecision(),(double) resize_filter->window_support);
+          GetMagickPrecision(),(double) resize_filter->window_support);
         (void) FormatLocaleFile(stdout,"# scale-blur = %.*g\n",
-             GetMagickPrecision(), (double)resize_filter->blur);
-        if ( filter_type == GaussianFilter || window_type == GaussianFilter )
+          GetMagickPrecision(),(double)resize_filter->blur);
+        if ((filter_type == GaussianFilter) || (window_type == GaussianFilter))
           (void) FormatLocaleFile(stdout,"# gaussian-sigma = %.*g\n",
-               GetMagickPrecision(), (double)resize_filter->coefficient[0]);
+            GetMagickPrecision(),(double)resize_filter->coefficient[0]);
         if ( filter_type == KaiserFilter || window_type == KaiserFilter )
           (void) FormatLocaleFile(stdout,"# kaiser-beta = %.*g\n",
-               GetMagickPrecision(),
-               (double)resize_filter->coefficient[0]);
+            GetMagickPrecision(),(double)resize_filter->coefficient[0]);
         (void) FormatLocaleFile(stdout,"# practical-support = %.*g\n",
-             GetMagickPrecision(), (double)support);
+          GetMagickPrecision(), (double)support);
         if ( filter_type == CubicFilter || window_type == CubicFilter )
           (void) FormatLocaleFile(stdout,"# B,C = %.*g,%.*g\n",
-               GetMagickPrecision(),(double)B, GetMagickPrecision(),(double)C);
+            GetMagickPrecision(),(double)B, GetMagickPrecision(),(double)C);
         (void) FormatLocaleFile(stdout,"\n");
         /*
-          Output values of resulting filter graph -- for graphing
-          filter result.
+          Output values of resulting filter graph -- for graphing filter result.
         */
         for (x=0.0; x <= support; x+=0.01f)
-          (void) FormatLocaleFile(stdout,"%5.2lf\t%.*g\n",x,GetMagickPrecision(),
-            (double) GetResizeFilterWeight(resize_filter,x));
-        /* A final value so gnuplot can graph the 'stop' properly. */
+          (void) FormatLocaleFile(stdout,"%5.2lf\t%.*g\n",x,
+            GetMagickPrecision(),(double)
+            GetResizeFilterWeight(resize_filter,x));
+        /*
+          A final value so gnuplot can graph the 'stop' properly.
+        */
         (void) FormatLocaleFile(stdout,"%5.2lf\t%.*g\n",support,
           GetMagickPrecision(),0.0);
       }
@@ -1210,8 +1224,12 @@ MagickPrivate ResizeFilter *AcquireResizeFilter(const Image *image,
 MagickExport Image *AdaptiveResizeImage(const Image *image,
   const size_t columns,const size_t rows,ExceptionInfo *exception)
 {
-  return(InterpolativeResizeImage(image,columns,rows,MeshInterpolatePixel,
-    exception));
+  Image
+    *resize_image;
+
+  resize_image=InterpolativeResizeImage(image,columns,rows,MeshInterpolatePixel,
+    exception);
+  return(resize_image);
 }
 \f
 /*
@@ -1479,6 +1497,55 @@ MagickPrivate ResizeFilter *DestroyResizeFilter(ResizeFilter *resize_filter)
 %    o filter: Image filter to use.
 %
 */
+
+MagickPrivate double *GetResizeFilterCoefficient(
+  const ResizeFilter *resize_filter)
+{
+  assert(resize_filter != (ResizeFilter *) NULL);
+  assert(resize_filter->signature == MagickSignature);
+  return((double *) resize_filter->coefficient);
+}
+
+MagickPrivate double GetResizeFilterBlur(
+  const ResizeFilter *resize_filter)
+{
+  assert(resize_filter != (ResizeFilter *) NULL);
+  assert(resize_filter->signature == MagickSignature);
+  return(resize_filter->blur);
+}
+
+MagickPrivate double GetResizeFilterScale(
+  const ResizeFilter *resize_filter)
+{
+  assert(resize_filter != (ResizeFilter *) NULL);
+  assert(resize_filter->signature == MagickSignature);
+  return(resize_filter->scale);
+}
+
+MagickPrivate double GetResizeFilterWindowSupport(
+  const ResizeFilter *resize_filter)
+{
+  assert(resize_filter != (ResizeFilter *) NULL);
+  assert(resize_filter->signature == MagickSignature);
+  return(resize_filter->window_support);
+}
+
+MagickPrivate ResizeWeightingFunctionType GetResizeFilterWeightingType(
+  const ResizeFilter *resize_filter)
+{
+  assert(resize_filter != (ResizeFilter *) NULL);
+  assert(resize_filter->signature == MagickSignature);
+  return(resize_filter->filterWeightingType);
+}
+
+MagickPrivate ResizeWeightingFunctionType GetResizeFilterWindowWeightingType(
+  const ResizeFilter *resize_filter)
+{
+  assert(resize_filter != (ResizeFilter *) NULL);
+  assert(resize_filter->signature == MagickSignature);
+  return(resize_filter->windowWeightingType);
+}
+
 MagickPrivate double GetResizeFilterSupport(
   const ResizeFilter *resize_filter)
 {
@@ -1514,8 +1581,8 @@ MagickPrivate double GetResizeFilterSupport(
 %    o x: the point.
 %
 */
-MagickPrivate double GetResizeFilterWeight(
-  const ResizeFilter *resize_filter,const double x)
+MagickPrivate double GetResizeFilterWeight(const ResizeFilter *resize_filter,
+  const double x)
 {
   double
     scale,
@@ -1603,7 +1670,7 @@ MagickExport Image *InterpolativeResizeImage(const Image *image,
   */
   assert(image != (const Image *) NULL);
   assert(image->signature == MagickSignature);
-  if( IfMagickTrue(image->debug) )
+  if (image->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
   assert(exception != (ExceptionInfo *) NULL);
   assert(exception->signature == MagickSignature);
@@ -1614,20 +1681,20 @@ MagickExport Image *InterpolativeResizeImage(const Image *image,
   resize_image=CloneImage(image,columns,rows,MagickTrue,exception);
   if (resize_image == (Image *) NULL)
     return((Image *) NULL);
-  if( IfMagickFalse(SetImageStorageClass(resize_image,DirectClass,exception)) )
+  if (SetImageStorageClass(resize_image,DirectClass,exception) == MagickFalse)
     {
       resize_image=DestroyImage(resize_image);
       return((Image *) NULL);
     }
   status=MagickTrue;
   progress=0;
-  image_view=AcquireVirtualCacheView(image);
-  resize_view=AcquireAuthenticCacheView(resize_image);
+  image_view=AcquireVirtualCacheView(image,exception);
+  resize_view=AcquireAuthenticCacheView(resize_image,exception);
   scale.x=(double) image->columns/resize_image->columns;
   scale.y=(double) image->rows/resize_image->rows;
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
   #pragma omp parallel for schedule(static,4) shared(progress,status) \
-    dynamic_number_threads(image,image->columns,image->rows,1)
+    magick_threads(image,resize_image,resize_image->rows,1)
 #endif
   for (y=0; y < (ssize_t) resize_image->rows; y++)
   {
@@ -1652,7 +1719,7 @@ MagickExport Image *InterpolativeResizeImage(const Image *image,
       register ssize_t
         i;
 
-      if (GetPixelMask(resize_image,q) != 0)
+      if (GetPixelReadMask(resize_image,q) == 0)
         {
           q+=GetPixelChannels(resize_image);
           continue;
@@ -1678,8 +1745,8 @@ MagickExport Image *InterpolativeResizeImage(const Image *image,
       }
       q+=GetPixelChannels(resize_image);
     }
-    if( IfMagickFalse(SyncCacheViewAuthenticPixels(resize_view,exception)) )
-      continue;
+    if (SyncCacheViewAuthenticPixels(resize_view,exception) == MagickFalse)
+      status=MagickFalse;
     if (image->progress_monitor != (MagickProgressMonitor) NULL)
       {
         MagickBooleanType
@@ -1690,7 +1757,7 @@ MagickExport Image *InterpolativeResizeImage(const Image *image,
 #endif
         proceed=SetImageProgress(image,InterpolativeResizeImageTag,progress++,
           image->rows);
-        if( IfMagickFalse(proceed) )
+        if (proceed == MagickFalse)
           status=MagickFalse;
       }
   }
@@ -1766,6 +1833,9 @@ MagickExport Image *LiquidRescaleImage(const Image *image,const size_t columns,
   MagickBooleanType
     status;
 
+  MemoryInfo
+    *pixel_info;
+
   register gfloat
     *q;
 
@@ -1777,7 +1847,7 @@ MagickExport Image *LiquidRescaleImage(const Image *image,const size_t columns,
   */
   assert(image != (const Image *) NULL);
   assert(image->signature == MagickSignature);
-  if( IfMagickTrue(image->debug) )
+  if (image->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
   assert(exception != (ExceptionInfo *) NULL);
   assert(exception->signature == MagickSignature);
@@ -1799,8 +1869,8 @@ MagickExport Image *LiquidRescaleImage(const Image *image,const size_t columns,
       /*
         Honor liquid resize size limitations.
       */
-      for (width=image->columns; columns >= (2*width-1); width*=2);
-      for (height=image->rows; rows >= (2*height-1); height*=2);
+      for (width=image->columns; columns >= (2*width-1); width*=2) ;
+      for (height=image->rows; rows >= (2*height-1); height*=2) ;
       resize_image=ResizeImage(image,width,height,image->filter,exception);
       if (resize_image == (Image *) NULL)
         return((Image *) NULL);
@@ -1809,13 +1879,14 @@ MagickExport Image *LiquidRescaleImage(const Image *image,const size_t columns,
       resize_image=DestroyImage(resize_image);
       return(rescale_image);
     }
-  pixels=(gfloat *) AcquireQuantumMemory(image->columns,image->rows*
+  pixel_info=AcquireVirtualMemory(image->columns,image->rows*
     GetPixelChannels(image)*sizeof(*pixels));
-  if (pixels == (gfloat *) NULL)
+  if (pixel_info == (MemoryInfo *) NULL)
     return((Image *) NULL);
+  pixels=(gfloat *) GetVirtualMemoryBlob(pixel_info);
   status=MagickTrue;
   q=pixels;
-  image_view=AcquireVirtualCacheView(image);
+  image_view=AcquireVirtualCacheView(image,exception);
   for (y=0; y < (ssize_t) image->rows; y++)
   {
     register const Quantum
@@ -1843,30 +1914,31 @@ MagickExport Image *LiquidRescaleImage(const Image *image,const size_t columns,
     }
   }
   image_view=DestroyCacheView(image_view);
-  carver=lqr_carver_new_ext(pixels,image->columns,image->rows,
-    GetPixelChannels(image),LQR_COLDEPTH_32F);
+  carver=lqr_carver_new_ext(pixels,(int) image->columns,(int) image->rows,
+    (int) GetPixelChannels(image),LQR_COLDEPTH_32F);
   if (carver == (LqrCarver *) NULL)
     {
-      pixels=(gfloat *) RelinquishMagickMemory(pixels);
+      pixel_info=RelinquishVirtualMemory(pixel_info);
       ThrowImageException(ResourceLimitError,"MemoryAllocationFailed");
     }
+  lqr_carver_set_preserve_input_image(carver);
   lqr_status=lqr_carver_init(carver,(int) delta_x,rigidity);
-  lqr_status=lqr_carver_resize(carver,columns,rows);
+  lqr_status=lqr_carver_resize(carver,(int) columns,(int) rows);
   (void) lqr_status;
   rescale_image=CloneImage(image,lqr_carver_get_width(carver),
     lqr_carver_get_height(carver),MagickTrue,exception);
   if (rescale_image == (Image *) NULL)
     {
-      pixels=(gfloat *) RelinquishMagickMemory(pixels);
+      pixel_info=RelinquishVirtualMemory(pixel_info);
       return((Image *) NULL);
     }
-  if( IfMagickFalse(SetImageStorageClass(rescale_image,DirectClass,exception)) )
+  if (SetImageStorageClass(rescale_image,DirectClass,exception) == MagickFalse)
     {
-      pixels=(gfloat *) RelinquishMagickMemory(pixels);
+      pixel_info=RelinquishVirtualMemory(pixel_info);
       rescale_image=DestroyImage(rescale_image);
       return((Image *) NULL);
     }
-  rescale_view=AcquireAuthenticCacheView(rescale_image);
+  rescale_view=AcquireAuthenticCacheView(rescale_image,exception);
   (void) lqr_carver_scan_reset(carver);
   while (lqr_carver_scan_ext(carver,&x_offset,&y_offset,(void **) &packet) != 0)
   {
@@ -1898,10 +1970,11 @@ MagickExport Image *LiquidRescaleImage(const Image *image,const size_t columns,
       SetPixelChannel(rescale_image,channel,ClampToQuantum(QuantumRange*
         packet[i]),q);
     }
-    if( IfMagickFalse(SyncCacheViewAuthenticPixels(rescale_view,exception)) )
+    if (SyncCacheViewAuthenticPixels(rescale_view,exception) == MagickFalse)
       break;
   }
   rescale_view=DestroyCacheView(rescale_view);
+  pixel_info=RelinquishVirtualMemory(pixel_info);
   lqr_carver_destroy(carver);
   return(rescale_image);
 }
@@ -1913,7 +1986,7 @@ MagickExport Image *LiquidRescaleImage(const Image *image,
 {
   assert(image != (const Image *) NULL);
   assert(image->signature == MagickSignature);
-  if( IfMagickTrue(image->debug) )
+  if (image->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
   assert(exception != (ExceptionInfo *) NULL);
   assert(exception->signature == MagickSignature);
@@ -1934,8 +2007,8 @@ MagickExport Image *LiquidRescaleImage(const Image *image,
 %                                                                             %
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %
-%  MagnifyImage() is a convenience method that scales an image proportionally
-%  to twice its size.
+%  MagnifyImage() doubles the size of the image with a pixel art scaling
+%  algorithm.
 %
 %  The format of the MagnifyImage method is:
 %
@@ -1950,17 +2023,167 @@ MagickExport Image *LiquidRescaleImage(const Image *image,
 */
 MagickExport Image *MagnifyImage(const Image *image,ExceptionInfo *exception)
 {
+#define MagnifyImageTag  "Magnify/Image"
+
+  CacheView
+    *image_view,
+    *magnify_view;
+
   Image
     *magnify_image;
 
-  assert(image != (Image *) NULL);
+  MagickBooleanType
+    status;
+
+  MagickOffsetType
+    progress;
+
+  ssize_t
+    y;
+
+  /*
+    Initialize magnified image attributes.
+  */
+  assert(image != (const Image *) NULL);
   assert(image->signature == MagickSignature);
-  if( IfMagickTrue(image->debug) )
+  if (image->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
   assert(exception != (ExceptionInfo *) NULL);
   assert(exception->signature == MagickSignature);
-  magnify_image=ResizeImage(image,2*image->columns,2*image->rows,SplineFilter,
+  magnify_image=CloneImage(image,2*image->columns,2*image->rows,MagickTrue,
     exception);
+  if (magnify_image == (Image *) NULL)
+    return((Image *) NULL);
+  /*
+    Magnify image.
+  */
+  status=MagickTrue;
+  progress=0;
+  image_view=AcquireVirtualCacheView(image,exception);
+  magnify_view=AcquireAuthenticCacheView(magnify_image,exception);
+#if defined(MAGICKCORE_OPENMP_SUPPORT)
+  #pragma omp parallel for schedule(static,4) shared(progress,status) \
+    magick_threads(image,magnify_image,image->rows,1)
+#endif
+  for (y=0; y < (ssize_t) image->rows; y++)
+  {
+    register Quantum
+      *restrict q;
+
+    register ssize_t
+      x;
+
+    if (status == MagickFalse)
+      continue;
+    q=QueueCacheViewAuthenticPixels(magnify_view,0,2*y,magnify_image->columns,2,
+      exception);
+    if (q == (Quantum *) NULL)
+      {
+        status=MagickFalse;
+        continue;
+      }
+    /*
+      Magnify this row of pixels.
+    */
+    for (x=0; x < (ssize_t) image->columns; x++)
+    {
+      MagickRealType
+        intensity[9];
+
+      register const Quantum
+        *restrict p;
+
+      register Quantum
+        *restrict r;
+
+      register ssize_t
+        i;
+
+      size_t
+        channels;
+
+      p=GetCacheViewVirtualPixels(image_view,x-1,y-1,3,3,exception);
+      if (p == (const Quantum *) NULL)
+        {
+          status=MagickFalse;
+          continue;
+        }
+      channels=GetPixelChannels(image);
+      for (i=0; i < 9; i++)
+        intensity[i]=GetPixelIntensity(image,p+i*channels);
+      r=q;
+      if ((fabs(intensity[1]-intensity[7]) < MagickEpsilon) ||
+          (fabs(intensity[3]-intensity[5]) < MagickEpsilon))
+        {
+          /*
+            Clone center pixel.
+          */
+          for (i=0; i < (ssize_t) channels; i++)
+            r[i]=p[4*channels+i];
+          r+=GetPixelChannels(magnify_image);
+          for (i=0; i < (ssize_t) channels; i++)
+            r[i]=p[4*channels+i];
+          r+=(magnify_image->columns-1)*GetPixelChannels(magnify_image);
+          for (i=0; i < (ssize_t) channels; i++)
+            r[i]=p[4*channels+i];
+          r+=GetPixelChannels(magnify_image);
+          for (i=0; i < (ssize_t) channels; i++)
+            r[i]=p[4*channels+i];
+        }
+      else
+        {
+          /*
+            Selectively clone pixel.
+          */
+          if (fabs(intensity[1]-intensity[3]) < MagickEpsilon)
+            for (i=0; i < (ssize_t) channels; i++)
+              r[i]=p[3*channels+i];
+          else
+            for (i=0; i < (ssize_t) channels; i++)
+              r[i]=p[4*channels+i];
+          r+=GetPixelChannels(magnify_image);
+          if (fabs(intensity[1]-intensity[5]) < MagickEpsilon)
+            for (i=0; i < (ssize_t) channels; i++)
+              r[i]=p[5*channels+i];
+          else
+            for (i=0; i < (ssize_t) channels; i++)
+              r[i]=p[4*channels+i];
+          r+=(magnify_image->columns-1)*GetPixelChannels(magnify_image);
+          if (fabs(intensity[3]-intensity[7]) < MagickEpsilon)
+            for (i=0; i < (ssize_t) channels; i++)
+              r[i]=p[3*channels+i];
+          else
+            for (i=0; i < (ssize_t) channels; i++)
+              r[i]=p[4*channels+i];
+          r+=GetPixelChannels(magnify_image);
+          if (fabs(intensity[5]-intensity[7]) < MagickEpsilon)
+            for (i=0; i < (ssize_t) channels; i++)
+              r[i]=p[5*channels+i];
+          else
+            for (i=0; i < (ssize_t) channels; i++)
+              r[i]=p[4*channels+i];
+        }
+      q+=2*GetPixelChannels(magnify_image);
+    }
+    if (SyncCacheViewAuthenticPixels(magnify_view,exception) == MagickFalse)
+      status=MagickFalse;
+    if (image->progress_monitor != (MagickProgressMonitor) NULL)
+      {
+        MagickBooleanType
+          proceed;
+
+#if defined(MAGICKCORE_OPENMP_SUPPORT)
+        #pragma omp critical (MagickCore_MagnifyImage)
+#endif
+        proceed=SetImageProgress(image,MagnifyImageTag,progress++,image->rows);
+        if (proceed == MagickFalse)
+          status=MagickFalse;
+      }
+  }
+  magnify_view=DestroyCacheView(magnify_view);
+  image_view=DestroyCacheView(image_view);
+  if (status == MagickFalse)
+    magnify_image=DestroyImage(magnify_image);
   return(magnify_image);
 }
 \f
@@ -1996,7 +2219,7 @@ MagickExport Image *MinifyImage(const Image *image,ExceptionInfo *exception)
 
   assert(image != (Image *) NULL);
   assert(image->signature == MagickSignature);
-  if( IfMagickTrue(image->debug) )
+  if (image->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
   assert(exception != (ExceptionInfo *) NULL);
   assert(exception->signature == MagickSignature);
@@ -2056,7 +2279,7 @@ MagickExport Image *ResampleImage(const Image *image,const double x_resolution,
   */
   assert(image != (const Image *) NULL);
   assert(image->signature == MagickSignature);
-  if( IfMagickTrue(image->debug) )
+  if (image->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
   assert(exception != (ExceptionInfo *) NULL);
   assert(exception->signature == MagickSignature);
@@ -2095,9 +2318,8 @@ MagickExport Image *ResampleImage(const Image *image,const double x_resolution,
 %
 %  The format of the ResizeImage method is:
 %
-%      Image *ResizeImage(Image *image,const size_t columns,
-%        const size_t rows,const FilterTypes filter,const double blur,
-%        ExceptionInfo *exception)
+%      Image *ResizeImage(Image *image,const size_t columns,const size_t rows,
+%        const FilterTypes filter,ExceptionInfo *exception)
 %
 %  A description of each parameter follows:
 %
@@ -2109,9 +2331,6 @@ MagickExport Image *ResampleImage(const Image *image,const double x_resolution,
 %
 %    o filter: Image filter to use.
 %
-%    o blur: the blur factor where > 1 is blurry, < 1 is sharp.  Typically set
-%      this to 1.0.
-%
 %    o exception: return any errors or warnings in this structure.
 %
 */
@@ -2213,7 +2432,7 @@ static MagickBooleanType HorizontalFilter(const ResizeFilter *resize_filter,
   scale=MagickMax(1.0/x_factor+MagickEpsilon,1.0);
   support=scale*GetResizeFilterSupport(resize_filter);
   storage_class=support > 0.5 ? DirectClass : image->storage_class;
-  if( IfMagickFalse(SetImageStorageClass(resize_image,storage_class,exception)) )
+  if (SetImageStorageClass(resize_image,storage_class,exception) == MagickFalse)
     return(MagickFalse);
   if (support < 0.5)
     {
@@ -2227,19 +2446,22 @@ static MagickBooleanType HorizontalFilter(const ResizeFilter *resize_filter,
   if (contributions == (ContributionInfo **) NULL)
     {
       (void) ThrowMagickException(exception,GetMagickModule(),
-        ResourceLimitError,"MemoryAllocationFailed","'%s'",image->filename);
+        ResourceLimitError,"MemoryAllocationFailed","`%s'",image->filename);
       return(MagickFalse);
     }
   status=MagickTrue;
   scale=PerceptibleReciprocal(scale);
-  image_view=AcquireVirtualCacheView(image);
-  resize_view=AcquireAuthenticCacheView(resize_image);
+  image_view=AcquireVirtualCacheView(image,exception);
+  resize_view=AcquireAuthenticCacheView(resize_image,exception);
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
   #pragma omp parallel for schedule(static,4) shared(status) \
-    dynamic_number_threads(image,image->columns,image->rows,1)
+    magick_threads(image,resize_image,resize_image->columns,1)
 #endif
   for (x=0; x < (ssize_t) resize_image->columns; x++)
   {
+    const int
+      id = GetOpenMPThreadId();
+
     double
       bisect,
       density;
@@ -2267,7 +2489,7 @@ static MagickBooleanType HorizontalFilter(const ResizeFilter *resize_filter,
     start=(ssize_t) MagickMax(bisect-support+0.5,0.0);
     stop=(ssize_t) MagickMin(bisect+support+0.5,(double) image->columns);
     density=0.0;
-    contribution=contributions[GetOpenMPThreadId()];
+    contribution=contributions[id];
     for (n=0; n < (stop-start); n++)
     {
       contribution[n].pixel=start+n;
@@ -2328,7 +2550,7 @@ static MagickBooleanType HorizontalFilter(const ResizeFilter *resize_filter,
             (resize_traits == UndefinedPixelTrait))
           continue;
         if (((resize_traits & CopyPixelTrait) != 0) ||
-            (GetPixelMask(resize_image,q) != 0))
+            (GetPixelReadMask(resize_image,q) == 0))
           {
             j=(ssize_t) (MagickMin(MagickMax(bisect,(double) start),(double)
               stop-1.0)+0.5);
@@ -2372,7 +2594,7 @@ static MagickBooleanType HorizontalFilter(const ResizeFilter *resize_filter,
       }
       q+=GetPixelChannels(resize_image);
     }
-    if( IfMagickFalse(SyncCacheViewAuthenticPixels(resize_view,exception)) )
+    if (SyncCacheViewAuthenticPixels(resize_view,exception) == MagickFalse)
       status=MagickFalse;
     if (image->progress_monitor != (MagickProgressMonitor) NULL)
       {
@@ -2383,7 +2605,7 @@ static MagickBooleanType HorizontalFilter(const ResizeFilter *resize_filter,
         #pragma omp critical (MagickCore_HorizontalFilter)
 #endif
         proceed=SetImageProgress(image,ResizeImageTag,(*offset)++,span);
-        if( IfMagickFalse(proceed) )
+        if (proceed == MagickFalse)
           status=MagickFalse;
       }
   }
@@ -2407,16 +2629,13 @@ static MagickBooleanType VerticalFilter(const ResizeFilter *resize_filter,
   ContributionInfo
     **restrict contributions;
 
-  MagickBooleanType
-    status;
-
-  PixelInfo
-    zero;
-
   double
     scale,
     support;
 
+  MagickBooleanType
+    status;
+
   ssize_t
     y;
 
@@ -2426,7 +2645,7 @@ static MagickBooleanType VerticalFilter(const ResizeFilter *resize_filter,
   scale=MagickMax(1.0/y_factor+MagickEpsilon,1.0);
   support=scale*GetResizeFilterSupport(resize_filter);
   storage_class=support > 0.5 ? DirectClass : image->storage_class;
-  if( IfMagickFalse(SetImageStorageClass(resize_image,storage_class,exception)) )
+  if (SetImageStorageClass(resize_image,storage_class,exception) == MagickFalse)
     return(MagickFalse);
   if (support < 0.5)
     {
@@ -2440,20 +2659,22 @@ static MagickBooleanType VerticalFilter(const ResizeFilter *resize_filter,
   if (contributions == (ContributionInfo **) NULL)
     {
       (void) ThrowMagickException(exception,GetMagickModule(),
-        ResourceLimitError,"MemoryAllocationFailed","'%s'",image->filename);
+        ResourceLimitError,"MemoryAllocationFailed","`%s'",image->filename);
       return(MagickFalse);
     }
   status=MagickTrue;
   scale=PerceptibleReciprocal(scale);
-  (void) ResetMagickMemory(&zero,0,sizeof(zero));
-  image_view=AcquireVirtualCacheView(image);
-  resize_view=AcquireAuthenticCacheView(resize_image);
+  image_view=AcquireVirtualCacheView(image,exception);
+  resize_view=AcquireAuthenticCacheView(resize_image,exception);
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
   #pragma omp parallel for schedule(static,4) shared(status) \
-    dynamic_number_threads(image,image->columns,image->rows,1)
+    magick_threads(image,resize_image,resize_image->rows,1)
 #endif
   for (y=0; y < (ssize_t) resize_image->rows; y++)
   {
+    const int
+      id = GetOpenMPThreadId();
+
     double
       bisect,
       density;
@@ -2481,7 +2702,7 @@ static MagickBooleanType VerticalFilter(const ResizeFilter *resize_filter,
     start=(ssize_t) MagickMax(bisect-support+0.5,0.0);
     stop=(ssize_t) MagickMin(bisect+support+0.5,(double) image->rows);
     density=0.0;
-    contribution=contributions[GetOpenMPThreadId()];
+    contribution=contributions[id];
     for (n=0; n < (stop-start); n++)
     {
       contribution[n].pixel=start+n;
@@ -2543,7 +2764,7 @@ static MagickBooleanType VerticalFilter(const ResizeFilter *resize_filter,
             (resize_traits == UndefinedPixelTrait))
           continue;
         if (((resize_traits & CopyPixelTrait) != 0) ||
-            (GetPixelMask(resize_image,q) != 0))
+            (GetPixelReadMask(resize_image,q) == 0))
           {
             j=(ssize_t) (MagickMin(MagickMax(bisect,(double) start),(double)
               stop-1.0)+0.5);
@@ -2584,7 +2805,7 @@ static MagickBooleanType VerticalFilter(const ResizeFilter *resize_filter,
       }
       q+=GetPixelChannels(resize_image);
     }
-    if( IfMagickFalse(SyncCacheViewAuthenticPixels(resize_view,exception)) )
+    if (SyncCacheViewAuthenticPixels(resize_view,exception) == MagickFalse)
       status=MagickFalse;
     if (image->progress_monitor != (MagickProgressMonitor) NULL)
       {
@@ -2595,7 +2816,7 @@ static MagickBooleanType VerticalFilter(const ResizeFilter *resize_filter,
         #pragma omp critical (MagickCore_VerticalFilter)
 #endif
         proceed=SetImageProgress(image,ResizeImageTag,(*offset)++,span);
-        if( IfMagickFalse(proceed) )
+        if (proceed == MagickFalse)
           status=MagickFalse;
       }
   }
@@ -2608,7 +2829,9 @@ static MagickBooleanType VerticalFilter(const ResizeFilter *resize_filter,
 MagickExport Image *ResizeImage(const Image *image,const size_t columns,
   const size_t rows,const FilterTypes filter,ExceptionInfo *exception)
 {
-#define WorkLoadFactor  0.265
+  double
+    x_factor,
+    y_factor;
 
   FilterTypes
     filter_type;
@@ -2620,10 +2843,6 @@ MagickExport Image *ResizeImage(const Image *image,const size_t columns,
   MagickOffsetType
     offset;
 
-  double
-    x_factor,
-    y_factor;
-
   MagickSizeType
     span;
 
@@ -2638,7 +2857,7 @@ MagickExport Image *ResizeImage(const Image *image,const size_t columns,
   */
   assert(image != (Image *) NULL);
   assert(image->signature == MagickSignature);
-  if( IfMagickTrue(image->debug) )
+  if (image->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
   assert(exception != (ExceptionInfo *) NULL);
   assert(exception->signature == MagickSignature);
@@ -2655,7 +2874,7 @@ MagickExport Image *ResizeImage(const Image *image,const size_t columns,
   */
   x_factor=(double) columns/(double) image->columns;
   y_factor=(double) rows/(double) image->rows;
-  if ((x_factor*y_factor) > WorkLoadFactor)
+  if (x_factor > y_factor)
     filter_image=CloneImage(image,columns,image->rows,MagickTrue,exception);
   else
     filter_image=CloneImage(image,image->columns,rows,MagickTrue,exception);
@@ -2669,7 +2888,7 @@ MagickExport Image *ResizeImage(const Image *image,const size_t columns,
       filter_type=PointFilter;
     else
       if ((image->storage_class == PseudoClass) ||
-          image->alpha_trait == BlendPixelTrait ||
+          (image->alpha_trait == BlendPixelTrait) ||
           ((x_factor*y_factor) > 1.0))
         filter_type=MitchellFilter;
   resize_filter=AcquireResizeFilter(image,filter_type,MagickFalse,exception);
@@ -2677,7 +2896,7 @@ MagickExport Image *ResizeImage(const Image *image,const size_t columns,
     Resize image.
   */
   offset=0;
-  if ((x_factor*y_factor) > WorkLoadFactor)
+  if (x_factor > y_factor)
     {
       span=(MagickSizeType) (filter_image->columns+rows);
       status=HorizontalFilter(resize_filter,image,filter_image,x_factor,span,
@@ -2763,12 +2982,15 @@ MagickExport Image *SampleImage(const Image *image,const size_t columns,
     *x_offset,
     y;
 
+  PointInfo
+    sample_offset;
+
   /*
     Initialize sampled image attributes.
   */
   assert(image != (const Image *) NULL);
   assert(image->signature == MagickSignature);
-  if( IfMagickTrue(image->debug) )
+  if (image->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
   assert(exception != (ExceptionInfo *) NULL);
   assert(exception->signature == MagickSignature);
@@ -2779,6 +3001,30 @@ MagickExport Image *SampleImage(const Image *image,const size_t columns,
   sample_image=CloneImage(image,columns,rows,MagickTrue,exception);
   if (sample_image == (Image *) NULL)
     return((Image *) NULL);
+  /*
+    Set the sampling offset, default is in the mid-point of sample regions.
+  */
+  sample_offset.x=sample_offset.y=0.5-MagickEpsilon;
+  {
+    const char
+      *value;
+
+    value=GetImageArtifact(image,"sample:offset");
+    if (value != (char *) NULL)
+      {
+        GeometryInfo
+          geometry_info;
+
+        MagickStatusType
+          flags;
+
+        (void) ParseGeometry(value,&geometry_info);
+        flags=ParseGeometry(value,&geometry_info);
+        sample_offset.x=sample_offset.y=geometry_info.rho/100.0-MagickEpsilon;
+        if ((flags & SigmaValue) != 0)
+          sample_offset.y=geometry_info.sigma/100.0-MagickEpsilon;
+      }
+  }
   /*
     Allocate scan line buffer and column offset buffers.
   */
@@ -2790,18 +3036,18 @@ MagickExport Image *SampleImage(const Image *image,const size_t columns,
       ThrowImageException(ResourceLimitError,"MemoryAllocationFailed");
     }
   for (x=0; x < (ssize_t) sample_image->columns; x++)
-    x_offset[x]=(ssize_t) (((double) x+0.5)*image->columns/
+    x_offset[x]=(ssize_t) ((((double) x+sample_offset.x)*image->columns)/
       sample_image->columns);
   /*
     Sample each row.
   */
   status=MagickTrue;
   progress=0;
-  image_view=AcquireVirtualCacheView(image);
-  sample_view=AcquireAuthenticCacheView(sample_image);
+  image_view=AcquireVirtualCacheView(image,exception);
+  sample_view=AcquireAuthenticCacheView(sample_image,exception);
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
-  #pragma omp parallel for schedule(static,4) shared(progress,status) \
-    dynamic_number_threads(image,image->columns,image->rows,1)
+  #pragma omp parallel for schedule(static,4) shared(status) \
+    magick_threads(image,sample_image,1,1)
 #endif
   for (y=0; y < (ssize_t) sample_image->rows; y++)
   {
@@ -2819,7 +3065,7 @@ MagickExport Image *SampleImage(const Image *image,const size_t columns,
 
     if (status == MagickFalse)
       continue;
-    y_offset=(ssize_t) (((double) y+0.5)*image->rows/
+    y_offset=(ssize_t) ((((double) y+sample_offset.y)*image->rows)/
       sample_image->rows);
     p=GetCacheViewVirtualPixels(image_view,0,y_offset,image->columns,1,
       exception);
@@ -2838,7 +3084,7 @@ MagickExport Image *SampleImage(const Image *image,const size_t columns,
       register ssize_t
         i;
 
-      if (GetPixelMask(sample_image,q) != 0)
+      if (GetPixelReadMask(sample_image,q) == 0)
         {
           q+=GetPixelChannels(sample_image);
           continue;
@@ -2863,7 +3109,7 @@ MagickExport Image *SampleImage(const Image *image,const size_t columns,
       }
       q+=GetPixelChannels(sample_image);
     }
-    if( IfMagickFalse(SyncCacheViewAuthenticPixels(sample_view,exception)) )
+    if (SyncCacheViewAuthenticPixels(sample_view,exception) == MagickFalse)
       status=MagickFalse;
     if (image->progress_monitor != (MagickProgressMonitor) NULL)
       {
@@ -2874,7 +3120,7 @@ MagickExport Image *SampleImage(const Image *image,const size_t columns,
         #pragma omp critical (MagickCore_SampleImage)
 #endif
         proceed=SetImageProgress(image,SampleImageTag,progress++,image->rows);
-        if( IfMagickFalse(proceed) )
+        if (proceed == MagickFalse)
           status=MagickFalse;
       }
   }
@@ -2925,14 +3171,6 @@ MagickExport Image *ScaleImage(const Image *image,const size_t columns,
     *image_view,
     *scale_view;
 
-  Image
-    *scale_image;
-
-  MagickBooleanType
-    next_column,
-    next_row,
-    proceed;
-
   double
     alpha,
     gamma,
@@ -2942,6 +3180,15 @@ MagickExport Image *ScaleImage(const Image *image,const size_t columns,
     *x_vector,
     *y_vector;
 
+  Image
+    *scale_image;
+
+  MagickBooleanType
+    next_column,
+    next_row,
+    proceed,
+    status;
+
   PixelChannel
     channel;
 
@@ -2966,7 +3213,7 @@ MagickExport Image *ScaleImage(const Image *image,const size_t columns,
   */
   assert(image != (const Image *) NULL);
   assert(image->signature == MagickSignature);
-  if( IfMagickTrue(image->debug) )
+  if (image->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
   assert(exception != (ExceptionInfo *) NULL);
   assert(exception->signature == MagickSignature);
@@ -2977,7 +3224,7 @@ MagickExport Image *ScaleImage(const Image *image,const size_t columns,
   scale_image=CloneImage(image,columns,rows,MagickTrue,exception);
   if (scale_image == (Image *) NULL)
     return((Image *) NULL);
-  if( IfMagickFalse(SetImageStorageClass(scale_image,DirectClass,exception)) )
+  if (SetImageStorageClass(scale_image,DirectClass,exception) == MagickFalse)
     {
       scale_image=DestroyImage(scale_image);
       return((Image *) NULL);
@@ -3013,8 +3260,9 @@ MagickExport Image *ScaleImage(const Image *image,const size_t columns,
   for (i=0; i < (ssize_t) (GetPixelChannels(image)*image->columns); i++)
     y_vector[i]=0.0;
   n=0;
-  image_view=AcquireVirtualCacheView(image);
-  scale_view=AcquireAuthenticCacheView(scale_image);
+  status=MagickTrue;
+  image_view=AcquireVirtualCacheView(image,exception);
+  scale_view=AcquireAuthenticCacheView(scale_image,exception);
   for (y=0; y < (ssize_t) scale_image->rows; y++)
   {
     register const Quantum
@@ -3026,10 +3274,15 @@ MagickExport Image *ScaleImage(const Image *image,const size_t columns,
     register ssize_t
       x;
 
+    if (status == MagickFalse)
+      break;
     q=QueueCacheViewAuthenticPixels(scale_view,0,y,scale_image->columns,1,
       exception);
     if (q == (Quantum *) NULL)
-      break;
+      {
+        status=MagickFalse;
+        break;
+      }
     alpha=1.0;
     if (scale_image->rows == image->rows)
       {
@@ -3039,10 +3292,13 @@ MagickExport Image *ScaleImage(const Image *image,const size_t columns,
         p=GetCacheViewVirtualPixels(image_view,0,n++,image->columns,1,
           exception);
         if (p == (const Quantum *) NULL)
-          break;
+          {
+            status=MagickFalse;
+            break;
+          }
         for (x=0; x < (ssize_t) image->columns; x++)
         {
-          if (GetPixelMask(image,p) != 0)
+          if (GetPixelReadMask(image,p) == 0)
             {
               p+=GetPixelChannels(image);
               continue;
@@ -3075,7 +3331,8 @@ MagickExport Image *ScaleImage(const Image *image,const size_t columns,
         */
         while (scale.y < span.y)
         {
-          if( IfMagickTrue(next_row) && (number_rows < (ssize_t) image->rows))
+          if ((next_row != MagickFalse) &&
+              (number_rows < (ssize_t) image->rows))
             {
               /*
                 Read a new scanline.
@@ -3083,10 +3340,13 @@ MagickExport Image *ScaleImage(const Image *image,const size_t columns,
               p=GetCacheViewVirtualPixels(image_view,0,n++,image->columns,1,
                 exception);
               if (p == (const Quantum *) NULL)
-                break;
+                {
+                  status=MagickFalse;
+                  break;
+                }
               for (x=0; x < (ssize_t) image->columns; x++)
               {
-                if (GetPixelMask(image,p) != 0)
+                if (GetPixelReadMask(image,p) == 0)
                   {
                     p+=GetPixelChannels(image);
                     continue;
@@ -3122,7 +3382,7 @@ MagickExport Image *ScaleImage(const Image *image,const size_t columns,
           scale.y=(double) scale_image->rows/(double) image->rows;
           next_row=MagickTrue;
         }
-        if( IfMagickTrue(next_row) && (number_rows < (ssize_t) image->rows))
+        if ((next_row != MagickFalse) && (number_rows < (ssize_t) image->rows))
           {
             /*
               Read a new scanline.
@@ -3130,10 +3390,13 @@ MagickExport Image *ScaleImage(const Image *image,const size_t columns,
             p=GetCacheViewVirtualPixels(image_view,0,n++,image->columns,1,
               exception);
             if (p == (const Quantum *) NULL)
-              break;
+              {
+                status=MagickFalse;
+                break;
+              }
             for (x=0; x < (ssize_t) image->columns; x++)
             {
-              if (GetPixelMask(image,p) != 0)
+              if (GetPixelReadMask(image,p) == 0)
                 {
                   p+=GetPixelChannels(image);
                   continue;
@@ -3186,7 +3449,7 @@ MagickExport Image *ScaleImage(const Image *image,const size_t columns,
         */
         for (x=0; x < (ssize_t) scale_image->columns; x++)
         {
-          if (GetPixelMask(scale_image,q) != 0)
+          if (GetPixelReadMask(scale_image,q) == 0)
             {
               q+=GetPixelChannels(scale_image);
               continue;
@@ -3236,7 +3499,7 @@ MagickExport Image *ScaleImage(const Image *image,const size_t columns,
           scale.x=(double) scale_image->columns/(double) image->columns;
           while (scale.x >= span.x)
           {
-            if( IfMagickTrue(next_column) )
+            if (next_column != MagickFalse)
               {
                 for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
                   pixel[i]=0.0;
@@ -3263,7 +3526,7 @@ MagickExport Image *ScaleImage(const Image *image,const size_t columns,
           }
         if (scale.x > 0)
           {
-            if( IfMagickTrue(next_column) )
+            if (next_column != MagickFalse)
               {
                 for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
                   pixel[i]=0.0;
@@ -3280,7 +3543,7 @@ MagickExport Image *ScaleImage(const Image *image,const size_t columns,
           for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
             pixel[i]+=span.x*scanline[(x-1)*GetPixelChannels(image)+i];
         }
-      if( IfMagickFalse(next_column) &&
+      if ((next_column == MagickFalse) &&
           ((ssize_t) n < (ssize_t) scale_image->columns))
         for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
         {
@@ -3292,7 +3555,7 @@ MagickExport Image *ScaleImage(const Image *image,const size_t columns,
       */
       for (x=0; x < (ssize_t) scale_image->columns; x++)
       {
-        if (GetPixelMask(scale_image,q) != 0)
+        if (GetPixelReadMask(scale_image,q) == 0)
           {
             q+=GetPixelChannels(scale_image);
             continue;
@@ -3311,18 +3574,24 @@ MagickExport Image *ScaleImage(const Image *image,const size_t columns,
                 scale_scanline[x*MaxPixelChannels+channel]),q);
               continue;
             }
-          SetPixelChannel(scale_image,channel,ClampToQuantum(
-            scale_scanline[x*MaxPixelChannels+channel]),q);
+          SetPixelChannel(scale_image,channel,ClampToQuantum(scale_scanline[
+            x*MaxPixelChannels+channel]),q);
         }
         q+=GetPixelChannels(scale_image);
       }
     }
-    if( IfMagickFalse(SyncCacheViewAuthenticPixels(scale_view,exception)) )
-      break;
+    if (SyncCacheViewAuthenticPixels(scale_view,exception) == MagickFalse)
+      {
+        status=MagickFalse;
+        break;
+      }
     proceed=SetImageProgress(image,ScaleImageTag,(MagickOffsetType) y,
       image->rows);
-    if( IfMagickFalse(proceed) )
-      break;
+    if (proceed == MagickFalse)
+      {
+        status=MagickFalse;
+        break;
+      }
   }
   scale_view=DestroyCacheView(scale_view);
   image_view=DestroyCacheView(image_view);
@@ -3397,7 +3666,7 @@ MagickExport Image *ThumbnailImage(const Image *image,const size_t columns,
 
   assert(image != (Image *) NULL);
   assert(image->signature == MagickSignature);
-  if( IfMagickTrue(image->debug) )
+  if (image->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
   assert(exception != (ExceptionInfo *) NULL);
   assert(exception->signature == MagickSignature);
@@ -3424,7 +3693,7 @@ MagickExport Image *ThumbnailImage(const Image *image,const size_t columns,
   if (thumbnail_image == (Image *) NULL)
     return(thumbnail_image);
   (void) ParseAbsoluteGeometry("0x0+0+0",&thumbnail_image->page);
-  if( IfMagickFalse(thumbnail_image->alpha_trait) )
+  if (thumbnail_image->alpha_trait != BlendPixelTrait)
     (void) SetImageAlphaChannel(thumbnail_image,OpaqueAlphaChannel,exception);
   thumbnail_image->depth=8;
   thumbnail_image->interlace=NoInterlace;
@@ -3448,7 +3717,7 @@ MagickExport Image *ThumbnailImage(const Image *image,const size_t columns,
       image->magick_filename);
   (void) SetImageProperty(thumbnail_image,"Thumb::URI",value,exception);
   (void) CopyMagickString(value,image->magick_filename,MaxTextExtent);
-  if( IfMagickTrue(GetPathAttributes(image->filename,&attributes)) )
+  if ( IfMagickTrue(GetPathAttributes(image->filename,&attributes)) )
     {
       (void) FormatLocaleString(value,MaxTextExtent,"%.20g",(double)
         attributes.st_mtime);