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