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 fa325e9b 2020-01-10 cross
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 fa325e9b 2020-01-10 cross
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 16d00819 2018-11-16 rsc freesubfont(s->f);
136 76193d7c 2003-09-30 devnull s->cf = nil;
137 76193d7c 2003-09-30 devnull s->f = nil;
138 76193d7c 2003-09-30 devnull s->age = 0;
139 76193d7c 2003-09-30 devnull }else{
140 76193d7c 2003-09-30 devnull s->age >>= 2;
141 76193d7c 2003-09-30 devnull s->age++;
142 76193d7c 2003-09-30 devnull }
143 76193d7c 2003-09-30 devnull }
144 76193d7c 2003-09-30 devnull s++;
145 76193d7c 2003-09-30 devnull }
146 76193d7c 2003-09-30 devnull f->age = (65536>>2) + 1;
147 76193d7c 2003-09-30 devnull }
148 76193d7c 2003-09-30 devnull }
149 76193d7c 2003-09-30 devnull
150 76193d7c 2003-09-30 devnull static Subfont*
151 76193d7c 2003-09-30 devnull cf2subfont(Cachefont *cf, Font *f)
152 76193d7c 2003-09-30 devnull {
153 76193d7c 2003-09-30 devnull int depth;
154 76193d7c 2003-09-30 devnull char *name;
155 76193d7c 2003-09-30 devnull Subfont *sf;
156 76193d7c 2003-09-30 devnull
157 76193d7c 2003-09-30 devnull name = cf->subfontname;
158 76193d7c 2003-09-30 devnull if(name == nil){
159 76193d7c 2003-09-30 devnull depth = 0;
160 76193d7c 2003-09-30 devnull if(f->display){
161 76193d7c 2003-09-30 devnull if(f->display->screenimage)
162 76193d7c 2003-09-30 devnull depth = f->display->screenimage->depth;
163 4e206880 2004-04-25 devnull }else
164 4e206880 2004-04-25 devnull depth = 8;
165 76193d7c 2003-09-30 devnull name = subfontname(cf->name, f->name, depth);
166 76193d7c 2003-09-30 devnull if(name == nil)
167 76193d7c 2003-09-30 devnull return nil;
168 76193d7c 2003-09-30 devnull cf->subfontname = name;
169 76193d7c 2003-09-30 devnull }
170 76193d7c 2003-09-30 devnull sf = lookupsubfont(f->display, name);
171 76193d7c 2003-09-30 devnull return sf;
172 76193d7c 2003-09-30 devnull }
173 76193d7c 2003-09-30 devnull
174 76193d7c 2003-09-30 devnull /* return 1 if load succeeded, 0 if failed, -1 if must retry */
175 76193d7c 2003-09-30 devnull int
176 76193d7c 2003-09-30 devnull loadchar(Font *f, Rune r, Cacheinfo *c, int h, int noflush, char **subfontname)
177 76193d7c 2003-09-30 devnull {
178 76193d7c 2003-09-30 devnull int i, oi, wid, top, bottom;
179 d4aef6a0 2005-05-12 devnull int pic; /* need >16 bits for adding offset below */
180 76193d7c 2003-09-30 devnull Fontchar *fi;
181 76193d7c 2003-09-30 devnull Cachefont *cf;
182 76193d7c 2003-09-30 devnull Cachesubf *subf, *of;
183 76193d7c 2003-09-30 devnull uchar *b;
184 76193d7c 2003-09-30 devnull
185 76193d7c 2003-09-30 devnull pic = r;
186 76193d7c 2003-09-30 devnull Again:
187 76193d7c 2003-09-30 devnull for(i=0; i<f->nsub; i++){
188 76193d7c 2003-09-30 devnull cf = f->sub[i];
189 76193d7c 2003-09-30 devnull if(cf->min<=pic && pic<=cf->max)
190 76193d7c 2003-09-30 devnull goto Found;
191 76193d7c 2003-09-30 devnull }
192 76193d7c 2003-09-30 devnull TryPJW:
193 76193d7c 2003-09-30 devnull if(pic != PJW){
194 76193d7c 2003-09-30 devnull pic = PJW;
195 76193d7c 2003-09-30 devnull goto Again;
196 76193d7c 2003-09-30 devnull }
197 76193d7c 2003-09-30 devnull return 0;
198 76193d7c 2003-09-30 devnull
199 76193d7c 2003-09-30 devnull Found:
200 76193d7c 2003-09-30 devnull /*
201 76193d7c 2003-09-30 devnull * Choose exact or oldest
202 76193d7c 2003-09-30 devnull */
203 76193d7c 2003-09-30 devnull oi = 0;
204 76193d7c 2003-09-30 devnull subf = &f->subf[0];
205 76193d7c 2003-09-30 devnull for(i=0; i<f->nsubf; i++){
206 76193d7c 2003-09-30 devnull if(cf == subf->cf)
207 76193d7c 2003-09-30 devnull goto Found2;
208 76193d7c 2003-09-30 devnull if(subf->age < f->subf[oi].age)
209 76193d7c 2003-09-30 devnull oi = i;
210 76193d7c 2003-09-30 devnull subf++;
211 76193d7c 2003-09-30 devnull }
212 76193d7c 2003-09-30 devnull subf = &f->subf[oi];
213 76193d7c 2003-09-30 devnull
214 76193d7c 2003-09-30 devnull if(subf->f){
215 76193d7c 2003-09-30 devnull if(f->age-subf->age>SUBFAGE || f->nsubf>MAXSUBF){
216 76193d7c 2003-09-30 devnull Toss:
217 76193d7c 2003-09-30 devnull /* ancient data; toss */
218 76193d7c 2003-09-30 devnull freesubfont(subf->f);
219 76193d7c 2003-09-30 devnull subf->cf = nil;
220 76193d7c 2003-09-30 devnull subf->f = nil;
221 76193d7c 2003-09-30 devnull subf->age = 0;
222 76193d7c 2003-09-30 devnull }else{ /* too recent; grow instead */
223 76193d7c 2003-09-30 devnull of = f->subf;
224 94b38bdb 2017-04-08 gsoares f->subf = realloc(of, (f->nsubf+DSUBF)*sizeof *subf);
225 76193d7c 2003-09-30 devnull if(f->subf == nil){
226 76193d7c 2003-09-30 devnull f->subf = of;
227 76193d7c 2003-09-30 devnull goto Toss;
228 76193d7c 2003-09-30 devnull }
229 76193d7c 2003-09-30 devnull memset(f->subf+f->nsubf, 0, DSUBF*sizeof *subf);
230 76193d7c 2003-09-30 devnull subf = &f->subf[f->nsubf];
231 76193d7c 2003-09-30 devnull f->nsubf += DSUBF;
232 76193d7c 2003-09-30 devnull }
233 76193d7c 2003-09-30 devnull }
234 76193d7c 2003-09-30 devnull subf->age = 0;
235 76193d7c 2003-09-30 devnull subf->cf = nil;
236 76193d7c 2003-09-30 devnull subf->f = cf2subfont(cf, f);
237 76193d7c 2003-09-30 devnull if(subf->f == nil){
238 76193d7c 2003-09-30 devnull if(cf->subfontname == nil)
239 76193d7c 2003-09-30 devnull goto TryPJW;
240 76193d7c 2003-09-30 devnull *subfontname = cf->subfontname;
241 76193d7c 2003-09-30 devnull return -1;
242 76193d7c 2003-09-30 devnull }
243 76193d7c 2003-09-30 devnull
244 76193d7c 2003-09-30 devnull subf->cf = cf;
245 4e206880 2004-04-25 devnull if(subf->f->ascent > f->ascent && f->display){
246 76193d7c 2003-09-30 devnull /* should print something? this is a mistake in the font file */
247 76193d7c 2003-09-30 devnull /* must prevent c->top from going negative when loading cache */
248 76193d7c 2003-09-30 devnull Image *b;
249 76193d7c 2003-09-30 devnull int d, t;
250 76193d7c 2003-09-30 devnull d = subf->f->ascent - f->ascent;
251 76193d7c 2003-09-30 devnull b = subf->f->bits;
252 76193d7c 2003-09-30 devnull draw(b, b->r, b, nil, addpt(b->r.min, Pt(0, d)));
253 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);
254 76193d7c 2003-09-30 devnull for(i=0; i<subf->f->n; i++){
255 76193d7c 2003-09-30 devnull t = subf->f->info[i].top-d;
256 76193d7c 2003-09-30 devnull if(t < 0)
257 76193d7c 2003-09-30 devnull t = 0;
258 76193d7c 2003-09-30 devnull subf->f->info[i].top = t;
259 76193d7c 2003-09-30 devnull t = subf->f->info[i].bottom-d;
260 76193d7c 2003-09-30 devnull if(t < 0)
261 76193d7c 2003-09-30 devnull t = 0;
262 76193d7c 2003-09-30 devnull subf->f->info[i].bottom = t;
263 76193d7c 2003-09-30 devnull }
264 76193d7c 2003-09-30 devnull subf->f->ascent = f->ascent;
265 76193d7c 2003-09-30 devnull }
266 76193d7c 2003-09-30 devnull
267 76193d7c 2003-09-30 devnull Found2:
268 76193d7c 2003-09-30 devnull subf->age = f->age;
269 76193d7c 2003-09-30 devnull
270 d4aef6a0 2005-05-12 devnull /* possible overflow here, but works out okay */
271 76193d7c 2003-09-30 devnull pic += cf->offset;
272 d4aef6a0 2005-05-12 devnull pic -= cf->min;
273 d4aef6a0 2005-05-12 devnull if(pic >= subf->f->n)
274 76193d7c 2003-09-30 devnull goto TryPJW;
275 d4aef6a0 2005-05-12 devnull fi = &subf->f->info[pic];
276 76193d7c 2003-09-30 devnull if(fi->width == 0)
277 76193d7c 2003-09-30 devnull goto TryPJW;
278 76193d7c 2003-09-30 devnull wid = (fi+1)->x - fi->x;
279 76193d7c 2003-09-30 devnull if(f->width < wid || f->width == 0 || f->maxdepth < subf->f->bits->depth){
280 76193d7c 2003-09-30 devnull /*
281 76193d7c 2003-09-30 devnull * Flush, free, reload (easier than reformatting f->b)
282 76193d7c 2003-09-30 devnull */
283 76193d7c 2003-09-30 devnull if(noflush)
284 76193d7c 2003-09-30 devnull return -1;
285 76193d7c 2003-09-30 devnull if(f->width < wid)
286 76193d7c 2003-09-30 devnull f->width = wid;
287 76193d7c 2003-09-30 devnull if(f->maxdepth < subf->f->bits->depth)
288 76193d7c 2003-09-30 devnull f->maxdepth = subf->f->bits->depth;
289 76193d7c 2003-09-30 devnull i = fontresize(f, f->width, f->ncache, f->maxdepth);
290 76193d7c 2003-09-30 devnull if(i <= 0)
291 76193d7c 2003-09-30 devnull return i;
292 76193d7c 2003-09-30 devnull /* c is still valid as didn't reallocate f->cache */
293 76193d7c 2003-09-30 devnull }
294 76193d7c 2003-09-30 devnull c->value = r;
295 76193d7c 2003-09-30 devnull top = fi->top + (f->ascent-subf->f->ascent);
296 76193d7c 2003-09-30 devnull bottom = fi->bottom + (f->ascent-subf->f->ascent);
297 76193d7c 2003-09-30 devnull c->width = fi->width;
298 76193d7c 2003-09-30 devnull c->x = h*f->width;
299 76193d7c 2003-09-30 devnull c->left = fi->left;
300 4e206880 2004-04-25 devnull if(f->display == nil)
301 4e206880 2004-04-25 devnull return 1;
302 76193d7c 2003-09-30 devnull flushimage(f->display, 0); /* flush any pending errors */
303 76193d7c 2003-09-30 devnull b = bufimage(f->display, 37);
304 76193d7c 2003-09-30 devnull if(b == 0)
305 76193d7c 2003-09-30 devnull return 0;
306 76193d7c 2003-09-30 devnull b[0] = 'l';
307 76193d7c 2003-09-30 devnull BPLONG(b+1, f->cacheimage->id);
308 76193d7c 2003-09-30 devnull BPLONG(b+5, subf->f->bits->id);
309 76193d7c 2003-09-30 devnull BPSHORT(b+9, c-f->cache);
310 76193d7c 2003-09-30 devnull BPLONG(b+11, c->x);
311 76193d7c 2003-09-30 devnull BPLONG(b+15, top);
312 76193d7c 2003-09-30 devnull BPLONG(b+19, c->x+((fi+1)->x-fi->x));
313 76193d7c 2003-09-30 devnull BPLONG(b+23, bottom);
314 76193d7c 2003-09-30 devnull BPLONG(b+27, fi->x);
315 76193d7c 2003-09-30 devnull BPLONG(b+31, fi->top);
316 76193d7c 2003-09-30 devnull b[35] = fi->left;
317 76193d7c 2003-09-30 devnull b[36] = fi->width;
318 76193d7c 2003-09-30 devnull return 1;
319 76193d7c 2003-09-30 devnull }
320 76193d7c 2003-09-30 devnull
321 76193d7c 2003-09-30 devnull /* release all subfonts, return number freed */
322 76193d7c 2003-09-30 devnull #if 0
323 76193d7c 2003-09-30 devnull static
324 76193d7c 2003-09-30 devnull int
325 76193d7c 2003-09-30 devnull freeup(Font *f)
326 76193d7c 2003-09-30 devnull {
327 76193d7c 2003-09-30 devnull Cachesubf *s, *es;
328 76193d7c 2003-09-30 devnull int nf;
329 76193d7c 2003-09-30 devnull
330 76193d7c 2003-09-30 devnull if(f->sub[0]->name == nil) /* font from mkfont; don't free */
331 76193d7c 2003-09-30 devnull return 0;
332 76193d7c 2003-09-30 devnull s = f->subf;
333 76193d7c 2003-09-30 devnull es = s+f->nsubf;
334 76193d7c 2003-09-30 devnull nf = 0;
335 76193d7c 2003-09-30 devnull while(s < es){
336 76193d7c 2003-09-30 devnull if(s->age){
337 76193d7c 2003-09-30 devnull freesubfont(s->f);
338 76193d7c 2003-09-30 devnull s->cf = nil;
339 76193d7c 2003-09-30 devnull s->f = nil;
340 76193d7c 2003-09-30 devnull s->age = 0;
341 76193d7c 2003-09-30 devnull nf++;
342 76193d7c 2003-09-30 devnull }
343 76193d7c 2003-09-30 devnull s++;
344 76193d7c 2003-09-30 devnull }
345 76193d7c 2003-09-30 devnull return nf;
346 76193d7c 2003-09-30 devnull }
347 76193d7c 2003-09-30 devnull #endif
348 76193d7c 2003-09-30 devnull
349 76193d7c 2003-09-30 devnull /* return whether resize succeeded && f->cache is unchanged */
350 76193d7c 2003-09-30 devnull static int
351 76193d7c 2003-09-30 devnull fontresize(Font *f, int wid, int ncache, int depth)
352 76193d7c 2003-09-30 devnull {
353 76193d7c 2003-09-30 devnull Cacheinfo *i;
354 76193d7c 2003-09-30 devnull int ret;
355 76193d7c 2003-09-30 devnull Image *new;
356 76193d7c 2003-09-30 devnull uchar *b;
357 76193d7c 2003-09-30 devnull Display *d;
358 76193d7c 2003-09-30 devnull
359 76193d7c 2003-09-30 devnull ret = 0;
360 76193d7c 2003-09-30 devnull if(depth <= 0)
361 76193d7c 2003-09-30 devnull depth = 1;
362 76193d7c 2003-09-30 devnull
363 4e206880 2004-04-25 devnull d = f->display;
364 4e206880 2004-04-25 devnull if(d == nil)
365 4e206880 2004-04-25 devnull goto Nodisplay;
366 4e206880 2004-04-25 devnull
367 76193d7c 2003-09-30 devnull new = allocimage(d, Rect(0, 0, ncache*wid, f->height), CHAN1(CGrey, depth), 0, 0);
368 76193d7c 2003-09-30 devnull if(new == nil){
369 76193d7c 2003-09-30 devnull fprint(2, "font cache resize failed: %r\n");
370 76193d7c 2003-09-30 devnull abort();
371 76193d7c 2003-09-30 devnull goto Return;
372 76193d7c 2003-09-30 devnull }
373 76193d7c 2003-09-30 devnull flushimage(d, 0); /* flush any pending errors */
374 76193d7c 2003-09-30 devnull b = bufimage(d, 1+4+4+1);
375 76193d7c 2003-09-30 devnull if(b == 0){
376 76193d7c 2003-09-30 devnull freeimage(new);
377 76193d7c 2003-09-30 devnull goto Return;
378 76193d7c 2003-09-30 devnull }
379 76193d7c 2003-09-30 devnull b[0] = 'i';
380 76193d7c 2003-09-30 devnull BPLONG(b+1, new->id);
381 76193d7c 2003-09-30 devnull BPLONG(b+5, ncache);
382 76193d7c 2003-09-30 devnull b[9] = f->ascent;
383 76193d7c 2003-09-30 devnull if(flushimage(d, 0) < 0){
384 76193d7c 2003-09-30 devnull fprint(2, "resize: init failed: %r\n");
385 76193d7c 2003-09-30 devnull freeimage(new);
386 76193d7c 2003-09-30 devnull goto Return;
387 76193d7c 2003-09-30 devnull }
388 76193d7c 2003-09-30 devnull freeimage(f->cacheimage);
389 76193d7c 2003-09-30 devnull f->cacheimage = new;
390 4e206880 2004-04-25 devnull Nodisplay:
391 76193d7c 2003-09-30 devnull f->width = wid;
392 76193d7c 2003-09-30 devnull f->maxdepth = depth;
393 76193d7c 2003-09-30 devnull ret = 1;
394 76193d7c 2003-09-30 devnull if(f->ncache != ncache){
395 76193d7c 2003-09-30 devnull i = malloc(ncache*sizeof f->cache[0]);
396 76193d7c 2003-09-30 devnull if(i != nil){
397 76193d7c 2003-09-30 devnull ret = 0;
398 76193d7c 2003-09-30 devnull free(f->cache);
399 76193d7c 2003-09-30 devnull f->ncache = ncache;
400 76193d7c 2003-09-30 devnull f->cache = i;
401 76193d7c 2003-09-30 devnull }
402 76193d7c 2003-09-30 devnull /* else just wipe the cache clean and things will be ok */
403 76193d7c 2003-09-30 devnull }
404 76193d7c 2003-09-30 devnull Return:
405 76193d7c 2003-09-30 devnull memset(f->cache, 0, f->ncache*sizeof f->cache[0]);
406 76193d7c 2003-09-30 devnull return ret;
407 76193d7c 2003-09-30 devnull }