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