xref: /plan9-contrib/sys/include/draw.h (revision bacfa46c74e1c310aff15aef9cb6bc4e6302513a)
17dd7cddfSDavid du Colombier #pragma src "/sys/src/libdraw"
27dd7cddfSDavid du Colombier #pragma lib "libdraw.a"
37dd7cddfSDavid du Colombier 
47dd7cddfSDavid du Colombier typedef struct	Cachefont Cachefont;
57dd7cddfSDavid du Colombier typedef struct	Cacheinfo Cacheinfo;
67dd7cddfSDavid du Colombier typedef struct	Cachesubf Cachesubf;
77dd7cddfSDavid du Colombier typedef struct	Display Display;
87dd7cddfSDavid du Colombier typedef struct	Font Font;
97dd7cddfSDavid du Colombier typedef struct	Fontchar Fontchar;
107dd7cddfSDavid du Colombier typedef struct	Image Image;
117dd7cddfSDavid du Colombier typedef struct	Mouse Mouse;
127dd7cddfSDavid du Colombier typedef struct	Point Point;
137dd7cddfSDavid du Colombier typedef struct	Rectangle Rectangle;
147dd7cddfSDavid du Colombier typedef struct	RGB RGB;
157dd7cddfSDavid du Colombier typedef struct	Screen Screen;
167dd7cddfSDavid du Colombier typedef struct	Subfont Subfont;
177dd7cddfSDavid du Colombier 
1812fd1c83SDavid du Colombier #pragma incomplete Mouse
1912fd1c83SDavid du Colombier 
207dd7cddfSDavid du Colombier #pragma varargck	type	"R"	Rectangle
217dd7cddfSDavid du Colombier #pragma varargck	type	"P"	Point
229a747e4fSDavid du Colombier extern	int	Rfmt(Fmt*);
239a747e4fSDavid du Colombier extern	int	Pfmt(Fmt*);
247dd7cddfSDavid du Colombier 
257dd7cddfSDavid du Colombier enum
267dd7cddfSDavid du Colombier {
277dd7cddfSDavid du Colombier 	DOpaque		= 0xFFFFFFFF,
2859cc4ca5SDavid du Colombier 	DTransparent	= 0x00000000,		/* only useful for allocimage, memfillcolor */
297dd7cddfSDavid du Colombier 	DBlack		= 0x000000FF,
307dd7cddfSDavid du Colombier 	DWhite		= 0xFFFFFFFF,
317dd7cddfSDavid du Colombier 	DRed		= 0xFF0000FF,
327dd7cddfSDavid du Colombier 	DGreen		= 0x00FF00FF,
337dd7cddfSDavid du Colombier 	DBlue		= 0x0000FFFF,
347dd7cddfSDavid du Colombier 	DCyan		= 0x00FFFFFF,
357dd7cddfSDavid du Colombier 	DMagenta		= 0xFF00FFFF,
367dd7cddfSDavid du Colombier 	DYellow		= 0xFFFF00FF,
377dd7cddfSDavid du Colombier 	DPaleyellow	= 0xFFFFAAFF,
387dd7cddfSDavid du Colombier 	DDarkyellow	= 0xEEEE9EFF,
397dd7cddfSDavid du Colombier 	DDarkgreen	= 0x448844FF,
407dd7cddfSDavid du Colombier 	DPalegreen	= 0xAAFFAAFF,
417dd7cddfSDavid du Colombier 	DMedgreen	= 0x88CC88FF,
427dd7cddfSDavid du Colombier 	DDarkblue	= 0x000055FF,
437dd7cddfSDavid du Colombier 	DPalebluegreen= 0xAAFFFFFF,
447dd7cddfSDavid du Colombier 	DPaleblue		= 0x0000BBFF,
457dd7cddfSDavid du Colombier 	DBluegreen	= 0x008888FF,
467dd7cddfSDavid du Colombier 	DGreygreen	= 0x55AAAAFF,
477dd7cddfSDavid du Colombier 	DPalegreygreen	= 0x9EEEEEFF,
487dd7cddfSDavid du Colombier 	DYellowgreen	= 0x99994CFF,
497dd7cddfSDavid du Colombier 	DMedblue		= 0x000099FF,
507dd7cddfSDavid du Colombier 	DGreyblue	= 0x005DBBFF,
517dd7cddfSDavid du Colombier 	DPalegreyblue	= 0x4993DDFF,
527dd7cddfSDavid du Colombier 	DPurpleblue	= 0x8888CCFF,
537dd7cddfSDavid du Colombier 
547dd7cddfSDavid du Colombier 	DNotacolor	= 0xFFFFFF00,
557dd7cddfSDavid du Colombier 	DNofill		= DNotacolor,
567dd7cddfSDavid du Colombier 
577dd7cddfSDavid du Colombier };
587dd7cddfSDavid du Colombier 
597dd7cddfSDavid du Colombier enum
607dd7cddfSDavid du Colombier {
617dd7cddfSDavid du Colombier 	Displaybufsize	= 8000,
627dd7cddfSDavid du Colombier 	ICOSSCALE	= 1024,
637dd7cddfSDavid du Colombier 	Borderwidth =	4,
647dd7cddfSDavid du Colombier };
657dd7cddfSDavid du Colombier 
667dd7cddfSDavid du Colombier enum
677dd7cddfSDavid du Colombier {
687dd7cddfSDavid du Colombier 	/* refresh methods */
697dd7cddfSDavid du Colombier 	Refbackup	= 0,
707dd7cddfSDavid du Colombier 	Refnone		= 1,
717dd7cddfSDavid du Colombier 	Refmesg		= 2
727dd7cddfSDavid du Colombier };
737dd7cddfSDavid du Colombier #define	NOREFRESH	((void*)-1)
747dd7cddfSDavid du Colombier 
757dd7cddfSDavid du Colombier enum
767dd7cddfSDavid du Colombier {
777dd7cddfSDavid du Colombier 	/* line ends */
787dd7cddfSDavid du Colombier 	Endsquare	= 0,
797dd7cddfSDavid du Colombier 	Enddisc		= 1,
807dd7cddfSDavid du Colombier 	Endarrow	= 2,
817dd7cddfSDavid du Colombier 	Endmask		= 0x1F
827dd7cddfSDavid du Colombier };
837dd7cddfSDavid du Colombier 
847dd7cddfSDavid du Colombier #define	ARROW(a, b, c)	(Endarrow|((a)<<5)|((b)<<14)|((c)<<23))
857dd7cddfSDavid du Colombier 
86ac57dd0bSDavid du Colombier typedef enum
879a747e4fSDavid du Colombier {
88ac57dd0bSDavid du Colombier 	/* Porter-Duff compositing operators */
899a747e4fSDavid du Colombier 	Clear	= 0,
909a747e4fSDavid du Colombier 
919a747e4fSDavid du Colombier 	SinD	= 8,
929a747e4fSDavid du Colombier 	DinS	= 4,
939a747e4fSDavid du Colombier 	SoutD	= 2,
949a747e4fSDavid du Colombier 	DoutS	= 1,
959a747e4fSDavid du Colombier 
969a747e4fSDavid du Colombier 	S		= SinD|SoutD,
979a747e4fSDavid du Colombier 	SoverD	= SinD|SoutD|DoutS,
989a747e4fSDavid du Colombier 	SatopD	= SinD|DoutS,
999a747e4fSDavid du Colombier 	SxorD	= SoutD|DoutS,
1009a747e4fSDavid du Colombier 
1019a747e4fSDavid du Colombier 	D		= DinS|DoutS,
1029a747e4fSDavid du Colombier 	DoverS	= DinS|DoutS|SoutD,
1039a747e4fSDavid du Colombier 	DatopS	= DinS|SoutD,
1049a747e4fSDavid du Colombier 	DxorS	= DoutS|SoutD,	/* == SxorD */
1056a9fc400SDavid du Colombier 
1066a9fc400SDavid du Colombier 	Ncomp = 12,
107ac57dd0bSDavid du Colombier } Drawop;
1089a747e4fSDavid du Colombier 
1099a747e4fSDavid du Colombier /*
1107dd7cddfSDavid du Colombier  * image channel descriptors
1117dd7cddfSDavid du Colombier  */
1127dd7cddfSDavid du Colombier enum {
1137dd7cddfSDavid du Colombier 	CRed = 0,
1147dd7cddfSDavid du Colombier 	CGreen,
1157dd7cddfSDavid du Colombier 	CBlue,
1167dd7cddfSDavid du Colombier 	CGrey,
1177dd7cddfSDavid du Colombier 	CAlpha,
1187dd7cddfSDavid du Colombier 	CMap,
1197dd7cddfSDavid du Colombier 	CIgnore,
1207dd7cddfSDavid du Colombier 	NChan,
1217dd7cddfSDavid du Colombier };
1227dd7cddfSDavid du Colombier 
1237dd7cddfSDavid du Colombier #define __DC(type, nbits)	((((type)&15)<<4)|((nbits)&15))
1247dd7cddfSDavid du Colombier #define CHAN1(a,b)	__DC(a,b)
1257dd7cddfSDavid du Colombier #define CHAN2(a,b,c,d)	(CHAN1((a),(b))<<8|__DC((c),(d)))
1267dd7cddfSDavid du Colombier #define CHAN3(a,b,c,d,e,f)	(CHAN2((a),(b),(c),(d))<<8|__DC((e),(f)))
1277dd7cddfSDavid du Colombier #define CHAN4(a,b,c,d,e,f,g,h)	(CHAN3((a),(b),(c),(d),(e),(f))<<8|__DC((g),(h)))
1287dd7cddfSDavid du Colombier 
1297dd7cddfSDavid du Colombier #define NBITS(c) ((c)&15)
1307dd7cddfSDavid du Colombier #define TYPE(c) (((c)>>4)&15)
1317dd7cddfSDavid du Colombier 
1327dd7cddfSDavid du Colombier enum {
1337dd7cddfSDavid du Colombier 	GREY1	= CHAN1(CGrey, 1),
1347dd7cddfSDavid du Colombier 	GREY2	= CHAN1(CGrey, 2),
1357dd7cddfSDavid du Colombier 	GREY4	= CHAN1(CGrey, 4),
1367dd7cddfSDavid du Colombier 	GREY8	= CHAN1(CGrey, 8),
1377dd7cddfSDavid du Colombier 	CMAP8	= CHAN1(CMap, 8),
1387dd7cddfSDavid du Colombier 	RGB15	= CHAN4(CIgnore, 1, CRed, 5, CGreen, 5, CBlue, 5),
1397dd7cddfSDavid du Colombier 	RGB16	= CHAN3(CRed, 5, CGreen, 6, CBlue, 5),
1407dd7cddfSDavid du Colombier 	RGB24	= CHAN3(CRed, 8, CGreen, 8, CBlue, 8),
1417dd7cddfSDavid du Colombier 	RGBA32	= CHAN4(CRed, 8, CGreen, 8, CBlue, 8, CAlpha, 8),
1427dd7cddfSDavid du Colombier 	ARGB32	= CHAN4(CAlpha, 8, CRed, 8, CGreen, 8, CBlue, 8),	/* stupid VGAs */
1437dd7cddfSDavid du Colombier 	XRGB32	= CHAN4(CIgnore, 8, CRed, 8, CGreen, 8, CBlue, 8),
144668c4144SDavid du Colombier 	BGR24	= CHAN3(CBlue, 8, CGreen, 8, CRed, 8),
145668c4144SDavid du Colombier 	ABGR32	= CHAN4(CAlpha, 8, CBlue, 8, CGreen, 8, CRed, 8),
146668c4144SDavid du Colombier 	XBGR32	= CHAN4(CIgnore, 8, CBlue, 8, CGreen, 8, CRed, 8),
1477dd7cddfSDavid du Colombier };
1487dd7cddfSDavid du Colombier 
1497dd7cddfSDavid du Colombier extern	char*	chantostr(char*, ulong);
1507dd7cddfSDavid du Colombier extern	ulong	strtochan(char*);
1517dd7cddfSDavid du Colombier extern	int		chantodepth(ulong);
1527dd7cddfSDavid du Colombier 
1537dd7cddfSDavid du Colombier struct	Point
1547dd7cddfSDavid du Colombier {
1557dd7cddfSDavid du Colombier 	int	x;
1567dd7cddfSDavid du Colombier 	int	y;
1577dd7cddfSDavid du Colombier };
1587dd7cddfSDavid du Colombier 
1597dd7cddfSDavid du Colombier struct Rectangle
1607dd7cddfSDavid du Colombier {
1617dd7cddfSDavid du Colombier 	Point	min;
1627dd7cddfSDavid du Colombier 	Point	max;
1637dd7cddfSDavid du Colombier };
1647dd7cddfSDavid du Colombier 
1657dd7cddfSDavid du Colombier typedef void	(*Reffn)(Image*, Rectangle, void*);
1667dd7cddfSDavid du Colombier 
1677dd7cddfSDavid du Colombier struct Screen
1687dd7cddfSDavid du Colombier {
1697dd7cddfSDavid du Colombier 	Display	*display;	/* display holding data */
1707dd7cddfSDavid du Colombier 	int	id;		/* id of system-held Screen */
1717dd7cddfSDavid du Colombier 	Image	*image;		/* unused; for reference only */
1727dd7cddfSDavid du Colombier 	Image	*fill;		/* color to paint behind windows */
1737dd7cddfSDavid du Colombier };
1747dd7cddfSDavid du Colombier 
1757dd7cddfSDavid du Colombier struct Display
1767dd7cddfSDavid du Colombier {
1777dd7cddfSDavid du Colombier 	QLock		qlock;
1787dd7cddfSDavid du Colombier 	int		locking;	/*program is using lockdisplay */
1797dd7cddfSDavid du Colombier 	int		dirno;
1807dd7cddfSDavid du Colombier 	int		fd;
1817dd7cddfSDavid du Colombier 	int		reffd;
1827dd7cddfSDavid du Colombier 	int		ctlfd;
1837dd7cddfSDavid du Colombier 	int		imageid;
1847dd7cddfSDavid du Colombier 	int		local;
1857dd7cddfSDavid du Colombier 	void		(*error)(Display*, char*);
1867dd7cddfSDavid du Colombier 	char		*devdir;
1877dd7cddfSDavid du Colombier 	char		*windir;
1887dd7cddfSDavid du Colombier 	char		oldlabel[64];
1897dd7cddfSDavid du Colombier 	ulong		dataqid;
1907dd7cddfSDavid du Colombier 	Image		*white;
1917dd7cddfSDavid du Colombier 	Image		*black;
1927dd7cddfSDavid du Colombier 	Image		*opaque;
1937dd7cddfSDavid du Colombier 	Image		*transparent;
1949a747e4fSDavid du Colombier 	Image		*image;
1959a747e4fSDavid du Colombier 	uchar		*buf;
1969a747e4fSDavid du Colombier 	int		bufsize;
1977dd7cddfSDavid du Colombier 	uchar		*bufp;
1987dd7cddfSDavid du Colombier 	Font		*defaultfont;
1997dd7cddfSDavid du Colombier 	Subfont		*defaultsubfont;
2007dd7cddfSDavid du Colombier 	Image		*windows;
2019a747e4fSDavid du Colombier 	Image		*screenimage;
2029a747e4fSDavid du Colombier 	int		_isnewdisplay;
2037dd7cddfSDavid du Colombier };
2047dd7cddfSDavid du Colombier 
2057dd7cddfSDavid du Colombier struct Image
2067dd7cddfSDavid du Colombier {
2077dd7cddfSDavid du Colombier 	Display		*display;	/* display holding data */
2087dd7cddfSDavid du Colombier 	int		id;		/* id of system-held Image */
2097dd7cddfSDavid du Colombier 	Rectangle	r;		/* rectangle in data area, local coords */
2107dd7cddfSDavid du Colombier 	Rectangle 	clipr;		/* clipping region */
2117dd7cddfSDavid du Colombier 	int		depth;		/* number of bits per pixel */
2127dd7cddfSDavid du Colombier 	ulong		chan;
2137dd7cddfSDavid du Colombier 	int		repl;		/* flag: data replicates to tile clipr */
2147dd7cddfSDavid du Colombier 	Screen		*screen;	/* 0 if not a window */
2157dd7cddfSDavid du Colombier 	Image		*next;	/* next in list of windows */
2167dd7cddfSDavid du Colombier };
2177dd7cddfSDavid du Colombier 
2187dd7cddfSDavid du Colombier struct RGB
2197dd7cddfSDavid du Colombier {
2207dd7cddfSDavid du Colombier 	ulong	red;
2217dd7cddfSDavid du Colombier 	ulong	green;
2227dd7cddfSDavid du Colombier 	ulong	blue;
2237dd7cddfSDavid du Colombier };
2247dd7cddfSDavid du Colombier 
2257dd7cddfSDavid du Colombier /*
2267dd7cddfSDavid du Colombier  * Subfonts
2277dd7cddfSDavid du Colombier  *
2287dd7cddfSDavid du Colombier  * given char c, Subfont *f, Fontchar *i, and Point p, one says
2297dd7cddfSDavid du Colombier  *	i = f->info+c;
2307dd7cddfSDavid du Colombier  *	draw(b, Rect(p.x+i->left, p.y+i->top,
2317dd7cddfSDavid du Colombier  *		p.x+i->left+((i+1)->x-i->x), p.y+i->bottom),
2327dd7cddfSDavid du Colombier  *		color, f->bits, Pt(i->x, i->top));
2337dd7cddfSDavid du Colombier  *	p.x += i->width;
2347dd7cddfSDavid du Colombier  * to draw characters in the specified color (itself an Image) in Image b.
2357dd7cddfSDavid du Colombier  */
2367dd7cddfSDavid du Colombier 
2377dd7cddfSDavid du Colombier struct	Fontchar
2387dd7cddfSDavid du Colombier {
2397dd7cddfSDavid du Colombier 	int		x;		/* left edge of bits */
2407dd7cddfSDavid du Colombier 	uchar		top;		/* first non-zero scan-line */
2417dd7cddfSDavid du Colombier 	uchar		bottom;		/* last non-zero scan-line + 1 */
2427dd7cddfSDavid du Colombier 	char		left;		/* offset of baseline */
2437dd7cddfSDavid du Colombier 	uchar		width;		/* width of baseline */
2447dd7cddfSDavid du Colombier };
2457dd7cddfSDavid du Colombier 
2467dd7cddfSDavid du Colombier struct	Subfont
2477dd7cddfSDavid du Colombier {
2487dd7cddfSDavid du Colombier 	char		*name;
2497dd7cddfSDavid du Colombier 	short		n;		/* number of chars in font */
2507dd7cddfSDavid du Colombier 	uchar		height;		/* height of image */
2517dd7cddfSDavid du Colombier 	char		ascent;		/* top of image to baseline */
2527dd7cddfSDavid du Colombier 	Fontchar 	*info;		/* n+1 character descriptors */
2537dd7cddfSDavid du Colombier 	Image		*bits;		/* of font */
25480ee5cbfSDavid du Colombier 	int		ref;
2557dd7cddfSDavid du Colombier };
2567dd7cddfSDavid du Colombier 
2577dd7cddfSDavid du Colombier enum
2587dd7cddfSDavid du Colombier {
2597dd7cddfSDavid du Colombier 	/* starting values */
2607dd7cddfSDavid du Colombier 	LOG2NFCACHE =	6,
2617dd7cddfSDavid du Colombier 	NFCACHE =	(1<<LOG2NFCACHE),	/* #chars cached */
2627dd7cddfSDavid du Colombier 	NFLOOK =	5,			/* #chars to scan in cache */
2637dd7cddfSDavid du Colombier 	NFSUBF =	2,			/* #subfonts to cache */
2647dd7cddfSDavid du Colombier 	/* max value */
2657dd7cddfSDavid du Colombier 	MAXFCACHE =	1024+NFLOOK,		/* upper limit */
2667dd7cddfSDavid du Colombier 	MAXSUBF =	50,			/* generous upper limit */
2677dd7cddfSDavid du Colombier 	/* deltas */
2687dd7cddfSDavid du Colombier 	DSUBF = 	4,
2697dd7cddfSDavid du Colombier 	/* expiry ages */
2707dd7cddfSDavid du Colombier 	SUBFAGE	=	10000,
2717dd7cddfSDavid du Colombier 	CACHEAGE =	10000
2727dd7cddfSDavid du Colombier };
2737dd7cddfSDavid du Colombier 
2747dd7cddfSDavid du Colombier struct Cachefont
2757dd7cddfSDavid du Colombier {
2767dd7cddfSDavid du Colombier 	Rune		min;	/* lowest rune value to be taken from subfont */
2777dd7cddfSDavid du Colombier 	Rune		max;	/* highest rune value+1 to be taken from subfont */
2787dd7cddfSDavid du Colombier 	int		offset;	/* position in subfont of character at min */
2797dd7cddfSDavid du Colombier 	char		*name;			/* stored in font */
2807dd7cddfSDavid du Colombier 	char		*subfontname;		/* to access subfont */
2817dd7cddfSDavid du Colombier };
2827dd7cddfSDavid du Colombier 
2837dd7cddfSDavid du Colombier struct Cacheinfo
2847dd7cddfSDavid du Colombier {
2857dd7cddfSDavid du Colombier 	ushort		x;		/* left edge of bits */
2867dd7cddfSDavid du Colombier 	uchar		width;		/* width of baseline */
2877dd7cddfSDavid du Colombier 	schar		left;		/* offset of baseline */
2887dd7cddfSDavid du Colombier 	Rune		value;	/* value of character at this slot in cache */
2897dd7cddfSDavid du Colombier 	ushort		age;
2907dd7cddfSDavid du Colombier };
2917dd7cddfSDavid du Colombier 
2927dd7cddfSDavid du Colombier struct Cachesubf
2937dd7cddfSDavid du Colombier {
2947dd7cddfSDavid du Colombier 	ulong		age;	/* for replacement */
2957dd7cddfSDavid du Colombier 	Cachefont	*cf;	/* font info that owns us */
2967dd7cddfSDavid du Colombier 	Subfont		*f;	/* attached subfont */
2977dd7cddfSDavid du Colombier };
2987dd7cddfSDavid du Colombier 
2997dd7cddfSDavid du Colombier struct Font
3007dd7cddfSDavid du Colombier {
3017dd7cddfSDavid du Colombier 	char		*name;
3027dd7cddfSDavid du Colombier 	Display		*display;
3037dd7cddfSDavid du Colombier 	short		height;	/* max height of image, interline spacing */
3047dd7cddfSDavid du Colombier 	short		ascent;	/* top of image to baseline */
3057dd7cddfSDavid du Colombier 	short		width;	/* widest so far; used in caching only */
3067dd7cddfSDavid du Colombier 	short		nsub;	/* number of subfonts */
3077dd7cddfSDavid du Colombier 	ulong		age;	/* increasing counter; used for LRU */
3087dd7cddfSDavid du Colombier 	int		maxdepth;	/* maximum depth of all loaded subfonts */
3097dd7cddfSDavid du Colombier 	int		ncache;	/* size of cache */
3107dd7cddfSDavid du Colombier 	int		nsubf;	/* size of subfont list */
3117dd7cddfSDavid du Colombier 	Cacheinfo	*cache;
3127dd7cddfSDavid du Colombier 	Cachesubf	*subf;
3137dd7cddfSDavid du Colombier 	Cachefont	**sub;	/* as read from file */
3147dd7cddfSDavid du Colombier 	Image		*cacheimage;
3157dd7cddfSDavid du Colombier };
3167dd7cddfSDavid du Colombier 
3177dd7cddfSDavid du Colombier #define	Dx(r)	((r).max.x-(r).min.x)
3187dd7cddfSDavid du Colombier #define	Dy(r)	((r).max.y-(r).min.y)
319a8453668SDavid du Colombier 
320a8453668SDavid du Colombier /*
321a8453668SDavid du Colombier  * One of a kind
322a8453668SDavid du Colombier  */
323a8453668SDavid du Colombier extern int		mousescrollsize(int);
3247dd7cddfSDavid du Colombier 
3257dd7cddfSDavid du Colombier /*
3267dd7cddfSDavid du Colombier  * Image management
3277dd7cddfSDavid du Colombier  */
3287dd7cddfSDavid du Colombier extern Image*	_allocimage(Image*, Display*, Rectangle, ulong, int, ulong, int, int);
3297dd7cddfSDavid du Colombier extern Image*	allocimage(Display*, Rectangle, ulong, int, ulong);
3307dd7cddfSDavid du Colombier extern uchar*	bufimage(Display*, int);
3317dd7cddfSDavid du Colombier extern int	bytesperline(Rectangle, int);
3327dd7cddfSDavid du Colombier extern void	closedisplay(Display*);
3337dd7cddfSDavid du Colombier extern void	drawerror(Display*, char*);
3347dd7cddfSDavid du Colombier extern int	flushimage(Display*, int);
3357dd7cddfSDavid du Colombier extern int	freeimage(Image*);
3367dd7cddfSDavid du Colombier extern int	_freeimage1(Image*);
3377dd7cddfSDavid du Colombier extern int	geninitdraw(char*, void(*)(Display*, char*), char*, char*, char*, int);
3387dd7cddfSDavid du Colombier extern int	initdraw(void(*)(Display*, char*), char*, char*);
339d9306527SDavid du Colombier extern int	newwindow(char*);
3407dd7cddfSDavid du Colombier extern Display*	initdisplay(char*, char*, void(*)(Display*, char*));
3417dd7cddfSDavid du Colombier extern int	loadimage(Image*, Rectangle, uchar*, int);
34280ee5cbfSDavid du Colombier extern int	cloadimage(Image*, Rectangle, uchar*, int);
3437dd7cddfSDavid du Colombier extern int	getwindow(Display*, int);
34480ee5cbfSDavid du Colombier extern int	gengetwindow(Display*, char*, Image**, Screen**, int);
3457dd7cddfSDavid du Colombier extern Image* readimage(Display*, int, int);
3467dd7cddfSDavid du Colombier extern Image* creadimage(Display*, int, int);
3477dd7cddfSDavid du Colombier extern int	unloadimage(Image*, Rectangle, uchar*, int);
3487dd7cddfSDavid du Colombier extern int	wordsperline(Rectangle, int);
3497dd7cddfSDavid du Colombier extern int	writeimage(int, Image*, int);
3507dd7cddfSDavid du Colombier extern Image*	namedimage(Display*, char*);
3517dd7cddfSDavid du Colombier extern int	nameimage(Image*, char*, int);
3527dd7cddfSDavid du Colombier extern Image* allocimagemix(Display*, ulong, ulong);
3537dd7cddfSDavid du Colombier 
3547dd7cddfSDavid du Colombier /*
3557dd7cddfSDavid du Colombier  * Colors
3567dd7cddfSDavid du Colombier  */
3577dd7cddfSDavid du Colombier extern	void	readcolmap(Display*, RGB*);
3587dd7cddfSDavid du Colombier extern	void	writecolmap(Display*, RGB*);
35980ee5cbfSDavid du Colombier extern	ulong	setalpha(ulong, uchar);
3607dd7cddfSDavid du Colombier 
3617dd7cddfSDavid du Colombier /*
3627dd7cddfSDavid du Colombier  * Windows
3637dd7cddfSDavid du Colombier  */
3647dd7cddfSDavid du Colombier extern Screen*	allocscreen(Image*, Image*, int);
3657dd7cddfSDavid du Colombier extern Image*	_allocwindow(Image*, Screen*, Rectangle, int, ulong);
3667dd7cddfSDavid du Colombier extern Image*	allocwindow(Screen*, Rectangle, int, ulong);
3677dd7cddfSDavid du Colombier extern void	bottomnwindows(Image**, int);
3687dd7cddfSDavid du Colombier extern void	bottomwindow(Image*);
3697dd7cddfSDavid du Colombier extern int	freescreen(Screen*);
3707dd7cddfSDavid du Colombier extern Screen*	publicscreen(Display*, int, ulong);
3717dd7cddfSDavid du Colombier extern void	topnwindows(Image**, int);
3727dd7cddfSDavid du Colombier extern void	topwindow(Image*);
3737dd7cddfSDavid du Colombier extern int	originwindow(Image*, Point, Point);
3747dd7cddfSDavid du Colombier 
3757dd7cddfSDavid du Colombier /*
3767dd7cddfSDavid du Colombier  * Geometry
3777dd7cddfSDavid du Colombier  */
3787dd7cddfSDavid du Colombier extern Point		Pt(int, int);
3797dd7cddfSDavid du Colombier extern Rectangle	Rect(int, int, int, int);
3807dd7cddfSDavid du Colombier extern Rectangle	Rpt(Point, Point);
3817dd7cddfSDavid du Colombier extern Point		addpt(Point, Point);
3827dd7cddfSDavid du Colombier extern Point		subpt(Point, Point);
3837dd7cddfSDavid du Colombier extern Point		divpt(Point, int);
3847dd7cddfSDavid du Colombier extern Point		mulpt(Point, int);
3857dd7cddfSDavid du Colombier extern int		eqpt(Point, Point);
3867dd7cddfSDavid du Colombier extern int		eqrect(Rectangle, Rectangle);
3877dd7cddfSDavid du Colombier extern Rectangle	insetrect(Rectangle, int);
3887dd7cddfSDavid du Colombier extern Rectangle	rectaddpt(Rectangle, Point);
3897dd7cddfSDavid du Colombier extern Rectangle	rectsubpt(Rectangle, Point);
3907dd7cddfSDavid du Colombier extern Rectangle	canonrect(Rectangle);
3917dd7cddfSDavid du Colombier extern int		rectXrect(Rectangle, Rectangle);
3927dd7cddfSDavid du Colombier extern int		rectinrect(Rectangle, Rectangle);
3937dd7cddfSDavid du Colombier extern void		combinerect(Rectangle*, Rectangle);
3947dd7cddfSDavid du Colombier extern int		rectclip(Rectangle*, Rectangle);
3957dd7cddfSDavid du Colombier extern int		ptinrect(Point, Rectangle);
3967dd7cddfSDavid du Colombier extern void		replclipr(Image*, int, Rectangle);
3977dd7cddfSDavid du Colombier extern int		drawreplxy(int, int, int);	/* used to be drawsetxy */
3987dd7cddfSDavid du Colombier extern Point	drawrepl(Rectangle, Point);
3997dd7cddfSDavid du Colombier extern int		rgb2cmap(int, int, int);
4007dd7cddfSDavid du Colombier extern int		cmap2rgb(int);
4017dd7cddfSDavid du Colombier extern int		cmap2rgba(int);
4027dd7cddfSDavid du Colombier extern void		icossin(int, int*, int*);
4037dd7cddfSDavid du Colombier extern void		icossin2(int, int, int*, int*);
4047dd7cddfSDavid du Colombier 
4057dd7cddfSDavid du Colombier /*
4067dd7cddfSDavid du Colombier  * Graphics
4077dd7cddfSDavid du Colombier  */
4087dd7cddfSDavid du Colombier extern void	draw(Image*, Rectangle, Image*, Image*, Point);
409ac57dd0bSDavid du Colombier extern void	drawop(Image*, Rectangle, Image*, Image*, Point, Drawop);
4107dd7cddfSDavid du Colombier extern void	gendraw(Image*, Rectangle, Image*, Point, Image*, Point);
411ac57dd0bSDavid du Colombier extern void	gendrawop(Image*, Rectangle, Image*, Point, Image*, Point, Drawop);
4127dd7cddfSDavid du Colombier extern void	line(Image*, Point, Point, int, int, int, Image*, Point);
413ac57dd0bSDavid du Colombier extern void	lineop(Image*, Point, Point, int, int, int, Image*, Point, Drawop);
4147dd7cddfSDavid du Colombier extern void	poly(Image*, Point*, int, int, int, int, Image*, Point);
415ac57dd0bSDavid du Colombier extern void	polyop(Image*, Point*, int, int, int, int, Image*, Point, Drawop);
4167dd7cddfSDavid du Colombier extern void	fillpoly(Image*, Point*, int, int, Image*, Point);
417ac57dd0bSDavid du Colombier extern void	fillpolyop(Image*, Point*, int, int, Image*, Point, Drawop);
4187dd7cddfSDavid du Colombier extern Point	string(Image*, Point, Image*, Point, Font*, char*);
419ac57dd0bSDavid du Colombier extern Point	stringop(Image*, Point, Image*, Point, Font*, char*, Drawop);
4207dd7cddfSDavid du Colombier extern Point	stringn(Image*, Point, Image*, Point, Font*, char*, int);
421ac57dd0bSDavid du Colombier extern Point	stringnop(Image*, Point, Image*, Point, Font*, char*, int, Drawop);
4227dd7cddfSDavid du Colombier extern Point	runestring(Image*, Point, Image*, Point, Font*, Rune*);
423ac57dd0bSDavid du Colombier extern Point	runestringop(Image*, Point, Image*, Point, Font*, Rune*, Drawop);
4247dd7cddfSDavid du Colombier extern Point	runestringn(Image*, Point, Image*, Point, Font*, Rune*, int);
425ac57dd0bSDavid du Colombier extern Point	runestringnop(Image*, Point, Image*, Point, Font*, Rune*, int, Drawop);
4267dd7cddfSDavid du Colombier extern Point	stringbg(Image*, Point, Image*, Point, Font*, char*, Image*, Point);
427ac57dd0bSDavid du Colombier extern Point	stringbgop(Image*, Point, Image*, Point, Font*, char*, Image*, Point, Drawop);
4287dd7cddfSDavid du Colombier extern Point	stringnbg(Image*, Point, Image*, Point, Font*, char*, int, Image*, Point);
429ac57dd0bSDavid du Colombier extern Point	stringnbgop(Image*, Point, Image*, Point, Font*, char*, int, Image*, Point, Drawop);
4307dd7cddfSDavid du Colombier extern Point	runestringbg(Image*, Point, Image*, Point, Font*, Rune*, Image*, Point);
431ac57dd0bSDavid du Colombier extern Point	runestringbgop(Image*, Point, Image*, Point, Font*, Rune*, Image*, Point, Drawop);
4327dd7cddfSDavid du Colombier extern Point	runestringnbg(Image*, Point, Image*, Point, Font*, Rune*, int, Image*, Point);
433ac57dd0bSDavid du Colombier extern Point	runestringnbgop(Image*, Point, Image*, Point, Font*, Rune*, int, Image*, Point, Drawop);
434ac57dd0bSDavid du Colombier extern Point	_string(Image*, Point, Image*, Point, Font*, char*, Rune*, int, Rectangle, Image*, Point, Drawop);
4357dd7cddfSDavid du Colombier extern Point	stringsubfont(Image*, Point, Image*, Subfont*, char*);
4367dd7cddfSDavid du Colombier extern int		bezier(Image*, Point, Point, Point, Point, int, int, int, Image*, Point);
437ac57dd0bSDavid du Colombier extern int		bezierop(Image*, Point, Point, Point, Point, int, int, int, Image*, Point, Drawop);
4387dd7cddfSDavid du Colombier extern int		bezspline(Image*, Point*, int, int, int, int, Image*, Point);
439ac57dd0bSDavid du Colombier extern int		bezsplineop(Image*, Point*, int, int, int, int, Image*, Point, Drawop);
440ac57dd0bSDavid du Colombier extern int		bezsplinepts(Point*, int, Point**);
4417dd7cddfSDavid du Colombier extern int		fillbezier(Image*, Point, Point, Point, Point, int, Image*, Point);
442ac57dd0bSDavid du Colombier extern int		fillbezierop(Image*, Point, Point, Point, Point, int, Image*, Point, Drawop);
4437dd7cddfSDavid du Colombier extern int		fillbezspline(Image*, Point*, int, int, Image*, Point);
444ac57dd0bSDavid du Colombier extern int		fillbezsplineop(Image*, Point*, int, int, Image*, Point, Drawop);
4457dd7cddfSDavid du Colombier extern void	ellipse(Image*, Point, int, int, int, Image*, Point);
446ac57dd0bSDavid du Colombier extern void	ellipseop(Image*, Point, int, int, int, Image*, Point, Drawop);
4477dd7cddfSDavid du Colombier extern void	fillellipse(Image*, Point, int, int, Image*, Point);
448ac57dd0bSDavid du Colombier extern void	fillellipseop(Image*, Point, int, int, Image*, Point, Drawop);
4497dd7cddfSDavid du Colombier extern void	arc(Image*, Point, int, int, int, Image*, Point, int, int);
450ac57dd0bSDavid du Colombier extern void	arcop(Image*, Point, int, int, int, Image*, Point, int, int, Drawop);
4517dd7cddfSDavid du Colombier extern void	fillarc(Image*, Point, int, int, Image*, Point, int, int);
452ac57dd0bSDavid du Colombier extern void	fillarcop(Image*, Point, int, int, Image*, Point, int, int, Drawop);
4537dd7cddfSDavid du Colombier extern void	border(Image*, Rectangle, int, Image*, Point);
454ac57dd0bSDavid du Colombier extern void	borderop(Image*, Rectangle, int, Image*, Point, Drawop);
4557dd7cddfSDavid du Colombier 
4567dd7cddfSDavid du Colombier /*
4577dd7cddfSDavid du Colombier  * Font management
4587dd7cddfSDavid du Colombier  */
4597dd7cddfSDavid du Colombier extern Font*	openfont(Display*, char*);
4607dd7cddfSDavid du Colombier extern Font*	buildfont(Display*, char*, char*);
4617dd7cddfSDavid du Colombier extern void	freefont(Font*);
4627dd7cddfSDavid du Colombier extern Font*	mkfont(Subfont*, Rune);
4637dd7cddfSDavid du Colombier extern int	cachechars(Font*, char**, Rune**, ushort*, int, int*, char**);
4647dd7cddfSDavid du Colombier extern void	agefont(Font*);
4657dd7cddfSDavid du Colombier extern Subfont*	allocsubfont(char*, int, int, int, Fontchar*, Image*);
4667dd7cddfSDavid du Colombier extern Subfont*	lookupsubfont(Display*, char*);
4677dd7cddfSDavid du Colombier extern void	installsubfont(char*, Subfont*);
4687dd7cddfSDavid du Colombier extern void	uninstallsubfont(Subfont*);
4697dd7cddfSDavid du Colombier extern void	freesubfont(Subfont*);
4707dd7cddfSDavid du Colombier extern Subfont*	readsubfont(Display*, char*, int, int);
4717dd7cddfSDavid du Colombier extern Subfont*	readsubfonti(Display*, char*, int, Image*, int);
4727dd7cddfSDavid du Colombier extern int	writesubfont(int, Subfont*);
4737dd7cddfSDavid du Colombier extern void	_unpackinfo(Fontchar*, uchar*, int);
4747dd7cddfSDavid du Colombier extern Point	stringsize(Font*, char*);
4757dd7cddfSDavid du Colombier extern int	stringwidth(Font*, char*);
4767dd7cddfSDavid du Colombier extern int	stringnwidth(Font*, char*, int);
4777dd7cddfSDavid du Colombier extern Point	runestringsize(Font*, Rune*);
4787dd7cddfSDavid du Colombier extern int	runestringwidth(Font*, Rune*);
4797dd7cddfSDavid du Colombier extern int	runestringnwidth(Font*, Rune*, int);
4807dd7cddfSDavid du Colombier extern Point	strsubfontwidth(Subfont*, char*);
4817dd7cddfSDavid du Colombier extern int	loadchar(Font*, Rune, Cacheinfo*, int, int, char**);
4827dd7cddfSDavid du Colombier extern char*	subfontname(char*, char*, int);
4837dd7cddfSDavid du Colombier extern Subfont*	_getsubfont(Display*, char*);
4847dd7cddfSDavid du Colombier extern Subfont*	getdefont(Display*);
4857dd7cddfSDavid du Colombier extern void		lockdisplay(Display*);
4867dd7cddfSDavid du Colombier extern void	unlockdisplay(Display*);
4877dd7cddfSDavid du Colombier extern int		drawlsetrefresh(ulong, int, void*, void*);
4887dd7cddfSDavid du Colombier 
4897dd7cddfSDavid du Colombier /*
4907dd7cddfSDavid du Colombier  * Predefined
4917dd7cddfSDavid du Colombier  */
4927dd7cddfSDavid du Colombier extern	uchar	defontdata[];
4937dd7cddfSDavid du Colombier extern	int		sizeofdefont;
4947dd7cddfSDavid du Colombier extern	Point		ZP;
4957dd7cddfSDavid du Colombier extern	Rectangle	ZR;
4967dd7cddfSDavid du Colombier 
4977dd7cddfSDavid du Colombier /*
4987dd7cddfSDavid du Colombier  * Set up by initdraw()
4997dd7cddfSDavid du Colombier  */
5007dd7cddfSDavid du Colombier extern	Display	*display;
5017dd7cddfSDavid du Colombier extern	Font		*font;
5027dd7cddfSDavid du Colombier extern	Image	*screen;
50380ee5cbfSDavid du Colombier extern	Screen	*_screen;
5047dd7cddfSDavid du Colombier extern	int	_cursorfd;
50559cc4ca5SDavid du Colombier extern	int	_drawdebug;	/* set to 1 to see errors from flushimage */
506ac57dd0bSDavid du Colombier extern	void	_setdrawop(Display*, Drawop);
5077dd7cddfSDavid du Colombier 
5087dd7cddfSDavid du Colombier #define	BGSHORT(p)		(((p)[0]<<0) | ((p)[1]<<8))
5097dd7cddfSDavid du Colombier #define	BGLONG(p)		((BGSHORT(p)<<0) | (BGSHORT(p+2)<<16))
5107dd7cddfSDavid du Colombier #define	BPSHORT(p, v)		((p)[0]=(v), (p)[1]=((v)>>8))
5117dd7cddfSDavid du Colombier #define	BPLONG(p, v)		(BPSHORT(p, (v)), BPSHORT(p+2, (v)>>16))
5127dd7cddfSDavid du Colombier 
5137dd7cddfSDavid du Colombier /*
5149a747e4fSDavid du Colombier  * Compressed image file parameters and helper routines
5157dd7cddfSDavid du Colombier  */
5167dd7cddfSDavid du Colombier #define	NMATCH	3		/* shortest match possible */
5177dd7cddfSDavid du Colombier #define	NRUN	(NMATCH+31)	/* longest match possible */
5187dd7cddfSDavid du Colombier #define	NMEM	1024		/* window size */
5197dd7cddfSDavid du Colombier #define	NDUMP	128		/* maximum length of dump */
5207dd7cddfSDavid du Colombier #define	NCBLOCK	6000		/* size of compressed blocks */
5219a747e4fSDavid du Colombier extern	void	_twiddlecompressed(uchar*, int);
5229a747e4fSDavid du Colombier extern	int	_compblocksize(Rectangle, int);
5237dd7cddfSDavid du Colombier 
5247dd7cddfSDavid du Colombier /* XXX backwards helps; should go */
525*bacfa46cSDavid du Colombier // extern	int		log2[];	/* was used by libmemlayer/line.c */
5267dd7cddfSDavid du Colombier extern	ulong	drawld2chan[];
5277dd7cddfSDavid du Colombier extern	void		drawsetdebug(int);
528