officecfg/registry/schema/org/openoffice/Office/Common.xcs |   12 ++++++
 vcl/inc/impfontmetricdata.hxx                              |    3 +
 vcl/source/font/fontmetric.cxx                             |   26 ++++++++++++-
 3 files changed, 40 insertions(+), 1 deletion(-)

New commits:
commit 2f529db909f99a2a503ca0347a9d70742b7f05ba
Author: Samuel Mehrbrodt <samuel.mehrbr...@cib.de>
Date:   Fri Mar 23 14:41:01 2018 +0100

    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.mehrbr...@cib.de>
    Tested-by: Samuel Mehrbrodt <samuel.mehrbr...@cib.de>

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;
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to