如何实现基于Cocoa的Adobe Photoshop插件

8

以前,使用在Carbon插件捆绑包中放置Cocoa捆绑包的技巧,从Carbon加载并发出NSApplicationLoad(),Cocoa可以在CS3上工作。这是因为Photoshop CS3仅限于Carbon,会卸载插件捆绑包。

Photoshop CS4使用Cocoa,并在主线程上设置了自己的NSAutorelease池。

在Photoshop CS4中,非常简单的基于窗口的xib/nib由NSWindowController直接加载即可正常工作。

但添加一个控件到窗口的绑定,会导致奇怪的崩溃,可能是在关闭窗口时,第二次使用插件时,甚至是关闭Photoshop本身时。

为什么一切似乎都正常工作,直到我使用了一些高级Cocoa功能?我被卡住了。

编辑:我已经真正找到了解决方案,用于更广泛的问题“如何在Photoshop CS3/CS4插件中使用Cocoa”。请参见下文。

3个回答

1

你需要创建一个新的 Loadable Bundle 目标,其中包含你的 Nibs 和 Cocoa 代码。将该 bundle 产品添加到插件的 Copy Bundle Resources 阶段中。然后,一个加载带有一些控件的 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;
}

这是基于Craig Hockenberry的bundle trick。我仍在测试中,但它应该适用于CS3和CS4。


@IlDan - 你能否在你的插件中成功使用Cocoa绑定?请看我的stackoverflow关于Cocoa在carbon中崩溃的问题。我遇到了麻烦,任何内部信息将不胜感激。 - Jess Bowers

0

我刚开始写一个基于Cocoa的CS4插件。实际上,这个主题几乎没有什么信息,所以我一边摸索一边学习。

  • 从这个苹果示例开始,并确保你下载了整个项目,因为文本中有一些细节缺失:

Carbon/Cocoa

  • 选择Photoshop SDK示例之一(我使用了ColorMunger),并保持简单,首先尝试替换“关于”对话框,使用苹果示例作为模板。一旦你完成了这个工作并且没有内存问题,你就可以继续前进了。

我是一名Java和Ruby程序员,已经有10年的编程经验,所以我的C/C++技能有点生疏,我正在学习Objective C。以下是我遇到的两个“坑”,以防万一...

  • 不要在你的 NIB/XIB 文件中创建控制器对象。因为根据 Apple 的示例,控制器会在其 init 方法中打开 NIB 文件,这会导致一个非常有趣的递归循环。
  • Apple 的示例将 Cocoa 东西嵌入到基于 Carbon 的 C 应用程序中。Adobe 的示例都是 C++。不要忘记在头文件中加上 extern "C" {}。

0

CS2将像CS3/CS4一样轻松加载PowerPC Mach-O代码。有人在CS2中测试过这种Cocoa方法吗?

目前,我在CS2/CS3/CS4中使用Carbon,因为这可以保证插件在加载的任何地方都能正常工作;当然,在CS5中使用Cocoa,无论是32位还是64位。

Chris Cox对于Cocoa在CS5以外的版本中是否能正常工作并不乐观: http://forums.adobe.com/message/3256555#3256555

那么这里的真实情况是什么呢?很难忽视来自权威人士的建议。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接