summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/include/fpdfapi/fpdf_resource.h56
-rw-r--r--core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp146
-rw-r--r--core/src/fpdfapi/fpdf_page/pageint.h33
3 files changed, 121 insertions, 114 deletions
diff --git a/core/include/fpdfapi/fpdf_resource.h b/core/include/fpdfapi/fpdf_resource.h
index c841e5b635..a9b16c93f0 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 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:
diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp
index 305c1a9183..d955e190e8 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<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(const CFX_ByteStringC& 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(const CFX_ByteStringC& fontName, CP
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) {
diff --git a/core/src/fpdfapi/fpdf_page/pageint.h b/core/src/fpdfapi/fpdf_page/pageint.h
index 5bf854948a..08c4301e74 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 <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(const CFX_ByteStringC& 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(const uint8_t* 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 {