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