shithub: choc

Download patch

ref: 5e59e11b31c300c8636b04ccc25a42f6654182ac
parent: 19ac0c269c8037789137f50163f43decbe907c1f
author: Simon Howard <[email protected]>
date: Fri Nov 28 12:49:23 EST 2014

libtextscreen: Convert video code to SDL2.

This gets the basic libtextscreen up and running under SDL2. Not
everything works yet (most notably keyboard input is kind of broken)
but it's a start.

--- a/textscreen/txt_sdl.c
+++ b/textscreen/txt_sdl.c
@@ -48,7 +48,7 @@
 
 #define BLINK_PERIOD 250
 
-static SDL_Surface *screen;
+static SDL_Window *screen;
 static SDL_Surface *screenbuffer;
 static unsigned char *screendata;
 static int key_mapping = 1;
@@ -68,22 +68,22 @@
 
 static SDL_Color ega_colors[] = 
 {
-    {0x00, 0x00, 0x00, 0x00},          // 0: Black
-    {0x00, 0x00, 0xa8, 0x00},          // 1: Blue
-    {0x00, 0xa8, 0x00, 0x00},          // 2: Green
-    {0x00, 0xa8, 0xa8, 0x00},          // 3: Cyan
-    {0xa8, 0x00, 0x00, 0x00},          // 4: Red
-    {0xa8, 0x00, 0xa8, 0x00},          // 5: Magenta
-    {0xa8, 0x54, 0x00, 0x00},          // 6: Brown
-    {0xa8, 0xa8, 0xa8, 0x00},          // 7: Grey
-    {0x54, 0x54, 0x54, 0x00},          // 8: Dark grey
-    {0x54, 0x54, 0xfe, 0x00},          // 9: Bright blue
-    {0x54, 0xfe, 0x54, 0x00},          // 10: Bright green
-    {0x54, 0xfe, 0xfe, 0x00},          // 11: Bright cyan
-    {0xfe, 0x54, 0x54, 0x00},          // 12: Bright red
-    {0xfe, 0x54, 0xfe, 0x00},          // 13: Bright magenta
-    {0xfe, 0xfe, 0x54, 0x00},          // 14: Yellow
-    {0xfe, 0xfe, 0xfe, 0x00},          // 15: Bright white
+    {0x00, 0x00, 0x00, 0xff},          // 0: Black
+    {0x00, 0x00, 0xa8, 0xff},          // 1: Blue
+    {0x00, 0xa8, 0x00, 0xff},          // 2: Green
+    {0x00, 0xa8, 0xa8, 0xff},          // 3: Cyan
+    {0xa8, 0x00, 0x00, 0xff},          // 4: Red
+    {0xa8, 0x00, 0xa8, 0xff},          // 5: Magenta
+    {0xa8, 0x54, 0x00, 0xff},          // 6: Brown
+    {0xa8, 0xa8, 0xa8, 0xff},          // 7: Grey
+    {0x54, 0x54, 0x54, 0xff},          // 8: Dark grey
+    {0x54, 0x54, 0xfe, 0xff},          // 9: Bright blue
+    {0x54, 0xfe, 0x54, 0xff},          // 10: Bright green
+    {0x54, 0xfe, 0xfe, 0xff},          // 11: Bright cyan
+    {0xfe, 0x54, 0x54, 0xff},          // 12: Bright red
+    {0xfe, 0x54, 0xfe, 0xff},          // 13: Bright magenta
+    {0xfe, 0xfe, 0x54, 0xff},          // 14: Yellow
+    {0xfe, 0xfe, 0xfe, 0xff},          // 15: Bright white
 };
 
 #else
@@ -94,22 +94,22 @@
 
 static SDL_Color ega_colors[] = 
 {
-    {0x2e, 0x34, 0x36, 0x00},          // 0: Black
-    {0x34, 0x65, 0xa4, 0x00},          // 1: Blue
-    {0x4e, 0x9a, 0x06, 0x00},          // 2: Green
-    {0x06, 0x98, 0x9a, 0x00},          // 3: Cyan
-    {0xcc, 0x00, 0x00, 0x00},          // 4: Red
-    {0x75, 0x50, 0x7b, 0x00},          // 5: Magenta
-    {0xc4, 0xa0, 0x00, 0x00},          // 6: Brown
-    {0xd3, 0xd7, 0xcf, 0x00},          // 7: Grey
-    {0x55, 0x57, 0x53, 0x00},          // 8: Dark grey
-    {0x72, 0x9f, 0xcf, 0x00},          // 9: Bright blue
-    {0x8a, 0xe2, 0x34, 0x00},          // 10: Bright green
-    {0x34, 0xe2, 0xe2, 0x00},          // 11: Bright cyan
-    {0xef, 0x29, 0x29, 0x00},          // 12: Bright red
-    {0x34, 0xe2, 0xe2, 0x00},          // 13: Bright magenta
-    {0xfc, 0xe9, 0x4f, 0x00},          // 14: Yellow
-    {0xee, 0xee, 0xec, 0x00},          // 15: Bright white
+    {0x2e, 0x34, 0x36, 0xff},          // 0: Black
+    {0x34, 0x65, 0xa4, 0xff},          // 1: Blue
+    {0x4e, 0x9a, 0x06, 0xff},          // 2: Green
+    {0x06, 0x98, 0x9a, 0xff},          // 3: Cyan
+    {0xcc, 0x00, 0x00, 0xff},          // 4: Red
+    {0x75, 0x50, 0x7b, 0xff},          // 5: Magenta
+    {0xc4, 0xa0, 0x00, 0xff},          // 6: Brown
+    {0xd3, 0xd7, 0xcf, 0xff},          // 7: Grey
+    {0x55, 0x57, 0x53, 0xff},          // 8: Dark grey
+    {0x72, 0x9f, 0xcf, 0xff},          // 9: Bright blue
+    {0x8a, 0xe2, 0x34, 0xff},          // 10: Bright green
+    {0x34, 0xe2, 0xe2, 0xff},          // 11: Bright cyan
+    {0xef, 0x29, 0x29, 0xff},          // 12: Bright red
+    {0x34, 0xe2, 0xe2, 0xff},          // 13: Bright magenta
+    {0xfc, 0xe9, 0x4f, 0xff},          // 14: Yellow
+    {0xee, 0xee, 0xec, 0xff},          // 15: Bright white
 };
 
 #endif
@@ -171,7 +171,7 @@
 
 static void ChooseFont(void)
 {
-    const SDL_VideoInfo *info;
+    SDL_DisplayMode desktop_info;
     char *env;
 
     // Allow normal selection to be overridden from an environment variable:
@@ -188,14 +188,11 @@
         }
     }
 
-    // Get desktop resolution:
-
-    info = SDL_GetVideoInfo();
-
+    // Get desktop resolution.
     // If in doubt and we can't get a list, always prefer to
     // fall back to the normal font:
 
-    if (info == NULL)
+    if (!SDL_GetCurrentDisplayMode(0, &desktop_info))
     {
         font = &main_font;
         return;
@@ -206,7 +203,7 @@
     // a modern high-resolution display, and we can use the
     // large font.
 
-    if (info->current_w < 640 || info->current_h < 480)
+    if (desktop_info.w < 640 || desktop_info.h < 480)
     {
         font = &small_font;
     }
@@ -219,7 +216,7 @@
         font = &large_font;
     }
 #else
-    else if (info->current_w >= 1920 && info->current_h >= 1080)
+    else if (desktop_info.w >= 1920 && desktop_info.h >= 1080)
     {
         font = &large_font;
     }
@@ -238,7 +235,7 @@
 
 int TXT_Init(void)
 {
-    if (SDL_InitSubSystem(SDL_INIT_VIDEO) < 0)
+    if (SDL_Init(SDL_INIT_VIDEO) < 0)
     {
         return 0;
     }
@@ -248,8 +245,10 @@
     // Always create the screen at the native screen depth (bpp=0);
     // some systems nowadays don't seem to support true 8-bit palettized
     // screen modes very well and we end up with screwed up colors.
-    screen = SDL_SetVideoMode(TXT_SCREEN_W * font->w,
-                              TXT_SCREEN_H * font->h, 0, 0);
+    screen = SDL_CreateWindow("libtextscreen",
+                              SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
+                              TXT_SCREEN_W * font->w, TXT_SCREEN_H * font->h,
+                              0);//SDL_WINDOW_ALLOW_HIGHDPI);
 
     if (screen == NULL)
         return 0;
@@ -257,23 +256,26 @@
     // Instead, we draw everything into an intermediate 8-bit surface
     // the same dimensions as the screen. SDL then takes care of all the
     // 8->32 bit (or whatever depth) color conversions for us.
-    screenbuffer = SDL_CreateRGBSurface(0, TXT_SCREEN_W * font->w,
+    screenbuffer = SDL_CreateRGBSurface(0,
+                                        TXT_SCREEN_W * font->w,
                                         TXT_SCREEN_H * font->h,
                                         8, 0, 0, 0, 0);
-    SDL_SetColors(screenbuffer, ega_colors, 0, 16);
-    SDL_EnableUNICODE(1);
 
+    SDL_LockSurface(screenbuffer);
+    SDL_SetPaletteColors(screenbuffer->format->palette, ega_colors, 0, 16);
+    SDL_UnlockSurface(screenbuffer);
+    // SDL2-TODO SDL_EnableUNICODE(1);
+
     screendata = malloc(TXT_SCREEN_W * TXT_SCREEN_H * 2);
     memset(screendata, 0, TXT_SCREEN_W * TXT_SCREEN_H * 2);
 
     // Ignore all mouse motion events
-
 //    SDL_EventState(SDL_MOUSEMOTION, SDL_IGNORE);
 
     // Repeat key presses so we can hold down arrows to scroll down the
     // menu, for example. This is what setup.exe does.
 
-    SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
+    // SDL2-TODO SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
 
     return 1;
 }
@@ -383,6 +385,8 @@
     int x_end;
     int y_end;
 
+    SDL_LockSurface(screenbuffer);
+
     x_end = LimitToRange(x + w, 0, TXT_SCREEN_W);
     y_end = LimitToRange(y + h, 0, TXT_SCREEN_H);
     x = LimitToRange(x, 0, TXT_SCREEN_W);
@@ -401,8 +405,10 @@
     rect.w = (x_end - x) * font->w;
     rect.h = (y_end - y) * font->h;
 
-    SDL_BlitSurface(screenbuffer, &rect, screen, &rect);
-    SDL_UpdateRects(screen, 1, &rect);
+    SDL_UnlockSurface(screenbuffer);
+
+    SDL_BlitSurface(screenbuffer, &rect, SDL_GetWindowSurface(screen), &rect);
+    SDL_UpdateWindowSurfaceRects(screen, &rect, 1);
 }
 
 void TXT_UpdateScreen(void)
@@ -412,11 +418,7 @@
 
 void TXT_GetMousePosition(int *x, int *y)
 {
-#if SDL_VERSION_ATLEAST(1, 3, 0)
-    SDL_GetMouseState(0, x, y);
-#else
     SDL_GetMouseState(x, y);
-#endif
 
     *x /= font->w;
     *y /= font->h;
@@ -466,10 +468,6 @@
 
         case SDLK_LALT:
         case SDLK_RALT:
-#if !SDL_VERSION_ATLEAST(1, 3, 0)
-        case SDLK_LMETA:
-        case SDLK_RMETA:
-#endif
                                return KEY_RALT;
 
         case SDLK_CAPSLOCK:    return KEY_CAPSLOCK;
@@ -504,6 +502,8 @@
         // Unicode characters beyond the ASCII range need to be
         // mapped up into textscreen's Unicode range.
 
+#if 0
+    // SDL2-TODO
         if (sym->unicode < 128)
         {
             return sym->unicode;
@@ -512,6 +512,8 @@
         {
             return sym->unicode - 128 + TXT_UNICODE_BASE;
         }
+#endif
+        return 0;
     }
     else
     {
@@ -604,10 +606,6 @@
 
         case SDLK_LALT:
         case SDLK_RALT:
-#if !SDL_VERSION_ATLEAST(1, 3, 0)
-        case SDLK_LMETA:
-        case SDLK_RMETA:
-#endif
             mod = TXT_MOD_ALT;
             break;
 
@@ -865,7 +863,7 @@
 
 void TXT_SetWindowTitle(char *title)
 {
-    SDL_WM_SetCaption(title, NULL);
+    SDL_SetWindowTitle(screen, title);
 }
 
 void TXT_SDL_SetEventCallback(TxtSDLEventCallbackFunc callback, void *user_data)