]> granicus.if.org Git - imagemagick/commitdiff
(no commit message)
authorcristy <urban-warrior@git.imagemagick.org>
Sat, 29 Nov 2014 15:05:48 +0000 (15:05 +0000)
committercristy <urban-warrior@git.imagemagick.org>
Sat, 29 Nov 2014 15:05:48 +0000 (15:05 +0000)
MagickCore/composite.c
MagickWand/mogrify.c
MagickWand/operation.c

index 2102e91d114c2e42f3a4576646f63377e6898569..30e081ef7d9f15628bf98305bec31cc51a291ebf 100644 (file)
@@ -592,9 +592,9 @@ MagickExport MagickBooleanType CompositeImage(Image *image,
     {
       if ((x_offset < 0) || (y_offset < 0))
         break;
-      if ((x_offset+(ssize_t) composite_image->columns) >= (ssize_t) image->columns)
+      if ((x_offset+(ssize_t) composite_image->columns) > (ssize_t) image->columns)
         break;
-      if ((y_offset+(ssize_t) composite_image->rows) >= (ssize_t) image->rows)
+      if ((y_offset+(ssize_t) composite_image->rows) > (ssize_t) image->rows)
         break;
       status=MagickTrue;
       composite_view=AcquireVirtualCacheView(composite_image,exception);
@@ -661,6 +661,84 @@ MagickExport MagickBooleanType CompositeImage(Image *image,
             MagickBooleanType
               proceed;
 
+#if defined(MAGICKCORE_OPENMP_SUPPORT)
+            #pragma omp critical (MagickCore_CompositeImage)
+#endif
+            proceed=SetImageProgress(image,CompositeImageTag,
+              (MagickOffsetType) y,image->rows);
+            if (proceed == MagickFalse)
+              status=MagickFalse;
+          }
+      }
+      composite_view=DestroyCacheView(composite_view);
+      image_view=DestroyCacheView(image_view);
+      composite_image=DestroyImage(composite_image);
+      return(status);
+    }
+    case IntensityCompositeOp:
+    {
+      if ((x_offset < 0) || (y_offset < 0))
+        break;
+      if ((x_offset+(ssize_t) composite_image->columns) > (ssize_t) image->columns)
+        break;
+      if ((y_offset+(ssize_t) composite_image->rows) > (ssize_t) image->rows)
+        break;
+      status=MagickTrue;
+      composite_view=AcquireVirtualCacheView(composite_image,exception);
+      image_view=AcquireAuthenticCacheView(image,exception);
+#if defined(MAGICKCORE_OPENMP_SUPPORT)
+      #pragma omp parallel for schedule(static,4) shared(status) \
+        magick_threads(composite_image,image,composite_image->rows,1)
+#endif
+      for (y=0; y < (ssize_t) composite_image->rows; y++)
+      {
+        MagickBooleanType
+          sync;
+
+        register const Quantum
+          *p;
+
+        register Quantum
+          *q;
+
+        register ssize_t
+          x;
+
+        if (status == MagickFalse)
+          continue;
+        p=GetCacheViewVirtualPixels(composite_view,0,y,composite_image->columns,
+          1,exception);
+        q=GetCacheViewAuthenticPixels(image_view,x_offset,y+y_offset,
+          composite_image->columns,1,exception);
+        if ((p == (const Quantum *) NULL) || (q == (Quantum *) NULL))
+          {
+            status=MagickFalse;
+            continue;
+          }
+        for (x=0; x < (ssize_t) composite_image->columns; x++)
+        {
+          register ssize_t
+            i;
+
+          if (GetPixelReadMask(composite_image,p) == 0)
+            {
+              p+=GetPixelChannels(composite_image);
+              q+=GetPixelChannels(image);
+              continue;
+            }
+          for (i=0; i < (ssize_t) GetPixelChannels(composite_image); i++)
+            SetPixelAlpha(image,GetPixelIntensity(composite_image,p),q);
+          p+=GetPixelChannels(composite_image);
+          q+=GetPixelChannels(image);
+        }
+        sync=SyncCacheViewAuthenticPixels(image_view,exception);
+        if (sync == MagickFalse)
+          status=MagickFalse;
+        if (image->progress_monitor != (MagickProgressMonitor) NULL)
+          {
+            MagickBooleanType
+              proceed;
+
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
             #pragma omp critical (MagickCore_CompositeImage)
 #endif
@@ -677,7 +755,6 @@ MagickExport MagickBooleanType CompositeImage(Image *image,
     }
     case CopyAlphaCompositeOp:
     case ChangeMaskCompositeOp:
-    case IntensityCompositeOp:
     {
       /*
         Modify destination outside the overlaid region and require an alpha
@@ -1291,7 +1368,6 @@ MagickExport MagickBooleanType CompositeImage(Image *image,
               case DstAtopCompositeOp:
               case DstInCompositeOp:
               case InCompositeOp:
-              case IntensityCompositeOp:
               case OutCompositeOp:
               case SrcInCompositeOp:
               case SrcOutCompositeOp:
@@ -1466,8 +1542,7 @@ MagickExport MagickBooleanType CompositeImage(Image *image,
           channel);
         if (traits == UndefinedPixelTrait)
           continue;
-        if ((compose != IntensityCompositeOp) &&
-            (composite_traits == UndefinedPixelTrait))
+        if (composite_traits == UndefinedPixelTrait)
           continue;
         /*
           Sc: source color.
@@ -1580,11 +1655,6 @@ MagickExport MagickBooleanType CompositeImage(Image *image,
                   (1.0-Da)*GetPixelIntensity(image,q) ? Sa : Da;
                 break;
               }
-              case IntensityCompositeOp:
-              {
-                pixel=GetPixelIntensity(composite_image,p);
-                break;
-              }
               case LightenIntensityCompositeOp:
               {
                 pixel=Sa*GetPixelIntensity(composite_image,p) >
@@ -1736,7 +1806,6 @@ MagickExport MagickBooleanType CompositeImage(Image *image,
             break;
           }
           case CopyAlphaCompositeOp:
-          case IntensityCompositeOp:
           {
             pixel=Dc;
             break;
index cd368241661c003e09630ecaf67836b70200742c..d8a5d46aafbd26162e5eaa95a7048baafd6454c4 100644 (file)
@@ -7788,7 +7788,8 @@ WandExport MagickBooleanType MogrifyImageList(ImageInfo *image_info,
               {
                 if ((image->compose != DisplaceCompositeOp) &&
                     (image->compose != DistortCompositeOp))
-                  status&=SetImageMask(composite_image,mask_image,exception);
+                  status&=CompositeImage(composite_image,mask_image,
+                    IntensityCompositeOp,MagickTrue,0,0,exception);
                 else
                   status&=CompositeImage(composite_image,mask_image,
                     CopyGreenCompositeOp,MagickTrue,0,0,exception);
index 3db795fade2953e9c5b1fd6db58d89d46b67d768..d9e0c10bb49c10899650c70b9f5ff65d18e97800 100644 (file)
@@ -3827,7 +3827,8 @@ WandPrivate MagickBooleanType CLIListOperatorImages(MagickCLI *cli_wand,
             {
               if ((compose != DisplaceCompositeOp) &&
                   (compose != DistortCompositeOp))
-                status&=SetImageMask(source_image,mask_image,_exception);
+                status&=CompositeImage(source_image,mask_image,
+                  IntensityCompositeOp,MagickTrue,0,0,_exception);
               else
                 status&=CompositeImage(source_image,mask_image,
                   CopyGreenCompositeOp,MagickTrue,0,0,_exception);