comparison src/video/xbios/SDL_xbiosmodes.c @ 2073:790726541708

Save/restore current video mode and palette
author Patrice Mandin <patmandin@gmail.com>
date Mon, 13 Nov 2006 20:34:18 +0000
parents 4b3f98a9a2c1
children 2c835d58faad
comparison
equal deleted inserted replaced
2072:4b3f98a9a2c1 2073:790726541708
103 display.current_mode = mode; 103 display.current_mode = mode;
104 display.driverdata = displaydata; 104 display.driverdata = displaydata;
105 SDL_AddVideoDisplay(&display); 105 SDL_AddVideoDisplay(&display);
106 } 106 }
107 107
108 /* Current video mode save/restore */
109
110 static void
111 SDL_XBIOS_ModeSave(_THIS)
112 {
113 SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
114
115 data->old_vbase = Physbase();
116
117 switch (data->cookie_vdo >> 16) {
118 case VDO_ST:
119 case VDO_STE:
120 data->old_modecode = Getrez();
121 break;
122 case VDO_TT:
123 data->old_modecode = EgetShift();
124 break;
125 case VDO_F30:
126 data->old_modecode = VsetMode(-1);
127 break;
128 }
129 }
130
131 static void
132 SDL_XBIOS_ModeRestore(_THIS)
133 {
134 SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
135
136 switch (data->cookie_vdo >> 16) {
137 case VDO_ST:
138 case VDO_STE:
139 Setscreen(-1, data->old_vbase, data->old_modecode);
140 break;
141 case VDO_TT:
142 Setscreen(-1, data->old_vbase, -1);
143 EsetShift(data->old_modecode);
144 break;
145 case VDO_F30:
146 Setscreen(-1, data->old_vbase, -1);
147 VsetMode(data->old_modecode);
148 break;
149 }
150 }
151
152 /* Current palette save/restore */
153
154 static void
155 SDL_XBIOS_PaletteSave(_THIS)
156 {
157 int i;
158 Uint16 *palette;
159 SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
160
161 data->old_numcol = 0;
162
163 switch (data->cookie_vdo >> 16) {
164 case VDO_ST:
165 case VDO_STE:
166 switch (data->old_modecode << 8) {
167 case ST_LOW:
168 data->old_numcol = 16;
169 break;
170 case ST_MED:
171 data->old_numcol = 4;
172 break;
173 case ST_HIGH:
174 data->old_numcol = 2;
175 break;
176 }
177
178 palette = (Uint16 *) data->old_palette;
179 for (i = 0; i < data->old_numcol; i++) {
180 *palette++ = Setcolor(i, -1);
181 }
182 break;
183 case VDO_TT:
184 switch (data->old_modecode & ES_MODE) {
185 case TT_LOW:
186 data->old_numcol = 256;
187 break;
188 case ST_LOW:
189 case TT_MED:
190 data->old_numcol = 16;
191 break;
192 case ST_MED:
193 data->old_numcol = 4;
194 break;
195 case ST_HIGH:
196 case TT_HIGH:
197 data->old_numcol = 2;
198 break;
199 }
200 if (data->old_numcol) {
201 EgetPalette(0, data->old_numcol, data->old_palette);
202 }
203 break;
204 case VDO_F30:
205 data->old_numcol = 1 << (1 << (data->old_modecode & NUMCOLS));
206 if (data->old_numcol > 256) {
207 data->old_numcol = 0;
208 } else {
209 VgetRGB(0, data->old_numcol, data->old_palette);
210 }
211 break;
212 }
213 }
214
215 static void
216 SDL_XBIOS_PaletteRestore(_THIS)
217 {
218 SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
219
220 if (data->old_numcol == 0) {
221 return;
222 }
223
224 switch (data->cookie_vdo >> 16) {
225 case VDO_ST:
226 case VDO_STE:
227 Setpalette(data->old_palette);
228 break;
229 case VDO_TT:
230 EsetPalette(0, data->old_numcol, data->old_palette);
231 break;
232 case VDO_F30:
233 VsetRGB(0, data->old_numcol, data->old_palette);
234 break;
235 }
236 }
237
238 /* Public functions for use by the driver */
239
108 void 240 void
109 SDL_XBIOS_InitModes(_THIS) 241 SDL_XBIOS_InitModes(_THIS)
110 { 242 {
111 SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; 243 SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
244
245 SDL_XBIOS_PaletteSave(_this);
246 SDL_XBIOS_ModeSave(_this);
112 247
113 switch (data->cookie_vdo >> 16) { 248 switch (data->cookie_vdo >> 16) {
114 case VDO_ST: 249 case VDO_ST:
115 case VDO_STE: 250 case VDO_STE:
116 { 251 {
124 SDL_XBIOS_AddMode(_this, 320, 240, 8, TT_LOW, SDL_TRUE); 259 SDL_XBIOS_AddMode(_this, 320, 240, 8, TT_LOW, SDL_TRUE);
125 } 260 }
126 break; 261 break;
127 case VDO_F30: 262 case VDO_F30:
128 { 263 {
129 Uint16 modecodemask = VsetMode(-1) & (VGA | PAL); 264 Uint16 modecodemask = data->old_modecode & (VGA | PAL);
130 int i; 265 int i;
131 266
132 switch (VgetMonitor()) { 267 switch (VgetMonitor()) {
133 case MONITOR_MONO: 268 case MONITOR_MONO:
134 /* Not usable */ 269 /* Not usable */
170 } 305 }
171 306
172 void 307 void
173 SDL_XBIOS_QuitModes(_THIS) 308 SDL_XBIOS_QuitModes(_THIS)
174 { 309 {
310 SDL_XBIOS_ModeRestore(_this);
311 SDL_XBIOS_PaletteRestore(_this);
312 Vsync();
175 } 313 }
176 314
177 /* vi: set ts=4 sw=4 expandtab: */ 315 /* vi: set ts=4 sw=4 expandtab: */