1 /*
2 * Copyright 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #ifndef ANDROID_SURFACEREPLAYER_COLOR_H
18 #define ANDROID_SURFACEREPLAYER_COLOR_H
19
20 #include <cmath>
21 #include <cstdlib>
22
23 namespace android {
24
25 constexpr double modulateFactor = .0001;
26 constexpr double modulateLimit = .80;
27
28 struct RGB {
RGBRGB29 RGB(uint8_t rIn, uint8_t gIn, uint8_t bIn) : r(rIn), g(gIn), b(bIn) {}
30
31 uint8_t r = 0;
32 uint8_t g = 0;
33 uint8_t b = 0;
34 };
35
36 struct HSV {
37 HSV() = default;
HSVHSV38 HSV(double hIn, double sIn, double vIn) : h(hIn), s(sIn), v(vIn) {}
39
40 double h = 0;
41 double s = 0;
42 double v = 0;
43
44 RGB getRGB() const;
45
46 bool modulateUp = false;
47
48 void modulate();
49 };
50
modulate()51 void inline HSV::modulate() {
52 if(modulateUp) {
53 v += modulateFactor;
54 } else {
55 v -= modulateFactor;
56 }
57
58 if(v <= modulateLimit || v >= 1) {
59 modulateUp = !modulateUp;
60 }
61 }
62
getRGB()63 inline RGB HSV::getRGB() const {
64 using namespace std;
65 double r = 0, g = 0, b = 0;
66
67 if (s == 0) {
68 r = v;
69 g = v;
70 b = v;
71 } else {
72 auto tempHue = static_cast<int>(h) % 360;
73 tempHue = tempHue / 60;
74
75 int i = static_cast<int>(trunc(tempHue));
76 double f = h - i;
77
78 double x = v * (1.0 - s);
79 double y = v * (1.0 - (s * f));
80 double z = v * (1.0 - (s * (1.0 - f)));
81
82 switch (i) {
83 case 0:
84 r = v;
85 g = z;
86 b = x;
87 break;
88
89 case 1:
90 r = y;
91 g = v;
92 b = x;
93 break;
94
95 case 2:
96 r = x;
97 g = v;
98 b = z;
99 break;
100
101 case 3:
102 r = x;
103 g = y;
104 b = v;
105 break;
106
107 case 4:
108 r = z;
109 g = x;
110 b = v;
111 break;
112
113 default:
114 r = v;
115 g = x;
116 b = y;
117 break;
118 }
119 }
120
121 return RGB(round(r * 255), round(g * 255), round(b * 255));
122 }
123 }
124 #endif
125