Можно ли распространять Image Units с моим приложением? - PullRequest
3 голосов
/ 23 сентября 2011

Mac OS X Mavericks

Мне сказали, что проблема была исправлена ​​в Mac OS X 10,9

Оригинал

Я прочитал документацию и не нашел ответа.Он предлагает создавать модули изображения, он требует помещения этого устройства внутрь либо ~/Library/Graphics/Image Units, либо / Library/Graphics/Image Units (помещение устройства изображения внутрь Your.app/Contents/Library/Graphics/Image Units не имеет никакого эффекта).

Есть и другие, не рекомендуемыеКстати, для создания Image Unit, который позволяет распространять cikernels и получать доступ к фильтру из вашего кода.Но это мешает вам создавать неисполняемые фильтры, что приводит к значительному снижению производительности.

Я просмотрел содержимое пакетов приложений, таких как Pixelmator или Acorn, и обнаружил, что они также не используют Image Units.Я надеюсь, что это ошибка, и есть способ распространять единицы изображения в комплекте приложений.

Я ищу решение, которое будет одобрено Mac App Store.

Решение, которое не позволяет использовать неисполняемые фильтры

Из заголовка CIPlugIn: / ** Загружает плагин, указанный его URL.* /

+ (void)loadPlugIn:(NSURL *)url allowNonExecutable:(BOOL)allowNonExecutable
AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_7;

/** Loads a plug-in specified by its URL.

 If allowExecutableCode is NO, filters containing executable code will not be loaded. If YES, any kind of filter will be loaded. */
+ (void)loadPlugIn:(NSURL *)url allowExecutableCode:(BOOL)allowExecutableCode
AVAILABLE_MAC_OS_X_VERSION_10_7_AND_LATER;

Новый метод не указан в официальных документах.Итак, чтобы загрузить пакет, вы просто делаете:

if (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_6)
{
    [CIPlugIn loadPlugIn:[[NSBundle mainBundle] URLForResource:@"YourPlugin" withExtension:@"plugin"]
      allowNonExecutable:YES];
}
else
{
    [CIPlugIn loadPlugIn:[[NSBundle mainBundle] URLForResource:@"YourPlugin" withExtension:@"plugin"]
     allowExecutableCode:YES];
}

К сожалению, если вы попытаетесь использовать CIFilter с платформой QuartzCore (например, с CALayer), произойдет сбой из-за переполнения стека.

frame #0: 0x00007fff8b6a5d36 CoreImage`-[CIFilter copyWithZone:] + 12
frame #1: 0x00007fff8b7d1c7e CoreImage`-[CIPlugInStandardFilter _provideFilterCopyWithZone:] + 18
frame #2: 0x00007fff8b6a5d59 CoreImage`-[CIFilter copyWithZone:] + 47
frame #3: 0x00007fff8b7d1c7e CoreImage`-[CIPlugInStandardFilter _provideFilterCopyWithZone:] + 18
frame #4: 0x00007fff8b6a5d59 CoreImage`-[CIFilter copyWithZone:] + 47
frame #5: 0x00007fff8b7d1c7e CoreImage`-[CIPlugInStandardFilter _provideFilterCopyWithZone:] + 18
frame #6: 0x00007fff8b6a5d59 CoreImage`-[CIFilter copyWithZone:] + 47

1 Ответ

2 голосов
/ 23 сентября 2011

Как и пути к библиотекам, которые вы упоминаете, Mac OS X также будет выглядеть как YourApp.app/Contents/Library.

Я думаю, что все должно работать, если вы установите модуль изображения в YourApp.app/Contents/Library/Graphics/Image Units/.

...