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 76193d7c 2003-09-30 devnull free(fnt->cache);
40 76193d7c 2003-09-30 devnull free(fnt->subf);
41 76193d7c 2003-09-30 devnull free(fnt->sub);
42 76193d7c 2003-09-30 devnull free(fnt);
43 76193d7c 2003-09-30 devnull return 0;
44 76193d7c 2003-09-30 devnull }
45 76193d7c 2003-09-30 devnull fnt->height = strtol(s, &s, 0);
46 76193d7c 2003-09-30 devnull s = skip(s);
47 76193d7c 2003-09-30 devnull fnt->ascent = strtol(s, &s, 0);
48 76193d7c 2003-09-30 devnull s = skip(s);
49 76193d7c 2003-09-30 devnull if(fnt->height<=0 || fnt->ascent<=0){
50 76193d7c 2003-09-30 devnull werrstr("bad height or ascent in font file");
51 76193d7c 2003-09-30 devnull goto Err2;
52 76193d7c 2003-09-30 devnull }
53 76193d7c 2003-09-30 devnull fnt->width = 0;
54 76193d7c 2003-09-30 devnull fnt->nsub = 0;
55 76193d7c 2003-09-30 devnull fnt->sub = 0;
56 76193d7c 2003-09-30 devnull
57 76193d7c 2003-09-30 devnull memset(fnt->subf, 0, fnt->nsubf * sizeof(fnt->subf[0]));
58 76193d7c 2003-09-30 devnull memset(fnt->cache, 0, fnt->ncache*sizeof(fnt->cache[0]));
59 76193d7c 2003-09-30 devnull fnt->age = 1;
60 76193d7c 2003-09-30 devnull do{
61 76193d7c 2003-09-30 devnull /* must be looking at a number now */
62 76193d7c 2003-09-30 devnull if(*s<'0' || '9'<*s){
63 76193d7c 2003-09-30 devnull werrstr(badform, s-buf);
64 76193d7c 2003-09-30 devnull goto Err3;
65 76193d7c 2003-09-30 devnull }
66 76193d7c 2003-09-30 devnull min = strtol(s, &s, 0);
67 76193d7c 2003-09-30 devnull s = skip(s);
68 76193d7c 2003-09-30 devnull /* must be looking at a number now */
69 76193d7c 2003-09-30 devnull if(*s<'0' || '9'<*s){
70 76193d7c 2003-09-30 devnull werrstr(badform, s-buf);
71 76193d7c 2003-09-30 devnull goto Err3;
72 76193d7c 2003-09-30 devnull }
73 76193d7c 2003-09-30 devnull max = strtol(s, &s, 0);
74 76193d7c 2003-09-30 devnull s = skip(s);
75 2d6da376 2010-01-29 rsc if(*s==0 || min>Runemax || max>Runemax || min>max){
76 76193d7c 2003-09-30 devnull werrstr("illegal subfont range");
77 76193d7c 2003-09-30 devnull Err3:
78 76193d7c 2003-09-30 devnull freefont(fnt);
79 76193d7c 2003-09-30 devnull return 0;
80 76193d7c 2003-09-30 devnull }
81 76193d7c 2003-09-30 devnull t = s;
82 76193d7c 2003-09-30 devnull offset = strtol(s, &t, 0);
83 76193d7c 2003-09-30 devnull if(t>s && (*t==' ' || *t=='\t' || *t=='\n'))
84 76193d7c 2003-09-30 devnull s = skip(t);
85 76193d7c 2003-09-30 devnull else
86 76193d7c 2003-09-30 devnull offset = 0;
87 76193d7c 2003-09-30 devnull fnt->sub = realloc(fnt->sub, (fnt->nsub+1)*sizeof(Cachefont*));
88 76193d7c 2003-09-30 devnull if(fnt->sub == 0){
89 76193d7c 2003-09-30 devnull /* realloc manual says fnt->sub may have been destroyed */
90 76193d7c 2003-09-30 devnull fnt->nsub = 0;
91 76193d7c 2003-09-30 devnull goto Err3;
92 76193d7c 2003-09-30 devnull }
93 76193d7c 2003-09-30 devnull c = malloc(sizeof(Cachefont));
94 76193d7c 2003-09-30 devnull if(c == 0)
95 76193d7c 2003-09-30 devnull goto Err3;
96 76193d7c 2003-09-30 devnull fnt->sub[fnt->nsub] = c;
97 76193d7c 2003-09-30 devnull c->min = min;
98 76193d7c 2003-09-30 devnull c->max = max;
99 76193d7c 2003-09-30 devnull c->offset = offset;
100 76193d7c 2003-09-30 devnull t = s;
101 76193d7c 2003-09-30 devnull while(*s && *s!=' ' && *s!='\n' && *s!='\t')
102 76193d7c 2003-09-30 devnull s++;
103 76193d7c 2003-09-30 devnull *s++ = 0;
104 76193d7c 2003-09-30 devnull c->subfontname = 0;
105 76193d7c 2003-09-30 devnull c->name = strdup(t);
106 76193d7c 2003-09-30 devnull if(c->name == 0){
107 76193d7c 2003-09-30 devnull free(c);
108 76193d7c 2003-09-30 devnull goto Err3;
109 76193d7c 2003-09-30 devnull }
110 76193d7c 2003-09-30 devnull s = skip(s);
111 76193d7c 2003-09-30 devnull fnt->nsub++;
112 76193d7c 2003-09-30 devnull }while(*s);
113 76193d7c 2003-09-30 devnull return fnt;
114 76193d7c 2003-09-30 devnull }
115 76193d7c 2003-09-30 devnull
116 76193d7c 2003-09-30 devnull void
117 76193d7c 2003-09-30 devnull freefont(Font *f)
118 76193d7c 2003-09-30 devnull {
119 76193d7c 2003-09-30 devnull int i;
120 76193d7c 2003-09-30 devnull Cachefont *c;
121 76193d7c 2003-09-30 devnull Subfont *s;
122 76193d7c 2003-09-30 devnull
123 76193d7c 2003-09-30 devnull if(f == 0)
124 76193d7c 2003-09-30 devnull return;
125 76193d7c 2003-09-30 devnull
126 76193d7c 2003-09-30 devnull for(i=0; i<f->nsub; i++){
127 76193d7c 2003-09-30 devnull c = f->sub[i];
128 76193d7c 2003-09-30 devnull free(c->subfontname);
129 76193d7c 2003-09-30 devnull free(c->name);
130 76193d7c 2003-09-30 devnull free(c);
131 76193d7c 2003-09-30 devnull }
132 76193d7c 2003-09-30 devnull for(i=0; i<f->nsubf; i++){
133 76193d7c 2003-09-30 devnull s = f->subf[i].f;
134 ca63c078 2005-07-13 devnull if(s && (!display || s!=display->defaultsubfont))
135 76193d7c 2003-09-30 devnull freesubfont(s);
136 76193d7c 2003-09-30 devnull }
137 76193d7c 2003-09-30 devnull freeimage(f->cacheimage);
138 76193d7c 2003-09-30 devnull free(f->name);
139 79555a99 2015-02-17 rsc free(f->namespec);
140 76193d7c 2003-09-30 devnull free(f->cache);
141 76193d7c 2003-09-30 devnull free(f->subf);
142 76193d7c 2003-09-30 devnull free(f->sub);
143 213fc4f6 2015-02-17 rsc
144 213fc4f6 2015-02-17 rsc if(f->ondisplaylist) {
145 213fc4f6 2015-02-17 rsc f->ondisplaylist = 0;
146 213fc4f6 2015-02-17 rsc if(f->next)
147 213fc4f6 2015-02-17 rsc f->next->prev = f->prev;
148 213fc4f6 2015-02-17 rsc else
149 213fc4f6 2015-02-17 rsc f->display->lastfont = f->prev;
150 213fc4f6 2015-02-17 rsc if(f->prev)
151 213fc4f6 2015-02-17 rsc f->prev->next = f->next;
152 213fc4f6 2015-02-17 rsc else
153 213fc4f6 2015-02-17 rsc f->display->firstfont = f->next;
154 213fc4f6 2015-02-17 rsc }
155 213fc4f6 2015-02-17 rsc
156 213fc4f6 2015-02-17 rsc if(f->lodpi != f)
157 213fc4f6 2015-02-17 rsc freefont(f->lodpi);
158 213fc4f6 2015-02-17 rsc if(f->hidpi != f)
159 213fc4f6 2015-02-17 rsc freefont(f->hidpi);
160 213fc4f6 2015-02-17 rsc
161 76193d7c 2003-09-30 devnull free(f);
162 76193d7c 2003-09-30 devnull }