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