2013-01-31 33 views
1

我得到了directfb image example,和我想要做塊的圖像,如上所述here。所以,這是我的代碼:這個DirectFB Blit例子有什麼問題?

#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變量,所以我給任何價值給它的嘗試)

+0

出於好奇,你是如何編譯DirectFB的?我嘗試過多次並失敗(頭文件沒有正確安裝)。我很樂意提供幫助,但我甚至無法得到*編譯*的東西! – fouric

+0

據我所知,它在Ubuntu 10.10中使用DirectFB 1.4.11編譯時沒有問題。 –

+0

您是否可以重複下載和編譯DirectFB所用的確切步驟,然後重新編譯上述程序?順便說一下,是否有一個特別的原因,你使用舊的1.4.x系列而不是新的1.6.x系列? – fouric

回答

1

我希望得到的DirectFB,以顯示一切旋轉90度*,這似乎像一個好的起點。

有考慮兩件事情:

首先數目是固定的點16.16 FMT - 這樣的上半部分是整數部分和低16位是小數部分 - 這樣的0x10000將表示1(即。 1 < < 16),並且0xffff0000將代表-1(即,-1 < < 16)。

第二計算似乎是與實際(而不是歸一化)屏幕座標完成的,並且將計算的結果必須是在範圍從0到屏幕寬度 - 1 X和0 ..屏幕高度 - 1顯示Y.

在你的情況下,正確的矩陣似乎是:

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

注意轉移的X座標回到正確的範圍內的X座標的第一行的最後一項。