summaryrefslogtreecommitdiff
path: root/platform/macos/src/NSColor+MGLAdditions.mm
diff options
context:
space:
mode:
Diffstat (limited to 'platform/macos/src/NSColor+MGLAdditions.mm')
-rw-r--r--platform/macos/src/NSColor+MGLAdditions.mm25
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];
}
}