Index: core/src/fxge/win32/fx_win32_device.cpp |
diff --git a/core/src/fxge/win32/fx_win32_device.cpp b/core/src/fxge/win32/fx_win32_device.cpp |
index 2db35f7f68bd2801af3ef85cbc1cb8859343005a..a40e79bde7b772e8bfc538b0a8770d407445325b 100644 |
--- a/core/src/fxge/win32/fx_win32_device.cpp |
+++ b/core/src/fxge/win32/fx_win32_device.cpp |
@@ -18,6 +18,15 @@ |
#include "dwrite_int.h" |
#include "win32_int.h" |
+class CFX_Win32FallbackFontInfo final : public CFX_FolderFontInfo { |
+ public: |
+ void* MapFont(int weight, |
+ FX_BOOL bItalic, |
+ int charset, |
+ int pitch_family, |
+ const FX_CHAR* family, |
+ int& iExact) override; |
+}; |
class CFX_Win32FontInfo final : public IFX_SystemFontInfo { |
public: |
CFX_Win32FontInfo(); |
@@ -199,6 +208,29 @@ CFX_ByteString CFX_Win32FontInfo::FindFont(const CFX_ByteString& name) { |
} |
return CFX_ByteString(); |
} |
+void* CFX_Win32FallbackFontInfo::MapFont(int weight, |
+ FX_BOOL bItalic, |
+ int charset, |
+ int pitch_family, |
+ const FX_CHAR* cstr_face, |
+ int& iExact) { |
+ void* font = GetSubstFont(cstr_face); |
+ if (font) { |
+ iExact = 1; |
+ return font; |
+ } |
+ FX_BOOL bCJK = TRUE; |
+ switch (charset) { |
+ case FXFONT_SHIFTJIS_CHARSET: |
+ case FXFONT_GB2312_CHARSET: |
+ case FXFONT_CHINESEBIG5_CHARSET: |
+ case FXFONT_HANGEUL_CHARSET: |
+ default: |
+ bCJK = FALSE; |
+ break; |
+ } |
+ return FindFont(weight, bItalic, charset, pitch_family, cstr_face, !bCJK); |
+} |
struct _FontNameMap { |
const FX_CHAR* m_pSubFontName; |
const FX_CHAR* m_pSrcFontName; |
@@ -406,7 +438,24 @@ FX_BOOL CFX_Win32FontInfo::GetFontCharset(void* hFont, int& charset) { |
return TRUE; |
} |
IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault(const char** pUnused) { |
- return new CFX_Win32FontInfo; |
+ HDC hdc = ::GetDC(NULL); |
+ if (hdc) { |
+ ::ReleaseDC(NULL, hdc); |
+ return new CFX_Win32FontInfo; |
+ } |
+ // If GDI is disabled then GetDC for the desktop will fail. Select the |
+ // fallback font information class if GDI is disabled. |
+ CFX_Win32FallbackFontInfo* pInfoFallback = new CFX_Win32FallbackFontInfo; |
+ // Construct the font path manually, SHGetKnownFolderPath won't work under |
+ // a restrictive sandbox. |
+ CHAR windows_path[MAX_PATH] = {}; |
+ DWORD path_len = ::GetWindowsDirectoryA(windows_path, MAX_PATH); |
+ if (path_len > 0 && path_len < MAX_PATH) { |
+ CFX_ByteString fonts_path(windows_path); |
+ fonts_path += "\\Fonts"; |
+ pInfoFallback->AddPath(fonts_path); |
+ } |
+ return pInfoFallback; |
} |
void CFX_GEModule::InitPlatform() { |
CWin32Platform* pPlatformData = new CWin32Platform; |