#undef index
-static inline double CompandsRGB(const double intensity)
+static inline double InversesRGBCompandor(const double pixel)
{
- if (intensity <= 0.0031308)
- return(intensity*12.92);
- return(1.055*pow(intensity,1.0/2.4)-0.055);
+ if (pixel <= (0.04045*QuantumRange))
+ return(pixel/12.92);
+ return(QuantumRange*pow((QuantumScale*pixel+0.055)/1.055,2.4));
}
-static inline double DecompandsRGB(const double intensity)
+static inline double sRGBCompandor(const double pixel)
{
- if (intensity <= 0.04045)
- return(intensity/12.92);
- return(pow((intensity+0.055)/1.055,2.4));
+ if (pixel <= (0.0031308*QuantumRange))
+ return(12.92*pixel);
+ return(QuantumRange*(1.055*pow(QuantumScale*pixel,1.0/2.4)-0.055));
+}
+
+static inline Quantum GetPixela(const Image *restrict image,
+ const Quantum *restrict pixel)
+{
+ return(pixel[image->channel_map[aPixelChannel].offset]);
}
static inline Quantum GetPixelAlpha(const Image *restrict image,
return(image->channel_map[AlphaPixelChannel].traits);
}
+static inline Quantum GetPixelb(const Image *restrict image,
+ const Quantum *restrict pixel)
+{
+ return(pixel[image->channel_map[bPixelChannel].offset]);
+}
+
static inline Quantum GetPixelBlack(const Image *restrict image,
const Quantum *restrict pixel)
{
if (image->channel_map[BlackPixelChannel].traits == UndefinedPixelTrait)
- return(0);
+ return((Quantum) 0);
return(pixel[image->channel_map[BlackPixelChannel].offset]);
}
const PixelChannel channel,const Quantum *restrict pixel)
{
if (image->channel_map[channel].traits == UndefinedPixelTrait)
- return(0);
+ return((Quantum) 0);
return(pixel[image->channel_map[channel].offset]);
}
const Quantum *restrict pixel)
{
if (image->channel_map[IndexPixelChannel].traits == UndefinedPixelTrait)
- return(0);
+ return((Quantum) 0);
return(pixel[image->channel_map[IndexPixelChannel].offset]);
}
return(image->channel_map[IndexPixelChannel].traits);
}
-static inline Quantum GetPixelInfoIntensity(
- const PixelInfo *restrict pixel_info)
+static inline double GetPixelInfoChannel(const PixelInfo *restrict pixel_info,
+ const PixelChannel channel)
+{
+ switch (channel)
+ {
+ case RedPixelChannel: return(pixel_info->red);
+ case GreenPixelChannel: return(pixel_info->green);
+ case BluePixelChannel: return(pixel_info->blue);
+ case BlackPixelChannel: return(pixel_info->black);
+ case AlphaPixelChannel: return(pixel_info->alpha);
+ case IndexPixelChannel: return(pixel_info->index);
+ default: return(0.0);
+ }
+}
+
+static inline double GetPixelInfoIntensity(const PixelInfo *restrict pixel_info)
{
double
blue,
green,
red;
+ if (pixel_info->colorspace == GRAYColorspace)
+ return(pixel_info->red);
if (pixel_info->colorspace != sRGBColorspace)
- {
- red=pixel_info->red;
- green=pixel_info->green;
- blue=pixel_info->blue;
- }
- else
- {
- red=QuantumRange*DecompandsRGB(QuantumScale*pixel_info->red);
- green=QuantumRange*DecompandsRGB(QuantumScale*pixel_info->green);
- blue=QuantumRange*DecompandsRGB(QuantumScale*pixel_info->blue);
- }
-#if !defined(MAGICKCORE_HDRI_SUPPORT)
- return((Quantum) (0.298839*red+0.586811*green+0.114350*blue+0.5));
-#else
- return((Quantum) (0.298839*red+0.586811*green+0.114350*blue));
-#endif
+ return(0.298839*pixel_info->red+0.586811*pixel_info->green+
+ 0.114350*pixel_info->blue);
+ red=InversesRGBCompandor(pixel_info->red);
+ green=InversesRGBCompandor(pixel_info->green);
+ blue=InversesRGBCompandor(pixel_info->blue);
+ return(0.298839*red+0.586811*green+0.114350*blue);
}
-static inline Quantum GetPixelInfoLuminance(
- const PixelInfo *restrict pixel_info)
+static inline double GetPixelInfoLuminance(const PixelInfo *restrict pixel_info)
{
double
blue,
green,
red;
- Quantum
- luminance;
-
+ if (pixel_info->colorspace == GRAYColorspace)
+ return(pixel_info->red);
if (pixel_info->colorspace != sRGBColorspace)
- {
- red=pixel_info->red;
- green=pixel_info->green;
- blue=pixel_info->blue;
- }
- else
- {
- red=QuantumRange*DecompandsRGB(QuantumScale*pixel_info->red);
- green=QuantumRange*DecompandsRGB(QuantumScale*pixel_info->green);
- blue=QuantumRange*DecompandsRGB(QuantumScale*pixel_info->blue);
- }
-#if !defined(MAGICKCORE_HDRI_SUPPORT)
- luminance=(Quantum) (0.21267*red+0.71516*green+0.07217*blue+0.5);
-#else
- luminance=(Quantum) (0.21267*red+0.71516*green+0.07217*blue);
-#endif
- return((Quantum) luminance);
+ return(0.21267*pixel_info->red+0.71516*pixel_info->green+
+ 0.07217*pixel_info->blue);
+ red=InversesRGBCompandor(pixel_info->red);
+ green=InversesRGBCompandor(pixel_info->green);
+ blue=InversesRGBCompandor(pixel_info->blue);
+ return(0.21267*red+0.71516*green+0.07217*blue);
}
-static inline Quantum GetPixelIntensity(const Image *restrict image,
+static inline double GetPixelIntensity(const Image *restrict image,
const Quantum *restrict pixel)
{
double
red;
if (image->colorspace == GRAYColorspace)
- return(pixel[image->channel_map[GrayPixelChannel].offset]);
+ return((double) pixel[image->channel_map[GrayPixelChannel].offset]);
if (image->colorspace != sRGBColorspace)
- {
- red=(double) pixel[image->channel_map[RedPixelChannel].offset];
- green=(double) pixel[image->channel_map[GreenPixelChannel].offset];
- blue=(double) pixel[image->channel_map[BluePixelChannel].offset];
- }
- else
- {
- red=QuantumRange*DecompandsRGB(QuantumScale*
- pixel[image->channel_map[RedPixelChannel].offset]);
- green=QuantumRange*DecompandsRGB(QuantumScale*
- pixel[image->channel_map[GreenPixelChannel].offset]);
- blue=QuantumRange*DecompandsRGB(QuantumScale*
- pixel[image->channel_map[BluePixelChannel].offset]);
- }
-#if !defined(MAGICKCORE_HDRI_SUPPORT)
- return((Quantum) (0.298839*red+0.586811*green+0.114350*blue+0.5));
-#else
- {
- double
- alpha,
- beta;
-
- alpha=red-(double) green;
- beta=green-(double) blue;
- if ((fabs((double) alpha) <= MagickEpsilon) &&
- (fabs(beta) <= MagickEpsilon))
- return(red);
- return((Quantum) (0.298839*red+0.586811*green+0.114350*blue));
- }
-#endif
+ return(0.298839*pixel[image->channel_map[RedPixelChannel].offset]+
+ 0.586811*pixel[image->channel_map[GreenPixelChannel].offset]+
+ 0.114350*pixel[image->channel_map[BluePixelChannel].offset]);
+ red=InversesRGBCompandor((double)
+ pixel[image->channel_map[RedPixelChannel].offset]);
+ green=InversesRGBCompandor((double)
+ pixel[image->channel_map[GreenPixelChannel].offset]);
+ blue=InversesRGBCompandor((double)
+ pixel[image->channel_map[BluePixelChannel].offset]);
+ return(0.298839*red+0.586811*green+0.114350*blue);
+}
+
+static inline Quantum GetPixelL(const Image *restrict image,
+ const Quantum *restrict pixel)
+{
+ return(pixel[image->channel_map[LPixelChannel].offset]);
}
-static inline Quantum GetPixelLuminance(const Image *restrict image,
+static inline double GetPixelLuminance(const Image *restrict image,
const Quantum *restrict pixel)
{
double
green,
red;
+ if (image->colorspace == GRAYColorspace)
+ return((double) pixel[image->channel_map[GrayPixelChannel].offset]);
if (image->colorspace != sRGBColorspace)
- {
- red=(double) pixel[image->channel_map[RedPixelChannel].offset];
- green=(double) pixel[image->channel_map[GreenPixelChannel].offset];
- blue=(double) pixel[image->channel_map[BluePixelChannel].offset];
- }
- else
- {
- red=QuantumRange*DecompandsRGB(QuantumScale*
- pixel[image->channel_map[RedPixelChannel].offset]);
- green=QuantumRange*DecompandsRGB(QuantumScale*
- pixel[image->channel_map[GreenPixelChannel].offset]);
- blue=QuantumRange*DecompandsRGB(QuantumScale*
- pixel[image->channel_map[BluePixelChannel].offset]);
- }
-#if !defined(MAGICKCORE_HDRI_SUPPORT)
- return((Quantum) (0.21267*red+0.71516*green+0.07217*blue+0.5));
-#else
- return((Quantum) (0.21267*red+0.71516*green+0.07217*blue));
-#endif
+ return(0.298839*pixel[image->channel_map[RedPixelChannel].offset]+
+ 0.586811*pixel[image->channel_map[GreenPixelChannel].offset]+
+ 0.114350*pixel[image->channel_map[BluePixelChannel].offset]);
+ red=InversesRGBCompandor((double)
+ pixel[image->channel_map[RedPixelChannel].offset]);
+ green=InversesRGBCompandor((double)
+ pixel[image->channel_map[GreenPixelChannel].offset]);
+ blue=InversesRGBCompandor((double)
+ pixel[image->channel_map[BluePixelChannel].offset]);
+ return(0.21267*red+0.71516*green+0.07217*blue);
}
static inline Quantum GetPixelMagenta(const Image *restrict image,
const Quantum *restrict pixel)
{
if (image->channel_map[MaskPixelChannel].traits == UndefinedPixelTrait)
- return(0);
+ return((Quantum) 0);
return(pixel[image->channel_map[MaskPixelChannel].offset]);
}
pixel[image->channel_map[GreenPixelChannel].offset];
pixel_info->blue=(double)
pixel[image->channel_map[BluePixelChannel].offset];
- pixel_info->black=0;
+ pixel_info->black=0.0;
if (image->channel_map[BlackPixelChannel].traits != UndefinedPixelTrait)
pixel_info->black=(double)
pixel[image->channel_map[BlackPixelChannel].offset];
if (image->channel_map[AlphaPixelChannel].traits != UndefinedPixelTrait)
pixel_info->alpha=(double)
pixel[image->channel_map[AlphaPixelChannel].offset];
- pixel_info->index=0;
+ pixel_info->index=0.0;
if (image->channel_map[IndexPixelChannel].traits != UndefinedPixelTrait)
pixel_info->index=(double)
pixel[image->channel_map[IndexPixelChannel].offset];
static inline MagickBooleanType IsPixelEquivalent(const Image *restrict image,
const Quantum *restrict p,const PixelInfo *restrict q)
{
- if (((double) p[image->channel_map[RedPixelChannel].offset] == q->red) &&
- ((double) p[image->channel_map[GreenPixelChannel].offset] == q->green) &&
- ((double) p[image->channel_map[BluePixelChannel].offset] == q->blue))
+ double
+ blue,
+ green,
+ red;
+
+ red=(double) p[image->channel_map[RedPixelChannel].offset];
+ green=(double) p[image->channel_map[GreenPixelChannel].offset];
+ blue=(double) p[image->channel_map[BluePixelChannel].offset];
+ if ((fabs(red-q->red) < MagickEpsilon) &&
+ (fabs(green-q->green) < MagickEpsilon) &&
+ (fabs(blue-q->blue) < MagickEpsilon))
return(MagickTrue);
return(MagickFalse);
}
static inline MagickBooleanType IsPixelGray(const Image *restrict image,
const Quantum *restrict pixel)
{
-#if !defined(MAGICKCORE_HDRI_SUPPORT)
- if ((pixel[image->channel_map[RedPixelChannel].offset] ==
- pixel[image->channel_map[GreenPixelChannel].offset]) &&
- (pixel[image->channel_map[GreenPixelChannel].offset] ==
- pixel[image->channel_map[BluePixelChannel].offset]))
+ double
+ blue,
+ green,
+ red;
+
+ red=(double) pixel[image->channel_map[RedPixelChannel].offset];
+ green=(double) pixel[image->channel_map[GreenPixelChannel].offset];
+ blue=(double) pixel[image->channel_map[BluePixelChannel].offset];
+ if ((fabs(red-green) < MagickEpsilon) && (fabs(green-blue) < MagickEpsilon))
return(MagickTrue);
-#else
- {
- double
- alpha,
- beta;
-
- alpha=pixel[image->channel_map[RedPixelChannel].offset]-(double)
- pixel[image->channel_map[GreenPixelChannel].offset];
- beta=pixel[image->channel_map[GreenPixelChannel].offset]-(double)
- pixel[image->channel_map[BluePixelChannel].offset];
- if ((fabs((double) alpha) <= MagickEpsilon) && (fabs(beta) <= MagickEpsilon))
- return(MagickTrue);
- }
-#endif
return(MagickFalse);
}
const PixelInfo *restrict p,const PixelInfo *restrict q)
{
if ((p->matte != MagickFalse) && (q->matte == MagickFalse) &&
- (fabs(p->alpha-OpaqueAlpha) > 0.5))
+ (fabs(p->alpha-OpaqueAlpha) >= MagickEpsilon))
return(MagickFalse);
if ((q->matte != MagickFalse) && (p->matte == MagickFalse) &&
- (fabs(q->alpha-OpaqueAlpha)) > 0.5)
+ (fabs(q->alpha-OpaqueAlpha)) >= MagickEpsilon)
return(MagickFalse);
if ((p->matte != MagickFalse) && (q->matte != MagickFalse))
{
- if (fabs(p->alpha-q->alpha) > 0.5)
+ if (fabs(p->alpha-q->alpha) >= MagickEpsilon)
return(MagickFalse);
- if (fabs(p->alpha-TransparentAlpha) <= 0.5)
+ if (fabs(p->alpha-TransparentAlpha) < MagickEpsilon)
return(MagickTrue);
}
- if (fabs(p->red-q->red) > 0.5)
+ if (fabs(p->red-q->red) >= MagickEpsilon)
return(MagickFalse);
- if (fabs(p->green-q->green) > 0.5)
+ if (fabs(p->green-q->green) >= MagickEpsilon)
return(MagickFalse);
- if (fabs(p->blue-q->blue) > 0.5)
+ if (fabs(p->blue-q->blue) >= MagickEpsilon)
return(MagickFalse);
- if ((p->colorspace == CMYKColorspace) && (fabs(p->black-q->black) > 0.5))
+ if ((p->colorspace == CMYKColorspace) &&
+ (fabs(p->black-q->black) >= MagickEpsilon))
return(MagickFalse);
return(MagickTrue);
}
static inline MagickBooleanType IsPixelMonochrome(const Image *restrict image,
const Quantum *restrict pixel)
{
-#if !defined(MAGICKCORE_HDRI_SUPPORT)
- if (((pixel[image->channel_map[RedPixelChannel].offset] == 0) ||
- (pixel[image->channel_map[RedPixelChannel].offset] == (Quantum) QuantumRange)) &&
- (pixel[image->channel_map[RedPixelChannel].offset] ==
- pixel[image->channel_map[GreenPixelChannel].offset]) &&
- (pixel[image->channel_map[GreenPixelChannel].offset] ==
- pixel[image->channel_map[BluePixelChannel].offset]))
+ double
+ blue,
+ green,
+ red;
+
+ red=(double) pixel[image->channel_map[RedPixelChannel].offset];
+ if ((fabs(red) >= MagickEpsilon) || (fabs(red-QuantumRange) >= MagickEpsilon))
+ return(MagickFalse);
+ green=(double) pixel[image->channel_map[GreenPixelChannel].offset];
+ blue=(double) pixel[image->channel_map[BluePixelChannel].offset];
+ if ((fabs(red-green) < MagickEpsilon) && (fabs(green-blue) < MagickEpsilon))
return(MagickTrue);
-#else
- {
- double
- alpha,
- beta;
-
- alpha=pixel[image->channel_map[RedPixelChannel].offset]-(double)
- pixel[image->channel_map[GreenPixelChannel].offset];
- beta=pixel[image->channel_map[GreenPixelChannel].offset]-(double)
- pixel[image->channel_map[BluePixelChannel].offset];
- if (((fabs(pixel[image->channel_map[RedPixelChannel].offset]) <= MagickEpsilon) ||
- (fabs(pixel[image->channel_map[RedPixelChannel].offset]-QuantumRange) <= MagickEpsilon)) &&
- (fabs((double) alpha) <= MagickEpsilon) && (fabs(beta) <= MagickEpsilon))
- return(MagickTrue);
- }
-#endif
return(MagickFalse);
}
static inline MagickBooleanType IsPixelInfoGray(
const PixelInfo *restrict pixel_info)
{
- if ((IsGrayColorspace(pixel_info->colorspace) == MagickFalse) &&
- (IsRGBColorspace(pixel_info->colorspace) == MagickFalse))
+ if ((pixel_info->colorspace != GRAYColorspace) &&
+ (pixel_info->colorspace != RGBColorspace))
return(MagickFalse);
-#if !defined(MAGICKCORE_HDRI_SUPPORT)
- if ((pixel_info->red == pixel_info->green) &&
- (pixel_info->green == pixel_info->blue))
+ if ((fabs(pixel_info->red-pixel_info->green) < MagickEpsilon) &&
+ (fabs(pixel_info->green-pixel_info->blue) < MagickEpsilon))
return(MagickTrue);
-#else
- {
- double
- alpha,
- beta;
-
- alpha=pixel_info->red-(double) pixel_info->green;
- beta=pixel_info->green-(double) pixel_info->blue;
- if ((fabs((double) alpha) <= MagickEpsilon) && (fabs(beta) <= MagickEpsilon))
- return(MagickTrue);
- }
-#endif
return(MagickFalse);
}
static inline MagickBooleanType IsPixelInfoMonochrome(
const PixelInfo *restrict pixel_info)
{
-#if !defined(MAGICKCORE_HDRI_SUPPORT)
- if (((pixel_info->red == 0) || (pixel_info->red == (Quantum) QuantumRange)) &&
- (pixel_info->red == pixel_info->green) &&
- (pixel_info->green == pixel_info->blue))
+ if ((pixel_info->colorspace != GRAYColorspace) &&
+ (pixel_info->colorspace != RGBColorspace))
+ return(MagickFalse);
+ if ((fabs(pixel_info->red) >= MagickEpsilon) ||
+ (fabs(pixel_info->red-QuantumRange) >= MagickEpsilon))
+ return(MagickFalse);
+ if ((fabs(pixel_info->red-pixel_info->green) < MagickEpsilon) &&
+ (fabs(pixel_info->green-pixel_info->blue) < MagickEpsilon))
return(MagickTrue);
-#else
- {
- double
- alpha,
- beta;
-
- alpha=pixel_info->red-(double) pixel_info->green;
- beta=pixel_info->green-(double) pixel_info->blue;
- if (((fabs(pixel_info->red) <= MagickEpsilon) ||
- (fabs(pixel_info->red-QuantumRange) <= MagickEpsilon)) &&
- (fabs((double) alpha) <= MagickEpsilon) && (fabs(beta) <= MagickEpsilon))
- return(MagickTrue);
- }
-#endif
return(MagickFalse);
}
+static inline void SetPixela(const Image *restrict image,
+ const Quantum a,Quantum *restrict pixel)
+{
+ if (image->channel_map[aPixelChannel].traits != UndefinedPixelTrait)
+ pixel[image->channel_map[aPixelChannel].offset]=a;
+}
+
static inline void SetPixelAlpha(const Image *restrict image,
const Quantum alpha,Quantum *restrict pixel)
{
image->channel_map[AlphaPixelChannel].traits=traits;
}
+static inline void SetPixelb(const Image *restrict image,
+ const Quantum b,Quantum *restrict pixel)
+{
+ if (image->channel_map[bPixelChannel].traits != UndefinedPixelTrait)
+ pixel[image->channel_map[bPixelChannel].offset]=b;
+}
+
static inline void SetPixelBlack(const Image *restrict image,
const Quantum black,Quantum *restrict pixel)
{
MagickFalse ? OpaqueAlpha : ClampToQuantum(pixel_info->alpha);
}
+static inline void SetPixelL(const Image *restrict image,
+ const Quantum L,Quantum *restrict pixel)
+{
+ if (image->channel_map[LPixelChannel].traits != UndefinedPixelTrait)
+ pixel[image->channel_map[LPixelChannel].offset]=L;
+}
+
static inline void SetPixelMagenta(const Image *restrict image,
const Quantum magenta,Quantum *restrict pixel)
{