]> granicus.if.org Git - imagemagick/commitdiff
Added Minus_Dst/Src and Divide_Dst/Src compose methods
authoranthony <anthony@git.imagemagick.org>
Fri, 18 Mar 2011 10:35:12 +0000 (10:35 +0000)
committeranthony <anthony@git.imagemagick.org>
Fri, 18 Mar 2011 10:35:12 +0000 (10:35 +0000)
ChangeLog
magick/composite.c
magick/composite.h
magick/morphology.c
magick/option.c

index d6b4b79623f1dd1aba2c13c37854278be9f9e72e..629f739913cdf95b0ebfaa20b385726a4326ae60 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+
+2011-03-17 6.6.8-5 Anthony Thyssen <A.Thyssen@griffith...>
+  * Replaced Minus and Divide Composition methods with Dst and Src
+    equivelents. Now users can decide how these non-commutative mathematical
+    operators are applied the to the images being composited.
+
 2011-03-17 6.6.8-5 Anthony Thyssen <A.Thyssen@griffith...>
   * Backed out the patch for Variable Blur Composition that was added
     2011-02-13 v6.6.7-7, until I can re-think the problem.
index 26f1931b1348bb4064e06b5014d54d2453720c00..6b270ff0c55dbd4fee4a6c9d5b225265dcf7aa9d 100644 (file)
@@ -449,14 +449,14 @@ static MagickRealType Divide(const MagickRealType Sca,const MagickRealType Sa,
   const MagickRealType Dca,const MagickRealType Da)
 {
   /*
-    Divide:
+    Divide Source by Destination
 
-      f(Sc,Dc) = Sc/Dc
+      f(Sc,Dc) = Sc / Dc
 
     But with appropriate handling for special case of Dc == 0 specifically
     so that   f(Black,Black)=Black  and  f(non-Black,Black)=White.
     It is however also important to correctly do 'over' alpha blending which
-    is why the formula becomes so complex looking.
+    is why the formula becomes so complex.
   */
   if ((fabs(Sca) < MagickEpsilon) && (fabs(Dca) < MagickEpsilon))
     return(Sca*(1.0-Da)+Dca*(1.0-Sa));
@@ -926,6 +926,12 @@ static inline MagickRealType Minus(const MagickRealType Sca,
   const MagickRealType Sa,const MagickRealType Dca,
   const MagickRealType magick_unused(Da))
 {
+  /*
+    Minus Source from Destination
+
+      f(Sc,Dc) = Sc - Dc
+
+  */
   return(Sca + Dca - 2*Dca*Sa);
 }
 
@@ -2364,11 +2370,16 @@ MagickExport MagickBooleanType CompositeImageChannel(Image *image,
           CompositePlus(&source,&destination,channel,&composite);
           break;
         }
-        case MinusCompositeOp:
+        case MinusDstCompositeOp:
         {
           CompositeMinus(&source,&destination,channel,&composite);
           break;
         }
+        case MinusSrcCompositeOp:
+        {
+          CompositeMinus(&destination,&source,channel,&composite);
+          break;
+        }
         case ModulusAddCompositeOp:
         {
           CompositeModulusAdd(&source,&destination,channel,&composite);
@@ -2399,11 +2410,16 @@ MagickExport MagickBooleanType CompositeImageChannel(Image *image,
           CompositeScreen(&source,&destination,channel,&composite);
           break;
         }
-        case DivideCompositeOp:
+        case DivideDstCompositeOp:
         {
           CompositeDivide(&source,&destination,channel,&composite);
           break;
         }
+        case DivideSrcCompositeOp:
+        {
+          CompositeDivide(&destination,&source,channel,&composite);
+          break;
+        }
         case DarkenCompositeOp:
         {
           CompositeDarken(&source,&destination,channel,&composite);
index 7993196a2cc49a41ead84476145fd2dd424f288e..86b3c5ab6052edce620413b46fb946bf1f73134e 100644 (file)
@@ -60,7 +60,7 @@ typedef enum
   LightenCompositeOp,
   LinearLightCompositeOp,
   LuminizeCompositeOp,
-  MinusCompositeOp,
+  MinusDstCompositeOp,
   ModulateCompositeOp,
   MultiplyCompositeOp,
   OutCompositeOp,
@@ -79,7 +79,11 @@ typedef enum
   ModulusSubtractCompositeOp,
   ThresholdCompositeOp,
   XorCompositeOp,
-  DivideCompositeOp,
+  /* These are new operators, added after the above was last sorted.
+   * The list should be re-sorted only when a new library version is
+   * created.
+   */
+  DivideDstCompositeOp,
   DistortCompositeOp,
   BlurCompositeOp,
   PegtopLightCompositeOp,
@@ -87,12 +91,16 @@ typedef enum
   PinLightCompositeOp,
   LinearDodgeCompositeOp,
   LinearBurnCompositeOp,
-  MathematicsCompositeOp
+  MathematicsCompositeOp,
+  DivideSrcCompositeOp,
+  MinusSrcCompositeOp
 } CompositeOperator;
 
-/* Depreciated Method Names for backward compatibility */
+/* Depreciated (renamed) Method Names for backward compatibility */
 #define AddCompositeOp       ModulusAddCompositeOp
 #define SubtractCompositeOp  ModulusSubtractCompositeOp
+#define MinusCompositeOp     MinusDstCompositeOp
+#define DivideCompositeOp    DivideDstCompositeOp
 
 extern MagickExport MagickBooleanType
   CompositeImage(Image *,const CompositeOperator,const Image *,const ssize_t,
index 10fe2f01df796c2814e2a3057e0b86114e92fa57..f4766c8696ad8d6d11fba9d57a088c75c427932b 100644 (file)
@@ -3490,16 +3490,12 @@ MagickExport Image *MorphologyApply(const Image *image, const ChannelType
           ** below ensures the methematical compose method is applied in a
           ** purely mathematical way, and only to the selected channels.
           ** IE: Turn off SVG composition 'alpha blending'.
-          **
-          ** The compose image order is specifically so that the new image can
-          ** be subtracted 'Minus' from the collected result, to allow you to
-          ** convert a HitAndMiss methd into a Thinning method.
           */
           if ( verbose == MagickTrue )
             fprintf(stderr, " (compose \"%s\")",
                  MagickOptionToMnemonic(MagickComposeOptions, rslt_compose) );
-          (void) CompositeImageChannel(curr_image,
-               (ChannelType) (channel & ~SyncChannels), rslt_compose,
+          (void) CompositeImageChannel(rslt_image,
+               (ChannelType) (channel & ~SyncChannels), curr_compose,
                rslt_image, 0, 0);
           rslt_image = DestroyImage(rslt_image);
           rslt_image = curr_image;
index ba02f8b0de14c6f693da484fc50c8d3ae7684f92..81ef7cd86b1fc314665d8ee90b910c8259194124 100644 (file)
@@ -719,7 +719,9 @@ static const OptionInfo
     { "CopyRed", (ssize_t) CopyRedCompositeOp, MagickFalse },
     { "CopyYellow", (ssize_t) CopyYellowCompositeOp, MagickFalse },
     { "Darken", (ssize_t) DarkenCompositeOp, MagickFalse },
-    { "Divide", (ssize_t) DivideCompositeOp, MagickFalse },
+    { "Divide", (ssize_t) DivideDstCompositeOp, MagickFalse },
+    { "DivideDst", (ssize_t) DivideDstCompositeOp, MagickFalse },
+    { "DivideSrc", (ssize_t) DivideSrcCompositeOp, MagickFalse },
     { "Dst", (ssize_t) DstCompositeOp, MagickFalse },
     { "Difference", (ssize_t) DifferenceCompositeOp, MagickFalse },
     { "Displace", (ssize_t) DisplaceCompositeOp, MagickFalse },
@@ -740,7 +742,9 @@ static const OptionInfo
     { "LinearLight", (ssize_t) LinearLightCompositeOp, MagickFalse },
     { "Luminize", (ssize_t) LuminizeCompositeOp, MagickFalse },
     { "Mathematics", (ssize_t) MathematicsCompositeOp, MagickFalse },
-    { "Minus", (ssize_t) MinusCompositeOp, MagickFalse },
+    { "Minus", (ssize_t) MinusDstCompositeOp, MagickFalse },
+    { "MinusDst", (ssize_t) MinusDstCompositeOp, MagickFalse },
+    { "MinusSrc", (ssize_t) MinusSrcCompositeOp, MagickFalse },
     { "Modulate", (ssize_t) ModulateCompositeOp, MagickFalse },
     { "ModulusAdd", (ssize_t) ModulusAddCompositeOp, MagickFalse },
     { "ModulusSubtract", (ssize_t) ModulusSubtractCompositeOp, MagickFalse },