Ver código fonte

Test changing the palette for a single texture

Sam Lantinga 1 semana atrás
pai
commit
7dcc09986d
2 arquivos alterados com 38 adições e 9 exclusões
  1. 4 0
      src/render/SDL_render.c
  2. 34 9
      test/testpalette.c

+ 4 - 0
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;
         }

+ 34 - 9
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;
     }