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