11#define MAGICKCORE_IMPLEMENTATION
12#define MAGICK_PLUSPLUS_IMPLEMENTATION 1
14#include "Magick++/Include.h"
15#include "Magick++/Color.h"
16#include "Magick++/Exception.h"
20MagickPPExport
int Magick::operator == (
const Magick::Color &left_,
23#if defined(MAGICKCORE_HDRI_SUPPORT)
24 return((left_.isValid() == right_.isValid()) &&
25 (fabs((
double) left_.quantumRed()-(
double) right_.quantumRed()) < MagickEpsilon) &&
26 (fabs((
double) left_.quantumGreen()-(
double) right_.quantumGreen()) < MagickEpsilon) &&
27 (fabs((
double) left_.quantumBlue()-(
double) right_.quantumBlue()) < MagickEpsilon));
29 return((left_.isValid() == right_.isValid()) &&
30 (left_.quantumRed() == right_.quantumRed()) &&
31 (left_.quantumGreen() == right_.quantumGreen()) &&
32 (left_.quantumBlue() == right_.quantumBlue()));
36MagickPPExport
int Magick::operator != (
const Magick::Color &left_,
39 return(!(left_ == right_));
42MagickPPExport
int Magick::operator > (
const Magick::Color &left_,
45 return(!(left_ < right_ ) && (left_ != right_ ));
48MagickPPExport
int Magick::operator < (
const Magick::Color &left_,
51 if(left_.quantumRed() < right_.quantumRed())
53 if(left_.quantumRed() > right_.quantumRed())
55 if(left_.quantumGreen() < right_.quantumGreen())
57 if(left_.quantumGreen() > right_.quantumGreen())
59 if(left_.quantumBlue() < right_.quantumBlue())
64MagickPPExport
int Magick::operator >= (
const Magick::Color &left_,
67 return((left_ > right_) || (left_ == right_));
70MagickPPExport
int Magick::operator <= (
const Magick::Color &left_,
73 return((left_ < right_) || (left_ == right_));
76Magick::Color::Color(
void)
77 : _pixel(new PixelInfo),
84 setAlpha(TransparentAlpha);
87Magick::Color::Color(
const Magick::Quantum red_,
const Magick::Quantum green_,
89 : _pixel(new PixelInfo),
96 quantumAlpha(OpaqueAlpha);
103Magick::Color::Color(
const Magick::Quantum red_,
const Magick::Quantum green_,
104 const Magick::Quantum blue_,
const Magick::Quantum alpha_)
105 : _pixel(new PixelInfo),
112 quantumAlpha(alpha_);
115 quantumGreen(green_);
117 if (alpha_ != OpaqueAlpha)
118 _pixelType=RGBAPixel;
121Magick::Color::Color(
const Magick::Quantum cyan_,
const Magick::Quantum magenta_,
122 const Magick::Quantum yellow_,
const Magick::Quantum black_,
123 const Magick::Quantum alpha_)
124 : _pixel(new PixelInfo),
127 _pixelType(CMYKPixel)
131 quantumAlpha(alpha_);
132 quantumBlack(black_);
133 quantumBlue(yellow_);
134 quantumGreen(magenta_);
136 if (alpha_ != OpaqueAlpha)
137 _pixelType=CMYKAPixel;
140Magick::Color::Color(
const char *color_)
141 : _pixel(new PixelInfo),
157 _pixel=(PixelInfo *)NULL;
163 : _pixel(new PixelInfo),
164 _isValid(color_._isValid),
166 _pixelType(color_._pixelType)
168 *_pixel=*color_._pixel;
171Magick::Color::Color(
const PixelInfo &color_)
172 : _pixel(new PixelInfo),
177 setPixelType(color_);
180Magick::Color::Color(
const std::string &color_)
181 : _pixel(new PixelInfo),
197 _pixel=(PixelInfo *)NULL;
202Magick::Color::~Color(
void)
207 _pixel=(PixelInfo *)NULL;
210Magick::Color& Magick::Color::operator=(
const Magick::Color& color_)
216 *_pixel=*color_._pixel;
219 _isValid=color_._isValid;
222 _pixelType=color_._pixelType;
227const Magick::Color& Magick::Color::operator=(
const char *color_)
229 *
this=std::string(color_);
233const Magick::Color& Magick::Color::operator=(
const MagickCore::PixelInfo &color_)
236 setPixelType(color_);
241const Magick::Color& Magick::Color::operator=(
const std::string &color_)
248 if (QueryColorCompliance(color_.c_str(),AllCompliance,&target_color,
251 quantumAlpha((Magick::Quantum ) target_color.alpha);
252 quantumBlack((Magick::Quantum ) target_color.black);
253 quantumBlue((Magick::Quantum ) target_color.blue);
254 quantumGreen((Magick::Quantum ) target_color.green);
255 quantumRed((Magick::Quantum ) target_color.red);
257 setPixelType(target_color);
264 _pixel = (PixelInfo *)NULL;
266 ThrowPPException(
true);
271Magick::Color::operator MagickCore::PixelInfo()
const
276Magick::Color::operator std::string()
const
279 colorbuf[MagickPathExtent];
285 return std::string(
"none");
287 pixel.colorspace=(_pixelType == RGBPixel || _pixelType == RGBAPixel) ?
288 sRGBColorspace : CMYKColorspace;
289 pixel.depth=MAGICKCORE_QUANTUM_DEPTH;
290 pixel.alpha=_pixel->alpha;
291 pixel.alpha_trait=_pixel->alpha_trait;
292 pixel.black=_pixel->black;
293 pixel.blue=_pixel->blue;
294 pixel.green=_pixel->green;
295 pixel.red=_pixel->red;
296 GetColorTuple(&pixel,MagickTrue,colorbuf);
298 return(std::string(colorbuf));
301bool Magick::Color::isFuzzyEquivalent(
const Color &color_,
const double fuzz_)
const
311 return (IsFuzzyEquivalencePixelInfo(&p, &q) != MagickFalse);
314bool Magick::Color::isValid(
void)
const
319Magick::Color::PixelType Magick::Color::pixelType()
const
324void Magick::Color::isValid(
bool valid_)
326 if (
bool(valid_) ==
bool(isValid()))
331 _pixel=
new PixelInfo;
340void Magick::Color::quantumAlpha(
const Magick::Quantum alpha_)
346Magick::Quantum Magick::Color::quantumAlpha(
void)
const
348 return((Magick::Quantum) _pixel->alpha);
351void Magick::Color::quantumBlack(
const Magick::Quantum black_)
353 _pixel->black=black_;
357Magick::Quantum Magick::Color::quantumBlack(
void)
const
359 return((Magick::Quantum) _pixel->black);
362void Magick::Color::quantumBlue(
const Magick::Quantum blue_)
368Magick::Quantum Magick::Color::quantumBlue(
void)
const
370 return((Magick::Quantum) _pixel->blue);
373void Magick::Color::quantumGreen(
const Magick::Quantum green_)
375 _pixel->green=green_;
379Magick::Quantum Magick::Color::quantumGreen(
void)
const
381 return((Magick::Quantum) _pixel->green);
384void Magick::Color::quantumRed(
const Magick::Quantum red_)
390Magick::Quantum Magick::Color::quantumRed(
void)
const
392 return((Magick::Quantum) _pixel->red);
395Magick::Color::Color(PixelType pixelType_)
396 : _pixel(new PixelInfo),
399 _pixelType(pixelType_)
404Magick::Color::Color(PixelInfo* rep_,PixelType pixelType_)
408 _pixelType(pixelType_)
412void Magick::Color::pixel(PixelInfo *rep_,PixelType pixelType_)
420 _pixelType=pixelType_;
423Magick::Quantum Magick::Color::scaleDoubleToQuantum(
const double double_)
425 return(
static_cast<Magick::Quantum
>(double_*(
double) QuantumRange));
428double Magick::Color::scaleQuantumToDouble(
const Magick::Quantum quantum_)
430#if (MAGICKCORE_QUANTUM_DEPTH < 32) && (MAGICKCORE_SIZEOF_FLOAT_T != MAGICKCORE_SIZEOF_DOUBLE || !defined(MAGICKCORE_HDRI_SUPPORT))
431 return(
static_cast<double>(QuantumScale*(
double) quantum_));
433 return(QuantumScale*quantum_);
437void Magick::Color::initPixel()
439 MagickCore::GetPixelInfo((MagickCore::Image *) NULL, _pixel);
440 if (_pixelType == CMYKPixel || _pixelType == CMYKAPixel)
441 _pixel->colorspace=CMYKColorspace;
444void Magick::Color::setAlpha(
const Magick::Quantum alpha_)
446 _pixel->alpha=alpha_;
447 if (alpha_ == OpaqueAlpha)
449 _pixel->alpha_trait=UndefinedPixelTrait;
450 if (_pixelType == RGBAPixel)
452 else if (_pixelType == CMYKAPixel)
453 _pixelType=CMYKPixel;
457 _pixel->alpha_trait=BlendPixelTrait;
458 if (_pixelType == RGBPixel)
459 _pixelType=RGBAPixel;
460 else if (_pixelType == CMYKPixel)
461 _pixelType=CMYKAPixel;
465void Magick::Color::setPixelType(
const PixelInfo &color_)
467 if (color_.colorspace == CMYKColorspace)
468 _pixelType=color_.alpha_trait != UndefinedPixelTrait ? CMYKAPixel :
471 _pixelType=color_.alpha_trait != UndefinedPixelTrait ? RGBAPixel :
475Magick::ColorCMYK::ColorCMYK(
void)
485Magick::ColorCMYK::ColorCMYK(
const double cyan_,
const double magenta_,
486 const double yellow_,
const double black_)
495Magick::ColorCMYK::ColorCMYK(
const double cyan_,
const double magenta_,
496 const double yellow_,
const double black_,
const double alpha_)
506Magick::ColorCMYK::~ColorCMYK(
void)
510Magick::ColorCMYK& Magick::ColorCMYK::operator=(
const Magick::Color& color_)
512 *
static_cast<Magick::Color*
>(
this)=color_;
516void Magick::ColorCMYK::alpha(
const double alpha_)
518 quantumAlpha(scaleDoubleToQuantum(alpha_));
521double Magick::ColorCMYK::alpha(
void)
const
523 return(scaleQuantumToDouble(quantumAlpha()));
526void Magick::ColorCMYK::black(
const double black_)
528 quantumBlack(scaleDoubleToQuantum(black_));
531double Magick::ColorCMYK::black(
void)
const
533 return(scaleQuantumToDouble(quantumBlack()));
536void Magick::ColorCMYK::cyan(
const double cyan_)
538 quantumRed(scaleDoubleToQuantum(cyan_));
541double Magick::ColorCMYK::cyan(
void)
const
543 return(scaleQuantumToDouble(quantumRed()));
546void Magick::ColorCMYK::magenta(
const double magenta_)
548 quantumGreen(scaleDoubleToQuantum(magenta_));
551double Magick::ColorCMYK::magenta(
void)
const
553 return(scaleQuantumToDouble(quantumGreen()));
556void Magick::ColorCMYK::yellow(
const double yellow_)
558 quantumBlue(scaleDoubleToQuantum(yellow_));
561double Magick::ColorCMYK::yellow(
void)
const
563 return(scaleQuantumToDouble(quantumBlue()));
566Magick::ColorCMYK::ColorCMYK(PixelInfo *rep_,PixelType pixelType_)
567 :
Color(rep_,pixelType_)
571Magick::ColorGray::ColorGray(
void)
581Magick::ColorGray::ColorGray(
double shade_)
582 : Color(scaleDoubleToQuantum(shade_),scaleDoubleToQuantum(shade_),
583 scaleDoubleToQuantum(shade_))
587Magick::ColorGray::~ColorGray()
591void Magick::ColorGray::shade(
double shade_)
593 Quantum gray=scaleDoubleToQuantum(shade_);
599double Magick::ColorGray::shade(
void)
const
601 return(scaleQuantumToDouble(quantumGreen()));
604Magick::ColorGray& Magick::ColorGray::operator=(
const Magick::Color& color_)
606 *
static_cast<Magick::Color*
>(
this)=color_;
610Magick::ColorGray::ColorGray(PixelInfo *rep_,PixelType pixelType_)
611:
Color(rep_,pixelType_)
615Magick::ColorHSL::ColorHSL(
void)
625Magick::ColorHSL::ColorHSL(
const double hue_,
const double saturation_,
626 const double lightness_)
634 ConvertHSLToRGB(hue_,saturation_,lightness_,&red,&green,&blue);
636 quantumRed((Magick::Quantum) red);
637 quantumGreen((Magick::Quantum) green);
638 quantumBlue((Magick::Quantum) blue);
641Magick::ColorHSL::~ColorHSL()
645Magick::ColorHSL& Magick::ColorHSL::operator=(
const Magick::Color& color_)
647 *
static_cast<Magick::Color*
>(
this) = color_;
651void Magick::ColorHSL::hue(
const double hue_)
663 ConvertRGBToHSL(quantumRed(),quantumGreen(),quantumBlue(),&hue,&saturation,
668 ConvertHSLToRGB(hue,saturation,lightness,&red,&green,&blue);
670 quantumRed(ClampToQuantum(red));
671 quantumGreen(ClampToQuantum(green));
672 quantumBlue(ClampToQuantum(blue));
675double Magick::ColorHSL::hue(
void)
const
682 ConvertRGBToHSL(quantumRed(),quantumGreen(),quantumBlue(),&hue,&saturation,
688void Magick::ColorHSL::lightness (
const double lightness_)
700 ConvertRGBToHSL(quantumRed(),quantumGreen(),quantumBlue(),&hue,&saturation,
703 lightness=lightness_;
705 ConvertHSLToRGB(hue,saturation,lightness,&red,&green,&blue);
707 quantumRed(ClampToQuantum(red));
708 quantumGreen(ClampToQuantum(green));
709 quantumBlue(ClampToQuantum(blue));
712double Magick::ColorHSL::lightness (
void)
const
719 ConvertRGBToHSL(quantumRed(),quantumGreen(),quantumBlue(),&hue,&saturation,
725void Magick::ColorHSL::saturation(
const double saturation_)
737 ConvertRGBToHSL(quantumRed(),quantumGreen(),quantumBlue(),&hue,&saturation,
740 saturation=saturation_;
742 ConvertHSLToRGB(hue,saturation,lightness,&red,&green,&blue);
744 quantumRed(ClampToQuantum(red));
745 quantumGreen(ClampToQuantum(green));
746 quantumBlue(ClampToQuantum(blue));
749double Magick::ColorHSL::saturation(
void)
const
756 ConvertRGBToHSL(quantumRed(),quantumGreen(),quantumBlue(),&hue,&saturation,
762Magick::ColorMono::ColorMono(
void)
767Magick::ColorMono::ColorMono(
const bool mono_)
768 : Color((mono_ ? QuantumRange : 0),(mono_ ? QuantumRange : 0),
769 (mono_ ? QuantumRange : 0))
778Magick::ColorMono::~ColorMono()
782Magick::ColorMono& Magick::ColorMono::operator=(
const Magick::Color& color_)
784 *
static_cast<Magick::Color*
>(
this)=color_;
788void Magick::ColorMono::mono(
bool mono_)
790 quantumRed(mono_ ? QuantumRange : 0);
791 quantumGreen(mono_ ? QuantumRange : 0);
792 quantumBlue(mono_ ? QuantumRange : 0);
795bool Magick::ColorMono::mono(
void)
const
797 return(quantumGreen() == 0);
800Magick::ColorMono::ColorMono(PixelInfo *rep_,PixelType pixelType_)
801 :
Color(rep_,pixelType_)
805Magick::ColorRGB::ColorRGB(
void)
815Magick::ColorRGB::ColorRGB(
const double red_,
const double green_,
817 : Color(scaleDoubleToQuantum(red_),scaleDoubleToQuantum(green_),
818 scaleDoubleToQuantum(blue_))
822Magick::ColorRGB::ColorRGB(
const double red_,
const double green_,
823 const double blue_,
const double alpha_)
824 : Color(scaleDoubleToQuantum(red_),scaleDoubleToQuantum(green_),
825 scaleDoubleToQuantum(blue_),scaleDoubleToQuantum(alpha_))
829Magick::ColorRGB::~ColorRGB(
void)
833Magick::ColorRGB& Magick::ColorRGB::operator=(
const Magick::Color& color_)
835 *
static_cast<Magick::Color*
>(
this)=color_;
839void Magick::ColorRGB::alpha(
const double alpha_)
841 quantumAlpha(scaleDoubleToQuantum(alpha_));
844double Magick::ColorRGB::alpha(
void)
const
846 return(scaleQuantumToDouble(quantumAlpha()));
849void Magick::ColorRGB::blue(
const double blue_)
851 quantumBlue(scaleDoubleToQuantum(blue_));
854double Magick::ColorRGB::blue(
void)
const
856 return(scaleQuantumToDouble(quantumBlue()));
859void Magick::ColorRGB::green(
const double green_)
861 quantumGreen(scaleDoubleToQuantum(green_));
864double Magick::ColorRGB::green(
void)
const
866 return(scaleQuantumToDouble(quantumGreen()));
869void Magick::ColorRGB::red(
const double red_)
871 quantumRed(scaleDoubleToQuantum(red_));
874double Magick::ColorRGB::red(
void)
const
876 return(scaleQuantumToDouble(quantumRed()));
879Magick::ColorRGB::ColorRGB(PixelInfo *rep_,PixelType pixelType_)
880 :
Color(rep_,pixelType_)
884Magick::ColorYUV::ColorYUV(
void)
894Magick::ColorYUV::ColorYUV(
const double y_,
const double u_,
const double v_)
900Magick::ColorYUV::~ColorYUV(
void)
904Magick::ColorYUV& Magick::ColorYUV::operator=(
const Magick::Color &color_)
906 *
static_cast<Magick::Color*
>(
this)=color_;
910void Magick::ColorYUV::u(
const double u_)
912 convert(y(), u_, v());
915double Magick::ColorYUV::u(
void)
const
917 return(scaleQuantumToDouble((Magick::Quantum) ((-0.14740 *
918 (
double) quantumRed()) - (0.28950 * (
double) quantumGreen()) + (0.43690 *
919 (
double) quantumBlue()))));
922void Magick::ColorYUV::v(
const double v_)
924 convert(y(), u(), v_);
927double Magick::ColorYUV::v(
void)
const
929 return(scaleQuantumToDouble((Magick::Quantum) ((0.61500 *
930 (
double) quantumRed()) - (0.51500 * (
double) quantumGreen()) - (0.10000 *
931 (
double) quantumBlue()))));
934void Magick::ColorYUV::y(
const double y_)
936 convert(y_, u(), v());
939double Magick::ColorYUV::y (
void )
const
941 return(scaleQuantumToDouble((Magick::Quantum) ((0.29900 *
942 (
double) quantumRed()) + (0.58700 * (
double) quantumGreen()) + (0.11400 *
943 (
double) quantumBlue()))));
946void Magick::ColorYUV::convert(
const double y_,
const double u_,
const double v_)
948 quantumRed(scaleDoubleToQuantum(y_ + 1.13980 * v_));
949 quantumGreen(scaleDoubleToQuantum(y_ - (0.39380 * u_) - (0.58050 * v_)));
950 quantumBlue(scaleDoubleToQuantum(y_ + 2.02790 * u_));
953Magick::ColorYUV::ColorYUV(PixelInfo *rep_,PixelType pixelType_)
954 :
Color(rep_,pixelType_)