commit 55dedf713c04d00add59ba54464150b3a5a3aa60 from: rsc date: Tue Sep 30 19:06:20 2003 UTC Missed these. commit - 522b0689c340d26feeac360640bf7e2e0582353c commit + 55dedf713c04d00add59ba54464150b3a5a3aa60 blob - /dev/null blob + 08784ce92540af3156204a8190ee46eab1e4ab11 (mode 644) --- /dev/null +++ include/memdraw.h @@ -0,0 +1,209 @@ +typedef struct Memimage Memimage; +typedef struct Memdata Memdata; +typedef struct Memsubfont Memsubfont; +typedef struct Memlayer Memlayer; +typedef struct Memcmap Memcmap; +typedef struct Memdrawparam Memdrawparam; + +/* + * Memdata is allocated from main pool, but .data from the image pool. + * Memdata is allocated separately to permit patching its pointer after + * compaction when windows share the image data. + * The first word of data is a back pointer to the Memdata, to find + * The word to patch. + */ + +struct Memdata +{ + u32int *base; /* allocated data pointer */ + uchar *bdata; /* pointer to first byte of actual data; word-aligned */ + int ref; /* number of Memimages using this data */ + void* imref; + int allocd; /* is this malloc'd? */ +}; + +enum { + Frepl = 1<<0, /* is replicated */ + Fsimple = 1<<1, /* is 1x1 */ + Fgrey = 1<<2, /* is grey */ + Falpha = 1<<3, /* has explicit alpha */ + Fcmap = 1<<4, /* has cmap channel */ + Fbytes = 1<<5, /* has only 8-bit channels */ +}; + +struct Memimage +{ + Rectangle r; /* rectangle in data area, local coords */ + Rectangle clipr; /* clipping region */ + int depth; /* number of bits of storage per pixel */ + int nchan; /* number of channels */ + u32int chan; /* channel descriptions */ + Memcmap *cmap; + + Memdata *data; /* pointer to data; shared by windows in this image */ + int zero; /* data->bdata+zero==&byte containing (0,0) */ + u32int width; /* width in words of a single scan line */ + Memlayer *layer; /* nil if not a layer*/ + u32int flags; + void *X; + + int shift[NChan]; + int mask[NChan]; + int nbits[NChan]; +}; + +struct Memcmap +{ + uchar cmap2rgb[3*256]; + uchar rgb2cmap[16*16*16]; +}; + +/* + * Subfonts + * + * given char c, Subfont *f, Fontchar *i, and Point p, one says + * i = f->info+c; + * draw(b, Rect(p.x+i->left, p.y+i->top, + * p.x+i->left+((i+1)->x-i->x), p.y+i->bottom), + * color, f->bits, Pt(i->x, i->top)); + * p.x += i->width; + * to draw characters in the specified color (itself a Memimage) in Memimage b. + */ + +struct Memsubfont +{ + char *name; + short n; /* number of chars in font */ + uchar height; /* height of bitmap */ + char ascent; /* top of bitmap to baseline */ + Fontchar *info; /* n+1 character descriptors */ + Memimage *bits; /* of font */ +}; + +/* + * Encapsulated parameters and information for sub-draw routines. + */ +enum { + Simplesrc=1<<0, + Simplemask=1<<1, + Replsrc=1<<2, + Replmask=1<<3, + Fullmask=1<<4, +}; +struct Memdrawparam +{ + Memimage *dst; + Rectangle r; + Memimage *src; + Rectangle sr; + Memimage *mask; + Rectangle mr; + int op; + + u32int state; + u32int mval; /* if Simplemask, the mask pixel in mask format */ + u32int mrgba; /* mval in rgba */ + u32int sval; /* if Simplesrc, the source pixel in src format */ + u32int srgba; /* sval in rgba */ + u32int sdval; /* sval in dst format */ +}; + +/* + * Memimage management + */ + +extern Memimage* allocmemimage(Rectangle, u32int); +extern Memimage* allocmemimaged(Rectangle, u32int, Memdata*, void*); +extern Memimage* readmemimage(int); +extern Memimage* creadmemimage(int); +extern int writememimage(int, Memimage*); +extern void freememimage(Memimage*); +extern int loadmemimage(Memimage*, Rectangle, uchar*, int); +extern int cloadmemimage(Memimage*, Rectangle, uchar*, int); +extern int unloadmemimage(Memimage*, Rectangle, uchar*, int); +extern u32int* wordaddr(Memimage*, Point); +extern uchar* byteaddr(Memimage*, Point); +extern int drawclip(Memimage*, Rectangle*, Memimage*, Point*, + Memimage*, Point*, Rectangle*, Rectangle*); +extern void memfillcolor(Memimage*, u32int); +extern int memsetchan(Memimage*, u32int); +extern u32int pixelbits(Memimage*, Point); + +/* + * Graphics + */ +extern void memdraw(Memimage*, Rectangle, Memimage*, Point, + Memimage*, Point, int); +extern void memline(Memimage*, Point, Point, int, int, int, + Memimage*, Point, int); +extern void mempoly(Memimage*, Point*, int, int, int, int, + Memimage*, Point, int); +extern void memfillpoly(Memimage*, Point*, int, int, + Memimage*, Point, int); +extern void _memfillpolysc(Memimage*, Point*, int, int, + Memimage*, Point, int, int, int, int); +extern void memimagedraw(Memimage*, Rectangle, Memimage*, Point, + Memimage*, Point, int); +extern int hwdraw(Memdrawparam*); +extern void memimageline(Memimage*, Point, Point, int, int, int, + Memimage*, Point, int); +extern void _memimageline(Memimage*, Point, Point, int, int, int, + Memimage*, Point, Rectangle, int); +extern Point memimagestring(Memimage*, Point, Memimage*, Point, + Memsubfont*, char*); +extern void memellipse(Memimage*, Point, int, int, int, + Memimage*, Point, int); +extern void memarc(Memimage*, Point, int, int, int, Memimage*, + Point, int, int, int); +extern Rectangle memlinebbox(Point, Point, int, int, int); +extern int memlineendsize(int); +extern void _memmkcmap(void); +extern void memimageinit(void); + +/* + * Subfont management + */ +extern Memsubfont* allocmemsubfont(char*, int, int, int, Fontchar*, Memimage*); +extern Memsubfont* openmemsubfont(char*); +extern void freememsubfont(Memsubfont*); +extern Point memsubfontwidth(Memsubfont*, char*); +extern Memsubfont* getmemdefont(void); + +/* + * Predefined + */ +extern Memimage* memwhite; +extern Memimage* memblack; +extern Memimage* memopaque; +extern Memimage* memtransparent; +extern Memcmap* memdefcmap; + +/* + * Kernel interface + */ +void memimagemove(void*, void*); + +/* + * Kernel cruft + */ +extern void rdb(void); +extern int iprint(char*, ...); +extern int drawdebug; + +/* + * For other implementations, like x11. + */ +extern void _memfillcolor(Memimage*, u32int); +extern Memimage* _allocmemimage(Rectangle, u32int); +extern int _cloadmemimage(Memimage*, Rectangle, uchar*, int); +extern int _loadmemimage(Memimage*, Rectangle, uchar*, int); +extern void _freememimage(Memimage*); +extern u32int _rgbatoimg(Memimage*, u32int); +extern u32int _imgtorgba(Memimage*, u32int); +extern u32int _pixelbits(Memimage*, Point); +extern int _unloadmemimage(Memimage*, Rectangle, uchar*, int); +extern Memdrawparam* _memimagedrawsetup(Memimage*, + Rectangle, Memimage*, Point, Memimage*, + Point, int); +extern void _memimagedraw(Memdrawparam*); +extern void _drawreplacescreenimage(Memimage*); blob - /dev/null blob + 36d87767db6a4a0d1294cdb813854f5d866cafa0 (mode 644) --- /dev/null +++ include/memlayer.h @@ -0,0 +1,48 @@ +typedef struct Memscreen Memscreen; +typedef void (*Refreshfn)(Memimage*, Rectangle, void*); + +struct Memscreen +{ + Memimage *frontmost; /* frontmost layer on screen */ + Memimage *rearmost; /* rearmost layer on screen */ + Memimage *image; /* upon which all layers are drawn */ + Memimage *fill; /* if non-zero, picture to use when repainting */ +}; + +struct Memlayer +{ + Rectangle screenr; /* true position of layer on screen */ + Point delta; /* add delta to go from image coords to screen */ + Memscreen *screen; /* screen this layer belongs to */ + Memimage *front; /* window in front of this one */ + Memimage *rear; /* window behind this one*/ + int clear; /* layer is fully visible */ + Memimage *save; /* save area for obscured parts */ + Refreshfn refreshfn; /* function to call to refresh obscured parts if save==nil */ + void *refreshptr; /* argument to refreshfn */ +}; + +/* + * These functions accept local coordinates + */ +int memload(Memimage*, Rectangle, uchar*, int, int); +int memunload(Memimage*, Rectangle, uchar*, int); + +/* + * All these functions accept screen coordinates, not local ones. + */ +void _memlayerop(void (*fn)(Memimage*, Rectangle, Rectangle, void*, int), Memimage*, Rectangle, Rectangle, void*); +Memimage* memlalloc(Memscreen*, Rectangle, Refreshfn, void*, u32int); +void memldelete(Memimage*); +void memlfree(Memimage*); +void memltofront(Memimage*); +void memltofrontn(Memimage**, int); +void _memltofrontfill(Memimage*, int); +void memltorear(Memimage*); +void memltorearn(Memimage**, int); +int memlsetrefresh(Memimage*, Refreshfn, void*); +void memlhide(Memimage*, Rectangle); +void memlexpose(Memimage*, Rectangle); +void _memlsetclear(Memscreen*); +int memlorigin(Memimage*, Point, Point); +void memlnorefresh(Memimage*, Rectangle, void*);