summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2006-10-29 20:08:04 +0000
committerRich Felker <dalias@aerifal.cx>2006-10-29 20:08:04 +0000
commit00da2cbd1f047558aee3b6c8ea85d6b092bb9dd1 (patch)
tree4ee17e11e3ff63b0f203243c76d9ceda35bfc720
parent89fd3b76518cf3004053331c580a349afaaf2dab (diff)
100l: forgot to add this with the uucell overhaul
-rw-r--r--cell.c160
-rw-r--r--dblbuf.c7
2 files changed, 167 insertions, 0 deletions
diff --git a/cell.c b/cell.c
new file mode 100644
index 0000000..101dce8
--- /dev/null
+++ b/cell.c
@@ -0,0 +1,160 @@
+/* uuterm, Copyright (C) 2006 Rich Felker; licensed under GNU GPL v2 only */
+
+#include <wchar.h>
+#include "uuterm.h"
+
+static const unsigned short comb[] = {
+0x300,0x301,0x302,0x303,0x304,0x305,0x306,0x307,
+0x308,0x309,0x30A,0x30B,0x30C,0x30D,0x30E,0x30F,
+0x310,0x311,0x312,0x313,0x314,0x315,0x316,0x317,
+0x318,0x319,0x31A,0x31B,0x31C,0x31D,0x31E,0x31F,
+0x320,0x321,0x322,0x323,0x324,0x325,0x326,0x327,
+0x328,0x329,0x32A,0x32B,0x32C,0x32D,0x32E,0x32F,
+0x330,0x331,0x332,0x333,0x334,0x335,0x336,0x337,
+0x338,0x339,0x33A,0x33B,0x33C,0x33D,0x33E,0x33F,
+0x340,0x341,0x342,0x343,0x344,0x345,0x346,0x347,
+0x348,0x349,0x34A,0x34B,0x34C,0x34D,0x34E,0x34F,
+0x350,0x351,0x352,0x353,0x354,0x355,0x356,0x357,
+0x35D,0x35E,0x35F,0x360,0x361,0x362,0x363,0x364,
+0x365,0x366,0x367,0x368,0x369,0x36A,0x36B,0x36C,
+0x36D,0x36E,0x36F,0x483,0x484,0x485,0x486,0x488,
+0x489,0x591,0x592,0x593,0x594,0x595,0x596,0x597,
+0x598,0x599,0x59A,0x59B,0x59C,0x59D,0x59E,0x59F,
+0x5A0,0x5A1,0x5A3,0x5A4,0x5A5,0x5A6,0x5A7,0x5A8,
+0x5A9,0x5AA,0x5AB,0x5AC,0x5AD,0x5AE,0x5AF,0x5B0,
+0x5B1,0x5B2,0x5B3,0x5B4,0x5B5,0x5B6,0x5B7,0x5B8,
+0x5B9,0x5BB,0x5BC,0x5BD,0x5BF,0x5C1,0x5C2,0x5C4,
+0x600,0x601,0x602,0x603,0x610,0x611,0x612,0x613,
+0x614,0x615,0x64B,0x64C,0x64D,0x64E,0x64F,0x650,
+0x651,0x652,0x653,0x654,0x655,0x656,0x657,0x658,
+0x670,0x6D6,0x6D7,0x6D8,0x6D9,0x6DA,0x6DB,0x6DC,
+0x6DD,0x6DE,0x6DF,0x6E0,0x6E1,0x6E2,0x6E3,0x6E4,
+0x6E7,0x6E8,0x6EA,0x6EB,0x6EC,0x6ED,0x70F,0x711,
+0x730,0x731,0x732,0x733,0x734,0x735,0x736,0x737,
+0x738,0x739,0x73A,0x73B,0x73C,0x73D,0x73E,0x73F,
+0x740,0x741,0x742,0x743,0x744,0x745,0x746,0x747,
+0x748,0x749,0x74A,0x7A6,0x7A7,0x7A8,0x7A9,0x7AA,
+0x7AB,0x7AC,0x7AD,0x7AE,0x7AF,0x7B0,0x901,0x902,
+0x93C,0x941,0x942,0x943,0x944,0x945,0x946,0x947,
+0x948,0x94D,0x951,0x952,0x953,0x954,0x962,0x963,
+0x981,0x9BC,0x9C1,0x9C2,0x9C3,0x9C4,0x9CD,0x9E2,
+0x9E3,0xA01,0xA02,0xA3C,0xA41,0xA42,0xA47,0xA48,
+0xA4B,0xA4C,0xA4D,0xA70,0xA71,0xA81,0xA82,0xABC,
+0xAC1,0xAC2,0xAC3,0xAC4,0xAC5,0xAC7,0xAC8,0xACD,
+0xAE2,0xAE3,0xB01,0xB3C,0xB3F,0xB41,0xB42,0xB43,
+0xB4D,0xB56,0xB82,0xBC0,0xBCD,0xBF8,0xC3E,0xC3F,
+0xC40,0xC46,0xC47,0xC48,0xC4A,0xC4B,0xC4C,0xC4D,
+0xC55,0xC56,0xCBC,0xCBF,0xCC6,0xCCC,0xCCD,0xD41,
+0xD42,0xD43,0xD4D,0xDCA,0xDD2,0xDD3,0xDD4,0xDD6,
+0xE31,0xE34,0xE35,0xE36,0xE37,0xE38,0xE39,0xE3A,
+0xE47,0xE48,0xE49,0xE4A,0xE4B,0xE4C,0xE4D,0xE4E,
+0xEB1,0xEB4,0xEB5,0xEB6,0xEB7,0xEB8,0xEB9,0xEBB,
+0xEBC,0xEC8,0xEC9,0xECA,0xECB,0xECC,0xECD,0xF18,
+0xF19,0xF35,0xF37,0xF39,0xF71,0xF72,0xF73,0xF74,
+0xF75,0xF76,0xF77,0xF78,0xF79,0xF7A,0xF7B,0xF7C,
+0xF7D,0xF7E,0xF80,0xF81,0xF82,0xF83,0xF84,0xF86,
+0xF87,0xF90,0xF91,0xF92,0xF93,0xF94,0xF95,0xF96,
+0xF97,0xF99,0xF9A,0xF9B,0xF9C,0xF9D,0xF9E,0xF9F,
+0xFA0,0xFA1,0xFA2,0xFA3,0xFA4,0xFA5,0xFA6,0xFA7,
+0xFA8,0xFA9,0xFAA,0xFAB,0xFAC,0xFAD,0xFAE,0xFAF,
+0xFB0,0xFB1,0xFB2,0xFB3,0xFB4,0xFB5,0xFB6,0xFB7,
+0xFB8,0xFB9,0xFBA,0xFBB,0xFBC,0xFC6,0x102D,0x102E,
+0x102F,0x1030,0x1032,0x1036,0x1037,0x1039,0x1058,0x1059,
+0x1712,0x1713,0x1714,0x1732,0x1733,0x1734,0x1752,0x1753,
+0x1772,0x1773,0x17B4,0x17B5,0x17B7,0x17B8,0x17B9,0x17BA,
+0x17BB,0x17BC,0x17BD,0x17C6,0x17C9,0x17CA,0x17CB,0x17CC,
+0x17CD,0x17CE,0x17CF,0x17D0,0x17D1,0x17D2,0x17D3,0x17DD,
+0x180B,0x180C,0x180D,0x18A9,0x1920,0x1921,0x1922,0x1927,
+0x1928,0x1932,0x1939,0x193A,0x193B,0x200B,0x200C,0x200D,
+0x200E,0x200F,0x202A,0x202B,0x202C,0x202D,0x202E,0x2060,
+0x2061,0x2062,0x2063,0x206A,0x206B,0x206C,0x206D,0x206E,
+0x206F,0x20D0,0x20D1,0x20D2,0x20D3,0x20D4,0x20D5,0x20D6,
+0x20D7,0x20D8,0x20D9,0x20DA,0x20DB,0x20DC,0x20DD,0x20DE,
+0x20DF,0x20E0,0x20E1,0x20E2,0x20E3,0x20E4,0x20E5,0x20E6,
+0x20E7,0x20E8,0x20E9,0x20EA,0x302A,0x302B,0x302C,0x302D,
+0x302E,0x302F,0x3099,0x309A,0xFB1E,0xFE20,0xFE21,0xFE22,
+0xFE23,0xFEFF,
+};
+
+static int comb_enc(wchar_t c)
+{
+ int a, n;
+
+ if (c > 0xffff) return 0;
+ for (a=0, n=(sizeof(comb)/sizeof(comb[0])+1)/2; n>1; n=n+1>>1)
+ a += n & ((signed)(comb[a+n]-c-1) >> 21);
+ if (comb[a]<c) a++;
+ return comb[a]==c ? a+1 : 0;
+}
+
+#define BASE_BIT 11
+#define COLOR_BIT 16
+
+#define COMB_MASK 0x3ff
+#define MAX_COMB 5
+
+static const int comb_idx[] = { 0, 1, 1, 1, 2 };
+static const int comb_bit[] = { 1, 0, 10, 20, 0 };
+
+/*
+** Bit layout (B=base char, #=combining chars, C=color, A=attr
+** 0: BBBBBBBBBBBBBBBBBBBBB0000000000A
+** 1: AA333333333322222222221111111111
+** 2: CCCCCCCCCCCCCCCCAAAAAA4444444444
+** Attribute bits have been placed not to overlap. The attribute
+** bits defined in uuterm.h must come from available positions.
+*/
+
+#define ATTR_MASK0 0x00000001
+#define ATTR_MASK1 0 /* 0xC0000000 */
+#define ATTR_MASK2 0 /* 0x0000FC00 */
+
+void uucell_set(struct uucell *cell, wchar_t wc, int attr, int color)
+{
+ if (attr & UU_ATTR_REV) {
+ int tmp = color & 255;
+ color >>= 8;
+ color |= tmp << 8;
+ }
+ cell->x[0] = (attr & ATTR_MASK0) | (wc << BASE_BIT);
+ cell->x[1] = (attr & ATTR_MASK1);
+ cell->x[2] = (attr & ATTR_MASK2) | (color << COLOR_BIT);
+}
+
+void uucell_append(struct uucell *cell, wchar_t wc)
+{
+ int i;
+ for (i=0; i<MAX_COMB; i++) {
+ if (!((cell->x[comb_idx[i]]>>comb_bit[i]) & COMB_MASK)) {
+ cell->x[comb_idx[i]] |= comb_enc(wc)<<comb_bit[i];
+ return;
+ }
+ }
+}
+
+int uucell_get_attr(struct uucell *cell)
+{
+ return (cell->x[0] & ATTR_MASK0)
+ | (cell->x[1] & ATTR_MASK1)
+ | (cell->x[2] & ATTR_MASK2);
+}
+
+int uucell_get_color(struct uucell *cell)
+{
+ return cell->x[2] >> COLOR_BIT;
+}
+
+int uucell_get_wcs(struct uucell *cell, wchar_t *ws, size_t l)
+{
+ int i, c;
+ if (!l--) return 0;
+ *ws++ = cell->x[0] >> BASE_BIT;
+ for (i=0; l; i++,l--) {
+ c = (cell->x[comb_idx[i]]>>comb_bit[i]) & COMB_MASK;
+ if (c) c = comb[c-1];
+ if (!(*ws++ = c))
+ l = 1;
+ }
+ ws[-1] = 0;
+ return i;
+}
diff --git a/dblbuf.c b/dblbuf.c
index 18e2cd5..f6cbd88 100644
--- a/dblbuf.c
+++ b/dblbuf.c
@@ -92,10 +92,17 @@ static unsigned long expand_color(struct uudisp *d, int color)
struct dblbuf *b = (void *)&d->priv;
static const unsigned char cmap[8] = {0,4,2,6,1,5,3,7};
static const unsigned char defpal[16][3] = {
+#if 0
+ { 0,0,0 }, { 128,0,0 }, { 0,128,0 }, { 85,85,0 },
+ { 0,0,128 }, { 85,0,85 }, { 0,85,85 }, { 170,170,170 },
+ { 85,85,85 }, { 255,0,0 }, { 0,255,85 }, { 255,255,0 },
+ { 0,0,255 }, { 255,0,255 }, { 0,255,255 }, { 255,255,255 }
+#else
{ 0,0,0 }, { 96,0,0 }, { 0,96,0 }, { 85,85,0 },
{ 0,0,144 }, { 96,0,96 }, { 0,96,96 }, { 170,170,170 },
{ 85,85,85 }, { 255,85,85 }, { 85,255,85 }, { 255,255,85 },
{ 85,85,255 }, { 255,85,255 }, { 85,255,255 }, { 255,255,255 }
+#endif
};
if (b->bytes_per_pixel > 1) {
int R = defpal[color][0];