8 memimagemove(void *from, void *to)
14 print("compacted data not right: #%p\n", md->base);
19 /* if allocmemimage changes this must change too */
20 md->bdata = (uchar*)md->base+sizeof(Memdata*)+sizeof(ulong);
24 allocmemimaged(Rectangle r, ulong chan, Memdata *md)
30 if(Dx(r) <= 0 || Dy(r) <= 0){
31 werrstr("bad rectangle %R", r);
34 if((d = chantodepth(chan)) == 0) {
35 werrstr("bad channel descriptor %.8lux", chan);
39 l = wordsperline(r, d);
41 i = mallocz(sizeof(Memimage), 1);
46 i->zero = sizeof(ulong)*l*r.min.y;
49 i->zero += (r.min.x*d)/8;
51 i->zero -= (-r.min.x*d+7)/8;
59 if(memsetchan(i, chan) < 0){
67 allocmemimage(Rectangle r, ulong chan)
75 if((d = chantodepth(chan)) == 0) {
76 werrstr("bad channel descriptor %.8lux", chan);
80 l = wordsperline(r, d);
82 md = malloc(sizeof(Memdata));
87 md->base = poolalloc(imagmem, sizeof(Memdata*)+(1+nw)*sizeof(ulong));
95 p += sizeof(Memdata*);
97 *(ulong*)p = getcallerpc(&r);
100 /* if this changes, memimagemove must change too */
104 i = allocmemimaged(r, chan, md);
106 poolfree(imagmem, md->base);
115 freememimage(Memimage *i)
119 if(i->data->ref-- == 1 && i->data->allocd){
121 poolfree(imagmem, i->data->base);
128 * Wordaddr is deprecated.
131 wordaddr(Memimage *i, Point p)
133 return (ulong*) ((uintptr)byteaddr(i, p) & ~(sizeof(ulong)-1));
137 byteaddr(Memimage *i, Point p)
141 a = i->data->bdata+i->zero+sizeof(ulong)*p.y*i->width;
145 * We need to always round down,
146 * but C rounds toward zero.
151 return a+(p.x-np+1)/np;
156 return a+p.x*(i->depth/8);
160 memsetchan(Memimage *i, ulong chan)
167 if((d = chantodepth(chan)) == 0) {
168 werrstr("bad channel descriptor");
174 i->flags &= ~(Fgrey|Falpha|Fcmap|Fbytes);
176 for(cc=chan, j=0, k=0; cc; j+=NBITS(cc), cc>>=8, k++){
178 if(t < 0 || t >= NChan){
179 werrstr("bad channel string");
186 if(t == CMap && i->cmap == nil){
187 i->cmap = memdefcmap;
192 i->mask[t] = (1<<NBITS(cc))-1;
193 i->nbits[t] = NBITS(cc);