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

Jan-Marek Glogowski (via logerrit) logerrit at kemper.freedesktop.org
Sat Aug 15 11:19:28 UTC 2020


 vcl/inc/qt5/Qt5FontFace.hxx    |    1 
 vcl/inc/sft.hxx                |   50 +++++++-----
 vcl/qt5/Qt5FontFace.cxx        |    7 +
 vcl/qt5/Qt5Graphics_Text.cxx   |  160 +++++++++++++++++++++++++++++++++++++++--
 vcl/source/fontsubset/sft.cxx  |   53 +++++++------
 vcl/source/fontsubset/ttcr.cxx |    2 
 vcl/source/fontsubset/ttcr.hxx |    2 
 7 files changed, 226 insertions(+), 49 deletions(-)

New commits:
commit 5a888c5fd295f9b98dee9ce930e653cb63a02857
Author:     Jan-Marek Glogowski <glogow at fbihome.de>
AuthorDate: Fri Aug 14 05:53:26 2020 +0200
Commit:     Jan-Marek Glogowski <glogow at fbihome.de>
CommitDate: Sat Aug 15 13:18:43 2020 +0200

    tdf#125234 Qt5 implement CreateFontSubset
    
    This abstracts the just refactored vcl::TrueTypeFont class, so the
    Qt5 backend can provide it's own QRawFont based font table access.
    
    Change-Id: Ic71bc95bc8fe39bc7a32086d4adc78cfa00d15be
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/100718
    Tested-by: Jenkins
    Reviewed-by: Jan-Marek Glogowski <glogow at fbihome.de>

diff --git a/vcl/inc/qt5/Qt5FontFace.hxx b/vcl/inc/qt5/Qt5FontFace.hxx
index 585f4aaa87bf..f9853af0f8c9 100644
--- a/vcl/inc/qt5/Qt5FontFace.hxx
+++ b/vcl/inc/qt5/Qt5FontFace.hxx
@@ -45,6 +45,7 @@ public:
 
     sal_IntPtr GetFontId() const override;
 
+    QFont CreateFont() const;
     int GetFontTable(const char pTagName[5], unsigned char*) const;
 
     const FontCharMapRef& GetFontCharMap() const;
diff --git a/vcl/inc/sft.hxx b/vcl/inc/sft.hxx
index 6bcf40f03824..2aef3a67d2e5 100644
--- a/vcl/inc/sft.hxx
+++ b/vcl/inc/sft.hxx
@@ -447,6 +447,7 @@ constexpr sal_uInt32 T_fpgm = 0x6670676D;
 constexpr sal_uInt32 T_gsub = 0x47535542;
 constexpr sal_uInt32 T_CFF  = 0x43464620;
 
+class AbstractTrueTypeFont;
 class TrueTypeFont;
 
 /**
@@ -512,7 +513,7 @@ class TrueTypeFont;
  * @ingroup sft
  *
  */
-    int GetTTGlyphPoints(TrueTypeFont *ttf, sal_uInt32 glyphID, ControlPoint **pointArray);
+    int GetTTGlyphPoints(AbstractTrueTypeFont *ttf, sal_uInt32 glyphID, ControlPoint **pointArray);
 
 /**
  * Extracts raw glyph data from the 'glyf' table and returns it in an allocated
@@ -526,7 +527,7 @@ class TrueTypeFont;
  * @ingroup sft
  *
  */
-    GlyphData *GetTTRawGlyphData(TrueTypeFont *ttf, sal_uInt32 glyphID);
+    GlyphData *GetTTRawGlyphData(AbstractTrueTypeFont *ttf, sal_uInt32 glyphID);
 
 /**
  * For a specified glyph adds all component glyphs IDs to the list and
@@ -543,7 +544,7 @@ class TrueTypeFont;
  * @ingroup sft
  *
  */
-    int GetTTGlyphComponents(TrueTypeFont *ttf, sal_uInt32 glyphID, std::vector< sal_uInt32 >& glyphlist);
+    int GetTTGlyphComponents(AbstractTrueTypeFont *ttf, sal_uInt32 glyphID, std::vector< sal_uInt32 >& glyphlist);
 
 /**
  * Extracts all Name Records from the font and stores them in an allocated
@@ -556,7 +557,7 @@ class TrueTypeFont;
  * @ingroup sft
  */
 
-    int GetTTNameRecords(TrueTypeFont const *ttf, NameRecord **nr);
+    int GetTTNameRecords(AbstractTrueTypeFont const *ttf, NameRecord **nr);
 
 /**
  * Deallocates previously allocated array of NameRecords.
@@ -604,7 +605,7 @@ class TrueTypeFont;
  * @ingroup sft
  *
  */
-    VCL_DLLPUBLIC SFErrCodes CreateTTFromTTGlyphs(TrueTypeFont  *ttf,
+    VCL_DLLPUBLIC SFErrCodes CreateTTFromTTGlyphs(AbstractTrueTypeFont  *ttf,
                               const char    *fname,
                               sal_uInt16 const *glyphArray,
                               sal_uInt8 const *encoding,
@@ -647,7 +648,7 @@ class TrueTypeFont;
  * @ingroup sft
  *
  */
-    VCL_DLLPUBLIC std::unique_ptr<sal_uInt16[]> GetTTSimpleGlyphMetrics(TrueTypeFont const *ttf, const sal_uInt16 *glyphArray, int nGlyphs, bool vertical);
+    VCL_DLLPUBLIC std::unique_ptr<sal_uInt16[]> GetTTSimpleGlyphMetrics(AbstractTrueTypeFont const *ttf, const sal_uInt16 *glyphArray, int nGlyphs, bool vertical);
 
 #if defined(_WIN32) || defined(MACOSX) || defined(IOS)
 /**
@@ -709,7 +710,7 @@ constexpr int O_gsub = 15;   /* 'GSUB' */
 constexpr int O_CFF = 16;   /* 'CFF' */
 constexpr int NUM_TAGS = 17;
 
-class TrueTypeFont final
+class VCL_DLLPUBLIC AbstractTrueTypeFont
 {
     char* m_pFileName;
     sal_uInt32 m_nGlyphs;
@@ -718,6 +719,26 @@ class TrueTypeFont final
     sal_uInt32 m_nVertMetrics; /* if not 0 => font has vertical metrics information */
     sal_uInt32 m_nUnitsPerEm;
 
+protected:
+    SFErrCodes indexGlyphData();
+
+public:
+    AbstractTrueTypeFont(const char* fileName = nullptr);
+    virtual ~AbstractTrueTypeFont();
+
+    const char* fileName() const { return m_pFileName; }
+    sal_uInt32 glyphCount() const { return m_nGlyphs; }
+    sal_uInt32 glyphOffset(sal_uInt32 glyphID) const { return m_pGlyphOffsets[glyphID]; }
+    sal_uInt32 horzMetricCount() const { return m_nHorzMetrics; }
+    sal_uInt32 vertMetricCount() const { return m_nVertMetrics; }
+    sal_uInt32 unitsPerEm() const { return m_nUnitsPerEm; }
+
+    virtual bool hasTable(sal_uInt32 ord) const = 0;
+    virtual const sal_uInt8* table(sal_uInt32 ord, sal_uInt32& size) const = 0;
+};
+
+class TrueTypeFont final : public AbstractTrueTypeFont
+{
     struct TTFontTable_
     {
         const sal_uInt8* pData = nullptr; /* pointer to a raw subtable in the SFNT file */
@@ -726,8 +747,6 @@ class TrueTypeFont final
 
     std::array<struct TTFontTable_, NUM_TAGS> m_aTableList;
 
-    SFErrCodes indexGlyphData();
-
 public:
         sal_Int32   fsize;
         sal_uInt8   *ptr;
@@ -744,19 +763,12 @@ public:
         sal_uInt32 (*mapper)(const sal_uInt8 *, sal_uInt32, sal_uInt32); /* character to glyphID translation function                          */
 
     TrueTypeFont(const char* pFileName = nullptr);
-    ~TrueTypeFont();
+    ~TrueTypeFont() override;
 
     SFErrCodes open(sal_uInt32 facenum);
 
-    const char* fileName() const { return m_pFileName; }
-    sal_uInt32 glyphCount() const { return m_nGlyphs; }
-    sal_uInt32 glyphOffset(sal_uInt32 glyphID) const { return m_pGlyphOffsets[glyphID]; }
-    sal_uInt32 horzMetricCount() const { return m_nHorzMetrics; }
-    sal_uInt32 vertMetricCount() const { return m_nVertMetrics; }
-    sal_uInt32 unitsPerEm() const { return m_nUnitsPerEm; }
-
-    bool hasTable(sal_uInt32 ord) const { return m_aTableList[ord].pData != nullptr; }
-    inline const sal_uInt8* table(sal_uInt32 ord, sal_uInt32& size) const;
+    bool hasTable(sal_uInt32 ord) const override { return m_aTableList[ord].pData != nullptr; }
+    inline const sal_uInt8* table(sal_uInt32 ord, sal_uInt32& size) const override;
 };
 
 const sal_uInt8* TrueTypeFont::table(sal_uInt32 ord, sal_uInt32& size) const
diff --git a/vcl/qt5/Qt5FontFace.cxx b/vcl/qt5/Qt5FontFace.cxx
index 8ac2f87d1843..d02e61955103 100644
--- a/vcl/qt5/Qt5FontFace.cxx
+++ b/vcl/qt5/Qt5FontFace.cxx
@@ -149,6 +149,13 @@ Qt5FontFace::Qt5FontFace(const FontAttributes& rFA, const QString& rFontID)
 
 sal_IntPtr Qt5FontFace::GetFontId() const { return reinterpret_cast<sal_IntPtr>(&m_aFontId); }
 
+QFont Qt5FontFace::CreateFont() const
+{
+    QFont aFont;
+    aFont.fromString(m_aFontId);
+    return aFont;
+}
+
 rtl::Reference<LogicalFontInstance>
 Qt5FontFace::CreateFontInstance(const FontSelectPattern& rFSD) const
 {
diff --git a/vcl/qt5/Qt5Graphics_Text.cxx b/vcl/qt5/Qt5Graphics_Text.cxx
index 4ba009106d26..8ee299debfd0 100644
--- a/vcl/qt5/Qt5Graphics_Text.cxx
+++ b/vcl/qt5/Qt5Graphics_Text.cxx
@@ -22,6 +22,7 @@
 #include <Qt5Font.hxx>
 #include <Qt5Painter.hxx>
 
+#include <fontsubset.hxx>
 #include <vcl/fontcharmap.hxx>
 #include <unx/geninst.h>
 #include <unx/fontmanager.hxx>
@@ -129,12 +130,161 @@ bool Qt5Graphics::AddTempDevFont(PhysicalFontCollection*, const OUString& /*rFil
     return false;
 }
 
-bool Qt5Graphics::CreateFontSubset(const OUString& /*rToFile*/, const PhysicalFontFace* /*pFont*/,
-                                   const sal_GlyphId* /*pGlyphIds*/, const sal_uInt8* /*pEncoding*/,
-                                   sal_Int32* /*pWidths*/, int /*nGlyphs*/,
-                                   FontSubsetInfo& /*rInfo*/)
+namespace
 {
-    return false;
+class Qt5TrueTypeFont : public vcl::AbstractTrueTypeFont
+{
+    const QRawFont& m_aRawFont;
+    mutable QByteArray m_aFontTable[vcl::NUM_TAGS];
+
+public:
+    Qt5TrueTypeFont(const QRawFont& aRawFont);
+
+    bool hasTable(sal_uInt32 ord) const override;
+    const sal_uInt8* table(sal_uInt32 ord, sal_uInt32& size) const override;
+};
+
+Qt5TrueTypeFont::Qt5TrueTypeFont(const QRawFont& aRawFont)
+    : m_aRawFont(aRawFont)
+{
+    indexGlyphData();
+}
+
+const char* vclFontTableAsChar(sal_uInt32 ord)
+{
+    switch (ord)
+    {
+        case vcl::O_maxp:
+            return "maxp";
+        case vcl::O_glyf:
+            return "glyf";
+        case vcl::O_head:
+            return "head";
+        case vcl::O_loca:
+            return "loca";
+        case vcl::O_name:
+            return "name";
+        case vcl::O_hhea:
+            return "hhea";
+        case vcl::O_hmtx:
+            return "hmtx";
+        case vcl::O_cmap:
+            return "cmap";
+        case vcl::O_vhea:
+            return "vhea";
+        case vcl::O_vmtx:
+            return "vmtx";
+        case vcl::O_OS2:
+            return "OS/2";
+        case vcl::O_post:
+            return "post";
+        case vcl::O_cvt:
+            return "cvt ";
+        case vcl::O_prep:
+            return "prep";
+        case vcl::O_fpgm:
+            return "fpgm";
+        case vcl::O_gsub:
+            return "gsub";
+        case vcl::O_CFF:
+            return "CFF ";
+        default:
+            return nullptr;
+    }
+}
+
+bool Qt5TrueTypeFont::hasTable(sal_uInt32 ord) const
+{
+    const char* table_char = vclFontTableAsChar(ord);
+    if (!table_char)
+        return false;
+    if (m_aFontTable[ord].isEmpty())
+        m_aFontTable[ord] = m_aRawFont.fontTable(table_char);
+    return !m_aFontTable[ord].isEmpty();
+}
+
+const sal_uInt8* Qt5TrueTypeFont::table(sal_uInt32 ord, sal_uInt32& size) const
+{
+    const char* table_char = vclFontTableAsChar(ord);
+    if (!table_char)
+        return nullptr;
+    if (m_aFontTable[ord].isEmpty())
+        m_aFontTable[ord] = m_aRawFont.fontTable(table_char);
+    size = m_aFontTable[ord].size();
+    return reinterpret_cast<const sal_uInt8*>(m_aFontTable[ord].data());
+}
+}
+
+bool Qt5Graphics::CreateFontSubset(const OUString& rToFile, const PhysicalFontFace* pFontFace,
+                                   const sal_GlyphId* pGlyphIds, const sal_uInt8* pEncoding,
+                                   sal_Int32* pGlyphWidths, int nGlyphCount, FontSubsetInfo& rInfo)
+{
+    // prepare the requested file name for writing the font-subset file
+    OUString aSysPath;
+    if (osl_File_E_None != osl_getSystemPathFromFileURL(rToFile.pData, &aSysPath.pData))
+        return false;
+
+    // get the raw-bytes from the font to be subset
+    const QFont aFont = static_cast<const Qt5FontFace*>(pFontFace)->CreateFont();
+    const QRawFont aRawFont(QRawFont::fromFont(aFont));
+    const QFontInfo aFontInfo(aFont);
+    const OString aToFile(OUStringToOString(aSysPath, osl_getThreadTextEncoding()));
+    const int nOrigGlyphCount = nGlyphCount;
+
+    // get details about the subsetted font
+    rInfo.m_nFontType = FontType::SFNT_TTF;
+    rInfo.m_aPSName = toOUString(aRawFont.familyName());
+    rInfo.m_nCapHeight = aRawFont.capHeight();
+    rInfo.m_nAscent = aRawFont.ascent();
+    rInfo.m_nDescent = aRawFont.descent();
+
+    sal_uInt16 aShortIDs[nGlyphCount + 1];
+    sal_uInt8 aTempEncs[nGlyphCount + 1];
+    quint32 aQtGlyphId[nGlyphCount + 1];
+
+    int nNotDef = -1;
+
+    for (int i = 0; i < nGlyphCount; ++i)
+    {
+        aTempEncs[i] = pEncoding[i];
+
+        sal_GlyphId aGlyphId(pGlyphIds[i]);
+        aShortIDs[i] = static_cast<sal_uInt16>(aGlyphId);
+        aQtGlyphId[i] = aShortIDs[i];
+        if (!aGlyphId && nNotDef < 0)
+            nNotDef = i; // first NotDef glyph found
+    }
+
+    if (nNotDef != 0)
+    {
+        // add fake NotDef glyph if needed
+        if (nNotDef < 0)
+            nNotDef = nGlyphCount++;
+        // NotDef glyph must be in pos 0 => swap glyphids
+        aShortIDs[nNotDef] = aShortIDs[0];
+        aTempEncs[nNotDef] = aTempEncs[0];
+        aQtGlyphId[nNotDef] = aQtGlyphId[0];
+        aShortIDs[0] = 0;
+        aTempEncs[0] = 0;
+        aQtGlyphId[0] = 0;
+    }
+
+    QPointF anAdvanceList[nGlyphCount];
+    if (!aRawFont.advancesForGlyphIndexes(aQtGlyphId, anAdvanceList, nGlyphCount))
+        return false;
+
+    QPointF nNotDefAdv = anAdvanceList[0];
+    anAdvanceList[0] = anAdvanceList[nNotDef];
+    anAdvanceList[nNotDef] = nNotDefAdv;
+
+    for (int i = 0; i < nOrigGlyphCount; ++i)
+        pGlyphWidths[i] = round(anAdvanceList[i].x());
+
+    // write subset into destination file
+    Qt5TrueTypeFont aTTF(aRawFont);
+    vcl::SFErrCodes nRC
+        = vcl::CreateTTFromTTGlyphs(&aTTF, aToFile.getStr(), aShortIDs, aTempEncs, nGlyphCount);
+    return (nRC == vcl::SFErrCodes::Ok);
 }
 
 const void* Qt5Graphics::GetEmbedFontData(const PhysicalFontFace*, long* /*pDataLen*/)
diff --git a/vcl/source/fontsubset/sft.cxx b/vcl/source/fontsubset/sft.cxx
index d18536e7a389..7de35fa3c088 100644
--- a/vcl/source/fontsubset/sft.cxx
+++ b/vcl/source/fontsubset/sft.cxx
@@ -315,7 +315,7 @@ static void HexFmtBlockWrite(HexFmt *_this, const void *ptr, sal_uInt32 size)
 /* Outline Extraction functions */
 
 /* fills the aw and lsb entries of the TTGlyphMetrics structure from hmtx table -*/
-static void GetMetrics(TrueTypeFont const *ttf, sal_uInt32 glyphID, TTGlyphMetrics *metrics)
+static void GetMetrics(AbstractTrueTypeFont const *ttf, sal_uInt32 glyphID, TTGlyphMetrics *metrics)
 {
     sal_uInt32 nSize;
     const sal_uInt8* table = ttf->table(O_hmtx, nSize);
@@ -345,10 +345,10 @@ static void GetMetrics(TrueTypeFont const *ttf, sal_uInt32 glyphID, TTGlyphMetri
         metrics->ah = GetUInt16(table, 4 * (ttf->vertMetricCount() - 1));
 }
 
-static int GetTTGlyphOutline(TrueTypeFont *, sal_uInt32 , ControlPoint **, TTGlyphMetrics *, std::vector< sal_uInt32 >* );
+static int GetTTGlyphOutline(AbstractTrueTypeFont *, sal_uInt32 , ControlPoint **, TTGlyphMetrics *, std::vector< sal_uInt32 >* );
 
 /* returns the number of control points, allocates the pointArray */
-static int GetSimpleTTOutline(TrueTypeFont const *ttf, sal_uInt32 glyphID, ControlPoint **pointArray, TTGlyphMetrics *metrics)
+static int GetSimpleTTOutline(AbstractTrueTypeFont const *ttf, sal_uInt32 glyphID, ControlPoint **pointArray, TTGlyphMetrics *metrics)
 {
     sal_uInt32 nTableSize;
     const sal_uInt8* table = ttf->table(O_glyf, nTableSize);
@@ -474,7 +474,7 @@ static F16Dot16 fromF2Dot14(sal_Int16 n)
     return sal_uInt32(n) << 2;
 }
 
-static int GetCompoundTTOutline(TrueTypeFont *ttf, sal_uInt32 glyphID, ControlPoint **pointArray, TTGlyphMetrics *metrics, std::vector< sal_uInt32 >& glyphlist)
+static int GetCompoundTTOutline(AbstractTrueTypeFont *ttf, sal_uInt32 glyphID, ControlPoint **pointArray, TTGlyphMetrics *metrics, std::vector< sal_uInt32 >& glyphlist)
 {
     sal_uInt16 flags, index;
     sal_Int16 e, f;
@@ -643,7 +643,7 @@ static int GetCompoundTTOutline(TrueTypeFont *ttf, sal_uInt32 glyphID, ControlPo
  * a composite glyph. This is a safeguard against endless recursion
  * in corrupted fonts.
  */
-static int GetTTGlyphOutline(TrueTypeFont *ttf, sal_uInt32 glyphID, ControlPoint **pointArray, TTGlyphMetrics *metrics, std::vector< sal_uInt32 >* glyphlist)
+static int GetTTGlyphOutline(AbstractTrueTypeFont *ttf, sal_uInt32 glyphID, ControlPoint **pointArray, TTGlyphMetrics *metrics, std::vector< sal_uInt32 >* glyphlist)
 {
     sal_uInt32 nSize;
     const sal_uInt8 *table = ttf->table(O_glyf, nSize);
@@ -1448,13 +1448,26 @@ bool withinBounds(sal_uInt32 tdoffset, sal_uInt32 moreoffset, sal_uInt32 len, sa
 }
 }
 
-TrueTypeFont::TrueTypeFont(const char* pFileName)
+AbstractTrueTypeFont::AbstractTrueTypeFont(const char* pFileName)
     : m_pFileName(nullptr)
     , m_nGlyphs(0xFFFFFFFF)
     , m_pGlyphOffsets(nullptr)
     , m_nHorzMetrics(0)
     , m_nVertMetrics(0)
     , m_nUnitsPerEm(0)
+{
+    if (pFileName)
+        m_pFileName = strdup(pFileName);
+}
+
+AbstractTrueTypeFont::~AbstractTrueTypeFont()
+{
+    free(m_pFileName);
+    free(m_pGlyphOffsets);
+}
+
+TrueTypeFont::TrueTypeFont(const char* pFileName)
+    : AbstractTrueTypeFont(pFileName)
     , fsize(-1)
     , ptr(nullptr)
     , psname(nullptr)
@@ -1466,18 +1479,14 @@ TrueTypeFont::TrueTypeFont(const char* pFileName)
     , cmap(nullptr)
     , cmapType(0)
 {
-    if (pFileName)
-        m_pFileName = strdup(pFileName);
 }
 
 TrueTypeFont::~TrueTypeFont()
 {
 #if !defined(_WIN32)
-    if (m_pFileName)
+    if (fileName())
         munmap(ptr, fsize);
 #endif
-    free(m_pFileName);
-    free(m_pGlyphOffsets);
     free(psname);
     free(family);
     free(ufamily);
@@ -1487,7 +1496,7 @@ TrueTypeFont::~TrueTypeFont()
 
 void CloseTTFont(TrueTypeFont* ttf) { delete ttf; }
 
-SFErrCodes TrueTypeFont::indexGlyphData()
+SFErrCodes AbstractTrueTypeFont::indexGlyphData()
 {
     if (!(hasTable(O_maxp) && hasTable(O_head) && hasTable(O_name) && hasTable(O_cmap)))
         return SFErrCodes::TtFormat;
@@ -1699,12 +1708,12 @@ SFErrCodes TrueTypeFont::open(sal_uInt32 facenum)
     return SFErrCodes::Ok;
 }
 
-int GetTTGlyphPoints(TrueTypeFont *ttf, sal_uInt32 glyphID, ControlPoint **pointArray)
+int GetTTGlyphPoints(AbstractTrueTypeFont *ttf, sal_uInt32 glyphID, ControlPoint **pointArray)
 {
     return GetTTGlyphOutline(ttf, glyphID, pointArray, nullptr, nullptr);
 }
 
-int GetTTGlyphComponents(TrueTypeFont *ttf, sal_uInt32 glyphID, std::vector< sal_uInt32 >& glyphlist)
+int GetTTGlyphComponents(AbstractTrueTypeFont *ttf, sal_uInt32 glyphID, std::vector< sal_uInt32 >& glyphlist)
 {
     int n = 1;
 
@@ -1902,7 +1911,7 @@ SFErrCodes CreateT3FromTTGlyphs(TrueTypeFont *ttf, FILE *outf, const char *fname
     return SFErrCodes::Ok;
 }
 
-SFErrCodes CreateTTFromTTGlyphs(TrueTypeFont  *ttf,
+SFErrCodes CreateTTFromTTGlyphs(AbstractTrueTypeFont  *ttf,
                           const char    *fname,
                           sal_uInt16 const *glyphArray,
                           sal_uInt8 const *encoding,
@@ -2285,7 +2294,7 @@ sal_uInt16 MapChar(TrueTypeFont const *ttf, sal_uInt16 ch)
 #endif
 
 
-std::unique_ptr<sal_uInt16[]> GetTTSimpleGlyphMetrics(TrueTypeFont const *ttf, const sal_uInt16 *glyphArray, int nGlyphs, bool vertical)
+std::unique_ptr<sal_uInt16[]> GetTTSimpleGlyphMetrics(AbstractTrueTypeFont const *ttf, const sal_uInt16 *glyphArray, int nGlyphs, bool vertical)
 {
     const sal_uInt8* pTable;
     sal_uInt32 n;
@@ -2415,7 +2424,7 @@ void GetTTGlobalFontInfo(TrueTypeFont *ttf, TTGlobalFontInfo *info)
     }
 }
 
-GlyphData *GetTTRawGlyphData(TrueTypeFont *ttf, sal_uInt32 glyphID)
+GlyphData *GetTTRawGlyphData(AbstractTrueTypeFont *ttf, sal_uInt32 glyphID)
 {
     sal_uInt32 length;
     const sal_uInt8* hmtx = ttf->table(O_hmtx, length);
@@ -2479,7 +2488,7 @@ GlyphData *GetTTRawGlyphData(TrueTypeFont *ttf, sal_uInt32 glyphID)
     return d;
 }
 
-int GetTTNameRecords(TrueTypeFont const *ttf, NameRecord **nr)
+int GetTTNameRecords(AbstractTrueTypeFont const *ttf, NameRecord **nr)
 {
     sal_uInt32 nTableSize;
     const sal_uInt8* table = ttf->table(O_name, nTableSize);
@@ -2538,14 +2547,12 @@ int GetTTNameRecords(TrueTypeFont const *ttf, NameRecord **nr)
                 continue;
             }
 
-            const sal_uInt8* rec_string = table + nStrBase + nStrOffset;
-            // sanity check
-            const sal_uInt8* end_table = ttf->ptr + ttf->fsize;
-            const size_t available_space = rec_string > end_table ? 0 : (end_table - rec_string);
+            const sal_uInt32 rec_string = nStrBase + nStrOffset;
+            const size_t available_space = rec_string > nTableSize ? 0 : (nTableSize - rec_string);
             if (rec[i].slen <= available_space)
             {
                 rec[i].sptr = static_cast<sal_uInt8 *>(malloc(rec[i].slen)); assert(rec[i].sptr != nullptr);
-                memcpy(rec[i].sptr, rec_string, rec[i].slen);
+                memcpy(rec[i].sptr, table + rec_string, rec[i].slen);
             }
             else
             {
diff --git a/vcl/source/fontsubset/ttcr.cxx b/vcl/source/fontsubset/ttcr.cxx
index 3980e99f99de..b3e502d7ce7f 100644
--- a/vcl/source/fontsubset/ttcr.cxx
+++ b/vcl/source/fontsubset/ttcr.cxx
@@ -1142,7 +1142,7 @@ void cmapAdd(TrueTypeTable *table, sal_uInt32 id, sal_uInt32 c, sal_uInt32 g)
     s[i].n++;
 }
 
-sal_uInt32 glyfAdd(TrueTypeTable *table, GlyphData *glyphdata, TrueTypeFont *fnt)
+sal_uInt32 glyfAdd(TrueTypeTable *table, GlyphData *glyphdata, AbstractTrueTypeFont *fnt)
 {
     list l;
     sal_uInt32 currentID;
diff --git a/vcl/source/fontsubset/ttcr.hxx b/vcl/source/fontsubset/ttcr.hxx
index 26298f78cafd..76709e5dcb17 100644
--- a/vcl/source/fontsubset/ttcr.hxx
+++ b/vcl/source/fontsubset/ttcr.hxx
@@ -192,7 +192,7 @@ namespace vcl
  * NOTE: This function does not duplicate GlyphData, so memory will be
  * deallocated in the table destructor
  */
-    sal_uInt32 glyfAdd(TrueTypeTable *, GlyphData *glyphdata, TrueTypeFont *fnt);
+    sal_uInt32 glyfAdd(TrueTypeTable *, GlyphData *glyphdata, AbstractTrueTypeFont *fnt);
 
 /**
  * Query the number of glyphs currently stored in the 'glyf' table


More information about the Libreoffice-commits mailing list