1 #include <u.h> 2 #include <libc.h> 3 #include <draw.h> 4 #include <memdraw.h> 5 6 int memsetchan(Memimage * i,ulong chan)7memsetchan(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