grfabs_reg.h revision 1.7 1 1.7 aymeric /* $NetBSD: grfabs_reg.h,v 1.7 2002/01/26 13:40:56 aymeric Exp $ */
2 1.4 cgd
3 1.1 chopps /*
4 1.1 chopps * Copyright (c) 1994 Christian E. Hopps
5 1.1 chopps * All rights reserved.
6 1.1 chopps *
7 1.1 chopps * Redistribution and use in source and binary forms, with or without
8 1.1 chopps * modification, are permitted provided that the following conditions
9 1.1 chopps * are met:
10 1.1 chopps * 1. Redistributions of source code must retain the above copyright
11 1.1 chopps * notice, this list of conditions and the following disclaimer.
12 1.1 chopps * 2. Redistributions in binary form must reproduce the above copyright
13 1.1 chopps * notice, this list of conditions and the following disclaimer in the
14 1.1 chopps * documentation and/or other materials provided with the distribution.
15 1.1 chopps * 3. All advertising materials mentioning features or use of this software
16 1.1 chopps * must display the following acknowledgement:
17 1.1 chopps * This product includes software developed by Christian E. Hopps.
18 1.1 chopps * 4. The name of the author may not be used to endorse or promote products
19 1.1 chopps * derived from this software without specific prior written permission
20 1.1 chopps *
21 1.1 chopps * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
22 1.1 chopps * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
23 1.1 chopps * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
24 1.1 chopps * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
25 1.1 chopps * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
26 1.1 chopps * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 1.1 chopps * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 1.1 chopps * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 1.1 chopps * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
30 1.1 chopps * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 1.1 chopps */
32 1.1 chopps
33 1.1 chopps #if ! defined (_GRFABS_REG_H)
34 1.1 chopps #define _GRFABS_REG_H
35 1.1 chopps
36 1.2 chopps struct point {
37 1.1 chopps long x;
38 1.1 chopps long y;
39 1.2 chopps };
40 1.2 chopps typedef struct point point_t;
41 1.1 chopps
42 1.2 chopps struct dimension {
43 1.1 chopps u_long width;
44 1.1 chopps u_long height;
45 1.2 chopps };
46 1.2 chopps typedef struct dimension dimen_t;
47 1.1 chopps
48 1.2 chopps struct box {
49 1.1 chopps long x;
50 1.1 chopps long y;
51 1.1 chopps u_long width;
52 1.1 chopps u_long height;
53 1.2 chopps };
54 1.2 chopps typedef struct box box_t;
55 1.1 chopps
56 1.2 chopps struct rectangle {
57 1.1 chopps long left;
58 1.1 chopps long top;
59 1.1 chopps long right;
60 1.1 chopps long bottom;
61 1.2 chopps };
62 1.2 chopps
63 1.2 chopps typedef struct rectangle rect_t;
64 1.1 chopps
65 1.1 chopps typedef struct bitmap bmap_t;
66 1.1 chopps typedef struct colormap colormap_t;
67 1.1 chopps typedef struct view view_t;
68 1.1 chopps typedef struct display_mode dmode_t;
69 1.1 chopps typedef struct monitor monitor_t;
70 1.1 chopps
71 1.2 chopps LIST_HEAD(monitor_list, monitor);
72 1.2 chopps extern struct monitor_list *monitors;
73 1.2 chopps
74 1.1 chopps /*
75 1.1 chopps * Bitmap stuff.
76 1.1 chopps */
77 1.1 chopps
78 1.2 chopps /*
79 1.2 chopps * Note structure is 5 long words big. This may come in handy for
80 1.7 aymeric * contiguous allocations
81 1.7 aymeric *
82 1.1 chopps * Please do fill in everything correctly this is the main input for
83 1.1 chopps * all other programs. In other words all problems with RTG start here.
84 1.1 chopps * If you do not mimic everyone else exactly problems will appear.
85 1.1 chopps * If you need a template look at alloc_bitmap() in grf_cc.c.
86 1.1 chopps *
87 1.7 aymeric * WARNING: the plane array is only for convience, all data for bitplanes
88 1.2 chopps * MUST be contiguous. This is for mapping purposes. The reason
89 1.2 chopps * for the plane pointers and row_mod is to support interleaving
90 1.7 aymeric * on monitors that wish to support this.
91 1.7 aymeric *
92 1.1 chopps * 2nd Warning: Also don't get funky with these pointers you are expected
93 1.2 chopps * to place the start of mappable plane data in ``hardware_address'',
94 1.2 chopps * ``hardware_address'' is the only thing that /dev/view checks and it
95 1.2 chopps * expects the planes to follow with no padding in between. If you have
96 1.2 chopps * special alignment requirements make use of the given fields
97 1.2 chopps * so that the entire contiguous plane data is exactly:
98 1.2 chopps * bytes_per_row*height*depth long starting at the physical address
99 1.2 chopps * contained within hardware_address.
100 1.7 aymeric *
101 1.2 chopps * Final Warning: Plane data must begin on a PAGE address and the allocation
102 1.2 chopps * must be ``n'' PAGES big do to mapping requirements (otherwise the
103 1.2 chopps * user could write over non-allocated memory.
104 1.7 aymeric *
105 1.1 chopps */
106 1.1 chopps struct bitmap {
107 1.2 chopps u_short bytes_per_row; /* number of bytes per display row. */
108 1.2 chopps u_short row_mod; /* number of bytes to reach next row. */
109 1.2 chopps u_short rows; /* number of display rows. */
110 1.2 chopps u_short depth; /* depth of bitmap. */
111 1.2 chopps u_short flags; /* flags. */
112 1.1 chopps u_short pad;
113 1.2 chopps u_char *blit_temp; /* private monitor buffer. */
114 1.2 chopps u_char **plane; /* plane data for bitmap. */
115 1.2 chopps u_char *hardware_address; /* mappable bitplane pointer. */
116 1.1 chopps };
117 1.1 chopps
118 1.1 chopps enum bitmap_flag_bits {
119 1.2 chopps BMB_CLEAR, /* init only. */
120 1.2 chopps BMB_INTERLEAVED, /* init/read. */
121 1.3 chopps BMB_ALIGN64, /* init/read. */
122 1.1 chopps };
123 1.1 chopps
124 1.1 chopps enum bitmap_flags {
125 1.1 chopps BMF_CLEAR = 1 << BMB_CLEAR, /* init only. */
126 1.1 chopps BMF_INTERLEAVED = 1 << BMB_INTERLEAVED, /* init/read. */
127 1.3 chopps BMF_ALIGN64 = 1 << BMB_ALIGN64 /* init/read. */
128 1.1 chopps };
129 1.1 chopps
130 1.1 chopps /* Use these macros to find misc. sizes of actual bitmap */
131 1.2 chopps #define BM_WIDTH(b) ((b)->bytes_per_row << 3)
132 1.2 chopps #define BM_HEIGHT(b) ((b)->rows)
133 1.2 chopps #define BM_ROW(b,p,l) \
134 1.2 chopps ((b)->plane[p] + (((b)->bytes_per_row + (b)->row_mod) * l))
135 1.1 chopps
136 1.1 chopps /*
137 1.1 chopps * Colormap stuff.
138 1.1 chopps */
139 1.1 chopps
140 1.2 chopps /*
141 1.7 aymeric * valid masks are a bitfield of zeros followed by ones that indicate
142 1.7 aymeric * which mask are valid for each component. The ones and zeros will
143 1.1 chopps * be contiguous so adding one to this value yields the number of
144 1.7 aymeric * levels for that component.
145 1.7 aymeric * -ch
146 1.1 chopps */
147 1.1 chopps
148 1.1 chopps struct colormap {
149 1.1 chopps u_char type; /* what type of entries these are. */
150 1.1 chopps union {
151 1.1 chopps /* CM_GREYSCALE */
152 1.1 chopps u_char grey;
153 1.1 chopps #define grey_mask valid_mask.grey
154 1.1 chopps /* CM_COLOR */
155 1.1 chopps struct {
156 1.1 chopps u_char red;
157 1.1 chopps #define red_mask valid_mask.rgb_mask.red
158 1.1 chopps u_char green;
159 1.1 chopps #define green_mask valid_mask.rgb_mask.green
160 1.1 chopps u_char blue;
161 1.1 chopps #define blue_mask valid_mask.rgb_mask.blue
162 1.1 chopps } rgb_mask;
163 1.1 chopps } valid_mask;
164 1.1 chopps u_short first; /* what color register does entry[0] refer to. */
165 1.1 chopps u_short size; /* number of entries */
166 1.2 chopps u_long *entry; /* the table of actual color values. */
167 1.1 chopps };
168 1.1 chopps
169 1.1 chopps enum colormap_type {
170 1.2 chopps CM_MONO, /* only on or off allowed */
171 1.2 chopps CM_GREYSCALE, /* grey vals. */
172 1.2 chopps CM_COLOR /* RGB vals. */
173 1.1 chopps };
174 1.1 chopps
175 1.2 chopps #define CM_FIXVAL(x) (0xff & (x))
176 1.1 chopps
177 1.1 chopps /* these macros are for creating entries */
178 1.2 chopps #define MAKE_COLOR_ENTRY(r,g,b) \
179 1.2 chopps (CM_FIXVAL(r) << 16 | CM_FIXVAL(g) << 8 | CM_FIXVAL(b))
180 1.2 chopps #define MAKE_MONO_ENTRY(x) ((x) ? 1 : 0)
181 1.2 chopps #define MAKE_GREY_ENTRY(l) CM_FIXVAL(l)
182 1.2 chopps
183 1.2 chopps #define CM_LTOW(v) \
184 1.2 chopps (((0x000F0000 & (v)) >> 8) | ((0x00000F00 & (v)) >> 4) | (0xF & (v)))
185 1.2 chopps #define CM_WTOL(v) \
186 1.2 chopps (((0xF00 & (v)) << 8) | ((0x0F0 & (v)) << 4) | (0xF & (v)))
187 1.6 jandberg
188 1.6 jandberg #define CM_GET_RED(entry) (((entry) & 0xFF0000) >> 16)
189 1.6 jandberg #define CM_GET_GREEN(entry) (((entry) & 0x00FF00) >> 8)
190 1.6 jandberg #define CM_GET_BLUE(entry) (((entry) & 0x0000FF))
191 1.6 jandberg #define CM_GET_GREY(entry) (((entry) & 0x0000FF))
192 1.6 jandberg #define CM_GET_MONO(entry) (((entry) & 0x000001))
193 1.1 chopps
194 1.1 chopps /*
195 1.1 chopps * View stuff.
196 1.1 chopps */
197 1.7 aymeric typedef void remove_view_func (view_t *v);
198 1.7 aymeric typedef void free_view_func (view_t *v);
199 1.7 aymeric typedef void display_view_func (view_t *v);
200 1.7 aymeric typedef dmode_t *get_mode_func (view_t *v);
201 1.1 chopps typedef int get_colormap_func (view_t *v, colormap_t *);
202 1.1 chopps typedef int use_colormap_func (view_t *v, colormap_t *);
203 1.1 chopps
204 1.1 chopps struct view {
205 1.2 chopps bmap_t *bitmap; /* bitmap. */
206 1.2 chopps box_t display; /* viewable area. */
207 1.2 chopps void *data; /* view specific data. */
208 1.1 chopps
209 1.1 chopps /* functions */
210 1.2 chopps display_view_func *display_view; /* make this view active */
211 1.2 chopps remove_view_func *remove_view; /* remove this view if active */
212 1.2 chopps free_view_func *free_view; /* free this view */
213 1.2 chopps get_mode_func *get_display_mode;/* get the mode this view belongs to */
214 1.2 chopps get_colormap_func *get_colormap; /* get a color map for registers */
215 1.2 chopps use_colormap_func *use_colormap; /* use color map to load registers */
216 1.1 chopps };
217 1.1 chopps
218 1.2 chopps #define VDISPLAY_LINE(v, p, l) ((v)->bitmap->plane[(p)] +\
219 1.2 chopps (((v)->bitmap->bytes_per_row + (v)->bitmap->row_mod) * l))
220 1.1 chopps
221 1.1 chopps /*
222 1.1 chopps * Mode stuff
223 1.1 chopps */
224 1.1 chopps
225 1.1 chopps typedef view_t *alloc_view_func (dmode_t *mode, dimen_t *dim, u_char depth);
226 1.1 chopps typedef view_t *get_current_view_func (dmode_t *);
227 1.1 chopps typedef monitor_t *get_monitor_func (dmode_t *);
228 1.7 aymeric
229 1.1 chopps struct display_mode {
230 1.2 chopps LIST_ENTRY(display_mode) link;
231 1.2 chopps u_char *name; /* logical name for mode. */
232 1.2 chopps dimen_t nominal_size; /* best fit. */
233 1.2 chopps void *data; /* mode specific flags. */
234 1.2 chopps alloc_view_func *alloc_view; /* allocate a view for this mode. */
235 1.2 chopps get_current_view_func *get_current_view; /* get active view. */
236 1.2 chopps get_monitor_func *get_monitor; /* get monitor that mode belongs to */
237 1.1 chopps };
238 1.1 chopps
239 1.1 chopps /*
240 1.1 chopps * Monitor stuff.
241 1.1 chopps */
242 1.1 chopps typedef void vbl_handler_func (void *);
243 1.1 chopps typedef dmode_t *get_next_mode_func (dmode_t *);
244 1.1 chopps typedef dmode_t *get_current_mode_func (void);
245 1.1 chopps typedef dmode_t *get_best_mode_func (dimen_t *size, u_char depth);
246 1.1 chopps typedef bmap_t *alloc_bitmap_func (u_short w, u_short h, u_short d, u_short f);
247 1.1 chopps typedef void free_bitmap_func (bmap_t *bm);
248 1.1 chopps
249 1.1 chopps struct monitor {
250 1.2 chopps LIST_ENTRY(monitor) link; /* a link into the database. */
251 1.2 chopps u_char *name; /* a logical name for this monitor. */
252 1.2 chopps void *data; /* monitor specific data. */
253 1.2 chopps get_current_mode_func *get_current_mode;
254 1.2 chopps vbl_handler_func *vbl_handler; /* called on every vbl if not NULL */
255 1.2 chopps get_next_mode_func *get_next_mode; /* return next mode in list */
256 1.2 chopps get_best_mode_func *get_best_mode; /* return mode that best fits */
257 1.7 aymeric
258 1.2 chopps alloc_bitmap_func *alloc_bitmap;
259 1.2 chopps free_bitmap_func *free_bitmap;
260 1.1 chopps };
261 1.1 chopps
262 1.1 chopps /*
263 1.1 chopps * Misc draw related macros.
264 1.1 chopps */
265 1.1 chopps
266 1.1 chopps #define BOX_2_RECT(b,r) do { \
267 1.2 chopps (r)->left = (b)->x; (r)->top = (b)->y; \
268 1.2 chopps (r)->right = (b)->x + (b)->width -1; \
269 1.2 chopps (r)->bottom = (b)->y + (b)->height -1; \
270 1.2 chopps } while (0)
271 1.1 chopps
272 1.1 chopps #define RECT_2_BOX(r,b) do { \
273 1.2 chopps (b)->x = (r)->left; \
274 1.2 chopps (b)->y = (r)->top; \
275 1.2 chopps (b)->width = (r)->right - (r)->left +1; \
276 1.2 chopps (b)->height = (r)->bottom - (r)->top +1; \
277 1.2 chopps } while(0)
278 1.1 chopps
279 1.1 chopps #define INIT_BOX(b,xx,yy,ww,hh) do{(b)->x = xx; (b)->y = yy; (b)->width = ww; (b)->height = hh;}while (0)
280 1.1 chopps #define INIT_RECT(rc,l,t,r,b) do{(rc)->left = l; (rc)->right = r; (rc)->top = t; (rc)->bottom = b;}while (0)
281 1.1 chopps #define INIT_POINT(p,xx,yy) do {(p)->x = xx; (p)->y = yy;} while (0)
282 1.1 chopps #define INIT_DIM(d,w,h) do {(d)->width = w; (d)->height = h;} while (0)
283 1.1 chopps
284 1.1 chopps
285 1.1 chopps /*
286 1.1 chopps * Prototypes
287 1.1 chopps */
288 1.1 chopps
289 1.1 chopps /* views */
290 1.7 aymeric view_t * grf_alloc_view(dmode_t *d, dimen_t *dim, u_char depth);
291 1.7 aymeric void grf_display_view(view_t *v);
292 1.7 aymeric void grf_remove_view(view_t *v);
293 1.7 aymeric void grf_free_view(view_t *v);
294 1.7 aymeric dmode_t *grf_get_display_mode(view_t *v);
295 1.7 aymeric int grf_get_colormap(view_t *v, colormap_t *cm);
296 1.7 aymeric int grf_use_colormap(view_t *v, colormap_t *cm);
297 1.5 veego
298 1.1 chopps /* modes */
299 1.7 aymeric view_t *grf_get_current_view(dmode_t *d);
300 1.7 aymeric monitor_t *grf_get_monitor(dmode_t *d);
301 1.5 veego
302 1.1 chopps /* monitors */
303 1.7 aymeric dmode_t * grf_get_next_mode(monitor_t *m, dmode_t *d);
304 1.7 aymeric dmode_t * grf_get_current_mode(monitor_t *);
305 1.7 aymeric dmode_t * grf_get_best_mode(monitor_t *m, dimen_t *size, u_char depth);
306 1.7 aymeric bmap_t * grf_alloc_bitmap(monitor_t *m, u_short w, u_short h,
307 1.7 aymeric u_short d, u_short f);
308 1.7 aymeric void grf_free_bitmap(monitor_t *m, bmap_t *bm);
309 1.5 veego
310 1.7 aymeric int grfcc_probe(void);
311 1.1 chopps
312 1.1 chopps #endif /* _GRFABS_REG_H */
313