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

Jan-Marek Glogowski (via logerrit) logerrit at kemper.freedesktop.org
Fri Sep 11 17:42:52 UTC 2020


 vcl/inc/sft.hxx               |   16 ++++++++++++++++
 vcl/qt5/Qt5Graphics_Text.cxx  |    7 ++++++-
 vcl/source/fontsubset/sft.cxx |   26 +++++++++++++++++---------
 3 files changed, 39 insertions(+), 10 deletions(-)

New commits:
commit e9b9044f7b7b44b45dd582885cad0b0a7d44f88b
Author:     Jan-Marek Glogowski <glogow at fbihome.de>
AuthorDate: Mon Sep 7 23:59:13 2020 +0200
Commit:     Jan-Marek Glogowski <glogow at fbihome.de>
CommitDate: Fri Sep 11 19:42:09 2020 +0200

    tdf#125234 Qt5 set glpyh font bounding box
    
    Not sure if this is strictly needed, and obviously it will be
    "wrong" for a sub font containing just some of the glyphs, but
    since other backends also do this, follow suit.
    
    Change-Id: Ib83542b685b38d800d09b7a19780f9ac619c7ad0
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/102487
    Tested-by: Jenkins
    Reviewed-by: Jan-Marek Glogowski <glogow at fbihome.de>

diff --git a/vcl/inc/sft.hxx b/vcl/inc/sft.hxx
index 2aef3a67d2e5..89853335db54 100644
--- a/vcl/inc/sft.hxx
+++ b/vcl/inc/sft.hxx
@@ -674,6 +674,22 @@ class TrueTypeFont;
  */
     VCL_DLLPUBLIC void GetTTGlobalFontInfo(TrueTypeFont *ttf, TTGlobalFontInfo *info);
 
+/**
+ * Returns part of the head table info, normally collected by GetTTGlobalFontInfo.
+ *
+ * Just implemented separate, because this info not available via Qt API.
+ *
+ * @param ttf         pointer to a AbstractTrueTypeFont structure
+ * @param xMin        global glyph bounding box min X
+ * @param yMin        global glyph bounding box min Y
+ * @param xMax        global glyph bounding box max X
+ * @param yMax        global glyph bounding box max Y
+ * @param macStyle    encoded Mac style flags of the font
+ * @return            true, if table data could be decoded
+ * @ingroup sft
+ */
+    VCL_DLLPUBLIC bool GetTTGlobalFontHeadInfo(AbstractTrueTypeFont *ttf, int& xMin, int& yMin, int& xMax, int& yMax, sal_uInt16& macStyle);
+
 /**
  * Returns fonts metrics.
  * @see TTGlobalFontInfo
diff --git a/vcl/qt5/Qt5Graphics_Text.cxx b/vcl/qt5/Qt5Graphics_Text.cxx
index a42d35ae6391..c533ad1d599a 100644
--- a/vcl/qt5/Qt5Graphics_Text.cxx
+++ b/vcl/qt5/Qt5Graphics_Text.cxx
@@ -238,6 +238,12 @@ bool Qt5Graphics::CreateFontSubset(const OUString& rToFile, const PhysicalFontFa
     rInfo.m_nAscent = aRawFont.ascent();
     rInfo.m_nDescent = aRawFont.descent();
 
+    Qt5TrueTypeFont aTTF(aRawFont);
+    int nXmin, nYmin, nXmax, nYmax;
+    sal_uInt16 nMacStyleFlags;
+    if (GetTTGlobalFontHeadInfo(&aTTF, nXmin, nYmin, nXmax, nYmax, nMacStyleFlags))
+        rInfo.m_aFontBBox = tools::Rectangle(Point(nXmin, nYmin), Point(nXmax, nYmax));
+
     sal_uInt16 aShortIDs[nGlyphCount + 1];
     sal_uInt8 aTempEncs[nGlyphCount + 1];
 
@@ -278,7 +284,6 @@ bool Qt5Graphics::CreateFontSubset(const OUString& rToFile, const PhysicalFontFa
         pGlyphWidths[i] = pGlyphMetrics[i];
 
     // write subset into destination file
-    Qt5TrueTypeFont aTTF(aRawFont);
     vcl::SFErrCodes nRC
         = vcl::CreateTTFromTTGlyphs(&aTTF, aToFile.getStr(), aShortIDs, aTempEncs, nGlyphCount);
     return (nRC == vcl::SFErrCodes::Ok);
diff --git a/vcl/source/fontsubset/sft.cxx b/vcl/source/fontsubset/sft.cxx
index 30a6e37d1745..6eabe8480608 100644
--- a/vcl/source/fontsubset/sft.cxx
+++ b/vcl/source/fontsubset/sft.cxx
@@ -2364,6 +2364,22 @@ void GetTTFontMetrics(const uint8_t *pHhea, size_t nHhea,
     }
 }
 
+bool GetTTGlobalFontHeadInfo(AbstractTrueTypeFont *ttf, int& xMin, int& yMin, int& xMax, int& yMax, sal_uInt16& macStyle)
+{
+    sal_uInt32 table_size;
+    const sal_uInt8* table = ttf->table(O_head, table_size);
+    if (table_size < 46)
+        return false;
+
+    const int UPEm = ttf->unitsPerEm();
+    xMin = XUnits(UPEm, GetInt16(table, HEAD_xMin_offset));
+    yMin = XUnits(UPEm, GetInt16(table, HEAD_yMin_offset));
+    xMax = XUnits(UPEm, GetInt16(table, HEAD_xMax_offset));
+    yMax = XUnits(UPEm, GetInt16(table, HEAD_yMax_offset));
+    macStyle = GetUInt16(table, HEAD_macStyle_offset);
+    return true;
+}
+
 void GetTTGlobalFontInfo(TrueTypeFont *ttf, TTGlobalFontInfo *info)
 {
     int UPEm = ttf->unitsPerEm();
@@ -2406,15 +2422,7 @@ void GetTTGlobalFontInfo(TrueTypeFont *ttf, TTGlobalFontInfo *info)
         info->italicAngle = GetInt32(table, POST_italicAngle_offset);
     }
 
-    table = ttf->table(O_head, table_size);      /* 'head' tables is always there */
-    if (table_size >= 46)
-    {
-        info->xMin = XUnits(UPEm, GetInt16(table, HEAD_xMin_offset));
-        info->yMin = XUnits(UPEm, GetInt16(table, HEAD_yMin_offset));
-        info->xMax = XUnits(UPEm, GetInt16(table, HEAD_xMax_offset));
-        info->yMax = XUnits(UPEm, GetInt16(table, HEAD_yMax_offset));
-        info->macStyle = GetUInt16(table, HEAD_macStyle_offset);
-    }
+    GetTTGlobalFontHeadInfo(ttf, info->xMin, info->yMin, info->xMax, info->yMax, info->macStyle);
 
     table  = ttf->table(O_hhea, table_size);
     if (table_size >= 10)


More information about the Libreoffice-commits mailing list