Extract CFGAS_FontMgr hash key code into helper functions. This is used in a couple of place and must match up exactly. Change-Id: I819bc6300a060da00e4aefa9c83f7d371d4f4d3e Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/87710 Reviewed-by: Lei Zhang <thestig@chromium.org> Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/xfa/fgas/font/cfgas_fontmgr.cpp b/xfa/fgas/font/cfgas_fontmgr.cpp index 02ddae4..f209e62 100644 --- a/xfa/fgas/font/cfgas_fontmgr.cpp +++ b/xfa/fgas/font/cfgas_fontmgr.cpp
@@ -47,6 +47,24 @@ return true; } +uint32_t ShortFormHash(FX_CodePage wCodePage, + uint32_t dwFontStyles, + WideStringView wsFontFamily) { + ByteString bsHash = ByteString::Format("%d, %d", wCodePage, dwFontStyles); + bsHash += FX_UTF8Encode(wsFontFamily); + return FX_HashCode_GetA(bsHash.AsStringView()); +} + +uint32_t LongFormHash(FX_CodePage wCodePage, + uint16_t wBitField, + uint32_t dwFontStyles, + WideStringView wsFontFamily) { + ByteString bsHash = + ByteString::Format("%d, %d, %d", wCodePage, wBitField, dwFontStyles); + bsHash += FX_UTF8Encode(wsFontFamily); + return FX_HashCode_GetA(bsHash.AsStringView()); +} + } // namespace #if defined(OS_WIN) @@ -760,9 +778,7 @@ FX_CodePage wCodePage, uint32_t dwFontStyles, const wchar_t* pszFontFamily) { - ByteString bsHash = ByteString::Format("%d, %d", wCodePage, dwFontStyles); - bsHash += FX_UTF8Encode(WideStringView(pszFontFamily)); - uint32_t dwHash = FX_HashCode_GetA(bsHash.AsStringView()); + uint32_t dwHash = ShortFormHash(wCodePage, dwFontStyles, pszFontFamily); auto* pFontVector = &m_Hash2Fonts[dwHash]; if (!pFontVector->empty()) { for (auto iter = pFontVector->begin(); iter != pFontVector->end(); ++iter) { @@ -822,21 +838,14 @@ const FGAS_FONTUSB* x = FGAS_GetUnicodeBitField(wUnicode); FX_CodePage wCodePage = x ? x->wCodePage : FX_CodePage::kFailure; uint16_t wBitField = x ? x->wBitField : FGAS_FONTUSB::kNoBitField; - ByteString bsHash; - if (wCodePage == FX_CodePage::kFailure) { - bsHash = - ByteString::Format("%d, %d, %d", wCodePage, wBitField, dwFontStyles); - } else { - bsHash = ByteString::Format("%d, %d", wCodePage, dwFontStyles); - } - bsHash += FX_UTF8Encode(WideStringView(pszFontFamily)); - uint32_t dwHash = FX_HashCode_GetA(bsHash.AsStringView()); - std::vector<RetainPtr<CFGAS_GEFont>>& fonts = m_Hash2Fonts[dwHash]; - for (auto& pFont : fonts) { + uint32_t dwHash = + wCodePage == FX_CodePage::kFailure + ? LongFormHash(wCodePage, wBitField, dwFontStyles, pszFontFamily) + : ShortFormHash(wCodePage, dwFontStyles, pszFontFamily); + for (auto& pFont : m_Hash2Fonts[dwHash]) { if (VerifyUnicode(pFont, wUnicode)) return pFont; } - return GetFontByUnicodeImpl(wUnicode, dwFontStyles, pszFontFamily, dwHash, wCodePage, wBitField); } @@ -845,12 +854,10 @@ uint32_t dwFontStyles, FX_CodePage wCodePage) { #if defined(OS_WIN) - ByteString bsHash = ByteString::Format("%d, %d", wCodePage, dwFontStyles); - bsHash += FX_UTF8Encode(WideStringView(pszFontFamily)); - uint32_t dwHash = FX_HashCode_GetA(bsHash.AsStringView()); + uint32_t dwHash = ShortFormHash(wCodePage, dwFontStyles, pszFontFamily); std::vector<RetainPtr<CFGAS_GEFont>>* pFontArray = &m_Hash2Fonts[dwHash]; if (!pFontArray->empty()) - return (*pFontArray)[0]; + return pFontArray->front(); const FX_FONTDESCRIPTOR* pFD = FindFont(pszFontFamily, dwFontStyles, true, wCodePage,