CGraphicText, CGraphicFontTexture and CGraphicDib are the 40250 bodies verbatim; CGraphicTextInstance is verbatim except that its D3D draws become UI render commands (one image quad per glyph, Bar for cursor/underline). - platform/Win32Gdi.cpp: the GDI subset those files call, over vendored FreeType 2.13.3, following GDI's LOGFONT cell height, win metrics and gasp rules; system font lookup with substitute and CJK fallback faces - Win32Crt: MultiByteToWideChar / WideCharToMultiByte (UTF-8 and 1252 by hand, other code pages through iconv) - CGraphicImageTexture memory textures: glyph pages reach Godot as "mem:<id>@<revision>"; Metin2PythonHost.memory_texture + Canvas cache - Util.cpp code page / font face table, SetDefaultCodePage at boot, DefaultFont_* block, fnt resource type, GetMaxTextureWidth/Height - TextTag, StringCodec, Arabic, Vietnamese copied from 40250 - tests: port.text (Tahoma 12 metrics, alignment, CP949), port.app_loop and python_host_test.gd now check glyph quads instead of text commands Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
110 lines
2.2 KiB
C++
110 lines
2.2 KiB
C++
// 40250 EterLib/Util.cpp:140-297, the default code page and font face.
|
|
//
|
|
// The rest of Util.cpp (LoadTextData / base64 / TokenTo*) is logic and not here. The 9x face table has
|
|
// CP949/Shift-JIS/GBK/Big5 literals, so this block is copied by hand instead of port_copy.
|
|
#include "EterLib/StdAfx.h"
|
|
#include "EterLib/Util.h"
|
|
#include "EterLocale/CodePageId.h"
|
|
|
|
static std::string gs_fontFace="";
|
|
static DWORD gs_codePage=0;
|
|
|
|
int GetCharsetFromCodePage(WORD codePage)
|
|
{
|
|
switch( codePage )
|
|
{
|
|
case CP_932:
|
|
return SHIFTJIS_CHARSET;
|
|
case CP_949:
|
|
return HANGUL_CHARSET;
|
|
case CP_936:
|
|
return GB2312_CHARSET;
|
|
case CP_950:
|
|
return CHINESEBIG5_CHARSET;
|
|
case CP_1253:
|
|
return GREEK_CHARSET;
|
|
case CP_1254:
|
|
return TURKISH_CHARSET;
|
|
case CP_1255:
|
|
return HEBREW_CHARSET;
|
|
case CP_1256:
|
|
return ARABIC_CHARSET;
|
|
case CP_1257:
|
|
return BALTIC_CHARSET;
|
|
case CP_1258:
|
|
return VIETNAMESE_CHARSET;
|
|
case CP_874:
|
|
return THAI_CHARSET;
|
|
case CP_1250:
|
|
return EASTEUROPE_CHARSET;
|
|
case CP_1251:
|
|
return RUSSIAN_CHARSET;
|
|
default:
|
|
return DEFAULT_CHARSET;
|
|
}
|
|
}
|
|
|
|
|
|
const char* GetFontFaceFromCodePageNT(WORD codePage)
|
|
{
|
|
switch( codePage )
|
|
{
|
|
case CP_932:
|
|
return "MS PGothic";
|
|
case CP_949:
|
|
return "GulimChe";
|
|
case CP_936:
|
|
return "SimSun";
|
|
case CP_950:
|
|
return "MingLiU";
|
|
case CP_874:
|
|
return "Tahoma";
|
|
case CP_1252:
|
|
return "Arial";
|
|
case CP_1256:
|
|
return "Tahoma";
|
|
case CP_1258:
|
|
return "Tahoma";
|
|
case CP_65001:
|
|
return "Arial";
|
|
default:
|
|
return "Arial";
|
|
}
|
|
}
|
|
|
|
DWORD GetDefaultCodePage()
|
|
{
|
|
return gs_codePage;
|
|
}
|
|
|
|
const char * GetDefaultFontFace()
|
|
{
|
|
return gs_fontFace.c_str();
|
|
}
|
|
|
|
// PORT: 40250 asks EnumFontFamiliesEx for the 9x (native-script) face name, then the NT one. The native
|
|
// names never match a font file here; CreateFontIndirect (platform/Win32Gdi.cpp) substitutes a missing
|
|
// face, so the NT name is the answer.
|
|
const char* GetFontFaceFromCodePage(WORD codePage)
|
|
{
|
|
return GetFontFaceFromCodePageNT(codePage);
|
|
}
|
|
|
|
void SetDefaultFontFace(const char* fontFace)
|
|
{
|
|
gs_fontFace=fontFace;
|
|
}
|
|
|
|
bool SetDefaultCodePage(DWORD codePage)
|
|
{
|
|
gs_codePage=codePage;
|
|
|
|
std::string fontFace=GetFontFaceFromCodePage(codePage);
|
|
if (fontFace.empty())
|
|
return false;
|
|
|
|
SetDefaultFontFace(fontFace.c_str());
|
|
|
|
return true;
|
|
}
|