Convert CPDF_FontMap to std::map.
authorLei Zhang <thestig@chromium.org>
Wed, 10 Jun 2015 17:40:57 +0000 (10:40 -0700)
committerLei Zhang <thestig@chromium.org>
Wed, 10 Jun 2015 17:40:57 +0000 (10:40 -0700)
R=tsepez@chromium.org

Review URL: https://codereview.chromium.org/1151133004.

core/include/fpdfapi/fpdf_resource.h
core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp
core/src/fpdfapi/fpdf_page/pageint.h

index 06dcdfe..054e90a 100644 (file)
@@ -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_
 #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 ObjClass> class CPDF_CountedObject 
+template <class ObjClass> class CPDF_CountedObject
 {
 public:
     ObjClass   m_Obj;
     FX_DWORD   m_nCount;
 };
-typedef CPDF_CountedObject<CPDF_Font*>          CPDF_CountedFont;
 typedef CPDF_CountedObject<CPDF_ColorSpace*>    CPDF_CountedColorSpace;
 typedef CPDF_CountedObject<CPDF_Pattern*>       CPDF_CountedPattern;
 typedef CPDF_CountedObject<CPDF_Image*>         CPDF_CountedImage;
@@ -51,7 +50,6 @@ typedef CPDF_CountedObject<CPDF_IccProfile*>    CPDF_CountedICCProfile;
 typedef CPDF_CountedObject<CPDF_StreamAcc*>     CPDF_CountedStreamAcc;
 
 
-typedef CFX_MapPtrTemplate<CPDF_Dictionary*, CPDF_CountedFont*>     CPDF_FontMap;
 typedef CFX_MapPtrTemplate<CPDF_Object*, CPDF_CountedColorSpace*>   CPDF_ColorSpaceMap;
 typedef CFX_MapPtrTemplate<CPDF_Object*, CPDF_CountedPattern*>      CPDF_PatternMap;
 typedef CFX_MapPtrTemplate<FX_DWORD, CPDF_CountedImage*>            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:
 
index 00ea4c5..be54747 100644 (file)
@@ -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<CPDF_Font*>* 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<CPDF_Font*>* 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<CPDF_Font*>* 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<CPDF_Font*>* 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<CPDF_Font*>;
+        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<CPDF_Font*>* 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<CPDF_Font*>* fontData = new CPDF_CountedObject<CPDF_Font*>;
+    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<CPDF_Font*>* 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) {
index bdbf8dc..5c9312e 100644 (file)
@@ -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 <map>
+
 #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<KeyType, CPDF_CountedObject<V
     }
     return FALSE;
 }
-class CPDF_DocPageData 
+class CPDF_DocPageData
 {
-public:
-    CPDF_DocPageData(CPDF_Document *pPDFDoc);
+  public:
+    explicit CPDF_DocPageData(CPDF_Document *pPDFDoc);
     ~CPDF_DocPageData();
+
     void                        Clear(FX_BOOL bRelease = FALSE);
     CPDF_Font*                  GetFont(CPDF_Dictionary* pFontDict, FX_BOOL findOnly);
     CPDF_Font*                  GetStandardFont(FX_BSTR fontName, CPDF_FontEncoding* pEncoding);
@@ -385,7 +388,6 @@ public:
     CPDF_CountedPattern*        FindPatternPtr(CPDF_Object* pPatternObj) const;
 
     CPDF_Document*              m_pPDFDoc;
-    CPDF_FontMap                m_FontMap;
     CPDF_ColorSpaceMap          m_ColorSpaceMap;
     CPDF_PatternMap             m_PatternMap;
     CPDF_ImageMap               m_ImageMap;
@@ -393,8 +395,15 @@ public:
     CFX_MapByteStringToPtr      m_HashProfileMap;
     CPDF_FontFileMap            m_FontFileMap;
     FX_BOOL                     m_bForceClear;
+
+  private:
+    using CPDF_CountedFont = CPDF_CountedObject<CPDF_Font*>;
+    using CPDF_FontMap = std::map<CPDF_Dictionary*, CPDF_CountedFont*>;
+
+    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  {