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