[Libreoffice-commits] core.git: vcl/source

Chris Sherlock chris.sherlock79 at gmail.com
Mon Mar 31 07:10:48 PDT 2014


 vcl/source/gdi/outdev3.cxx |   40 +++++++++++++++++++++++-----------------
 1 file changed, 23 insertions(+), 17 deletions(-)

New commits:
commit ea7102c93c33884a68d4dba0de7d52f8ed4f4579
Author: Chris Sherlock <chris.sherlock79 at gmail.com>
Date:   Tue Mar 25 21:54:20 2014 +1100

    fdo#74702 OutputDevice::ImplInitFontList() fails if no fonts on device
    
    It makes no sense that ImplInitFontList() only fails for Window
    instances. I have carefully checked all the functions that use
    this function, and there are no good cases when no fonts won't cause
    problems. In fact, we have a number of functions that specifically
    rely on the fact that ImplInitFontList will populate
    OutputDevice::mpFontCollection with at least one font.
    
    Therefore, I'm making this abort if it can't populate the collection,
    regardless of whether it is a Window, Printer or VirtualDevice.
    
    I have also refactored GetDefaultDevice - I now check the default
    pOutDev parameter to see if it is NULL (the default), in which case
    it is referring to the default window, so I call on
    Application::GetDefaultDevice() instead of going straight to the
    pimpl data structure used by the Application class.
    
    Change-Id: I2861521d876d776d7862fc4a7ec56b7acf818789
    Reviewed-on: https://gerrit.libreoffice.org/8741
    Reviewed-by: Chris Sherlock <chris.sherlock79 at gmail.com>
    Tested-by: Chris Sherlock <chris.sherlock79 at gmail.com>

diff --git a/vcl/source/gdi/outdev3.cxx b/vcl/source/gdi/outdev3.cxx
index 093da2f..6e22bd3 100644
--- a/vcl/source/gdi/outdev3.cxx
+++ b/vcl/source/gdi/outdev3.cxx
@@ -451,16 +451,22 @@ void ImplFontSubstitute( OUString& rFontName )
 Font OutputDevice::GetDefaultFont( sal_uInt16 nType, LanguageType eLang,
                                    sal_uLong nFlags, const OutputDevice* pOutDev )
 {
+    if (!pOutDev) // default is NULL
+        pOutDev = Application::GetDefaultDevice();
+
     LanguageTag aLanguageTag(
             ( eLang == LANGUAGE_NONE || eLang == LANGUAGE_SYSTEM || eLang == LANGUAGE_DONTKNOW ) ?
             Application::GetSettings().GetUILanguageTag() :
             LanguageTag( eLang ));
 
     utl::DefaultFontConfiguration& rDefaults = utl::DefaultFontConfiguration::get();
-    OUString aSearch = rDefaults.getUserInterfaceFont( aLanguageTag ); // ensure a fallback
     OUString aDefault = rDefaults.getDefaultFont( aLanguageTag, nType );
+    OUString aSearch;
+
     if( !aDefault.isEmpty() )
         aSearch = aDefault;
+    else
+        aSearch = rDefaults.getUserInterfaceFont( aLanguageTag ); // use the UI font as a fallback
 
     Font aFont;
     aFont.SetPitch( PITCH_VARIABLE );
@@ -552,11 +558,9 @@ Font OutputDevice::GetDefaultFont( sal_uInt16 nType, LanguageType eLang,
         {
             if ( nFlags & DEFAULTFONT_FLAGS_ONLYONE )
             {
-
-                if( !pOutDev )
-                    pOutDev = (const OutputDevice *)ImplGetSVData()->mpDefaultWin;
                 if( !pOutDev )
                 {
+                    SAL_WARN ("vcl.gdi", "No default window has been set for the application - we really shouldn't be able to get here");
                     sal_Int32 nIndex = 0;
                     aFont.SetName( aSearch.getToken( 0, ';', nIndex ) );
                 }
@@ -1186,26 +1190,28 @@ bool OutputDevice::ImplIsUnderlineAbove( const Font& rFont )
 
 void OutputDevice::ImplInitFontList() const
 {
-    if( ! mpFontCollection->Count() )
+    if( !mpFontCollection->Count() )
     {
         if( mpGraphics || ImplGetGraphics() )
         {
             SAL_INFO( "vcl.gdi", "OutputDevice::ImplInitFontList()" );
             mpGraphics->GetDevFontList( mpFontCollection );
+
+            // There is absolutely no way there should be no fonts available on the device
+            if( !mpFontCollection->Count() )
+            {
+                OUString aError( "Application error: no fonts and no vcl resource found on your system" );
+                ResMgr* pMgr = ImplGetResMgr();
+                if( pMgr )
+                {
+                    OUString aResStr(ResId(SV_ACCESSERROR_NO_FONTS, *pMgr).toString());
+                    if( !aResStr.isEmpty() )
+                        aError = aResStr;
+                }
+                Application::Abort( aError );
+            }
         }
     }
-    if( meOutDevType == OUTDEV_WINDOW && ! mpFontCollection->Count() )
-    {
-        OUString aError( "Application error: no fonts and no vcl resource found on your system" );
-        ResMgr* pMgr = ImplGetResMgr();
-        if( pMgr )
-        {
-            OUString aResStr(ResId(SV_ACCESSERROR_NO_FONTS, *pMgr).toString());
-            if( !aResStr.isEmpty() )
-                aError = aResStr;
-        }
-        Application::Abort( aError );
-    }
 }
 
 void OutputDevice::ImplInitFont() const


More information about the Libreoffice-commits mailing list