Chromium Code Reviews| Index: core/fpdfapi/fpdf_font/cpdf_cidfont.cpp |
| diff --git a/core/fpdfapi/fpdf_font/cpdf_cidfont.cpp b/core/fpdfapi/fpdf_font/cpdf_cidfont.cpp |
| index 0dcbf48be2bb81258975e99d0c0dfc16e262d34d..9dc087a1ee91464bdaf80a16788183dcbd6f004e 100644 |
| --- a/core/fpdfapi/fpdf_font/cpdf_cidfont.cpp |
| +++ b/core/fpdfapi/fpdf_font/cpdf_cidfont.cpp |
| @@ -189,14 +189,22 @@ void FT_UseCIDCharmap(FXFT_Face face, int coding) { |
| FXFT_Set_Charmap(face, *FXFT_Get_Face_Charmaps(face)); |
| } |
| +bool IsMetricForCID(const uint32_t* pEntry, uint16_t CID) { |
| + return pEntry[0] <= CID && pEntry[1] >= CID; |
| +} |
| + |
| } // namespace |
| CPDF_CIDFont::CPDF_CIDFont() |
| : m_pCMap(nullptr), |
| m_pCID2UnicodeMap(nullptr), |
| - m_bCIDIsGID(FALSE), |
| + m_bCIDIsGID(false), |
| m_bAnsiWidthsFixed(false), |
| - m_bAdobeCourierStd(FALSE) {} |
| + m_bAdobeCourierStd(false) { |
| + for (size_t i = 0; i < FX_ArraySize(m_CharBBox); ++i) { |
| + m_CharBBox[i] = FX_RECT(-1, -1, -1, -1); |
| + } |
| +} |
| CPDF_CIDFont::~CPDF_CIDFont() {} |
| @@ -213,14 +221,11 @@ CPDF_CIDFont* CPDF_CIDFont::AsCIDFont() { |
| } |
| uint16_t CPDF_CIDFont::CIDFromCharCode(uint32_t charcode) const { |
| - if (!m_pCMap) { |
| - return (uint16_t)charcode; |
| - } |
| - return m_pCMap->CIDFromCharCode(charcode); |
| + return m_pCMap ? m_pCMap->CIDFromCharCode(charcode) : (uint16_t)charcode; |
|
dsinclair
2016/08/15 12:48:03
static_cast
Lei Zhang
2016/08/15 17:05:35
Done.
|
| } |
| FX_BOOL CPDF_CIDFont::IsVertWriting() const { |
| - return m_pCMap ? m_pCMap->IsVertWriting() : FALSE; |
| + return m_pCMap && m_pCMap->IsVertWriting(); |
| } |
| CFX_WideString CPDF_CIDFont::UnicodeFromCharCode(uint32_t charcode) const { |
| @@ -336,7 +341,7 @@ FX_BOOL CPDF_CIDFont::Load() { |
| m_BaseFont.Compare("CourierStd-BoldOblique") == 0 || |
| m_BaseFont.Compare("CourierStd-Oblique") == 0) && |
| !IsEmbedded()) { |
| - m_bAdobeCourierStd = TRUE; |
| + m_bAdobeCourierStd = true; |
| } |
| CPDF_Dictionary* pFontDesc = pCIDFontDict->GetDictBy("FontDescriptor"); |
| if (pFontDesc) |
| @@ -354,6 +359,8 @@ FX_BOOL CPDF_CIDFont::Load() { |
| CFX_ByteString cmap = pEncoding->GetString(); |
| bool bPromptCJK = m_pFontFile && m_bType1; |
| m_pCMap = manager.GetPredefinedCMap(cmap, bPromptCJK); |
| + if (!m_pCMap) |
| + return FALSE; |
| } else if (CPDF_Stream* pStream = pEncoding->AsStream()) { |
| m_pCMap = new CPDF_CMap; |
| m_pAllocatedCMap.reset(m_pCMap); |
| @@ -363,8 +370,6 @@ FX_BOOL CPDF_CIDFont::Load() { |
| } else { |
| return FALSE; |
| } |
| - if (!m_pCMap) |
| - return FALSE; |
| m_Charset = m_pCMap->m_Charset; |
| if (m_Charset == CIDSET_UNKNOWN) { |
| @@ -401,10 +406,10 @@ FX_BOOL CPDF_CIDFont::Load() { |
| } else if (pmap->GetString() == "Identity") { |
| #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ |
| if (m_pFontFile) { |
| - m_bCIDIsGID = TRUE; |
| + m_bCIDIsGID = true; |
| } |
| #else |
| - m_bCIDIsGID = TRUE; |
| + m_bCIDIsGID = true; |
| #endif |
| } |
| } |
| @@ -429,8 +434,8 @@ FX_BOOL CPDF_CIDFont::Load() { |
| } |
| FX_RECT CPDF_CIDFont::GetCharBBox(uint32_t charcode, int level) { |
| - if (charcode < 256 && m_CharBBox[charcode].right != FX_SMALL_RECT::kInvalid) |
| - return FX_RECT(m_CharBBox[charcode]); |
| + if (charcode < 256 && m_CharBBox[charcode].right != -1) |
| + return m_CharBBox[charcode]; |
| FX_RECT rect; |
| bool bVert = false; |
| @@ -496,58 +501,64 @@ FX_RECT CPDF_CIDFont::GetCharBBox(uint32_t charcode, int level) { |
| } |
| } |
| if (charcode < 256) |
| - m_CharBBox[charcode] = rect.ToSmallRect(); |
| + m_CharBBox[charcode] = rect; |
| return rect; |
| } |
| + |
| int CPDF_CIDFont::GetCharWidthF(uint32_t charcode, int level) { |
| if (charcode < 0x80 && m_bAnsiWidthsFixed) |
| return charcode >= 32 && charcode < 127 ? 500 : 0; |
| uint16_t cid = CIDFromCharCode(charcode); |
| int size = m_WidthList.GetSize(); |
| - uint32_t* list = m_WidthList.GetData(); |
| + const uint32_t* pList = m_WidthList.GetData(); |
| for (int i = 0; i < size; i += 3) { |
| - if (cid >= list[i] && cid <= list[i + 1]) { |
| - return (int)list[i + 2]; |
| - } |
| + const uint32_t* pEntry = pList + i; |
| + if (IsMetricForCID(pEntry, cid)) |
| + return static_cast<int>(pEntry[2]); |
| } |
| return m_DefaultWidth; |
| } |
| + |
| short CPDF_CIDFont::GetVertWidth(uint16_t CID) const { |
| uint32_t vertsize = m_VertMetrics.GetSize() / 5; |
| - if (vertsize == 0) { |
| - return m_DefaultW1; |
| - } |
| - const uint32_t* pTable = m_VertMetrics.GetData(); |
| - for (uint32_t i = 0; i < vertsize; i++) |
| - if (pTable[i * 5] <= CID && pTable[i * 5 + 1] >= CID) { |
| - return (short)(int)pTable[i * 5 + 2]; |
| + if (vertsize) { |
| + const uint32_t* pTable = m_VertMetrics.GetData(); |
| + for (uint32_t i = 0; i < vertsize; i++) { |
| + const uint32_t* pEntry = pTable + (i * 5); |
| + if (IsMetricForCID(pEntry, CID)) |
| + return static_cast<short>(pEntry[2]); |
| } |
| + } |
| return m_DefaultW1; |
| } |
| + |
| void CPDF_CIDFont::GetVertOrigin(uint16_t CID, short& vx, short& vy) const { |
| uint32_t vertsize = m_VertMetrics.GetSize() / 5; |
| if (vertsize) { |
| const uint32_t* pTable = m_VertMetrics.GetData(); |
| - for (uint32_t i = 0; i < vertsize; i++) |
| - if (pTable[i * 5] <= CID && pTable[i * 5 + 1] >= CID) { |
| - vx = (short)(int)pTable[i * 5 + 3]; |
| - vy = (short)(int)pTable[i * 5 + 4]; |
| + for (uint32_t i = 0; i < vertsize; i++) { |
| + const uint32_t* pEntry = pTable + (i * 5); |
| + if (IsMetricForCID(pEntry, CID)) { |
| + vx = static_cast<short>(pEntry[3]); |
| + vy = static_cast<short>(pEntry[4]); |
| return; |
| } |
| + } |
| } |
| uint32_t dwWidth = m_DefaultWidth; |
| int size = m_WidthList.GetSize(); |
| - const uint32_t* list = m_WidthList.GetData(); |
| + const uint32_t* pList = m_WidthList.GetData(); |
| for (int i = 0; i < size; i += 3) { |
| - if (CID >= list[i] && CID <= list[i + 1]) { |
| - dwWidth = (uint16_t)list[i + 2]; |
| + const uint32_t* pEntry = pList + i; |
| + if (IsMetricForCID(pEntry, CID)) { |
| + dwWidth = pEntry[2]; |
| break; |
| } |
| } |
| vx = (short)dwWidth / 2; |
|
dsinclair
2016/08/15 12:48:03
static_cast
Lei Zhang
2016/08/15 17:05:35
Done.
|
| - vy = (short)m_DefaultVY; |
| + vy = m_DefaultVY; |
| } |
| int CPDF_CIDFont::GetGlyphIndex(uint32_t unicode, bool* pVertGlyph) { |
| @@ -820,7 +831,7 @@ void CPDF_CIDFont::LoadGB2312() { |
| LoadFontDescriptor(pFontDesc); |
| m_Charset = CIDSET_GB1; |
| - m_bType1 = FALSE; |
| + m_bType1 = false; |
| CPDF_CMapManager& manager = GetFontGlobals()->m_CMapManager; |
| m_pCMap = manager.GetPredefinedCMap("GBK-EUC-H", FALSE); |
| m_pCID2UnicodeMap = manager.GetCID2UnicodeMap(m_Charset, FALSE); |