Как реализовать плагин Adobe Photoshop на основе Cocoa

StackOverflow https://stackoverflow.com/questions/1108550

  •  12-09-2019
  •  | 
  •  

Вопрос

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

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

В Photoshop CS4 очень простые оконные xibs / nibs, загружаемые NSWindowController, работают "из коробки".

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

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

Редактировать:Я действительно нашел решение более широкой проблемы "Как использовать Cocoa в плагине Photoshop CS3 / CS4?".Смотрите ниже.

Это было полезно?

Решение

Вы должны создать новый Загружаемый Пакет целевой объект, содержащий ваши nibs и ваш Cocoa-код.Добавьте продукт пакета в Копирование ресурсов пакета фаза вашего плагина.Тогда код для плагина filter, который загружает окно Cocoa с некоторыми элементами управления, будет следующим:

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.

Другие советы

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

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

Углерод/Какао

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top