我正在处理一个独立的守护程序可执行文件,该可执行文件需要在主机上加载现有的第三方NPAPI插件。我想做的是将插件生成的 View 渲染到纹理/表面。
它需要同时在Mac和Windows上运行,但是由于我是Mac的重度用户,因此我决定首先构建Mac版本。我们没有此插件的源代码-这是外部供应商提供给我们的东西-因此它是黑盒实现。
在网络上,该插件的工作方式与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,则返回Core Graphics))呈现模式。
然后我调用:
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插件的浏览器中运行良好。
完成上述所有操作后,我尝试渲染为纹理,但是在“核心图形”模式下,使用CGContextRef从NPP_Event函数调用返回的错误响应仍然不断。在“核心动画”模式下运行时,我使用renderInContext将纹理渲染为位图,但整个图像保持空白/透明。
这是一个远景,但是有人有什么想法吗?
最佳答案
我假设您没有使用此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+,因为该版本(加载SWF)之前不支持Core Animation绘图模型。
笔记!如果您的黑盒插件使用QTMovieLayer渲染,则应该失败,因为renderInContext不支持它。
关于您的主题的其他有趣读物(从2010年开始):Core Animation
关于cocoa - 无法在Mac应用中加载NPAPI插件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31929442/