1*8ccd4a63SDavid du Colombier #ifdef PLAN9 2*8ccd4a63SDavid du Colombier #pragma src "/sys/src/libmemdraw" 3*8ccd4a63SDavid du Colombier #pragma lib "libmemdraw.a" 4*8ccd4a63SDavid du Colombier #endif 5*8ccd4a63SDavid du Colombier 6*8ccd4a63SDavid du Colombier typedef struct Memimage Memimage; 7*8ccd4a63SDavid du Colombier typedef struct Memdata Memdata; 8*8ccd4a63SDavid du Colombier typedef struct Memsubfont Memsubfont; 9*8ccd4a63SDavid du Colombier typedef struct Memlayer Memlayer; 10*8ccd4a63SDavid du Colombier typedef struct Memcmap Memcmap; 11*8ccd4a63SDavid du Colombier typedef struct Memdrawparam Memdrawparam; 12*8ccd4a63SDavid du Colombier 13*8ccd4a63SDavid du Colombier /* 14*8ccd4a63SDavid du Colombier * Memdata is allocated from main pool, but .data from the image pool. 15*8ccd4a63SDavid du Colombier * Memdata is allocated separately to permit patching its pointer after 16*8ccd4a63SDavid du Colombier * compaction when windows share the image data. 17*8ccd4a63SDavid du Colombier * The first word of data is a back pointer to the Memdata, to find 18*8ccd4a63SDavid du Colombier * The word to patch. 19*8ccd4a63SDavid du Colombier */ 20*8ccd4a63SDavid du Colombier 21*8ccd4a63SDavid du Colombier struct Memdata 22*8ccd4a63SDavid du Colombier { 23*8ccd4a63SDavid du Colombier ulong *base; /* allocated data pointer */ 24*8ccd4a63SDavid du Colombier uchar *bdata; /* pointer to first byte of actual data; word-aligned */ 25*8ccd4a63SDavid du Colombier int ref; /* number of Memimages using this data */ 26*8ccd4a63SDavid du Colombier void* imref; 27*8ccd4a63SDavid du Colombier int allocd; /* is this malloc'd? */ 28*8ccd4a63SDavid du Colombier }; 29*8ccd4a63SDavid du Colombier 30*8ccd4a63SDavid du Colombier enum { 31*8ccd4a63SDavid du Colombier Frepl = 1<<0, /* is replicated */ 32*8ccd4a63SDavid du Colombier Fsimple = 1<<1, /* is 1x1 */ 33*8ccd4a63SDavid du Colombier Fgrey = 1<<2, /* is grey */ 34*8ccd4a63SDavid du Colombier Falpha = 1<<3, /* has explicit alpha */ 35*8ccd4a63SDavid du Colombier Fcmap = 1<<4, /* has cmap channel */ 36*8ccd4a63SDavid du Colombier Fbytes = 1<<5, /* has only 8-bit channels */ 37*8ccd4a63SDavid du Colombier }; 38*8ccd4a63SDavid du Colombier 39*8ccd4a63SDavid du Colombier struct Memimage 40*8ccd4a63SDavid du Colombier { 41*8ccd4a63SDavid du Colombier Rectangle r; /* rectangle in data area, local coords */ 42*8ccd4a63SDavid du Colombier Rectangle clipr; /* clipping region */ 43*8ccd4a63SDavid du Colombier int depth; /* number of bits of storage per pixel */ 44*8ccd4a63SDavid du Colombier int nchan; /* number of channels */ 45*8ccd4a63SDavid du Colombier ulong chan; /* channel descriptions */ 46*8ccd4a63SDavid du Colombier Memcmap *cmap; 47*8ccd4a63SDavid du Colombier 48*8ccd4a63SDavid du Colombier Memdata *data; /* pointer to data; shared by windows in this image */ 49*8ccd4a63SDavid du Colombier int zero; /* data->bdata+zero==&byte containing (0,0) */ 50*8ccd4a63SDavid du Colombier ulong width; /* width in words of a single scan line */ 51*8ccd4a63SDavid du Colombier Memlayer *layer; /* nil if not a layer*/ 52*8ccd4a63SDavid du Colombier ulong flags; 53*8ccd4a63SDavid du Colombier 54*8ccd4a63SDavid du Colombier int shift[NChan]; 55*8ccd4a63SDavid du Colombier int mask[NChan]; 56*8ccd4a63SDavid du Colombier int nbits[NChan]; 57*8ccd4a63SDavid du Colombier 58*8ccd4a63SDavid du Colombier void *X; 59*8ccd4a63SDavid du Colombier }; 60*8ccd4a63SDavid du Colombier 61*8ccd4a63SDavid du Colombier struct Memcmap 62*8ccd4a63SDavid du Colombier { 63*8ccd4a63SDavid du Colombier uchar cmap2rgb[3*256]; 64*8ccd4a63SDavid du Colombier uchar rgb2cmap[16*16*16]; 65*8ccd4a63SDavid du Colombier }; 66*8ccd4a63SDavid du Colombier 67*8ccd4a63SDavid du Colombier /* 68*8ccd4a63SDavid du Colombier * Subfonts 69*8ccd4a63SDavid du Colombier * 70*8ccd4a63SDavid du Colombier * given char c, Subfont *f, Fontchar *i, and Point p, one says 71*8ccd4a63SDavid du Colombier * i = f->info+c; 72*8ccd4a63SDavid du Colombier * draw(b, Rect(p.x+i->left, p.y+i->top, 73*8ccd4a63SDavid du Colombier * p.x+i->left+((i+1)->x-i->x), p.y+i->bottom), 74*8ccd4a63SDavid du Colombier * color, f->bits, Pt(i->x, i->top)); 75*8ccd4a63SDavid du Colombier * p.x += i->width; 76*8ccd4a63SDavid du Colombier * to draw characters in the specified color (itself a Memimage) in Memimage b. 77*8ccd4a63SDavid du Colombier */ 78*8ccd4a63SDavid du Colombier 79*8ccd4a63SDavid du Colombier struct Memsubfont 80*8ccd4a63SDavid du Colombier { 81*8ccd4a63SDavid du Colombier char *name; 82*8ccd4a63SDavid du Colombier short n; /* number of chars in font */ 83*8ccd4a63SDavid du Colombier uchar height; /* height of bitmap */ 84*8ccd4a63SDavid du Colombier char ascent; /* top of bitmap to baseline */ 85*8ccd4a63SDavid du Colombier Fontchar *info; /* n+1 character descriptors */ 86*8ccd4a63SDavid du Colombier Memimage *bits; /* of font */ 87*8ccd4a63SDavid du Colombier }; 88*8ccd4a63SDavid du Colombier 89*8ccd4a63SDavid du Colombier /* 90*8ccd4a63SDavid du Colombier * Encapsulated parameters and information for sub-draw routines. 91*8ccd4a63SDavid du Colombier */ 92*8ccd4a63SDavid du Colombier enum { 93*8ccd4a63SDavid du Colombier Simplesrc=1<<0, 94*8ccd4a63SDavid du Colombier Simplemask=1<<1, 95*8ccd4a63SDavid du Colombier Replsrc=1<<2, 96*8ccd4a63SDavid du Colombier Replmask=1<<3, 97*8ccd4a63SDavid du Colombier Fullmask=1<<4, 98*8ccd4a63SDavid du Colombier }; 99*8ccd4a63SDavid du Colombier struct Memdrawparam 100*8ccd4a63SDavid du Colombier { 101*8ccd4a63SDavid du Colombier Memimage *dst; 102*8ccd4a63SDavid du Colombier Rectangle r; 103*8ccd4a63SDavid du Colombier Memimage *src; 104*8ccd4a63SDavid du Colombier Rectangle sr; 105*8ccd4a63SDavid du Colombier Memimage *mask; 106*8ccd4a63SDavid du Colombier Rectangle mr; 107*8ccd4a63SDavid du Colombier int op; 108*8ccd4a63SDavid du Colombier 109*8ccd4a63SDavid du Colombier ulong state; 110*8ccd4a63SDavid du Colombier ulong mval; /* if Simplemask, the mask pixel in mask format */ 111*8ccd4a63SDavid du Colombier ulong mrgba; /* mval in rgba */ 112*8ccd4a63SDavid du Colombier ulong sval; /* if Simplesrc, the source pixel in src format */ 113*8ccd4a63SDavid du Colombier ulong srgba; /* sval in rgba */ 114*8ccd4a63SDavid du Colombier ulong sdval; /* sval in dst format */ 115*8ccd4a63SDavid du Colombier }; 116*8ccd4a63SDavid du Colombier 117*8ccd4a63SDavid du Colombier /* 118*8ccd4a63SDavid du Colombier * Memimage management 119*8ccd4a63SDavid du Colombier */ 120*8ccd4a63SDavid du Colombier 121*8ccd4a63SDavid du Colombier extern Memimage* allocmemimage(Rectangle, ulong); 122*8ccd4a63SDavid du Colombier extern Memimage* _allocmemimage(Rectangle, ulong); 123*8ccd4a63SDavid du Colombier extern Memimage* allocmemimaged(Rectangle, ulong, Memdata*, void*); 124*8ccd4a63SDavid du Colombier extern Memimage* readmemimage(int); 125*8ccd4a63SDavid du Colombier extern Memimage* creadmemimage(int); 126*8ccd4a63SDavid du Colombier extern int writememimage(int, Memimage*); 127*8ccd4a63SDavid du Colombier extern void freememimage(Memimage*); 128*8ccd4a63SDavid du Colombier extern void _freememimage(Memimage*); 129*8ccd4a63SDavid du Colombier extern int _loadmemimage(Memimage*, Rectangle, uchar*, int); 130*8ccd4a63SDavid du Colombier extern int _cloadmemimage(Memimage*, Rectangle, uchar*, int); 131*8ccd4a63SDavid du Colombier extern int _unloadmemimage(Memimage*, Rectangle, uchar*, int); 132*8ccd4a63SDavid du Colombier extern int loadmemimage(Memimage*, Rectangle, uchar*, int); 133*8ccd4a63SDavid du Colombier extern int cloadmemimage(Memimage*, Rectangle, uchar*, int); 134*8ccd4a63SDavid du Colombier extern int unloadmemimage(Memimage*, Rectangle, uchar*, int); 135*8ccd4a63SDavid du Colombier extern ulong* wordaddr(Memimage*, Point); 136*8ccd4a63SDavid du Colombier extern uchar* byteaddr(Memimage*, Point); 137*8ccd4a63SDavid du Colombier extern int drawclip(Memimage*, Rectangle*, Memimage*, Point*, Memimage*, Point*, Rectangle*, Rectangle*); 138*8ccd4a63SDavid du Colombier extern void memfillcolor(Memimage*, ulong); 139*8ccd4a63SDavid du Colombier extern void _memfillcolor(Memimage*, ulong); 140*8ccd4a63SDavid du Colombier extern int memsetchan(Memimage*, ulong); 141*8ccd4a63SDavid du Colombier extern ulong _rgbatoimg(Memimage*, ulong); 142*8ccd4a63SDavid du Colombier 143*8ccd4a63SDavid du Colombier /* 144*8ccd4a63SDavid du Colombier * Graphics 145*8ccd4a63SDavid du Colombier */ 146*8ccd4a63SDavid du Colombier extern void memdraw(Memimage*, Rectangle, Memimage*, Point, Memimage*, Point, int); 147*8ccd4a63SDavid du Colombier extern void memline(Memimage*, Point, Point, int, int, int, Memimage*, Point, int); 148*8ccd4a63SDavid du Colombier extern void mempoly(Memimage*, Point*, int, int, int, int, Memimage*, Point, int); 149*8ccd4a63SDavid du Colombier extern void memfillpoly(Memimage*, Point*, int, int, Memimage*, Point, int); 150*8ccd4a63SDavid du Colombier extern void _memfillpolysc(Memimage*, Point*, int, int, Memimage*, Point, int, int, int, int); 151*8ccd4a63SDavid du Colombier extern Memdrawparam* _memimagedrawsetup(Memimage*, Rectangle, Memimage*, Point, Memimage*, Point, int); 152*8ccd4a63SDavid du Colombier extern void _memimagedraw(Memdrawparam*); 153*8ccd4a63SDavid du Colombier extern void memimagedraw(Memimage*, Rectangle, Memimage*, Point, Memimage*, Point, int); 154*8ccd4a63SDavid du Colombier extern int hwdraw(Memdrawparam*); 155*8ccd4a63SDavid du Colombier extern void memimageline(Memimage*, Point, Point, int, int, int, Memimage*, Point, int); 156*8ccd4a63SDavid du Colombier extern void _memimageline(Memimage*, Point, Point, int, int, int, Memimage*, Point, Rectangle, int); 157*8ccd4a63SDavid du Colombier extern Point memimagestring(Memimage*, Point, Memimage*, Point, Memsubfont*, char*); 158*8ccd4a63SDavid du Colombier extern void memellipse(Memimage*, Point, int, int, int, Memimage*, Point, int); 159*8ccd4a63SDavid du Colombier extern void memarc(Memimage*, Point, int, int, int, Memimage*, Point, int, int, int); 160*8ccd4a63SDavid du Colombier extern Rectangle memlinebbox(Point, Point, int, int, int); 161*8ccd4a63SDavid du Colombier extern int memlineendsize(int); 162*8ccd4a63SDavid du Colombier extern void _memmkcmap(void); 163*8ccd4a63SDavid du Colombier extern void _memimageinit(void); 164*8ccd4a63SDavid du Colombier extern void memimageinit(void); 165*8ccd4a63SDavid du Colombier 166*8ccd4a63SDavid du Colombier /* 167*8ccd4a63SDavid du Colombier * Subfont management 168*8ccd4a63SDavid du Colombier */ 169*8ccd4a63SDavid du Colombier extern Memsubfont* allocmemsubfont(char*, int, int, int, Fontchar*, Memimage*); 170*8ccd4a63SDavid du Colombier extern Memsubfont* openmemsubfont(char*); 171*8ccd4a63SDavid du Colombier extern void freememsubfont(Memsubfont*); 172*8ccd4a63SDavid du Colombier extern Point memsubfontwidth(Memsubfont*, char*); 173*8ccd4a63SDavid du Colombier extern Memsubfont* getmemdefont(void); 174*8ccd4a63SDavid du Colombier 175*8ccd4a63SDavid du Colombier /* 176*8ccd4a63SDavid du Colombier * Predefined 177*8ccd4a63SDavid du Colombier */ 178*8ccd4a63SDavid du Colombier extern Memimage* memwhite; 179*8ccd4a63SDavid du Colombier extern Memimage* memblack; 180*8ccd4a63SDavid du Colombier extern Memimage* memopaque; 181*8ccd4a63SDavid du Colombier extern Memimage* memtransparent; 182*8ccd4a63SDavid du Colombier extern Memcmap *memdefcmap; 183*8ccd4a63SDavid du Colombier 184*8ccd4a63SDavid du Colombier /* 185*8ccd4a63SDavid du Colombier * Kernel interface 186*8ccd4a63SDavid du Colombier */ 187*8ccd4a63SDavid du Colombier void memimagemove(void*, void*); 188*8ccd4a63SDavid du Colombier 189*8ccd4a63SDavid du Colombier /* 190*8ccd4a63SDavid du Colombier * Kernel cruft 191*8ccd4a63SDavid du Colombier */ 192*8ccd4a63SDavid du Colombier extern void rdb(void); 193*8ccd4a63SDavid du Colombier extern int iprint(char*, ...); 194*8ccd4a63SDavid du Colombier extern int drawdebug; 195*8ccd4a63SDavid du Colombier 196*8ccd4a63SDavid du Colombier /* 197*8ccd4a63SDavid du Colombier * doprint interface: numbconv bit strings 198*8ccd4a63SDavid du Colombier */ 199*8ccd4a63SDavid du Colombier #ifdef VARARGCK 200*8ccd4a63SDavid du Colombier #pragma varargck argpos iprint 1 201*8ccd4a63SDavid du Colombier #pragma varargck type "llb" vlong 202*8ccd4a63SDavid du Colombier #pragma varargck type "llb" uvlong 203*8ccd4a63SDavid du Colombier #pragma varargck type "lb" long 204*8ccd4a63SDavid du Colombier #pragma varargck type "lb" ulong 205*8ccd4a63SDavid du Colombier #pragma varargck type "b" int 206*8ccd4a63SDavid du Colombier #pragma varargck type "b" uint 207*8ccd4a63SDavid du Colombier #endif 208*8ccd4a63SDavid du Colombier 209*8ccd4a63SDavid du Colombier extern ulong _pixelbits(Memimage*,Point); 210*8ccd4a63SDavid du Colombier extern ulong pixelbits(Memimage*, Point); 211