blob: f4ef93f8316eb0ec40679970a490009cc36217d6 [file] [log] [blame]
cristy4c08aed2011-07-01 19:47:50 +00001/*
cristy1454be72011-12-19 01:52:48 +00002 Copyright 1999-2012 ImageMagick Studio LLC, a non-profit organization
cristy4c08aed2011-07-01 19:47:50 +00003 dedicated to making software imaging solutions freely available.
4
5 You may not use this file except in compliance with the License.
6 obtain a copy of the License at
7
8 http://www.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
cristyd04e7bf2012-03-03 19:19:12 +000016 MagickCore image pixel methods.
cristy4c08aed2011-07-01 19:47:50 +000017*/
18#ifndef _MAGICKCORE_PIXEL_H
19#define _MAGICKCORE_PIXEL_H
20
21#if defined(__cplusplus) || defined(c_plusplus)
22extern "C" {
23#endif
24
25#include <MagickCore/colorspace.h>
cristy4c08aed2011-07-01 19:47:50 +000026
cristyed231572011-07-14 02:18:59 +000027#define MaxPixelChannels 32
cristy4af4a772011-09-07 21:40:44 +000028#undef index
cristy490408a2011-07-07 14:42:05 +000029
cristy4c08aed2011-07-01 19:47:50 +000030typedef enum
31{
cristyc8d63672012-01-11 13:03:13 +000032 UndefinedChannel = 0x0000,
33 RedChannel = 0x0001,
34 GrayChannel = 0x0001,
35 CyanChannel = 0x0001,
36 GreenChannel = 0x0002,
37 MagentaChannel = 0x0002,
38 BlueChannel = 0x0004,
39 YellowChannel = 0x0004,
40 BlackChannel = 0x0008,
41 AlphaChannel = 0x0010,
42 OpacityChannel = 0x0010,
43 IndexChannel = 0x0020,
44 MaskChannel = 0x0040,
45 MetaChannel = 0x0080,
46 CompositeChannels = 0x002F,
47 AllChannels = 0x7ffffff,
48 /*
49 Special purpose channel types.
anthonyaa6b0842012-03-22 00:25:25 +000050 FUTURE: are these needed any more - they are more like hacks
51 SyncChannels for example is NOT a real channel but a 'flag'
52 It really says -- "User has not defined channels"
cristyc8d63672012-01-11 13:03:13 +000053 */
54 TrueAlphaChannel = 0x0100, /* extract actual alpha channel from opacity */
55 RGBChannels = 0x0200, /* set alpha from grayscale mask in RGB */
56 GrayChannels = 0x0400,
anthonyaa6b0842012-03-22 00:25:25 +000057 SyncChannels = 0x20000, /* channels modified as a single unit */
cristyc8d63672012-01-11 13:03:13 +000058 DefaultChannels = ((AllChannels | SyncChannels) &~ AlphaChannel)
59} ChannelType; /* must correspond to PixelChannel */
60
61typedef enum
62{
cristy4c08aed2011-07-01 19:47:50 +000063 UndefinedInterpolatePixel,
anthonycf4e33d2012-06-08 07:33:23 +000064 AverageInterpolatePixel, /* Average 4 nearest neighbours */
65 Average9InterpolatePixel, /* Average 9 nearest neighbours */
66 Average16InterpolatePixel, /* Average 16 nearest neighbours */
67 BackgroundInterpolatePixel, /* Just return background color */
68 BilinearInterpolatePixel, /* Triangular filter interpolation */
69 BlendInterpolatePixel, /* blend of nearest 1, 2 or 4 pixels */
70 CatromInterpolatePixel, /* Catmull-Rom interpolation */
71 IntegerInterpolatePixel, /* Integer (floor) interpolation */
72 MeshInterpolatePixel, /* Triangular Mesh interpolation */
73 NearestInterpolatePixel, /* Nearest Neighbour Only */
cristy436f31b2012-06-10 17:47:56 +000074 SplineInterpolatePixel /* Cubic Spline (blurred) interpolation */
anthonycf4e33d2012-06-08 07:33:23 +000075 /* FilterInterpolatePixel, ** Use resize filter - (very slow) */
cristy5c4e2582011-09-11 19:21:03 +000076} PixelInterpolateMethod;
cristy4c08aed2011-07-01 19:47:50 +000077
78typedef enum
79{
cristy6dcb9b82011-10-23 23:21:25 +000080 UndefinedPixelChannel = 0,
cristyed231572011-07-14 02:18:59 +000081 RedPixelChannel = 0,
82 CyanPixelChannel = 0,
83 GrayPixelChannel = 0,
cristyb5649542012-06-30 22:46:15 +000084 LPixelChannel = 0,
cristyed231572011-07-14 02:18:59 +000085 YPixelChannel = 0,
cristyb5649542012-06-30 22:46:15 +000086 aPixelChannel = 1,
cristyed231572011-07-14 02:18:59 +000087 GreenPixelChannel = 1,
88 MagentaPixelChannel = 1,
89 CbPixelChannel = 1,
cristyb5649542012-06-30 22:46:15 +000090 bPixelChannel = 2,
cristyed231572011-07-14 02:18:59 +000091 BluePixelChannel = 2,
92 YellowPixelChannel = 2,
93 CrPixelChannel = 2,
cristye2a912b2011-12-05 20:02:07 +000094 BlackPixelChannel = 3,
95 AlphaPixelChannel = 4,
96 IndexPixelChannel = 5,
anthonyaa6b0842012-03-22 00:25:25 +000097 MaskPixelChannel = 6, /* Image Write Mask */
98 MetaPixelChannel = 7, /* ??? */
99 IntensityPixelChannel = MaxPixelChannels, /* what are these ??? */
cristy5f95f4f2011-10-23 01:01:01 +0000100 CompositePixelChannel = MaxPixelChannels,
cristy2bddff82011-07-25 18:39:12 +0000101 SyncPixelChannel = MaxPixelChannels+1
cristyc8d63672012-01-11 13:03:13 +0000102} PixelChannel; /* must correspond to ChannelType */
cristy4c08aed2011-07-01 19:47:50 +0000103
104typedef enum
105{
cristy94bc3bf2011-07-04 18:55:37 +0000106 UndefinedPixelTrait = 0x000000,
cristyed231572011-07-14 02:18:59 +0000107 CopyPixelTrait = 0x000001,
108 UpdatePixelTrait = 0x000002,
109 BlendPixelTrait = 0x000004
cristy94bc3bf2011-07-04 18:55:37 +0000110} PixelTrait;
cristy4c08aed2011-07-01 19:47:50 +0000111
cristyed231572011-07-14 02:18:59 +0000112typedef struct _PixelChannelMap
113{
114 PixelChannel
115 channel;
116
117 PixelTrait
118 traits;
cristye2a912b2011-12-05 20:02:07 +0000119
cristyd26338f2011-12-14 02:39:30 +0000120 ssize_t
cristye2a912b2011-12-05 20:02:07 +0000121 offset;
cristyed231572011-07-14 02:18:59 +0000122} PixelChannelMap;
123
cristy4c08aed2011-07-01 19:47:50 +0000124typedef struct _PixelInfo
125{
126 ClassType
127 storage_class;
128
129 ColorspaceType
130 colorspace;
131
132 MagickBooleanType
133 matte;
134
135 double
136 fuzz;
137
138 size_t
139 depth;
140
cristy3094b7f2011-10-01 23:18:02 +0000141 MagickSizeType
142 count;
143
144 double
cristy4c08aed2011-07-01 19:47:50 +0000145 red,
146 green,
147 blue,
cristy4c08aed2011-07-01 19:47:50 +0000148 black,
cristy3094b7f2011-10-01 23:18:02 +0000149 alpha,
cristy4c08aed2011-07-01 19:47:50 +0000150 index;
151} PixelInfo;
152
cristy101ab702011-10-13 13:06:32 +0000153typedef struct _PixelPacket
cristy5c4e2582011-09-11 19:21:03 +0000154{
155 unsigned int
156 red,
157 green,
158 blue,
159 alpha,
160 black;
cristy4c08aed2011-07-01 19:47:50 +0000161} PixelPacket;
162
cristy3f858f42012-01-07 00:03:25 +0000163typedef enum
164{
165 UndefinedPixel,
166 CharPixel,
167 DoublePixel,
168 FloatPixel,
cristy3f858f42012-01-07 00:03:25 +0000169 LongPixel,
cristy6c9e1682012-01-07 21:37:44 +0000170 LongLongPixel,
cristy3f858f42012-01-07 00:03:25 +0000171 QuantumPixel,
172 ShortPixel
173} StorageType;
174
cristy4c08aed2011-07-01 19:47:50 +0000175typedef struct _CacheView
176 CacheView_;
177
cristybd5a96c2011-08-21 00:04:26 +0000178extern MagickExport ChannelType
179 SetPixelChannelMask(Image *,const ChannelType);
180
cristy4c08aed2011-07-01 19:47:50 +0000181extern MagickExport MagickBooleanType
cristy2dc655d2012-07-05 13:16:28 +0000182 ExportImagePixels(Image *,const ssize_t,const ssize_t,const size_t,
cristy4c08aed2011-07-01 19:47:50 +0000183 const size_t,const char *,const StorageType,void *,ExceptionInfo *),
184 ImportImagePixels(Image *,const ssize_t,const ssize_t,const size_t,
cristy018f07f2011-09-04 21:15:19 +0000185 const size_t,const char *,const StorageType,const void *,ExceptionInfo *),
cristya085a432011-07-30 01:39:32 +0000186 InterpolatePixelChannel(const Image *,const CacheView_ *,
cristy5c4e2582011-09-11 19:21:03 +0000187 const PixelChannel,const PixelInterpolateMethod,const double,const double,
cristya085a432011-07-30 01:39:32 +0000188 double *,ExceptionInfo *),
cristy5c4e2582011-09-11 19:21:03 +0000189 InterpolatePixelChannels(const Image *,const CacheView_ *,const Image *,
190 const PixelInterpolateMethod,const double,const double,Quantum *,
191 ExceptionInfo *),
cristy4c08aed2011-07-01 19:47:50 +0000192 InterpolatePixelInfo(const Image *,const CacheView_ *,
cristy5c4e2582011-09-11 19:21:03 +0000193 const PixelInterpolateMethod,const double,const double,PixelInfo *,
cristy4c08aed2011-07-01 19:47:50 +0000194 ExceptionInfo *),
cristye4a40472011-12-22 02:56:19 +0000195 IsFuzzyEquivalencePixel(const Image *,const Quantum *,const Image *,
cristy4c08aed2011-07-01 19:47:50 +0000196 const Quantum *),
cristy322d07d2012-03-18 21:17:23 +0000197 IsFuzzyEquivalencePixelInfo(const PixelInfo *,const PixelInfo *),
198 SetPixelMetaChannels(Image *,const size_t,ExceptionInfo *);
cristy4c08aed2011-07-01 19:47:50 +0000199
cristyed231572011-07-14 02:18:59 +0000200extern MagickExport PixelChannelMap
cristybd5a96c2011-08-21 00:04:26 +0000201 *AcquirePixelChannelMap(void),
202 *ClonePixelChannelMap(PixelChannelMap *),
203 *DestroyPixelChannelMap(PixelChannelMap *);
cristy4c08aed2011-07-01 19:47:50 +0000204
205extern MagickExport PixelInfo
206 *ClonePixelInfo(const PixelInfo *);
207
208extern MagickExport void
cristybd5a96c2011-08-21 00:04:26 +0000209 InitializePixelChannelMap(Image *),
cristy2b9582a2011-07-04 17:38:56 +0000210 GetPixelInfo(const Image *,PixelInfo *),
cristye2a912b2011-12-05 20:02:07 +0000211 SetPixelChannelMapMask(Image *,const ChannelType);
cristy4c08aed2011-07-01 19:47:50 +0000212
213#if defined(__cplusplus) || defined(c_plusplus)
214}
215#endif
216
217#endif