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)
34static inline MagickRealType RoundToUnity(
const MagickRealType value)
36 return(value < 0.0 ? 0.0 : (value > 1.0) ? 1.0 : value);
39static 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));
51static 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,(MagickRealType) QuantumRange*(1.0-
78 RoundToUnity(gamma)));
79 gamma=PerceptibleReciprocal(gamma);
80 SetPixelRed(composite,gamma*MagickOver_((MagickRealType)
81 GetPixelRed(p),alpha,(MagickRealType) GetPixelRed(q),beta));
82 SetPixelGreen(composite,gamma*MagickOver_((MagickRealType)
83 GetPixelGreen(p),alpha,(MagickRealType) GetPixelGreen(q),beta));
84 SetPixelBlue(composite,gamma*MagickOver_((MagickRealType)
85 GetPixelBlue(p),alpha,(MagickRealType) GetPixelBlue(q),beta));
101 Sa=1.0-QuantumScale*alpha;
102 Da=1.0-QuantumScale*beta;
104 composite->opacity=(MagickRealType) QuantumRange*(1.0-RoundToUnity(gamma));
105 gamma=PerceptibleReciprocal(gamma);
106 composite->red=gamma*MagickOver_(p->red,alpha,q->red,beta);
107 composite->green=gamma*MagickOver_(p->green,alpha,q->green,beta);
108 composite->blue=gamma*MagickOver_(p->blue,alpha,q->blue,beta);
109 if (q->colorspace == CMYKColorspace)
110 composite->index=gamma*MagickOver_(p->index,alpha,q->index,beta);
125 Sa=1.0-QuantumScale*alpha;
126 Da=1.0-QuantumScale*beta;
127 gamma=RoundToUnity(Sa+Da);
128 composite->opacity=(MagickRealType) QuantumRange*(1.0-RoundToUnity(gamma));
129 gamma=PerceptibleReciprocal(gamma);
130 composite->red=gamma*(Sa*p->red+Da*q->red);
131 composite->green=gamma*(Sa*p->green+Da*q->green);
132 composite->blue=gamma*(Sa*p->blue+Da*q->blue);
133 if (q->colorspace == CMYKColorspace)
134 composite->index=gamma*(Sa*p->index+Da*q->index);
144 MagickPixelCompositePlus(p,(MagickRealType) QuantumRange-alpha*
145 ((MagickRealType) QuantumRange-p->opacity),q,(MagickRealType)
146 QuantumRange-beta*((MagickRealType) QuantumRange-q->opacity),composite);
154 const MagickRealType beta,
const MagickRealType area,
157 MagickPixelCompositePlus(p,(MagickRealType) QuantumRange-(1.0-area)*
158 ((MagickRealType) QuantumRange-alpha),q,(MagickRealType) QuantumRange-
159 area*((MagickRealType) QuantumRange-beta),composite);
162#if defined(__cplusplus) || defined(c_plusplus)