Contents of /trunk/libsdl/patches/libsdl-1.2.8-libcaca.patch
Parent Directory | Revision Log
Revision 144 -
(show annotations)
(download)
Tue May 8 20:06:05 2007 UTC (17 years, 4 months ago) by niro
File size: 19410 byte(s)
Tue May 8 20:06:05 2007 UTC (17 years, 4 months ago) by niro
File size: 19410 byte(s)
-import
1 | --- SDL/configure.in |
2 | +++ SDL/configure.in |
3 | @@ -1004,6 +1004,32 @@ CheckAAlib() |
4 | fi |
5 | } |
6 | |
7 | +dnl Find the libcaca includes |
8 | +CheckCaca() |
9 | +{ |
10 | + AC_ARG_ENABLE(video-caca, |
11 | +[ --enable-video-caca use libcaca video driver [default=no]], |
12 | + , enable_video_caca=no) |
13 | + if test x$enable_video = xyes -a x$enable_video_caca = xyes; then |
14 | + AC_MSG_CHECKING(for libcaca support) |
15 | + video_caca=no |
16 | + AC_TRY_COMPILE([ |
17 | + #include <caca.h> |
18 | + ],[ |
19 | + ],[ |
20 | + video_caca=yes |
21 | + ]) |
22 | + AC_MSG_RESULT($video_caca) |
23 | + if test x$video_caca = xyes; then |
24 | + CFLAGS="$CFLAGS -DENABLE_CACA `caca-config --cflags`" |
25 | + SYSTEM_LIBS="$SYSTEM_LIBS `caca-config --plugin-libs`" |
26 | + |
27 | + VIDEO_SUBDIRS="$VIDEO_SUBDIRS caca" |
28 | + VIDEO_DRIVERS="$VIDEO_DRIVERS caca/libvideo_caca.la" |
29 | + fi |
30 | + fi |
31 | +} |
32 | + |
33 | dnl Set up the Atari Xbios driver |
34 | CheckAtariXbiosVideo() |
35 | { |
36 | @@ -1882,6 +1908,7 @@ case "$target" in |
37 | CheckGGI |
38 | CheckSVGA |
39 | CheckAAlib |
40 | + CheckCaca |
41 | CheckQtopia |
42 | CheckPicoGUI |
43 | CheckOpenGL |
44 | @@ -1962,6 +1989,7 @@ case "$target" in |
45 | CheckDGA |
46 | CheckSVGA |
47 | CheckAAlib |
48 | + CheckCaca |
49 | CheckOpenGL |
50 | CheckPTHREAD |
51 | CheckSIGACTION |
52 | @@ -2007,6 +2035,7 @@ case "$target" in |
53 | CheckDGA |
54 | CheckSVGA |
55 | CheckAAlib |
56 | + CheckCaca |
57 | CheckOpenGL |
58 | CheckPTHREAD |
59 | CheckSIGACTION |
60 | @@ -2044,6 +2073,7 @@ case "$target" in |
61 | CheckNAS |
62 | CheckX11 |
63 | CheckAAlib |
64 | + CheckCaca |
65 | CheckOpenGL |
66 | CheckPTHREAD |
67 | CheckSIGACTION |
68 | @@ -2085,6 +2115,7 @@ case "$target" in |
69 | CheckNAS |
70 | CheckX11 |
71 | CheckAAlib |
72 | + CheckCaca |
73 | CheckOpenGL |
74 | CheckPTHREAD |
75 | CheckSIGACTION |
76 | @@ -2127,6 +2158,7 @@ case "$target" in |
77 | CheckNAS |
78 | CheckX11 |
79 | CheckAAlib |
80 | + CheckCaca |
81 | CheckOpenGL |
82 | CheckPTHREAD |
83 | CheckSIGACTION |
84 | @@ -2169,6 +2201,7 @@ case "$target" in |
85 | CheckNAS |
86 | CheckX11 |
87 | CheckAAlib |
88 | + CheckCaca |
89 | CheckOpenGL |
90 | CheckPTHREAD |
91 | CheckSIGACTION |
92 | @@ -2208,6 +2241,7 @@ case "$target" in |
93 | CheckNAS |
94 | CheckX11 |
95 | CheckAAlib |
96 | + CheckCaca |
97 | CheckOpenGL |
98 | CheckPTHREAD |
99 | CheckSIGACTION |
100 | @@ -2259,6 +2293,7 @@ case "$target" in |
101 | CheckX11 |
102 | CheckGGI |
103 | CheckAAlib |
104 | + CheckCaca |
105 | CheckOpenGL |
106 | CheckPTHREAD |
107 | CheckSIGACTION |
108 | @@ -2299,6 +2334,7 @@ case "$target" in |
109 | CheckX11 |
110 | CheckGGI |
111 | CheckAAlib |
112 | + CheckCaca |
113 | CheckOpenGL |
114 | CheckPTHREAD |
115 | CheckSIGACTION |
116 | @@ -2336,6 +2372,7 @@ case "$target" in |
117 | CheckX11 |
118 | CheckGGI |
119 | CheckAAlib |
120 | + CheckCaca |
121 | CheckOpenGL |
122 | CheckPTHREAD |
123 | CheckSIGACTION |
124 | @@ -2869,6 +2906,7 @@ src/video/Makefile |
125 | src/video/aalib/Makefile |
126 | src/video/ataricommon/Makefile |
127 | src/video/bwindow/Makefile |
128 | +src/video/caca/Makefile |
129 | src/video/cybergfx/Makefile |
130 | src/video/dc/Makefile |
131 | src/video/dga/Makefile |
132 | --- SDL/src/video/Makefile.am |
133 | +++ SDL/src/video/Makefile.am |
134 | @@ -5,7 +5,7 @@ noinst_LTLIBRARIES = libvideo.la |
135 | |
136 | # Define which subdirectories need to be built |
137 | SUBDIRS = @VIDEO_SUBDIRS@ |
138 | -DIST_SUBDIRS = dummy x11 dga nanox fbcon directfb vgl svga ggi aalib \ |
139 | +DIST_SUBDIRS = dummy x11 dga nanox fbcon directfb vgl svga ggi aalib caca \ |
140 | wincommon windib windx5 \ |
141 | maccommon macdsp macrom riscos quartz \ |
142 | bwindow ps2gs photon cybergfx epoc picogui \ |
143 | --- SDL/src/video/SDL_sysvideo.h |
144 | +++ SDL/src/video/SDL_sysvideo.h |
145 | @@ -359,6 +359,9 @@ extern VideoBootStrap SVGALIB_bootstrap; |
146 | #ifdef ENABLE_AALIB |
147 | extern VideoBootStrap AALIB_bootstrap; |
148 | #endif |
149 | +#ifdef ENABLE_CACA |
150 | +extern VideoBootStrap Caca_bootstrap; |
151 | +#endif |
152 | #ifdef ENABLE_WINDIB |
153 | extern VideoBootStrap WINDIB_bootstrap; |
154 | #endif |
155 | --- SDL/src/video/SDL_video.c |
156 | +++ SDL/src/video/SDL_video.c |
157 | @@ -78,6 +78,9 @@ static VideoBootStrap *bootstrap[] = { |
158 | #ifdef ENABLE_AALIB |
159 | &AALIB_bootstrap, |
160 | #endif |
161 | +#ifdef ENABLE_CACA |
162 | + &Caca_bootstrap, |
163 | +#endif |
164 | #ifdef ENABLE_DIRECTX |
165 | &DIRECTX_bootstrap, |
166 | #endif |
167 | --- SDL/src/video/caca/Makefile.am |
168 | +++ SDL/src/video/caca/Makefile.am |
169 | @@ -0,0 +1,13 @@ |
170 | + |
171 | +## Makefile.am for SDL using the libcaca video driver |
172 | + |
173 | +noinst_LTLIBRARIES = libvideo_caca.la |
174 | +libvideo_caca_la_SOURCES = $(CACA_SRCS) |
175 | + |
176 | +# The SDL libcaca video driver sources |
177 | +CACA_SRCS = \ |
178 | + SDL_cacavideo.h \ |
179 | + SDL_cacaevents.c \ |
180 | + SDL_cacaevents_c.h \ |
181 | + SDL_cacavideo.c |
182 | + |
183 | --- SDL/src/video/caca/SDL_cacaevents.c |
184 | +++ SDL/src/video/caca/SDL_cacaevents.c |
185 | @@ -0,0 +1,98 @@ |
186 | +/* |
187 | + SDL - Simple DirectMedia Layer |
188 | + Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga |
189 | + |
190 | + This library is free software; you can redistribute it and/or |
191 | + modify it under the terms of the GNU Library General Public |
192 | + License as published by the Free Software Foundation; either |
193 | + version 2 of the License, or (at your option) any later version. |
194 | + |
195 | + This library is distributed in the hope that it will be useful, |
196 | + but WITHOUT ANY WARRANTY; without even the implied warranty of |
197 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
198 | + Library General Public License for more details. |
199 | + |
200 | + You should have received a copy of the GNU Library General Public |
201 | + License along with this library; if not, write to the Free |
202 | + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
203 | + |
204 | + Sam Lantinga |
205 | + slouken@libsdl.org |
206 | +*/ |
207 | + |
208 | +#ifdef SAVE_RCSID |
209 | +static char rcsid = |
210 | + "@(#) $Id: libsdl-1.2.8-libcaca.patch,v 1.1 2007-05-08 19:57:41 niro Exp $"; |
211 | +#endif |
212 | + |
213 | +#include <stdio.h> |
214 | + |
215 | +#include <caca.h> |
216 | + |
217 | +#include "SDL.h" |
218 | +#include "SDL_sysevents.h" |
219 | +#include "SDL_events_c.h" |
220 | +#include "SDL_cacavideo.h" |
221 | +#include "SDL_cacaevents_c.h" |
222 | + |
223 | +void Caca_PumpEvents(_THIS) |
224 | +{ |
225 | + int posted = 0; |
226 | + int event; |
227 | + SDL_keysym keysym; |
228 | + |
229 | + if( ! this->screen ) /* Wait till we got the screen initialised */ |
230 | + return; |
231 | + |
232 | + do { |
233 | + posted = 0; |
234 | + |
235 | + /* Get libcaca event */ |
236 | + SDL_mutexP(Caca_mutex); |
237 | + event = caca_get_event(CACA_EVENT_ANY); |
238 | + SDL_mutexV(Caca_mutex); |
239 | + |
240 | + if ( event & (CACA_EVENT_KEY_PRESS | CACA_EVENT_KEY_RELEASE)) { |
241 | + int key; |
242 | + switch ( event & 0xffffff ) |
243 | + { |
244 | + case CACA_KEY_LEFT: key = SDLK_LEFT; break; |
245 | + case CACA_KEY_RIGHT: key = SDLK_RIGHT; break; |
246 | + case CACA_KEY_UP: key = SDLK_UP; break; |
247 | + case CACA_KEY_DOWN: key = SDLK_DOWN; break; |
248 | + default: key = event & 0xff; break; |
249 | + } |
250 | + /* Key pressed */ |
251 | +/* printf("Key pressed: %d (%c)\n", key, key); */ |
252 | + keysym.scancode = key; |
253 | + keysym.sym = key; |
254 | + keysym.mod = KMOD_NONE; |
255 | + keysym.unicode = 0; |
256 | + if ( SDL_TranslateUNICODE ) { |
257 | + keysym.unicode = key; |
258 | + } |
259 | + posted += SDL_PrivateKeyboard((event & CACA_EVENT_KEY_PRESS) ? SDL_PRESSED : SDL_RELEASED, &keysym); |
260 | + } |
261 | + else if ( event & (CACA_EVENT_MOUSE_PRESS | CACA_EVENT_MOUSE_RELEASE) ) { |
262 | + /* FIXME: we currently ignore the button type! */ |
263 | + int button = event & 0x00ffffff; |
264 | + if ( button > 3 ) { |
265 | + button = 1; |
266 | + } |
267 | + posted += SDL_PrivateMouseButton((event & CACA_EVENT_MOUSE_PRESS) ? SDL_PRESSED : SDL_RELEASED, button, 0, 0); |
268 | + } |
269 | + else if ( event & CACA_EVENT_MOUSE_MOTION ) { |
270 | + int new_x = 0, new_y = 0; |
271 | + new_x = ((event & 0x00fff000) >> 12) * Caca_w / caca_get_width(); |
272 | + new_y = ((event & 0x00000fff) >> 0) * Caca_h / caca_get_height(); |
273 | + posted += SDL_PrivateMouseMotion(0, 0, new_x, new_y); |
274 | + } |
275 | + } while ( posted ); |
276 | +} |
277 | + |
278 | +void Caca_InitOSKeymap(_THIS) |
279 | +{ |
280 | + return; |
281 | +} |
282 | + |
283 | + |
284 | --- SDL/src/video/caca/SDL_cacaevents_c.h |
285 | +++ SDL/src/video/caca/SDL_cacaevents_c.h |
286 | @@ -0,0 +1,35 @@ |
287 | +/* |
288 | + SDL - Simple DirectMedia Layer |
289 | + Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga |
290 | + |
291 | + This library is free software; you can redistribute it and/or |
292 | + modify it under the terms of the GNU Library General Public |
293 | + License as published by the Free Software Foundation; either |
294 | + version 2 of the License, or (at your option) any later version. |
295 | + |
296 | + This library is distributed in the hope that it will be useful, |
297 | + but WITHOUT ANY WARRANTY; without even the implied warranty of |
298 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
299 | + Library General Public License for more details. |
300 | + |
301 | + You should have received a copy of the GNU Library General Public |
302 | + License along with this library; if not, write to the Free |
303 | + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
304 | + |
305 | + Sam Lantinga |
306 | + slouken@libsdl.org |
307 | +*/ |
308 | + |
309 | +#ifdef SAVE_RCSID |
310 | +static char rcsid = |
311 | + "@(#) $Id: libsdl-1.2.8-libcaca.patch,v 1.1 2007-05-08 19:57:41 niro Exp $"; |
312 | +#endif |
313 | + |
314 | +#include "SDL_cacavideo.h" |
315 | + |
316 | +/* Variables and functions exported by SDL_sysevents.c to other parts. |
317 | + of the native video subsystem (SDL_sysvideo.c) |
318 | +*/ |
319 | +extern void Caca_PumpEvents(_THIS); |
320 | +extern void Caca_InitOSKeymap(_THIS); |
321 | + |
322 | --- SDL/src/video/caca/SDL_cacavideo.c |
323 | +++ SDL/src/video/caca/SDL_cacavideo.c |
324 | @@ -0,0 +1,301 @@ |
325 | +/* |
326 | + SDL - Simple DirectMedia Layer |
327 | + Copyright (C) 2003 Sam Hocevar |
328 | + |
329 | + This library is free software; you can redistribute it and/or |
330 | + modify it under the terms of the GNU Library General Public |
331 | + License as published by the Free Software Foundation; either |
332 | + version 2 of the License, or (at your option) any later version. |
333 | + |
334 | + This library is distributed in the hope that it will be useful, |
335 | + but WITHOUT ANY WARRANTY; without even the implied warranty of |
336 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
337 | + Library General Public License for more details. |
338 | + |
339 | + You should have received a copy of the GNU Library General Public |
340 | + License along with this library; if not, write to the Free |
341 | + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
342 | + |
343 | + Sam Hocevar |
344 | + sam@zoy.org |
345 | +*/ |
346 | + |
347 | +#ifdef SAVE_RCSID |
348 | +static char rcsid = |
349 | + "@(#) $Id: libsdl-1.2.8-libcaca.patch,v 1.1 2007-05-08 19:57:41 niro Exp $"; |
350 | +#endif |
351 | + |
352 | +/* libcaca based SDL video driver implementation. |
353 | +*/ |
354 | + |
355 | +#include <stdlib.h> |
356 | +#include <stdio.h> |
357 | +#include <string.h> |
358 | +#include <unistd.h> |
359 | +#include <sys/stat.h> |
360 | + |
361 | + |
362 | +#include "SDL.h" |
363 | +#include "SDL_error.h" |
364 | +#include "SDL_video.h" |
365 | +#include "SDL_mouse.h" |
366 | +#include "SDL_sysvideo.h" |
367 | +#include "SDL_pixels_c.h" |
368 | +#include "SDL_events_c.h" |
369 | + |
370 | +#include "SDL_cacavideo.h" |
371 | +#include "SDL_cacaevents_c.h" |
372 | + |
373 | +#include <caca.h> |
374 | + |
375 | +/* Initialization/Query functions */ |
376 | +static int Caca_VideoInit(_THIS, SDL_PixelFormat *vformat); |
377 | +static SDL_Rect **Caca_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags); |
378 | +static SDL_Surface *Caca_SetVideoMode(_THIS, SDL_Surface *current, int width, int height, int bpp, Uint32 flags); |
379 | +static void Caca_VideoQuit(_THIS); |
380 | + |
381 | +/* Hardware surface functions */ |
382 | +static int Caca_AllocHWSurface(_THIS, SDL_Surface *surface); |
383 | +static int Caca_LockHWSurface(_THIS, SDL_Surface *surface); |
384 | +static int Caca_FlipHWSurface(_THIS, SDL_Surface *surface); |
385 | +static void Caca_UnlockHWSurface(_THIS, SDL_Surface *surface); |
386 | +static void Caca_FreeHWSurface(_THIS, SDL_Surface *surface); |
387 | + |
388 | +/* Cache the VideoDevice struct */ |
389 | +static struct SDL_VideoDevice *local_this; |
390 | + |
391 | +/* libcaca driver bootstrap functions */ |
392 | + |
393 | +static int Caca_Available(void) |
394 | +{ |
395 | + return 1; /* Always available ! */ |
396 | +} |
397 | + |
398 | +static void Caca_DeleteDevice(SDL_VideoDevice *device) |
399 | +{ |
400 | + free(device->hidden); |
401 | + free(device); |
402 | +} |
403 | +static SDL_VideoDevice *Caca_CreateDevice(int devindex) |
404 | +{ |
405 | + SDL_VideoDevice *device; |
406 | + |
407 | + /* Initialize all variables that we clean on shutdown */ |
408 | + device = (SDL_VideoDevice *)malloc(sizeof(SDL_VideoDevice)); |
409 | + if ( device ) { |
410 | + memset(device, 0, (sizeof *device)); |
411 | + device->hidden = (struct SDL_PrivateVideoData *) |
412 | + malloc((sizeof *device->hidden)); |
413 | + } |
414 | + if ( (device == NULL) || (device->hidden == NULL) ) { |
415 | + SDL_OutOfMemory(); |
416 | + if ( device ) { |
417 | + free(device); |
418 | + } |
419 | + return(0); |
420 | + } |
421 | + memset(device->hidden, 0, (sizeof *device->hidden)); |
422 | + |
423 | + /* Set the function pointers */ |
424 | + device->VideoInit = Caca_VideoInit; |
425 | + device->ListModes = Caca_ListModes; |
426 | + device->SetVideoMode = Caca_SetVideoMode; |
427 | + device->CreateYUVOverlay = NULL; |
428 | + device->SetColors = NULL; |
429 | + device->UpdateRects = NULL; |
430 | + device->VideoQuit = Caca_VideoQuit; |
431 | + device->AllocHWSurface = Caca_AllocHWSurface; |
432 | + device->CheckHWBlit = NULL; |
433 | + device->FillHWRect = NULL; |
434 | + device->SetHWColorKey = NULL; |
435 | + device->SetHWAlpha = NULL; |
436 | + device->LockHWSurface = Caca_LockHWSurface; |
437 | + device->UnlockHWSurface = Caca_UnlockHWSurface; |
438 | + device->FlipHWSurface = NULL; |
439 | + device->FreeHWSurface = Caca_FreeHWSurface; |
440 | + device->SetCaption = NULL; |
441 | + device->SetIcon = NULL; |
442 | + device->IconifyWindow = NULL; |
443 | + device->GrabInput = NULL; |
444 | + device->GetWMInfo = NULL; |
445 | + device->InitOSKeymap = Caca_InitOSKeymap; |
446 | + device->PumpEvents = Caca_PumpEvents; |
447 | + |
448 | + device->free = Caca_DeleteDevice; |
449 | + |
450 | + return device; |
451 | +} |
452 | + |
453 | +VideoBootStrap Caca_bootstrap = { |
454 | + "caca", "Color ASCII Art Library", |
455 | + Caca_Available, Caca_CreateDevice |
456 | +}; |
457 | + |
458 | +int Caca_VideoInit(_THIS, SDL_PixelFormat *vformat) |
459 | +{ |
460 | + int i; |
461 | + |
462 | + /* Initialize all variables that we clean on shutdown */ |
463 | + for ( i=0; i<SDL_NUMMODES; ++i ) { |
464 | + SDL_modelist[i] = malloc(sizeof(SDL_Rect)); |
465 | + SDL_modelist[i]->x = SDL_modelist[i]->y = 0; |
466 | + } |
467 | + /* Modes sorted largest to smallest */ |
468 | + SDL_modelist[0]->w = 1024; SDL_modelist[0]->h = 768; |
469 | + SDL_modelist[1]->w = 800; SDL_modelist[1]->h = 600; |
470 | + SDL_modelist[2]->w = 640; SDL_modelist[2]->h = 480; |
471 | + SDL_modelist[3]->w = 320; SDL_modelist[3]->h = 400; |
472 | + SDL_modelist[4]->w = 320; SDL_modelist[4]->h = 240; |
473 | + SDL_modelist[5]->w = 320; SDL_modelist[5]->h = 200; |
474 | + SDL_modelist[6] = NULL; |
475 | + |
476 | + Caca_mutex = SDL_CreateMutex(); |
477 | + |
478 | + /* Initialize the library */ |
479 | + if ( caca_init() != 0 ) { |
480 | + SDL_SetError("Unable to initialize libcaca"); |
481 | + return(-1); |
482 | + } |
483 | + |
484 | + /* Initialize private variables */ |
485 | + Caca_lastkey = 0; |
486 | + Caca_bitmap = NULL; |
487 | + Caca_buffer = NULL; |
488 | + |
489 | + local_this = this; |
490 | + |
491 | + /* Determine the screen depth (use default 8-bit depth) */ |
492 | + vformat->BitsPerPixel = 8; |
493 | + vformat->BytesPerPixel = 1; |
494 | + |
495 | + /* We're done! */ |
496 | + return(0); |
497 | +} |
498 | + |
499 | +SDL_Rect **Caca_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags) |
500 | +{ |
501 | + if(format->BitsPerPixel != 8) |
502 | + return NULL; |
503 | + |
504 | + if ( flags & SDL_FULLSCREEN ) { |
505 | + return SDL_modelist; |
506 | + } else { |
507 | + return (SDL_Rect **) -1; |
508 | + } |
509 | +} |
510 | + |
511 | +/* Various screen update functions available */ |
512 | +static void Caca_DirectUpdate(_THIS, int numrects, SDL_Rect *rects); |
513 | + |
514 | +SDL_Surface *Caca_SetVideoMode(_THIS, SDL_Surface *current, |
515 | + int width, int height, int bpp, Uint32 flags) |
516 | +{ |
517 | + if ( Caca_buffer ) { |
518 | + free( Caca_buffer ); |
519 | + Caca_buffer = NULL; |
520 | + } |
521 | + |
522 | + if ( Caca_bitmap ) { |
523 | + caca_free_bitmap( Caca_bitmap ); |
524 | + Caca_bitmap = NULL; |
525 | + } |
526 | + |
527 | + Caca_buffer = malloc(2 * ((width + 15) & ~15) * height); |
528 | + if ( ! Caca_buffer ) { |
529 | + SDL_SetError("Couldn't allocate buffer for requested mode"); |
530 | + return(NULL); |
531 | + } |
532 | + |
533 | + memset(Caca_buffer, 0, 2 * ((width + 15) & ~15) * height); |
534 | + |
535 | + /* Allocate the new pixel format for the screen */ |
536 | + if ( ! SDL_ReallocFormat(current, 16, 0xf800, 0x07e0, 0x001f, 0) ) { |
537 | + return(NULL); |
538 | + } |
539 | + |
540 | + /* Set up the new mode framebuffer */ |
541 | + current->flags = SDL_FULLSCREEN; |
542 | + Caca_w = current->w = width; |
543 | + Caca_h = current->h = height; |
544 | + current->pitch = 2 * ((width + 15) & ~15); |
545 | + current->pixels = Caca_buffer; |
546 | + |
547 | + /* Create the libcaca bitmap */ |
548 | + Caca_bitmap = caca_create_bitmap( 16, width, height, current->pitch, 0xf800, 0x07e0, 0x001f, 0x0000 ); |
549 | + if ( ! Caca_bitmap ) { |
550 | + SDL_SetError("Couldn't allocate libcaca bitmap"); |
551 | + return(NULL); |
552 | + } |
553 | + |
554 | + /* Set the blit function */ |
555 | + this->UpdateRects = Caca_DirectUpdate; |
556 | + |
557 | + /* We're done */ |
558 | + return(current); |
559 | +} |
560 | + |
561 | +/* We don't actually allow hardware surfaces other than the main one */ |
562 | +static int Caca_AllocHWSurface(_THIS, SDL_Surface *surface) |
563 | +{ |
564 | + return(-1); |
565 | +} |
566 | +static void Caca_FreeHWSurface(_THIS, SDL_Surface *surface) |
567 | +{ |
568 | + return; |
569 | +} |
570 | + |
571 | +/* We need to wait for vertical retrace on page flipped displays */ |
572 | +static int Caca_LockHWSurface(_THIS, SDL_Surface *surface) |
573 | +{ |
574 | + /* TODO ? */ |
575 | + return(0); |
576 | +} |
577 | +static void Caca_UnlockHWSurface(_THIS, SDL_Surface *surface) |
578 | +{ |
579 | + return; |
580 | +} |
581 | + |
582 | +/* FIXME: How is this done with libcaca? */ |
583 | +static int Caca_FlipHWSurface(_THIS, SDL_Surface *surface) |
584 | +{ |
585 | + SDL_mutexP(Caca_mutex); |
586 | + caca_refresh(); |
587 | + SDL_mutexV(Caca_mutex); |
588 | + return(0); |
589 | +} |
590 | + |
591 | +static void Caca_DirectUpdate(_THIS, int numrects, SDL_Rect *rects) |
592 | +{ |
593 | + SDL_mutexP(Caca_mutex); |
594 | + caca_draw_bitmap( 0, 0, caca_get_width() - 1, caca_get_height() - 1, |
595 | + Caca_bitmap, Caca_buffer ); |
596 | + caca_refresh(); |
597 | + SDL_mutexV(Caca_mutex); |
598 | + return; |
599 | +} |
600 | + |
601 | +/* Note: If we are terminated, this could be called in the middle of |
602 | + another SDL video routine -- notably UpdateRects. |
603 | +*/ |
604 | +void Caca_VideoQuit(_THIS) |
605 | +{ |
606 | + int i; |
607 | + |
608 | + /* Free video mode lists */ |
609 | + for ( i=0; i<SDL_NUMMODES; ++i ) { |
610 | + if ( SDL_modelist[i] != NULL ) { |
611 | + free(SDL_modelist[i]); |
612 | + SDL_modelist[i] = NULL; |
613 | + } |
614 | + } |
615 | + |
616 | + if ( Caca_bitmap ) { |
617 | + caca_free_bitmap( Caca_bitmap ); |
618 | + Caca_bitmap = NULL; |
619 | + } |
620 | + |
621 | + caca_end(); |
622 | + |
623 | + SDL_DestroyMutex(Caca_mutex); |
624 | +} |
625 | + |
626 | --- SDL/src/video/caca/SDL_cacavideo.h |
627 | +++ SDL/src/video/caca/SDL_cacavideo.h |
628 | @@ -0,0 +1,73 @@ |
629 | +/* |
630 | + SDL - Simple DirectMedia Layer |
631 | + Copyright (C) 2003 Sam Hocevar |
632 | + |
633 | + This library is free software; you can redistribute it and/or |
634 | + modify it under the terms of the GNU Library General Public |
635 | + License as published by the Free Software Foundation; either |
636 | + version 2 of the License, or (at your option) any later version. |
637 | + |
638 | + This library is distributed in the hope that it will be useful, |
639 | + but WITHOUT ANY WARRANTY; without even the implied warranty of |
640 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
641 | + Library General Public License for more details. |
642 | + |
643 | + You should have received a copy of the GNU Library General Public |
644 | + License along with this library; if not, write to the Free |
645 | + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
646 | + |
647 | + Sam Hocevar |
648 | + sam@zoy.org |
649 | +*/ |
650 | + |
651 | +#ifdef SAVE_RCSID |
652 | +static char rcsid = |
653 | + "@(#) $Id: libsdl-1.2.8-libcaca.patch,v 1.1 2007-05-08 19:57:41 niro Exp $"; |
654 | +#endif |
655 | + |
656 | +#ifndef _SDL_cacavideo_h |
657 | +#define _SDL_cacavideo_h |
658 | + |
659 | +#include "SDL_mouse.h" |
660 | +#include "SDL_sysvideo.h" |
661 | +#include "SDL_mutex.h" |
662 | + |
663 | +#include <sys/time.h> |
664 | +#include <time.h> |
665 | + |
666 | +#include <caca.h> |
667 | + |
668 | +/* Hidden "this" pointer for the video functions */ |
669 | +#define _THIS SDL_VideoDevice *this |
670 | + |
671 | +#define SDL_NUMMODES 6 |
672 | + |
673 | +/* Private display data */ |
674 | +struct SDL_PrivateVideoData { |
675 | + SDL_Rect *SDL_modelist[SDL_NUMMODES+1]; |
676 | + SDL_mutex *mutex; |
677 | + |
678 | + struct caca_bitmap *bitmap; |
679 | + void *buffer; |
680 | + int w, h; |
681 | + |
682 | + int lastkey; |
683 | + struct timeval lasttime; |
684 | +}; |
685 | + |
686 | +/* Old variable names */ |
687 | +#define SDL_modelist (this->hidden->SDL_modelist) |
688 | +#define Caca_palette (this->hidden->palette) |
689 | +#define Caca_bitmap (this->hidden->bitmap) |
690 | +#define Caca_buffer (this->hidden->buffer) |
691 | + |
692 | +#define Caca_w (this->hidden->w) |
693 | +#define Caca_h (this->hidden->h) |
694 | + |
695 | +#define Caca_lastkey (this->hidden->lastkey) |
696 | +#define Caca_lasttime (this->hidden->lasttime) |
697 | + |
698 | +#define Caca_mutex (this->hidden->mutex) |
699 | + |
700 | +#endif /* _SDL_cacavideo_h */ |
701 | + |