Blame


1 76193d7c 2003-09-30 devnull #include <u.h>
2 76193d7c 2003-09-30 devnull #include <libc.h>
3 76193d7c 2003-09-30 devnull #include <draw.h>
4 76193d7c 2003-09-30 devnull
5 76193d7c 2003-09-30 devnull static char*
6 76193d7c 2003-09-30 devnull skip(char *s)
7 76193d7c 2003-09-30 devnull {
8 76193d7c 2003-09-30 devnull while(*s==' ' || *s=='\n' || *s=='\t')
9 76193d7c 2003-09-30 devnull s++;
10 76193d7c 2003-09-30 devnull return s;
11 76193d7c 2003-09-30 devnull }
12 76193d7c 2003-09-30 devnull
13 76193d7c 2003-09-30 devnull Font*
14 76193d7c 2003-09-30 devnull buildfont(Display *d, char *buf, char *name)
15 76193d7c 2003-09-30 devnull {
16 76193d7c 2003-09-30 devnull Font *fnt;
17 76193d7c 2003-09-30 devnull Cachefont *c;
18 76193d7c 2003-09-30 devnull char *s, *t;
19 76193d7c 2003-09-30 devnull ulong min, max;
20 76193d7c 2003-09-30 devnull int offset;
21 76193d7c 2003-09-30 devnull char badform[] = "bad font format: number expected (char position %d)";
22 76193d7c 2003-09-30 devnull
23 76193d7c 2003-09-30 devnull s = buf;
24 76193d7c 2003-09-30 devnull fnt = malloc(sizeof(Font));
25 76193d7c 2003-09-30 devnull if(fnt == 0)
26 76193d7c 2003-09-30 devnull return 0;
27 76193d7c 2003-09-30 devnull memset(fnt, 0, sizeof(Font));
28 77f23268 2015-02-17 rsc fnt->scale = 1;
29 76193d7c 2003-09-30 devnull fnt->display = d;
30 76193d7c 2003-09-30 devnull fnt->name = strdup(name);
31 79555a99 2015-02-17 rsc fnt->namespec = strdup(name);
32 76193d7c 2003-09-30 devnull fnt->ncache = NFCACHE+NFLOOK;
33 76193d7c 2003-09-30 devnull fnt->nsubf = NFSUBF;
34 76193d7c 2003-09-30 devnull fnt->cache = malloc(fnt->ncache * sizeof(fnt->cache[0]));
35 76193d7c 2003-09-30 devnull fnt->subf = malloc(fnt->nsubf * sizeof(fnt->subf[0]));
36 76193d7c 2003-09-30 devnull if(fnt->name==0 || fnt->cache==0 || fnt->subf==0){
37 76193d7c 2003-09-30 devnull Err2:
38 76193d7c 2003-09-30 devnull free(fnt->name);
39 dc2a17b9 2018-03-27 0intro free(fnt->namespec);
40 76193d7c 2003-09-30 devnull free(fnt->cache);
41 76193d7c 2003-09-30 devnull free(fnt->subf);
42 76193d7c 2003-09-30 devnull free(fnt->sub);
43 76193d7c 2003-09-30 devnull free(fnt);
44 76193d7c 2003-09-30 devnull return 0;
45 76193d7c 2003-09-30 devnull }
46 76193d7c 2003-09-30 devnull fnt->height = strtol(s, &s, 0);
47 76193d7c 2003-09-30 devnull s = skip(s);
48 76193d7c 2003-09-30 devnull fnt->ascent = strtol(s, &s, 0);
49 76193d7c 2003-09-30 devnull s = skip(s);
50 76193d7c 2003-09-30 devnull if(fnt->height<=0 || fnt->ascent<=0){
51 76193d7c 2003-09-30 devnull werrstr("bad height or ascent in font file");
52 76193d7c 2003-09-30 devnull goto Err2;
53 76193d7c 2003-09-30 devnull }
54 76193d7c 2003-09-30 devnull fnt->width = 0;
55 76193d7c 2003-09-30 devnull fnt->nsub = 0;
56 76193d7c 2003-09-30 devnull fnt->sub = 0;
57 76193d7c 2003-09-30 devnull
58 76193d7c 2003-09-30 devnull memset(fnt->subf, 0, fnt->nsubf * sizeof(fnt->subf[0]));
59 76193d7c 2003-09-30 devnull memset(fnt->cache, 0, fnt->ncache*sizeof(fnt->cache[0]));
60 76193d7c 2003-09-30 devnull fnt->age = 1;
61 76193d7c 2003-09-30 devnull do{
62 76193d7c 2003-09-30 devnull /* must be looking at a number now */
63 76193d7c 2003-09-30 devnull if(*s<'0' || '9'<*s){
64 76193d7c 2003-09-30 devnull werrstr(badform, s-buf);
65 76193d7c 2003-09-30 devnull goto Err3;
66 76193d7c 2003-09-30 devnull }
67 76193d7c 2003-09-30 devnull min = strtol(s, &s, 0);
68 76193d7c 2003-09-30 devnull s = skip(s);
69 76193d7c 2003-09-30 devnull /* must be looking at a number now */
70 76193d7c 2003-09-30 devnull if(*s<'0' || '9'<*s){
71 76193d7c 2003-09-30 devnull werrstr(badform, s-buf);
72 76193d7c 2003-09-30 devnull goto Err3;
73 76193d7c 2003-09-30 devnull }
74 76193d7c 2003-09-30 devnull max = strtol(s, &s, 0);
75 76193d7c 2003-09-30 devnull s = skip(s);
76 2d6da376 2010-01-29 rsc if(*s==0 || min>Runemax || max>Runemax || min>max){
77 76193d7c 2003-09-30 devnull werrstr("illegal subfont range");
78 76193d7c 2003-09-30 devnull Err3:
79 76193d7c 2003-09-30 devnull freefont(fnt);
80 76193d7c 2003-09-30 devnull return 0;
81 76193d7c 2003-09-30 devnull }
82 76193d7c 2003-09-30 devnull t = s;
83 76193d7c 2003-09-30 devnull offset = strtol(s, &t, 0);
84 76193d7c 2003-09-30 devnull if(t>s && (*t==' ' || *t=='\t' || *t=='\n'))
85 76193d7c 2003-09-30 devnull s = skip(t);
86 76193d7c 2003-09-30 devnull else
87 76193d7c 2003-09-30 devnull offset = 0;
88 76193d7c 2003-09-30 devnull fnt->sub = realloc(fnt->sub, (fnt->nsub+1)*sizeof(Cachefont*));
89 76193d7c 2003-09-30 devnull if(fnt->sub == 0){
90 76193d7c 2003-09-30 devnull /* realloc manual says fnt->sub may have been destroyed */
91 76193d7c 2003-09-30 devnull fnt->nsub = 0;
92 76193d7c 2003-09-30 devnull goto Err3;
93 76193d7c 2003-09-30 devnull }
94 76193d7c 2003-09-30 devnull c = malloc(sizeof(Cachefont));
95 76193d7c 2003-09-30 devnull if(c == 0)
96 76193d7c 2003-09-30 devnull goto Err3;
97 76193d7c 2003-09-30 devnull fnt->sub[fnt->nsub] = c;
98 76193d7c 2003-09-30 devnull c->min = min;
99 76193d7c 2003-09-30 devnull c->max = max;
100 76193d7c 2003-09-30 devnull c->offset = offset;
101 76193d7c 2003-09-30 devnull t = s;
102 76193d7c 2003-09-30 devnull while(*s && *s!=' ' && *s!='\n' && *s!='\t')
103 76193d7c 2003-09-30 devnull s++;
104 76193d7c 2003-09-30 devnull *s++ = 0;
105 76193d7c 2003-09-30 devnull c->subfontname = 0;
106 76193d7c 2003-09-30 devnull c->name = strdup(t);
107 76193d7c 2003-09-30 devnull if(c->name == 0){
108 76193d7c 2003-09-30 devnull free(c);
109 76193d7c 2003-09-30 devnull goto Err3;
110 76193d7c 2003-09-30 devnull }
111 76193d7c 2003-09-30 devnull s = skip(s);
112 76193d7c 2003-09-30 devnull fnt->nsub++;
113 76193d7c 2003-09-30 devnull }while(*s);
114 76193d7c 2003-09-30 devnull return fnt;
115 76193d7c 2003-09-30 devnull }
116 76193d7c 2003-09-30 devnull
117 76193d7c 2003-09-30 devnull void
118 76193d7c 2003-09-30 devnull freefont(Font *f)
119 76193d7c 2003-09-30 devnull {
120 76193d7c 2003-09-30 devnull int i;
121 76193d7c 2003-09-30 devnull Cachefont *c;
122 76193d7c 2003-09-30 devnull Subfont *s;
123 76193d7c 2003-09-30 devnull
124 76193d7c 2003-09-30 devnull if(f == 0)
125 76193d7c 2003-09-30 devnull return;
126 76193d7c 2003-09-30 devnull
127 76193d7c 2003-09-30 devnull for(i=0; i<f->nsub; i++){
128 76193d7c 2003-09-30 devnull c = f->sub[i];
129 76193d7c 2003-09-30 devnull free(c->subfontname);
130 76193d7c 2003-09-30 devnull free(c->name);
131 76193d7c 2003-09-30 devnull free(c);
132 76193d7c 2003-09-30 devnull }
133 76193d7c 2003-09-30 devnull for(i=0; i<f->nsubf; i++){
134 76193d7c 2003-09-30 devnull s = f->subf[i].f;
135 16d00819 2018-11-16 rsc if(s)
136 76193d7c 2003-09-30 devnull freesubfont(s);
137 76193d7c 2003-09-30 devnull }
138 76193d7c 2003-09-30 devnull freeimage(f->cacheimage);
139 76193d7c 2003-09-30 devnull free(f->name);
140 79555a99 2015-02-17 rsc free(f->namespec);
141 76193d7c 2003-09-30 devnull free(f->cache);
142 76193d7c 2003-09-30 devnull free(f->subf);
143 76193d7c 2003-09-30 devnull free(f->sub);
144 213fc4f6 2015-02-17 rsc
145 213fc4f6 2015-02-17 rsc if(f->ondisplaylist) {
146 213fc4f6 2015-02-17 rsc f->ondisplaylist = 0;
147 213fc4f6 2015-02-17 rsc if(f->next)
148 213fc4f6 2015-02-17 rsc f->next->prev = f->prev;
149 213fc4f6 2015-02-17 rsc else
150 213fc4f6 2015-02-17 rsc f->display->lastfont = f->prev;
151 213fc4f6 2015-02-17 rsc if(f->prev)
152 213fc4f6 2015-02-17 rsc f->prev->next = f->next;
153 213fc4f6 2015-02-17 rsc else
154 213fc4f6 2015-02-17 rsc f->display->firstfont = f->next;
155 213fc4f6 2015-02-17 rsc }
156 213fc4f6 2015-02-17 rsc
157 fa325e9b 2020-01-10 cross if(f->lodpi != f)
158 213fc4f6 2015-02-17 rsc freefont(f->lodpi);
159 213fc4f6 2015-02-17 rsc if(f->hidpi != f)
160 213fc4f6 2015-02-17 rsc freefont(f->hidpi);
161 213fc4f6 2015-02-17 rsc
162 76193d7c 2003-09-30 devnull free(f);
163 76193d7c 2003-09-30 devnull }