Bladeren bron

[macOS] Fix color picker on HDR screens.

(cherry picked from commit d9b7075ba6464f62d942a78b8030ad6a534cdf05)
bruvzg 1 jaar geleden
bovenliggende
commit
c1d946e3fe
1 gewijzigde bestanden met toevoegingen van 13 en 8 verwijderingen
  1. 13 8
      platform/macos/display_server_macos.mm

+ 13 - 8
platform/macos/display_server_macos.mm

@@ -2702,6 +2702,7 @@ Color DisplayServerMacOS::screen_get_pixel(const Point2i &p_position) const {
 	position += _get_screens_origin();
 	position /= screen_get_max_scale();
 
+	Color color;
 	for (NSScreen *screen in [NSScreen screens]) {
 		NSRect frame = [screen frame];
 		if (NSMouseInRect(NSMakePoint(position.x, position.y), frame, NO)) {
@@ -2709,18 +2710,22 @@ Color DisplayServerMacOS::screen_get_pixel(const Point2i &p_position) const {
 			CGDirectDisplayID display_id = [[screenDescription objectForKey:@"NSScreenNumber"] unsignedIntValue];
 			CGImageRef image = CGDisplayCreateImageForRect(display_id, CGRectMake(position.x - frame.origin.x, frame.size.height - (position.y - frame.origin.y), 1, 1));
 			if (image) {
-				NSBitmapImageRep *bitmap = [[NSBitmapImageRep alloc] initWithCGImage:image];
-				CGImageRelease(image);
-				NSColor *color = [bitmap colorAtX:0 y:0];
-				if (color) {
-					CGFloat components[4];
-					[color getRed:&components[0] green:&components[1] blue:&components[2] alpha:&components[3]];
-					return Color(components[0], components[1], components[2], components[3]);
+				CGColorSpaceRef color_space = CGColorSpaceCreateDeviceRGB();
+				if (color_space) {
+					uint8_t img_data[4];
+					CGContextRef context = CGBitmapContextCreate(img_data, 1, 1, 8, 4, color_space, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
+					if (context) {
+						CGContextDrawImage(context, CGRectMake(0, 0, 1, 1), image);
+						color = Color(img_data[0] / 255.0f, img_data[1] / 255.0f, img_data[2] / 255.0f, img_data[3] / 255.0f);
+						CGContextRelease(context);
+					}
+					CGColorSpaceRelease(color_space);
 				}
+				CGImageRelease(image);
 			}
 		}
 	}
-	return Color();
+	return color;
 }
 
 Ref<Image> DisplayServerMacOS::screen_get_image(int p_screen) const {