1 #include <mbgl/util/premultiply.hpp> 2 3 #include <cmath> 4 5 namespace mbgl { 6 namespace util { 7 premultiply(UnassociatedImage && src)8PremultipliedImage 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)29UnassociatedImage 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