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