Force masks to zero if creating an 8-bit surface.
Otherwise, SDL2 doesn't do what we want here.
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
22 /* This file contains functions for backwards compatibility with SDL 1.2 */
24 // !!! FIXME: clean up code conventions
25 // !!! FIXME: grep for VideoWindow20 places that might care if it's NULL
27 #include "SDL20_include_wrapper.h"
29 #if !SDL_VERSION_ATLEAST(2,0,0)
30 #error You need to compile against SDL 2.0 headers.
34 * We report the library version as 1.2.$(SDL12_COMPAT_VERSION). This number
35 * should be way ahead of what SDL-1.2 Classic would report, so apps can
36 * decide if they're running under the compat layer, if they really care.
38 #define SDL12_COMPAT_VERSION 50
42 // !!! IMPLEMENT_ME SDL_CDClose
43 // !!! IMPLEMENT_ME SDL_CDEject
44 // !!! IMPLEMENT_ME SDL_CDName
45 // !!! IMPLEMENT_ME SDL_CDNumDrives
46 // !!! IMPLEMENT_ME SDL_CDOpen
47 // !!! IMPLEMENT_ME SDL_CDPause
48 // !!! IMPLEMENT_ME SDL_CDPlay
49 // !!! IMPLEMENT_ME SDL_CDPlayTracks
50 // !!! IMPLEMENT_ME SDL_CDResume
51 // !!! IMPLEMENT_ME SDL_CDStatus
52 // !!! IMPLEMENT_ME SDL_CDStop
53 // !!! IMPLEMENT_ME SDL_CreateYUVOverlay
55 // !!! IMPLEMENT_ME SDL_DisplayFormatAlpha
56 // !!! IMPLEMENT_ME SDL_DisplayYUVOverlay
57 // !!! IMPLEMENT_ME SDL_EnableKeyRepeat
58 // !!! IMPLEMENT_ME SDL_EnableUNICODE
59 // !!! IMPLEMENT_ME SDL_FreeYUVOverlay
61 // !!! IMPLEMENT_ME SDL_GL_Lock
62 // !!! IMPLEMENT_ME SDL_GL_Unlock
63 // !!! IMPLEMENT_ME SDL_GL_UpdateRects
65 // !!! IMPLEMENT_ME SDL_GetKeyName
66 // !!! IMPLEMENT_ME SDL_GetKeyState
67 // !!! IMPLEMENT_ME SDL_GetModState
68 // !!! IMPLEMENT_ME SDL_GetRelativeMouseState
70 // !!! IMPLEMENT_ME SDL_GetVideoSurface
71 // !!! IMPLEMENT_ME SDL_GetWMInfo
73 // !!! IMPLEMENT_ME SDL_LockSurface
74 // !!! IMPLEMENT_ME SDL_LockYUVOverlay
75 // !!! IMPLEMENT_ME SDL_LowerBlit
77 // !!! IMPLEMENT_ME SDL_SetAlpha
78 // !!! IMPLEMENT_ME SDL_SetColorKey
79 // !!! IMPLEMENT_ME SDL_SetColors
81 // !!! IMPLEMENT_ME SDL_SetModState
82 // !!! IMPLEMENT_ME SDL_SetPalette
83 // !!! IMPLEMENT_ME SDL_SetVideoMode
84 // !!! IMPLEMENT_ME SDL_SoftStretch
85 // !!! IMPLEMENT_ME SDL_UnlockSurface
86 // !!! IMPLEMENT_ME SDL_UnlockYUVOverlay
87 // !!! IMPLEMENT_ME SDL_UpdateRects
88 // !!! IMPLEMENT_ME SDL_UpperBlit
90 // !!! FIXME: should SDL_VideoInit really be a passthrough?
91 // !!! FIXME: should SDL_VideoQuit really be a passthrough?
93 // !!! IMPLEMENT_ME SDL_WM_SetIcon
94 // !!! IMPLEMENT_ME SDL_WM_ToggleFullScreen
96 // !!! IMPLEMENT_ME X11_KeyToUnicode
98 #define SDL_BlitSurface SDL_UpperBlit
102 #define FIXME(x) do {} while (0)
106 static SDL_bool seen = SDL_FALSE; \
108 fprintf(stderr, "FIXME: %s (%s:%d)\n", x, __FILE__, __LINE__); \
114 #define SDL20_SYM(rc,fn,params,args,ret) \
115 typedef rc (SDLCALL *SDL20_##fn##_t) params; \
116 static SDL20_##fn##_t SDL20_##fn = NULL;
117 #include "SDL20_syms.h"
119 /* Things that _should_ be binary compatible pass right through... */
120 #define SDL20_SYM_PASSTHROUGH(rc,fn,params,args,ret) \
121 DECLSPEC rc SDLCALL SDL_##fn params { ret SDL20_##fn args; }
122 #include "SDL20_syms.h"
125 /* these are macros (etc) in the SDL headers, so make our own. */
126 #define SDL20_OutOfMemory() SDL20_Error(SDL_ENOMEM)
127 #define SDL20_Unsupported() SDL20_Error(SDL_UNSUPPORTED)
128 #define SDL20_InvalidParamError(param) SDL20_SetError("Parameter '%s' is invalid", (param))
129 #define SDL20_zero(x) SDL20_memset(&(x), 0, sizeof((x)))
130 #define SDL20_zerop(x) SDL20_memset((x), 0, sizeof(*(x)))
131 #define SDL_ReportAssertion SDL20_ReportAssertion
133 #define SDL12_DEFAULT_REPEAT_DELAY 500
134 #define SDL12_DEFAULT_REPEAT_INTERVAL 30
136 #define SDL12_INIT_TIMER 0x00000001
137 #define SDL12_INIT_AUDIO 0x00000010
138 #define SDL12_INIT_VIDEO 0x00000020
139 #define SDL12_INIT_CDROM 0x00000100
140 #define SDL12_INIT_JOYSTICK 0x00000200
141 #define SDL12_INIT_NOPARACHUTE 0x00100000
142 #define SDL12_INIT_EVENTTHREAD 0x01000000
143 #define SDL12_INIT_EVERYTHING 0x0000FFFF
145 typedef struct SDL12_Rect
153 typedef struct SDL12_Palette
159 typedef struct SDL12_PixelFormat
161 SDL12_Palette *palette;
180 typedef struct SDL12_Surface
183 SDL12_PixelFormat *format;
189 SDL_Surface *surface20; /* the real SDL 1.2 has an opaque pointer to a platform-specific thing here named "hwdata". */
190 SDL12_Rect clip_rect;
194 unsigned int format_version;
198 typedef struct SDL12_Overlay
208 Uint32 hw_overlay :1;
209 Uint32 UnusedBits :31;
214 Uint32 hw_available :1;
215 Uint32 wm_available :1;
216 Uint32 UnusedBits1 :6;
217 Uint32 UnusedBits2 :1;
219 Uint32 blit_hw_CC :1;
222 Uint32 blit_sw_CC :1;
225 Uint32 UnusedBits3 :16;
227 SDL_PixelFormat *vfmt;
233 #define SDL12_HWSURFACE 0x00000001
234 #define SDL12_ASYNCBLIT 0x00000004
235 #define SDL12_ANYFORMAT 0x10000000
236 #define SDL12_HWPALETTE 0x20000000
237 #define SDL12_DOUBLEBUF 0x40000000
238 #define SDL12_FULLSCREEN 0x80000000
239 #define SDL12_OPENGL 0x00000002
240 #define SDL12_OPENGLBLIT 0x0000000A
241 #define SDL12_RESIZABLE 0x00000010
242 #define SDL12_NOFRAME 0x00000020
243 #define SDL12_HWACCEL 0x00000100
244 #define SDL12_SRCCOLORKEY 0x00001000
245 #define SDL12_RLEACCELOK 0x00002000
246 #define SDL12_RLEACCEL 0x00004000
247 #define SDL12_SRCALPHA 0x00010000
248 #define SDL12_PREALLOC 0x01000000
254 SDLK12_BACKSPACE = 8,
262 SDLK12_QUOTEDBL = 34,
265 SDLK12_AMPERSAND = 38,
267 SDLK12_LEFTPAREN = 40,
268 SDLK12_RIGHTPAREN = 41,
269 SDLK12_ASTERISK = 42,
286 SDLK12_SEMICOLON = 59,
290 SDLK12_QUESTION = 63,
292 SDLK12_LEFTBRACKET = 91,
293 SDLK12_BACKSLASH = 92,
294 SDLK12_RIGHTBRACKET = 93,
296 SDLK12_UNDERSCORE = 95,
297 SDLK12_BACKQUOTE = 96,
325 SDLK12_WORLD_0 = 160,
326 SDLK12_WORLD_1 = 161,
327 SDLK12_WORLD_2 = 162,
328 SDLK12_WORLD_3 = 163,
329 SDLK12_WORLD_4 = 164,
330 SDLK12_WORLD_5 = 165,
331 SDLK12_WORLD_6 = 166,
332 SDLK12_WORLD_7 = 167,
333 SDLK12_WORLD_8 = 168,
334 SDLK12_WORLD_9 = 169,
335 SDLK12_WORLD_10 = 170,
336 SDLK12_WORLD_11 = 171,
337 SDLK12_WORLD_12 = 172,
338 SDLK12_WORLD_13 = 173,
339 SDLK12_WORLD_14 = 174,
340 SDLK12_WORLD_15 = 175,
341 SDLK12_WORLD_16 = 176,
342 SDLK12_WORLD_17 = 177,
343 SDLK12_WORLD_18 = 178,
344 SDLK12_WORLD_19 = 179,
345 SDLK12_WORLD_20 = 180,
346 SDLK12_WORLD_21 = 181,
347 SDLK12_WORLD_22 = 182,
348 SDLK12_WORLD_23 = 183,
349 SDLK12_WORLD_24 = 184,
350 SDLK12_WORLD_25 = 185,
351 SDLK12_WORLD_26 = 186,
352 SDLK12_WORLD_27 = 187,
353 SDLK12_WORLD_28 = 188,
354 SDLK12_WORLD_29 = 189,
355 SDLK12_WORLD_30 = 190,
356 SDLK12_WORLD_31 = 191,
357 SDLK12_WORLD_32 = 192,
358 SDLK12_WORLD_33 = 193,
359 SDLK12_WORLD_34 = 194,
360 SDLK12_WORLD_35 = 195,
361 SDLK12_WORLD_36 = 196,
362 SDLK12_WORLD_37 = 197,
363 SDLK12_WORLD_38 = 198,
364 SDLK12_WORLD_39 = 199,
365 SDLK12_WORLD_40 = 200,
366 SDLK12_WORLD_41 = 201,
367 SDLK12_WORLD_42 = 202,
368 SDLK12_WORLD_43 = 203,
369 SDLK12_WORLD_44 = 204,
370 SDLK12_WORLD_45 = 205,
371 SDLK12_WORLD_46 = 206,
372 SDLK12_WORLD_47 = 207,
373 SDLK12_WORLD_48 = 208,
374 SDLK12_WORLD_49 = 209,
375 SDLK12_WORLD_50 = 210,
376 SDLK12_WORLD_51 = 211,
377 SDLK12_WORLD_52 = 212,
378 SDLK12_WORLD_53 = 213,
379 SDLK12_WORLD_54 = 214,
380 SDLK12_WORLD_55 = 215,
381 SDLK12_WORLD_56 = 216,
382 SDLK12_WORLD_57 = 217,
383 SDLK12_WORLD_58 = 218,
384 SDLK12_WORLD_59 = 219,
385 SDLK12_WORLD_60 = 220,
386 SDLK12_WORLD_61 = 221,
387 SDLK12_WORLD_62 = 222,
388 SDLK12_WORLD_63 = 223,
389 SDLK12_WORLD_64 = 224,
390 SDLK12_WORLD_65 = 225,
391 SDLK12_WORLD_66 = 226,
392 SDLK12_WORLD_67 = 227,
393 SDLK12_WORLD_68 = 228,
394 SDLK12_WORLD_69 = 229,
395 SDLK12_WORLD_70 = 230,
396 SDLK12_WORLD_71 = 231,
397 SDLK12_WORLD_72 = 232,
398 SDLK12_WORLD_73 = 233,
399 SDLK12_WORLD_74 = 234,
400 SDLK12_WORLD_75 = 235,
401 SDLK12_WORLD_76 = 236,
402 SDLK12_WORLD_77 = 237,
403 SDLK12_WORLD_78 = 238,
404 SDLK12_WORLD_79 = 239,
405 SDLK12_WORLD_80 = 240,
406 SDLK12_WORLD_81 = 241,
407 SDLK12_WORLD_82 = 242,
408 SDLK12_WORLD_83 = 243,
409 SDLK12_WORLD_84 = 244,
410 SDLK12_WORLD_85 = 245,
411 SDLK12_WORLD_86 = 246,
412 SDLK12_WORLD_87 = 247,
413 SDLK12_WORLD_88 = 248,
414 SDLK12_WORLD_89 = 249,
415 SDLK12_WORLD_90 = 250,
416 SDLK12_WORLD_91 = 251,
417 SDLK12_WORLD_92 = 252,
418 SDLK12_WORLD_93 = 253,
419 SDLK12_WORLD_94 = 254,
420 SDLK12_WORLD_95 = 255,
431 SDLK12_KP_PERIOD = 266,
432 SDLK12_KP_DIVIDE = 267,
433 SDLK12_KP_MULTIPLY = 268,
434 SDLK12_KP_MINUS = 269,
435 SDLK12_KP_PLUS = 270,
436 SDLK12_KP_ENTER = 271,
437 SDLK12_KP_EQUALS = 272,
446 SDLK12_PAGEDOWN = 281,
462 SDLK12_NUMLOCK = 300,
463 SDLK12_CAPSLOCK = 301,
464 SDLK12_SCROLLOCK = 302,
476 SDLK12_COMPOSE = 314,
490 KMOD12_NONE = 0x0000,
491 KMOD12_LSHIFT = 0x0001,
492 KMOD12_RSHIFT = 0x0002,
493 KMOD12_LCTRL = 0x0040,
494 KMOD12_RCTRL = 0x0080,
495 KMOD12_LALT = 0x0100,
496 KMOD12_RALT = 0x0200,
497 KMOD12_LMETA = 0x0400,
498 KMOD12_RMETA = 0x0800,
500 KMOD12_CAPS = 0x2000,
501 KMOD12_MODE = 0x4000,
502 KMOD12_RESERVED = 0x8000
505 typedef struct SDL12_keysym
520 SDL12_MOUSEBUTTONDOWN,
529 SDL12_EVENT_RESERVEDA,
530 SDL12_EVENT_RESERVEDB,
533 SDL12_USEREVENT = 24,
538 #define SDL12_APPMOUSEFOCUS (1<<0)
539 #define SDL12_APPINPUTFOCUS (1<<1)
540 #define SDL12_APPACTIVE (1<<2)
555 } SDL12_KeyboardEvent;
565 } SDL12_MouseMotionEvent;
574 } SDL12_MouseButtonEvent;
582 } SDL12_JoyAxisEvent;
591 } SDL12_JoyBallEvent;
607 } SDL12_JoyButtonEvent;
643 SDL12_ActiveEvent active;
644 SDL12_KeyboardEvent key;
645 SDL12_MouseMotionEvent motion;
646 SDL12_MouseButtonEvent button;
647 SDL12_JoyAxisEvent jaxis;
648 SDL12_JoyBallEvent jball;
649 SDL12_JoyHatEvent jhat;
650 SDL12_JoyButtonEvent jbutton;
651 SDL12_ResizeEvent resize;
652 SDL12_ExposeEvent expose;
653 SDL12_QuitEvent quit;
654 SDL12_UserEvent user;
655 SDL12_SysWMEvent syswm;
658 typedef int (SDLCALL *SDL12_EventFilter)(const SDL12_Event *event12);
659 static int EventFilter20to12(void *data, SDL_Event *event20);
661 typedef Uint32 (SDLCALL *SDL12_TimerCallback)(Uint32 interval);
662 typedef SDL_TimerCallback SDL12_NewTimerCallback;
672 SDL_Cursor *wm_cursor; /* the real SDL 1.2 has an opaque pointer to a platform-specific cursor here. */
681 SDL12_GL_BUFFER_SIZE,
682 SDL12_GL_DOUBLEBUFFER,
684 SDL12_GL_STENCIL_SIZE,
685 SDL12_GL_ACCUM_RED_SIZE,
686 SDL12_GL_ACCUM_GREEN_SIZE,
687 SDL12_GL_ACCUM_BLUE_SIZE,
688 SDL12_GL_ACCUM_ALPHA_SIZE,
690 SDL12_GL_MULTISAMPLEBUFFERS,
691 SDL12_GL_MULTISAMPLESAMPLES,
692 SDL12_GL_ACCELERATED_VISUAL,
693 SDL12_GL_SWAP_CONTROL,
694 SDL12_GL_MAX_ATTRIBUTE
701 SDL12_Rect *modeslist12;
702 SDL12_Rect **modes12; /* ptrs to each item in modeslist, for SDL_ListModes() */
708 SDL_Joystick *joystick;
709 } JoystickOpenedItem;
711 // !!! FIXME: go through all of these.
712 static VideoModeList *VideoModes = NULL;
713 static int VideoModesCount = 0;
714 static SDL12_VideoInfo VideoInfo12;
715 static SDL_Window *VideoWindow20 = NULL;
716 static SDL_Renderer *VideoRenderer20 = NULL;
717 static SDL_Texture *VideoTexture20 = NULL;
718 static SDL12_Surface *VideoSurface12 = NULL;
719 static SDL_Surface *VideoConvertSurface20 = NULL;
720 static SDL_GLContext *VideoGLContext20 = NULL;
721 static char *WindowTitle = NULL;
722 static char *WindowIconTitle = NULL;
723 static SDL12_Surface *VideoIcon12;
724 static int EnabledUnicode = 0;
725 static int VideoDisplayIndex = 0;
726 static int CDRomInit = 0;
727 static SDL12_EventFilter EventFilter12 = NULL;
728 static SDL12_Cursor *CurrentCursor12 = NULL;
729 static Uint8 EventStates[SDL12_NUMEVENTS];
730 static int SwapInterval = 0;
731 static JoystickOpenedItem JoystickOpenList[16];
733 // !!! FIXME: need a mutex for the event queue.
734 #define SDL12_MAXEVENTS 128
735 typedef struct EventQueueType
738 struct EventQueueType *next;
741 static EventQueueType EventQueuePool[SDL12_MAXEVENTS];
742 static EventQueueType *EventQueueHead = NULL;
743 static EventQueueType *EventQueueTail = NULL;
744 static EventQueueType *EventQueueAvailable = NULL;
747 /* Obviously we can't use SDL_LoadObject() to load SDL2. :) */
748 #if defined(_WINDOWS)
749 #define WIN32_LEAN_AND_MEAN 1
751 #define SDL20_LIBNAME "SDL2.dll"
752 static HANDLE Loaded_SDL20 = NULL;
753 #define LoadSDL20Library() ((Loaded_SDL20 = LoadLibraryA(SDL20_LIBNAME)) != NULL)
754 #define LookupSDL20Sym(sym) GetProcAddress(Loaded_SDL20, sym)
755 #define CloseSDL20Library() { { if (Loaded_SDL20) { FreeLibrary(Loaded_SDL20); Loaded_SDL20 = NULL; } }
756 #elif defined(unix) || defined(__APPLE__)
759 #define SDL20_LIBNAME "libSDL2.dylib"
761 #define SDL20_LIBNAME "libSDL2-2.0.so.0"
763 static void *Loaded_SDL20 = NULL;
764 #define LoadSDL20Library() ((Loaded_SDL20 = dlopen(SDL20_LIBNAME, RTLD_LOCAL|RTLD_NOW)) != NULL)
765 #define LookupSDL20Sym(sym) dlsym(Loaded_SDL20, sym)
766 #define CloseSDL20Library() { if (Loaded_SDL20) { dlclose(Loaded_SDL20); Loaded_SDL20 = NULL; } }
768 #error Please define your platform.
772 LoadSDL20Symbol(const char *fn, int *okay)
775 if (*okay) { /* only bother trying if we haven't previously failed. */
776 retval = LookupSDL20Sym(fn);
777 if (retval == NULL) {
778 /* Flip to 1 to warn but maybe work if nothing calls that function, flip to zero to fail out. */
780 fprintf(stderr, "WARNING: LOAD FAILED: %s\n", fn);
792 #define SDL20_SYM(rc,fn,params,args,ret) SDL20_##fn = NULL;
793 #include "SDL20_syms.h"
803 okay = LoadSDL20Library();
804 #define SDL20_SYM(rc,fn,params,args,ret) SDL20_##fn = (SDL20_##fn##_t) LoadSDL20Symbol("SDL_" #fn, &okay);
805 #include "SDL20_syms.h"
812 DECLSPEC const SDL_version * SDLCALL
813 SDL_Linked_Version(void)
815 static const SDL_version version = { 1, 2, SDL12_COMPAT_VERSION };
820 SDL_sscanf(const char *text, const char *fmt, ...)
825 retval = (int) SDL20_sscanf(text, fmt, ap);
831 SDL_snprintf(char *text, size_t maxlen, const char *fmt, ...)
836 retval = (int) SDL20_vsnprintf(text, maxlen, fmt, ap);
841 DECLSPEC void * SDLCALL
842 SDL_revcpy(void *dst, const void *src, size_t len)
844 /* this doesn't reverse the data...I think this was just a memcpy that
845 was meant to be CPU-cache friendly if you knew you were working with
846 data going backwards in memory, instead of jumping over pages to copy
847 from the start...? Whatever, just do a memcpy here. */
848 return SDL_memcpy(dst, src, len);
852 DECLSPEC SDL_bool SDLCALL
855 /* this isn't accurate, but SDL2 doesn't have this for some reason.
856 MMXExt is available in all SSE1 machines, except early Athlon chips,
857 so we'll just say it's available if they have SSE1. Oh well. */
858 return SDL20_HasSSE();
861 DECLSPEC SDL_bool SDLCALL
862 SDL_Has3DNowExt(void)
865 return SDL20_HasSSE();
868 DECLSPEC SDL_Joystick * SDLCALL
869 SDL_JoystickOpen(int device_index)
872 SDL20_LockJoysticks();
873 for (i = 0; i < SDL_arraysize(JoystickOpenList); i++) {
874 if (JoystickOpenList[i].joystick == NULL) {
879 if (i == SDL_arraysize(JoystickOpenList)) {
880 SDL20_UnlockJoysticks();
881 SDL20_SetError("Too many open joysticks");
885 JoystickOpenList[i].joystick = SDL20_JoystickOpen(device_index);
886 if (JoystickOpenList[i].joystick) {
887 JoystickOpenList[i].device_index = device_index;
890 SDL20_UnlockJoysticks();
891 return JoystickOpenList[i].joystick;
894 DECLSPEC void SDLCALL
895 SDL_JoystickClose(SDL_Joystick *joystick)
898 SDL20_LockJoysticks();
899 for (i = 0; i < SDL_arraysize(JoystickOpenList); i++) {
900 if (JoystickOpenList[i].joystick == joystick) {
905 if (i < SDL_arraysize(JoystickOpenList)) {
906 JoystickOpenList[i].joystick = NULL;
909 SDL20_UnlockJoysticks();
911 SDL20_JoystickClose(joystick);
914 DECLSPEC const char * SDLCALL
915 SDL_JoystickName(int device_index)
917 return SDL20_JoystickNameForIndex(device_index);
921 SDL_JoystickIndex(SDL_Joystick *joystick)
925 SDL20_LockJoysticks(); {
926 for (i = 0; i < SDL_arraysize(JoystickOpenList); i++) {
927 if (JoystickOpenList[i].joystick == joystick) {
932 if (i < SDL_arraysize(JoystickOpenList)) {
933 SDL20_UnlockJoysticks();
934 return JoystickOpenList[i].device_index;
938 SDL20_UnlockJoysticks();
939 return SDL20_SetError("Can't find joystick");
943 SDL_JoystickOpened(int device_index)
947 SDL20_LockJoysticks();
948 for (i = 0; i < SDL_arraysize(JoystickOpenList); i++) {
949 if ((JoystickOpenList[i].joystick) && (JoystickOpenList[i].device_index == device_index)) {
954 SDL20_UnlockJoysticks();
961 FIXME("cache this value during SDL_Init() so it doesn't change.");
962 const char *variable = SDL20_getenv("SDL_VIDEO_FULLSCREEN_DISPLAY");
964 variable = SDL20_getenv("SDL_VIDEO_FULLSCREEN_HEAD");
967 return SDL20_atoi(variable);
973 /* This sets up VideoModes and VideoModesCount. You end up with arrays by pixel
974 format, each with a value that 1.2's SDL_ListModes() can return. */
978 const int total = SDL20_GetNumDisplayModes(VideoDisplayIndex);
979 VideoModeList *vmode = NULL;
984 if (VideoModesCount > 0) {
985 return 0; // already did this.
988 SDL_assert(VideoModes == NULL);
990 for (i = 0; i < total; ++i) {
991 SDL_DisplayMode mode;
993 if (SDL20_GetDisplayMode(VideoDisplayIndex, i, &mode) == -1) {
995 } else if (!mode.w || !mode.h) {
996 SDL_assert(0 && "Can this actually happen?");
1000 if (!vmode || (mode.format != vmode->format)) { // SDL20_GetDisplayMode() sorts on bpp first. We know when to change arrays.
1001 if (VideoModesCount > 0) {
1002 VideoModes[VideoModesCount-1].modes12[num_modes] = NULL;
1004 ptr = (VideoModeList *) SDL20_realloc(VideoModes, sizeof (VideoModeList) * (VideoModesCount+1));
1006 return SDL20_OutOfMemory();
1008 VideoModes = (VideoModeList *) ptr;
1009 vmode = &VideoModes[VideoModesCount];
1010 vmode->format = mode.format;
1011 vmode->modeslist12 = NULL;
1012 vmode->modes12 = NULL;
1017 /* make sure we don't have this one already (with a different refresh rate, etc). */
1018 for (j = 0; j < num_modes; j++) {
1019 if ((vmode->modeslist12[j].w == mode.w) && (vmode->modeslist12[j].h == mode.h)) {
1024 if (j < num_modes) {
1025 continue; /* already have this one. */
1028 FIXME("Make sure mode dimensions fit in 16-bits for SDL12_Rect");
1030 ptr = SDL20_realloc(vmode->modes12, sizeof (SDL12_Rect *) * (num_modes + 2));
1032 return SDL20_OutOfMemory();
1034 vmode->modes12 = (SDL12_Rect **) ptr;
1036 ptr = SDL20_realloc(vmode->modeslist12, sizeof (SDL12_Rect) * (num_modes + 1));
1038 return SDL20_OutOfMemory();
1040 vmode->modeslist12 = (SDL12_Rect *) ptr;
1042 vmode->modeslist12[num_modes].x = 0;
1043 vmode->modeslist12[num_modes].y = 0;
1044 vmode->modeslist12[num_modes].w = mode.w;
1045 vmode->modeslist12[num_modes].h = mode.h;
1047 vmode->modes12[num_modes] = &vmode->modeslist12[num_modes];
1052 if (VideoModesCount > 0) {
1053 VideoModes[VideoModesCount-1].modes12[num_modes] = NULL;
1064 for (i = 0; i < SDL12_MAXEVENTS-1; i++)
1065 EventQueuePool[i].next = &EventQueuePool[i+1];
1066 EventQueuePool[SDL12_MAXEVENTS-1].next = NULL;
1068 EventQueueHead = EventQueueTail = NULL;
1069 EventQueueAvailable = EventQueuePool;
1071 SDL_memset(EventStates, SDL_ENABLE, sizeof (EventStates)); /* on by default */
1072 EventStates[SDL12_SYSWMEVENT] = SDL_IGNORE; /* off by default. */
1074 SDL20_SetEventFilter(EventFilter20to12, NULL);
1076 VideoDisplayIndex = GetVideoDisplay();
1079 if (Init12VidModes() == -1) {
1087 DECLSPEC int SDLCALL
1088 SDL_InitSubSystem(Uint32 sdl12flags)
1090 FIXME("there is never a parachute in SDL2, should we catch segfaults ourselves?");
1092 FIXME("support event thread where it makes sense to do so?");
1094 if ( (sdl12flags & SDL12_INIT_EVENTTHREAD) == SDL12_INIT_EVENTTHREAD ) {
1095 return SDL20_SetError("OS doesn't support threaded events");
1098 Uint32 sdl20flags = 0;
1105 extern void sdl12_compat_macos_init(void);
1106 sdl12_compat_macos_init();
1109 #define SETFLAG(flag) if (sdl12flags & SDL12_INIT_##flag) sdl20flags |= SDL_INIT_##flag
1114 SETFLAG(NOPARACHUTE);
1117 // There's no CDROM in 2.0, but we'll just pretend it succeeded.
1118 if (sdl12flags & SDL12_INIT_CDROM)
1121 FIXME("do something about SDL12_INIT_EVENTTHREAD");
1123 rc = SDL20_Init(sdl20flags);
1124 if ((rc == 0) && (sdl20flags & SDL_INIT_VIDEO)) {
1125 if (Init12Video() == -1) {
1126 FIXME("should we deinit other subsystems?");
1134 DECLSPEC int SDLCALL
1135 SDL_Init(Uint32 sdl12flags)
1137 FIXME("what was different in 1.2?");
1138 return SDL_InitSubSystem(sdl12flags); /* there's no difference betwee Init and InitSubSystem in SDL2. */
1143 InitFlags12To20(const Uint32 flags12, Uint32 *_flags20, Uint32 *_extraflags)
1146 Uint32 extraflags = 0;
1148 #define SETFLAG(flag) if (flags12 & SDL12_INIT_##flag) flags20 |= SDL_INIT_##flag
1153 SETFLAG(NOPARACHUTE);
1156 if ((flags12 & SDL12_INIT_CDROM) && (CDRomInit)) {
1157 extraflags |= SDL12_INIT_CDROM;
1160 FIXME("do something about SDL12_INIT_EVENTTHREAD");
1162 *_flags20 = flags20;
1163 *_extraflags = extraflags;
1167 InitFlags20to12(const Uint32 flags20)
1171 #define SETFLAG(flag) if (flags20 & SDL_INIT_##flag) flags12 |= SDL12_INIT_##flag
1176 SETFLAG(NOPARACHUTE);
1183 DECLSPEC Uint32 SDLCALL
1184 SDL_WasInit(Uint32 sdl12flags)
1186 Uint32 sdl20flags, extraflags;
1187 InitFlags12To20(sdl12flags, &sdl20flags, &extraflags);
1189 return InitFlags20to12(SDL20_WasInit(sdl20flags)) | extraflags;
1197 for (i = 0; i < VideoModesCount; i++) {
1198 SDL20_free(VideoModes[i].modeslist12);
1199 SDL20_free(VideoModes[i].modes12);
1201 SDL20_free(VideoModes);
1203 SDL20_FreeFormat(VideoInfo12.vfmt);
1204 SDL20_zero(VideoInfo12);
1206 EventFilter12 = NULL;
1207 EventQueueAvailable = EventQueueHead = EventQueueTail = NULL;
1208 CurrentCursor12 = NULL;
1210 VideoModesCount = 0;
1213 DECLSPEC void SDLCALL
1214 SDL_QuitSubSystem(Uint32 sdl12flags)
1216 Uint32 sdl20flags, extraflags;
1217 InitFlags12To20(sdl12flags, &sdl20flags, &extraflags);
1219 if (extraflags & SDL12_INIT_CDROM) {
1223 FIXME("reset a bunch of other global variables too.");
1224 if (sdl12flags & SDL12_INIT_VIDEO) {
1228 FIXME("do something about SDL12_INIT_EVENTTHREAD");
1229 SDL20_QuitSubSystem(sdl20flags);
1231 if ((SDL20_WasInit(0) == 0) && (!CDRomInit)) {
1237 DECLSPEC void SDLCALL
1240 SDL_QuitSubSystem(SDL_WasInit(0) | SDL12_INIT_CDROM);
1243 DECLSPEC void SDLCALL
1244 SDL_SetError(const char *fmt, ...)
1251 if (!LoadSDL20()) { /* SDL_SetError gets called before init sometimes. */
1256 len = SDL20_vsnprintf(&ch, 1, fmt, ap);
1259 str = (char *) SDL20_malloc(len + 1);
1261 SDL20_OutOfMemory();
1265 SDL20_vsnprintf(str, len + 1, fmt, ap);
1267 SDL20_SetError("%s", str);
1272 DECLSPEC const char * SDLCALL
1275 if (SDL20_GetError == NULL)
1277 static const char noload_errstr[] = "The SDL 2.0 library that the 1.2 compatibility layer needs isn't loaded";
1278 return noload_errstr;
1280 return SDL20_GetError();
1285 GetDriverName(const char *name, char *namebuf, int maxlen)
1289 SDL20_strlcpy(namebuf, name, maxlen);
1298 DECLSPEC const char * SDLCALL
1299 SDL_AudioDriverName(char *namebuf, int maxlen)
1301 return GetDriverName(SDL20_GetCurrentAudioDriver(), namebuf, maxlen);
1304 DECLSPEC const char * SDLCALL
1305 SDL_VideoDriverName(char *namebuf, int maxlen)
1307 return GetDriverName(SDL20_GetCurrentVideoDriver(), namebuf, maxlen);
1310 DECLSPEC int SDLCALL
1311 SDL_PollEvent(SDL12_Event *event12)
1313 EventQueueType *next;
1315 SDL20_PumpEvents(); /* this will run our filter and build our 1.2 queue. */
1317 if (EventQueueHead == NULL)
1318 return 0; /* no events at the moment. */
1320 SDL_memcpy(event12, &EventQueueHead->event12, sizeof (SDL12_Event));
1321 next = EventQueueHead->next;
1322 EventQueueHead->next = EventQueueAvailable;
1323 EventQueueAvailable = EventQueueHead;
1324 EventQueueHead = next;
1326 EventQueueTail = NULL;
1332 DECLSPEC int SDLCALL
1333 SDL_PushEvent(SDL12_Event *event12)
1335 EventQueueType *item = EventQueueAvailable;
1337 return -1; /* no space available at the moment. */
1339 EventQueueAvailable = item->next;
1341 EventQueueTail->next = item;
1343 EventQueueHead = EventQueueTail = item;
1346 SDL_memcpy(&item->event12, event12, sizeof (SDL12_Event));
1350 DECLSPEC int SDLCALL
1351 SDL_PeepEvents(SDL12_Event *events12, int numevents, SDL_eventaction action, Uint32 mask)
1353 if (action == SDL_ADDEVENT)
1356 for (i = 0; i < numevents; i++)
1358 if (SDL_PushEvent(&events12[i]) == -1)
1359 break; /* out of space for more events. */
1363 else if ((action == SDL_PEEKEVENT) || (action == SDL_GETEVENT))
1365 const SDL_bool isGet = (action == SDL_GETEVENT);
1366 EventQueueType *prev = NULL;
1367 EventQueueType *item = EventQueueHead;
1368 EventQueueType *next = NULL;
1370 while (chosen < numevents)
1372 EventQueueType *nextPrev = item;
1374 break; /* no more events at the moment. */
1376 next = item->next; /* copy, since we might overwrite item->next */
1378 if (mask & (1<<item->event12.type))
1380 SDL_memcpy(&events12[chosen++], &item->event12, sizeof (SDL12_Event));
1381 if (isGet) /* remove from list? */
1385 if (item == EventQueueHead)
1386 EventQueueHead = next;
1387 if (item == EventQueueTail)
1388 EventQueueTail = prev;
1390 /* put it back in the free pool. */
1391 item->next = EventQueueAvailable;
1392 EventQueueAvailable = item;
1393 nextPrev = prev; /* previous item doesn't change. */
1406 DECLSPEC int SDLCALL
1407 SDL_WaitEvent(SDL12_Event *event12)
1409 FIXME("In 1.2, this only fails (-1) if you haven't SDL_Init()'d.");
1410 while (!SDL_PollEvent(event12))
1416 PushEventIfNotFiltered(SDL12_Event *event12)
1418 if (event12->type != SDL12_NOEVENT)
1420 if (EventStates[event12->type] != SDL_IGNORE)
1422 if ((!EventFilter12) || (EventFilter12(event12)))
1423 return (SDL_PushEvent(event12) == 0);
1429 DECLSPEC Uint8 SDLCALL
1430 SDL_EventState(Uint8 type, int state)
1432 /* the values of "state" match between 1.2 and 2.0 */
1433 const Uint8 retval = EventStates[type];
1436 if (state != SDL_QUERY)
1437 EventStates[type] = state;
1438 if (state == SDL_IGNORE) /* drop existing events of this type. */
1439 while (SDL_PeepEvents(&e, 1, SDL_GETEVENT, (1<<type))) {}
1444 DECLSPEC Uint8 SDLCALL
1445 SDL_GetMouseState(int *x, int *y)
1447 const Uint32 state20 = SDL20_GetMouseState(x, y);
1448 Uint8 retval = (state20 & 0x7); /* left, right, and middle will match. */
1450 /* the X[12] buttons are different in 1.2; mousewheel was in the way. */
1451 if (state20 & SDL_BUTTON(SDL_BUTTON_X1))
1453 if (state20 & SDL_BUTTON(SDL_BUTTON_X2))
1459 DECLSPEC char * SDLCALL
1460 SDL_GetKeyName(SDL12Key key)
1463 #define CASESDLK12TONAME(k, n) case k: return (char *) n
1464 CASESDLK12TONAME(SDLK12_BACKSPACE, "backspace");
1465 CASESDLK12TONAME(SDLK12_TAB, "tab");
1466 CASESDLK12TONAME(SDLK12_CLEAR, "clear");
1467 CASESDLK12TONAME(SDLK12_RETURN, "return");
1468 CASESDLK12TONAME(SDLK12_PAUSE, "pause");
1469 CASESDLK12TONAME(SDLK12_ESCAPE, "escape");
1470 CASESDLK12TONAME(SDLK12_SPACE, "space");
1471 CASESDLK12TONAME(SDLK12_EXCLAIM, "!");
1472 CASESDLK12TONAME(SDLK12_QUOTEDBL, "\"");
1473 CASESDLK12TONAME(SDLK12_HASH, "#");
1474 CASESDLK12TONAME(SDLK12_DOLLAR, "$");
1475 CASESDLK12TONAME(SDLK12_AMPERSAND, "&");
1476 CASESDLK12TONAME(SDLK12_QUOTE, "'");
1477 CASESDLK12TONAME(SDLK12_LEFTPAREN, "(");
1478 CASESDLK12TONAME(SDLK12_RIGHTPAREN, ")");
1479 CASESDLK12TONAME(SDLK12_ASTERISK, "*");
1480 CASESDLK12TONAME(SDLK12_PLUS, "+");
1481 CASESDLK12TONAME(SDLK12_COMMA, ",");
1482 CASESDLK12TONAME(SDLK12_MINUS, "-");
1483 CASESDLK12TONAME(SDLK12_PERIOD, ".");
1484 CASESDLK12TONAME(SDLK12_SLASH, "/");
1485 CASESDLK12TONAME(SDLK12_0, "0");
1486 CASESDLK12TONAME(SDLK12_1, "1");
1487 CASESDLK12TONAME(SDLK12_2, "2");
1488 CASESDLK12TONAME(SDLK12_3, "3");
1489 CASESDLK12TONAME(SDLK12_4, "4");
1490 CASESDLK12TONAME(SDLK12_5, "5");
1491 CASESDLK12TONAME(SDLK12_6, "6");
1492 CASESDLK12TONAME(SDLK12_7, "7");
1493 CASESDLK12TONAME(SDLK12_8, "8");
1494 CASESDLK12TONAME(SDLK12_9, "9");
1495 CASESDLK12TONAME(SDLK12_COLON, ":");
1496 CASESDLK12TONAME(SDLK12_SEMICOLON, ");");
1497 CASESDLK12TONAME(SDLK12_LESS, "<");
1498 CASESDLK12TONAME(SDLK12_EQUALS, "=");
1499 CASESDLK12TONAME(SDLK12_GREATER, ">");
1500 CASESDLK12TONAME(SDLK12_QUESTION, "?");
1501 CASESDLK12TONAME(SDLK12_AT, "@");
1502 CASESDLK12TONAME(SDLK12_LEFTBRACKET, "[");
1503 CASESDLK12TONAME(SDLK12_BACKSLASH, "\\");
1504 CASESDLK12TONAME(SDLK12_RIGHTBRACKET, "]");
1505 CASESDLK12TONAME(SDLK12_CARET, "^");
1506 CASESDLK12TONAME(SDLK12_UNDERSCORE, "_");
1507 CASESDLK12TONAME(SDLK12_BACKQUOTE, "`");
1508 CASESDLK12TONAME(SDLK12_a, "a");
1509 CASESDLK12TONAME(SDLK12_b, "b");
1510 CASESDLK12TONAME(SDLK12_c, "c");
1511 CASESDLK12TONAME(SDLK12_d, "d");
1512 CASESDLK12TONAME(SDLK12_e, "e");
1513 CASESDLK12TONAME(SDLK12_f, "f");
1514 CASESDLK12TONAME(SDLK12_g, "g");
1515 CASESDLK12TONAME(SDLK12_h, "h");
1516 CASESDLK12TONAME(SDLK12_i, "i");
1517 CASESDLK12TONAME(SDLK12_j, "j");
1518 CASESDLK12TONAME(SDLK12_k, "k");
1519 CASESDLK12TONAME(SDLK12_l, "l");
1520 CASESDLK12TONAME(SDLK12_m, "m");
1521 CASESDLK12TONAME(SDLK12_n, "n");
1522 CASESDLK12TONAME(SDLK12_o, "o");
1523 CASESDLK12TONAME(SDLK12_p, "p");
1524 CASESDLK12TONAME(SDLK12_q, "q");
1525 CASESDLK12TONAME(SDLK12_r, "r");
1526 CASESDLK12TONAME(SDLK12_s, "s");
1527 CASESDLK12TONAME(SDLK12_t, "t");
1528 CASESDLK12TONAME(SDLK12_u, "u");
1529 CASESDLK12TONAME(SDLK12_v, "v");
1530 CASESDLK12TONAME(SDLK12_w, "w");
1531 CASESDLK12TONAME(SDLK12_x, "x");
1532 CASESDLK12TONAME(SDLK12_y, "y");
1533 CASESDLK12TONAME(SDLK12_z, "z");
1534 CASESDLK12TONAME(SDLK12_DELETE, "delete");
1536 CASESDLK12TONAME(SDLK12_WORLD_0, "world 0");
1537 CASESDLK12TONAME(SDLK12_WORLD_1, "world 1");
1538 CASESDLK12TONAME(SDLK12_WORLD_2, "world 2");
1539 CASESDLK12TONAME(SDLK12_WORLD_3, "world 3");
1540 CASESDLK12TONAME(SDLK12_WORLD_4, "world 4");
1541 CASESDLK12TONAME(SDLK12_WORLD_5, "world 5");
1542 CASESDLK12TONAME(SDLK12_WORLD_6, "world 6");
1543 CASESDLK12TONAME(SDLK12_WORLD_7, "world 7");
1544 CASESDLK12TONAME(SDLK12_WORLD_8, "world 8");
1545 CASESDLK12TONAME(SDLK12_WORLD_9, "world 9");
1546 CASESDLK12TONAME(SDLK12_WORLD_10, "world 10");
1547 CASESDLK12TONAME(SDLK12_WORLD_11, "world 11");
1548 CASESDLK12TONAME(SDLK12_WORLD_12, "world 12");
1549 CASESDLK12TONAME(SDLK12_WORLD_13, "world 13");
1550 CASESDLK12TONAME(SDLK12_WORLD_14, "world 14");
1551 CASESDLK12TONAME(SDLK12_WORLD_15, "world 15");
1552 CASESDLK12TONAME(SDLK12_WORLD_16, "world 16");
1553 CASESDLK12TONAME(SDLK12_WORLD_17, "world 17");
1554 CASESDLK12TONAME(SDLK12_WORLD_18, "world 18");
1555 CASESDLK12TONAME(SDLK12_WORLD_19, "world 19");
1556 CASESDLK12TONAME(SDLK12_WORLD_20, "world 20");
1557 CASESDLK12TONAME(SDLK12_WORLD_21, "world 21");
1558 CASESDLK12TONAME(SDLK12_WORLD_22, "world 22");
1559 CASESDLK12TONAME(SDLK12_WORLD_23, "world 23");
1560 CASESDLK12TONAME(SDLK12_WORLD_24, "world 24");
1561 CASESDLK12TONAME(SDLK12_WORLD_25, "world 25");
1562 CASESDLK12TONAME(SDLK12_WORLD_26, "world 26");
1563 CASESDLK12TONAME(SDLK12_WORLD_27, "world 27");
1564 CASESDLK12TONAME(SDLK12_WORLD_28, "world 28");
1565 CASESDLK12TONAME(SDLK12_WORLD_29, "world 29");
1566 CASESDLK12TONAME(SDLK12_WORLD_30, "world 30");
1567 CASESDLK12TONAME(SDLK12_WORLD_31, "world 31");
1568 CASESDLK12TONAME(SDLK12_WORLD_32, "world 32");
1569 CASESDLK12TONAME(SDLK12_WORLD_33, "world 33");
1570 CASESDLK12TONAME(SDLK12_WORLD_34, "world 34");
1571 CASESDLK12TONAME(SDLK12_WORLD_35, "world 35");
1572 CASESDLK12TONAME(SDLK12_WORLD_36, "world 36");
1573 CASESDLK12TONAME(SDLK12_WORLD_37, "world 37");
1574 CASESDLK12TONAME(SDLK12_WORLD_38, "world 38");
1575 CASESDLK12TONAME(SDLK12_WORLD_39, "world 39");
1576 CASESDLK12TONAME(SDLK12_WORLD_40, "world 40");
1577 CASESDLK12TONAME(SDLK12_WORLD_41, "world 41");
1578 CASESDLK12TONAME(SDLK12_WORLD_42, "world 42");
1579 CASESDLK12TONAME(SDLK12_WORLD_43, "world 43");
1580 CASESDLK12TONAME(SDLK12_WORLD_44, "world 44");
1581 CASESDLK12TONAME(SDLK12_WORLD_45, "world 45");
1582 CASESDLK12TONAME(SDLK12_WORLD_46, "world 46");
1583 CASESDLK12TONAME(SDLK12_WORLD_47, "world 47");
1584 CASESDLK12TONAME(SDLK12_WORLD_48, "world 48");
1585 CASESDLK12TONAME(SDLK12_WORLD_49, "world 49");
1586 CASESDLK12TONAME(SDLK12_WORLD_50, "world 50");
1587 CASESDLK12TONAME(SDLK12_WORLD_51, "world 51");
1588 CASESDLK12TONAME(SDLK12_WORLD_52, "world 52");
1589 CASESDLK12TONAME(SDLK12_WORLD_53, "world 53");
1590 CASESDLK12TONAME(SDLK12_WORLD_54, "world 54");
1591 CASESDLK12TONAME(SDLK12_WORLD_55, "world 55");
1592 CASESDLK12TONAME(SDLK12_WORLD_56, "world 56");
1593 CASESDLK12TONAME(SDLK12_WORLD_57, "world 57");
1594 CASESDLK12TONAME(SDLK12_WORLD_58, "world 58");
1595 CASESDLK12TONAME(SDLK12_WORLD_59, "world 59");
1596 CASESDLK12TONAME(SDLK12_WORLD_60, "world 60");
1597 CASESDLK12TONAME(SDLK12_WORLD_61, "world 61");
1598 CASESDLK12TONAME(SDLK12_WORLD_62, "world 62");
1599 CASESDLK12TONAME(SDLK12_WORLD_63, "world 63");
1600 CASESDLK12TONAME(SDLK12_WORLD_64, "world 64");
1601 CASESDLK12TONAME(SDLK12_WORLD_65, "world 65");
1602 CASESDLK12TONAME(SDLK12_WORLD_66, "world 66");
1603 CASESDLK12TONAME(SDLK12_WORLD_67, "world 67");
1604 CASESDLK12TONAME(SDLK12_WORLD_68, "world 68");
1605 CASESDLK12TONAME(SDLK12_WORLD_69, "world 69");
1606 CASESDLK12TONAME(SDLK12_WORLD_70, "world 70");
1607 CASESDLK12TONAME(SDLK12_WORLD_71, "world 71");
1608 CASESDLK12TONAME(SDLK12_WORLD_72, "world 72");
1609 CASESDLK12TONAME(SDLK12_WORLD_73, "world 73");
1610 CASESDLK12TONAME(SDLK12_WORLD_74, "world 74");
1611 CASESDLK12TONAME(SDLK12_WORLD_75, "world 75");
1612 CASESDLK12TONAME(SDLK12_WORLD_76, "world 76");
1613 CASESDLK12TONAME(SDLK12_WORLD_77, "world 77");
1614 CASESDLK12TONAME(SDLK12_WORLD_78, "world 78");
1615 CASESDLK12TONAME(SDLK12_WORLD_79, "world 79");
1616 CASESDLK12TONAME(SDLK12_WORLD_80, "world 80");
1617 CASESDLK12TONAME(SDLK12_WORLD_81, "world 81");
1618 CASESDLK12TONAME(SDLK12_WORLD_82, "world 82");
1619 CASESDLK12TONAME(SDLK12_WORLD_83, "world 83");
1620 CASESDLK12TONAME(SDLK12_WORLD_84, "world 84");
1621 CASESDLK12TONAME(SDLK12_WORLD_85, "world 85");
1622 CASESDLK12TONAME(SDLK12_WORLD_86, "world 86");
1623 CASESDLK12TONAME(SDLK12_WORLD_87, "world 87");
1624 CASESDLK12TONAME(SDLK12_WORLD_88, "world 88");
1625 CASESDLK12TONAME(SDLK12_WORLD_89, "world 89");
1626 CASESDLK12TONAME(SDLK12_WORLD_90, "world 90");
1627 CASESDLK12TONAME(SDLK12_WORLD_91, "world 91");
1628 CASESDLK12TONAME(SDLK12_WORLD_92, "world 92");
1629 CASESDLK12TONAME(SDLK12_WORLD_93, "world 93");
1630 CASESDLK12TONAME(SDLK12_WORLD_94, "world 94");
1631 CASESDLK12TONAME(SDLK12_WORLD_95, "world 95");
1633 CASESDLK12TONAME(SDLK12_KP0, "[0]");
1634 CASESDLK12TONAME(SDLK12_KP1, "[1]");
1635 CASESDLK12TONAME(SDLK12_KP2, "[2]");
1636 CASESDLK12TONAME(SDLK12_KP3, "[3]");
1637 CASESDLK12TONAME(SDLK12_KP4, "[4]");
1638 CASESDLK12TONAME(SDLK12_KP5, "[5]");
1639 CASESDLK12TONAME(SDLK12_KP6, "[6]");
1640 CASESDLK12TONAME(SDLK12_KP7, "[7]");
1641 CASESDLK12TONAME(SDLK12_KP8, "[8]");
1642 CASESDLK12TONAME(SDLK12_KP9, "[9]");
1643 CASESDLK12TONAME(SDLK12_KP_PERIOD, "[.]");
1644 CASESDLK12TONAME(SDLK12_KP_DIVIDE, "[/]");
1645 CASESDLK12TONAME(SDLK12_KP_MULTIPLY, "[*]");
1646 CASESDLK12TONAME(SDLK12_KP_MINUS, "[-]");
1647 CASESDLK12TONAME(SDLK12_KP_PLUS, "[+]");
1648 CASESDLK12TONAME(SDLK12_KP_ENTER, "enter");
1649 CASESDLK12TONAME(SDLK12_KP_EQUALS, "equals");
1651 CASESDLK12TONAME(SDLK12_UP, "up");
1652 CASESDLK12TONAME(SDLK12_DOWN, "down");
1653 CASESDLK12TONAME(SDLK12_RIGHT, "right");
1654 CASESDLK12TONAME(SDLK12_LEFT, "left");
1655 CASESDLK12TONAME(SDLK12_INSERT, "insert");
1656 CASESDLK12TONAME(SDLK12_HOME, "home");
1657 CASESDLK12TONAME(SDLK12_END, "end");
1658 CASESDLK12TONAME(SDLK12_PAGEUP, "page up");
1659 CASESDLK12TONAME(SDLK12_PAGEDOWN, "page down");
1661 CASESDLK12TONAME(SDLK12_F1, "f1");
1662 CASESDLK12TONAME(SDLK12_F2, "f2");
1663 CASESDLK12TONAME(SDLK12_F3, "f3");
1664 CASESDLK12TONAME(SDLK12_F4, "f4");
1665 CASESDLK12TONAME(SDLK12_F5, "f5");
1666 CASESDLK12TONAME(SDLK12_F6, "f6");
1667 CASESDLK12TONAME(SDLK12_F7, "f7");
1668 CASESDLK12TONAME(SDLK12_F8, "f8");
1669 CASESDLK12TONAME(SDLK12_F9, "f9");
1670 CASESDLK12TONAME(SDLK12_F10, "f10");
1671 CASESDLK12TONAME(SDLK12_F11, "f11");
1672 CASESDLK12TONAME(SDLK12_F12, "f12");
1673 CASESDLK12TONAME(SDLK12_F13, "f13");
1674 CASESDLK12TONAME(SDLK12_F14, "f14");
1675 CASESDLK12TONAME(SDLK12_F15, "f15");
1677 CASESDLK12TONAME(SDLK12_NUMLOCK, "numlock");
1678 CASESDLK12TONAME(SDLK12_CAPSLOCK, "caps lock");
1679 CASESDLK12TONAME(SDLK12_SCROLLOCK, "scroll lock");
1680 CASESDLK12TONAME(SDLK12_RSHIFT, "right shift");
1681 CASESDLK12TONAME(SDLK12_LSHIFT, "left shift");
1682 CASESDLK12TONAME(SDLK12_RCTRL, "right ctrl");
1683 CASESDLK12TONAME(SDLK12_LCTRL, "left ctrl");
1684 CASESDLK12TONAME(SDLK12_RALT, "right alt");
1685 CASESDLK12TONAME(SDLK12_LALT, "left alt");
1686 CASESDLK12TONAME(SDLK12_RMETA, "right meta");
1687 CASESDLK12TONAME(SDLK12_LMETA, "left meta");
1688 CASESDLK12TONAME(SDLK12_LSUPER, "left super"); /* "Windows" keys */
1689 CASESDLK12TONAME(SDLK12_RSUPER, "right super");
1690 CASESDLK12TONAME(SDLK12_MODE, "alt gr");
1691 CASESDLK12TONAME(SDLK12_COMPOSE, "compose");
1693 CASESDLK12TONAME(SDLK12_HELP, "help");
1694 CASESDLK12TONAME(SDLK12_PRINT, "print screen");
1695 CASESDLK12TONAME(SDLK12_SYSREQ, "sys req");
1696 CASESDLK12TONAME(SDLK12_BREAK, "break");
1697 CASESDLK12TONAME(SDLK12_MENU, "menu");
1698 CASESDLK12TONAME(SDLK12_POWER, "power");
1699 CASESDLK12TONAME(SDLK12_EURO, "euro");
1700 CASESDLK12TONAME(SDLK12_UNDO, "undo");
1701 #undef CASESDLK12TONAME
1705 return (char *) "unknown key";
1709 Keysym20to12(const SDL_Keycode keysym20)
1711 if ( ((int) keysym20) < 127 ) { /* (most of) low-ASCII maps directly */
1712 if (keysym20 == SDLK_PAUSE) {
1713 return SDLK12_PAUSE;
1714 } else if (keysym20 == SDLK_CLEAR) {
1715 return SDLK12_CLEAR;
1717 return (SDL12Key) keysym20;
1721 #define CASEKEYSYM20TO12(k20, k12) case SDLK_##k20: return SDLK12_##k12
1722 CASEKEYSYM20TO12(KP_0, KP0);
1723 CASEKEYSYM20TO12(KP_1, KP1);
1724 CASEKEYSYM20TO12(KP_2, KP2);
1725 CASEKEYSYM20TO12(KP_3, KP3);
1726 CASEKEYSYM20TO12(KP_4, KP4);
1727 CASEKEYSYM20TO12(KP_5, KP5);
1728 CASEKEYSYM20TO12(KP_6, KP6);
1729 CASEKEYSYM20TO12(KP_7, KP7);
1730 CASEKEYSYM20TO12(KP_8, KP8);
1731 CASEKEYSYM20TO12(KP_9, KP9);
1732 CASEKEYSYM20TO12(NUMLOCKCLEAR, NUMLOCK);
1733 CASEKEYSYM20TO12(SCROLLLOCK, SCROLLOCK);
1734 CASEKEYSYM20TO12(RGUI, RMETA);
1735 CASEKEYSYM20TO12(LGUI, LMETA);
1736 CASEKEYSYM20TO12(PRINTSCREEN, PRINT);
1737 #undef CASEKEYSYM20TO12
1739 #define CASEKEYSYM20TO12(k) case SDLK_##k: return SDLK12_##k
1740 CASEKEYSYM20TO12(CLEAR);
1741 CASEKEYSYM20TO12(PAUSE);
1742 CASEKEYSYM20TO12(KP_PERIOD);
1743 CASEKEYSYM20TO12(KP_DIVIDE);
1744 CASEKEYSYM20TO12(KP_MULTIPLY);
1745 CASEKEYSYM20TO12(KP_MINUS);
1746 CASEKEYSYM20TO12(KP_PLUS);
1747 CASEKEYSYM20TO12(KP_ENTER);
1748 CASEKEYSYM20TO12(KP_EQUALS);
1749 CASEKEYSYM20TO12(UP);
1750 CASEKEYSYM20TO12(DOWN);
1751 CASEKEYSYM20TO12(RIGHT);
1752 CASEKEYSYM20TO12(LEFT);
1753 CASEKEYSYM20TO12(INSERT);
1754 CASEKEYSYM20TO12(HOME);
1755 CASEKEYSYM20TO12(END);
1756 CASEKEYSYM20TO12(PAGEUP);
1757 CASEKEYSYM20TO12(PAGEDOWN);
1758 CASEKEYSYM20TO12(F1);
1759 CASEKEYSYM20TO12(F2);
1760 CASEKEYSYM20TO12(F3);
1761 CASEKEYSYM20TO12(F4);
1762 CASEKEYSYM20TO12(F5);
1763 CASEKEYSYM20TO12(F6);
1764 CASEKEYSYM20TO12(F7);
1765 CASEKEYSYM20TO12(F8);
1766 CASEKEYSYM20TO12(F9);
1767 CASEKEYSYM20TO12(F10);
1768 CASEKEYSYM20TO12(F11);
1769 CASEKEYSYM20TO12(F12);
1770 CASEKEYSYM20TO12(F13);
1771 CASEKEYSYM20TO12(F14);
1772 CASEKEYSYM20TO12(F15);
1773 CASEKEYSYM20TO12(CAPSLOCK);
1774 CASEKEYSYM20TO12(RSHIFT);
1775 CASEKEYSYM20TO12(LSHIFT);
1776 CASEKEYSYM20TO12(RCTRL);
1777 CASEKEYSYM20TO12(LCTRL);
1778 CASEKEYSYM20TO12(RALT);
1779 CASEKEYSYM20TO12(LALT);
1780 CASEKEYSYM20TO12(MODE);
1781 CASEKEYSYM20TO12(HELP);
1782 CASEKEYSYM20TO12(SYSREQ);;
1783 CASEKEYSYM20TO12(MENU);
1784 CASEKEYSYM20TO12(POWER);
1785 CASEKEYSYM20TO12(UNDO);
1786 #undef CASEKEYSYM20TO12
1790 FIXME("nothing maps to SDLK12_COMPOSE, SDLK12_BREAK, or SDLK12_EURO ...?");
1791 FIXME("map some of the SDLK12_WORLD keys");
1792 return SDLK12_UNKNOWN;
1796 EventFilter20to12(void *data, SDL_Event *event20)
1798 //const int maxUserEvents12 = SDL12_NUMEVENTS - SDL12_USEREVENT;
1799 SDL12_Event event12;
1802 SDL_assert(data == NULL); /* currently unused. */
1804 SDL20_zero(event12);
1806 switch (event20->type)
1809 event12.type = SDL12_QUIT;
1812 case SDL_WINDOWEVENT:
1813 switch (event20->window.event)
1815 case SDL_WINDOWEVENT_CLOSE:
1816 event12.type = SDL12_QUIT;
1819 case SDL_WINDOWEVENT_SHOWN:
1820 case SDL_WINDOWEVENT_EXPOSED:
1821 event12.type = SDL12_VIDEOEXPOSE;
1824 case SDL_WINDOWEVENT_RESIZED:
1825 case SDL_WINDOWEVENT_SIZE_CHANGED:
1826 FIXME("what's the difference between RESIZED and SIZE_CHANGED?");
1827 event12.type = SDL12_VIDEORESIZE;
1828 event12.resize.w = event20->window.data1;
1829 event12.resize.h = event20->window.data2;
1832 case SDL_WINDOWEVENT_MINIMIZED:
1833 event12.type = SDL12_ACTIVEEVENT;
1834 event12.active.gain = 0;
1835 event12.active.state = SDL12_APPACTIVE;
1838 case SDL_WINDOWEVENT_RESTORED:
1839 event12.type = SDL12_ACTIVEEVENT;
1840 event12.active.gain = 1;
1841 event12.active.state = SDL12_APPACTIVE;
1844 case SDL_WINDOWEVENT_ENTER:
1845 event12.type = SDL12_ACTIVEEVENT;
1846 event12.active.gain = 1;
1847 event12.active.state = SDL12_APPMOUSEFOCUS;
1850 case SDL_WINDOWEVENT_LEAVE:
1851 event12.type = SDL12_ACTIVEEVENT;
1852 event12.active.gain = 0;
1853 event12.active.state = SDL12_APPMOUSEFOCUS;
1856 case SDL_WINDOWEVENT_FOCUS_GAINED:
1857 event12.type = SDL12_ACTIVEEVENT;
1858 event12.active.gain = 1;
1859 event12.active.state = SDL12_APPINPUTFOCUS;
1862 case SDL_WINDOWEVENT_FOCUS_LOST:
1863 event12.type = SDL12_ACTIVEEVENT;
1864 event12.active.gain = 0;
1865 event12.active.state = SDL12_APPINPUTFOCUS;
1870 // !!! FIXME: this is sort of a mess to convert.
1871 case SDL_SYSWMEVENT: FIXME("write me"); return 0;
1875 if (event20->key.repeat) {
1876 return 0; /* ignore 2.0-style key repeat events */
1878 event12.key.keysym.sym = Keysym20to12(event20->key.keysym.sym);
1879 if (event12.key.keysym.sym == SDLK12_UNKNOWN) {
1880 return 0; /* drop it if we can't map it */
1882 event12.type = (event20->type == SDL_KEYDOWN) ? SDL12_KEYDOWN : SDL12_KEYUP;
1883 event12.key.which = 0;
1884 event12.key.state = event20->key.state;
1885 event12.key.keysym.scancode = (event20->key.keysym.scancode < 256) ? (Uint8) event20->key.keysym.scancode : 0;
1886 event12.key.keysym.mod = event20->key.keysym.mod; /* these match up between 1.2 and 2.0! */
1887 event12.key.keysym.unicode = 0; FIXME("unicode");
1890 case SDL_TEXTEDITING: FIXME("write me"); return 0;
1891 case SDL_TEXTINPUT: FIXME("write me"); return 0;
1893 case SDL_MOUSEMOTION:
1894 event12.type = SDL12_MOUSEMOTION;
1895 event12.motion.which = (Uint8) event20->motion.which;
1896 event12.motion.state = event20->motion.state;
1897 event12.motion.x = (Uint16) event20->motion.x;
1898 event12.motion.y = (Uint16) event20->motion.y;
1899 event12.motion.xrel = (Sint16) event20->motion.xrel;
1900 event12.motion.yrel = (Sint16) event20->motion.yrel;
1903 case SDL_MOUSEBUTTONDOWN:
1904 event12.type = SDL12_MOUSEBUTTONDOWN;
1905 event12.button.which = (Uint8) event20->button.which;
1906 event12.button.button = event20->button.button;
1907 event12.button.state = event20->button.state;
1908 event12.button.x = (Uint16) event20->button.x;
1909 event12.button.y = (Uint16) event20->button.y;
1912 case SDL_MOUSEBUTTONUP:
1913 event12.type = SDL12_MOUSEBUTTONUP;
1914 event12.button.which = (Uint8) event20->button.which;
1915 event12.button.button = event20->button.button;
1916 event12.button.state = event20->button.state;
1917 event12.button.x = (Uint16) event20->button.x;
1918 event12.button.y = (Uint16) event20->button.y;
1921 case SDL_MOUSEWHEEL:
1922 if (event20->wheel.y == 0)
1923 break; /* don't support horizontal wheels in 1.2. */
1925 event12.type = SDL12_MOUSEBUTTONDOWN;
1926 event12.button.which = (Uint8) event20->wheel.which;
1927 event12.button.button = (event20->wheel.y > 0) ? 4 : 5; /* wheelup is 4, down is 5. */
1928 event12.button.state = SDL_GetMouseState(&x, &y);
1929 event12.button.x = (Uint16) x;
1930 event12.button.y = (Uint16) y;
1931 PushEventIfNotFiltered(&event12);
1933 event12.type = SDL12_MOUSEBUTTONUP; /* immediately release mouse "button" at the end of this switch. */
1936 case SDL_JOYAXISMOTION:
1937 event12.type = SDL12_JOYAXISMOTION;
1938 event12.jaxis.which = (Uint8) event20->jaxis.which;
1939 event12.jaxis.axis = event20->jaxis.axis;
1940 event12.jaxis.value = event20->jaxis.value;
1943 case SDL_JOYBALLMOTION:
1944 event12.type = SDL12_JOYBALLMOTION;
1945 event12.jball.which = (Uint8) event20->jball.which;
1946 event12.jball.ball = event20->jball.ball;
1947 event12.jball.xrel = event20->jball.xrel;
1948 event12.jball.yrel = event20->jball.yrel;
1951 case SDL_JOYHATMOTION:
1952 event12.type = SDL12_JOYHATMOTION;
1953 event12.jhat.which = (Uint8) event20->jhat.which;
1954 event12.jhat.hat = event20->jhat.hat;
1955 event12.jhat.value = event20->jhat.value;
1958 case SDL_JOYBUTTONDOWN:
1959 event12.type = SDL12_JOYBUTTONDOWN;
1960 event12.jbutton.which = (Uint8) event20->jbutton.which;
1961 event12.jbutton.button = event20->jbutton.button;
1962 event12.jbutton.state = event20->jbutton.state;
1965 case SDL_JOYBUTTONUP:
1966 event12.type = SDL12_JOYBUTTONUP;
1967 event12.jbutton.which = (Uint8) event20->jbutton.which;
1968 event12.jbutton.button = event20->jbutton.button;
1969 event12.jbutton.state = event20->jbutton.state;
1972 //case SDL_JOYDEVICEADDED:
1973 //case SDL_JOYDEVICEREMOVED:
1974 //case SDL_CONTROLLERAXISMOTION:
1975 //case SDL_CONTROLLERBUTTONDOWN:
1976 //case SDL_CONTROLLERBUTTONUP:
1977 //case SDL_CONTROLLERDEVICEADDED:
1978 //case SDL_CONTROLLERDEVICEREMOVED:
1979 //case SDL_CONTROLLERDEVICEREMAPPED:
1980 //case SDL_FINGERDOWN:
1981 //case SDL_FINGERUP:
1982 //case SDL_FINGERMOTION:
1983 //case SDL_DOLLARGESTURE:
1984 //case SDL_DOLLARRECORD:
1985 //case SDL_MULTIGESTURE:
1986 //case SDL_CLIPBOARDUPDATE:
1987 //case SDL_DROPFILE:
1990 return 0; /* drop everything else. */
1993 PushEventIfNotFiltered(&event12);
1995 return 0; /* always drop it from the 2.0 event queue. */
1998 DECLSPEC void SDLCALL
1999 SDL_SetEventFilter(SDL12_EventFilter filter12)
2001 /* We always have a filter installed, but will call the app's too. */
2002 EventFilter12 = filter12;
2005 DECLSPEC SDL12_EventFilter SDLCALL
2006 SDL_GetEventFilter(void)
2008 return EventFilter12;
2013 Rect20to12(const SDL_Rect *rect20, SDL12_Rect *rect12)
2015 rect12->x = (Sint16) rect20->x;
2016 rect12->y = (Sint16) rect20->y;
2017 rect12->w = (Uint16) rect20->w;
2018 rect12->h = (Uint16) rect20->h;
2023 Rect12to20(const SDL12_Rect *rect12, SDL_Rect *rect20)
2025 rect20->x = (int) rect12->x;
2026 rect20->y = (int) rect12->y;
2027 rect20->w = (int) rect12->w;
2028 rect20->h = (int) rect12->h;
2032 static SDL12_Surface *
2033 Surface20to12(SDL_Surface *surface20)
2035 SDL12_Surface *surface12 = NULL;
2036 SDL12_Palette *palette12 = NULL;
2037 SDL12_PixelFormat *format12 = NULL;
2043 surface12 = (SDL12_Surface *) SDL20_malloc(sizeof (SDL12_Surface));
2047 if (surface20->format->palette) {
2048 palette12 = (SDL12_Palette *) SDL20_malloc(sizeof (SDL12_Palette));
2053 format12 = (SDL12_PixelFormat *) SDL20_malloc(sizeof (SDL12_PixelFormat));
2058 SDL20_zerop(palette12);
2059 SDL_assert(surface20->format->palette);
2060 palette12->ncolors = surface20->format->palette->ncolors;
2061 palette12->colors = surface20->format->palette->colors;
2064 SDL20_zerop(format12);
2065 format12->palette = palette12;
2066 format12->BitsPerPixel = surface20->format->BitsPerPixel;
2067 format12->BytesPerPixel = surface20->format->BytesPerPixel;
2068 format12->Rloss = surface20->format->Rloss;
2069 format12->Gloss = surface20->format->Gloss;
2070 format12->Bloss = surface20->format->Bloss;
2071 format12->Aloss = surface20->format->Aloss;
2072 format12->Rshift = surface20->format->Rshift;
2073 format12->Gshift = surface20->format->Gshift;
2074 format12->Bshift = surface20->format->Bshift;
2075 format12->Ashift = surface20->format->Ashift;
2076 format12->Rmask = surface20->format->Rmask;
2077 format12->Gmask = surface20->format->Gmask;
2078 format12->Bmask = surface20->format->Bmask;
2079 format12->Amask = surface20->format->Amask;
2080 FIXME("format12->colorkey");
2081 FIXME("format12->alpha");
2083 SDL20_zerop(surface12);
2084 flags = surface20->flags;
2085 #ifdef SDL_SIMD_ALIGNED
2086 flags &= ~SDL_SIMD_ALIGNED; /* we don't need to map this to 1.2 */
2088 #define MAPSURFACEFLAGS(fl) { if (surface20->flags & SDL_##fl) { surface12->flags |= SDL12_##fl; flags &= ~SDL_##fl; } }
2089 MAPSURFACEFLAGS(PREALLOC);
2090 MAPSURFACEFLAGS(RLEACCEL);
2091 /*MAPSURFACEFLAGS(DONTFREE);*/
2092 #undef MAPSURFACEFLAGS
2093 SDL_assert(flags == 0); /* non-zero if there's a flag we didn't map. */
2095 surface12->format = format12;
2096 surface12->w = surface20->w;
2097 surface12->h = surface20->h;
2098 surface12->pitch = (Uint16) surface20->pitch; FIXME("make sure this fits in a Uint16");
2099 surface12->pixels = surface20->pixels;
2100 surface12->offset = 0;
2101 surface12->surface20 = surface20;
2102 Rect20to12(&surface20->clip_rect, &surface12->clip_rect);
2103 surface12->refcount = surface20->refcount;
2108 SDL20_free(surface12);
2109 SDL20_free(palette12);
2110 SDL20_free(format12);
2114 DECLSPEC SDL12_Surface * SDLCALL
2115 SDL_CreateRGBSurface(Uint32 sdl12flags, int width, int height, int depth, Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask)
2118 Rmask = Gmask = Bmask = Amask = 0; // force a paletted surface.
2120 SDL_Surface *surface20 = SDL20_CreateRGBSurface(0, width, height, depth, Rmask, Gmask, Bmask, Amask);
2121 SDL12_Surface *surface12 = Surface20to12(surface20);
2123 SDL20_FreeSurface(surface20);
2127 SDL_assert(surface12->flags == 0); // shouldn't have prealloc, rleaccel, or dontfree.
2131 DECLSPEC SDL12_Surface * SDLCALL
2132 SDL_CreateRGBSurfaceFrom(void *pixels, int width, int height, int depth, int pitch, Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask)
2135 Rmask = Gmask = Bmask = Amask = 0; // force a paletted surface.
2137 SDL_Surface *surface20 = SDL20_CreateRGBSurfaceFrom(pixels, width, height, depth, pitch, Rmask, Gmask, Bmask, Amask);
2138 SDL12_Surface *surface12 = Surface20to12(surface20);
2140 SDL20_FreeSurface(surface20);
2144 SDL_assert(surface12->flags == SDL12_PREALLOC); // should _only_ have prealloc.
2148 DECLSPEC void SDLCALL
2149 SDL_FreeSurface(SDL12_Surface *surface12)
2152 SDL20_FreeSurface(surface12->surface20);
2153 if (surface12->format) {
2154 SDL20_free(surface12->format->palette);
2155 SDL20_free(surface12->format);
2157 SDL20_free(surface12);
2161 DECLSPEC void SDLCALL
2162 SDL_GetClipRect(SDL12_Surface *surface12, SDL12_Rect *rect)
2164 if (surface12 && rect) {
2165 SDL_memcpy(rect, &surface12->clip_rect, sizeof (SDL12_Rect));
2169 DECLSPEC SDL_bool SDLCALL
2170 SDL_SetClipRect(SDL12_Surface *surface12, const SDL12_Rect *rect12)
2172 SDL_bool retval = SDL_FALSE;
2176 retval = SDL20_SetClipRect(surface12->surface20, rect12 ? Rect12to20(rect12, &rect20) : NULL);
2177 SDL20_GetClipRect(surface12->surface20, &rect20);
2178 Rect20to12(&rect20, &surface12->clip_rect);
2183 DECLSPEC int SDLCALL
2184 SDL_FillRect(SDL12_Surface *dst, SDL12_Rect *dstrect12, Uint32 color)
2187 const int retval = SDL20_FillRect(dst->surface20, dstrect12 ? Rect12to20(dstrect12, &dstrect20) : NULL, color);
2190 if (dstrect12) { /* 1.2 stores the clip intersection in dstrect */
2191 SDL_Rect intersected20;
2192 SDL20_IntersectRect(&dstrect20, &dst->surface20->clip_rect, &intersected20);
2193 Rect20to12(&intersected20, dstrect12);
2200 static SDL_PixelFormat *
2201 PixelFormat12to20(SDL_PixelFormat *format20, SDL_Palette *palette20, const SDL12_PixelFormat *format12)
2203 if (format12->palette) {
2204 palette20->ncolors = format12->palette->ncolors;
2205 palette20->colors = format12->palette->colors;
2206 palette20->version = 1;
2207 palette20->refcount = 1;
2208 format20->palette = palette20;
2210 format20->palette = NULL;
2213 format20->format = SDL20_MasksToPixelFormatEnum(format12->BitsPerPixel, format12->Rmask, format12->Gmask, format12->Bmask, format12->Amask);
2214 format20->BitsPerPixel = format12->BitsPerPixel;
2215 format20->BytesPerPixel = format12->BytesPerPixel;
2216 format20->Rmask = format12->Rmask;
2217 format20->Gmask = format12->Gmask;
2218 format20->Bmask = format12->Bmask;
2219 format20->Amask = format12->Amask;
2220 format20->Rloss = format12->Rloss;
2221 format20->Gloss = format12->Gloss;
2222 format20->Bloss = format12->Bloss;
2223 format20->Aloss = format12->Aloss;
2224 format20->Rshift = format12->Rshift;
2225 format20->Gshift = format12->Gshift;
2226 format20->Bshift = format12->Bshift;
2227 format20->Ashift = format12->Ashift;
2228 format20->refcount = 1;
2229 format20->next = NULL;
2233 DECLSPEC Uint32 SDLCALL
2234 SDL_MapRGB(const SDL12_PixelFormat *format12, Uint8 r, Uint8 g, Uint8 b)
2236 /* This is probably way slower than apps expect. */
2237 SDL_PixelFormat format20;
2238 SDL_Palette palette20;
2239 return SDL20_MapRGB(PixelFormat12to20(&format20, &palette20, format12), r, g, b);
2242 DECLSPEC Uint32 SDLCALL
2243 SDL_MapRGBA(const SDL12_PixelFormat *format12, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
2245 /* This is probably way slower than apps expect. */
2246 SDL_PixelFormat format20;
2247 SDL_Palette palette20;
2248 return SDL20_MapRGBA(PixelFormat12to20(&format20, &palette20, format12), r, g, b, a);
2251 DECLSPEC void SDLCALL
2252 SDL_GetRGB(Uint32 pixel, const SDL12_PixelFormat *format12, Uint8 *r, Uint8 *g, Uint8 *b)
2254 /* This is probably way slower than apps expect. */
2255 SDL_PixelFormat format20;
2256 SDL_Palette palette20;
2257 return SDL20_GetRGB(pixel, PixelFormat12to20(&format20, &palette20, format12), r, g, b);
2260 DECLSPEC void SDLCALL
2261 SDL_GetRGBA(Uint32 pixel, const SDL12_PixelFormat *format12, Uint8 *r, Uint8 *g, Uint8 *b, Uint8 *a)
2263 /* This is probably way slower than apps expect. */
2264 SDL_PixelFormat format20;
2265 SDL_Palette palette20;
2266 return SDL20_GetRGBA(pixel, PixelFormat12to20(&format20, &palette20, format12), r, g, b, a);
2269 DECLSPEC const SDL12_VideoInfo * SDLCALL
2270 SDL_GetVideoInfo(void)
2272 SDL_DisplayMode mode;
2274 FIXME("calculate this in Init12Video(), then this just does: return VideoInfo.vfmt ? &VideoInfo : NULL;");
2276 if (!VideoInfo12.vfmt && SDL20_GetDesktopDisplayMode(VideoDisplayIndex, &mode) == 0) {
2277 VideoInfo12.vfmt = SDL20_AllocFormat(mode.format);
2278 VideoInfo12.current_w = mode.w;
2279 VideoInfo12.current_h = mode.h;
2280 FIXME("vidinfo details commented out");
2281 //VideoInfo12.wm_available = 1;
2282 //VideoInfo12.video_mem = 1024 * 256;
2284 return &VideoInfo12;
2287 DECLSPEC int SDLCALL
2288 SDL_VideoModeOK(int width, int height, int bpp, Uint32 sdl12flags)
2290 int i, nummodes, actual_bpp = 0;
2292 if (!SDL20_WasInit(SDL_INIT_VIDEO)) {
2296 if (!(sdl12flags & SDL12_FULLSCREEN)) {
2297 SDL_DisplayMode mode;
2298 SDL20_GetDesktopDisplayMode(VideoDisplayIndex, &mode);
2299 return SDL_BITSPERPIXEL(mode.format);
2302 nummodes = SDL20_GetNumDisplayModes(VideoDisplayIndex);
2303 for (i = 0; i < nummodes; ++i) {
2304 SDL_DisplayMode mode;
2305 SDL20_GetDisplayMode(VideoDisplayIndex, i, &mode);
2306 if (!mode.w || !mode.h || (width == mode.w && height == mode.h)) {
2310 if (SDL_BITSPERPIXEL(mode.format) >= (Uint32) bpp) {
2311 actual_bpp = SDL_BITSPERPIXEL(mode.format);
2318 DECLSPEC SDL12_Rect ** SDLCALL
2319 SDL_ListModes(const SDL12_PixelFormat *format12, Uint32 flags)
2324 if (!SDL20_WasInit(SDL_INIT_VIDEO)) {
2328 if ((!format12) && (!VideoInfo12.vfmt)) {
2329 SDL20_SetError("No pixel format specified");
2333 if (!(flags & SDL12_FULLSCREEN)) {
2334 return (SDL12_Rect **) (-1); /* any resolution is fine. */
2338 fmt = SDL20_MasksToPixelFormatEnum(format12->BitsPerPixel, format12->Rmask, format12->Gmask, format12->Bmask, format12->Amask);
2340 fmt = VideoInfo12.vfmt->format;
2343 for (i = 0; i < VideoModesCount; i++) {
2344 VideoModeList *modes = &VideoModes[i];
2345 if (modes->format == fmt) {
2346 return modes->modes12;
2350 SDL20_SetError("No modes support requested pixel format");
2354 DECLSPEC void SDLCALL
2355 SDL_FreeCursor(SDL12_Cursor *cursor12)
2358 if (cursor12->wm_cursor)
2359 SDL20_FreeCursor(cursor12->wm_cursor);
2360 SDL20_free(cursor12->data);
2361 SDL20_free(cursor12->mask);
2362 SDL20_free(cursor12);
2366 DECLSPEC SDL12_Cursor * SDLCALL
2367 SDL_CreateCursor(Uint8 *data, Uint8 *mask, int w, int h, int hot_x, int hot_y)
2369 const size_t datasize = h * (w / 8);
2370 SDL_Cursor *cursor20 = NULL;
2371 SDL12_Cursor *retval = NULL;
2373 retval = (SDL12_Cursor *) SDL20_malloc(sizeof (SDL12_Cursor));
2377 SDL20_zerop(retval);
2379 retval->data = (Uint8 *) SDL20_malloc(datasize);
2383 retval->mask = (Uint8 *) SDL20_malloc(datasize);
2387 cursor20 = SDL20_CreateCursor(data, mask, w, h, hot_x, hot_y);
2393 retval->hot_x = hot_x;
2394 retval->hot_y = hot_y;
2395 retval->wm_cursor = cursor20;
2396 /* we always leave retval->save as null pointers. */
2398 SDL20_memcpy(retval->data, data, datasize);
2399 SDL20_memcpy(retval->mask, mask, datasize);
2404 SDL20_OutOfMemory();
2407 SDL_FreeCursor(retval);
2411 DECLSPEC void SDLCALL
2412 SDL_SetCursor(SDL12_Cursor *cursor)
2414 CurrentCursor12 = cursor;
2415 SDL20_SetCursor(cursor ? cursor->wm_cursor : NULL);
2418 DECLSPEC SDL12_Cursor * SDLCALL
2421 return CurrentCursor12;
2425 GetEnvironmentWindowPosition(int *x, int *y)
2427 int display = VideoDisplayIndex;
2428 const char *window = SDL20_getenv("SDL_VIDEO_WINDOW_POS");
2429 const char *center = SDL20_getenv("SDL_VIDEO_CENTERED");
2431 if (SDL20_strcmp(window, "center") == 0) {
2433 } else if (SDL20_sscanf(window, "%d,%d", x, y) == 2) {
2439 *x = SDL_WINDOWPOS_CENTERED_DISPLAY(display);
2440 *y = SDL_WINDOWPOS_CENTERED_DISPLAY(display);
2445 SetupScreenSaver(const int flags12)
2448 SDL_bool allow_screensaver;
2450 /* Allow environment override of screensaver disable */
2451 env = SDL20_getenv("SDL_VIDEO_ALLOW_SCREENSAVER");
2453 allow_screensaver = SDL20_atoi(env) ? SDL_TRUE : SDL_FALSE;
2454 } else if (flags12 & SDL12_FULLSCREEN) {
2455 allow_screensaver = SDL_FALSE;
2457 allow_screensaver = SDL_TRUE;
2459 if (allow_screensaver) {
2460 SDL20_EnableScreenSaver();
2462 SDL20_DisableScreenSaver();
2467 static SDL12_Surface *
2468 EndVidModeCreate(void)
2470 if (VideoTexture20) {
2471 SDL20_DestroyTexture(VideoTexture20);
2472 VideoTexture20 = NULL;
2474 if (VideoRenderer20) {
2475 SDL20_DestroyRenderer(VideoRenderer20);
2476 VideoRenderer20 = NULL;
2478 if (VideoGLContext20) {
2479 SDL20_GL_MakeCurrent(NULL, NULL);
2480 SDL20_GL_DeleteContext(VideoGLContext20);
2481 VideoGLContext20 = NULL;
2483 if (VideoWindow20) {
2484 SDL20_DestroyWindow(VideoWindow20);
2485 VideoWindow20 = NULL;
2487 if (VideoSurface12) {
2488 SDL20_free(VideoSurface12->pixels);
2489 VideoSurface12->pixels = NULL;
2490 SDL_FreeSurface(VideoSurface12);
2491 VideoSurface12 = NULL;
2493 if (VideoConvertSurface20) {
2494 SDL20_FreeSurface(VideoConvertSurface20);
2495 VideoConvertSurface20 = NULL;
2501 static SDL12_Surface *
2502 CreateSurface12WithFormat(const int w, const int h, const Uint32 fmt)
2504 Uint32 rmask, gmask, bmask, amask;
2506 if (!SDL20_PixelFormatEnumToMasks(fmt, &bpp, &rmask, &gmask, &bmask, &amask)) {
2509 return SDL_CreateRGBSurface(0, w, h, bpp, rmask, gmask, bmask, amask);
2512 static SDL_Surface *
2513 CreateNullPixelSurface20(const int width, const int height, const Uint32 fmt)
2515 SDL_Surface *surface20 = SDL20_CreateRGBSurfaceWithFormat(0, 0, 0, SDL_BITSPERPIXEL(fmt), fmt);
2517 surface20->flags |= SDL_PREALLOC;
2518 surface20->pixels = NULL;
2519 surface20->w = width;
2520 surface20->h = height;
2521 surface20->pitch = 0;
2522 SDL20_SetClipRect(surface20, NULL);
2528 DECLSPEC SDL12_Surface * SDLCALL
2529 SDL_SetVideoMode(int width, int height, int bpp, Uint32 flags12)
2531 FIXME("currently ignores SDL_WINDOWID, which we could use with SDL_CreateWindowFrom ...?");
2532 SDL_DisplayMode dmode;
2533 Uint32 fullscreen_flags20 = 0;
2536 /* SDL_SetVideoMode() implicitly inits if necessary. */
2537 if (SDL20_WasInit(SDL_INIT_VIDEO) == 0) {
2538 if (SDL20_Init(SDL_INIT_VIDEO) < 0) {
2543 if ((flags12 & SDL12_OPENGLBLIT) == SDL12_OPENGLBLIT) {
2544 FIXME("No OPENGLBLIT support at the moment");
2545 SDL20_SetError("SDL_OPENGLBLIT is (currently) unsupported");
2549 FIXME("handle SDL_ANYFORMAT");
2551 if ((width < 0) || (height < 0)) {
2552 SDL20_SetError("Invalid width or height");
2556 FIXME("There's an environment variable to choose a display");
2557 if (SDL20_GetCurrentDisplayMode(0, &dmode) < 0) {
2570 bpp = SDL_BITSPERPIXEL(dmode.format);
2574 case 8: appfmt = SDL_PIXELFORMAT_INDEX8; break;
2575 case 16: appfmt = SDL_PIXELFORMAT_RGB565; FIXME("bgr instead of rgb?"); break;
2576 case 24: appfmt = SDL_PIXELFORMAT_RGB24; FIXME("bgr instead of rgb?"); break;
2577 case 32: appfmt = SDL_PIXELFORMAT_ARGB8888; FIXME("bgr instead of rgb?"); break;
2578 default: SDL20_SetError("Unsupported bits-per-pixel"); return NULL;
2581 SDL_assert((VideoSurface12 != NULL) == (VideoWindow20 != NULL));
2583 FIXME("don't do anything if the window's dimensions, etc haven't changed.");
2584 FIXME("we need to preserve VideoSurface12 (but not its pixels), I think...");
2586 if ( VideoSurface12 && ((VideoSurface12->flags & SDL12_OPENGL) != (flags12 & SDL12_OPENGL)) ) {
2587 EndVidModeCreate(); /* rebuild the window if moving to/from a GL context */
2588 } else if ( VideoSurface12 && (VideoSurface12->surface20->format->format != appfmt)) {
2589 EndVidModeCreate(); /* rebuild the window if changing pixel format */
2590 } else if (VideoGLContext20) {
2591 /* SDL 1.2 (infuriatingly!) destroys the GL context on each resize, so we will too */
2592 SDL20_GL_MakeCurrent(NULL, NULL);
2593 SDL20_GL_DeleteContext(VideoGLContext20);
2594 VideoGLContext20 = NULL;
2597 if (flags12 & SDL12_FULLSCREEN) {
2598 // OpenGL tries to force the real resolution requested, but for
2599 // software rendering, we're just going to push it off onto the
2600 // GPU, so use FULLSCREEN_DESKTOP and logical scaling there.
2601 FIXME("OpenGL will still expect letterboxing and centering if it didn't get an exact resolution match.");
2602 if (flags12 & SDL12_OPENGL) {
2603 fullscreen_flags20 |= SDL_WINDOW_FULLSCREEN;
2605 fullscreen_flags20 |= SDL_WINDOW_FULLSCREEN_DESKTOP;
2609 if (!VideoWindow20) { /* create it */
2610 int x = SDL_WINDOWPOS_UNDEFINED, y = SDL_WINDOWPOS_UNDEFINED;
2611 Uint32 flags20 = fullscreen_flags20;
2612 if (flags12 & SDL12_OPENGL) { flags20 |= SDL_WINDOW_OPENGL; }
2613 if (flags12 & SDL12_RESIZABLE) { flags20 |= SDL_WINDOW_RESIZABLE; }
2614 if (flags12 & SDL12_NOFRAME) { flags20 |= SDL_WINDOW_BORDERLESS; }
2616 /* most platforms didn't check these environment variables, but the major
2617 ones did (x11, windib, quartz), so we'll just offer it everywhere. */
2618 GetEnvironmentWindowPosition(&x, &y);
2620 VideoWindow20 = SDL20_CreateWindow(WindowTitle, x, y, width, height, flags20);
2621 if (!VideoWindow20) {
2622 return EndVidModeCreate();
2624 } else { /* resize it */
2625 SDL20_SetWindowSize(VideoWindow20, width, height);
2626 SDL20_SetWindowFullscreen(VideoWindow20, fullscreen_flags20);
2627 SDL20_SetWindowBordered(VideoWindow20, (flags12 & SDL12_NOFRAME) ? SDL_FALSE : SDL_TRUE);
2628 SDL20_SetWindowResizable(VideoWindow20, (flags12 & SDL12_RESIZABLE) ? SDL_TRUE : SDL_FALSE);
2631 if (VideoSurface12) {
2632 SDL20_free(VideoSurface12->pixels);
2634 VideoSurface12 = CreateSurface12WithFormat(0, 0, appfmt);
2635 if (!VideoSurface12) {
2636 return EndVidModeCreate();
2640 VideoSurface12->surface20->flags |= SDL_PREALLOC;
2641 VideoSurface12->flags |= SDL12_PREALLOC;
2642 VideoSurface12->pixels = VideoSurface12->surface20->pixels = NULL;
2643 VideoSurface12->w = VideoSurface12->surface20->w = width;
2644 VideoSurface12->h = VideoSurface12->surface20->h = height;
2645 VideoSurface12->pitch = VideoSurface12->surface20->pitch = width * SDL_BYTESPERPIXEL(appfmt);
2646 SDL_SetClipRect(VideoSurface12, NULL);
2648 if (flags12 & SDL12_FULLSCREEN) {
2649 VideoSurface12->flags |= SDL12_FULLSCREEN;
2651 VideoSurface12->flags &= ~SDL12_FULLSCREEN;
2654 if (flags12 & SDL12_OPENGL) {
2655 SDL_assert(!VideoTexture20); /* either a new window or we destroyed all this */
2656 SDL_assert(!VideoRenderer20);
2657 VideoGLContext20 = SDL20_GL_CreateContext(VideoWindow20);
2658 if (!VideoGLContext20) {
2659 return EndVidModeCreate();
2662 VideoSurface12->flags |= SDL12_OPENGL;
2664 /* always use a renderer for non-OpenGL windows. */
2665 SDL_RendererInfo rinfo;
2666 SDL_assert(!VideoGLContext20); /* either a new window or we destroyed all this */
2667 if (!VideoRenderer20) {
2668 VideoRenderer20 = SDL20_CreateRenderer(VideoWindow20, -1, SDL_RENDERER_ACCELERATED|SDL_RENDERER_PRESENTVSYNC);
2670 if (!VideoRenderer20) {
2671 VideoRenderer20 = SDL20_CreateRenderer(VideoWindow20, -1, SDL_RENDERER_PRESENTVSYNC);
2673 if (!VideoRenderer20) {
2674 VideoRenderer20 = SDL20_CreateRenderer(VideoWindow20, -1, 0);
2676 if (!VideoRenderer20) {
2677 return EndVidModeCreate();
2680 SDL20_RenderSetLogicalSize(VideoRenderer20, width, height);
2681 SDL20_SetRenderDrawColor(VideoRenderer20, 0, 0, 0, 255);
2682 SDL20_RenderClear(VideoRenderer20);
2683 SDL20_RenderPresent(VideoRenderer20);
2684 SDL20_SetRenderDrawColor(VideoRenderer20, 255, 255, 255, 255);
2686 if (SDL20_GetRendererInfo(VideoRenderer20, &rinfo) < 0) {
2687 return EndVidModeCreate();
2690 if (VideoTexture20) {
2691 SDL20_DestroyTexture(VideoTexture20);
2694 if (VideoConvertSurface20) {
2695 SDL20_FreeSurface(VideoConvertSurface20);
2696 VideoConvertSurface20 = NULL;
2699 VideoTexture20 = SDL20_CreateTexture(VideoRenderer20, rinfo.texture_formats[0], SDL_TEXTUREACCESS_STREAMING, width, height);
2700 if (!VideoTexture20) {
2701 return EndVidModeCreate();
2704 if (rinfo.texture_formats[0] != appfmt) {
2705 /* need to convert between app's format and texture format */
2706 VideoConvertSurface20 = CreateNullPixelSurface20(width, height, rinfo.texture_formats[0]);
2707 if (!VideoConvertSurface20) {
2708 return EndVidModeCreate();
2712 VideoSurface12->flags &= ~SDL12_OPENGL;
2713 VideoSurface12->flags |= SDL12_DOUBLEBUF;
2714 VideoSurface12->surface20->pixels = SDL20_malloc(height * VideoSurface12->pitch);
2715 VideoSurface12->pixels = VideoSurface12->surface20->pixels;
2716 if (!VideoSurface12->pixels) {
2717 SDL20_OutOfMemory();
2718 return EndVidModeCreate();
2721 /* fill in the same default palette that SDL 1.2 does... */
2722 if (VideoSurface12->format->BitsPerPixel == 8) {
2724 SDL_Color *color = VideoSurface12->format->palette->colors;
2725 for (i = 0; i < 256; i++, color++) {
2726 { const int x = i & 0xe0; color->r = x | x >> 3 | x >> 6; }
2727 { const int x = (i << 3) & 0xe0; color->g = x | x >> 3 | x >> 6; }
2728 { const int x = (i & 0x3) | ((i & 0x3) << 2); color->b = x | x << 4; }
2734 SDL20_RaiseWindow(VideoWindow20);
2736 FIXME("setup screen saver");
2738 return VideoSurface12;
2741 DECLSPEC SDL12_Surface * SDLCALL
2742 SDL_GetVideoSurface(void)
2744 return VideoSurface12;
2747 DECLSPEC int SDLCALL
2748 SDL_UpperBlit(SDL12_Surface *src, SDL12_Rect *srcrect12, SDL12_Surface *dst, SDL12_Rect *dstrect12)
2750 SDL_Rect srcrect20, dstrect20;
2751 const int retval = SDL20_UpperBlit(src->surface20,
2752 srcrect12 ? Rect12to20(srcrect12, &srcrect20) : NULL,
2754 dstrect12 ? Rect12to20(dstrect12, &dstrect20) : NULL);
2757 Rect20to12(&srcrect20, srcrect12);
2761 Rect20to12(&dstrect20, dstrect12);
2767 DECLSPEC int SDLCALL
2768 SDL_LowerBlit(SDL12_Surface *src, SDL12_Rect *srcrect12, SDL12_Surface *dst, SDL12_Rect *dstrect12)
2770 SDL_Rect srcrect20, dstrect20;
2771 const int retval = SDL20_LowerBlit(src->surface20,
2772 srcrect12 ? Rect12to20(srcrect12, &srcrect20) : NULL,
2774 dstrect12 ? Rect12to20(dstrect12, &dstrect20) : NULL);
2777 Rect20to12(&srcrect20, srcrect12);
2781 Rect20to12(&dstrect20, dstrect12);
2787 DECLSPEC int SDLCALL
2788 SDL_SetAlpha(SDL12_Surface * surface, Uint32 flag, Uint8 value)
2791 return SDL20_Unsupported();
2794 DECLSPEC int SDLCALL
2795 SDL_LockSurface(SDL12_Surface *surface12)
2797 const int retval = SDL20_LockSurface(surface12->surface20);
2798 surface12->pixels = surface12->surface20->pixels;
2799 surface12->pitch = surface12->surface20->pitch;
2803 DECLSPEC void SDLCALL
2804 SDL_UnlockSurface(SDL12_Surface *surface12)
2806 SDL20_UnlockSurface(surface12->surface20);
2807 surface12->pixels = surface12->surface20->pixels;
2808 surface12->pitch = surface12->surface20->pitch;
2811 DECLSPEC SDL12_Surface * SDLCALL
2812 SDL_ConvertSurface(SDL12_Surface *src12, const SDL12_PixelFormat *format12, Uint32 flags12)
2815 SDL_PixelFormat format20;
2816 SDL_Palette palette20;
2817 SDL_Surface *surface20;
2818 SDL12_Surface *retval = NULL;
2820 if (flags12 & SDL12_PREALLOC) flags20 |= SDL_PREALLOC;
2821 if (flags12 & SDL12_RLEACCEL) flags20 |= SDL_RLEACCEL;
2823 surface20 = SDL20_ConvertSurface(src12->surface20, PixelFormat12to20(&format20, &palette20, format12), flags20);
2825 retval = Surface20to12(surface20);
2827 SDL20_FreeSurface(surface20);
2833 DECLSPEC SDL12_Surface * SDLCALL
2834 SDL_DisplayFormat(SDL12_Surface *surface12)
2836 const Uint32 flags = surface12->flags & (SDL12_SRCCOLORKEY|SDL12_SRCALPHA|SDL12_RLEACCELOK);
2837 return SDL_ConvertSurface(surface12, VideoSurface12->format, flags);
2840 DECLSPEC SDL12_Surface * SDLCALL
2841 SDL_DisplayFormatAlpha(SDL12_Surface *surface)
2844 SDL20_Unsupported();
2851 void *pixels = NULL;
2854 SDL_assert(VideoSurface12 != NULL);
2856 if (SDL20_LockTexture(VideoTexture20, NULL, &pixels, &pitch) < 0) {
2857 return; /* oh well */
2860 FIXME("Maybe lock texture always, until present, if no conversion needed?");
2861 VideoConvertSurface20->pixels = pixels;
2862 VideoConvertSurface20->pitch = pitch;
2863 SDL20_UpperBlit(VideoSurface12->surface20, NULL, VideoConvertSurface20, NULL);
2864 VideoConvertSurface20->pixels = NULL;
2865 VideoConvertSurface20->pitch = 0;
2867 SDL20_UnlockTexture(VideoTexture20);
2868 SDL20_RenderCopy(VideoRenderer20, VideoTexture20, NULL, NULL);
2869 SDL20_RenderPresent(VideoRenderer20);
2872 DECLSPEC void SDLCALL
2873 SDL_UpdateRects(SDL12_Surface *surface12, int numrects, SDL12_Rect *rects12)
2875 /* strangely, SDL 1.2 doesn't check if surface12 is NULL before touching it */
2876 /* (UpdateRect, singular, does...) */
2877 if (surface12->flags & SDL12_OPENGL) {
2878 SDL20_SetError("Use SDL_GL_SwapBuffers() on OpenGL surfaces");
2882 /* everything else is marked SDL12_DOUBLEBUF and is a no-op here. */
2885 DECLSPEC void SDLCALL
2886 SDL_UpdateRect(SDL12_Surface *screen12, Sint32 x, Sint32 y, Uint32 w, Uint32 h)
2890 rect12.x = (Sint16) x;
2891 rect12.y = (Sint16) y;
2892 rect12.w = (Uint16) (w ? w : screen12->w);
2893 rect12.h = (Uint16) (h ? h : screen12->h);
2894 SDL_UpdateRects(screen12, 1, &rect12);
2898 DECLSPEC int SDLCALL
2899 SDL_Flip(SDL12_Surface *surface12)
2901 if (surface12->flags & SDL12_OPENGL) {
2902 return SDL20_SetError("Use SDL_GL_SwapBuffers() on OpenGL surfaces");
2905 if (surface12 == VideoSurface12) {
2912 DECLSPEC void SDLCALL
2913 SDL_WM_SetCaption(const char *title, const char *icon)
2916 SDL20_free(WindowTitle);
2918 if (WindowIconTitle) {
2919 SDL20_free(WindowIconTitle);
2921 WindowTitle = title ? SDL_strdup(title) : NULL;
2922 WindowIconTitle = icon ? SDL_strdup(icon) : NULL;
2923 if (VideoWindow20) {
2924 SDL20_SetWindowTitle(VideoWindow20, WindowTitle);
2928 DECLSPEC void SDLCALL
2929 SDL_WM_GetCaption(const char **title, const char **icon)
2932 *title = WindowTitle;
2935 *icon = WindowIconTitle;
2939 DECLSPEC void SDLCALL
2940 SDL_WM_SetIcon(SDL_Surface *icon, Uint8 *mask)
2943 SDL20_Unsupported();
2946 DECLSPEC int SDLCALL
2947 SDL_WM_IconifyWindow(void)
2949 SDL20_MinimizeWindow(VideoWindow20);
2953 DECLSPEC int SDLCALL
2954 SDL_WM_ToggleFullScreen(SDL12_Surface *surface)
2957 if (surface == VideoSurface12) {
2958 SDL_assert(VideoWindow20);
2959 const Uint32 flags20 = SDL20_GetWindowFlags(VideoWindow20);
2960 if (flags20 & SDL_WINDOW_FULLSCREEN) {
2961 SDL_assert(VideoSurface12->flags & SDL12_FULLSCREEN);
2962 retval = (SDL20_SetWindowFullscreen(VideoWindow20, 0) == 0);
2964 VideoSurface12->flags &= ~SDL12_FULLSCREEN;
2967 SDL_assert((VideoSurface12->flags & SDL12_FULLSCREEN) == 0);
2968 const Uint32 newflags20 = (VideoSurface12->flags & SDL12_OPENGL) ? SDL_WINDOW_FULLSCREEN : SDL_WINDOW_FULLSCREEN_DESKTOP;
2969 retval = (SDL20_SetWindowFullscreen(VideoWindow20, newflags20) == 0);
2971 VideoSurface12->flags |= SDL12_FULLSCREEN;
2974 if (retval && VideoRenderer20) {
2975 SDL20_RenderSetLogicalSize(VideoRenderer20, VideoSurface12->w, VideoSurface12->h);
2983 SDL12_GRAB_QUERY = -1,
2989 UpdateRelativeMouseMode(void)
2991 // in SDL 1.2, hiding+grabbing the cursor was like SDL2's relative mouse mode.
2992 if (VideoWindow20) {
2993 const int visible = SDL20_ShowCursor(-1);
2994 const SDL_bool grabbed = SDL20_GetWindowGrab(VideoWindow20);
2995 SDL20_SetRelativeMouseMode((!visible && grabbed) ? SDL_TRUE : SDL_FALSE);
2999 DECLSPEC int SDLCALL
3000 SDL_ShowCursor(int toggle)
3002 const int retval = SDL20_ShowCursor(toggle);
3004 UpdateRelativeMouseMode();
3010 DECLSPEC SDL12_GrabMode SDLCALL
3011 SDL_WM_GrabInput(SDL12_GrabMode mode)
3013 if (mode != SDL12_GRAB_QUERY) {
3014 SDL20_SetWindowGrab(VideoWindow20, (mode == SDL12_GRAB_ON));
3015 UpdateRelativeMouseMode();
3017 return SDL20_GetWindowGrab(VideoWindow20) ? SDL12_GRAB_ON : SDL12_GRAB_OFF;
3020 DECLSPEC void SDLCALL
3021 SDL_WarpMouse(Uint16 x, Uint16 y)
3023 SDL20_WarpMouseInWindow(VideoWindow20, x, y);
3026 DECLSPEC Uint8 SDLCALL
3027 SDL_GetAppState(void)
3032 flags20 = SDL20_GetWindowFlags(VideoWindow20);
3033 if ((flags20 & SDL_WINDOW_SHOWN) && !(flags20 & SDL_WINDOW_MINIMIZED)) {
3034 state12 |= SDL12_APPACTIVE;
3036 if (flags20 & SDL_WINDOW_INPUT_FOCUS) {
3037 state12 |= SDL12_APPINPUTFOCUS;
3039 if (flags20 & SDL_WINDOW_MOUSE_FOCUS) {
3040 state12 |= SDL12_APPMOUSEFOCUS;
3045 DECLSPEC int SDLCALL
3046 SDL_SetColorKey(SDL12_Surface *surface12, Uint32 flag12, Uint32 key)
3048 const SDL_bool addkey = (flag12 & SDL12_SRCCOLORKEY) ? SDL_TRUE : SDL_FALSE;
3049 const int retval = SDL20_SetColorKey(surface12->surface20, addkey, key);
3050 if (SDL20_GetColorKey(surface12->surface20, &surface12->format->colorkey) < 0) {
3051 surface12->format->colorkey = 0;
3056 DECLSPEC int SDLCALL
3057 SDL_SetPalette(SDL12_Surface *surface12, int flags, const SDL_Color *colors,
3058 int firstcolor, int ncolors)
3061 return SDL20_Unsupported();
3064 DECLSPEC int SDLCALL
3065 SDL_SetColors(SDL12_Surface *surface12, const SDL_Color * colors, int firstcolor,
3069 return SDL20_Unsupported();
3072 DECLSPEC int SDLCALL
3073 SDL_GetWMInfo(SDL_SysWMinfo * info)
3076 //return SDL20_GetWindowWMInfo(VideoWindow20, info);
3077 return SDL20_Unsupported();
3080 DECLSPEC SDL12_Overlay * SDLCALL
3081 SDL_CreateYUVOverlay(int w, int h, Uint32 format, SDL12_Surface *display)
3084 SDL20_Unsupported();
3088 DECLSPEC int SDLCALL
3089 SDL_LockYUVOverlay(SDL12_Overlay * overlay)
3092 return SDL20_Unsupported();
3095 DECLSPEC void SDLCALL
3096 SDL_UnlockYUVOverlay(SDL12_Overlay * overlay)
3101 DECLSPEC int SDLCALL
3102 SDL_DisplayYUVOverlay(SDL12_Overlay * overlay, SDL12_Rect * dstrect12)
3105 return SDL20_Unsupported();
3108 DECLSPEC void SDLCALL
3109 SDL_FreeYUVOverlay(SDL12_Overlay * overlay)
3114 DECLSPEC int SDLCALL
3115 SDL_GL_LoadLibrary(const char *libname)
3117 /* SDL 1.2 would unload the previous library if one was loaded. SDL2
3118 reports an error if one is already loaded, and sometimes loads it
3119 internally for some video targets, so unloading it probably isn't safe.
3120 There really isn't a good reason to be using anything other than the
3121 system OpenGL in 2019, so we ignore the error in this case to match 1.2
3122 behavior, even if you were going to load a different library this time.
3124 const int rc = SDL20_GL_LoadLibrary(libname);
3126 const char *err = SDL20_GetError();
3127 if (SDL20_strcmp(err, "OpenGL library already loaded") == 0) {
3131 /* reset the actual error. */
3132 char *dup = SDL_strdup(err);
3134 SDL20_SetError("Out of memory");
3136 SDL20_SetError(dup);
3144 DECLSPEC int SDLCALL
3145 SDL_GL_SetAttribute(SDL12_GLattr attr, int value)
3147 if (attr >= SDL12_GL_MAX_ATTRIBUTE)
3148 return SDL20_SetError("Unknown GL attribute");
3150 /* swap control was moved out of this API, everything else lines up. */
3151 if (attr == SDL12_GL_SWAP_CONTROL)
3153 SwapInterval = value;
3154 FIXME("Actually set swap interval somewhere");
3158 return SDL20_GL_SetAttribute((SDL_GLattr) attr, value);
3161 DECLSPEC int SDLCALL
3162 SDL_GL_GetAttribute(SDL12_GLattr attr, int* value)
3164 if (attr >= SDL12_GL_MAX_ATTRIBUTE)
3165 return SDL20_SetError("Unknown GL attribute");
3167 /* swap control was moved out of this API, everything else lines up. */
3168 if (attr == SDL12_GL_SWAP_CONTROL)
3170 *value = SDL20_GL_GetSwapInterval();
3174 return SDL20_GL_GetAttribute((SDL_GLattr) attr, value);
3178 DECLSPEC void SDLCALL
3179 SDL_GL_SwapBuffers(void)
3182 SDL20_GL_SwapWindow(VideoWindow20);
3185 DECLSPEC int SDLCALL
3186 SDL_SetGamma(float red, float green, float blue)
3188 Uint16 red_ramp[256];
3189 Uint16 green_ramp[256];
3190 Uint16 blue_ramp[256];
3192 SDL20_CalculateGammaRamp(red, red_ramp);
3194 SDL20_memcpy(green_ramp, red_ramp, sizeof(red_ramp));
3196 SDL20_CalculateGammaRamp(green, green_ramp);
3199 SDL20_memcpy(blue_ramp, red_ramp, sizeof(red_ramp));
3200 } else if (blue == green) {
3201 SDL20_memcpy(blue_ramp, green_ramp, sizeof(green_ramp));
3203 SDL20_CalculateGammaRamp(blue, blue_ramp);
3205 return SDL20_SetWindowGammaRamp(VideoWindow20, red_ramp, green_ramp, blue_ramp);
3208 DECLSPEC int SDLCALL
3209 SDL_SetGammaRamp(const Uint16 *red, const Uint16 *green, const Uint16 *blue)
3211 return SDL20_SetWindowGammaRamp(VideoWindow20, red, green, blue);
3214 DECLSPEC int SDLCALL
3215 SDL_GetGammaRamp(Uint16 *red, Uint16 *green, Uint16 *blue)
3217 return SDL20_GetWindowGammaRamp(VideoWindow20, red, green, blue);
3220 DECLSPEC int SDLCALL
3221 SDL_EnableKeyRepeat(int delay, int interval)
3227 DECLSPEC void SDLCALL
3228 SDL_GetKeyRepeat(int *delay, int *interval)
3232 *delay = SDL12_DEFAULT_REPEAT_DELAY;
3235 *interval = SDL12_DEFAULT_REPEAT_INTERVAL;
3239 DECLSPEC int SDLCALL
3240 SDL_EnableUNICODE(int enable)
3243 return SDL20_Unsupported();
3247 SetTimerOld_Callback(Uint32 interval, void* param)
3249 return ((SDL12_TimerCallback)param)(interval);
3252 DECLSPEC int SDLCALL
3253 SDL_SetTimer(Uint32 interval, SDL12_TimerCallback callback)
3255 static SDL_TimerID compat_timer;
3258 SDL20_RemoveTimer(compat_timer);
3262 if (interval && callback) {
3263 compat_timer = SDL20_AddTimer(interval, SetTimerOld_Callback, callback);
3264 if (!compat_timer) {
3271 DECLSPEC int SDLCALL
3272 SDL_putenv(const char *_var)
3275 char *var = SDL20_strdup(_var);
3277 return -1; /* we don't set errno. */
3280 ptr = SDL20_strchr(var, '=');
3286 *ptr = '\0'; /* split the string into name and value. */
3287 SDL20_setenv(var, ptr + 1, 1);
3294 /* CD-ROM support is gone from SDL 2.0, so just have stubs that fail. */
3296 typedef void *SDL12_CD; /* close enough. :) */
3297 typedef int SDL12_CDstatus; /* close enough. :) */
3299 DECLSPEC int SDLCALL
3300 SDL_CDNumDrives(void)
3302 FIXME("should return -1 without SDL_INIT_CDROM");
3306 DECLSPEC const char *SDLCALL SDL_CDName(int drive) { SDL20_Unsupported(); return NULL; }
3307 DECLSPEC SDL12_CD *SDLCALL SDL_CDOpen(int drive) { SDL20_Unsupported(); return NULL; }
3308 DECLSPEC SDL12_CDstatus SDLCALL SDL_CDStatus(SDL12_CD *cdrom) { return SDL20_Unsupported(); }
3309 DECLSPEC int SDLCALL SDL_CDPlayTracks(SDL12_CD *cdrom, int start_track, int start_frame, int ntracks, int nframes) { return SDL20_Unsupported(); }
3310 DECLSPEC int SDLCALL SDL_CDPlay(SDL12_CD *cdrom, int start, int length) { return SDL20_Unsupported(); }
3311 DECLSPEC int SDLCALL SDL_CDPause(SDL12_CD *cdrom) { return SDL20_Unsupported(); }
3312 DECLSPEC int SDLCALL SDL_CDResume(SDL12_CD *cdrom) { return SDL20_Unsupported(); }
3313 DECLSPEC int SDLCALL SDL_CDStop(SDL12_CD *cdrom) { return SDL20_Unsupported(); }
3314 DECLSPEC int SDLCALL SDL_CDEject(SDL12_CD *cdrom) { return SDL20_Unsupported(); }
3315 DECLSPEC void SDLCALL SDL_CDClose(SDL12_CD *cdrom) {}
3318 #ifdef SDL_PASSED_BEGINTHREAD_ENDTHREAD
3319 DECLSPEC SDL_Thread * SDLCALL
3320 SDL_CreateThread(int (SDLCALL *fn)(void *), void *data, pfnSDL_CurrentBeginThread pfnBeginThread, pfnSDL_CurrentEndThread pfnEndThread)
3322 return SDL20_CreateThread(fn, NULL, data, pfnBeginThread, pfnEndThread);
3325 DECLSPEC SDL_Thread * SDLCALL
3326 SDL_CreateThread(int (SDLCALL *fn)(void *), void *data)
3328 return SDL20_CreateThread(fn, NULL, data);
3332 DECLSPEC int SDLCALL
3333 SDL_mutexP(SDL_mutex *mutex)
3335 return SDL20_LockMutex(mutex);
3338 DECLSPEC int SDLCALL
3339 SDL_mutexV(SDL_mutex *mutex)
3341 return SDL20_UnlockMutex(mutex);
3344 DECLSPEC void SDLCALL
3345 SDL_KillThread(SDL_Thread *thread)
3347 FIXME("Removed from 2.0; do nothing. We can't even report failure.");
3349 "WARNING: this app used SDL_KillThread(), an unforgivable curse.\n"
3350 "This program should be fixed. No thread was actually harmed.\n");
3353 /* This changed from an opaque pointer to an int in 2.0. */
3354 typedef struct _SDL12_TimerID *SDL12_TimerID;
3355 SDL_COMPILE_TIME_ASSERT(timer, sizeof(SDL12_TimerID) >= sizeof(SDL_TimerID));
3358 DECLSPEC SDL12_TimerID SDLCALL
3359 SDL_AddTimer(Uint32 interval, SDL12_NewTimerCallback callback, void *param)
3361 return (SDL12_TimerID) ((size_t) SDL20_AddTimer(interval, callback, param));
3364 DECLSPEC SDL_bool SDLCALL
3365 SDL_RemoveTimer(SDL12_TimerID id)
3367 return SDL20_RemoveTimer((SDL_TimerID) ((size_t)id));
3371 typedef struct SDL12_RWops {
3372 int (SDLCALL *seek)(struct SDL12_RWops *context, int offset, int whence);
3373 int (SDLCALL *read)(struct SDL12_RWops *context, void *ptr, int size, int maxnum);
3374 int (SDLCALL *write)(struct SDL12_RWops *context, const void *ptr, int size, int num);
3375 int (SDLCALL *close)(struct SDL12_RWops *context);
3382 DECLSPEC SDL12_RWops * SDLCALL
3385 SDL12_RWops *rwops = (SDL12_RWops *) SDL20_malloc(sizeof (SDL12_RWops));
3387 SDL20_OutOfMemory();
3391 DECLSPEC void SDLCALL
3392 SDL_FreeRW(SDL12_RWops *rwops12)
3394 SDL20_free(rwops12);
3398 RWops20to12_seek(struct SDL12_RWops *rwops12, int offset, int whence)
3400 return rwops12->rwops20->seek(rwops12->rwops20, offset, whence);
3404 RWops20to12_read(struct SDL12_RWops *rwops12, void *ptr, int size, int maxnum)
3406 return rwops12->rwops20->read(rwops12->rwops20, ptr, size, maxnum);
3410 RWops20to12_write(struct SDL12_RWops *rwops12, const void *ptr, int size, int num)
3412 return rwops12->rwops20->write(rwops12->rwops20, ptr, size, num);
3416 RWops20to12_close(struct SDL12_RWops *rwops12)
3421 rc = rwops12->rwops20->close(rwops12->rwops20);
3423 SDL_FreeRW(rwops12);
3428 static SDL12_RWops *
3429 RWops20to12(SDL_RWops *rwops20)
3431 SDL12_RWops *rwops12;
3436 rwops12 = SDL_AllocRW();
3440 SDL20_zerop(rwops12);
3441 rwops12->type = rwops20->type;
3442 rwops12->rwops20 = rwops20;
3443 rwops12->seek = RWops20to12_seek;
3444 rwops12->read = RWops20to12_read;
3445 rwops12->write = RWops20to12_write;
3446 rwops12->close = RWops20to12_close;
3451 DECLSPEC SDL12_RWops * SDLCALL
3452 SDL_RWFromFile(const char *file, const char *mode)
3454 if ( !file || !*file || !mode || !*mode ) {
3455 SDL_SetError("SDL_RWFromFile(): No file or no mode specified");
3458 return RWops20to12(SDL20_RWFromFile(file, mode));
3461 DECLSPEC SDL12_RWops * SDLCALL
3462 SDL_RWFromFP(FILE *io, int autoclose)
3464 return RWops20to12(SDL20_RWFromFP(io, autoclose));
3467 DECLSPEC SDL12_RWops * SDLCALL
3468 SDL_RWFromMem(void *mem, int size)
3470 return RWops20to12(SDL20_RWFromMem(mem, size));
3473 DECLSPEC SDL12_RWops * SDLCALL
3474 SDL_RWFromConstMem(const void *mem, int size)
3476 return RWops20to12(SDL20_RWFromConstMem(mem, size));
3479 #define READ_AND_BYTESWAP(endian, bits) \
3480 DECLSPEC Uint##bits SDLCALL SDL_Read##endian##bits(SDL12_RWops *rwops12) { \
3481 Uint##bits val; rwops12->read(rwops12, &val, sizeof (val), 1); \
3482 return SDL_Swap##endian##bits(val); \
3485 READ_AND_BYTESWAP(LE,16)
3486 READ_AND_BYTESWAP(BE,16)
3487 READ_AND_BYTESWAP(LE,32)
3488 READ_AND_BYTESWAP(BE,32)
3489 READ_AND_BYTESWAP(LE,64)
3490 READ_AND_BYTESWAP(BE,64)
3491 #undef READ_AND_BYTESWAP
3493 #define BYTESWAP_AND_WRITE(endian, bits) \
3494 DECLSPEC int SDLCALL SDL_Write##endian##bits(SDL12_RWops *rwops12, Uint##bits val) { \
3495 val = SDL_Swap##endian##bits(val); \
3496 return rwops12->write(rwops12, &val, sizeof (val), 1); \
3498 BYTESWAP_AND_WRITE(LE,16)
3499 BYTESWAP_AND_WRITE(BE,16)
3500 BYTESWAP_AND_WRITE(LE,32)
3501 BYTESWAP_AND_WRITE(BE,32)
3502 BYTESWAP_AND_WRITE(LE,64)
3503 BYTESWAP_AND_WRITE(BE,64)
3504 #undef BYTESWAP_AND_WRITE
3507 static Sint64 SDLCALL
3508 RWops12to20_size(struct SDL_RWops *rwops20)
3510 SDL12_RWops *rwops12 = (SDL12_RWops *) rwops20->hidden.unknown.data1;
3511 int size = (int) ((size_t) rwops20->hidden.unknown.data2);
3517 pos = rwops12->seek(rwops12, 0, SEEK_CUR);
3521 size = (Sint64) rwops12->seek(rwops12, 0, SEEK_END);
3525 rwops12->seek(rwops12, pos, SEEK_SET); FIXME("...and if this fails?");
3526 rwops20->hidden.unknown.data2 = (void *) ((size_t) size);
3530 static Sint64 SDLCALL
3531 RWops12to20_seek(struct SDL_RWops *rwops20, Sint64 offset, int whence)
3533 FIXME("fail if (offset) is too big");
3534 SDL12_RWops *rwops12 = (SDL12_RWops *) rwops20->hidden.unknown.data1;
3535 return (Sint64) rwops12->seek(rwops12, (int) offset, whence);
3538 static size_t SDLCALL
3539 RWops12to20_read(struct SDL_RWops *rwops20, void *ptr, size_t size, size_t maxnum)
3541 FIXME("fail if (size) or (maxnum) is too big");
3542 SDL12_RWops *rwops12 = (SDL12_RWops *) rwops20->hidden.unknown.data1;
3543 return (size_t) rwops12->read(rwops12, ptr, (int) size, (int) maxnum);
3546 static size_t SDLCALL
3547 RWops12to20_write(struct SDL_RWops *rwops20, const void *ptr, size_t size, size_t num)
3549 FIXME("fail if (size) or (maxnum) is too big");
3550 SDL12_RWops *rwops12 = (SDL12_RWops *) rwops20->hidden.unknown.data1;
3551 return (size_t) rwops12->write(rwops12, ptr, (int) size, (int) num);
3555 RWops12to20_close(struct SDL_RWops *rwops20)
3560 SDL12_RWops *rwops12 = (SDL12_RWops *) rwops20->hidden.unknown.data1;
3561 rc = rwops12->close(rwops12);
3563 SDL20_FreeRW(rwops20);
3569 RWops12to20(SDL12_RWops *rwops12)
3576 rwops20 = SDL20_AllocRW();
3580 SDL20_zerop(rwops20);
3581 rwops20->type = rwops12->type;
3582 rwops20->hidden.unknown.data1 = rwops12;
3583 rwops20->hidden.unknown.data2 = (void *) ((size_t) -1); /* cached size of stream */
3584 rwops20->size = RWops12to20_size;
3585 rwops20->seek = RWops12to20_seek;
3586 rwops20->read = RWops12to20_read;
3587 rwops20->write = RWops12to20_write;
3588 rwops20->close = RWops12to20_close;
3592 DECLSPEC SDL12_Surface * SDLCALL
3593 SDL_LoadBMP_RW(SDL12_RWops *rwops12, int freerwops12)
3595 SDL_RWops *rwops20 = RWops12to20(rwops12);
3596 SDL_Surface *surface20 = SDL20_LoadBMP_RW(rwops20, freerwops12);
3597 SDL12_Surface *surface12 = Surface20to12(surface20);
3598 if (!freerwops12) /* free our wrapper if SDL2 didn't close it. */
3599 SDL20_FreeRW(rwops20);
3600 if ((!surface12) && (surface20))
3601 SDL20_FreeSurface(surface20);
3605 DECLSPEC int SDLCALL
3606 SDL_SaveBMP_RW(SDL12_Surface *surface12, SDL12_RWops *rwops12, int freerwops12)
3608 FIXME("wrap surface");
3609 SDL_RWops *rwops20 = RWops12to20(rwops12);
3610 const int retval = SDL20_SaveBMP_RW(surface12->surface20, rwops20, freerwops12);
3611 if (!freerwops12) /* free our wrapper if SDL2 didn't close it. */
3612 SDL20_FreeRW(rwops20);
3616 DECLSPEC SDL_AudioSpec * SDLCALL
3617 SDL_LoadWAV_RW(SDL12_RWops *rwops12, int freerwops12,
3618 SDL_AudioSpec *spec, Uint8 **buf, Uint32 *len)
3620 SDL_RWops *rwops20 = RWops12to20(rwops12);
3621 SDL_AudioSpec *retval = SDL20_LoadWAV_RW(rwops20, freerwops12, spec, buf, len);
3622 FIXME("deal with non-1.2 formats, like float32");
3623 if (!freerwops12) /* free our wrapper if SDL2 didn't close it. */
3624 SDL20_FreeRW(rwops20);
3628 /* vi: set ts=4 sw=4 expandtab: */