Merge pull request #42477 from bruvzg/macos_dpi
[4.0] Fix `screen_get_dpi` on macOS.
This commit is contained in:
commit
5e726d8d20
2 changed files with 22 additions and 3 deletions
|
@ -521,6 +521,18 @@
|
|||
<argument index="0" name="screen" type="int" default="-1">
|
||||
</argument>
|
||||
<description>
|
||||
Returns the dots per inch density of the specified screen. If [code]screen[/code] is [/code]SCREEN_OF_MAIN_WINDOW[/code] (the default value), a screen with the main window will be used.
|
||||
[b]Note:[/b] On macOS, returned value is inaccurate if fractional display scaling mode is used.
|
||||
[b]Note:[/b] On Android devices, the actual screen densities are grouped into six generalized densities:
|
||||
[codeblock]
|
||||
ldpi - 120 dpi
|
||||
mdpi - 160 dpi
|
||||
hdpi - 240 dpi
|
||||
xhdpi - 320 dpi
|
||||
xxhdpi - 480 dpi
|
||||
xxxhdpi - 640 dpi
|
||||
[/codeblock]
|
||||
[b]Note:[/b] This method is implemented on Android, Linux, macOS and Windows. Returns [code]72[/code] on unsupported platforms.
|
||||
</description>
|
||||
</method>
|
||||
<method name="screen_get_max_scale" qualifiers="const">
|
||||
|
|
|
@ -2246,11 +2246,18 @@ int DisplayServerOSX::screen_get_dpi(int p_screen) const {
|
|||
NSArray *screenArray = [NSScreen screens];
|
||||
if ((NSUInteger)p_screen < [screenArray count]) {
|
||||
NSDictionary *description = [[screenArray objectAtIndex:p_screen] deviceDescription];
|
||||
NSSize displayDPI = [[description objectForKey:NSDeviceResolution] sizeValue];
|
||||
return (displayDPI.width + displayDPI.height) / 2;
|
||||
|
||||
const NSSize displayPixelSize = [[description objectForKey:NSDeviceSize] sizeValue];
|
||||
const CGSize displayPhysicalSize = CGDisplayScreenSize([[description objectForKey:@"NSScreenNumber"] unsignedIntValue]);
|
||||
float scale = [[screenArray objectAtIndex:p_screen] backingScaleFactor];
|
||||
|
||||
float den2 = (displayPhysicalSize.width / 25.4f) * (displayPhysicalSize.width / 25.4f) + (displayPhysicalSize.height / 25.4f) * (displayPhysicalSize.height / 25.4f);
|
||||
if (den2 > 0.0f) {
|
||||
return ceil(sqrt(displayPixelSize.width * displayPixelSize.width + displayPixelSize.height * displayPixelSize.height) / sqrt(den2) * scale);
|
||||
}
|
||||
}
|
||||
|
||||
return 96;
|
||||
return 72;
|
||||
}
|
||||
|
||||
float DisplayServerOSX::screen_get_scale(int p_screen) const {
|
||||
|
|
Loading…
Reference in a new issue