2009-07-10 13 views
8

Cocoa solía trabajar en CS3 con el trick of putting a Cocoa bundle inside the main Carbon plugin bundle, cargándolo desde Carbon y emitiendo un NSApplicationLoad(). Esto se debe a que Photoshop CS3 era solo de carbono y se usa para descargar los paquetes de complementos.Cómo implementar un complemento Adobe Photoshop basado en cacao

Photoshop CS4 usa Cocoa y tiene su propio grupo NSAutorelease en el hilo principal.

En Photoshop CS4 las xibs/nibs basadas en ventanas muy simples cargadas por un NSWindowController funcionan de la caja.

Pero simplemente agregue un enlace a un control en la ventana y obtendrá bloqueos divertidos, opcionalmente al cerrar la ventana, o la segunda vez que usa el complemento, o incluso al cerrar Photoshop.

¿Por qué todo parece funcionar bien hasta que utilizo algunas características avanzadas de Cocoa? Estoy atascado.

EDIT: Realmente he encontrado la solución al problema más amplio "¿Cómo usar Cocoa en un plugin Photoshop CS3/CS4?". Vea abajo.

Respuesta

1

usted tiene que crear una nueva cargable Bundle de destino que contiene sus puntas y su código de cacao. Agregue el producto del paquete a la fase Copy Bundle Resources de su complemento. A continuación, el código de un filtro de plugin que carga una ventana de cacao con algunos controles sería:

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

Esto se basa en el Craig Hockenberry bundle trick. Todavía estoy probándolo, pero debería funcionar tanto en CS3 como en CS4.

+0

@IlDan - ¿ha podido obtener enlaces de cacao para trabajar dentro de su complemento? Mira mi pregunta sobre el desbordamiento de pila sobre el cacao en el choque de carbono. Estoy teniendo problemas con eso y cualquier interior sería apreciado. –

0

Acabo de empezar a trabajar en la escritura de un complemento basado en Cocoa para CS4. Realmente, casi no hay información sobre este tema, y ​​he estado averiguando sobre la marcha.

  • inicio de este ejemplo de Apple, y asegúrese de descargar todo el proyecto, ya que hay algunos pequeños detalles que faltan en el texto:

Carbon/Cocoa

  • elegir una de las Ejemplos de Photoshop SDK (utilicé ColorMunger), y que sea sencillo comenzar, así que simplemente intente reemplazar el cuadro de diálogo "Acerca de", utilizando el ejemplo de Apple como su plantilla. Una vez que tenga eso funcionando sin problemas de memoria, debe estar en su camino.

He sido programador de Java y Ruby durante 10 años, por lo que mi C/C++ foo está oxidado, y estoy aprendiendo Objective C sobre la marcha. Dos "errores" me encontré, por las dudas ...

  • NO cree un objeto controlador en su archivo NIB/XIB. Porque, basado en ese ejemplo de Apple, el controlador abre el archivo NIB en su método init, y obtienes un bucle recursivo realmente interesante
  • El ejemplo de Apple está incorporando las cosas Cocoa en una aplicación C basada en Carbono. Los ejemplos de Adobe son todos C++. No olvide su extern "C" {} en su archivo de encabezado.
0

CS2 cargará el código PowerPC Mach-O tan fácilmente como CS3/CS4. ¿Alguien ha probado este enfoque de Cocoa en CS2?

Actualmente uso Carbon para CS2/CS3/CS4, ya que está garantizado que funciona en cualquier lugar que cargue el plugin; y Cocoa para CS5, por supuesto, ya sea de 32 o 64 bits.

Chris Cox no es optimista sobre Cocoa trabajar en otra cosa que no sea CS5: http://forums.adobe.com/message/3256555#3256555

Entonces, ¿cuál es el verdadero negocio aquí? Es bastante difícil ignorar los consejos de la boca del caballo.

Cuestiones relacionadas