CGDisplayModeGetWidth/Height() sometimes returns pixels, sometimes points

╄→гoц情女王★ 提交于 2019-12-11 06:22:32

问题


According to Apple, both CGDisplayModeGetWidth() and CGDisplayModeGetHeight() should return points instead of pixels starting in macOS 10.8. But Apple's word on those APIs isn't consistent because here they say that the functions return pixels and not points.

This confusion is also reflected in practice because both functions only seem to return points sometimes, not all the time. Sometimes they also return pixels. Consider this example:

CGDirectDisplayID id = CGMainDisplayID();
CFArrayRef modes = CGDisplayCopyAllDisplayModes(id, NULL);
CGDisplayModeRef mode;
int c = 0, k, n;

n = CFArrayGetCount(modes);

for(k = 0; k < n; k++) {
    mode = (CGDisplayModeRef) CFArrayGetValueAtIndex(modes, k);
    printf("GOT SIZE: %d %d\n", (int) CGDisplayModeGetWidth(mode), (int) CGDisplayModeGetHeight(mode));     
}

CFRelease(modes);

The code iterates over all available screen modes. In this example, the output is in pixels.

When using this code, however, the output is in points:

CGDirectDisplayID id = CGMainDisplayID();
mode = CGDisplayCopyDisplayMode(id);
printf("NEW GOT SIZE: %d %d\n", (int) CGDisplayModeGetWidth(mode), (int) CGDisplayModeGetHeight(mode));     
CGDisplayModeRelease(mode);

But why? Why do CGDisplayModeGetWidth() and CGDisplayModeGetHeight() return pixels in the first code snippet and points in the second? This is confusing me.

To make things even more complicated, starting with macOS 10.8 there are two new APIs, namely CGDisplayModeGetPixelWidth() and CGDisplayModeGetPixelHeight(). These always return pixels, but I still don't understand why CGDisplayModeGetWidth() and CGDisplayModeGetHeight() return pixels in the first code snippet above... is this a bug?

EDIT

Here is the output for my 1680x1050 monitor. I am using Quartz Debug to put the monitor in 840x525 screen mode to do Retina tests. You can see that the output of the first code snippet must be in pixels because it returns modes such as 1680x1050 which would correspond to 3360x2100 pixels if it were points. Another proof that the first code snippet returns pixels not points lies in the fact that the screen mode the monitor is currently in (i.e. 840x525) isn't returned at all. Only the second code snippet returns this mode.

    GOT SIZE: 1680 1050
    GOT SIZE: 1152 870
    GOT SIZE: 1280 1024
    GOT SIZE: 1024 768
    GOT SIZE: 1024 768
    GOT SIZE: 1024 768
    GOT SIZE: 832 624
    GOT SIZE: 800 600
    GOT SIZE: 800 600
    GOT SIZE: 800 600
    GOT SIZE: 800 600
    GOT SIZE: 640 480
    GOT SIZE: 640 480
    GOT SIZE: 640 480
    GOT SIZE: 640 480
    GOT SIZE: 1280 1024
    GOT SIZE: 1280 960
    GOT SIZE: 848 480
    GOT SIZE: 1280 960
    GOT SIZE: 1360 768
    GOT SIZE: 800 500
    GOT SIZE: 1024 640
    GOT SIZE: 1280 800
    GOT SIZE: 1344 1008
    GOT SIZE: 1344 840
    GOT SIZE: 1600 1000
    --------------------------
    NEW GOT SIZE: 840 525

来源:https://stackoverflow.com/questions/42024942/cgdisplaymodegetwidth-height-sometimes-returns-pixels-sometimes-points

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!