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 Colombiermemsetchan(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