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 colorspace private methods.
17 */
18 #ifndef MAGICKCORE_COLORSPACE_PRIVATE_H
19 #define MAGICKCORE_COLORSPACE_PRIVATE_H
20
21 #include "MagickCore/image.h"
22 #include "MagickCore/image-private.h"
23 #include "MagickCore/pixel.h"
24 #include "MagickCore/pixel-accessor.h"
25
26 #if defined(__cplusplus) || defined(c_plusplus)
27 extern "C" {
28 #endif
29
ConvertCMYKToRGB(PixelInfo * pixel)30 static inline void ConvertCMYKToRGB(PixelInfo *pixel)
31 {
32 pixel->red=((QuantumRange-(QuantumScale*pixel->red*(QuantumRange-
33 pixel->black)+pixel->black)));
34 pixel->green=((QuantumRange-(QuantumScale*pixel->green*(QuantumRange-
35 pixel->black)+pixel->black)));
36 pixel->blue=((QuantumRange-(QuantumScale*pixel->blue*(QuantumRange-
37 pixel->black)+pixel->black)));
38 }
39
ConvertRGBToCMYK(PixelInfo * pixel)40 static inline void ConvertRGBToCMYK(PixelInfo *pixel)
41 {
42 MagickRealType
43 black,
44 blue,
45 cyan,
46 green,
47 magenta,
48 red,
49 yellow;
50
51 if (pixel->colorspace != sRGBColorspace)
52 {
53 red=QuantumScale*pixel->red;
54 green=QuantumScale*pixel->green;
55 blue=QuantumScale*pixel->blue;
56 }
57 else
58 {
59 red=QuantumScale*DecodePixelGamma(pixel->red);
60 green=QuantumScale*DecodePixelGamma(pixel->green);
61 blue=QuantumScale*DecodePixelGamma(pixel->blue);
62 }
63 if ((fabs((double) red) < MagickEpsilon) &&
64 (fabs((double) green) < MagickEpsilon) &&
65 (fabs((double) blue) < MagickEpsilon))
66 {
67 pixel->black=(MagickRealType) QuantumRange;
68 return;
69 }
70 cyan=(MagickRealType) (1.0-red);
71 magenta=(MagickRealType) (1.0-green);
72 yellow=(MagickRealType) (1.0-blue);
73 black=cyan;
74 if (magenta < black)
75 black=magenta;
76 if (yellow < black)
77 black=yellow;
78 cyan=(MagickRealType) (PerceptibleReciprocal(1.0-black)*(cyan-black));
79 magenta=(MagickRealType) (PerceptibleReciprocal(1.0-black)*(magenta-black));
80 yellow=(MagickRealType) (PerceptibleReciprocal(1.0-black)*(yellow-black));
81 pixel->colorspace=CMYKColorspace;
82 pixel->red=QuantumRange*cyan;
83 pixel->green=QuantumRange*magenta;
84 pixel->blue=QuantumRange*yellow;
85 pixel->black=QuantumRange*black;
86 }
87
IsCMYKColorspace(const ColorspaceType colorspace)88 static inline MagickBooleanType IsCMYKColorspace(
89 const ColorspaceType colorspace)
90 {
91 if (colorspace == CMYKColorspace)
92 return(MagickTrue);
93 return(MagickFalse);
94 }
95
IsGrayColorspace(const ColorspaceType colorspace)96 static inline MagickBooleanType IsGrayColorspace(
97 const ColorspaceType colorspace)
98 {
99 if ((colorspace == LinearGRAYColorspace) || (colorspace == GRAYColorspace))
100 return(MagickTrue);
101 return(MagickFalse);
102 }
103
IsHueCompatibleColorspace(const ColorspaceType colorspace)104 static inline MagickBooleanType IsHueCompatibleColorspace(
105 const ColorspaceType colorspace)
106 {
107 if ((colorspace == HCLColorspace) || (colorspace == HCLpColorspace) ||
108 (colorspace == HSBColorspace) || (colorspace == HSIColorspace) ||
109 (colorspace == HSLColorspace) || (colorspace == HSVColorspace))
110 return(MagickTrue);
111 return(MagickFalse);
112 }
113
IsRGBColorspace(const ColorspaceType colorspace)114 static inline MagickBooleanType IsRGBColorspace(const ColorspaceType colorspace)
115 {
116 if ((colorspace == RGBColorspace) || (colorspace == scRGBColorspace) ||
117 (colorspace == LinearGRAYColorspace))
118 return(MagickTrue);
119 return(MagickFalse);
120 }
121
IssRGBColorspace(const ColorspaceType colorspace)122 static inline MagickBooleanType IssRGBColorspace(
123 const ColorspaceType colorspace)
124 {
125 if ((colorspace == sRGBColorspace) || (colorspace == TransparentColorspace))
126 return(MagickTrue);
127 return(MagickFalse);
128 }
129
IssRGBCompatibleColorspace(const ColorspaceType colorspace)130 static inline MagickBooleanType IssRGBCompatibleColorspace(
131 const ColorspaceType colorspace)
132 {
133 if ((colorspace == sRGBColorspace) || (colorspace == RGBColorspace) ||
134 (colorspace == Adobe98Colorspace) || (colorspace == ProPhotoColorspace) ||
135 (colorspace == DisplayP3Colorspace) || (colorspace == scRGBColorspace) ||
136 (colorspace == TransparentColorspace) || (colorspace == GRAYColorspace) ||
137 (colorspace == LinearGRAYColorspace))
138 return(MagickTrue);
139 return(MagickFalse);
140 }
141
IsYCbCrCompatibleColorspace(const ColorspaceType colorspace)142 static inline MagickBooleanType IsYCbCrCompatibleColorspace(
143 const ColorspaceType colorspace)
144 {
145 if ((colorspace == YCbCrColorspace) ||
146 (colorspace == Rec709YCbCrColorspace) ||
147 (colorspace == Rec601YCbCrColorspace))
148 return(MagickTrue);
149 return(MagickFalse);
150 }
151
152 #if defined(__cplusplus) || defined(c_plusplus)
153 }
154 #endif
155
156 #endif
157