]> granicus.if.org Git - imagemagick/blobdiff - MagickCore/decorate.c
Added caNv, eXIf, and pHYs to the list of PNG chunks to be removed
[imagemagick] / MagickCore / decorate.c
index 6092acecf9ed0852cc8b5442f53f98070f2f98a2..43f35ecb231634c747e7f8c870d9f23ec3718499 100644 (file)
 %                     MagickCore Image Decoration Methods                     %
 %                                                                             %
 %                                Software Design                              %
-%                                  John Cristy                                %
+%                                     Cristy                                  %
 %                                   July 1992                                 %
 %                                                                             %
 %                                                                             %
-%  Copyright 1999-2012 ImageMagick Studio LLC, a non-profit organization      %
+%  Copyright 1999-2017 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  %
 %  obtain a copy of the License at                                            %
 %                                                                             %
-%    http://www.imagemagick.org/script/license.php                            %
+%    https://www.imagemagick.org/script/license.php                           %
 %                                                                             %
 %  Unless required by applicable law or agreed to in writing, software        %
 %  distributed under the License is distributed on an "AS IS" BASIS,          %
@@ -55,6 +55,7 @@
 #include "MagickCore/pixel-accessor.h"
 #include "MagickCore/quantum.h"
 #include "MagickCore/quantum-private.h"
+#include "MagickCore/resource_.h"
 #include "MagickCore/thread-private.h"
 #include "MagickCore/transform.h"
 \f
@@ -111,7 +112,7 @@ MagickExport Image *BorderImage(const Image *image,
     frame_info;
 
   assert(image != (const Image *) NULL);
-  assert(image->signature == MagickSignature);
+  assert(image->signature == MagickCoreSignature);
   if (image->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
   assert(border_info != (RectangleInfo *) NULL);
@@ -186,7 +187,6 @@ MagickExport Image *FrameImage(const Image *image,const FrameInfo *frame_info,
   PixelInfo
     accentuate,
     highlight,
-    interior,
     matte,
     shadow,
     trough;
@@ -206,16 +206,16 @@ MagickExport Image *FrameImage(const Image *image,const FrameInfo *frame_info,
     Check frame geometry.
   */
   assert(image != (Image *) NULL);
-  assert(image->signature == MagickSignature);
+  assert(image->signature == MagickCoreSignature);
   if (image->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
   assert(frame_info != (FrameInfo *) NULL);
   if ((frame_info->outer_bevel < 0) || (frame_info->inner_bevel < 0))
     ThrowImageException(OptionError,"FrameIsLessThanImageSize");
   bevel_width=(size_t) (frame_info->outer_bevel+frame_info->inner_bevel);
-  width=frame_info->width-frame_info->x-bevel_width;
-  height=frame_info->height-frame_info->y-bevel_width;
-  if ((width < image->columns) || (height < image->rows))
+  x=(ssize_t) frame_info->width-frame_info->x-bevel_width;
+  y=(ssize_t) frame_info->height-frame_info->y-bevel_width;
+  if ((x < (ssize_t) image->columns) |  (y < (ssize_t) image->rows))
     ThrowImageException(OptionError,"FrameIsLessThanImageSize");
   /*
     Initialize framed image attributes.
@@ -229,8 +229,11 @@ MagickExport Image *FrameImage(const Image *image,const FrameInfo *frame_info,
       frame_image=DestroyImage(frame_image);
       return((Image *) NULL);
     }
-  if ((frame_image->border_color.matte != MagickFalse) &&
-      (frame_image->matte == MagickFalse))
+  if ((IsPixelInfoGray(&frame_image->border_color) == MagickFalse) &&
+      (IsGrayColorspace(frame_image->colorspace) != MagickFalse))
+    (void) SetImageColorspace(frame_image,sRGBColorspace,exception);
+  if ((frame_image->matte_color.alpha_trait != UndefinedPixelTrait) &&
+      (frame_image->alpha_trait == UndefinedPixelTrait))
     (void) SetImageAlpha(frame_image,OpaqueAlpha,exception);
   frame_image->page=image->page;
   if ((image->page.width != 0) && (image->page.height != 0))
@@ -241,26 +244,25 @@ MagickExport Image *FrameImage(const Image *image,const FrameInfo *frame_info,
   /*
     Initialize 3D effects color.
   */
-  interior=image->border_color;
   matte=image->matte_color;
   accentuate=matte;
-  accentuate.red=(MagickRealType) (QuantumScale*((QuantumRange-
+  accentuate.red=(double) (QuantumScale*((QuantumRange-
     AccentuateModulate)*matte.red+(QuantumRange*AccentuateModulate)));
-  accentuate.green=(MagickRealType) (QuantumScale*((QuantumRange-
+  accentuate.green=(double) (QuantumScale*((QuantumRange-
     AccentuateModulate)*matte.green+(QuantumRange*AccentuateModulate)));
-  accentuate.blue=(MagickRealType) (QuantumScale*((QuantumRange-
+  accentuate.blue=(double) (QuantumScale*((QuantumRange-
     AccentuateModulate)*matte.blue+(QuantumRange*AccentuateModulate)));
-  accentuate.black=(MagickRealType) (QuantumScale*((QuantumRange-
+  accentuate.black=(double) (QuantumScale*((QuantumRange-
     AccentuateModulate)*matte.black+(QuantumRange*AccentuateModulate)));
   accentuate.alpha=matte.alpha;
   highlight=matte;
-  highlight.red=(MagickRealType) (QuantumScale*((QuantumRange-
+  highlight.red=(double) (QuantumScale*((QuantumRange-
     HighlightModulate)*matte.red+(QuantumRange*HighlightModulate)));
-  highlight.green=(MagickRealType) (QuantumScale*((QuantumRange-
+  highlight.green=(double) (QuantumScale*((QuantumRange-
     HighlightModulate)*matte.green+(QuantumRange*HighlightModulate)));
-  highlight.blue=(MagickRealType) (QuantumScale*((QuantumRange-
+  highlight.blue=(double) (QuantumScale*((QuantumRange-
     HighlightModulate)*matte.blue+(QuantumRange*HighlightModulate)));
-  highlight.black=(MagickRealType) (QuantumScale*((QuantumRange-
+  highlight.black=(double) (QuantumScale*((QuantumRange-
     HighlightModulate)*matte.black+(QuantumRange*HighlightModulate)));
   highlight.alpha=matte.alpha;
   shadow=matte;
@@ -277,8 +279,8 @@ MagickExport Image *FrameImage(const Image *image,const FrameInfo *frame_info,
   trough.alpha=matte.alpha;
   status=MagickTrue;
   progress=0;
-  image_view=AcquireCacheView(image);
-  frame_view=AcquireCacheView(frame_image);
+  image_view=AcquireVirtualCacheView(image,exception);
+  frame_view=AcquireAuthenticCacheView(frame_image,exception);
   height=(size_t) (frame_info->outer_bevel+(frame_info->y-bevel_width)+
     frame_info->inner_bevel);
   if (height != 0)
@@ -287,7 +289,7 @@ MagickExport Image *FrameImage(const Image *image,const FrameInfo *frame_info,
         x;
 
       register Quantum
-        *restrict q;
+        *magick_restrict q;
 
       /*
         Draw top of ornamental border.
@@ -304,14 +306,14 @@ MagickExport Image *FrameImage(const Image *image,const FrameInfo *frame_info,
             for (x=0; x < (ssize_t) (frame_image->columns-y); x++)
             {
               if (x < y)
-                SetPixelInfoPixel(frame_image,&highlight,q);
+                SetPixelViaPixelInfo(frame_image,&highlight,q);
               else
-                SetPixelInfoPixel(frame_image,&accentuate,q);
+                SetPixelViaPixelInfo(frame_image,&accentuate,q);
               q+=GetPixelChannels(frame_image);
             }
             for ( ; x < (ssize_t) frame_image->columns; x++)
             {
-              SetPixelInfoPixel(frame_image,&shadow,q);
+              SetPixelViaPixelInfo(frame_image,&shadow,q);
               q+=GetPixelChannels(frame_image);
             }
           }
@@ -319,18 +321,18 @@ MagickExport Image *FrameImage(const Image *image,const FrameInfo *frame_info,
           {
             for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
             {
-              SetPixelInfoPixel(frame_image,&highlight,q);
+              SetPixelViaPixelInfo(frame_image,&highlight,q);
               q+=GetPixelChannels(frame_image);
             }
             width=frame_image->columns-2*frame_info->outer_bevel;
             for (x=0; x < (ssize_t) width; x++)
             {
-              SetPixelInfoPixel(frame_image,&matte,q);
+              SetPixelViaPixelInfo(frame_image,&matte,q);
               q+=GetPixelChannels(frame_image);
             }
             for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
             {
-              SetPixelInfoPixel(frame_image,&shadow,q);
+              SetPixelViaPixelInfo(frame_image,&shadow,q);
               q+=GetPixelChannels(frame_image);
             }
           }
@@ -338,12 +340,12 @@ MagickExport Image *FrameImage(const Image *image,const FrameInfo *frame_info,
           {
             for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
             {
-              SetPixelInfoPixel(frame_image,&highlight,q);
+              SetPixelViaPixelInfo(frame_image,&highlight,q);
               q+=GetPixelChannels(frame_image);
             }
             for (x=0; x < (ssize_t) (frame_info->x-bevel_width); x++)
             {
-              SetPixelInfoPixel(frame_image,&matte,q);
+              SetPixelViaPixelInfo(frame_image,&matte,q);
               q+=GetPixelChannels(frame_image);
             }
             width=image->columns+((size_t) frame_info->inner_bevel << 1)-
@@ -351,25 +353,25 @@ MagickExport Image *FrameImage(const Image *image,const FrameInfo *frame_info,
             for (x=0; x < (ssize_t) width; x++)
             {
               if (x < y)
-                SetPixelInfoPixel(frame_image,&shadow,q);
+                SetPixelViaPixelInfo(frame_image,&shadow,q);
               else
-                SetPixelInfoPixel(frame_image,&trough,q);
+                SetPixelViaPixelInfo(frame_image,&trough,q);
               q+=GetPixelChannels(frame_image);
             }
             for ( ; x < (ssize_t) (image->columns+2*frame_info->inner_bevel); x++)
             {
-              SetPixelInfoPixel(frame_image,&highlight,q);
+              SetPixelViaPixelInfo(frame_image,&highlight,q);
               q+=GetPixelChannels(frame_image);
             }
             width=frame_info->width-frame_info->x-image->columns-bevel_width;
             for (x=0; x < (ssize_t) width; x++)
             {
-              SetPixelInfoPixel(frame_image,&matte,q);
+              SetPixelViaPixelInfo(frame_image,&matte,q);
               q+=GetPixelChannels(frame_image);
             }
             for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
             {
-              SetPixelInfoPixel(frame_image,&shadow,q);
+              SetPixelViaPixelInfo(frame_image,&shadow,q);
               q+=GetPixelChannels(frame_image);
             }
           }
@@ -379,8 +381,9 @@ MagickExport Image *FrameImage(const Image *image,const FrameInfo *frame_info,
   /*
     Draw sides of ornamental border.
   */
-#if defined(MAGICKCORE_OPENMP_SUPPORT) 
-  #pragma omp parallel for schedule(static) shared(progress,status)
+#if defined(MAGICKCORE_OPENMP_SUPPORT)
+  #pragma omp parallel for schedule(static,4) shared(progress,status) \
+    magick_threads(image,frame_image,1,1)
 #endif
   for (y=0; y < (ssize_t) image->rows; y++)
   {
@@ -388,7 +391,7 @@ MagickExport Image *FrameImage(const Image *image,const FrameInfo *frame_info,
       x;
 
     register Quantum
-      *restrict q;
+      *magick_restrict q;
 
     size_t
       width;
@@ -407,70 +410,41 @@ MagickExport Image *FrameImage(const Image *image,const FrameInfo *frame_info,
       }
     for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
     {
-      SetPixelInfoPixel(frame_image,&highlight,q);
+      SetPixelViaPixelInfo(frame_image,&highlight,q);
       q+=GetPixelChannels(frame_image);
     }
     for (x=0; x < (ssize_t) (frame_info->x-bevel_width); x++)
     {
-      SetPixelInfoPixel(frame_image,&matte,q);
+      SetPixelViaPixelInfo(frame_image,&matte,q);
       q+=GetPixelChannels(frame_image);
     }
     for (x=0; x < (ssize_t) frame_info->inner_bevel; x++)
     {
-      SetPixelInfoPixel(frame_image,&shadow,q);
+      SetPixelViaPixelInfo(frame_image,&shadow,q);
       q+=GetPixelChannels(frame_image);
     }
     /*
-      Set frame interior to interior color.
+      Set frame interior pixels.
     */
-    if ((compose != CopyCompositeOp) && ((compose != OverCompositeOp) ||
-        (image->matte != MagickFalse)))
-      for (x=0; x < (ssize_t) image->columns; x++)
-      {
-        SetPixelInfoPixel(frame_image,&interior,q);
-        q+=GetPixelChannels(frame_image);
-      }
-    else
-      {
-        register const Quantum
-          *p;
-
-        p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception);
-        if (p == (const Quantum *) NULL)
-          {
-            status=MagickFalse;
-            continue;
-          }
-        for (x=0; x < (ssize_t) image->columns; x++)
-        {
-          if ((GetPixelRedTraits(image) & UpdatePixelTrait) != 0)
-            SetPixelRed(frame_image,GetPixelRed(image,p),q);
-          if ((GetPixelGreenTraits(image) & UpdatePixelTrait) != 0)
-            SetPixelGreen(frame_image,GetPixelGreen(image,p),q);
-          if ((GetPixelBlueTraits(image) & UpdatePixelTrait) != 0)
-            SetPixelBlue(frame_image,GetPixelBlue(image,p),q);
-          if ((GetPixelBlackTraits(image) & UpdatePixelTrait) != 0)
-            SetPixelBlack(frame_image,GetPixelBlack(image,p),q);
-          if ((GetPixelAlphaTraits(image) & UpdatePixelTrait) != 0)
-            SetPixelAlpha(frame_image,GetPixelAlpha(image,p),q);
-          p+=GetPixelChannels(image);
-          q+=GetPixelChannels(frame_image);
-        }
-      }
+    for (x=0; x < (ssize_t) image->columns; x++)
+    {
+      SetPixelViaPixelInfo(frame_image,&frame_image->border_color,q);
+      q+=GetPixelChannels(frame_image);
+    }
     for (x=0; x < (ssize_t) frame_info->inner_bevel; x++)
     {
-      SetPixelInfoPixel(frame_image,&highlight,q);
+      SetPixelViaPixelInfo(frame_image,&highlight,q);
       q+=GetPixelChannels(frame_image);
     }
     width=frame_info->width-frame_info->x-image->columns-bevel_width;
     for (x=0; x < (ssize_t) width; x++)
     {
-      SetPixelInfoPixel(frame_image,&matte,q);
+      SetPixelViaPixelInfo(frame_image,&matte,q);
       q+=GetPixelChannels(frame_image);
     }
     for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
     {
-      SetPixelInfoPixel(frame_image,&shadow,q);
+      SetPixelViaPixelInfo(frame_image,&shadow,q);
       q+=GetPixelChannels(frame_image);
     }
     if (SyncCacheViewAuthenticPixels(frame_view,exception) == MagickFalse)
@@ -480,7 +454,7 @@ MagickExport Image *FrameImage(const Image *image,const FrameInfo *frame_info,
         MagickBooleanType
           proceed;
 
-#if defined(MAGICKCORE_OPENMP_SUPPORT) 
+#if defined(MAGICKCORE_OPENMP_SUPPORT)
         #pragma omp critical (MagickCore_FrameImage)
 #endif
         proceed=SetImageProgress(image,FrameImageTag,progress++,image->rows);
@@ -496,7 +470,7 @@ MagickExport Image *FrameImage(const Image *image,const FrameInfo *frame_info,
         x;
 
       register Quantum
-        *restrict q;
+        *magick_restrict q;
 
       /*
         Draw bottom of ornamental border.
@@ -512,36 +486,36 @@ MagickExport Image *FrameImage(const Image *image,const FrameInfo *frame_info,
           {
             for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
             {
-              SetPixelInfoPixel(frame_image,&highlight,q);
+              SetPixelViaPixelInfo(frame_image,&highlight,q);
               q+=GetPixelChannels(frame_image);
             }
             for (x=0; x < (ssize_t) (frame_info->x-bevel_width); x++)
             {
-              SetPixelInfoPixel(frame_image,&matte,q);
+              SetPixelViaPixelInfo(frame_image,&matte,q);
               q+=GetPixelChannels(frame_image);
             }
             for (x=0; x < y; x++)
             {
-              SetPixelInfoPixel(frame_image,&shadow,q);
+              SetPixelViaPixelInfo(frame_image,&shadow,q);
               q+=GetPixelChannels(frame_image);
             }
             for ( ; x < (ssize_t) (image->columns+2*frame_info->inner_bevel); x++)
             {
               if (x >= (ssize_t) (image->columns+2*frame_info->inner_bevel-y))
-                SetPixelInfoPixel(frame_image,&highlight,q);
+                SetPixelViaPixelInfo(frame_image,&highlight,q);
               else
-                SetPixelInfoPixel(frame_image,&accentuate,q);
+                SetPixelViaPixelInfo(frame_image,&accentuate,q);
               q+=GetPixelChannels(frame_image);
             }
             width=frame_info->width-frame_info->x-image->columns-bevel_width;
             for (x=0; x < (ssize_t) width; x++)
             {
-              SetPixelInfoPixel(frame_image,&matte,q);
+              SetPixelViaPixelInfo(frame_image,&matte,q);
               q+=GetPixelChannels(frame_image);
             }
             for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
             {
-              SetPixelInfoPixel(frame_image,&shadow,q);
+              SetPixelViaPixelInfo(frame_image,&shadow,q);
               q+=GetPixelChannels(frame_image);
             }
           }
@@ -550,18 +524,18 @@ MagickExport Image *FrameImage(const Image *image,const FrameInfo *frame_info,
           {
             for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
             {
-              SetPixelInfoPixel(frame_image,&highlight,q);
+              SetPixelViaPixelInfo(frame_image,&highlight,q);
               q+=GetPixelChannels(frame_image);
             }
             width=frame_image->columns-2*frame_info->outer_bevel;
             for (x=0; x < (ssize_t) width; x++)
             {
-              SetPixelInfoPixel(frame_image,&matte,q);
+              SetPixelViaPixelInfo(frame_image,&matte,q);
               q+=GetPixelChannels(frame_image);
             }
             for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
             {
-              SetPixelInfoPixel(frame_image,&shadow,q);
+              SetPixelViaPixelInfo(frame_image,&shadow,q);
               q+=GetPixelChannels(frame_image);
             }
           }
@@ -569,15 +543,15 @@ MagickExport Image *FrameImage(const Image *image,const FrameInfo *frame_info,
           {
             for (x=0; x < y; x++)
             {
-              SetPixelInfoPixel(frame_image,&highlight,q);
+              SetPixelViaPixelInfo(frame_image,&highlight,q);
               q+=GetPixelChannels(frame_image);
             }
             for ( ; x < (ssize_t) frame_image->columns; x++)
             {
               if (x >= (ssize_t) (frame_image->columns-y))
-                SetPixelInfoPixel(frame_image,&shadow,q);
+                SetPixelViaPixelInfo(frame_image,&shadow,q);
               else
-                SetPixelInfoPixel(frame_image,&trough,q);
+                SetPixelViaPixelInfo(frame_image,&trough,q);
               q+=GetPixelChannels(frame_image);
             }
           }
@@ -586,16 +560,15 @@ MagickExport Image *FrameImage(const Image *image,const FrameInfo *frame_info,
     }
   frame_view=DestroyCacheView(frame_view);
   image_view=DestroyCacheView(image_view);
-  if ((compose != CopyCompositeOp) && ((compose != OverCompositeOp) ||
-      (image->matte != MagickFalse)))
-    {
-      x=(ssize_t) (frame_info->outer_bevel+(frame_info->x-bevel_width)+
-        frame_info->inner_bevel);
-      y=(ssize_t) (frame_info->outer_bevel+(frame_info->y-bevel_width)+
-        frame_info->inner_bevel);
-      (void) CompositeImage(frame_image,image,compose,MagickTrue,x,y,
-        exception);
-    }
+  x=(ssize_t) (frame_info->outer_bevel+(frame_info->x-bevel_width)+
+    frame_info->inner_bevel);
+  y=(ssize_t) (frame_info->outer_bevel+(frame_info->y-bevel_width)+
+    frame_info->inner_bevel);
+  if (status != MagickFalse)
+    status=CompositeImage(frame_image,image,compose,MagickTrue,x,y,
+      exception);
+  if (status == MagickFalse)
+    frame_image=DestroyImage(frame_image);
   return(frame_image);
 }
 \f
@@ -660,7 +633,7 @@ MagickExport MagickBooleanType RaiseImage(Image *image,
     y;
 
   assert(image != (Image *) NULL);
-  assert(image->signature == MagickSignature);
+  assert(image->signature == MagickCoreSignature);
   if (image->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
   assert(raise_info != (RectangleInfo *) NULL);
@@ -668,12 +641,12 @@ MagickExport MagickBooleanType RaiseImage(Image *image,
       (image->rows <= (raise_info->height << 1)))
     ThrowBinaryException(OptionError,"ImageSizeMustExceedBevelWidth",
       image->filename);
-  foreground=(Quantum) QuantumRange;
+  foreground=QuantumRange;
   background=(Quantum) 0;
   if (raise == MagickFalse)
     {
       foreground=(Quantum) 0;
-      background=(Quantum) QuantumRange;
+      background=QuantumRange;
     }
   if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
     return(MagickFalse);
@@ -682,9 +655,10 @@ MagickExport MagickBooleanType RaiseImage(Image *image,
   */
   status=MagickTrue;
   progress=0;
-  image_view=AcquireCacheView(image);
-#if defined(MAGICKCORE_OPENMP_SUPPORT) 
-  #pragma omp parallel for schedule(static) shared(progress,status)
+  image_view=AcquireAuthenticCacheView(image,exception);
+#if defined(MAGICKCORE_OPENMP_SUPPORT)
+  #pragma omp parallel for schedule(static,4) shared(progress,status) \
+    magick_threads(image,image,1,1)
 #endif
   for (y=0; y < (ssize_t) raise_info->height; y++)
   {
@@ -693,7 +667,7 @@ MagickExport MagickBooleanType RaiseImage(Image *image,
       x;
 
     register Quantum
-      *restrict q;
+      *magick_restrict q;
 
     if (status == MagickFalse)
       continue;
@@ -705,74 +679,55 @@ MagickExport MagickBooleanType RaiseImage(Image *image,
       }
     for (x=0; x < y; x++)
     {
-      if (GetPixelMask(image,q) != 0)
+      if (GetPixelWriteMask(image,q) == 0)
         {
           q+=GetPixelChannels(image);
           continue;
         }
       for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
       {
-        PixelChannel
-          channel;
-
-        PixelTrait
-          traits;
-
-        channel=GetPixelChannelMapChannel(image,i);
-        traits=GetPixelChannelMapTraits(image,channel);
+        PixelChannel channel=GetPixelChannelChannel(image,i);
+        PixelTrait traits=GetPixelChannelTraits(image,channel);
         if ((traits & UpdatePixelTrait) == 0)
           continue;
-        q[i]=ClampToQuantum(QuantumScale*((MagickRealType) q[i]*HighlightFactor+
-          (MagickRealType) foreground*(QuantumRange-HighlightFactor)));
+        q[i]=ClampToQuantum(QuantumScale*((double) q[i]*HighlightFactor+(double)
+          foreground*(QuantumRange-HighlightFactor)));
       }
       q+=GetPixelChannels(image);
     }
     for ( ; x < (ssize_t) (image->columns-y); x++)
     {
-      if (GetPixelMask(image,q) != 0)
+      if (GetPixelWriteMask(image,q) == 0)
         {
           q+=GetPixelChannels(image);
           continue;
         }
       for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
       {
-        PixelChannel
-          channel;
-
-        PixelTrait
-          traits;
-
-        channel=GetPixelChannelMapChannel(image,i);
-        traits=GetPixelChannelMapTraits(image,channel);
+        PixelChannel channel=GetPixelChannelChannel(image,i);
+        PixelTrait traits=GetPixelChannelTraits(image,channel);
         if ((traits & UpdatePixelTrait) == 0)
           continue;
-        q[i]=ClampToQuantum(QuantumScale*((MagickRealType) q[i]*
-          AccentuateFactor+(MagickRealType) foreground*(QuantumRange-
-          AccentuateFactor)));
+        q[i]=ClampToQuantum(QuantumScale*((double) q[i]*AccentuateFactor+
+          (double) foreground*(QuantumRange-AccentuateFactor)));
       }
       q+=GetPixelChannels(image);
     }
     for ( ; x < (ssize_t) image->columns; x++)
     {
-      if (GetPixelMask(image,q) != 0)
+      if (GetPixelWriteMask(image,q) == 0)
         {
           q+=GetPixelChannels(image);
           continue;
         }
       for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
       {
-        PixelChannel
-          channel;
-
-        PixelTrait
-          traits;
-
-        channel=GetPixelChannelMapChannel(image,i);
-        traits=GetPixelChannelMapTraits(image,channel);
+        PixelChannel channel=GetPixelChannelChannel(image,i);
+        PixelTrait traits=GetPixelChannelTraits(image,channel);
         if ((traits & UpdatePixelTrait) == 0)
           continue;
-        q[i]=ClampToQuantum(QuantumScale*((MagickRealType) q[i]*ShadowFactor+
-          (MagickRealType) background*(QuantumRange-ShadowFactor)));
+        q[i]=ClampToQuantum(QuantumScale*((double) q[i]*ShadowFactor+(double)
+          background*(QuantumRange-ShadowFactor)));
       }
       q+=GetPixelChannels(image);
     }
@@ -783,13 +738,17 @@ MagickExport MagickBooleanType RaiseImage(Image *image,
         MagickBooleanType
           proceed;
 
+#if defined(MAGICKCORE_OPENMP_SUPPORT)
+        #pragma omp critical (MagickCore_RaiseImage)
+#endif
         proceed=SetImageProgress(image,RaiseImageTag,progress++,image->rows);
         if (proceed == MagickFalse)
           status=MagickFalse;
       }
   }
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
-  #pragma omp parallel for schedule(static) shared(progress,status)
+  #pragma omp parallel for schedule(static,4) shared(progress,status) \
+    magick_threads(image,image,1,1)
 #endif
   for (y=(ssize_t) raise_info->height; y < (ssize_t) (image->rows-raise_info->height); y++)
   {
@@ -798,7 +757,7 @@ MagickExport MagickBooleanType RaiseImage(Image *image,
       x;
 
     register Quantum
-      *restrict q;
+      *magick_restrict q;
 
     if (status == MagickFalse)
       continue;
@@ -810,25 +769,19 @@ MagickExport MagickBooleanType RaiseImage(Image *image,
       }
     for (x=0; x < (ssize_t) raise_info->width; x++)
     {
-      if (GetPixelMask(image,q) != 0)
+      if (GetPixelWriteMask(image,q) == 0)
         {
           q+=GetPixelChannels(image);
           continue;
         }
       for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
       {
-        PixelChannel
-          channel;
-
-        PixelTrait
-          traits;
-
-        channel=GetPixelChannelMapChannel(image,i);
-        traits=GetPixelChannelMapTraits(image,channel);
+        PixelChannel channel=GetPixelChannelChannel(image,i);
+        PixelTrait traits=GetPixelChannelTraits(image,channel);
         if ((traits & UpdatePixelTrait) == 0)
           continue;
-        q[i]=ClampToQuantum(QuantumScale*((MagickRealType) q[i]*HighlightFactor+
-          (MagickRealType) foreground*(QuantumRange-HighlightFactor)));
+        q[i]=ClampToQuantum(QuantumScale*((double) q[i]*HighlightFactor+(double)
+          foreground*(QuantumRange-HighlightFactor)));
       }
       q+=GetPixelChannels(image);
     }
@@ -836,25 +789,19 @@ MagickExport MagickBooleanType RaiseImage(Image *image,
       q+=GetPixelChannels(image);
     for ( ; x < (ssize_t) image->columns; x++)
     {
-      if (GetPixelMask(image,q) != 0)
+      if (GetPixelWriteMask(image,q) == 0)
         {
           q+=GetPixelChannels(image);
           continue;
         }
       for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
       {
-        PixelChannel
-          channel;
-
-        PixelTrait
-          traits;
-
-        channel=GetPixelChannelMapChannel(image,i);
-        traits=GetPixelChannelMapTraits(image,channel);
+        PixelChannel channel=GetPixelChannelChannel(image,i);
+        PixelTrait traits=GetPixelChannelTraits(image,channel);
         if ((traits & UpdatePixelTrait) == 0)
           continue;
-        q[i]=ClampToQuantum(QuantumScale*((MagickRealType) q[i]*ShadowFactor+
-          (MagickRealType) background*(QuantumRange-ShadowFactor)));
+        q[i]=ClampToQuantum(QuantumScale*((double) q[i]*ShadowFactor+(double)
+          background*(QuantumRange-ShadowFactor)));
       }
       q+=GetPixelChannels(image);
     }
@@ -865,13 +812,17 @@ MagickExport MagickBooleanType RaiseImage(Image *image,
         MagickBooleanType
           proceed;
 
+#if defined(MAGICKCORE_OPENMP_SUPPORT)
+        #pragma omp critical (MagickCore_RaiseImage)
+#endif
         proceed=SetImageProgress(image,RaiseImageTag,progress++,image->rows);
         if (proceed == MagickFalse)
           status=MagickFalse;
       }
   }
-#if defined(MAGICKCORE_OPENMP_SUPPORT) 
-  #pragma omp parallel for schedule(static) shared(progress,status)
+#if defined(MAGICKCORE_OPENMP_SUPPORT)
+  #pragma omp parallel for schedule(static,4) shared(progress,status) \
+    magick_threads(image,image,1,1)
 #endif
   for (y=(ssize_t) (image->rows-raise_info->height); y < (ssize_t) image->rows; y++)
   {
@@ -880,7 +831,7 @@ MagickExport MagickBooleanType RaiseImage(Image *image,
       x;
 
     register Quantum
-      *restrict q;
+      *magick_restrict q;
 
     if (status == MagickFalse)
       continue;
@@ -892,25 +843,19 @@ MagickExport MagickBooleanType RaiseImage(Image *image,
       }
     for (x=0; x < (ssize_t) (image->rows-y); x++)
     {
-      if (GetPixelMask(image,q) != 0)
+      if (GetPixelWriteMask(image,q) == 0)
         {
           q+=GetPixelChannels(image);
           continue;
         }
       for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
       {
-        PixelChannel
-          channel;
-
-        PixelTrait
-          traits;
-
-        channel=GetPixelChannelMapChannel(image,i);
-        traits=GetPixelChannelMapTraits(image,channel);
+        PixelChannel channel=GetPixelChannelChannel(image,i);
+        PixelTrait traits=GetPixelChannelTraits(image,channel);
         if ((traits & UpdatePixelTrait) == 0)
           continue;
-        q[i]=ClampToQuantum(QuantumScale*((MagickRealType) q[i]*HighlightFactor+
-          (MagickRealType) foreground*(QuantumRange-HighlightFactor)));
+        q[i]=ClampToQuantum(QuantumScale*((double) q[i]*HighlightFactor+(double)
+          foreground*(QuantumRange-HighlightFactor)));
       }
       q+=GetPixelChannels(image);
     }
@@ -918,42 +863,30 @@ MagickExport MagickBooleanType RaiseImage(Image *image,
     {
       for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
       {
-        PixelChannel
-          channel;
-
-        PixelTrait
-          traits;
-
-        channel=GetPixelChannelMapChannel(image,i);
-        traits=GetPixelChannelMapTraits(image,channel);
+        PixelChannel channel=GetPixelChannelChannel(image,i);
+        PixelTrait traits=GetPixelChannelTraits(image,channel);
         if ((traits & UpdatePixelTrait) == 0)
           continue;
-        q[i]=ClampToQuantum(QuantumScale*((MagickRealType) q[i]*TroughFactor+
-          (MagickRealType) background*(QuantumRange-TroughFactor)));
+        q[i]=ClampToQuantum(QuantumScale*((double) q[i]*TroughFactor+
+          (double) background*(QuantumRange-TroughFactor)));
       }
       q+=GetPixelChannels(image);
     }
     for ( ; x < (ssize_t) image->columns; x++)
     {
-      if (GetPixelMask(image,q) != 0)
+      if (GetPixelWriteMask(image,q) == 0)
         {
           q+=GetPixelChannels(image);
           continue;
         }
       for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
       {
-        PixelChannel
-          channel;
-
-        PixelTrait
-          traits;
-
-        channel=GetPixelChannelMapChannel(image,i);
-        traits=GetPixelChannelMapTraits(image,channel);
+        PixelChannel channel=GetPixelChannelChannel(image,i);
+        PixelTrait traits=GetPixelChannelTraits(image,channel);
         if ((traits & UpdatePixelTrait) == 0)
           continue;
-        q[i]=ClampToQuantum(QuantumScale*((MagickRealType) q[i]*ShadowFactor+
-          (MagickRealType) background*(QuantumRange-ShadowFactor)));
+        q[i]=ClampToQuantum(QuantumScale*((double) q[i]*ShadowFactor+(double)
+          background*(QuantumRange-ShadowFactor)));
       }
       q+=GetPixelChannels(image);
     }