diff options
author | Nadia Barbosa <nadiabarbosa@me.com> | 2019-04-11 17:00:10 -0700 |
---|---|---|
committer | Nadia Barbosa <captainbarbosa@users.noreply.github.com> | 2019-04-12 11:07:46 -0700 |
commit | 2ee967a036d115d35aa474c0c84a645ab7097c72 (patch) | |
tree | 0cb339193abb65c8016d5c29d7812fa95ca4634e /platform/macos/src | |
parent | 19c6010ff29eba791be76e26dbbeb9c3c325827a (diff) | |
download | qtlocation-mapboxgl-2ee967a036d115d35aa474c0c84a645ab7097c72.tar.gz |
[ios, macos] Premultiply color values for mgl_color
Fixes https://github.com/mapbox/mapbox-gl-native/issues/14329
Diffstat (limited to 'platform/macos/src')
-rw-r--r-- | platform/macos/src/NSColor+MGLAdditions.mm | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/platform/macos/src/NSColor+MGLAdditions.mm b/platform/macos/src/NSColor+MGLAdditions.mm index ea7d99f66d..6df3d750ce 100644 --- a/platform/macos/src/NSColor+MGLAdditions.mm +++ b/platform/macos/src/NSColor+MGLAdditions.mm @@ -15,15 +15,34 @@ } [srgbColor getRed:&r green:&g blue:&b alpha:&a]; - return { (float)r, (float)g, (float)b, (float)a }; + // NSColor 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) }; } + (NSColor *)mgl_colorWithColor:(mbgl::Color)color { + // If there is no alpha value, return original color values. + if (color.a == 0.0f) { + // macOS 10.12 Sierra and below uses calibrated RGB by default. + if ([NSColor redColor].colorSpaceName == NSCalibratedRGBColorSpace) { + return [NSColor colorWithCalibratedRed:color.r green:color.g blue:color.b alpha:color.a]; + } else { + return [NSColor 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 NSColor 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)); + // macOS 10.12 Sierra and below uses calibrated RGB by default. if ([NSColor redColor].colorSpaceName == NSCalibratedRGBColorSpace) { - return [NSColor colorWithCalibratedRed:color.r green:color.g blue:color.b alpha:color.a]; + return [NSColor colorWithCalibratedRed:red green:green blue:blue alpha:color.a]; } else { - return [NSColor colorWithRed:color.r green:color.g blue:color.b alpha:color.a]; + return [NSColor colorWithRed:red green:green blue:blue alpha:color.a]; } } |