1 #include <mbgl/util/premultiply.hpp>
2 
3 #include <cmath>
4 
5 namespace mbgl {
6 namespace util {
7 
premultiply(UnassociatedImage && src)8 PremultipliedImage premultiply(UnassociatedImage&& src) {
9     PremultipliedImage dst;
10 
11     dst.size = src.size;
12     src.size = { 0, 0 };
13     dst.data = std::move(src.data);
14 
15     uint8_t* data = dst.data.get();
16     for (size_t i = 0; i < dst.bytes(); i += 4) {
17         uint8_t& r = data[i + 0];
18         uint8_t& g = data[i + 1];
19         uint8_t& b = data[i + 2];
20         uint8_t& a = data[i + 3];
21         r = (r * a + 127) / 255;
22         g = (g * a + 127) / 255;
23         b = (b * a + 127) / 255;
24     }
25 
26     return dst;
27 }
28 
unpremultiply(PremultipliedImage && src)29 UnassociatedImage unpremultiply(PremultipliedImage&& src) {
30     UnassociatedImage dst;
31 
32     dst.size = src.size;
33     src.size = { 0, 0 };
34     dst.data = std::move(src.data);
35 
36     uint8_t* data = dst.data.get();
37     for (size_t i = 0; i < dst.bytes(); i += 4) {
38         uint8_t& r = data[i + 0];
39         uint8_t& g = data[i + 1];
40         uint8_t& b = data[i + 2];
41         uint8_t& a = data[i + 3];
42         if (a) {
43             r = (255 * r + (a / 2)) / a;
44             g = (255 * g + (a / 2)) / a;
45             b = (255 * b + (a / 2)) / a;
46         }
47     }
48 
49     return dst;
50 }
51 
52 } // namespace util
53 } // namespace mbgl
54