From 05736777e42403b6605284d9bd6954be3616583a Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Mon, 21 Apr 2014 20:35:44 -0400 Subject: support 16 colors, 256 colors, and arbitrary rgb colors --- src/config.c | 294 ++++++++++++++++++++++++++++++++++++++++++++++++++++------ src/display.c | 41 +++++++- src/display.h | 2 + src/parser.c | 92 ++++++++++++++++++ src/parser.l | 92 ++++++++++++++++++ src/term.h | 5 +- 6 files changed, 491 insertions(+), 35 deletions(-) diff --git a/src/config.c b/src/config.c index 7353ce7..7e51b05 100644 --- a/src/config.c +++ b/src/config.c @@ -35,23 +35,262 @@ static void runes_config_set_defaults(RunesTerm *t) t->fgdefault = cairo_pattern_create_rgb(0.827, 0.827, 0.827); t->bgdefault = cairo_pattern_create_rgb(0.0, 0.0, 0.0); - t->colors[0] = cairo_pattern_create_rgb(0.0, 0.0, 0.0); - t->colors[1] = cairo_pattern_create_rgb(0.804, 0.0, 0.0); - t->colors[2] = cairo_pattern_create_rgb(0.0, 0.804, 0.0); - t->colors[3] = cairo_pattern_create_rgb(0.804, 0.804, 0.0); - t->colors[4] = cairo_pattern_create_rgb(0.0, 0.0, 0.804); - t->colors[5] = cairo_pattern_create_rgb(0.804, 0.0, 0.804); - t->colors[6] = cairo_pattern_create_rgb(0.0, 0.804, 0.804); - t->colors[7] = cairo_pattern_create_rgb(0.898, 0.898, 0.898); - - t->brightcolors[0] = cairo_pattern_create_rgb(0.302, 0.302, 0.302); - t->brightcolors[1] = cairo_pattern_create_rgb(1.0, 0.0, 0.0); - t->brightcolors[2] = cairo_pattern_create_rgb(0.0, 1.0, 0.0); - t->brightcolors[3] = cairo_pattern_create_rgb(1.0, 1.0, 0.0); - t->brightcolors[4] = cairo_pattern_create_rgb(0.0, 0.0, 1.0); - t->brightcolors[5] = cairo_pattern_create_rgb(1.0, 0.0, 1.0); - t->brightcolors[6] = cairo_pattern_create_rgb(0.0, 1.0, 1.0); - t->brightcolors[7] = cairo_pattern_create_rgb(1.0, 1.0, 1.0); + t->colors[0] = cairo_pattern_create_rgb(0.000, 0.000, 0.000); + t->colors[1] = cairo_pattern_create_rgb(0.804, 0.000, 0.000); + t->colors[2] = cairo_pattern_create_rgb(0.000, 0.804, 0.000); + t->colors[3] = cairo_pattern_create_rgb(0.804, 0.804, 0.000); + t->colors[4] = cairo_pattern_create_rgb(0.000, 0.000, 0.804); + t->colors[5] = cairo_pattern_create_rgb(0.804, 0.000, 0.804); + t->colors[6] = cairo_pattern_create_rgb(0.000, 0.804, 0.804); + t->colors[7] = cairo_pattern_create_rgb(0.898, 0.898, 0.898); + t->colors[8] = cairo_pattern_create_rgb(0.302, 0.302, 0.302); + t->colors[9] = cairo_pattern_create_rgb(1.000, 0.000, 0.000); + t->colors[10] = cairo_pattern_create_rgb(0.000, 1.000, 0.000); + t->colors[11] = cairo_pattern_create_rgb(1.000, 1.000, 0.000); + t->colors[12] = cairo_pattern_create_rgb(0.000, 0.000, 1.000); + t->colors[13] = cairo_pattern_create_rgb(1.000, 0.000, 1.000); + t->colors[14] = cairo_pattern_create_rgb(0.000, 1.000, 1.000); + t->colors[15] = cairo_pattern_create_rgb(1.000, 1.000, 1.000); + t->colors[16] = cairo_pattern_create_rgb(0.000, 0.000, 0.000); + t->colors[17] = cairo_pattern_create_rgb(0.000, 0.000, 0.373); + t->colors[18] = cairo_pattern_create_rgb(0.000, 0.000, 0.529); + t->colors[19] = cairo_pattern_create_rgb(0.000, 0.000, 0.686); + t->colors[20] = cairo_pattern_create_rgb(0.000, 0.000, 0.843); + t->colors[21] = cairo_pattern_create_rgb(0.000, 0.000, 1.000); + t->colors[22] = cairo_pattern_create_rgb(0.000, 0.373, 0.000); + t->colors[23] = cairo_pattern_create_rgb(0.000, 0.373, 0.373); + t->colors[24] = cairo_pattern_create_rgb(0.000, 0.373, 0.529); + t->colors[25] = cairo_pattern_create_rgb(0.000, 0.373, 0.686); + t->colors[26] = cairo_pattern_create_rgb(0.000, 0.373, 0.843); + t->colors[27] = cairo_pattern_create_rgb(0.000, 0.373, 1.000); + t->colors[28] = cairo_pattern_create_rgb(0.000, 0.529, 0.000); + t->colors[29] = cairo_pattern_create_rgb(0.000, 0.529, 0.373); + t->colors[30] = cairo_pattern_create_rgb(0.000, 0.529, 0.529); + t->colors[31] = cairo_pattern_create_rgb(0.000, 0.529, 0.686); + t->colors[32] = cairo_pattern_create_rgb(0.000, 0.529, 0.843); + t->colors[33] = cairo_pattern_create_rgb(0.000, 0.529, 1.000); + t->colors[34] = cairo_pattern_create_rgb(0.000, 0.686, 0.000); + t->colors[35] = cairo_pattern_create_rgb(0.000, 0.686, 0.373); + t->colors[36] = cairo_pattern_create_rgb(0.000, 0.686, 0.529); + t->colors[37] = cairo_pattern_create_rgb(0.000, 0.686, 0.686); + t->colors[38] = cairo_pattern_create_rgb(0.000, 0.686, 0.843); + t->colors[39] = cairo_pattern_create_rgb(0.000, 0.686, 1.000); + t->colors[40] = cairo_pattern_create_rgb(0.000, 0.843, 0.000); + t->colors[41] = cairo_pattern_create_rgb(0.000, 0.843, 0.373); + t->colors[42] = cairo_pattern_create_rgb(0.000, 0.843, 0.529); + t->colors[43] = cairo_pattern_create_rgb(0.000, 0.843, 0.686); + t->colors[44] = cairo_pattern_create_rgb(0.000, 0.843, 0.843); + t->colors[45] = cairo_pattern_create_rgb(0.000, 0.843, 1.000); + t->colors[46] = cairo_pattern_create_rgb(0.000, 1.000, 0.000); + t->colors[47] = cairo_pattern_create_rgb(0.000, 1.000, 0.373); + t->colors[48] = cairo_pattern_create_rgb(0.000, 1.000, 0.529); + t->colors[49] = cairo_pattern_create_rgb(0.000, 1.000, 0.686); + t->colors[50] = cairo_pattern_create_rgb(0.000, 1.000, 0.843); + t->colors[51] = cairo_pattern_create_rgb(0.000, 1.000, 1.000); + t->colors[52] = cairo_pattern_create_rgb(0.373, 0.000, 0.000); + t->colors[53] = cairo_pattern_create_rgb(0.373, 0.000, 0.373); + t->colors[54] = cairo_pattern_create_rgb(0.373, 0.000, 0.529); + t->colors[55] = cairo_pattern_create_rgb(0.373, 0.000, 0.686); + t->colors[56] = cairo_pattern_create_rgb(0.373, 0.000, 0.843); + t->colors[57] = cairo_pattern_create_rgb(0.373, 0.000, 1.000); + t->colors[58] = cairo_pattern_create_rgb(0.373, 0.373, 0.000); + t->colors[59] = cairo_pattern_create_rgb(0.373, 0.373, 0.373); + t->colors[60] = cairo_pattern_create_rgb(0.373, 0.373, 0.529); + t->colors[61] = cairo_pattern_create_rgb(0.373, 0.373, 0.686); + t->colors[62] = cairo_pattern_create_rgb(0.373, 0.373, 0.843); + t->colors[63] = cairo_pattern_create_rgb(0.373, 0.373, 1.000); + t->colors[64] = cairo_pattern_create_rgb(0.373, 0.529, 0.000); + t->colors[65] = cairo_pattern_create_rgb(0.373, 0.529, 0.373); + t->colors[66] = cairo_pattern_create_rgb(0.373, 0.529, 0.529); + t->colors[67] = cairo_pattern_create_rgb(0.373, 0.529, 0.686); + t->colors[68] = cairo_pattern_create_rgb(0.373, 0.529, 0.843); + t->colors[69] = cairo_pattern_create_rgb(0.373, 0.529, 1.000); + t->colors[70] = cairo_pattern_create_rgb(0.373, 0.686, 0.000); + t->colors[71] = cairo_pattern_create_rgb(0.373, 0.686, 0.373); + t->colors[72] = cairo_pattern_create_rgb(0.373, 0.686, 0.529); + t->colors[73] = cairo_pattern_create_rgb(0.373, 0.686, 0.686); + t->colors[74] = cairo_pattern_create_rgb(0.373, 0.686, 0.843); + t->colors[75] = cairo_pattern_create_rgb(0.373, 0.686, 1.000); + t->colors[76] = cairo_pattern_create_rgb(0.373, 0.843, 0.000); + t->colors[77] = cairo_pattern_create_rgb(0.373, 0.843, 0.373); + t->colors[78] = cairo_pattern_create_rgb(0.373, 0.843, 0.529); + t->colors[79] = cairo_pattern_create_rgb(0.373, 0.843, 0.686); + t->colors[80] = cairo_pattern_create_rgb(0.373, 0.843, 0.843); + t->colors[81] = cairo_pattern_create_rgb(0.373, 0.843, 1.000); + t->colors[82] = cairo_pattern_create_rgb(0.373, 1.000, 0.000); + t->colors[83] = cairo_pattern_create_rgb(0.373, 1.000, 0.373); + t->colors[84] = cairo_pattern_create_rgb(0.373, 1.000, 0.529); + t->colors[85] = cairo_pattern_create_rgb(0.373, 1.000, 0.686); + t->colors[86] = cairo_pattern_create_rgb(0.373, 1.000, 0.843); + t->colors[87] = cairo_pattern_create_rgb(0.373, 1.000, 1.000); + t->colors[88] = cairo_pattern_create_rgb(0.529, 0.000, 0.000); + t->colors[89] = cairo_pattern_create_rgb(0.529, 0.000, 0.373); + t->colors[90] = cairo_pattern_create_rgb(0.529, 0.000, 0.529); + t->colors[91] = cairo_pattern_create_rgb(0.529, 0.000, 0.686); + t->colors[92] = cairo_pattern_create_rgb(0.529, 0.000, 0.843); + t->colors[93] = cairo_pattern_create_rgb(0.529, 0.000, 1.000); + t->colors[94] = cairo_pattern_create_rgb(0.529, 0.373, 0.000); + t->colors[95] = cairo_pattern_create_rgb(0.529, 0.373, 0.373); + t->colors[96] = cairo_pattern_create_rgb(0.529, 0.373, 0.529); + t->colors[97] = cairo_pattern_create_rgb(0.529, 0.373, 0.686); + t->colors[98] = cairo_pattern_create_rgb(0.529, 0.373, 0.843); + t->colors[99] = cairo_pattern_create_rgb(0.529, 0.373, 1.000); + t->colors[100] = cairo_pattern_create_rgb(0.529, 0.529, 0.000); + t->colors[101] = cairo_pattern_create_rgb(0.529, 0.529, 0.373); + t->colors[102] = cairo_pattern_create_rgb(0.529, 0.529, 0.529); + t->colors[103] = cairo_pattern_create_rgb(0.529, 0.529, 0.686); + t->colors[104] = cairo_pattern_create_rgb(0.529, 0.529, 0.843); + t->colors[105] = cairo_pattern_create_rgb(0.529, 0.529, 1.000); + t->colors[106] = cairo_pattern_create_rgb(0.529, 0.686, 0.000); + t->colors[107] = cairo_pattern_create_rgb(0.529, 0.686, 0.373); + t->colors[108] = cairo_pattern_create_rgb(0.529, 0.686, 0.529); + t->colors[109] = cairo_pattern_create_rgb(0.529, 0.686, 0.686); + t->colors[110] = cairo_pattern_create_rgb(0.529, 0.686, 0.843); + t->colors[111] = cairo_pattern_create_rgb(0.529, 0.686, 1.000); + t->colors[112] = cairo_pattern_create_rgb(0.529, 0.843, 0.000); + t->colors[113] = cairo_pattern_create_rgb(0.529, 0.843, 0.373); + t->colors[114] = cairo_pattern_create_rgb(0.529, 0.843, 0.529); + t->colors[115] = cairo_pattern_create_rgb(0.529, 0.843, 0.686); + t->colors[116] = cairo_pattern_create_rgb(0.529, 0.843, 0.843); + t->colors[117] = cairo_pattern_create_rgb(0.529, 0.843, 1.000); + t->colors[118] = cairo_pattern_create_rgb(0.529, 1.000, 0.000); + t->colors[119] = cairo_pattern_create_rgb(0.529, 1.000, 0.373); + t->colors[120] = cairo_pattern_create_rgb(0.529, 1.000, 0.529); + t->colors[121] = cairo_pattern_create_rgb(0.529, 1.000, 0.686); + t->colors[122] = cairo_pattern_create_rgb(0.529, 1.000, 0.843); + t->colors[123] = cairo_pattern_create_rgb(0.529, 1.000, 1.000); + t->colors[124] = cairo_pattern_create_rgb(0.686, 0.000, 0.000); + t->colors[125] = cairo_pattern_create_rgb(0.686, 0.000, 0.373); + t->colors[126] = cairo_pattern_create_rgb(0.686, 0.000, 0.529); + t->colors[127] = cairo_pattern_create_rgb(0.686, 0.000, 0.686); + t->colors[128] = cairo_pattern_create_rgb(0.686, 0.000, 0.843); + t->colors[129] = cairo_pattern_create_rgb(0.686, 0.000, 1.000); + t->colors[130] = cairo_pattern_create_rgb(0.686, 0.373, 0.000); + t->colors[131] = cairo_pattern_create_rgb(0.686, 0.373, 0.373); + t->colors[132] = cairo_pattern_create_rgb(0.686, 0.373, 0.529); + t->colors[133] = cairo_pattern_create_rgb(0.686, 0.373, 0.686); + t->colors[134] = cairo_pattern_create_rgb(0.686, 0.373, 0.843); + t->colors[135] = cairo_pattern_create_rgb(0.686, 0.373, 1.000); + t->colors[136] = cairo_pattern_create_rgb(0.686, 0.529, 0.000); + t->colors[137] = cairo_pattern_create_rgb(0.686, 0.529, 0.373); + t->colors[138] = cairo_pattern_create_rgb(0.686, 0.529, 0.529); + t->colors[139] = cairo_pattern_create_rgb(0.686, 0.529, 0.686); + t->colors[140] = cairo_pattern_create_rgb(0.686, 0.529, 0.843); + t->colors[141] = cairo_pattern_create_rgb(0.686, 0.529, 1.000); + t->colors[142] = cairo_pattern_create_rgb(0.686, 0.686, 0.000); + t->colors[143] = cairo_pattern_create_rgb(0.686, 0.686, 0.373); + t->colors[144] = cairo_pattern_create_rgb(0.686, 0.686, 0.529); + t->colors[145] = cairo_pattern_create_rgb(0.686, 0.686, 0.686); + t->colors[146] = cairo_pattern_create_rgb(0.686, 0.686, 0.843); + t->colors[147] = cairo_pattern_create_rgb(0.686, 0.686, 1.000); + t->colors[148] = cairo_pattern_create_rgb(0.686, 0.843, 0.000); + t->colors[149] = cairo_pattern_create_rgb(0.686, 0.843, 0.373); + t->colors[150] = cairo_pattern_create_rgb(0.686, 0.843, 0.529); + t->colors[151] = cairo_pattern_create_rgb(0.686, 0.843, 0.686); + t->colors[152] = cairo_pattern_create_rgb(0.686, 0.843, 0.843); + t->colors[153] = cairo_pattern_create_rgb(0.686, 0.843, 1.000); + t->colors[154] = cairo_pattern_create_rgb(0.686, 1.000, 0.000); + t->colors[155] = cairo_pattern_create_rgb(0.686, 1.000, 0.373); + t->colors[156] = cairo_pattern_create_rgb(0.686, 1.000, 0.529); + t->colors[157] = cairo_pattern_create_rgb(0.686, 1.000, 0.686); + t->colors[158] = cairo_pattern_create_rgb(0.686, 1.000, 0.843); + t->colors[159] = cairo_pattern_create_rgb(0.686, 1.000, 1.000); + t->colors[160] = cairo_pattern_create_rgb(0.843, 0.000, 0.000); + t->colors[161] = cairo_pattern_create_rgb(0.843, 0.000, 0.373); + t->colors[162] = cairo_pattern_create_rgb(0.843, 0.000, 0.529); + t->colors[163] = cairo_pattern_create_rgb(0.843, 0.000, 0.686); + t->colors[164] = cairo_pattern_create_rgb(0.843, 0.000, 0.843); + t->colors[165] = cairo_pattern_create_rgb(0.843, 0.000, 1.000); + t->colors[166] = cairo_pattern_create_rgb(0.843, 0.373, 0.000); + t->colors[167] = cairo_pattern_create_rgb(0.843, 0.373, 0.373); + t->colors[168] = cairo_pattern_create_rgb(0.843, 0.373, 0.529); + t->colors[169] = cairo_pattern_create_rgb(0.843, 0.373, 0.686); + t->colors[170] = cairo_pattern_create_rgb(0.843, 0.373, 0.843); + t->colors[171] = cairo_pattern_create_rgb(0.843, 0.373, 1.000); + t->colors[172] = cairo_pattern_create_rgb(0.843, 0.529, 0.000); + t->colors[173] = cairo_pattern_create_rgb(0.843, 0.529, 0.373); + t->colors[174] = cairo_pattern_create_rgb(0.843, 0.529, 0.529); + t->colors[175] = cairo_pattern_create_rgb(0.843, 0.529, 0.686); + t->colors[176] = cairo_pattern_create_rgb(0.843, 0.529, 0.843); + t->colors[177] = cairo_pattern_create_rgb(0.843, 0.529, 1.000); + t->colors[178] = cairo_pattern_create_rgb(0.843, 0.686, 0.000); + t->colors[179] = cairo_pattern_create_rgb(0.843, 0.686, 0.373); + t->colors[180] = cairo_pattern_create_rgb(0.843, 0.686, 0.529); + t->colors[181] = cairo_pattern_create_rgb(0.843, 0.686, 0.686); + t->colors[182] = cairo_pattern_create_rgb(0.843, 0.686, 0.843); + t->colors[183] = cairo_pattern_create_rgb(0.843, 0.686, 1.000); + t->colors[184] = cairo_pattern_create_rgb(0.843, 0.843, 0.000); + t->colors[185] = cairo_pattern_create_rgb(0.843, 0.843, 0.373); + t->colors[186] = cairo_pattern_create_rgb(0.843, 0.843, 0.529); + t->colors[187] = cairo_pattern_create_rgb(0.843, 0.843, 0.686); + t->colors[188] = cairo_pattern_create_rgb(0.843, 0.843, 0.843); + t->colors[189] = cairo_pattern_create_rgb(0.843, 0.843, 1.000); + t->colors[190] = cairo_pattern_create_rgb(0.843, 1.000, 0.000); + t->colors[191] = cairo_pattern_create_rgb(0.843, 1.000, 0.373); + t->colors[192] = cairo_pattern_create_rgb(0.843, 1.000, 0.529); + t->colors[193] = cairo_pattern_create_rgb(0.843, 1.000, 0.686); + t->colors[194] = cairo_pattern_create_rgb(0.843, 1.000, 0.843); + t->colors[195] = cairo_pattern_create_rgb(0.843, 1.000, 1.000); + t->colors[196] = cairo_pattern_create_rgb(1.000, 0.000, 0.000); + t->colors[197] = cairo_pattern_create_rgb(1.000, 0.000, 0.373); + t->colors[198] = cairo_pattern_create_rgb(1.000, 0.000, 0.529); + t->colors[199] = cairo_pattern_create_rgb(1.000, 0.000, 0.686); + t->colors[200] = cairo_pattern_create_rgb(1.000, 0.000, 0.843); + t->colors[201] = cairo_pattern_create_rgb(1.000, 0.000, 1.000); + t->colors[202] = cairo_pattern_create_rgb(1.000, 0.373, 0.000); + t->colors[203] = cairo_pattern_create_rgb(1.000, 0.373, 0.373); + t->colors[204] = cairo_pattern_create_rgb(1.000, 0.373, 0.529); + t->colors[205] = cairo_pattern_create_rgb(1.000, 0.373, 0.686); + t->colors[206] = cairo_pattern_create_rgb(1.000, 0.373, 0.843); + t->colors[207] = cairo_pattern_create_rgb(1.000, 0.373, 1.000); + t->colors[208] = cairo_pattern_create_rgb(1.000, 0.529, 0.000); + t->colors[209] = cairo_pattern_create_rgb(1.000, 0.529, 0.373); + t->colors[210] = cairo_pattern_create_rgb(1.000, 0.529, 0.529); + t->colors[211] = cairo_pattern_create_rgb(1.000, 0.529, 0.686); + t->colors[212] = cairo_pattern_create_rgb(1.000, 0.529, 0.843); + t->colors[213] = cairo_pattern_create_rgb(1.000, 0.529, 1.000); + t->colors[214] = cairo_pattern_create_rgb(1.000, 0.686, 0.000); + t->colors[215] = cairo_pattern_create_rgb(1.000, 0.686, 0.373); + t->colors[216] = cairo_pattern_create_rgb(1.000, 0.686, 0.529); + t->colors[217] = cairo_pattern_create_rgb(1.000, 0.686, 0.686); + t->colors[218] = cairo_pattern_create_rgb(1.000, 0.686, 0.843); + t->colors[219] = cairo_pattern_create_rgb(1.000, 0.686, 1.000); + t->colors[220] = cairo_pattern_create_rgb(1.000, 0.843, 0.000); + t->colors[221] = cairo_pattern_create_rgb(1.000, 0.843, 0.373); + t->colors[222] = cairo_pattern_create_rgb(1.000, 0.843, 0.529); + t->colors[223] = cairo_pattern_create_rgb(1.000, 0.843, 0.686); + t->colors[224] = cairo_pattern_create_rgb(1.000, 0.843, 0.843); + t->colors[225] = cairo_pattern_create_rgb(1.000, 0.843, 1.000); + t->colors[226] = cairo_pattern_create_rgb(1.000, 1.000, 0.000); + t->colors[227] = cairo_pattern_create_rgb(1.000, 1.000, 0.373); + t->colors[228] = cairo_pattern_create_rgb(1.000, 1.000, 0.529); + t->colors[229] = cairo_pattern_create_rgb(1.000, 1.000, 0.686); + t->colors[230] = cairo_pattern_create_rgb(1.000, 1.000, 0.843); + t->colors[231] = cairo_pattern_create_rgb(1.000, 1.000, 1.000); + t->colors[232] = cairo_pattern_create_rgb(0.031, 0.031, 0.031); + t->colors[233] = cairo_pattern_create_rgb(0.071, 0.071, 0.071); + t->colors[234] = cairo_pattern_create_rgb(0.110, 0.110, 0.110); + t->colors[235] = cairo_pattern_create_rgb(0.149, 0.149, 0.149); + t->colors[236] = cairo_pattern_create_rgb(0.188, 0.188, 0.188); + t->colors[237] = cairo_pattern_create_rgb(0.227, 0.227, 0.227); + t->colors[238] = cairo_pattern_create_rgb(0.267, 0.267, 0.267); + t->colors[239] = cairo_pattern_create_rgb(0.306, 0.306, 0.306); + t->colors[240] = cairo_pattern_create_rgb(0.345, 0.345, 0.345); + t->colors[241] = cairo_pattern_create_rgb(0.376, 0.376, 0.376); + t->colors[242] = cairo_pattern_create_rgb(0.400, 0.400, 0.400); + t->colors[243] = cairo_pattern_create_rgb(0.463, 0.463, 0.463); + t->colors[244] = cairo_pattern_create_rgb(0.502, 0.502, 0.502); + t->colors[245] = cairo_pattern_create_rgb(0.541, 0.541, 0.541); + t->colors[246] = cairo_pattern_create_rgb(0.580, 0.580, 0.580); + t->colors[247] = cairo_pattern_create_rgb(0.620, 0.620, 0.620); + t->colors[248] = cairo_pattern_create_rgb(0.659, 0.659, 0.659); + t->colors[249] = cairo_pattern_create_rgb(0.698, 0.698, 0.698); + t->colors[250] = cairo_pattern_create_rgb(0.737, 0.737, 0.737); + t->colors[251] = cairo_pattern_create_rgb(0.776, 0.776, 0.776); + t->colors[252] = cairo_pattern_create_rgb(0.816, 0.816, 0.816); + t->colors[253] = cairo_pattern_create_rgb(0.855, 0.855, 0.855); + t->colors[254] = cairo_pattern_create_rgb(0.894, 0.894, 0.894); + t->colors[255] = cairo_pattern_create_rgb(0.933, 0.933, 0.933); t->default_rows = 24; t->default_cols = 80; @@ -205,22 +444,19 @@ static void runes_config_set(RunesTerm *t, char *key, char *val) t->mousecursorcolor = newcolor; } } - else if (!strncmp(key, "color", 5) - && strlen(key) == 6 && key[5] >= '0' && key[5] <= '7') { + else if (!strncmp(key, "color", 5)) { cairo_pattern_t *newcolor; - newcolor = runes_config_parse_color(val); - if (newcolor) { - cairo_pattern_destroy(t->colors[key[5] - '0']); - t->colors[key[5] - '0'] = newcolor; + int i; + + i = atoi(&key[5]); + if (key[5] < '0' || key[5] > '9' || i < 0 || i > 255) { + fprintf(stderr, "unknown option: '%s'\n", key); + return; } - } - else if (!strncmp(key, "brightcolor", 5) - && strlen(key) == 6 && key[5] >= '0' && key[5] <= '7') { - cairo_pattern_t *newcolor; newcolor = runes_config_parse_color(val); if (newcolor) { - cairo_pattern_destroy(t->brightcolors[key[5] - '0']); - t->brightcolors[key[5] - '0'] = newcolor; + cairo_pattern_destroy(t->colors[i]); + t->colors[i] = newcolor; } } else if (!strcmp(key, "rows")) { diff --git a/src/display.c b/src/display.c index 8a62f42..40a87db 100644 --- a/src/display.c +++ b/src/display.c @@ -332,6 +332,17 @@ void runes_display_set_fg_color(RunesTerm *t, int color) cairo_set_source(t->cr, runes_display_get_fgcolor(t)); } +void runes_display_set_fg_color_rgb(RunesTerm *t, int r, int g, int b) +{ + t->fgcolor = -2; + if (t->fgcustom) { + cairo_pattern_destroy(t->fgcustom); + } + t->fgcustom = cairo_pattern_create_rgb( + (double)r / 255.0, (double)g / 255.0, (double)b / 255.0); + cairo_set_source(t->cr, runes_display_get_fgcolor(t)); +} + void runes_display_reset_fg_color(RunesTerm *t) { runes_display_set_fg_color(t, -1); @@ -343,6 +354,17 @@ void runes_display_set_bg_color(RunesTerm *t, int color) cairo_set_source(t->cr, runes_display_get_fgcolor(t)); } +void runes_display_set_bg_color_rgb(RunesTerm *t, int r, int g, int b) +{ + t->bgcolor = -2; + if (t->bgcustom) { + cairo_pattern_destroy(t->bgcustom); + } + t->bgcustom = cairo_pattern_create_rgb( + (double)r / 255.0, (double)g / 255.0, (double)b / 255.0); + cairo_set_source(t->cr, runes_display_get_fgcolor(t)); +} + void runes_display_reset_bg_color(RunesTerm *t) { runes_display_set_bg_color(t, -1); @@ -450,12 +472,17 @@ void runes_display_cleanup(RunesTerm *t) int i; g_object_unref(t->layout); - for (i = 0; i < 8; ++i) { + for (i = 0; i < 256; ++i) { cairo_pattern_destroy(t->colors[i]); - cairo_pattern_destroy(t->brightcolors[i]); } cairo_pattern_destroy(t->fgdefault); cairo_pattern_destroy(t->bgdefault); + if (t->fgcustom) { + cairo_pattern_destroy(t->fgcustom); + } + if (t->bgcustom) { + cairo_pattern_destroy(t->bgcustom); + } cairo_pattern_destroy(t->cursorcolor); cairo_pattern_destroy(t->mousecursorcolor); cairo_destroy(t->cr); @@ -468,11 +495,14 @@ static cairo_pattern_t *runes_display_get_fgcolor(RunesTerm *t) if (t->inverse && t->bgcolor == t->fgcolor) { return t->bgdefault; } + else if (color == -2) { + return t->inverse ? t->bgcustom : t->fgcustom; + } else if (color == -1) { return t->inverse ? t->bgdefault : t->fgdefault; } - else if (t->bold_is_bright && t->bold) { - return t->brightcolors[color]; + else if (t->bold_is_bright && t->bold && color < 8) { + return t->colors[color + 8]; } else { return t->colors[color]; @@ -486,6 +516,9 @@ static cairo_pattern_t *runes_display_get_bgcolor(RunesTerm *t) if (t->inverse && t->bgcolor == t->fgcolor) { return t->fgdefault; } + else if (color == -2) { + return t->inverse ? t->bgcustom : t->fgcustom; + } else if (color == -1) { return t->inverse ? t->fgdefault : t->bgdefault; } diff --git a/src/display.h b/src/display.h index cb0b16c..7b1952c 100644 --- a/src/display.h +++ b/src/display.h @@ -22,8 +22,10 @@ void runes_display_reset_underline(RunesTerm *t); void runes_display_set_inverse(RunesTerm *t); void runes_display_reset_inverse(RunesTerm *t); void runes_display_set_fg_color(RunesTerm *t, int color); +void runes_display_set_fg_color_rgb(RunesTerm *t, int r, int g, int b); void runes_display_reset_fg_color(RunesTerm *t); void runes_display_set_bg_color(RunesTerm *t, int color); +void runes_display_set_bg_color_rgb(RunesTerm *t, int r, int g, int b); void runes_display_reset_bg_color(RunesTerm *t); void runes_display_show_cursor(RunesTerm *t); void runes_display_hide_cursor(RunesTerm *t); diff --git a/src/parser.c b/src/parser.c index 48b7ecd..216089e 100644 --- a/src/parser.c +++ b/src/parser.c @@ -2726,6 +2726,48 @@ static void runes_parser_handle_sgr(RunesTerm *t, char *buf, size_t len) case 34: case 35: case 36: case 37: runes_display_set_fg_color(t, params[i] - 30); break; + case 38: { + i++; + if (i >= nparams) { + fprintf( + stderr, "unknown SGR parameter: %d (too few parameters)\n", + params[i - 1]); + break; + } + + switch (params[i]) { + case 2: + i += 3; + if (i >= nparams) { + fprintf( + stderr, + "unknown SGR parameter: %d;%d (too few parameters)\n", + params[i - 4], params[i - 3]); + break; + } + runes_display_set_fg_color_rgb( + t, params[i - 2], params[i - 1], params[i]); + break; + case 5: + i++; + if (i >= nparams) { + fprintf( + stderr, + "unknown SGR parameter: %d;%d (too few parameters)\n", + params[i - 2], params[i - 1]); + break; + } + runes_display_set_fg_color(t, params[i]); + break; + default: + i++; + fprintf( + stderr, "unknown SGR parameter: %d;%d\n", + params[i - 2], params[i - 1]); + break; + } + break; + } case 39: runes_display_reset_fg_color(t); break; @@ -2733,9 +2775,59 @@ static void runes_parser_handle_sgr(RunesTerm *t, char *buf, size_t len) case 44: case 45: case 46: case 47: runes_display_set_bg_color(t, params[i] - 40); break; + case 48: { + i++; + if (i >= nparams) { + fprintf( + stderr, "unknown SGR parameter: %d (too few parameters)\n", + params[i - 1]); + break; + } + + switch (params[i]) { + case 2: + i += 3; + if (i >= nparams) { + fprintf( + stderr, + "unknown SGR parameter: %d;%d (too few parameters)\n", + params[i - 4], params[i - 3]); + break; + } + runes_display_set_bg_color_rgb( + t, params[i - 2], params[i - 1], params[i]); + break; + case 5: + i++; + if (i >= nparams) { + fprintf( + stderr, + "unknown SGR parameter: %d;%d (too few parameters)\n", + params[i - 2], params[i - 1]); + break; + } + runes_display_set_bg_color(t, params[i]); + break; + default: + i++; + fprintf( + stderr, "unknown SGR parameter: %d;%d\n", + params[i - 2], params[i - 1]); + break; + } + break; + } case 49: runes_display_reset_bg_color(t); break; + case 90: case 91: case 92: case 93: + case 94: case 95: case 96: case 97: + runes_display_set_fg_color(t, params[i] - 82); + break; + case 100: case 101: case 102: case 103: + case 104: case 105: case 106: case 107: + runes_display_set_bg_color(t, params[i] - 92); + break; default: fprintf(stderr, "unknown SGR parameter: %d\n", params[i]); break; diff --git a/src/parser.l b/src/parser.l index 7ad27dc..544c623 100644 --- a/src/parser.l +++ b/src/parser.l @@ -597,6 +597,48 @@ static void runes_parser_handle_sgr(RunesTerm *t, char *buf, size_t len) case 34: case 35: case 36: case 37: runes_display_set_fg_color(t, params[i] - 30); break; + case 38: { + i++; + if (i >= nparams) { + fprintf( + stderr, "unknown SGR parameter: %d (too few parameters)\n", + params[i - 1]); + break; + } + + switch (params[i]) { + case 2: + i += 3; + if (i >= nparams) { + fprintf( + stderr, + "unknown SGR parameter: %d;%d (too few parameters)\n", + params[i - 4], params[i - 3]); + break; + } + runes_display_set_fg_color_rgb( + t, params[i - 2], params[i - 1], params[i]); + break; + case 5: + i++; + if (i >= nparams) { + fprintf( + stderr, + "unknown SGR parameter: %d;%d (too few parameters)\n", + params[i - 2], params[i - 1]); + break; + } + runes_display_set_fg_color(t, params[i]); + break; + default: + i++; + fprintf( + stderr, "unknown SGR parameter: %d;%d\n", + params[i - 2], params[i - 1]); + break; + } + break; + } case 39: runes_display_reset_fg_color(t); break; @@ -604,9 +646,59 @@ static void runes_parser_handle_sgr(RunesTerm *t, char *buf, size_t len) case 44: case 45: case 46: case 47: runes_display_set_bg_color(t, params[i] - 40); break; + case 48: { + i++; + if (i >= nparams) { + fprintf( + stderr, "unknown SGR parameter: %d (too few parameters)\n", + params[i - 1]); + break; + } + + switch (params[i]) { + case 2: + i += 3; + if (i >= nparams) { + fprintf( + stderr, + "unknown SGR parameter: %d;%d (too few parameters)\n", + params[i - 4], params[i - 3]); + break; + } + runes_display_set_bg_color_rgb( + t, params[i - 2], params[i - 1], params[i]); + break; + case 5: + i++; + if (i >= nparams) { + fprintf( + stderr, + "unknown SGR parameter: %d;%d (too few parameters)\n", + params[i - 2], params[i - 1]); + break; + } + runes_display_set_bg_color(t, params[i]); + break; + default: + i++; + fprintf( + stderr, "unknown SGR parameter: %d;%d\n", + params[i - 2], params[i - 1]); + break; + } + break; + } case 49: runes_display_reset_bg_color(t); break; + case 90: case 91: case 92: case 93: + case 94: case 95: case 96: case 97: + runes_display_set_fg_color(t, params[i] - 82); + break; + case 100: case 101: case 102: case 103: + case 104: case 105: case 106: case 107: + runes_display_set_bg_color(t, params[i] - 92); + break; default: fprintf(stderr, "unknown SGR parameter: %d\n", params[i]); break; diff --git a/src/term.h b/src/term.h index 89a0c54..c1d49ac 100644 --- a/src/term.h +++ b/src/term.h @@ -15,8 +15,9 @@ struct runes_term { cairo_pattern_t *fgdefault; cairo_pattern_t *bgdefault; - cairo_pattern_t *colors[8]; - cairo_pattern_t *brightcolors[8]; + cairo_pattern_t *colors[256]; + cairo_pattern_t *fgcustom; + cairo_pattern_t *bgcustom; int fgcolor; int bgcolor; -- cgit v1.2.3-54-g00ecf