xref: /plan9-contrib/sys/src/libdraw/mkfont.c (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
1*7dd7cddfSDavid du Colombier #include <u.h>
2*7dd7cddfSDavid du Colombier #include <libc.h>
3*7dd7cddfSDavid du Colombier #include <draw.h>
4*7dd7cddfSDavid du Colombier 
5*7dd7cddfSDavid du Colombier /*
6*7dd7cddfSDavid du Colombier  * Cobble fake font using existing subfont
7*7dd7cddfSDavid du Colombier  */
8*7dd7cddfSDavid du Colombier Font*
mkfont(Subfont * subfont,Rune min)9*7dd7cddfSDavid du Colombier mkfont(Subfont *subfont, Rune min)
10*7dd7cddfSDavid du Colombier {
11*7dd7cddfSDavid du Colombier 	Font *font;
12*7dd7cddfSDavid du Colombier 	Cachefont *c;
13*7dd7cddfSDavid du Colombier 
14*7dd7cddfSDavid du Colombier 	font = malloc(sizeof(Font));
15*7dd7cddfSDavid du Colombier 	if(font == 0)
16*7dd7cddfSDavid du Colombier 		return 0;
17*7dd7cddfSDavid du Colombier 	memset(font, 0, sizeof(Font));
18*7dd7cddfSDavid du Colombier 	font->display = subfont->bits->display;
19*7dd7cddfSDavid du Colombier 	font->name = strdup("<synthetic>");
20*7dd7cddfSDavid du Colombier 	font->ncache = NFCACHE+NFLOOK;
21*7dd7cddfSDavid du Colombier 	font->nsubf = NFSUBF;
22*7dd7cddfSDavid du Colombier 	font->cache = malloc(font->ncache * sizeof(font->cache[0]));
23*7dd7cddfSDavid du Colombier 	font->subf = malloc(font->nsubf * sizeof(font->subf[0]));
24*7dd7cddfSDavid du Colombier 	if(font->name==0 || font->cache==0 || font->subf==0){
25*7dd7cddfSDavid du Colombier     Err:
26*7dd7cddfSDavid du Colombier 		free(font->name);
27*7dd7cddfSDavid du Colombier 		free(font->cache);
28*7dd7cddfSDavid du Colombier 		free(font->subf);
29*7dd7cddfSDavid du Colombier 		free(font->sub);
30*7dd7cddfSDavid du Colombier 		free(font);
31*7dd7cddfSDavid du Colombier 		return 0;
32*7dd7cddfSDavid du Colombier 	}
33*7dd7cddfSDavid du Colombier 	memset(font->cache, 0, font->ncache*sizeof(font->cache[0]));
34*7dd7cddfSDavid du Colombier 	memset(font->subf, 0, font->nsubf*sizeof(font->subf[0]));
35*7dd7cddfSDavid du Colombier 	font->height = subfont->height;
36*7dd7cddfSDavid du Colombier 	font->ascent = subfont->ascent;
37*7dd7cddfSDavid du Colombier 	font->age = 1;
38*7dd7cddfSDavid du Colombier 	font->sub = malloc(sizeof(Cachefont*));
39*7dd7cddfSDavid du Colombier 	if(font->sub == 0)
40*7dd7cddfSDavid du Colombier 		goto Err;
41*7dd7cddfSDavid du Colombier 	c = malloc(sizeof(Cachefont));
42*7dd7cddfSDavid du Colombier 	if(c == 0)
43*7dd7cddfSDavid du Colombier 		goto Err;
44*7dd7cddfSDavid du Colombier 	font->nsub = 1;
45*7dd7cddfSDavid du Colombier 	font->sub[0] = c;
46*7dd7cddfSDavid du Colombier 	c->min = min;
47*7dd7cddfSDavid du Colombier 	c->max = min+subfont->n-1;
48*7dd7cddfSDavid du Colombier 	c->offset = 0;
49*7dd7cddfSDavid du Colombier 	c->name = 0;	/* noticed by freeup() and agefont() */
50*7dd7cddfSDavid du Colombier 	c->subfontname = 0;
51*7dd7cddfSDavid du Colombier 	font->subf[0].age = 0;
52*7dd7cddfSDavid du Colombier 	font->subf[0].cf = c;
53*7dd7cddfSDavid du Colombier 	font->subf[0].f = subfont;
54*7dd7cddfSDavid du Colombier 	return font;
55*7dd7cddfSDavid du Colombier }
56