Compare commits

...
1 Commits
Author SHA1 Message Date
kichikuou 23667b3e39 Fix screen redraws during effects
Normal redraws can overwrite effect frames with gfx_texture, causing
brief flashes during fade-out. Suppress redraws while an effect is
running and clear pending redraws at effect boundaries.
2026-09-30 13:12:16 +09:00
3 changed files with 12 additions and 1 deletions
+2
View File
@@ -191,6 +191,7 @@ static void eff_init(struct effect *eff, SDL_Rect *rect, EffectTexture *old, Eff
if (!eff->is_fullscreen) if (!eff->is_fullscreen)
gfx_updateScreen(); // Flush pending display changes. gfx_updateScreen(); // Flush pending display changes.
gfx_setEffectRunning(true);
} }
static void eff_finish(struct effect *eff, bool present) { static void eff_finish(struct effect *eff, bool present) {
@@ -1912,4 +1913,5 @@ void effect_step(struct effect *eff, float progress) {
void effect_finish(struct effect *eff) { void effect_finish(struct effect *eff) {
eff->finish(eff); eff->finish(eff);
gfx_setEffectRunning(false);
} }
+8 -1
View File
@@ -45,6 +45,7 @@
#include "debugger.h" #include "debugger.h"
static bool gfx_dirty; static bool gfx_dirty;
static bool gfx_effect_running;
static void gfx_pal_check(void) { static void gfx_pal_check(void) {
if (nact->ags.pal_changed) { if (nact->ags.pal_changed) {
@@ -64,7 +65,7 @@ SDL_Color gfx_getPaletteColor(uint8_t color) {
} }
void gfx_updateScreen(void) { void gfx_updateScreen(void) {
if (!gfx_dirty) if (!gfx_dirty || gfx_effect_running)
return; return;
SDL_RenderClear(gfx_renderer); SDL_RenderClear(gfx_renderer);
SDL_RenderCopy(gfx_renderer, gfx_texture, NULL, NULL); SDL_RenderCopy(gfx_renderer, gfx_texture, NULL, NULL);
@@ -73,6 +74,12 @@ void gfx_updateScreen(void) {
gfx_dirty = false; gfx_dirty = false;
} }
void gfx_setEffectRunning(bool running) {
gfx_effect_running = running;
// Effects present directly. Do not replay pending redraws over their frames.
gfx_dirty = false;
}
void gfx_requestRedraw(void) { void gfx_requestRedraw(void) {
gfx_dirty = true; gfx_dirty = true;
} }
+2
View File
@@ -37,6 +37,8 @@ extern surface_t *gfx_dibinfo;
extern int view_w; extern int view_w;
extern int view_h; extern int view_h;
void gfx_setEffectRunning(bool running);
SDL_Surface *gfx_dib_to_surface_with_alpha(int x, int y, int w, int h); SDL_Surface *gfx_dib_to_surface_with_alpha(int x, int y, int w, int h);
SDL_Surface *gfx_dib_to_surface_colorkey(int x, int y, int w, int h, int col); SDL_Surface *gfx_dib_to_surface_colorkey(int x, int y, int w, int h, int col);