lsnes rr2-β24
[lsnes.git] / src / library / framebuffer-colors-hsl.cpp
blobadc74d6b10e2df098a663adbb7c39109052d805a
1 #include "framebuffer.hpp"
3 namespace
5 struct h_rotate : public framebuffer::color_mod
7 h_rotate(const std::string& name, int steps)
8 : framebuffer::color_mod(name, [steps](int64_t& v) {
9 v = framebuffer::color_rotate_hue(v, steps, 24);
14 struct s_adjust : public framebuffer::color_mod
16 s_adjust(const std::string& name, int steps)
17 : framebuffer::color_mod(name, [steps](int64_t& v) {
18 v = framebuffer::color_adjust_saturation(v, steps / 16.0);
23 struct l_adjust : public framebuffer::color_mod
25 l_adjust(const std::string& name, int steps)
26 : framebuffer::color_mod(name, [steps](int64_t& v) {
27 v = framebuffer::color_adjust_lightness(v, steps / 16.0);
32 struct hsl : public framebuffer::basecolor
34 hsl(const std::string& name, int16_t h, int16_t s, uint16_t l)
35 : framebuffer::basecolor(name, getcolor(h, s, l))
38 int64_t getcolor(int16_t h, int16_t s, uint16_t l)
40 int16_t m2;
41 if(l <= 128) m2 = l * (s + 256) / 256;
42 else m2 = l + s - l * s / 256;
43 int16_t m1 = l * 2 - m2;
44 m1 -= (m1 >> 7);
45 m2 -= (m2 >> 7);
46 int64_t r = huev(h + 510, m1, m2);
47 int64_t g = huev(h , m1, m2);
48 int64_t b = huev(h - 510, m1, m2);
49 return (r << 16) | (g << 8) | (b << 0);
51 uint8_t huev(int16_t h, int16_t m1, int16_t m2)
53 if(h < 0) h += 1530;
54 if(h > 1536) h -= 1530;
55 if(h < 256) return m1 + (m2 - m1) * h / 255;
56 if(h < 765) return m2;
57 if(h < 1020) return m1 + (m2 - m1) * (1020 - h) / 255;
58 return m1;
61 struct hsl_luminance
63 hsl_luminance(const std::string& name, int16_t h, int16_t s)
64 : a0(name + "0", h, s, 0)
65 , a1(name + "1", h, s, 32)
66 , a2(name + "2", h, s, 64)
67 , a3(name + "3", h, s, 96)
68 , a4(name + "4", h, s, 128)
69 , a5(name + "5", h, s, 160)
70 , a6(name + "6", h, s, 192)
71 , a7(name + "7", h, s, 224)
72 , a8(name + "8", h, s, 256)
75 private:
76 hsl a0;
77 hsl a1;
78 hsl a2;
79 hsl a3;
80 hsl a4;
81 hsl a5;
82 hsl a6;
83 hsl a7;
84 hsl a8;
86 struct hsl_saturation
88 hsl_saturation(const std::string& name, int16_t h)
89 : a0(name + "0", h, 0)
90 , a1(name + "1", h, 32)
91 , a2(name + "2", h, 64)
92 , a3(name + "3", h, 96)
93 , a4(name + "4", h, 128)
94 , a5(name + "5", h, 160)
95 , a6(name + "6", h, 192)
96 , a7(name + "7", h, 224)
97 , a8(name + "8", h, 256)
100 private:
101 hsl_luminance a0;
102 hsl_luminance a1;
103 hsl_luminance a2;
104 hsl_luminance a3;
105 hsl_luminance a4;
106 hsl_luminance a5;
107 hsl_luminance a6;
108 hsl_luminance a7;
109 hsl_luminance a8;
111 struct hsl_hue
113 hsl_hue(const std::string& name)
114 : a0(name + "r", 0)
115 , a1(name + "ry", 128)
116 , a1b(name + "o", 128)
117 , a2(name + "y", 255)
118 , a3(name + "yg", 383)
119 , a4(name + "g", 510)
120 , a5(name + "gc", 638)
121 , a6(name + "c", 765)
122 , a7(name + "cb", 893)
123 , a8(name + "b", 1020)
124 , a9(name + "bm", 1148)
125 , a10(name + "m", 1275)
126 , a11(name + "mr", 1403)
129 private:
130 hsl_saturation a0;
131 hsl_saturation a1;
132 hsl_saturation a1b;
133 hsl_saturation a2;
134 hsl_saturation a3;
135 hsl_saturation a4;
136 hsl_saturation a5;
137 hsl_saturation a6;
138 hsl_saturation a7;
139 hsl_saturation a8;
140 hsl_saturation a9;
141 hsl_saturation a10;
142 hsl_saturation a11;
145 hsl_hue hsls("hsl-");
146 h_rotate hrotatep1("hue+1", 1);
147 h_rotate hrotatep2("hue+2", 2);
148 h_rotate hrotatep3("hue+3", 3);
149 h_rotate hrotatep4("hue+4", 4);
150 h_rotate hrotatep5("hue+5", 5);
151 h_rotate hrotatep6("hue+6", 6);
152 h_rotate hrotatep7("hue+7", 7);
153 h_rotate hrotatep8("hue+8", 8);
154 h_rotate hrotatep9("hue+9", 9);
155 h_rotate hrotatep10("hue+10", 10);
156 h_rotate hrotatep11("hue+11", 11);
157 h_rotate hrotatep12("hue+12", 12);
158 h_rotate hrotatep13("hue+13", 13);
159 h_rotate hrotatep14("hue+14", 14);
160 h_rotate hrotatep15("hue+15", 15);
161 h_rotate hrotatep16("hue+16", 16);
162 h_rotate hrotatep17("hue+17", 17);
163 h_rotate hrotatep18("hue+18", 18);
164 h_rotate hrotatep19("hue+19", 19);
165 h_rotate hrotatep20("hue+20", 20);
166 h_rotate hrotatep21("hue+21", 21);
167 h_rotate hrotatep22("hue+22", 22);
168 h_rotate hrotatep23("hue+23", 23);
169 h_rotate hrotatem1("hue-1", -1);
170 h_rotate hrotatem2("hue-2", -2);
171 h_rotate hrotatem3("hue-3", -3);
172 h_rotate hrotatem4("hue-4", -4);
173 h_rotate hrotatem5("hue-5", -5);
174 h_rotate hrotatem6("hue-6", -6);
175 h_rotate hrotatem7("hue-7", -7);
176 h_rotate hrotatem8("hue-8", -8);
177 h_rotate hrotatem9("hue-9", -9);
178 h_rotate hrotatem10("hue-10", -10);
179 h_rotate hrotatem11("hue-11", -11);
180 h_rotate hrotatem12("hue-12", -12);
181 h_rotate hrotatem13("hue-13", -13);
182 h_rotate hrotatem14("hue-14", -14);
183 h_rotate hrotatem15("hue-15", -15);
184 h_rotate hrotatem16("hue-16", -16);
185 h_rotate hrotatem17("hue-17", -17);
186 h_rotate hrotatem18("hue-18", -18);
187 h_rotate hrotatem19("hue-19", -19);
188 h_rotate hrotatem20("hue-20", -20);
189 h_rotate hrotatem21("hue-21", -21);
190 h_rotate hrotatem22("hue-22", -22);
191 h_rotate hrotatem23("hue-23", -23);
193 s_adjust sadjustp1("saturation+1", 1);
194 s_adjust sadjustp2("saturation+2", 2);
195 s_adjust sadjustp3("saturation+3", 3);
196 s_adjust sadjustp4("saturation+4", 4);
197 s_adjust sadjustp5("saturation+5", 5);
198 s_adjust sadjustp6("saturation+6", 6);
199 s_adjust sadjustp7("saturation+7", 7);
200 s_adjust sadjustp8("saturation+8", 8);
201 s_adjust sadjustp9("saturation+9", 9);
202 s_adjust sadjustp10("saturation+10", 10);
203 s_adjust sadjustp11("saturation+11", 11);
204 s_adjust sadjustp12("saturation+12", 12);
205 s_adjust sadjustp13("saturation+13", 13);
206 s_adjust sadjustp14("saturation+14", 14);
207 s_adjust sadjustp15("saturation+15", 15);
208 s_adjust sadjustp16("saturation+16", 16);
209 s_adjust sadjustm1("saturation-1", -1);
210 s_adjust sadjustm2("saturation-2", -2);
211 s_adjust sadjustm3("saturation-3", -3);
212 s_adjust sadjustm4("saturation-4", -4);
213 s_adjust sadjustm5("saturation-5", -5);
214 s_adjust sadjustm6("saturation-6", -6);
215 s_adjust sadjustm7("saturation-7", -7);
216 s_adjust sadjustm8("saturation-8", -8);
217 s_adjust sadjustm9("saturation-9", -9);
218 s_adjust sadjustm10("saturation-10", -10);
219 s_adjust sadjustm11("saturation-11", -11);
220 s_adjust sadjustm12("saturation-12", -12);
221 s_adjust sadjustm13("saturation-13", -13);
222 s_adjust sadjustm14("saturation-14", -14);
223 s_adjust sadjustm15("saturation-15", -15);
224 s_adjust sadjustm16("saturation-16", -16);
226 l_adjust ladjustp1("lightness+1", 1);
227 l_adjust ladjustp2("lightness+2", 2);
228 l_adjust ladjustp3("lightness+3", 3);
229 l_adjust ladjustp4("lightness+4", 4);
230 l_adjust ladjustp5("lightness+5", 5);
231 l_adjust ladjustp6("lightness+6", 6);
232 l_adjust ladjustp7("lightness+7", 7);
233 l_adjust ladjustp8("lightness+8", 8);
234 l_adjust ladjustp9("lightness+9", 9);
235 l_adjust ladjustp10("lightness+10", 10);
236 l_adjust ladjustp11("lightness+11", 11);
237 l_adjust ladjustp12("lightness+12", 12);
238 l_adjust ladjustp13("lightness+13", 13);
239 l_adjust ladjustp14("lightness+14", 14);
240 l_adjust ladjustp15("lightness+15", 15);
241 l_adjust ladjustp16("lightness+16", 16);
242 l_adjust ladjustm1("lightness-1", -1);
243 l_adjust ladjustm2("lightness-2", -2);
244 l_adjust ladjustm3("lightness-3", -3);
245 l_adjust ladjustm4("lightness-4", -4);
246 l_adjust ladjustm5("lightness-5", -5);
247 l_adjust ladjustm6("lightness-6", -6);
248 l_adjust ladjustm7("lightness-7", -7);
249 l_adjust ladjustm8("lightness-8", -8);
250 l_adjust ladjustm9("lightness-9", -9);
251 l_adjust ladjustm10("lightness-10", -10);
252 l_adjust ladjustm11("lightness-11", -11);
253 l_adjust ladjustm12("lightness-12", -12);
254 l_adjust ladjustm13("lightness-13", -13);
255 l_adjust ladjustm14("lightness-14", -14);
256 l_adjust ladjustm15("lightness-15", -15);
257 l_adjust ladjustm16("lightness-16", -16);