xref: /plan9/sys/src/libdraw/computil.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
1*9a747e4fSDavid du Colombier #include <u.h>
2*9a747e4fSDavid du Colombier #include <libc.h>
3*9a747e4fSDavid du Colombier #include <draw.h>
4*9a747e4fSDavid du Colombier 
5*9a747e4fSDavid du Colombier /*
6*9a747e4fSDavid du Colombier  * compressed data are seuences of byte codes.
7*9a747e4fSDavid du Colombier  * if the first byte b has the 0x80 bit set, the next (b^0x80)+1 bytes
8*9a747e4fSDavid du Colombier  * are data.  otherwise, it's two bytes specifying a previous string to repeat.
9*9a747e4fSDavid du Colombier  */
10*9a747e4fSDavid du Colombier void
_twiddlecompressed(uchar * buf,int n)11*9a747e4fSDavid du Colombier _twiddlecompressed(uchar *buf, int n)
12*9a747e4fSDavid du Colombier {
13*9a747e4fSDavid du Colombier 	uchar *ebuf;
14*9a747e4fSDavid du Colombier 	int j, k, c;
15*9a747e4fSDavid du Colombier 
16*9a747e4fSDavid du Colombier 	ebuf = buf+n;
17*9a747e4fSDavid du Colombier 	while(buf < ebuf){
18*9a747e4fSDavid du Colombier 		c = *buf++;
19*9a747e4fSDavid du Colombier 		if(c >= 128){
20*9a747e4fSDavid du Colombier 			k = c-128+1;
21*9a747e4fSDavid du Colombier 			for(j=0; j<k; j++, buf++)
22*9a747e4fSDavid du Colombier 				*buf ^= 0xFF;
23*9a747e4fSDavid du Colombier 		}else
24*9a747e4fSDavid du Colombier 			buf++;
25*9a747e4fSDavid du Colombier 	}
26*9a747e4fSDavid du Colombier }
27*9a747e4fSDavid du Colombier 
28*9a747e4fSDavid du Colombier int
_compblocksize(Rectangle r,int depth)29*9a747e4fSDavid du Colombier _compblocksize(Rectangle r, int depth)
30*9a747e4fSDavid du Colombier {
31*9a747e4fSDavid du Colombier 	int bpl;
32*9a747e4fSDavid du Colombier 
33*9a747e4fSDavid du Colombier 	bpl = bytesperline(r, depth);
34*9a747e4fSDavid du Colombier 	bpl = 2*bpl;	/* add plenty extra for blocking, etc. */
35*9a747e4fSDavid du Colombier 	if(bpl < NCBLOCK)
36*9a747e4fSDavid du Colombier 		return NCBLOCK;
37*9a747e4fSDavid du Colombier 	return bpl;
38*9a747e4fSDavid du Colombier }
39