Как найти профили отображения теперь, когда все в API-интерфейсе ColorSync Manager устарело
Я обновляю приложение OS X, которое использует API-интерфейс ColorSync Manager для получения цветовых профилей для подключенных дисплеев. Письмо было на стене около OS X 10.6, когда все в API было помечено как устаревшее. Долгое время все еще можно было #include <ColorSyncDeprecated.h>
, но в последних SDK это невозможно.
Приложение уже использует Little CMS для управления цветовыми пространствами, поэтому мне не нужно много. Как я уже отмечал выше, единственное, для чего он использует ColorSync - это получить профиль основного дисплея, используя CMGetSystemProfile
а также NCMGetProfileLocation
,
Есть пара вопросов, которые в некоторой степени связаны с этим, но им уже несколько лет, и они не решают проблему:
- Устаревшие функции ColorSync Manager: предлагает использовать Little CMS для управления цветом; не предлагает альтернативы для поиска системных профилей.
- Замена CMNewProfileSearch на 64-разрядный код без устаревших требований: задан шесть лет назад, в 2009 году; рекомендует использовать функции, которые теперь также устарели.
Есть ли альтернатива этому сейчас в любой OS X Framework или Apple просто решила, что никто не должен знать профиль своего дисплея?
4 ответа
The new ColorSync API is defined in
/System/Library/Frameworks/ApplicationServices.framework/Frameworks/ColorSync.framework/Headers
in
ColorSync.h
ColorSyncBase.h
ColorSyncCMM.h
ColorSyncDeprecated.h
ColorSyncDevice.h
ColorSyncProfile.h
ColorSyncTransform.h
and wasn't documented anywhere by Apple the last time I looked.
Кажется, они забыли объявить
CFUUIDRef CGDisplayCreateUUIDFromDisplayID (uint32_t displayID);
также.
Я не нашел никаких средств определения местоположения профилей с использованием текущих OS X API, поэтому пришлось жестко их кодировать:
#define COLORSYNC_DIR_NETWORK "/Network/Library/ColorSync/Profiles/"
#define COLORSYNC_DIR_SYSTEM "/System/Library/ColorSync/Profiles/"
#define COLORSYNC_DIR_LOCAL "/Library/ColorSync/Profiles/"
#define COLORSYNC_DIR_USER "/Library/ColorSync/Profiles/"
Текущие страницы документации Apple не помечают ColorSync Manager как устаревший. Некоторые типы данных и методы есть, но большинство из них не имеет такой индикации. Возможно, это было "предопределено"?
Вы можете использовать CoreGraphice API
colorSpace = ::CGDisplayCopyColorSpace(::CGMainDisplayID());
тогда с api лайки:
CGColorSpaceCopyICCData
Вы можете сделать некоторые вещи синхронизации цвета. Я думаю, что это, скорее всего, то, что вы хотите сделать со старым ColorSync API.
Это то, что я делаю, чтобы получить путь к профилю для известного идентификатора прямого отображения.
- включает новую платформу ColorSync, так как 10.13 она больше не находится в ApplicationServices
- преобразовать идентификатор дисплея в UUID, используя CGDisplayCreateUUIDFromDisplayID
- вызвать ColorSyncIterateDeviceProfiles с обратным вызовом
- обратный вызов будет вызываться для каждого устройства, и вы получите словарь в качестве параметра с информацией об устройстве, UUID, URL, именем, ...
- Я сравниваю свой UUID с UUID в словаре, если я нашел совпадение, я копирую URL из словаря и возвращаю false, чтобы остановить итерацию, если нет, я возвращаю true, чтобы получить обратный вызов для следующего устройства