@@ 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();
}