diff options
author | Luboš Luňák <l.lunak@suse.cz> | 2013-06-07 11:31:05 +0200 |
---|---|---|
committer | Luboš Luňák <l.lunak@suse.cz> | 2013-06-13 12:01:12 +0200 |
commit | d16f1df93976e13f136ab35f32765232d73e5e08 (patch) | |
tree | 71875964075783817488e4bff7b0e114b6ffe298 | |
parent | 10362c7aef210abd1f5d1e78ea3b7884b656e510 (diff) |
ugly workaround for external leading with symbol fonts (bnc#823626)
I'd much rather find the code using external leading in Writer's layout,
but this font rendering and layout stuff is so complicated.
Change-Id: Iaf58af387a6727eb18f5a9d1613de3ae30d7c35e
-rw-r--r-- | sw/source/core/txtnode/fntcache.cxx | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/sw/source/core/txtnode/fntcache.cxx b/sw/source/core/txtnode/fntcache.cxx index bf1537006411..536bfbae1cf7 100644 --- a/sw/source/core/txtnode/fntcache.cxx +++ b/sw/source/core/txtnode/fntcache.cxx @@ -372,6 +372,14 @@ sal_uInt16 SwFntObj::GetFontHeight( const ViewShell* pSh, const OutputDevice& rO return nRet; } +static bool IsStarSymbol(const rtl::OUString &rFontName) +{ + sal_uInt16 nIndex = 0; + rtl::OUString sFamilyNm(GetNextFontToken(rFontName, nIndex)); + return (sFamilyNm.equalsIgnoreAsciiCase("starsymbol") || + sFamilyNm.equalsIgnoreAsciiCase("opensymbol")); +} + sal_uInt16 SwFntObj::GetFontLeading( const ViewShell *pSh, const OutputDevice& rOut ) { sal_uInt16 nRet = 0; @@ -389,6 +397,23 @@ sal_uInt16 SwFntObj::GetFontLeading( const ViewShell *pSh, const OutputDevice& r bSymbol = RTL_TEXTENCODING_SYMBOL == aMet.GetCharSet(); GuessLeading( *pSh, aMet ); nExtLeading = static_cast<sal_uInt16>(aMet.GetExtLeading()); + /* HACK: There is something wrong with Writer's bullet rendering, causing lines + with bullets to be higher than they should be. I think this is because + Writer uses font's external leading incorrect, as the vertical distance + added to every line instead of only a distance between multiple lines, + which means a single bullet has external leading added even though it + shouldn't, but frankly this is just an educated guess rather than understanding + Writer's layout (heh). + Symbol font in some documents is 'StarSymbol; Arial Unicode MS', and Windows + machines often do not have StarSymbol, falling back to Arial Unicode MS, which + has unusually high external leading. So just reset external leading for fonts + which are used to bullets, as those should not be used on multiple lines anyway, + so in correct rendering external leading should be irrelevant anyway. + Interestingly enough, bSymbol is false for 'StarSymbol; Arial Unicode MS', so + also check explicitly. + */ + if( bSymbol || IsStarSymbol( pPrtFont->GetName())) + nExtLeading = 0; } const IDocumentSettingAccess& rIDSA = *pSh->getIDocumentSettingAccess(); |