diff options
Diffstat (limited to 'src/libdraw')
-rw-r--r-- | src/libdraw/creadimage.c | 56 | ||||
-rw-r--r-- | src/libdraw/font.c | 13 | ||||
-rw-r--r-- | src/libdraw/getsubfont.c | 6 | ||||
-rw-r--r-- | src/libdraw/readimage.c | 40 | ||||
-rw-r--r-- | src/libdraw/readsubfont.c | 4 | ||||
-rw-r--r-- | src/libdraw/stringwidth.c | 2 | ||||
-rw-r--r-- | src/libdraw/subfontcache.c | 5 |
7 files changed, 78 insertions, 48 deletions
diff --git a/src/libdraw/creadimage.c b/src/libdraw/creadimage.c index 99c42752..16dcd1e8 100644 --- a/src/libdraw/creadimage.c +++ b/src/libdraw/creadimage.c @@ -54,14 +54,20 @@ creadimage(Display *d, int fd, int dolock) return nil; } - if(dolock) - lockdisplay(d); - i = allocimage(d, r, chan, 0, 0); - if(dolock) - unlockdisplay(d); - if(i == nil) - return nil; - ncblock = _compblocksize(r, i->depth); + if(d){ + if(dolock) + lockdisplay(d); + i = allocimage(d, r, chan, 0, 0); + if(dolock) + unlockdisplay(d); + if(i == nil) + return nil; + }else{ + i = mallocz(sizeof(Image), 1); + if(i == nil) + return nil; + } + ncblock = _compblocksize(r, chantodepth(chan)); buf = malloc(ncblock); if(buf == nil) goto Errout; @@ -90,22 +96,24 @@ creadimage(Display *d, int fd, int dolock) } if(readn(fd, buf, nb)!=nb) goto Errout; - if(dolock) - lockdisplay(d); - a = bufimage(i->display, 21+nb); - if(a == nil) - goto Erroutlock; - a[0] = 'Y'; - BPLONG(a+1, i->id); - BPLONG(a+5, r.min.x); - BPLONG(a+9, miny); - BPLONG(a+13, r.max.x); - BPLONG(a+17, maxy); - if(!new) /* old image: flip the data bits */ - _twiddlecompressed(buf, nb); - memmove(a+21, buf, nb); - if(dolock) - unlockdisplay(d); + if(d){ + if(dolock) + lockdisplay(d); + a = bufimage(i->display, 21+nb); + if(a == nil) + goto Erroutlock; + a[0] = 'Y'; + BPLONG(a+1, i->id); + BPLONG(a+5, r.min.x); + BPLONG(a+9, miny); + BPLONG(a+13, r.max.x); + BPLONG(a+17, maxy); + if(!new) /* old image: flip the data bits */ + _twiddlecompressed(buf, nb); + memmove(a+21, buf, nb); + if(dolock) + unlockdisplay(d); + } miny = maxy; } free(buf); diff --git a/src/libdraw/font.c b/src/libdraw/font.c index 9feffa42..d7a93545 100644 --- a/src/libdraw/font.c +++ b/src/libdraw/font.c @@ -161,7 +161,8 @@ cf2subfont(Cachefont *cf, Font *f) if(f->display){ if(f->display->screenimage) depth = f->display->screenimage->depth; - } + }else + depth = 8; name = subfontname(cf->name, f->name, depth); if(name == nil) return nil; @@ -244,7 +245,7 @@ loadchar(Font *f, Rune r, Cacheinfo *c, int h, int noflush, char **subfontname) } subf->cf = cf; - if(subf->f->ascent > f->ascent){ + if(subf->f->ascent > f->ascent && f->display){ /* should print something? this is a mistake in the font file */ /* must prevent c->top from going negative when loading cache */ Image *b; @@ -297,6 +298,8 @@ loadchar(Font *f, Rune r, Cacheinfo *c, int h, int noflush, char **subfontname) c->width = fi->width; c->x = h*f->width; c->left = fi->left; + if(f->display == nil) + return 1; flushimage(f->display, 0); /* flush any pending errors */ b = bufimage(f->display, 37); if(b == 0) @@ -355,10 +358,13 @@ fontresize(Font *f, int wid, int ncache, int depth) Display *d; ret = 0; - d = f->display; if(depth <= 0) depth = 1; + d = f->display; + if(d == nil) + goto Nodisplay; + new = allocimage(d, Rect(0, 0, ncache*wid, f->height), CHAN1(CGrey, depth), 0, 0); if(new == nil){ fprint(2, "font cache resize failed: %r\n"); @@ -382,6 +388,7 @@ fontresize(Font *f, int wid, int ncache, int depth) } freeimage(f->cacheimage); f->cacheimage = new; + Nodisplay: f->width = wid; f->maxdepth = depth; ret = 1; diff --git a/src/libdraw/getsubfont.c b/src/libdraw/getsubfont.c index b7a8e44a..2cbec812 100644 --- a/src/libdraw/getsubfont.c +++ b/src/libdraw/getsubfont.c @@ -24,10 +24,10 @@ _getsubfont(Display *d, char *name) * _getsubfont is called only from string.c and stringwidth.c, * which are known to be safe to have this done. */ - if(d->locking == 0) + if(d && d->locking == 0) unlockdisplay(d); - f = readsubfont(d, name, fd, d->locking==0); - if(d->locking == 0) + f = readsubfont(d, name, fd, d && d->locking==0); + if(d && d->locking == 0) lockdisplay(d); if(f == 0) fprint(2, "getsubfont: can't read %s: %r\n", name); diff --git a/src/libdraw/readimage.c b/src/libdraw/readimage.c index 1d2717b0..8135c45d 100644 --- a/src/libdraw/readimage.c +++ b/src/libdraw/readimage.c @@ -23,7 +23,10 @@ readimage(Display *d, int fd, int dolock) return creadimage(d, fd, dolock); if(readn(fd, hdr+11, 5*12-11) != 5*12-11) return nil; - chunk = d->bufsize - 32; /* a little room for header */ + if(d) + chunk = d->bufsize - 32; /* a little room for header */ + else + chunk = 8192; /* * distinguish new channel descriptor from old ldepth. @@ -69,13 +72,20 @@ readimage(Display *d, int fd, int dolock) maxy = r.max.y; l = bytesperline(r, chantodepth(chan)); - if(dolock) - lockdisplay(d); - i = allocimage(d, r, chan, 0, -1); - if(dolock) - unlockdisplay(d); - if(i == nil) - return nil; + if(d){ + if(dolock) + lockdisplay(d); + i = allocimage(d, r, chan, 0, -1); + if(dolock) + unlockdisplay(d); + if(i == nil) + return nil; + }else{ + i = mallocz(sizeof(Image), 1); + if(i == nil) + return nil; + } + tmp = malloc(chunk); if(tmp == nil) goto Err; @@ -105,12 +115,14 @@ readimage(Display *d, int fd, int dolock) for(j=0; j<chunk; j++) tmp[j] ^= 0xFF; - if(dolock) - lockdisplay(d); - if(loadimage(i, Rect(r.min.x, miny, r.max.x, miny+dy), tmp, chunk) <= 0) - goto Err1; - if(dolock) - unlockdisplay(d); + if(d){ + if(dolock) + lockdisplay(d); + if(loadimage(i, Rect(r.min.x, miny, r.max.x, miny+dy), tmp, chunk) <= 0) + goto Err1; + if(dolock) + unlockdisplay(d); + } miny += dy; } free(tmp); diff --git a/src/libdraw/readsubfont.c b/src/libdraw/readsubfont.c index 0e587b48..05962640 100644 --- a/src/libdraw/readsubfont.c +++ b/src/libdraw/readsubfont.c @@ -27,10 +27,12 @@ readsubfonti(Display*d, char *name, int fd, Image *ai, int dolock) n = atoi(hdr); p = malloc(6*(n+1)); if(p == nil) - return nil; + goto Err; if(read(fd, p, 6*(n+1)) != 6*(n+1)){ werrstr("rdsubfonfile: fontchar read error: %r"); Err: + if(ai == nil) + freeimage(i); free(p); return nil; } diff --git a/src/libdraw/stringwidth.c b/src/libdraw/stringwidth.c index f0d13721..8d8c6d08 100644 --- a/src/libdraw/stringwidth.c +++ b/src/libdraw/stringwidth.c @@ -25,7 +25,7 @@ _stringnwidth(Font *f, char *s, Rune *r, int len) }else rptr = &r; twid = 0; - while(len && (*s || *r)){ + while(len>0 && (*s || *r)){ max = Max; if(len < max) max = len; diff --git a/src/libdraw/subfontcache.c b/src/libdraw/subfontcache.c index eb0bdba8..2a7f489b 100644 --- a/src/libdraw/subfontcache.c +++ b/src/libdraw/subfontcache.c @@ -12,9 +12,10 @@ Subfont *lastsubfont; Subfont* lookupsubfont(Display *d, char *name) { - if(strcmp(name, "*default*") == 0) + if(d && strcmp(name, "*default*") == 0) return d->defaultsubfont; - if(lastname && strcmp(name, lastname)==0 && d==lastsubfont->bits->display){ + if(lastname && strcmp(name, lastname)==0) + if(d==lastsubfont->bits->display){ lastsubfont->ref++; return lastsubfont; } |