Color.h revision 3ed852eea50f9d4cd633efb8c2b054b8e33c253
13ed852eea50f9d4cd633efb8c2b054b8e33c253cristy// This may look like C code, but it is really -*- C++ -*-
23ed852eea50f9d4cd633efb8c2b054b8e33c253cristy//
33ed852eea50f9d4cd633efb8c2b054b8e33c253cristy// Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002, 2003, 2008
43ed852eea50f9d4cd633efb8c2b054b8e33c253cristy//
53ed852eea50f9d4cd633efb8c2b054b8e33c253cristy// Color Implementation
63ed852eea50f9d4cd633efb8c2b054b8e33c253cristy//
73ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if !defined (Magick_Color_header)
83ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define Magick_Color_header
93ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "Magick++/Include.h"
113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include <string>
123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
133ed852eea50f9d4cd633efb8c2b054b8e33c253cristynamespace Magick
143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  class MagickDLLDecl Color;
173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  // Compare two Color objects regardless of LHS/RHS
193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int MagickDLLDecl operator == ( const Magick::Color& left_, const Magick::Color& right_ );
203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int MagickDLLDecl operator != ( const Magick::Color& left_, const Magick::Color& right_ );
213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int MagickDLLDecl operator >  ( const Magick::Color& left_, const Magick::Color& right_ );
223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int MagickDLLDecl operator <  ( const Magick::Color& left_, const Magick::Color& right_ );
233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int MagickDLLDecl operator >= ( const Magick::Color& left_, const Magick::Color& right_ );
243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int MagickDLLDecl operator <= ( const Magick::Color& left_, const Magick::Color& right_ );
253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  // Base color class stores RGB components scaled to fit Quantum
273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  class MagickDLLDecl Color
283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  public:
303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Color ( Quantum red_,
313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy	    Quantum green_,
323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy	    Quantum blue_ );
333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Color ( Quantum red_,
343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy	    Quantum green_,
353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy	    Quantum blue_,
363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy	    Quantum alpha_ );
373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Color ( const std::string &x11color_ );
383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Color ( const char * x11color_ );
393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Color ( void );
403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    virtual        ~Color ( void );
413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Color ( const Color & color_ );
423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    // Red color (range 0 to MaxRGB)
443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    void           redQuantum ( Quantum red_ );
453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Quantum        redQuantum ( void ) const;
463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    // Green color (range 0 to MaxRGB)
483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    void           greenQuantum ( Quantum green_ );
493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Quantum        greenQuantum ( void ) const;
503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    // Blue color (range 0 to MaxRGB)
523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    void           blueQuantum ( Quantum blue_ );
533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Quantum        blueQuantum ( void ) const;
543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    // Alpha level (range OpaqueOpacity=0 to TransparentOpacity=MaxRGB)
563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    void           alphaQuantum ( Quantum alpha_ );
573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Quantum        alphaQuantum ( void ) const;
583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    // Scaled (to 1.0) version of alpha for use in sub-classes
603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    // (range opaque=0 to transparent=1.0)
613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    void           alpha ( double alpha_ );
623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    double         alpha ( void ) const;
633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    // Does object contain valid color?
653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    void           isValid ( bool valid_ );
663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    bool           isValid ( void ) const;
673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    // Set color via X11 color specification string
693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    const Color& operator= ( const std::string &x11color_ );
703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    const Color& operator= ( const char * x11color_ );
713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    // Assignment operator
733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Color& operator= ( const Color& color_ );
743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    // Return X11 color specification string
763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    /* virtual */ operator std::string() const;
773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    // Return ImageMagick PixelPacket
793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    operator PixelPacket() const;
803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    // Construct color via ImageMagick PixelPacket
823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Color ( const PixelPacket &color_ );
833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    // Set color via ImageMagick PixelPacket
853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    const Color& operator= ( const PixelPacket &color_ );
863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    //
883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    // Public methods beyond this point are for Magick++ use only.
893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    //
903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    // Obtain pixel intensity as a double
923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    double intensity ( void ) const
933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        return (0.299*(_pixel->red)+0.587*(_pixel->green)+0.114*(_pixel->blue));
953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    // Scale a value expressed as a double (0-1) to Quantum range (0-MaxRGB)
983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    static Quantum scaleDoubleToQuantum( const double double_ )
993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
1003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        return (static_cast<Magick::Quantum>(double_*MaxRGB));
1013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
1023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    // Scale a value expressed as a Quantum (0-MaxRGB) to double range (0-1)
1043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    static double scaleQuantumToDouble( const Quantum quantum_ )
1053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
1063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        return (static_cast<double>(quantum_)/MaxRGB);
1073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
1083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    static double scaleQuantumToDouble( const double quantum_ )
1093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
1103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        return (quantum_/MaxRGB);
1113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
1123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  protected:
1153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    // PixelType specifies the interpretation of PixelPacket members
1173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    // RGBPixel:
1183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    //   Red      = red;
1193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    //   Green    = green;
1203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    //   Blue     = blue;
1213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    // RGBAPixel:
1223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    //   Red      = red;
1233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    //   Green    = green;
1243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    //   Blue     = blue;
1253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    //   Alpha    = opacity;
1263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    // CYMKPixel:
1273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    //   Cyan     = red
1283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    //   Yellow   = green
1293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    //   Magenta  = blue
1303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    //   Black(K) = opacity
1313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    enum PixelType
1323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
1333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      RGBPixel,
1343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      RGBAPixel,
1353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      CYMKPixel
1363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    };
1373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    // Constructor to construct with PixelPacket*
1393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    // Used to point Color at a pixel in an image
1403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Color ( PixelPacket* rep_, PixelType pixelType_ );
1413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    // Set pixel
1433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    // Used to point Color at a pixel in an image
1443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    void pixel ( PixelPacket* rep_, PixelType pixelType_ );
1453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    // PixelPacket represents a color pixel:
1473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    //  red     = red   (range 0 to MaxRGB)
1483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    //  green   = green (range 0 to MaxRGB)
1493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    //  blue    = blue  (range 0 to MaxRGB)
1503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    //  opacity = alpha (range OpaqueOpacity=0 to TransparentOpacity=MaxRGB)
1513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    //  index   = PseudoColor colormap index
1523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    PixelPacket*     _pixel;
1533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  private:
1553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    // Common initializer for PixelPacket representation
1573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    void initPixel();
1583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    // Set true if we allocated pixel
1603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    bool                        _pixelOwn;
1613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    // Set true if pixel is "valid"
1633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    bool                       _isValid;
1643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    // Color type supported by _pixel
1663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    PixelType			_pixelType;
1673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  };
1693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  //
1713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  // HSL Colorspace colors
1723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  //
1733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  class MagickDLLDecl ColorHSL : public Color
1743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
1753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  public:
1763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ColorHSL ( double hue_, double saturation_, double luminosity_ );
1773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ColorHSL ( void );
1783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ColorHSL ( const Color & color_ );
1793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    /* virtual */  ~ColorHSL ( );
1803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    void           hue ( double hue_ );
1823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    double         hue ( void ) const;
1833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    void           saturation ( double saturation_ );
1853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    double         saturation ( void ) const;
1863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    void           luminosity ( double luminosity_ );
1883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    double         luminosity ( void ) const;
1893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    // Assignment operator from base class
1913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ColorHSL& operator= ( const Color& color_ );
1923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  protected:
1943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    // Constructor to construct with PixelPacket*
1953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ColorHSL ( PixelPacket* rep_, PixelType pixelType_ );
1963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  };
1973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  //
1993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  // Grayscale RGB color
2003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  //
2013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  // Grayscale is simply RGB with equal parts of red, green, and blue
2023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  // All double arguments have a valid range of 0.0 - 1.0.
2033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  class MagickDLLDecl ColorGray : public Color
2043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
2053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  public:
2063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ColorGray ( double shade_ );
2073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ColorGray ( void );
2083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ColorGray ( const Color & color_ );
2093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    /* virtual */ ~ColorGray ();
2103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    void           shade ( double shade_ );
2123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    double         shade ( void ) const;
2133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    // Assignment operator from base class
2153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ColorGray& operator= ( const Color& color_ );
2163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  protected:
2183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    // Constructor to construct with PixelPacket*
2193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ColorGray ( PixelPacket* rep_, PixelType pixelType_ );
2203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  };
2213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  //
2233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  // Monochrome color
2243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  //
2253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  // Color arguments are constrained to 'false' (black pixel) and 'true'
2263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  // (white pixel)
2273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  class MagickDLLDecl ColorMono : public Color
2283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
2293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  public:
2303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ColorMono ( bool mono_ );
2313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ColorMono ( void );
2323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ColorMono ( const Color & color_ );
2333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    /* virtual */ ~ColorMono ();
2343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    void           mono ( bool mono_ );
2363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    bool           mono ( void ) const;
2373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    // Assignment operator from base class
2393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ColorMono& operator= ( const Color& color_ );
2403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  protected:
2423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    // Constructor to construct with PixelPacket*
2433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ColorMono ( PixelPacket* rep_, PixelType pixelType_ );
2443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  };
2453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  //
2473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  // RGB color
2483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  //
2493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  // All color arguments have a valid range of 0.0 - 1.0.
2503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  class MagickDLLDecl ColorRGB : public Color
2513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
2523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  public:
2533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ColorRGB ( double red_, double green_, double blue_ );
2543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ColorRGB ( void );
2553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ColorRGB ( const Color & color_ );
2563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    /* virtual */  ~ColorRGB ( void );
2573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    void           red ( double red_ );
2593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    double         red ( void ) const;
2603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    void           green ( double green_ );
2623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    double         green ( void ) const;
2633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    void           blue ( double blue_ );
2653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    double         blue ( void ) const;
2663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    // Assignment operator from base class
2683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ColorRGB& operator= ( const Color& color_ );
2693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  protected:
2713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    // Constructor to construct with PixelPacket*
2723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ColorRGB ( PixelPacket* rep_, PixelType pixelType_ );
2733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  };
2743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  //
2763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  // YUV Colorspace color
2773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  //
2783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  // Argument ranges:
2793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  //        Y:  0.0 through 1.0
2803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  //        U: -0.5 through 0.5
2813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  //        V: -0.5 through 0.5
2823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  class MagickDLLDecl ColorYUV : public Color
2833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
2843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  public:
2853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ColorYUV ( double y_, double u_, double v_ );
2863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ColorYUV ( void );
2873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ColorYUV ( const Color & color_ );
2883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    /* virtual */ ~ColorYUV ( void );
2893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    void           u ( double u_ );
2913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    double         u ( void ) const;
2923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    void           v ( double v_ );
2943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    double         v ( void ) const;
2953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    void           y ( double y_ );
2973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    double         y ( void ) const;
2983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    // Assignment operator from base class
3003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ColorYUV& operator= ( const Color& color_ );
3013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  protected:
3033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    // Constructor to construct with PixelPacket*
3043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ColorYUV ( PixelPacket* rep_, PixelType pixelType_ );
3053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  };
3063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} // namespace Magick
3073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy//
3093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy// Inlines
3103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy//
3113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy//
3133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy// Color
3143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy//
3153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy// Common initializer for PixelPacket representation
3173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy// Initialized transparent black
3183ed852eea50f9d4cd633efb8c2b054b8e33c253cristyinline void Magick::Color::initPixel()
3193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
3203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  _pixel->red     = 0;
3213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  _pixel->green   = 0;
3223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  _pixel->blue    = 0;
3233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  _pixel->opacity = TransparentOpacity;
3243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
3253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3263ed852eea50f9d4cd633efb8c2b054b8e33c253cristyinline void Magick::Color::redQuantum ( Magick::Quantum red_ )
3273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
3283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  _pixel->red = red_;
3293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  _isValid = true;
3303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
3313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3323ed852eea50f9d4cd633efb8c2b054b8e33c253cristyinline Magick::Quantum Magick::Color::redQuantum ( void ) const
3333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
3343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return _pixel->red;
3353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
3363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3373ed852eea50f9d4cd633efb8c2b054b8e33c253cristyinline void Magick::Color::greenQuantum ( Magick::Quantum green_ )
3383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
3393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  _pixel->green = green_;
3403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  _isValid = true;
3413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
3423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3433ed852eea50f9d4cd633efb8c2b054b8e33c253cristyinline Magick::Quantum  Magick::Color::greenQuantum ( void ) const
3443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
3453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return _pixel->green;
3463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
3473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3483ed852eea50f9d4cd633efb8c2b054b8e33c253cristyinline void  Magick::Color::blueQuantum ( Magick::Quantum blue_ )
3493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
3503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  _pixel->blue = blue_;
3513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  _isValid = true;
3523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
3533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3543ed852eea50f9d4cd633efb8c2b054b8e33c253cristyinline Magick::Quantum Magick::Color::blueQuantum ( void ) const
3553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
3563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return _pixel->blue;
3573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
3583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3593ed852eea50f9d4cd633efb8c2b054b8e33c253cristyinline void  Magick::Color::alphaQuantum ( Magick::Quantum alpha_ )
3603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
3613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  _pixel->opacity = alpha_;
3623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  _isValid = true ;
3633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
3643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3653ed852eea50f9d4cd633efb8c2b054b8e33c253cristyinline Magick::Quantum Magick::Color::alphaQuantum ( void ) const
3663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
3673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return _pixel->opacity;
3683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
3693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy// Return ImageMagick PixelPacket struct based on color.
3713ed852eea50f9d4cd633efb8c2b054b8e33c253cristyinline Magick::Color::operator MagickCore::PixelPacket () const
3723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
3733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return *_pixel;
3743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
3753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy// Scaled version of alpha for use in sub-classes
3773ed852eea50f9d4cd633efb8c2b054b8e33c253cristyinline void  Magick::Color::alpha ( double alpha_ )
3783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
3793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  alphaQuantum( scaleDoubleToQuantum(alpha_) );
3803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
3813ed852eea50f9d4cd633efb8c2b054b8e33c253cristyinline double Magick::Color::alpha ( void ) const
3823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
3833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return scaleQuantumToDouble( alphaQuantum() );
3843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
3853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy//
3873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy// ColorHSL
3883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy//
3893ed852eea50f9d4cd633efb8c2b054b8e33c253cristyinline Magick::ColorHSL::ColorHSL ( Magick::PixelPacket* rep_,
3903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                    Magick::Color::PixelType pixelType_ )
3913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy: Color( rep_, pixelType_ )
3923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
3933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
3943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy//
3963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy// ColorGray
3973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy//
3983ed852eea50f9d4cd633efb8c2b054b8e33c253cristyinline Magick::ColorGray::ColorGray ( Magick::PixelPacket* rep_,
3993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                      Magick::Color::PixelType pixelType_ )
4003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy: Color( rep_, pixelType_ )
4013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
4023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
4033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy//
4053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy// ColorMono
4063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy//
4073ed852eea50f9d4cd633efb8c2b054b8e33c253cristyinline Magick::ColorMono::ColorMono ( Magick::PixelPacket* rep_,
4083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                      Magick::Color::PixelType pixelType_ )
4093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  : Color( rep_, pixelType_ )
4103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
4113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
4123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy//
4143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy// ColorRGB
4153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy//
4163ed852eea50f9d4cd633efb8c2b054b8e33c253cristyinline Magick::ColorRGB::ColorRGB ( Magick::PixelPacket* rep_,
4173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                    Magick::Color::PixelType pixelType_ )
4183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  : Color( rep_, pixelType_ )
4193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
4203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
4213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4223ed852eea50f9d4cd633efb8c2b054b8e33c253cristyinline void Magick::ColorRGB::red ( double red_ )
4233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
4243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  redQuantum( scaleDoubleToQuantum(red_) );
4253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
4263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4273ed852eea50f9d4cd633efb8c2b054b8e33c253cristyinline double Magick::ColorRGB::red ( void ) const
4283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
4293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return scaleQuantumToDouble( redQuantum() );
4303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
4313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4323ed852eea50f9d4cd633efb8c2b054b8e33c253cristyinline void Magick::ColorRGB::green ( double green_ )
4333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
4343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  greenQuantum( scaleDoubleToQuantum(green_) );
4353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
4363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4373ed852eea50f9d4cd633efb8c2b054b8e33c253cristyinline double Magick::ColorRGB::green ( void ) const
4383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
4393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return scaleQuantumToDouble( greenQuantum() );
4403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
4413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4423ed852eea50f9d4cd633efb8c2b054b8e33c253cristyinline void Magick::ColorRGB::blue ( double blue_ )
4433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
4443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  blueQuantum( scaleDoubleToQuantum(blue_) );
4453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
4463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4473ed852eea50f9d4cd633efb8c2b054b8e33c253cristyinline double Magick::ColorRGB::blue ( void ) const
4483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
4493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return scaleQuantumToDouble( blueQuantum() );
4503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
4513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy//
4533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy// ColorYUV
4543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy//
4553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4563ed852eea50f9d4cd633efb8c2b054b8e33c253cristyinline Magick::ColorYUV::ColorYUV ( Magick::PixelPacket* rep_,
4573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                    Magick::Color::PixelType pixelType_ )
4583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  : Color( rep_, pixelType_ )
4593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
4603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
4613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif // Magick_Color_header
463