diff --git a/src/render/SDL_render.c b/src/render/SDL_render.c index fe1d0e8a7d..9e563f8b4f 100644 --- a/src/render/SDL_render.c +++ b/src/render/SDL_render.c @@ -728,6 +728,10 @@ static bool UpdateTexturePalette(SDL_Texture *texture) return false; } } else { + if (!FlushRenderCommandsIfTextureNeeded(texture)) { + return false; + } + if (!renderer->UpdateTexturePalette(renderer, texture)) { return false; } diff --git a/test/testpalette.c b/test/testpalette.c index 5ec61f6301..8f93ff5654 100644 --- a/test/testpalette.c +++ b/test/testpalette.c @@ -299,7 +299,6 @@ static SDL_Texture *CreateTexture(const void *pixels, int pitch) if (!tex) { return NULL; } - SDL_SetTextureBlendMode(tex, SDL_BLENDMODE_NONE); SDL_UpdateTexture(tex, NULL, pixels, pitch); SDL_SetTexturePalette(tex, palette); return tex; @@ -367,8 +366,12 @@ static void loop(void) SDL_FRect dst2 = { 0.0f, WINDOW_HEIGHT - 32.0f, 32.0f, 32.0f }; SDL_FRect dst3 = { WINDOW_WIDTH - 32.0f, 0.0f, 32.0f, 32.0f }; SDL_FRect dst4 = { WINDOW_WIDTH - 32.0f, WINDOW_HEIGHT - 32.0f, 32.0f, 32.0f }; + SDL_FRect dst5 = { 0.0f, 32.0f + 2.0f, 32.0f, 32.0f }; + SDL_FRect dst6 = { WINDOW_WIDTH - 32.0f, 32.0f + 2.0f, 32.0f, 32.0f }; const SDL_Color black = { 0, 0, 0, SDL_ALPHA_OPAQUE }; const SDL_Color white = { 255, 255, 255, SDL_ALPHA_OPAQUE }; + const SDL_Color red = { 255, 0, 0, SDL_ALPHA_OPAQUE }; + const SDL_Color blue = { 0, 0, 255, SDL_ALPHA_OPAQUE }; /* Check for events */ while (SDL_PollEvent(&event)) { @@ -396,6 +399,7 @@ static void loop(void) } } + SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0); SDL_RenderClear(renderer); /* Draw the rainbow texture */ @@ -412,18 +416,28 @@ static void loop(void) * This tests changing palette colors within a single frame */ SDL_SetPaletteColors(palette, &black, 1, 1); - SDL_SetRenderDrawColor(renderer, 0, 0, 0, SDL_ALPHA_OPAQUE); + SDL_SetRenderDrawColor(renderer, black.r, black.g, black.b, black.a); SDL_RenderDebugText(renderer, dst1.x + 32.0f + 2.0f, dst1.y + 12, "Black"); SDL_RenderTexture(renderer, black_texture1, &src, &dst1); SDL_RenderDebugText(renderer, dst2.x + 32.0f + 2.0f, dst2.y + 12, "Black"); SDL_RenderTexture(renderer, black_texture2, &src, &dst2); SDL_SetPaletteColors(palette, &white, 1, 1); - SDL_SetRenderDrawColor(renderer, 255, 255, 255, SDL_ALPHA_OPAQUE); + SDL_SetRenderDrawColor(renderer, white.r, white.g, white.b, white.a); SDL_RenderDebugText(renderer, dst3.x - 40.0f - 2.0f, dst3.y + 12, "White"); SDL_RenderTexture(renderer, white_texture1, &src, &dst3); SDL_RenderDebugText(renderer, dst4.x - 40.0f - 2.0f, dst4.y + 12, "White"); SDL_RenderTexture(renderer, white_texture2, &src, &dst4); + /* Draw the same textures again with different colors */ + SDL_SetPaletteColors(palette, &red, 1, 1); + SDL_SetRenderDrawColor(renderer, red.r, red.g, red.b, red.a); + SDL_RenderDebugText(renderer, dst5.x + 32.0f + 2.0f, dst5.y + 12, "Red"); + SDL_RenderTexture(renderer, black_texture1, &src, &dst5); + SDL_SetPaletteColors(palette, &blue, 1, 1); + SDL_SetRenderDrawColor(renderer, blue.r, blue.g, blue.b, blue.a); + SDL_RenderDebugText(renderer, dst6.x - 40.0f - 2.0f, dst6.y + 12, "Blue"); + SDL_RenderTexture(renderer, white_texture1, &src, &dst6); + SDL_RenderPresent(renderer); SDL_Delay(10); @@ -438,23 +452,34 @@ int main(int argc, char *argv[]) { SDL_Window *window = NULL; int return_code = -1; + bool pixelart = false; SDLTest_TrackAllocations(); - if (argc > 1) { - SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "USAGE: %s", argv[0]); - return_code = 1; - goto quit; + if (argv[1]) { + if (SDL_strcmp(argv[1], "--pixelart") == 0) { + pixelart = true; + } else { + SDL_Log("Usage: %s [--pixelart]", argv[0]); + return_code = 1; + goto quit; + } } if (!SDL_CreateWindowAndRenderer("testpalette", WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_RESIZABLE, &window, &renderer)) { - SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "SDL_CreateWindowAndRenderer failed: %s", SDL_GetError()); + SDL_Log("SDL_CreateWindowAndRenderer failed: %s", SDL_GetError()); return_code = 2; goto quit; } + if (pixelart) { + SDL_SetDefaultTextureScaleMode(renderer, SDL_SCALEMODE_PIXELART); + } else { + SDL_SetDefaultTextureScaleMode(renderer, SDL_SCALEMODE_NEAREST); + } + if (!CreateTextures()) { - SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't create textures: %s", SDL_GetError()); + SDL_Log("Couldn't create textures: %s", SDL_GetError()); return_code = 3; goto quit; }