xref: /plan9-contrib/sys/src/libdraw/chan.c (revision 815ca0085e46c6719a71345e32c5520a42b6f9b9)
17dd7cddfSDavid du Colombier #include <u.h>
27dd7cddfSDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <draw.h>
47dd7cddfSDavid du Colombier 
57dd7cddfSDavid du Colombier static char channames[] = "rgbkamx";
67dd7cddfSDavid du Colombier char*
chantostr(char * buf,ulong cc)77dd7cddfSDavid du Colombier chantostr(char *buf, ulong cc)
87dd7cddfSDavid du Colombier {
97dd7cddfSDavid du Colombier 	ulong c, rc;
107dd7cddfSDavid du Colombier 	char *p;
117dd7cddfSDavid du Colombier 
127dd7cddfSDavid du Colombier 	if(chantodepth(cc) == 0)
137dd7cddfSDavid du Colombier 		return nil;
147dd7cddfSDavid du Colombier 
157dd7cddfSDavid du Colombier 	/* reverse the channel descriptor so we can easily generate the string in the right order */
167dd7cddfSDavid du Colombier 	rc = 0;
177dd7cddfSDavid du Colombier 	for(c=cc; c; c>>=8){
187dd7cddfSDavid du Colombier 		rc <<= 8;
197dd7cddfSDavid du Colombier 		rc |= c&0xFF;
207dd7cddfSDavid du Colombier 	}
217dd7cddfSDavid du Colombier 
227dd7cddfSDavid du Colombier 	p = buf;
237dd7cddfSDavid du Colombier 	for(c=rc; c; c>>=8) {
247dd7cddfSDavid du Colombier 		*p++ = channames[TYPE(c)];
257dd7cddfSDavid du Colombier 		*p++ = '0'+NBITS(c);
267dd7cddfSDavid du Colombier 	}
277dd7cddfSDavid du Colombier 	*p = 0;
287dd7cddfSDavid du Colombier 
297dd7cddfSDavid du Colombier 	return buf;
307dd7cddfSDavid du Colombier }
317dd7cddfSDavid du Colombier 
329a747e4fSDavid du Colombier /* avoid pulling in ctype when using with drawterm etc. */
339a747e4fSDavid du Colombier static int
isspace(char c)349a747e4fSDavid du Colombier isspace(char c)
359a747e4fSDavid du Colombier {
369a747e4fSDavid du Colombier 	return c==' ' || c== '\t' || c=='\r' || c=='\n';
379a747e4fSDavid du Colombier }
389a747e4fSDavid du Colombier 
397dd7cddfSDavid du Colombier ulong
strtochan(char * s)407dd7cddfSDavid du Colombier strtochan(char *s)
417dd7cddfSDavid du Colombier {
427dd7cddfSDavid du Colombier 	char *p, *q;
437dd7cddfSDavid du Colombier 	ulong c;
44*815ca008SDavid du Colombier 	int t, n, d;
457dd7cddfSDavid du Colombier 
467dd7cddfSDavid du Colombier 	c = 0;
47*815ca008SDavid du Colombier 	d = 0;
487dd7cddfSDavid du Colombier 	p=s;
497dd7cddfSDavid du Colombier 	while(*p && isspace(*p))
507dd7cddfSDavid du Colombier 		p++;
517dd7cddfSDavid du Colombier 
527dd7cddfSDavid du Colombier 	while(*p && !isspace(*p)){
537dd7cddfSDavid du Colombier 		if((q = strchr(channames, p[0])) == nil)
547dd7cddfSDavid du Colombier 			return 0;
557dd7cddfSDavid du Colombier 		t = q-channames;
567dd7cddfSDavid du Colombier 		if(p[1] < '0' || p[1] > '9')
577dd7cddfSDavid du Colombier 			return 0;
587dd7cddfSDavid du Colombier 		n = p[1]-'0';
59*815ca008SDavid du Colombier 		d += n;
607dd7cddfSDavid du Colombier 		c = (c<<8) | __DC(t, n);
617dd7cddfSDavid du Colombier 		p += 2;
627dd7cddfSDavid du Colombier 	}
63*815ca008SDavid du Colombier 	if(d==0 || (d>8 && d%8) || (d<8 && 8%d))
64*815ca008SDavid du Colombier 		return 0;
657dd7cddfSDavid du Colombier 	return c;
667dd7cddfSDavid du Colombier }
677dd7cddfSDavid du Colombier 
687dd7cddfSDavid du Colombier int
chantodepth(ulong c)697dd7cddfSDavid du Colombier chantodepth(ulong c)
707dd7cddfSDavid du Colombier {
717dd7cddfSDavid du Colombier 	int n;
727dd7cddfSDavid du Colombier 
737dd7cddfSDavid du Colombier 	for(n=0; c; c>>=8){
747dd7cddfSDavid du Colombier 		if(TYPE(c) >= NChan || NBITS(c) > 8 || NBITS(c) <= 0)
757dd7cddfSDavid du Colombier 			return 0;
767dd7cddfSDavid du Colombier 		n += NBITS(c);
777dd7cddfSDavid du Colombier 	}
787dd7cddfSDavid du Colombier 	if(n==0 || (n>8 && n%8) || (n<8 && 8%n))
797dd7cddfSDavid du Colombier 		return 0;
807dd7cddfSDavid du Colombier 	return n;
817dd7cddfSDavid du Colombier }
82