summary refs log tree commit diff stats
path: root/color.cpp
diff options
context:
space:
mode:
authorKelly Rauchenberger <fefferburbia@gmail.com>2016-05-02 22:57:13 -0400
committerKelly Rauchenberger <fefferburbia@gmail.com>2016-05-02 22:57:13 -0400
commit330f75e663c22e1198a92fd134865ada98c3957b (patch)
treeb78f8aa762fcc93c14a0905546b694cddaaa3041 /color.cpp
downloadinfinite-330f75e663c22e1198a92fd134865ada98c3957b.tar.gz
infinite-330f75e663c22e1198a92fd134865ada98c3957b.tar.bz2
infinite-330f75e663c22e1198a92fd134865ada98c3957b.zip
Initial commit
Diffstat (limited to 'color.cpp')
-rw-r--r--color.cpp76
1 files changed, 76 insertions, 0 deletions
diff --git a/color.cpp b/color.cpp new file mode 100644 index 0000000..78228a8 --- /dev/null +++ b/color.cpp
@@ -0,0 +1,76 @@
1#include "color.h"
2
3#include <stdio.h>
4#include <string.h>
5#include <ostream>
6#include <sstream>
7
8// Constants
9const Color Color::White = Color(1,1,1,1);
10const Color Color::Black = Color(0,0,0,1);
11
12Color::Color(const unsigned char* arr)
13{
14 float inv = 1.0 / 255.0;
15 r = arr[0] * inv;
16 g = arr[1] * inv;
17 b = arr[2] * inv;
18 a = 1.0;
19}
20
21Color Color::fromHex(const char* s)
22{
23 // If the color is "none", return any color
24 // with alpha zero (completely transparent).
25 if(!strcmp(s, "none"))
26 {
27 return Color(0,0,0,0);
28 }
29
30 // Ignore leading hashmark.
31 if(s[0] == '#')
32 {
33 s++;
34 }
35
36 // Set stream formatting to hexadecimal.
37 std::stringstream ss;
38 ss << std::hex;
39
40 // Convert to integer.
41 unsigned int rgb;
42 ss << s;
43 ss >> rgb;
44
45 // Extract 8-byte chunks and normalize.
46 Color c;
47 c.r = (float)( ( rgb & 0xFF0000 ) >> 16 ) / 255.0;
48 c.g = (float)( ( rgb & 0x00FF00 ) >> 8 ) / 255.0;
49 c.b = (float)( ( rgb & 0x0000FF ) >> 0 ) / 255.0;
50 c.a = 1.0; // set alpha to 1 (opaque) by default
51
52 return c;
53}
54
55std::string Color::toHex() const
56{
57 int R = (unsigned char) std::max( 0., std::min( 255.0, 255.0 * r ));
58 int G = (unsigned char) std::max( 0., std::min( 255.0, 255.0 * g ));
59 int B = (unsigned char) std::max( 0., std::min( 255.0, 255.0 * b ));
60
61 std::stringstream ss;
62 ss << std::hex;
63
64 ss << R << G << B;
65 return ss.str();
66}
67
68std::ostream& operator<<(std::ostream& os, const Color& c)
69{
70 os << "(r=" << c.r;
71 os << " g=" << c.g;
72 os << " b=" << c.b;
73 os << " a=" << c.a;
74 os << ")";
75 return os;
76}