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