Commit bf438a15e for imagemagick.org
commit bf438a15ee481f21afa4559605ff368e64794667
Author: Cristy <urban-warrior@imagemagick.org>
Date: Thu Jul 23 22:32:01 2026 -0400
divide honors SVG 1.2; divide-dst and divide-src are mathematical ops
diff --git a/MagickCore/compare.c b/MagickCore/compare.c
index 95749dc42..c50907e55 100644
--- a/MagickCore/compare.c
+++ b/MagickCore/compare.c
@@ -3495,7 +3495,7 @@ static Image *SIMPhaseCorrelationImage(const Image *alpha_image,
/*
Divide the results.
*/
- CompositeLayers((Image *) magnitude_image,DivideFxCompositeOp,
+ CompositeLayers((Image *) magnitude_image,DivideDstCompositeOp,
complex_multiplication,0,0,exception);
/*
Do the IFT and return the cross-correlation result.
diff --git a/MagickCore/composite.c b/MagickCore/composite.c
index 1fb67e7e9..e69ad0a7a 100644
--- a/MagickCore/composite.c
+++ b/MagickCore/composite.c
@@ -2384,8 +2384,8 @@ MagickExport MagickBooleanType CompositeImage(Image *image,
case ColorDodgeCompositeOp:
case DarkenCompositeOp:
case DifferenceCompositeOp:
+ case DivideCompositeOp:
case DivideDstCompositeOp:
- case DivideFxCompositeOp:
case DivideSrcCompositeOp:
case ExclusionCompositeOp:
case FreezeCompositeOp:
@@ -2931,9 +2931,10 @@ MagickExport MagickBooleanType CompositeImage(Image *image,
canvas_dissolve*Da*Dc+canvas_dissolve*Da*Dc);
break;
}
- case DivideDstCompositeOp:
+ case DivideCompositeOp:
{
D=(Da > 0.0) ? (Dca/Da) : 0.0;
+ S=(Sa > 0.0) ? (Sca/Sa) : 0.0;
if (fabs(S) < MagickEpsilon)
blend=1.0;
else
@@ -2942,24 +2943,36 @@ MagickExport MagickBooleanType CompositeImage(Image *image,
Sa*Da*blend);
break;
}
- case DivideFxCompositeOp:
+ case DivideDstCompositeOp:
{
+ if (compose_sync == MagickFalse)
+ {
+ if (fabs(Dc) < MagickEpsilon)
+ pixel=(double) QuantumRange;
+ else
+ pixel=(double) QuantumRange*(Sc/Dc);
+ break;
+ }
if (fabs(Dca) < MagickEpsilon)
- pixel=0.0;
+ pixel=(double) QuantumRange*(Sca+(1.0-Sa));
else
- pixel=(double) QuantumRange*(Sca/Dca);
+ pixel=(double) QuantumRange*(Sca/Dca+Sca*(1.0-Da)+Dca*(1.0-Sa));
break;
}
case DivideSrcCompositeOp:
{
- S=(Sa > 0.0) ? (Sca/Sa) : 0.0;
- D=(Da > 0.0) ? (Dca/Da) : 0.0;
- if (fabs(D) < MagickEpsilon)
- blend=1.0;
+ if (compose_sync == MagickFalse)
+ {
+ if (fabs(Sc) < MagickEpsilon)
+ pixel=(double) QuantumRange;
+ else
+ pixel=(double) QuantumRange*(Dc/Sc);
+ break;
+ }
+ if (fabs(Dca) < MagickEpsilon)
+ pixel=(double) QuantumRange*(Dca+(1.0-Da));
else
- blend=RoundToUnity(S/D);
- pixel=(double) QuantumRange*RoundToUnity(Sca*(1.0-Da)+Dca*(1.0-Sa)+
- Sa*Da*blend);
+ pixel=(double) QuantumRange*(Dca/Sca+Dca*(1.0-Sa)+Sca*(1.0-Da));
break;
}
case DstAtopCompositeOp:
diff --git a/MagickCore/composite.h b/MagickCore/composite.h
index 8c5e1abc2..d06f89a08 100644
--- a/MagickCore/composite.h
+++ b/MagickCore/composite.h
@@ -106,7 +106,7 @@ typedef enum
RMSECompositeOp,
SaliencyBlendCompositeOp,
SeamlessBlendCompositeOp,
- DivideFxCompositeOp
+ DivideCompositeOp
} CompositeOperator;
extern MagickExport MagickBooleanType
diff --git a/MagickCore/option.c b/MagickCore/option.c
index 33e264f64..2204297e1 100644
--- a/MagickCore/option.c
+++ b/MagickCore/option.c
@@ -1297,9 +1297,8 @@ static const OptionInfo
{ "Displace", DisplaceCompositeOp, UndefinedOptionFlag, MagickFalse },
{ "Dissolve", DissolveCompositeOp, UndefinedOptionFlag, MagickFalse },
{ "Distort", DistortCompositeOp, UndefinedOptionFlag, MagickFalse },
- { "Divide", DivideDstCompositeOp, DeprecateOptionFlag, MagickTrue },
+ { "Divide", DivideCompositeOp, DeprecateOptionFlag, MagickTrue },
{ "DivideDst", DivideDstCompositeOp, UndefinedOptionFlag, MagickFalse },
- { "DivideFx", DivideFxCompositeOp, UndefinedOptionFlag, MagickFalse },
{ "DivideSrc", DivideSrcCompositeOp, UndefinedOptionFlag, MagickFalse },
{ "DstAtop", DstAtopCompositeOp, UndefinedOptionFlag, MagickFalse },
{ "Dst", DstCompositeOp, UndefinedOptionFlag, MagickFalse },