#events #cgcontext #npapi
#Мероприятия #cgcontext #npapi
Вопрос:
Я пытаюсь нарисовать png в моем (NPAPI) веб-плагине для Mac на основе basic-plugin.
Я хотел бы перерисовать плагин на a NPCocoaEventMouseDown
, но у меня возникли проблемы с извлечением cgContextRef
.
Приведенный ниже метод работает для NPCocoaEventDrawRect
, но не для NPCocoaEventMouseDown
, потому что тогда я не могу использовать event->data.draw.context
. Я попытался получить cgContextRef
с помощью
CGContextRef cgContext = (NP_CGContext*)currentInstance->window.window
но, похоже, это не сработало. Вот моя функция:
void drawPlugin(NPP instance, NPCocoaEvent* event)
{
char* path = "/shot.png";
if(!instance || !event)
return;
PluginInstance* currentInstance = (PluginInstance*)(instance->pdata);
//CGContextRef cgContext = event->data.draw.context; //works with DrawRect
CGContextRef cgContext = (NP_CGContext*)currentInstance->window.window;
if (!cgContext) {
return;
}
float windowWidth = currentInstance->window.width;
float windowHeight = currentInstance->window.height;
CGContextSaveGState(cgContext);
//.....
CGContextRestoreGState(cgContext);
}
И здесь вызывается функция:
int16_t NPP_HandleEvent(NPP instance, void* event)
{
NPCocoaEvent* cocoaEvent = (NPCocoaEvent*)event;
if (cocoaEvent amp;amp; (cocoaEvent->type == NPCocoaEventDrawRect)) {
return 1;
}
if(cocoaEvent)
{
switch (cocoaEvent->type) {
case NPCocoaEventDrawRect:
drawPlugin(instance, (NPCocoaEvent*)event);
break;
case NPCocoaEventMouseDown:
drawPlugin(instance, (NPCocoaEvent*)event);
break;
default:
break;
}
return 1;
}
return 0;
}
Как я могу получить cgContextRef
in a NPCocoaEventMouseDown
?
Ответ №1:
Я хотел бы перерисовать плагин в NPCocoaEventMouseDown
Как я могу получить CGContextRef в NPCocoaEventMouseDown?
Вы не можете сделать ни одну из этих вещей. Вы вызываете NPN_InvalidateRect в своем обработчике наведения курсора мыши и ждете обратного вызова draw.
Я попытался получить CGContextRef с помощью
CGContextRef CGContext = (NP_CGContext*)Текущее состояние->window.window
но, похоже, это не сработало.
Поскольку это поле всегда равно НУЛЮ в модели событий Cocoa, как описано в спецификации событий Cocoa. Вам явно предоставляется CGContextRef только во время вызова paint, и он должен быть действительным только в течение этого вызова. (На случай, если вы думаете о его кэшировании для последующего использования: не делайте этого. Результаты будут иметь совершенно неопределенное поведение, вероятно, не будут работать, на них, безусловно, нельзя полагаться на работу, и почти наверняка в какой-то момент в каком-то браузере возникнут сбои.)
Комментарии:
1. На случай, если вам интересно, ошибается ли сморган, это не так. Вы можете рисовать только по указанию любого плагина без окон, и coregraphics на Mac соответствует требованиям. Даже со старой реализацией Carbon они не хотели, чтобы вы рисовали всякий раз, когда это просто получилось, чтобы работать немного лучше, вот и все. Дыхание огня ( firebreath.org ) обеспечивает отличную абстракцию для этого. Вы можете, кстати, запросить событие рисования, вызвав NPN_InvalidateRect для события mousedown .
2. Спасибо сморгану и Таксилиану. Я новичок в разработке веб-плагина, и иногда ссылки и документация мне не совсем понятны, поэтому этот ответ действительно помогает мне.
3. Новый вопрос, где и как я могу вызвать NPN_InvalidateRect?