summaryrefslogtreecommitdiff
path: root/textscreen/txt_main.c
diff options
context:
space:
mode:
authorSimon Howard2005-10-02 03:16:03 +0000
committerSimon Howard2005-10-02 03:16:03 +0000
commitf75826fa71ff17f3b8852918e9051ddee9f5e119 (patch)
tree7444ed0cb31f96d5476f32c32b9b11ed4d2fb11c /textscreen/txt_main.c
parent8f20863e40e5f721adc616817eae8442898b9a70 (diff)
downloadchocolate-doom-f75826fa71ff17f3b8852918e9051ddee9f5e119.tar.gz
chocolate-doom-f75826fa71ff17f3b8852918e9051ddee9f5e119.tar.bz2
chocolate-doom-f75826fa71ff17f3b8852918e9051ddee9f5e119.zip
Text mode emulation code
Subversion-branch: /trunk/chocolate-doom Subversion-revision: 146
Diffstat (limited to 'textscreen/txt_main.c')
-rw-r--r--textscreen/txt_main.c162
1 files changed, 162 insertions, 0 deletions
diff --git a/textscreen/txt_main.c b/textscreen/txt_main.c
new file mode 100644
index 00000000..65ee3ac2
--- /dev/null
+++ b/textscreen/txt_main.c
@@ -0,0 +1,162 @@
+// Emacs style mode select -*- C++ -*-
+//-----------------------------------------------------------------------------
+//
+// $Id: txt_main.c 146 2005-10-02 03:16:03Z fraggle $
+//
+// Copyright(C) 1993-1996 Id Software, Inc.
+// Copyright(C) 2005 Simon Howard
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+// 02111-1307, USA.
+//
+// $Log$
+// Revision 1.1 2005/10/02 03:16:03 fraggle
+// Text mode emulation code
+//
+//
+//-----------------------------------------------------------------------------
+//
+// Text mode emulation in SDL
+//
+//-----------------------------------------------------------------------------
+
+#include <SDL.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "txt_main.h"
+#include "txt_font.h"
+
+#define SCREEN_W 80
+#define SCREEN_H 25
+#define CHAR_W 8
+#define CHAR_H 16
+
+static SDL_Surface *screen;
+static unsigned char *screendata;
+
+static SDL_Color ega_colors[] =
+{
+ {0x00, 0x00, 0x00}, // 0: Black
+ {0x00, 0x00, 0xa8}, // 1: Blue
+ {0x00, 0xa8, 0x00}, // 2: Green
+ {0x00, 0xa8, 0xa8}, // 3: Cyan
+ {0xa8, 0x00, 0x00}, // 4: Red
+ {0xa8, 0x00, 0xa8}, // 5: Magenta
+ {0xa8, 0x54, 0x00}, // 6: Brown
+ {0xa8, 0xa8, 0xa8}, // 7: Grey
+ {0x54, 0x54, 0x54}, // 8: Dark grey
+ {0x54, 0x54, 0xfe}, // 9: Bright blue
+ {0x54, 0xfe, 0x54}, // 10: Bright green
+ {0x54, 0xfe, 0xfe}, // 11: Bright cyan
+ {0xfe, 0x54, 0x54}, // 12: Bright red
+ {0xfe, 0x54, 0xfe}, // 13: Bright magenta
+ {0xfe, 0xfe, 0x54}, // 14: Yellow
+ {0xfe, 0xfe, 0xfe}, // 15: Bright white
+};
+
+//
+// Initialise text mode screen
+//
+// Returns 1 if successful, 0 if an error occurred
+//
+
+int TXT_Init(void)
+{
+ SDL_InitSubSystem(SDL_INIT_VIDEO);
+
+ screen = SDL_SetVideoMode(SCREEN_W * CHAR_W, SCREEN_H * CHAR_H, 8, 0);
+
+ if (screen == NULL)
+ return 0;
+
+ SDL_SetColors(screen, ega_colors, 0, 16);
+
+ screendata = malloc(SCREEN_W * SCREEN_H * 2);
+ memset(screendata, 0, SCREEN_W * SCREEN_H * 2);
+
+ return 1;
+}
+
+void TXT_Shutdown(void)
+{
+ free(screendata);
+ SDL_QuitSubSystem(SDL_INIT_VIDEO);
+}
+
+unsigned char *TXT_GetScreenData(void)
+{
+ return screendata;
+}
+
+static inline void UpdateCharacter(int x, int y)
+{
+ unsigned char character;
+ unsigned char *p;
+ unsigned char *s, *s1;
+ int bg, fg;
+ int x1, y1;
+
+ p = &screendata[(y * SCREEN_W + x) * 2];
+ character = p[0];
+
+ fg = p[1] & 0xf;
+ bg = (p[1] >> 4) & 0xf;
+
+ p = &int10_font_16[character * CHAR_H];
+
+ s = screen->pixels + (y * CHAR_H * screen->pitch) + (x * CHAR_W);
+
+ for (y1=0; y1<CHAR_H; ++y1)
+ {
+ s1 = s;
+
+ for (x1=0; x1<CHAR_W; ++x1)
+ {
+ if (*p & (1 << (7-x1)))
+ {
+ *s1++ = fg;
+ }
+ else
+ {
+ *s1++ = bg;
+ }
+ }
+
+ ++p;
+ s += screen->pitch;
+ }
+}
+
+void TXT_UpdateScreenArea(int x, int y, int w, int h)
+{
+ int x1, y1;
+
+ for (y1=y; y1<y+h; ++y1)
+ {
+ for (x1=x; x1<x+w; ++x1)
+ {
+ UpdateCharacter(x1, y1);
+ }
+ }
+
+ SDL_UpdateRect(screen, x * CHAR_W, y * CHAR_H, w * CHAR_W, h * CHAR_H);
+}
+
+void TXT_UpdateScreen(void)
+{
+ TXT_UpdateScreenArea(0, 0, SCREEN_W, SCREEN_H);
+}
+