1 1.7 aymeric /* $NetBSD: grfabs.c,v 1.7 2002/01/28 09:56:57 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.4 cgd */ 32 1.7 aymeric 33 1.7 aymeric #include <sys/cdefs.h> 34 1.7 aymeric __KERNEL_RCSID(0, "$NetBSD: grfabs.c,v 1.7 2002/01/28 09:56:57 aymeric Exp $"); 35 1.4 cgd 36 1.4 cgd /* 37 1.1 chopps * amiga abstract graphics driver. 38 1.1 chopps */ 39 1.2 chopps #include <sys/param.h> 40 1.2 chopps #include <sys/queue.h> 41 1.1 chopps 42 1.2 chopps #include <amiga/amiga/color.h> 43 1.1 chopps #include <amiga/amiga/cc.h> 44 1.1 chopps #include <amiga/dev/grfabs_reg.h> 45 1.1 chopps 46 1.1 chopps /* 47 1.1 chopps * General and init. 48 1.1 chopps */ 49 1.1 chopps 50 1.1 chopps /* add your monitor here. */ 51 1.1 chopps monitor_t *cc_init_monitor (void); 52 1.1 chopps 53 1.1 chopps /* and here. */ 54 1.1 chopps monitor_t *(*init_monitor[])(void) = { 55 1.6 aymeric cc_init_monitor, 56 1.1 chopps NULL 57 1.1 chopps }; 58 1.1 chopps 59 1.2 chopps struct monitor_list instance_monitors, *monitors; 60 1.1 chopps 61 1.1 chopps struct vbl_node grf_vbl_node; 62 1.1 chopps 63 1.1 chopps #define ABS(type, val) \ 64 1.2 chopps (type) (((int)(val) < 0) ? -(val) : (val)) 65 1.1 chopps 66 1.6 aymeric void grf_vbl_function(void *data); 67 1.6 aymeric dmode_t *get_best_display_mode(u_long, u_long, u_char); 68 1.5 veego 69 1.5 veego 70 1.1 chopps void 71 1.6 aymeric grf_vbl_function(void *data) 72 1.1 chopps { 73 1.2 chopps monitor_t *m; 74 1.2 chopps 75 1.2 chopps if (monitors == NULL) 76 1.2 chopps return; 77 1.1 chopps 78 1.2 chopps for (m = monitors->lh_first; m != NULL; m = m->link.le_next) { 79 1.6 aymeric if (m->vbl_handler) 80 1.2 chopps m->vbl_handler(m); 81 1.1 chopps } 82 1.1 chopps } 83 1.1 chopps 84 1.1 chopps /* 85 1.1 chopps * XXX: called from ite console init routine. 86 1.1 chopps * Does just what configure will do later but without printing anything. 87 1.1 chopps */ 88 1.1 chopps 89 1.1 chopps int 90 1.6 aymeric grfcc_probe(void) 91 1.1 chopps { 92 1.1 chopps int i = 0; 93 1.6 aymeric 94 1.1 chopps grf_vbl_node.function = grf_vbl_function; 95 1.6 aymeric 96 1.1 chopps if (NULL == monitors) { 97 1.2 chopps LIST_INIT(&instance_monitors); 98 1.1 chopps monitors = &instance_monitors; 99 1.6 aymeric 100 1.1 chopps while (init_monitor[i]) { 101 1.1 chopps init_monitor[i] (); 102 1.1 chopps i++; 103 1.1 chopps } 104 1.1 chopps if (i) { 105 1.2 chopps add_vbl_function(&grf_vbl_node, 1, 0); 106 1.2 chopps return(1); 107 1.1 chopps } 108 1.2 chopps return(0); 109 1.1 chopps } 110 1.2 chopps return(1); 111 1.1 chopps } 112 1.1 chopps 113 1.1 chopps dmode_t * 114 1.6 aymeric get_best_display_mode(u_long width, u_long height, u_char depth) 115 1.1 chopps { 116 1.2 chopps monitor_t *m; 117 1.2 chopps dmode_t *d, *save; 118 1.2 chopps dimen_t dim; 119 1.5 veego long dx, dy, ct, dt = 0; 120 1.6 aymeric 121 1.2 chopps save = NULL; 122 1.2 chopps for (m = monitors->lh_first; m != NULL; m = m->link.le_next) { 123 1.1 chopps dim.width = width; 124 1.1 chopps dim.height = height; 125 1.2 chopps d = m->get_best_mode(&dim, depth); 126 1.1 chopps if (d) { 127 1.2 chopps dx = ABS(long, (d->nominal_size.width - width)); 128 1.2 chopps dy = ABS(long, (d->nominal_size.height - height)); 129 1.1 chopps ct = dx + dy; 130 1.1 chopps 131 1.1 chopps if (ct < dt || save == NULL) { 132 1.1 chopps save = d; 133 1.1 chopps dt = ct; 134 1.1 chopps } 135 1.6 aymeric } 136 1.1 chopps } 137 1.2 chopps return(save); 138 1.1 chopps } 139 1.1 chopps 140 1.1 chopps 141 1.1 chopps /* 142 1.1 chopps * Monitor stuff. 143 1.1 chopps */ 144 1.1 chopps 145 1.1 chopps dmode_t * 146 1.6 aymeric grf_get_next_mode(monitor_t *m, dmode_t *d) 147 1.1 chopps { 148 1.2 chopps return(m->get_next_mode(d)); 149 1.1 chopps } 150 1.1 chopps 151 1.1 chopps dmode_t * 152 1.6 aymeric grf_get_current_mode(monitor_t *m) 153 1.1 chopps { 154 1.2 chopps return(m->get_current_mode()); 155 1.1 chopps } 156 1.1 chopps 157 1.1 chopps dmode_t * 158 1.6 aymeric grf_get_best_mode(monitor_t *m, dimen_t *size, u_char depth) 159 1.1 chopps { 160 1.2 chopps return(m->get_best_mode(size, depth)); 161 1.1 chopps } 162 1.1 chopps 163 1.1 chopps bmap_t * 164 1.6 aymeric grf_alloc_bitmap(monitor_t *m, u_short w, u_short h, u_short d, u_short f) 165 1.1 chopps { 166 1.2 chopps return(m->alloc_bitmap(w, h, d, f)); 167 1.1 chopps } 168 1.1 chopps 169 1.1 chopps void 170 1.6 aymeric grf_free_bitmap(monitor_t *m, bmap_t *bm) 171 1.1 chopps { 172 1.2 chopps m->free_bitmap(bm); 173 1.1 chopps } 174 1.1 chopps 175 1.1 chopps /* 176 1.1 chopps * Mode stuff. 177 1.1 chopps */ 178 1.1 chopps 179 1.1 chopps view_t * 180 1.6 aymeric grf_get_current_view(dmode_t *d) 181 1.1 chopps { 182 1.2 chopps return(d->get_current_view(d)); 183 1.1 chopps } 184 1.1 chopps 185 1.1 chopps monitor_t * 186 1.6 aymeric grf_get_monitor(dmode_t *d) 187 1.1 chopps { 188 1.2 chopps return(d->get_monitor(d)); 189 1.1 chopps } 190 1.1 chopps 191 1.1 chopps /* 192 1.1 chopps * View stuff. 193 1.1 chopps */ 194 1.1 chopps 195 1.1 chopps void 196 1.6 aymeric grf_display_view(view_t *v) 197 1.1 chopps { 198 1.2 chopps v->display_view(v); 199 1.1 chopps } 200 1.1 chopps 201 1.1 chopps view_t * 202 1.6 aymeric grf_alloc_view(dmode_t *d, dimen_t *dim, u_char depth) 203 1.1 chopps { 204 1.1 chopps if (!d) 205 1.2 chopps d = get_best_display_mode(dim->width, dim->height, depth); 206 1.6 aymeric if (d) 207 1.2 chopps return(d->alloc_view(d, dim, depth)); 208 1.2 chopps return(NULL); 209 1.1 chopps } 210 1.1 chopps 211 1.1 chopps void 212 1.6 aymeric grf_remove_view(view_t *v) 213 1.1 chopps { 214 1.2 chopps v->remove_view(v); 215 1.1 chopps } 216 1.1 chopps 217 1.1 chopps void 218 1.6 aymeric grf_free_view(view_t *v) 219 1.1 chopps { 220 1.2 chopps v->free_view(v); 221 1.1 chopps } 222 1.1 chopps 223 1.1 chopps dmode_t * 224 1.6 aymeric grf_get_display_mode(view_t *v) 225 1.1 chopps { 226 1.2 chopps return(v->get_display_mode(v)); 227 1.1 chopps } 228 1.1 chopps 229 1.1 chopps int 230 1.6 aymeric grf_get_colormap(view_t *v, colormap_t *cm) 231 1.1 chopps { 232 1.2 chopps return(v->get_colormap(v, cm)); 233 1.1 chopps } 234 1.1 chopps 235 1.1 chopps int 236 1.6 aymeric grf_use_colormap(view_t *v, colormap_t *cm) 237 1.1 chopps { 238 1.2 chopps return(v->use_colormap(v, cm)); 239 1.1 chopps } 240