diff options
Diffstat (limited to 'platform/ios/src/UIColor+MGLAdditions.mm')
-rw-r--r-- | platform/ios/src/UIColor+MGLAdditions.mm | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/platform/ios/src/UIColor+MGLAdditions.mm b/platform/ios/src/UIColor+MGLAdditions.mm index 7c1fbddc20..68e77f5b10 100644 --- a/platform/ios/src/UIColor+MGLAdditions.mm +++ b/platform/ios/src/UIColor+MGLAdditions.mm @@ -6,7 +6,10 @@ { CGFloat r, g, b, a; [self getRed:&r green:&g blue:&b alpha:&a]; - return { (float)r, (float)g, (float)b, (float)a }; + // UIColor provides non-premultiplied color components, so we have to premultiply each + // color component with the alpha value to transform it into a valid + // mbgl::Color which expects premultiplied color components. + return { static_cast<float>(r*a), static_cast<float>(g*a), static_cast<float>(b*a), static_cast<float>(a) }; } - (mbgl::style::PropertyValue<mbgl::Color>)mgl_colorPropertyValue @@ -17,7 +20,18 @@ + (UIColor *)mgl_colorWithColor:(mbgl::Color)color { - return [UIColor colorWithRed:color.r green:color.g blue:color.b alpha:color.a]; + // If there is no alpha value, return original color values. + if (color.a == 0.0f) { + return [UIColor colorWithRed:color.r green:color.g blue:color.b alpha:color.a]; + } + + // mbgl::Color provides premultiplied color components, so we have to convert color + // components to non-premultiplied values to return a valid UIColor object. + float red = static_cast<float>((color.r / color.a)); + float green = static_cast<float>((color.g / color.a)); + float blue = static_cast<float>((color.b / color.a)); + + return [UIColor colorWithRed:red green:green blue:blue alpha:color.a]; } @end |