Как избежать CGDisplayModeCopyPixelEncoding для получения BPP? - PullRequest
1 голос
/ 21 ноября 2011

Мне нужно, чтобы моя программа работала в Mac OS 10.5 - 10.7, однако некоторые системные функции устарели с 10.5.Моя проблема в том, что CGDisplayBitsPerPixel не существует с 10.6, а новая функция CGDisplayModeCopyPixelEncoding не работает под 10.5.

Как я могу сделать свою программу доступной для всех этих версий Mac OS?

Я мог бы использовать #ifdef _xxx_ для решения этой проблемы, но это означало бы, что мне нужны две разные сборки моего приложения.и мне нужен один.

Вот как я устанавливаю VideoMode:

  1. Получение displayID
  2. Получение всех доступных режимов и отправка их в VideoModeList
  3. Получение ширины экрана, высоты и bpp

Пример кода:

VideoModeList->setDesktop(rect(screen_w, screen_h), screen_bpp);
VideoModeList->setEffectiveDesktop(rect(screen_w, screen_h), screen_bpp);

UPD (поскольку новые пользователи не могут публиковать ответы на свои вопросы в течение 8 часов): я думаю,Я наконец нашел способ сделать это.Я избежал CGDisplayBitsPerPixel вместо этого.Вот фрагмент кода:

// That's how you know what OS you are dealing with in runtime instead of compiletime
bool macOSX_10_6_orHigher = (CGDisplayCopyAllDisplayModes != NULL);

if (macOSX_10_6_orHigher)
{
  // This function uses CGDisplayModeCopyPixelEncoding and CGDisplayCopyDisplayMode
  // to determine BPP.
  screenBPP = getDisplayBitsPerPixel(displayID);
}
else
{
  // This function in deprecated, bit it is still there, so you will get a warning
  // instead of error
  CFDictionaryRef = currentDisplayMode = CGDisplayCurrentMode(mode);
  CFNumberGetValue((CFNumberRef)CFDictionaryGetValue(currentDisplayMode, kCGDisplayBitsPerPixel), kCFNumberIntType, &screenBPP);
}

PS Если вы хотите предложить другое решение, я все еще слежу за темой, и мы можем получить обсуждение.PPS Спасибо за ваш интерес к этому вопросу и спасибо администратору, который исправил мой 1-й пост.

Ответы [ 3 ]

1 голос
/ 21 февраля 2013

Согласно https://developer.apple.com/library/mac/#documentation/developertools/conceptual/cross_development/Using/using.html вы можете использовать __MAC_OS_X_VERSION_MAX_ALLOWED, например:

#if __MAC_OS_X_VERSION_MAX_ALLOWED >= 1050
  screenBPP = DisplayBitsPerPixel (displayID);
#else
  screenBPP = CGDisplayBitsPerPixel (displayID);
#endif
1 голос
/ 04 ноября 2015

Новые функции CGDisplayCopyDisplayMode и CGDisplayCopyAllDisplayModes, как известно, возвращают CGDisplayModeRef.И я был удивлен, что API не предоставляет прямой функции для получения BitsPerPixel.Пока CGDisplayModeCopyPixelEncoding устарел в OS X v10.11.

Затем я разобрал CGDisplayModeGetWidth и увидел, как параметр, полученный из CGDisplayModeRef (короткий):

movq   0x10(%rdi), %rdi          ; get CFDictionaryRef from CGDisplayModeRef
leaq   -0x103fd9f2(%rip), %rsi   ; @"Width"
callq  0x7fff8812570e            ; symbol stub for: CFDictionaryGetValue

Я знаю, это выглядит ужаснои Apple может изменить API в любое время, но сейчас я могу получить любой из параметров из словаря режимов:

CGDisplayModeRef mode = CGDisplayCopyDisplayMode(display);
CFDictionaryRef dict = (CFDictionaryRef)*((int64_t *)mode + 2);
CFNumberRef num;
int bpp;
if (CFGetTypeID(dict) == CFDictionaryGetTypeID()
    && CFDictionaryGetValueIfPresent(dict, kCGDisplayBitsPerPixel, (const void**)&num))
{
    CFNumberGetValue(num, kCFNumberSInt32Type, (void*)&bpp);
}
CFRelease(mode);
0 голосов
/ 12 июня 2012

Я пытался сделать что-то подобное, используя c ++ на MacOS 10.7, используя gcc 4.5

if (CGDisplayCopyAllDisplayModes != NULL)
  screenBPP = DisplayBitsPerPixel (displayID); // MacOS > 10.5
else
  screenBPP = CGDisplayBitsPerPixel (displayID);

И обнаружил ошибку ниже.

error: 'CGDisplayBitsPerPixel' was not declared in this scope

Если Objective-C не справится с этим иначе, я не думаю, что ваше решение будет работать. Для запуска на 10.5+ вы можете напрямую связать с SDK для 10.5 (только 32-битный?). Варианты ниже рекомендуются в wxwidgets wiki .

-isysroot /Developer/SDKs/MacOSX10.5.sdk -mmacosx-version-min=10.5

10.5 SDK не является частью Xcode 4. Инструкции по установке SDK для MacOS 10.5 на Lion доступны здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...