}
}
+#include "table/linedraw.h"
+
struct rxvt_font_default : rxvt_font {
+
rxvt_fontprop properties ()
{
rxvt_fontprop p;
width = 1; height = 1;
ascent = 1; descent = 0;
- set_name ("built-in pseudofont");
+ set_name (strdup ("built-in pseudofont"));
return true;
}
if (unicode >= 0x0080 && unicode <= 0x009f)
return true;
- if (unicode >= 0x2500 && unicode <= 0x259f)
+ if (unicode >= 0x2500 && unicode <= 0x259f
+ && linedraw_offs[unicode - 0x2500] & 15)
return true;
if (IS_COMPOSE (unicode))
int fg, int bg);
};
-static void rect_stipple (Display *display, Drawable d, GC gc, int s1, int s2, int x, int y, int w, int h)
-{
- XGCValues gcv;
- char bm[2] = { s1, s2 };
-
- gcv.fill_style = FillStippled;
- gcv.stipple = XCreateBitmapFromData (display, d, bm, 2, 2);
- gcv.ts_x_origin = x;
- gcv.ts_y_origin = y;
-
- if (!gcv.stipple)
- return;
-
- XChangeGC (display, gc, GCFillStyle | GCStipple | GCTileStipXOrigin | GCTileStipYOrigin, &gcv);
- XFillRectangle (display, d, gc, x, y, w, h);
-
- XFreePixmap (display, gcv.stipple);
-
- gcv.fill_style = FillSolid;
- XChangeGC (display, gc, GCFillStyle, &gcv);
-}
-
-#include "table/linedraw.h"
-
void
rxvt_font_default::draw (rxvt_drawable &d, int x, int y,
const text_t *text, int len,
int fg, int bg)
{
+return;
clear_rect (d, x, y, r->TermWin.fwidth * len, r->TermWin.fheight, bg);
XSetForeground (d.display->display, TGC, r->PixColors[fg]);
#endif
text_t t = *text++;
- int x_[16];
- int y_[16];
-
int W = r->TermWin.fwidth , w = (W - 1) / 2;
int H = r->TermWin.fheight, h = (H - 1) / 2;
int x0 = x, x1 = x + w, x2 = x + r->TermWin.fwidth ;
int y0 = y, y1 = y + h, y2 = y + r->TermWin.fheight;
- for (int i = 0; i <= 8; i++)
+ if (0x2500 <= t && t <= 0x259f
+ && linedraw_offs[t - 0x2500] & 15)
{
- x_[i] = x + ((W-1) * i + (i*7/8)) / 8;
- y_[i] = y + ((H-1) * i + (i*7/8)) / 8;
- }
+ uint16_t offs = linedraw_offs[t - 0x2500];
+ uint32_t *a = linedraw_command + (offs >> 4);
+ uint32_t *b = a + (offs & 15);
- x_[10] = x + (W - 1) / 2; x_[9] = x_[10] - 1; x_[11] = x_[10] + 1;
- y_[10] = y + (H - 1) / 2; y_[9] = y_[10] - 1; y_[11] = y_[10] + 1;
+ int x_[16];
+ int y_[16];
- int i1 = linedraw_offs[t - 0x2500];
- int i2 = linedraw_offs[t - 0x2500 + 1];
+ for (int i = 0; i <= 8; i++)
+ {
+ x_[i] = x + ((W-1) * i + (i*7/8)) / 8;
+ y_[i] = y + ((H-1) * i + (i*7/8)) / 8;
+ }
- XGCValues gcv;
+ x_[10] = x + (W - 1) / 2; x_[9] = x_[10] - 1; x_[11] = x_[10] + 1;
+ y_[10] = y + (H - 1) / 2; y_[9] = y_[10] - 1; y_[11] = y_[10] + 1;
- gcv.cap_style = CapButt;
- gcv.line_width = 0;
- XChangeGC (d.display->display, TGC, GCLineWidth | GCCapStyle, &gcv);
+ XGCValues gcv;
- if (i1 != i2)
- {
- while (i1 < i2)
+ gcv.cap_style = CapButt;
+ gcv.line_width = 0;
+ XChangeGC (d.display->display, TGC, GCLineWidth | GCCapStyle, &gcv);
+
+ while (a < b)
{
- uint32_t command = linedraw_command [i1++];
+ uint32_t command = *a++;
int op = (command >> 24) & 255;
int a = (command >> 20) & 15;
case 1: // rectangle, possibly stippled
if (a)
{
- static char bm[] = { 0,0 , 1,3 , 2,1 , 0,1 };
+ static char bm[] = { 0,0 , 3,1 , 1,2 , 1,0 };
gcv.fill_style = FillStippled;
gcv.stipple = XCreateBitmapFromData (d.display->display, d, bm + a * 2, 2, 2);
if (a)
{
XFreePixmap (d.display->display, gcv.stipple);
+ gcv.stipple = 0;
gcv.fill_style = FillSolid;
XChangeGC (d.display->display, TGC, GCFillStyle, &gcv);
}
break;
case 2: // arc
+ XDrawArc (d.display->display, d, TGC,
+ x1 - W/2, y1 - H/2, W-1, H-1,
+ (a - 1) * 90*64, (b - 1) * 90*64);
break;
}
}
-
-#if 0
- case 'A': XDrawArc (d.display->display, d, TGC, x1 , y1 , W-1, H-1, 90*64, 90*64); break;
- case 'B': XDrawArc (d.display->display, d, TGC, x1-W+1, y1 , W-1, H-1, 0*64, 90*64); break;
- case 'C': XDrawArc (d.display->display, d, TGC, x1-W+1, y1-H+1, W-1, H-1, 0*64, -90*64); break;
- case 'D': XDrawArc (d.display->display, d, TGC, x1 , y1-H+1, W-1, H-1, -90*64, -90*64); break;
-
- case 'i': XFillRectangle (d.display->display, d, TGC, x0, y0, x1 - x0 + 1, y1 - y0 + 1); break;
- case 'j': XFillRectangle (d.display->display, d, TGC, x1, y0, x2 - x1, y1 - y0 + 1); break;
- case 'k': XFillRectangle (d.display->display, d, TGC, x0, y1, x1 - x0 + 1, y2 - y1); break;
- case 'l': XFillRectangle (d.display->display, d, TGC, x1, y1, x2 - x1, y2 - y1); break;
- }
- }
-#endif
-
}
#if ENABLE_COMBINING
else if (IS_COMPOSE (t) && (cc = rxvt_composite[t]))
case ZERO_WIDTH_CHAR:
break;
-#if 0
- case 0x2580: XFillRectangle (d.display->display, d, TGC, x0, y0, W, y1 - y0 + 1); break;
- case 0x2581: XFillRectangle (d.display->display, d, TGC, x0, y0 + (H * 7 - 1) / 8, W, H - (H * 7 - 1) / 8); break;
- case 0x2582: XFillRectangle (d.display->display, d, TGC, x0, y0 + (H * 6 - 2) / 8, W, H - (H * 6 - 2) / 8); break;
- case 0x2583: XFillRectangle (d.display->display, d, TGC, x0, y0 + (H * 5 - 3) / 8, W, H - (H * 5 - 3) / 8); break;
- case 0x2584: XFillRectangle (d.display->display, d, TGC, x0, y0 + (H * 4 - 4) / 8, W, H - (H * 4 - 4) / 8); break;
- case 0x2585: XFillRectangle (d.display->display, d, TGC, x0, y0 + (H * 3 - 5) / 8, W, H - (H * 3 - 5) / 8); break;
- case 0x2586: XFillRectangle (d.display->display, d, TGC, x0, y0 + (H * 2 - 6) / 8, W, H - (H * 2 - 6) / 8); break;
- case 0x2587: XFillRectangle (d.display->display, d, TGC, x0, y0 + (H * 1 - 7) / 8, W, H - (H * 1 - 7) / 8); break;
- case 0x2588: XFillRectangle (d.display->display, d, TGC, x0, y0, W, H); break;
- case 0x2589: XFillRectangle (d.display->display, d, TGC, x0, y0, (W * 7 - 1) / 8, H); break;
- case 0x258a: XFillRectangle (d.display->display, d, TGC, x0, y0, (W * 6 - 2) / 8, H); break;
- case 0x258b: XFillRectangle (d.display->display, d, TGC, x0, y0, (W * 5 - 3) / 8, H); break;
- case 0x258c: XFillRectangle (d.display->display, d, TGC, x0, y0, (W * 4 - 4) / 8, H); break;
- case 0x258d: XFillRectangle (d.display->display, d, TGC, x0, y0, (W * 3 - 5) / 8, H); break;
- case 0x258e: XFillRectangle (d.display->display, d, TGC, x0, y0, (W * 2 - 6) / 8, H); break;
- case 0x258f: XFillRectangle (d.display->display, d, TGC, x0, y0, (W * 1 - 7) / 8, H); break;
- case 0x2590: XFillRectangle (d.display->display, d, TGC, x1, y0, x2 - x1, H); break;
-
- case 0x2591: rect_stipple (d.display->display, d, TGC, 0x00, 0x01, x0, y0, W, H); break;
- case 0x2592: rect_stipple (d.display->display, d, TGC, 0x02, 0x01, x0, y0, W, H); break;
- case 0x2593: rect_stipple (d.display->display, d, TGC, 0x01, 0x03, x0, y0, W, H); break;
-
- case 0x2594: XFillRectangle (d.display->display, d, TGC, x0, y0, W, (H * 1 - 7) / 8); break;
- case 0x2595: XFillRectangle (d.display->display, d, TGC, x0 + (W * 7 - 1) / 8, y0, W - (W * 7 - 1) / 8, H); break;
-#endif
-
default:
int w = 0;
while (len > 0 && *text == NOCHAR)
--- /dev/null
+#!/usr/bin/perl
+
+open TABLE, ">", "table/linedraw.h";
+select TABLE;
+
+my $ch = 0x2500;
+
+# coordinate system:
+#
+# 0..8 (equally spaced) 9,11 mid-1,mid+1, makes 4 bit
+# one point = 8 bit, two points = 16 bit
+
+# 8 bit opcode 0 line, 1 rect, 2 arc
+# 8 bit opcode arg
+
+# OOOOOOOO AAAABBBB X1X1Y1Y1 X2X2Y2Y2
+
+my $offs = 0;
+my @offs;
+
+sub emit {
+ my ($code, $x1, $y1, $x2, $y2, $a, $b) = @_;
+ $offs++;
+ printf " 0x%08lx,", ($code << 24)
+ | ($x1 << 12)
+ | ($y1 << 8)
+ | ($x2 << 4)
+ | ($y2 << 0)
+ | ($a << 20)
+ | ($b << 16);
+}
+
+print "static uint32_t linedraw_command[] = {\n";
+
+while (<DATA>) {
+ next if /^\//;
+ next unless /\S/;
+
+ push @offs, $offs;
+
+ my ($v, $V, $h, $H, $s);
+
+ for (;;) {
+ /\G-/gc and last;
+ /\G$/gc and last;
+
+ /\G([123])/gc and $w = $1;
+
+ /\Gh/gc and $h = $w;
+ /\GH/gc and $H = $w;
+ /\Gv/gc and $v = $w;
+ /\GV/gc and $V = $w;
+
+ /\G\//gc and emit 0, 0, 8, 8, 0;
+ /\G\\/gc and emit 0, 0, 0, 8, 8;
+
+ /\GA/gc and emit 2, 8, 8, 0, 0, 2, 2;
+ /\GB/gc and emit 2, 0, 8, 0, 0, 1, 2;
+ /\GC/gc and emit 2, 0, 0, 0, 0, 1, 0;
+ /\GD/gc and emit 2, 8, 0, 0, 0, 0, 0;
+
+ /\Gi/gc and emit 1, 0, 0, 4, 4;
+ /\Gj/gc and emit 1, 4, 0, 8, 4;
+ /\Gk/gc and emit 1, 0, 4, 4, 8;
+ /\Gl/gc and emit 1, 4, 4, 8, 8;
+
+ /\Gs(\d)/gc and $s = $1;
+
+ /\Gr(\d+),(\d+),(\d+),(\d+)/gc and emit 1, $1, $2, $3, $4, $s;
+
+ /\G\s/gc;
+ }
+
+ if ($h) {
+ emit 0, 0, 9,10, 9 if $h > 1;
+ emit 0, 0, 10,10, 10 if $h & 1;
+ emit 0, 0, 11,10, 11 if $h > 1;
+ }
+
+ if ($H) {
+ emit 0,10, 9, 8, 9 if $H > 1;
+ emit 0,10, 10, 8, 10 if $H & 1;
+ emit 0,10, 11, 8, 11 if $H > 1;
+ }
+
+ if ($v) {
+ emit 0, 9, 0, 9, 10 if $v > 1;
+ emit 0,10, 0,10, 10 if $v & 1;
+ emit 0,11, 0,11, 10 if $v > 1;
+ }
+
+ if ($V) {
+ emit 0, 9, 10, 9, 8 if $V > 1;
+ emit 0,10, 10,10, 8 if $V & 1;
+ emit 0,11, 10,11, 8 if $V > 1;
+ }
+
+ $offs[-1] = ($offs[-1] << 4) | ($offs - $offs[-1]);
+
+ printf " // %04x\n", $ch;
+ $ch++;
+}
+
+print <<EOF;
+};
+
+static uint16_t linedraw_offs[] = {
+EOF
+
+for (@offs) {
+ printf " 0x%04x,", $_;
+ print "\n" if ++$cnt % 5 == 0;
+}
+
+print <<EOF;
+};
+
+EOF
+
+__END__
+// 2500
+
+1hH
+3hH
+1vV
+3vV
+
+r0,10,1,10 r3,10,5,10 r7,10,8,10
+r0,9,1,11 r3,9,5,11 r7,9,8,11
+r10,0,10,1 r10,3,10,5 r10,7,10,8
+r9,0,11,1 r9,3,11,5 r9,7,11,8
+
+r0,10,1,10 r2,10,3,10 r4,10,5,10 r6,10,7,10
+r0,9,1,11 r2,9,3,11 r4,9,5,11 r6,9,7,11
+r10,0,10,1 r10,2,10,3 r10,4,10,5 r10,6,10,7
+r9,0,11,1 r9,2,11,3 r9,4,11,5 r9,6,11,7
+
+1HV
+3H1V
+1H3V
+3HV
+
+
+// 2510
+
+1hV
+3h1V
+1h3V
+3hV
+
+1Hv
+3H1v
+1H3v
+3Hv
+
+1hv
+3h1v
+1h3v
+3hv
+
+1HvV
+3H1vV
+1HV3v
+1Hv3V
+
+
+// 2530
+
+1H3vV
+3Hv1V
+3HV1v
+3HvV
+
+1hvV
+3h1vV
+1hV3v
+1hv3V
+
+1h3vV
+3hv1V
+1v3hV
+3hvV
+
+1hHV
+3h1HV
+3H1hV
+3hH1V
+
+
+// 2530
+
+1hH3V
+3hV1H
+1h3HV
+3hHV
+
+1hHv
+1vH3h
+1hv3H
+1v3hH
+
+1hH3v
+1H3hv
+1h3Hv
+3hHv
+
+1hHvV
+1vVH3h
+1hvV3H
+1vV3hH
+
+
+// 2540
+
+1hHV3v
+1hHv3V
+1hH3vV
+1HV3hv
+
+1hV3Hv
+1Hv3hV
+1hv3HV
+1V3hHv
+
+1v3hHV
+1H3hvV
+1h3HvV
+3hHvV
+
+-
+-
+-
+-
+
+
+// 2550
+
+2hH
+2vV
+1V2H
+2V1H
+
+2VH
+2h1V
+1h2V
+2hV
+
+1v2H
+2v1H
+2vH
+2h1v
+
+1h2v
+2hv
+1vV2H
+2vV1H
+
+
+// 2560
+
+2vVH
+2h1vV
+1h2vV
+2hvV
+
+2hH1V
+2V1hH
+2hHV
+1v2hH
+
+2v1hH
+2vhH
+1vV2hH
+1hH2vV
+
+2hHvV
+A
+B
+C
+
+
+// 2570
+
+D
+1/
+1\
+1/\
+
+1h
+1v
+1H
+1V
+
+3h
+3v
+3H
+3V
+
+1h3H
+1v3V
+1H3h
+1V3v
+
+
+// 2580
+
+r0,0,8,4
+r0,7,8,8
+r0,6,8,8
+r0,5,8,8
+
+r0,4,8,8
+r0,3,8,8
+r0,2,8,8
+r0,1,8,8
+
+r0,0,8,8
+r0,0,7,8
+r0,0,6,8
+r0,0,5,8
+
+r0,0,4,8
+r0,0,3,8
+r0,0,2,8
+r0,0,1,8
+
+
+// 2590
+
+r4,0,8,8
+s3r0,0,8,8
+s2r0,0,8,8
+s1r0,0,8,8
+
+r0,0,8,1
+r7,0,8,8
+k
+l
+
+i
+ikl
+il
+ijk
+
+ijl
+j
+jk
+jkl
+
+
--- /dev/null
+static uint32_t linedraw_command[] = {
+ 0x00000aaa, 0x0000aa8a, // 2500
+ 0x000009a9, 0x00000aaa, 0x00000bab, 0x0000a989, 0x0000aa8a, 0x0000ab8b, // 2501
+ 0x0000a0aa, 0x0000aaa8, // 2502
+ 0x0000909a, 0x0000a0aa, 0x0000b0ba, 0x00009a98, 0x0000aaa8, 0x0000bab8, // 2503
+ 0x01000a1a, 0x01003a5a, 0x01007a8a, // 2504
+ 0x0100091b, 0x0100395b, 0x0100798b, // 2505
+ 0x0100a0a1, 0x0100a3a5, 0x0100a7a8, // 2506
+ 0x010090b1, 0x010093b5, 0x010097b8, // 2507
+ 0x01000a1a, 0x01002a3a, 0x01004a5a, 0x01006a7a, // 2508
+ 0x0100091b, 0x0100293b, 0x0100495b, 0x0100697b, // 2509
+ 0x0100a0a1, 0x0100a2a3, 0x0100a4a5, 0x0100a6a7, // 250a
+ 0x010090b1, 0x010092b3, 0x010094b5, 0x010096b7, // 250b
+ 0x0000aa8a, 0x0000aaa8, // 250c
+ 0x0000a989, 0x0000aa8a, 0x0000ab8b, 0x0000aaa8, // 250d
+ 0x0000aa8a, 0x00009a98, 0x0000aaa8, 0x0000bab8, // 250e
+ 0x0000a989, 0x0000aa8a, 0x0000ab8b, 0x00009a98, 0x0000aaa8, 0x0000bab8, // 250f
+ 0x00000aaa, 0x0000aaa8, // 2510
+ 0x000009a9, 0x00000aaa, 0x00000bab, 0x0000aaa8, // 2511
+ 0x00000aaa, 0x00009a98, 0x0000aaa8, 0x0000bab8, // 2512
+ 0x000009a9, 0x00000aaa, 0x00000bab, 0x00009a98, 0x0000aaa8, 0x0000bab8, // 2513
+ 0x0000aa8a, 0x0000a0aa, // 2514
+ 0x0000a989, 0x0000aa8a, 0x0000ab8b, 0x0000a0aa, // 2515
+ 0x0000aa8a, 0x0000909a, 0x0000a0aa, 0x0000b0ba, // 2516
+ 0x0000a989, 0x0000aa8a, 0x0000ab8b, 0x0000909a, 0x0000a0aa, 0x0000b0ba, // 2517
+ 0x00000aaa, 0x0000a0aa, // 2518
+ 0x000009a9, 0x00000aaa, 0x00000bab, 0x0000a0aa, // 2519
+ 0x00000aaa, 0x0000909a, 0x0000a0aa, 0x0000b0ba, // 251a
+ 0x000009a9, 0x00000aaa, 0x00000bab, 0x0000909a, 0x0000a0aa, 0x0000b0ba, // 251b
+ 0x0000aa8a, 0x0000a0aa, 0x0000aaa8, // 251c
+ 0x0000a989, 0x0000aa8a, 0x0000ab8b, 0x0000a0aa, 0x0000aaa8, // 251d
+ 0x0000aa8a, 0x0000909a, 0x0000a0aa, 0x0000b0ba, 0x0000aaa8, // 251e
+ 0x0000aa8a, 0x0000a0aa, 0x00009a98, 0x0000aaa8, 0x0000bab8, // 251f
+ 0x0000aa8a, 0x0000909a, 0x0000a0aa, 0x0000b0ba, 0x00009a98, 0x0000aaa8, 0x0000bab8, // 2520
+ 0x0000a989, 0x0000aa8a, 0x0000ab8b, 0x0000909a, 0x0000a0aa, 0x0000b0ba, 0x0000aaa8, // 2521
+ 0x0000a989, 0x0000aa8a, 0x0000ab8b, 0x0000a0aa, 0x00009a98, 0x0000aaa8, 0x0000bab8, // 2522
+ 0x0000a989, 0x0000aa8a, 0x0000ab8b, 0x0000909a, 0x0000a0aa, 0x0000b0ba, 0x00009a98, 0x0000aaa8, 0x0000bab8, // 2523
+ 0x00000aaa, 0x0000a0aa, 0x0000aaa8, // 2524
+ 0x000009a9, 0x00000aaa, 0x00000bab, 0x0000a0aa, 0x0000aaa8, // 2525
+ 0x00000aaa, 0x0000909a, 0x0000a0aa, 0x0000b0ba, 0x0000aaa8, // 2526
+ 0x00000aaa, 0x0000a0aa, 0x00009a98, 0x0000aaa8, 0x0000bab8, // 2527
+ 0x00000aaa, 0x0000909a, 0x0000a0aa, 0x0000b0ba, 0x00009a98, 0x0000aaa8, 0x0000bab8, // 2528
+ 0x000009a9, 0x00000aaa, 0x00000bab, 0x0000909a, 0x0000a0aa, 0x0000b0ba, 0x0000aaa8, // 2529
+ 0x000009a9, 0x00000aaa, 0x00000bab, 0x0000a0aa, 0x00009a98, 0x0000aaa8, 0x0000bab8, // 252a
+ 0x000009a9, 0x00000aaa, 0x00000bab, 0x0000909a, 0x0000a0aa, 0x0000b0ba, 0x00009a98, 0x0000aaa8, 0x0000bab8, // 252b
+ 0x00000aaa, 0x0000aa8a, 0x0000aaa8, // 252c
+ 0x000009a9, 0x00000aaa, 0x00000bab, 0x0000aa8a, 0x0000aaa8, // 252d
+ 0x00000aaa, 0x0000a989, 0x0000aa8a, 0x0000ab8b, 0x0000aaa8, // 252e
+ 0x000009a9, 0x00000aaa, 0x00000bab, 0x0000a989, 0x0000aa8a, 0x0000ab8b, 0x0000aaa8, // 252f
+ 0x00000aaa, 0x0000aa8a, 0x00009a98, 0x0000aaa8, 0x0000bab8, // 2530
+ 0x000009a9, 0x00000aaa, 0x00000bab, 0x0000aa8a, 0x00009a98, 0x0000aaa8, 0x0000bab8, // 2531
+ 0x00000aaa, 0x0000a989, 0x0000aa8a, 0x0000ab8b, 0x00009a98, 0x0000aaa8, 0x0000bab8, // 2532
+ 0x000009a9, 0x00000aaa, 0x00000bab, 0x0000a989, 0x0000aa8a, 0x0000ab8b, 0x00009a98, 0x0000aaa8, 0x0000bab8, // 2533
+ 0x00000aaa, 0x0000aa8a, 0x0000a0aa, // 2534
+ 0x000009a9, 0x00000aaa, 0x00000bab, 0x0000aa8a, 0x0000a0aa, // 2535
+ 0x00000aaa, 0x0000a989, 0x0000aa8a, 0x0000ab8b, 0x0000a0aa, // 2536
+ 0x000009a9, 0x00000aaa, 0x00000bab, 0x0000a989, 0x0000aa8a, 0x0000ab8b, 0x0000a0aa, // 2537
+ 0x00000aaa, 0x0000aa8a, 0x0000909a, 0x0000a0aa, 0x0000b0ba, // 2538
+ 0x000009a9, 0x00000aaa, 0x00000bab, 0x0000aa8a, 0x0000909a, 0x0000a0aa, 0x0000b0ba, // 2539
+ 0x00000aaa, 0x0000a989, 0x0000aa8a, 0x0000ab8b, 0x0000909a, 0x0000a0aa, 0x0000b0ba, // 253a
+ 0x000009a9, 0x00000aaa, 0x00000bab, 0x0000a989, 0x0000aa8a, 0x0000ab8b, 0x0000909a, 0x0000a0aa, 0x0000b0ba, // 253b
+ 0x00000aaa, 0x0000aa8a, 0x0000a0aa, 0x0000aaa8, // 253c
+ 0x000009a9, 0x00000aaa, 0x00000bab, 0x0000aa8a, 0x0000a0aa, 0x0000aaa8, // 253d
+ 0x00000aaa, 0x0000a989, 0x0000aa8a, 0x0000ab8b, 0x0000a0aa, 0x0000aaa8, // 253e
+ 0x000009a9, 0x00000aaa, 0x00000bab, 0x0000a989, 0x0000aa8a, 0x0000ab8b, 0x0000a0aa, 0x0000aaa8, // 253f
+ 0x00000aaa, 0x0000aa8a, 0x0000909a, 0x0000a0aa, 0x0000b0ba, 0x0000aaa8, // 2540
+ 0x00000aaa, 0x0000aa8a, 0x0000a0aa, 0x00009a98, 0x0000aaa8, 0x0000bab8, // 2541
+ 0x00000aaa, 0x0000aa8a, 0x0000909a, 0x0000a0aa, 0x0000b0ba, 0x00009a98, 0x0000aaa8, 0x0000bab8, // 2542
+ 0x000009a9, 0x00000aaa, 0x00000bab, 0x0000aa8a, 0x0000909a, 0x0000a0aa, 0x0000b0ba, 0x0000aaa8, // 2543
+ 0x00000aaa, 0x0000a989, 0x0000aa8a, 0x0000ab8b, 0x0000909a, 0x0000a0aa, 0x0000b0ba, 0x0000aaa8, // 2544
+ 0x000009a9, 0x00000aaa, 0x00000bab, 0x0000aa8a, 0x0000a0aa, 0x00009a98, 0x0000aaa8, 0x0000bab8, // 2545
+ 0x00000aaa, 0x0000a989, 0x0000aa8a, 0x0000ab8b, 0x0000a0aa, 0x00009a98, 0x0000aaa8, 0x0000bab8, // 2546
+ 0x000009a9, 0x00000aaa, 0x00000bab, 0x0000a989, 0x0000aa8a, 0x0000ab8b, 0x0000909a, 0x0000a0aa, 0x0000b0ba, 0x0000aaa8, // 2547
+ 0x000009a9, 0x00000aaa, 0x00000bab, 0x0000a989, 0x0000aa8a, 0x0000ab8b, 0x0000a0aa, 0x00009a98, 0x0000aaa8, 0x0000bab8, // 2548
+ 0x000009a9, 0x00000aaa, 0x00000bab, 0x0000aa8a, 0x0000909a, 0x0000a0aa, 0x0000b0ba, 0x00009a98, 0x0000aaa8, 0x0000bab8, // 2549
+ 0x00000aaa, 0x0000a989, 0x0000aa8a, 0x0000ab8b, 0x0000909a, 0x0000a0aa, 0x0000b0ba, 0x00009a98, 0x0000aaa8, 0x0000bab8, // 254a
+ 0x000009a9, 0x00000aaa, 0x00000bab, 0x0000a989, 0x0000aa8a, 0x0000ab8b, 0x0000909a, 0x0000a0aa, 0x0000b0ba, 0x00009a98, 0x0000aaa8, 0x0000bab8, // 254b
+ // 254c
+ // 254d
+ // 254e
+ // 254f
+ 0x000009a9, 0x00000bab, 0x0000a989, 0x0000ab8b, // 2550
+ 0x0000909a, 0x0000b0ba, 0x00009a98, 0x0000bab8, // 2551
+ 0x0000a989, 0x0000ab8b, 0x0000aaa8, // 2552
+ 0x0000aa8a, 0x00009a98, 0x0000bab8, // 2553
+ 0x0000a989, 0x0000ab8b, 0x00009a98, 0x0000bab8, // 2554
+ 0x000009a9, 0x00000bab, 0x0000aaa8, // 2555
+ 0x00000aaa, 0x00009a98, 0x0000bab8, // 2556
+ 0x000009a9, 0x00000bab, 0x00009a98, 0x0000bab8, // 2557
+ 0x0000a989, 0x0000ab8b, 0x0000a0aa, // 2558
+ 0x0000aa8a, 0x0000909a, 0x0000b0ba, // 2559
+ 0x0000a989, 0x0000ab8b, 0x0000909a, 0x0000b0ba, // 255a
+ 0x000009a9, 0x00000bab, 0x0000a0aa, // 255b
+ 0x00000aaa, 0x0000909a, 0x0000b0ba, // 255c
+ 0x000009a9, 0x00000bab, 0x0000909a, 0x0000b0ba, // 255d
+ 0x0000a989, 0x0000ab8b, 0x0000a0aa, 0x0000aaa8, // 255e
+ 0x0000aa8a, 0x0000909a, 0x0000b0ba, 0x00009a98, 0x0000bab8, // 255f
+ 0x0000a989, 0x0000ab8b, 0x0000909a, 0x0000b0ba, 0x00009a98, 0x0000bab8, // 2560
+ 0x000009a9, 0x00000bab, 0x0000a0aa, 0x0000aaa8, // 2561
+ 0x00000aaa, 0x0000909a, 0x0000b0ba, 0x00009a98, 0x0000bab8, // 2562
+ 0x000009a9, 0x00000bab, 0x0000909a, 0x0000b0ba, 0x00009a98, 0x0000bab8, // 2563
+ 0x000009a9, 0x00000bab, 0x0000a989, 0x0000ab8b, 0x0000aaa8, // 2564
+ 0x00000aaa, 0x0000aa8a, 0x00009a98, 0x0000bab8, // 2565
+ 0x000009a9, 0x00000bab, 0x0000a989, 0x0000ab8b, 0x00009a98, 0x0000bab8, // 2566
+ 0x000009a9, 0x00000bab, 0x0000a989, 0x0000ab8b, 0x0000a0aa, // 2567
+ 0x00000aaa, 0x0000aa8a, 0x0000909a, 0x0000b0ba, // 2568
+ 0x000009a9, 0x00000bab, 0x0000a989, 0x0000ab8b, 0x0000909a, 0x0000b0ba, // 2569
+ 0x000009a9, 0x00000bab, 0x0000a989, 0x0000ab8b, 0x0000a0aa, 0x0000aaa8, // 256a
+ 0x00000aaa, 0x0000aa8a, 0x0000909a, 0x0000b0ba, 0x00009a98, 0x0000bab8, // 256b
+ 0x000009a9, 0x00000bab, 0x0000a989, 0x0000ab8b, 0x0000909a, 0x0000b0ba, 0x00009a98, 0x0000bab8, // 256c
+ 0x02228800, // 256d
+ 0x02120800, // 256e
+ 0x02100000, // 256f
+ 0x02008000, // 2570
+ 0x00000880, // 2571
+ 0x00000088, // 2572
+ 0x00000880, 0x00000088, // 2573
+ 0x00000aaa, // 2574
+ 0x0000a0aa, // 2575
+ 0x0000aa8a, // 2576
+ 0x0000aaa8, // 2577
+ 0x000009a9, 0x00000aaa, 0x00000bab, // 2578
+ 0x0000909a, 0x0000a0aa, 0x0000b0ba, // 2579
+ 0x0000a989, 0x0000aa8a, 0x0000ab8b, // 257a
+ 0x00009a98, 0x0000aaa8, 0x0000bab8, // 257b
+ 0x00000aaa, 0x0000a989, 0x0000aa8a, 0x0000ab8b, // 257c
+ 0x0000a0aa, 0x00009a98, 0x0000aaa8, 0x0000bab8, // 257d
+ 0x000009a9, 0x00000aaa, 0x00000bab, 0x0000aa8a, // 257e
+ 0x0000909a, 0x0000a0aa, 0x0000b0ba, 0x0000aaa8, // 257f
+ 0x01000084, // 2580
+ 0x01000788, // 2581
+ 0x01000688, // 2582
+ 0x01000588, // 2583
+ 0x01000488, // 2584
+ 0x01000388, // 2585
+ 0x01000288, // 2586
+ 0x01000188, // 2587
+ 0x01000088, // 2588
+ 0x01000078, // 2589
+ 0x01000068, // 258a
+ 0x01000058, // 258b
+ 0x01000048, // 258c
+ 0x01000038, // 258d
+ 0x01000028, // 258e
+ 0x01000018, // 258f
+ 0x01004088, // 2590
+ 0x01300088, // 2591
+ 0x01200088, // 2592
+ 0x01100088, // 2593
+ 0x01000081, // 2594
+ 0x01007088, // 2595
+ 0x01000448, // 2596
+ 0x01004488, // 2597
+ 0x01000044, // 2598
+ 0x01000044, 0x01000448, 0x01004488, // 2599
+ 0x01000044, 0x01004488, // 259a
+ 0x01000044, 0x01004084, 0x01000448, // 259b
+ 0x01000044, 0x01004084, 0x01004488, // 259c
+ 0x01004084, // 259d
+ 0x01004084, 0x01000448, // 259e
+ 0x01004084, 0x01000448, 0x01004488, // 259f
+};
+
+static uint16_t linedraw_offs[] = {
+ 0x0002, 0x0026, 0x0082, 0x00a6, 0x0103,
+ 0x0133, 0x0163, 0x0193, 0x01c4, 0x0204,
+ 0x0244, 0x0284, 0x02c2, 0x02e4, 0x0324,
+ 0x0366, 0x03c2, 0x03e4, 0x0424, 0x0466,
+ 0x04c2, 0x04e4, 0x0524, 0x0566, 0x05c2,
+ 0x05e4, 0x0624, 0x0666, 0x06c3, 0x06f5,
+ 0x0745, 0x0795, 0x07e7, 0x0857, 0x08c7,
+ 0x0939, 0x09c3, 0x09f5, 0x0a45, 0x0a95,
+ 0x0ae7, 0x0b57, 0x0bc7, 0x0c39, 0x0cc3,
+ 0x0cf5, 0x0d45, 0x0d97, 0x0e05, 0x0e57,
+ 0x0ec7, 0x0f39, 0x0fc3, 0x0ff5, 0x1045,
+ 0x1097, 0x1105, 0x1157, 0x11c7, 0x1239,
+ 0x12c4, 0x1306, 0x1366, 0x13c8, 0x1446,
+ 0x14a6, 0x1508, 0x1588, 0x1608, 0x1688,
+ 0x1708, 0x178a, 0x182a, 0x18ca, 0x196a,
+ 0x1a0c, 0x1ac0, 0x1ac0, 0x1ac0, 0x1ac0,
+ 0x1ac4, 0x1b04, 0x1b43, 0x1b73, 0x1ba4,
+ 0x1be3, 0x1c13, 0x1c44, 0x1c83, 0x1cb3,
+ 0x1ce4, 0x1d23, 0x1d53, 0x1d84, 0x1dc4,
+ 0x1e05, 0x1e56, 0x1eb4, 0x1ef5, 0x1f46,
+ 0x1fa5, 0x1ff4, 0x2036, 0x2095, 0x20e4,
+ 0x2126, 0x2186, 0x21e6, 0x2248, 0x22c1,
+ 0x22d1, 0x22e1, 0x22f1, 0x2301, 0x2311,
+ 0x2322, 0x2341, 0x2351, 0x2361, 0x2371,
+ 0x2383, 0x23b3, 0x23e3, 0x2413, 0x2444,
+ 0x2484, 0x24c4, 0x2504, 0x2541, 0x2551,
+ 0x2561, 0x2571, 0x2581, 0x2591, 0x25a1,
+ 0x25b1, 0x25c1, 0x25d1, 0x25e1, 0x25f1,
+ 0x2601, 0x2611, 0x2621, 0x2631, 0x2641,
+ 0x2651, 0x2661, 0x2671, 0x2681, 0x2691,
+ 0x26a1, 0x26b1, 0x26c1, 0x26d3, 0x2702,
+ 0x2723, 0x2753, 0x2781, 0x2792, 0x27b3,
+};
+