• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // This may look like C code, but it is really -*- C++ -*-
2 //
3 // Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002, 2003
4 // Copyright Dirk Lemstra 2013-2018
5 //
6 // Color Implementation
7 //
8 
9 #define MAGICKCORE_IMPLEMENTATION
10 #define MAGICK_PLUSPLUS_IMPLEMENTATION 1
11 
12 #include "Magick++/Include.h"
13 #include <string>
14 
15 using namespace std;
16 
17 #include "Magick++/Color.h"
18 #include "Magick++/Exception.h"
19 
operator ==(const Magick::Color & left_,const Magick::Color & right_)20 MagickPPExport int Magick::operator == (const Magick::Color &left_,
21   const Magick::Color &right_)
22 {
23 #if defined(MAGICKCORE_HDRI_SUPPORT)
24   return((left_.isValid() == right_.isValid()) &&
25     (fabs(left_.quantumRed()-right_.quantumRed()) < MagickEpsilon) &&
26     (fabs(left_.quantumGreen()-right_.quantumGreen()) < MagickEpsilon) &&
27     (fabs(left_.quantumBlue()-right_.quantumBlue()) < MagickEpsilon));
28 #else
29   return((left_.isValid() == right_.isValid()) &&
30     (left_.quantumRed() == right_.quantumRed()) &&
31     (left_.quantumGreen() == right_.quantumGreen()) &&
32     (left_.quantumBlue() == right_.quantumBlue()));
33 #endif
34 }
35 
operator !=(const Magick::Color & left_,const Magick::Color & right_)36 MagickPPExport int Magick::operator != (const Magick::Color &left_,
37   const Magick::Color &right_)
38 {
39   return(!(left_ == right_));
40 }
41 
operator >(const Magick::Color & left_,const Magick::Color & right_)42 MagickPPExport int Magick::operator > (const Magick::Color &left_,
43   const Magick::Color &right_)
44 {
45   return(!(left_ < right_ ) && (left_ != right_ ));
46 }
47 
operator <(const Magick::Color & left_,const Magick::Color & right_)48 MagickPPExport int Magick::operator < ( const Magick::Color &left_,
49   const Magick::Color &right_)
50 {
51   if(left_.quantumRed() < right_.quantumRed())
52     return(true);
53   if(left_.quantumRed() > right_.quantumRed())
54     return(false);
55   if(left_.quantumGreen() < right_.quantumGreen())
56     return(true);
57   if(left_.quantumGreen() > right_.quantumGreen())
58     return(false);
59   if(left_.quantumBlue() < right_.quantumBlue())
60     return(true);
61   return(false);
62 }
63 
operator >=(const Magick::Color & left_,const Magick::Color & right_)64 MagickPPExport int Magick::operator >= (const Magick::Color &left_,
65   const Magick::Color &right_)
66 {
67   return((left_ > right_) || (left_ == right_));
68 }
69 
operator <=(const Magick::Color & left_,const Magick::Color & right_)70 MagickPPExport int Magick::operator <= ( const Magick::Color &left_,
71   const Magick::Color &right_)
72 {
73   return((left_ < right_) || (left_ == right_));
74 }
75 
Color(void)76 Magick::Color::Color(void)
77   : _pixel(new PixelInfo),
78     _isValid(false),
79     _pixelOwn(true),
80     _pixelType(RGBAPixel)
81 {
82   initPixel();
83 
84   setAlpha(TransparentAlpha);
85 }
86 
Color(const Magick::Quantum red_,const Magick::Quantum green_,const Quantum blue_)87 Magick::Color::Color(const Magick::Quantum red_,const Magick::Quantum green_,
88   const Quantum blue_)
89   : _pixel(new PixelInfo),
90     _isValid(true),
91     _pixelOwn(true),
92     _pixelType(RGBPixel)
93 {
94   initPixel();
95 
96   quantumAlpha(OpaqueAlpha);
97   quantumBlack(0);
98   quantumBlue(blue_);
99   quantumGreen(green_);
100   quantumRed(red_);
101 }
102 
Color(const Magick::Quantum red_,const Magick::Quantum green_,const Magick::Quantum blue_,const Magick::Quantum alpha_)103 Magick::Color::Color(const Magick::Quantum red_,const Magick::Quantum green_,
104   const Magick::Quantum blue_, const Magick::Quantum alpha_)
105   : _pixel(new PixelInfo),
106     _isValid(true),
107     _pixelOwn(true),
108     _pixelType(RGBPixel)
109 {
110   initPixel();
111 
112   quantumAlpha(alpha_);
113   quantumBlack(0);
114   quantumBlue(blue_);
115   quantumGreen(green_);
116   quantumRed(red_);
117   if (alpha_ != OpaqueAlpha)
118     _pixelType=RGBAPixel;
119 }
120 
Color(const Magick::Quantum cyan_,const Magick::Quantum magenta_,const Magick::Quantum yellow_,const Magick::Quantum black_,const Magick::Quantum alpha_)121 Magick::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),
125     _isValid(true),
126     _pixelOwn(true),
127     _pixelType(CMYKPixel)
128 {
129   initPixel();
130 
131   quantumAlpha(alpha_);
132   quantumBlack(black_);
133   quantumBlue(yellow_);
134   quantumGreen(magenta_);
135   quantumRed(cyan_);
136   if (alpha_ != OpaqueAlpha)
137     _pixelType=CMYKAPixel;
138 }
139 
Color(const char * color_)140 Magick::Color::Color(const char *color_)
141   : _pixel(new PixelInfo),
142     _isValid(true),
143     _pixelOwn(true),
144     _pixelType(RGBPixel)
145 {
146   initPixel();
147 
148   // Use operator = implementation
149   *this=color_;
150 }
151 
Color(const Magick::Color & color_)152 Magick::Color::Color(const Magick::Color &color_)
153   : _pixel(new PixelInfo),
154     _isValid(color_._isValid),
155     _pixelOwn(true),
156     _pixelType(color_._pixelType)
157 {
158   *_pixel=*color_._pixel;
159 }
160 
Color(const PixelInfo & color_)161 Magick::Color::Color(const PixelInfo &color_)
162   : _pixel(new PixelInfo),
163     _isValid(true),
164     _pixelOwn(true)
165 {
166   *_pixel=color_;
167   setPixelType(color_);
168 }
169 
Color(const std::string & color_)170 Magick::Color::Color(const std::string &color_)
171   : _pixel(new PixelInfo),
172     _isValid(true),
173     _pixelOwn(true),
174     _pixelType(RGBPixel)
175 {
176   initPixel();
177 
178   // Use operator = implementation
179   *this=color_;
180 }
181 
~Color(void)182 Magick::Color::~Color(void)
183 {
184   if (_pixelOwn)
185     delete _pixel;
186 
187   _pixel=(PixelInfo *)NULL;
188 }
189 
operator =(const Magick::Color & color_)190 Magick::Color& Magick::Color::operator=(const Magick::Color& color_)
191 {
192   // If not being set to ourself
193   if (this != &color_)
194     {
195       // Copy pixel value
196       *_pixel=*color_._pixel;
197 
198       // Validity
199       _isValid=color_._isValid;
200 
201       // Copy pixel type
202       _pixelType=color_._pixelType;
203     }
204   return(*this);
205 }
206 
operator =(const char * color_)207 const Magick::Color& Magick::Color::operator=(const char *color_)
208 {
209   *this=std::string(color_);
210   return(*this);
211 }
212 
operator =(const MagickCore::PixelInfo & color_)213 const Magick::Color& Magick::Color::operator=(const MagickCore::PixelInfo &color_)
214 {
215   *_pixel=color_;
216   setPixelType(color_);
217 
218   return(*this);
219 }
220 
operator =(const std::string & color_)221 const Magick::Color& Magick::Color::operator=(const std::string &color_)
222 {
223   PixelInfo
224     target_color;
225 
226   initPixel();
227   GetPPException;
228   if (QueryColorCompliance(color_.c_str(),AllCompliance,&target_color,
229       exceptionInfo))
230     {
231       quantumAlpha(target_color.alpha);
232       quantumBlack(target_color.black);
233       quantumBlue(target_color.blue);
234       quantumGreen(target_color.green);
235       quantumRed(target_color.red);
236 
237       setPixelType(target_color);
238     }
239   else
240     _isValid = false;
241   ThrowPPException(false);
242 
243   return(*this);
244 }
245 
operator MagickCore::PixelInfo() const246 Magick::Color::operator MagickCore::PixelInfo() const
247 {
248   return *_pixel;
249 }
250 
operator std::string() const251 Magick::Color::operator std::string() const
252 {
253   char
254     colorbuf[MagickPathExtent];
255 
256   PixelInfo
257     pixel;
258 
259   if (!isValid())
260     return std::string("none");
261 
262   pixel.colorspace=(_pixelType == RGBPixel || _pixelType == RGBAPixel) ?
263     RGBColorspace : CMYKColorspace;
264   pixel.alpha_trait=(_pixelType == RGBAPixel || _pixelType == CMYKAPixel) ?
265     BlendPixelTrait : UndefinedPixelTrait;
266   pixel.depth=MAGICKCORE_QUANTUM_DEPTH;
267   pixel.alpha=_pixel->alpha;
268   pixel.alpha_trait=_pixel->alpha_trait;
269   pixel.black=_pixel->black;
270   pixel.blue=_pixel->blue;
271   pixel.green=_pixel->green;
272   pixel.red=_pixel->red;
273   GetColorTuple(&pixel,MagickTrue,colorbuf);
274 
275   return(std::string(colorbuf));
276 }
277 
isFuzzyEquivalent(const Color & color_,const double fuzz_) const278 bool Magick::Color::isFuzzyEquivalent(const Color &color_, const double fuzz_) const
279 {
280   PixelInfo
281     p,
282     q;
283 
284   p=*_pixel;
285   p.fuzz=fuzz_;
286   q=*color_._pixel;
287   q.fuzz=fuzz_;
288   return (IsFuzzyEquivalencePixelInfo(&p, &q) != MagickFalse);
289 }
290 
isValid(void) const291 bool Magick::Color::isValid(void) const
292 {
293   return(_isValid);
294 }
295 
pixelType() const296 Magick::Color::PixelType Magick::Color::pixelType() const
297 {
298   return(_pixelType);
299 }
300 
isValid(bool valid_)301 void Magick::Color::isValid(bool valid_)
302 {
303   if (bool(valid_) == bool(isValid()))
304     return;
305 
306   if (!_pixelOwn)
307     {
308       _pixel=new PixelInfo;
309       _pixelOwn=true;
310     }
311 
312   _isValid=valid_;
313 
314   initPixel();
315 }
316 
quantumAlpha(const Magick::Quantum alpha_)317 void Magick::Color::quantumAlpha(const Magick::Quantum alpha_)
318 {
319   setAlpha(alpha_);
320   _isValid=true;
321 }
322 
quantumAlpha(void) const323 Magick::Quantum Magick::Color::quantumAlpha(void) const
324 {
325   return(_pixel->alpha);
326 }
327 
quantumBlack(const Magick::Quantum black_)328 void Magick::Color::quantumBlack(const Magick::Quantum black_)
329 {
330   _pixel->black=black_;
331   _isValid=true;
332 }
333 
quantumBlack(void) const334 Magick::Quantum Magick::Color::quantumBlack(void) const
335 {
336   return(_pixel->black);
337 }
338 
quantumBlue(const Magick::Quantum blue_)339 void Magick::Color::quantumBlue(const Magick::Quantum blue_)
340 {
341   _pixel->blue=blue_;
342   _isValid=true;
343 }
344 
quantumBlue(void) const345 Magick::Quantum Magick::Color::quantumBlue(void) const
346 {
347   return(_pixel->blue);
348 }
349 
quantumGreen(const Magick::Quantum green_)350 void Magick::Color::quantumGreen(const Magick::Quantum green_)
351 {
352   _pixel->green=green_;
353   _isValid=true;
354 }
355 
quantumGreen(void) const356 Magick::Quantum Magick::Color::quantumGreen(void) const
357 {
358   return(_pixel->green);
359 }
360 
quantumRed(const Magick::Quantum red_)361 void Magick::Color::quantumRed(const Magick::Quantum red_)
362 {
363   _pixel->red=red_;
364   _isValid=true;
365 }
366 
quantumRed(void) const367 Magick::Quantum Magick::Color::quantumRed(void) const
368 {
369   return _pixel->red;
370 }
371 
Color(PixelType pixelType_)372 Magick::Color::Color(PixelType pixelType_)
373   : _pixel(new PixelInfo),
374     _isValid(false),
375     _pixelOwn(true),
376     _pixelType(pixelType_)
377 {
378   initPixel();
379 }
380 
Color(PixelInfo * rep_,PixelType pixelType_)381 Magick::Color::Color(PixelInfo* rep_,PixelType pixelType_)
382   : _pixel(rep_),
383     _isValid(true),
384     _pixelOwn(false),
385     _pixelType(pixelType_)
386 {
387 }
388 
pixel(PixelInfo * rep_,PixelType pixelType_)389 void Magick::Color::pixel(PixelInfo *rep_,PixelType pixelType_)
390 {
391   if (_pixelOwn)
392     delete _pixel;
393 
394   _pixel=rep_;
395   _pixelOwn=false;
396   _isValid=true;
397   _pixelType=pixelType_;
398 }
399 
scaleDoubleToQuantum(const double double_)400 Magick::Quantum Magick::Color::scaleDoubleToQuantum(const double double_)
401 {
402   return(static_cast<Magick::Quantum>(double_*QuantumRange));
403 }
404 
scaleQuantumToDouble(const Magick::Quantum quantum_)405 double Magick::Color::scaleQuantumToDouble(const Magick::Quantum quantum_)
406 {
407 #if (MAGICKCORE_QUANTUM_DEPTH < 32) && (MAGICKCORE_SIZEOF_FLOAT_T != MAGICKCORE_SIZEOF_DOUBLE || !defined(MAGICKCORE_HDRI_SUPPORT))
408   return(static_cast<double>(quantum_)/QuantumRange);
409 #else
410   return(quantum_/QuantumRange);
411 #endif
412 }
413 
initPixel()414 void Magick::Color::initPixel()
415 {
416   MagickCore::GetPixelInfo((MagickCore::Image *) NULL, _pixel);
417   if (_pixelType == CMYKPixel || _pixelType == CMYKAPixel)
418     _pixel->colorspace=CMYKColorspace;
419 }
420 
setAlpha(const Magick::Quantum alpha_)421 void Magick::Color::setAlpha(const Magick::Quantum alpha_)
422 {
423   _pixel->alpha=alpha_;
424   if (alpha_ == QuantumRange)
425     {
426       _pixel->alpha_trait=UndefinedPixelTrait;
427       if (_pixelType == RGBAPixel)
428         _pixelType=RGBPixel;
429       else if (_pixelType == CMYKAPixel)
430         _pixelType=CMYKPixel;
431     }
432   else
433     {
434       _pixel->alpha_trait=BlendPixelTrait;
435       if (_pixelType == RGBPixel)
436         _pixelType=RGBAPixel;
437       else if (_pixelType == CMYKPixel)
438         _pixelType=CMYKAPixel;
439     }
440 }
441 
setPixelType(const PixelInfo & color_)442 void Magick::Color::setPixelType(const PixelInfo &color_)
443 {
444   if (color_.colorspace == CMYKColorspace)
445     _pixelType=color_.alpha_trait != UndefinedPixelTrait ? CMYKAPixel :
446       CMYKPixel;
447   else
448     _pixelType=color_.alpha_trait != UndefinedPixelTrait ? RGBAPixel :
449       RGBPixel;
450 }
451 
ColorCMYK(void)452 Magick::ColorCMYK::ColorCMYK(void)
453   : Color(CMYKPixel)
454 {
455 }
456 
ColorCMYK(const Magick::Color & color_)457 Magick::ColorCMYK::ColorCMYK(const Magick::Color &color_)
458   : Color(color_)
459 {
460 }
461 
ColorCMYK(const double cyan_,const double magenta_,const double yellow_,const double black_)462 Magick::ColorCMYK::ColorCMYK(const double cyan_,const double magenta_,
463   const double yellow_,const double black_)
464   : Color(CMYKPixel)
465 {
466   cyan(cyan_);
467   magenta(magenta_);
468   yellow(yellow_);
469   black(black_);
470 }
471 
ColorCMYK(const double cyan_,const double magenta_,const double yellow_,const double black_,const double alpha_)472 Magick::ColorCMYK::ColorCMYK(const double cyan_,const double magenta_,
473   const double yellow_,const double black_,const double alpha_)
474   : Color(CMYKAPixel)
475 {
476   cyan(cyan_);
477   magenta(magenta_);
478   yellow(yellow_);
479   black(black_);
480   alpha(alpha_);
481 }
482 
~ColorCMYK(void)483 Magick::ColorCMYK::~ColorCMYK(void)
484 {
485 }
486 
operator =(const Magick::Color & color_)487 Magick::ColorCMYK& Magick::ColorCMYK::operator=(const Magick::Color& color_)
488 {
489   *static_cast<Magick::Color*>(this)=color_;
490   return(*this);
491 }
492 
alpha(const double alpha_)493 void Magick::ColorCMYK::alpha(const double alpha_)
494 {
495   quantumAlpha(scaleDoubleToQuantum(alpha_));
496 }
497 
alpha(void) const498 double Magick::ColorCMYK::alpha(void) const
499 {
500   return(scaleQuantumToDouble(quantumAlpha()));
501 }
502 
black(const double black_)503 void Magick::ColorCMYK::black(const double black_)
504 {
505   quantumBlack(scaleDoubleToQuantum(black_));
506 }
507 
black(void) const508 double Magick::ColorCMYK::black(void) const
509 {
510   return(scaleQuantumToDouble(quantumBlack()));
511 }
512 
cyan(const double cyan_)513 void Magick::ColorCMYK::cyan(const double cyan_)
514 {
515   quantumRed(scaleDoubleToQuantum(cyan_));
516 }
517 
cyan(void) const518 double Magick::ColorCMYK::cyan(void) const
519 {
520   return(scaleQuantumToDouble(quantumRed()));
521 }
522 
magenta(const double magenta_)523 void Magick::ColorCMYK::magenta(const double magenta_)
524 {
525   quantumGreen(scaleDoubleToQuantum(magenta_));
526 }
527 
magenta(void) const528 double Magick::ColorCMYK::magenta(void) const
529 {
530   return(scaleQuantumToDouble(quantumGreen()));
531 }
532 
yellow(const double yellow_)533 void Magick::ColorCMYK::yellow(const double yellow_)
534 {
535   quantumBlue(scaleDoubleToQuantum(yellow_));
536 }
537 
yellow(void) const538 double Magick::ColorCMYK::yellow(void) const
539 {
540   return(scaleQuantumToDouble(quantumBlue()));
541 }
542 
ColorCMYK(PixelInfo * rep_,PixelType pixelType_)543 Magick::ColorCMYK::ColorCMYK(PixelInfo *rep_,PixelType pixelType_)
544   : Color(rep_,pixelType_)
545 {
546 }
547 
ColorGray(void)548 Magick::ColorGray::ColorGray(void)
549   : Color(RGBPixel)
550 {
551 }
552 
ColorGray(const Magick::Color & color_)553 Magick::ColorGray::ColorGray(const Magick::Color & color_)
554   : Color(color_)
555 {
556 }
557 
ColorGray(double shade_)558 Magick::ColorGray::ColorGray(double shade_)
559   : Color(scaleDoubleToQuantum(shade_),scaleDoubleToQuantum(shade_),
560           scaleDoubleToQuantum(shade_))
561 {
562 }
563 
~ColorGray()564 Magick::ColorGray::~ColorGray()
565 {
566 }
567 
shade(double shade_)568 void Magick::ColorGray::shade(double shade_)
569 {
570   Quantum gray=scaleDoubleToQuantum(shade_);
571   quantumRed(gray);
572   quantumGreen(gray);
573   quantumBlue(gray);
574 }
575 
shade(void) const576 double Magick::ColorGray::shade(void) const
577 {
578   return(scaleQuantumToDouble(quantumGreen()));
579 }
580 
operator =(const Magick::Color & color_)581 Magick::ColorGray& Magick::ColorGray::operator=(const Magick::Color& color_)
582 {
583   *static_cast<Magick::Color*>(this)=color_;
584   return(*this);
585 }
586 
ColorGray(PixelInfo * rep_,PixelType pixelType_)587 Magick::ColorGray::ColorGray(PixelInfo *rep_,PixelType pixelType_)
588 : Color(rep_,pixelType_)
589 {
590 }
591 
ColorHSL(void)592 Magick::ColorHSL::ColorHSL(void)
593   : Color(RGBPixel)
594 {
595 }
596 
ColorHSL(const Magick::Color & color_)597 Magick::ColorHSL::ColorHSL(const Magick::Color &color_)
598   : Color(color_)
599 {
600 }
601 
ColorHSL(const double hue_,const double saturation_,const double lightness_)602 Magick::ColorHSL::ColorHSL(const double hue_,const double saturation_,
603   const double lightness_)
604   : Color(RGBPixel)
605 {
606   double
607     blue,
608     green,
609     red;
610 
611   ConvertHSLToRGB(hue_,saturation_,lightness_,&red,&green,&blue);
612 
613   quantumRed(red);
614   quantumGreen(green);
615   quantumBlue(blue);
616 }
617 
~ColorHSL()618 Magick::ColorHSL::~ColorHSL()
619 {
620 }
621 
operator =(const Magick::Color & color_)622 Magick::ColorHSL& Magick::ColorHSL::operator=(const Magick::Color& color_)
623 {
624   *static_cast<Magick::Color*>(this) = color_;
625   return(*this);
626 }
627 
hue(const double hue_)628 void Magick::ColorHSL::hue(const double hue_)
629 {
630   double
631     hue,
632     lightness,
633     saturation;
634 
635   double
636     blue,
637     green,
638     red;
639 
640   ConvertRGBToHSL(quantumRed(),quantumGreen(),quantumBlue(),&hue,&saturation,
641     &lightness);
642 
643   hue=hue_;
644 
645   ConvertHSLToRGB(hue,saturation,lightness,&red,&green,&blue);
646 
647   quantumRed(ClampToQuantum(red));
648   quantumGreen(ClampToQuantum(green));
649   quantumBlue(ClampToQuantum(blue));
650 }
651 
hue(void) const652 double Magick::ColorHSL::hue(void) const
653 {
654   double
655     hue,
656     lightness,
657     saturation;
658 
659   ConvertRGBToHSL(quantumRed(),quantumGreen(),quantumBlue(),&hue,&saturation,
660     &lightness);
661 
662   return(hue);
663 }
664 
lightness(const double lightness_)665 void Magick::ColorHSL::lightness (const double lightness_)
666 {
667   double
668     hue,
669     lightness,
670     saturation;
671 
672   double
673     blue,
674     green,
675     red;
676 
677   ConvertRGBToHSL(quantumRed(),quantumGreen(),quantumBlue(),&hue,&saturation,
678     &lightness);
679 
680   lightness=lightness_;
681 
682   ConvertHSLToRGB(hue,saturation,lightness,&red,&green,&blue);
683 
684   quantumRed(ClampToQuantum(red));
685   quantumGreen(ClampToQuantum(green));
686   quantumBlue(ClampToQuantum(blue));
687 }
688 
lightness(void) const689 double Magick::ColorHSL::lightness (void) const
690 {
691   double
692     hue,
693     lightness,
694     saturation;
695 
696   ConvertRGBToHSL(quantumRed(),quantumGreen(),quantumBlue(),&hue,&saturation,
697     &lightness);
698 
699   return(lightness);
700 }
701 
saturation(const double saturation_)702 void Magick::ColorHSL::saturation(const double saturation_)
703 {
704   double
705     hue,
706     lightness,
707     saturation;
708 
709   double
710     blue,
711     green,
712     red;
713 
714   ConvertRGBToHSL(quantumRed(),quantumGreen(),quantumBlue(),&hue,&saturation,
715     &lightness);
716 
717   saturation=saturation_;
718 
719   ConvertHSLToRGB(hue,saturation,lightness,&red,&green,&blue);
720 
721   quantumRed(ClampToQuantum(red));
722   quantumGreen(ClampToQuantum(green));
723   quantumBlue(ClampToQuantum(blue));
724 }
725 
saturation(void) const726 double Magick::ColorHSL::saturation(void) const
727 {
728   double
729     hue,
730     lightness,
731     saturation;
732 
733   ConvertRGBToHSL(quantumRed(),quantumGreen(),quantumBlue(),&hue,&saturation,
734     &lightness);
735 
736   return(saturation);
737 }
738 
ColorMono(void)739 Magick::ColorMono::ColorMono(void)
740   : Color(RGBPixel)
741 {
742 }
743 
ColorMono(const bool mono_)744 Magick::ColorMono::ColorMono(const bool mono_)
745   : Color((mono_ ? QuantumRange : 0),(mono_ ? QuantumRange : 0),
746           (mono_ ? QuantumRange : 0))
747 {
748 }
749 
ColorMono(const Magick::Color & color_)750 Magick::ColorMono::ColorMono(const Magick::Color &color_)
751   : Color(color_)
752 {
753 }
754 
~ColorMono()755 Magick::ColorMono::~ColorMono()
756 {
757 }
758 
operator =(const Magick::Color & color_)759 Magick::ColorMono& Magick::ColorMono::operator=(const Magick::Color& color_)
760 {
761   *static_cast<Magick::Color*>(this)=color_;
762   return(*this);
763 }
764 
mono(bool mono_)765 void Magick::ColorMono::mono(bool mono_)
766 {
767   quantumRed(mono_ ? QuantumRange : 0);
768   quantumGreen(mono_ ? QuantumRange : 0);
769   quantumBlue(mono_ ? QuantumRange : 0);
770 }
771 
mono(void) const772 bool Magick::ColorMono::mono(void) const
773 {
774   return(quantumGreen() == 0);
775 }
776 
ColorMono(PixelInfo * rep_,PixelType pixelType_)777 Magick::ColorMono::ColorMono(PixelInfo *rep_,PixelType pixelType_)
778   : Color(rep_,pixelType_)
779 {
780 }
781 
ColorRGB(void)782 Magick::ColorRGB::ColorRGB(void)
783   : Color(RGBPixel)
784 {
785 }
786 
ColorRGB(const Magick::Color & color_)787 Magick::ColorRGB::ColorRGB(const Magick::Color &color_)
788   : Color(color_)
789 {
790 }
791 
ColorRGB(const double red_,const double green_,const double blue_)792 Magick::ColorRGB::ColorRGB(const double red_,const double green_,
793   const double blue_)
794   : Color(scaleDoubleToQuantum(red_),scaleDoubleToQuantum(green_),
795           scaleDoubleToQuantum(blue_))
796 {
797 }
798 
ColorRGB(const double red_,const double green_,const double blue_,const double alpha_)799 Magick::ColorRGB::ColorRGB(const double red_,const double green_,
800   const double blue_,const double alpha_)
801   : Color(scaleDoubleToQuantum(red_),scaleDoubleToQuantum(green_),
802           scaleDoubleToQuantum(blue_),scaleDoubleToQuantum(alpha_))
803 {
804 }
805 
~ColorRGB(void)806 Magick::ColorRGB::~ColorRGB(void)
807 {
808 }
809 
operator =(const Magick::Color & color_)810 Magick::ColorRGB& Magick::ColorRGB::operator=(const Magick::Color& color_)
811 {
812   *static_cast<Magick::Color*>(this)=color_;
813   return(*this);
814 }
815 
alpha(const double alpha_)816 void Magick::ColorRGB::alpha(const double alpha_)
817 {
818   quantumAlpha(scaleDoubleToQuantum(alpha_));
819 }
820 
alpha(void) const821 double Magick::ColorRGB::alpha(void) const
822 {
823   return(scaleQuantumToDouble(quantumAlpha()));
824 }
825 
blue(const double blue_)826 void Magick::ColorRGB::blue(const double blue_)
827 {
828   quantumBlue(scaleDoubleToQuantum(blue_));
829 }
830 
blue(void) const831 double Magick::ColorRGB::blue(void) const
832 {
833   return(scaleQuantumToDouble(quantumBlue()));
834 }
835 
green(const double green_)836 void Magick::ColorRGB::green(const double green_)
837 {
838   quantumGreen(scaleDoubleToQuantum(green_));
839 }
840 
green(void) const841 double Magick::ColorRGB::green(void) const
842 {
843   return(scaleQuantumToDouble(quantumGreen()));
844 }
845 
red(const double red_)846 void Magick::ColorRGB::red(const double red_)
847 {
848   quantumRed(scaleDoubleToQuantum(red_));
849 }
850 
red(void) const851 double Magick::ColorRGB::red(void) const
852 {
853   return(scaleQuantumToDouble(quantumRed()));
854 }
855 
ColorRGB(PixelInfo * rep_,PixelType pixelType_)856 Magick::ColorRGB::ColorRGB(PixelInfo *rep_,PixelType pixelType_)
857   : Color(rep_,pixelType_)
858 {
859 }
860 
ColorYUV(void)861 Magick::ColorYUV::ColorYUV(void)
862   : Color(RGBPixel)
863 {
864 }
865 
ColorYUV(const Magick::Color & color_)866 Magick::ColorYUV::ColorYUV(const Magick::Color &color_)
867   : Color(color_)
868 {
869 }
870 
ColorYUV(const double y_,const double u_,const double v_)871 Magick::ColorYUV::ColorYUV(const double y_,const double u_,const double v_)
872   : Color(RGBPixel)
873 {
874   convert(y_, u_, v_);
875 }
876 
~ColorYUV(void)877 Magick::ColorYUV::~ColorYUV(void)
878 {
879 }
880 
operator =(const Magick::Color & color_)881 Magick::ColorYUV& Magick::ColorYUV::operator=(const Magick::Color &color_)
882 {
883   *static_cast<Magick::Color*>(this)=color_;
884   return(*this);
885 }
886 
u(const double u_)887 void Magick::ColorYUV::u(const double u_)
888 {
889   convert(y(), u_, v());
890 }
891 
u(void) const892 double Magick::ColorYUV::u(void) const
893 {
894   return(scaleQuantumToDouble((-0.14740 * quantumRed()) - (0.28950 *
895     quantumGreen()) + (0.43690 * quantumBlue())));
896 }
897 
v(const double v_)898 void Magick::ColorYUV::v(const double v_)
899 {
900   convert(y(), u(), v_);
901 }
902 
v(void) const903 double Magick::ColorYUV::v(void) const
904 {
905   return(scaleQuantumToDouble((0.61500 * quantumRed()) - (0.51500 *
906     quantumGreen()) - (0.10000 * quantumBlue())));
907 }
908 
y(const double y_)909 void Magick::ColorYUV::y(const double y_)
910 {
911   convert(y_, u(), v());
912 }
913 
y(void) const914 double Magick::ColorYUV::y ( void ) const
915 {
916   return(scaleQuantumToDouble((0.29900 * quantumRed()) + (0.58700 *
917     quantumGreen()) + (0.11400 * quantumBlue())));
918 }
919 
convert(const double y_,const double u_,const double v_)920 void Magick::ColorYUV::convert(const double y_,const double u_,const double v_)
921 {
922   quantumRed(scaleDoubleToQuantum(y_ + 1.13980 * v_));
923   quantumGreen(scaleDoubleToQuantum(y_ - (0.39380 * u_) - (0.58050 * v_)));
924   quantumBlue(scaleDoubleToQuantum(y_ + 2.02790 * u_));
925 }
926 
ColorYUV(PixelInfo * rep_,PixelType pixelType_)927 Magick::ColorYUV::ColorYUV(PixelInfo *rep_,PixelType pixelType_)
928   : Color(rep_,pixelType_)
929 {
930 }
931