diff --git a/src/conio/ciolib.c b/src/conio/ciolib.c index e93dcb87e182de73f0568d8099f33553eb494eea..cb3adcb7126adb09c589e76824a2f9549d916785 100644 --- a/src/conio/ciolib.c +++ b/src/conio/ciolib.c @@ -289,6 +289,7 @@ static int try_curses_init(int mode) cio_api.setpalette = curs_setpalette; cio_api.get_modepalette = curs_get_modepalette; cio_api.set_modepalette = curs_set_modepalette; + cio_api.attr2palette = curs_attr2palette; return(1); } return(0); diff --git a/src/conio/cterm.c b/src/conio/cterm.c index b232904674242c11a7c94973fc5fafaa676553d6..b5bf1c0abc4cf4e9bc06885fd01fffbd80c4fac4 100644 --- a/src/conio/cterm.c +++ b/src/conio/cterm.c @@ -4684,18 +4684,19 @@ CIOLIBEXPORT char* CIOLIBCALL cterm_write(struct cterminal * cterm, const void * struct vmem_cell tmpvc[1]; int orig_fonts[4]; char lastch = 0; + int palette_offset = 0; if(!cterm->started) cterm_start(cterm); /* Now rejigger the current modes palette... */ - if (cio_api.options & CONIO_OPT_EXTENDED_PALETTE) { - mpalette = get_modepalette(palette); - if (mpalette) { - for (i=0; i < 16; i++) - palette[i] += 16; - set_modepalette(palette); - } + if (cio_api.options & CONIO_OPT_EXTENDED_PALETTE) + palette_offset = 0; + mpalette = get_modepalette(palette); + if (mpalette) { + for (i=0; i < 16; i++) + palette[i] += palette_offset; + set_modepalette(palette); } /* Deedle up the fonts */ @@ -5425,12 +5426,10 @@ CIOLIBEXPORT char* CIOLIBCALL cterm_write(struct cterminal * cterm, const void * SETCURSORTYPE(cterm->cursor); /* Now rejigger the current modes palette... */ - if (cio_api.options & CONIO_OPT_EXTENDED_PALETTE) { - if (mpalette) { - for (i=0; i < 16; i++) - palette[i] -= 16; - set_modepalette(palette); - } + if (mpalette) { + for (i=0; i < 16; i++) + palette[i] -= palette_offset; + set_modepalette(palette); } /* De-doodle the fonts */ diff --git a/src/conio/curs_cio.c b/src/conio/curs_cio.c index 3c2a2aaeb9cc7f9a5e665ecf6bac58f0a3aa4766..7a365347ca6b5a7453fd180b7ef9fd998ee59547 100644 --- a/src/conio/curs_cio.c +++ b/src/conio/curs_cio.c @@ -1170,15 +1170,33 @@ scale_integer_up(int from) return ret; } +uint32_t palette[16]; +int curs_attr2palette(uint8_t attr, uint32_t *fgp, uint32_t *bgp) +{ + uint32_t fg = attr & 0x0f; + uint32_t bg = (attr >> 4) & 0x0f; + + if (!(vflags & CIOLIB_VIDEO_BGBRIGHT)) + bg &= 0x07; + if (vflags & CIOLIB_VIDEO_NOBRIGHT) + fg &= 0x07; + + if (fgp) + *fgp = palette[fg]; + if (bgp) + *bgp = palette[bg]; + + return 1; +} + int curs_setpalette(uint32_t entry, uint16_t r, uint16_t g, uint16_t b) { if (!can_change_color()) return 0; - init_color(entry, scale_integer_up(r>>8), scale_integer_up(g>>8), scale_integer_up(b>>8)); + init_color(curses_color(entry), scale_integer_up(r>>8), scale_integer_up(g>>8), scale_integer_up(b>>8)); return 1; } -uint32_t palette[16]; int curs_set_modepalette(uint32_t p[16]) { int i; @@ -1189,7 +1207,7 @@ int curs_set_modepalette(uint32_t p[16]) for (i = 0; i < 16; i++) { struct dac_colors *c; c = &dac_default[p[i]]; - init_color(curses_color(i), scale_integer_up(c->red), scale_integer_up(c->green), scale_integer_up(c->blue)); + curs_setpalette(i, c->red<<8 | c->red, c->green<<8 | c->green, c->blue<<8 | c->blue); } return 1; } diff --git a/src/conio/curs_cio.h b/src/conio/curs_cio.h index 994a7150f2b7efa77e88dadd12206688afe3eea8..bc588e473ea657f54730bea73e6826e9ef9b2ae8 100644 --- a/src/conio/curs_cio.h +++ b/src/conio/curs_cio.h @@ -72,6 +72,7 @@ int curs_getfont(int font_num); int curs_set_modepalette(uint32_t p[16]); int curs_get_modepalette(uint32_t p[16]); int curs_setpalette(uint32_t entry, uint16_t r, uint16_t g, uint16_t b); +int curs_attr2palette(uint8_t attr, uint32_t *fgp, uint32_t *bgp); #ifdef __cplusplus } #endif