1*37da2899SCharles.Forsyth #include "lib9.h"
2*37da2899SCharles.Forsyth #include "draw.h"
3*37da2899SCharles.Forsyth #include "kernel.h"
4*37da2899SCharles.Forsyth
5*37da2899SCharles.Forsyth int
loadimage(Image * i,Rectangle r,uchar * data,int ndata)6*37da2899SCharles.Forsyth loadimage(Image *i, Rectangle r, uchar *data, int ndata)
7*37da2899SCharles.Forsyth {
8*37da2899SCharles.Forsyth long dy;
9*37da2899SCharles.Forsyth int n, bpl, roff, dstroff, lskip, llen, y;
10*37da2899SCharles.Forsyth uchar *a;
11*37da2899SCharles.Forsyth int chunk;
12*37da2899SCharles.Forsyth Rectangle dstr;
13*37da2899SCharles.Forsyth
14*37da2899SCharles.Forsyth chunk = i->display->bufsize - 64;
15*37da2899SCharles.Forsyth
16*37da2899SCharles.Forsyth bpl = bytesperline(r, i->depth);
17*37da2899SCharles.Forsyth n = bpl*Dy(r);
18*37da2899SCharles.Forsyth if(n > ndata){
19*37da2899SCharles.Forsyth kwerrstr("loadimage: insufficient data");
20*37da2899SCharles.Forsyth return -1;
21*37da2899SCharles.Forsyth }
22*37da2899SCharles.Forsyth
23*37da2899SCharles.Forsyth dstr = r;
24*37da2899SCharles.Forsyth rectclip(&dstr, i->r);
25*37da2899SCharles.Forsyth rectclip(&dstr, i->clipr);
26*37da2899SCharles.Forsyth
27*37da2899SCharles.Forsyth if (!rectinrect(dstr, i->r))
28*37da2899SCharles.Forsyth return 0;
29*37da2899SCharles.Forsyth
30*37da2899SCharles.Forsyth roff = (r.min.x*i->depth)>>3;
31*37da2899SCharles.Forsyth dstroff = dstr.min.x * i->depth >> 3;
32*37da2899SCharles.Forsyth lskip = dstroff - roff;
33*37da2899SCharles.Forsyth llen = (dstr.max.x*i->depth + 7 >> 3) - dstroff;
34*37da2899SCharles.Forsyth data += (dstr.min.y - r.min.y) * bpl + lskip;
35*37da2899SCharles.Forsyth
36*37da2899SCharles.Forsyth ndata = 0;
37*37da2899SCharles.Forsyth while(dstr.max.y > dstr.min.y){
38*37da2899SCharles.Forsyth dy = dstr.max.y - dstr.min.y;
39*37da2899SCharles.Forsyth if(dy*llen > chunk)
40*37da2899SCharles.Forsyth dy = chunk/llen;
41*37da2899SCharles.Forsyth if(dy <= 0){
42*37da2899SCharles.Forsyth kwerrstr("loadimage: image too wide for buffer");
43*37da2899SCharles.Forsyth return -1;
44*37da2899SCharles.Forsyth }
45*37da2899SCharles.Forsyth n = dy*llen;
46*37da2899SCharles.Forsyth a = bufimage(i->display, 21+n);
47*37da2899SCharles.Forsyth if(a == nil){
48*37da2899SCharles.Forsyth kwerrstr("bufimage failed");
49*37da2899SCharles.Forsyth return -1;
50*37da2899SCharles.Forsyth }
51*37da2899SCharles.Forsyth a[0] = 'y';
52*37da2899SCharles.Forsyth BPLONG(a+1, i->id);
53*37da2899SCharles.Forsyth BPLONG(a+5, dstr.min.x);
54*37da2899SCharles.Forsyth BPLONG(a+9, dstr.min.y);
55*37da2899SCharles.Forsyth BPLONG(a+13, dstr.max.x);
56*37da2899SCharles.Forsyth BPLONG(a+17, dstr.min.y+dy);
57*37da2899SCharles.Forsyth a += 21;
58*37da2899SCharles.Forsyth for (y = 0; y < dy; y++) {
59*37da2899SCharles.Forsyth memmove(a, data, llen);
60*37da2899SCharles.Forsyth a += llen;
61*37da2899SCharles.Forsyth ndata += llen;
62*37da2899SCharles.Forsyth data += bpl;
63*37da2899SCharles.Forsyth }
64*37da2899SCharles.Forsyth dstr.min.y += dy;
65*37da2899SCharles.Forsyth }
66*37da2899SCharles.Forsyth if(flushimage(i->display, 0) < 0)
67*37da2899SCharles.Forsyth return -1;
68*37da2899SCharles.Forsyth return ndata;
69*37da2899SCharles.Forsyth }
70*37da2899SCharles.Forsyth
71