1 
2 /*                                                                 */
3 /* This library is free software; you can redistribute it and/or   */
4 /* modify it without any restrictions. This library is distributed */
5 /* in the hope that it will be useful, but without any warranty.   */
6 
7 /* Multi-chipset support Copyright 1993 Harm Hanemaayer */
8 /* partially copyrighted (C) 1993 by Hartmut Schirmer */
9 
10 #include <stdlib.h>
11 #include <stdio.h>
12 #include <string.h>
13 
14 #include "vga.h"
15 #include "libvga.h"
16 
17 
18 #define MODENAME_LENGTH 20
19 
20 /* This is set by vga.c if there's a 'default_mode' line in the config */
21 extern int __svgalib_default_mode;
22 
23 /* This one won't type an error message ... */
__svgalib_name2number(char * m)24 int __svgalib_name2number(char *m)
25 {
26     int i;
27 
28     for (i = G320x200x16; i <= GLASTMODE; i++) {
29 	if (strcasecmp(m, vga_getmodename(i)) == 0)	/* check name */
30 	    return i;
31     }
32     return -1;
33 }
34 
vga_getmodenumber(char * m)35 int vga_getmodenumber(char *m)
36 {
37     int i;
38     char s[3];
39 
40     __svgalib_getchipset();		/* Do initialisation first */
41     i = __svgalib_name2number(m);
42     if (i > 0)
43 	return i;
44 
45     for (i = G320x200x16; i <= GLASTMODE; i++) {
46 	sprintf(s, "%d", i);
47 	if (strcasecmp(m, s) == 0)	/* check number */
48 	    return i;
49     }
50     if (strcasecmp(m, "PROMPT") == 0)
51 	return -1;
52 
53     fprintf(stderr, "Invalid graphics mode \'%s\'.\n", m);
54     return -1;
55 }
56 
57 char *
vga_getmodename(int m)58  vga_getmodename(int m)
59 {
60     static char modename[MODENAME_LENGTH];
61     int x, y, c;
62 
63     if (m <= TEXT || m > GLASTMODE)
64 	return "";
65     x = __svgalib_infotable[m].xdim;
66     y = __svgalib_infotable[m].ydim;
67     switch (c = __svgalib_infotable[m].colors) {
68     case 1 << 15:
69 	sprintf(modename, "G%dx%dx32K", x, y);
70 	break;
71     case 1 << 16:
72 	sprintf(modename, "G%dx%dx64K", x, y);
73 	break;
74     case 1 << 24:
75 	sprintf(modename, (__svgalib_infotable[m].bytesperpixel == 3) ?
76 		"G%dx%dx16M" : "G%dx%dx16M32", x, y);
77 	break;
78     default:
79 	sprintf(modename, "G%dx%dx%d", x, y, c);
80 	break;
81     }
82     return modename;
83 }
84 
vga_getdefaultmode(void)85 int vga_getdefaultmode(void) {
86     char *stmp = getenv("SVGALIB_DEFAULT_MODE");
87 
88 /* Process env var first so mode might be overridden by it. */
89     if (stmp != NULL && strcmp(stmp, "") != 0) {
90       int mode;
91       if ( (mode = vga_getmodenumber(stmp)) != -1)
92 	return mode;
93     } else if (__svgalib_default_mode) {
94       return __svgalib_default_mode;
95     }
96     return -1;	/* Not defined */
97 }
98 
99 /* find the mode with minimal resolution (defined as num of pixels) that
100 can display x*y */
vga_getoptmode(int x,int y,int colors,int bytesperpixel,int c)101 int vga_getoptmode(int x, int y, int colors, int bytesperpixel, int c)
102 {
103    int i;
104    int cur,size;
105 
106    cur=-1;
107    size=1<<24;
108 
109    for(i=0;i<GLASTMODE;i++)
110       if( vga_hasmode(i)&&
111          (infotable[i].colors==colors)&&
112          (infotable[i].bytesperpixel==bytesperpixel)&&
113          (infotable[i].xdim>=x)&&
114          (infotable[i].ydim>=y)&&
115          (infotable[i].ydim*infotable[i].xdim<size)) {
116             	size=infotable[i].ydim*infotable[i].xdim;
117                 cur=i;
118       };
119    return cur;
120 };
121