xref: /plan9-contrib/sys/src/libmemdraw/memsetchan.c (revision 6f1f24dd981116678e9fd1c5fb4c6ae548570725)
1*6f1f24ddSDavid du Colombier #include <u.h>
2*6f1f24ddSDavid du Colombier #include <libc.h>
3*6f1f24ddSDavid du Colombier #include <draw.h>
4*6f1f24ddSDavid du Colombier #include <memdraw.h>
5*6f1f24ddSDavid du Colombier 
6*6f1f24ddSDavid du Colombier int
memsetchan(Memimage * i,ulong chan)7*6f1f24ddSDavid du Colombier memsetchan(Memimage *i, ulong chan)
8*6f1f24ddSDavid du Colombier {
9*6f1f24ddSDavid du Colombier 	int d;
10*6f1f24ddSDavid du Colombier 	int t, j, k;
11*6f1f24ddSDavid du Colombier 	ulong cc;
12*6f1f24ddSDavid du Colombier 	int bytes;
13*6f1f24ddSDavid du Colombier 
14*6f1f24ddSDavid du Colombier 	if((d = chantodepth(chan)) == 0) {
15*6f1f24ddSDavid du Colombier 		werrstr("bad channel descriptor");
16*6f1f24ddSDavid du Colombier 		return -1;
17*6f1f24ddSDavid du Colombier 	}
18*6f1f24ddSDavid du Colombier 
19*6f1f24ddSDavid du Colombier 	i->depth = d;
20*6f1f24ddSDavid du Colombier 	i->chan = chan;
21*6f1f24ddSDavid du Colombier 	i->flags &= ~(Fgrey|Falpha|Fcmap|Fbytes);
22*6f1f24ddSDavid du Colombier 	bytes = 1;
23*6f1f24ddSDavid du Colombier 	for(cc=chan, j=0, k=0; cc; j+=NBITS(cc), cc>>=8, k++){
24*6f1f24ddSDavid du Colombier 		t=TYPE(cc);
25*6f1f24ddSDavid du Colombier 		if(t < 0 || t >= NChan){
26*6f1f24ddSDavid du Colombier 			werrstr("bad channel string");
27*6f1f24ddSDavid du Colombier 			return -1;
28*6f1f24ddSDavid du Colombier 		}
29*6f1f24ddSDavid du Colombier 		if(t == CGrey)
30*6f1f24ddSDavid du Colombier 			i->flags |= Fgrey;
31*6f1f24ddSDavid du Colombier 		if(t == CAlpha)
32*6f1f24ddSDavid du Colombier 			i->flags |= Falpha;
33*6f1f24ddSDavid du Colombier 		if(t == CMap && i->cmap == nil){
34*6f1f24ddSDavid du Colombier 			i->cmap = memdefcmap;
35*6f1f24ddSDavid du Colombier 			i->flags |= Fcmap;
36*6f1f24ddSDavid du Colombier 		}
37*6f1f24ddSDavid du Colombier 
38*6f1f24ddSDavid du Colombier 		i->shift[t] = j;
39*6f1f24ddSDavid du Colombier 		i->mask[t] = (1<<NBITS(cc))-1;
40*6f1f24ddSDavid du Colombier 		i->nbits[t] = NBITS(cc);
41*6f1f24ddSDavid du Colombier 		if(NBITS(cc) != 8)
42*6f1f24ddSDavid du Colombier 			bytes = 0;
43*6f1f24ddSDavid du Colombier 	}
44*6f1f24ddSDavid du Colombier 	i->nchan = k;
45*6f1f24ddSDavid du Colombier 	if(bytes)
46*6f1f24ddSDavid du Colombier 		i->flags |= Fbytes;
47*6f1f24ddSDavid du Colombier 	return 0;
48*6f1f24ddSDavid du Colombier }
49