gpt4 book ai didi

framebuffer - 来自内存缓冲区的DirectFB数据

转载 作者:行者123 更新时间:2023-12-04 02:57:18 25 4
gpt4 key购买 nike

我需要一种非常快速的方法来在屏幕上显示数据缓冲区。我首先尝试访问linux帧缓冲区,事实证明那是相当不错的。然后,我了解了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);

所以基本上我是从DFB创建一个DataBuffer,然后从DataBuffer创建一个ImageProvider并将其设置为在表面上渲染。但是,当我运行它时,它会引发错误:
(#) DirectFBError [dbuffer->CreateImageProvider(dbuffer, &provider)]: No (suitable) implementation found!

该方法真的没有实现吗?我当前使用的是DirectFB 1.4,从API文档中可以找到该函数。就是说,有人知道如何从内存中获取缓冲区(char * 640 * 480 * 4 RGBA)以使用DirectFB渲染到帧缓冲区吗?

谢谢。

最佳答案

也许对您有所帮助有点迟,但是对于其他尝试这样做的人来说,这是一个答案。

实际上,它比您想象的要简单(只有一个陷阱)-我正在使用DirectFb 1.4.11完全按照您的要求进行操作。

一旦有了主界面,就不用再理会DataBuffer了。使用DSDESC_PREALLOCATED flasg和您的缓冲区作为预分配的数据来创建另一个表面。然后,将新曲面中的数据Blit()移到主曲面上,并将Flip()数据从Flip()移到屏幕上。一个陷阱是您的数据需要采用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));

如果缓冲区的大小/形状与屏幕不同,则可以使用StretchBlit()来调整其大小。

我希望这有帮助。

关于framebuffer - 来自内存缓冲区的DirectFB数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7888277/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com