-
Notifications
You must be signed in to change notification settings - Fork 4
/
Colour.cpp
118 lines (99 loc) · 2.15 KB
/
Colour.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#include "Colour.h"
std::map<uint32_t, Colour::BBCColour> Colour::m_colourMap =
{
{0x000000ff,BBCColour::Black},
{0xff0000ff,BBCColour::Red},
{0x00ff00ff,BBCColour::Green},
{0xffff00ff,BBCColour::Yellow},
{0x0000ffff,BBCColour::Blue},
{0xff00ffff,BBCColour::Magenta},
{0x00ffffff,BBCColour::Cyan},
{0xffffffff,BBCColour::White}
};
std::map<std::string, Colour::BBCColour> Colour::m_colourMapStr =
{
{"BLACK", BBCColour::Black},
{"RED", BBCColour::Red},
{"GREEN", BBCColour::Green},
{"YELLOW", BBCColour::Yellow},
{"BLUE", BBCColour::Blue},
{"MAGENTA", BBCColour::Magenta},
{"CYAN", BBCColour::Cyan},
{"WHITE", BBCColour::White}
};
Colour::Colour(uint8_t r, uint8_t g, uint8_t b)
{
uint32_t key = (r << 24) | (g << 16) | (b << 8) | 0xff;
auto it = m_colourMap.find(key);
if (it != m_colourMap.end())
{
m_internalColour = it->second;
}
else
{
throw std::runtime_error("Invalid BBC Colour");
}
}
Colour::Colour(uint32_t rawRGB)
{
uint32_t key = (rawRGB << 8) | 0xff;
auto it = m_colourMap.find(key);
if (it != m_colourMap.end())
{
m_internalColour = it->second;
}
else
{
throw std::runtime_error("Invalid BBC Colour");
}
}
Colour::Colour(const std::string& colourName)
{
auto it = m_colourMapStr.find(colourName);
if (it != m_colourMapStr.end())
{
m_internalColour = it->second;
}
else
{
throw std::runtime_error("Invalid BBC Colour");
}
}
uint32_t Colour::getNumberOfColoursForMode(uint32_t mode)
{
switch (mode)
{
case 0:
case 4:
return 2;
break;
case 1:
case 5:
return 4;
break;
case 2:
return 16;
break;
default:
return 0;
}
}
uint32_t Colour::getPixelsPerByteForMode(uint32_t mode)
{
switch (mode)
{
case 0:
case 4:
return 8;
break;
case 1:
case 5:
return 4;
break;
case 2:
return 2;
break;
default:
return 0;
}
}