display: Ignore the ending colour when fading to 0 alpha

This commit is contained in:
Tommy 2022-07-27 07:28:15 +12:00
parent 64a5a7c20d
commit 2e4117c759

View File

@ -2389,23 +2389,31 @@ void display::fade_to(const color_t& c, int duration)
{ {
uint32_t start = SDL_GetTicks(); uint32_t start = SDL_GetTicks();
color_t fade_start = fade_color_; color_t fade_start = fade_color_;
color_t fade_end = c;
// If we started transparent, assume the same colour // If we started transparent, assume the same colour
if(fade_start.a == 0) { if(fade_start.a == 0) {
fade_start.r = c.r; fade_start.r = fade_end.r;
fade_start.g = c.g; fade_start.g = fade_end.g;
fade_start.b = c.b; fade_start.b = fade_end.b;
}
// If we are ending transparent, assume the same colour
if(fade_end.a == 0) {
fade_end.r = fade_start.r;
fade_end.g = fade_start.g;
fade_end.b = fade_start.b;
} }
// Smoothly blend and display // Smoothly blend and display
for(uint32_t now = start; now < start + duration; now = SDL_GetTicks()) { for(uint32_t now = start; now < start + duration; now = SDL_GetTicks()) {
float prop_f = float(now - start) / float(duration); float prop_f = float(now - start) / float(duration);
uint8_t p = float_to_color(prop_f); uint8_t p = float_to_color(prop_f);
fade_color_ = fade_start.smooth_blend(c, p); fade_color_ = fade_start.smooth_blend(fade_end, p);
draw_manager::invalidate_region(map_outside_area()); draw_manager::invalidate_region(map_outside_area());
events::pump_and_draw(); events::pump_and_draw();
} }
fade_color_ = c; fade_color_ = fade_end;
} }
void display::set_fade(const color_t& c) void display::set_fade(const color_t& c)