| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257 |
- /*
- Copyright 1999 ImageMagick Studio LLC, a non-profit organization
- dedicated to making software imaging solutions freely available.
- You may not use this file except in compliance with the License. You may
- obtain a copy of the License at
- https://imagemagick.org/script/license.php
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- MagickCore pixel accessor methods.
- */
- #ifndef MAGICKCORE_PIXEL_ACCESSOR_H
- #define MAGICKCORE_PIXEL_ACCESSOR_H
- #include <math.h>
- #include "magick/gem.h"
- #include "magick/pixel.h"
- #if defined(__cplusplus) || defined(c_plusplus)
- extern "C" {
- #endif
- #define ClampPixelRed(pixel) ClampToQuantum((pixel)->red)
- #define ClampPixelGreen(pixel) ClampToQuantum((pixel)->green)
- #define ClampPixelBlue(pixel) ClampToQuantum((pixel)->blue)
- #define ClampPixelIndex(indexes) ClampToQuantum(*(indexes))
- #define ClampPixelOpacity(pixel) ClampToQuantum((pixel)->opacity)
- #define GetPixela(pixel) ((pixel)->green)
- #define GetPixelb(pixel) ((pixel)->blue)
- #define GetPixelAlpha(pixel) ((double) QuantumRange-(double) (pixel)->opacity)
- #define GetPixelBlack(indexes) (*(indexes))
- #define GetPixelBlue(pixel) ((pixel)->blue)
- #define GetPixelCb(pixel) ((pixel)->green)
- #define GetPixelCr(pixel) ((pixel)->blue)
- #define GetPixelCyan(pixel) ((pixel)->red)
- #define GetPixelGray(pixel) ((pixel)->red)
- #define GetPixelGreen(pixel) ((pixel)->green)
- #define GetPixelIndex(indexes) (*(indexes))
- #define GetPixelL(pixel) ((pixel)->red)
- #define GetPixelLabel(pixel) ((ssize_t) (pixel)->red)
- #define GetPixelMagenta(pixel) ((pixel)->green)
- #define GetPixelNext(pixel) ((pixel)+1)
- #define GetPixelOpacity(pixel) ((pixel)->opacity)
- #define GetPixelRed(pixel) ((pixel)->red)
- #define GetPixelRGB(pixel,packet) \
- { \
- (packet)->red=GetPixelRed((pixel)); \
- (packet)->green=GetPixelGreen((pixel)); \
- (packet)->blue=GetPixelBlue((pixel)); \
- }
- #define GetPixelRGBO(pixel,packet) \
- { \
- (packet)->red=GetPixelRed((pixel)); \
- (packet)->green=GetPixelGreen((pixel)); \
- (packet)->blue=GetPixelBlue((pixel)); \
- (packet)->opacity=GetPixelOpacity((pixel)); \
- }
- #define GetPixelY(pixel) ((pixel)->red)
- #define GetPixelYellow(pixel) ((pixel)->blue)
- #define SetPixela(pixel,value) ((pixel)->green=(Quantum) (value))
- #define SetPixelAlpha(pixel,value) \
- ((pixel)->opacity=(Quantum) ((double) QuantumRange-(double) (value)))
- #define SetPixelb(pixel,value) ((pixel)->blue=(Quantum) (value))
- #define SetPixelBlack(indexes,value) (*(indexes)=(Quantum) (value))
- #define SetPixelBlue(pixel,value) ((pixel)->blue=(Quantum) (value))
- #define SetPixelCb(pixel,value) ((pixel)->green=(Quantum) (value))
- #define SetPixelCr(pixel,value) ((pixel)->blue=(Quantum) (value))
- #define SetPixelCyan(pixel,value) ((pixel)->red=(Quantum) (value))
- #define SetPixelGray(pixel,value) \
- ((pixel)->red=(pixel)->green=(pixel)->blue=(Quantum) (value))
- #define SetPixelGreen(pixel,value) ((pixel)->green=(Quantum) (value))
- #define SetPixelIndex(indexes,value) (*(indexes)=(IndexPacket) (value))
- #define SetPixelL(pixel,value) ((pixel)->red=(Quantum) (value))
- #define SetPixelMagenta(pixel,value) ((pixel)->green=(Quantum) (value))
- #define SetPixelOpacity(pixel,value) ((pixel)->opacity=(Quantum) (value))
- #define SetPixelRed(pixel,value) ((pixel)->red=(Quantum) (value))
- #define SetPixelRgb(pixel,packet) \
- { \
- SetPixelRed(pixel,(packet)->red); \
- SetPixelGreen(pixel,(packet)->green); \
- SetPixelBlue(pixel,(packet)->blue); \
- }
- #define SetPixelRGBA(pixel,packet) \
- { \
- SetPixelRed(pixel,(packet)->red); \
- SetPixelGreen(pixel,(packet)->green); \
- SetPixelBlue(pixel,(packet)->blue); \
- SetPixelAlpha(pixel,(QuantumRange-(packet)->opacity)); \
- }
- #define SetPixelRGBO(pixel,packet) \
- { \
- SetPixelRed(pixel,(packet)->red); \
- SetPixelGreen(pixel,(packet)->green); \
- SetPixelBlue(pixel,(packet)->blue); \
- SetPixelOpacity(pixel,(packet)->opacity); \
- }
- #define SetPixelYellow(pixel,value) ((pixel)->blue=(Quantum) (value))
- #define SetPixelY(pixel,value) ((pixel)->red=(Quantum) (value))
- static inline MagickRealType AbsolutePixelValue(const MagickRealType x)
- {
- return(x < 0.0 ? -x : x);
- }
- static inline Quantum ClampPixel(const MagickRealType value)
- {
- if (value < 0.0)
- return((Quantum) 0);
- if (value >= (MagickRealType) QuantumRange)
- return((Quantum) QuantumRange);
- #if !defined(MAGICKCORE_HDRI_SUPPORT)
- return((Quantum) (value+0.5));
- #else
- return((Quantum) value);
- #endif
- }
- static inline double PerceptibleReciprocal(const double x)
- {
- double
- sign;
-
- /*
- Return 1/x where x is perceptible (not unlimited or infinitesimal).
- */
- sign=x < 0.0 ? -1.0 : 1.0;
- if ((sign*x) >= MagickEpsilon)
- return(1.0/x);
- return(sign/MagickEpsilon);
- }
- static inline MagickRealType GetPixelLuma(
- const Image *magick_restrict image,const PixelPacket *magick_restrict pixel)
- {
- MagickRealType
- intensity;
- (void) image;
- intensity=(MagickRealType) (0.212656f*pixel->red+0.715158f*pixel->green+
- 0.072186f*pixel->blue);
- return(intensity);
- }
- static inline MagickRealType GetPixelLuminance(
- const Image *magick_restrict image,const PixelPacket *magick_restrict pixel)
- {
- MagickRealType
- intensity;
- if (image->colorspace != sRGBColorspace)
- {
- intensity=(MagickRealType) (0.212656f*pixel->red+0.715158f*pixel->green+
- 0.072186f*pixel->blue);
- return(intensity);
- }
- intensity=(MagickRealType) (0.212656*DecodePixelGamma((MagickRealType)
- pixel->red)+0.715158*DecodePixelGamma((MagickRealType) pixel->green)+
- 0.072186*DecodePixelGamma((MagickRealType) pixel->blue));
- return(intensity);
- }
- static inline void GetPixelPacketRGBA(const Quantum red,const Quantum green,
- const Quantum blue,const Quantum opacity,PixelPacket *magick_restrict pixel)
- {
- pixel->red=red;
- pixel->green=green;
- pixel->blue=blue;
- pixel->opacity=opacity;
- }
- static inline MagickBooleanType IsPixelAtDepth(const Quantum pixel,
- const QuantumAny range)
- {
- Quantum
- quantum;
- if (range == 0)
- return(MagickTrue);
- #if !defined(MAGICKCORE_HDRI_SUPPORT)
- quantum=(Quantum) (((MagickRealType) QuantumRange*((QuantumAny)
- (((MagickRealType) range*pixel)/QuantumRange+0.5)))/range+0.5);
- #else
- quantum=(Quantum) (((MagickRealType) QuantumRange*((QuantumAny)
- (((MagickRealType) range*(MagickRealType) pixel)/(MagickRealType) QuantumRange+
- 0.5)))/(MagickRealType) range);
- #endif
- return(pixel == quantum ? MagickTrue : MagickFalse);
- }
- static inline MagickBooleanType IsPixelGray(const PixelPacket *pixel)
- {
- MagickRealType
- green_blue,
- red_green;
- red_green=(MagickRealType) pixel->red-(MagickRealType) pixel->green;
- green_blue=(MagickRealType) pixel->green-(MagickRealType) pixel->blue;
- if (((QuantumScale*AbsolutePixelValue(red_green)) < MagickEpsilon) &&
- ((QuantumScale*AbsolutePixelValue(green_blue)) < MagickEpsilon))
- return(MagickTrue);
- return(MagickFalse);
- }
- static inline MagickBooleanType IsPixelMonochrome(
- const PixelPacket *pixel)
- {
- MagickRealType
- green_blue,
- red,
- red_green;
- red=(MagickRealType) pixel->red;
- if ((AbsolutePixelValue(red) >= MagickEpsilon) &&
- (AbsolutePixelValue(red-(double) QuantumRange) >= MagickEpsilon))
- return(MagickFalse);
- red_green=(MagickRealType) pixel->red-(double) pixel->green;
- green_blue=(MagickRealType) pixel->green-(double) pixel->blue;
- if (((QuantumScale*AbsolutePixelValue(red_green)) < MagickEpsilon) &&
- ((QuantumScale*AbsolutePixelValue(green_blue)) < MagickEpsilon))
- return(MagickTrue);
- return(MagickFalse);
- }
- static inline Quantum PixelPacketIntensity(const PixelPacket *pixel)
- {
- MagickRealType
- intensity;
- if ((pixel->red == pixel->green) && (pixel->green == pixel->blue))
- return(pixel->red);
- intensity=(MagickRealType) (0.212656f*pixel->red+0.715158f*pixel->green+
- 0.072186f*pixel->blue);
- return(ClampToQuantum(intensity));
- }
- static inline void SetPixelViaMagickPixel(const Image *magick_restrict image,
- const MagickPixelPacket *magick_restrict magick_pixel,
- PixelPacket *magick_restrict pixel)
- {
- pixel->red=ClampToQuantum(magick_pixel->red);
- pixel->green=ClampToQuantum(magick_pixel->green);
- pixel->blue=ClampToQuantum(magick_pixel->blue);
- if (image->matte != MagickFalse)
- pixel->opacity=ClampToQuantum(magick_pixel->opacity);
- }
- #if defined(__cplusplus) || defined(c_plusplus)
- }
- #endif
- #endif
|