8 struct vid_driver *vid_drvlist[MAX_DRV];
11 static struct vid_modeinfo **modes, *cur_mode;
12 static int num_modes, max_modes;
25 num_modes = max_modes = 0;
30 if(dpmi_init() == -1) {
38 for(i=0; i<vid_numdrv; i++) {
39 struct vid_driver *drv = vid_drvlist[i];
43 for(j=0; j<drv->num_modes; j++) {
44 if(num_modes >= max_modes) {
45 int newsz = max_modes ? max_modes * 2 : 8;
46 void *tmp = realloc(modes, newsz * sizeof *modes);
48 fprintf(stderr, "failed to allocate modes list\n");
55 modes[num_modes++] = drv->modes + j;
59 printf("found %d modes:\n", num_modes);
60 for(i=0; i<num_modes; i++) {
61 printf("[%6s] %04x: %dx%d %dbpp\n", modes[i]->drv->name, modes[i]->modeno,
62 modes[i]->width, modes[i]->height, modes[i]->bpp);
68 void vid_cleanup(void)
72 if(cur_mode && cur_mode->modeno != 3) {
76 if(vmem >= (void*)0x100000) {
80 for(i=0; i<vid_numdrv; i++) {
81 struct vid_driver *drv = vid_drvlist[i];
93 return cur_mode->modeno;
98 void *vid_setmode(int mode)
101 struct vid_driver *drv;
103 for(i=0; i<num_modes; i++) {
104 if(modes[i]->modeno == mode) {
106 if(drv->ops->setmode(mode) == 0) {
109 if(vmem >= (void*)0x100000) {
114 if(modes[i]->vmem_addr < 0x100000) {
115 vmem = (void*)modes[i]->vmem_addr;
118 vmem = dpmi_mmap(modes[i]->vmem_addr, modes[i]->vmem_size);
119 vmem_size = modes[i]->vmem_size;
128 #define EQUIV_BPP(a, b) \
129 ((a) == (b) || ((a) == 16 && (b) == 15) || ((a) == 15 && (b) == 16) || \
130 ((a) == 24 && (b) == 32) || ((a) == 32 && (b) == 24))
132 int vid_findmode(int xsz, int ysz, int bpp)
136 for(i=0; i<num_modes; i++) {
137 if(modes[i]->width == xsz && modes[i]->height == ysz && modes[i]->bpp == bpp) {
138 return modes[i]->modeno;
142 /* try fuzzy bpp matching */
143 for(i=0; i<num_modes; i++) {
144 if(modes[i]->width == xsz && modes[i]->height == ysz &&
145 EQUIV_BPP(modes[i]->bpp, bpp)) {
146 return modes[i]->modeno;
154 struct vid_modeinfo *vid_modeinfo(int mode)
158 for(i=0; i<num_modes; i++) {
159 if(modes[i]->modeno == mode) {
171 void vid_setpal(int idx, int count, const struct vid_color *col)
173 cur_mode->ops.setpal(idx, count, col);
176 void vid_getpal(int idx, int count, struct vid_color *col)
178 cur_mode->ops.getpal(idx, count, col);