vcl/quartz/salgdi.cxx |   33 +++++++++++++++++++++++++++++++--
 1 file changed, 31 insertions(+), 2 deletions(-)

New commits:
commit c270131be7a8ecc9599dc0f0fe6ea24c650f32ed
Author:     Patrick Luby <guibmac...@gmail.com>
AuthorDate: Tue Jun 11 13:10:36 2024 -0400
Commit:     Adolfo Jayme Barrientos <fit...@ubuntu.com>
CommitDate: Thu Jun 13 15:41:16 2024 +0200

    tdf#155212 clear the cached system font list after loading a font
    
    If the system font is not cached in SalData, loading embedded
    fonts will be extremely slow and will trigger each frame and each
    of its internal subframes to reload the system font list when
    loading documents with embedded fonts.
    
    So instead, reenable caching of the system font list in SalData
    by reverting commit 3b6e9582ce43242a2304047561116bb26808408b.
    Then, to prevent tdf#72456 from reoccurring, clear the cached
    system font list after a font has been loaded or unloaded.
    This should cause the first frame's request to reload the cached
    system font list and all subsequent frames will avoid doing
    duplicate font reloads.
    
    Change-Id: If2a36f8c17d8e25f818275f30a19af8517478884
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/168734
    Reviewed-by: Patrick Luby <guibomac...@gmail.com>
    Tested-by: Jenkins
    (cherry picked from commit 195ed184dd1552816bdebfe9c54fb6408bf91cc1)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/168728
    Reviewed-by: Adolfo Jayme Barrientos <fit...@ubuntu.com>

diff --git a/vcl/quartz/salgdi.cxx b/vcl/quartz/salgdi.cxx
index 8c9d3a6486dd..7ec52c32111d 100644
--- a/vcl/quartz/salgdi.cxx
+++ b/vcl/quartz/salgdi.cxx
@@ -217,7 +217,24 @@ static bool AddTempDevFont(const OUString& rFontFileURL)
 
     CFErrorRef error;
     bool success = CTFontManagerRegisterFontsForURL(rFontURL, 
kCTFontManagerScopeProcess, &error);
-    if (!success)
+    if (success)
+    {
+        // tdf155212 clear the cached system font list after loading a font
+        // If the system font is not cached in SalData, loading embedded
+        // fonts will be extremely slow and will trigger each frame and each
+        // of its internal subframes to reload the system font list when
+        // loading documents with embedded fonts.
+        // So instead, reenable caching of the system font list in SalData
+        // by reverting commit 3b6e9582ce43242a2304047561116bb26808408b.
+        // Then, to prevent tdf#72456 from reoccurring, clear the cached
+        // system font list after a font has been loaded or unloaded.
+        // This should cause the first frame's request to reload the cached
+        // system font list and all subsequent frames will avoid doing
+        // duplicate font reloads.
+        SalData* pSalData = GetSalData();
+        pSalData->mpFontList.reset();
+    }
+    else
     {
         CFRelease(error);
     }
@@ -272,8 +289,20 @@ void 
AquaSalGraphics::GetDevFontList(vcl::font::PhysicalFontCollection* pFontCol
 
     AddLocalTempFontDirs();
 
+    // The idea is to cache the list of system fonts once it has been 
generated.
+    // SalData seems to be a good place for this caching. However we have to
+    // carefully make the access to the font list thread-safe. If we register
+    // a font-change event handler to update the font list in case fonts have
+    // changed on the system we have to lock access to the list. The right
+    // way to do that is the solar mutex since GetDevFontList is protected
+    // through it as should be all event handlers
+
+    // Related tdf#155212: the system font list needs to be cached but that
+    // should not cause tdf#72456 to reoccur now that the cached system font
+    // is cleared immediately after a font has been loaded
     SalData* pSalData = GetSalData();
-    pSalData->mpFontList = GetCoretextFontList();
+    if( !pSalData->mpFontList )
+        pSalData->mpFontList = GetCoretextFontList();
 
     // Copy all PhysicalFontFace objects contained in the SystemFontList
     pSalData->mpFontList->AnnounceFonts( *pFontCollection );

Reply via email to