SDL 1.2 and SDL 2.0 compatibilty
我想我可能遇到了与SDL 1.2和2.0版本的兼容性问题:当使用SDL_MapRGB和SDL_FillRect绘制到Surface时,SDL 2.0显然会交换RGB红色和蓝色通道,而SDL 1.2则不会。以下C代码是演示问题的最小工作示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | #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\ ", 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\ ", 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\ ", SDL_GetError()); return EXIT_FAILURE; } SDL_FreeSurface(surface); SDL_Quit(); return EXIT_SUCCESS; } |
使用
编译时
1 | gcc $(sdl-config --cflags --libs) colourtest.c -o colourtest |
(使用SDL 1.2标头和库),代码产生(如我所料)以下位图文件:
但是,当使用
编译时
1 | gcc $(sdl2-config --cflags --libs) colourtest.c -o colourtest |
(使用SDL 2.0),代码意外地生成以下位图文件:
我尝试更改(r,g,b)蒙版,但这没有任何改变。
据我所知,包括迁移指南在内的文档均未提及任何内容,因此我找不到任何其他信息。这使我假设这是一个错误,或者我没有正确使用这些功能。
嗯。。有趣。不,SDL 2.0没有交换到bgr,它仍然是旧的RGB。
这就是我要说的。发生这种情况的唯一原因是字节顺序被交换了,因为SDL将rgb映射到您的计算机字节顺序是什么。也许出于某种原因,一个版本会自动解决此问题,而另一个版本则让您决定是否要使用计算机的字节顺序(在这种情况下,默认为little endian或选择使用big endian)?
尝试使用变量存储rbga值,然后使用此代码来确保将颜色值分配给正确的位,无论计算机上的字节顺序是什么:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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 |
我希望对您有所帮助,或者至少给您带来一些帮助。