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 int fontresize(Font*, int, int, int);
6 76193d7c 2003-09-30 devnull #if 0
7 76193d7c 2003-09-30 devnull static int freeup(Font*);
8 76193d7c 2003-09-30 devnull #endif
9 76193d7c 2003-09-30 devnull
10 76193d7c 2003-09-30 devnull #define PJW 0 /* use NUL==pjw for invisible characters */
11 76193d7c 2003-09-30 devnull
12 76193d7c 2003-09-30 devnull static Rune empty[] = { 0 };
13 76193d7c 2003-09-30 devnull int
14 76193d7c 2003-09-30 devnull cachechars(Font *f, char **ss, Rune **rr, ushort *cp, int max, int *wp, char **subfontname)
15 76193d7c 2003-09-30 devnull {
16 76193d7c 2003-09-30 devnull int i, th, sh, h, ld, w, rw, wid, nc;
17 76193d7c 2003-09-30 devnull char *sp;
18 76193d7c 2003-09-30 devnull Rune r, *rp, vr;
19 76193d7c 2003-09-30 devnull ulong a;
20 76193d7c 2003-09-30 devnull Cacheinfo *c, *tc, *ec;
21 76193d7c 2003-09-30 devnull
22 76193d7c 2003-09-30 devnull if(ss){
23 76193d7c 2003-09-30 devnull sp = *ss;
24 76193d7c 2003-09-30 devnull rp = empty;
25 76193d7c 2003-09-30 devnull }else{
26 76193d7c 2003-09-30 devnull sp = "";
27 76193d7c 2003-09-30 devnull rp = *rr;
28 76193d7c 2003-09-30 devnull }
29 76193d7c 2003-09-30 devnull wid = 0;
30 76193d7c 2003-09-30 devnull *subfontname = 0;
31 15680d56 2004-03-05 devnull for(i=0; i<max && (*sp || *rp); sp+=w, rp+=rw){
32 76193d7c 2003-09-30 devnull if(ss){
33 76193d7c 2003-09-30 devnull r = *(uchar*)sp;
34 76193d7c 2003-09-30 devnull if(r < Runeself)
35 76193d7c 2003-09-30 devnull w = 1;
36 76193d7c 2003-09-30 devnull else{
37 76193d7c 2003-09-30 devnull w = chartorune(&vr, sp);
38 76193d7c 2003-09-30 devnull r = vr;
39 76193d7c 2003-09-30 devnull }
40 76193d7c 2003-09-30 devnull rw = 0;
41 76193d7c 2003-09-30 devnull }else{
42 76193d7c 2003-09-30 devnull r = *rp;
43 76193d7c 2003-09-30 devnull w = 0;
44 76193d7c 2003-09-30 devnull rw = 1;
45 76193d7c 2003-09-30 devnull }
46 76193d7c 2003-09-30 devnull
47 76193d7c 2003-09-30 devnull sh = (17 * (uint)r) & (f->ncache-NFLOOK-1);
48 76193d7c 2003-09-30 devnull c = &f->cache[sh];
49 76193d7c 2003-09-30 devnull ec = c+NFLOOK;
50 76193d7c 2003-09-30 devnull h = sh;
51 76193d7c 2003-09-30 devnull while(c < ec){
52 76193d7c 2003-09-30 devnull if(c->value==r && c->age)
53 76193d7c 2003-09-30 devnull goto Found;
54 76193d7c 2003-09-30 devnull c++;
55 76193d7c 2003-09-30 devnull h++;
56 76193d7c 2003-09-30 devnull }
57 76193d7c 2003-09-30 devnull
58 76193d7c 2003-09-30 devnull /*
59 76193d7c 2003-09-30 devnull * Not found; toss out oldest entry
60 76193d7c 2003-09-30 devnull */
61 76193d7c 2003-09-30 devnull a = ~0;
62 76193d7c 2003-09-30 devnull th = sh;
63 76193d7c 2003-09-30 devnull tc = &f->cache[th];
64 76193d7c 2003-09-30 devnull while(tc < ec){
65 76193d7c 2003-09-30 devnull if(tc->age < a){
66 76193d7c 2003-09-30 devnull a = tc->age;
67 76193d7c 2003-09-30 devnull h = th;
68 76193d7c 2003-09-30 devnull c = tc;
69 76193d7c 2003-09-30 devnull }
70 76193d7c 2003-09-30 devnull tc++;
71 76193d7c 2003-09-30 devnull th++;
72 76193d7c 2003-09-30 devnull }
73 76193d7c 2003-09-30 devnull
74 76193d7c 2003-09-30 devnull if(a && (f->age-a)<500){ /* kicking out too recent; resize */
75 76193d7c 2003-09-30 devnull nc = 2*(f->ncache-NFLOOK) + NFLOOK;
76 76193d7c 2003-09-30 devnull if(nc <= MAXFCACHE){
77 76193d7c 2003-09-30 devnull if(i == 0)
78 76193d7c 2003-09-30 devnull fontresize(f, f->width, nc, f->maxdepth);
79 76193d7c 2003-09-30 devnull /* else flush first; retry will resize */
80 76193d7c 2003-09-30 devnull break;
81 76193d7c 2003-09-30 devnull }
82 76193d7c 2003-09-30 devnull }
83 76193d7c 2003-09-30 devnull
84 76193d7c 2003-09-30 devnull if(c->age == f->age) /* flush pending string output */
85 76193d7c 2003-09-30 devnull break;
86 76193d7c 2003-09-30 devnull
87 76193d7c 2003-09-30 devnull ld = loadchar(f, r, c, h, i, subfontname);
88 76193d7c 2003-09-30 devnull if(ld <= 0){
89 76193d7c 2003-09-30 devnull if(ld == 0)
90 76193d7c 2003-09-30 devnull continue;
91 76193d7c 2003-09-30 devnull break;
92 76193d7c 2003-09-30 devnull }
93 76193d7c 2003-09-30 devnull c = &f->cache[h]; /* may have reallocated f->cache */
94 76193d7c 2003-09-30 devnull
95 76193d7c 2003-09-30 devnull Found:
96 76193d7c 2003-09-30 devnull wid += c->width;
97 76193d7c 2003-09-30 devnull c->age = f->age;
98 76193d7c 2003-09-30 devnull cp[i] = h;
99 76193d7c 2003-09-30 devnull i++;
100 76193d7c 2003-09-30 devnull }
101 76193d7c 2003-09-30 devnull if(ss)
102 76193d7c 2003-09-30 devnull *ss = sp;
103 76193d7c 2003-09-30 devnull else
104 76193d7c 2003-09-30 devnull *rr = rp;
105 76193d7c 2003-09-30 devnull *wp = wid;
106 76193d7c 2003-09-30 devnull return i;
107 76193d7c 2003-09-30 devnull }
108 76193d7c 2003-09-30 devnull
109 76193d7c 2003-09-30 devnull void
110 76193d7c 2003-09-30 devnull agefont(Font *f)
111 76193d7c 2003-09-30 devnull {
112 76193d7c 2003-09-30 devnull Cacheinfo *c, *ec;
113 76193d7c 2003-09-30 devnull Cachesubf *s, *es;
114 76193d7c 2003-09-30 devnull
115 76193d7c 2003-09-30 devnull f->age++;
116 76193d7c 2003-09-30 devnull if(f->age == 65536){
117 76193d7c 2003-09-30 devnull /*
118 76193d7c 2003-09-30 devnull * Renormalize ages
119 76193d7c 2003-09-30 devnull */
120 76193d7c 2003-09-30 devnull c = f->cache;
121 76193d7c 2003-09-30 devnull ec = c+f->ncache;
122 76193d7c 2003-09-30 devnull while(c < ec){
123 76193d7c 2003-09-30 devnull if(c->age){
124 76193d7c 2003-09-30 devnull c->age >>= 2;
125 76193d7c 2003-09-30 devnull c->age++;
126 76193d7c 2003-09-30 devnull }
127 76193d7c 2003-09-30 devnull c++;
128 76193d7c 2003-09-30 devnull }
129 76193d7c 2003-09-30 devnull s = f->subf;
130 76193d7c 2003-09-30 devnull es = s+f->nsubf;
131 76193d7c 2003-09-30 devnull while(s < es){
132 76193d7c 2003-09-30 devnull if(s->age){
133 76193d7c 2003-09-30 devnull if(s->age<SUBFAGE && s->cf->name != nil){
134 76193d7c 2003-09-30 devnull /* clean up */
135 ca63c078 2005-07-13 devnull if(display==nil || s->f != display->defaultsubfont)
136 76193d7c 2003-09-30 devnull freesubfont(s->f);
137 76193d7c 2003-09-30 devnull s->cf = nil;
138 76193d7c 2003-09-30 devnull s->f = nil;
139 76193d7c 2003-09-30 devnull s->age = 0;
140 76193d7c 2003-09-30 devnull }else{
141 76193d7c 2003-09-30 devnull s->age >>= 2;
142 76193d7c 2003-09-30 devnull s->age++;
143 76193d7c 2003-09-30 devnull }
144 76193d7c 2003-09-30 devnull }
145 76193d7c 2003-09-30 devnull s++;
146 76193d7c 2003-09-30 devnull }
147 76193d7c 2003-09-30 devnull f->age = (65536>>2) + 1;
148 76193d7c 2003-09-30 devnull }
149 76193d7c 2003-09-30 devnull }
150 76193d7c 2003-09-30 devnull
151 76193d7c 2003-09-30 devnull static Subfont*
152 76193d7c 2003-09-30 devnull cf2subfont(Cachefont *cf, Font *f)
153 76193d7c 2003-09-30 devnull {
154 76193d7c 2003-09-30 devnull int depth;
155 76193d7c 2003-09-30 devnull char *name;
156 76193d7c 2003-09-30 devnull Subfont *sf;
157 76193d7c 2003-09-30 devnull
158 76193d7c 2003-09-30 devnull name = cf->subfontname;
159 76193d7c 2003-09-30 devnull if(name == nil){
160 76193d7c 2003-09-30 devnull depth = 0;
161 76193d7c 2003-09-30 devnull if(f->display){
162 76193d7c 2003-09-30 devnull if(f->display->screenimage)
163 76193d7c 2003-09-30 devnull depth = f->display->screenimage->depth;
164 4e206880 2004-04-25 devnull }else
165 4e206880 2004-04-25 devnull depth = 8;
166 76193d7c 2003-09-30 devnull name = subfontname(cf->name, f->name, depth);
167 76193d7c 2003-09-30 devnull if(name == nil)
168 76193d7c 2003-09-30 devnull return nil;
169 76193d7c 2003-09-30 devnull cf->subfontname = name;
170 76193d7c 2003-09-30 devnull }
171 76193d7c 2003-09-30 devnull sf = lookupsubfont(f->display, name);
172 76193d7c 2003-09-30 devnull return sf;
173 76193d7c 2003-09-30 devnull }
174 76193d7c 2003-09-30 devnull
175 76193d7c 2003-09-30 devnull /* return 1 if load succeeded, 0 if failed, -1 if must retry */
176 76193d7c 2003-09-30 devnull int
177 76193d7c 2003-09-30 devnull loadchar(Font *f, Rune r, Cacheinfo *c, int h, int noflush, char **subfontname)
178 76193d7c 2003-09-30 devnull {
179 76193d7c 2003-09-30 devnull int i, oi, wid, top, bottom;
180 d4aef6a0 2005-05-12 devnull int pic; /* need >16 bits for adding offset below */
181 76193d7c 2003-09-30 devnull Fontchar *fi;
182 76193d7c 2003-09-30 devnull Cachefont *cf;
183 76193d7c 2003-09-30 devnull Cachesubf *subf, *of;
184 76193d7c 2003-09-30 devnull uchar *b;
185 76193d7c 2003-09-30 devnull
186 76193d7c 2003-09-30 devnull pic = r;
187 76193d7c 2003-09-30 devnull Again:
188 76193d7c 2003-09-30 devnull for(i=0; i<f->nsub; i++){
189 76193d7c 2003-09-30 devnull cf = f->sub[i];
190 76193d7c 2003-09-30 devnull if(cf->min<=pic && pic<=cf->max)
191 76193d7c 2003-09-30 devnull goto Found;
192 76193d7c 2003-09-30 devnull }
193 76193d7c 2003-09-30 devnull TryPJW:
194 76193d7c 2003-09-30 devnull if(pic != PJW){
195 76193d7c 2003-09-30 devnull pic = PJW;
196 76193d7c 2003-09-30 devnull goto Again;
197 76193d7c 2003-09-30 devnull }
198 76193d7c 2003-09-30 devnull return 0;
199 76193d7c 2003-09-30 devnull
200 76193d7c 2003-09-30 devnull Found:
201 76193d7c 2003-09-30 devnull /*
202 76193d7c 2003-09-30 devnull * Choose exact or oldest
203 76193d7c 2003-09-30 devnull */
204 76193d7c 2003-09-30 devnull oi = 0;
205 76193d7c 2003-09-30 devnull subf = &f->subf[0];
206 76193d7c 2003-09-30 devnull for(i=0; i<f->nsubf; i++){
207 76193d7c 2003-09-30 devnull if(cf == subf->cf)
208 76193d7c 2003-09-30 devnull goto Found2;
209 76193d7c 2003-09-30 devnull if(subf->age < f->subf[oi].age)
210 76193d7c 2003-09-30 devnull oi = i;
211 76193d7c 2003-09-30 devnull subf++;
212 76193d7c 2003-09-30 devnull }
213 76193d7c 2003-09-30 devnull subf = &f->subf[oi];
214 76193d7c 2003-09-30 devnull
215 76193d7c 2003-09-30 devnull if(subf->f){
216 76193d7c 2003-09-30 devnull if(f->age-subf->age>SUBFAGE || f->nsubf>MAXSUBF){
217 76193d7c 2003-09-30 devnull Toss:
218 76193d7c 2003-09-30 devnull /* ancient data; toss */
219 76193d7c 2003-09-30 devnull freesubfont(subf->f);
220 76193d7c 2003-09-30 devnull subf->cf = nil;
221 76193d7c 2003-09-30 devnull subf->f = nil;
222 76193d7c 2003-09-30 devnull subf->age = 0;
223 76193d7c 2003-09-30 devnull }else{ /* too recent; grow instead */
224 76193d7c 2003-09-30 devnull of = f->subf;
225 76193d7c 2003-09-30 devnull f->subf = malloc((f->nsubf+DSUBF)*sizeof *subf);
226 76193d7c 2003-09-30 devnull if(f->subf == nil){
227 76193d7c 2003-09-30 devnull f->subf = of;
228 76193d7c 2003-09-30 devnull goto Toss;
229 76193d7c 2003-09-30 devnull }
230 76193d7c 2003-09-30 devnull memmove(f->subf, of, (f->nsubf+DSUBF)*sizeof *subf);
231 76193d7c 2003-09-30 devnull memset(f->subf+f->nsubf, 0, DSUBF*sizeof *subf);
232 76193d7c 2003-09-30 devnull subf = &f->subf[f->nsubf];
233 76193d7c 2003-09-30 devnull f->nsubf += DSUBF;
234 76193d7c 2003-09-30 devnull free(of);
235 76193d7c 2003-09-30 devnull }
236 76193d7c 2003-09-30 devnull }
237 76193d7c 2003-09-30 devnull subf->age = 0;
238 76193d7c 2003-09-30 devnull subf->cf = nil;
239 76193d7c 2003-09-30 devnull subf->f = cf2subfont(cf, f);
240 76193d7c 2003-09-30 devnull if(subf->f == nil){
241 76193d7c 2003-09-30 devnull if(cf->subfontname == nil)
242 76193d7c 2003-09-30 devnull goto TryPJW;
243 76193d7c 2003-09-30 devnull *subfontname = cf->subfontname;
244 76193d7c 2003-09-30 devnull return -1;
245 76193d7c 2003-09-30 devnull }
246 76193d7c 2003-09-30 devnull
247 76193d7c 2003-09-30 devnull subf->cf = cf;
248 4e206880 2004-04-25 devnull if(subf->f->ascent > f->ascent && f->display){
249 76193d7c 2003-09-30 devnull /* should print something? this is a mistake in the font file */
250 76193d7c 2003-09-30 devnull /* must prevent c->top from going negative when loading cache */
251 76193d7c 2003-09-30 devnull Image *b;
252 76193d7c 2003-09-30 devnull int d, t;
253 76193d7c 2003-09-30 devnull d = subf->f->ascent - f->ascent;
254 76193d7c 2003-09-30 devnull b = subf->f->bits;
255 76193d7c 2003-09-30 devnull draw(b, b->r, b, nil, addpt(b->r.min, Pt(0, d)));
256 76193d7c 2003-09-30 devnull draw(b, Rect(b->r.min.x, b->r.max.y-d, b->r.max.x, b->r.max.y), f->display->black, nil, b->r.min);
257 76193d7c 2003-09-30 devnull for(i=0; i<subf->f->n; i++){
258 76193d7c 2003-09-30 devnull t = subf->f->info[i].top-d;
259 76193d7c 2003-09-30 devnull if(t < 0)
260 76193d7c 2003-09-30 devnull t = 0;
261 76193d7c 2003-09-30 devnull subf->f->info[i].top = t;
262 76193d7c 2003-09-30 devnull t = subf->f->info[i].bottom-d;
263 76193d7c 2003-09-30 devnull if(t < 0)
264 76193d7c 2003-09-30 devnull t = 0;
265 76193d7c 2003-09-30 devnull subf->f->info[i].bottom = t;
266 76193d7c 2003-09-30 devnull }
267 76193d7c 2003-09-30 devnull subf->f->ascent = f->ascent;
268 76193d7c 2003-09-30 devnull }
269 76193d7c 2003-09-30 devnull
270 76193d7c 2003-09-30 devnull Found2:
271 76193d7c 2003-09-30 devnull subf->age = f->age;
272 76193d7c 2003-09-30 devnull
273 d4aef6a0 2005-05-12 devnull /* possible overflow here, but works out okay */
274 76193d7c 2003-09-30 devnull pic += cf->offset;
275 d4aef6a0 2005-05-12 devnull pic -= cf->min;
276 d4aef6a0 2005-05-12 devnull if(pic >= subf->f->n)
277 76193d7c 2003-09-30 devnull goto TryPJW;
278 d4aef6a0 2005-05-12 devnull fi = &subf->f->info[pic];
279 76193d7c 2003-09-30 devnull if(fi->width == 0)
280 76193d7c 2003-09-30 devnull goto TryPJW;
281 76193d7c 2003-09-30 devnull wid = (fi+1)->x - fi->x;
282 76193d7c 2003-09-30 devnull if(f->width < wid || f->width == 0 || f->maxdepth < subf->f->bits->depth){
283 76193d7c 2003-09-30 devnull /*
284 76193d7c 2003-09-30 devnull * Flush, free, reload (easier than reformatting f->b)
285 76193d7c 2003-09-30 devnull */
286 76193d7c 2003-09-30 devnull if(noflush)
287 76193d7c 2003-09-30 devnull return -1;
288 76193d7c 2003-09-30 devnull if(f->width < wid)
289 76193d7c 2003-09-30 devnull f->width = wid;
290 76193d7c 2003-09-30 devnull if(f->maxdepth < subf->f->bits->depth)
291 76193d7c 2003-09-30 devnull f->maxdepth = subf->f->bits->depth;
292 76193d7c 2003-09-30 devnull i = fontresize(f, f->width, f->ncache, f->maxdepth);
293 76193d7c 2003-09-30 devnull if(i <= 0)
294 76193d7c 2003-09-30 devnull return i;
295 76193d7c 2003-09-30 devnull /* c is still valid as didn't reallocate f->cache */
296 76193d7c 2003-09-30 devnull }
297 76193d7c 2003-09-30 devnull c->value = r;
298 76193d7c 2003-09-30 devnull top = fi->top + (f->ascent-subf->f->ascent);
299 76193d7c 2003-09-30 devnull bottom = fi->bottom + (f->ascent-subf->f->ascent);
300 76193d7c 2003-09-30 devnull c->width = fi->width;
301 76193d7c 2003-09-30 devnull c->x = h*f->width;
302 76193d7c 2003-09-30 devnull c->left = fi->left;
303 4e206880 2004-04-25 devnull if(f->display == nil)
304 4e206880 2004-04-25 devnull return 1;
305 76193d7c 2003-09-30 devnull flushimage(f->display, 0); /* flush any pending errors */
306 76193d7c 2003-09-30 devnull b = bufimage(f->display, 37);
307 76193d7c 2003-09-30 devnull if(b == 0)
308 76193d7c 2003-09-30 devnull return 0;
309 76193d7c 2003-09-30 devnull b[0] = 'l';
310 76193d7c 2003-09-30 devnull BPLONG(b+1, f->cacheimage->id);
311 76193d7c 2003-09-30 devnull BPLONG(b+5, subf->f->bits->id);
312 76193d7c 2003-09-30 devnull BPSHORT(b+9, c-f->cache);
313 76193d7c 2003-09-30 devnull BPLONG(b+11, c->x);
314 76193d7c 2003-09-30 devnull BPLONG(b+15, top);
315 76193d7c 2003-09-30 devnull BPLONG(b+19, c->x+((fi+1)->x-fi->x));
316 76193d7c 2003-09-30 devnull BPLONG(b+23, bottom);
317 76193d7c 2003-09-30 devnull BPLONG(b+27, fi->x);
318 76193d7c 2003-09-30 devnull BPLONG(b+31, fi->top);
319 76193d7c 2003-09-30 devnull b[35] = fi->left;
320 76193d7c 2003-09-30 devnull b[36] = fi->width;
321 76193d7c 2003-09-30 devnull return 1;
322 76193d7c 2003-09-30 devnull }
323 76193d7c 2003-09-30 devnull
324 76193d7c 2003-09-30 devnull /* release all subfonts, return number freed */
325 76193d7c 2003-09-30 devnull #if 0
326 76193d7c 2003-09-30 devnull static
327 76193d7c 2003-09-30 devnull int
328 76193d7c 2003-09-30 devnull freeup(Font *f)
329 76193d7c 2003-09-30 devnull {
330 76193d7c 2003-09-30 devnull Cachesubf *s, *es;
331 76193d7c 2003-09-30 devnull int nf;
332 76193d7c 2003-09-30 devnull
333 76193d7c 2003-09-30 devnull if(f->sub[0]->name == nil) /* font from mkfont; don't free */
334 76193d7c 2003-09-30 devnull return 0;
335 76193d7c 2003-09-30 devnull s = f->subf;
336 76193d7c 2003-09-30 devnull es = s+f->nsubf;
337 76193d7c 2003-09-30 devnull nf = 0;
338 76193d7c 2003-09-30 devnull while(s < es){
339 76193d7c 2003-09-30 devnull if(s->age){
340 76193d7c 2003-09-30 devnull freesubfont(s->f);
341 76193d7c 2003-09-30 devnull s->cf = nil;
342 76193d7c 2003-09-30 devnull s->f = nil;
343 76193d7c 2003-09-30 devnull s->age = 0;
344 76193d7c 2003-09-30 devnull nf++;
345 76193d7c 2003-09-30 devnull }
346 76193d7c 2003-09-30 devnull s++;
347 76193d7c 2003-09-30 devnull }
348 76193d7c 2003-09-30 devnull return nf;
349 76193d7c 2003-09-30 devnull }
350 76193d7c 2003-09-30 devnull #endif
351 76193d7c 2003-09-30 devnull
352 76193d7c 2003-09-30 devnull /* return whether resize succeeded && f->cache is unchanged */
353 76193d7c 2003-09-30 devnull static int
354 76193d7c 2003-09-30 devnull fontresize(Font *f, int wid, int ncache, int depth)
355 76193d7c 2003-09-30 devnull {
356 76193d7c 2003-09-30 devnull Cacheinfo *i;
357 76193d7c 2003-09-30 devnull int ret;
358 76193d7c 2003-09-30 devnull Image *new;
359 76193d7c 2003-09-30 devnull uchar *b;
360 76193d7c 2003-09-30 devnull Display *d;
361 76193d7c 2003-09-30 devnull
362 76193d7c 2003-09-30 devnull ret = 0;
363 76193d7c 2003-09-30 devnull if(depth <= 0)
364 76193d7c 2003-09-30 devnull depth = 1;
365 76193d7c 2003-09-30 devnull
366 4e206880 2004-04-25 devnull d = f->display;
367 4e206880 2004-04-25 devnull if(d == nil)
368 4e206880 2004-04-25 devnull goto Nodisplay;
369 4e206880 2004-04-25 devnull
370 76193d7c 2003-09-30 devnull new = allocimage(d, Rect(0, 0, ncache*wid, f->height), CHAN1(CGrey, depth), 0, 0);
371 76193d7c 2003-09-30 devnull if(new == nil){
372 76193d7c 2003-09-30 devnull fprint(2, "font cache resize failed: %r\n");
373 76193d7c 2003-09-30 devnull abort();
374 76193d7c 2003-09-30 devnull goto Return;
375 76193d7c 2003-09-30 devnull }
376 76193d7c 2003-09-30 devnull flushimage(d, 0); /* flush any pending errors */
377 76193d7c 2003-09-30 devnull b = bufimage(d, 1+4+4+1);
378 76193d7c 2003-09-30 devnull if(b == 0){
379 76193d7c 2003-09-30 devnull freeimage(new);
380 76193d7c 2003-09-30 devnull goto Return;
381 76193d7c 2003-09-30 devnull }
382 76193d7c 2003-09-30 devnull b[0] = 'i';
383 76193d7c 2003-09-30 devnull BPLONG(b+1, new->id);
384 76193d7c 2003-09-30 devnull BPLONG(b+5, ncache);
385 76193d7c 2003-09-30 devnull b[9] = f->ascent;
386 76193d7c 2003-09-30 devnull if(flushimage(d, 0) < 0){
387 76193d7c 2003-09-30 devnull fprint(2, "resize: init failed: %r\n");
388 76193d7c 2003-09-30 devnull freeimage(new);
389 76193d7c 2003-09-30 devnull goto Return;
390 76193d7c 2003-09-30 devnull }
391 76193d7c 2003-09-30 devnull freeimage(f->cacheimage);
392 76193d7c 2003-09-30 devnull f->cacheimage = new;
393 4e206880 2004-04-25 devnull Nodisplay:
394 76193d7c 2003-09-30 devnull f->width = wid;
395 76193d7c 2003-09-30 devnull f->maxdepth = depth;
396 76193d7c 2003-09-30 devnull ret = 1;
397 76193d7c 2003-09-30 devnull if(f->ncache != ncache){
398 76193d7c 2003-09-30 devnull i = malloc(ncache*sizeof f->cache[0]);
399 76193d7c 2003-09-30 devnull if(i != nil){
400 76193d7c 2003-09-30 devnull ret = 0;
401 76193d7c 2003-09-30 devnull free(f->cache);
402 76193d7c 2003-09-30 devnull f->ncache = ncache;
403 76193d7c 2003-09-30 devnull f->cache = i;
404 76193d7c 2003-09-30 devnull }
405 76193d7c 2003-09-30 devnull /* else just wipe the cache clean and things will be ok */
406 76193d7c 2003-09-30 devnull }
407 76193d7c 2003-09-30 devnull Return:
408 76193d7c 2003-09-30 devnull memset(f->cache, 0, f->ncache*sizeof f->cache[0]);
409 76193d7c 2003-09-30 devnull return ret;
410 76193d7c 2003-09-30 devnull }