1 /*
2   Copyright 1999-2019 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 pixel methods.
17 */
18 #ifndef MAGICKCORE_PIXEL_H
19 #define MAGICKCORE_PIXEL_H
20 
21 #include "MagickCore/colorspace.h"
22 
23 #if defined(__cplusplus) || defined(c_plusplus)
24 extern "C" {
25 #endif
26 
27 #define MaxPixelChannels  32
28 #undef index
29 
30 /*
31   Pixel enum declarations.
32 */
33 typedef enum
34 {
35   UndefinedChannel = 0x0000,
36   RedChannel = 0x0001,
37   GrayChannel = 0x0001,
38   CyanChannel = 0x0001,
39   GreenChannel = 0x0002,
40   MagentaChannel = 0x0002,
41   BlueChannel = 0x0004,
42   YellowChannel = 0x0004,
43   BlackChannel = 0x0008,
44   AlphaChannel = 0x0010,
45   OpacityChannel = 0x0010,
46   IndexChannel = 0x0020,             /* Color Index Table? */
47   ReadMaskChannel = 0x0040,          /* Pixel is Not Readable? */
48   WriteMaskChannel = 0x0080,         /* Pixel is Write Protected? */
49   MetaChannel = 0x0100,              /* not used */
50   CompositeMaskChannel = 0x0200,     /* SVG mask */
51   CompositeChannels = 0x001F,
52   AllChannels = 0x7ffffff,
53   /*
54     Special purpose channel types.
55     FUTURE: are these needed any more - they are more like hacks
56     SyncChannels for example is NOT a real channel but a 'flag'
57     It really says -- "User has not defined channels"
58     Though it does have extra meaning in the "-auto-level" operator
59   */
60   TrueAlphaChannel = 0x0100, /* extract actual alpha channel from opacity */
61   RGBChannels = 0x0200,      /* set alpha from grayscale mask in RGB */
62   GrayChannels = 0x0400,
63   SyncChannels = 0x20000,    /* channels modified as a single unit */
64   DefaultChannels = AllChannels
65 } ChannelType;  /* must correspond to PixelChannel */
66 
67 typedef enum
68 {
69   UndefinedPixelChannel = 0,
70   RedPixelChannel = 0,
71   CyanPixelChannel = 0,
72   GrayPixelChannel = 0,
73   LPixelChannel = 0,
74   LabelPixelChannel = 0,
75   YPixelChannel = 0,
76   aPixelChannel = 1,
77   GreenPixelChannel = 1,
78   MagentaPixelChannel = 1,
79   CbPixelChannel = 1,
80   bPixelChannel = 2,
81   BluePixelChannel = 2,
82   YellowPixelChannel = 2,
83   CrPixelChannel = 2,
84   BlackPixelChannel = 3,
85   AlphaPixelChannel = 4,
86   IndexPixelChannel = 5,
87   ReadMaskPixelChannel = 6,
88   WriteMaskPixelChannel = 7,
89   MetaPixelChannel = 8,
90   CompositeMaskPixelChannel = 9,
91   IntensityPixelChannel = MaxPixelChannels,  /* ???? */
92   CompositePixelChannel = MaxPixelChannels,  /* ???? */
93   SyncPixelChannel = MaxPixelChannels+1      /* not a real channel */
94 } PixelChannel;  /* must correspond to ChannelType */
95 
96 typedef enum
97 {
98   UndefinedPixelIntensityMethod = 0,
99   AveragePixelIntensityMethod,
100   BrightnessPixelIntensityMethod,
101   LightnessPixelIntensityMethod,
102   MSPixelIntensityMethod,
103   Rec601LumaPixelIntensityMethod,
104   Rec601LuminancePixelIntensityMethod,
105   Rec709LumaPixelIntensityMethod,
106   Rec709LuminancePixelIntensityMethod,
107   RMSPixelIntensityMethod
108 } PixelIntensityMethod;
109 
110 typedef enum
111 {
112   UndefinedInterpolatePixel,
113   AverageInterpolatePixel,    /* Average 4 nearest neighbours */
114   Average9InterpolatePixel,   /* Average 9 nearest neighbours */
115   Average16InterpolatePixel,  /* Average 16 nearest neighbours */
116   BackgroundInterpolatePixel, /* Just return background color */
117   BilinearInterpolatePixel,   /* Triangular filter interpolation */
118   BlendInterpolatePixel,      /* blend of nearest 1, 2 or 4 pixels */
119   CatromInterpolatePixel,     /* Catmull-Rom interpolation */
120   IntegerInterpolatePixel,    /* Integer (floor) interpolation */
121   MeshInterpolatePixel,       /* Triangular Mesh interpolation */
122   NearestInterpolatePixel,    /* Nearest Neighbour Only */
123   SplineInterpolatePixel      /* Cubic Spline (blurred) interpolation */
124   /* FilterInterpolatePixel,  ** Use resize filter - (very slow) */
125 } PixelInterpolateMethod;
126 
127 typedef enum
128 {
129   UndefinedPixelMask = 0x000000,
130   ReadPixelMask = 0x000001,
131   WritePixelMask = 0x000002,
132   CompositePixelMask = 0x000004
133 } PixelMask;
134 
135 typedef enum
136 {
137   UndefinedPixelTrait = 0x000000,
138   CopyPixelTrait = 0x000001,
139   UpdatePixelTrait = 0x000002,
140   BlendPixelTrait = 0x000004
141 } PixelTrait;
142 
143 typedef enum
144 {
145   UndefinedPixel,
146   CharPixel,
147   DoublePixel,
148   FloatPixel,
149   LongPixel,
150   LongLongPixel,
151   QuantumPixel,
152   ShortPixel
153 } StorageType;
154 
155 /*
156   Pixel typedef declarations.
157 */
158 typedef struct _PixelChannelMap
159 {
160   PixelChannel
161     channel;
162 
163   PixelTrait
164     traits;
165 
166   ssize_t
167     offset;
168 } PixelChannelMap;
169 
170 typedef struct _PixelInfo
171 {
172   ClassType
173     storage_class;
174 
175   ColorspaceType
176     colorspace;
177 
178   PixelTrait
179     alpha_trait;
180 
181   double
182     fuzz;
183 
184   size_t
185     depth;
186 
187   MagickSizeType
188     count;
189 
190   MagickRealType
191     red,
192     green,
193     blue,
194     black,
195     alpha,
196     index;
197 } PixelInfo;
198 
199 typedef struct _PixelPacket
200 {
201   unsigned int
202     red,
203     green,
204     blue,
205     alpha,
206     black;
207 } PixelPacket;
208 
209 typedef struct _CacheView
210   CacheView_;
211 
212 /*
213   Pixel method declarations.
214 */
215 extern MagickExport ChannelType
216   SetPixelChannelMask(Image *,const ChannelType);
217 
218 extern MagickExport MagickBooleanType
219   ExportImagePixels(const Image *,const ssize_t,const ssize_t,const size_t,
220     const size_t,const char *,const StorageType,void *,ExceptionInfo *),
221   ImportImagePixels(Image *,const ssize_t,const ssize_t,const size_t,
222     const size_t,const char *,const StorageType,const void *,ExceptionInfo *),
223   InterpolatePixelChannel(const Image *,const CacheView_ *,
224     const PixelChannel,const PixelInterpolateMethod,const double,const double,
225     double *,ExceptionInfo *),
226   InterpolatePixelChannels(const Image *,const CacheView_ *,const Image *,
227     const PixelInterpolateMethod,const double,const double,Quantum *,
228     ExceptionInfo *),
229   InterpolatePixelInfo(const Image *,const CacheView_ *,
230     const PixelInterpolateMethod,const double,const double,PixelInfo *,
231     ExceptionInfo *),
232   IsFuzzyEquivalencePixel(const Image *,const Quantum *,const Image *,
233     const Quantum *) magick_attribute((__pure__)),
234   IsFuzzyEquivalencePixelInfo(const PixelInfo *,const PixelInfo *)
235     magick_attribute((__pure__)),
236   SetPixelMetaChannels(Image *,const size_t,ExceptionInfo *);
237 
238 extern MagickExport MagickRealType
239   GetPixelInfoIntensity(const Image *magick_restrict,
240     const PixelInfo *magick_restrict) magick_hot_spot,
241   GetPixelIntensity(const Image *magick_restrict,
242     const Quantum *magick_restrict) magick_hot_spot;
243 
244 extern MagickExport PixelChannelMap
245   *AcquirePixelChannelMap(void),
246   *ClonePixelChannelMap(PixelChannelMap *),
247   *DestroyPixelChannelMap(PixelChannelMap *);
248 
249 extern MagickExport PixelInfo
250   *ClonePixelInfo(const PixelInfo *);
251 
252 extern MagickExport MagickRealType
253   DecodePixelGamma(const MagickRealType) magick_hot_spot,
254   EncodePixelGamma(const MagickRealType) magick_hot_spot;
255 
256 extern MagickExport void
257   ConformPixelInfo(Image *,const PixelInfo *,PixelInfo *,ExceptionInfo *),
258   GetPixelInfo(const Image *,PixelInfo *),
259   InitializePixelChannelMap(Image *);
260 
261 #if defined(__cplusplus) || defined(c_plusplus)
262 }
263 #endif
264 
265 #endif
266