Monitor (macOS): detect HDR support

This commit is contained in:
李通洲
2023-08-11 16:45:16 +08:00
parent 28d95c9f45
commit d05cbc0af0
3 changed files with 30 additions and 1 deletions
+1 -1
View File
@@ -541,7 +541,7 @@ elseif(APPLE)
src/detection/gamepad/gamepad_apple.c
src/detection/media/media_apple.m
src/detection/memory/memory_apple.c
src/detection/monitor/monitor_apple.c
src/detection/monitor/monitor_apple.m
src/detection/opengl/opengl_apple.c
src/detection/os/os_apple.m
src/detection/packages/packages_apple.c
+1
View File
@@ -7,6 +7,7 @@ typedef struct FFMonitorResult
uint32_t height; // native / maximum resolution, in pixels
uint32_t physicalWidth; // in mm
uint32_t physicalHeight; // in mm
bool hdrCompatible;
} FFMonitorResult;
const char* ffDetectMonitor(FFlist* results);
@@ -4,6 +4,9 @@
#include "util/apple/ddcci.h"
#include "util/edidHelper.h"
#import <AppKit/NSScreen.h>
#import <Foundation/Foundation.h>
extern CFDictionaryRef CoreDisplay_DisplayCreateInfoDictionary(CGDirectDisplayID display) __attribute__((weak_import));
static const char* detectWithDisplayServices(const FFDisplayServerResult* displayServer, FFlist* results)
@@ -31,6 +34,30 @@ static const char* detectWithDisplayServices(const FFDisplayServerResult* displa
CGSize size = CGDisplayScreenSize((CGDirectDisplayID) display->id);
monitor->physicalWidth = (uint32_t) (size.width + 0.5);
monitor->physicalHeight = (uint32_t) (size.height + 0.5);
monitor->hdrCompatible = false;
if (CFDictionaryContainsKey(displayInfo, CFSTR("ReferencePeakHDRLuminance")))
monitor->hdrCompatible = true;
else
{
NSScreen* mainScreen = NSScreen.mainScreen;
if (display->primary)
monitor->hdrCompatible = mainScreen.maximumPotentialExtendedDynamicRangeColorComponentValue > 1;
else
{
for (NSScreen* screen in NSScreen.screens)
{
if (screen == mainScreen) continue;
NSNumber* screenNumber = [screen.deviceDescription valueForKey:@"NSScreenNumber"];
if (screenNumber && screenNumber.longValue == 1)
{
monitor->hdrCompatible = screen.maximumPotentialExtendedDynamicRangeColorComponentValue > 1;
break;
}
}
continue;
}
}
}
}
}
@@ -93,6 +120,7 @@ static const char* detectWithDdcci(FFlist* results)
ffStrbufInit(&display->name);
ffEdidGetName(edidData, &display->name);
ffEdidGetPhysicalSize(edidData, &display->physicalWidth, &display->physicalHeight);
monitor->hdrCompatible = false;
}
return NULL;
}