Как найти профили отображения теперь, когда все в API-интерфейсе ColorSync Manager устарело

Я обновляю приложение OS X, которое использует API-интерфейс ColorSync Manager для получения цветовых профилей для подключенных дисплеев. Письмо было на стене около OS X 10.6, когда все в API было помечено как устаревшее. Долгое время все еще можно было #include <ColorSyncDeprecated.h>, но в последних SDK это невозможно.

Приложение уже использует Little CMS для управления цветовыми пространствами, поэтому мне не нужно много. Как я уже отмечал выше, единственное, для чего он использует ColorSync - это получить профиль основного дисплея, используя CMGetSystemProfile а также NCMGetProfileLocation,

Есть пара вопросов, которые в некоторой степени связаны с этим, но им уже несколько лет, и они не решают проблему:

Есть ли альтернатива этому сейчас в любой 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 как устаревший. Некоторые типы данных и методы есть, но большинство из них не имеет такой индикации. Возможно, это было "предопределено"?

Страницы ColorSync Manager

Вы можете использовать CoreGraphice API

colorSpace = ::CGDisplayCopyColorSpace(::CGMainDisplayID());

тогда с api лайки:

CGColorSpaceCopyICCData    

Вы можете сделать некоторые вещи синхронизации цвета. Я думаю, что это, скорее всего, то, что вы хотите сделать со старым ColorSync API.

Это то, что я делаю, чтобы получить путь к профилю для известного идентификатора прямого отображения.

  1. включает новую платформу ColorSync, так как 10.13 она больше не находится в ApplicationServices
  2. преобразовать идентификатор дисплея в UUID, используя CGDisplayCreateUUIDFromDisplayID
  3. вызвать ColorSyncIterateDeviceProfiles с обратным вызовом
  4. обратный вызов будет вызываться для каждого устройства, и вы получите словарь в качестве параметра с информацией об устройстве, UUID, URL, именем, ...
  5. Я сравниваю свой UUID с UUID в словаре, если я нашел совпадение, я копирую URL из словаря и возвращаю false, чтобы остановить итерацию, если нет, я возвращаю true, чтобы получить обратный вызов для следующего устройства
Другие вопросы по тегам