2014-04-03 99 views
1

我想我可能遇到過SDL版本1.2和2.0的兼容性問題:當使用SDL_MapRGB和SDL_FillRect繪製到Surface時,SDL 2.0顯然交換了RGB紅色和藍色通道,而SDL 1.2纔不是。以下C代碼是一個最小的工作示例,其演示了此問題:SDL 1.2和SDL 2.0兼容

#include <stdio.h> 
#include <stdlib.h> 
#include <SDL.h> 

int main(void) 
{ 
    const unsigned height = 16; 
    const unsigned widthpercolour = 16; 
    SDL_Surface *surface; 
    SDL_Rect rect; 
    rect.x = 0; 
    rect.y = 0; 
    rect.w = widthpercolour; 
    rect.h = height; 
    if (SDL_Init(0) != 0) { 
    fprintf(stderr, "Could not initialize SDL: %s\n", SDL_GetError()); 
    return EXIT_FAILURE; 
    } 
    surface = SDL_CreateRGBSurface(0, 3 * widthpercolour, height, 24, 0x0000ff, 0x00ff00, 0xff0000, 0); 
    if (surface == NULL) { 
    fprintf(stderr, "Could not create SDL Surface: %s\n", SDL_GetError()); 
    return EXIT_FAILURE; 
    } 
    SDL_FillRect(surface, NULL, 0); 

    SDL_FillRect(surface, &rect, SDL_MapRGB(surface->format, 255, 0, 0)); 
    rect.x += widthpercolour; 
    SDL_FillRect(surface, &rect, SDL_MapRGB(surface->format, 0, 255, 0)); 
    rect.x += widthpercolour; 
    SDL_FillRect(surface, &rect, SDL_MapRGB(surface->format, 0, 0, 255)); 

    if (SDL_SaveBMP(surface, "colourtest.bmp") != 0) { 
    SDL_FreeSurface(surface); 
    SDL_Quit(); 
    fprintf(stderr, "Could not save SDL Surface: %s\n", SDL_GetError()); 
    return EXIT_FAILURE; 
    } 
    SDL_FreeSurface(surface); 
    SDL_Quit(); 
    return EXIT_SUCCESS; 
} 

當與

gcc $(sdl-config --cflags --libs) colourtest.c -o colourtest 

(它使用SDL 1.2頭文件和庫),則代碼產生(如我所料)編譯以下位圖文件:

rgb rectangles correct order

然而,當

編譯
gcc $(sdl2-config --cflags --libs) colourtest.c -o colourtest 

(使用SDL 2.0),則代碼產生(意外地)在以下位圖文件:

bgr, reversed order

我試圖改變(R,G,B)的掩模,但改變什麼。

據我所知,包括遷移指南在內的文檔沒有提及這一點,而且我也無法找到關於此事的其他信息。這導致我認爲這是一個錯誤,或者我沒有正確使用這些函數。

+0

這裏有問題嗎?如果是「我該怎麼辦?」我會建議一個錯誤報告。 –

回答

1

嗯....有趣。不,SDL 2.0沒有交換到bgr,它仍然是舊的RGB。

這就是我要說的。將發生的唯一原因是字節順序正在交換,因爲SDL將rgb映射到任何機器字節順序。也許由於某種原因,一個版本會自動解決這個問題,另一個版本可以讓你決定是否使用你機器的字節順序(在這種情況下,默認是小端或者選擇使用大端)。

嘗試使用變量來存儲你的,RGBA值,然後使用此代碼,以確保顏色值會被分配到正確的位無論字節順序是你的機器上的內容:

Uint32 red, greeb, blue, alpha 

#if SDL_BYTEORDER == SDL_BIG_ENDIAN 
red = 0xff000000; 
green = 0x00ff0000; 
blue = 0x0000ff00; 
alpha = 0x000000ff; 

#else 
red = 0x000000ff; 
green = 0x0000ff00; 
blue = 0x00ff0000; 
alpha = 0xff000000; 

#endif 

我希望完全有幫助,或者至少給你一些東西去掉。