1 #include "lib9.h"
2 #include "draw.h"
3 #include "memdraw.h"
4
5 int
loadmemimage(Memimage * i,Rectangle r,uchar * data,int ndata)6 loadmemimage(Memimage *i, Rectangle r, uchar *data, int ndata)
7 {
8 int y, l, lpart, rpart, mx, m, mr;
9 uchar *q;
10
11 if(!rectinrect(r, i->r))
12 return -1;
13 l = bytesperline(r, i->depth);
14 if(ndata < l*Dy(r))
15 return -1;
16 ndata = l*Dy(r);
17 q = byteaddr(i, r.min);
18 mx = 7/i->depth;
19 lpart = (r.min.x & mx) * i->depth;
20 rpart = (r.max.x & mx) * i->depth;
21 m = 0xFF >> lpart;
22 /* may need to do bit insertion on edges */
23 if(l == 1){ /* all in one byte */
24 if(rpart)
25 m ^= 0xFF >> rpart;
26 for(y=r.min.y; y<r.max.y; y++){
27 *q ^= (*data^*q) & m;
28 q += i->width*sizeof(ulong);
29 data++;
30 }
31 return ndata;
32 }
33 if(lpart==0 && rpart==0){ /* easy case */
34 for(y=r.min.y; y<r.max.y; y++){
35 memmove(q, data, l);
36 q += i->width*sizeof(ulong);
37 data += l;
38 }
39 return ndata;
40 }
41 mr = 0xFF ^ (0xFF >> rpart);
42 if(lpart!=0 && rpart==0){
43 for(y=r.min.y; y<r.max.y; y++){
44 *q ^= (*data^*q) & m;
45 if(l > 1)
46 memmove(q+1, data+1, l-1);
47 q += i->width*sizeof(ulong);
48 data += l;
49 }
50 return ndata;
51 }
52 if(lpart==0 && rpart!=0){
53 for(y=r.min.y; y<r.max.y; y++){
54 if(l > 1)
55 memmove(q, data, l-1);
56 q[l-1] ^= (data[l-1]^q[l-1]) & mr;
57 q += i->width*sizeof(ulong);
58 data += l;
59 }
60 return ndata;
61 }
62 for(y=r.min.y; y<r.max.y; y++){
63 *q ^= (*data^*q) & m;
64 if(l > 2)
65 memmove(q+1, data+1, l-2);
66 q[l-1] ^= (data[l-1]^q[l-1]) & mr;
67 q += i->width*sizeof(ulong);
68 data += l;
69 }
70 return ndata;
71 }
72