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