Mercurial > sdl-ios-xcode
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: */ |