How to implement a Cocoa-based Adobe Photoshop plugin

后端 未结 3 1429
暖寄归人
暖寄归人 2021-02-09 00:32

Cocoa used to work on CS3 with the trick of putting a Cocoa bundle inside the main Carbon plugin bundle, loading it from Carbon and issuing a NSApplicationLoad(). That\'s becaus

相关标签:
3条回答
  • 2021-02-09 00:46

    You have to create a new Loadable Bundle target that contains your nibs and your Cocoa code. Add the bundle product to the Copy Bundle Resources phase of your plugin. Then the code for a filter plugin that loads a Cocoa window with some controls would be:

    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;
    }
    

    This is based on the Craig Hockenberry bundle trick. I'm still testing it but it should work both on CS3 and CS4.

    0 讨论(0)
  • 2021-02-09 00:55

    CS2 will load PowerPC Mach-O code as readily as CS3/CS4. Has anyone tested this Cocoa approach in CS2?

    Currently I use Carbon for CS2/CS3/CS4 as this is guaranteed to work everywhere the plugin loads; and Cocoa for CS5 of course, whether 32 or 64 bit.

    Chris Cox isn't optimistic about Cocoa working in anything other than CS5: http://forums.adobe.com/message/3256555#3256555

    So what's the real deal here? It's pretty hard to ignore advice from the horse's mouth.

    0 讨论(0)
  • 2021-02-09 01:08

    I just started working on writing a Cocoa-based plugin for CS4. Really, there is almost no information out there on this topic, and I've been figuring it out as I go.

    • Start from this Apple example, and make sure you download the whole project, because there are a few little details missing from the text:

    Carbon/Cocoa

    • Pick one of the Photoshop SDK examples (I used ColorMunger), and keep it simple to start, so just try to replace the "About" dialog box, using the Apple example as your template. Once you have that working with no memory issues, you should be on your way.

    I've been a Java and Ruby programmer for 10 years, so my C/C++ foo is rusty, and I'm just learning Objective C as I go. Two "gotchas" I ran into, just in case....

    • do NOT create a controller object in your NIB/XIB file. Because, based on that Apple example, the controller opens up the NIB file in it's init method, and you get a really interesting recursive loop
    • The Apple example is embedding the Cocoa stuff in a Carbon based C app. The Adobe examples are all C++. Don't forget your extern "C" {} in your header file.
    0 讨论(0)
提交回复
热议问题