11#define MAGICKCORE_IMPLEMENTATION
12#define MAGICK_PLUSPLUS_IMPLEMENTATION 1
14#include "Magick++/Include.h"
17#include "Magick++/Color.h"
18#include "Magick++/Exception.h"
22MagickPPExport
int Magick::operator == (
const Magick::Color &left_,
25#if defined(MAGICKCORE_HDRI_SUPPORT)
26 return((left_.isValid() == right_.isValid()) &&
27 (fabs((
double) left_.quantumRed()-(
double) right_.quantumRed()) < MagickEpsilon) &&
28 (fabs((
double) left_.quantumGreen()-(
double) right_.quantumGreen()) < MagickEpsilon) &&
29 (fabs((
double) left_.quantumBlue()-(
double) right_.quantumBlue()) < MagickEpsilon));
31 return((left_.isValid() == right_.isValid()) &&
32 (left_.quantumRed() == right_.quantumRed()) &&
33 (left_.quantumGreen() == right_.quantumGreen()) &&
34 (left_.quantumBlue() == right_.quantumBlue()));
38MagickPPExport
int Magick::operator != (
const Magick::Color &left_,
41 return(!(left_ == right_));
44MagickPPExport
int Magick::operator > (
const Magick::Color &left_,
47 return(!(left_ < right_ ) && (left_ != right_ ));
50MagickPPExport
int Magick::operator < (
const Magick::Color &left_,
53 if(left_.quantumRed() < right_.quantumRed())
55 if(left_.quantumRed() > right_.quantumRed())
57 if(left_.quantumGreen() < right_.quantumGreen())
59 if(left_.quantumGreen() > right_.quantumGreen())
61 if(left_.quantumBlue() < right_.quantumBlue())
66MagickPPExport
int Magick::operator >= (
const Magick::Color &left_,
69 return((left_ > right_) || (left_ == right_));
72MagickPPExport
int Magick::operator <= (
const Magick::Color &left_,
75 return((left_ < right_) || (left_ == right_));
78Magick::Color::Color(
void)
79 : _pixel(new PixelInfo),
86 setAlpha(TransparentAlpha);
89Magick::Color::Color(
const Magick::Quantum red_,
const Magick::Quantum green_,
91 : _pixel(new PixelInfo),
98 quantumAlpha(OpaqueAlpha);
101 quantumGreen(green_);
105Magick::Color::Color(
const Magick::Quantum red_,
const Magick::Quantum green_,
106 const Magick::Quantum blue_,
const Magick::Quantum alpha_)
107 : _pixel(new PixelInfo),
114 quantumAlpha(alpha_);
117 quantumGreen(green_);
119 if (alpha_ != OpaqueAlpha)
120 _pixelType=RGBAPixel;
123Magick::Color::Color(
const Magick::Quantum cyan_,
const Magick::Quantum magenta_,
124 const Magick::Quantum yellow_,
const Magick::Quantum black_,
125 const Magick::Quantum alpha_)
126 : _pixel(new PixelInfo),
129 _pixelType(CMYKPixel)
133 quantumAlpha(alpha_);
134 quantumBlack(black_);
135 quantumBlue(yellow_);
136 quantumGreen(magenta_);
138 if (alpha_ != OpaqueAlpha)
139 _pixelType=CMYKAPixel;
142Magick::Color::Color(
const char *color_)
143 : _pixel(new PixelInfo),
159 _pixel=(PixelInfo *)NULL;
165 : _pixel(new PixelInfo),
166 _isValid(color_._isValid),
168 _pixelType(color_._pixelType)
170 *_pixel=*color_._pixel;
173Magick::Color::Color(
const PixelInfo &color_)
174 : _pixel(new PixelInfo),
179 setPixelType(color_);
182Magick::Color::Color(
const std::string &color_)
183 : _pixel(new PixelInfo),
199 _pixel=(PixelInfo *)NULL;
204Magick::Color::~Color(
void)
209 _pixel=(PixelInfo *)NULL;
212Magick::Color& Magick::Color::operator=(
const Magick::Color& color_)
218 *_pixel=*color_._pixel;
221 _isValid=color_._isValid;
224 _pixelType=color_._pixelType;
229const Magick::Color& Magick::Color::operator=(
const char *color_)
231 *
this=std::string(color_);
235const Magick::Color& Magick::Color::operator=(
const MagickCore::PixelInfo &color_)
238 setPixelType(color_);
243const Magick::Color& Magick::Color::operator=(
const std::string &color_)
250 if (QueryColorCompliance(color_.c_str(),AllCompliance,&target_color,
253 quantumAlpha((Magick::Quantum ) target_color.alpha);
254 quantumBlack((Magick::Quantum ) target_color.black);
255 quantumBlue((Magick::Quantum ) target_color.blue);
256 quantumGreen((Magick::Quantum ) target_color.green);
257 quantumRed((Magick::Quantum ) target_color.red);
259 setPixelType(target_color);
266 _pixel = (PixelInfo *)NULL;
268 ThrowPPException(
true);
273Magick::Color::operator MagickCore::PixelInfo()
const
278Magick::Color::operator std::string()
const
281 colorbuf[MagickPathExtent];
287 return std::string(
"none");
289 pixel.colorspace=(_pixelType == RGBPixel || _pixelType == RGBAPixel) ?
290 sRGBColorspace : CMYKColorspace;
291 pixel.depth=MAGICKCORE_QUANTUM_DEPTH;
292 pixel.alpha=_pixel->alpha;
293 pixel.alpha_trait=_pixel->alpha_trait;
294 pixel.black=_pixel->black;
295 pixel.blue=_pixel->blue;
296 pixel.green=_pixel->green;
297 pixel.red=_pixel->red;
298 GetColorTuple(&pixel,MagickTrue,colorbuf);
300 return(std::string(colorbuf));
303bool Magick::Color::isFuzzyEquivalent(
const Color &color_,
const double fuzz_)
const
313 return (IsFuzzyEquivalencePixelInfo(&p, &q) != MagickFalse);
316bool Magick::Color::isValid(
void)
const
321Magick::Color::PixelType Magick::Color::pixelType()
const
326void Magick::Color::isValid(
bool valid_)
328 if (
bool(valid_) ==
bool(isValid()))
333 _pixel=
new PixelInfo;
342void Magick::Color::quantumAlpha(
const Magick::Quantum alpha_)
348Magick::Quantum Magick::Color::quantumAlpha(
void)
const
350 return((Magick::Quantum) _pixel->alpha);
353void Magick::Color::quantumBlack(
const Magick::Quantum black_)
355 _pixel->black=black_;
359Magick::Quantum Magick::Color::quantumBlack(
void)
const
361 return((Magick::Quantum) _pixel->black);
364void Magick::Color::quantumBlue(
const Magick::Quantum blue_)
370Magick::Quantum Magick::Color::quantumBlue(
void)
const
372 return((Magick::Quantum) _pixel->blue);
375void Magick::Color::quantumGreen(
const Magick::Quantum green_)
377 _pixel->green=green_;
381Magick::Quantum Magick::Color::quantumGreen(
void)
const
383 return((Magick::Quantum) _pixel->green);
386void Magick::Color::quantumRed(
const Magick::Quantum red_)
392Magick::Quantum Magick::Color::quantumRed(
void)
const
394 return((Magick::Quantum) _pixel->red);
397Magick::Color::Color(PixelType pixelType_)
398 : _pixel(new PixelInfo),
401 _pixelType(pixelType_)
406Magick::Color::Color(PixelInfo* rep_,PixelType pixelType_)
410 _pixelType(pixelType_)
414void Magick::Color::pixel(PixelInfo *rep_,PixelType pixelType_)
422 _pixelType=pixelType_;
425Magick::Quantum Magick::Color::scaleDoubleToQuantum(
const double double_)
427 return(
static_cast<Magick::Quantum
>(double_*(
double) QuantumRange));
430double Magick::Color::scaleQuantumToDouble(
const Magick::Quantum quantum_)
432#if (MAGICKCORE_QUANTUM_DEPTH < 32) && (MAGICKCORE_SIZEOF_FLOAT_T != MAGICKCORE_SIZEOF_DOUBLE || !defined(MAGICKCORE_HDRI_SUPPORT))
433 return(
static_cast<double>(QuantumScale*(
double) quantum_));
435 return(QuantumScale*quantum_);
439void Magick::Color::initPixel()
441 MagickCore::GetPixelInfo((MagickCore::Image *) NULL, _pixel);
442 if (_pixelType == CMYKPixel || _pixelType == CMYKAPixel)
443 _pixel->colorspace=CMYKColorspace;
446void Magick::Color::setAlpha(
const Magick::Quantum alpha_)
448 _pixel->alpha=alpha_;
449 if (alpha_ == OpaqueAlpha)
451 _pixel->alpha_trait=UndefinedPixelTrait;
452 if (_pixelType == RGBAPixel)
454 else if (_pixelType == CMYKAPixel)
455 _pixelType=CMYKPixel;
459 _pixel->alpha_trait=BlendPixelTrait;
460 if (_pixelType == RGBPixel)
461 _pixelType=RGBAPixel;
462 else if (_pixelType == CMYKPixel)
463 _pixelType=CMYKAPixel;
467void Magick::Color::setPixelType(
const PixelInfo &color_)
469 if (color_.colorspace == CMYKColorspace)
470 _pixelType=color_.alpha_trait != UndefinedPixelTrait ? CMYKAPixel :
473 _pixelType=color_.alpha_trait != UndefinedPixelTrait ? RGBAPixel :
477Magick::ColorCMYK::ColorCMYK(
void)
487Magick::ColorCMYK::ColorCMYK(
const double cyan_,
const double magenta_,
488 const double yellow_,
const double black_)
497Magick::ColorCMYK::ColorCMYK(
const double cyan_,
const double magenta_,
498 const double yellow_,
const double black_,
const double alpha_)
508Magick::ColorCMYK::~ColorCMYK(
void)
512Magick::ColorCMYK& Magick::ColorCMYK::operator=(
const Magick::Color& color_)
514 *
static_cast<Magick::Color*
>(
this)=color_;
518void Magick::ColorCMYK::alpha(
const double alpha_)
520 quantumAlpha(scaleDoubleToQuantum(alpha_));
523double Magick::ColorCMYK::alpha(
void)
const
525 return(scaleQuantumToDouble(quantumAlpha()));
528void Magick::ColorCMYK::black(
const double black_)
530 quantumBlack(scaleDoubleToQuantum(black_));
533double Magick::ColorCMYK::black(
void)
const
535 return(scaleQuantumToDouble(quantumBlack()));
538void Magick::ColorCMYK::cyan(
const double cyan_)
540 quantumRed(scaleDoubleToQuantum(cyan_));
543double Magick::ColorCMYK::cyan(
void)
const
545 return(scaleQuantumToDouble(quantumRed()));
548void Magick::ColorCMYK::magenta(
const double magenta_)
550 quantumGreen(scaleDoubleToQuantum(magenta_));
553double Magick::ColorCMYK::magenta(
void)
const
555 return(scaleQuantumToDouble(quantumGreen()));
558void Magick::ColorCMYK::yellow(
const double yellow_)
560 quantumBlue(scaleDoubleToQuantum(yellow_));
563double Magick::ColorCMYK::yellow(
void)
const
565 return(scaleQuantumToDouble(quantumBlue()));
568Magick::ColorCMYK::ColorCMYK(PixelInfo *rep_,PixelType pixelType_)
569 :
Color(rep_,pixelType_)
573Magick::ColorGray::ColorGray(
void)
583Magick::ColorGray::ColorGray(
double shade_)
584 : Color(scaleDoubleToQuantum(shade_),scaleDoubleToQuantum(shade_),
585 scaleDoubleToQuantum(shade_))
589Magick::ColorGray::~ColorGray()
593void Magick::ColorGray::shade(
double shade_)
595 Quantum gray=scaleDoubleToQuantum(shade_);
601double Magick::ColorGray::shade(
void)
const
603 return(scaleQuantumToDouble(quantumGreen()));
606Magick::ColorGray& Magick::ColorGray::operator=(
const Magick::Color& color_)
608 *
static_cast<Magick::Color*
>(
this)=color_;
612Magick::ColorGray::ColorGray(PixelInfo *rep_,PixelType pixelType_)
613:
Color(rep_,pixelType_)
617Magick::ColorHSL::ColorHSL(
void)
627Magick::ColorHSL::ColorHSL(
const double hue_,
const double saturation_,
628 const double lightness_)
636 ConvertHSLToRGB(hue_,saturation_,lightness_,&red,&green,&blue);
638 quantumRed((Magick::Quantum) red);
639 quantumGreen((Magick::Quantum) green);
640 quantumBlue((Magick::Quantum) blue);
643Magick::ColorHSL::~ColorHSL()
647Magick::ColorHSL& Magick::ColorHSL::operator=(
const Magick::Color& color_)
649 *
static_cast<Magick::Color*
>(
this) = color_;
653void Magick::ColorHSL::hue(
const double hue_)
665 ConvertRGBToHSL(quantumRed(),quantumGreen(),quantumBlue(),&hue,&saturation,
670 ConvertHSLToRGB(hue,saturation,lightness,&red,&green,&blue);
672 quantumRed(ClampToQuantum(red));
673 quantumGreen(ClampToQuantum(green));
674 quantumBlue(ClampToQuantum(blue));
677double Magick::ColorHSL::hue(
void)
const
684 ConvertRGBToHSL(quantumRed(),quantumGreen(),quantumBlue(),&hue,&saturation,
690void Magick::ColorHSL::lightness (
const double lightness_)
702 ConvertRGBToHSL(quantumRed(),quantumGreen(),quantumBlue(),&hue,&saturation,
705 lightness=lightness_;
707 ConvertHSLToRGB(hue,saturation,lightness,&red,&green,&blue);
709 quantumRed(ClampToQuantum(red));
710 quantumGreen(ClampToQuantum(green));
711 quantumBlue(ClampToQuantum(blue));
714double Magick::ColorHSL::lightness (
void)
const
721 ConvertRGBToHSL(quantumRed(),quantumGreen(),quantumBlue(),&hue,&saturation,
727void Magick::ColorHSL::saturation(
const double saturation_)
739 ConvertRGBToHSL(quantumRed(),quantumGreen(),quantumBlue(),&hue,&saturation,
742 saturation=saturation_;
744 ConvertHSLToRGB(hue,saturation,lightness,&red,&green,&blue);
746 quantumRed(ClampToQuantum(red));
747 quantumGreen(ClampToQuantum(green));
748 quantumBlue(ClampToQuantum(blue));
751double Magick::ColorHSL::saturation(
void)
const
758 ConvertRGBToHSL(quantumRed(),quantumGreen(),quantumBlue(),&hue,&saturation,
764Magick::ColorMono::ColorMono(
void)
769Magick::ColorMono::ColorMono(
const bool mono_)
770 : Color((mono_ ? QuantumRange : 0),(mono_ ? QuantumRange : 0),
771 (mono_ ? QuantumRange : 0))
780Magick::ColorMono::~ColorMono()
784Magick::ColorMono& Magick::ColorMono::operator=(
const Magick::Color& color_)
786 *
static_cast<Magick::Color*
>(
this)=color_;
790void Magick::ColorMono::mono(
bool mono_)
792 quantumRed(mono_ ? QuantumRange : 0);
793 quantumGreen(mono_ ? QuantumRange : 0);
794 quantumBlue(mono_ ? QuantumRange : 0);
797bool Magick::ColorMono::mono(
void)
const
799 return(quantumGreen() == 0);
802Magick::ColorMono::ColorMono(PixelInfo *rep_,PixelType pixelType_)
803 :
Color(rep_,pixelType_)
807Magick::ColorRGB::ColorRGB(
void)
817Magick::ColorRGB::ColorRGB(
const double red_,
const double green_,
819 : Color(scaleDoubleToQuantum(red_),scaleDoubleToQuantum(green_),
820 scaleDoubleToQuantum(blue_))
824Magick::ColorRGB::ColorRGB(
const double red_,
const double green_,
825 const double blue_,
const double alpha_)
826 : Color(scaleDoubleToQuantum(red_),scaleDoubleToQuantum(green_),
827 scaleDoubleToQuantum(blue_),scaleDoubleToQuantum(alpha_))
831Magick::ColorRGB::~ColorRGB(
void)
835Magick::ColorRGB& Magick::ColorRGB::operator=(
const Magick::Color& color_)
837 *
static_cast<Magick::Color*
>(
this)=color_;
841void Magick::ColorRGB::alpha(
const double alpha_)
843 quantumAlpha(scaleDoubleToQuantum(alpha_));
846double Magick::ColorRGB::alpha(
void)
const
848 return(scaleQuantumToDouble(quantumAlpha()));
851void Magick::ColorRGB::blue(
const double blue_)
853 quantumBlue(scaleDoubleToQuantum(blue_));
856double Magick::ColorRGB::blue(
void)
const
858 return(scaleQuantumToDouble(quantumBlue()));
861void Magick::ColorRGB::green(
const double green_)
863 quantumGreen(scaleDoubleToQuantum(green_));
866double Magick::ColorRGB::green(
void)
const
868 return(scaleQuantumToDouble(quantumGreen()));
871void Magick::ColorRGB::red(
const double red_)
873 quantumRed(scaleDoubleToQuantum(red_));
876double Magick::ColorRGB::red(
void)
const
878 return(scaleQuantumToDouble(quantumRed()));
881Magick::ColorRGB::ColorRGB(PixelInfo *rep_,PixelType pixelType_)
882 :
Color(rep_,pixelType_)
886Magick::ColorYUV::ColorYUV(
void)
896Magick::ColorYUV::ColorYUV(
const double y_,
const double u_,
const double v_)
902Magick::ColorYUV::~ColorYUV(
void)
906Magick::ColorYUV& Magick::ColorYUV::operator=(
const Magick::Color &color_)
908 *
static_cast<Magick::Color*
>(
this)=color_;
912void Magick::ColorYUV::u(
const double u_)
914 convert(y(), u_, v());
917double Magick::ColorYUV::u(
void)
const
919 return(scaleQuantumToDouble((Magick::Quantum) ((-0.14740 *
920 (
double) quantumRed()) - (0.28950 * (
double) quantumGreen()) + (0.43690 *
921 (
double) quantumBlue()))));
924void Magick::ColorYUV::v(
const double v_)
926 convert(y(), u(), v_);
929double Magick::ColorYUV::v(
void)
const
931 return(scaleQuantumToDouble((Magick::Quantum) ((0.61500 *
932 (
double) quantumRed()) - (0.51500 * (
double) quantumGreen()) - (0.10000 *
933 (
double) quantumBlue()))));
936void Magick::ColorYUV::y(
const double y_)
938 convert(y_, u(), v());
941double Magick::ColorYUV::y (
void )
const
943 return(scaleQuantumToDouble((Magick::Quantum) ((0.29900 *
944 (
double) quantumRed()) + (0.58700 * (
double) quantumGreen()) + (0.11400 *
945 (
double) quantumBlue()))));
948void Magick::ColorYUV::convert(
const double y_,
const double u_,
const double v_)
950 quantumRed(scaleDoubleToQuantum(y_ + 1.13980 * v_));
951 quantumGreen(scaleDoubleToQuantum(y_ - (0.39380 * u_) - (0.58050 * v_)));
952 quantumBlue(scaleDoubleToQuantum(y_ + 2.02790 * u_));
955Magick::ColorYUV::ColorYUV(PixelInfo *rep_,PixelType pixelType_)
956 :
Color(rep_,pixelType_)