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