48 lines · 832 B · C
RawDownload
#include <u.h>#include <libc.h>#include <draw.h>#include <memdraw.h> intmemsetchan(Memimage *i, ulong chan){	int d;	int t, j, k;	ulong cc;	int bytes; 	if((d = chantodepth(chan)) == 0) {		werrstr("bad channel descriptor");		return -1;	} 	i->depth = d;	i->chan = chan;	i->flags &= ~(Fgrey|Falpha|Fcmap|Fbytes);	bytes = 1;	for(cc=chan, j=0, k=0; cc; j+=NBITS(cc), cc>>=8, k++){		t=TYPE(cc);		if(t < 0 || t >= NChan){			werrstr("bad channel string");			return -1;		}		if(t == CGrey)			i->flags |= Fgrey;		if(t == CAlpha)			i->flags |= Falpha;		if(t == CMap && i->cmap == nil){			i->cmap = memdefcmap;			i->flags |= Fcmap;		} 		i->shift[t] = j;		i->mask[t] = (1<<NBITS(cc))-1;		i->nbits[t] = NBITS(cc);		if(NBITS(cc) != 8)			bytes = 0;	}	i->nchan = k;	if(bytes)		i->flags |= Fbytes;	return 0;}