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