2009-07-10 35 views
8

Ca cao được sử dụng để làm việc trên CS3 với trick of putting a Cocoa bundle inside the main Carbon plugin bundle, tải nó từ Carbon và phát hành NSApplicationLoad(). Đó là bởi vì Photoshop CS3 là Carbon-only và được sử dụng để dỡ bỏ các gói plugin.Cách triển khai plugin Adobe Photoshop dựa trên Cocoa

Photoshop CS4 sử dụng Cocoa và có hồ bơi NSAutorelease riêng tại chỗ trên sợi chính.

Trên Photoshop CS4 rất đơn giản dựa trên cửa sổ xibs/nibs nạp bởi một công việc NSWindowController ra khỏi hộp.

Nhưng chỉ cần thêm ràng buộc vào điều khiển trên cửa sổ và bạn sẽ gặp phải sự cố vui nhộn, tùy chọn khi bạn đóng cửa sổ hoặc lần thứ hai bạn sử dụng plugin hoặc thậm chí khi đóng Photoshop.

Tại sao mọi thứ dường như hoạt động tốt cho đến khi tôi sử dụng một số tính năng Ca cao nâng cao? Tôi bị kẹt.

EDIT: Tôi thực sự đã tìm thấy chính mình giải pháp cho vấn đề rộng hơn "Cách sử dụng Cocoa trong plugin Photoshop CS3/CS4?". Xem bên dưới.

Trả lời

1

Bạn phải tạo một mục tiêu mới Có thể tải gói có chứa mã ngòi và mã Cocoa của bạn. Thêm sản phẩm gói vào phần Sao chép tài nguyên gói của plugin của bạn. Sau đó, mã cho plugin bộ lọc tải cửa sổ ca cao có một số điều khiển sẽ là:

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

Điều này dựa trên Craig Hockenberry bundle trick. Tôi vẫn đang thử nghiệm nó nhưng nó sẽ làm việc cả trên CS3 và CS4.

+0

@IlDan - bạn đã có thể nhận được các ràng buộc cacao để hoạt động trong plugin của mình chưa? Xem câu hỏi tràn ngăn xếp của tôi về ca cao trong sự cố cacbon. Tôi đang gặp rắc rối w/đó và bất kỳ bên trong sẽ được đánh giá cao. –

0

Tôi vừa bắt đầu viết một plugin dựa trên Cocoa cho CS4. Thực sự, hầu như không có thông tin nào về chủ đề này, và tôi đã tìm ra nó khi tôi đi.

  • Bắt đầu từ ví dụ của Apple này, và chắc chắn rằng bạn tải về toàn bộ dự án, vì có một vài chi tiết nhỏ bị mất tích từ các văn bản:

Carbon/Cocoa

  • Chọn một trong các Ví dụ về Photoshop SDK (tôi đã sử dụng ColorMunger) và giữ cho nó đơn giản để bắt đầu, vì vậy chỉ cần cố gắng thay thế hộp thoại "Giới thiệu", sử dụng ví dụ của Apple làm mẫu của bạn. Một khi bạn đã làm việc mà không có vấn đề bộ nhớ, bạn nên trên con đường của bạn.

Tôi đã là một lập trình viên Java và Ruby trong 10 năm, vì vậy, C/C++ foo của tôi bị gỉ và tôi chỉ đang học Mục tiêu C khi tôi đi. Hai "gotchas" tôi gặp phải, chỉ trong trường hợp ....

  • KHÔNG tạo đối tượng điều khiển trong tệp NIB/XIB của bạn. Bởi vì, dựa trên ví dụ của Apple, trình điều khiển mở tệp NIB theo phương thức init của nó và bạn nhận được một vòng lặp đệ quy thực sự thú vị
  • Ví dụ của Apple đang nhúng nội dung Cocoa vào ứng dụng C dựa trên C. Các ví dụ Adobe đều là C++. Đừng quên "C" {} bên ngoài trong tệp tiêu đề của bạn.
0

CS2 sẽ tải mã Mach-O PowerPC dễ dàng như CS3/CS4. Có ai đã thử nghiệm cách tiếp cận Ca cao này trong CS2 không?

Hiện tại tôi sử dụng Carbon cho CS2/CS3/CS4 vì điều này được đảm bảo hoạt động ở mọi nơi tải plugin; và Ca cao cho CS5 tất nhiên, dù 32 hay 64 bit.

Chris Cox là không lạc quan về Cocoa làm việc trong bất cứ điều gì khác hơn CS5: http://forums.adobe.com/message/3256555#3256555

Vì vậy, thực sự đối phó là những gì ở đây? Thật khó để bỏ qua lời khuyên từ miệng con ngựa.

Các vấn đề liên quan