Skip to content
Snippets Groups Projects
Commit a8b3fb85 authored by Deucе's avatar Deucе :ok_hand_tone4:
Browse files

Fix the palette hack a bit

This actually adjusts the palette values used by the CTerm shadow
palette.  This allows the palette to work properly without the
weird offset thing.

Unfortunately, this means a cterm_reset() will not use the new
values, and since term.c doesn't know when cterm_reset() has been
called, we can't fix it afterward anymore without being very
invasive and double-checking after every cterm_write() call.

This is fine for the indended audience however (ie: Atari ST
emulation) since they don't have a reset sequence.
parent 80337c04
No related branches found
No related tags found
No related merge requests found
Pipeline #8587 passed
...@@ -2290,57 +2290,6 @@ main(int argc, char **argv) ...@@ -2290,57 +2290,6 @@ main(int argc, char **argv)
dac_default[3].green = dac_default[2].green; dac_default[3].green = dac_default[2].green;
dac_default[3].blue = dac_default[0].blue; dac_default[3].blue = dac_default[0].blue;
} }
if (bbs->palette_size > 0) {
uint32_t np[16];
int vm = find_vmode(screen_to_ciolib(bbs->screen_mode));
if (vm != -1) {
switch (vparams[vm].palette) {
case MONO_PALETTE:
case ATARI_PALETTE:
np[0] = bbs->palette[0];
for (i = 1; i < 16; i++)
np[i] = bbs->palette[1];
break;
case GREYSCALE_PALETTE:
np[0] = bbs->palette[0];
for (i = 1; i < 8; i++)
np[i] = bbs->palette[1];
np[8] = bbs->palette[2];
for (i = 9; i < 16; i++)
np[i] = bbs->palette[3];
break;
case PRESTEL_PALETTE:
for (i = 0; i < 8; i++) {
np[i] = bbs->palette[i];
np[i+8] = bbs->palette[i];
}
break;
case ATARI_PALETTE_4:
for (i = 0; i < 4; i++) {
np[i] = bbs->palette[i];
np[i+4] = bbs->palette[i];
np[i+8] = bbs->palette[i];
np[i+12] = bbs->palette[i];
}
break;
case ATARI_PALETTE_2:
for (i = 0; i < 2; i++) {
np[i] = bbs->palette[i];
np[i+2] = bbs->palette[i];
np[i+4] = bbs->palette[i];
np[i+6] = bbs->palette[i];
np[i+8] = bbs->palette[i];
np[i+10] = bbs->palette[i];
np[i+12] = bbs->palette[i];
np[i+14] = bbs->palette[i];
}
break;
}
for (i = 0; i < 16; i++)
np[i] |= 0x80000000;
set_modepalette(np);
}
}
if (doterm(bbs)) if (doterm(bbs))
quitting = true; quitting = true;
dac_default[3].red = saved_red; dac_default[3].red = saved_red;
......
...@@ -4169,6 +4169,66 @@ doterm(struct bbslist *bbs) ...@@ -4169,6 +4169,66 @@ doterm(struct bbslist *bbs)
get_emulation(bbs)); get_emulation(bbs));
if (!cterm) if (!cterm)
return false; return false;
if (bbs->palette_size > 0 && (cio_api.options & CONIO_OPT_EXTENDED_PALETTE)) {
uint32_t np[16];
int vm = find_vmode(screen_to_ciolib(bbs->screen_mode));
if (vm != -1) {
switch (vparams[vm].palette) {
case MONO_PALETTE:
case ATARI_PALETTE:
np[0] = bbs->palette[0];
for (i = 1; i < 16; i++)
np[i] = bbs->palette[1];
break;
case GREYSCALE_PALETTE:
np[0] = bbs->palette[0];
for (i = 1; i < 8; i++)
np[i] = bbs->palette[1];
np[8] = bbs->palette[2];
for (i = 9; i < 16; i++)
np[i] = bbs->palette[3];
break;
case PRESTEL_PALETTE:
for (i = 0; i < 8; i++) {
np[i] = bbs->palette[i];
np[i+8] = bbs->palette[i];
}
break;
case ATARI_PALETTE_4:
for (i = 0; i < 4; i++) {
np[i] = bbs->palette[i];
np[i+4] = bbs->palette[i];
np[i+8] = bbs->palette[i];
np[i+12] = bbs->palette[i];
}
break;
case ATARI_PALETTE_2:
for (i = 0; i < 2; i++) {
np[i] = bbs->palette[i];
np[i+2] = bbs->palette[i];
np[i+4] = bbs->palette[i];
np[i+6] = bbs->palette[i];
np[i+8] = bbs->palette[i];
np[i+10] = bbs->palette[i];
np[i+12] = bbs->palette[i];
np[i+14] = bbs->palette[i];
}
break;
}
/*
* TODO: Doing it this way won't last through a cterm_reset(), which
* can be triggered from ANSI.
*/
for (i = 0; i < 16; i++) {
uint32_t op[16];
get_modepalette(op);
setpalette(op[i] + 16,
((np[i] & 0x00FF0000) >> 8) | ((np[i] & 0x00FF0000) >> 16),
((np[i] & 0x0000FF00)) | ((np[i] & 0x0000FF00) >> 8),
((np[i] & 0x000000FF) << 8) | ((np[i] & 0x000000FF)));
}
}
}
if (bbs->force_lcf) if (bbs->force_lcf)
cterm->last_column_flag = (CTERM_LCF_FORCED | CTERM_LCF_ENABLED); cterm->last_column_flag = (CTERM_LCF_FORCED | CTERM_LCF_ENABLED);
cterm->apc_handler = apc_handler; cterm->apc_handler = apc_handler;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment