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),
155 : _pixel(new PixelInfo),
156 _isValid(color_._isValid),
158 _pixelType(color_._pixelType)
160 *_pixel=*color_._pixel;
163Magick::Color::Color(
const PixelInfo &color_)
164 : _pixel(new PixelInfo),
169 setPixelType(color_);
172Magick::Color::Color(
const std::string &color_)
173 : _pixel(new PixelInfo),
184Magick::Color::~Color(
void)
189 _pixel=(PixelInfo *)NULL;
198 *_pixel=*color_._pixel;
201 _isValid=color_._isValid;
204 _pixelType=color_._pixelType;
209const Magick::Color& Magick::Color::operator=(
const char *color_)
211 *
this=std::string(color_);
215const Magick::Color& Magick::Color::operator=(
const MagickCore::PixelInfo &color_)
218 setPixelType(color_);
223const Magick::Color& Magick::Color::operator=(
const std::string &color_)
230 if (QueryColorCompliance(color_.c_str(),AllCompliance,&target_color,
233 quantumAlpha(target_color.alpha);
234 quantumBlack(target_color.black);
235 quantumBlue(target_color.blue);
236 quantumGreen(target_color.green);
237 quantumRed(target_color.red);
239 setPixelType(target_color);
246 _pixel = (PixelInfo *)NULL;
248 ThrowPPException(
false);
253Magick::Color::operator MagickCore::PixelInfo()
const
258Magick::Color::operator std::string()
const
261 colorbuf[MagickPathExtent];
267 return std::string(
"none");
269 pixel.colorspace=(_pixelType == RGBPixel || _pixelType == RGBAPixel) ?
270 sRGBColorspace : CMYKColorspace;
271 pixel.depth=MAGICKCORE_QUANTUM_DEPTH;
272 pixel.alpha=_pixel->alpha;
273 pixel.alpha_trait=_pixel->alpha_trait;
274 pixel.black=_pixel->black;
275 pixel.blue=_pixel->blue;
276 pixel.green=_pixel->green;
277 pixel.red=_pixel->red;
278 GetColorTuple(&pixel,MagickTrue,colorbuf);
280 return(std::string(colorbuf));
283bool Magick::Color::isFuzzyEquivalent(
const Color &color_,
const double fuzz_)
const
293 return (IsFuzzyEquivalencePixelInfo(&p, &q) != MagickFalse);
296bool Magick::Color::isValid(
void)
const
301Magick::Color::PixelType Magick::Color::pixelType()
const
306void Magick::Color::isValid(
bool valid_)
308 if (
bool(valid_) ==
bool(isValid()))
313 _pixel=
new PixelInfo;
322void Magick::Color::quantumAlpha(
const Magick::Quantum alpha_)
328Magick::Quantum Magick::Color::quantumAlpha(
void)
const
330 return(_pixel->alpha);
333void Magick::Color::quantumBlack(
const Magick::Quantum black_)
335 _pixel->black=black_;
339Magick::Quantum Magick::Color::quantumBlack(
void)
const
341 return(_pixel->black);
344void Magick::Color::quantumBlue(
const Magick::Quantum blue_)
350Magick::Quantum Magick::Color::quantumBlue(
void)
const
352 return(_pixel->blue);
355void Magick::Color::quantumGreen(
const Magick::Quantum green_)
357 _pixel->green=green_;
361Magick::Quantum Magick::Color::quantumGreen(
void)
const
363 return(_pixel->green);
366void Magick::Color::quantumRed(
const Magick::Quantum red_)
372Magick::Quantum Magick::Color::quantumRed(
void)
const
377Magick::Color::Color(PixelType pixelType_)
378 : _pixel(new PixelInfo),
381 _pixelType(pixelType_)
386Magick::Color::Color(PixelInfo* rep_,PixelType pixelType_)
390 _pixelType(pixelType_)
394void Magick::Color::pixel(PixelInfo *rep_,PixelType pixelType_)
402 _pixelType=pixelType_;
405Magick::Quantum Magick::Color::scaleDoubleToQuantum(
const double double_)
407 return(
static_cast<Magick::Quantum
>(double_*(
double) QuantumRange));
410double Magick::Color::scaleQuantumToDouble(
const Magick::Quantum quantum_)
412#if (MAGICKCORE_QUANTUM_DEPTH < 32) && (MAGICKCORE_SIZEOF_FLOAT_T != MAGICKCORE_SIZEOF_DOUBLE || !defined(MAGICKCORE_HDRI_SUPPORT))
413 return(
static_cast<double>(QuantumScale*(
double) quantum_));
415 return(QuantumScale*quantum_);
419void Magick::Color::initPixel()
421 MagickCore::GetPixelInfo((MagickCore::Image *) NULL, _pixel);
422 if (_pixelType == CMYKPixel || _pixelType == CMYKAPixel)
423 _pixel->colorspace=CMYKColorspace;
426void Magick::Color::setAlpha(
const Magick::Quantum alpha_)
428 _pixel->alpha=alpha_;
429 if (alpha_ == OpaqueAlpha)
431 _pixel->alpha_trait=UndefinedPixelTrait;
432 if (_pixelType == RGBAPixel)
434 else if (_pixelType == CMYKAPixel)
435 _pixelType=CMYKPixel;
439 _pixel->alpha_trait=BlendPixelTrait;
440 if (_pixelType == RGBPixel)
441 _pixelType=RGBAPixel;
442 else if (_pixelType == CMYKPixel)
443 _pixelType=CMYKAPixel;
447void Magick::Color::setPixelType(
const PixelInfo &color_)
449 if (color_.colorspace == CMYKColorspace)
450 _pixelType=color_.alpha_trait != UndefinedPixelTrait ? CMYKAPixel :
453 _pixelType=color_.alpha_trait != UndefinedPixelTrait ? RGBAPixel :
457Magick::ColorCMYK::ColorCMYK(
void)
467Magick::ColorCMYK::ColorCMYK(
const double cyan_,
const double magenta_,
468 const double yellow_,
const double black_)
477Magick::ColorCMYK::ColorCMYK(
const double cyan_,
const double magenta_,
478 const double yellow_,
const double black_,
const double alpha_)
488Magick::ColorCMYK::~ColorCMYK(
void)
498void Magick::ColorCMYK::alpha(
const double alpha_)
500 quantumAlpha(scaleDoubleToQuantum(alpha_));
503double Magick::ColorCMYK::alpha(
void)
const
505 return(scaleQuantumToDouble(quantumAlpha()));
508void Magick::ColorCMYK::black(
const double black_)
510 quantumBlack(scaleDoubleToQuantum(black_));
513double Magick::ColorCMYK::black(
void)
const
515 return(scaleQuantumToDouble(quantumBlack()));
518void Magick::ColorCMYK::cyan(
const double cyan_)
520 quantumRed(scaleDoubleToQuantum(cyan_));
523double Magick::ColorCMYK::cyan(
void)
const
525 return(scaleQuantumToDouble(quantumRed()));
528void Magick::ColorCMYK::magenta(
const double magenta_)
530 quantumGreen(scaleDoubleToQuantum(magenta_));
533double Magick::ColorCMYK::magenta(
void)
const
535 return(scaleQuantumToDouble(quantumGreen()));
538void Magick::ColorCMYK::yellow(
const double yellow_)
540 quantumBlue(scaleDoubleToQuantum(yellow_));
543double Magick::ColorCMYK::yellow(
void)
const
545 return(scaleQuantumToDouble(quantumBlue()));
548Magick::ColorCMYK::ColorCMYK(PixelInfo *rep_,PixelType pixelType_)
549 : Color(rep_,pixelType_)
553Magick::ColorGray::ColorGray(
void)
563Magick::ColorGray::ColorGray(
double shade_)
564 : Color(scaleDoubleToQuantum(shade_),scaleDoubleToQuantum(shade_),
565 scaleDoubleToQuantum(shade_))
569Magick::ColorGray::~ColorGray()
573void Magick::ColorGray::shade(
double shade_)
575 Quantum gray=scaleDoubleToQuantum(shade_);
581double Magick::ColorGray::shade(
void)
const
583 return(scaleQuantumToDouble(quantumGreen()));
592Magick::ColorGray::ColorGray(PixelInfo *rep_,PixelType pixelType_)
593: Color(rep_,pixelType_)
597Magick::ColorHSL::ColorHSL(
void)
607Magick::ColorHSL::ColorHSL(
const double hue_,
const double saturation_,
608 const double lightness_)
616 ConvertHSLToRGB(hue_,saturation_,lightness_,&red,&green,&blue);
623Magick::ColorHSL::~ColorHSL()
633void Magick::ColorHSL::hue(
const double hue_)
645 ConvertRGBToHSL(quantumRed(),quantumGreen(),quantumBlue(),&hue,&saturation,
650 ConvertHSLToRGB(hue,saturation,lightness,&red,&green,&blue);
652 quantumRed(ClampToQuantum(red));
653 quantumGreen(ClampToQuantum(green));
654 quantumBlue(ClampToQuantum(blue));
657double Magick::ColorHSL::hue(
void)
const
664 ConvertRGBToHSL(quantumRed(),quantumGreen(),quantumBlue(),&hue,&saturation,
670void Magick::ColorHSL::lightness (
const double lightness_)
682 ConvertRGBToHSL(quantumRed(),quantumGreen(),quantumBlue(),&hue,&saturation,
685 lightness=lightness_;
687 ConvertHSLToRGB(hue,saturation,lightness,&red,&green,&blue);
689 quantumRed(ClampToQuantum(red));
690 quantumGreen(ClampToQuantum(green));
691 quantumBlue(ClampToQuantum(blue));
694double Magick::ColorHSL::lightness (
void)
const
701 ConvertRGBToHSL(quantumRed(),quantumGreen(),quantumBlue(),&hue,&saturation,
707void Magick::ColorHSL::saturation(
const double saturation_)
719 ConvertRGBToHSL(quantumRed(),quantumGreen(),quantumBlue(),&hue,&saturation,
722 saturation=saturation_;
724 ConvertHSLToRGB(hue,saturation,lightness,&red,&green,&blue);
726 quantumRed(ClampToQuantum(red));
727 quantumGreen(ClampToQuantum(green));
728 quantumBlue(ClampToQuantum(blue));
731double Magick::ColorHSL::saturation(
void)
const
738 ConvertRGBToHSL(quantumRed(),quantumGreen(),quantumBlue(),&hue,&saturation,
744Magick::ColorMono::ColorMono(
void)
749Magick::ColorMono::ColorMono(
const bool mono_)
750 : Color((mono_ ? QuantumRange : 0),(mono_ ? QuantumRange : 0),
751 (mono_ ? QuantumRange : 0))
760Magick::ColorMono::~ColorMono()
770void Magick::ColorMono::mono(
bool mono_)
772 quantumRed(mono_ ? QuantumRange : 0);
773 quantumGreen(mono_ ? QuantumRange : 0);
774 quantumBlue(mono_ ? QuantumRange : 0);
777bool Magick::ColorMono::mono(
void)
const
779 return(quantumGreen() == 0);
782Magick::ColorMono::ColorMono(PixelInfo *rep_,PixelType pixelType_)
783 : Color(rep_,pixelType_)
787Magick::ColorRGB::ColorRGB(
void)
797Magick::ColorRGB::ColorRGB(
const double red_,
const double green_,
799 : Color(scaleDoubleToQuantum(red_),scaleDoubleToQuantum(green_),
800 scaleDoubleToQuantum(blue_))
804Magick::ColorRGB::ColorRGB(
const double red_,
const double green_,
805 const double blue_,
const double alpha_)
806 : Color(scaleDoubleToQuantum(red_),scaleDoubleToQuantum(green_),
807 scaleDoubleToQuantum(blue_),scaleDoubleToQuantum(alpha_))
811Magick::ColorRGB::~ColorRGB(
void)
821void Magick::ColorRGB::alpha(
const double alpha_)
823 quantumAlpha(scaleDoubleToQuantum(alpha_));
826double Magick::ColorRGB::alpha(
void)
const
828 return(scaleQuantumToDouble(quantumAlpha()));
831void Magick::ColorRGB::blue(
const double blue_)
833 quantumBlue(scaleDoubleToQuantum(blue_));
836double Magick::ColorRGB::blue(
void)
const
838 return(scaleQuantumToDouble(quantumBlue()));
841void Magick::ColorRGB::green(
const double green_)
843 quantumGreen(scaleDoubleToQuantum(green_));
846double Magick::ColorRGB::green(
void)
const
848 return(scaleQuantumToDouble(quantumGreen()));
851void Magick::ColorRGB::red(
const double red_)
853 quantumRed(scaleDoubleToQuantum(red_));
856double Magick::ColorRGB::red(
void)
const
858 return(scaleQuantumToDouble(quantumRed()));
861Magick::ColorRGB::ColorRGB(PixelInfo *rep_,PixelType pixelType_)
862 : Color(rep_,pixelType_)
866Magick::ColorYUV::ColorYUV(
void)
876Magick::ColorYUV::ColorYUV(
const double y_,
const double u_,
const double v_)
882Magick::ColorYUV::~ColorYUV(
void)
892void Magick::ColorYUV::u(
const double u_)
894 convert(y(), u_, v());
897double Magick::ColorYUV::u(
void)
const
899 return(scaleQuantumToDouble((-0.14740 * (
double) quantumRed()) - (0.28950 *
900 (
double) quantumGreen()) + (0.43690 * (
double) quantumBlue())));
903void Magick::ColorYUV::v(
const double v_)
905 convert(y(), u(), v_);
908double Magick::ColorYUV::v(
void)
const
910 return(scaleQuantumToDouble((0.61500 * (
double) quantumRed()) - (0.51500 *
911 (
double) quantumGreen()) - (0.10000 * (
double) quantumBlue())));
914void Magick::ColorYUV::y(
const double y_)
916 convert(y_, u(), v());
919double Magick::ColorYUV::y (
void )
const
921 return(scaleQuantumToDouble((0.29900 * (
double) quantumRed()) + (0.58700 *
922 (
double) quantumGreen()) + (0.11400 * (
double) quantumBlue())));
925void Magick::ColorYUV::convert(
const double y_,
const double u_,
const double v_)
927 quantumRed(scaleDoubleToQuantum(y_ + 1.13980 * v_));
928 quantumGreen(scaleDoubleToQuantum(y_ - (0.39380 * u_) - (0.58050 * v_)));
929 quantumBlue(scaleDoubleToQuantum(y_ + 2.02790 * u_));
932Magick::ColorYUV::ColorYUV(PixelInfo *rep_,PixelType pixelType_)
933 : Color(rep_,pixelType_)