Commit d81304839 for imagemagick.org
commit d81304839898726d7bc5d77c4908bf7522ba2ab8
Author: Cristy <urban-warrior@imagemagick.org>
Date: Fri Sep 25 08:43:18 2026 -0400
https://github.com/ImageMagick/ImageMagick/issues/8579
diff --git a/MagickCore/composite.c b/MagickCore/composite.c
index 66134af29..42de176ed 100644
--- a/MagickCore/composite.c
+++ b/MagickCore/composite.c
@@ -2939,7 +2939,7 @@ MagickExport MagickBooleanType CompositeImage(Image *image,
blend=1.0;
else
blend=RoundToUnity(D/S);
- pixel=(double) QuantumRange*RoundToUnity(Sca*(1.0-Da)+Dca*(1.0-Sa)+
+ pixel=(double) QuantumRange*gamma*RoundToUnity(Sca*(1.0-Da)+Dca*(1.0-Sa)+
Sa*Da*blend);
break;
}
@@ -2954,9 +2954,9 @@ MagickExport MagickBooleanType CompositeImage(Image *image,
break;
}
if (fabs(Dca) < MagickEpsilon)
- pixel=(double) QuantumRange*(Sca+(1.0-Sa));
+ pixel=(double) QuantumRange*gamma*(Sca+(1.0-Sa));
else
- pixel=(double) QuantumRange*(Sca/Dca+Sca*(1.0-Da)+Dca*(1.0-Sa));
+ pixel=(double) QuantumRange*gamma*(Sca/Dca+Sca*(1.0-Da)+Dca*(1.0-Sa));
break;
}
case DivideSrcCompositeOp:
@@ -2970,9 +2970,9 @@ MagickExport MagickBooleanType CompositeImage(Image *image,
break;
}
if (fabs(Dca) < MagickEpsilon)
- pixel=(double) QuantumRange*(Dca+(1.0-Da));
+ pixel=(double) QuantumRange*gamma*(Dca+(1.0-Da));
else
- pixel=(double) QuantumRange*(Dca/Sca+Dca*(1.0-Sa)+Sca*(1.0-Da));
+ pixel=(double) QuantumRange*gamma*(Dca/Sca+Dca*(1.0-Sa)+Sca*(1.0-Da));
break;
}
case DstAtopCompositeOp:
@@ -3289,7 +3289,7 @@ MagickExport MagickBooleanType CompositeImage(Image *image,
pixel=(double) QuantumRange*Sc*Dc;
break;
}
- pixel=(double) QuantumRange*(Sca*Dca+Sca*(1.0-Da)+Dca*(1.0-Sa));
+ pixel=(double) QuantumRange*gamma*(Sca*Dca+Sca*(1.0-Da)+Dca*(1.0-Sa));
break;
}
case NegateCompositeOp:
diff --git a/MagickCore/policy.c b/MagickCore/policy.c
index 5255be795..f5f943b46 100644
--- a/MagickCore/policy.c
+++ b/MagickCore/policy.c
@@ -832,8 +832,8 @@ MagickExport MagickBooleanType IsRightsAuthorizedByName(
return(MagickTrue);
}
/*
- Evaluate policies in order; last match wins, however, canonical denies are
- enforced after evaluation.
+ Evaluate policies in order; the last matching lexical or canonical policy
+ wins.
*/
LockSemaphoreInfo(policy_semaphore);
ResetLinkedListIterator(policy_cache);
@@ -905,7 +905,7 @@ MagickExport MagickBooleanType IsRightsAuthorizedByName(
if (matched_canonical != MagickFalse)
{
/*
- If this match was against a canonical form, accumulate allowed rights.
+ If this matched a canonical form, retain the last matching rights.
*/
canonical_matched_any=MagickTrue;
canonical_allowed_accumulator=policy->rights;