Как запросить количество физических пикселей в оборудовании Retina? - PullRequest
0 голосов
/ 10 декабря 2018

Я ищу способ получения двух частей информации: (1) полное физическое разрешение дисплея, даже если это экран Retina;(2) разрешение, которое операционная система, в соответствии с текущими настройками системы, притворяется на том же экране.Пока я могу получить (2), но не могу (1).Похоже, что я сталкиваюсь с комментарием здесь о том, что

Существует еще больше беспорядка, если кто-то установит «Масштабируемое» разрешение в системных настройках macOS-> Дисплеи

, не имея возможности найти какую-либо информацию о том, как ориентироваться в этом "беспорядке".Пока у меня есть следующее, которое я компилирую с clang -framework Cocoa -x objective-c -o grokResolution:

#import <AppKit/AppKit.h>

void ReportRect(CGRect rect, const char *description)
{
    printf("{'x': % 5g, 'y':% 5g, 'width':% 5g, 'height':% 5g, 'name':'%s'}\n",
        rect.origin.x, rect.origin.y,
        rect.size.width, rect.size.height,
        description);
}

int main(int argc, char** argv)
{
    NSScreen *screen = [[NSScreen screens] objectAtIndex:0];

    CGRect looksLike = [screen frame];
    CGRect backing = [screen convertRectToBacking:looksLike];

    ReportRect(looksLike, "looksLike");
    ReportRect(backing, "backing");
    printf("{'backingScaleFactor' : %0.2f}\n", [screen backingScaleFactor]);
}

Мой экран Retina имеет 2560x1600 физических пикселей.Если я использую настройку масштабирования по умолчанию, которую приложение «Системные настройки» предварительно просматривает с «Похоже на 1280 x 800», то программа выдаст следующее:

{'x':     0, 'y':    0, 'width': 1280, 'height':  800, 'name':'looksLike'}
{'x':     0, 'y':    0, 'width': 2560, 'height': 1600, 'name':'backing'}
{'backingScaleFactor' : 2.00}

Так что это кажется правильным.Однако, если я щелкну на следующем параметре масштабирования справа в Системных настройках, а затем перезапущу программу, я получу:

{'x':     0, 'y':    0, 'width': 1440, 'height':  900, 'name':'looksLike'}
{'x':     0, 'y':    0, 'width': 2880, 'height': 1800, 'name':'backing'}
{'backingScaleFactor' : 2.00}

Теперь, в то время как настройка «Похоже» системных настроек выглядит какПри правильном отражении в выводе [screen frame] мое понимание всей системы явно ошибочно, потому что я ожидал, что backingScaleFactor и / или convertRectToBacking будут правильно преобразовывать из поддельного в реальное физическое разрешение.Кажется, backingScaleFactor не корректно корректируется при изменении системных настроек - в этом случае преобразование возвращает больше пикселей, чем на самом деле имеет мое оборудование.

Как правильно преобразовать?Или есть еще один более прямой способ запроса фактического количества физических пикселей, которое имеет дисплей?

(я знаю о system_profiler SPDisplaysDataType | grep Resolution, но мне нужно решение, которое будет работать в рамках существующего исходного кода obj-C.)

1 Ответ

0 голосов
/ 10 декабря 2018

Коэффициент масштабирования всегда является интегральным.Пока что это всегда 1 или 2. Когда-нибудь Apple может представить 3x поддержку дисплея для macOS.

Резервное хранилище не обязательно соответствует физическим пикселям дисплея.Для некоторых «масштабированных» разрешений резервное хранилище на больше , чем количество физических пикселей дисплея.Тогда это уменьшено для фактического показа.Это то, что происходит с вашим вторым примером.

Что касается того, как получить количество физических пикселей дисплея, было несколько недавних вопросов с некоторым обсуждением этого вопроса, и не было четкого ответа.См. этот вопрос и ссылки в комментариях.

...