CGDisplayModeGetWidth / Height()有时会返回像素,有时会点

时间:2017-02-03 13:00:24

标签: macos quartz-graphics quartz-2d

According to AppleCGDisplayModeGetWidth()CGDisplayModeGetHeight()都应该返回点而不是从macOS 10.8开始的像素。但Apple对这些API的说法并不一致,因为here他们说函数返回像素而不是点。

这种混淆也反映在实践中,因为这两种功能有时似乎只返回点,而不是所有时间。有时它们也会返回像素。考虑这个例子:

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);

代码迭代所有可用的屏幕模式。在此示例中,输出以像素为单位。

但是,使用此代码时,输​​出为点:

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

但为什么呢?为什么CGDisplayModeGetWidth()CGDisplayModeGetHeight()会在第一个代码段中返回像素而在第二个代码段中返回?这让我很困惑。

为了使事情变得更加复杂,从macOS 10.8开始,有两个新的API,即CGDisplayModeGetPixelWidth()CGDisplayModeGetPixelHeight()。这些总是返回像素,但我仍然不明白为什么CGDisplayModeGetWidth()CGDisplayModeGetHeight()返回上面第一个代码段中的像素...这是一个错误吗?

修改

这是我的1680x1050显示器的输出。我正在使用Quartz Debug将显示器置于840x525屏幕模式下进行Retina测试。您可以看到第一个代码段的输出必须以像素为单位,因为它返回的模式如1680x1050,如果是点,则对应3360x2100像素。第一个代码片段返回像素而不是点的另一个证据在于,监视器当前所处的屏幕模式(即840x525)根本不返回。只有第二个代码段才会返回此模式。

    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

0 个答案:

没有答案