• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2   Copyright 1999-2020 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 } PixelInterpolateMethod;
125 
126 typedef enum
127 {
128   UndefinedPixelMask = 0x000000,
129   ReadPixelMask = 0x000001,
130   WritePixelMask = 0x000002,
131   CompositePixelMask = 0x000004
132 } PixelMask;
133 
134 typedef enum
135 {
136   UndefinedPixelTrait = 0x000000,
137   CopyPixelTrait = 0x000001,
138   UpdatePixelTrait = 0x000002,
139   BlendPixelTrait = 0x000004
140 } PixelTrait;
141 
142 typedef enum
143 {
144   UndefinedPixel,
145   CharPixel,
146   DoublePixel,
147   FloatPixel,
148   LongPixel,
149   LongLongPixel,
150   QuantumPixel,
151   ShortPixel
152 } StorageType;
153 
154 /*
155   Pixel typedef declarations.
156 */
157 typedef struct _PixelChannelMap
158 {
159   PixelChannel
160     channel;
161 
162   PixelTrait
163     traits;
164 
165   ssize_t
166     offset;
167 } PixelChannelMap;
168 
169 typedef struct _PixelInfo
170 {
171   ClassType
172     storage_class;
173 
174   ColorspaceType
175     colorspace;
176 
177   PixelTrait
178     alpha_trait;
179 
180   double
181     fuzz;
182 
183   size_t
184     depth;
185 
186   MagickSizeType
187     count;
188 
189   MagickRealType
190     red,
191     green,
192     blue,
193     black,
194     alpha,
195     index;
196 } PixelInfo;
197 
198 typedef struct _PixelPacket
199 {
200   unsigned int
201     red,
202     green,
203     blue,
204     alpha,
205     black;
206 } PixelPacket;
207 
208 typedef struct _CacheView
209   CacheView_;
210 
211 /*
212   Pixel method declarations.
213 */
214 extern MagickExport ChannelType
215   SetPixelChannelMask(Image *,const ChannelType);
216 
217 extern MagickExport MagickBooleanType
218   ExportImagePixels(const Image *,const ssize_t,const ssize_t,const size_t,
219     const size_t,const char *,const StorageType,void *,ExceptionInfo *),
220   ImportImagePixels(Image *,const ssize_t,const ssize_t,const size_t,
221     const size_t,const char *,const StorageType,const void *,ExceptionInfo *),
222   InterpolatePixelChannel(const Image *magick_restrict,const CacheView_ *,
223     const PixelChannel,const PixelInterpolateMethod,const double,const double,
224     double *,ExceptionInfo *),
225   InterpolatePixelChannels(const Image *magick_restrict,const CacheView_ *,
226     const Image * magick_restrict,const PixelInterpolateMethod,const double,
227     const double,Quantum *,ExceptionInfo *),
228   InterpolatePixelInfo(const Image *,const CacheView_ *,
229     const PixelInterpolateMethod,const double,const double,PixelInfo *,
230     ExceptionInfo *),
231   IsFuzzyEquivalencePixel(const Image *,const Quantum *,const Image *,
232     const Quantum *) magick_attribute((__pure__)),
233   IsFuzzyEquivalencePixelInfo(const PixelInfo *,const PixelInfo *)
234     magick_attribute((__pure__)),
235   SetPixelMetaChannels(Image *,const size_t,ExceptionInfo *);
236 
237 extern MagickExport MagickRealType
238   GetPixelInfoIntensity(const Image *magick_restrict,
239     const PixelInfo *magick_restrict) magick_hot_spot,
240   GetPixelIntensity(const Image *magick_restrict,
241     const Quantum *magick_restrict) magick_hot_spot;
242 
243 extern MagickExport PixelChannelMap
244   *AcquirePixelChannelMap(void),
245   *ClonePixelChannelMap(PixelChannelMap *),
246   *DestroyPixelChannelMap(PixelChannelMap *);
247 
248 extern MagickExport PixelInfo
249   *ClonePixelInfo(const PixelInfo *);
250 
251 extern MagickExport MagickRealType
252   DecodePixelGamma(const MagickRealType) magick_hot_spot,
253   EncodePixelGamma(const MagickRealType) magick_hot_spot;
254 
255 extern MagickExport void
256   ConformPixelInfo(Image *,const PixelInfo *,PixelInfo *,ExceptionInfo *),
257   GetPixelInfo(const Image *,PixelInfo *),
258   InitializePixelChannelMap(Image *);
259 
260 #if defined(__cplusplus) || defined(c_plusplus)
261 }
262 #endif
263 
264 #endif
265