Test changing the palette for a single texture

This commit is contained in:
Sam Lantinga
2025-09-27 10:45:24 -07:00
parent 264b436dba
commit 7dcc09986d
2 changed files with 38 additions and 9 deletions

View File

@@ -728,6 +728,10 @@ static bool UpdateTexturePalette(SDL_Texture *texture)
return false; return false;
} }
} else { } else {
if (!FlushRenderCommandsIfTextureNeeded(texture)) {
return false;
}
if (!renderer->UpdateTexturePalette(renderer, texture)) { if (!renderer->UpdateTexturePalette(renderer, texture)) {
return false; return false;
} }

View File

@@ -299,7 +299,6 @@ static SDL_Texture *CreateTexture(const void *pixels, int pitch)
if (!tex) { if (!tex) {
return NULL; return NULL;
} }
SDL_SetTextureBlendMode(tex, SDL_BLENDMODE_NONE);
SDL_UpdateTexture(tex, NULL, pixels, pitch); SDL_UpdateTexture(tex, NULL, pixels, pitch);
SDL_SetTexturePalette(tex, palette); SDL_SetTexturePalette(tex, palette);
return tex; 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 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 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 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 black = { 0, 0, 0, SDL_ALPHA_OPAQUE };
const SDL_Color white = { 255, 255, 255, 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 */ /* Check for events */
while (SDL_PollEvent(&event)) { while (SDL_PollEvent(&event)) {
@@ -396,6 +399,7 @@ static void loop(void)
} }
} }
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0);
SDL_RenderClear(renderer); SDL_RenderClear(renderer);
/* Draw the rainbow texture */ /* Draw the rainbow texture */
@@ -412,18 +416,28 @@ static void loop(void)
* This tests changing palette colors within a single frame * This tests changing palette colors within a single frame
*/ */
SDL_SetPaletteColors(palette, &black, 1, 1); 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_RenderDebugText(renderer, dst1.x + 32.0f + 2.0f, dst1.y + 12, "Black");
SDL_RenderTexture(renderer, black_texture1, &src, &dst1); SDL_RenderTexture(renderer, black_texture1, &src, &dst1);
SDL_RenderDebugText(renderer, dst2.x + 32.0f + 2.0f, dst2.y + 12, "Black"); SDL_RenderDebugText(renderer, dst2.x + 32.0f + 2.0f, dst2.y + 12, "Black");
SDL_RenderTexture(renderer, black_texture2, &src, &dst2); SDL_RenderTexture(renderer, black_texture2, &src, &dst2);
SDL_SetPaletteColors(palette, &white, 1, 1); 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_RenderDebugText(renderer, dst3.x - 40.0f - 2.0f, dst3.y + 12, "White");
SDL_RenderTexture(renderer, white_texture1, &src, &dst3); SDL_RenderTexture(renderer, white_texture1, &src, &dst3);
SDL_RenderDebugText(renderer, dst4.x - 40.0f - 2.0f, dst4.y + 12, "White"); SDL_RenderDebugText(renderer, dst4.x - 40.0f - 2.0f, dst4.y + 12, "White");
SDL_RenderTexture(renderer, white_texture2, &src, &dst4); 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_RenderPresent(renderer);
SDL_Delay(10); SDL_Delay(10);
@@ -438,23 +452,34 @@ int main(int argc, char *argv[])
{ {
SDL_Window *window = NULL; SDL_Window *window = NULL;
int return_code = -1; int return_code = -1;
bool pixelart = false;
SDLTest_TrackAllocations(); SDLTest_TrackAllocations();
if (argc > 1) { if (argv[1]) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "USAGE: %s", argv[0]); if (SDL_strcmp(argv[1], "--pixelart") == 0) {
pixelart = true;
} else {
SDL_Log("Usage: %s [--pixelart]", argv[0]);
return_code = 1; return_code = 1;
goto quit; goto quit;
} }
}
if (!SDL_CreateWindowAndRenderer("testpalette", WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_RESIZABLE, &window, &renderer)) { 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; return_code = 2;
goto quit; goto quit;
} }
if (pixelart) {
SDL_SetDefaultTextureScaleMode(renderer, SDL_SCALEMODE_PIXELART);
} else {
SDL_SetDefaultTextureScaleMode(renderer, SDL_SCALEMODE_NEAREST);
}
if (!CreateTextures()) { 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; return_code = 3;
goto quit; goto quit;
} }