blob: b1495ed8225184b8bdb2a7e50275ca75e4c3535e [file] [log] [blame]
rscf7012582003-11-25 01:40:27 +00001#ifndef _MEMDRAW_H_
2#define _MEMDRAW_H_ 1
3#if defined(__cplusplus)
4extern "C" {
5#endif
rsceacc13e2006-06-25 23:49:56 +00006
7AUTOLIB(memdraw)
8AUTOLIB(memlayer)
9
rsc55dedf72003-09-30 19:06:20 +000010typedef struct Memimage Memimage;
11typedef struct Memdata Memdata;
12typedef struct Memsubfont Memsubfont;
13typedef struct Memlayer Memlayer;
14typedef struct Memcmap Memcmap;
15typedef struct Memdrawparam Memdrawparam;
16
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 */
24
25struct 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};
33
34enum {
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 */
rsccbeb0b22006-04-01 19:24:03 +000040 Fbytes = 1<<5 /* has only 8-bit channels */
rsc55dedf72003-09-30 19:06:20 +000041};
42
43struct 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;
51
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;
rsc20093742003-10-11 02:50:20 +000058 int screenref; /* reference count if this is a screen */
rsc55dedf72003-09-30 19:06:20 +000059
60 int shift[NChan];
61 int mask[NChan];
62 int nbits[NChan];
63};
64
65struct Memcmap
66{
67 uchar cmap2rgb[3*256];
68 uchar rgb2cmap[16*16*16];
69};
70
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 */
82
83struct 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};
92
93/*
94 * Encapsulated parameters and information for sub-draw routines.
95 */
96enum {
97 Simplesrc=1<<0,
98 Simplemask=1<<1,
99 Replsrc=1<<2,
100 Replmask=1<<3,
rsccbeb0b22006-04-01 19:24:03 +0000101 Fullsrc=1<<4,
102 Fullmask=1<<5
rsc55dedf72003-09-30 19:06:20 +0000103};
104struct Memdrawparam
105{
106 Memimage *dst;
107 Rectangle r;
108 Memimage *src;
109 Rectangle sr;
110 Memimage *mask;
111 Rectangle mr;
112 int op;
113
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};
121
122/*
123 * Memimage management
124 */
125
126extern Memimage* allocmemimage(Rectangle, u32int);
127extern Memimage* allocmemimaged(Rectangle, u32int, Memdata*, void*);
128extern Memimage* readmemimage(int);
129extern Memimage* creadmemimage(int);
130extern int writememimage(int, Memimage*);
131extern void freememimage(Memimage*);
132extern int loadmemimage(Memimage*, Rectangle, uchar*, int);
133extern int cloadmemimage(Memimage*, Rectangle, uchar*, int);
134extern int unloadmemimage(Memimage*, Rectangle, uchar*, int);
135extern u32int* wordaddr(Memimage*, Point);
136extern uchar* byteaddr(Memimage*, Point);
137extern int drawclip(Memimage*, Rectangle*, Memimage*, Point*,
138 Memimage*, Point*, Rectangle*, Rectangle*);
139extern void memfillcolor(Memimage*, u32int);
140extern int memsetchan(Memimage*, u32int);
141extern u32int pixelbits(Memimage*, Point);
142
143/*
144 * Graphics
145 */
146extern void memdraw(Memimage*, Rectangle, Memimage*, Point,
147 Memimage*, Point, int);
148extern void memline(Memimage*, Point, Point, int, int, int,
149 Memimage*, Point, int);
150extern void mempoly(Memimage*, Point*, int, int, int, int,
151 Memimage*, Point, int);
152extern void memfillpoly(Memimage*, Point*, int, int,
153 Memimage*, Point, int);
154extern void _memfillpolysc(Memimage*, Point*, int, int,
155 Memimage*, Point, int, int, int, int);
156extern void memimagedraw(Memimage*, Rectangle, Memimage*, Point,
157 Memimage*, Point, int);
158extern int hwdraw(Memdrawparam*);
159extern void memimageline(Memimage*, Point, Point, int, int, int,
160 Memimage*, Point, int);
161extern void _memimageline(Memimage*, Point, Point, int, int, int,
162 Memimage*, Point, Rectangle, int);
163extern Point memimagestring(Memimage*, Point, Memimage*, Point,
164 Memsubfont*, char*);
165extern void memellipse(Memimage*, Point, int, int, int,
166 Memimage*, Point, int);
167extern void memarc(Memimage*, Point, int, int, int, Memimage*,
168 Point, int, int, int);
169extern Rectangle memlinebbox(Point, Point, int, int, int);
170extern int memlineendsize(int);
171extern void _memmkcmap(void);
172extern void memimageinit(void);
173
174/*
175 * Subfont management
176 */
177extern Memsubfont* allocmemsubfont(char*, int, int, int, Fontchar*, Memimage*);
178extern Memsubfont* openmemsubfont(char*);
179extern void freememsubfont(Memsubfont*);
180extern Point memsubfontwidth(Memsubfont*, char*);
181extern Memsubfont* getmemdefont(void);
182
183/*
184 * Predefined
185 */
186extern Memimage* memwhite;
187extern Memimage* memblack;
188extern Memimage* memopaque;
189extern Memimage* memtransparent;
190extern Memcmap* memdefcmap;
191
192/*
193 * Kernel interface
194 */
195void memimagemove(void*, void*);
196
197/*
198 * Kernel cruft
199 */
200extern void rdb(void);
201extern int iprint(char*, ...);
202extern int drawdebug;
203
204/*
205 * For other implementations, like x11.
206 */
207extern void _memfillcolor(Memimage*, u32int);
208extern Memimage* _allocmemimage(Rectangle, u32int);
209extern int _cloadmemimage(Memimage*, Rectangle, uchar*, int);
210extern int _loadmemimage(Memimage*, Rectangle, uchar*, int);
211extern void _freememimage(Memimage*);
212extern u32int _rgbatoimg(Memimage*, u32int);
213extern u32int _imgtorgba(Memimage*, u32int);
214extern u32int _pixelbits(Memimage*, Point);
215extern int _unloadmemimage(Memimage*, Rectangle, uchar*, int);
216extern Memdrawparam* _memimagedrawsetup(Memimage*,
217 Rectangle, Memimage*, Point, Memimage*,
218 Point, int);
219extern void _memimagedraw(Memdrawparam*);
220extern void _drawreplacescreenimage(Memimage*);
rscf7012582003-11-25 01:40:27 +0000221
222#if defined(__cplusplus)
223}
224#endif
225#endif