Blob


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