Enforced the inclusion of windows headers before nethack headers.
Moved the code page 437 mapping table to winnt.c so that it could be used in window and console clients. Added check that fonts support unicode values we use from code page 437. Use unicode to draw text if font supports it otherwise use ASCII.
This commit is contained in:
@@ -5,6 +5,10 @@
|
||||
|
||||
/* main.c - MSDOS, OS/2, ST, Amiga, and Windows NetHack */
|
||||
|
||||
#ifdef WIN32
|
||||
#include "win32api.h" /* for GetModuleFileName */
|
||||
#endif
|
||||
|
||||
#include "hack.h"
|
||||
#include "dlb.h"
|
||||
|
||||
@@ -22,10 +26,6 @@
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef WIN32
|
||||
#include "win32api.h" /* for GetModuleFileName */
|
||||
#endif
|
||||
|
||||
#ifdef __DJGPP__
|
||||
#include <unistd.h> /* for getcwd() prototype */
|
||||
#endif
|
||||
|
||||
@@ -13,9 +13,9 @@
|
||||
static char where_to_get_source[] = "http://www.nethack.org/";
|
||||
static char author[] = "The NetHack Development Team";
|
||||
|
||||
#include "win32api.h"
|
||||
#include "hack.h"
|
||||
#include "wintty.h"
|
||||
#include "win32api.h"
|
||||
|
||||
extern HANDLE hConIn;
|
||||
extern INPUT_RECORD ir;
|
||||
|
||||
@@ -19,9 +19,9 @@
|
||||
static char where_to_get_source[] = "http://www.nethack.org/";
|
||||
static char author[] = "The NetHack Development Team";
|
||||
|
||||
#include "win32api.h"
|
||||
#include "hack.h"
|
||||
#include "wintty.h"
|
||||
#include "win32api.h"
|
||||
|
||||
extern HANDLE hConIn;
|
||||
extern INPUT_RECORD ir;
|
||||
|
||||
@@ -160,9 +160,9 @@
|
||||
static char where_to_get_source[] = "http://www.nethack.org/";
|
||||
static char author[] = "Ray Chason";
|
||||
|
||||
#include "win32api.h"
|
||||
#include "hack.h"
|
||||
#include "wintty.h"
|
||||
#include "win32api.h"
|
||||
|
||||
extern HANDLE hConIn;
|
||||
extern INPUT_RECORD ir;
|
||||
|
||||
@@ -10,8 +10,8 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include "hack.h"
|
||||
#include "win32api.h"
|
||||
#include "hack.h"
|
||||
#include <mmsystem.h>
|
||||
|
||||
#ifdef USER_SOUNDS
|
||||
|
||||
@@ -16,11 +16,12 @@
|
||||
|
||||
#ifdef WIN32
|
||||
#define NEED_VARARGS /* Uses ... */
|
||||
#include "win32api.h"
|
||||
#include "winos.h"
|
||||
#include "hack.h"
|
||||
#include "wintty.h"
|
||||
#include <sys\types.h>
|
||||
#include <sys\stat.h>
|
||||
#include "win32api.h"
|
||||
|
||||
extern boolean getreturn_enabled; /* from sys/share/pcsys.c */
|
||||
extern int redirect_stdout;
|
||||
@@ -569,6 +570,9 @@ char ch;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
||||
// Temporary fix. Tty putstatusfield()
|
||||
|
||||
inverse = (console.current_nhattr[ATR_INVERSE] && iflags.wc_inverse);
|
||||
console.attr = (inverse) ?
|
||||
ttycolors_inv[console.current_nhcolor] :
|
||||
@@ -601,42 +605,6 @@ char ch;
|
||||
* for win32. It is used for glyphs only, not text.
|
||||
*/
|
||||
|
||||
/* CP437 to Unicode mapping according to the Unicode Consortium */
|
||||
static const WCHAR cp437[] = {
|
||||
0x0020, 0x263A, 0x263B, 0x2665, 0x2666, 0x2663, 0x2660, 0x2022,
|
||||
0x25D8, 0x25CB, 0x25D9, 0x2642, 0x2640, 0x266A, 0x266B, 0x263C,
|
||||
0x25BA, 0x25C4, 0x2195, 0x203C, 0x00B6, 0x00A7, 0x25AC, 0x21A8,
|
||||
0x2191, 0x2193, 0x2192, 0x2190, 0x221F, 0x2194, 0x25B2, 0x25BC,
|
||||
0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
|
||||
0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
|
||||
0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
|
||||
0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
|
||||
0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
|
||||
0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
|
||||
0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
|
||||
0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
|
||||
0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
|
||||
0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
|
||||
0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
|
||||
0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x2302,
|
||||
0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7,
|
||||
0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x00ec, 0x00c4, 0x00c5,
|
||||
0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9,
|
||||
0x00ff, 0x00d6, 0x00dc, 0x00a2, 0x00a3, 0x00a5, 0x20a7, 0x0192,
|
||||
0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00aa, 0x00ba,
|
||||
0x00bf, 0x2310, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb,
|
||||
0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556,
|
||||
0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510,
|
||||
0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f,
|
||||
0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567,
|
||||
0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b,
|
||||
0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580,
|
||||
0x03b1, 0x00df, 0x0393, 0x03c0, 0x03a3, 0x03c3, 0x00b5, 0x03c4,
|
||||
0x03a6, 0x0398, 0x03a9, 0x03b4, 0x221e, 0x03c6, 0x03b5, 0x2229,
|
||||
0x2261, 0x00b1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00f7, 0x2248,
|
||||
0x00b0, 0x2219, 0x00b7, 0x221a, 0x207f, 0x00b2, 0x25a0, 0x00a0
|
||||
};
|
||||
|
||||
void
|
||||
g_putch(in_ch)
|
||||
int in_ch;
|
||||
@@ -1690,12 +1658,17 @@ void set_cp_map()
|
||||
if (console.has_unicode) {
|
||||
UINT codePage = GetConsoleOutputCP();
|
||||
|
||||
for (int i = 0; i < 256; i++) {
|
||||
char c = (char)i;
|
||||
int count = MultiByteToWideChar(codePage, 0, &c, 1,
|
||||
&console.cpMap[i], 1);
|
||||
ntassert(count == 1);
|
||||
if (codePage == 437) {
|
||||
memcpy(console.cpMap, cp437, sizeof(console.cpMap));
|
||||
} else {
|
||||
for (int i = 0; i < 256; i++) {
|
||||
char c = (char)i;
|
||||
int count = MultiByteToWideChar(codePage, 0, &c, 1,
|
||||
&console.cpMap[i], 1);
|
||||
ntassert(count == 1);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
/* Copyright (c) 2015 by Michael Allison */
|
||||
/* NetHack may be freely redistributed. See license for details. */
|
||||
|
||||
#include "win32api.h"
|
||||
#include "hack.h"
|
||||
|
||||
#ifdef GUISTUB
|
||||
@@ -52,9 +53,6 @@ char *argv[];
|
||||
|
||||
#ifdef TTYSTUB
|
||||
|
||||
#include "hack.h"
|
||||
#include "win32api.h"
|
||||
|
||||
HANDLE hConIn;
|
||||
HANDLE hConOut;
|
||||
int GUILaunched;
|
||||
|
||||
@@ -7,22 +7,36 @@
|
||||
* header files & NetHack before including windows.h, so all NetHack
|
||||
* files should include "win32api.h" rather than <windows.h>.
|
||||
*/
|
||||
#ifndef WIN32API
|
||||
#define WIN32API
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
#undef strcmpi
|
||||
#undef min
|
||||
#undef max
|
||||
#pragma warning(disable : 4142) /* Warning, Benign redefinition of type */
|
||||
#pragma pack(8)
|
||||
|
||||
#if defined(HACK_H)
|
||||
#error win32api.h must be included before hack.h
|
||||
#endif
|
||||
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#if defined(strcmpi)
|
||||
#error win32api.h should be included first
|
||||
#endif
|
||||
|
||||
#undef Protection /* We have a global name space collision. No source file
|
||||
using win32api.h should be using the Protection macro
|
||||
from youprop.h.
|
||||
A better fix would be to ensure we include all window
|
||||
header files before we start clobbering the global name
|
||||
space with NetHack specific macros. */
|
||||
#if defined(min)
|
||||
#error win32api.h should be included first
|
||||
#endif
|
||||
|
||||
#if defined(max)
|
||||
#error win32api.h should be included first
|
||||
#endif
|
||||
|
||||
#if defined(Protection)
|
||||
#error win32api.h should be included first
|
||||
#endif
|
||||
|
||||
#pragma warning(disable : 4142) /* Warning, Benign redefinition of type */
|
||||
#pragma pack(8)
|
||||
#endif // _MSC_VER
|
||||
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
|
||||
#include <windows.h>
|
||||
#include <commctrl.h>
|
||||
@@ -31,4 +45,6 @@
|
||||
#pragma pack()
|
||||
#endif
|
||||
|
||||
#endif // WIN32API
|
||||
|
||||
/*win32api.h*/
|
||||
|
||||
@@ -11,6 +11,8 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include "winos.h"
|
||||
|
||||
#define NEED_VARARGS
|
||||
#include "hack.h"
|
||||
#include <dos.h>
|
||||
@@ -18,7 +20,6 @@
|
||||
#include <direct.h>
|
||||
#endif
|
||||
#include <ctype.h>
|
||||
#include "win32api.h"
|
||||
#ifdef TTY_GRAPHICS
|
||||
#include "wintty.h"
|
||||
#endif
|
||||
@@ -491,6 +492,95 @@ void nethack_enter_winnt()
|
||||
nethack_enter_nttty();
|
||||
#endif
|
||||
}
|
||||
|
||||
/* CP437 to Unicode mapping according to the Unicode Consortium */
|
||||
const WCHAR cp437[256] = {
|
||||
0x0020, 0x263A, 0x263B, 0x2665, 0x2666, 0x2663, 0x2660, 0x2022,
|
||||
0x25D8, 0x25CB, 0x25D9, 0x2642, 0x2640, 0x266A, 0x266B, 0x263C,
|
||||
0x25BA, 0x25C4, 0x2195, 0x203C, 0x00B6, 0x00A7, 0x25AC, 0x21A8,
|
||||
0x2191, 0x2193, 0x2192, 0x2190, 0x221F, 0x2194, 0x25B2, 0x25BC,
|
||||
0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
|
||||
0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
|
||||
0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
|
||||
0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
|
||||
0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
|
||||
0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
|
||||
0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
|
||||
0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
|
||||
0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
|
||||
0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
|
||||
0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
|
||||
0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x2302,
|
||||
0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7,
|
||||
0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x00ec, 0x00c4, 0x00c5,
|
||||
0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9,
|
||||
0x00ff, 0x00d6, 0x00dc, 0x00a2, 0x00a3, 0x00a5, 0x20a7, 0x0192,
|
||||
0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00aa, 0x00ba,
|
||||
0x00bf, 0x2310, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb,
|
||||
0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556,
|
||||
0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510,
|
||||
0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f,
|
||||
0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567,
|
||||
0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b,
|
||||
0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580,
|
||||
0x03b1, 0x00df, 0x0393, 0x03c0, 0x03a3, 0x03c3, 0x00b5, 0x03c4,
|
||||
0x03a6, 0x0398, 0x03a9, 0x03b4, 0x221e, 0x03c6, 0x03b5, 0x2229,
|
||||
0x2261, 0x00b1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00f7, 0x2248,
|
||||
0x00b0, 0x2219, 0x00b7, 0x221a, 0x207f, 0x00b2, 0x25a0, 0x00a0
|
||||
};
|
||||
|
||||
WCHAR *
|
||||
winos_ascii_to_wide_str(const unsigned char * src, WCHAR * dst, size_t dstLength)
|
||||
{
|
||||
size_t i = 0;
|
||||
while(i < dstLength - 1 && src[i] != 0)
|
||||
dst[i++] = cp437[src[i]];
|
||||
dst[i] = 0;
|
||||
return dst;
|
||||
}
|
||||
|
||||
WCHAR
|
||||
winos_ascii_to_wide(const unsigned char c)
|
||||
{
|
||||
return cp437[c];
|
||||
}
|
||||
|
||||
BOOL winos_font_support_cp437(HFONT hFont)
|
||||
{
|
||||
BOOL allFound = FALSE;
|
||||
HDC hdc = GetDC(NULL);
|
||||
HFONT oldFont = SelectObject(hdc, hFont);
|
||||
|
||||
DWORD size = GetFontUnicodeRanges(hdc, NULL);
|
||||
GLYPHSET *glyphSet = (GLYPHSET *) malloc(size);
|
||||
|
||||
if (glyphSet != NULL) {
|
||||
GetFontUnicodeRanges(hdc, glyphSet);
|
||||
|
||||
allFound = TRUE;
|
||||
for (int i = 0; i < 256 && allFound; i++) {
|
||||
WCHAR wc = cp437[i];
|
||||
BOOL found = FALSE;
|
||||
for (DWORD j = 0; j < glyphSet->cRanges && !found; j++) {
|
||||
WCHAR first = glyphSet->ranges[j].wcLow;
|
||||
WCHAR last = first + glyphSet->ranges[j].cGlyphs - 1;
|
||||
|
||||
if (wc >= first && wc <= last)
|
||||
found = TRUE;
|
||||
}
|
||||
if (!found)
|
||||
allFound = FALSE;
|
||||
}
|
||||
|
||||
free(glyphSet);
|
||||
}
|
||||
|
||||
SelectObject(hdc, oldFont);
|
||||
ReleaseDC(NULL, hdc);
|
||||
|
||||
return allFound;
|
||||
}
|
||||
|
||||
#endif /* WIN32 */
|
||||
|
||||
/*winnt.c*/
|
||||
/*winnt.c*/
|
||||
20
sys/winnt/winos.h
Normal file
20
sys/winnt/winos.h
Normal file
@@ -0,0 +1,20 @@
|
||||
/* NetHack 3.6 winos.h $NHDT-Date: 1524321419 2018/04/21 14:36:59 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.30 $ */
|
||||
/* Copyright (c) NetHack PC Development Team 2018 */
|
||||
/* NetHack may be freely redistributed. See license for details. */
|
||||
|
||||
#ifndef WINOS_H
|
||||
#define WINOS_H
|
||||
|
||||
#include "win32api.h"
|
||||
|
||||
extern const WCHAR cp437[256];
|
||||
|
||||
WCHAR *
|
||||
winos_ascii_to_wide_str(const unsigned char * src, WCHAR * dst, size_t dstLength);
|
||||
|
||||
WCHAR
|
||||
winos_ascii_to_wide(const unsigned char c);
|
||||
|
||||
BOOL winos_font_support_cp437(HFONT hFont);
|
||||
|
||||
#endif // WINOS_H
|
||||
Reference in New Issue
Block a user