From 4e8e76f8fcebc19d9f359fbd67fb767fd3fcaf4c Mon Sep 17 00:00:00 2001 From: elasota Date: Thu, 15 Apr 2021 19:32:15 -0400 Subject: [PATCH] Re-enable runtime font rendering if a font handler is assigned, clean up some font handler things. --- Aerofoil/GpFileSystem_Win32.cpp | 5 +- PortabilityLayer/AntiAliasTable.cpp | 60 +--------------- PortabilityLayer/AntiAliasTable.h | 10 +-- PortabilityLayer/FontFamily.cpp | 10 +++ PortabilityLayer/FontFamily.h | 1 + PortabilityLayer/FontManager.cpp | 69 ++++++++++--------- PortabilityLayer/FontManager.h | 31 +-------- PortabilityLayer/FontPresets.h | 32 +++++++++ PortabilityLayer/PLEditboxWidget.cpp | 13 ++-- PortabilityLayer/PLEditboxWidget.h | 3 +- PortabilityLayer/PLQDraw.cpp | 2 +- PortabilityLayer/PortabilityLayer.vcxproj | 1 + .../PortabilityLayer.vcxproj.filters | 3 + PortabilityLayer/QDStandardPalette.cpp | 2 +- PortabilityLayer/VirtualDirectory.h | 1 - 15 files changed, 103 insertions(+), 140 deletions(-) create mode 100644 PortabilityLayer/FontPresets.h diff --git a/Aerofoil/GpFileSystem_Win32.cpp b/Aerofoil/GpFileSystem_Win32.cpp index 5cdb345..0d0c8ec 100644 --- a/Aerofoil/GpFileSystem_Win32.cpp +++ b/Aerofoil/GpFileSystem_Win32.cpp @@ -137,6 +137,7 @@ GpFileSystem_Win32::GpFileSystem_Win32() m_userSavesDir.append(L"\\"); m_logsDir.append(L"\\"); m_fontCacheDir.append(L"\\"); + m_resourcesDir.append(L"\\"); } DWORD modulePathSize = GetModuleFileNameW(nullptr, m_executablePath, MAX_PATH); @@ -177,6 +178,7 @@ GpFileSystem_Win32::GpFileSystem_Win32() { m_packagedDir = std::wstring(m_executablePath) + L"Packaged\\"; m_housesDir = std::wstring(m_executablePath) + L"Packaged\\Houses\\"; + m_resourcesDir = std::wstring(m_executablePath) + L"Resources\\"; } } @@ -453,9 +455,6 @@ bool GpFileSystem_Win32::ResolvePath(PortabilityLayer::VirtualDirectory_t virtua case PortabilityLayer::VirtualDirectories::kLogs: baseDir = m_logsDir.c_str(); break; - case PortabilityLayer::VirtualDirectories::kFontCache: - baseDir = m_fontCacheDir.c_str(); - break; default: return false; } diff --git a/PortabilityLayer/AntiAliasTable.cpp b/PortabilityLayer/AntiAliasTable.cpp index c5e7e9a..e40cc01 100644 --- a/PortabilityLayer/AntiAliasTable.cpp +++ b/PortabilityLayer/AntiAliasTable.cpp @@ -35,40 +35,6 @@ namespace PortabilityLayer return minIndexInclusive; } - - bool AntiAliasTable::LoadFromCache(const char *cacheFileName) - { - GpIOStream *stream = PLDrivers::GetFileSystem()->OpenFile(PortabilityLayer::VirtualDirectories::kFontCache, cacheFileName, false, GpFileCreationDispositions::kOpenExisting); - if (!stream) - return false; - - BEUInt32_t cacheVersion; - if (stream->Read(&cacheVersion, sizeof(cacheVersion)) != sizeof(cacheVersion) || cacheVersion != kCacheVersion) - { - stream->Close(); - return false; - } - - const size_t readSize = sizeof(m_aaTranslate); - const bool readOK = (stream->Read(m_aaTranslate, readSize) == readSize); - stream->Close(); - - return readOK; - } - - void AntiAliasTable::SaveToCache(const char *cacheFileName) - { - GpIOStream *stream = PLDrivers::GetFileSystem()->OpenFile(PortabilityLayer::VirtualDirectories::kFontCache, cacheFileName, true, GpFileCreationDispositions::kCreateOrOverwrite); - if (!stream) - return; - - BEUInt32_t cacheVersion(static_cast(kCacheVersion)); - stream->Write(&cacheVersion, sizeof(cacheVersion)); - - stream->Write(m_aaTranslate, sizeof(m_aaTranslate)); - stream->Close(); - } - void AntiAliasTable::GenerateForPaletteFast(const RGBAColor &baseColorRef) { const RGBAColor baseColor = baseColorRef; @@ -191,16 +157,8 @@ namespace PortabilityLayer } } - void AntiAliasTable::GenerateForPalette(const RGBAColor &baseColorRef, const RGBAColor *colors, size_t numColors, bool cacheable) + void AntiAliasTable::GenerateForPalette(const RGBAColor &baseColorRef, const RGBAColor *colors, size_t numColors) { - char cacheFileName[256]; - if (cacheable) - { - sprintf(cacheFileName, "aa_p_%02x%02x%02x%02x.cache", static_cast(baseColorRef.r), static_cast(baseColorRef.g), static_cast(baseColorRef.b), static_cast(baseColorRef.a)); - if (LoadFromCache(cacheFileName)) - return; - } - const RGBAColor baseColor = baseColorRef; if (numColors > 256) @@ -259,21 +217,10 @@ namespace PortabilityLayer m_aaTranslate[i][b] = static_cast(bestColor); } } - - if (cacheable) - SaveToCache(cacheFileName); } - void AntiAliasTable::GenerateForSimpleScale(uint8_t colorChannel, bool cacheable) + void AntiAliasTable::GenerateForSimpleScale(uint8_t colorChannel) { - char cacheFileName[256]; - if (cacheable) - { - sprintf(cacheFileName, "aa_t_%02x.cache", static_cast(colorChannel)); - if (LoadFromCache(cacheFileName)) - return; - } - const double gamma = 1.8; const double rcpGamma = 1.0 / gamma; const double rcp255 = 1.0 / 255.0; @@ -294,8 +241,5 @@ namespace PortabilityLayer m_aaTranslate[baseColor][opacity] = static_cast(floor(blendedColorGammaSpace * 255.0 + 0.5)); } } - - if (cacheable) - SaveToCache(cacheFileName); } } diff --git a/PortabilityLayer/AntiAliasTable.h b/PortabilityLayer/AntiAliasTable.h index 7ee582e..dfc3dc3 100644 --- a/PortabilityLayer/AntiAliasTable.h +++ b/PortabilityLayer/AntiAliasTable.h @@ -12,14 +12,8 @@ namespace PortabilityLayer // Striped 256x16 because constant background color is more likely than constant sample uint8_t m_aaTranslate[256][16]; - void GenerateForPalette(const RGBAColor &baseColor, const RGBAColor *colors, size_t numColors, bool cacheable); + void GenerateForPalette(const RGBAColor &baseColor, const RGBAColor *colors, size_t numColors); void GenerateForPaletteFast(const RGBAColor &baseColor); - void GenerateForSimpleScale(uint8_t colorChannel, bool cacheable); - - private: - bool LoadFromCache(const char *path); - void SaveToCache(const char *path); - - static const unsigned int kCacheVersion = 1; + void GenerateForSimpleScale(uint8_t colorChannel); }; } diff --git a/PortabilityLayer/FontFamily.cpp b/PortabilityLayer/FontFamily.cpp index 39a5a7c..ea1462d 100644 --- a/PortabilityLayer/FontFamily.cpp +++ b/PortabilityLayer/FontFamily.cpp @@ -106,6 +106,16 @@ namespace PortabilityLayer return font; } + void FontFamily::UnloadVariation(int variation) + { + FontSpec &spec = m_fontSpecs[variation]; + if (spec.m_font) + { + spec.m_font->Destroy(); + spec.m_font = nullptr; + } + } + PortabilityLayer::FontHacks FontFamily::GetHacksForVariation(int variation) const { return m_fontSpecs[variation].m_hacks; diff --git a/PortabilityLayer/FontFamily.h b/PortabilityLayer/FontFamily.h index df1f1de..3c31167 100644 --- a/PortabilityLayer/FontFamily.h +++ b/PortabilityLayer/FontFamily.h @@ -30,6 +30,7 @@ namespace PortabilityLayer int GetVariationForFlags(int flags) const; IGpFont *GetFontForVariation(int variation); + void UnloadVariation(int variation); FontHacks GetHacksForVariation(int variation) const; FontFamilyID_t GetFamilyID() const; diff --git a/PortabilityLayer/FontManager.cpp b/PortabilityLayer/FontManager.cpp index bf51a8d..1ac9a5e 100644 --- a/PortabilityLayer/FontManager.cpp +++ b/PortabilityLayer/FontManager.cpp @@ -32,8 +32,6 @@ namespace PortabilityLayer FontFamily *GetFont(FontFamilyID_t fontFamilyID) const override; void GetFontPreset(FontPreset_t fontPreset, FontFamilyID_t *outFamilyID, int *outSize, int *outVariationFlags, bool *outAA) const override; - RenderedFont *GetRenderedFontFromFamily(FontFamily *font, int size, bool aa, int flags) override; - RenderedFont *LoadCachedRenderedFont(FontFamilyID_t familyID, int size, bool aa, int flags) override; void PurgeCache() override; @@ -41,6 +39,9 @@ namespace PortabilityLayer static FontManagerImpl *GetInstance(); private: + RenderedFont *LoadAndRenderFontUsingFontHandler(FontFamily *font, int size, bool aa, int flags); + RenderedFont *LoadAndRenderFont(FontFamilyID_t familyID, int size, bool aa, int flags); + static const unsigned int kNumCachedRenderedFonts = 32; struct CachedRenderedFont @@ -206,44 +207,49 @@ namespace PortabilityLayer m_usageCounter++; } - RenderedFont *FontManagerImpl::GetRenderedFontFromFamily(FontFamily *fontFamily, int size, bool aa, int flags) + RenderedFont *FontManagerImpl::LoadAndRenderFontUsingFontHandler(FontFamily *fontFamily, int size, bool aa, int flags) { PortabilityLayer::FontManager *fm = PortabilityLayer::FontManager::GetInstance(); - RenderedFont *rfont = nullptr; - CachedRenderedFont *cacheSlot = nullptr; - FontFamilyID_t familyID = fontFamily->GetFamilyID(); - - if (this->FindOrReserveCacheSlot(familyID, size, aa, cacheSlot, rfont)) - return rfont; - - rfont = fm->LoadCachedRenderedFont(familyID, size, aa, flags); - if (rfont) - { - ReplaceCachedRenderedFont(*cacheSlot, rfont, familyID, size, aa, flags); - return rfont; - } - const int variation = fontFamily->GetVariationForFlags(flags); IGpFont *hostFont = fontFamily->GetFontForVariation(variation); if (!hostFont) return nullptr; - - rfont = FontRenderer::GetInstance()->RenderFont(hostFont, size, aa, fontFamily->GetHacksForVariation(variation)); - if (rfont) - { - ReplaceCachedRenderedFont(*cacheSlot, rfont, familyID, size, aa, flags); - - return rfont; - } + RenderedFont *rfont = FontRenderer::GetInstance()->RenderFont(hostFont, size, aa, fontFamily->GetHacksForVariation(variation)); + fontFamily->UnloadVariation(variation); return rfont; } RenderedFont *FontManagerImpl::LoadCachedRenderedFont(FontFamilyID_t familyID, int size, bool aa, int flags) { + CachedRenderedFont *cacheSlot = nullptr; + RenderedFont *rfont = nullptr; + + if (this->FindOrReserveCacheSlot(familyID, size, aa, cacheSlot, rfont)) + return rfont; + + rfont = LoadAndRenderFont(familyID, size, aa, flags); + if (rfont) + ReplaceCachedRenderedFont(*cacheSlot, rfont, familyID, size, aa, flags); + + return rfont; + } + + RenderedFont *FontManagerImpl::LoadAndRenderFont(FontFamilyID_t familyID, int size, bool aa, int flags) + { + FontFamily *fontFamily = this->GetFont(familyID); + + RenderedFont *rfont = nullptr; + if (PLDrivers::GetFontHandler() != nullptr) + { + rfont = LoadAndRenderFontUsingFontHandler(fontFamily, size, aa, flags); + if (rfont != nullptr) + return rfont; + } + if (!m_fontArchive) { m_fontArchiveFile = PortabilityLayer::FileManager::GetInstance()->OpenCompositeFile(VirtualDirectories::kApplicationData, PSTR("Fonts")); @@ -266,7 +272,6 @@ namespace PortabilityLayer } } - FontFamily *fontFamily = this->GetFont(familyID); int variation = fontFamily->GetVariationForFlags(flags); FontHacks hacks = FontHacks_None; @@ -328,13 +333,13 @@ namespace PortabilityLayer return nullptr; THandle res = m_fontArchive->LoadResource('RFNT', 1000 + static_cast(fontIndex)); - if (!res) - return nullptr; + if (res) + { + PortabilityLayer::MemReaderStream stream(*res, res.MMBlock()->m_size); - PortabilityLayer::MemReaderStream stream(*res, res.MMBlock()->m_size); - - RenderedFont *rfont = PortabilityLayer::FontRenderer::GetInstance()->LoadCache(&stream); - res.Dispose(); + rfont = PortabilityLayer::FontRenderer::GetInstance()->LoadCache(&stream); + res.Dispose(); + } return rfont; } diff --git a/PortabilityLayer/FontManager.h b/PortabilityLayer/FontManager.h index 8c281bd..9dacc93 100644 --- a/PortabilityLayer/FontManager.h +++ b/PortabilityLayer/FontManager.h @@ -2,6 +2,7 @@ #include "FontHacks.h" #include "FontFamilyID.h" +#include "FontPresets.h" struct IGpFont; @@ -10,34 +11,6 @@ namespace PortabilityLayer class FontFamily; class RenderedFont; - namespace FontPresets - { - enum FontPreset - { - kSystem12, - kSystem12Bold, - - kApplication8, - kApplication9, - kApplication9Bold, - kApplication10Bold, - kApplication12Bold, - kApplication14, - kApplication14Bold, - kApplication18, - kApplication40, - - kMono10, - - kHandwriting24, - kHandwriting48, - - kCount, - }; - } - - typedef FontPresets::FontPreset FontPreset_t; - class FontManager { public: @@ -47,8 +20,6 @@ namespace PortabilityLayer virtual FontFamily *GetFont(FontFamilyID_t fontFamilyID) const = 0; virtual void GetFontPreset(FontPreset_t fontPreset, FontFamilyID_t *outFamilyID, int *outSize, int *outVariationFlags, bool *outAA) const = 0; - virtual RenderedFont *GetRenderedFontFromFamily(FontFamily *fontFamily, int fontSize, bool aa, int flags) = 0; - virtual RenderedFont *LoadCachedRenderedFont(FontFamilyID_t familyID, int size, bool aa, int flags) = 0; virtual void PurgeCache() = 0; diff --git a/PortabilityLayer/FontPresets.h b/PortabilityLayer/FontPresets.h new file mode 100644 index 0000000..3e31a58 --- /dev/null +++ b/PortabilityLayer/FontPresets.h @@ -0,0 +1,32 @@ +#pragma once + +namespace PortabilityLayer +{ + namespace FontPresets + { + enum FontPreset + { + kSystem12, + kSystem12Bold, + + kApplication8, + kApplication9, + kApplication9Bold, + kApplication10Bold, + kApplication12Bold, + kApplication14, + kApplication14Bold, + kApplication18, + kApplication40, + + kMono10, + + kHandwriting24, + kHandwriting48, + + kCount, + }; + } + + typedef FontPresets::FontPreset FontPreset_t; +} diff --git a/PortabilityLayer/PLEditboxWidget.cpp b/PortabilityLayer/PLEditboxWidget.cpp index 59fc22f..8995548 100644 --- a/PortabilityLayer/PLEditboxWidget.cpp +++ b/PortabilityLayer/PLEditboxWidget.cpp @@ -1330,16 +1330,19 @@ namespace PortabilityLayer return ccs->m_category; } - FontFamily *EditboxWidget::GetFontFamily() const + FontPreset_t EditboxWidget::GetFontPreset() const { - FontFamilyID_t preset = FontFamilyIDs::kCount; - PortabilityLayer::FontManager::GetInstance()->GetFontPreset(FontPresets::kSystem12, &preset, nullptr, nullptr, nullptr); - return PortabilityLayer::FontManager::GetInstance()->GetFont(preset); + return FontPresets::kSystem12; } RenderedFont *EditboxWidget::GetRenderedFont() const { - return PortabilityLayer::FontManager::GetInstance()->GetRenderedFontFromFamily(GetFontFamily(), 12, true, FontFamilyFlag_None); + PortabilityLayer::FontFamilyID_t fontFamilyID = FontFamilyIDs::kCount; + int size = 0; + int varFlags = 0; + bool aa = false; + PortabilityLayer::FontManager::GetInstance()->GetFontPreset(GetFontPreset(), &fontFamilyID, &size, &varFlags, &aa); + return PortabilityLayer::FontManager::GetInstance()->LoadCachedRenderedFont(fontFamilyID, size, aa, varFlags); } void EditboxWidget::SetMultiLine(bool isMultiLine) diff --git a/PortabilityLayer/PLEditboxWidget.h b/PortabilityLayer/PLEditboxWidget.h index b45ad8f..e60f7fa 100644 --- a/PortabilityLayer/PLEditboxWidget.h +++ b/PortabilityLayer/PLEditboxWidget.h @@ -1,5 +1,6 @@ #pragma once +#include "FontPresets.h" #include "PascalStr.h" #include "PLWidgets.h" #include "Vec2i.h" @@ -111,7 +112,7 @@ namespace PortabilityLayer size_t IdentifySpanLength(size_t startChar, SpanScanDirection scanDirection) const; static CharacterCategory CategorizeCharacter(uint8_t character); - PortabilityLayer::FontFamily *GetFontFamily() const; + PortabilityLayer::FontPreset_t GetFontPreset() const; PortabilityLayer::RenderedFont *GetRenderedFont() const; uint8_t *m_chars; diff --git a/PortabilityLayer/PLQDraw.cpp b/PortabilityLayer/PLQDraw.cpp index 226a56c..0ca50f8 100644 --- a/PortabilityLayer/PLQDraw.cpp +++ b/PortabilityLayer/PLQDraw.cpp @@ -2016,7 +2016,7 @@ PortabilityLayer::RenderedFont *GetFont(PortabilityLayer::FontPreset_t fontPrese if (familyID == PortabilityLayer::FontFamilyIDs::kCount) return nullptr; - return fontManager->GetRenderedFontFromFamily(fontManager->GetFont(familyID), size, aa, variationFlags); + return fontManager->LoadCachedRenderedFont(familyID, size, aa, variationFlags); } #include "stb_image_write.h" diff --git a/PortabilityLayer/PortabilityLayer.vcxproj b/PortabilityLayer/PortabilityLayer.vcxproj index 705e4f9..956bbaa 100644 --- a/PortabilityLayer/PortabilityLayer.vcxproj +++ b/PortabilityLayer/PortabilityLayer.vcxproj @@ -105,6 +105,7 @@ + diff --git a/PortabilityLayer/PortabilityLayer.vcxproj.filters b/PortabilityLayer/PortabilityLayer.vcxproj.filters index 61c8d6d..bab3226 100644 --- a/PortabilityLayer/PortabilityLayer.vcxproj.filters +++ b/PortabilityLayer/PortabilityLayer.vcxproj.filters @@ -432,6 +432,9 @@ Header Files + + Header Files + diff --git a/PortabilityLayer/QDStandardPalette.cpp b/PortabilityLayer/QDStandardPalette.cpp index 8d25e7a..c39098e 100644 --- a/PortabilityLayer/QDStandardPalette.cpp +++ b/PortabilityLayer/QDStandardPalette.cpp @@ -293,7 +293,7 @@ namespace PortabilityLayer if (mutex) mutex->Unlock(); - entry.m_aaTable.GenerateForSimpleScale(tone, false); + entry.m_aaTable.GenerateForSimpleScale(tone); return entry.m_aaTable; } diff --git a/PortabilityLayer/VirtualDirectory.h b/PortabilityLayer/VirtualDirectory.h index a8447b6..1f426ee 100644 --- a/PortabilityLayer/VirtualDirectory.h +++ b/PortabilityLayer/VirtualDirectory.h @@ -17,7 +17,6 @@ namespace PortabilityLayer kCursors, kHighScores, kLogs, - kFontCache, kSourceExport, };