]> granicus.if.org Git - imagemagick/blobdiff - MagickCore/composite.c
(no commit message)
[imagemagick] / MagickCore / composite.c
index 22252238da75f40d290b41041139e406a476852e..7ce26528f87ec21e1237131828d20c1a6e3935b2 100644 (file)
@@ -72,6 +72,7 @@
 #include "MagickCore/string_.h"
 #include "MagickCore/thread-private.h"
 #include "MagickCore/utility.h"
+#include "MagickCore/utility-private.h"
 #include "MagickCore/version.h"
 \f
 /*
@@ -92,7 +93,7 @@
 %
 %      MagickBooleanType CompositeImage(Image *image,
 %        const CompositeOperator compose,Image *composite_image,
-%        const ssize_t x_offset,const ssize_t y_offset)
+%        const ssize_t x_offset,const ssize_t y_offset,ExceptionInfo *exception)
 %
 %  A description of each parameter follows:
 %
 %
 %        Previous to IM v6.5.3-3  this was called "modify-outside-overlay"
 %
+%    o exception: return any errors or warnings in this structure.
+%
 */
 
 static inline double MagickMin(const double x,const double y)
@@ -624,19 +627,19 @@ static void CompositeHSB(const MagickRealType red,const MagickRealType green,
   *hue=0.0;
   *saturation=0.0;
   *brightness=(double) (QuantumScale*max);
-  if (max == 0.0)
+  if (fabs(max) < MagickEpsilon)
     return;
   *saturation=(double) (1.0-min/max);
   delta=max-min;
-  if (delta == 0.0)
+  if (fabs(delta) < MagickEpsilon)
     return;
-  if (red == max)
+  if (fabs(red-max) < MagickEpsilon)
     *hue=(double) ((green-blue)/delta);
   else
-    if (green == max)
+    if (fabs(green-max) < MagickEpsilon)
       *hue=(double) (2.0+(blue-red)/delta);
     else
-      if (blue == max)
+      if (fabs(blue-max) < MagickEpsilon)
         *hue=(double) (4.0+(red-green)/delta);
   *hue/=6.0;
   if (*hue < 0.0)
@@ -1544,7 +1547,7 @@ static void HSBComposite(const double hue,const double saturation,
 
 MagickExport MagickBooleanType CompositeImage(Image *image,
   const CompositeOperator compose,const Image *composite_image,
-  const ssize_t x_offset,const ssize_t y_offset)
+  const ssize_t x_offset,const ssize_t y_offset,ExceptionInfo *exception)
 {
 #define CompositeImageTag  "Composite/Image"
 
@@ -1558,9 +1561,6 @@ MagickExport MagickBooleanType CompositeImage(Image *image,
   double
     sans;
 
-  ExceptionInfo
-    *exception;
-
   GeometryInfo
     geometry_info;
 
@@ -1601,7 +1601,6 @@ MagickExport MagickBooleanType CompositeImage(Image *image,
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
   assert(composite_image != (Image *) NULL);
   assert(composite_image->signature == MagickSignature);
-  exception=(&image->exception);
   if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
     return(MagickFalse);
   GetPixelInfo(image,&zero);
@@ -1739,7 +1738,7 @@ MagickExport MagickBooleanType CompositeImage(Image *image,
           Y = green_channel; compose:args =  x_scale[,y_scale[,angle]].
       */
       destination_image=CloneImage(image,image->columns,image->rows,MagickTrue,
-        &image->exception);
+        exception);
       if (destination_image == (Image *) NULL)
         return(MagickFalse);
       /*
@@ -1785,8 +1784,7 @@ MagickExport MagickBooleanType CompositeImage(Image *image,
         Blur Image by resampling.
       */
       pixel=zero;
-      exception=(&image->exception);
-      resample_filter=AcquireResampleFilter(image,&image->exception);
+      resample_filter=AcquireResampleFilter(image,exception);
       SetResampleFilter(resample_filter,CubicFilter,2.0);
       destination_view=AcquireCacheView(destination_image);
       composite_view=AcquireCacheView(composite_image);
@@ -1809,7 +1807,7 @@ MagickExport MagickBooleanType CompositeImage(Image *image,
         p=GetCacheViewVirtualPixels(composite_view,0,y,composite_image->columns,
           1,exception);
         q=QueueCacheViewAuthenticPixels(destination_view,0,y,
-          destination_image->columns,1,&image->exception);
+          destination_image->columns,1,exception);
         if ((p == (const Quantum *) NULL) || (q == (Quantum *) NULL))
           break;
         for (x=0; x < (ssize_t) composite_image->columns; x++)
@@ -1877,7 +1875,7 @@ MagickExport MagickBooleanType CompositeImage(Image *image,
           compose:args = x_scale[,y_scale[,center.x,center.y]]
       */
       destination_image=CloneImage(image,image->columns,image->rows,MagickTrue,
-        &image->exception);
+        exception);
       if (destination_image == (Image *) NULL)
         return(MagickFalse);
       SetGeometryInfo(&geometry_info);
@@ -1958,7 +1956,6 @@ MagickExport MagickBooleanType CompositeImage(Image *image,
         displacement/distortion map.  -- Like a lens...
       */
       pixel=zero;
-      exception=(&image->exception);
       image_view=AcquireCacheView(image);
       destination_view=AcquireCacheView(destination_image);
       composite_view=AcquireCacheView(composite_image);
@@ -1981,7 +1978,7 @@ MagickExport MagickBooleanType CompositeImage(Image *image,
         p=GetCacheViewVirtualPixels(composite_view,0,y,composite_image->columns,
           1,exception);
         q=QueueCacheViewAuthenticPixels(destination_view,0,y,
-          destination_image->columns,1,&image->exception);
+          destination_image->columns,1,exception);
         if ((p == (const Quantum *) NULL) || (q == (Quantum *) NULL))
           break;
         for (x=0; x < (ssize_t) composite_image->columns; x++)
@@ -2133,7 +2130,6 @@ MagickExport MagickBooleanType CompositeImage(Image *image,
   progress=0;
   midpoint=((MagickRealType) QuantumRange+1.0)/2;
   GetPixelInfo(composite_image,&zero);
-  exception=(&image->exception);
   image_view=AcquireCacheView(image);
   composite_view=AcquireCacheView(composite_image);
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
@@ -2737,7 +2733,8 @@ MagickExport MagickBooleanType CompositeImage(Image *image,
 %
 %  The format of the TextureImage method is:
 %
-%      MagickBooleanType TextureImage(Image *image,const Image *texture)
+%      MagickBooleanType TextureImage(Image *image,const Image *texture,
+%        ExceptionInfo *exception)
 %
 %  A description of each parameter follows:
 %
@@ -2746,7 +2743,8 @@ MagickExport MagickBooleanType CompositeImage(Image *image,
 %    o texture: This image is the texture to layer on the background.
 %
 */
-MagickExport MagickBooleanType TextureImage(Image *image,const Image *texture)
+MagickExport MagickBooleanType TextureImage(Image *image,const Image *texture,
+  ExceptionInfo *exception)
 {
 #define TextureImageTag  "Texture/Image"
 
@@ -2754,9 +2752,6 @@ MagickExport MagickBooleanType TextureImage(Image *image,const Image *texture)
     *image_view,
     *texture_view;
 
-  ExceptionInfo
-    *exception;
-
   MagickBooleanType
     status;
 
@@ -2770,7 +2765,6 @@ MagickExport MagickBooleanType TextureImage(Image *image,const Image *texture)
   if (texture == (const Image *) NULL)
     return(MagickFalse);
   (void) SetImageVirtualPixelMethod(texture,TileVirtualPixelMethod);
-  exception=(&image->exception);
   if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
     return(MagickFalse);
   status=MagickTrue;
@@ -2797,7 +2791,7 @@ MagickExport MagickBooleanType TextureImage(Image *image,const Image *texture)
             thread_status;
 
           thread_status=CompositeImage(image,image->compose,texture,x+
-            texture->tile_offset.x,y+texture->tile_offset.y);
+            texture->tile_offset.x,y+texture->tile_offset.y,exception);
           if (thread_status == MagickFalse)
             {
               status=thread_status;