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;
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);
if(i == nil)
return nil;
}
-
tmp = malloc(chunk);
if(tmp == nil)
goto Err;
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){
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)
miny += dy;
}
free(tmp);
+ Done:
+ setmalloctag(i, getcallerpc(&d));
return i;
}