henesyinit from p9fce6d0435 years agoHistory
346 lines · 8.0 KB · C
RawDownload
#pragma	src	"/sys/src/libg"#pragma	lib	"libg.a" /* *  you may think it's a blit, but it's gnot */enum{	EMAXMSG = 128+8192,	/* size of 9p header+data */}; /* * Types */ typedef struct	Bitmap		Bitmap;typedef struct	Point		Point;typedef struct	Rectangle 	Rectangle;typedef struct	Cursor		Cursor;typedef struct	Mouse		Mouse;typedef struct	Menu		Menu;typedef struct	Font		Font;typedef struct	Fontchar	Fontchar;typedef struct	Subfont		Subfont;typedef struct	Cachefont	Cachefont;typedef struct	Cacheinfo	Cacheinfo;typedef struct	Cachesubf	Cachesubf;typedef struct	Event		Event;typedef struct	Slave		Slave;typedef struct	Ebuf		Ebuf;typedef struct	RGB		RGB;typedef struct	Linedesc	Linedesc; struct	Point{	int	x;	int	y;}; struct Rectangle{	Point min;	Point max;}; struct	Bitmap{	Rectangle r;		/* rectangle in data area, local coords */	Rectangle clipr;	/* clipping region */	int	ldepth;	int	id;	Bitmap	*cache;		/* zero; distinguishes bitmap from layer */}; struct	Mouse{	int	buttons;	/* bit array: LMR=124 */	Point	xy;	ulong	msec;}; struct	Cursor{	Point	offset;	uchar	clr[2*16];	uchar	set[2*16];}; struct Menu{	char	**item;	char	*(*gen)(int);	int	lasthit;}; struct Linedesc{	int	x0;	int	y0;	char	xmajor;	char	slopeneg;	long	dminor;	long	dmajor;}; /* * Subfonts * * given char c, Subfont *f, Fontchar *i, and Point p, one says *	i = f->info+c; *	bitblt(b, Pt(p.x+i->left,p.y+i->top), *		bitmap, Rect(i->x,i->top,(i+1)->x,i->bottom), *		fc); *	p.x += i->width; * where bitmap b is the repository of the images. * */ struct	Fontchar{	ushort	x;		/* left edge of bits */	uchar	top;		/* first non-zero scan-line */	uchar	bottom;		/* last non-zero scan-line + 1 */	char	left;		/* offset of baseline */	uchar	width;		/* width of baseline */}; struct	Subfont{	short	n;		/* number of chars in font */	uchar	height;		/* height of bitmap */	char	ascent;		/* top of bitmap to baseline */	Fontchar *info;		/* n+1 character descriptors */	int	id;		/* of font */}; enum{	/* starting values */	LOG2NFCACHE =	6,	NFCACHE =	(1<<LOG2NFCACHE),	/* #chars cached */	NFLOOK =	5,			/* #chars to scan in cache */	NFSUBF =	2,			/* #subfonts to cache */	/* max value */	MAXFCACHE =	2048+NFLOOK,		/* generous upper limit */	MAXSUBF =	50,			/* generous upper limit */	/* deltas */	DSUBF = 	4,	/* expiry ages */	SUBFAGE	=	10000,	CACHEAGE =	10000,}; struct Cachefont{	Rune	min;	/* lowest rune value to be taken from subfont */	Rune	max;	/* highest rune value+1 to be taken from subfont */	int	offset;	/* position in subfont of character at min */	int	abs;	/* name has been made absolute */	char	*name;}; struct Cacheinfo{	Rune		value;	/* value of character at this slot in cache */	ushort		age;	ulong		xright;	/* right edge of bits */	Fontchar;}; struct Cachesubf{	ulong		age;	/* for replacement */	Cachefont	*cf;	/* font info that owns us */	Subfont		*f;	/* attached subfont */}; struct Font{	char		*name;	uchar		height;	/* max height of bitmap, interline spacing */	char		ascent;	/* top of bitmap to baseline */	char		width;	/* widest so far; used in caching only */		char		ldepth;	/* of images */	short		id;	/* of font */	short		nsub;	/* number of subfonts */	ulong		age;	/* increasing counter; used for LRU */	int		ncache;	/* size of cache */	int		nsubf;	/* size of subfont list */	Cacheinfo	*cache;	Cachesubf	*subf;	Cachefont	**sub;	/* as read from file */}; struct	Event{	int	kbdc;	Mouse	mouse;	int	n;		/* number of characters in mesage */	uchar	data[EMAXMSG];	/* message from an arbitrary file descriptor */}; struct Slave{	int	pid;	Ebuf	*head;		/* queue of messages for this descriptor */	Ebuf	*tail;}; struct Ebuf{	Ebuf	*next;	int	n;		/* number of bytes in buf */	uchar	buf[EMAXMSG];}; struct RGB{	ulong	red;	ulong	green;	ulong	blue;}; /* * Codes for bitblt etc. * *	       D *	     0   1 *         --------- *	 0 | 1 | 2 | *     S   |---|---| * 	 1 | 4 | 8 | *         --------- * *	Usually used as D|S; DorS is so tracebacks are readable. */typedefenum	Fcode{	Zero		= 0x0,	DnorS		= 0x1,	DandnotS	= 0x2,	notS		= 0x3,	notDandS	= 0x4,	notD		= 0x5,	DxorS		= 0x6,	DnandS		= 0x7,	DandS		= 0x8,	DxnorS		= 0x9,	D		= 0xA,	DornotS		= 0xB,	S		= 0xC,	notDorS		= 0xD,	DorS		= 0xE,	F		= 0xF,} Fcode; /* * Miscellany */ extern Point	 add(Point, Point), sub(Point, Point);extern Point	 mul(Point, int), div(Point, int);extern Rectangle rsubp(Rectangle, Point), raddp(Rectangle, Point), inset(Rectangle, int);extern Rectangle rmul(Rectangle, int), rdiv(Rectangle, int);extern Rectangle rshift(Rectangle, int), rcanon(Rectangle);extern Bitmap*	 balloc(Rectangle, int);extern void	 bfree(Bitmap*);extern int	 rectclip(Rectangle*, Rectangle);extern void	 binit(void(*)(char*), char*, char*);extern void	 bclose(void);extern void	 berror(char*);extern void	 bitblt(Bitmap*, Point, Bitmap*, Rectangle, Fcode);extern int	 bitbltclip(void*);extern Font*	 rdfontfile(char*, int);extern void	 ffree(Font*);extern Font*	 mkfont(Subfont*, Rune);extern Subfont*	 subfalloc(int, int, int, Fontchar*, Bitmap*, ulong, ulong);extern void	 subffree(Subfont*);extern int	 cachechars(Font*, char**, ushort*, int, int*);extern Point	 string(Bitmap*, Point, Font*, char*, Fcode);extern void	 segment(Bitmap*, Point, Point, int, Fcode);extern void	 polysegment(Bitmap*, int, Point*, int, Fcode);extern void	 point(Bitmap*, Point, int, Fcode);extern void	 arc(Bitmap*, Point, Point, Point, int, Fcode);extern void	 circle(Bitmap*, Point, int, int, Fcode);extern void	 disc(Bitmap*, Point, int, int, Fcode);extern void	 ellipse(Bitmap*, Point, int, int, int, Fcode);extern long	 strwidth(Font*, char*);extern void	 agefont(Font*);extern int	 loadchar(Font*, Rune, Cacheinfo*, int, int);extern Point	 strsize(Font*, char*);extern long	 charwidth(Font*, Rune);extern void	 texture(Bitmap*, Rectangle, Bitmap*, Fcode);extern void	 wrbitmap(Bitmap*, int, int, uchar*);extern void	 rdbitmap(Bitmap*, int, int, uchar*);extern void	 wrbitmapfile(int, Bitmap*);extern Bitmap*	 rdbitmapfile(int);extern void	 wrsubfontfile(int, Subfont*);extern Subfont*	 rdsubfontfile(int, Bitmap*);extern void	_unpackinfo(Fontchar*, uchar*, int);extern void	 rdcolmap(Bitmap*, RGB*);extern void	 wrcolmap(Bitmap*, RGB*);extern int	 ptinrect(Point, Rectangle), rectinrect(Rectangle, Rectangle);extern int	 rectXrect(Rectangle, Rectangle);extern int	 eqpt(Point, Point), eqrect(Rectangle, Rectangle);extern void	 border(Bitmap*, Rectangle, int, Fcode);extern void	 cursorswitch(Cursor*);extern void	 cursorset(Point);extern Rectangle bscreenrect(Rectangle*);extern uchar*	 bneed(int);extern void	 bflush(void);extern void	 bexit(void);extern int	 bwrite(void);extern int	 _clipline(Rectangle, Point*, Point*, Linedesc*);extern int	 clipline(Rectangle, Point*, Point*);extern int	 clipr(Bitmap*, Rectangle); extern void	 einit(ulong);extern ulong	 estart(ulong, int, int);extern ulong	 etimer(ulong, int);extern ulong	 event(Event*);extern ulong	 eread(ulong, Event*);extern Ebuf*	 _ebread(Slave*);extern Mouse	 emouse(void);extern int	 ekbd(void);extern int	 ecanread(ulong);extern int	 ecanmouse(void);extern int	 ecankbd(void);extern void	 ereshaped(Rectangle);	/* supplied by user */extern int	 menuhit(int, Mouse*, Menu*);extern Rectangle getrect(int, Mouse*);extern ulong	 rgbpix(Bitmap*, RGB);extern int	_gminor(long, Linedesc*); enum{	Emouse		= 1,	Ekeyboard	= 2,}; enum{	MAXSLAVE = 32,}; #define	Pt(x, y)		((Point){(x), (y)})#define	Rect(x1, y1, x2, y2)	((Rectangle){Pt(x1, y1), Pt(x2, y2)})#define	Rpt(p1, p2)		((Rectangle){(p1), (p2)})  #define	Dx(r)	((r).max.x-(r).min.x)#define	Dy(r)	((r).max.y-(r).min.y) extern	int	bitbltfd;extern	Bitmap	screen;extern	Font	*font;extern	uchar	_btmp[8192]; extern	Slave	eslave[];extern	int	Smouse;extern	int	Skeyboard;extern	int	Stimer;extern	int	logfid; #define	BGSHORT(p)		(((p)[0]<<0) | ((p)[1]<<8))#define	BGLONG(p)		((BGSHORT(p)<<0) | (BGSHORT(p+2)<<16))#define	BPSHORT(p, v)		((p)[0]=(v), (p)[1]=((v)>>8))#define	BPLONG(p, v)		(BPSHORT(p, (v)), BPSHORT(p+2, (v)>>16))