From 3c949d5d2b0d680839766ea99c86b263230b263d Mon Sep 17 00:00:00 2001 From: Lei Zhang Date: Wed, 10 Jun 2015 10:40:57 -0700 Subject: Convert CPDF_FontMap to std::map. R=tsepez@chromium.org Review URL: https://codereview.chromium.org/1151133004. --- core/include/fpdfapi/fpdf_resource.h | 56 +++++----- core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp | 146 +++++++++++++-------------- core/src/fpdfapi/fpdf_page/pageint.h | 33 +++--- 3 files changed, 121 insertions(+), 114 deletions(-) diff --git a/core/include/fpdfapi/fpdf_resource.h b/core/include/fpdfapi/fpdf_resource.h index 06dcdfec44..054e90a158 100644 --- a/core/include/fpdfapi/fpdf_resource.h +++ b/core/include/fpdfapi/fpdf_resource.h @@ -1,7 +1,7 @@ // Copyright 2014 PDFium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com #ifndef CORE_INCLUDE_FPDFAPI_FPDF_RESOURCE_H_ @@ -10,40 +10,39 @@ #include "../fxge/fx_font.h" #include "fpdf_parser.h" -class CPDF_Font; -class CPDF_Type1Font; -class CPDF_TrueTypeFont; +class CFX_CTTGSUBTable; +class CFX_DIBitmap; +class CFX_Font; +class CFX_SubstFont; +class CPDF_CID2UnicodeMap; class CPDF_CIDFont; -class CPDF_Type3Font; -class CPDF_FontEncoding; class CPDF_CMap; -class CPDF_CID2UnicodeMap; -class CPDF_ColorSpace; class CPDF_Color; +class CPDF_ColorSpace; +class CPDF_Face; +class CPDF_Font; +class CPDF_FontEncoding; +class CPDF_Form; class CPDF_Function; +class CPDF_Image; +class CPDF_ImageObject; +class CPDF_Page; class CPDF_Pattern; -class CPDF_TilingPattern; +class CPDF_RenderContext; class CPDF_ShadingPattern; -class CPDF_Image; -class CPDF_Face; +class CPDF_TilingPattern; class CPDF_ToUnicodeMap; -class CFX_SubstFont; -class CFX_Font; -class CPDF_RenderContext; -class CPDF_Form; -class CPDF_ImageObject; -class CFX_DIBitmap; +class CPDF_TrueTypeFont; +class CPDF_Type1Font; +class CPDF_Type3Font; typedef struct FT_FaceRec_* FXFT_Face; -class CFX_CTTGSUBTable; -class CPDF_Page; -template class CPDF_CountedObject +template class CPDF_CountedObject { public: ObjClass m_Obj; FX_DWORD m_nCount; }; -typedef CPDF_CountedObject CPDF_CountedFont; typedef CPDF_CountedObject CPDF_CountedColorSpace; typedef CPDF_CountedObject CPDF_CountedPattern; typedef CPDF_CountedObject CPDF_CountedImage; @@ -51,7 +50,6 @@ typedef CPDF_CountedObject CPDF_CountedICCProfile; typedef CPDF_CountedObject CPDF_CountedStreamAcc; -typedef CFX_MapPtrTemplate CPDF_FontMap; typedef CFX_MapPtrTemplate CPDF_ColorSpaceMap; typedef CFX_MapPtrTemplate CPDF_PatternMap; typedef CFX_MapPtrTemplate CPDF_ImageMap; @@ -314,7 +312,7 @@ private: #define PDFFONT_ENCODING_PDFDOC 7 #define PDFFONT_ENCODING_MS_SYMBOL 8 #define PDFFONT_ENCODING_UNICODE 9 -class CPDF_FontEncoding +class CPDF_FontEncoding { public: @@ -427,7 +425,7 @@ protected: virtual FX_BOOL _Load(); virtual void LoadGlyphMap(); }; -class CPDF_Type3Char +class CPDF_Type3Char { public: @@ -667,7 +665,7 @@ protected: FX_DWORD m_dwStdConversion; }; -class CPDF_Color +class CPDF_Color { public: @@ -716,10 +714,10 @@ protected: }; #define PATTERN_TILING 1 #define PATTERN_SHADING 2 -class CPDF_Pattern +class CPDF_Pattern { public: - + virtual ~CPDF_Pattern(); void SetForceClear(FX_BOOL bForceClear) { m_bForceClear = bForceClear; } @@ -793,7 +791,7 @@ struct CPDF_MeshVertex { FX_FLOAT x, y; FX_FLOAT r, g, b; }; -class CPDF_MeshStream +class CPDF_MeshStream { public: @@ -833,7 +831,7 @@ public: FX_ARGB* pMatteColor; int32_t nQuality; }; -class CPDF_Image +class CPDF_Image { public: diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp index 00ea4c5fce..be54747285 100644 --- a/core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp +++ b/core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp @@ -1,7 +1,7 @@ // Copyright 2014 PDFium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com #include "../../../include/fpdfapi/fpdf_page.h" @@ -9,6 +9,7 @@ #include "../../../include/fdrm/fx_crypt.h" #include "../fpdf_font/font_int.h" #include "pageint.h" + class CPDF_PageModule : public CPDF_PageModuleDef { public: @@ -124,22 +125,21 @@ void CPDF_Document::RemoveColorSpaceFromPageData(CPDF_Object* pCSObj) GetPageData()->ReleaseColorSpace(pCSObj); } CPDF_DocPageData::CPDF_DocPageData(CPDF_Document *pPDFDoc) - : m_pPDFDoc(pPDFDoc) - , m_FontMap() - , m_ColorSpaceMap() - , m_PatternMap() - , m_ImageMap() - , m_IccProfileMap() - , m_FontFileMap() - , m_bForceClear(FALSE) -{ - m_FontMap.InitHashTable(64); + : m_pPDFDoc(pPDFDoc), + m_ColorSpaceMap(), + m_PatternMap(), + m_ImageMap(), + m_IccProfileMap(), + m_FontFileMap(), + m_bForceClear(FALSE) +{ m_ColorSpaceMap.InitHashTable(32); m_PatternMap.InitHashTable(16); m_ImageMap.InitHashTable(64); m_IccProfileMap.InitHashTable(16); m_FontFileMap.InitHashTable(32); } + CPDF_DocPageData::~CPDF_DocPageData() { Clear(FALSE); @@ -153,15 +153,11 @@ CPDF_DocPageData::~CPDF_DocPageData() delete ptData; } m_PatternMap.RemoveAll(); - pos = m_FontMap.GetStartPosition(); - while (pos) - { - CPDF_Dictionary* fontDict; - CPDF_CountedObject* fontData; - m_FontMap.GetNextAssoc(pos, fontDict, fontData); - delete fontData; - } - m_FontMap.RemoveAll(); + + for (auto& it : m_FontMap) + delete it.second; + m_FontMap.clear(); + pos = m_ColorSpaceMap.GetStartPosition(); while (pos) { @@ -172,6 +168,7 @@ CPDF_DocPageData::~CPDF_DocPageData() } m_ColorSpaceMap.RemoveAll(); } + void CPDF_DocPageData::Clear(FX_BOOL bForceRelease) { FX_POSITION pos; @@ -190,19 +187,18 @@ void CPDF_DocPageData::Clear(FX_BOOL bForceRelease) ptData->m_Obj = NULL; } } - pos = m_FontMap.GetStartPosition(); - while (pos) { - CPDF_Dictionary* fontDict; - CPDF_CountedObject* fontData; - m_FontMap.GetNextAssoc(pos, fontDict, fontData); - if (!fontData->m_Obj) { + + for (auto& it : m_FontMap) { + CPDF_CountedFont* fontData = it.second; + if (!fontData->m_Obj) continue; - } + if (bForceRelease || fontData->m_nCount < 2) { delete fontData->m_Obj; - fontData->m_Obj = NULL; + fontData->m_Obj = nullptr; } } + pos = m_ColorSpaceMap.GetStartPosition(); while (pos) { CPDF_Object* csKey; @@ -270,79 +266,80 @@ void CPDF_DocPageData::Clear(FX_BOOL bForceRelease) } } } + CPDF_Font* CPDF_DocPageData::GetFont(CPDF_Dictionary* pFontDict, FX_BOOL findOnly) { if (!pFontDict) { return NULL; } if (findOnly) { - CPDF_CountedObject* fontData; - if (m_FontMap.Lookup(pFontDict, fontData)) { - if (!fontData->m_Obj) { - return NULL; - } - fontData->m_nCount ++; + auto it = m_FontMap.find(pFontDict); + if (it != m_FontMap.end()) { + CPDF_CountedFont* fontData = it->second; + if (!fontData->m_Obj) + return nullptr; + + fontData->m_nCount++; return fontData->m_Obj; } - return NULL; + return nullptr; } - CPDF_CountedObject* fontData = NULL; - if (m_FontMap.Lookup(pFontDict, fontData)) { + + CPDF_CountedFont* fontData = nullptr; + auto it = m_FontMap.find(pFontDict); + if (it != m_FontMap.end()) { + fontData = it->second; if (fontData->m_Obj) { - fontData->m_nCount ++; + fontData->m_nCount++; return fontData->m_Obj; } } + FX_BOOL bNew = FALSE; if (!fontData) { - fontData = new CPDF_CountedObject; + fontData = new CPDF_CountedFont; bNew = TRUE; } CPDF_Font* pFont = CPDF_Font::CreateFontF(m_pPDFDoc, pFontDict); if (!pFont) { - if (bNew) { + if (bNew) delete fontData; - } - return NULL; + return nullptr; } fontData->m_nCount = 2; fontData->m_Obj = pFont; - m_FontMap.SetAt(pFontDict, fontData); + if (bNew) + m_FontMap[pFontDict] = fontData; return pFont; } + CPDF_Font* CPDF_DocPageData::GetStandardFont(FX_BSTR fontName, CPDF_FontEncoding* pEncoding) { - if (fontName.IsEmpty()) { - return NULL; - } - FX_POSITION pos = m_FontMap.GetStartPosition(); - while (pos) { - CPDF_Dictionary* fontDict; - CPDF_CountedObject* fontData; - m_FontMap.GetNextAssoc(pos, fontDict, fontData); + if (fontName.IsEmpty()) + return nullptr; + + for (auto& it : m_FontMap) { + CPDF_CountedFont* fontData = it.second; CPDF_Font* pFont = fontData->m_Obj; - if (!pFont) { + if (!pFont) continue; - } - if (pFont->GetBaseFont() != fontName) { + if (pFont->GetBaseFont() != fontName) continue; - } - if (pFont->IsEmbedded()) { + if (pFont->IsEmbedded()) continue; - } - if (pFont->GetFontType() != PDFFONT_TYPE1) { + if (pFont->GetFontType() != PDFFONT_TYPE1) continue; - } - if (pFont->GetFontDict()->KeyExist(FX_BSTRC("Widths"))) { + if (pFont->GetFontDict()->KeyExist(FX_BSTRC("Widths"))) continue; - } + CPDF_Type1Font* pT1Font = pFont->GetType1Font(); - if (pEncoding && !pT1Font->GetEncoding()->IsIdentical(pEncoding)) { + if (pEncoding && !pT1Font->GetEncoding()->IsIdentical(pEncoding)) continue; - } - fontData->m_nCount ++; + + fontData->m_nCount++; return pFont; } + CPDF_Dictionary* pDict = new CPDF_Dictionary; pDict->SetAtName(FX_BSTRC("Type"), FX_BSTRC("Font")); pDict->SetAtName(FX_BSTRC("Subtype"), FX_BSTRC("Type1")); @@ -351,31 +348,34 @@ CPDF_Font* CPDF_DocPageData::GetStandardFont(FX_BSTR fontName, CPDF_FontEncoding pDict->SetAt(FX_BSTRC("Encoding"), pEncoding->Realize()); } m_pPDFDoc->AddIndirectObject(pDict); - CPDF_CountedObject* fontData = new CPDF_CountedObject; + CPDF_CountedFont* fontData = new CPDF_CountedFont; CPDF_Font* pFont = CPDF_Font::CreateFontF(m_pPDFDoc, pDict); if (!pFont) { delete fontData; - return NULL; + return nullptr; } fontData->m_nCount = 2; fontData->m_Obj = pFont; - m_FontMap.SetAt(pDict, fontData); + m_FontMap[pDict] = fontData; return pFont; } + void CPDF_DocPageData::ReleaseFont(CPDF_Dictionary* pFontDict) { - if (!pFontDict) { + if (!pFontDict) return; - } - CPDF_CountedObject* fontData; - if (!m_FontMap.Lookup(pFontDict, fontData)) { + + auto it = m_FontMap.find(pFontDict); + if (it == m_FontMap.end()) return; - } + + CPDF_CountedFont* fontData = it->second; if (fontData->m_Obj && --fontData->m_nCount == 0) { delete fontData->m_Obj; - fontData->m_Obj = NULL; + fontData->m_Obj = nullptr; } } + CPDF_ColorSpace* CPDF_DocPageData::GetColorSpace(CPDF_Object* pCSObj, CPDF_Dictionary* pResources) { if (!pCSObj) { diff --git a/core/src/fpdfapi/fpdf_page/pageint.h b/core/src/fpdfapi/fpdf_page/pageint.h index bdbf8dc886..5c9312ea01 100644 --- a/core/src/fpdfapi/fpdf_page/pageint.h +++ b/core/src/fpdfapi/fpdf_page/pageint.h @@ -1,18 +1,20 @@ // Copyright 2014 PDFium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com #ifndef CORE_SRC_FPDFAPI_FPDF_PAGE_PAGEINT_H_ #define CORE_SRC_FPDFAPI_FPDF_PAGE_PAGEINT_H_ +#include + #include "../../../include/fpdfapi/fpdf_pageobj.h" #define PARSE_STEP_LIMIT 100 #define STREAM_PARSE_BUFSIZE 20480 -class CPDF_QuickFontCache; -class CPDF_StreamParser + +class CPDF_StreamParser { public: @@ -119,7 +121,7 @@ typedef struct { #define _FPDF_MAX_FORM_LEVEL_ 30 #define _FPDF_MAX_TYPE3_FORM_LEVEL_ 4 #define _FPDF_MAX_OBJECT_STACK_SIZE_ 512 -class CPDF_StreamContentParser +class CPDF_StreamContentParser { public: CPDF_StreamContentParser(); @@ -281,7 +283,7 @@ public: void Handle_NextLineShowText_Space(); void Handle_Invalid(); }; -class CPDF_ContentParser +class CPDF_ContentParser { public: CPDF_ContentParser(); @@ -360,11 +362,12 @@ FX_BOOL PDF_DocPageData_Release(CFX_MapPtrTemplate; + using CPDF_FontMap = std::map; + + CPDF_FontMap m_FontMap; }; -class CPDF_Function + +class CPDF_Function { public: static CPDF_Function* Load(CPDF_Object* pFuncObj); @@ -417,7 +426,7 @@ protected: virtual FX_BOOL v_Init(CPDF_Object* pObj) = 0; virtual FX_BOOL v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const = 0; }; -class CPDF_IccProfile +class CPDF_IccProfile { public: CPDF_IccProfile(FX_LPCBYTE pData, FX_DWORD dwSize); @@ -453,7 +462,7 @@ public: CPDF_CountedColorSpace* m_pCountedBaseCS; }; #define MAX_PAGE_OBJECTS_UNIFY_NAMING 4096 -class CPDF_ResourceNaming +class CPDF_ResourceNaming { public: struct _NamingState { -- cgit v1.2.3