mirror of
https://bjh21.me.uk/bedstead/.git
synced 2026-07-30 15:33:25 -04:00
Add support for mosaic graphics.
These are generated without smoothing, and this is done algorithmically, bypassing the usual character-rendering code. The characters are put in the private use area, in the locations where zvbi uses for them, on the grounds that we have to put them somewhere. Mosaic graphics characters are not yet unified with the block graphics characters in the U+2580 range.
This commit is contained in:
parent
50cccb944c
commit
8d599b29af
53
bedstead.c
53
bedstead.c
@ -156,6 +156,7 @@ struct param *param = &default_param;
|
||||
|
||||
void doprologue(void);
|
||||
void dochar(char const data[YSIZE], unsigned flags);
|
||||
static void domosaic(unsigned code, bool sep);
|
||||
|
||||
struct glyph {
|
||||
char data[YSIZE];
|
||||
@ -163,6 +164,7 @@ struct glyph {
|
||||
char const *name;
|
||||
unsigned int flags;
|
||||
#define SC 0x01 /* Character has a small-caps variant. */
|
||||
#define MOS 0x02 /* Mosaic graphics character */
|
||||
} const glyphs[] = {
|
||||
/*
|
||||
* The first batch of glyphs comes from the code tables at the end of
|
||||
@ -999,9 +1001,29 @@ struct glyph {
|
||||
{{000,037,004,024,014,004,000,000,000}, 0x2961 },
|
||||
/* Miscellaneous symbols and arrows */
|
||||
{{000,025,000,021,000,025,000,000,000}, 0x2b1a }, /* dottedsquare */
|
||||
/* Private use */
|
||||
/* U+EE00--U+EE7F: zvbi mosaic graphics */
|
||||
#define M(x) {{(x)}, 0xee00 + (x), NULL, MOS}
|
||||
M(0x00), M(0x01), M(0x02), M(0x03), M(0x04), M(0x05), M(0x06), M(0x07),
|
||||
M(0x08), M(0x09), M(0x0a), M(0x0b), M(0x0c), M(0x0d), M(0x0e), M(0x0f),
|
||||
M(0x10), M(0x11), M(0x12), M(0x13), M(0x14), M(0x15), M(0x16), M(0x17),
|
||||
M(0x18), M(0x19), M(0x1a), M(0x1b), M(0x1c), M(0x1d), M(0x1e), M(0x1f),
|
||||
M(0x20), M(0x21), M(0x22), M(0x23), M(0x24), M(0x25), M(0x26), M(0x27),
|
||||
M(0x28), M(0x29), M(0x2a), M(0x2b), M(0x2c), M(0x2d), M(0x2e), M(0x2f),
|
||||
M(0x30), M(0x31), M(0x32), M(0x33), M(0x34), M(0x35), M(0x36), M(0x37),
|
||||
M(0x38), M(0x39), M(0x3a), M(0x3b), M(0x3c), M(0x3d), M(0x3e), M(0x3f),
|
||||
M(0x40), M(0x41), M(0x42), M(0x43), M(0x44), M(0x45), M(0x46), M(0x47),
|
||||
M(0x48), M(0x49), M(0x4a), M(0x4b), M(0x4c), M(0x4d), M(0x4e), M(0x4f),
|
||||
M(0x50), M(0x51), M(0x52), M(0x53), M(0x54), M(0x55), M(0x56), M(0x57),
|
||||
M(0x58), M(0x59), M(0x5a), M(0x5b), M(0x5c), M(0x5d), M(0x5e), M(0x5f),
|
||||
M(0x60), M(0x61), M(0x62), M(0x63), M(0x64), M(0x65), M(0x66), M(0x67),
|
||||
M(0x68), M(0x69), M(0x6a), M(0x6b), M(0x6c), M(0x6d), M(0x6e), M(0x6f),
|
||||
M(0x70), M(0x71), M(0x72), M(0x73), M(0x74), M(0x75), M(0x76), M(0x77),
|
||||
M(0x78), M(0x79), M(0x7a), M(0x7b), M(0x7c), M(0x7d), M(0x7e), M(0x7f),
|
||||
/* Specials */
|
||||
{{016,021,025,011,016,012,016,000,000}, 0xfffd }, /* replacement */
|
||||
{{037,021,021,021,021,021,037,000,000}, -1, ".notdef" },
|
||||
|
||||
/* Transport and map symbols */
|
||||
{{000,034,010,011,027,010,000,000,000}, 0x1f681 }, /* helicopter */
|
||||
|
||||
@ -1170,7 +1192,11 @@ main(int argc, char **argv)
|
||||
printf("Flags: W\n");
|
||||
printf("LayerCount: 2\n");
|
||||
dolookups(&glyphs[i]);
|
||||
dochar(glyphs[i].data, glyphs[i].flags);
|
||||
if (glyphs[i].flags & MOS)
|
||||
domosaic(glyphs[i].data[0],
|
||||
(glyphs[i].data[0] & 0x20) != 0);
|
||||
else
|
||||
dochar(glyphs[i].data, glyphs[i].flags);
|
||||
printf("EndChar\n");
|
||||
}
|
||||
printf("EndChars\n");
|
||||
@ -1185,6 +1211,7 @@ dopalt(struct glyph const *g)
|
||||
unsigned char cols = 0;
|
||||
int dx = 0, dh = 0;
|
||||
|
||||
if (g->flags & MOS) return;
|
||||
/*
|
||||
* For proportional layout, we'd like a left side-bearing of
|
||||
* one pixel, and a right side-bearing of zero. Space
|
||||
@ -1566,3 +1593,27 @@ dochar(char const data[YSIZE], unsigned flags)
|
||||
clean_path();
|
||||
emit_path();
|
||||
}
|
||||
|
||||
static void
|
||||
tile(int x0, int y0, int x1, int y1)
|
||||
{
|
||||
x0 *= XPIX; y0 *= YPIX;
|
||||
x1 *= XPIX; y1 *= YPIX;
|
||||
moveto(x0, y0); lineto(x0, y1); lineto(x1, y1); lineto(x1, y0);
|
||||
closepath();
|
||||
}
|
||||
|
||||
static void
|
||||
domosaic(unsigned code, bool sep)
|
||||
{
|
||||
|
||||
clearpath();
|
||||
if (code & 1) tile(0 + sep, 8 + sep, 3, 11);
|
||||
if (code & 2) tile(3 + sep, 8 + sep, 6, 11);
|
||||
if (code & 4) tile(0 + sep, 4 + sep, 3, 8);
|
||||
if (code & 8) tile(3 + sep, 4 + sep, 6, 8);
|
||||
if (code & 16) tile(0 + sep, 1 + sep, 3, 4);
|
||||
if (code & 64) tile(3 + sep, 1 + sep, 6, 4);
|
||||
clean_path();
|
||||
emit_path();
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user