]> git.lizzy.rs Git - plan9front.git/blob - sys/include/memdraw.h
merge
[plan9front.git] / sys / include / memdraw.h
1 #pragma src     "/sys/src/libmemdraw"
2 #pragma lib     "libmemdraw.a"
3
4 typedef struct  Memimage Memimage;
5 typedef struct  Memdata Memdata;
6 typedef struct  Memsubfont Memsubfont;
7 typedef struct  Memlayer Memlayer;
8 typedef struct  Memcmap Memcmap;
9 typedef struct  Memdrawparam    Memdrawparam;
10
11 #pragma incomplete Memlayer
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
59 struct Memcmap
60 {
61         uchar   cmap2rgb[3*256];
62         uchar   rgb2cmap[16*16*16];
63 };
64
65 /*
66  * Subfonts
67  *
68  * given char c, Subfont *f, Fontchar *i, and Point p, one says
69  *      i = f->info+c;
70  *      draw(b, Rect(p.x+i->left, p.y+i->top,
71  *              p.x+i->left+((i+1)->x-i->x), p.y+i->bottom),
72  *              color, f->bits, Pt(i->x, i->top));
73  *      p.x += i->width;
74  * to draw characters in the specified color (itself a Memimage) in Memimage b.
75  */
76
77 struct  Memsubfont
78 {
79         char            *name;
80         short   n;              /* number of chars in font */
81         uchar   height;         /* height of bitmap */
82         char    ascent;         /* top of bitmap to baseline */
83         Fontchar *info;         /* n+1 character descriptors */
84         Memimage        *bits;          /* of font */
85 };
86
87 /*
88  * Encapsulated parameters and information for sub-draw routines.
89  */
90 enum {
91         Simplesrc=1<<0,
92         Simplemask=1<<1,
93         Replsrc=1<<2,
94         Replmask=1<<3,
95         Fullmask=1<<4,
96 };
97 struct  Memdrawparam
98 {
99         Memimage *dst;
100         Rectangle       r;
101         Memimage *src;
102         Rectangle sr;
103         Memimage *mask;
104         Rectangle mr;
105         int op;
106
107         ulong state;
108         ulong mval;     /* if Simplemask, the mask pixel in mask format */
109         ulong mrgba;    /* mval in rgba */
110         ulong sval;     /* if Simplesrc, the source pixel in src format */
111         ulong srgba;    /* sval in rgba */
112         ulong sdval;    /* sval in dst format */
113 };
114
115 /*
116  * Memimage management
117  */
118
119 extern Memimage*        allocmemimage(Rectangle, ulong);
120 extern Memimage*        allocmemimaged(Rectangle, ulong, Memdata*);
121 extern Memimage*        readmemimage(int);
122 extern Memimage*        creadmemimage(int);
123 extern int      writememimage(int, Memimage*);
124 extern void     freememimage(Memimage*);
125 extern int              loadmemimage(Memimage*, Rectangle, uchar*, int);
126 extern int              cloadmemimage(Memimage*, Rectangle, uchar*, int);
127 extern int              unloadmemimage(Memimage*, Rectangle, uchar*, int);
128 extern ulong*   wordaddr(Memimage*, Point);
129 extern uchar*   byteaddr(Memimage*, Point);
130 extern int              drawclipnorepl(Memimage*, Rectangle*, Memimage*, Point*, Memimage*, Point*, Rectangle*, Rectangle*);
131 extern int              drawclip(Memimage*, Rectangle*, Memimage*, Point*, Memimage*, Point*, Rectangle*, Rectangle*);
132 extern void     memfillcolor(Memimage*, ulong);
133 extern int              memsetchan(Memimage*, ulong);
134
135 /*
136  * Graphics
137  */
138 extern void     memdraw(Memimage*, Rectangle, Memimage*, Point, Memimage*, Point, int);
139 extern void     memline(Memimage*, Point, Point, int, int, int, Memimage*, Point, int);
140 extern void     mempoly(Memimage*, Point*, int, int, int, int, Memimage*, Point, int);
141 extern void     memfillpoly(Memimage*, Point*, int, int, Memimage*, Point, int);
142 extern void     _memfillpolysc(Memimage*, Point*, int, int, Memimage*, Point, int, int, int, int);
143 extern void     memimagedraw(Memimage*, Rectangle, Memimage*, Point, Memimage*, Point, int);
144 extern int      hwdraw(Memdrawparam*);
145 extern void     memimageline(Memimage*, Point, Point, int, int, int, Memimage*, Point, int);
146 extern void     _memimageline(Memimage*, Point, Point, int, int, int, Memimage*, Point, Rectangle, int);
147 extern Point    memimagestring(Memimage*, Point, Memimage*, Point, Memsubfont*, char*);
148 extern void     memellipse(Memimage*, Point, int, int, int, Memimage*, Point, int);
149 extern void     memarc(Memimage*, Point, int, int, int, Memimage*, Point, int, int, int);
150 extern Rectangle        memlinebbox(Point, Point, int, int, int);
151 extern int      memlineendsize(int);
152 extern void     _memmkcmap(void);
153 extern int      memimageinit(void);
154
155 /*
156  * Subfont management
157  */
158 extern Memsubfont*      allocmemsubfont(char*, int, int, int, Fontchar*, Memimage*);
159 extern Memsubfont*      openmemsubfont(char*);
160 extern void     freememsubfont(Memsubfont*);
161 extern Point    memsubfontwidth(Memsubfont*, char*);
162 extern Memsubfont*      getmemdefont(void);
163
164 /*
165  * Predefined 
166  */
167 extern  Memimage*       memwhite;
168 extern  Memimage*       memblack;
169 extern  Memimage*       memopaque;
170 extern  Memimage*       memtransparent;
171 extern  Memcmap *memdefcmap;
172
173 /*
174  * Kernel interface
175  */
176 void            memimagemove(void*, void*);
177
178 /*
179  * doprint interface: numbconv bit strings
180  */
181 #pragma varargck type "llb" vlong
182 #pragma varargck type "llb" uvlong
183 #pragma varargck type "lb" long
184 #pragma varargck type "lb" ulong
185 #pragma varargck type "b" int
186 #pragma varargck type "b" uint
187