1 #pragma src "/sys/src/libmemdraw" 2 #pragma lib "libmemdraw.a" 3 4 typedef struct Memimage Memimage; 5 typedef struct Memdata Memdata; 6 typedef struct Memsubfont Memsubfont; 7 typedef struct Memlayer Memlayer; 8 typedef struct Memcmap Memcmap; 9 typedef struct Memdrawparam Memdrawparam; 10 11 #pragma incomplete Memlayer 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 59 struct Memcmap 60 { 61 uchar cmap2rgb[3*256]; 62 uchar rgb2cmap[16*16*16]; 63 }; 64 65 /* 66 * Subfonts 67 * 68 * given char c, Subfont *f, Fontchar *i, and Point p, one says 69 * i = f->info+c; 70 * draw(b, Rect(p.x+i->left, p.y+i->top, 71 * p.x+i->left+((i+1)->x-i->x), p.y+i->bottom), 72 * color, f->bits, Pt(i->x, i->top)); 73 * p.x += i->width; 74 * to draw characters in the specified color (itself a Memimage) in Memimage b. 75 */ 76 77 struct Memsubfont 78 { 79 char *name; 80 short n; /* number of chars in font */ 81 uchar height; /* height of bitmap */ 82 char ascent; /* top of bitmap to baseline */ 83 Fontchar *info; /* n+1 character descriptors */ 84 Memimage *bits; /* of font */ 85 }; 86 87 /* 88 * Encapsulated parameters and information for sub-draw routines. 89 */ 90 enum { 91 Simplesrc=1<<0, 92 Simplemask=1<<1, 93 Replsrc=1<<2, 94 Replmask=1<<3, 95 Fullmask=1<<4, 96 }; 97 struct Memdrawparam 98 { 99 Memimage *dst; 100 Rectangle r; 101 Memimage *src; 102 Rectangle sr; 103 Memimage *mask; 104 Rectangle mr; 105 int op; 106 107 ulong state; 108 ulong mval; /* if Simplemask, the mask pixel in mask format */ 109 ulong mrgba; /* mval in rgba */ 110 ulong sval; /* if Simplesrc, the source pixel in src format */ 111 ulong srgba; /* sval in rgba */ 112 ulong sdval; /* sval in dst format */ 113 }; 114 115 /* 116 * Memimage management 117 */ 118 119 extern Memimage* allocmemimage(Rectangle, ulong); 120 extern Memimage* allocmemimaged(Rectangle, ulong, Memdata*); 121 extern Memimage* readmemimage(int); 122 extern Memimage* creadmemimage(int); 123 extern int writememimage(int, Memimage*); 124 extern void freememimage(Memimage*); 125 extern int loadmemimage(Memimage*, Rectangle, uchar*, int); 126 extern int cloadmemimage(Memimage*, Rectangle, uchar*, int); 127 extern int unloadmemimage(Memimage*, Rectangle, uchar*, int); 128 extern ulong* wordaddr(Memimage*, Point); 129 extern uchar* byteaddr(Memimage*, Point); 130 extern int drawclip(Memimage*, Rectangle*, Memimage*, Point*, Memimage*, Point*, Rectangle*, Rectangle*); 131 extern void memfillcolor(Memimage*, ulong); 132 extern int memsetchan(Memimage*, ulong); 133 134 /* 135 * Graphics 136 */ 137 extern void memdraw(Memimage*, Rectangle, Memimage*, Point, Memimage*, Point, int); 138 extern void memline(Memimage*, Point, Point, int, int, int, Memimage*, Point, int); 139 extern void mempoly(Memimage*, Point*, int, int, int, int, Memimage*, Point, int); 140 extern void memfillpoly(Memimage*, Point*, int, int, Memimage*, Point, int); 141 extern void _memfillpolysc(Memimage*, Point*, int, int, Memimage*, Point, int, int, int, int); 142 extern void memimagedraw(Memimage*, Rectangle, Memimage*, Point, Memimage*, Point, int); 143 extern int hwdraw(Memdrawparam*); 144 extern void memimageline(Memimage*, Point, Point, int, int, int, Memimage*, Point, int); 145 extern void _memimageline(Memimage*, Point, Point, int, int, int, Memimage*, Point, Rectangle, int); 146 extern Point memimagestring(Memimage*, Point, Memimage*, Point, Memsubfont*, char*); 147 extern void memellipse(Memimage*, Point, int, int, int, Memimage*, Point, int); 148 extern void memarc(Memimage*, Point, int, int, int, Memimage*, Point, int, int, int); 149 extern Rectangle memlinebbox(Point, Point, int, int, int); 150 extern int memlineendsize(int); 151 extern void _memmkcmap(void); 152 extern void memimageinit(void); 153 154 /* 155 * Subfont management 156 */ 157 extern Memsubfont* allocmemsubfont(char*, int, int, int, Fontchar*, Memimage*); 158 extern Memsubfont* openmemsubfont(char*); 159 extern void freememsubfont(Memsubfont*); 160 extern Point memsubfontwidth(Memsubfont*, char*); 161 extern Memsubfont* getmemdefont(void); 162 163 /* 164 * Predefined 165 */ 166 extern Memimage* memwhite; 167 extern Memimage* memblack; 168 extern Memimage* memopaque; 169 extern Memimage* memtransparent; 170 extern Memcmap *memdefcmap; 171 172 /* 173 * Kernel interface 174 */ 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