From 8c8f2bc86eee11c466dc841594e6da518efc45dc Mon Sep 17 00:00:00 2001 From: Project_HSI <57279339+ProjectHSI@users.noreply.github.com> Date: Tue, 3 Feb 2026 07:42:06 +1000 Subject: [PATCH 1/2] Changed transparent window test This adds more alpha colours to hopefully diagnose problems with software transparency a bit better. Theoretically, the squares should be less visible the less alpha down, but with SDL_BLENDMODE_NONE, this is not the case, we need to use SDL_BLENDMODE_BLEND instead. --- test/testsoftwaretransparent.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/test/testsoftwaretransparent.c b/test/testsoftwaretransparent.c index 2ef5598dd3..702bf29462 100644 --- a/test/testsoftwaretransparent.c +++ b/test/testsoftwaretransparent.c @@ -27,19 +27,21 @@ static void draw(SDL_Renderer *renderer) SDL_RenderClear(renderer); if (w >= 3 * SQUARE_SIZE && h >= 3 * SQUARE_SIZE) { - SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255); - rect.x = 0.0f; rect.y = 0.0f; + SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255); SDL_RenderFillRect(renderer, &rect); rect.y = h - SQUARE_SIZE; + SDL_SetRenderDrawColor(renderer, 255, 0, 0, 170); SDL_RenderFillRect(renderer, &rect); rect.x = w - SQUARE_SIZE; + SDL_SetRenderDrawColor(renderer, 255, 0, 0, 85); SDL_RenderFillRect(renderer, &rect); rect.y = 0.0f; + SDL_SetRenderDrawColor(renderer, 255, 0, 0, 0); SDL_RenderFillRect(renderer, &rect); } @@ -82,7 +84,8 @@ int main(int argc, char *argv[]) } /* Make sure we're setting the alpha channel while drawing */ - SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_NONE); + /* But also make sure we're setting it to premultiplied alpha and not straight alpha. */ + SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_BLEND); /* We're ready to go! */ while (!done) { From 3ad0e24a077f3e043681ab1e8a4e18e8d5c1db5e Mon Sep 17 00:00:00 2001 From: Project_HSI <57279339+ProjectHSI@users.noreply.github.com> Date: Wed, 4 Feb 2026 07:14:30 +1000 Subject: [PATCH 2/2] Implement toggle for alpha blending mode --- test/testsoftwaretransparent.c | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/test/testsoftwaretransparent.c b/test/testsoftwaretransparent.c index 702bf29462..f27c4c585c 100644 --- a/test/testsoftwaretransparent.c +++ b/test/testsoftwaretransparent.c @@ -15,6 +15,8 @@ #define SQUARE_SIZE 100.0f +static bool premult = false; + /* Draw opaque red squares at the four corners of the form, and draw a red square with an alpha value of 180 in the center of the form */ static void draw(SDL_Renderer *renderer) { @@ -26,6 +28,8 @@ static void draw(SDL_Renderer *renderer) SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0); SDL_RenderClear(renderer); + SDL_SetRenderDrawBlendMode(renderer, premult ? SDL_BLENDMODE_BLEND : SDL_BLENDMODE_NONE); + if (w >= 3 * SQUARE_SIZE && h >= 3 * SQUARE_SIZE) { rect.x = 0.0f; rect.y = 0.0f; @@ -49,6 +53,9 @@ static void draw(SDL_Renderer *renderer) rect.x = (w - SQUARE_SIZE) / 2; rect.y = (h - SQUARE_SIZE) / 2; SDL_RenderFillRect(renderer, &rect); + + SDL_SetRenderDrawColor(renderer, 0, 255, 255, 255); + SDL_RenderDebugText(renderer, 0, 0, premult ? "Premult'd" : "Straight"); } int main(int argc, char *argv[]) @@ -61,7 +68,7 @@ int main(int argc, char *argv[]) int return_code = 1; - state = SDLTest_CommonCreateState(argv, 0); + state = SDLTest_CommonCreateState(argv, SDL_INIT_VIDEO); if (!state) { return 1; } @@ -83,12 +90,10 @@ int main(int argc, char *argv[]) goto quit; } - /* Make sure we're setting the alpha channel while drawing */ - /* But also make sure we're setting it to premultiplied alpha and not straight alpha. */ - SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_BLEND); - /* We're ready to go! */ while (!done) { + bool renderNeeded = false; + while (SDL_PollEvent(&event)) { switch (event.type) { case SDL_EVENT_KEY_DOWN: @@ -98,7 +103,15 @@ int main(int argc, char *argv[]) break; case SDL_EVENT_WINDOW_EXPOSED: /* The software renderer is persistent, so only redraw as-needed */ - draw(renderer); + renderNeeded = true; + break; + case SDL_EVENT_MOUSE_BUTTON_DOWN: + if (event.button.button == 1) { + // switch between premultiplied alpha and straight alpha + premult = !premult; + + renderNeeded = true; + } break; case SDL_EVENT_QUIT: done = true; @@ -108,6 +121,9 @@ int main(int argc, char *argv[]) } } + if (renderNeeded) + draw(renderer); + /* Show everything on the screen and wait a bit */ SDL_RenderPresent(renderer); SDL_Delay(100); @@ -123,3 +139,5 @@ quit: SDLTest_CommonDestroyState(state); return return_code; } + +