From bb080a262eb5ce8750fd82d20fbc7d942bf162fa Mon Sep 17 00:00:00 2001 From: rakslice Date: Tue, 18 Aug 2020 04:21:23 -0700 Subject: [PATCH] repeat gamma entries to handle B2 thousands (16-bit) color mode; ignore its solid grey palettes such as those that happen during mode changes --- BasiliskII/src/SDL/video_sdl.cpp | 25 ++++++++++++++++++++----- BasiliskII/src/SDL/video_sdl2.cpp | 24 +++++++++++++++++++----- 2 files changed, 39 insertions(+), 10 deletions(-) diff --git a/BasiliskII/src/SDL/video_sdl.cpp b/BasiliskII/src/SDL/video_sdl.cpp index 609323d0..c57035c9 100644 --- a/BasiliskII/src/SDL/video_sdl.cpp +++ b/BasiliskII/src/SDL/video_sdl.cpp @@ -1370,19 +1370,34 @@ void SDL_monitor_desc::set_palette(uint8 *pal, int num_in) if ((int)VIDEO_MODE_DEPTH > VIDEO_DEPTH_8BIT) { // handle the gamma ramp + + if (pal[0] == 127 && pal[num_in*3-1] == 127) // solid grey + return; // ignore + uint16 red[256]; uint16 green[256]; uint16 blue[256]; - for (int i = 0; i < 256; i++) { - red[i] = pal[i*3 + 0] << 8; - green[i] = pal[i*3 + 1] << 8; - blue[i] = pal[i*3 + 2] << 8; + int repeats = 256 / num_in; + + for (int i = 0; i < num_in; i++) { + for (int j = 0; j < repeats; j++) { + red[i*repeats + j] = pal[i*3 + 0] << 8; + green[i*repeats + j] = pal[i*3 + 1] << 8; + blue[i*repeats + j] = pal[i*3 + 2] << 8; + } + } + + // fill remaining entries (if any) with last value + for (int i = num_in * repeats; i < 256; i++) { + red[i] = pal[(num_in - 1) * 3] << 8; + green[i] = pal[(num_in - 1) * 3 + 1] << 8; + blue[i] = pal[(num_in - 1) * 3 + 2] << 8; } bool changed = (memcmp(red, last_gamma_red, 512) != 0 || memcmp(green, last_gamma_green, 512) != 0 || - memcmp(blue, last_gamma_blue, 512) != 0); + memcmp(blue, last_gamma_blue, 512) != 0); if (changed) { int result = SDL_SetGammaRamp(red, green, blue); diff --git a/BasiliskII/src/SDL/video_sdl2.cpp b/BasiliskII/src/SDL/video_sdl2.cpp index 697446c0..0c81deed 100644 --- a/BasiliskII/src/SDL/video_sdl2.cpp +++ b/BasiliskII/src/SDL/video_sdl2.cpp @@ -1746,20 +1746,34 @@ void SDL_monitor_desc::set_palette(uint8 *pal, int num_in) if ((int)VIDEO_MODE_DEPTH > VIDEO_DEPTH_8BIT) { // handle the gamma ramp + + if (pal[0] == 127 && pal[num_in*3-1] == 127) // solid grey + return; // ignore uint16 red[256]; uint16 green[256]; uint16 blue[256]; - for (int i = 0; i < 256; i++) { - red[i] = pal[i*3 + 0] << 8; - green[i] = pal[i*3 + 1] << 8; - blue[i] = pal[i*3 + 2] << 8; + int repeats = 256 / num_in; + + for (int i = 0; i < num_in; i++) { + for (int j = 0; j < repeats; j++) { + red[i*repeats + j] = pal[i*3 + 0] << 8; + green[i*repeats + j] = pal[i*3 + 1] << 8; + blue[i*repeats + j] = pal[i*3 + 2] << 8; + } + } + + // fill remaining entries (if any) with last value + for (int i = num_in * repeats; i < 256; i++) { + red[i] = pal[(num_in - 1) * 3] << 8; + green[i] = pal[(num_in - 1) * 3 + 1] << 8; + blue[i] = pal[(num_in - 1) * 3 + 2] << 8; } bool changed = (memcmp(red, last_gamma_red, 512) != 0 || memcmp(green, last_gamma_green, 512) != 0 || - memcmp(blue, last_gamma_blue, 512) != 0); + memcmp(blue, last_gamma_blue, 512) != 0); if (changed) { int result = SDL_SetWindowGammaRamp(sdl_window, red, green, blue);