xref: /plan9/sys/src/cmd/unix/drawterm/libdraw/chan.c (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
1*7dd7cddfSDavid du Colombier #include "../lib9.h"
2*7dd7cddfSDavid du Colombier 
3*7dd7cddfSDavid du Colombier #include "../libdraw/draw.h"
4*7dd7cddfSDavid du Colombier #include <ctype.h>
5*7dd7cddfSDavid du Colombier 
6*7dd7cddfSDavid du Colombier static char channames[] = "rgbkamx";
7*7dd7cddfSDavid du Colombier char*
8*7dd7cddfSDavid du Colombier chantostr(char *buf, ulong cc)
9*7dd7cddfSDavid du Colombier {
10*7dd7cddfSDavid du Colombier 	ulong c, rc;
11*7dd7cddfSDavid du Colombier 	char *p;
12*7dd7cddfSDavid du Colombier 
13*7dd7cddfSDavid du Colombier 	if(chantodepth(cc) == 0)
14*7dd7cddfSDavid du Colombier 		return nil;
15*7dd7cddfSDavid du Colombier 
16*7dd7cddfSDavid du Colombier 	/* reverse the channel descriptor so we can easily generate the string in the right order */
17*7dd7cddfSDavid du Colombier 	rc = 0;
18*7dd7cddfSDavid du Colombier 	for(c=cc; c; c>>=8){
19*7dd7cddfSDavid du Colombier 		rc <<= 8;
20*7dd7cddfSDavid du Colombier 		rc |= c&0xFF;
21*7dd7cddfSDavid du Colombier 	}
22*7dd7cddfSDavid du Colombier 
23*7dd7cddfSDavid du Colombier 	p = buf;
24*7dd7cddfSDavid du Colombier 	for(c=rc; c; c>>=8) {
25*7dd7cddfSDavid du Colombier 		*p++ = channames[TYPE(c)];
26*7dd7cddfSDavid du Colombier 		*p++ = '0'+NBITS(c);
27*7dd7cddfSDavid du Colombier 	}
28*7dd7cddfSDavid du Colombier 	*p = 0;
29*7dd7cddfSDavid du Colombier 
30*7dd7cddfSDavid du Colombier 	return buf;
31*7dd7cddfSDavid du Colombier }
32*7dd7cddfSDavid du Colombier 
33*7dd7cddfSDavid du Colombier ulong
34*7dd7cddfSDavid du Colombier strtochan(char *s)
35*7dd7cddfSDavid du Colombier {
36*7dd7cddfSDavid du Colombier 	char *p, *q;
37*7dd7cddfSDavid du Colombier 	ulong c;
38*7dd7cddfSDavid du Colombier 	int t, n;
39*7dd7cddfSDavid du Colombier 
40*7dd7cddfSDavid du Colombier 	c = 0;
41*7dd7cddfSDavid du Colombier 	p=s;
42*7dd7cddfSDavid du Colombier 	while(*p && isspace(*p))
43*7dd7cddfSDavid du Colombier 		p++;
44*7dd7cddfSDavid du Colombier 
45*7dd7cddfSDavid du Colombier 	while(*p && !isspace(*p)){
46*7dd7cddfSDavid du Colombier 		if((q = strchr(channames, p[0])) == nil)
47*7dd7cddfSDavid du Colombier 			return 0;
48*7dd7cddfSDavid du Colombier 		t = q-channames;
49*7dd7cddfSDavid du Colombier 		if(p[1] < '0' || p[1] > '9')
50*7dd7cddfSDavid du Colombier 			return 0;
51*7dd7cddfSDavid du Colombier 		n = p[1]-'0';
52*7dd7cddfSDavid du Colombier 		c = (c<<8) | __DC(t, n);
53*7dd7cddfSDavid du Colombier 		p += 2;
54*7dd7cddfSDavid du Colombier 	}
55*7dd7cddfSDavid du Colombier 	return c;
56*7dd7cddfSDavid du Colombier }
57*7dd7cddfSDavid du Colombier 
58*7dd7cddfSDavid du Colombier int
59*7dd7cddfSDavid du Colombier chantodepth(ulong c)
60*7dd7cddfSDavid du Colombier {
61*7dd7cddfSDavid du Colombier 	int n;
62*7dd7cddfSDavid du Colombier 	for(n=0; c; c>>=8){
63*7dd7cddfSDavid du Colombier 		if(TYPE(c) >= NChan || NBITS(c) > 8 || NBITS(c) <= 0)
64*7dd7cddfSDavid du Colombier 			return 0;
65*7dd7cddfSDavid du Colombier 		n += NBITS(c);
66*7dd7cddfSDavid du Colombier 	}
67*7dd7cddfSDavid du Colombier 	if((n>8 && n%8) || (n<8 && 8%n))
68*7dd7cddfSDavid du Colombier 		return 0;
69*7dd7cddfSDavid du Colombier 	return n;
70*7dd7cddfSDavid du Colombier }
71