Commit 55e52c447 for imagemagick.org

commit 55e52c44752eec35d893f4edbf7f7fa2dbe247ce
Author: Cristy <urban-warrior@imagemagick.org>
Date:   Sat Jul 11 19:21:45 2026 -0400

    reviewed and made subtle corrections to a few composite ops

diff --git a/MagickCore/composite.c b/MagickCore/composite.c
index 6f1df05a8..a3058c8f7 100644
--- a/MagickCore/composite.c
+++ b/MagickCore/composite.c
@@ -2976,8 +2976,8 @@ MagickExport MagickBooleanType CompositeImage(Image *image,
           }
           case ExclusionCompositeOp:
           {
-            S=(Sa > 0.0) ? Sca/Sa : 0.0;
-            D=(Da > 0.0) ? Dca/Da : 0.0;
+            S=(Sa > 0.0) ? RoundToUnity(Sca/Sa) : 0.0;
+            D=(Da > 0.0) ? RoundToUnity(Dca/Da) : 0.0;
             blend=RoundToUnity(S+D-2.0*S*D);
             pixel=(double) QuantumRange*RoundToUnity((blend*Sa+D*(1.0-Sa))*
               (Sa+Da-Sa*Da));
@@ -2994,8 +2994,8 @@ MagickExport MagickBooleanType CompositeImage(Image *image,
           }
           case HardLightCompositeOp:
           {
-            D=(Da > 0.0) ? (Dca/Da) : 0.0;
-            S=(Sa > 0.0) ? (Sca/Sa) : 0.0;
+            D=(Da > 0.0) ? RoundToUnity(Dca/Da) : 0.0;
+            S=(Sa > 0.0) ? RoundToUnity(Sca/Sa) : 0.0;
             if (S <= 0.5)
               blend=2.0*S*D;
             else
@@ -3006,21 +3006,29 @@ MagickExport MagickBooleanType CompositeImage(Image *image,
           }
           case HardMixCompositeOp:
           {
-            if (Sca < 0.5)
+            double
+              hardmix,
+              vivid;
+
+            S=(Sa > 0.0) ? RoundToUnity(Sca/Sa) : 0.0;
+            D=(Da > 0.0) ? RoundToUnity(Dca/Da) : 0.0;
+            if (S <= 0.5)
               {
-                if ((2.0*Sca) == 0.0)
-                  blend=0.0;
+                if (S <= MagickEpsilon)
+                  vivid=0.0;
                 else
-                  blend=1.0-(1.0-Dca)/(2.0*Sca);
+                  vivid=1.0-(1.0-D)/(2.0*S);
               }
             else
               {
-                if ((1.0-((2.0*Sca)-1.0)) == 0.0)
-                  blend=1.0;
+                if ((1.0-(2.0*S-1.0)) <= MagickEpsilon)
+                  vivid=1.0;
                 else
-                  blend=Dca/(1.0-(2.0*Sca-1.0));
+                  vivid=D/(1.0-(2.0*S-1.0));
               }
-            pixel=gamma*((blend < 0.5) ? 0.0 : (double) QuantumRange);
+            hardmix=(vivid < 0.5) ? 0.0 : 1.0;
+            pixel=(double) QuantumRange*gamma*RoundToUnity(Sa*Da*hardmix+Sca*
+              (1.0-Da)+Dca*(1.0-Sa));
             break;
           }
           case HueCompositeOp:
@@ -3072,12 +3080,20 @@ MagickExport MagickBooleanType CompositeImage(Image *image,

                 f(Sc,Dc) = Sc + Dc - 1
             */
-            pixel=(double) QuantumRange*(Sca+Dca-Sa*Da);
+            S=(Sa > 0.0) ? RoundToUnity(Sca/Sa) : 0.0;
+            D=(Da > 0.0) ? RoundToUnity(Dca/Da) : 0.0;
+            blend=RoundToUnity(S+D-1.0);
+            pixel=(double) QuantumRange*RoundToUnity(Sa*Da*blend+Sca*(1.0-Da)+
+              Dca*(1.0-Sa));
             break;
           }
           case LinearDodgeCompositeOp:
           {
-            pixel=gamma*(Sa*Sc+Da*Dc);
+            S=(Sa > 0.0) ? RoundToUnity(Sca/Sa) : 0.0;
+            D=(Da > 0.0) ? RoundToUnity(Dca/Da) : 0.0;
+            blend=RoundToUnity(S+D);
+            pixel=(double) QuantumRange*gamma*RoundToUnity(Sa*Da*blend+
+              Sca*(1.0-Da)+Dca*(1.0-Sa));
             break;
           }
           case LinearLightCompositeOp:
@@ -3087,9 +3103,11 @@ MagickExport MagickBooleanType CompositeImage(Image *image,
                 f(Sc, Dc) = Dc + 2*Sc - 1
               Applied in linear (HDRI) space with clamping.
             */
-            D=(Da > 0.0) ? Dca/Da : 0.0,
-            S=(Sa > 0.0) ? Sca/Sa : 0.0;
-            pixel=(double) QuantumRange*gamma*(RoundToUnity(D+2.0*S-1.0)*Da);
+            S=(Sa > 0.0) ? RoundToUnity(Sca/Sa) : 0.0;
+            D=(Da > 0.0) ? RoundToUnity(Dca/Da) : 0.0;
+            blend=RoundToUnity(D+2.0*S-1.0);
+            pixel=(double) QuantumRange*gamma*RoundToUnity(Sa*Da*blend+Sca*
+              (1.0-Da)+Dca*(1.0-Sa));
             break;
           }
           case LightenCompositeOp:
@@ -3099,8 +3117,8 @@ MagickExport MagickBooleanType CompositeImage(Image *image,
                 pixel=MagickMax(Sc,Dc);
                 break;
               }
-            S=(Sa > 0.0) ? (Sca/Sa) : 0.0;
-            D=(Da > 0.0) ? (Dca/Da) : 0.0;
+            S=(Sa > 0.0) ? RoundToUnity(Sca/Sa) : 0.0;
+            D=(Da > 0.0) ? RoundToUnity(Dca/Da) : 0.0;
             pixel=(double) QuantumRange*RoundToUnity(Sca*(1.0-Da)+Dca*(1.0-Sa)+
               MagickMax(S,D)*Sa*Da);
             break;
@@ -3333,7 +3351,8 @@ MagickExport MagickBooleanType CompositeImage(Image *image,
               blend=MagickMin(D,2.0*S);
             else
               blend=MagickMax(D,2.0*S-1.0);
-            pixel=(double) QuantumRange*gamma*(blend*RoundToUnity(Sa+Da-Sa*Da));
+            pixel=(double) QuantumRange*gamma*RoundToUnity(Sa*Da*blend+Sca*
+              (1.0-Da)+Dca*(1.0-Sa));
             break;
           }
           case PlusCompositeOp:
@@ -3437,18 +3456,11 @@ MagickExport MagickBooleanType CompositeImage(Image *image,
                 pixel=(double) QuantumRange*RoundToUnity(Sc+Dc-Sc*Dc);
                 break;
               }
-            if (Sa > 0.0)
-              S=Sca/Sa;
-            else
-              S=0.0;
-            if (Da > 0.0)
-              D=Dca/Da;
-            else
-              D=0.0;
-            if ((Sa+Da-Sa*Da) > 0.0)
-              pixel=(double) QuantumRange*RoundToUnity((Sa+Da-Sa*Da)*(S+D-S*D));
-            else
-              pixel=0.0;
+            S=(Sa > 0.0) ? RoundToUnity(Sca/Sa) : 0.0;
+            D=(Da > 0.0) ? RoundToUnity(Dca/Da) : 0.0;
+            blend=RoundToUnity(S+D-S*D);
+            pixel=(double) QuantumRange*RoundToUnity(Sa*Da*blend+Sca*(1.0-Da)+
+              Dca*(1.0-Sa));
             break;
           }
           case SoftBurnCompositeOp: