xref: /inferno-os/include/memdraw.h (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1*37da2899SCharles.Forsyth #pragma	src	"/usr/inferno/libmemdraw"
2*37da2899SCharles.Forsyth 
3*37da2899SCharles.Forsyth typedef struct	Memimage Memimage;
4*37da2899SCharles.Forsyth typedef struct	Memdata Memdata;
5*37da2899SCharles.Forsyth typedef struct	Memsubfont Memsubfont;
6*37da2899SCharles.Forsyth typedef struct	Memlayer Memlayer;
7*37da2899SCharles.Forsyth typedef struct	Memcmap Memcmap;
8*37da2899SCharles.Forsyth typedef struct	Memdrawparam	Memdrawparam;
9*37da2899SCharles.Forsyth 
10*37da2899SCharles.Forsyth #pragma incomplete Memlayer
11*37da2899SCharles.Forsyth 
12*37da2899SCharles.Forsyth /*
13*37da2899SCharles.Forsyth  * Memdata is allocated from main pool, but .data from the image pool.
14*37da2899SCharles.Forsyth  * Memdata is allocated separately to permit patching its pointer after
15*37da2899SCharles.Forsyth  * compaction when windows share the image data.
16*37da2899SCharles.Forsyth  * The first word of data is a back pointer to the Memdata, to find
17*37da2899SCharles.Forsyth  * The word to patch.
18*37da2899SCharles.Forsyth  */
19*37da2899SCharles.Forsyth 
20*37da2899SCharles.Forsyth struct Memdata
21*37da2899SCharles.Forsyth {
22*37da2899SCharles.Forsyth 	ulong	*base;	/* allocated data pointer */
23*37da2899SCharles.Forsyth 	uchar	*bdata;	/* pointer to first byte of actual data; word-aligned */
24*37da2899SCharles.Forsyth 	int		ref;		/* number of Memimages using this data */
25*37da2899SCharles.Forsyth 	void*	imref;
26*37da2899SCharles.Forsyth 	int		allocd;	/* is this malloc'd? */
27*37da2899SCharles.Forsyth };
28*37da2899SCharles.Forsyth 
29*37da2899SCharles.Forsyth enum {
30*37da2899SCharles.Forsyth 	Frepl		= 1<<0,	/* is replicated */
31*37da2899SCharles.Forsyth 	Fsimple	= 1<<1,	/* is 1x1 */
32*37da2899SCharles.Forsyth 	Fgrey	= 1<<2,	/* is grey */
33*37da2899SCharles.Forsyth 	Falpha	= 1<<3,	/* has explicit alpha */
34*37da2899SCharles.Forsyth 	Fcmap	= 1<<4,	/* has cmap channel */
35*37da2899SCharles.Forsyth 	Fbytes	= 1<<5,	/* has only 8-bit channels */
36*37da2899SCharles.Forsyth };
37*37da2899SCharles.Forsyth 
38*37da2899SCharles.Forsyth struct Memimage
39*37da2899SCharles.Forsyth {
40*37da2899SCharles.Forsyth 	Rectangle	r;		/* rectangle in data area, local coords */
41*37da2899SCharles.Forsyth 	Rectangle	clipr;		/* clipping region */
42*37da2899SCharles.Forsyth 	int		depth;	/* number of bits of storage per pixel */
43*37da2899SCharles.Forsyth 	int		nchan;	/* number of channels */
44*37da2899SCharles.Forsyth 	ulong	chan;	/* channel descriptions */
45*37da2899SCharles.Forsyth 	Memcmap	*cmap;
46*37da2899SCharles.Forsyth 
47*37da2899SCharles.Forsyth 	Memdata	*data;	/* pointer to data; shared by windows in this image */
48*37da2899SCharles.Forsyth 	int		zero;		/* data->bdata+zero==&byte containing (0,0) */
49*37da2899SCharles.Forsyth 	ulong	width;	/* width in words of a single scan line */
50*37da2899SCharles.Forsyth 	Memlayer	*layer;	/* nil if not a layer*/
51*37da2899SCharles.Forsyth 	ulong	flags;
52*37da2899SCharles.Forsyth 
53*37da2899SCharles.Forsyth 	int		shift[NChan];
54*37da2899SCharles.Forsyth 	int		mask[NChan];
55*37da2899SCharles.Forsyth 	int		nbits[NChan];
56*37da2899SCharles.Forsyth };
57*37da2899SCharles.Forsyth 
58*37da2899SCharles.Forsyth struct Memcmap
59*37da2899SCharles.Forsyth {
60*37da2899SCharles.Forsyth 	uchar	cmap2rgb[3*256];
61*37da2899SCharles.Forsyth 	uchar	rgb2cmap[16*16*16];
62*37da2899SCharles.Forsyth };
63*37da2899SCharles.Forsyth 
64*37da2899SCharles.Forsyth /*
65*37da2899SCharles.Forsyth  * Subfonts
66*37da2899SCharles.Forsyth  *
67*37da2899SCharles.Forsyth  * given char c, Subfont *f, Fontchar *i, and Point p, one says
68*37da2899SCharles.Forsyth  *	i = f->info+c;
69*37da2899SCharles.Forsyth  *	draw(b, Rect(p.x+i->left, p.y+i->top,
70*37da2899SCharles.Forsyth  *		p.x+i->left+((i+1)->x-i->x), p.y+i->bottom),
71*37da2899SCharles.Forsyth  *		color, f->bits, Pt(i->x, i->top));
72*37da2899SCharles.Forsyth  *	p.x += i->width;
73*37da2899SCharles.Forsyth  * to draw characters in the specified color (itself a Memimage) in Memimage b.
74*37da2899SCharles.Forsyth  */
75*37da2899SCharles.Forsyth 
76*37da2899SCharles.Forsyth struct	Memsubfont
77*37da2899SCharles.Forsyth {
78*37da2899SCharles.Forsyth 	char		*name;
79*37da2899SCharles.Forsyth 	short	n;		/* number of chars in font */
80*37da2899SCharles.Forsyth 	uchar	height;		/* height of bitmap */
81*37da2899SCharles.Forsyth 	char	ascent;		/* top of bitmap to baseline */
82*37da2899SCharles.Forsyth 	Fontchar *info;		/* n+1 character descriptors */
83*37da2899SCharles.Forsyth 	Memimage	*bits;		/* of font */
84*37da2899SCharles.Forsyth };
85*37da2899SCharles.Forsyth 
86*37da2899SCharles.Forsyth /*
87*37da2899SCharles.Forsyth  * Encapsulated parameters and information for sub-draw routines.
88*37da2899SCharles.Forsyth  */
89*37da2899SCharles.Forsyth enum {
90*37da2899SCharles.Forsyth 	Simplesrc=1<<0,
91*37da2899SCharles.Forsyth 	Simplemask=1<<1,
92*37da2899SCharles.Forsyth 	Replsrc=1<<2,
93*37da2899SCharles.Forsyth 	Replmask=1<<3,
94*37da2899SCharles.Forsyth 	Fullmask=1<<4,
95*37da2899SCharles.Forsyth };
96*37da2899SCharles.Forsyth struct	Memdrawparam
97*37da2899SCharles.Forsyth {
98*37da2899SCharles.Forsyth 	Memimage *dst;
99*37da2899SCharles.Forsyth 	Rectangle	r;
100*37da2899SCharles.Forsyth 	Memimage *src;
101*37da2899SCharles.Forsyth 	Rectangle sr;
102*37da2899SCharles.Forsyth 	Memimage *mask;
103*37da2899SCharles.Forsyth 	Rectangle mr;
104*37da2899SCharles.Forsyth 	int op;
105*37da2899SCharles.Forsyth 
106*37da2899SCharles.Forsyth 	ulong state;
107*37da2899SCharles.Forsyth 	ulong mval;	/* if Simplemask, the mask pixel in mask format */
108*37da2899SCharles.Forsyth 	ulong mrgba;	/* mval in rgba */
109*37da2899SCharles.Forsyth 	ulong sval;	/* if Simplesrc, the source pixel in src format */
110*37da2899SCharles.Forsyth 	ulong srgba;	/* sval in rgba */
111*37da2899SCharles.Forsyth 	ulong sdval;	/* sval in dst format */
112*37da2899SCharles.Forsyth };
113*37da2899SCharles.Forsyth 
114*37da2899SCharles.Forsyth /*
115*37da2899SCharles.Forsyth  * Memimage management
116*37da2899SCharles.Forsyth  */
117*37da2899SCharles.Forsyth 
118*37da2899SCharles.Forsyth extern Memimage*	allocmemimage(Rectangle, ulong);
119*37da2899SCharles.Forsyth extern Memimage*	allocmemimaged(Rectangle, ulong, Memdata*);
120*37da2899SCharles.Forsyth extern Memimage*	readmemimage(int);
121*37da2899SCharles.Forsyth extern Memimage*	creadmemimage(int);
122*37da2899SCharles.Forsyth extern int	writememimage(int, Memimage*);
123*37da2899SCharles.Forsyth extern void	freememimage(Memimage*);
124*37da2899SCharles.Forsyth extern int		loadmemimage(Memimage*, Rectangle, uchar*, int);
125*37da2899SCharles.Forsyth extern int		cloadmemimage(Memimage*, Rectangle, uchar*, int);
126*37da2899SCharles.Forsyth extern int		unloadmemimage(Memimage*, Rectangle, uchar*, int);
127*37da2899SCharles.Forsyth extern ulong*	wordaddr(Memimage*, Point);
128*37da2899SCharles.Forsyth extern uchar*	byteaddr(Memimage*, Point);
129*37da2899SCharles.Forsyth extern int		drawclip(Memimage*, Rectangle*, Memimage*, Point*, Memimage*, Point*, Rectangle*, Rectangle*);
130*37da2899SCharles.Forsyth extern void	memfillcolor(Memimage*, ulong);
131*37da2899SCharles.Forsyth extern int		memsetchan(Memimage*, ulong);
132*37da2899SCharles.Forsyth 
133*37da2899SCharles.Forsyth /*
134*37da2899SCharles.Forsyth  * Graphics
135*37da2899SCharles.Forsyth  */
136*37da2899SCharles.Forsyth extern void	memdraw(Memimage*, Rectangle, Memimage*, Point, Memimage*, Point, int);
137*37da2899SCharles.Forsyth extern void	memline(Memimage*, Point, Point, int, int, int, Memimage*, Point, int);
138*37da2899SCharles.Forsyth extern void	mempoly(Memimage*, Point*, int, int, int, int, Memimage*, Point, int);
139*37da2899SCharles.Forsyth extern void	memfillpoly(Memimage*, Point*, int, int, Memimage*, Point, int);
140*37da2899SCharles.Forsyth extern void	_memfillpolysc(Memimage*, Point*, int, int, Memimage*, Point, int, int, int, int);
141*37da2899SCharles.Forsyth extern void	memimagedraw(Memimage*, Rectangle, Memimage*, Point, Memimage*, Point, int);
142*37da2899SCharles.Forsyth extern int	hwdraw(Memdrawparam*);
143*37da2899SCharles.Forsyth extern void	memimageline(Memimage*, Point, Point, int, int, int, Memimage*, Point, int);
144*37da2899SCharles.Forsyth extern void	_memimageline(Memimage*, Point, Point, int, int, int, Memimage*, Point, Rectangle, int);
145*37da2899SCharles.Forsyth extern Point	memimagestring(Memimage*, Point, Memimage*, Point, Memsubfont*, char*);
146*37da2899SCharles.Forsyth extern void	memellipse(Memimage*, Point, int, int, int, Memimage*, Point, int);
147*37da2899SCharles.Forsyth extern void	memarc(Memimage*, Point, int, int, int, Memimage*, Point, int, int, int);
148*37da2899SCharles.Forsyth extern Rectangle	memlinebbox(Point, Point, int, int, int);
149*37da2899SCharles.Forsyth extern int	memlineendsize(int);
150*37da2899SCharles.Forsyth extern void	_memmkcmap(void);
151*37da2899SCharles.Forsyth extern void	memimageinit(void);
152*37da2899SCharles.Forsyth 
153*37da2899SCharles.Forsyth /*
154*37da2899SCharles.Forsyth  * Subfont management
155*37da2899SCharles.Forsyth  */
156*37da2899SCharles.Forsyth extern Memsubfont*	allocmemsubfont(char*, int, int, int, Fontchar*, Memimage*);
157*37da2899SCharles.Forsyth extern Memsubfont*	openmemsubfont(char*);
158*37da2899SCharles.Forsyth extern void	freememsubfont(Memsubfont*);
159*37da2899SCharles.Forsyth extern Point	memsubfontwidth(Memsubfont*, char*);
160*37da2899SCharles.Forsyth extern Memsubfont*	getmemdefont(void);
161*37da2899SCharles.Forsyth 
162*37da2899SCharles.Forsyth /*
163*37da2899SCharles.Forsyth  * Predefined
164*37da2899SCharles.Forsyth  */
165*37da2899SCharles.Forsyth extern	Memimage*	memwhite;
166*37da2899SCharles.Forsyth extern	Memimage*	memblack;
167*37da2899SCharles.Forsyth extern	Memimage*	memopaque;
168*37da2899SCharles.Forsyth extern	Memimage*	memtransparent;
169*37da2899SCharles.Forsyth extern	Memcmap	*memdefcmap;
170*37da2899SCharles.Forsyth 
171*37da2899SCharles.Forsyth /*
172*37da2899SCharles.Forsyth  * Kernel interface
173*37da2899SCharles.Forsyth  */
174*37da2899SCharles.Forsyth uchar*	attachscreen(Rectangle*, ulong*, int*, int*, int*);
175*37da2899SCharles.Forsyth void		memimagemove(void*, void*);
176*37da2899SCharles.Forsyth 
177*37da2899SCharles.Forsyth /*
178*37da2899SCharles.Forsyth  * Kernel cruft
179*37da2899SCharles.Forsyth  */
180*37da2899SCharles.Forsyth extern void	rdb(void);
181*37da2899SCharles.Forsyth extern int		iprint(char*, ...);
182*37da2899SCharles.Forsyth #pragma varargck argpos iprint 1
183*37da2899SCharles.Forsyth extern int		drawdebug;
184*37da2899SCharles.Forsyth 
185*37da2899SCharles.Forsyth /*
186*37da2899SCharles.Forsyth  * doprint interface: numbconv bit strings
187*37da2899SCharles.Forsyth  */
188*37da2899SCharles.Forsyth #pragma varargck type "llb" vlong
189*37da2899SCharles.Forsyth #pragma varargck type "llb" uvlong
190*37da2899SCharles.Forsyth #pragma varargck type "lb" long
191*37da2899SCharles.Forsyth #pragma varargck type "lb" ulong
192*37da2899SCharles.Forsyth #pragma varargck type "b" int
193*37da2899SCharles.Forsyth #pragma varargck type "b" uint
194*37da2899SCharles.Forsyth 
195