summaryrefslogtreecommitdiff
path: root/sys/src/libdraw
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@centraldogma>2011-09-04 04:38:08 +0200
committercinap_lenrek <cinap_lenrek@centraldogma>2011-09-04 04:38:08 +0200
commitf6e73a6a22db00925f2f447815287bf2a086054b (patch)
tree688962a8fa27cb6d530e0c10524063faeab736d5 /sys/src/libdraw
parent4749fc5ca13fd0dd568f5dbccc66c2fa1acd69dd (diff)
libdraw: reduce memory for writeimage/writememimage
Diffstat (limited to 'sys/src/libdraw')
-rw-r--r--sys/src/libdraw/writeimage.c33
1 files changed, 22 insertions, 11 deletions
diff --git a/sys/src/libdraw/writeimage.c b/sys/src/libdraw/writeimage.c
index 452706501..a71fbc90f 100644
--- a/sys/src/libdraw/writeimage.c
+++ b/sys/src/libdraw/writeimage.c
@@ -39,6 +39,28 @@ writeimage(int fd, Image *i, int dolock)
chunk = i->display->bufsize - 32; /* a little room for header */
r = i->r;
bpl = bytesperline(r, i->depth);
+ 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)
+ return -1;
+ data = malloc(bpl);
+ for(miny = r.min.y; miny != r.max.y; miny++){
+ if(dolock)
+ lockdisplay(i->display);
+ nb = unloadimage(i, Rect(r.min.x, miny, r.max.x, miny+1), data, bpl);
+ if(dolock)
+ unlockdisplay(i->display);
+ if(nb != bpl)
+ goto ErrOut0;
+ if(write(fd, data, nb) != nb)
+ goto ErrOut0;
+ }
+ free(data);
+ return 0;
+ }
+
n = Dy(r)*bpl;
data = malloc(n);
if(data == 0){
@@ -61,17 +83,6 @@ writeimage(int fd, Image *i, int dolock)
if(nb != dy*bpl)
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));