我试图根据basic-plugin在我的(NPAPI)Mac插件中绘制一个png。
我想在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 && (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
中的NPCocoaEventMouseDown
?
答案 0 :(得分:1)
我想在NPCocoaEventMouseDown
上重绘插件如何在NPCocoaEventMouseDown中检索cgContextRef?
你无法做到这两件事。您在鼠标按下处理程序中调用NPN_InvalidateRect,并等待绘制回调。
我试图用
检索cgContextRefCGContextRef cgContext =(NP_CGContext *)currentInstance-> window.window
但这似乎不起作用。
因为Cocoa事件模型下该字段始终为NULL,如Cocoa事件规范中所述。在绘制调用期间,您只是显式提供了CGContextRef,并且只需要在该调用期间有效。 (如果您正在考虑将其缓存以供以后使用:不要。结果将是完全未定义的行为,可能无法正常工作,当然不能依赖于工作,并且几乎肯定会在某些时候导致崩溃在某些浏览器中。)