mirror of
https://github.com/libsdl-org/SDL.git
synced 2026-05-04 23:22:48 +02:00
Fixed blitting bitmaps with a non-zero x offset
Also added basic testautomation coverage of bitmap blits Fixes https://github.com/libsdl-org/sdl2-compat/issues/546
This commit is contained in:
@@ -1215,6 +1215,83 @@ static int SDLCALL surface_testBlitBlendMul(void *arg)
|
||||
return TEST_COMPLETED;
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests blitting bitmaps
|
||||
*/
|
||||
static int SDLCALL surface_testBlitBitmap(void *arg)
|
||||
{
|
||||
const SDL_PixelFormat formats[] = {
|
||||
SDL_PIXELFORMAT_INDEX1LSB,
|
||||
SDL_PIXELFORMAT_INDEX1MSB,
|
||||
SDL_PIXELFORMAT_INDEX2LSB,
|
||||
SDL_PIXELFORMAT_INDEX2MSB,
|
||||
SDL_PIXELFORMAT_INDEX4LSB,
|
||||
SDL_PIXELFORMAT_INDEX4MSB
|
||||
};
|
||||
Uint8 pixel;
|
||||
int i, j;
|
||||
bool result;
|
||||
SDL_Surface *dst = SDL_CreateSurface(1, 1, SDL_PIXELFORMAT_ARGB8888);
|
||||
SDL_Color colors[] = {
|
||||
{ 0x00, 0x00, 0x00, 0xFF },
|
||||
{ 0xFF, 0xFF, 0xFF, 0xFF }
|
||||
};
|
||||
SDL_Palette *palette;
|
||||
Uint32 value, expected = 0xFFFFFFFF;
|
||||
|
||||
palette = SDL_CreatePalette(SDL_arraysize(colors));
|
||||
SDLTest_AssertCheck(palette != NULL, "SDL_CreatePalette() != NULL, result = %p", palette);
|
||||
|
||||
result = SDL_SetPaletteColors(palette, colors, 0, SDL_arraysize(colors));
|
||||
SDLTest_AssertCheck(result, "SDL_SetPaletteColors, result = %s", result ? "true" : "false");
|
||||
|
||||
for (i = 0; i < SDL_arraysize(formats); ++i) {
|
||||
SDL_PixelFormat format = formats[i];
|
||||
int bpp = SDL_BITSPERPIXEL(format);
|
||||
int width = (8 / bpp);
|
||||
|
||||
if (SDL_PIXELORDER(format) == SDL_BITMAPORDER_1234) {
|
||||
switch (bpp) {
|
||||
case 1:
|
||||
pixel = 0x80;
|
||||
break;
|
||||
case 2:
|
||||
pixel = 0x40;
|
||||
break;
|
||||
case 4:
|
||||
pixel = 0x10;
|
||||
break;
|
||||
default:
|
||||
SDL_assert(!"Unexpected bpp");
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
pixel = 0x01;
|
||||
}
|
||||
for (j = 0; j < width; ++j) {
|
||||
SDL_Rect rect = { j, 0, 1, 1 };
|
||||
SDL_Surface *src = SDL_CreateSurfaceFrom(width, 1, format, &pixel, 1);
|
||||
SDL_SetSurfacePalette(src, palette);
|
||||
*(Uint32 *)dst->pixels = 0;
|
||||
result = SDL_BlitSurface(src, &rect, dst, NULL);
|
||||
SDLTest_AssertCheck(result, "SDL_BlitSurface(%s pixel %d), result = %s", SDL_GetPixelFormatName(format), j, result ? "true" : "false");
|
||||
value = *(Uint32 *)dst->pixels;
|
||||
SDLTest_AssertCheck(value == expected, "Expected value == 0x%" SDL_PRIx32 ", actually = 0x%" SDL_PRIx32, expected, value);
|
||||
SDL_DestroySurface(src);
|
||||
|
||||
if (SDL_PIXELORDER(format) == SDL_BITMAPORDER_1234) {
|
||||
pixel >>= bpp;
|
||||
} else {
|
||||
pixel <<= bpp;
|
||||
}
|
||||
}
|
||||
}
|
||||
SDL_DestroyPalette(palette);
|
||||
SDL_DestroySurface(dst);
|
||||
|
||||
return TEST_COMPLETED;
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests blitting invalid surfaces.
|
||||
*/
|
||||
@@ -1230,14 +1307,14 @@ static int SDLCALL surface_testBlitInvalid(void *arg)
|
||||
SDLTest_AssertCheck(invalid->pixels == NULL, "Check surface pixels are NULL");
|
||||
|
||||
result = SDL_BlitSurface(invalid, NULL, valid, NULL);
|
||||
SDLTest_AssertCheck(result == false, "SDL_BlitSurface(invalid, NULL, valid, NULL), result = %s\n", result ? "true" : "false");
|
||||
SDLTest_AssertCheck(result == false, "SDL_BlitSurface(invalid, NULL, valid, NULL), result = %s", result ? "true" : "false");
|
||||
result = SDL_BlitSurface(valid, NULL, invalid, NULL);
|
||||
SDLTest_AssertCheck(result == false, "SDL_BlitSurface(valid, NULL, invalid, NULL), result = %s\n", result ? "true" : "false");
|
||||
SDLTest_AssertCheck(result == false, "SDL_BlitSurface(valid, NULL, invalid, NULL), result = %s", result ? "true" : "false");
|
||||
|
||||
result = SDL_BlitSurfaceScaled(invalid, NULL, valid, NULL, SDL_SCALEMODE_NEAREST);
|
||||
SDLTest_AssertCheck(result == false, "SDL_BlitSurfaceScaled(invalid, NULL, valid, NULL, SDL_SCALEMODE_NEAREST), result = %s\n", result ? "true" : "false");
|
||||
SDLTest_AssertCheck(result == false, "SDL_BlitSurfaceScaled(invalid, NULL, valid, NULL, SDL_SCALEMODE_NEAREST), result = %s", result ? "true" : "false");
|
||||
result = SDL_BlitSurfaceScaled(valid, NULL, invalid, NULL, SDL_SCALEMODE_NEAREST);
|
||||
SDLTest_AssertCheck(result == false, "SDL_BlitSurfaceScaled(valid, NULL, invalid, NULL, SDL_SCALEMODE_NEAREST), result = %s\n", result ? "true" : "false");
|
||||
SDLTest_AssertCheck(result == false, "SDL_BlitSurfaceScaled(valid, NULL, invalid, NULL, SDL_SCALEMODE_NEAREST), result = %s", result ? "true" : "false");
|
||||
|
||||
SDL_DestroySurface(valid);
|
||||
SDL_DestroySurface(invalid);
|
||||
@@ -2054,6 +2131,10 @@ static const SDLTest_TestCaseReference surfaceTestBlitBlendMul = {
|
||||
surface_testBlitBlendMul, "surface_testBlitBlendMul", "Tests blitting routines with mul blending mode.", TEST_ENABLED
|
||||
};
|
||||
|
||||
static const SDLTest_TestCaseReference surfaceTestBlitBitmap = {
|
||||
surface_testBlitBitmap, "surface_testBlitBitmap", "Tests blitting routines with bitmap surfaces.", TEST_ENABLED
|
||||
};
|
||||
|
||||
static const SDLTest_TestCaseReference surfaceTestBlitInvalid = {
|
||||
surface_testBlitInvalid, "surface_testBlitInvalid", "Tests blitting routines with invalid surfaces.", TEST_ENABLED
|
||||
};
|
||||
@@ -2116,6 +2197,7 @@ static const SDLTest_TestCaseReference *surfaceTests[] = {
|
||||
&surfaceTestBlitBlendAddPremultiplied,
|
||||
&surfaceTestBlitBlendMod,
|
||||
&surfaceTestBlitBlendMul,
|
||||
&surfaceTestBlitBitmap,
|
||||
&surfaceTestBlitInvalid,
|
||||
&surfaceTestBlitsWithBadCoordinates,
|
||||
&surfaceTestOverflow,
|
||||
|
||||
Reference in New Issue
Block a user