Как реализовать плагин Adobe Photoshop на основе какао - PullRequest
8 голосов
/ 10 июля 2009

Какао используется для работы на CS3 с хитростью , заключающейся в помещении пакета Какао в основной пакет подключаемых модулей Carbon , загрузке его из Carbon и выдаче NSApplicationLoad (). Это потому, что Photoshop CS3 был только для углерода и использовался для выгрузки пакетов плагинов.

Photoshop CS4 использует какао и имеет собственный пул NSAutorelease в главном потоке.

В Photoshop CS4 очень простые основанные на окнах сгибы / перья, загруженные NSWindowController, работают из коробки.

Но просто добавьте привязку к элементу управления в окне, и вы получите забавные сбои, при необходимости при закрытии окна, при втором использовании плагина или даже при закрытии самого Photoshop.

Почему все работает хорошо, пока я не использую некоторые расширенные функции Какао? Я застрял.

РЕДАКТИРОВАТЬ : Я действительно нашел решение более широкой проблемы «Как использовать Какао в плагине Photoshop CS3 / CS4?». Смотри ниже.

Ответы [ 3 ]

1 голос
/ 10 июля 2009

Вы должны создать новую цель Loadable Bundle , которая содержит ваши перья и код Какао. Добавьте пакет продукта к фазе Copy Bundle Resources вашего плагина. Тогда код для плагина фильтра, который загружает окно Какао с некоторыми элементами управления, будет:

Boolean DoUI (void) {

    // Create the CF Cocoa bundle
    CFBundleRef pluginBundle;
    CFURLRef cocoaBundleURL;
    pluginBundle = CFBundleGetBundleWithIdentifier(CFSTR("com.example.plugin"));
    cocoaBundleURL = CFBundleCopyResourceURL(pluginBundle, 
                                             CFSTR("Cocoa_bundle"), 
                                             CFSTR("bundle"), 
                                             NULL);
    CFBundleRef cocoaBundleRef;
    cocoaBundleRef = CFBundleCreate(kCFAllocatorDefault, cocoaBundleURL);
    CFRelease(cocoaBundleURL);

    // start Cocoa (for CS3)
    NSApplicationLoad(); 

    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];

    // load the cocoa bundle by identifier
    NSBundle* cocoaBundle;
    cocoaBundle = [NSBundle bundleWithIdentifier:@"com.example.plugin.cocoa"];

    // load the window controller from the bundle
    Class testControllerClass;
    testControllerClass = [cocoaBundle classNamed:@"MyWindowController"];

    MyWindowController* winController = [[testControllerClass alloc] init];
    [NSApp runModalForWindow:[winController window]];
    [[winController window] performClose:nil];
    [winController release];

    // release the bundle
    CFRelease(cocoaBundleRef);

    [pool release];

    return 1;
}

Это основано на уловке Крэйга Хоккенберри . Я все еще тестирую его, но он должен работать как на CS3, так и на CS4.

0 голосов
/ 03 ноября 2010

CS2 загрузит код PowerPC Mach-O так же быстро, как CS3 / CS4. Кто-нибудь проверял этот подход с какао в CS2?

В настоящее время я использую Carbon для CS2 / CS3 / CS4, поскольку он гарантированно работает везде, где загружается плагин; и какао для CS5, конечно, будь то 32 или 64 бит.

Крис Кокс не испытывает оптимизма по поводу того, что Какао работает во всем, кроме CS5: http://forums.adobe.com/message/3256555#3256555

Так в чем же дело? Довольно сложно игнорировать советы изо рта лошади.

0 голосов
/ 10 июля 2009

Я только начал работать над написанием плагина на основе какао для CS4. На самом деле, по этой теме почти нет информации, и я выясняю это по ходу дела.

  • Начните с этого примера Apple и убедитесь, что вы скачали весь проект, поскольку в тексте отсутствуют некоторые мелкие детали:

Carbon / Cocoa

  • Выберите один из примеров Photoshop SDK (я использовал ColorMunger) и сделайте его простым для запуска, поэтому попробуйте заменить диалоговое окно «О программе», используя пример Apple в качестве шаблона. После того, как у вас это работает без проблем с памятью, вы должны быть в пути.

Я работаю программистом на Java и Ruby в течение 10 лет, так что мой foo на C / C ++ ржавый, и я просто изучаю Objective C на ходу. Два "гуча", с которыми я столкнулся, на всякий случай ....

  • НЕ создавайте объект контроллера в вашем файле NIB / XIB. Потому что, на основе этого примера Apple, контроллер открывает файл NIB в своем методе init, и вы получаете действительно интересный рекурсивный цикл
  • Пример Apple - встраивание содержимого Какао в приложение на основе углерода. Примеры Adobe все C ++. Не забывайте свой extern "C" {} в заголовочном файле.
...