]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/libdraw/readimage.c
sed: add -u flag that flushes output buffers before reading in further input
[plan9front.git] / sys / src / libdraw / readimage.c
index 61dbd12a6076ec157110ffd0eb99983622adc246..66fac96560224616414b6125a6c3a019ba1898fd 100644 (file)
@@ -19,11 +19,15 @@ readimage(Display *d, int fd, int dolock)
 
        if(readn(fd, hdr, 11) != 11)
                return nil;
-       if(memcmp(hdr, "compressed\n", 11) == 0)
-               return creadimage(d, fd, dolock);
+       if(memcmp(hdr, "compressed\n", 11) == 0){
+               if(i = creadimage(d, fd, dolock))
+                       goto Done;
+               return nil;
+       }
+               
        if(readn(fd, hdr+11, 5*12-11) != 5*12-11)
                return nil;
-       if(d)
+       if(d != nil)
                chunk = d->bufsize - 32;        /* a little room for header */
        else
                chunk = 8192;
@@ -72,7 +76,9 @@ readimage(Display *d, int fd, int dolock)
        maxy = r.max.y;
 
        l = bytesperline(r, chantodepth(chan));
-       if(d){
+       if(l > chunk)
+               chunk = l;
+       if(d != nil){
                if(dolock)
                        lockdisplay(d);
                i = allocimage(d, r, chan, 0, -1);
@@ -85,7 +91,6 @@ readimage(Display *d, int fd, int dolock)
                if(i == nil)
                        return nil;
        }
-
        tmp = malloc(chunk);
        if(tmp == nil)
                goto Err;
@@ -93,10 +98,6 @@ readimage(Display *d, int fd, int dolock)
                dy = maxy - miny;
                if(dy*l > chunk)
                        dy = chunk/l;
-               if(dy <= 0){
-                       werrstr("readimage: image too wide for buffer");
-                       goto Err;
-               }
                n = dy*l;
                m = readn(fd, tmp, n);
                if(m != n){
@@ -115,7 +116,7 @@ readimage(Display *d, int fd, int dolock)
                        for(j=0; j<chunk; j++)
                                tmp[j] ^= 0xFF;
 
-               if(d){
+               if(d != nil){
                        if(dolock)
                                lockdisplay(d);
                        if(loadimage(i, Rect(r.min.x, miny, r.max.x, miny+dy), tmp, chunk) <= 0)
@@ -126,5 +127,7 @@ readimage(Display *d, int fd, int dolock)
                miny += dy;
        }
        free(tmp);
+   Done:
+       setmalloctag(i, getcallerpc(&d));
        return i;
 }