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/libdraw | |
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/libdraw')
-rw-r--r-- | sys/src/libdraw/unloadimage.c | 39 |
1 files changed, 22 insertions, 17 deletions
diff --git a/sys/src/libdraw/unloadimage.c b/sys/src/libdraw/unloadimage.c index ead36b0c8..741c73b6b 100644 --- a/sys/src/libdraw/unloadimage.c +++ b/sys/src/libdraw/unloadimage.c @@ -5,8 +5,8 @@ int unloadimage(Image *i, Rectangle r, uchar *data, int ndata) { - int bpl, n, ntot, dy; - uchar *a; + int bpl, n, chunk, dx, dy; + uchar *a, *start; Display *d; if(!rectinrect(r, i->r)){ @@ -18,36 +18,41 @@ unloadimage(Image *i, Rectangle r, uchar *data, int ndata) werrstr("unloadimage: buffer too small"); return -1; } - + start = data; d = i->display; + chunk = d->bufsize; flushimage(d, 0); /* make sure subsequent flush is for us only */ - ntot = 0; while(r.min.y < r.max.y){ + dx = Dx(r); + dy = chunk/bpl; + if(dy <= 0){ + dy = 1; + dx = ((chunk*dx)/bpl) & ~7; + n = bytesperline(Rect(r.min.x, r.min.y, r.min.x+dx, r.min.y+dy), i->depth); + if(unloadimage(i, Rect(r.min.x+dx, r.min.y, r.max.x, r.min.y+dy), data+n, bpl-n) < 0) + return -1; + } else { + if(dy > Dy(r)) + dy = Dy(r); + n = bpl*dy; + } a = bufimage(d, 1+4+4*4); if(a == 0){ werrstr("unloadimage: %r"); return -1; } - dy = 8000/bpl; - if(dy <= 0){ - werrstr("unloadimage: image too wide"); - return -1; - } - if(dy > Dy(r)) - dy = Dy(r); a[0] = 'r'; BPLONG(a+1, i->id); BPLONG(a+5, r.min.x); BPLONG(a+9, r.min.y); - BPLONG(a+13, r.max.x); + BPLONG(a+13, r.min.x+dx); BPLONG(a+17, r.min.y+dy); if(flushimage(d, 0) < 0) return -1; - n = read(d->fd, data+ntot, ndata-ntot); - if(n < 0) - return n; - ntot += n; + if(read(d->fd, data, n) < 0) + return -1; + data += bpl*dy; r.min.y += dy; } - return ntot; + return data - start; } |