diff options
author | glenda <glenda@flatbox.9hal> | 2011-09-03 09:17:46 -0400 |
---|---|---|
committer | glenda <glenda@flatbox.9hal> | 2011-09-03 09:17:46 -0400 |
commit | 41a34b227b101e7c91ac51e20ad1c2ddec390122 (patch) | |
tree | 102aea4d2bbf622705340ea8e4479a3910e27617 /sys/src/libdraw | |
parent | b298429804d255c629dfc15f59081f2b05b513a8 (diff) |
libdraw: make loadimage and readimage handle wide images
Diffstat (limited to 'sys/src/libdraw')
-rw-r--r-- | sys/src/libdraw/loadimage.c | 24 | ||||
-rw-r--r-- | sys/src/libdraw/readimage.c | 7 |
2 files changed, 15 insertions, 16 deletions
diff --git a/sys/src/libdraw/loadimage.c b/sys/src/libdraw/loadimage.c index d8d8c40bf..d5d599a2a 100644 --- a/sys/src/libdraw/loadimage.c +++ b/sys/src/libdraw/loadimage.c @@ -5,7 +5,7 @@ int loadimage(Image *i, Rectangle r, uchar *data, int ndata) { - long dy; + long dx, dy; int n, bpl; uchar *a; int chunk; @@ -24,14 +24,18 @@ loadimage(Image *i, Rectangle r, uchar *data, int ndata) } ndata = 0; while(r.max.y > r.min.y){ - dy = r.max.y - r.min.y; + dy = Dy(r); + dx = Dx(r); if(dy*bpl > chunk) dy = chunk/bpl; if(dy <= 0){ - werrstr("loadimage: image too wide for buffer"); - return -1; - } - n = dy*bpl; + 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(loadimage(i, Rect(r.min.x+dx, r.min.y, r.max.x, r.min.y+dy), data+n, bpl-n) < 0) + return -1; + } else + n = dy*bpl; a = bufimage(i->display, 21+n); if(a == nil){ werrstr("bufimage failed"); @@ -41,14 +45,12 @@ loadimage(Image *i, Rectangle r, uchar *data, int ndata) 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); memmove(a+21, data, n); - ndata += n; - data += n; + ndata += dy*bpl; + data += dy*bpl; r.min.y += dy; } - if(flushimage(i->display, 0) < 0) - return -1; return ndata; } diff --git a/sys/src/libdraw/readimage.c b/sys/src/libdraw/readimage.c index 61dbd12a6..3c80b4982 100644 --- a/sys/src/libdraw/readimage.c +++ b/sys/src/libdraw/readimage.c @@ -72,6 +72,8 @@ readimage(Display *d, int fd, int dolock) maxy = r.max.y; l = bytesperline(r, chantodepth(chan)); + if(l > chunk) + chunk = l; if(d){ if(dolock) lockdisplay(d); @@ -85,7 +87,6 @@ readimage(Display *d, int fd, int dolock) if(i == nil) return nil; } - tmp = malloc(chunk); if(tmp == nil) goto Err; @@ -93,10 +94,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){ |