libdraw: make loadimage and readimage handle wide images
This commit is contained in:
parent
b298429804
commit
41a34b227b
2 changed files with 15 additions and 16 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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){
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue