Blame


1 ed7c8e8d 2003-09-30 devnull #include <u.h>
2 ed7c8e8d 2003-09-30 devnull #include <libc.h>
3 ed7c8e8d 2003-09-30 devnull #include <draw.h>
4 ed7c8e8d 2003-09-30 devnull
5 ed7c8e8d 2003-09-30 devnull int
6 ed7c8e8d 2003-09-30 devnull loadimage(Image *i, Rectangle r, uchar *data, int ndata)
7 ed7c8e8d 2003-09-30 devnull {
8 ed7c8e8d 2003-09-30 devnull long dy;
9 ed7c8e8d 2003-09-30 devnull int n, bpl;
10 ed7c8e8d 2003-09-30 devnull uchar *a;
11 ed7c8e8d 2003-09-30 devnull int chunk;
12 ed7c8e8d 2003-09-30 devnull
13 ed7c8e8d 2003-09-30 devnull chunk = i->display->bufsize - 64;
14 ed7c8e8d 2003-09-30 devnull
15 ed7c8e8d 2003-09-30 devnull if(!rectinrect(r, i->r)){
16 ed7c8e8d 2003-09-30 devnull werrstr("loadimage: bad rectangle");
17 ed7c8e8d 2003-09-30 devnull return -1;
18 ed7c8e8d 2003-09-30 devnull }
19 ed7c8e8d 2003-09-30 devnull bpl = bytesperline(r, i->depth);
20 ed7c8e8d 2003-09-30 devnull n = bpl*Dy(r);
21 ed7c8e8d 2003-09-30 devnull if(n > ndata){
22 ed7c8e8d 2003-09-30 devnull werrstr("loadimage: insufficient data");
23 ed7c8e8d 2003-09-30 devnull return -1;
24 ed7c8e8d 2003-09-30 devnull }
25 ed7c8e8d 2003-09-30 devnull ndata = 0;
26 ed7c8e8d 2003-09-30 devnull while(r.max.y > r.min.y){
27 ed7c8e8d 2003-09-30 devnull dy = r.max.y - r.min.y;
28 ed7c8e8d 2003-09-30 devnull if(dy*bpl > chunk)
29 ed7c8e8d 2003-09-30 devnull dy = chunk/bpl;
30 ed7c8e8d 2003-09-30 devnull if(dy <= 0){
31 ed7c8e8d 2003-09-30 devnull werrstr("loadimage: image too wide for buffer");
32 ed7c8e8d 2003-09-30 devnull return -1;
33 ed7c8e8d 2003-09-30 devnull }
34 ed7c8e8d 2003-09-30 devnull n = dy*bpl;
35 ed7c8e8d 2003-09-30 devnull a = bufimage(i->display, 21+n);
36 ed7c8e8d 2003-09-30 devnull if(a == nil){
37 ed7c8e8d 2003-09-30 devnull werrstr("bufimage failed");
38 ed7c8e8d 2003-09-30 devnull return -1;
39 ed7c8e8d 2003-09-30 devnull }
40 ed7c8e8d 2003-09-30 devnull a[0] = 'y';
41 ed7c8e8d 2003-09-30 devnull BPLONG(a+1, i->id);
42 ed7c8e8d 2003-09-30 devnull BPLONG(a+5, r.min.x);
43 ed7c8e8d 2003-09-30 devnull BPLONG(a+9, r.min.y);
44 ed7c8e8d 2003-09-30 devnull BPLONG(a+13, r.max.x);
45 ed7c8e8d 2003-09-30 devnull BPLONG(a+17, r.min.y+dy);
46 ed7c8e8d 2003-09-30 devnull memmove(a+21, data, n);
47 ed7c8e8d 2003-09-30 devnull ndata += n;
48 ed7c8e8d 2003-09-30 devnull data += n;
49 ed7c8e8d 2003-09-30 devnull r.min.y += dy;
50 ed7c8e8d 2003-09-30 devnull }
51 ed7c8e8d 2003-09-30 devnull if(flushimage(i->display, 0) < 0)
52 ed7c8e8d 2003-09-30 devnull return -1;
53 ed7c8e8d 2003-09-30 devnull return ndata;
54 ed7c8e8d 2003-09-30 devnull }