~aleteoryx/9c

d64ca7a1ad30efe56d9c3db15fcd0ea5ad15adee — glenda 11 days ago df42e8d
ufx → font complete!
1 files changed, 120 insertions(+), 4 deletions(-)

M ufx2font.c
M ufx2font.c => ufx2font.c +120 -4
@@ 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();
}