xref: /plan9/sys/include/memdraw.h (revision 12fd1c83b21b4d1deeab2b58fe2c202d2038c714)
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