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

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

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

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

Спасибо.


person Paul J. Lucas    schedule 05.05.2009    source источник


Ответы (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, все работает. как и ожидалось.

person Naaff    schedule 05.05.2009
comment
Функции NewCMProfileIterateUPP() и DisposeCMProfileIterateUPP() устарели в Mac OS X 10.5. - person Paul J. Lucas; 05.05.2009
comment
Хорошая точка зрения. Я отредактировал пример кода, чтобы функции NewCMProfileIterateUPP() и DisposeCMProfileIterateUPP() больше не использовались. Надеюсь, это ответит на все для вас. ;) - person Naaff; 05.05.2009