Skip to content

Commit

Permalink
Add font index, support font family variants depending on language
Browse files Browse the repository at this point in the history
Add `fonts/index.json` which specifies:

- List of all font files that should be loaded (filenames).
- Default font (specified by family name or by family and style name).
- Font variants for different languages, using the name of the language file as key.
- Fallback fonts.
- Icon font.

There are characters (e.g. all in `刃直海角骨入`) that look different depending on the language of the content being Japanese, Simplified Chinese, Traditional Chinese and Hangul, because Unicode uses the same codepoint for characters regardless of the language. To render these characters correctly, the active variant font is switched depending on the selected language.

The `ITextRender` interface is changed so the current language variant can be set using `SetFontLanguageVariant` and the default and icon fonts can be toggled using `SetFontPreset`.

The text render is restructured: The font faces and font atlas are now managed by a separate class `CGlyphAtlas` like on upstream.

The font files are also updated:

- Update Source Han Sans to version 2.001.
- Update Glow Sans Japanese Compressed to version 0.93.
- Update Deja Vu Sans to version 2.37.
- Update Font Awesome icons font to March 2023 version.

Closes 6881.
  • Loading branch information
Robyt3 committed Jul 30, 2023
1 parent 210a2a8 commit c856a13
Show file tree
Hide file tree
Showing 24 changed files with 1,043 additions and 882 deletions.
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,6 @@ tags
*.exe
*.fifo
*.filters
*.json
*.lnk
*.log
*.opensdf
Expand Down
9 changes: 5 additions & 4 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1451,9 +1451,10 @@ set(EXPECTED_DATA
emoticons.png
extras.png
fonts/DejaVuSans.ttf
fonts/GlowSansJCompressed-Book.otf
fonts/Icons.otf
fonts/SourceHanSansSC-Regular.otf
fonts/Font_Awesome_6_Free-Solid-900.otf
fonts/GlowSansJ-Compressed-Book.otf
fonts/SourceHanSans.ttc
fonts/index.json
game.png
gui_buttons.png
gui_cursor.png
Expand Down Expand Up @@ -1731,7 +1732,7 @@ set(EXPECTED_DATA
wordlist.txt
)

set_glob(DATA GLOB_RECURSE "cfg;frag;json;map;otf;png;rules;ttf;txt;vert;wv" data ${EXPECTED_DATA})
set_glob(DATA GLOB_RECURSE "cfg;frag;json;map;otf;png;rules;ttc;ttf;txt;vert;wv" data ${EXPECTED_DATA})

########################################################################
# COPY DATA AND SHARED LIBS
Expand Down
Binary file modified data/fonts/DejaVuSans.ttf
Binary file not shown.
Binary file added data/fonts/Font_Awesome_6_Free-Solid-900.otf
Binary file not shown.
Binary file added data/fonts/GlowSansJ-Compressed-Book.otf
Binary file not shown.
Binary file removed data/fonts/GlowSansJCompressed-Book.otf
Binary file not shown.
Binary file removed data/fonts/Icons.otf
Binary file not shown.
Binary file not shown.
19 changes: 19 additions & 0 deletions data/fonts/index.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"font files": [
"DejaVuSans.ttf",
"Font_Awesome_6_Free-Solid-900.otf",
"GlowSansJ-Compressed-Book.otf",
"SourceHanSans.ttc"
],
"default": "DejaVu Sans",
"language variants": {
"japanese": "Glow Sans J Compressed Book",
"korean": "Source Han Sans K",
"simplified_chinese": "Source Han Sans SC",
"traditional_chinese": "Source Han Sans TC"
},
"fallbacks": [
"Source Han Sans"
],
"icon": "Font Awesome 6 Free"
}
1 change: 0 additions & 1 deletion src/engine/client.h
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,6 @@ class IClient : public IInterface
virtual void SwitchWindowScreen(int Index) = 0;
virtual void SetWindowParams(int FullscreenMode, bool IsBorderless, bool AllowResizing) = 0;
virtual void ToggleWindowVSync() = 0;
virtual void LoadFont() = 0;
virtual void Notify(const char *pTitle, const char *pMessage) = 0;

virtual void UpdateAndSwap() = 0;
Expand Down
63 changes: 6 additions & 57 deletions src/engine/client/client.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3035,8 +3035,9 @@ void CClient::Run()
}
#endif

// init font rendering
Kernel()->RequestInterface<IEngineTextRender>()->Init();
// init text render
IEngineTextRender *pTextRender = Kernel()->RequestInterface<IEngineTextRender>();
pTextRender->Init();

// init the input
Input()->Init();
Expand Down Expand Up @@ -3393,6 +3394,9 @@ void CClient::Run()
m_aNetClient[i].Close();

delete m_pEditor;

// shutdown text render while graphics are still available
pTextRender->Shutdown();
}

bool CClient::InitNetworkClient(char *pError, size_t ErrorSize)
Expand Down Expand Up @@ -4272,61 +4276,6 @@ void CClient::ToggleWindowVSync()
g_Config.m_GfxVsync ^= 1;
}

void CClient::LoadFont()
{
static CFont *pDefaultFont = 0;
char aFilename[IO_MAX_PATH_LENGTH];
char aBuff[1024];
const char *pFontFile = "fonts/DejaVuSans.ttf";
const char *apFallbackFontFiles[] =
{
"fonts/GlowSansJCompressed-Book.otf",
"fonts/SourceHanSansSC-Regular.otf",
};
IOHANDLE File = Storage()->OpenFile(pFontFile, IOFLAG_READ, IStorage::TYPE_ALL, aFilename, sizeof(aFilename));
if(File)
{
IEngineTextRender *pTextRender = Kernel()->RequestInterface<IEngineTextRender>();
pDefaultFont = pTextRender->GetFont(aFilename);
if(pDefaultFont == NULL)
{
void *pBuf;
unsigned Size;
io_read_all(File, &pBuf, &Size);
pDefaultFont = pTextRender->LoadFont(aFilename, (unsigned char *)pBuf, Size);
}
io_close(File);

for(auto &pFallbackFontFile : apFallbackFontFiles)
{
bool FontLoaded = false;
File = Storage()->OpenFile(pFallbackFontFile, IOFLAG_READ, IStorage::TYPE_ALL, aFilename, sizeof(aFilename));
if(File)
{
void *pBuf;
unsigned Size;
io_read_all(File, &pBuf, &Size);
io_close(File);
FontLoaded = pTextRender->LoadFallbackFont(pDefaultFont, aFilename, (unsigned char *)pBuf, Size);
}

if(!FontLoaded)
{
str_format(aBuff, std::size(aBuff), "failed to load the fallback font. filename='%s'", pFallbackFontFile);
m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "gameclient", aBuff);
}
}

pTextRender->SetDefaultFont(pDefaultFont);
}

if(!pDefaultFont)
{
str_format(aBuff, std::size(aBuff), "failed to load font. filename='%s'", pFontFile);
m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "gameclient", aBuff);
}
}

void CClient::Notify(const char *pTitle, const char *pMessage)
{
if(m_pGraphics->WindowActive() || !g_Config.m_ClShowNotifications)
Expand Down
1 change: 0 additions & 1 deletion src/engine/client/client.h
Original file line number Diff line number Diff line change
Expand Up @@ -506,7 +506,6 @@ class CClient : public IClient, public CDemoPlayer::IListener
void SwitchWindowScreen(int Index) override;
void SetWindowParams(int FullscreenMode, bool IsBorderless, bool AllowResizing) override;
void ToggleWindowVSync() override;
void LoadFont() override;
void Notify(const char *pTitle, const char *pMessage) override;
void BenchmarkQuit(int Seconds, const char *pFilename);

Expand Down
Loading

0 comments on commit c856a13

Please sign in to comment.