blob: 93f34a0a0d206f414f9577cba36e6236ffb34bee [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
rsc55dedf72003-09-30 19:06:20 +00006typedef struct Memimage Memimage;
7typedef struct Memdata Memdata;
8typedef struct Memsubfont Memsubfont;
9typedef struct Memlayer Memlayer;
10typedef struct Memcmap Memcmap;
11typedef 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
21struct Memdata
22{
23 u32int *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
30enum {
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
39struct 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 u32int 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 u32int width; /* width in words of a single scan line */
51 Memlayer *layer; /* nil if not a layer*/
52 u32int flags;
53 void *X;
rsc20093742003-10-11 02:50:20 +000054 int screenref; /* reference count if this is a screen */
rsc55dedf72003-09-30 19:06:20 +000055
56 int shift[NChan];
57 int mask[NChan];
58 int nbits[NChan];
59};
60
61struct 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
79struct 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 */
92enum {
93 Simplesrc=1<<0,
94 Simplemask=1<<1,
95 Replsrc=1<<2,
96 Replmask=1<<3,
97 Fullmask=1<<4,
98};
99struct 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 u32int state;
110 u32int mval; /* if Simplemask, the mask pixel in mask format */
111 u32int mrgba; /* mval in rgba */
112 u32int sval; /* if Simplesrc, the source pixel in src format */
113 u32int srgba; /* sval in rgba */
114 u32int sdval; /* sval in dst format */
115};
116
117/*
118 * Memimage management
119 */
120
121extern Memimage* allocmemimage(Rectangle, u32int);
122extern Memimage* allocmemimaged(Rectangle, u32int, Memdata*, void*);
123extern Memimage* readmemimage(int);
124extern Memimage* creadmemimage(int);
125extern int writememimage(int, Memimage*);
126extern void freememimage(Memimage*);
127extern int loadmemimage(Memimage*, Rectangle, uchar*, int);
128extern int cloadmemimage(Memimage*, Rectangle, uchar*, int);
129extern int unloadmemimage(Memimage*, Rectangle, uchar*, int);
130extern u32int* wordaddr(Memimage*, Point);
131extern uchar* byteaddr(Memimage*, Point);
132extern int drawclip(Memimage*, Rectangle*, Memimage*, Point*,
133 Memimage*, Point*, Rectangle*, Rectangle*);
134extern void memfillcolor(Memimage*, u32int);
135extern int memsetchan(Memimage*, u32int);
136extern u32int pixelbits(Memimage*, Point);
137
138/*
139 * Graphics
140 */
141extern void memdraw(Memimage*, Rectangle, Memimage*, Point,
142 Memimage*, Point, int);
143extern void memline(Memimage*, Point, Point, int, int, int,
144 Memimage*, Point, int);
145extern void mempoly(Memimage*, Point*, int, int, int, int,
146 Memimage*, Point, int);
147extern void memfillpoly(Memimage*, Point*, int, int,
148 Memimage*, Point, int);
149extern void _memfillpolysc(Memimage*, Point*, int, int,
150 Memimage*, Point, int, int, int, int);
151extern void memimagedraw(Memimage*, Rectangle, Memimage*, Point,
152 Memimage*, Point, int);
153extern int hwdraw(Memdrawparam*);
154extern void memimageline(Memimage*, Point, Point, int, int, int,
155 Memimage*, Point, int);
156extern void _memimageline(Memimage*, Point, Point, int, int, int,
157 Memimage*, Point, Rectangle, int);
158extern Point memimagestring(Memimage*, Point, Memimage*, Point,
159 Memsubfont*, char*);
160extern void memellipse(Memimage*, Point, int, int, int,
161 Memimage*, Point, int);
162extern void memarc(Memimage*, Point, int, int, int, Memimage*,
163 Point, int, int, int);
164extern Rectangle memlinebbox(Point, Point, int, int, int);
165extern int memlineendsize(int);
166extern void _memmkcmap(void);
167extern void memimageinit(void);
168
169/*
170 * Subfont management
171 */
172extern Memsubfont* allocmemsubfont(char*, int, int, int, Fontchar*, Memimage*);
173extern Memsubfont* openmemsubfont(char*);
174extern void freememsubfont(Memsubfont*);
175extern Point memsubfontwidth(Memsubfont*, char*);
176extern Memsubfont* getmemdefont(void);
177
178/*
179 * Predefined
180 */
181extern Memimage* memwhite;
182extern Memimage* memblack;
183extern Memimage* memopaque;
184extern Memimage* memtransparent;
185extern Memcmap* memdefcmap;
186
187/*
188 * Kernel interface
189 */
190void memimagemove(void*, void*);
191
192/*
193 * Kernel cruft
194 */
195extern void rdb(void);
196extern int iprint(char*, ...);
197extern int drawdebug;
198
199/*
200 * For other implementations, like x11.
201 */
202extern void _memfillcolor(Memimage*, u32int);
203extern Memimage* _allocmemimage(Rectangle, u32int);
204extern int _cloadmemimage(Memimage*, Rectangle, uchar*, int);
205extern int _loadmemimage(Memimage*, Rectangle, uchar*, int);
206extern void _freememimage(Memimage*);
207extern u32int _rgbatoimg(Memimage*, u32int);
208extern u32int _imgtorgba(Memimage*, u32int);
209extern u32int _pixelbits(Memimage*, Point);
210extern int _unloadmemimage(Memimage*, Rectangle, uchar*, int);
211extern Memdrawparam* _memimagedrawsetup(Memimage*,
212 Rectangle, Memimage*, Point, Memimage*,
213 Point, int);
214extern void _memimagedraw(Memdrawparam*);
215extern void _drawreplacescreenimage(Memimage*);
rscf7012582003-11-25 01:40:27 +0000216
217#if defined(__cplusplus)
218}
219#endif
220#endif