]> granicus.if.org Git - imagemagick/blobdiff - MagickCore/fx.c
(no commit message)
[imagemagick] / MagickCore / fx.c
index ff60c5b7d6c8686940d3b19b6efa164558664fa7..c0f1f8e0059c7b1aa75f81e1a9d902aff01c9bf6 100644 (file)
@@ -48,6 +48,7 @@
 #include "MagickCore/cache-view.h"
 #include "MagickCore/color.h"
 #include "MagickCore/color-private.h"
+#include "MagickCore/colorspace-private.h"
 #include "MagickCore/composite.h"
 #include "MagickCore/decorate.h"
 #include "MagickCore/distort.h"
@@ -264,6 +265,7 @@ MagickExport Image *AddNoiseImage(const Image *image,const NoiseType noise_type,
     *noise_image;
 
   MagickBooleanType
+    concurrent,
     status;
 
   MagickOffsetType
@@ -298,10 +300,12 @@ MagickExport Image *AddNoiseImage(const Image *image,const NoiseType noise_type,
   status=MagickTrue;
   progress=0;
   random_info=AcquireRandomInfoThreadSet();
+  concurrent=GetRandomSecretKey(random_info[0]) == ~0UL ? MagickTrue :
+    MagickFalse;
   image_view=AcquireCacheView(image);
   noise_view=AcquireCacheView(noise_image);
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
-  #pragma omp parallel for schedule(static,4) shared(progress,status)
+  #pragma omp parallel for schedule(static,4) shared(progress,status) omp_concurrent(concurrent)
 #endif
   for (y=0; y < (ssize_t) image->rows; y++)
   {
@@ -335,6 +339,12 @@ MagickExport Image *AddNoiseImage(const Image *image,const NoiseType noise_type,
       register ssize_t
         i;
 
+      if (GetPixelMask(image,p) != 0)
+        {
+          p+=GetPixelChannels(image);
+          q+=GetPixelChannels(noise_image);
+          continue;
+        }
       for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
       {
         PixelChannel
@@ -350,8 +360,7 @@ MagickExport Image *AddNoiseImage(const Image *image,const NoiseType noise_type,
         if ((traits == UndefinedPixelTrait) ||
             (noise_traits == UndefinedPixelTrait))
           continue;
-        if (((noise_traits & CopyPixelTrait) != 0) ||
-            (GetPixelMask(image,p) != 0))
+        if ((noise_traits & CopyPixelTrait) != 0)
           {
             SetPixelChannel(noise_image,channel,p[i],q);
             continue;
@@ -642,6 +651,8 @@ MagickExport Image *ColorizeImage(const Image *image,const char *blend,
   const PixelInfo *colorize,ExceptionInfo *exception)
 {
 #define ColorizeImageTag  "Colorize/Image"
+#define Colorize(pixel,blend_percentage,colorize)  \
+  (pixel)=((pixel)*(100.0-(blend_percentage))+(colorize)*(blend_percentage))/100.0;
 
   CacheView
     *colorize_view,
@@ -663,7 +674,7 @@ MagickExport Image *ColorizeImage(const Image *image,const char *blend,
     flags;
 
   PixelInfo
-    pixel;
+    blend_percentage;
 
   ssize_t
     y;
@@ -686,33 +697,33 @@ MagickExport Image *ColorizeImage(const Image *image,const char *blend,
       colorize_image=DestroyImage(colorize_image);
       return((Image *) NULL);
     }
-  if ((colorize->matte != MagickFalse) &&
-      (colorize_image->matte == MagickFalse))
+  if ((IsGrayColorspace(image->colorspace) != MagickFalse) &&
+      (IsPixelInfoGray(colorize) != MagickFalse))
+    (void) SetImageColorspace(colorize_image,sRGBColorspace,exception);
+  if ((colorize_image->matte == MagickFalse) &&
+      (colorize->matte != MagickFalse))
     (void) SetImageAlpha(colorize_image,OpaqueAlpha,exception);
   if (blend == (const char *) NULL)
     return(colorize_image);
-  /*
-    Determine RGB values of the fill color for pixel
-  */
-  GetPixelInfo(image,&pixel);
+  GetPixelInfo(image,&blend_percentage);
   flags=ParseGeometry(blend,&geometry_info);
-  pixel.red=geometry_info.rho;
-  pixel.green=geometry_info.rho;
-  pixel.blue=geometry_info.rho;
-  pixel.alpha=100.0;
+  blend_percentage.red=geometry_info.rho;
+  blend_percentage.green=geometry_info.rho;
+  blend_percentage.blue=geometry_info.rho;
+  blend_percentage.black=geometry_info.rho;
+  blend_percentage.alpha=geometry_info.rho;
   if ((flags & SigmaValue) != 0)
-    pixel.green=geometry_info.sigma;
+    blend_percentage.green=geometry_info.sigma;
   if ((flags & XiValue) != 0)
-    pixel.blue=geometry_info.xi;
+    blend_percentage.blue=geometry_info.xi;
   if ((flags & PsiValue) != 0)
-    pixel.alpha=geometry_info.psi;
-  if (pixel.colorspace == CMYKColorspace)
+    blend_percentage.alpha=geometry_info.psi;
+  if (blend_percentage.colorspace == CMYKColorspace)
     {
-      pixel.black=geometry_info.rho;
       if ((flags & PsiValue) != 0)
-        pixel.black=geometry_info.psi;
+        blend_percentage.black=geometry_info.psi;
       if ((flags & ChiValue) != 0)
-        pixel.alpha=geometry_info.chi;
+        blend_percentage.alpha=geometry_info.chi;
     }
   /*
     Colorize DirectClass image.
@@ -729,6 +740,9 @@ MagickExport Image *ColorizeImage(const Image *image,const char *blend,
     MagickBooleanType
       sync;
 
+    PixelInfo
+      pixel;
+
     register const Quantum
       *restrict p;
 
@@ -748,71 +762,22 @@ MagickExport Image *ColorizeImage(const Image *image,const char *blend,
         status=MagickFalse;
         continue;
       }
+    GetPixelInfo(colorize_image,&pixel);
     for (x=0; x < (ssize_t) image->columns; x++)
     {
-      register ssize_t
-        i;
-
-      for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
-      {
-        PixelChannel
-          channel;
-
-        PixelTrait
-          colorize_traits,
-          traits;
-
-        channel=GetPixelChannelMapChannel(image,i);
-        traits=GetPixelChannelMapTraits(image,channel);
-        colorize_traits=GetPixelChannelMapTraits(colorize_image,channel);
-        if ((traits == UndefinedPixelTrait) ||
-            (colorize_traits == UndefinedPixelTrait))
-          continue;
-        if (((colorize_traits & CopyPixelTrait) != 0) ||
-            (GetPixelMask(image,p) != 0))
-          {
-            SetPixelChannel(colorize_image,channel,p[i],q);
-            continue;
-          }
-        switch (channel)
+      if (GetPixelMask(colorize_image,q) != 0)
         {
-          case RedPixelChannel:
-          {
-            SetPixelChannel(colorize_image,channel,ClampToQuantum((p[i]*
-              (100.0-pixel.red)+colorize->red*pixel.red)/100.0),q);
-            break;
-          }
-          case GreenPixelChannel:
-          {
-            SetPixelChannel(colorize_image,channel,ClampToQuantum((p[i]*
-              (100.0-pixel.green)+colorize->green*pixel.green)/100.0),q);
-            break;
-          }
-          case BluePixelChannel:
-          {
-            SetPixelChannel(colorize_image,channel,ClampToQuantum((p[i]*
-              (100.0-pixel.blue)+colorize->blue*pixel.blue)/100.0),q);
-            break;
-          }
-          case BlackPixelChannel:
-          {
-            SetPixelChannel(colorize_image,channel,ClampToQuantum((p[i]*
-              (100.0-pixel.black)+colorize->black*pixel.black)/100.0),q);
-            break;
-          }
-          case AlphaPixelChannel:
-          {
-            SetPixelChannel(colorize_image,channel,ClampToQuantum((p[i]*
-              (100.0-pixel.alpha)+colorize->alpha*pixel.alpha)/100.0),q);
-            break;
-          }
-          default:
-          {
-            SetPixelChannel(colorize_image,channel,p[i],q);
-            break;
-          }
+          p+=GetPixelChannels(image);
+          q+=GetPixelChannels(colorize_image);
+          continue;
         }
-      }
+      GetPixelInfoPixel(image,p,&pixel);
+      Colorize(pixel.red,blend_percentage.red,colorize->red);
+      Colorize(pixel.green,blend_percentage.green,colorize->green);
+      Colorize(pixel.blue,blend_percentage.blue,colorize->blue);
+      Colorize(pixel.black,blend_percentage.black,colorize->black);
+      Colorize(pixel.alpha,blend_percentage.alpha,colorize->alpha);
+      SetPixelInfoPixel(colorize_image,&pixel,q);
       p+=GetPixelChannels(image);
       q+=GetPixelChannels(colorize_image);
     }
@@ -3098,6 +3063,12 @@ MagickExport Image *FxImage(const Image *image,const char *expression,
       register ssize_t
         i;
 
+      if (GetPixelMask(image,p) != 0)
+        {
+          p+=GetPixelChannels(image);
+          q+=GetPixelChannels(fx_image);
+          continue;
+        }
       for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
       {
         MagickRealType
@@ -3116,8 +3087,7 @@ MagickExport Image *FxImage(const Image *image,const char *expression,
         if ((traits == UndefinedPixelTrait) ||
             (fx_traits == UndefinedPixelTrait))
           continue;
-        if (((fx_traits & CopyPixelTrait) != 0) ||
-            (GetPixelMask(image,p) != 0))
+        if ((fx_traits & CopyPixelTrait) != 0)
           {
             SetPixelChannel(fx_image,channel,p[i],q);
             continue;
@@ -3537,6 +3507,12 @@ MagickExport Image *MorphImages(const Image *image,
           register ssize_t
             i;
 
+          if (GetPixelMask(image,p) != 0)
+            {
+              p+=GetPixelChannels(image);
+              q+=GetPixelChannels(morph_image);
+              continue;
+            }
           for (i=0; i < (ssize_t) GetPixelChannels(morph_image); i++)
           {
             PixelChannel
@@ -3552,8 +3528,7 @@ MagickExport Image *MorphImages(const Image *image,
             if ((traits == UndefinedPixelTrait) ||
                 (morph_traits == UndefinedPixelTrait))
               continue;
-            if (((morph_traits & CopyPixelTrait) != 0) ||
-                (GetPixelMask(image,p) != 0))
+            if ((morph_traits & CopyPixelTrait) != 0)
               {
                 SetPixelChannel(morph_image,channel,p[i],q);
                 continue;
@@ -4295,6 +4270,8 @@ MagickExport Image *ShadowImage(const Image *image,const double alpha,
   clone_image=CloneImage(image,0,0,MagickTrue,exception);
   if (clone_image == (Image *) NULL)
     return((Image *) NULL);
+  if (IsGrayColorspace(image->colorspace) != MagickFalse)
+    (void) TransformImageColorspace(clone_image,sRGBColorspace,exception);
   (void) SetImageVirtualPixelMethod(clone_image,EdgeVirtualPixelMethod,
     exception);
   border_info.width=(size_t) floor(2.0*sigma+0.5);
@@ -4420,6 +4397,7 @@ MagickExport Image *SketchImage(const Image *image,const double radius,
     *sketch_image;
 
   MagickBooleanType
+    concurrent,
     status;
 
   RandomInfo
@@ -4437,9 +4415,11 @@ MagickExport Image *SketchImage(const Image *image,const double radius,
     return((Image *) NULL);
   status=MagickTrue;
   random_info=AcquireRandomInfoThreadSet();
+  concurrent=GetRandomSecretKey(random_info[0]) == ~0UL ? MagickTrue :
+    MagickFalse;
   random_view=AcquireCacheView(random_image);
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
-  #pragma omp parallel for schedule(static,4) shared(status)
+  #pragma omp parallel for schedule(static,4) shared(status) omp_concurrent(concurrent)
 #endif
   for (y=0; y < (ssize_t) random_image->rows; y++)
   {