7 loadmemimage(Memimage *i, Rectangle r, uchar *data, int ndata)
9 int y, l, lpart, rpart, mx, m, mr;
13 if(badrect(r) || !rectinrect(r, i->r))
16 memset(&par, 0, sizeof par);
21 l = bytesperline(r, i->depth);
25 q = byteaddr(i, r.min);
27 lpart = (r.min.x & mx) * i->depth;
28 rpart = (r.max.x & mx) * i->depth;
30 /* may need to do bit insertion on edges */
31 if(l == 1){ /* all in one byte */
34 for(y=r.min.y; y<r.max.y; y++){
36 q += i->width*sizeof(ulong);
41 if(lpart==0 && rpart==0){ /* easy case */
42 for(y=r.min.y; y<r.max.y; y++){
44 q += i->width*sizeof(ulong);
49 mr = 0xFF ^ (0xFF >> rpart);
50 if(lpart!=0 && rpart==0){
51 for(y=r.min.y; y<r.max.y; y++){
54 memmove(q+1, data+1, l-1);
55 q += i->width*sizeof(ulong);
60 if(lpart==0 && rpart!=0){
61 for(y=r.min.y; y<r.max.y; y++){
63 memmove(q, data, l-1);
64 q[l-1] ^= (data[l-1]^q[l-1]) & mr;
65 q += i->width*sizeof(ulong);
70 for(y=r.min.y; y<r.max.y; y++){
73 memmove(q+1, data+1, l-2);
74 q[l-1] ^= (data[l-1]^q[l-1]) & mr;
75 q += i->width*sizeof(ulong);