Blob


1 .TH MEMLAYER 3
2 .SH NAME
3 memdraw, memlalloc, memldelete, memlexpose, memlfree, memlhide, memline, memlnorefresh, memload, memunload, memlorigin, memlsetrefresh, memltofront, memltofrontn, memltorear, memltorearn \- windows of memory-resident images
4 .SH SYNOPSIS
5 .nf
6 .B #include <u.h>
7 .br
8 .B #include <libc.h>
9 .br
10 .B #include <draw.h>
11 .br
12 .B #include <memdraw.h>
13 .br
14 .B #include <memlayer.h>
15 .PP
16 .ft L
17 typedef struct Memscreen Memscreen;
18 typedef struct Memlayer Memlayer;
19 typedef void (*Refreshfn)(Memimage*, Rectangle, void*);
20 .ta 4n +\w'\fLRefreshfn 'u +\w'\fL*frontmost; 'u
22 struct Memscreen
23 {
24 Memimage *frontmost; /* frontmost layer on screen */
25 Memimage *rearmost; /* rearmost layer on screen */
26 Memimage *image; /* upon which all layers are drawn */
27 Memimage *fill; /* if non-zero, picture to use when repainting */
28 };
30 struct Memlayer
31 {
32 Rectangle screenr; /* true position of layer on screen */
33 Point delta; /* add delta to go from image coords to screen */
34 Memscreen *screen; /* screen this layer belongs to */
35 Memimage *front; /* window in front of this one */
36 Memimage *rear; /* window behind this one*/
37 int clear; /* layer is fully visible */
38 Memimage *save; /* save area for obscured parts */
39 Refreshfn refreshfn; /* fn to refresh obscured parts if save==nil */
40 void *refreshptr; /* argument to refreshfn */
41 };
42 .ft
43 .ta \w'\fLMemimage* 'u
44 .PP
45 .B
46 Memimage* memlalloc(Memscreen *s, Rectangle r, Refreshfn fn, void *arg, ulong col)
47 .PP
48 .B void memlnorefresh(Memimage *i, Rectangle r, void *arg)
49 .PP
50 .B
51 int memlsetrefresh(Memimage *i, Refreshfn fn, void *arg)
52 .PP
53 .B
54 int memldelete(Memimage *i)
55 .PP
56 .B
57 int memlfree(Memimage *i)
58 .PP
59 .B
60 int memlexpose(Memimage *i, Rectangle r)
61 .PP
62 .B
63 int memlhide(Memimage *i, Rectangle r)
64 .PP
65 .B
66 void memltofront(Memimage *i)
67 .PP
68 .B
69 void memltofrontn(Memimage**ia, int n)
70 .PP
71 .B
72 void memltorear(Memimage *i)
73 .PP
74 .B
75 void memltorearn(Memimage **ia , int n)
76 .PP
77 .B
78 int memlorigin(Memimage *i, Point log, Point phys)
79 .PP
80 .B
81 void memdraw(Image *dst, Rectangle r,
82 .br
83 .B
84 Image *src, Point sp, Image *mask, Point mp, Drawop op)
85 .fi
86 .B
87 int memload(Memimage *i, Rectangle r,
88 .br
89 .B
90 uchar *buf, int n, int iscompressed)
91 .PP
92 .B
93 int memunload(Memimage *i, Rectangle r,
94 .br
95 .B
96 uchar *buf, int n)
97 .PP
98 .SH DESCRIPTION
99 These functions build upon the
100 .MR memdraw (3)
101 interface to maintain overlapping graphical windows on in-memory images.
102 They are used by the kernel to implement the windows interface presented by
103 .MR draw (3)
104 and
105 .MR window (3)
106 and probably have little use outside of the kernel.
107 .PP
108 The basic function is to extend the definition of a
109 .B Memimage
110 (see
111 .MR memdraw (3) )
112 to include overlapping windows defined by the
113 .B Memlayer
114 type.
115 The first fields of the
116 .B Memlayer
117 structure are identical to those in
118 .BR Memimage ,
119 permitting a function that expects a
120 .B Memimage
121 to be passed a
122 .BR Memlayer ,
123 and vice versa.
124 Both structures have a
125 .B save
126 field, which is nil in a
127 .B Memimage
128 and points to `backing store' in a
129 .BR Memlayer .
130 The layer routines accept
131 .B Memimages
132 or
133 .BR Memlayers ;
134 if the image is a
135 .B Memimage
136 the underlying
137 .B Memimage
138 routine is called; otherwise the layer routines recursively
139 subdivide the geometry, reducing the operation into a smaller
140 component that ultimately can be performed on a
141 .BR Memimage ,
142 either the display on which the window appears, or the backing store.
143 .PP
144 .B Memlayers
145 are associated with a
146 .B Memscreen
147 that holds the data structures to maintain the windows and connects
148 them to the associated
149 .BR image .
150 The
151 .B fill
152 color is used to paint the background when a window is deleted.
153 There is no function to establish a
154 .BR Memscreen ;
155 to create one, allocate the memory, zero
156 .B frontmost
157 and
158 .BR rearmost ,
159 set
160 .B fill
161 to a valid fill color or image, and set
162 .B image
163 to the
164 .B Memimage
165 (or
166 .BR Memlayer )
167 on which the windows will be displayed.
168 .PP
169 .I Memlalloc
170 allocates a
171 .B Memlayer
172 of size
173 .I r
174 on
175 .B Memscreen
176 .IR s .
177 If
178 .I col
179 is not
180 .BR DNofill ,
181 the new window will be initialized by painting it that color.
182 .PP
183 The refresh function
184 .I fn
185 and associated argument
186 .I arg
187 will be called by routines in the library to restore portions of the window
188 uncovered due to another window being deleted or this window being pulled to the front of the stack.
189 The function, when called,
190 receives a pointer to the image (window) being refreshed, the rectangle that has been uncovered,
191 and the
192 .I arg
193 recorded when the window was created.
194 A couple of predefined functions provide built-in management methods:
195 .I memlnorefresh
196 does no backup at all, useful for making efficient temporary windows;
197 while a
198 .I nil
199 function specifies that the backing store
200 .RB ( Memlayer.save )
201 will be used to keep the obscured data.
202 Other functions may be provided by the client.
203 .I Memlsetrefresh
204 allows one to change the function associated with the window.
205 .PP
206 .I Memldelete
207 deletes the window
208 .IR i ,
209 restoring the underlying display.
210 .I Memlfree
211 frees the data structures without unlinking the window from the associated
212 .B Memscreen
213 or doing any graphics.
214 .PP
215 .I Memlexpose
216 restores rectangle
217 .I r
218 within the window, using the backing store or appropriate refresh method.
219 .I Memlhide
220 goes the other way, backing up
221 .I r
222 so that that portion of the screen may be modified without losing the data in this window.
223 .PP
224 .I Memltofront
225 pulls
226 .I i
227 to the front of the stack of windows, making it fully visible.
228 .I Memltofrontn
229 pulls the
230 .I n
231 windows in the array
232 .I ia
233 to the front as a group, leaving their internal order unaffected.
234 .I Memltorear
235 and
236 .I memltorearn
237 push the windows to the rear.
238 .PP
239 .I Memlorigin
240 changes the coordinate systems associated with the window
241 .IR i .
242 The points
243 .I log
244 and
245 .I phys
246 represent the upper left corner
247 .RB ( min )
248 of the window's internal coordinate system and its physical location on the screen.
249 Changing
250 .I log
251 changes the interpretation of coordinates within the window; for example, setting it to
252 (0,\ 0) makes the upper left corner of the window appear to be the origin of the coordinate
253 system, regardless of its position on the screen.
254 Changing
255 .I phys
256 changes the physical location of the window on the screen.
257 When a window is created, its logical and physical coordinates are the same, so
258 .EX
259 memlorigin(i, i->r.min, i->r.min)
260 .EE
261 would be a no-op.
262 .PP
263 .I Memdraw
264 and
265 .I memline
266 are implemented in the layer library but provide the main entry points for drawing on
267 memory-resident windows.
268 They have the signatures of
269 .I memimagedraw
270 and
271 .I memimageline
272 (see
273 .MR memdraw (3) )
274 but accept
275 .B Memlayer
276 or
277 .B Memimage
278 arguments both.
279 .PP
280 .I Memload
281 and
282 .I memunload
283 are similarly layer-savvy versions of
284 .I loadmemimage
285 and
286 .IR unloadmemimage .
287 The
288 .I iscompressed
289 flag to
290 .I memload
291 specifies whether the
292 .I n
293 bytes of data in
294 .I buf
295 are in compressed image format
296 (see
297 .MR image (7) ).
298 .SH SOURCE
299 .B \*9/src/libmemlayer
300 .SH SEE ALSO
301 .MR graphics (3) ,
302 .MR memdraw (3) ,
303 .MR stringsize (3) ,
304 .MR window (3) ,
305 .MR draw (3)