From 4ace9f8030cdf24e5e7037856930b5e322168994 Mon Sep 17 00:00:00 2001 From: nillerusr Date: Sun, 18 Sep 2022 19:54:29 +0300 Subject: [PATCH] game(client): fix touch drawing problems again, fix some fonts on android --- game/client/touch.cpp | 17 ++++-- vgui2/vgui_surfacelib/linuxfont.cpp | 85 ++++++++++++++--------------- 2 files changed, 53 insertions(+), 49 deletions(-) diff --git a/game/client/touch.cpp b/game/client/touch.cpp index 86b55d37..9018c304 100644 --- a/game/client/touch.cpp +++ b/game/client/touch.cpp @@ -441,6 +441,8 @@ void CTouchControls::CreateAtlasTexture() if( touchTextureID ) vgui::surface()->DeleteTextureByID( touchTextureID ); + int rectCount = 0; + for( int i = 0; i < textureList.Count(); i++ ) { CTouchTexture *t = textureList[i]; @@ -494,8 +496,9 @@ void CTouchControls::CreateAtlasTexture() continue; } - rects[i].h = t->height; - rects[i].w = t->width; + rects[rectCount].h = t->height; + rects[rectCount].w = t->width; + rectCount++; } if( !textureList.Count() ) @@ -512,27 +515,29 @@ void CTouchControls::CreateAtlasTexture() stbrp_context context; stbrp_init_target( &context, atlasHeight, atlasHeight, nodes, nodesCount ); - stbrp_pack_rects(&context, rects, textureList.Count()); + stbrp_pack_rects(&context, rects, rectCount); + rectCount = 0; for( int i = 0; i < textureList.Count(); i++ ) { CTouchTexture *t = textureList[i]; if( t->textureID ) continue; - t->X0 = rects[i].x / (float)atlasHeight; - t->Y0 = rects[i].y / (float)atlasHeight; + t->X0 = rects[rectCount].x / (float)atlasHeight; + t->Y0 = rects[rectCount].y / (float)atlasHeight; t->X1 = t->X0 + t->width / (float)atlasHeight; t->Y1 = t->Y0 + t->height / (float)atlasHeight; unsigned char *src = t->vtf->ImageData(0, 0, 0); for( int row = 0; row < t->height; row++) { - unsigned char *row_dest = dest+(row+rects[i].y)*atlasHeight*4+rects[i].x*4; + unsigned char *row_dest = dest+(row+rects[rectCount].y)*atlasHeight*4+rects[rectCount].x*4; unsigned char *row_src = src+row*t->height*4; memcpy(row_dest, row_src, t->height*4); } + rectCount++; DestroyVTFTexture(t->vtf); } diff --git a/vgui2/vgui_surfacelib/linuxfont.cpp b/vgui2/vgui_surfacelib/linuxfont.cpp index 8ee1b2fe..aada7b4a 100644 --- a/vgui2/vgui_surfacelib/linuxfont.cpp +++ b/vgui2/vgui_surfacelib/linuxfont.cpp @@ -405,25 +405,44 @@ bool CLinuxFont::CreateFromMemory(const char *windowsFontName, void *data, int d return true; } +#include "tier1/convar.h" +ConVar cl_language( "cl_language", "english", FCVAR_USERINFO, "Language (from HKCU\\Software\\Valve\\Steam\\Language)" ); + #if !HAVE_FC char *TryFindFont(const char *winFontName, bool bBold, int italic) { static char fontFile[MAX_PATH]; - const char *fontName, *fontNamePost; + const char *fontName, *fontNamePost = NULL; #ifdef ANDROID + const char *lang = cl_language.GetString(); + if( strcmp( winFontName, "Courier New") == 0 ) + { fontName = "LiberationMono-Regular.ttf"; - else - fontName = "DroidSansFallback.ttf"; // for chinese/japanese/korean + snprintf( fontFile, sizeof fontFile, "%s/files/%s", getenv("APP_DATA_PATH"), fontName); + return fontFile; + } - snprintf( fontFile, sizeof fontFile, "%s/files/%s", getenv("APP_DATA_PATH"), fontName); -#else - // "platform/resource/linux_fonts/"; + if( strcmp(lang, "japanese") == 0 || + strcmp(lang, "koreana") == 0 || + strcmp(lang, "korean") == 0 || + strcmp(lang, "tchinese") == 0 || + strcmp(lang, "schinese") == 0 ) + { + fontName = "DroidSansFallback.ttf"; // for chinese/japanese/korean + snprintf( fontFile, sizeof fontFile, "%s/files/%s", getenv("APP_DATA_PATH"), fontName); + return fontFile; + } + else if( strcmp(lang, "thai") == 0 ) + { + fontName = "Itim-Regular.otf"; + snprintf( fontFile, sizeof fontFile, "%s/files/%s", getenv("APP_DATA_PATH"), fontName); + return fontFile; + } - if( strcmp( winFontName, "Courier New") == 0 ) - fontName = "liberationmono"; + fontName = "dejavusans"; if( bBold ) { @@ -434,54 +453,34 @@ char *TryFindFont(const char *winFontName, bool bBold, int italic) } else if( italic ) fontNamePost = "oblique"; + + if( fontNamePost ) + snprintf(fontFile, sizeof fontFile, "%s/files/%s-%s.ttf", getenv("APP_DATA_PATH"), fontName, fontNamePost); else - fontNamePost = "regular"; + snprintf(fontFile, sizeof fontFile, "%s/files/%s.ttf", getenv("APP_DATA_PATH"), fontName); - snprintf(fontFile, sizeof fontFile, "platform/resource/linux_fonts/%s-%s.ttf", fontName, fontNamePost); -#endif - return fontFile; -#if 0 // Old detect - const char *fontFileName, *fontFileNamePost = NULL; + return fontFile; +#else + // "platform/resource/linux_fonts/"; - fontFileName = "Roboto"; + if( strcmp( winFontName, "Courier New") == 0 ) + fontName = "liberationmono"; if( bBold ) { if( italic ) - fontFileNamePost = "BoldItalic"; + fontNamePost = "boldoblique"; else - fontFileNamePost = "Bold"; + fontNamePost = "bold"; } else if( italic ) - fontFileNamePost = "Italic"; - else - fontFileNamePost = "Regular"; - - static char dataFile[MAX_PATH]; - - if( fontFileNamePost ) - snprintf( dataFile, sizeof dataFile, "/system/fonts/%s-%s.ttf", fontFileName, fontFileNamePost ); + fontNamePost = "oblique"; else - snprintf( dataFile, sizeof dataFile, "/system/fonts/%s.ttf", fontFileName ); - - if( access( dataFile, R_OK ) != 0 ) - { - fontFileNamePost = NULL; - fontFileName = "DroidSans"; - if( bBold ) - fontFileNamePost = "Bold"; - - if( fontFileNamePost ) - snprintf( dataFile, sizeof dataFile, "/system/fonts/%s-%s.ttf", fontFileName, fontFileNamePost ); - else - snprintf( dataFile, sizeof dataFile, "/system/fonts/%s.ttf", fontFileName ); - - if( access( dataFile, R_OK ) != 0 ) - return NULL; - } + fontNamePost = "regular"; - return dataFile; + snprintf(fontFile, sizeof fontFile, "platform/resource/linux_fonts/%s-%s.ttf", fontName, fontNamePost); + return fontFile; #endif } #endif