Joh*_*n S 5 framebuffer directfb
我需要一种非常快速的方式来显示屏幕上的数据缓冲区.我首先尝试访问linux framebuffer,事实证明这是非常好的.然后我了解了directFB,我喜欢它提供的额外功能(如快速memcpy,动态调整图像大小,不需要额外的代码等).但后来我遇到了麻烦 - 所有的例子都是从文件中加载的图像.据我所知,它的'DataBuffer'类型没有示例/教程.在查看了文档和源代码之后,我设法编译了这样的东西:
DFBSurfaceDescription sdsc;
DFBDataBufferDescription ddsc;
DFBDataBufferDescriptionFlags ddscf = (DFBDataBufferDescriptionFlags)DBDESC_MEMORY;
IDirectFBDataBuffer *dbuffer;
IDirectFBImageProvider *provider;
ddsc.flags = ddscf;
ddsc.file = NULL;
ddsc.memory.data = m_z;
ddsc.memory.length = 640*480;
DFBCHECK (DirectFBInit (&argc, &argv));
DFBCHECK (DirectFBCreate (&dfb));
DFBCHECK (dfb->SetCooperativeLevel (dfb, DFSCL_FULLSCREEN));
sdsc.flags = DSDESC_CAPS;
sdsc.caps = (DFBSurfaceCapabilities)(DSCAPS_PRIMARY | DSCAPS_FLIPPING);
DFBCHECK (dfb->CreateSurface( dfb, &sdsc, &primary ));
DFBCHECK (primary->GetSize (primary, &screen_width, &screen_height));
DFBCHECK (dfb->CreateDataBuffer(dfb, &ddsc, &dbuffer));
DFBCHECK (dbuffer->CreateImageProvider(dbuffer, &provider));
DFBCHECK (provider->GetSurfaceDescription (provider, &sdsc));
DFBCHECK (dfb->CreateSurface( dfb, &sdsc, &fbwindow ));
DFBCHECK (provider->RenderTo (provider, fbwindow, NULL));
provider->Release (provider);
Run Code Online (Sandbox Code Playgroud)
所以基本上我从DFB创建一个DataBuffer,然后从DataBuffer创建一个ImageProvider并将其设置为在表面上渲染.然而,当我运行它时,它会抛出错误:
(#) DirectFBError [dbuffer->CreateImageProvider(dbuffer, &provider)]: No (suitable) implementation found!
Run Code Online (Sandbox Code Playgroud)
方法真的没有实现吗?我目前正在使用DirectFB 1.4,从API文档中应该有函数.话虽这么说,有没有人知道如何从内存中获取缓冲区(char*640*480*4 RGBA)以使用DirectFB渲染到帧缓冲区?
谢谢.
小智 8
也许有点晚来帮助你,但为了其他人尝试这个的好处,这里是一个答案.
它实际上比你想象的更简单(有一个问题) - 我正在做你想要的,使用DirectFb 1.4.11.
一旦你有了主要的表面,不要打扰DataBuffer.使用DSDESC_PREALLOCATED flasg和缓冲区作为预分配数据创建另一个曲面.然后将新表面的数据Blit()到主表面上,然后将主表面翻转()到屏幕上.一个问题是你的数据需要采用DirectFB理解的格式:32位RGBA不是其中之一,但32位ARGB是 - 我必须解析我的缓冲区以交换字节.
示例代码:
dsc.width = screen_width;
dsc.height = screen_height;
dsc.flags = DSDESC_HEIGHT | DSDESC_WIDTH | DSDESC_PREALLOCATED | DSDESC_PIXELFORMAT;
dsc.caps = DSCAPS_NONE;
dsc.pixelformat = DSPF_ARGB;
dsc.preallocated[0].data = buffer; // Buffer is your data
dsc.preallocated[0].pitch = dsc.width*4;
dsc.preallocated[1].data = NULL;
dsc.preallocated[1].pitch = 0;
DFBCHECK (dfb->CreateSurface( dfb, &dsc, &imageSurface ));
DFBCHECK (primary->Blit(primary, imageSurface, NULL, 0, 0));
DFBCHECK (primary->Flip(primary, NULL, DSFLIP_ONSYNC));
Run Code Online (Sandbox Code Playgroud)
如果缓冲区的大小/形状与屏幕不同,则可以使用StretchBlit()来调整大小.
我希望这有帮助.
| 归档时间: |
|
| 查看次数: |
8163 次 |
| 最近记录: |