+
+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.
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));
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);
}
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);
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);
LightenCompositeOp,
LinearLightCompositeOp,
LuminizeCompositeOp,
- MinusCompositeOp,
+ MinusDstCompositeOp,
ModulateCompositeOp,
MultiplyCompositeOp,
OutCompositeOp,
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,
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,
** 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;
{ "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 },
{ "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 },