xref: /plan9/sys/include/ape/draw.h (revision bacfa46c74e1c310aff15aef9cb6bc4e6302513a)
1*363b328dSDavid du Colombier #ifndef _PLAN9_SOURCE
2*363b328dSDavid du Colombier   This header file is an extension to ANSI/POSIX
340ef9009SDavid du Colombier #endif
440ef9009SDavid du Colombier 
5*363b328dSDavid du Colombier #ifndef	__DRAW_H_
6*363b328dSDavid du Colombier #define	__DRAW_H_
740ef9009SDavid du Colombier #pragma src "/sys/src/ape/lib/draw"
840ef9009SDavid du Colombier #pragma lib "/$M/lib/ape/libdraw.a"
940ef9009SDavid du Colombier 
10*363b328dSDavid du Colombier #include <u.h>
11*363b328dSDavid du Colombier #include <fmt.h>
12*363b328dSDavid du Colombier #include <qlock.h>
13*363b328dSDavid du Colombier 
1440ef9009SDavid du Colombier typedef struct	Cachefont Cachefont;
1540ef9009SDavid du Colombier typedef struct	Cacheinfo Cacheinfo;
1640ef9009SDavid du Colombier typedef struct	Cachesubf Cachesubf;
1740ef9009SDavid du Colombier typedef struct	Display Display;
1840ef9009SDavid du Colombier typedef struct	Font Font;
1940ef9009SDavid du Colombier typedef struct	Fontchar Fontchar;
2040ef9009SDavid du Colombier typedef struct	Image Image;
2140ef9009SDavid du Colombier typedef struct	Mouse Mouse;
2240ef9009SDavid du Colombier typedef struct	Point Point;
2340ef9009SDavid du Colombier typedef struct	Rectangle Rectangle;
2440ef9009SDavid du Colombier typedef struct	RGB RGB;
2540ef9009SDavid du Colombier typedef struct	Screen Screen;
2640ef9009SDavid du Colombier typedef struct	Subfont Subfont;
2740ef9009SDavid du Colombier 
2840ef9009SDavid du Colombier #pragma varargck	type	"R"	Rectangle
2940ef9009SDavid du Colombier #pragma varargck	type	"P"	Point
3040ef9009SDavid du Colombier extern	int	Rfmt(Fmt*);
3140ef9009SDavid du Colombier extern	int	Pfmt(Fmt*);
3240ef9009SDavid du Colombier 
3340ef9009SDavid du Colombier enum
3440ef9009SDavid du Colombier {
3540ef9009SDavid du Colombier 	DOpaque		= 0xFFFFFFFF,
3640ef9009SDavid du Colombier 	DTransparent	= 0x00000000,		/* only useful for allocimage, memfillcolor */
3740ef9009SDavid du Colombier 	DBlack		= 0x000000FF,
3840ef9009SDavid du Colombier 	DWhite		= 0xFFFFFFFF,
3940ef9009SDavid du Colombier 	DRed		= 0xFF0000FF,
4040ef9009SDavid du Colombier 	DGreen		= 0x00FF00FF,
4140ef9009SDavid du Colombier 	DBlue		= 0x0000FFFF,
4240ef9009SDavid du Colombier 	DCyan		= 0x00FFFFFF,
4340ef9009SDavid du Colombier 	DMagenta		= 0xFF00FFFF,
4440ef9009SDavid du Colombier 	DYellow		= 0xFFFF00FF,
4540ef9009SDavid du Colombier 	DPaleyellow	= 0xFFFFAAFF,
4640ef9009SDavid du Colombier 	DDarkyellow	= 0xEEEE9EFF,
4740ef9009SDavid du Colombier 	DDarkgreen	= 0x448844FF,
4840ef9009SDavid du Colombier 	DPalegreen	= 0xAAFFAAFF,
4940ef9009SDavid du Colombier 	DMedgreen	= 0x88CC88FF,
5040ef9009SDavid du Colombier 	DDarkblue	= 0x000055FF,
5140ef9009SDavid du Colombier 	DPalebluegreen= 0xAAFFFFFF,
5240ef9009SDavid du Colombier 	DPaleblue		= 0x0000BBFF,
5340ef9009SDavid du Colombier 	DBluegreen	= 0x008888FF,
5440ef9009SDavid du Colombier 	DGreygreen	= 0x55AAAAFF,
5540ef9009SDavid du Colombier 	DPalegreygreen	= 0x9EEEEEFF,
5640ef9009SDavid du Colombier 	DYellowgreen	= 0x99994CFF,
5740ef9009SDavid du Colombier 	DMedblue		= 0x000099FF,
5840ef9009SDavid du Colombier 	DGreyblue	= 0x005DBBFF,
5940ef9009SDavid du Colombier 	DPalegreyblue	= 0x4993DDFF,
6040ef9009SDavid du Colombier 	DPurpleblue	= 0x8888CCFF,
6140ef9009SDavid du Colombier 
6240ef9009SDavid du Colombier 	DNotacolor	= 0xFFFFFF00,
6340ef9009SDavid du Colombier 	DNofill		= DNotacolor,
6440ef9009SDavid du Colombier 
6540ef9009SDavid du Colombier };
6640ef9009SDavid du Colombier 
6740ef9009SDavid du Colombier enum
6840ef9009SDavid du Colombier {
6940ef9009SDavid du Colombier 	Displaybufsize	= 8000,
7040ef9009SDavid du Colombier 	ICOSSCALE	= 1024,
7140ef9009SDavid du Colombier 	Borderwidth =	4,
7240ef9009SDavid du Colombier };
7340ef9009SDavid du Colombier 
7440ef9009SDavid du Colombier enum
7540ef9009SDavid du Colombier {
7640ef9009SDavid du Colombier 	/* refresh methods */
7740ef9009SDavid du Colombier 	Refbackup	= 0,
7840ef9009SDavid du Colombier 	Refnone		= 1,
7940ef9009SDavid du Colombier 	Refmesg		= 2
8040ef9009SDavid du Colombier };
8140ef9009SDavid du Colombier #define	NOREFRESH	((void*)-1)
8240ef9009SDavid du Colombier 
8340ef9009SDavid du Colombier enum
8440ef9009SDavid du Colombier {
8540ef9009SDavid du Colombier 	/* line ends */
8640ef9009SDavid du Colombier 	Endsquare	= 0,
8740ef9009SDavid du Colombier 	Enddisc		= 1,
8840ef9009SDavid du Colombier 	Endarrow	= 2,
8940ef9009SDavid du Colombier 	Endmask		= 0x1F
9040ef9009SDavid du Colombier };
9140ef9009SDavid du Colombier 
9240ef9009SDavid du Colombier #define	ARROW(a, b, c)	(Endarrow|((a)<<5)|((b)<<14)|((c)<<23))
9340ef9009SDavid du Colombier 
9440ef9009SDavid du Colombier typedef enum
9540ef9009SDavid du Colombier {
9640ef9009SDavid du Colombier 	/* Porter-Duff compositing operators */
9740ef9009SDavid du Colombier 	Clear	= 0,
9840ef9009SDavid du Colombier 
9940ef9009SDavid du Colombier 	SinD	= 8,
10040ef9009SDavid du Colombier 	DinS	= 4,
10140ef9009SDavid du Colombier 	SoutD	= 2,
10240ef9009SDavid du Colombier 	DoutS	= 1,
10340ef9009SDavid du Colombier 
10440ef9009SDavid du Colombier 	S		= SinD|SoutD,
10540ef9009SDavid du Colombier 	SoverD	= SinD|SoutD|DoutS,
10640ef9009SDavid du Colombier 	SatopD	= SinD|DoutS,
10740ef9009SDavid du Colombier 	SxorD	= SoutD|DoutS,
10840ef9009SDavid du Colombier 
10940ef9009SDavid du Colombier 	D		= DinS|DoutS,
11040ef9009SDavid du Colombier 	DoverS	= DinS|DoutS|SoutD,
11140ef9009SDavid du Colombier 	DatopS	= DinS|SoutD,
11240ef9009SDavid du Colombier 	DxorS	= DoutS|SoutD,	/* == SxorD */
11340ef9009SDavid du Colombier 
11440ef9009SDavid du Colombier 	Ncomp = 12,
11540ef9009SDavid du Colombier } Drawop;
11640ef9009SDavid du Colombier 
11740ef9009SDavid du Colombier /*
11840ef9009SDavid du Colombier  * image channel descriptors
11940ef9009SDavid du Colombier  */
12040ef9009SDavid du Colombier enum {
12140ef9009SDavid du Colombier 	CRed = 0,
12240ef9009SDavid du Colombier 	CGreen,
12340ef9009SDavid du Colombier 	CBlue,
12440ef9009SDavid du Colombier 	CGrey,
12540ef9009SDavid du Colombier 	CAlpha,
12640ef9009SDavid du Colombier 	CMap,
12740ef9009SDavid du Colombier 	CIgnore,
12840ef9009SDavid du Colombier 	NChan,
12940ef9009SDavid du Colombier };
13040ef9009SDavid du Colombier 
13140ef9009SDavid du Colombier #define __DC(type, nbits)	((((type)&15)<<4)|((nbits)&15))
13240ef9009SDavid du Colombier #define CHAN1(a,b)	__DC(a,b)
13340ef9009SDavid du Colombier #define CHAN2(a,b,c,d)	(CHAN1((a),(b))<<8|__DC((c),(d)))
13440ef9009SDavid du Colombier #define CHAN3(a,b,c,d,e,f)	(CHAN2((a),(b),(c),(d))<<8|__DC((e),(f)))
13540ef9009SDavid du Colombier #define CHAN4(a,b,c,d,e,f,g,h)	(CHAN3((a),(b),(c),(d),(e),(f))<<8|__DC((g),(h)))
13640ef9009SDavid du Colombier 
13740ef9009SDavid du Colombier #define NBITS(c) ((c)&15)
13840ef9009SDavid du Colombier #define TYPE(c) (((c)>>4)&15)
13940ef9009SDavid du Colombier 
14040ef9009SDavid du Colombier enum {
14140ef9009SDavid du Colombier 	GREY1	= CHAN1(CGrey, 1),
14240ef9009SDavid du Colombier 	GREY2	= CHAN1(CGrey, 2),
14340ef9009SDavid du Colombier 	GREY4	= CHAN1(CGrey, 4),
14440ef9009SDavid du Colombier 	GREY8	= CHAN1(CGrey, 8),
14540ef9009SDavid du Colombier 	CMAP8	= CHAN1(CMap, 8),
14640ef9009SDavid du Colombier 	RGB15	= CHAN4(CIgnore, 1, CRed, 5, CGreen, 5, CBlue, 5),
14740ef9009SDavid du Colombier 	RGB16	= CHAN3(CRed, 5, CGreen, 6, CBlue, 5),
14840ef9009SDavid du Colombier 	RGB24	= CHAN3(CRed, 8, CGreen, 8, CBlue, 8),
14940ef9009SDavid du Colombier 	RGBA32	= CHAN4(CRed, 8, CGreen, 8, CBlue, 8, CAlpha, 8),
15040ef9009SDavid du Colombier 	ARGB32	= CHAN4(CAlpha, 8, CRed, 8, CGreen, 8, CBlue, 8),	/* stupid VGAs */
15140ef9009SDavid du Colombier 	XRGB32	= CHAN4(CIgnore, 8, CRed, 8, CGreen, 8, CBlue, 8),
152*363b328dSDavid du Colombier 	BGR24	= CHAN3(CBlue, 8, CGreen, 8, CRed, 8),
153*363b328dSDavid du Colombier 	ABGR32	= CHAN4(CAlpha, 8, CBlue, 8, CGreen, 8, CRed, 8),
154*363b328dSDavid du Colombier 	XBGR32	= CHAN4(CIgnore, 8, CBlue, 8, CGreen, 8, CRed, 8),
15540ef9009SDavid du Colombier };
15640ef9009SDavid du Colombier 
15740ef9009SDavid du Colombier extern	char*	chantostr(char*, ulong);
15840ef9009SDavid du Colombier extern	ulong	strtochan(char*);
15940ef9009SDavid du Colombier extern	int		chantodepth(ulong);
16040ef9009SDavid du Colombier 
16140ef9009SDavid du Colombier struct	Point
16240ef9009SDavid du Colombier {
16340ef9009SDavid du Colombier 	int	x;
16440ef9009SDavid du Colombier 	int	y;
16540ef9009SDavid du Colombier };
16640ef9009SDavid du Colombier 
16740ef9009SDavid du Colombier struct Rectangle
16840ef9009SDavid du Colombier {
16940ef9009SDavid du Colombier 	Point	min;
17040ef9009SDavid du Colombier 	Point	max;
17140ef9009SDavid du Colombier };
17240ef9009SDavid du Colombier 
17340ef9009SDavid du Colombier typedef void	(*Reffn)(Image*, Rectangle, void*);
17440ef9009SDavid du Colombier 
17540ef9009SDavid du Colombier struct Screen
17640ef9009SDavid du Colombier {
17740ef9009SDavid du Colombier 	Display	*display;	/* display holding data */
17840ef9009SDavid du Colombier 	int	id;		/* id of system-held Screen */
17940ef9009SDavid du Colombier 	Image	*image;		/* unused; for reference only */
18040ef9009SDavid du Colombier 	Image	*fill;		/* color to paint behind windows */
18140ef9009SDavid du Colombier };
18240ef9009SDavid du Colombier 
18340ef9009SDavid du Colombier struct Display
18440ef9009SDavid du Colombier {
18540ef9009SDavid du Colombier 	QLock	qlock;
18640ef9009SDavid du Colombier 	int		locking;	/*program is using lockdisplay */
18740ef9009SDavid du Colombier 	int		dirno;
18840ef9009SDavid du Colombier 	int		fd;
18940ef9009SDavid du Colombier 	int		reffd;
19040ef9009SDavid du Colombier 	int		ctlfd;
19140ef9009SDavid du Colombier 	int		imageid;
19240ef9009SDavid du Colombier 	int		local;
19340ef9009SDavid du Colombier 	void		(*error)(Display*, char*);
19440ef9009SDavid du Colombier 	char		*devdir;
19540ef9009SDavid du Colombier 	char		*windir;
19640ef9009SDavid du Colombier 	char		oldlabel[64];
19740ef9009SDavid du Colombier 	ulong		dataqid;
19840ef9009SDavid du Colombier 	Image		*white;
19940ef9009SDavid du Colombier 	Image		*black;
20040ef9009SDavid du Colombier 	Image		*opaque;
20140ef9009SDavid du Colombier 	Image		*transparent;
20240ef9009SDavid du Colombier 	Image		*image;
20340ef9009SDavid du Colombier 	uchar		*buf;
20440ef9009SDavid du Colombier 	int			bufsize;
20540ef9009SDavid du Colombier 	uchar		*bufp;
20640ef9009SDavid du Colombier 	Font		*defaultfont;
20740ef9009SDavid du Colombier 	Subfont		*defaultsubfont;
20840ef9009SDavid du Colombier 	Image		*windows;
20940ef9009SDavid du Colombier 	Image		*screenimage;
21040ef9009SDavid du Colombier 	int			_isnewdisplay;
21140ef9009SDavid du Colombier };
21240ef9009SDavid du Colombier 
21340ef9009SDavid du Colombier struct Image
21440ef9009SDavid du Colombier {
21540ef9009SDavid du Colombier 	Display		*display;	/* display holding data */
21640ef9009SDavid du Colombier 	int		id;		/* id of system-held Image */
21740ef9009SDavid du Colombier 	Rectangle	r;		/* rectangle in data area, local coords */
21840ef9009SDavid du Colombier 	Rectangle 	clipr;		/* clipping region */
21940ef9009SDavid du Colombier 	int		depth;		/* number of bits per pixel */
22040ef9009SDavid du Colombier 	ulong	chan;
22140ef9009SDavid du Colombier 	int		repl;		/* flag: data replicates to tile clipr */
22240ef9009SDavid du Colombier 	Screen		*screen;	/* 0 if not a window */
22340ef9009SDavid du Colombier 	Image		*next;	/* next in list of windows */
22440ef9009SDavid du Colombier };
22540ef9009SDavid du Colombier 
22640ef9009SDavid du Colombier struct RGB
22740ef9009SDavid du Colombier {
22840ef9009SDavid du Colombier 	ulong	red;
22940ef9009SDavid du Colombier 	ulong	green;
23040ef9009SDavid du Colombier 	ulong	blue;
23140ef9009SDavid du Colombier };
23240ef9009SDavid du Colombier 
23340ef9009SDavid du Colombier /*
23440ef9009SDavid du Colombier  * Subfonts
23540ef9009SDavid du Colombier  *
23640ef9009SDavid du Colombier  * given char c, Subfont *f, Fontchar *i, and Point p, one says
23740ef9009SDavid du Colombier  *	i = f->info+c;
23840ef9009SDavid du Colombier  *	draw(b, Rect(p.x+i->left, p.y+i->top,
23940ef9009SDavid du Colombier  *		p.x+i->left+((i+1)->x-i->x), p.y+i->bottom),
24040ef9009SDavid du Colombier  *		color, f->bits, Pt(i->x, i->top));
24140ef9009SDavid du Colombier  *	p.x += i->width;
24240ef9009SDavid du Colombier  * to draw characters in the specified color (itself an Image) in Image b.
24340ef9009SDavid du Colombier  */
24440ef9009SDavid du Colombier 
24540ef9009SDavid du Colombier struct	Fontchar
24640ef9009SDavid du Colombier {
24740ef9009SDavid du Colombier 	int		x;		/* left edge of bits */
24840ef9009SDavid du Colombier 	uchar		top;		/* first non-zero scan-line */
24940ef9009SDavid du Colombier 	uchar		bottom;		/* last non-zero scan-line + 1 */
25040ef9009SDavid du Colombier 	char		left;		/* offset of baseline */
25140ef9009SDavid du Colombier 	uchar		width;		/* width of baseline */
25240ef9009SDavid du Colombier };
25340ef9009SDavid du Colombier 
25440ef9009SDavid du Colombier struct	Subfont
25540ef9009SDavid du Colombier {
25640ef9009SDavid du Colombier 	char		*name;
25740ef9009SDavid du Colombier 	short		n;		/* number of chars in font */
25840ef9009SDavid du Colombier 	uchar		height;		/* height of image */
25940ef9009SDavid du Colombier 	char		ascent;		/* top of image to baseline */
26040ef9009SDavid du Colombier 	Fontchar 	*info;		/* n+1 character descriptors */
26140ef9009SDavid du Colombier 	Image		*bits;		/* of font */
26240ef9009SDavid du Colombier 	int		ref;
26340ef9009SDavid du Colombier };
26440ef9009SDavid du Colombier 
26540ef9009SDavid du Colombier enum
26640ef9009SDavid du Colombier {
26740ef9009SDavid du Colombier 	/* starting values */
26840ef9009SDavid du Colombier 	LOG2NFCACHE =	6,
26940ef9009SDavid du Colombier 	NFCACHE =	(1<<LOG2NFCACHE),	/* #chars cached */
27040ef9009SDavid du Colombier 	NFLOOK =	5,			/* #chars to scan in cache */
27140ef9009SDavid du Colombier 	NFSUBF =	2,			/* #subfonts to cache */
27240ef9009SDavid du Colombier 	/* max value */
27340ef9009SDavid du Colombier 	MAXFCACHE =	1024+NFLOOK,		/* upper limit */
27440ef9009SDavid du Colombier 	MAXSUBF =	50,			/* generous upper limit */
27540ef9009SDavid du Colombier 	/* deltas */
27640ef9009SDavid du Colombier 	DSUBF = 	4,
27740ef9009SDavid du Colombier 	/* expiry ages */
27840ef9009SDavid du Colombier 	SUBFAGE	=	10000,
27940ef9009SDavid du Colombier 	CACHEAGE =	10000
28040ef9009SDavid du Colombier };
28140ef9009SDavid du Colombier 
28240ef9009SDavid du Colombier struct Cachefont
28340ef9009SDavid du Colombier {
28440ef9009SDavid du Colombier 	Rune		min;	/* lowest rune value to be taken from subfont */
28540ef9009SDavid du Colombier 	Rune		max;	/* highest rune value+1 to be taken from subfont */
28640ef9009SDavid du Colombier 	int		offset;	/* position in subfont of character at min */
28740ef9009SDavid du Colombier 	char		*name;			/* stored in font */
28840ef9009SDavid du Colombier 	char		*subfontname;		/* to access subfont */
28940ef9009SDavid du Colombier };
29040ef9009SDavid du Colombier 
29140ef9009SDavid du Colombier struct Cacheinfo
29240ef9009SDavid du Colombier {
29340ef9009SDavid du Colombier 	ushort		x;		/* left edge of bits */
29440ef9009SDavid du Colombier 	uchar		width;		/* width of baseline */
29540ef9009SDavid du Colombier 	schar		left;		/* offset of baseline */
29640ef9009SDavid du Colombier 	Rune		value;	/* value of character at this slot in cache */
29740ef9009SDavid du Colombier 	ushort		age;
29840ef9009SDavid du Colombier };
29940ef9009SDavid du Colombier 
30040ef9009SDavid du Colombier struct Cachesubf
30140ef9009SDavid du Colombier {
30240ef9009SDavid du Colombier 	ulong		age;	/* for replacement */
30340ef9009SDavid du Colombier 	Cachefont	*cf;	/* font info that owns us */
30440ef9009SDavid du Colombier 	Subfont		*f;	/* attached subfont */
30540ef9009SDavid du Colombier };
30640ef9009SDavid du Colombier 
30740ef9009SDavid du Colombier struct Font
30840ef9009SDavid du Colombier {
30940ef9009SDavid du Colombier 	char		*name;
31040ef9009SDavid du Colombier 	Display		*display;
31140ef9009SDavid du Colombier 	short		height;	/* max height of image, interline spacing */
31240ef9009SDavid du Colombier 	short		ascent;	/* top of image to baseline */
31340ef9009SDavid du Colombier 	short		width;	/* widest so far; used in caching only */
31440ef9009SDavid du Colombier 	short		nsub;	/* number of subfonts */
31540ef9009SDavid du Colombier 	ulong		age;	/* increasing counter; used for LRU */
31640ef9009SDavid du Colombier 	int		maxdepth;	/* maximum depth of all loaded subfonts */
31740ef9009SDavid du Colombier 	int		ncache;	/* size of cache */
31840ef9009SDavid du Colombier 	int		nsubf;	/* size of subfont list */
31940ef9009SDavid du Colombier 	Cacheinfo	*cache;
32040ef9009SDavid du Colombier 	Cachesubf	*subf;
32140ef9009SDavid du Colombier 	Cachefont	**sub;	/* as read from file */
32240ef9009SDavid du Colombier 	Image		*cacheimage;
32340ef9009SDavid du Colombier };
32440ef9009SDavid du Colombier 
32540ef9009SDavid du Colombier #define	Dx(r)	((r).max.x-(r).min.x)
32640ef9009SDavid du Colombier #define	Dy(r)	((r).max.y-(r).min.y)
32740ef9009SDavid du Colombier 
328*363b328dSDavid du Colombier #ifdef	__cplusplus
329*363b328dSDavid du Colombier extern "C" {
330*363b328dSDavid du Colombier #endif
331*363b328dSDavid du Colombier 
33240ef9009SDavid du Colombier /*
33340ef9009SDavid du Colombier  * Image management
33440ef9009SDavid du Colombier  */
33540ef9009SDavid du Colombier extern Image*	_allocimage(Image*, Display*, Rectangle, ulong, int, ulong, int, int);
33640ef9009SDavid du Colombier extern Image*	allocimage(Display*, Rectangle, ulong, int, ulong);
33740ef9009SDavid du Colombier extern uchar*	bufimage(Display*, int);
33840ef9009SDavid du Colombier extern int	bytesperline(Rectangle, int);
33940ef9009SDavid du Colombier extern void	closedisplay(Display*);
34040ef9009SDavid du Colombier extern void	drawerror(Display*, char*);
34140ef9009SDavid du Colombier extern int	flushimage(Display*, int);
34240ef9009SDavid du Colombier extern int	freeimage(Image*);
34340ef9009SDavid du Colombier extern int	_freeimage1(Image*);
34440ef9009SDavid du Colombier extern int	geninitdraw(char*, void(*)(Display*, char*), char*, char*, char*, int);
34540ef9009SDavid du Colombier extern int	initdraw(void(*)(Display*, char*), char*, char*);
34640ef9009SDavid du Colombier extern int	newwindow(char*);
34740ef9009SDavid du Colombier extern Display*	initdisplay(char*, char*, void(*)(Display*, char*));
34840ef9009SDavid du Colombier extern int	loadimage(Image*, Rectangle, uchar*, int);
34940ef9009SDavid du Colombier extern int	cloadimage(Image*, Rectangle, uchar*, int);
35040ef9009SDavid du Colombier extern int	getwindow(Display*, int);
35140ef9009SDavid du Colombier extern int	gengetwindow(Display*, char*, Image**, Screen**, int);
35240ef9009SDavid du Colombier extern Image* readimage(Display*, int, int);
35340ef9009SDavid du Colombier extern Image* creadimage(Display*, int, int);
35440ef9009SDavid du Colombier extern int	unloadimage(Image*, Rectangle, uchar*, int);
35540ef9009SDavid du Colombier extern int	wordsperline(Rectangle, int);
35640ef9009SDavid du Colombier extern int	writeimage(int, Image*, int);
35740ef9009SDavid du Colombier extern Image*	namedimage(Display*, char*);
35840ef9009SDavid du Colombier extern int	nameimage(Image*, char*, int);
35940ef9009SDavid du Colombier extern Image* allocimagemix(Display*, ulong, ulong);
36040ef9009SDavid du Colombier 
36140ef9009SDavid du Colombier /*
36240ef9009SDavid du Colombier  * Colors
36340ef9009SDavid du Colombier  */
36440ef9009SDavid du Colombier extern	void	readcolmap(Display*, RGB*);
36540ef9009SDavid du Colombier extern	void	writecolmap(Display*, RGB*);
36640ef9009SDavid du Colombier extern	ulong	setalpha(ulong, uchar);
36740ef9009SDavid du Colombier 
36840ef9009SDavid du Colombier /*
36940ef9009SDavid du Colombier  * Windows
37040ef9009SDavid du Colombier  */
37140ef9009SDavid du Colombier extern Screen*	allocscreen(Image*, Image*, int);
37240ef9009SDavid du Colombier extern Image*	_allocwindow(Image*, Screen*, Rectangle, int, ulong);
37340ef9009SDavid du Colombier extern Image*	allocwindow(Screen*, Rectangle, int, ulong);
37440ef9009SDavid du Colombier extern void	bottomnwindows(Image**, int);
37540ef9009SDavid du Colombier extern void	bottomwindow(Image*);
37640ef9009SDavid du Colombier extern int	freescreen(Screen*);
37740ef9009SDavid du Colombier extern Screen*	publicscreen(Display*, int, ulong);
37840ef9009SDavid du Colombier extern void	topnwindows(Image**, int);
37940ef9009SDavid du Colombier extern void	topwindow(Image*);
38040ef9009SDavid du Colombier extern int	originwindow(Image*, Point, Point);
38140ef9009SDavid du Colombier 
38240ef9009SDavid du Colombier /*
38340ef9009SDavid du Colombier  * Geometry
38440ef9009SDavid du Colombier  */
38540ef9009SDavid du Colombier extern Point		Pt(int, int);
38640ef9009SDavid du Colombier extern Rectangle	Rect(int, int, int, int);
38740ef9009SDavid du Colombier extern Rectangle	Rpt(Point, Point);
38840ef9009SDavid du Colombier extern Point		addpt(Point, Point);
38940ef9009SDavid du Colombier extern Point		subpt(Point, Point);
39040ef9009SDavid du Colombier extern Point		divpt(Point, int);
39140ef9009SDavid du Colombier extern Point		mulpt(Point, int);
39240ef9009SDavid du Colombier extern int		eqpt(Point, Point);
39340ef9009SDavid du Colombier extern int		eqrect(Rectangle, Rectangle);
39440ef9009SDavid du Colombier extern Rectangle	insetrect(Rectangle, int);
39540ef9009SDavid du Colombier extern Rectangle	rectaddpt(Rectangle, Point);
39640ef9009SDavid du Colombier extern Rectangle	rectsubpt(Rectangle, Point);
39740ef9009SDavid du Colombier extern Rectangle	canonrect(Rectangle);
39840ef9009SDavid du Colombier extern int		rectXrect(Rectangle, Rectangle);
39940ef9009SDavid du Colombier extern int		rectinrect(Rectangle, Rectangle);
40040ef9009SDavid du Colombier extern void		combinerect(Rectangle*, Rectangle);
40140ef9009SDavid du Colombier extern int		rectclip(Rectangle*, Rectangle);
40240ef9009SDavid du Colombier extern int		ptinrect(Point, Rectangle);
40340ef9009SDavid du Colombier extern void		replclipr(Image*, int, Rectangle);
40440ef9009SDavid du Colombier extern int		drawreplxy(int, int, int);	/* used to be drawsetxy */
40540ef9009SDavid du Colombier extern Point	drawrepl(Rectangle, Point);
40640ef9009SDavid du Colombier extern int		rgb2cmap(int, int, int);
40740ef9009SDavid du Colombier extern int		cmap2rgb(int);
40840ef9009SDavid du Colombier extern int		cmap2rgba(int);
40940ef9009SDavid du Colombier extern void		icossin(int, int*, int*);
41040ef9009SDavid du Colombier extern void		icossin2(int, int, int*, int*);
41140ef9009SDavid du Colombier 
41240ef9009SDavid du Colombier /*
41340ef9009SDavid du Colombier  * Graphics
41440ef9009SDavid du Colombier  */
41540ef9009SDavid du Colombier extern void	draw(Image*, Rectangle, Image*, Image*, Point);
41640ef9009SDavid du Colombier extern void	drawop(Image*, Rectangle, Image*, Image*, Point, Drawop);
41740ef9009SDavid du Colombier extern void	gendraw(Image*, Rectangle, Image*, Point, Image*, Point);
41840ef9009SDavid du Colombier extern void	gendrawop(Image*, Rectangle, Image*, Point, Image*, Point, Drawop);
41940ef9009SDavid du Colombier extern void	line(Image*, Point, Point, int, int, int, Image*, Point);
42040ef9009SDavid du Colombier extern void	lineop(Image*, Point, Point, int, int, int, Image*, Point, Drawop);
42140ef9009SDavid du Colombier extern void	poly(Image*, Point*, int, int, int, int, Image*, Point);
42240ef9009SDavid du Colombier extern void	polyop(Image*, Point*, int, int, int, int, Image*, Point, Drawop);
42340ef9009SDavid du Colombier extern void	fillpoly(Image*, Point*, int, int, Image*, Point);
42440ef9009SDavid du Colombier extern void	fillpolyop(Image*, Point*, int, int, Image*, Point, Drawop);
42540ef9009SDavid du Colombier extern Point	string(Image*, Point, Image*, Point, Font*, char*);
42640ef9009SDavid du Colombier extern Point	stringop(Image*, Point, Image*, Point, Font*, char*, Drawop);
42740ef9009SDavid du Colombier extern Point	stringn(Image*, Point, Image*, Point, Font*, char*, int);
42840ef9009SDavid du Colombier extern Point	stringnop(Image*, Point, Image*, Point, Font*, char*, int, Drawop);
42940ef9009SDavid du Colombier extern Point	runestring(Image*, Point, Image*, Point, Font*, Rune*);
43040ef9009SDavid du Colombier extern Point	runestringop(Image*, Point, Image*, Point, Font*, Rune*, Drawop);
43140ef9009SDavid du Colombier extern Point	runestringn(Image*, Point, Image*, Point, Font*, Rune*, int);
43240ef9009SDavid du Colombier extern Point	runestringnop(Image*, Point, Image*, Point, Font*, Rune*, int, Drawop);
43340ef9009SDavid du Colombier extern Point	stringbg(Image*, Point, Image*, Point, Font*, char*, Image*, Point);
43440ef9009SDavid du Colombier extern Point	stringbgop(Image*, Point, Image*, Point, Font*, char*, Image*, Point, Drawop);
43540ef9009SDavid du Colombier extern Point	stringnbg(Image*, Point, Image*, Point, Font*, char*, int, Image*, Point);
43640ef9009SDavid du Colombier extern Point	stringnbgop(Image*, Point, Image*, Point, Font*, char*, int, Image*, Point, Drawop);
43740ef9009SDavid du Colombier extern Point	runestringbg(Image*, Point, Image*, Point, Font*, Rune*, Image*, Point);
43840ef9009SDavid du Colombier extern Point	runestringbgop(Image*, Point, Image*, Point, Font*, Rune*, Image*, Point, Drawop);
43940ef9009SDavid du Colombier extern Point	runestringnbg(Image*, Point, Image*, Point, Font*, Rune*, int, Image*, Point);
44040ef9009SDavid du Colombier extern Point	runestringnbgop(Image*, Point, Image*, Point, Font*, Rune*, int, Image*, Point, Drawop);
44140ef9009SDavid du Colombier extern Point	_string(Image*, Point, Image*, Point, Font*, char*, Rune*, int, Rectangle, Image*, Point, Drawop);
44240ef9009SDavid du Colombier extern Point	stringsubfont(Image*, Point, Image*, Subfont*, char*);
44340ef9009SDavid du Colombier extern int		bezier(Image*, Point, Point, Point, Point, int, int, int, Image*, Point);
44440ef9009SDavid du Colombier extern int		bezierop(Image*, Point, Point, Point, Point, int, int, int, Image*, Point, Drawop);
44540ef9009SDavid du Colombier extern int		bezspline(Image*, Point*, int, int, int, int, Image*, Point);
44640ef9009SDavid du Colombier extern int		bezsplineop(Image*, Point*, int, int, int, int, Image*, Point, Drawop);
44740ef9009SDavid du Colombier extern int		bezsplinepts(Point*, int, Point**);
44840ef9009SDavid du Colombier extern int		fillbezier(Image*, Point, Point, Point, Point, int, Image*, Point);
44940ef9009SDavid du Colombier extern int		fillbezierop(Image*, Point, Point, Point, Point, int, Image*, Point, Drawop);
45040ef9009SDavid du Colombier extern int		fillbezspline(Image*, Point*, int, int, Image*, Point);
45140ef9009SDavid du Colombier extern int		fillbezsplineop(Image*, Point*, int, int, Image*, Point, Drawop);
45240ef9009SDavid du Colombier extern void	ellipse(Image*, Point, int, int, int, Image*, Point);
45340ef9009SDavid du Colombier extern void	ellipseop(Image*, Point, int, int, int, Image*, Point, Drawop);
45440ef9009SDavid du Colombier extern void	fillellipse(Image*, Point, int, int, Image*, Point);
45540ef9009SDavid du Colombier extern void	fillellipseop(Image*, Point, int, int, Image*, Point, Drawop);
45640ef9009SDavid du Colombier extern void	arc(Image*, Point, int, int, int, Image*, Point, int, int);
45740ef9009SDavid du Colombier extern void	arcop(Image*, Point, int, int, int, Image*, Point, int, int, Drawop);
45840ef9009SDavid du Colombier extern void	fillarc(Image*, Point, int, int, Image*, Point, int, int);
45940ef9009SDavid du Colombier extern void	fillarcop(Image*, Point, int, int, Image*, Point, int, int, Drawop);
46040ef9009SDavid du Colombier extern void	border(Image*, Rectangle, int, Image*, Point);
46140ef9009SDavid du Colombier extern void	borderop(Image*, Rectangle, int, Image*, Point, Drawop);
46240ef9009SDavid du Colombier 
46340ef9009SDavid du Colombier /*
46440ef9009SDavid du Colombier  * Font management
46540ef9009SDavid du Colombier  */
46640ef9009SDavid du Colombier extern Font*	openfont(Display*, char*);
46740ef9009SDavid du Colombier extern Font*	buildfont(Display*, char*, char*);
46840ef9009SDavid du Colombier extern void	freefont(Font*);
46940ef9009SDavid du Colombier extern Font*	mkfont(Subfont*, Rune);
47040ef9009SDavid du Colombier extern int	cachechars(Font*, char**, Rune**, ushort*, int, int*, char**);
47140ef9009SDavid du Colombier extern void	agefont(Font*);
47240ef9009SDavid du Colombier extern Subfont*	allocsubfont(char*, int, int, int, Fontchar*, Image*);
47340ef9009SDavid du Colombier extern Subfont*	lookupsubfont(Display*, char*);
47440ef9009SDavid du Colombier extern void	installsubfont(char*, Subfont*);
47540ef9009SDavid du Colombier extern void	uninstallsubfont(Subfont*);
47640ef9009SDavid du Colombier extern void	freesubfont(Subfont*);
47740ef9009SDavid du Colombier extern Subfont*	readsubfont(Display*, char*, int, int);
47840ef9009SDavid du Colombier extern Subfont*	readsubfonti(Display*, char*, int, Image*, int);
47940ef9009SDavid du Colombier extern int	writesubfont(int, Subfont*);
48040ef9009SDavid du Colombier extern void	_unpackinfo(Fontchar*, uchar*, int);
48140ef9009SDavid du Colombier extern Point	stringsize(Font*, char*);
48240ef9009SDavid du Colombier extern int	stringwidth(Font*, char*);
48340ef9009SDavid du Colombier extern int	stringnwidth(Font*, char*, int);
48440ef9009SDavid du Colombier extern Point	runestringsize(Font*, Rune*);
48540ef9009SDavid du Colombier extern int	runestringwidth(Font*, Rune*);
48640ef9009SDavid du Colombier extern int	runestringnwidth(Font*, Rune*, int);
48740ef9009SDavid du Colombier extern Point	strsubfontwidth(Subfont*, char*);
48840ef9009SDavid du Colombier extern int	loadchar(Font*, Rune, Cacheinfo*, int, int, char**);
48940ef9009SDavid du Colombier extern char*	subfontname(char*, char*, int);
49040ef9009SDavid du Colombier extern Subfont*	_getsubfont(Display*, char*);
49140ef9009SDavid du Colombier extern Subfont*	getdefont(Display*);
49240ef9009SDavid du Colombier extern void		lockdisplay(Display*);
49340ef9009SDavid du Colombier extern void	unlockdisplay(Display*);
49440ef9009SDavid du Colombier extern int		drawlsetrefresh(ulong, int, void*, void*);
49540ef9009SDavid du Colombier 
49640ef9009SDavid du Colombier /*
49740ef9009SDavid du Colombier  * Predefined
49840ef9009SDavid du Colombier  */
49940ef9009SDavid du Colombier extern	uchar	defontdata[];
50040ef9009SDavid du Colombier extern	int		sizeofdefont;
50140ef9009SDavid du Colombier extern	Point		ZP;
50240ef9009SDavid du Colombier extern	Rectangle	ZR;
50340ef9009SDavid du Colombier 
50440ef9009SDavid du Colombier /*
50540ef9009SDavid du Colombier  * Set up by initdraw()
50640ef9009SDavid du Colombier  */
50740ef9009SDavid du Colombier extern	Display	*display;
50840ef9009SDavid du Colombier extern	Font		*font;
50940ef9009SDavid du Colombier extern	Image	*screen;
51040ef9009SDavid du Colombier extern	Screen	*_screen;
51140ef9009SDavid du Colombier extern	int	_cursorfd;
51240ef9009SDavid du Colombier extern	int	_drawdebug;	/* set to 1 to see errors from flushimage */
51340ef9009SDavid du Colombier extern	void	_setdrawop(Display*, Drawop);
51440ef9009SDavid du Colombier 
51540ef9009SDavid du Colombier #define	BGSHORT(p)		(((p)[0]<<0) | ((p)[1]<<8))
51640ef9009SDavid du Colombier #define	BGLONG(p)		((BGSHORT(p)<<0) | (BGSHORT(p+2)<<16))
51740ef9009SDavid du Colombier #define	BPSHORT(p, v)		((p)[0]=(v), (p)[1]=((v)>>8))
51840ef9009SDavid du Colombier #define	BPLONG(p, v)		(BPSHORT(p, (v)), BPSHORT(p+2, (v)>>16))
51940ef9009SDavid du Colombier 
52040ef9009SDavid du Colombier /*
52140ef9009SDavid du Colombier  * Compressed image file parameters and helper routines
52240ef9009SDavid du Colombier  */
52340ef9009SDavid du Colombier #define	NMATCH	3		/* shortest match possible */
52440ef9009SDavid du Colombier #define	NRUN	(NMATCH+31)	/* longest match possible */
52540ef9009SDavid du Colombier #define	NMEM	1024		/* window size */
52640ef9009SDavid du Colombier #define	NDUMP	128		/* maximum length of dump */
52740ef9009SDavid du Colombier #define	NCBLOCK	6000		/* size of compressed blocks */
52840ef9009SDavid du Colombier extern	void	_twiddlecompressed(uchar*, int);
52940ef9009SDavid du Colombier extern	int	_compblocksize(Rectangle, int);
53040ef9009SDavid du Colombier 
53140ef9009SDavid du Colombier /* XXX backwards helps; should go */
53240ef9009SDavid du Colombier extern	ulong	drawld2chan[];
53340ef9009SDavid du Colombier extern	void		drawsetdebug(int);
534*363b328dSDavid du Colombier 
535*363b328dSDavid du Colombier #ifdef	__cplusplus
536*363b328dSDavid du Colombier }
537*363b328dSDavid du Colombier #endif
538*363b328dSDavid du Colombier 
539*363b328dSDavid du Colombier #endif
540