summaryrefslogtreecommitdiff
path: root/vcl/source/gdi/outdev3.cxx
diff options
context:
space:
mode:
authorChris Sherlock <chris.sherlock79@gmail.com>2014-03-25 21:54:20 +1100
committerChris Sherlock <chris.sherlock79@gmail.com>2014-03-31 14:10:23 +0000
commitea7102c93c33884a68d4dba0de7d52f8ed4f4579 (patch)
tree5c305379535a9cf466f3df8fe543ff645e2cf0c9 /vcl/source/gdi/outdev3.cxx
parentebf960960a69c1edb5da1994c330ddddbecac44d (diff)
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@gmail.com> Tested-by: Chris Sherlock <chris.sherlock79@gmail.com>
Diffstat (limited to 'vcl/source/gdi/outdev3.cxx')
-rw-r--r--vcl/source/gdi/outdev3.cxx40
1 files changed, 23 insertions, 17 deletions
diff --git a/vcl/source/gdi/outdev3.cxx b/vcl/source/gdi/outdev3.cxx
index 093da2fc6d49..6e22bd3ad52d 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