diff --git a/dat.h b/dat.h index fc52ab3..ddbe648 100644 --- a/dat.h +++ b/dat.h @@ -17,7 +17,7 @@ enum Fontsz = 32, Fontbase = 4, - Nglyphs = 65536, + Nglyphs = 0x20000, }; enum diff --git a/font.c b/font.c index 581a1b8..b87cf88 100644 --- a/font.c +++ b/font.c @@ -10,9 +10,12 @@ struct Glyph int w, h, ox, oy; }; -static stbtt_fontinfo font; -static uchar *fontdata; -static float scale; +enum { Maxfonts = 4 }; + +static stbtt_fontinfo fonts[Maxfonts]; +static uchar *fontdata[Maxfonts]; +static float scale[Maxfonts]; +static int nfonts; static Glyph cache[Nglyphs]; static u32int blendtab[2][256]; @@ -28,25 +31,64 @@ blend(u32int bg, int a) return (r << 16) | (g << 8) | b; } -void -fontinit(char *path) +static void +loadfont(char *path) { - int fd, a; + int fd; long sz, n; + if(nfonts >= Maxfonts) + die("too many fonts"); fd = open(path, OREAD); if(fd < 0) die("can't open font: %s", path); sz = seek(fd, 0, 2); seek(fd, 0, 0); - fontdata = emalloc(sz); - n = readn(fd, fontdata, sz); + fontdata[nfonts] = emalloc(sz); + n = readn(fd, fontdata[nfonts], sz); close(fd); if(n != sz) die("can't read font: %s", path); - if(!stbtt_InitFont(&font, fontdata, stbtt_GetFontOffsetForIndex(fontdata, 0))) + if(!stbtt_InitFont(&fonts[nfonts], fontdata[nfonts], stbtt_GetFontOffsetForIndex(fontdata[nfonts], 0))) die("can't init font: %s", path); - scale = stbtt_ScaleForPixelHeight(&font, Fontsz); + scale[nfonts] = stbtt_ScaleForPixelHeight(&fonts[nfonts], Fontsz); + nfonts++; +} + +static int +isfont(char *name) +{ + char *p; + + p = strrchr(name, '.'); + if(p == nil) + return 0; + return strcmp(p, ".ttf") == 0 || strcmp(p, ".otf") == 0; +} + +void +fontinit(char *dir) +{ + int fd, n, i, a; + Dir *d; + char path[256]; + + fd = open(dir, OREAD); + if(fd < 0) + die("can't open font dir: %s", dir); + n = dirreadall(fd, &d); + close(fd); + if(n < 0) + die("can't read font dir: %s", dir); + for(i = 0; i < n; i++){ + if(isfont(d[i].name)){ + snprint(path, sizeof path, "%s/%s", dir, d[i].name); + loadfont(path); + } + } + free(d); + if(nfonts == 0) + die("no fonts in %s", dir); for(a = 0; a < 256; a++){ blendtab[0][a] = blend(Colbg, a); blendtab[1][a] = blend(Colsel, a); @@ -57,14 +99,20 @@ void putfont(u32int *buf, int w, int h, int px, int py, Rune r) { Glyph *g; - int i, j, x, y, a, sel; + int i, j, x, y, a, sel, f; u32int *p; if(r >= Nglyphs) return; g = &cache[r]; if(g->bmp == nil){ - g->bmp = stbtt_GetCodepointBitmap(&font, scale, scale, r, &g->w, &g->h, &g->ox, &g->oy); + for(f = 0; f < nfonts; f++){ + if(stbtt_FindGlyphIndex(&fonts[f], r) == 0) + continue; + g->bmp = stbtt_GetCodepointBitmap(&fonts[f], scale[f], scale[f], r, &g->w, &g->h, &g->ox, &g->oy); + if(g->bmp != nil) + break; + } if(g->bmp == nil) return; } diff --git a/font/NotoEmoji-Regular.ttf b/font/NotoEmoji-Regular.ttf new file mode 100644 index 0000000..19b7bad Binary files /dev/null and b/font/NotoEmoji-Regular.ttf differ diff --git a/font/NotoSans-Regular.ttf b/font/NotoSans-Regular.ttf new file mode 100644 index 0000000..5748af3 Binary files /dev/null and b/font/NotoSans-Regular.ttf differ diff --git a/font/font.otf b/font/font.otf deleted file mode 120000 index 40504e9..0000000 --- a/font/font.otf +++ /dev/null @@ -1 +0,0 @@ -NotoSansMonoCJKsc-Regular.otf \ No newline at end of file diff --git a/main.c b/main.c index 8ad2a74..07ad5f0 100644 --- a/main.c +++ b/main.c @@ -5,7 +5,7 @@ Channel *drawc; Channel *keyc; Channel *dictreqc; Channel *dictresc; -char *fontpath; +char *fontdir; int threadmaybackground(void) @@ -16,7 +16,7 @@ threadmaybackground(void) void usage(void) { - fprint(2, "usage: strans mapdir fontpath\n"); + fprint(2, "usage: strans mapdir fontdir\n"); threadexitsall("usage"); } @@ -60,7 +60,7 @@ threadmain(int argc, char **argv) if(argc != 3) usage(); - fontpath = argv[2]; + fontdir = argv[2]; drawc = chancreate(sizeof(Drawcmd), 0); keyc = chancreate(sizeof(Keyreq), 0); dictreqc = chancreate(sizeof(Dictreq), 4); diff --git a/run.sh b/run.sh index 716707d..7238510 100755 --- a/run.sh +++ b/run.sh @@ -4,6 +4,6 @@ pkill strans pkill strans-xim sleep 1 -./strans map font/font.otf & +./strans map font & sleep 1 xim/strans-xim & diff --git a/win.c b/win.c index 0166ac4..1d48c74 100644 --- a/win.c +++ b/win.c @@ -6,7 +6,7 @@ enum { Asciitofull = 0xFEE0, }; -extern char *fontpath; +extern char *fontdir; static xcb_connection_t *conn; static xcb_screen_t *scr; @@ -52,7 +52,7 @@ wininit(void) gc = xcb_generate_id(conn); xcb_create_gc(conn, gc, win, 0, nil); img = emalloc(Imgw * Imgh * sizeof(img[0])); - fontinit(fontpath); + fontinit(fontdir); } static void