diff options
author | cinap_lenrek <cinap_lenrek@centraldogma> | 2011-09-04 23:51:14 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@centraldogma> | 2011-09-04 23:51:14 +0200 |
commit | b5bbc62dda13b59487769fab7d715d0b8e580115 (patch) | |
tree | b5daae38b7a27127f2ca73d8d9a1c3572bf6965d /sys/src/libmemdraw | |
parent | 0bc540a495210f4b140de4010c8a13d54e1ebf0b (diff) |
libdraw: fix unloadimage() for wide images, libmemdraw: work arround width limit by outputting uncompressed image in writememimage() if compressed blocksize exceeds chunk limit
Diffstat (limited to 'sys/src/libmemdraw')
-rw-r--r-- | sys/src/libmemdraw/read.c | 4 | ||||
-rw-r--r-- | sys/src/libmemdraw/write.c | 39 |
2 files changed, 29 insertions, 14 deletions
diff --git a/sys/src/libmemdraw/read.c b/sys/src/libmemdraw/read.c index 12be6530b..125568ca4 100644 --- a/sys/src/libmemdraw/read.c +++ b/sys/src/libmemdraw/read.c @@ -85,10 +85,6 @@ readmemimage(int fd) dy = maxy - miny; if(dy*l > chunk) dy = chunk/l; - if(dy <= 0){ - werrstr("readmemimage: image too wide for buffer"); - goto Err; - } n = dy*l; m = readn(fd, tmp, n); if(m != n){ diff --git a/sys/src/libmemdraw/write.c b/sys/src/libmemdraw/write.c index a8816ed04..cde12dfbc 100644 --- a/sys/src/libmemdraw/write.c +++ b/sys/src/libmemdraw/write.c @@ -43,26 +43,45 @@ writememimage(int fd, Memimage *i) bpl = bytesperline(r, i->depth); n = Dy(r)*bpl; data = malloc(n); - ncblock = _compblocksize(r, i->depth); - outbuf = malloc(ncblock); - hash = malloc(NHASH*sizeof(Hlist)); - chain = malloc(NMEM*sizeof(Hlist)); - if(data == 0 || outbuf == 0 || hash == 0 || chain == 0){ - ErrOut: + if(data == 0){ + ErrOut0: free(data); - free(outbuf); - free(hash); - free(chain); return -1; } for(miny = r.min.y; miny != r.max.y; miny += dy){ dy = r.max.y-miny; if(dy*bpl > CHUNK) dy = CHUNK/bpl; + if(dy <= 0) + dy = 1; nb = unloadmemimage(i, Rect(r.min.x, miny, r.max.x, miny+dy), data+(miny-r.min.y)*bpl, dy*bpl); if(nb != dy*bpl) - goto ErrOut; + goto ErrOut0; + } + + ncblock = _compblocksize(r, i->depth); + + if(ncblock > CHUNK){ + sprint(hdr, "%11s %11d %11d %11d %11d ", + chantostr(cbuf, i->chan), r.min.x, r.min.y, r.max.x, r.max.y); + if(write(fd, hdr, 5*12) != 5*12) + goto ErrOut0; + if(write(fd, data, n) != n) + goto ErrOut0; + free(data); + return 0; + } + + outbuf = malloc(ncblock); + hash = malloc(NHASH*sizeof(Hlist)); + chain = malloc(NMEM*sizeof(Hlist)); + if(outbuf == 0 || hash == 0 || chain == 0){ + ErrOut: + free(outbuf); + free(hash); + free(chain); + goto ErrOut0; } sprint(hdr, "compressed\n%11s %11d %11d %11d %11d ", chantostr(cbuf, i->chan), r.min.x, r.min.y, r.max.x, r.max.y); |