17dd7cddfSDavid du Colombier #pragma src "/sys/src/libmemdraw" 27dd7cddfSDavid du Colombier #pragma lib "libmemdraw.a" 37dd7cddfSDavid du Colombier 47dd7cddfSDavid du Colombier typedef struct Memimage Memimage; 57dd7cddfSDavid du Colombier typedef struct Memdata Memdata; 67dd7cddfSDavid du Colombier typedef struct Memsubfont Memsubfont; 77dd7cddfSDavid du Colombier typedef struct Memlayer Memlayer; 87dd7cddfSDavid du Colombier typedef struct Memcmap Memcmap; 97dd7cddfSDavid du Colombier typedef struct Memdrawparam Memdrawparam; 107dd7cddfSDavid du Colombier 11*12fd1c83SDavid du Colombier #pragma incomplete Memlayer 12*12fd1c83SDavid du Colombier 137dd7cddfSDavid du Colombier /* 147dd7cddfSDavid du Colombier * Memdata is allocated from main pool, but .data from the image pool. 157dd7cddfSDavid du Colombier * Memdata is allocated separately to permit patching its pointer after 167dd7cddfSDavid du Colombier * compaction when windows share the image data. 177dd7cddfSDavid du Colombier * The first word of data is a back pointer to the Memdata, to find 187dd7cddfSDavid du Colombier * The word to patch. 197dd7cddfSDavid du Colombier */ 207dd7cddfSDavid du Colombier 217dd7cddfSDavid du Colombier struct Memdata 227dd7cddfSDavid du Colombier { 237dd7cddfSDavid du Colombier ulong *base; /* allocated data pointer */ 247dd7cddfSDavid du Colombier uchar *bdata; /* pointer to first byte of actual data; word-aligned */ 257dd7cddfSDavid du Colombier int ref; /* number of Memimages using this data */ 267dd7cddfSDavid du Colombier void* imref; 277dd7cddfSDavid du Colombier int allocd; /* is this malloc'd? */ 287dd7cddfSDavid du Colombier }; 297dd7cddfSDavid du Colombier 307dd7cddfSDavid du Colombier enum { 317dd7cddfSDavid du Colombier Frepl = 1<<0, /* is replicated */ 327dd7cddfSDavid du Colombier Fsimple = 1<<1, /* is 1x1 */ 337dd7cddfSDavid du Colombier Fgrey = 1<<2, /* is grey */ 347dd7cddfSDavid du Colombier Falpha = 1<<3, /* has explicit alpha */ 357dd7cddfSDavid du Colombier Fcmap = 1<<4, /* has cmap channel */ 367dd7cddfSDavid du Colombier Fbytes = 1<<5, /* has only 8-bit channels */ 377dd7cddfSDavid du Colombier }; 387dd7cddfSDavid du Colombier 397dd7cddfSDavid du Colombier struct Memimage 407dd7cddfSDavid du Colombier { 417dd7cddfSDavid du Colombier Rectangle r; /* rectangle in data area, local coords */ 427dd7cddfSDavid du Colombier Rectangle clipr; /* clipping region */ 437dd7cddfSDavid du Colombier int depth; /* number of bits of storage per pixel */ 447dd7cddfSDavid du Colombier int nchan; /* number of channels */ 457dd7cddfSDavid du Colombier ulong chan; /* channel descriptions */ 467dd7cddfSDavid du Colombier Memcmap *cmap; 477dd7cddfSDavid du Colombier 487dd7cddfSDavid du Colombier Memdata *data; /* pointer to data; shared by windows in this image */ 497dd7cddfSDavid du Colombier int zero; /* data->bdata+zero==&byte containing (0,0) */ 507dd7cddfSDavid du Colombier ulong width; /* width in words of a single scan line */ 517dd7cddfSDavid du Colombier Memlayer *layer; /* nil if not a layer*/ 527dd7cddfSDavid du Colombier ulong flags; 537dd7cddfSDavid du Colombier 547dd7cddfSDavid du Colombier int shift[NChan]; 557dd7cddfSDavid du Colombier int mask[NChan]; 567dd7cddfSDavid du Colombier int nbits[NChan]; 577dd7cddfSDavid du Colombier }; 587dd7cddfSDavid du Colombier 597dd7cddfSDavid du Colombier struct Memcmap 607dd7cddfSDavid du Colombier { 617dd7cddfSDavid du Colombier uchar cmap2rgb[3*256]; 627dd7cddfSDavid du Colombier uchar rgb2cmap[16*16*16]; 637dd7cddfSDavid du Colombier }; 647dd7cddfSDavid du Colombier 657dd7cddfSDavid du Colombier /* 667dd7cddfSDavid du Colombier * Subfonts 677dd7cddfSDavid du Colombier * 687dd7cddfSDavid du Colombier * given char c, Subfont *f, Fontchar *i, and Point p, one says 697dd7cddfSDavid du Colombier * i = f->info+c; 707dd7cddfSDavid du Colombier * draw(b, Rect(p.x+i->left, p.y+i->top, 717dd7cddfSDavid du Colombier * p.x+i->left+((i+1)->x-i->x), p.y+i->bottom), 727dd7cddfSDavid du Colombier * color, f->bits, Pt(i->x, i->top)); 737dd7cddfSDavid du Colombier * p.x += i->width; 747dd7cddfSDavid du Colombier * to draw characters in the specified color (itself a Memimage) in Memimage b. 757dd7cddfSDavid du Colombier */ 767dd7cddfSDavid du Colombier 777dd7cddfSDavid du Colombier struct Memsubfont 787dd7cddfSDavid du Colombier { 797dd7cddfSDavid du Colombier char *name; 807dd7cddfSDavid du Colombier short n; /* number of chars in font */ 817dd7cddfSDavid du Colombier uchar height; /* height of bitmap */ 827dd7cddfSDavid du Colombier char ascent; /* top of bitmap to baseline */ 837dd7cddfSDavid du Colombier Fontchar *info; /* n+1 character descriptors */ 847dd7cddfSDavid du Colombier Memimage *bits; /* of font */ 857dd7cddfSDavid du Colombier }; 867dd7cddfSDavid du Colombier 877dd7cddfSDavid du Colombier /* 887dd7cddfSDavid du Colombier * Encapsulated parameters and information for sub-draw routines. 897dd7cddfSDavid du Colombier */ 907dd7cddfSDavid du Colombier enum { 917dd7cddfSDavid du Colombier Simplesrc=1<<0, 927dd7cddfSDavid du Colombier Simplemask=1<<1, 937dd7cddfSDavid du Colombier Replsrc=1<<2, 947dd7cddfSDavid du Colombier Replmask=1<<3, 957dd7cddfSDavid du Colombier Fullmask=1<<4, 967dd7cddfSDavid du Colombier }; 977dd7cddfSDavid du Colombier struct Memdrawparam 987dd7cddfSDavid du Colombier { 997dd7cddfSDavid du Colombier Memimage *dst; 1007dd7cddfSDavid du Colombier Rectangle r; 1017dd7cddfSDavid du Colombier Memimage *src; 1027dd7cddfSDavid du Colombier Rectangle sr; 1037dd7cddfSDavid du Colombier Memimage *mask; 1047dd7cddfSDavid du Colombier Rectangle mr; 1056a9fc400SDavid du Colombier int op; 1067dd7cddfSDavid du Colombier 1077dd7cddfSDavid du Colombier ulong state; 1087dd7cddfSDavid du Colombier ulong mval; /* if Simplemask, the mask pixel in mask format */ 1097dd7cddfSDavid du Colombier ulong mrgba; /* mval in rgba */ 1107dd7cddfSDavid du Colombier ulong sval; /* if Simplesrc, the source pixel in src format */ 1117dd7cddfSDavid du Colombier ulong srgba; /* sval in rgba */ 1127dd7cddfSDavid du Colombier ulong sdval; /* sval in dst format */ 1137dd7cddfSDavid du Colombier }; 1147dd7cddfSDavid du Colombier 1157dd7cddfSDavid du Colombier /* 1167dd7cddfSDavid du Colombier * Memimage management 1177dd7cddfSDavid du Colombier */ 1187dd7cddfSDavid du Colombier 1197dd7cddfSDavid du Colombier extern Memimage* allocmemimage(Rectangle, ulong); 1207dd7cddfSDavid du Colombier extern Memimage* allocmemimaged(Rectangle, ulong, Memdata*); 1217dd7cddfSDavid du Colombier extern Memimage* readmemimage(int); 1227dd7cddfSDavid du Colombier extern Memimage* creadmemimage(int); 1237dd7cddfSDavid du Colombier extern int writememimage(int, Memimage*); 1247dd7cddfSDavid du Colombier extern void freememimage(Memimage*); 1257dd7cddfSDavid du Colombier extern int loadmemimage(Memimage*, Rectangle, uchar*, int); 1267dd7cddfSDavid du Colombier extern int cloadmemimage(Memimage*, Rectangle, uchar*, int); 1277dd7cddfSDavid du Colombier extern int unloadmemimage(Memimage*, Rectangle, uchar*, int); 1287dd7cddfSDavid du Colombier extern ulong* wordaddr(Memimage*, Point); 1297dd7cddfSDavid du Colombier extern uchar* byteaddr(Memimage*, Point); 1307dd7cddfSDavid du Colombier extern int drawclip(Memimage*, Rectangle*, Memimage*, Point*, Memimage*, Point*, Rectangle*, Rectangle*); 1317dd7cddfSDavid du Colombier extern void memfillcolor(Memimage*, ulong); 1327dd7cddfSDavid du Colombier extern int memsetchan(Memimage*, ulong); 1337dd7cddfSDavid du Colombier 1347dd7cddfSDavid du Colombier /* 1357dd7cddfSDavid du Colombier * Graphics 1367dd7cddfSDavid du Colombier */ 1376a9fc400SDavid du Colombier extern void memdraw(Memimage*, Rectangle, Memimage*, Point, Memimage*, Point, int); 1386a9fc400SDavid du Colombier extern void memline(Memimage*, Point, Point, int, int, int, Memimage*, Point, int); 1396a9fc400SDavid du Colombier extern void mempoly(Memimage*, Point*, int, int, int, int, Memimage*, Point, int); 1406a9fc400SDavid du Colombier extern void memfillpoly(Memimage*, Point*, int, int, Memimage*, Point, int); 1416a9fc400SDavid du Colombier extern void _memfillpolysc(Memimage*, Point*, int, int, Memimage*, Point, int, int, int, int); 1426a9fc400SDavid du Colombier extern void memimagedraw(Memimage*, Rectangle, Memimage*, Point, Memimage*, Point, int); 1437dd7cddfSDavid du Colombier extern int hwdraw(Memdrawparam*); 1446a9fc400SDavid du Colombier extern void memimageline(Memimage*, Point, Point, int, int, int, Memimage*, Point, int); 1456a9fc400SDavid du Colombier extern void _memimageline(Memimage*, Point, Point, int, int, int, Memimage*, Point, Rectangle, int); 1467dd7cddfSDavid du Colombier extern Point memimagestring(Memimage*, Point, Memimage*, Point, Memsubfont*, char*); 1476a9fc400SDavid du Colombier extern void memellipse(Memimage*, Point, int, int, int, Memimage*, Point, int); 1486a9fc400SDavid du Colombier extern void memarc(Memimage*, Point, int, int, int, Memimage*, Point, int, int, int); 1497dd7cddfSDavid du Colombier extern Rectangle memlinebbox(Point, Point, int, int, int); 1507dd7cddfSDavid du Colombier extern int memlineendsize(int); 1517dd7cddfSDavid du Colombier extern void _memmkcmap(void); 1527dd7cddfSDavid du Colombier extern void memimageinit(void); 1537dd7cddfSDavid du Colombier 1547dd7cddfSDavid du Colombier /* 1557dd7cddfSDavid du Colombier * Subfont management 1567dd7cddfSDavid du Colombier */ 1577dd7cddfSDavid du Colombier extern Memsubfont* allocmemsubfont(char*, int, int, int, Fontchar*, Memimage*); 15880ee5cbfSDavid du Colombier extern Memsubfont* openmemsubfont(char*); 1597dd7cddfSDavid du Colombier extern void freememsubfont(Memsubfont*); 1607dd7cddfSDavid du Colombier extern Point memsubfontwidth(Memsubfont*, char*); 1617dd7cddfSDavid du Colombier extern Memsubfont* getmemdefont(void); 1627dd7cddfSDavid du Colombier 1637dd7cddfSDavid du Colombier /* 1647dd7cddfSDavid du Colombier * Predefined 1657dd7cddfSDavid du Colombier */ 1667dd7cddfSDavid du Colombier extern Memimage* memwhite; 1677dd7cddfSDavid du Colombier extern Memimage* memblack; 1687dd7cddfSDavid du Colombier extern Memimage* memopaque; 1697dd7cddfSDavid du Colombier extern Memimage* memtransparent; 1707dd7cddfSDavid du Colombier extern Memcmap *memdefcmap; 1717dd7cddfSDavid du Colombier 1727dd7cddfSDavid du Colombier /* 1737dd7cddfSDavid du Colombier * Kernel interface 1747dd7cddfSDavid du Colombier */ 1757dd7cddfSDavid du Colombier void memimagemove(void*, void*); 1767dd7cddfSDavid du Colombier 1777dd7cddfSDavid du Colombier /* 1787dd7cddfSDavid du Colombier * Kernel cruft 1797dd7cddfSDavid du Colombier */ 1807dd7cddfSDavid du Colombier extern void rdb(void); 1817dd7cddfSDavid du Colombier extern int iprint(char*, ...); 1827dd7cddfSDavid du Colombier #pragma varargck argpos iprint 1 1837dd7cddfSDavid du Colombier extern int drawdebug; 1847dd7cddfSDavid du Colombier 1857dd7cddfSDavid du Colombier /* 1867dd7cddfSDavid du Colombier * doprint interface: numbconv bit strings 1877dd7cddfSDavid du Colombier */ 1887dd7cddfSDavid du Colombier #pragma varargck type "llb" vlong 1897dd7cddfSDavid du Colombier #pragma varargck type "llb" uvlong 1907dd7cddfSDavid du Colombier #pragma varargck type "lb" long 1917dd7cddfSDavid du Colombier #pragma varargck type "lb" ulong 1927dd7cddfSDavid du Colombier #pragma varargck type "b" int 1937dd7cddfSDavid du Colombier #pragma varargck type "b" uint 1947dd7cddfSDavid du Colombier 195