MagickCore 6.9.11-60
Convert, Edit, Or Compose Bitmap Images
composite-private.h
Go to the documentation of this file.
1/*
2 Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization
3 dedicated to making software imaging solutions freely available.
4
5 You may not use this file except in compliance with the License. You may
6 obtain a copy of the License at
7
8 https://imagemagick.org/script/license.php
9
10 Unless required by applicable law or agreed to in writing, software
11 distributed under the License is distributed on an "AS IS" BASIS,
12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 See the License for the specific language governing permissions and
14 limitations under the License.
15
16 MagickCore image composite private methods.
17*/
18#ifndef MAGICKCORE_COMPOSITE_PRIVATE_H
19#define MAGICKCORE_COMPOSITE_PRIVATE_H
20
21#include "magick/color.h"
22#include "magick/image.h"
25
26#if defined(__cplusplus) || defined(c_plusplus)
27extern "C" {
28#endif
29
30/*
31 ImageMagick Alpha Composite Inline Methods (special export)
32*/
33static inline MagickRealType RoundToUnity(const MagickRealType value)
34{
35 return(value < 0.0 ? 0.0 : (value > 1.0) ? 1.0 : value);
36}
37
39 const MagickRealType alpha,const MagickRealType q,const MagickRealType beta)
40{
42 Da,
43 Sa;
44
45 Sa=1.0-QuantumScale*alpha;
46 Da=1.0-QuantumScale*beta;
47 return(Sa*p+Da*q*(1.0-Sa));
48}
49
50static inline void MagickCompositeOver(const PixelPacket *p,
51 const MagickRealType alpha,const PixelPacket *q,const MagickRealType beta,
52 PixelPacket *composite)
53{
55 Da,
56 gamma,
57 Sa;
58
59 /*
60 Compose pixel p over pixel q with the given opacities.
61 */
62 Sa=1.0-QuantumScale*alpha;
63 Da=1.0-QuantumScale*beta;
64 gamma=Sa+Da-Sa*Da;
65#if !defined(MAGICKCORE_HDRI_SUPPORT)
67 RoundToUnity(gamma))));
68 gamma=PerceptibleReciprocal(gamma);
70 GetPixelRed(p),alpha,(MagickRealType) GetPixelRed(q),beta)));
72 GetPixelGreen(p),alpha,(MagickRealType) GetPixelGreen(q),beta)));
74 GetPixelBlue(p),alpha,(MagickRealType) GetPixelBlue(q),beta)));
75#else
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));
81 GetPixelGreen(p),alpha,(MagickRealType) GetPixelGreen(q),beta));
83 GetPixelBlue(p),alpha,(MagickRealType) GetPixelBlue(q),beta));
84#endif
85}
86
87static inline void MagickPixelCompositeOver(const MagickPixelPacket *p,
88 const MagickRealType alpha,const MagickPixelPacket *q,
89 const MagickRealType beta,MagickPixelPacket *composite)
90{
92 Da,
93 gamma,
94 Sa;
95
96 /*
97 Compose pixel p over pixel q with the given opacities.
98 */
99 Sa=1.0-QuantumScale*alpha;
100 Da=1.0-QuantumScale*beta;
101 gamma=Sa+Da-Sa*Da;
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);
109}
110
111static inline void MagickPixelCompositePlus(const MagickPixelPacket *p,
112 const MagickRealType alpha,const MagickPixelPacket *q,
113 const MagickRealType beta,MagickPixelPacket *composite)
114{
116 Da,
117 gamma,
118 Sa;
119
120 /*
121 Add two pixels with the given opacities.
122 */
123 Sa=1.0-QuantumScale*alpha;
124 Da=1.0-QuantumScale*beta;
125 gamma=RoundToUnity(Sa+Da); /* 'Plus' blending -- not 'Over' blending */
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);
133}
134
135/*
136 Blend pixel colors p and q by the amount given.
137*/
139 const MagickRealType alpha,const MagickPixelPacket *q,
140 const MagickRealType beta,MagickPixelPacket *composite)
141{
144 (QuantumRange-q->opacity)),composite);
145}
146
147/*
148 Blend pixel colors p and q by the amount given and area.
149*/
151 const MagickRealType alpha,const MagickPixelPacket *q,
152 const MagickRealType beta,const MagickRealType area,
153 MagickPixelPacket *composite)
154{
157 beta)),composite);
158}
159
160#if defined(__cplusplus) || defined(c_plusplus)
161}
162#endif
163
164#endif
@ CMYKColorspace
Definition colorspace.h:39
static void MagickPixelCompositeBlend(const MagickPixelPacket *p, const MagickRealType alpha, const MagickPixelPacket *q, const MagickRealType beta, MagickPixelPacket *composite)
Definition composite-private.h:138
static void MagickPixelCompositeAreaBlend(const MagickPixelPacket *p, const MagickRealType alpha, const MagickPixelPacket *q, const MagickRealType beta, const MagickRealType area, MagickPixelPacket *composite)
Definition composite-private.h:150
static MagickRealType RoundToUnity(const MagickRealType value)
Definition composite-private.h:33
static void MagickPixelCompositeOver(const MagickPixelPacket *p, const MagickRealType alpha, const MagickPixelPacket *q, const MagickRealType beta, MagickPixelPacket *composite)
Definition composite-private.h:87
static void MagickCompositeOver(const PixelPacket *p, const MagickRealType alpha, const PixelPacket *q, const MagickRealType beta, PixelPacket *composite)
Definition composite-private.h:50
static void MagickPixelCompositePlus(const MagickPixelPacket *p, const MagickRealType alpha, const MagickPixelPacket *q, const MagickRealType beta, MagickPixelPacket *composite)
Definition composite-private.h:111
static MagickRealType MagickOver_(const MagickRealType p, const MagickRealType alpha, const MagickRealType q, const MagickRealType beta)
Definition composite-private.h:38
MagickDoubleType MagickRealType
Definition magick-type.h:129
#define QuantumRange
Definition magick-type.h:90
#define QuantumScale
Definition magick-type.h:124
#define GetPixelBlue(pixel)
Definition pixel-accessor.h:38
#define SetPixelRed(pixel, value)
Definition pixel-accessor.h:82
#define SetPixelBlue(pixel, value)
Definition pixel-accessor.h:71
#define GetPixelRed(pixel)
Definition pixel-accessor.h:50
static double PerceptibleReciprocal(const double x)
Definition pixel-accessor.h:124
#define SetPixelOpacity(pixel, value)
Definition pixel-accessor.h:81
#define SetPixelGreen(pixel, value)
Definition pixel-accessor.h:77
#define GetPixelGreen(pixel)
Definition pixel-accessor.h:43
static Quantum ClampToQuantum(const MagickRealType quantum)
Definition quantum.h:88
Definition pixel.h:105
ColorspaceType colorspace
Definition pixel.h:110
MagickRealType blue
Definition pixel.h:124
MagickRealType index
Definition pixel.h:126
MagickRealType opacity
Definition pixel.h:125
MagickRealType green
Definition pixel.h:123
MagickRealType red
Definition pixel.h:122
Definition pixel.h:132