summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Mehrbrodt <Samuel.Mehrbrodt@cib.de>2018-03-23 14:41:01 +0100
committerSamuel Mehrbrodt <Samuel.Mehrbrodt@cib.de>2018-05-30 14:02:28 +0200
commitd71eb1e4476d7abfe25306338527a359cd22ba09 (patch)
treeeb1740380e4e2373d1510f869924b7538a096743
parente42f6174d30c9f2211bdaffdefb011eeb9ead1fc (diff)
tdf#116498 Use win metrics for 'DIN Light' font
This adds a special treatment for fonts which rely on the win metrics for correct line spacing calculation. At the moment, only 'DIN Light' is known to need that treatment. Change-Id: Idd9fd6f63083ab7a706e0cbcd33a947d4949d4e9 Reviewed-on: https://gerrit.libreoffice.org/53962 Reviewed-by: Samuel Mehrbrodt <Samuel.Mehrbrodt@cib.de> Tested-by: Samuel Mehrbrodt <Samuel.Mehrbrodt@cib.de> (cherry picked from commit 2f529db909f99a2a503ca0347a9d70742b7f05ba) Reviewed-on: https://gerrit.libreoffice.org/55047 Tested-by: Jenkins <ci@libreoffice.org>
-rw-r--r--officecfg/registry/schema/org/openoffice/Office/Common.xcs12
-rw-r--r--vcl/inc/impfontmetricdata.hxx3
-rw-r--r--vcl/source/font/fontmetric.cxx26
3 files changed, 40 insertions, 1 deletions
diff --git a/officecfg/registry/schema/org/openoffice/Office/Common.xcs b/officecfg/registry/schema/org/openoffice/Office/Common.xcs
index 88b6f3b07f1b..3d73cc94deb2 100644
--- a/officecfg/registry/schema/org/openoffice/Office/Common.xcs
+++ b/officecfg/registry/schema/org/openoffice/Office/Common.xcs
@@ -5295,6 +5295,18 @@
</info>
<value>EmojiOne Color</value>
</prop>
+ <prop oor:name="FontsUseWinMetrics" oor:type="oor:string-list" oor:nillable="false">
+ <info>
+ <desc>
+ Fonts where the win metrics need to be considered in order to display the font correctly
+ Fonts are identified by their name and the font metrics (see fontmetric.cxx:ShouldUseWinMetrics).
+ </desc>
+ </info>
+ <value>
+ <!-- DIN Light (ttf version) has odd metrics. The otf version works fine. -->
+ <it>DIN Light,1509,-503,1509,-483,1997,483</it>
+ </value>
+ </prop>
<prop oor:name="PluginsEnabled" oor:type="xs:boolean" oor:nillable="false">
<!-- OldPath: ? -->
<!-- OldLocation: soffice.ini -->
diff --git a/vcl/inc/impfontmetricdata.hxx b/vcl/inc/impfontmetricdata.hxx
index f08e86fdc914..28e0ab3798a2 100644
--- a/vcl/inc/impfontmetricdata.hxx
+++ b/vcl/inc/impfontmetricdata.hxx
@@ -23,6 +23,7 @@
#include <vcl/dllapi.h>
#include <tools/ref.hxx>
#include "fontattributes.hxx"
+#include "sft.hxx"
#include <vector>
@@ -96,6 +97,8 @@ public:
int nUPEM);
private:
+ bool ShouldUseWinMetrics(vcl::TTGlobalFontInfo& rInfo);
+
// font instance attributes from the font request
long mnHeight; // Font size
long mnWidth; // Reference Width
diff --git a/vcl/source/font/fontmetric.cxx b/vcl/source/font/fontmetric.cxx
index b619219c44ce..b54e41a1202a 100644
--- a/vcl/source/font/fontmetric.cxx
+++ b/vcl/source/font/fontmetric.cxx
@@ -18,6 +18,7 @@
*/
#include <i18nlangtag/mslangid.hxx>
+#include <officecfg/Office/Common.hxx>
#include <vcl/fontcharmap.hxx>
#include <vcl/metric.hxx>
@@ -28,6 +29,8 @@
#include <PhysicalFontFace.hxx>
#include <sft.hxx>
+#include <com/sun/star/uno/Sequence.hxx>
+
#include <vector>
#include <set>
#include <cstdio>
@@ -398,6 +401,27 @@ void ImplFontMetricData::ImplInitFlags( const OutputDevice* pDev )
SetFullstopCenteredFlag( bCentered );
}
+bool ImplFontMetricData::ShouldUseWinMetrics(vcl::TTGlobalFontInfo& rInfo)
+{
+ OUString aFontIdentifier(
+ GetFamilyName() + ","
+ + OUString::number(rInfo.ascender) + "," + OUString::number(rInfo.descender) + ","
+ + OUString::number(rInfo.typoAscender) + "," + OUString::number(rInfo.typoDescender) + ","
+ + OUString::number(rInfo.winAscent) + "," + OUString::number(rInfo.winDescent));
+
+ css::uno::Sequence<OUString> rWinMetricFontList(
+ officecfg::Office::Common::Misc::FontsUseWinMetrics::get());
+ for (int i = 0; i < rWinMetricFontList.getLength(); ++i)
+ {
+ if (aFontIdentifier == rWinMetricFontList[i])
+ {
+ SAL_INFO("vcl.gdi.fontmetric", "Using win metrics for: " << aFontIdentifier);
+ return true;
+ }
+ }
+ return false;
+}
+
/*
* Calculate line spacing:
*
@@ -440,7 +464,7 @@ void ImplFontMetricData::ImplCalcLineSpacing(const std::vector<uint8_t>& rHheaDa
if (rInfo.winAscent || rInfo.winDescent ||
rInfo.typoAscender || rInfo.typoDescender)
{
- if (fAscent == 0 && fDescent == 0)
+ if (ShouldUseWinMetrics(rInfo) || (fAscent == 0.0 && fDescent == 0.0))
{
fAscent = rInfo.winAscent * fScale;
fDescent = rInfo.winDescent * fScale;