mapnik/include/mapnik/color.hpp

175 lines
3.9 KiB
C++
Raw Normal View History

2006-03-31 12:32:02 +02:00
/*****************************************************************************
2012-02-02 02:53:35 +01:00
*
2006-03-31 12:32:02 +02:00
* This file is part of Mapnik (c++ mapping toolkit)
2005-06-14 17:06:59 +02:00
*
* Copyright (C) 2011 Artem Pavlenko
2005-06-14 17:06:59 +02:00
*
2006-03-31 12:32:02 +02:00
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
2005-06-14 17:06:59 +02:00
* but WITHOUT ANY WARRANTY; without even the implied warranty of
2006-03-31 12:32:02 +02:00
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
2005-06-14 17:06:59 +02:00
*
2006-03-31 12:32:02 +02:00
*****************************************************************************/
2005-06-14 17:06:59 +02:00
#ifndef MAPNIK_COLOR_HPP
#define MAPNIK_COLOR_HPP
2005-06-14 17:06:59 +02:00
// mapnik
#include <mapnik/config.hpp>
#include <mapnik/global.hpp>
//boost
#include <boost/operators.hpp>
// stl
2007-10-08 20:10:31 +02:00
#include <sstream>
2014-05-06 19:06:47 +02:00
#include <cstdint>
2005-06-14 17:06:59 +02:00
namespace mapnik {
2012-02-02 02:53:35 +01:00
class MAPNIK_DECL color
: boost::equality_comparable<color>
2010-06-02 13:03:30 +02:00
{
private:
2014-05-06 19:06:47 +02:00
std::uint8_t red_;
std::uint8_t green_;
std::uint8_t blue_;
std::uint8_t alpha_;
2012-02-02 02:53:35 +01:00
2010-06-02 13:03:30 +02:00
public:
2014-07-08 19:13:44 +02:00
// default ctor
2010-06-02 13:03:30 +02:00
color()
: red_(0xff),
2010-06-02 13:03:30 +02:00
green_(0xff),
blue_(0xff),
alpha_(0xff)
{}
2012-02-02 02:53:35 +01:00
2014-05-06 19:06:47 +02:00
color(std::uint8_t red, std::uint8_t green, std::uint8_t blue, std::uint8_t alpha = 0xff)
: red_(red),
2010-06-02 13:03:30 +02:00
green_(green),
blue_(blue),
alpha_(alpha)
{}
2012-02-02 02:53:35 +01:00
2014-07-08 19:13:44 +02:00
// copy ctor
2010-06-02 13:03:30 +02:00
color(const color& rhs)
: red_(rhs.red_),
2010-06-02 13:03:30 +02:00
green_(rhs.green_),
blue_(rhs.blue_),
2012-02-02 02:53:35 +01:00
alpha_(rhs.alpha_)
2010-06-02 13:03:30 +02:00
{}
2005-06-14 17:06:59 +02:00
2014-07-08 19:13:44 +02:00
// move ctor
color(color && rhs)
: red_(std::move(rhs.red_)),
green_(std::move(rhs.green_)),
blue_(std::move(rhs.blue_)),
alpha_(std::move(rhs.alpha_)) {}
color( std::string const& str);
std::string to_string() const;
std::string to_hex_string() const;
void premultiply();
void demultiply();
2014-01-29 10:56:44 +01:00
color& operator=(color rhs)
{
2014-01-29 10:56:44 +01:00
swap(rhs);
return *this;
}
inline bool operator==(color const& rhs) const
{
return (red_== rhs.red()) &&
(green_ == rhs.green()) &&
(blue_ == rhs.blue()) &&
(alpha_ == rhs.alpha());
}
2012-02-02 02:53:35 +01:00
2014-05-06 19:06:47 +02:00
inline std::uint8_t red() const
2010-06-02 13:03:30 +02:00
{
return red_;
}
2012-02-02 02:53:35 +01:00
2014-05-06 19:06:47 +02:00
inline std::uint8_t green() const
2010-06-02 13:03:30 +02:00
{
return green_;
}
2014-06-09 13:13:07 +02:00
2014-05-06 19:06:47 +02:00
inline std::uint8_t blue() const
2010-06-02 13:03:30 +02:00
{
return blue_;
}
2014-06-09 13:13:07 +02:00
2014-05-06 19:06:47 +02:00
inline std::uint8_t alpha() const
2010-06-02 13:03:30 +02:00
{
return alpha_;
2012-02-02 02:53:35 +01:00
}
2014-05-06 19:06:47 +02:00
inline void set_red(std::uint8_t red)
2010-06-02 13:03:30 +02:00
{
red_ = red;
}
2014-06-09 13:13:07 +02:00
2014-05-06 19:06:47 +02:00
inline void set_green(std::uint8_t green)
2010-06-02 13:03:30 +02:00
{
green_ = green;
}
2012-02-02 02:53:35 +01:00
2014-05-06 19:06:47 +02:00
inline void set_blue(std::uint8_t blue)
2010-06-02 13:03:30 +02:00
{
blue_ = blue;
}
2014-05-06 19:06:47 +02:00
inline void set_alpha(std::uint8_t alpha)
2010-06-02 13:03:30 +02:00
{
alpha_ = alpha;
}
inline unsigned rgba() const
2010-06-02 13:03:30 +02:00
{
#ifdef MAPNIK_BIG_ENDIAN
2013-11-04 00:36:21 +01:00
return static_cast<unsigned>((alpha_) | (blue_ << 8) | (green_ << 16) | (red_ << 24)) ;
#else
2013-11-04 00:36:21 +01:00
return static_cast<unsigned>((alpha_ << 24) | (blue_ << 16) | (green_ << 8) | (red_)) ;
#endif
2010-06-02 13:03:30 +02:00
}
2014-01-29 10:56:44 +01:00
private:
void swap(color & rhs)
{
std::swap(red_, rhs.red_);
std::swap(green_,rhs.green_);
std::swap(blue_,rhs.blue_);
std::swap(alpha_,rhs.alpha_);
}
2012-02-02 02:53:35 +01:00
};
2012-03-07 19:16:41 +01:00
template <typename charT, typename traits>
std::basic_ostream<charT, traits> &
operator << ( std::basic_ostream<charT, traits> & s, mapnik::color const& c )
{
std::string hex_string( c.to_string() );
s << hex_string;
return s;
}
2014-07-14 13:36:04 +02:00
// hash
inline std::size_t hash_value(color const& c)
{
return c.rgba();
}
2005-06-14 17:06:59 +02:00
}
#endif // MAPNIK_COLOR_HPP