Как реализовать плагин Adobe Photoshop на основе Cocoa
-
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
Так в чем же здесь дело на самом деле?Довольно трудно проигнорировать совет из первых уст.