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)