我正在处理需要在主机上加载现有第三方NPAPI插件的独立守护程序可执行文件。我想要做的是将生成的视图从插件渲染到纹理/表面。
它需要在Mac和Windows上运行,但由于我是一个沉重的Mac用户,我决定首先构建Mac版本。我们没有此插件的源代码 - 这是外部供应商提供给我们的东西 - 所以它是一个黑盒实现。
在网络上,该插件的工作方式与flash非常相似。您在链接到某个mimetype(即应用程序/ flash)的网页中嵌入了一个区域,并加载了插件,而插件又会指示插件加载某个文件(想想一个SWF),然后再渲染它。
我现在正在做的是:
1. Open the library (Bundle) and extract NP_Initialize etc.
2. Call NP_Initialize -> returns the object with NPP function pointers etc
3. Call NPP_New (this calls a set of NPP functions) -> ultimately returns NPERR_NO_ERROR.
由于NPERR_NO_ERROR是预期的响应,我假设这三个步骤已成功完成。
在NPP_New期间,插件会请求Cocoa事件模型和Core Animation(或者Core Graphics,如果我为Core Animation返回false)渲染模式。
然后我打电话给:
4. NPP_SetWindow
5. Once the window is set, I load an online file with CURL, and call NPP_NewStream/WriteReady/Write and DestroyStream.
从NPAPI文档中我可以看到,NewStream / WriteStream / etc函数基本上将文件加载到插件的内存中,因此可以呈现它。
该插件在浏览器中支持Core Animation和Core Graphics,并且在支持NPAPI插件的浏览器中运行良好。
完成上述所有操作后,我尝试渲染到纹理,但在Core Graphics模式下,我继续使用CGContextRef从NPP_Event函数调用中获得错误响应。在Core Animation模式下运行时,我使用renderInContext将纹理渲染到位图,但整个图像保持空白/透明。
这是一个很长的镜头,但有没有人有任何想法?
答案 0 :(得分:2)
我假设你不使用这个UI线程,如果你在不同的线程中尝试你的代码,如果是这样的话。但是,它可能与许多事情有关,从图像本身开始(因为它是空的/透明的),这就是我使用的:
UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, [[UIScreen mainScreen] scale]);
[view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext(); //after this you should see the image
以下评论与Mozilla CoreAnimationDrawingModel plugin
有关(您的黑匣子插件可能基于它?)
确保使用Flash 10.1+,因为在该版本之前不支持Core Animation绘图模型(您加载了SWF)。
请注意!如果你的黑盒子插件使用QTMovieLayer呈现它会失败,因为它不支持renderInContext。
关于您主题的其他有趣读物(自2010年起):Core Animation