18 #ifndef MAGICKCORE_COMPOSITE_PRIVATE_H
19 #define MAGICKCORE_COMPOSITE_PRIVATE_H
21 #include "magick/artifact.h"
22 #include "magick/color.h"
23 #include "magick/image.h"
24 #include "magick/image-private.h"
25 #include "magick/pixel-private.h"
27 #if defined(__cplusplus) || defined(c_plusplus)
34 static inline MagickRealType RoundToUnity(
const MagickRealType value)
36 return(value < 0.0 ? 0.0 : (value > 1.0) ? 1.0 : value);
39 static inline MagickRealType MagickOver_(
const MagickRealType p,
40 const MagickRealType alpha,
const MagickRealType q,
const MagickRealType beta)
46 Sa=1.0-QuantumScale*alpha;
47 Da=1.0-QuantumScale*beta;
48 return(Sa*p+Da*q*(1.0-Sa));
51 static inline void MagickCompositeOver(
const PixelPacket *p,
52 const MagickRealType alpha,
const PixelPacket *q,
const MagickRealType beta,
63 Sa=1.0-QuantumScale*alpha;
64 Da=1.0-QuantumScale*beta;
66 #if !defined(MAGICKCORE_HDRI_SUPPORT)
67 SetPixelOpacity(composite,ClampToQuantum(QuantumRange*(1.0-
68 RoundToUnity(gamma))));
69 gamma=PerceptibleReciprocal(gamma);
70 SetPixelRed(composite,ClampToQuantum(gamma*MagickOver_((MagickRealType)
71 GetPixelRed(p),alpha,(MagickRealType) GetPixelRed(q),beta)));
72 SetPixelGreen(composite,ClampToQuantum(gamma*MagickOver_((MagickRealType)
73 GetPixelGreen(p),alpha,(MagickRealType) GetPixelGreen(q),beta)));
74 SetPixelBlue(composite,ClampToQuantum(gamma*MagickOver_((MagickRealType)
75 GetPixelBlue(p),alpha,(MagickRealType) GetPixelBlue(q),beta)));
77 SetPixelOpacity(composite,QuantumRange*(1.0-RoundToUnity(gamma)));
78 gamma=PerceptibleReciprocal(gamma);
79 SetPixelRed(composite,gamma*MagickOver_((MagickRealType)
80 GetPixelRed(p),alpha,(MagickRealType) GetPixelRed(q),beta));
81 SetPixelGreen(composite,gamma*MagickOver_((MagickRealType)
82 GetPixelGreen(p),alpha,(MagickRealType) GetPixelGreen(q),beta));
83 SetPixelBlue(composite,gamma*MagickOver_((MagickRealType)
84 GetPixelBlue(p),alpha,(MagickRealType) GetPixelBlue(q),beta));
100 Sa=1.0-QuantumScale*alpha;
101 Da=1.0-QuantumScale*beta;
103 composite->opacity=(MagickRealType) (QuantumRange*(1.0-RoundToUnity(gamma)));
104 gamma=PerceptibleReciprocal(gamma);
105 composite->red=gamma*MagickOver_(p->red,alpha,q->red,beta);
106 composite->green=gamma*MagickOver_(p->green,alpha,q->green,beta);
107 composite->blue=gamma*MagickOver_(p->blue,alpha,q->blue,beta);
108 if (q->colorspace == CMYKColorspace)
109 composite->index=gamma*MagickOver_(p->index,alpha,q->index,beta);
124 Sa=1.0-QuantumScale*alpha;
125 Da=1.0-QuantumScale*beta;
126 gamma=RoundToUnity(Sa+Da);
127 composite->opacity=(MagickRealType) QuantumRange*(1.0-RoundToUnity(gamma));
128 gamma=PerceptibleReciprocal(gamma);
129 composite->red=gamma*(Sa*p->red+Da*q->red);
130 composite->green=gamma*(Sa*p->green+Da*q->green);
131 composite->blue=gamma*(Sa*p->blue+Da*q->blue);
132 if (q->colorspace == CMYKColorspace)
133 composite->index=gamma*(Sa*p->index+Da*q->index);
143 MagickPixelCompositePlus(p,(MagickRealType) (QuantumRange-alpha*
144 (QuantumRange-p->opacity)),q,(MagickRealType) (QuantumRange-beta*
145 (QuantumRange-q->opacity)),composite);
153 const MagickRealType beta,
const MagickRealType area,
156 MagickPixelCompositePlus(p,(MagickRealType) QuantumRange-(1.0-area)*
157 (QuantumRange-alpha),q,(MagickRealType) (QuantumRange-area*(QuantumRange-
161 #if defined(__cplusplus) || defined(c_plusplus)