[Libreoffice-commits] core.git: vcl/inc vcl/win

Jan-Marek Glogowski (via logerrit) logerrit at kemper.freedesktop.org
Fri Jul 5 17:39:05 UTC 2019


 vcl/inc/win/saldata.hxx |    1 -
 vcl/win/gdi/salfont.cxx |   39 ++++++++++++++++++++-------------------
 2 files changed, 20 insertions(+), 20 deletions(-)

New commits:
commit 7dd44125a9c184c21374a47005e303579179805f
Author:     Jan-Marek Glogowski <glogow at fbihome.de>
AuthorDate: Thu Jul 4 01:45:11 2019 +0200
Commit:     Jan-Marek Glogowski <glogow at fbihome.de>
CommitDate: Fri Jul 5 19:38:01 2019 +0200

    WIN don't register LO's shared fonts twice
    
    This separates the system registration (AddFontResourceEx) of
    LO's shared fonts from the later PhysicalFontCollection
    population using EnumFontFamiliesEx.
    
    Calling AddTempDevFont from GetDevFontList creates a new
    WinFontFaces, but the later EnumFontFamiliesEx also creates
    WinFontFaces for all registered fonts, resulting in duplicate
    WinFontFace entries in the PhysicalFontCollection.
    
    Also currently the provided WinFontFace from AddTempDevFont is
    much less accurate, compated to the EnumFontFamiliesEx one.
    
    Change-Id: I2cd8af77197429508d0a7112ff98706d7f449659
    Reviewed-on: https://gerrit.libreoffice.org/75067
    Tested-by: Jenkins
    Reviewed-by: Jan-Marek Glogowski <glogow at fbihome.de>

diff --git a/vcl/inc/win/saldata.hxx b/vcl/inc/win/saldata.hxx
index 74be79774db5..00f7c787bbea 100644
--- a/vcl/inc/win/saldata.hxx
+++ b/vcl/inc/win/saldata.hxx
@@ -156,7 +156,6 @@ void ImplClearHDCCache( SalData* pData );
 HDC ImplGetCachedDC( sal_uLong nID, HBITMAP hBmp = nullptr );
 void ImplReleaseCachedDC( sal_uLong nID );
 
-bool ImplAddTempFont( SalData&, const OUString& rFontFileURL );
 void ImplReleaseTempFonts( SalData& );
 
 HCURSOR ImplLoadSalCursor( int nId );
diff --git a/vcl/win/gdi/salfont.cxx b/vcl/win/gdi/salfont.cxx
index fcdbb6484dda..4ea93e96ce33 100644
--- a/vcl/win/gdi/salfont.cxx
+++ b/vcl/win/gdi/salfont.cxx
@@ -1060,22 +1060,21 @@ struct TempFontItem
     TempFontItem* mpNextItem;
 };
 
-bool ImplAddTempFont( SalData& rSalData, const OUString& rFontFileURL )
+static int lcl_AddFontResource(SalData& rSalData, const OUString& rFontFileURL)
 {
-    int nRet = 0;
-    OUString aUSytemPath;
-    OSL_VERIFY( !osl::FileBase::getSystemPathFromFileURL( rFontFileURL, aUSytemPath ) );
+    OUString aFontSystemPath;
+    OSL_VERIFY(!osl::FileBase::getSystemPathFromFileURL(rFontFileURL, aFontSystemPath));
 
-    nRet = AddFontResourceExW( o3tl::toW(aUSytemPath.getStr()), FR_PRIVATE, nullptr );
-    SAL_WARN_IF(!nRet, "vcl.fonts", "Adding private font failed: " << rFontFileURL);
+    int nRet = AddFontResourceExW(o3tl::toW(aFontSystemPath.getStr()), FR_PRIVATE, nullptr);
+    SAL_WARN_IF(nRet <= 0, "vcl.fonts", "AddFontResourceExW failed for " << rFontFileURL);
     if (nRet > 0)
     {
         TempFontItem* pNewItem = new TempFontItem;
-        pNewItem->maFontResourcePath = aUSytemPath;
+        pNewItem->maFontResourcePath = aFontSystemPath;
         pNewItem->mpNextItem = rSalData.mpTempFontItem;
         rSalData.mpTempFontItem = pNewItem;
     }
-    return (nRet > 0);
+    return nRet;
 }
 
 void ImplReleaseTempFonts( SalData& rSalData )
@@ -1177,10 +1176,9 @@ static bool ImplGetFontAttrFromFile( const OUString& rFontFileURL,
     return true;
 }
 
-bool WinSalGraphics::AddTempDevFont( PhysicalFontCollection* pFontCollection,
-    const OUString& rFontFileURL, const OUString& rFontName )
+bool WinSalGraphics::AddTempDevFont(PhysicalFontCollection* pFontCollection,
+                                    const OUString& rFontFileURL, const OUString& rFontName)
 {
-    SAL_INFO("vcl.fonts", "WinSalGraphics::AddTempDevFont(): " << rFontFileURL);
 
     FontAttributes aDFA;
     aDFA.SetFamilyName(rFontName);
@@ -1193,10 +1191,13 @@ bool WinSalGraphics::AddTempDevFont( PhysicalFontCollection* pFontCollection,
     }
 
     if ( aDFA.GetFamilyName().isEmpty() )
+    {
+        SAL_WARN("vcl.fonts", "error extracting font family from " << rFontFileURL);
         return false;
+    }
 
-    // remember temp font for cleanup later
-    if( !ImplAddTempFont( *GetSalData(), rFontFileURL ) )
+    int nFonts = lcl_AddFontResource(*GetSalData(), rFontFileURL);
+    if (nFonts <= 0)
         return false;
 
     // create matching FontData struct
@@ -1224,9 +1225,7 @@ bool WinSalGraphics::AddTempDevFont( PhysicalFontCollection* pFontCollection,
 
 void WinSalGraphics::GetDevFontList( PhysicalFontCollection* pFontCollection )
 {
-    SAL_INFO("vcl.fonts", "WinSalGraphics::GetDevFontList(): enter");
-
-    // make sure all fonts are registered at least temporarily
+    // make sure all LO shared fonts are registered temporarily
     static bool bOnce = true;
     if( bOnce )
     {
@@ -1245,13 +1244,15 @@ void WinSalGraphics::GetDevFontList( PhysicalFontCollection* pFontCollection )
         if( rcOSL == osl::FileBase::E_None )
         {
             osl::DirectoryItem aDirItem;
+            SalData* pSalData = GetSalData();
+            assert(pSalData);
 
             while( aFontDir.getNextItem( aDirItem, 10 ) == osl::FileBase::E_None )
             {
                 osl::FileStatus aFileStatus( osl_FileStatus_Mask_FileURL );
                 rcOSL = aDirItem.getFileStatus( aFileStatus );
                 if ( rcOSL == osl::FileBase::E_None )
-                    AddTempDevFont( pFontCollection, aFileStatus.getFileURL(), "" );
+                    lcl_AddFontResource(*pSalData, aFileStatus.getFileURL());
             }
         }
     }
@@ -1267,6 +1268,8 @@ void WinSalGraphics::GetDevFontList( PhysicalFontCollection* pFontCollection )
     memset( &aLogFont, 0, sizeof( aLogFont ) );
     aLogFont.lfCharSet = DEFAULT_CHARSET;
     aInfo.mpLogFont = &aLogFont;
+
+    // fill the PhysicalFontCollection
     EnumFontFamiliesExW( getHDC(), &aLogFont,
         SalEnumFontsProcExW, reinterpret_cast<LPARAM>(&aInfo), 0 );
 
@@ -1275,8 +1278,6 @@ void WinSalGraphics::GetDevFontList( PhysicalFontCollection* pFontCollection )
     static WinPreMatchFontSubstititution aPreMatchFont;
     pFontCollection->SetFallbackHook( &aSubstFallback );
     pFontCollection->SetPreMatchHook(&aPreMatchFont);
-
-    SAL_INFO("vcl.fonts", "WinSalGraphics::GetDevFontList(): leave");
 }
 
 void WinSalGraphics::ClearDevFontCache()


More information about the Libreoffice-commits mailing list