NPAPI плагин для самостоятельного рендеринга в Safari (32-битный или 64-битный) - PullRequest
0 голосов
/ 13 сентября 2011

Я работаю в Safari, поверх OSX, использую основную графику, и у меня есть плагин, запускающий два потока (основной поток и поток таймера рендеринга). Поток таймера рендеринга вызывает NPN_InvalidateRect, в то время как основной поток плагина обрабатывает соответствующее событие и перерисовывает себя. Однако в сафари 32-битной версии это выглядит иначе, чем в сафари 64-битной:

  • 64 бита (модель событий какао): требуется NPN_InvalidateRect + NPN_ForceRedraw = правильная перерисовка
  • 32 бит (какао, если поддерживается, в противном случае углерод): NPN_InvalidateRect = правильная перерисовка однако выполнение обоих NPN_InvalidateRect + NPN_ForceRedraw (как в 64-битном случае) вызывает мерцание изображения.

Вопросы:

  1. Есть ли лучший способ заставить плагин отображать себя, придерживаясь нативной NPAPI, основной графики и поддержки моделей событий с углеродом и какао.

  2. Если нет, то как я могу определить во время выполнения, работает ли браузер как 32-разрядное или 64-разрядное приложение, чтобы я мог выбрать, какие функции вызова NPN вызывают.

Спасибо

(перекрестная публикация на Firebreath, я буду публиковать ответы в обоих местах)

1 Ответ

1 голос
/ 14 сентября 2011

Прежде всего, это:

Поток таймера рендеринга вызывает "NPN_InvalidateRect"

Это серьезная проблема, если только вы действительно не имеете в виду, что ваш поток таймера рендеринга вызывает NPN_InvalidateRect для вызова основного потока плагина. NPAPI явно не является потокобезопасным, и вы должны вызывать такие методы, как NPN_InvalidateRect в основном потоке.

Во-вторых, вам действительно не следует вызывать NPN_ForceRedraw. В Chromium, Firefox OOP, WebKit2 и почти наверняка в режиме OOP Safari (который вы получаете в 64-битной среде) NPN_ForceRedraw воспринимается как запрет; Концепция принудительного перерисовки идет вразрез со всей моделью плагинов ООП. Во всех случаях вам просто нужно вызвать NPN_InvalidateRect и доверить браузеру перезвонить вам. В мире OOP-плагинов вы не должны ожидать, что вы сможете заставить браузер отображать плагин в любой момент.

...