From a3ee6a0081ab16a2034b36d1d0f9b6907aec67d2 Mon Sep 17 00:00:00 2001 From: Henrique Nakashima Date: Tue, 22 May 2018 13:45:08 +0000 Subject: Fix spaces too wide in XFA Dropdown. CFGAS_PDFFontMgr::GetCharWidth() is only used for spaces, for no good reason I could find. It's broken in this case too, returning a default value of 600 for any character. This CL removes this method and its only usage that led to finding this issue. Bug: pdfium:1083 Change-Id: I954de45101715b5af05169612fb5eca1b1a170b4 Reviewed-on: https://pdfium-review.googlesource.com/32740 Commit-Queue: dsinclair Reviewed-by: dsinclair --- xfa/fgas/font/cfgas_gefont.cpp | 28 +++++++++++++--------------- xfa/fgas/font/cfgas_gefont.h | 5 ----- xfa/fgas/font/cfgas_pdffontmgr.cpp | 18 ------------------ xfa/fgas/font/cfgas_pdffontmgr.h | 3 --- 4 files changed, 13 insertions(+), 41 deletions(-) (limited to 'xfa/fgas/font') diff --git a/xfa/fgas/font/cfgas_gefont.cpp b/xfa/fgas/font/cfgas_gefont.cpp index b6ec23a414..740504f088 100644 --- a/xfa/fgas/font/cfgas_gefont.cpp +++ b/xfa/fgas/font/cfgas_gefont.cpp @@ -164,23 +164,21 @@ bool CFGAS_GEFont::GetCharWidth(wchar_t wUnicode, int32_t* pWidth) { if (*pWidth > 0) return true; - if (!m_pProvider || !m_pProvider->GetCharWidth(RetainPtr(this), - wUnicode, pWidth)) { - RetainPtr pFont; - int32_t iGlyph; - std::tie(iGlyph, pFont) = GetGlyphIndexAndFont(wUnicode, true); - if (iGlyph != 0xFFFF && pFont) { - if (pFont.Get() == this) { - *pWidth = m_pFont->GetGlyphWidth(iGlyph); - if (*pWidth < 0) - *pWidth = -1; - } else if (pFont->GetCharWidth(wUnicode, pWidth)) { - return true; - } - } else { - *pWidth = -1; + RetainPtr pFont; + int32_t iGlyph; + std::tie(iGlyph, pFont) = GetGlyphIndexAndFont(wUnicode, true); + if (iGlyph != 0xFFFF && pFont) { + if (pFont.Get() == this) { + *pWidth = m_pFont->GetGlyphWidth(iGlyph); + if (*pWidth < 0) + *pWidth = -1; + } else if (pFont->GetCharWidth(wUnicode, pWidth)) { + return true; } + } else { + *pWidth = -1; } + m_CharWidthMap[wUnicode] = *pWidth; return *pWidth > 0; } diff --git a/xfa/fgas/font/cfgas_gefont.h b/xfa/fgas/font/cfgas_gefont.h index ab72f1356f..f4d729d3a5 100644 --- a/xfa/fgas/font/cfgas_gefont.h +++ b/xfa/fgas/font/cfgas_gefont.h @@ -49,10 +49,6 @@ class CFGAS_GEFont : public Retainable { RetainPtr GetSubstFont(int32_t iGlyphIndex); CFX_Font* GetDevFont() const { return m_pFont; } - void SetFontProvider(CFGAS_PDFFontMgr* pProvider) { - m_pProvider.Reset(pProvider); - } - void SetLogicalFontStyle(uint32_t dwLogFontStyle) { m_bUseLogFontStyle = true; m_dwLogFontStyle = dwLogFontStyle; @@ -82,7 +78,6 @@ class CFGAS_GEFont : public Retainable { bool m_bExternalFont; RetainPtr m_pSrcFont; // Only set by ctor, so no cycles. CFGAS_FontMgr::ObservedPtr m_pFontMgr; - CFGAS_PDFFontMgr::ObservedPtr m_pProvider; RetainPtr m_pFileRead; std::unique_ptr m_pFontEncoding; std::map m_CharWidthMap; diff --git a/xfa/fgas/font/cfgas_pdffontmgr.cpp b/xfa/fgas/font/cfgas_pdffontmgr.cpp index e2fb905f66..ad28c9eaeb 100644 --- a/xfa/fgas/font/cfgas_pdffontmgr.cpp +++ b/xfa/fgas/font/cfgas_pdffontmgr.cpp @@ -183,24 +183,6 @@ bool CFGAS_PDFFontMgr::PsNameMatchDRFontName(const ByteStringView& bsPsName, return true; } -bool CFGAS_PDFFontMgr::GetCharWidth(const RetainPtr& pFont, - wchar_t wUnicode, - int32_t* pWidth) { - if (wUnicode != 0x20) - return false; - - auto it = m_FDE2PDFFont.find(pFont); - if (it == m_FDE2PDFFont.end()) - return false; - - CPDF_Font* pPDFFont = it->second; - // TODO(npm): CFGAS_GEFont::GetCharWidth currently uses -1 as a special value, - // so |pWidth| cannot be changed to unsigned until this behavior is changed. - *pWidth = static_cast( - pPDFFont->GetCharWidthF(pPDFFont->CharCodeFromUnicode(wUnicode))); - return true; -} - void CFGAS_PDFFontMgr::SetFont(const RetainPtr& pFont, CPDF_Font* pPDFFont) { m_FDE2PDFFont[pFont] = pPDFFont; diff --git a/xfa/fgas/font/cfgas_pdffontmgr.h b/xfa/fgas/font/cfgas_pdffontmgr.h index a019990dad..0cc647500b 100644 --- a/xfa/fgas/font/cfgas_pdffontmgr.h +++ b/xfa/fgas/font/cfgas_pdffontmgr.h @@ -30,9 +30,6 @@ class CFGAS_PDFFontMgr : public Observable { uint32_t dwFontStyles, CPDF_Font** pPDFFont, bool bStrictMatch); - bool GetCharWidth(const RetainPtr& pFont, - wchar_t wUnicode, - int32_t* pWidth); private: RetainPtr FindFont(const ByteString& strFamilyName, -- cgit v1.2.3