diff --git a/Aerofoil/GpSystemServices_Win32.cpp b/Aerofoil/GpSystemServices_Win32.cpp index 46ce6fd..8758638 100644 --- a/Aerofoil/GpSystemServices_Win32.cpp +++ b/Aerofoil/GpSystemServices_Win32.cpp @@ -283,11 +283,6 @@ bool GpSystemServices_Win32::AreFontResourcesSeekable() const return true; } -bool GpSystemServices_Win32::IsUsingPreinstalledFonts() const -{ - return false; -} - IGpClipboardContents *GpSystemServices_Win32::GetClipboardContents() const { IGpClipboardContents *cbObject = nullptr; diff --git a/Aerofoil/GpSystemServices_Win32.h b/Aerofoil/GpSystemServices_Win32.h index 9afec5f..90b26b2 100644 --- a/Aerofoil/GpSystemServices_Win32.h +++ b/Aerofoil/GpSystemServices_Win32.h @@ -38,7 +38,6 @@ public: void SetTextInputEnabled(bool isEnabled) override; bool IsTextInputEnabled() const override; bool AreFontResourcesSeekable() const override; - bool IsUsingPreinstalledFonts() const override; IGpClipboardContents *GetClipboardContents() const override; void SetClipboardContents(IGpClipboardContents *contents) override; diff --git a/AerofoilAndroid/app/jni/main/GpSystemServices_Android.cpp b/AerofoilAndroid/app/jni/main/GpSystemServices_Android.cpp index 746a7e7..1cefa7e 100644 --- a/AerofoilAndroid/app/jni/main/GpSystemServices_Android.cpp +++ b/AerofoilAndroid/app/jni/main/GpSystemServices_Android.cpp @@ -104,11 +104,6 @@ bool GpSystemServices_Android::AreFontResourcesSeekable() const return false; } -bool GpSystemServices_Android::IsUsingPreinstalledFonts() const -{ - return false; -} - IGpClipboardContents *GpSystemServices_Android::GetClipboardContents() const { return nullptr; diff --git a/AerofoilAndroid/app/jni/main/GpSystemServices_Android.h b/AerofoilAndroid/app/jni/main/GpSystemServices_Android.h index 60780df..81c9985 100644 --- a/AerofoilAndroid/app/jni/main/GpSystemServices_Android.h +++ b/AerofoilAndroid/app/jni/main/GpSystemServices_Android.h @@ -19,7 +19,6 @@ public: void SetTextInputEnabled(bool isEnabled) override; bool IsTextInputEnabled() const override; bool AreFontResourcesSeekable() const override; - bool IsUsingPreinstalledFonts() const override; IGpClipboardContents *GetClipboardContents() const override; void SetClipboardContents(IGpClipboardContents *contents) override; diff --git a/AerofoilWeb/GpSystemServices_Web.cpp b/AerofoilWeb/GpSystemServices_Web.cpp index e457736..25f3147 100644 --- a/AerofoilWeb/GpSystemServices_Web.cpp +++ b/AerofoilWeb/GpSystemServices_Web.cpp @@ -185,11 +185,6 @@ bool GpSystemServices_Web::AreFontResourcesSeekable() const return true; } -bool GpSystemServices_Web::IsUsingPreinstalledFonts() const -{ - return false; -} - IGpClipboardContents *GpSystemServices_Web::GetClipboardContents() const { return m_clipboardContents; diff --git a/AerofoilWeb/GpSystemServices_Web.h b/AerofoilWeb/GpSystemServices_Web.h index a9d42aa..ebc7e5d 100644 --- a/AerofoilWeb/GpSystemServices_Web.h +++ b/AerofoilWeb/GpSystemServices_Web.h @@ -22,7 +22,6 @@ public: void SetTextInputEnabled(bool isEnabled) override; bool IsTextInputEnabled() const override; bool AreFontResourcesSeekable() const override; - bool IsUsingPreinstalledFonts() const override; IGpClipboardContents *GetClipboardContents() const override; void SetClipboardContents(IGpClipboardContents *contents) override; int64_t GetTime() const override; diff --git a/AerofoilX/GpSystemServices_X.cpp b/AerofoilX/GpSystemServices_X.cpp index 25c022d..ed1401a 100644 --- a/AerofoilX/GpSystemServices_X.cpp +++ b/AerofoilX/GpSystemServices_X.cpp @@ -113,11 +113,6 @@ bool GpSystemServices_X::AreFontResourcesSeekable() const return true; } -bool GpSystemServices_X::IsUsingPreinstalledFonts() const -{ - return false; -} - IGpClipboardContents *GpSystemServices_X::GetClipboardContents() const { return m_clipboardContents; diff --git a/AerofoilX/GpSystemServices_X.h b/AerofoilX/GpSystemServices_X.h index 4eecc5f..f9e9998 100644 --- a/AerofoilX/GpSystemServices_X.h +++ b/AerofoilX/GpSystemServices_X.h @@ -22,7 +22,6 @@ public: void SetTextInputEnabled(bool isEnabled) override; bool IsTextInputEnabled() const override; bool AreFontResourcesSeekable() const override; - bool IsUsingPreinstalledFonts() const override; IGpClipboardContents *GetClipboardContents() const override; void SetClipboardContents(IGpClipboardContents *contents) override; diff --git a/GenerateFonts/GenerateFonts.cpp b/GenerateFonts/GenerateFonts.cpp index 7534a47..38bf049 100644 --- a/GenerateFonts/GenerateFonts.cpp +++ b/GenerateFonts/GenerateFonts.cpp @@ -201,8 +201,10 @@ int toolMain(int argc, const char **argv) int variation = fontFamily->GetVariationForFlags(flags); PortabilityLayer::FontHacks hacks; + PortabilityLayer::VirtualDirectory_t vDir; const char *path = nullptr; - fontFamily->GetFontSpec(variation, hacks, path); + int typeFaceIndex = 0; + fontFamily->GetFontSpec(variation, hacks, vDir, path, typeFaceIndex); KnownFontSpec spec(path, size, aa, hacks); @@ -218,7 +220,7 @@ int toolMain(int argc, const char **argv) { PortabilityLayer::CFileStream stream(fontFile); - IGpFont *font = ft2Handler->LoadFont(&stream); + IGpFont *font = ft2Handler->LoadFont(&stream, typeFaceIndex); if (!ft2Handler->KeepStreamOpen()) stream.Close(); diff --git a/GpCommon/IGpFontHandler.h b/GpCommon/IGpFontHandler.h index c7cd345..f3007f6 100644 --- a/GpCommon/IGpFontHandler.h +++ b/GpCommon/IGpFontHandler.h @@ -7,6 +7,6 @@ struct IGpFontHandler { virtual void Shutdown() = 0; - virtual IGpFont *LoadFont(GpIOStream *stream) = 0; + virtual IGpFont *LoadFont(GpIOStream *stream, int typeFaceIndex) = 0; virtual bool KeepStreamOpen() const = 0; }; diff --git a/GpCommon/IGpSystemServices.h b/GpCommon/IGpSystemServices.h index 66a204c..e60e9a9 100644 --- a/GpCommon/IGpSystemServices.h +++ b/GpCommon/IGpSystemServices.h @@ -36,7 +36,6 @@ public: virtual void SetTextInputEnabled(bool isEnabled) = 0; virtual bool IsTextInputEnabled() const = 0; virtual bool AreFontResourcesSeekable() const = 0; - virtual bool IsUsingPreinstalledFonts() const = 0; virtual IGpClipboardContents *GetClipboardContents() const = 0; virtual void SetClipboardContents(IGpClipboardContents *contents) = 0; }; diff --git a/GpFontHandler_FreeType2/GpFontHandler_FreeType2.cpp b/GpFontHandler_FreeType2/GpFontHandler_FreeType2.cpp index 1ee56aa..b08e608 100644 --- a/GpFontHandler_FreeType2/GpFontHandler_FreeType2.cpp +++ b/GpFontHandler_FreeType2/GpFontHandler_FreeType2.cpp @@ -45,7 +45,7 @@ public: static GpFont_FreeType2 *Create(const FT_StreamRec_ &streamRec, GpIOStream *stream); - bool FTLoad(const FT_Library &library); + bool FTLoad(const FT_Library &library, int typeFaceIndex); private: explicit GpFont_FreeType2(const FT_StreamRec_ &streamRec, GpIOStream *stream); @@ -257,14 +257,14 @@ GpFont_FreeType2 *GpFont_FreeType2::Create(const FT_StreamRec_ &streamRec, GpIOS return new (storage) GpFont_FreeType2(streamRec, stream); } -bool GpFont_FreeType2::FTLoad(const FT_Library &library) +bool GpFont_FreeType2::FTLoad(const FT_Library &library, int typeFaceIndex) { FT_Open_Args openArgs; memset(&openArgs, 0, sizeof(openArgs)); openArgs.flags = FT_OPEN_STREAM; openArgs.stream = &m_ftStream; - FT_Error errorCode = FT_Open_Face(library, &openArgs, 0, &m_face); + FT_Error errorCode = FT_Open_Face(library, &openArgs, typeFaceIndex, &m_face); if (errorCode != 0) return false; @@ -304,7 +304,7 @@ GpFontHandler_FreeType2 *GpFontHandler_FreeType2::Create() return fh; } -IGpFont *GpFontHandler_FreeType2::LoadFont(GpIOStream *stream) +IGpFont *GpFontHandler_FreeType2::LoadFont(GpIOStream *stream, int typeFaceIndex) { FT_StreamRec_ ftStream; memset(&ftStream, 0, sizeof(ftStream)); @@ -321,7 +321,7 @@ IGpFont *GpFontHandler_FreeType2::LoadFont(GpIOStream *stream) return nullptr; } - if (!font->FTLoad(m_library)) + if (!font->FTLoad(m_library, typeFaceIndex)) { font->Destroy(); return nullptr; diff --git a/GpFontHandler_FreeType2/GpFontHandler_FreeType2.h b/GpFontHandler_FreeType2/GpFontHandler_FreeType2.h index 3d5c033..a5bc97d 100644 --- a/GpFontHandler_FreeType2/GpFontHandler_FreeType2.h +++ b/GpFontHandler_FreeType2/GpFontHandler_FreeType2.h @@ -16,7 +16,7 @@ namespace PortabilityLayer class GpFontHandler_FreeType2 final : public IGpFontHandler { public: - IGpFont *LoadFont(GpIOStream *stream) override; + IGpFont *LoadFont(GpIOStream *stream, int typeFaceIndex) override; void Shutdown() override; bool KeepStreamOpen() const override; diff --git a/PortabilityLayer/FontFamily.cpp b/PortabilityLayer/FontFamily.cpp index ea1462d..0cf96fe 100644 --- a/PortabilityLayer/FontFamily.cpp +++ b/PortabilityLayer/FontFamily.cpp @@ -15,16 +15,20 @@ namespace PortabilityLayer { FontFamily::FontSpec::FontSpec() - : m_fontPath(nullptr) + : m_fontVDir(VirtualDirectories::kUnspecified) + , m_fontPath(nullptr) , m_font(nullptr) , m_hacks(FontHacks_None) + , m_typeFaceIndex(0) , m_isRegistered(false) { } - void FontFamily::AddFont(int flags, const char *path, FontHacks fontHacks) + void FontFamily::AddFont(int flags, VirtualDirectory_t vDir, const char *path, int typeFaceIndex, FontHacks fontHacks) { + m_fontSpecs[flags].m_fontVDir = vDir; m_fontSpecs[flags].m_fontPath = path; + m_fontSpecs[flags].m_typeFaceIndex = typeFaceIndex; m_fontSpecs[flags].m_hacks = fontHacks; m_fontSpecs[flags].m_isRegistered = true; @@ -55,7 +59,7 @@ namespace PortabilityLayer if (spec.m_font) return spec.m_font; - GpIOStream *sysFontStream = PLDrivers::GetFileSystem()->OpenFile(PortabilityLayer::VirtualDirectories::kFonts, spec.m_fontPath, false, GpFileCreationDispositions::kOpenExisting); + GpIOStream *sysFontStream = PLDrivers::GetFileSystem()->OpenFile(spec.m_fontVDir, spec.m_fontPath, false, GpFileCreationDispositions::kOpenExisting); if (!sysFontStream) return nullptr; @@ -93,7 +97,7 @@ namespace PortabilityLayer IGpFontHandler *fontHandler = PLDrivers::GetFontHandler(); - IGpFont *font = fontHandler->LoadFont(sysFontStream); + IGpFont *font = fontHandler->LoadFont(sysFontStream, spec.m_typeFaceIndex); if (!fontHandler->KeepStreamOpen()) sysFontStream->Close(); @@ -121,13 +125,16 @@ namespace PortabilityLayer return m_fontSpecs[variation].m_hacks; } - bool FontFamily::GetFontSpec(int variation, FontHacks &outHacks, const char *&outPath) + bool FontFamily::GetFontSpec(int variation, FontHacks &outHacks, VirtualDirectory_t &outVDir, const char *&outPath, int &outTypeFaceIndex) { - if (!m_fontSpecs[variation].m_isRegistered) + const FontSpec &spec = m_fontSpecs[variation]; + if (!spec.m_isRegistered) return false; - outHacks = m_fontSpecs[variation].m_hacks; - outPath = m_fontSpecs[variation].m_fontPath; + outHacks = spec.m_hacks; + outVDir = spec.m_fontVDir; + outPath = spec.m_fontPath; + outTypeFaceIndex = spec.m_typeFaceIndex; return true; } diff --git a/PortabilityLayer/FontFamily.h b/PortabilityLayer/FontFamily.h index 3c31167..5e7573f 100644 --- a/PortabilityLayer/FontFamily.h +++ b/PortabilityLayer/FontFamily.h @@ -2,6 +2,7 @@ #include "FontFamilyID.h" #include "FontHacks.h" +#include "VirtualDirectory.h" #include @@ -24,9 +25,9 @@ namespace PortabilityLayer public: static const unsigned int kNumVariations = FontFamilyFlag_All + 1; - void AddFont(int flags, const char *path, FontHacks fontHacks); + void AddFont(int flags, VirtualDirectory_t vDir, const char *path, int typeFaceIndex, FontHacks fontHacks); void SetDefaultVariation(int defaultVariation); - bool GetFontSpec(int variation, FontHacks &outHacks, const char *&outPath); + bool GetFontSpec(int variation, FontHacks &outHacks, VirtualDirectory_t &outVDir, const char *&outPath, int &outTypeFaceIndex); int GetVariationForFlags(int flags) const; IGpFont *GetFontForVariation(int variation); @@ -47,7 +48,9 @@ namespace PortabilityLayer IGpFont *m_font; FontHacks m_hacks; + VirtualDirectory_t m_fontVDir; const char *m_fontPath; + int m_typeFaceIndex; bool m_isRegistered; }; diff --git a/PortabilityLayer/FontManager.cpp b/PortabilityLayer/FontManager.cpp index d8aba39..bcc06cb 100644 --- a/PortabilityLayer/FontManager.cpp +++ b/PortabilityLayer/FontManager.cpp @@ -79,6 +79,8 @@ namespace PortabilityLayer PortabilityLayer::CompositeFile *m_fontArchiveFile; THandle m_fontArchiveCatalogData; + bool m_hasPreinstalledFonts; + static FontManagerImpl ms_instance; static FontPreset ms_fontPresets[FontPresets::kCount]; }; @@ -89,19 +91,19 @@ namespace PortabilityLayer m_fontFamilies[static_cast(i)] = FontFamily::Create(static_cast(i)); if (m_fontFamilies[FontFamilyIDs::kSystem]) - m_fontFamilies[FontFamilyIDs::kSystem]->AddFont(FontFamilyFlag_None, "Fonts/OpenSans/OpenSans-ExtraBold.ttf", FontHacks_None); + m_fontFamilies[FontFamilyIDs::kSystem]->AddFont(FontFamilyFlag_None, VirtualDirectories::kFonts, "Fonts/OpenSans/OpenSans-ExtraBold.ttf", 0, FontHacks_None); if (m_fontFamilies[FontFamilyIDs::kApplication]) { - m_fontFamilies[FontFamilyIDs::kApplication]->AddFont(FontFamilyFlag_None, "Fonts/OpenSans/OpenSans-SemiBold.ttf", FontHacks_None); - m_fontFamilies[FontFamilyIDs::kApplication]->AddFont(FontFamilyFlag_Bold, "Fonts/OpenSans/OpenSans-Bold.ttf", FontHacks_None); + m_fontFamilies[FontFamilyIDs::kApplication]->AddFont(FontFamilyFlag_None, VirtualDirectories::kFonts, "Fonts/OpenSans/OpenSans-SemiBold.ttf", 0, FontHacks_None); + m_fontFamilies[FontFamilyIDs::kApplication]->AddFont(FontFamilyFlag_Bold, VirtualDirectories::kFonts, "Fonts/OpenSans/OpenSans-Bold.ttf", 0, FontHacks_None); } if (m_fontFamilies[FontFamilyIDs::kHandwriting]) - m_fontFamilies[FontFamilyIDs::kHandwriting]->AddFont(FontFamilyFlag_None, "Fonts/GochiHand/GochiHand-Regular.ttf", FontHacks_None); + m_fontFamilies[FontFamilyIDs::kHandwriting]->AddFont(FontFamilyFlag_None, VirtualDirectories::kFonts, "Fonts/GochiHand/GochiHand-Regular.ttf", 0, FontHacks_None); if (m_fontFamilies[FontFamilyIDs::kMonospace]) - m_fontFamilies[FontFamilyIDs::kMonospace]->AddFont(FontFamilyFlag_None, "Fonts/Roboto/RobotoMono-Regular.ttf", FontHacks_None); + m_fontFamilies[FontFamilyIDs::kMonospace]->AddFont(FontFamilyFlag_None, VirtualDirectories::kFonts, "Fonts/Roboto/RobotoMono-Regular.ttf", 0, FontHacks_None); memset(m_cachedRenderedFonts, 0, sizeof(m_cachedRenderedFonts)); } @@ -131,8 +133,6 @@ namespace PortabilityLayer void FontManagerImpl::GetFontPreset(FontPreset_t preset, FontFamilyID_t *outFamilyID, int *outSize, int *outVariationFlags, bool *outAA) const { - const bool preinstalledFonts = PLDrivers::GetSystemServices()->IsUsingPreinstalledFonts(); - if (outSize) *outSize = ms_fontPresets[preset].m_textSize; @@ -144,7 +144,7 @@ namespace PortabilityLayer bool aa = ms_fontPresets[preset].m_aa; FontFamilyID_t fontFamily = ms_fontPresets[preset].m_familyID; - if (preinstalledFonts && (fontFamily == FontFamilyIDs::kApplication || fontFamily == FontFamilyIDs::kSystem)) + if (m_hasPreinstalledFonts && (fontFamily == FontFamilyIDs::kApplication || fontFamily == FontFamilyIDs::kSystem)) *outAA = false; else *outAA = aa; @@ -155,7 +155,7 @@ namespace PortabilityLayer switch (ms_fontPresets[preset].m_familyID) { case FontFamilyIDs::kApplication: - if (!preinstalledFonts && ms_fontPresets[preset].m_textSize < 11 && (ms_fontPresets[preset].m_variationFlags & FontFamilyFlag_Bold) != 0) + if (!m_hasPreinstalledFonts && ms_fontPresets[preset].m_textSize < 11 && (ms_fontPresets[preset].m_variationFlags & FontFamilyFlag_Bold) != 0) *outFamilyID = FontFamilyIDs::kSystem; // Use heavier font below 11pt else *outFamilyID = FontFamilyIDs::kApplication; @@ -286,8 +286,14 @@ namespace PortabilityLayer int variation = fontFamily->GetVariationForFlags(flags); FontHacks hacks = FontHacks_None; + VirtualDirectory_t vDir = VirtualDirectories::kUnspecified; const char *path = nullptr; - if (!fontFamily->GetFontSpec(variation, hacks, path)) + int typeFaceIndex = 0; + if (!fontFamily->GetFontSpec(variation, hacks, vDir, path, typeFaceIndex)) + return nullptr; + + // Only single TTF fonts are supported by the prerendered font system currently + if (vDir != VirtualDirectories::kFonts || typeFaceIndex != 0) return nullptr; size_t pathLen = strlen(path); @@ -372,6 +378,7 @@ namespace PortabilityLayer FontManagerImpl::FontManagerImpl() : m_fontArchive(nullptr) , m_fontArchiveFile(nullptr) + , m_hasPreinstalledFonts(false) { for (int fid = 0; fid < FontFamilyIDs::kCount; fid++) m_fontFamilies[fid] = nullptr; diff --git a/PortabilityLayer/VirtualDirectory.h b/PortabilityLayer/VirtualDirectory.h index 1f426ee..39a1867 100644 --- a/PortabilityLayer/VirtualDirectory.h +++ b/PortabilityLayer/VirtualDirectory.h @@ -13,6 +13,7 @@ namespace PortabilityLayer kUserData, kUserSaves, kPrefs, + kPreinstalledFonts, kFonts, kCursors, kHighScores,