Home | History | Annotate | Download | only in MagickCore
      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