Blame


1 324891a5 2006-06-25 devnull #include <u.h>
2 324891a5 2006-06-25 devnull #include <libc.h>
3 324891a5 2006-06-25 devnull #include <draw.h>
4 324891a5 2006-06-25 devnull #include <memdraw.h>
5 324891a5 2006-06-25 devnull
6 324891a5 2006-06-25 devnull int
7 324891a5 2006-06-25 devnull _cloadmemimage(Memimage *i, Rectangle r, uchar *data, int ndata)
8 324891a5 2006-06-25 devnull {
9 324891a5 2006-06-25 devnull int y, bpl, c, cnt, offs;
10 324891a5 2006-06-25 devnull uchar mem[NMEM], *memp, *omemp, *emem, *linep, *elinep, *u, *eu;
11 324891a5 2006-06-25 devnull
12 324891a5 2006-06-25 devnull if(!rectinrect(r, i->r))
13 324891a5 2006-06-25 devnull return -1;
14 324891a5 2006-06-25 devnull bpl = bytesperline(r, i->depth);
15 324891a5 2006-06-25 devnull u = data;
16 324891a5 2006-06-25 devnull eu = data+ndata;
17 324891a5 2006-06-25 devnull memp = mem;
18 324891a5 2006-06-25 devnull emem = mem+NMEM;
19 324891a5 2006-06-25 devnull y = r.min.y;
20 324891a5 2006-06-25 devnull linep = byteaddr(i, Pt(r.min.x, y));
21 324891a5 2006-06-25 devnull elinep = linep+bpl;
22 324891a5 2006-06-25 devnull for(;;){
23 324891a5 2006-06-25 devnull if(linep == elinep){
24 324891a5 2006-06-25 devnull if(++y == r.max.y)
25 324891a5 2006-06-25 devnull break;
26 324891a5 2006-06-25 devnull linep = byteaddr(i, Pt(r.min.x, y));
27 324891a5 2006-06-25 devnull elinep = linep+bpl;
28 324891a5 2006-06-25 devnull }
29 324891a5 2006-06-25 devnull if(u == eu){ /* buffer too small */
30 324891a5 2006-06-25 devnull return -1;
31 324891a5 2006-06-25 devnull }
32 324891a5 2006-06-25 devnull c = *u++;
33 324891a5 2006-06-25 devnull if(c >= 128){
34 324891a5 2006-06-25 devnull for(cnt=c-128+1; cnt!=0 ;--cnt){
35 324891a5 2006-06-25 devnull if(u == eu){ /* buffer too small */
36 324891a5 2006-06-25 devnull return -1;
37 324891a5 2006-06-25 devnull }
38 324891a5 2006-06-25 devnull if(linep == elinep){ /* phase error */
39 324891a5 2006-06-25 devnull return -1;
40 324891a5 2006-06-25 devnull }
41 324891a5 2006-06-25 devnull *linep++ = *u;
42 324891a5 2006-06-25 devnull *memp++ = *u++;
43 324891a5 2006-06-25 devnull if(memp == emem)
44 324891a5 2006-06-25 devnull memp = mem;
45 324891a5 2006-06-25 devnull }
46 324891a5 2006-06-25 devnull }
47 324891a5 2006-06-25 devnull else{
48 324891a5 2006-06-25 devnull if(u == eu) /* short buffer */
49 324891a5 2006-06-25 devnull return -1;
50 324891a5 2006-06-25 devnull offs = *u++ + ((c&3)<<8)+1;
51 324891a5 2006-06-25 devnull if(memp-mem < offs)
52 324891a5 2006-06-25 devnull omemp = memp+(NMEM-offs);
53 324891a5 2006-06-25 devnull else
54 324891a5 2006-06-25 devnull omemp = memp-offs;
55 324891a5 2006-06-25 devnull for(cnt=(c>>2)+NMATCH; cnt!=0; --cnt){
56 324891a5 2006-06-25 devnull if(linep == elinep) /* phase error */
57 324891a5 2006-06-25 devnull return -1;
58 324891a5 2006-06-25 devnull *linep++ = *omemp;
59 324891a5 2006-06-25 devnull *memp++ = *omemp++;
60 324891a5 2006-06-25 devnull if(omemp == emem)
61 324891a5 2006-06-25 devnull omemp = mem;
62 324891a5 2006-06-25 devnull if(memp == emem)
63 324891a5 2006-06-25 devnull memp = mem;
64 324891a5 2006-06-25 devnull }
65 324891a5 2006-06-25 devnull }
66 324891a5 2006-06-25 devnull }
67 324891a5 2006-06-25 devnull return u-data;
68 324891a5 2006-06-25 devnull }