libdraw: make loadimage and readimage handle wide images

This commit is contained in:
glenda 2011-09-03 09:17:46 -04:00
parent b298429804
commit 41a34b227b
2 changed files with 15 additions and 16 deletions

View file

@ -5,7 +5,7 @@
int int
loadimage(Image *i, Rectangle r, uchar *data, int ndata) loadimage(Image *i, Rectangle r, uchar *data, int ndata)
{ {
long dy; long dx, dy;
int n, bpl; int n, bpl;
uchar *a; uchar *a;
int chunk; int chunk;
@ -24,14 +24,18 @@ loadimage(Image *i, Rectangle r, uchar *data, int ndata)
} }
ndata = 0; ndata = 0;
while(r.max.y > r.min.y){ while(r.max.y > r.min.y){
dy = r.max.y - r.min.y; dy = Dy(r);
dx = Dx(r);
if(dy*bpl > chunk) if(dy*bpl > chunk)
dy = chunk/bpl; dy = chunk/bpl;
if(dy <= 0){ if(dy <= 0){
werrstr("loadimage: image too wide for buffer"); dy = 1;
return -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);
n = dy*bpl; 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); a = bufimage(i->display, 21+n);
if(a == nil){ if(a == nil){
werrstr("bufimage failed"); werrstr("bufimage failed");
@ -41,14 +45,12 @@ loadimage(Image *i, Rectangle r, uchar *data, int ndata)
BPLONG(a+1, i->id); BPLONG(a+1, i->id);
BPLONG(a+5, r.min.x); BPLONG(a+5, r.min.x);
BPLONG(a+9, r.min.y); 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); BPLONG(a+17, r.min.y+dy);
memmove(a+21, data, n); memmove(a+21, data, n);
ndata += n; ndata += dy*bpl;
data += n; data += dy*bpl;
r.min.y += dy; r.min.y += dy;
} }
if(flushimage(i->display, 0) < 0)
return -1;
return ndata; return ndata;
} }

View file

@ -72,6 +72,8 @@ readimage(Display *d, int fd, int dolock)
maxy = r.max.y; maxy = r.max.y;
l = bytesperline(r, chantodepth(chan)); l = bytesperline(r, chantodepth(chan));
if(l > chunk)
chunk = l;
if(d){ if(d){
if(dolock) if(dolock)
lockdisplay(d); lockdisplay(d);
@ -85,7 +87,6 @@ readimage(Display *d, int fd, int dolock)
if(i == nil) if(i == nil)
return nil; return nil;
} }
tmp = malloc(chunk); tmp = malloc(chunk);
if(tmp == nil) if(tmp == nil)
goto Err; goto Err;
@ -93,10 +94,6 @@ readimage(Display *d, int fd, int dolock)
dy = maxy - miny; dy = maxy - miny;
if(dy*l > chunk) if(dy*l > chunk)
dy = chunk/l; dy = chunk/l;
if(dy <= 0){
werrstr("readimage: image too wide for buffer");
goto Err;
}
n = dy*l; n = dy*l;
m = readn(fd, tmp, n); m = readn(fd, tmp, n);
if(m != n){ if(m != n){