Blame


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>
5 76193d7c 2003-09-30 devnull
6 76193d7c 2003-09-30 devnull int
7 76193d7c 2003-09-30 devnull _cloadmemimage(Memimage *i, Rectangle r, uchar *data, int ndata)
8 76193d7c 2003-09-30 devnull {
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;
11 76193d7c 2003-09-30 devnull
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;
22 76193d7c 2003-09-30 devnull for(;;){
23 76193d7c 2003-09-30 devnull if(linep == elinep){
24 76193d7c 2003-09-30 devnull if(++y == r.max.y)
25 76193d7c 2003-09-30 devnull break;
26 76193d7c 2003-09-30 devnull linep = byteaddr(i, Pt(r.min.x, y));
27 76193d7c 2003-09-30 devnull elinep = linep+bpl;
28 76193d7c 2003-09-30 devnull }
29 76193d7c 2003-09-30 devnull if(u == eu){ /* buffer too small */
30 76193d7c 2003-09-30 devnull return -1;
31 76193d7c 2003-09-30 devnull }
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;
37 76193d7c 2003-09-30 devnull }
38 76193d7c 2003-09-30 devnull if(linep == elinep){ /* phase error */
39 76193d7c 2003-09-30 devnull return -1;
40 76193d7c 2003-09-30 devnull }
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;
45 76193d7c 2003-09-30 devnull }
46 76193d7c 2003-09-30 devnull }
47 76193d7c 2003-09-30 devnull else{
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);
53 76193d7c 2003-09-30 devnull else
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;
64 76193d7c 2003-09-30 devnull }
65 76193d7c 2003-09-30 devnull }
66 76193d7c 2003-09-30 devnull }
67 76193d7c 2003-09-30 devnull return u-data;
68 76193d7c 2003-09-30 devnull }