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