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