2012-09-12 70 views
1

我正在嘗試將Qt庫與SDL應用程序集成。我想將QPixmap轉換爲SDL_Surface,然後顯示該表面。我怎樣才能做到這一點?我一直無法找到任何好的例子。將QPixmap轉換爲SDL_Surface並將其顯示在屏幕上

我已經成功將下面的代碼至今:

Uint32 rmask = 0x000000ff; 
Uint32 gmask = 0x0000ff00; 
Uint32 bmask = 0x00ff0000; 
Uint32 amask = 0xff000000; 

SDL_FillRect(screen, NULL, SDL_MapRGBA(screen->format, 255, 255, 255, 255)); 

const QImage *qsurf = ...; 

SDL_Surface *surf = SDL_CreateRGBSurfaceFrom((void*)qsurf->constBits(), qsurf->width(), qsurf->height(), 32, qsurf->width() * 4, rmask, gmask, bmask, amask); 
SDL_BlitSurface(surf, NULL, screen, NULL); 
SDL_FreeSurface(surf); 
SDL_Flip(screen); 

這工作,但唯一的問題是我的每一個基於QImage的表面塗一次,底層面積不清零和透明部分在幾幀的過程中「淡化」成固體。

我確實有SDL_FillRect,我想要清除屏幕,但它似乎並沒有這樣做。 screen是主要的SDL表面。

+0

你爲什麼做這樣的一個東西? Qt有非常棒的工具可以在屏幕上顯示圖像。 – Blood

+0

我正在開發一個用Qt開發渲染庫的項目,我們想提供如何將我們的庫渲染功能與其他圖形工具包集成的示例。 –

+0

事實上,我幾個月前幫助過一個人,他們遇到了同樣的問題,並且我還記得將QPixmap轉換爲SDL_Surface的解決方案是最好的。你可以嘗試使用qsurf-> bits()而不是constBits() – Blood

回答

0

我最初的重疊問題是因爲我的源圖像實際上沒有正確清除。哎呀。一旦我解決了這個問題,我的面具就錯了;沒有在我的腦海中點擊SDL如何使用這些。最後,工作代碼如下:

下面是一個QImage的轉換爲SDL_Surface功能:

/*! 
* Converts a QImage to an SDL_Surface. 
* The source image is converted to ARGB32 format if it is not already. 
* The caller is responsible for deallocating the returned pointer. 
*/ 
SDL_Surface* QImage_toSDLSurface(const QImage &sourceImage) 
{ 
    // Ensure that the source image is in the correct pixel format 
    QImage image = sourceImage; 
    if (image.format() != QImage::Format_ARGB32) 
     image = image.convertToFormat(QImage::Format_ARGB32); 

    // QImage stores each pixel in ARGB format 
    // Mask appropriately for the endianness 
#if SDL_BYTEORDER == SDL_BIG_ENDIAN 
    Uint32 amask = 0x000000ff; 
    Uint32 rmask = 0x0000ff00; 
    Uint32 gmask = 0x00ff0000; 
    Uint32 bmask = 0xff000000; 
#else 
    Uint32 amask = 0xff000000; 
    Uint32 rmask = 0x00ff0000; 
    Uint32 gmask = 0x0000ff00; 
    Uint32 bmask = 0x000000ff; 
#endif 

    return SDL_CreateRGBSurfaceFrom((void*)image.constBits(), 
     image.width(), image.height(), image.depth(), image.bytesPerLine(), 
     rmask, gmask, bmask, amask); 
} 

我的繪圖功能的核心:

// screen == SDL_GetVideoSurface() 
// finalComposite == my QImage that SDL will convert and display 
SDL_FillRect(screen, NULL, SDL_MapRGBA(screen->format, 255, 255, 255, 255)); 
SDL_Surface *surf = QImage_toSDLSurface(finalComposite); 
SDL_BlitSurface(surf, NULL, screen, NULL); 
SDL_FreeSurface(surf); 
SDL_Flip(screen); 
相關問題