void drawline(bitmap_rgb32 &bitmap, int x0, int y0, int x1, int y1, u32 pixelval)
//routine copied from void hp9845ct_base_state::draw_line
{
int dx, dy, sx, sy, x, y, err, e2;
// draw line, vector generator uses Bresenham's algorithm
x = x0;
y = y0;
dx = abs((int) (x1 - x));
sx = x < x1 ? 1 : -1;
dy = abs((int) (y1 - y));
sy = y < y1 ? 1 : -1;
err = (dx > dy ? dx : -dy) / 2;
for(;;)
{
if (!((x<0) || (x >= bitmap.width()) || (y<0) || (y >= bitmap.height())))
bitmap.pix(y,x) = pixelval;
if (x == x1 && y == y1) break;
e2 = err;
if (e2 > -dx)
{
err -= dy;
x += sx;
}
if (e2 < dy)
{
err += dx;
y += sy;
}
}
}
void draw_vector_char(bitmap_rgb32 &bitmap, u8 c, int x0, int y0, int xsize, int ysize, u32 pixelval)
{
static constexpr u8 vector_font[96][20] =
{
{128}, // char 32 " "
{34,37,53,51,35,38,47,63,55,167}, // char 33 "!"
{30,29,62,189}, // char 34 """
{20,29,60,53,70,7,10,203}, // char 35 "#"
{20,53,71,57,25,11,29,61,46,163}, // char 36 "$"
{4,77,28,13,11,27,29,54,71,69,53,183}, // char 37 "%"
{66,11,13,31,45,43,7,5,19,35,199}, // char 38 "&"
{42,175}, // char 39 "'"
{50,35,21,29,47,191}, // char 40 "("
{34,51,69,77,63,175}, // char 41 ")"
{4,77,12,69,44,165}, // char 42 "*"
{36,45,8,201}, // char 43 "+"
{32,51,53,37,35,179}, // char 44 ","
{8,201}, // char 45 "-"
{34,37,53,51,163}, // char 46 "."
{2,221}, // char 47 "/" 221 = 0xdd = (5,6)
{4,77,63,31,13,5,19,51,69,205}, // char 48 "0"
{28,47,35,18,179}, // char 49 "1"
{12,31,63,77,75,3,195}, // char 50 "2"
{12,31,63,77,75,57,41,56,71,69,51,19,133}, // char 51 "3"
{50,63,9,7,199}, // char 52 "4"
{4,19,51,69,73,59,11,15,207}, // char 53 "5"
{8,27,59,73,69,51,19,5,13,31,63,205}, // char 54 "6"
{2,75,79,143}, // char 55 "7"
{24,11,13,31,63,77,75,57,71,69,51,19,5,7,25,185}, // char 56 "8"
{4,19,51,69,77,63,31,13,11,25,57,203}, // char 57 "9"
{20,23,39,37,21,26,29,45,43,155}, // char 58 ":"
{18,37,39,23,21,37,42,45,29,27,171}, // char 59 ";"
{66,25,207}, // char 60 "<"
{22,71,26,203}, // char 61 "="
{18,73,159}, // char 62 ">"
{12,31,63,77,75,57,41,39,36,163}, // char 63 "?"
{54,59,27,21,53,71,75,61,29,11,5,19,195}, // char 64 "@"
{2,11,47,75,67,8,201}, // char 65 "A"
{2,15,63,77,75,57,8,57,71,69,51,131}, // char 66 "B"
{68,51,19,5,13,31,63,205}, // char 67 "C"
{2,15,63,77,69,51,131}, // char 68 "D"
{66,3,15,79,56,137}, // char 69 "E"
{2,15,79,8,185}, // char 70 "F"
{76,63,31,13,5,19,67,73,169}, // char 71 "G"
{2,15,78,67,8,201}, // char 72 "H"
{18,51,34,47,30,191}, // char 73 "I"
{4,19,35,53,191}, // char 74 "J"
{2,15,78,7,24,195}, // char 75 "K"
{14,3,195}, // char 76 "L"
{2,15,43,41,43,79,195}, // char 77 "M"
{2,15,12,69,78,195}, // char 78 "N"
{4,13,31,63,77,69,51,19,133}, // char 79 "O"
{2,15,63,77,75,57,137}, // char 80 "P"
{38,67,50,19,5,13,31,63,77,69,179}, // char 81 "Q"
{2,15,63,77,75,57,9,24,195}, // char 82 "R"
{4,19,51,69,71,57,25,11,13,31,63,205}, // char 83 "S"
{34,47,14,207}, // char 84 "T"
{14,5,19,51,69,207}, // char 85 "U"
{14,7,35,71,207}, // char 86 "V"
{14,3,39,40,39,67,207}, // char 87 "W"
{2,5,77,79,14,13,69,195}, // char 88 "X"
{34,41,77,79,14,13,169}, // char 89 "Y"
{14,79,77,5,3,195}, // char 90 "Z"
{34,3,15,175}, // char 91 "["
{0x0c,0xd3}, // char 92 "\"
// {92,77,59,53,35,19,5,23,51,83,40,201}, // char 92 "\"
{18,51,63,159}, // char 93 "]"
{0xa,0x2f,0xcb}, // char 94 "^"
// {34,45,8,45,201}, // char 94 "^"
{0x02,0xc3}, // char 95 "_"
// {36,9,45,8,217}, // char 95 "_"
{0x1e,0xbb}, // char 96 "`"
// {8,249}, // char 96 "`"
{52,35,19,5,7,25,41,55,10,43,57,53,195}, // char 97 "a"
{14,3,35,53,57,43,139}, // char 98 "b"
{52,35,19,5,9,27,43,185}, // char 99 "c"
{58,27,9,5,19,51,191}, // char 100 "d"
{6,55,57,43,27,9,5,19,179}, // char 101 "e"
{0x22,0x2d,0x3f,0x4f,0x08,0xc9}, // char 102 "f"
// {34,47,63,24,185}, // char 102 "f"
{2,17,33,51,57,43,27,9,7,21,37,183}, // char 103 "g"
{2,15,10,43,57,179}, // char 104 "h"
{34,41,42,173}, // char 105 "i"
{2,17,33,51,57,58,189}, // char 106 "j"
{50,23,14,3,4,187}, // char 107 "k"
{30,19,163}, // char 108 "l"
{2,11,8,27,41,35,40,59,73,195}, // char 109 "m"
{2,11,9,27,43,57,179}, // char 110 "n"
{4,9,27,43,57,53,35,19,133}, // char 111 "o"
{4,37,55,57,43,11,129}, // char 112 "p"
{64,49,59,27,9,7,21,181}, // char 113 "q"
{10,25,19,24,43,187}, // char 114 "r"
{4,19,35,53,39,23,9,27,43,185}, // char 115 "s"
{10,43,30,19,163}, // char 116 "t"
{10,0x05,0x13,51,187}, // char 117 "u"
// {10,3,51,187}, // char 117 "u"
{10,7,35,71,203}, // char 118 "v"
{10,5,19,37,39,37,51,69,203}, // char 119 "w"
{2,75,10,195}, // char 120 "x"
{10,9,37,74,73,129}, // char 121 "y"
{10,75,3,195}, // char 122 "z"
{0x3e,0x2d,0x2b,0x19,0x27,0x25,0xb3}, // char 123 "{"
// {48,191}, // char 123 "{"
{0x22,0xaf}, // char 124 "|"
// {112,129}, // char 124 "|" 0x70, 0x81
{0x1e,0x2d,0x2b,0x39,0x27,0x25,0x93}, // char 125 "}"
// {2,57,99,131}, // char 125 "}"
{0x0a,0x1d,0x2d,0x2b,0x3b,0xcd}, // char 126 "~"
// {6,25,57,51,18,25,57,203}, // char 126 "~"
{2,15,95,83,131} // char 127 ""
};
if (c >= 32 && c <= 127)
{
u8 i = 0;
u8 val = 0;
u8 xold = 0;
u8 yold = 0;
c = c - 32;
while (val < 128 && i <= 20)
{
val = vector_font[c][i];
u8 xc = (val & 0x70) >> 4;
u8 yc = (val & 0x0e) >> 1;
u8 lineto = (val & 0x1);
if (lineto) drawline(bitmap, xc * xsize + x0, (7-yc) * ysize + y0, xold * xsize + x0, (7-yold)*ysize + y0, pixelval);
xold = xc;
yold = yc;
i ++;
}
}
} // draw_vector_char