aboutsummaryrefslogtreecommitdiff
path: root/src/libdraw/loadimage.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libdraw/loadimage.c')
-rw-r--r--src/libdraw/loadimage.c54
1 files changed, 54 insertions, 0 deletions
diff --git a/src/libdraw/loadimage.c b/src/libdraw/loadimage.c
new file mode 100644
index 00000000..d8d8c40b
--- /dev/null
+++ b/src/libdraw/loadimage.c
@@ -0,0 +1,54 @@
+#include <u.h>
+#include <libc.h>
+#include <draw.h>
+
+int
+loadimage(Image *i, Rectangle r, uchar *data, int ndata)
+{
+ long dy;
+ int n, bpl;
+ uchar *a;
+ int chunk;
+
+ chunk = i->display->bufsize - 64;
+
+ if(!rectinrect(r, i->r)){
+ werrstr("loadimage: bad rectangle");
+ return -1;
+ }
+ bpl = bytesperline(r, i->depth);
+ n = bpl*Dy(r);
+ if(n > ndata){
+ werrstr("loadimage: insufficient data");
+ return -1;
+ }
+ ndata = 0;
+ while(r.max.y > r.min.y){
+ dy = r.max.y - r.min.y;
+ if(dy*bpl > chunk)
+ dy = chunk/bpl;
+ if(dy <= 0){
+ werrstr("loadimage: image too wide for buffer");
+ return -1;
+ }
+ n = dy*bpl;
+ a = bufimage(i->display, 21+n);
+ if(a == nil){
+ werrstr("bufimage failed");
+ return -1;
+ }
+ a[0] = 'y';
+ 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+17, r.min.y+dy);
+ memmove(a+21, data, n);
+ ndata += n;
+ data += n;
+ r.min.y += dy;
+ }
+ if(flushimage(i->display, 0) < 0)
+ return -1;
+ return ndata;
+}