vcl/inc/font/PhysicalFontFace.hxx    |    2 ++
 vcl/source/font/PhysicalFontFace.cxx |   19 +++++++++++++++++++
 vcl/source/gdi/pdfwriter_impl.cxx    |    6 ++++--
 3 files changed, 25 insertions(+), 2 deletions(-)

New commits:
commit 2e2765ec4ab05ee4745125f56b907f74e7426eaf
Author:     Khaled Hosny <kha...@aliftype.com>
AuthorDate: Fri Sep 23 07:23:33 2022 +0200
Commit:     خالد حسني <kha...@aliftype.com>
CommitDate: Fri Sep 23 12:28:49 2022 +0200

    vcl: Use glyph names from the font in Type 3 fonts
    
    Some PDF viewers might use glyph names to guess corresponding character,
    and it also makes debugging the PDF output a little bit easier.
    
    Change-Id: Ibe7f28d10814a9deb467129c85fed914fb7b3f9f
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/140465
    Tested-by: Jenkins
    Reviewed-by: خالد حسني <kha...@aliftype.com>

diff --git a/vcl/inc/font/PhysicalFontFace.hxx 
b/vcl/inc/font/PhysicalFontFace.hxx
index 3297feff87dc..3d7fa0cba71d 100644
--- a/vcl/inc/font/PhysicalFontFace.hxx
+++ b/vcl/inc/font/PhysicalFontFace.hxx
@@ -180,6 +180,8 @@ public:
     bool HasColorBitmaps() const;
     RawFontData GetGlyphColorBitmap(sal_GlyphId, tools::Rectangle&) const;
 
+    OString GetGlyphName(sal_GlyphId, bool = false) const;
+
     uint32_t UnitsPerEm() const { return hb_face_get_upem(GetHbFace()); }
 
     OUString GetName(NameID, const LanguageTag&) const;
diff --git a/vcl/source/font/PhysicalFontFace.cxx 
b/vcl/source/font/PhysicalFontFace.cxx
index 337995964389..70738bbad06b 100644
--- a/vcl/source/font/PhysicalFontFace.cxx
+++ b/vcl/source/font/PhysicalFontFace.cxx
@@ -399,6 +399,25 @@ RawFontData 
PhysicalFontFace::GetGlyphColorBitmap(sal_GlyphId nGlyphIndex,
     return aData;
 }
 
+OString PhysicalFontFace::GetGlyphName(sal_GlyphId nGlyphIndex, bool 
bValidate) const
+{
+    char aBuffer[256];
+    hb_font_glyph_to_string(GetHbUnscaledFont(), nGlyphIndex, aBuffer, 256);
+    if (bValidate)
+    {
+        // 
https://learn.microsoft.com/en-us/typography/opentype/spec/post#version-20
+        // Valid characters are limited to A–Z, a–z, 0–9, “.” (FULL STOP), and 
“_” (LOW LINE).
+        const char* p = aBuffer;
+        while ((*p >= '0' && *p <= '9') || (*p >= 'A' && *p <= 'Z') || (*p >= 
'a' && *p <= 'z')
+               || *p == '.' || *p == '_')
+            ++p;
+        if (*p != '\0')
+            return "g" + OString::number(nGlyphIndex);
+    }
+
+    return OString(aBuffer);
+}
+
 OUString PhysicalFontFace::GetName(NameID aNameID, const LanguageTag& 
rLanguageTag) const
 {
     auto pHbFace = GetHbFace();
diff --git a/vcl/source/gdi/pdfwriter_impl.cxx 
b/vcl/source/gdi/pdfwriter_impl.cxx
index 83887db1a4dc..a381d9287c4e 100644
--- a/vcl/source/gdi/pdfwriter_impl.cxx
+++ b/vcl/source/gdi/pdfwriter_impl.cxx
@@ -2500,7 +2500,9 @@ bool PDFWriterImpl::emitType3Font(const 
vcl::font::PhysicalFontFace* pFace,
         for (auto i = 1u; i < nGlyphs; i++)
         {
             auto nStream = createObject();
-            aLine.append("/g" + OString::number(i) + " ");
+            aLine.append("/");
+            aLine.append(pFace->GetGlyphName(pGlyphIds[i], true));
+            aLine.append(" ");
             aLine.append(nStream);
             aLine.append(" 0 R\n");
             pGlyphStreams[i] = nStream;
@@ -2509,7 +2511,7 @@ bool PDFWriterImpl::emitType3Font(const 
vcl::font::PhysicalFontFace* pFace,
 
         aLine.append("/Encoding<</Type/Encoding/Differences[1");
         for (auto i = 1u; i < nGlyphs; i++)
-            aLine.append(" /g" + OString::number(i));
+            aLine.append(" /" + pFace->GetGlyphName(pGlyphIds[i], true));
         aLine.append("]>>\n");
 
         aLine.append("/FirstChar 0\n"

Reply via email to