From e7c102ef48f59d94fcd70bc781287336bda3ecea Mon Sep 17 00:00:00 2001 From: Jakub Melka Date: Wed, 1 Jun 2022 19:57:41 +0200 Subject: [PATCH] Issue #14: Incorrect text drawing for vertical writing systems --- Pdf4QtLib/sources/pdffont.cpp | 5 +++-- Pdf4QtLib/sources/pdffont.h | 8 +++++++- README.md | 6 +++--- RELEASES.txt | 2 ++ 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/Pdf4QtLib/sources/pdffont.cpp b/Pdf4QtLib/sources/pdffont.cpp index d47025c..229f2b7 100644 --- a/Pdf4QtLib/sources/pdffont.cpp +++ b/Pdf4QtLib/sources/pdffont.cpp @@ -995,6 +995,7 @@ PDFRealizedFontPointer PDFRealizedFont::createRealizedFont(PDFFontPointer font, impl->m_parentFont = font; impl->m_pixelSize = pixelSize; + const PDFFontCMap* cmap = font->getCMap(); const FontDescriptor* descriptor = font->getFontDescriptor(); if (descriptor->isEmbedded()) { @@ -1009,7 +1010,7 @@ PDFRealizedFontPointer PDFRealizedFont::createRealizedFont(PDFFontPointer font, PDFRealizedFontImpl::checkFreeTypeError(FT_New_Memory_Face(impl->m_library, reinterpret_cast(impl->m_embeddedFontData.constData()), impl->m_embeddedFontData.size(), 0, &impl->m_face)); FT_Select_Charmap(impl->m_face, FT_ENCODING_UNICODE); // We try to select unicode encoding, but if it fails, we don't do anything (use glyph indices instead) PDFRealizedFontImpl::checkFreeTypeError(FT_Set_Pixel_Sizes(impl->m_face, 0, qRound(pixelSize * PDFRealizedFontImpl::PIXEL_SIZE_MULTIPLIER))); - impl->m_isVertical = impl->m_face->face_flags & FT_FACE_FLAG_VERTICAL; + impl->m_isVertical = cmap ? cmap->isVertical() : false; impl->m_isEmbedded = true; result.reset(new PDFRealizedFont(implPtr.release())); } @@ -1035,7 +1036,7 @@ PDFRealizedFontPointer PDFRealizedFont::createRealizedFont(PDFFontPointer font, PDFRealizedFontImpl::checkFreeTypeError(FT_New_Memory_Face(impl->m_library, reinterpret_cast(impl->m_systemFontData.constData()), impl->m_systemFontData.size(), 0, &impl->m_face)); FT_Select_Charmap(impl->m_face, FT_ENCODING_UNICODE); // We try to select unicode encoding, but if it fails, we don't do anything (use glyph indices instead) PDFRealizedFontImpl::checkFreeTypeError(FT_Set_Pixel_Sizes(impl->m_face, 0, qRound(pixelSize * PDFRealizedFontImpl::PIXEL_SIZE_MULTIPLIER))); - impl->m_isVertical = impl->m_face->face_flags & FT_FACE_FLAG_VERTICAL; + impl->m_isVertical = cmap ? cmap->isVertical() : false; impl->m_isEmbedded = false; if (const char* postScriptName = FT_Get_Postscript_Name(impl->m_face)) { diff --git a/Pdf4QtLib/sources/pdffont.h b/Pdf4QtLib/sources/pdffont.h index 4946f51..75cf266 100644 --- a/Pdf4QtLib/sources/pdffont.h +++ b/Pdf4QtLib/sources/pdffont.h @@ -276,6 +276,9 @@ public: /// Returns ToUnicode mapping (or nullptr, if font has no mapping to unicode) virtual const PDFFontCMap* getToUnicode() const { return nullptr; } + /// Returns cmap for font character encoding + virtual const PDFFontCMap* getCMap() const { return nullptr; } + /// Returns font descriptor const FontDescriptor* getFontDescriptor() const { return &m_fontDescriptor; } @@ -488,6 +491,9 @@ public: /// Returns true, if mapping is valid bool isValid() const { return !m_entries.empty(); } + /// Returns true, if vertical writing mode is on + bool isVertical() const { return m_vertical; } + /// Creates mapping from name (name must be one of predefined names) static PDFFontCMap createFromName(const QByteArray& name); @@ -612,7 +618,7 @@ public: virtual FontType getFontType() const override { return FontType::Type0; } virtual const PDFFontCMap* getToUnicode() const override { return &m_toUnicode; } - const PDFFontCMap* getCMap() const { return &m_cmap; } + virtual const PDFFontCMap* getCMap() const override { return &m_cmap; } const PDFCIDtoGIDMapper* getCIDtoGIDMapper() const { return &m_mapper; } /// Returns the glyph advance, if it can be obtained, or zero, if it cannot diff --git a/README.md b/README.md index f8d397f..0a840a5 100644 --- a/README.md +++ b/README.md @@ -51,9 +51,9 @@ Software have following features (the list is not complete): - [x] internal structure inspector - [x] compare documents - [x] static XFA support (readonly, simple XFA only) -- [ ] create fillable forms *(planned in year 2022)* -- [ ] electronically/digitally sign documents *(planned in year 2022)* -- [ ] 3D PDF support *(planned in year 2023)* +- [x] electronically/digitally sign documents +- [ ] 3D PDF support *(planned in year 2022)* +- [ ] create fillable forms *(planned in year 2023)* - [ ] watermarks / headers / footers *(planned in year 2023)* - [ ] presentation application *(planned in year 2023)* - [ ] public key security encryption *(planned in year 2023)* diff --git a/RELEASES.txt b/RELEASES.txt index 3497aa3..323c863 100644 --- a/RELEASES.txt +++ b/RELEASES.txt @@ -1,7 +1,9 @@ CURRENT: - Issue #10: Performance optimization + - Issue #14: Incorrect text drawing for vertical writing systems - static XFA support (readonly, simple XFA only) + - electronically/digitally sign documents V: 1.1.0, 19.12.2021 - DocDiff application (compare similar PDF documents)