From d64ca7a1ad30efe56d9c3db15fcd0ea5ad15adee Mon Sep 17 00:00:00 2001 From: glenda Date: Sun, 23 Nov 2025 23:43:37 +0000 Subject: [PATCH] =?UTF-8?q?ufx=20=E2=86=92=20font=20complete!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ufx2font.c | 124 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 120 insertions(+), 4 deletions(-) diff --git a/ufx2font.c b/ufx2font.c index 1583913b42a286b33239b9a363dc3faf04f7f3cd..3e9adee98bdc054e45f7f0e5bee670f168a57e24 100644 --- a/ufx2font.c +++ b/ufx2font.c @@ -670,7 +670,7 @@ copyglyph(uint i, uint *x, Memimage *img) *x += glyphs[i].width; } char * -saverawsubfont(char *base, Rune r1, Rune r2, struct RawSubfont *s) +saverawsubfont(struct RawSubfont *s, char *base, Rune r1, Rune r2) { char *file; uchar *sfdata; @@ -765,7 +765,7 @@ makenaive(void) } setsubfontparams(s, x, 0, i); - file = saverawsubfont("naive", 0, nglyphs, s); + file = saverawsubfont(s, "naive", 0, nglyphs); savenaivefont(file); freerawsubfont(s); @@ -796,7 +796,7 @@ makenoholessubfont(void) j++; } setsubfontparams(s, x, 0, i); - file = saverawsubfont("noholes", 0, n, s); + file = saverawsubfont(s, "noholes", 0, n); freerawsubfont(s); return file; @@ -830,6 +830,122 @@ makenoholes(void) close(fd); } +uint +mappingwidth(struct Mapping *m) +{ + struct MapRule *r; + uint ret = 0, i; + + for(r = m->rules; r != nil; r = r->next){ + switch(r->ty){ + case MR_SINGLE: + ret += glyphs[r->start].width; + break; + case MR_RANGE: + for(i = r->start; i <= r->end; i++) + ret += glyphs[i].width; + break; + } + } + + return ret; +} +void +makemultimapping(struct Mapping *m, int fd, char *base) +{ + struct MapRule *r; + struct RawSubfont *s; + char *file; + uint n, width, i, j = 0, x = 0; + + n = m->end-m->start+1; + width = mappingwidth(m); + s = allocrawsubfont(n, width); + + for(r = m->rules; r != nil; r = r->next){ + switch(r->ty){ + case MR_BLANK: + s->entries[j][0] = x &0xff; + s->entries[j][1] = (x>>8)&0xff; + s->entries[j][2] = 0; + s->entries[j][3] = glyphedge; + s->entries[j][4] = 0; + s->entries[j][5] = 0; + j++; + break; + case MR_SINGLE: + setsubfontparams(s, x, r->start, j++); + copyglyph(r->start, &x, s->img); + break; + case MR_RANGE: + for(i = r->start; i <= r->end; i++){ + setsubfontparams(s, x, i, j++); + copyglyph(i, &x, s->img); + } + break; + } + } + setsubfontparams(s, x, 0, j); + + file = saverawsubfont(s, base, m->start, m->end+1); + appendfont(fd, m->start, m->end, 0, file); + + freerawsubfont(s); + free(file); +} +void +makesinglemapping(struct Mapping *m, int fd, char *base) +{ + struct RawSubfont *s; + uint x = 0; + char *file; + + s = allocrawsubfont(1, glyphs[m->idx].width); + + setsubfontparams(s, 0, m->idx, 0); + copyglyph(m->idx, &x, s->img); + setsubfontparams(s, x, 0, 1); + + file = saverawsubfont(s, base, m->start, m->start); + appendfont(fd, m->start, m->start, 0, file); + + freerawsubfont(s); + free(file); +} +void +makeonemapped(struct MapFile *mf) +{ + struct Mapping *m; + char *base, fontfile[64], *p; + int fd; + + base = strrchr(mf->file, '/'); + if(base == nil) + base = mf->file; + + p = seprint(fontfile, fontfile+sizeof(fontfile)-5, "%s", base); + strcpy(p, ".font"); + + fd = createfont(fontfile); + + for(m = mf->mappings; m != nil; m = m->next){ + if(m->rules != nil) + makemultimapping(m, fd, base); + else + makesinglemapping(m, fd, base); + } + + close(fd); +} +void +makemapped(void) +{ + struct MapFile *mf; + + for(mf = mapfiles; mf != nil; mf = mf->next) + makeonemapped(mf); +} + void usage(void) @@ -909,5 +1025,5 @@ main(int argc, char **argv) makenaive(); if(!setconv || doholes) makenoholes(); -/* makemapped();*/ + makemapped(); }