commit 1d45175515de8fc1fb9aa070ac9d17f264e1fb78 Author: David du Colombier <0intro@gmail.com> Date: Sun Mar 27 00:26:19 2016 +0100 libmemdraw diff --git a/sys/include/memdraw.h b/sys/include/memdraw.h index 6e52769..ffb2082 100644 --- a/sys/include/memdraw.h +++ b/sys/include/memdraw.h @@ -173,6 +173,7 @@ extern Memcmap *memdefcmap; * Kernel interface */ void memimagemove(void*, void*); +void memdrawallocinit(void); /* * Kernel cruft diff --git a/sys/src/libmemdraw/addr.c b/sys/src/libmemdraw/addr.c new file mode 100644 index 0000000..4d44c1b --- /dev/null +++ b/sys/src/libmemdraw/addr.c @@ -0,0 +1,36 @@ +#include +#include +#include +#include + +/* + * Wordaddr is deprecated. + */ +ulong* +wordaddr(Memimage *i, Point p) +{ + return (ulong*) ((uintptr)byteaddr(i, p) & ~(sizeof(ulong)-1)); +} + +uchar* +byteaddr(Memimage *i, Point p) +{ + uchar *a; + + a = i->data->bdata+i->zero+sizeof(ulong)*p.y*i->width; + + if(i->depth < 8){ + /* + * We need to always round down, + * but C rounds toward zero. + */ + int np; + np = 8/i->depth; + if(p.x < 0) + return a+(p.x-np+1)/np; + else + return a+p.x/np; + } + else + return a+p.x*(i->depth/8); +} diff --git a/sys/src/libmemdraw/alloc.c b/sys/src/libmemdraw/alloc.c index 14abdf5..696c3dc 100644 --- a/sys/src/libmemdraw/alloc.c +++ b/sys/src/libmemdraw/alloc.c @@ -4,6 +4,8 @@ #include #include +extern Pool* imagmem; + void memimagemove(void *from, void *to) { @@ -20,6 +22,13 @@ memimagemove(void *from, void *to) md->bdata = (uchar*)md->base+sizeof(Memdata*)+sizeof(ulong); } +void +memdrawallocinit(void) +{ + if(strcmp(imagmem->name, "Image") == 0 || strcmp(imagmem->name, "image") == 0) + imagmem->move = memimagemove; +} + Memimage* allocmemimaged(Rectangle r, ulong chan, Memdata *md) { @@ -123,79 +132,3 @@ freememimage(Memimage *i) } free(i); } - -/* - * Wordaddr is deprecated. - */ -ulong* -wordaddr(Memimage *i, Point p) -{ - return (ulong*) ((uintptr)byteaddr(i, p) & ~(sizeof(ulong)-1)); -} - -uchar* -byteaddr(Memimage *i, Point p) -{ - uchar *a; - - a = i->data->bdata+i->zero+sizeof(ulong)*p.y*i->width; - - if(i->depth < 8){ - /* - * We need to always round down, - * but C rounds toward zero. - */ - int np; - np = 8/i->depth; - if(p.x < 0) - return a+(p.x-np+1)/np; - else - return a+p.x/np; - } - else - return a+p.x*(i->depth/8); -} - -int -memsetchan(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[t] = NBITS(cc); - if(NBITS(cc) != 8) - bytes = 0; - } - i->nchan = k; - if(bytes) - i->flags |= Fbytes; - return 0; -} diff --git a/sys/src/libmemdraw/draw.c b/sys/src/libmemdraw/draw.c index 1987c77..3f9abbe 100644 --- a/sys/src/libmemdraw/draw.c +++ b/sys/src/libmemdraw/draw.c @@ -2,9 +2,7 @@ #include #include #include -#include -extern Pool* imagmem; int drawdebug; static int tablesbuilt; @@ -52,8 +50,7 @@ memimageinit(void) didinit = 1; - if(strcmp(imagmem->name, "Image") == 0 || strcmp(imagmem->name, "image") == 0) - imagmem->move = memimagemove; + memdrawallocinit(); mktables(); _memmkcmap(); diff --git a/sys/src/libmemdraw/memsetchan.c b/sys/src/libmemdraw/memsetchan.c new file mode 100644 index 0000000..c70df30 --- /dev/null +++ b/sys/src/libmemdraw/memsetchan.c @@ -0,0 +1,48 @@ +#include +#include +#include +#include + +int +memsetchan(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[t] = NBITS(cc); + if(NBITS(cc) != 8) + bytes = 0; + } + i->nchan = k; + if(bytes) + i->flags |= Fbytes; + return 0; +} diff --git a/sys/src/libmemdraw/mkfile b/sys/src/libmemdraw/mkfile index ada315d..85faf83 100644 --- a/sys/src/libmemdraw/mkfile +++ b/sys/src/libmemdraw/mkfile @@ -2,6 +2,7 @@ LIB=/$objtype/lib/libmemdraw.a OFILES=\ + addr.$O\ alloc.$O\ arc.$O\ cload.$O\ @@ -15,6 +16,7 @@ OFILES=\ iprint.$O\ line.$O\ load.$O\ + memsetchan.$O\ openmemsubfont.$O\ poly.$O\ read.$O\ diff --git a/sys/src/libmemdraw/alloc.c b/sys/src/libmemdraw/alloc.c index 696c3dc..8fd9a2d 100644 --- a/sys/src/libmemdraw/alloc.c +++ b/sys/src/libmemdraw/alloc.c @@ -7,6 +7,13 @@ extern Pool* imagmem; void +memdrawallocinit(void) +{ + if(strcmp(imagmem->name, "Image") == 0 || strcmp(imagmem->name, "image") == 0) + imagmem->move = memimagemove; +} + +void memimagemove(void *from, void *to) { Memdata *md; @@ -22,13 +29,6 @@ memimagemove(void *from, void *to) md->bdata = (uchar*)md->base+sizeof(Memdata*)+sizeof(ulong); } -void -memdrawallocinit(void) -{ - if(strcmp(imagmem->name, "Image") == 0 || strcmp(imagmem->name, "image") == 0) - imagmem->move = memimagemove; -} - Memimage* allocmemimaged(Rectangle r, ulong chan, Memdata *md) {