我想我可能遇到過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頭文件和庫),則代碼產生(如我所料)編譯以下位圖文件:
然而,當
編譯gcc $(sdl2-config --cflags --libs) colourtest.c -o colourtest
(使用SDL 2.0),則代碼產生(意外地)在以下位圖文件:
我試圖改變(R,G,B)的掩模,但改變什麼。
據我所知,包括遷移指南在內的文檔沒有提及這一點,而且我也無法找到關於此事的其他信息。這導致我認爲這是一個錯誤,或者我沒有正確使用這些函數。
這裏有問題嗎?如果是「我該怎麼辦?」我會建議一個錯誤報告。 –