18 #ifndef MAGICKCORE_COMPOSITE_PRIVATE_H
19 #define MAGICKCORE_COMPOSITE_PRIVATE_H
21 #include "magick/color.h"
22 #include "magick/image.h"
23 #include "magick/image-private.h"
24 #include "magick/pixel-private.h"
26 #if defined(__cplusplus) || defined(c_plusplus)
33 static inline MagickRealType RoundToUnity(
const MagickRealType value)
35 return(value < 0.0 ? 0.0 : (value > 1.0) ? 1.0 : value);
38 static inline MagickRealType MagickOver_(
const MagickRealType p,
39 const MagickRealType alpha,
const MagickRealType q,
const MagickRealType beta)
45 Sa=1.0-QuantumScale*alpha;
46 Da=1.0-QuantumScale*beta;
47 return(Sa*p+Da*q*(1.0-Sa));
50 static inline void MagickCompositeOver(
const PixelPacket *p,
51 const MagickRealType alpha,
const PixelPacket *q,
const MagickRealType beta,
62 Sa=1.0-QuantumScale*alpha;
63 Da=1.0-QuantumScale*beta;
65 #if !defined(MAGICKCORE_HDRI_SUPPORT)
66 SetPixelOpacity(composite,ClampToQuantum(QuantumRange*(1.0-
67 RoundToUnity(gamma))));
68 gamma=PerceptibleReciprocal(gamma);
69 SetPixelRed(composite,ClampToQuantum(gamma*MagickOver_((MagickRealType)
70 GetPixelRed(p),alpha,(MagickRealType) GetPixelRed(q),beta)));
71 SetPixelGreen(composite,ClampToQuantum(gamma*MagickOver_((MagickRealType)
72 GetPixelGreen(p),alpha,(MagickRealType) GetPixelGreen(q),beta)));
73 SetPixelBlue(composite,ClampToQuantum(gamma*MagickOver_((MagickRealType)
74 GetPixelBlue(p),alpha,(MagickRealType) GetPixelBlue(q),beta)));
76 SetPixelOpacity(composite,QuantumRange*(1.0-RoundToUnity(gamma)));
77 gamma=PerceptibleReciprocal(gamma);
78 SetPixelRed(composite,gamma*MagickOver_((MagickRealType)
79 GetPixelRed(p),alpha,(MagickRealType) GetPixelRed(q),beta));
80 SetPixelGreen(composite,gamma*MagickOver_((MagickRealType)
81 GetPixelGreen(p),alpha,(MagickRealType) GetPixelGreen(q),beta));
82 SetPixelBlue(composite,gamma*MagickOver_((MagickRealType)
83 GetPixelBlue(p),alpha,(MagickRealType) GetPixelBlue(q),beta));
99 Sa=1.0-QuantumScale*alpha;
100 Da=1.0-QuantumScale*beta;
102 composite->opacity=(MagickRealType) (QuantumRange*(1.0-RoundToUnity(gamma)));
103 gamma=PerceptibleReciprocal(gamma);
104 composite->red=gamma*MagickOver_(p->red,alpha,q->red,beta);
105 composite->green=gamma*MagickOver_(p->green,alpha,q->green,beta);
106 composite->blue=gamma*MagickOver_(p->blue,alpha,q->blue,beta);
107 if (q->colorspace == CMYKColorspace)
108 composite->index=gamma*MagickOver_(p->index,alpha,q->index,beta);
123 Sa=1.0-QuantumScale*alpha;
124 Da=1.0-QuantumScale*beta;
125 gamma=RoundToUnity(Sa+Da);
126 composite->opacity=(MagickRealType) QuantumRange*(1.0-RoundToUnity(gamma));
127 gamma=PerceptibleReciprocal(gamma);
128 composite->red=gamma*(Sa*p->red+Da*q->red);
129 composite->green=gamma*(Sa*p->green+Da*q->green);
130 composite->blue=gamma*(Sa*p->blue+Da*q->blue);
131 if (q->colorspace == CMYKColorspace)
132 composite->index=gamma*(Sa*p->index+Da*q->index);
142 MagickPixelCompositePlus(p,(MagickRealType) (QuantumRange-alpha*
143 (QuantumRange-p->opacity)),q,(MagickRealType) (QuantumRange-beta*
144 (QuantumRange-q->opacity)),composite);
152 const MagickRealType beta,
const MagickRealType area,
155 MagickPixelCompositePlus(p,(MagickRealType) QuantumRange-(1.0-area)*
156 (QuantumRange-alpha),q,(MagickRealType) (QuantumRange-area*(QuantumRange-
160 #if defined(__cplusplus) || defined(c_plusplus)