9#define MAGICKCORE_IMPLEMENTATION
10#define MAGICK_PLUSPLUS_IMPLEMENTATION 1
12#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(left_.redQuantum()-right_.redQuantum()) < MagickEpsilon) &&
26 (fabs(left_.greenQuantum()-right_.greenQuantum()) < MagickEpsilon) &&
27 (fabs(left_.blueQuantum()-right_.blueQuantum()) < MagickEpsilon));
29 return((left_.isValid() == right_.isValid()) &&
30 (left_.redQuantum() == right_.redQuantum()) &&
31 (left_.greenQuantum() == right_.greenQuantum()) &&
32 (left_.blueQuantum() == right_.blueQuantum()));
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_.redQuantum() < right_.redQuantum())
53 if(left_.redQuantum() > right_.redQuantum())
55 if(left_.greenQuantum() < right_.greenQuantum())
57 if(left_.greenQuantum() > right_.greenQuantum())
59 if(left_.blueQuantum() < right_.blueQuantum())
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 PixelPacket),
84 _pixel->opacity=TransparentOpacity;
87Magick::Color::Color(Magick::Quantum red_,Magick::Quantum green_,
88 Magick::Quantum blue_)
89 : _pixel(new PixelPacket),
97 alphaQuantum(OpaqueOpacity);
100Magick::Color::Color(Magick::Quantum red_,Magick::Quantum green_,
101 Magick::Quantum blue_,Magick::Quantum alpha_)
102 : _pixel(new PixelPacket),
105 _pixelType(RGBAPixel)
108 greenQuantum(green_);
110 alphaQuantum(alpha_);
113Magick::Color::Color(
const char *x11color_)
114 : _pixel(new PixelPacket),
126 : _pixel(new PixelPacket),
127 _isValid(color_._isValid),
129 _pixelType(color_._pixelType)
131 *_pixel=*color_._pixel;
134Magick::Color::Color(
const PixelPacket &color_)
135 : _pixel(new PixelPacket),
142 if (color_.opacity != OpaqueOpacity)
143 _pixelType=RGBAPixel;
146Magick::Color::Color(
const std::string &x11color_)
147 : _pixel(new PixelPacket),
158Magick::Color::~Color(
void)
163 _pixel=(PixelPacket *)NULL;
166const Magick::Color& Magick::Color::operator=(
const char *x11color_)
168 *
this=std::string(x11color_);
172Magick::Color& Magick::Color::operator=(
const Magick::Color& color_)
178 *_pixel=*color_._pixel;
181 _isValid=color_._isValid;
184 _pixelType=color_._pixelType;
189const Magick::Color& Magick::Color::operator=
190 (
const MagickCore::PixelPacket &color_)
193 if (color_.opacity != OpaqueOpacity)
194 _pixelType=RGBAPixel;
202const Magick::Color& Magick::Color::operator=(
const std::string &x11color_)
209 if (QueryColorDatabase(x11color_.c_str(),&target_color,exceptionInfo))
211 redQuantum( target_color.red );
212 greenQuantum( target_color.green );
213 blueQuantum( target_color.blue );
214 alphaQuantum( target_color.opacity );
216 if (target_color.opacity > OpaqueOpacity)
217 _pixelType=RGBAPixel;
226 _pixel = (PixelPacket *)NULL;
228 ThrowPPException(
false);
233Magick::Color::operator std::string()
const
236 colorbuf[MaxTextExtent];
242 return std::string(
"none");
244 pixel.colorspace=sRGBColorspace;
245 pixel.matte=_pixelType == RGBAPixel ? MagickTrue : MagickFalse;
246 pixel.depth=MAGICKCORE_QUANTUM_DEPTH;
247 pixel.red=_pixel->red;
248 pixel.green=_pixel->green;
249 pixel.blue=_pixel->blue;
250 pixel.opacity=_pixel->opacity;
251 GetColorTuple(&pixel,MagickTrue,colorbuf);
253 return(std::string(colorbuf));
256bool Magick::Color::isValid(
void)
const
261void Magick::Color::isValid(
bool valid_)
263 if (
bool(valid_) ==
bool(isValid()))
268 _pixel=
new PixelPacket;
277Magick::Color::Color(PixelPacket *rep_,PixelType pixelType_)
281 _pixelType(pixelType_)
285void Magick::Color::pixel(PixelPacket *rep_,PixelType pixelType_)
293 _pixelType=pixelType_;
296Magick::ColorGray::ColorGray(
void)
306Magick::ColorGray::ColorGray(
double shade_)
307 : Color(scaleDoubleToQuantum(shade_),scaleDoubleToQuantum(shade_),
308 scaleDoubleToQuantum(shade_))
310 alphaQuantum(OpaqueOpacity);
313Magick::ColorGray::~ColorGray()
317void Magick::ColorGray::shade(
double shade_)
319 Quantum gray=scaleDoubleToQuantum(shade_);
325double Magick::ColorGray::shade(
void)
const
327 return(scaleQuantumToDouble(greenQuantum()));
330Magick::ColorGray& Magick::ColorGray::operator = (
const Magick::Color& color_ )
332 *
static_cast<Magick::Color*
>(
this)=color_;
336Magick::ColorHSL::ColorHSL(
void)
346Magick::ColorHSL::ColorHSL(
double hue_,
double saturation_,
double luminosity_)
354 ConvertHSLToRGB(hue_,saturation_,luminosity_,&red,&green,&blue);
359 alphaQuantum(OpaqueOpacity);
362Magick::ColorHSL::~ColorHSL()
366Magick::ColorHSL& Magick::ColorHSL::operator=(
const Magick::Color &color_)
368 *
static_cast<Magick::Color*
>(
this)=color_;
372void Magick::ColorHSL::hue(
double hue_)
384 ConvertRGBToHSL(redQuantum(),greenQuantum(),blueQuantum(),&hue,&saturation,
389 ConvertHSLToRGB(hue,saturation,luminosity,&red,&green,&blue);
396double Magick::ColorHSL::hue(
void)
const
403 ConvertRGBToHSL(redQuantum(),greenQuantum(),blueQuantum(),&hue,&saturation,
409void Magick::ColorHSL::luminosity(
double luminosity_)
421 ConvertRGBToHSL(redQuantum(),greenQuantum(),blueQuantum(),&hue,&saturation,
424 luminosity=luminosity_;
426 ConvertHSLToRGB(hue,saturation,luminosity,&red,&green,&blue);
433double Magick::ColorHSL::luminosity(
void)
const
440 ConvertRGBToHSL(redQuantum(),greenQuantum(),blueQuantum(),&hue,&saturation,
446void Magick::ColorHSL::saturation(
double saturation_)
458 ConvertRGBToHSL(redQuantum(),greenQuantum(),blueQuantum(),&hue,&saturation,
461 saturation=saturation_;
463 ConvertHSLToRGB(hue,saturation,luminosity,&red,&green,&blue);
470double Magick::ColorHSL::saturation(
void)
const
477 ConvertRGBToHSL(redQuantum(),greenQuantum(),blueQuantum(),&hue,&saturation,
483Magick::ColorMono::ColorMono(
void)
488Magick::ColorMono::ColorMono(
bool mono_)
489 : Color((mono_ ? QuantumRange : 0),
490 (mono_ ? QuantumRange : 0),
491 (mono_ ? QuantumRange : 0))
493 alphaQuantum(OpaqueOpacity);
501Magick::ColorMono::~ColorMono()
505Magick::ColorMono& Magick::ColorMono::operator=(
const Magick::Color &color_)
507 *
static_cast<Magick::Color*
>(
this)=color_;
511void Magick::ColorMono::mono(
bool mono_)
513 redQuantum(mono_ ? QuantumRange : 0);
514 greenQuantum(mono_ ? QuantumRange : 0);
515 blueQuantum(mono_ ? QuantumRange : 0);
518bool Magick::ColorMono::mono(
void)
const
520 return(greenQuantum() == 0);
523Magick::ColorRGB::ColorRGB(
void)
533Magick::ColorRGB::ColorRGB(
double red_,
double green_,
double blue_)
534 : Color(scaleDoubleToQuantum(red_),scaleDoubleToQuantum(green_),
535 scaleDoubleToQuantum(blue_))
537 alphaQuantum(OpaqueOpacity);
540Magick::ColorRGB::~ColorRGB(
void)
544Magick::ColorRGB& Magick::ColorRGB::operator=(
const Magick::Color& color_)
546 *
static_cast<Magick::Color*
>(
this)=color_;
550Magick::ColorYUV::ColorYUV(
void)
560Magick::ColorYUV::ColorYUV(
double y_,
double u_,
double v_)
561 : Color(scaleDoubleToQuantum(y_ + 1.13980 * v_),
562 scaleDoubleToQuantum(y_ - (0.39380 * u_) - (0.58050 * v_)),
563 scaleDoubleToQuantum(y_ + 2.02790 * u_))
565 alphaQuantum(OpaqueOpacity);
568Magick::ColorYUV::~ColorYUV(
void)
572Magick::ColorYUV& Magick::ColorYUV::operator=(
const Magick::Color &color_)
574 *
static_cast<Magick::Color*
>(
this)=color_;
578void Magick::ColorYUV::u(
double u_)
583 redQuantum(scaleDoubleToQuantum(Y + 1.13980 * V ));
584 greenQuantum(scaleDoubleToQuantum( Y - (0.39380 * u_) - (0.58050 * V)));
585 blueQuantum(scaleDoubleToQuantum( Y + 2.02790 * u_));
588double Magick::ColorYUV::u(
void)
const
590 return scaleQuantumToDouble((-0.14740 * redQuantum()) - (0.28950 *
591 greenQuantum()) + (0.43690 * blueQuantum()));
594void Magick::ColorYUV::v(
double v_)
599 redQuantum(scaleDoubleToQuantum( Y + 1.13980 * v_ ));
600 greenQuantum(scaleDoubleToQuantum( Y - (0.39380 * U) - (0.58050 * v_) ));
601 blueQuantum(scaleDoubleToQuantum( Y + 2.02790 * U ));
604double Magick::ColorYUV::v(
void)
const
606 return scaleQuantumToDouble((0.61500 * redQuantum()) - (0.51500 *
607 greenQuantum()) - (0.10000 * blueQuantum()));
610void Magick::ColorYUV::y(
double y_)
615 redQuantum(scaleDoubleToQuantum(y_ + 1.13980 * V));
616 greenQuantum(scaleDoubleToQuantum(y_ - (0.39380 * U) - (0.58050 * V)));
617 blueQuantum(scaleDoubleToQuantum(y_ + 2.02790 * U));
620double Magick::ColorYUV::y(
void)
const
622 return scaleQuantumToDouble((0.29900 * redQuantum()) + (0.58700 *
623 greenQuantum()) + (0.11400 * blueQuantum()));