2021-01-18 19:45:58 (UTC-03:00)
Marcel Rodrigues <marcelgmr@gmail.com>
Merge pull request #10 from rdebath/patch-fake256c Add fake 256 and 16m colours
diff --git a/term.c b/term.c index 851588d..156ebab 100644 --- a/term.c +++ b/term.c @@ -589,6 +589,44 @@ modeswitch(Term *term, int private, int number, int value) } } +static int +fake_colour_16m(int red, int green, int blue) +{ + int av = (red+green+blue)/3; + int palno = 1*(red>=av) + 2*(green>=av) + 4*(blue>=av); + if (red==green && green==blue) { + if (av > 212) palno = 15-8; + else if (av > 127) palno = 7-8; + else if (av > 42) palno = 8; + else palno = 0; + } + return palno + 8*(av>127); +} + +static int +fake_colour_256(int colnum){ + int nr, ng, nb; + if (colnum < 16) { + nr = (colnum&1) ? 170:0; + ng = (colnum&2) ? 170:0; + nb = (colnum&4) ? 170:0; + if (colnum&8) { nr += 85; ng += 85; nb += 85; } + if (colnum == 3) ng = 85; + } else if (colnum < 232) { + int i = colnum - 16; + nr = i / 36; ng = (i / 6) % 6; nb = i % 6; + nr = nr ? nr * 40 + 55 : 0; + ng = ng ? ng * 40 + 55 : 0; + nb = nb ? nb * 40 + 55 : 0; + } else if (colnum < 256) { + int i = colnum - 232; + nr = ng = nb = i * 10 + 8; + } else + nr=ng=nb = 127; + + return fake_colour_16m(nr, ng, nb); +} + static void sgr(Term *term, int n, int *params) { @@ -667,13 +705,14 @@ sgr(Term *term, int n, int *params) i++ ; if (i>n) break; if (params[i] == 5) { - i++; /* 256 colours */ - term->pair = (DEF_FORE << 4) | (term->pair & 0x0F); + /* 256 colours */ + term->pair = (fake_colour_256(params[i+1]) << 4) | (term->pair & 0x0F); + i++; break; } else if (params[i] == 2) { - i+=3; /* 16M colours, note I'm using common form not strict ITU T.416 */ - term->pair = (DEF_FORE << 4) | (term->pair & 0x0F); + term->pair = (fake_colour_16m(params[i+1],params[i+2],params[i+3]) << 4) | (term->pair & 0x0F); + i+=3; break; } /* Could be CMYK; probably broken */ @@ -691,13 +730,14 @@ sgr(Term *term, int n, int *params) i++ ; if (i>n) break; if (params[i] == 5) { - i++; /* 256 colours */ - term->pair = (term->pair & 0xF0) | DEF_BACK; + /* 256 colours */ + term->pair = (term->pair & 0xF0) | fake_colour_256(params[i+1]); + i++; break; } else if (params[i] == 2) { - i+=3; /* 16M colours, note I'm using common form not strict ITU T.416 */ - term->pair = (term->pair & 0xF0) | DEF_BACK; + term->pair = (term->pair & 0xF0) | fake_colour_16m(params[i+1],params[i+2],params[i+3]); + i+=3; break; } /* Could be CMYK; probably broken */