Замена CMNewProfileSearch на устаревший 64-битный код

У меня есть существующий код, который использует CMNewProfileSearch затем найдите итерируйте цветовые профили в системе, получая их имена и полные пути. К несчастью, CMNewProfileSearch устарела в Mac OS X 10.5 и недоступна при компиляции 64-битного приложения.

При чтении справочника ColorSync Manager 2.5 кажется, что новый способ перебора установленных цветовых профилей заключается в использовании CMIterateColorSyncFolder функция.

  1. Это правда?
  2. Есть ли способ Какао сделать то, что я хочу вместо этого?
  3. У кого-нибудь есть пример кода?

Благодарю.

1 ответ

Решение
  1. Да. Как вы указали, в справочнике ColorSync Manager говорится следующее:

    Функция CMNewProfileSearch не в полной мере использует оптимизированный поиск профилей, доступный начиная с ColorSync версии 2.5. Вместо этого используйте CMIterateColorSyncFolder.

  2. CMIterateColorSyncFolder это официальный способ сделать это. Кроме того, это также оптимизированный способ.

  3. Из примера кода Apple ImageApp:

РЕДАКТИРОВАТЬ: я изменил пример кода, чтобы удалить NewCMProfileIterateUPP а также DisposeCMProfileIterateUPP,


    // Callback routine with a description of a profile that is 
    // called during an iteration through the available profiles.
    //
    static OSErr profileIterate (CMProfileIterateData *info, void *refCon)
    {
        NSMutableArray* array = (NSMutableArray*) refCon;

        Profile* prof = [Profile profileWithIterateData:info];
        if (prof)
            [array addObject:prof];

        return noErr;
    }

    // return an array of all profiles
    //
    + (NSArray*) arrayOfAllProfiles
    {
        NSMutableArray* profs=[[NSMutableArray arrayWithCapacity:0] retain];
        CMIterateColorSyncFolder(profileIterate, NULL, 0L, profs);
        return (NSArray*)profs;
    }

Оказывается, не нужно NewCMProfileIterateUPP а также DisposeCMProfileIterateUPP так что, насколько я могу судить, их ничем не заменили. Вместо этого вы можете определить функцию обратного вызова с сигнатурой, которая соответствует profileIterate, выше. Затем вы можете просто передать функцию обратного вызова напрямую CMIterateColorSyncFolder,

Я проверил свои изменения в ImageApp на Mac OS X 10.5, он работает как положено.

Другие вопросы по тегам