Mercurial > sdl-ios-xcode
comparison src/video/svga/SDL_svgavideo.c @ 1895:c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Mon, 10 Jul 2006 21:04:37 +0000 |
parents | 011b633fa0c9 |
children | e1da92da346c |
comparison
equal
deleted
inserted
replaced
1894:c69cee13dd76 | 1895:c121d94672cb |
---|---|
49 #include "SDL_svgavideo.h" | 49 #include "SDL_svgavideo.h" |
50 #include "SDL_svgaevents_c.h" | 50 #include "SDL_svgaevents_c.h" |
51 #include "SDL_svgamouse_c.h" | 51 #include "SDL_svgamouse_c.h" |
52 | 52 |
53 /* Initialization/Query functions */ | 53 /* Initialization/Query functions */ |
54 static int SVGA_VideoInit(_THIS, SDL_PixelFormat *vformat); | 54 static int SVGA_VideoInit(_THIS, SDL_PixelFormat * vformat); |
55 static SDL_Rect **SVGA_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags); | 55 static SDL_Rect **SVGA_ListModes(_THIS, SDL_PixelFormat * format, |
56 static SDL_Surface *SVGA_SetVideoMode(_THIS, SDL_Surface *current, int width, int height, int bpp, Uint32 flags); | 56 Uint32 flags); |
57 static SDL_Surface *SVGA_SetVideoMode(_THIS, SDL_Surface * current, | |
58 int width, int height, int bpp, | |
59 Uint32 flags); | |
57 static int SVGA_SetColors(_THIS, int firstcolor, int ncolors, | 60 static int SVGA_SetColors(_THIS, int firstcolor, int ncolors, |
58 SDL_Color *colors); | 61 SDL_Color * colors); |
59 static void SVGA_VideoQuit(_THIS); | 62 static void SVGA_VideoQuit(_THIS); |
60 | 63 |
61 /* Hardware surface functions */ | 64 /* Hardware surface functions */ |
62 static int SVGA_AllocHWSurface(_THIS, SDL_Surface *surface); | 65 static int SVGA_AllocHWSurface(_THIS, SDL_Surface * surface); |
63 static int SVGA_LockHWSurface(_THIS, SDL_Surface *surface); | 66 static int SVGA_LockHWSurface(_THIS, SDL_Surface * surface); |
64 static int SVGA_FlipHWSurface(_THIS, SDL_Surface *surface); | 67 static int SVGA_FlipHWSurface(_THIS, SDL_Surface * surface); |
65 static void SVGA_UnlockHWSurface(_THIS, SDL_Surface *surface); | 68 static void SVGA_UnlockHWSurface(_THIS, SDL_Surface * surface); |
66 static void SVGA_FreeHWSurface(_THIS, SDL_Surface *surface); | 69 static void SVGA_FreeHWSurface(_THIS, SDL_Surface * surface); |
67 | 70 |
68 /* SVGAlib driver bootstrap functions */ | 71 /* SVGAlib driver bootstrap functions */ |
69 | 72 |
70 static int SVGA_Available(void) | 73 static int |
71 { | 74 SVGA_Available(void) |
72 /* Check to see if we are root and stdin is a virtual console */ | 75 { |
73 int console; | 76 /* Check to see if we are root and stdin is a virtual console */ |
74 | 77 int console; |
75 /* SVGALib 1.9.x+ doesn't require root (via /dev/svga) */ | 78 |
76 int svgalib2 = -1; | 79 /* SVGALib 1.9.x+ doesn't require root (via /dev/svga) */ |
77 | 80 int svgalib2 = -1; |
78 /* See if we are connected to a virtual terminal */ | 81 |
79 console = STDIN_FILENO; | 82 /* See if we are connected to a virtual terminal */ |
80 #if 0 /* This is no longer needed, SVGAlib can switch consoles for us */ | 83 console = STDIN_FILENO; |
81 if ( console >= 0 ) { | 84 #if 0 /* This is no longer needed, SVGAlib can switch consoles for us */ |
82 struct stat sb; | 85 if (console >= 0) { |
83 struct vt_mode dummy; | 86 struct stat sb; |
84 | 87 struct vt_mode dummy; |
85 if ( (fstat(console, &sb) < 0) || | 88 |
86 (ioctl(console, VT_GETMODE, &dummy) < 0) ) { | 89 if ((fstat(console, &sb) < 0) || |
87 console = -1; | 90 (ioctl(console, VT_GETMODE, &dummy) < 0)) { |
88 } | 91 console = -1; |
89 } | 92 } |
93 } | |
90 #endif /* 0 */ | 94 #endif /* 0 */ |
91 | 95 |
92 /* See if SVGAlib 2.0 is available */ | 96 /* See if SVGAlib 2.0 is available */ |
93 svgalib2 = open("/dev/svga", O_RDONLY); | 97 svgalib2 = open("/dev/svga", O_RDONLY); |
94 if (svgalib2 != -1) { | 98 if (svgalib2 != -1) { |
95 close(svgalib2); | 99 close(svgalib2); |
96 } | 100 } |
97 | 101 |
98 return(((svgalib2 != -1) || (geteuid() == 0)) && (console >= 0)); | 102 return (((svgalib2 != -1) || (geteuid() == 0)) && (console >= 0)); |
99 } | 103 } |
100 | 104 |
101 static void SVGA_DeleteDevice(SDL_VideoDevice *device) | 105 static void |
102 { | 106 SVGA_DeleteDevice(SDL_VideoDevice * device) |
103 SDL_free(device->hidden); | 107 { |
104 SDL_free(device); | 108 SDL_free(device->hidden); |
105 } | 109 SDL_free(device); |
106 | 110 } |
107 static SDL_VideoDevice *SVGA_CreateDevice(int devindex) | 111 |
108 { | 112 static SDL_VideoDevice * |
109 SDL_VideoDevice *device; | 113 SVGA_CreateDevice(int devindex) |
110 | 114 { |
111 /* Initialize all variables that we clean on shutdown */ | 115 SDL_VideoDevice *device; |
112 device = (SDL_VideoDevice *)SDL_malloc(sizeof(SDL_VideoDevice)); | 116 |
113 if ( device ) { | 117 /* Initialize all variables that we clean on shutdown */ |
114 SDL_memset(device, 0, (sizeof *device)); | 118 device = (SDL_VideoDevice *) SDL_malloc(sizeof(SDL_VideoDevice)); |
115 device->hidden = (struct SDL_PrivateVideoData *) | 119 if (device) { |
116 SDL_malloc((sizeof *device->hidden)); | 120 SDL_memset(device, 0, (sizeof *device)); |
117 } | 121 device->hidden = (struct SDL_PrivateVideoData *) |
118 if ( (device == NULL) || (device->hidden == NULL) ) { | 122 SDL_malloc((sizeof *device->hidden)); |
119 SDL_OutOfMemory(); | 123 } |
120 if ( device ) { | 124 if ((device == NULL) || (device->hidden == NULL)) { |
121 SDL_free(device); | 125 SDL_OutOfMemory(); |
122 } | 126 if (device) { |
123 return(0); | 127 SDL_free(device); |
124 } | 128 } |
125 SDL_memset(device->hidden, 0, (sizeof *device->hidden)); | 129 return (0); |
126 | 130 } |
127 /* Set the function pointers */ | 131 SDL_memset(device->hidden, 0, (sizeof *device->hidden)); |
128 device->VideoInit = SVGA_VideoInit; | 132 |
129 device->ListModes = SVGA_ListModes; | 133 /* Set the function pointers */ |
130 device->SetVideoMode = SVGA_SetVideoMode; | 134 device->VideoInit = SVGA_VideoInit; |
131 device->SetColors = SVGA_SetColors; | 135 device->ListModes = SVGA_ListModes; |
132 device->UpdateRects = NULL; | 136 device->SetVideoMode = SVGA_SetVideoMode; |
133 device->VideoQuit = SVGA_VideoQuit; | 137 device->SetColors = SVGA_SetColors; |
134 device->AllocHWSurface = SVGA_AllocHWSurface; | 138 device->UpdateRects = NULL; |
135 device->CheckHWBlit = NULL; | 139 device->VideoQuit = SVGA_VideoQuit; |
136 device->FillHWRect = NULL; | 140 device->AllocHWSurface = SVGA_AllocHWSurface; |
137 device->SetHWColorKey = NULL; | 141 device->CheckHWBlit = NULL; |
138 device->SetHWAlpha = NULL; | 142 device->FillHWRect = NULL; |
139 device->LockHWSurface = SVGA_LockHWSurface; | 143 device->SetHWColorKey = NULL; |
140 device->UnlockHWSurface = SVGA_UnlockHWSurface; | 144 device->SetHWAlpha = NULL; |
141 device->FlipHWSurface = SVGA_FlipHWSurface; | 145 device->LockHWSurface = SVGA_LockHWSurface; |
142 device->FreeHWSurface = SVGA_FreeHWSurface; | 146 device->UnlockHWSurface = SVGA_UnlockHWSurface; |
143 device->SetCaption = NULL; | 147 device->FlipHWSurface = SVGA_FlipHWSurface; |
144 device->SetIcon = NULL; | 148 device->FreeHWSurface = SVGA_FreeHWSurface; |
145 device->IconifyWindow = NULL; | 149 device->SetCaption = NULL; |
146 device->GrabInput = NULL; | 150 device->SetIcon = NULL; |
147 device->GetWMInfo = NULL; | 151 device->IconifyWindow = NULL; |
148 device->InitOSKeymap = SVGA_InitOSKeymap; | 152 device->GrabInput = NULL; |
149 device->PumpEvents = SVGA_PumpEvents; | 153 device->GetWMInfo = NULL; |
150 | 154 device->InitOSKeymap = SVGA_InitOSKeymap; |
151 device->free = SVGA_DeleteDevice; | 155 device->PumpEvents = SVGA_PumpEvents; |
152 | 156 |
153 return device; | 157 device->free = SVGA_DeleteDevice; |
158 | |
159 return device; | |
154 } | 160 } |
155 | 161 |
156 VideoBootStrap SVGALIB_bootstrap = { | 162 VideoBootStrap SVGALIB_bootstrap = { |
157 "svgalib", "SVGAlib", | 163 "svgalib", "SVGAlib", |
158 SVGA_Available, SVGA_CreateDevice | 164 SVGA_Available, SVGA_CreateDevice |
159 }; | 165 }; |
160 | 166 |
161 static int SVGA_AddMode(_THIS, int mode, int actually_add) | 167 static int |
162 { | 168 SVGA_AddMode(_THIS, int mode, int actually_add) |
163 int i, j; | 169 { |
164 vga_modeinfo *modeinfo; | 170 int i, j; |
165 | 171 vga_modeinfo *modeinfo; |
166 modeinfo = vga_getmodeinfo(mode); | 172 |
167 | 173 modeinfo = vga_getmodeinfo(mode); |
168 i = modeinfo->bytesperpixel-1; | 174 |
169 if ( i < 0 ) { | 175 i = modeinfo->bytesperpixel - 1; |
170 return 0; | 176 if (i < 0) { |
171 } | 177 return 0; |
172 if ( actually_add ) { | 178 } |
173 SDL_Rect saved_rect[2]; | 179 if (actually_add) { |
174 int saved_mode[2]; | 180 SDL_Rect saved_rect[2]; |
175 int b; | 181 int saved_mode[2]; |
176 | 182 int b; |
177 /* Add the mode, sorted largest to smallest */ | 183 |
178 b = 0; | 184 /* Add the mode, sorted largest to smallest */ |
179 j = 0; | 185 b = 0; |
180 while ( (SDL_modelist[i][j]->w > modeinfo->width) || | 186 j = 0; |
181 (SDL_modelist[i][j]->h > modeinfo->height) ) { | 187 while ((SDL_modelist[i][j]->w > modeinfo->width) || |
182 ++j; | 188 (SDL_modelist[i][j]->h > modeinfo->height)) { |
183 } | 189 ++j; |
184 /* Skip modes that are already in our list */ | 190 } |
185 if ( (SDL_modelist[i][j]->w == modeinfo->width) && | 191 /* Skip modes that are already in our list */ |
186 (SDL_modelist[i][j]->h == modeinfo->height) ) { | 192 if ((SDL_modelist[i][j]->w == modeinfo->width) && |
187 return(0); | 193 (SDL_modelist[i][j]->h == modeinfo->height)) { |
188 } | 194 return (0); |
189 /* Insert the new mode */ | 195 } |
190 saved_rect[b] = *SDL_modelist[i][j]; | 196 /* Insert the new mode */ |
191 saved_mode[b] = SDL_vgamode[i][j]; | 197 saved_rect[b] = *SDL_modelist[i][j]; |
192 SDL_modelist[i][j]->w = modeinfo->width; | 198 saved_mode[b] = SDL_vgamode[i][j]; |
193 SDL_modelist[i][j]->h = modeinfo->height; | 199 SDL_modelist[i][j]->w = modeinfo->width; |
194 SDL_vgamode[i][j] = mode; | 200 SDL_modelist[i][j]->h = modeinfo->height; |
195 /* Everybody scoot down! */ | 201 SDL_vgamode[i][j] = mode; |
196 if ( saved_rect[b].w && saved_rect[b].h ) { | 202 /* Everybody scoot down! */ |
197 for ( ++j; SDL_modelist[i][j]->w; ++j ) { | 203 if (saved_rect[b].w && saved_rect[b].h) { |
198 saved_rect[!b] = *SDL_modelist[i][j]; | 204 for (++j; SDL_modelist[i][j]->w; ++j) { |
199 saved_mode[!b] = SDL_vgamode[i][j]; | 205 saved_rect[!b] = *SDL_modelist[i][j]; |
200 *SDL_modelist[i][j] = saved_rect[b]; | 206 saved_mode[!b] = SDL_vgamode[i][j]; |
201 SDL_vgamode[i][j] = saved_mode[b]; | 207 *SDL_modelist[i][j] = saved_rect[b]; |
202 b = !b; | 208 SDL_vgamode[i][j] = saved_mode[b]; |
203 } | 209 b = !b; |
204 *SDL_modelist[i][j] = saved_rect[b]; | 210 } |
205 SDL_vgamode[i][j] = saved_mode[b]; | 211 *SDL_modelist[i][j] = saved_rect[b]; |
206 } | 212 SDL_vgamode[i][j] = saved_mode[b]; |
207 } else { | 213 } |
208 ++SDL_nummodes[i]; | 214 } else { |
209 } | 215 ++SDL_nummodes[i]; |
210 return(1); | 216 } |
211 } | 217 return (1); |
212 | 218 } |
213 static void SVGA_UpdateVideoInfo(_THIS) | 219 |
214 { | 220 static void |
215 vga_modeinfo *modeinfo; | 221 SVGA_UpdateVideoInfo(_THIS) |
216 | 222 { |
217 this->info.wm_available = 0; | 223 vga_modeinfo *modeinfo; |
218 this->info.hw_available = (banked ? 0 : 1); | 224 |
219 modeinfo = vga_getmodeinfo(vga_getcurrentmode()); | 225 this->info.wm_available = 0; |
220 this->info.video_mem = modeinfo->memory; | 226 this->info.hw_available = (banked ? 0 : 1); |
221 /* FIXME: Add hardware accelerated blit information */ | 227 modeinfo = vga_getmodeinfo(vga_getcurrentmode()); |
228 this->info.video_mem = modeinfo->memory; | |
229 /* FIXME: Add hardware accelerated blit information */ | |
222 #ifdef SVGALIB_DEBUG | 230 #ifdef SVGALIB_DEBUG |
223 printf("Hardware accelerated blit: %savailable\n", modeinfo->haveblit ? "" : "not "); | 231 printf("Hardware accelerated blit: %savailable\n", |
232 modeinfo->haveblit ? "" : "not "); | |
224 #endif | 233 #endif |
225 } | 234 } |
226 | 235 |
227 int SVGA_VideoInit(_THIS, SDL_PixelFormat *vformat) | 236 int |
228 { | 237 SVGA_VideoInit(_THIS, SDL_PixelFormat * vformat) |
229 int keyboard; | 238 { |
230 int i, j; | 239 int keyboard; |
231 int mode, total_modes; | 240 int i, j; |
232 | 241 int mode, total_modes; |
233 /* Initialize all variables that we clean on shutdown */ | 242 |
234 for ( i=0; i<NUM_MODELISTS; ++i ) { | 243 /* Initialize all variables that we clean on shutdown */ |
235 SDL_nummodes[i] = 0; | 244 for (i = 0; i < NUM_MODELISTS; ++i) { |
236 SDL_modelist[i] = NULL; | 245 SDL_nummodes[i] = 0; |
237 SDL_vgamode[i] = NULL; | 246 SDL_modelist[i] = NULL; |
238 } | 247 SDL_vgamode[i] = NULL; |
239 | 248 } |
240 /* Initialize the library */ | 249 |
241 vga_disabledriverreport(); | 250 /* Initialize the library */ |
242 if ( vga_init() < 0 ) { | 251 vga_disabledriverreport(); |
243 SDL_SetError("Unable to initialize SVGAlib"); | 252 if (vga_init() < 0) { |
244 return(-1); | 253 SDL_SetError("Unable to initialize SVGAlib"); |
245 } | 254 return (-1); |
246 vga_setmode(TEXT); | 255 } |
247 | 256 vga_setmode(TEXT); |
248 /* Enable mouse and keyboard support */ | 257 |
249 vga_setmousesupport(1); | 258 /* Enable mouse and keyboard support */ |
250 keyboard = keyboard_init_return_fd(); | 259 vga_setmousesupport(1); |
251 if ( keyboard < 0 ) { | 260 keyboard = keyboard_init_return_fd(); |
252 SDL_SetError("Unable to initialize keyboard"); | 261 if (keyboard < 0) { |
253 return(-1); | 262 SDL_SetError("Unable to initialize keyboard"); |
254 } | 263 return (-1); |
255 if ( SVGA_initkeymaps(keyboard) < 0 ) { | 264 } |
256 return(-1); | 265 if (SVGA_initkeymaps(keyboard) < 0) { |
257 } | 266 return (-1); |
258 keyboard_seteventhandler(SVGA_keyboardcallback); | 267 } |
259 | 268 keyboard_seteventhandler(SVGA_keyboardcallback); |
260 /* Determine the current screen size */ | 269 |
261 this->info.current_w = 0; | 270 /* Determine the current screen size */ |
262 this->info.current_h = 0; | 271 this->info.current_w = 0; |
263 | 272 this->info.current_h = 0; |
264 /* Determine the screen depth (use default 8-bit depth) */ | 273 |
265 vformat->BitsPerPixel = 8; | 274 /* Determine the screen depth (use default 8-bit depth) */ |
266 | 275 vformat->BitsPerPixel = 8; |
267 /* Enumerate the available fullscreen modes */ | 276 |
268 total_modes = 0; | 277 /* Enumerate the available fullscreen modes */ |
269 for ( mode=vga_lastmodenumber(); mode; --mode ) { | 278 total_modes = 0; |
270 if ( vga_hasmode(mode) ) { | 279 for (mode = vga_lastmodenumber(); mode; --mode) { |
271 if ( SVGA_AddMode(this, mode, 0) ) { | 280 if (vga_hasmode(mode)) { |
272 ++total_modes; | 281 if (SVGA_AddMode(this, mode, 0)) { |
273 } | 282 ++total_modes; |
274 } | 283 } |
275 } | 284 } |
276 if ( SVGA_AddMode(this, G320x200x256, 0) ) ++total_modes; | 285 } |
277 if ( total_modes == 0 ) { | 286 if (SVGA_AddMode(this, G320x200x256, 0)) |
278 SDL_SetError("No linear video modes available"); | 287 ++total_modes; |
279 return(-1); | 288 if (total_modes == 0) { |
280 } | 289 SDL_SetError("No linear video modes available"); |
281 for ( i=0; i<NUM_MODELISTS; ++i ) { | 290 return (-1); |
282 SDL_vgamode[i] = (int *)SDL_malloc(SDL_nummodes[i]*sizeof(int)); | 291 } |
283 if ( SDL_vgamode[i] == NULL ) { | 292 for (i = 0; i < NUM_MODELISTS; ++i) { |
284 SDL_OutOfMemory(); | 293 SDL_vgamode[i] = (int *) SDL_malloc(SDL_nummodes[i] * sizeof(int)); |
285 return(-1); | 294 if (SDL_vgamode[i] == NULL) { |
286 } | 295 SDL_OutOfMemory(); |
287 SDL_modelist[i] = (SDL_Rect **) | 296 return (-1); |
288 SDL_malloc((SDL_nummodes[i]+1)*sizeof(SDL_Rect *)); | 297 } |
289 if ( SDL_modelist[i] == NULL ) { | 298 SDL_modelist[i] = (SDL_Rect **) |
290 SDL_OutOfMemory(); | 299 SDL_malloc((SDL_nummodes[i] + 1) * sizeof(SDL_Rect *)); |
291 return(-1); | 300 if (SDL_modelist[i] == NULL) { |
292 } | 301 SDL_OutOfMemory(); |
293 for ( j=0; j<SDL_nummodes[i]; ++j ) { | 302 return (-1); |
294 SDL_modelist[i][j]=(SDL_Rect *)SDL_malloc(sizeof(SDL_Rect)); | 303 } |
295 if ( SDL_modelist[i][j] == NULL ) { | 304 for (j = 0; j < SDL_nummodes[i]; ++j) { |
296 SDL_OutOfMemory(); | 305 SDL_modelist[i][j] = (SDL_Rect *) SDL_malloc(sizeof(SDL_Rect)); |
297 return(-1); | 306 if (SDL_modelist[i][j] == NULL) { |
298 } | 307 SDL_OutOfMemory(); |
299 SDL_memset(SDL_modelist[i][j], 0, sizeof(SDL_Rect)); | 308 return (-1); |
300 } | 309 } |
301 SDL_modelist[i][j] = NULL; | 310 SDL_memset(SDL_modelist[i][j], 0, sizeof(SDL_Rect)); |
302 } | 311 } |
303 for ( mode=vga_lastmodenumber(); mode; --mode ) { | 312 SDL_modelist[i][j] = NULL; |
304 if ( vga_hasmode(mode) ) { | 313 } |
305 SVGA_AddMode(this, mode, 1); | 314 for (mode = vga_lastmodenumber(); mode; --mode) { |
306 } | 315 if (vga_hasmode(mode)) { |
307 } | 316 SVGA_AddMode(this, mode, 1); |
308 SVGA_AddMode(this, G320x200x256, 1); | 317 } |
309 | 318 } |
310 /* Free extra (duplicated) modes */ | 319 SVGA_AddMode(this, G320x200x256, 1); |
311 for ( i=0; i<NUM_MODELISTS; ++i ) { | 320 |
312 j = 0; | 321 /* Free extra (duplicated) modes */ |
313 while ( SDL_modelist[i][j] && SDL_modelist[i][j]->w ) { | 322 for (i = 0; i < NUM_MODELISTS; ++i) { |
314 j++; | 323 j = 0; |
315 } | 324 while (SDL_modelist[i][j] && SDL_modelist[i][j]->w) { |
316 while ( SDL_modelist[i][j] ) { | 325 j++; |
317 SDL_free(SDL_modelist[i][j]); | 326 } |
318 SDL_modelist[i][j] = NULL; | 327 while (SDL_modelist[i][j]) { |
319 j++; | 328 SDL_free(SDL_modelist[i][j]); |
320 } | 329 SDL_modelist[i][j] = NULL; |
321 } | 330 j++; |
322 | 331 } |
323 /* Fill in our hardware acceleration capabilities */ | 332 } |
324 SVGA_UpdateVideoInfo(this); | 333 |
325 | 334 /* Fill in our hardware acceleration capabilities */ |
326 /* We're done! */ | 335 SVGA_UpdateVideoInfo(this); |
327 return(0); | 336 |
328 } | 337 /* We're done! */ |
329 | 338 return (0); |
330 SDL_Rect **SVGA_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags) | 339 } |
331 { | 340 |
332 return(SDL_modelist[((format->BitsPerPixel+7)/8)-1]); | 341 SDL_Rect ** |
342 SVGA_ListModes(_THIS, SDL_PixelFormat * format, Uint32 flags) | |
343 { | |
344 return (SDL_modelist[((format->BitsPerPixel + 7) / 8) - 1]); | |
333 } | 345 } |
334 | 346 |
335 /* Various screen update functions available */ | 347 /* Various screen update functions available */ |
336 static void SVGA_DirectUpdate(_THIS, int numrects, SDL_Rect *rects); | 348 static void SVGA_DirectUpdate(_THIS, int numrects, SDL_Rect * rects); |
337 static void SVGA_BankedUpdate(_THIS, int numrects, SDL_Rect *rects); | 349 static void SVGA_BankedUpdate(_THIS, int numrects, SDL_Rect * rects); |
338 | 350 |
339 SDL_Surface *SVGA_SetVideoMode(_THIS, SDL_Surface *current, | 351 SDL_Surface * |
340 int width, int height, int bpp, Uint32 flags) | 352 SVGA_SetVideoMode(_THIS, SDL_Surface * current, |
341 { | 353 int width, int height, int bpp, Uint32 flags) |
342 int mode; | 354 { |
343 int vgamode; | 355 int mode; |
344 vga_modeinfo *modeinfo; | 356 int vgamode; |
345 int screenpage_len; | 357 vga_modeinfo *modeinfo; |
346 | 358 int screenpage_len; |
347 /* Free old pixels if we were in banked mode */ | 359 |
348 if ( banked && current->pixels ) { | 360 /* Free old pixels if we were in banked mode */ |
349 free(current->pixels); | 361 if (banked && current->pixels) { |
350 current->pixels = NULL; | 362 free(current->pixels); |
351 } | 363 current->pixels = NULL; |
352 | 364 } |
353 /* Try to set the requested linear video mode */ | 365 |
354 bpp = (bpp+7)/8-1; | 366 /* Try to set the requested linear video mode */ |
355 for ( mode=0; SDL_modelist[bpp][mode]; ++mode ) { | 367 bpp = (bpp + 7) / 8 - 1; |
356 if ( (SDL_modelist[bpp][mode]->w == width) && | 368 for (mode = 0; SDL_modelist[bpp][mode]; ++mode) { |
357 (SDL_modelist[bpp][mode]->h == height) ) { | 369 if ((SDL_modelist[bpp][mode]->w == width) && |
358 break; | 370 (SDL_modelist[bpp][mode]->h == height)) { |
359 } | 371 break; |
360 } | 372 } |
361 if ( SDL_modelist[bpp][mode] == NULL ) { | 373 } |
362 SDL_SetError("Couldn't find requested mode in list"); | 374 if (SDL_modelist[bpp][mode] == NULL) { |
363 return(NULL); | 375 SDL_SetError("Couldn't find requested mode in list"); |
364 } | 376 return (NULL); |
365 vgamode = SDL_vgamode[bpp][mode]; | 377 } |
366 vga_setmode(vgamode); | 378 vgamode = SDL_vgamode[bpp][mode]; |
367 vga_setpage(0); | 379 vga_setmode(vgamode); |
368 | 380 vga_setpage(0); |
369 if ( (vga_setlinearaddressing() < 0) && (vgamode != G320x200x256) ) { | 381 |
370 banked = 1; | 382 if ((vga_setlinearaddressing() < 0) && (vgamode != G320x200x256)) { |
371 } else { | 383 banked = 1; |
372 banked = 0; | 384 } else { |
373 } | 385 banked = 0; |
374 | 386 } |
375 modeinfo = vga_getmodeinfo(SDL_vgamode[bpp][mode]); | 387 |
376 | 388 modeinfo = vga_getmodeinfo(SDL_vgamode[bpp][mode]); |
377 /* Update hardware acceleration info */ | 389 |
378 SVGA_UpdateVideoInfo(this); | 390 /* Update hardware acceleration info */ |
379 | 391 SVGA_UpdateVideoInfo(this); |
380 /* Allocate the new pixel format for the screen */ | 392 |
381 bpp = (bpp+1)*8; | 393 /* Allocate the new pixel format for the screen */ |
382 if ( (bpp == 16) && (modeinfo->colors == 32768) ) { | 394 bpp = (bpp + 1) * 8; |
383 bpp = 15; | 395 if ((bpp == 16) && (modeinfo->colors == 32768)) { |
384 } | 396 bpp = 15; |
385 if ( ! SDL_ReallocFormat(current, bpp, 0, 0, 0, 0) ) { | 397 } |
386 return(NULL); | 398 if (!SDL_ReallocFormat(current, bpp, 0, 0, 0, 0)) { |
387 } | 399 return (NULL); |
388 | 400 } |
389 /* Set up the new mode framebuffer */ | 401 |
390 current->flags = SDL_FULLSCREEN; | 402 /* Set up the new mode framebuffer */ |
391 if ( !banked ) { | 403 current->flags = SDL_FULLSCREEN; |
392 current->flags |= SDL_HWSURFACE; | 404 if (!banked) { |
393 } | 405 current->flags |= SDL_HWSURFACE; |
394 if ( bpp == 8 ) { | 406 } |
395 /* FIXME: What about DirectColor? */ | 407 if (bpp == 8) { |
396 current->flags |= SDL_HWPALETTE; | 408 /* FIXME: What about DirectColor? */ |
397 } | 409 current->flags |= SDL_HWPALETTE; |
398 current->w = width; | 410 } |
399 current->h = height; | 411 current->w = width; |
400 current->pitch = modeinfo->linewidth; | 412 current->h = height; |
401 if ( banked ) { | 413 current->pitch = modeinfo->linewidth; |
402 current->pixels = SDL_malloc(current->h * current->pitch); | 414 if (banked) { |
403 if ( !current->pixels ) { | 415 current->pixels = SDL_malloc(current->h * current->pitch); |
404 SDL_OutOfMemory(); | 416 if (!current->pixels) { |
405 return(NULL); | 417 SDL_OutOfMemory(); |
406 } | 418 return (NULL); |
407 } else { | 419 } |
408 current->pixels = vga_getgraphmem(); | 420 } else { |
409 } | 421 current->pixels = vga_getgraphmem(); |
410 | 422 } |
411 /* set double-buffering */ | 423 |
412 if ( (flags & SDL_DOUBLEBUF) && !banked ) | 424 /* set double-buffering */ |
413 { | 425 if ((flags & SDL_DOUBLEBUF) && !banked) { |
414 /* length of one screen page in bytes */ | 426 /* length of one screen page in bytes */ |
415 screenpage_len=current->h*modeinfo->linewidth; | 427 screenpage_len = current->h * modeinfo->linewidth; |
416 | 428 |
417 /* if start address should be aligned */ | 429 /* if start address should be aligned */ |
418 if ( modeinfo->linewidth_unit ) | 430 if (modeinfo->linewidth_unit) { |
419 { | 431 if (screenpage_len % modeinfo->linewidth_unit) { |
420 if ( screenpage_len % modeinfo->linewidth_unit ) | 432 screenpage_len += |
421 { | 433 modeinfo->linewidth_unit - |
422 screenpage_len += modeinfo->linewidth_unit - ( screenpage_len % modeinfo->linewidth_unit ); | 434 (screenpage_len % modeinfo->linewidth_unit); |
423 } | 435 } |
424 } | 436 } |
425 | 437 |
426 /* if we heve enough videomemory = ak je dost videopamete */ | 438 /* if we heve enough videomemory = ak je dost videopamete */ |
427 if ( modeinfo->memory > ( screenpage_len * 2 / 1024 ) ) | 439 if (modeinfo->memory > (screenpage_len * 2 / 1024)) { |
428 { | 440 current->flags |= SDL_DOUBLEBUF; |
429 current->flags |= SDL_DOUBLEBUF; | 441 flip_page = 0; |
430 flip_page = 0; | 442 flip_offset[0] = 0; |
431 flip_offset[0] = 0; | 443 flip_offset[1] = screenpage_len; |
432 flip_offset[1] = screenpage_len; | 444 flip_address[0] = vga_getgraphmem(); |
433 flip_address[0] = vga_getgraphmem(); | 445 flip_address[1] = flip_address[0] + screenpage_len; |
434 flip_address[1] = flip_address[0]+screenpage_len; | 446 SVGA_FlipHWSurface(this, current); |
435 SVGA_FlipHWSurface(this,current); | 447 } |
436 } | 448 } |
437 } | 449 |
438 | 450 /* Set the blit function */ |
439 /* Set the blit function */ | 451 if (banked) { |
440 if ( banked ) { | 452 this->UpdateRects = SVGA_BankedUpdate; |
441 this->UpdateRects = SVGA_BankedUpdate; | 453 } else { |
442 } else { | 454 this->UpdateRects = SVGA_DirectUpdate; |
443 this->UpdateRects = SVGA_DirectUpdate; | 455 } |
444 } | 456 |
445 | 457 /* Set up the mouse handler again (buggy SVGAlib 1.40) */ |
446 /* Set up the mouse handler again (buggy SVGAlib 1.40) */ | 458 mouse_seteventhandler(SVGA_mousecallback); |
447 mouse_seteventhandler(SVGA_mousecallback); | 459 |
448 | 460 /* We're done */ |
449 /* We're done */ | 461 return (current); |
450 return(current); | |
451 } | 462 } |
452 | 463 |
453 /* We don't actually allow hardware surfaces other than the main one */ | 464 /* We don't actually allow hardware surfaces other than the main one */ |
454 static int SVGA_AllocHWSurface(_THIS, SDL_Surface *surface) | 465 static int |
455 { | 466 SVGA_AllocHWSurface(_THIS, SDL_Surface * surface) |
456 return(-1); | 467 { |
457 } | 468 return (-1); |
458 static void SVGA_FreeHWSurface(_THIS, SDL_Surface *surface) | 469 } |
459 { | 470 static void |
460 return; | 471 SVGA_FreeHWSurface(_THIS, SDL_Surface * surface) |
472 { | |
473 return; | |
461 } | 474 } |
462 | 475 |
463 /* We need to wait for vertical retrace on page flipped displays */ | 476 /* We need to wait for vertical retrace on page flipped displays */ |
464 static int SVGA_LockHWSurface(_THIS, SDL_Surface *surface) | 477 static int |
465 { | 478 SVGA_LockHWSurface(_THIS, SDL_Surface * surface) |
466 /* The waiting is done in SVGA_FlipHWSurface() */ | 479 { |
467 return(0); | 480 /* The waiting is done in SVGA_FlipHWSurface() */ |
468 } | 481 return (0); |
469 static void SVGA_UnlockHWSurface(_THIS, SDL_Surface *surface) | 482 } |
470 { | 483 static void |
471 return; | 484 SVGA_UnlockHWSurface(_THIS, SDL_Surface * surface) |
472 } | 485 { |
473 | 486 return; |
474 static int SVGA_FlipHWSurface(_THIS, SDL_Surface *surface) | 487 } |
475 { | 488 |
476 if ( !banked ) { | 489 static int |
477 vga_setdisplaystart(flip_offset[flip_page]); | 490 SVGA_FlipHWSurface(_THIS, SDL_Surface * surface) |
478 flip_page=!flip_page; | 491 { |
479 surface->pixels=flip_address[flip_page]; | 492 if (!banked) { |
480 vga_waitretrace(); | 493 vga_setdisplaystart(flip_offset[flip_page]); |
481 } | 494 flip_page = !flip_page; |
482 return(0); | 495 surface->pixels = flip_address[flip_page]; |
483 } | 496 vga_waitretrace(); |
484 | 497 } |
485 static void SVGA_DirectUpdate(_THIS, int numrects, SDL_Rect *rects) | 498 return (0); |
486 { | 499 } |
487 return; | 500 |
488 } | 501 static void |
489 | 502 SVGA_DirectUpdate(_THIS, int numrects, SDL_Rect * rects) |
490 static void SVGA_BankedUpdate(_THIS, int numrects, SDL_Rect *rects) | 503 { |
491 { | 504 return; |
492 int i, j; | 505 } |
493 SDL_Rect *rect; | 506 |
494 int page, vp; | 507 static void |
495 int x, y, w, h; | 508 SVGA_BankedUpdate(_THIS, int numrects, SDL_Rect * rects) |
496 unsigned char *src; | 509 { |
497 unsigned char *dst; | 510 int i, j; |
498 int bpp = this->screen->format->BytesPerPixel; | 511 SDL_Rect *rect; |
499 int pitch = this->screen->pitch; | 512 int page, vp; |
500 | 513 int x, y, w, h; |
501 dst = vga_getgraphmem(); | 514 unsigned char *src; |
502 for ( i=0; i < numrects; ++i ) { | 515 unsigned char *dst; |
503 rect = &rects[i]; | 516 int bpp = this->screen->format->BytesPerPixel; |
504 x = rect->x; | 517 int pitch = this->screen->pitch; |
505 y = rect->y; | 518 |
506 w = rect->w * bpp; | 519 dst = vga_getgraphmem(); |
507 h = rect->h; | 520 for (i = 0; i < numrects; ++i) { |
508 | 521 rect = &rects[i]; |
509 vp = y * pitch + x * bpp; | 522 x = rect->x; |
510 src = (unsigned char *)this->screen->pixels + vp; | 523 y = rect->y; |
511 page = vp >> 16; | 524 w = rect->w * bpp; |
512 vp &= 0xffff; | 525 h = rect->h; |
513 vga_setpage(page); | 526 |
514 for (j = 0; j < h; j++) { | 527 vp = y * pitch + x * bpp; |
515 if (vp + w > 0x10000) { | 528 src = (unsigned char *) this->screen->pixels + vp; |
516 if (vp >= 0x10000) { | 529 page = vp >> 16; |
517 page++; | 530 vp &= 0xffff; |
518 vga_setpage(page); | 531 vga_setpage(page); |
519 vp &= 0xffff; | 532 for (j = 0; j < h; j++) { |
520 } else { | 533 if (vp + w > 0x10000) { |
521 SDL_memcpy(dst + vp, src, 0x10000 - vp); | 534 if (vp >= 0x10000) { |
522 page++; | 535 page++; |
523 vga_setpage(page); | 536 vga_setpage(page); |
524 SDL_memcpy(dst, src + 0x10000 - vp, | 537 vp &= 0xffff; |
525 (vp + w) & 0xffff); | 538 } else { |
526 vp = (vp + pitch) & 0xffff; | 539 SDL_memcpy(dst + vp, src, 0x10000 - vp); |
527 src += pitch; | 540 page++; |
528 continue; | 541 vga_setpage(page); |
529 } | 542 SDL_memcpy(dst, src + 0x10000 - vp, (vp + w) & 0xffff); |
530 } | 543 vp = (vp + pitch) & 0xffff; |
531 SDL_memcpy(dst + vp, src, w); | 544 src += pitch; |
532 src += pitch; | 545 continue; |
533 vp += pitch; | 546 } |
534 } | 547 } |
535 } | 548 SDL_memcpy(dst + vp, src, w); |
536 } | 549 src += pitch; |
537 | 550 vp += pitch; |
538 int SVGA_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors) | 551 } |
539 { | 552 } |
540 int i; | 553 } |
541 | 554 |
542 for(i = 0; i < ncolors; i++) { | 555 int |
543 vga_setpalette(firstcolor + i, | 556 SVGA_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color * colors) |
544 colors[i].r>>2, | 557 { |
545 colors[i].g>>2, | 558 int i; |
546 colors[i].b>>2); | 559 |
547 } | 560 for (i = 0; i < ncolors; i++) { |
548 return(1); | 561 vga_setpalette(firstcolor + i, |
562 colors[i].r >> 2, colors[i].g >> 2, colors[i].b >> 2); | |
563 } | |
564 return (1); | |
549 } | 565 } |
550 | 566 |
551 /* Note: If we are terminated, this could be called in the middle of | 567 /* Note: If we are terminated, this could be called in the middle of |
552 another SDL video routine -- notably UpdateRects. | 568 another SDL video routine -- notably UpdateRects. |
553 */ | 569 */ |
554 void SVGA_VideoQuit(_THIS) | 570 void |
555 { | 571 SVGA_VideoQuit(_THIS) |
556 int i, j; | 572 { |
557 | 573 int i, j; |
558 /* Reset the console video mode */ | 574 |
559 if ( this->screen && (this->screen->w && this->screen->h) ) { | 575 /* Reset the console video mode */ |
560 vga_setmode(TEXT); | 576 if (this->screen && (this->screen->w && this->screen->h)) { |
561 } | 577 vga_setmode(TEXT); |
562 keyboard_close(); | 578 } |
563 | 579 keyboard_close(); |
564 /* Free video mode lists */ | 580 |
565 for ( i=0; i<NUM_MODELISTS; ++i ) { | 581 /* Free video mode lists */ |
566 if ( SDL_modelist[i] != NULL ) { | 582 for (i = 0; i < NUM_MODELISTS; ++i) { |
567 for ( j=0; SDL_modelist[i][j]; ++j ) | 583 if (SDL_modelist[i] != NULL) { |
568 SDL_free(SDL_modelist[i][j]); | 584 for (j = 0; SDL_modelist[i][j]; ++j) |
569 SDL_free(SDL_modelist[i]); | 585 SDL_free(SDL_modelist[i][j]); |
570 SDL_modelist[i] = NULL; | 586 SDL_free(SDL_modelist[i]); |
571 } | 587 SDL_modelist[i] = NULL; |
572 if ( SDL_vgamode[i] != NULL ) { | 588 } |
573 SDL_free(SDL_vgamode[i]); | 589 if (SDL_vgamode[i] != NULL) { |
574 SDL_vgamode[i] = NULL; | 590 SDL_free(SDL_vgamode[i]); |
575 } | 591 SDL_vgamode[i] = NULL; |
576 } | 592 } |
577 if ( this->screen ) { | 593 } |
578 if ( banked && this->screen->pixels ) { | 594 if (this->screen) { |
579 SDL_free(this->screen->pixels); | 595 if (banked && this->screen->pixels) { |
580 } | 596 SDL_free(this->screen->pixels); |
581 this->screen->pixels = NULL; | 597 } |
582 } | 598 this->screen->pixels = NULL; |
583 } | 599 } |
584 | 600 } |
601 | |
602 /* vi: set ts=4 sw=4 expandtab: */ |