summaryrefslogtreecommitdiff
path: root/textscreen/txt_gui.c
diff options
context:
space:
mode:
authorSimon Howard2012-10-28 23:45:08 +0000
committerSimon Howard2012-10-28 23:45:08 +0000
commit993315afc4b1fddaf8952e7e55d1373b5052dd7c (patch)
tree94aa07d101ddced8404ceaa92ce051ed17fe2a88 /textscreen/txt_gui.c
parenta1b2ce54d02823aa85c7df6aa016c567185451ae (diff)
parentad11652dcd8e0923432ad272e6535276c51d39eb (diff)
downloadchocolate-doom-993315afc4b1fddaf8952e7e55d1373b5052dd7c.tar.gz
chocolate-doom-993315afc4b1fddaf8952e7e55d1373b5052dd7c.tar.bz2
chocolate-doom-993315afc4b1fddaf8952e7e55d1373b5052dd7c.zip
Merge from trunk.
Subversion-branch: /branches/v2-branch Subversion-revision: 2537
Diffstat (limited to 'textscreen/txt_gui.c')
-rw-r--r--textscreen/txt_gui.c131
1 files changed, 125 insertions, 6 deletions
diff --git a/textscreen/txt_gui.c b/textscreen/txt_gui.c
index d00e3a65..09ba87ef 100644
--- a/textscreen/txt_gui.c
+++ b/textscreen/txt_gui.c
@@ -25,9 +25,55 @@
#include "txt_gui.h"
#include "txt_io.h"
#include "txt_main.h"
+#include "txt_utf8.h"
typedef struct txt_cliparea_s txt_cliparea_t;
+// Mapping table that converts from the Extended ASCII codes in the
+// CP437 codepage to Unicode character numbers.
+
+static const uint16_t cp437_unicode[] = {
+ 0x00c7, 0x00fc, 0x00e9, 0x00e2, // 80-8f
+ 0x00e4, 0x00e0, 0x00e5, 0x00e7,
+ 0x00ea, 0x00eb, 0x00e8, 0x00ef,
+ 0x00ee, 0x00ec, 0x00c4, 0x00c5,
+
+ 0x00c9, 0x00e6, 0x00c6, 0x00f4, // 90-9f
+ 0x00f6, 0x00f2, 0x00fb, 0x00f9,
+ 0x00ff, 0x00d6, 0x00dc, 0x00a2,
+ 0x00a3, 0x00a5, 0x20a7, 0x0192,
+
+ 0x00e1, 0x00ed, 0x00f3, 0x00fa, // a0-af
+ 0x00f1, 0x00d1, 0x00aa, 0x00ba,
+ 0x00bf, 0x2310, 0x00ac, 0x00bd,
+ 0x00bc, 0x00a1, 0x00ab, 0x00bb,
+
+ 0x2591, 0x2592, 0x2593, 0x2502, // b0-bf
+ 0x2524, 0x2561, 0x2562, 0x2556,
+ 0x2555, 0x2563, 0x2551, 0x2557,
+ 0x255D, 0x255C, 0x255B, 0x2510,
+
+ 0x2514, 0x2534, 0x252C, 0x251C, // c0-cf
+ 0x2500, 0x253C, 0x255E, 0x255F,
+ 0x255A, 0x2554, 0x2569, 0x2566,
+ 0x2560, 0x2550, 0x256C, 0x2567,
+
+ 0x2568, 0x2564, 0x2565, 0x2559, // d0-df
+ 0x2558, 0x2552, 0x2553, 0x256B,
+ 0x256A, 0x2518, 0x250C, 0x2588,
+ 0x2584, 0x258C, 0x2590, 0x2580,
+
+ 0x03B1, 0x00DF, 0x0393, 0x03C0, // e0-ef
+ 0x03A3, 0x03C3, 0x00B5, 0x03C4,
+ 0x03A6, 0x0398, 0x03A9, 0x03B4,
+ 0x221E, 0x03C6, 0x03B5, 0x2229,
+
+ 0x2261, 0x00B1, 0x2265, 0x2264, // f0-ff
+ 0x2320, 0x2321, 0x00F7, 0x2248,
+ 0x00B0, 0x2219, 0x00B7, 0x221A,
+ 0x207F, 0x00B2, 0x25A0, 0x00A0,
+};
+
struct txt_cliparea_s
{
int x1, x2;
@@ -127,11 +173,12 @@ void TXT_DrawShadow(int x, int y, int w, int h)
void TXT_DrawWindowFrame(const char *title, int x, int y, int w, int h)
{
+ txt_saved_colors_t colors;
int x1, y1;
int bx, by;
+ TXT_SaveColors(&colors);
TXT_FGColor(TXT_COLOR_BRIGHT_CYAN);
- TXT_BGColor(TXT_WINDOW_BACKGROUND, 0);
for (y1=y; y1<y+h; ++y1)
{
@@ -180,18 +227,21 @@ void TXT_DrawWindowFrame(const char *title, int x, int y, int w, int h)
TXT_DrawShadow(x + 2, y + h, w, 1);
TXT_DrawShadow(x + w, y + 1, 2, h);
+
+ TXT_RestoreColors(&colors);
}
void TXT_DrawSeparator(int x, int y, int w)
{
+ txt_saved_colors_t colors;
unsigned char *data;
int x1;
int b;
data = TXT_GetScreenData();
+ TXT_SaveColors(&colors);
TXT_FGColor(TXT_COLOR_BRIGHT_CYAN);
- TXT_BGColor(TXT_WINDOW_BACKGROUND, 0);
if (!VALID_Y(y))
{
@@ -222,6 +272,8 @@ void TXT_DrawSeparator(int x, int y, int w)
data += 2;
}
+
+ TXT_RestoreColors(&colors);
}
void TXT_DrawString(const char *s)
@@ -251,8 +303,70 @@ void TXT_DrawString(const char *s)
TXT_GotoXY(x + strlen(s), y);
}
+static void PutUnicodeChar(unsigned int c)
+{
+ unsigned int i;
+
+ if (c < 128)
+ {
+ TXT_PutChar(c);
+ return;
+ }
+
+ // We can only display this character if it is in the CP437 codepage.
+
+ for (i = 0; i < 128; ++i)
+ {
+ if (cp437_unicode[i] == c)
+ {
+ TXT_PutChar(128 + i);
+ return;
+ }
+ }
+
+ // Otherwise, print a fallback character (inverted question mark):
+
+ TXT_PutChar('\xa8');
+}
+
+void TXT_DrawUTF8String(const char *s)
+{
+ int x, y;
+ int x1;
+ const char *p;
+ unsigned int c;
+
+ TXT_GetXY(&x, &y);
+
+ if (VALID_Y(y))
+ {
+ x1 = x;
+
+ for (p = s; *p != '\0'; )
+ {
+ c = TXT_DecodeUTF8(&p);
+
+ if (c == 0)
+ {
+ break;
+ }
+
+ if (VALID_X(x1))
+ {
+ TXT_GotoXY(x1, y);
+ PutUnicodeChar(c);
+ }
+
+ x1 += 1;
+ }
+ }
+
+ TXT_GotoXY(x + TXT_UTF8_Strlen(s), y);
+}
+
void TXT_DrawHorizScrollbar(int x, int y, int w, int cursor, int range)
{
+ txt_saved_colors_t colors;
int x1;
int cursor_x;
@@ -261,6 +375,7 @@ void TXT_DrawHorizScrollbar(int x, int y, int w, int cursor, int range)
return;
}
+ TXT_SaveColors(&colors);
TXT_FGColor(TXT_COLOR_BLACK);
TXT_BGColor(TXT_COLOR_GREY, 0);
@@ -269,9 +384,9 @@ void TXT_DrawHorizScrollbar(int x, int y, int w, int cursor, int range)
cursor_x = x + 1;
- if (range > 1)
+ if (range > 0)
{
- cursor_x += (cursor * (w - 3)) / (range - 1);
+ cursor_x += (cursor * (w - 3)) / range;
}
if (cursor_x > x + w - 2)
@@ -295,10 +410,12 @@ void TXT_DrawHorizScrollbar(int x, int y, int w, int cursor, int range)
}
TXT_PutChar('\x1a');
+ TXT_RestoreColors(&colors);
}
void TXT_DrawVertScrollbar(int x, int y, int h, int cursor, int range)
{
+ txt_saved_colors_t colors;
int y1;
int cursor_y;
@@ -307,6 +424,7 @@ void TXT_DrawVertScrollbar(int x, int y, int h, int cursor, int range)
return;
}
+ TXT_SaveColors(&colors);
TXT_FGColor(TXT_COLOR_BLACK);
TXT_BGColor(TXT_COLOR_GREY, 0);
@@ -320,9 +438,9 @@ void TXT_DrawVertScrollbar(int x, int y, int h, int cursor, int range)
cursor_y = y + h - 2;
}
- if (range > 1)
+ if (range > 0)
{
- cursor_y += (cursor * (h - 3)) / (range - 1);
+ cursor_y += (cursor * (h - 3)) / range;
}
for (y1=y+1; y1<y+h-1; ++y1)
@@ -344,6 +462,7 @@ void TXT_DrawVertScrollbar(int x, int y, int h, int cursor, int range)
TXT_GotoXY(x, y + h - 1);
TXT_PutChar('\x19');
+ TXT_RestoreColors(&colors);
}
void TXT_InitClipArea(void)