【问题标题】:What's wrong with this DirectFB Blit example?这个 DirectFB Blit 示例有什么问题?
【发布时间】:2014-06-20 12:34:52
【问题描述】:

我得到了directfb image example,我正在尝试对图像进行blit,如here 所述。所以,这是我的代码:

#include <stdio.h>
#include <unistd.h>

#include <directfb.h>

static IDirectFB *dfb = NULL;
static IDirectFBSurface *primary = NULL;
static int screen_width = 0;
static int screen_height = 0;
#define DFBCHECK(x...)                                         \
  {                                                            \
    DFBResult err = x;                                         \
                                                               \
    if (err != DFB_OK)                                         \
      {                                                        \
        fprintf( stderr, "%s <%d>:\n\t", __FILE__, __LINE__ ); \
        DirectFBErrorFatal( #x, err );                         \
      }                                                        \
  }

/* reflection against y */
static int DFB_FIXED_POINT_ONE = 1;
static const s32 mat_y[9] = {
 -DFB_FIXED_POINT_ONE, 0,                   0,
  0,                   DFB_FIXED_POINT_ONE, 0,
  0,                   0,                   DFB_FIXED_POINT_ONE
};

static IDirectFBSurface *logo = NULL;
int main(int argc, char **argv) {
    int i;

    DFBSurfaceDescription dsc;
    IDirectFBImageProvider *provider;
    DFBCHECK(DirectFBInit (&argc, &argv));
    DFBCHECK(DirectFBCreate (&dfb));
    DFBCHECK(dfb->SetCooperativeLevel (dfb, DFSCL_FULLSCREEN));
    dsc.flags = DSDESC_CAPS;
    dsc.caps = DFBSurfaceCapabilities(DSCAPS_PRIMARY | DSCAPS_FLIPPING);
    DFBCHECK(dfb->CreateSurface( dfb, &dsc, &primary ));
    DFBCHECK(primary->GetSize (primary, &screen_width, &screen_height));
    DFBCHECK(dfb->CreateImageProvider (dfb, "iconC.png", &provider));
    DFBCHECK(provider->GetSurfaceDescription (provider, &dsc));
    DFBCHECK(dfb->CreateSurface( dfb, &dsc, &logo ));
    DFBCHECK(provider->RenderTo (provider, logo, NULL));
    provider->Release(provider);
    for (i = -dsc.width; i < screen_width; i++) {

        DFBCHECK(primary->SetRenderOptions(primary, DSRO_MATRIX));
        DFBCHECK(primary->SetMatrix(primary, mat_y));

        DFBCHECK(primary->FillRectangle (primary, 0, 0, screen_width, screen_height));
        DFBCHECK(primary->Blit (primary, logo, NULL, i, (screen_height - dsc.height) / 2));
        DFBCHECK(primary->Flip (primary, NULL, DSFLIP_WAITFORSYNC));
        usleep(1000*10); // 10 microseconds
    }
    logo->Release(logo);
    primary->Release(primary);
    dfb->Release(dfb);
    return 23;
}

这个程序的输出很多:

`(!!!)  *** WARNING [rotation not yet implemented] *** [gfxcard.c:2075 in dfb_gfxcard_blit()]`
`(!!!)  *** WARNING [rotation not yet implemented] *** [gfxcard.c:2075 in dfb_gfxcard_blit()]`
`(!!!)  *** WARNING [rotation not yet implemented] *** [gfxcard.c:2075 in dfb_gfxcard_blit()]`

这是我的 DFB 版本的问题吗?我正在使用 DirectFB 1.4.11。

有没有办法让这个例子运行并blit图像?

*(顺便说一句,我不了解DFB_FIXED_POINT_ONE变量,所以我给它任何值试试)*

【问题讨论】:

  • 出于好奇,您是如何编译 DirectFB 的?我已经尝试了多次,但都失败了(头文件没有正确安装)。我很想帮忙,但我什至无法编译
  • 据我记忆,它在 Ubuntu 10.10 中使用 DirectFB 1.4.11 编译没有问题。
  • 您能否重复您下载和编译 DirectFB 所采取的确切步骤,以及您用于编译上述程序的步骤?顺便说一句,您使用较旧的 1.4.x 系列而不是较新的 1.6.x 系列是否有特殊原因?
  • 对于我使用g++ test.cpp -I /usr/local/include/directfb/ -L /usr/local/lib/directfb-1.4-5/ -ldirectfb 的程序,对于DirectFB,如果真的有必要,我必须再做一次才能记住。我们正在使用这个版本的 DFB,因为它是一个旧项目,我们现在无法更新(并修复所有依赖项和新 API)。
  • 嗯。得到它编译(看到stdio而不是iostream,假设它是C,你的例子清除了它),我现在得到一个错误,但它与你的不同。您是否尝试过在具有不同硬件的主机上构建/运行程序并查看是否收到相同的错误消息?

标签: blit directfb


【解决方案1】:

我想让 directfb 显示旋转 90 度的所有内容,这似乎是一个很好的起点。

有两点需要考虑:

首先数字是定点 16.16 fmt - 所以高位是整数部分,低 16 位是小数部分 - 所以 0x10000 代表 1(即 1

第二个计算似乎是针对实际(而不是标准化)屏幕坐标进行的,计算结果需要在 0 .. screen width - 1 for X 和 0 .. screen height - 1 范围内显示 Y。

在您的情况下,正确的矩阵似乎是:

{
    (-1 < 16), 0,         ((screen_width - 1) << 16),
    0,         (1 << 16), 0,
    0,         0,         (1 << 16),
}

注意第一行的最后一项,它将 X 坐标移回 X 坐标的正确范围。

【讨论】:

  • 使用上面的矩阵而不是90度后,它旋转了180度。你能更新一下 90 度的矩阵吗
猜你喜欢
  • 2010-09-14
  • 1970-01-01
  • 1970-01-01
  • 2013-02-03
  • 1970-01-01
  • 2018-09-05
  • 2016-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多