]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libmemdraw/load.c
libaml: fix gc bug, need to amltake()/amldrop() temporary buffer
[plan9front.git] / sys / src / libmemdraw / load.c
1 #include <u.h>
2 #include <libc.h>
3 #include <draw.h>
4 #include <memdraw.h>
5
6 int
7 loadmemimage(Memimage *i, Rectangle r, uchar *data, int ndata)
8 {
9         int y, l, lpart, rpart, mx, m, mr;
10         Memdrawparam par;
11         uchar *q;
12
13         if(badrect(r) || !rectinrect(r, i->r))
14                 return -1;
15
16         memset(&par, 0, sizeof par);
17         par.dst = i;
18         par.r = r;
19         hwdraw(&par);
20
21         l = bytesperline(r, i->depth);
22         if(ndata < l*Dy(r))
23                 return -1;
24         ndata = l*Dy(r);
25         q = byteaddr(i, r.min);
26         mx = 7/i->depth;
27         lpart = (r.min.x & mx) * i->depth;
28         rpart = (r.max.x & mx) * i->depth;
29         m = 0xFF >> lpart;
30         /* may need to do bit insertion on edges */
31         if(l == 1){     /* all in one byte */
32                 if(rpart)
33                         m ^= 0xFF >> rpart;
34                 for(y=r.min.y; y<r.max.y; y++){
35                         *q ^= (*data^*q) & m;
36                         q += i->width*sizeof(ulong);
37                         data++;
38                 }
39                 return ndata;
40         }
41         if(lpart==0 && rpart==0){       /* easy case */
42                 for(y=r.min.y; y<r.max.y; y++){
43                         memmove(q, data, l);
44                         q += i->width*sizeof(ulong);
45                         data += l;
46                 }
47                 return ndata;
48         }
49         mr = 0xFF ^ (0xFF >> rpart);
50         if(lpart!=0 && rpart==0){
51                 for(y=r.min.y; y<r.max.y; y++){
52                         *q ^= (*data^*q) & m;
53                         if(l > 1)
54                                 memmove(q+1, data+1, l-1);
55                         q += i->width*sizeof(ulong);
56                         data += l;
57                 }
58                 return ndata;
59         }
60         if(lpart==0 && rpart!=0){
61                 for(y=r.min.y; y<r.max.y; y++){
62                         if(l > 1)
63                                 memmove(q, data, l-1);
64                         q[l-1] ^= (data[l-1]^q[l-1]) & mr;
65                         q += i->width*sizeof(ulong);
66                         data += l;
67                 }
68                 return ndata;
69         }
70         for(y=r.min.y; y<r.max.y; y++){
71                 *q ^= (*data^*q) & m;
72                 if(l > 2)
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);
76                 data += l;
77         }
78         return ndata;
79 }