tmake it possible to access fonts without a display. - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 4e206880423db866dd1db0622a9b4d5b0881fee1
 (DIR) parent a2c2caaafe37e119078bc88f6ebee6d338cbff46
 (HTM) Author: rsc <devnull@localhost>
       Date:   Sun, 25 Apr 2004 20:26:27 +0000
       
       make it possible to access fonts without a display.
       
       Diffstat:
         M src/libdraw/creadimage.c            |      56 ++++++++++++++++++-------------
         M src/libdraw/font.c                  |      13 ++++++++++---
         M src/libdraw/getsubfont.c            |       6 +++---
         M src/libdraw/readimage.c             |      40 ++++++++++++++++++++-----------
         M src/libdraw/readsubfont.c           |       4 +++-
         M src/libdraw/stringwidth.c           |       2 +-
         M src/libdraw/subfontcache.c          |       5 +++--
       
       7 files changed, 78 insertions(+), 48 deletions(-)
       ---
 (DIR) diff --git a/src/libdraw/creadimage.c b/src/libdraw/creadimage.c
       t@@ -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;
       t@@ -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);
 (DIR) diff --git a/src/libdraw/font.c b/src/libdraw/font.c
       t@@ -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;
       t@@ -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;
       t@@ -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)
       t@@ -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");
       t@@ -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;
 (DIR) diff --git a/src/libdraw/getsubfont.c b/src/libdraw/getsubfont.c
       t@@ -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);
 (DIR) diff --git a/src/libdraw/readimage.c b/src/libdraw/readimage.c
       t@@ -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.
       t@@ -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;
       t@@ -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);
 (DIR) diff --git a/src/libdraw/readsubfont.c b/src/libdraw/readsubfont.c
       t@@ -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;
                }
 (DIR) diff --git a/src/libdraw/stringwidth.c b/src/libdraw/stringwidth.c
       t@@ -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;
 (DIR) diff --git a/src/libdraw/subfontcache.c b/src/libdraw/subfontcache.c
       t@@ -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;
                }