1 /*
2  * Copyright (C) 2015 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 #ifndef FLOATCOLOR_H
17 #define FLOATCOLOR_H
18 
19 #include "utils/Color.h"
20 #include "utils/Macros.h"
21 #include "utils/MathUtils.h"
22 
23 #include <stdint.h>
24 
25 namespace android {
26 namespace uirenderer {
27 
28 struct FloatColor {
29     // "color" is a gamma-encoded sRGB color
30     // After calling this method, the color is stored as a pre-multiplied linear color
31     // if linear blending is enabled. Otherwise, the color is stored as a pre-multiplied
32     // gamma-encoded sRGB color
setFloatColor33     void set(uint32_t color) {
34         a = ((color >> 24) & 0xff) / 255.0f;
35         r = a * EOCF(((color >> 16) & 0xff) / 255.0f);
36         g = a * EOCF(((color >> 8) & 0xff) / 255.0f);
37         b = a * EOCF(((color)&0xff) / 255.0f);
38     }
39 
40     // "color" is a gamma-encoded sRGB color
41     // After calling this method, the color is stored as a un-premultiplied linear color
42     // if linear blending is enabled. Otherwise, the color is stored as a un-premultiplied
43     // gamma-encoded sRGB color
setUnPreMultipliedFloatColor44     void setUnPreMultiplied(uint32_t color) {
45         a = ((color >> 24) & 0xff) / 255.0f;
46         r = EOCF(((color >> 16) & 0xff) / 255.0f);
47         g = EOCF(((color >> 8) & 0xff) / 255.0f);
48         b = EOCF(((color)&0xff) / 255.0f);
49     }
50 
isNotBlackFloatColor51     bool isNotBlack() { return a < 1.0f || r > 0.0f || g > 0.0f || b > 0.0f; }
52 
53     bool operator==(const FloatColor& other) const {
54         return MathUtils::areEqual(r, other.r) && MathUtils::areEqual(g, other.g) &&
55                MathUtils::areEqual(b, other.b) && MathUtils::areEqual(a, other.a);
56     }
57 
58     bool operator!=(const FloatColor& other) const { return !(*this == other); }
59 
60     float r;
61     float g;
62     float b;
63     float a;
64 };
65 
66 REQUIRE_COMPATIBLE_LAYOUT(FloatColor);
67 
68 } /* namespace uirenderer */
69 } /* namespace android */
70 
71 #endif /* FLOATCOLOR_H */
72