MyGUI  3.2.1
MyGUI_Colour.cpp
Go to the documentation of this file.
1 /*
2  * This source file is part of MyGUI. For the latest info, see http://mygui.info/
3  * Distributed under the MIT License
4  * (See accompanying file COPYING.MIT or copy at http://opensource.org/licenses/MIT)
5  */
6 
7 #include "MyGUI_Precompiled.h"
8 #include "MyGUI_Colour.h"
9 
10 namespace MyGUI
11 {
12 
13  const Colour Colour::Zero = Colour(0, 0, 0, 0);
14  const Colour Colour::Black = Colour(0, 0, 0, 1);
15  const Colour Colour::White = Colour(1, 1, 1, 1);
16  const Colour Colour::Red = Colour(1, 0, 0, 1);
17  const Colour Colour::Green = Colour(0, 1, 0, 1);
18  const Colour Colour::Blue = Colour(0, 0, 1, 1);
19 
21  red(1),
22  green(1),
23  blue(1),
24  alpha(1)
25  {
26  }
27 
28  Colour::Colour( float _red, float _green, float _blue, float _alpha) :
29  red(_red),
30  green(_green),
31  blue(_blue),
32  alpha(_alpha)
33  {
34  }
35 
36  Colour::Colour(const std::string& _value)
37  {
38  *this = parse(_value);
39  }
40 
42  {
43  red = _value.red;
44  green = _value.green;
45  blue = _value.blue;
46  alpha = _value.alpha;
47  return *this;
48  }
49 
50  bool Colour::operator == (Colour const& _value) const
51  {
52  return ((red == _value.red) && (green == _value.green) && (blue == _value.blue) && (alpha == _value.alpha));
53  }
54 
55  bool Colour::operator != (Colour const& _value) const
56  {
57  return ! (*this == _value);
58  }
59 
60  void Colour::set(float _red, float _green, float _blue, float _alpha)
61  {
62  red = _red;
63  green = _green;
64  blue = _blue;
65  alpha = _alpha;
66  }
67 
69  {
70  red = green = blue = alpha = 0;
71  }
72 
73  std::string Colour::print() const
74  {
75  std::ostringstream stream;
76  stream << *this;
77  return stream.str();
78  }
79 
80  Colour Colour::parse(const std::string& _value)
81  {
82  if (!_value.empty())
83  {
84  if (_value[0] == '#')
85  {
86  std::istringstream stream(_value.substr(1));
87  int result = 0;
88  stream >> std::hex >> result;
89  if (!stream.fail())
90  {
91  return Colour( (unsigned char)( result >> 16 ) / 256.0f, (unsigned char)( result >> 8 ) / 256.0f, (unsigned char)( result ) / 256.0f );
92  }
93  }
94  else
95  {
96  float red, green, blue;
97  std::istringstream stream(_value);
98  stream >> red >> green >> blue;
99  if (!stream.fail())
100  {
101  float alpha = ALPHA_MAX;
102  if (!stream.eof())
103  stream >> alpha;
104  return Colour(red, green, blue, alpha);
105  }
106  }
107  }
108  return Colour::Zero;
109  }
110 
111  std::ostream& Colour::operatorShiftLeft(std::ostream& _stream, const Colour& _value)
112  {
113  _stream << _value.red << " " << _value.green << " " << _value.blue << " " << _value.alpha;
114  return _stream;
115  }
116 
117  std::istream& Colour::operatorShiftRight(std::istream& _stream, Colour& _value)
118  {
119  _value.clear();
120 
121  std::string value;
122  _stream >> value;
123 
124  if (value.empty())
125  return _stream;
126 
127  if (value[0] == '#')
128  {
129  _value = parse(value);
130  }
131  else
132  {
133  std::istringstream stream(value);
134  stream >> _value.red;
135  if (stream.fail())
136  _value.clear();
137  else
138  {
139  _stream >> _value.green >> _value.blue;
140  if (!_stream.eof())
141  _stream >> _value.alpha;
142  else
143  _value.alpha = 1;
144 
145  if (_stream.fail())
146  _value.clear();
147  }
148  }
149 
150  return _stream;
151  }
152 
153 } // namespace MyGUI