itfontsrv: handle non-BMP runes on X11 - plan9port - [fork] Plan 9 from user space Err mx1.adamsgaard.dk 70 hgit clone git://src.adamsgaard.dk/plan9port URL:git://src.adamsgaard.dk/plan9port mx1.adamsgaard.dk 70 1Log /src/plan9port/log.gph mx1.adamsgaard.dk 70 1Files /src/plan9port/files.gph mx1.adamsgaard.dk 70 1Refs /src/plan9port/refs.gph mx1.adamsgaard.dk 70 1README /src/plan9port/file/README.md.gph mx1.adamsgaard.dk 70 1LICENSE /src/plan9port/file/LICENSE.gph mx1.adamsgaard.dk 70 i--- Err mx1.adamsgaard.dk 70 1commit 5f0fa185d0a978b45de5bf206193769596c056b5 /src/plan9port/commit/5f0fa185d0a978b45de5bf206193769596c056b5.gph mx1.adamsgaard.dk 70 1parent a6ad39aaaa36b8aadc5c35bfc803afbde32918c0 /src/plan9port/commit/a6ad39aaaa36b8aadc5c35bfc803afbde32918c0.gph mx1.adamsgaard.dk 70 hAuthor: Russ Cox URL:mailto:rsc@swtch.com mx1.adamsgaard.dk 70 iDate: Tue, 26 May 2020 11:36:59 -0400 Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 ifontsrv: handle non-BMP runes on X11 Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 iHave to adjust algorithms to deal with Err mx1.adamsgaard.dk 70 imuch larger number of subfont files as well. Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 iDiffstat: Err mx1.adamsgaard.dk 70 i M src/cmd/fontsrv/a.h | 9 ++++++--- Err mx1.adamsgaard.dk 70 i M src/cmd/fontsrv/mac.c | 6 ++++-- Err mx1.adamsgaard.dk 70 i M src/cmd/fontsrv/main.c | 53 ++++++++++++++----------------- Err mx1.adamsgaard.dk 70 i M src/cmd/fontsrv/x11.c | 19 +++++++++++-------- Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i4 files changed, 44 insertions(+), 43 deletions(-) Err mx1.adamsgaard.dk 70 i--- Err mx1.adamsgaard.dk 70 1diff --git a/src/cmd/fontsrv/a.h b/src/cmd/fontsrv/a.h /src/plan9port/file/src/cmd/fontsrv/a.h.gph mx1.adamsgaard.dk 70 it@@ -4,19 +4,22 @@ int nxfont; Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i enum { Err mx1.adamsgaard.dk 70 i SubfontSize = 32, Err mx1.adamsgaard.dk 70 i- SubfontMask = (1<<16)/SubfontSize - 1, Err mx1.adamsgaard.dk 70 i+ MaxSubfont = (Runemax+1)/SubfontSize, Err mx1.adamsgaard.dk 70 i }; Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i struct XFont Err mx1.adamsgaard.dk 70 i { Err mx1.adamsgaard.dk 70 i char *name; Err mx1.adamsgaard.dk 70 i int loaded; Err mx1.adamsgaard.dk 70 i- uchar range[(1<<16)/SubfontSize]; // range[i] == whether to have subfont i*SubfontSize to (i+1)*SubfontSize - 1. Err mx1.adamsgaard.dk 70 i- int nrange; Err mx1.adamsgaard.dk 70 i+ uchar range[MaxSubfont]; // range[i] = fontfile starting at i*SubfontSize exists Err mx1.adamsgaard.dk 70 i+ ushort file[MaxSubfont]; // file[i] == fontfile i's lo rune / SubfontSize Err mx1.adamsgaard.dk 70 i+ int nfile; Err mx1.adamsgaard.dk 70 i int unit; Err mx1.adamsgaard.dk 70 i double height; Err mx1.adamsgaard.dk 70 i double originy; Err mx1.adamsgaard.dk 70 i void (*loadheight)(XFont*, int, int*, int*); Err mx1.adamsgaard.dk 70 i+ char *fonttext; Err mx1.adamsgaard.dk 70 i+ int nfonttext; Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i // fontconfig workarround, as FC_FULLNAME does not work for matching fonts. Err mx1.adamsgaard.dk 70 i char *fontfile; Err mx1.adamsgaard.dk 70 1diff --git a/src/cmd/fontsrv/mac.c b/src/cmd/fontsrv/mac.c /src/plan9port/file/src/cmd/fontsrv/mac.c.gph mx1.adamsgaard.dk 70 it@@ -200,9 +200,12 @@ load(XFont *f) Err mx1.adamsgaard.dk 70 i f->loadheight = fontheight; Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i // enable all Unicode ranges Err mx1.adamsgaard.dk 70 i+ if(nelem(f->file) > 0xffff) Err mx1.adamsgaard.dk 70 i+ sysfatal("too many subfiles"); // f->file holds ushorts Err mx1.adamsgaard.dk 70 i for(i=0; irange); i++) { Err mx1.adamsgaard.dk 70 i f->range[i] = 1; Err mx1.adamsgaard.dk 70 i- f->nrange++; Err mx1.adamsgaard.dk 70 i+ f->file[i] = i; Err mx1.adamsgaard.dk 70 i+ f->nfile++; Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 it@@ -233,7 +236,6 @@ mksubfont(XFont *f, char *name, int lo, int hi, int size, int antialias) Err mx1.adamsgaard.dk 70 i if(font == nil) Err mx1.adamsgaard.dk 70 i return nil; Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i bbox = CTFontGetBoundingBox(font); Err mx1.adamsgaard.dk 70 i x = (int)(bbox.size.width*2 + 0.99999999); Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 1diff --git a/src/cmd/fontsrv/main.c b/src/cmd/fontsrv/main.c /src/plan9port/file/src/cmd/fontsrv/main.c.gph mx1.adamsgaard.dk 70 it@@ -52,7 +52,7 @@ enum Err mx1.adamsgaard.dk 70 i #define QFONT(p) (((p) >> 4) & 0xFFFF) Err mx1.adamsgaard.dk 70 i #define QSIZE(p) (((p) >> 20) & 0xFF) Err mx1.adamsgaard.dk 70 i #define QANTIALIAS(p) (((p) >> 28) & 0x1) Err mx1.adamsgaard.dk 70 i-#define QRANGE(p) (((p) >> 29) & SubfontMask) Err mx1.adamsgaard.dk 70 i+#define QRANGE(p) (((p) >> 29) & 0xFFFFFF) Err mx1.adamsgaard.dk 70 i static int sizes[] = { 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 24, 28 }; Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i static vlong Err mx1.adamsgaard.dk 70 it@@ -102,7 +102,7 @@ dostat(vlong path, Qid *qid, Dir *dir) Err mx1.adamsgaard.dk 70 i case Qfontfile: Err mx1.adamsgaard.dk 70 i f = &xfont[QFONT(path)]; Err mx1.adamsgaard.dk 70 i load(f); Err mx1.adamsgaard.dk 70 i- length = 11+1+11+1+f->nrange*(6+1+6+1+9+1); Err mx1.adamsgaard.dk 70 i+ length = 11+1+11+1+f->nfile*(6+1+6+1+9+1); Err mx1.adamsgaard.dk 70 i name = "font"; Err mx1.adamsgaard.dk 70 i break; Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 it@@ -189,9 +189,9 @@ xwalk1(Fid *fid, char *name, Qid *qid) Err mx1.adamsgaard.dk 70 i goto NotFound; Err mx1.adamsgaard.dk 70 i p++; Err mx1.adamsgaard.dk 70 i n = strtoul(p, &p, 16); Err mx1.adamsgaard.dk 70 i- if(p != name+5 || n%SubfontSize != 0 || strcmp(p, ".bit") != 0 || !f->range[(n/SubfontSize) & SubfontMask]) Err mx1.adamsgaard.dk 70 i+ if(p < name+5 || p > name+5 && name[1] == '0' || n%SubfontSize != 0 || n/SubfontSize >= MaxSubfont || strcmp(p, ".bit") != 0 || !f->range[n/SubfontSize]) Err mx1.adamsgaard.dk 70 i goto NotFound; Err mx1.adamsgaard.dk 70 i- path += Qsubfontfile - Qsizedir + qpath(0, 0, 0, 0, (n/SubfontSize) & SubfontMask); Err mx1.adamsgaard.dk 70 i+ path += Qsubfontfile - Qsizedir + qpath(0, 0, 0, 0, n/SubfontSize); Err mx1.adamsgaard.dk 70 i break; Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i Found: Err mx1.adamsgaard.dk 70 it@@ -229,7 +229,6 @@ sizegen(int i, Dir *d, void *v) Err mx1.adamsgaard.dk 70 i vlong path; Err mx1.adamsgaard.dk 70 i Fid *fid; Err mx1.adamsgaard.dk 70 i XFont *f; Err mx1.adamsgaard.dk 70 i- int j; Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i fid = v; Err mx1.adamsgaard.dk 70 i path = fid->qid.path; Err mx1.adamsgaard.dk 70 it@@ -240,15 +239,10 @@ sizegen(int i, Dir *d, void *v) Err mx1.adamsgaard.dk 70 i i--; Err mx1.adamsgaard.dk 70 i f = &xfont[QFONT(path)]; Err mx1.adamsgaard.dk 70 i load(f); Err mx1.adamsgaard.dk 70 i- for(j=0; jrange); j++) { Err mx1.adamsgaard.dk 70 i- if(f->range[j] == 0) Err mx1.adamsgaard.dk 70 i- continue; Err mx1.adamsgaard.dk 70 i- if(i == 0) { Err mx1.adamsgaard.dk 70 i- path += Qsubfontfile - Qsizedir; Err mx1.adamsgaard.dk 70 i- path += qpath(0, 0, 0, 0, j); Err mx1.adamsgaard.dk 70 i- goto Done; Err mx1.adamsgaard.dk 70 i- } Err mx1.adamsgaard.dk 70 i- i--; Err mx1.adamsgaard.dk 70 i+ if(i < f->nfile) { Err mx1.adamsgaard.dk 70 i+ path += Qsubfontfile - Qsizedir; Err mx1.adamsgaard.dk 70 i+ path += qpath(0, 0, 0, 0, f->file[i]); Err mx1.adamsgaard.dk 70 i+ goto Done; Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i return -1; Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 it@@ -315,23 +309,22 @@ xread(Req *r) Err mx1.adamsgaard.dk 70 i readstr(r, "font missing\n"); Err mx1.adamsgaard.dk 70 i break; Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i- height = 0; Err mx1.adamsgaard.dk 70 i- ascent = 0; Err mx1.adamsgaard.dk 70 i- if(f->unit > 0) { Err mx1.adamsgaard.dk 70 i- height = f->height * (int)QSIZE(path)/f->unit + 0.99999999; Err mx1.adamsgaard.dk 70 i- ascent = height - (int)(-f->originy * (int)QSIZE(path)/f->unit + 0.99999999); Err mx1.adamsgaard.dk 70 i- } Err mx1.adamsgaard.dk 70 i- if(f->loadheight != nil) Err mx1.adamsgaard.dk 70 i- f->loadheight(f, QSIZE(path), &height, &ascent); Err mx1.adamsgaard.dk 70 i- fmtprint(&fmt, "%11d %11d\n", height, ascent); Err mx1.adamsgaard.dk 70 i- for(i=0; irange); i++) { Err mx1.adamsgaard.dk 70 i- if(f->range[i] == 0) Err mx1.adamsgaard.dk 70 i- continue; Err mx1.adamsgaard.dk 70 i- fmtprint(&fmt, "0x%04x 0x%04x x%04x.bit\n", i*SubfontSize, ((i+1)*SubfontSize) - 1, i*SubfontSize); Err mx1.adamsgaard.dk 70 i+ if(f->fonttext == nil) { Err mx1.adamsgaard.dk 70 i+ height = 0; Err mx1.adamsgaard.dk 70 i+ ascent = 0; Err mx1.adamsgaard.dk 70 i+ if(f->unit > 0) { Err mx1.adamsgaard.dk 70 i+ height = f->height * (int)QSIZE(path)/f->unit + 0.99999999; Err mx1.adamsgaard.dk 70 i+ ascent = height - (int)(-f->originy * (int)QSIZE(path)/f->unit + 0.99999999); Err mx1.adamsgaard.dk 70 i+ } Err mx1.adamsgaard.dk 70 i+ if(f->loadheight != nil) Err mx1.adamsgaard.dk 70 i+ f->loadheight(f, QSIZE(path), &height, &ascent); Err mx1.adamsgaard.dk 70 i+ fmtprint(&fmt, "%11d %11d\n", height, ascent); Err mx1.adamsgaard.dk 70 i+ for(i=0; infile; i++) Err mx1.adamsgaard.dk 70 i+ fmtprint(&fmt, "0x%04x 0x%04x x%04x.bit\n", f->file[i]*SubfontSize, ((f->file[i]+1)*SubfontSize) - 1, f->file[i]*SubfontSize); Err mx1.adamsgaard.dk 70 i+ f->fonttext = fmtstrflush(&fmt); Err mx1.adamsgaard.dk 70 i+ f->nfonttext = strlen(f->fonttext); Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i- data = fmtstrflush(&fmt); Err mx1.adamsgaard.dk 70 i- readstr(r, data); Err mx1.adamsgaard.dk 70 i- free(data); Err mx1.adamsgaard.dk 70 i+ readbuf(r, f->fonttext, f->nfonttext); Err mx1.adamsgaard.dk 70 i break; Err mx1.adamsgaard.dk 70 i case Qsubfontfile: Err mx1.adamsgaard.dk 70 i f = &xfont[QFONT(path)]; Err mx1.adamsgaard.dk 70 1diff --git a/src/cmd/fontsrv/x11.c b/src/cmd/fontsrv/x11.c /src/plan9port/file/src/cmd/fontsrv/x11.c.gph mx1.adamsgaard.dk 70 it@@ -85,20 +85,23 @@ load(XFont *f) Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i int idx = charcode/SubfontSize; Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i- if(charcode > 0xffff) Err mx1.adamsgaard.dk 70 i+ if(charcode > Runemax) Err mx1.adamsgaard.dk 70 i break; Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i- if(!f->range[idx]) { Err mx1.adamsgaard.dk 70 i+ if(!f->range[idx]) Err mx1.adamsgaard.dk 70 i f->range[idx] = 1; Err mx1.adamsgaard.dk 70 i- f->nrange++; Err mx1.adamsgaard.dk 70 i- } Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i+ FT_Done_Face(face); Err mx1.adamsgaard.dk 70 i+ Err mx1.adamsgaard.dk 70 i // libdraw expects U+0000 to be present Err mx1.adamsgaard.dk 70 i- if(!f->range[0]) { Err mx1.adamsgaard.dk 70 i+ if(!f->range[0]) Err mx1.adamsgaard.dk 70 i f->range[0] = 1; Err mx1.adamsgaard.dk 70 i- f->nrange++; Err mx1.adamsgaard.dk 70 i- } Err mx1.adamsgaard.dk 70 i- FT_Done_Face(face); Err mx1.adamsgaard.dk 70 i+ Err mx1.adamsgaard.dk 70 i+ // fix up file list Err mx1.adamsgaard.dk 70 i+ for(i=0; irange); i++) Err mx1.adamsgaard.dk 70 i+ if(f->range[i]) Err mx1.adamsgaard.dk 70 i+ f->file[f->nfile++] = i; Err mx1.adamsgaard.dk 70 i+ Err mx1.adamsgaard.dk 70 i f->loaded = 1; Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 .