summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/fpdfapi/fpdf_font/cpdf_cidfont.cpp4
-rw-r--r--core/fpdfapi/fpdf_font/cpdf_cidfont.h4
-rw-r--r--core/fpdfapi/fpdf_font/cpdf_font.h4
-rw-r--r--core/fpdfapi/fpdf_font/cpdf_simplefont.cpp4
-rw-r--r--core/fpdfapi/fpdf_font/cpdf_simplefont.h4
-rw-r--r--core/fpdfapi/fpdf_font/cpdf_type3font.cpp19
-rw-r--r--core/fpdfapi/fpdf_font/cpdf_type3font.h8
-rw-r--r--core/fpdfapi/fpdf_page/cpdf_textobject.cpp9
-rw-r--r--core/fpdfapi/fpdf_page/cpdf_textobject.h3
-rw-r--r--core/fpdfapi/fpdf_page/fpdf_page_parser.cpp2
10 files changed, 32 insertions, 29 deletions
diff --git a/core/fpdfapi/fpdf_font/cpdf_cidfont.cpp b/core/fpdfapi/fpdf_font/cpdf_cidfont.cpp
index ce7d5090d5..45db54fa67 100644
--- a/core/fpdfapi/fpdf_font/cpdf_cidfont.cpp
+++ b/core/fpdfapi/fpdf_font/cpdf_cidfont.cpp
@@ -428,7 +428,7 @@ bool CPDF_CIDFont::Load() {
return true;
}
-FX_RECT CPDF_CIDFont::GetCharBBox(uint32_t charcode, int level) {
+FX_RECT CPDF_CIDFont::GetCharBBox(uint32_t charcode) {
if (charcode < 256 && m_CharBBox[charcode].right != -1)
return m_CharBBox[charcode];
@@ -499,7 +499,7 @@ FX_RECT CPDF_CIDFont::GetCharBBox(uint32_t charcode, int level) {
return rect;
}
-int CPDF_CIDFont::GetCharWidthF(uint32_t charcode, int level) {
+int CPDF_CIDFont::GetCharWidthF(uint32_t charcode) {
if (charcode < 0x80 && m_bAnsiWidthsFixed)
return (charcode >= 32 && charcode < 127) ? 500 : 0;
diff --git a/core/fpdfapi/fpdf_font/cpdf_cidfont.h b/core/fpdfapi/fpdf_font/cpdf_cidfont.h
index 2c7df93b64..3e8c042c75 100644
--- a/core/fpdfapi/fpdf_font/cpdf_cidfont.h
+++ b/core/fpdfapi/fpdf_font/cpdf_cidfont.h
@@ -41,8 +41,8 @@ class CPDF_CIDFont : public CPDF_Font {
const CPDF_CIDFont* AsCIDFont() const override;
CPDF_CIDFont* AsCIDFont() override;
int GlyphFromCharCode(uint32_t charcode, bool* pVertGlyph) override;
- int GetCharWidthF(uint32_t charcode, int level = 0) override;
- FX_RECT GetCharBBox(uint32_t charcode, int level = 0) override;
+ int GetCharWidthF(uint32_t charcode) override;
+ FX_RECT GetCharBBox(uint32_t charcode) override;
uint32_t GetNextChar(const FX_CHAR* pString,
int nStrLen,
int& offset) const override;
diff --git a/core/fpdfapi/fpdf_font/cpdf_font.h b/core/fpdfapi/fpdf_font/cpdf_font.h
index 04f942c03c..0d2f50b61a 100644
--- a/core/fpdfapi/fpdf_font/cpdf_font.h
+++ b/core/fpdfapi/fpdf_font/cpdf_font.h
@@ -91,8 +91,8 @@ class CPDF_Font {
uint32_t FallbackFontFromCharcode(uint32_t charcode);
int FallbackGlyphFromCharcode(int fallbackFont, uint32_t charcode);
- virtual int GetCharWidthF(uint32_t charcode, int level = 0) = 0;
- virtual FX_RECT GetCharBBox(uint32_t charcode, int level = 0) = 0;
+ virtual int GetCharWidthF(uint32_t charcode) = 0;
+ virtual FX_RECT GetCharBBox(uint32_t charcode) = 0;
CPDF_Document* m_pDocument;
CFX_Font m_Font;
diff --git a/core/fpdfapi/fpdf_font/cpdf_simplefont.cpp b/core/fpdfapi/fpdf_font/cpdf_simplefont.cpp
index dda642380f..3bb3730fb5 100644
--- a/core/fpdfapi/fpdf_font/cpdf_simplefont.cpp
+++ b/core/fpdfapi/fpdf_font/cpdf_simplefont.cpp
@@ -78,7 +78,7 @@ void CPDF_SimpleFont::LoadCharMetrics(int charcode) {
}
}
-int CPDF_SimpleFont::GetCharWidthF(uint32_t charcode, int level) {
+int CPDF_SimpleFont::GetCharWidthF(uint32_t charcode) {
if (charcode > 0xff)
charcode = 0;
@@ -91,7 +91,7 @@ int CPDF_SimpleFont::GetCharWidthF(uint32_t charcode, int level) {
return m_CharWidth[charcode];
}
-FX_RECT CPDF_SimpleFont::GetCharBBox(uint32_t charcode, int level) {
+FX_RECT CPDF_SimpleFont::GetCharBBox(uint32_t charcode) {
if (charcode > 0xff)
charcode = 0;
diff --git a/core/fpdfapi/fpdf_font/cpdf_simplefont.h b/core/fpdfapi/fpdf_font/cpdf_simplefont.h
index 47067687a3..f286c1a228 100644
--- a/core/fpdfapi/fpdf_font/cpdf_simplefont.h
+++ b/core/fpdfapi/fpdf_font/cpdf_simplefont.h
@@ -20,8 +20,8 @@ class CPDF_SimpleFont : public CPDF_Font {
~CPDF_SimpleFont() override;
// CPDF_Font
- int GetCharWidthF(uint32_t charcode, int level = 0) override;
- FX_RECT GetCharBBox(uint32_t charcode, int level = 0) override;
+ int GetCharWidthF(uint32_t charcode) override;
+ FX_RECT GetCharBBox(uint32_t charcode) override;
int GlyphFromCharCode(uint32_t charcode, bool* pVertGlyph) override;
bool IsUnicodeCompatible() const override;
CFX_WideString UnicodeFromCharCode(uint32_t charcode) const override;
diff --git a/core/fpdfapi/fpdf_font/cpdf_type3font.cpp b/core/fpdfapi/fpdf_font/cpdf_type3font.cpp
index 4c81202bc4..e43ccda904 100644
--- a/core/fpdfapi/fpdf_font/cpdf_type3font.cpp
+++ b/core/fpdfapi/fpdf_font/cpdf_type3font.cpp
@@ -19,7 +19,8 @@
CPDF_Type3Font::CPDF_Type3Font()
: m_pCharProcs(nullptr),
m_pPageResources(nullptr),
- m_pFontResources(nullptr) {
+ m_pFontResources(nullptr),
+ m_CharLoadingDepth(0) {
FXSYS_memset(m_CharWidthL, 0, sizeof(m_CharWidthL));
}
@@ -87,8 +88,8 @@ void CPDF_Type3Font::CheckType3FontMetrics() {
CheckFontMetrics();
}
-CPDF_Type3Char* CPDF_Type3Font::LoadChar(uint32_t charcode, int level) {
- if (level >= _FPDF_MAX_TYPE3_FORM_LEVEL_)
+CPDF_Type3Char* CPDF_Type3Font::LoadChar(uint32_t charcode) {
+ if (m_CharLoadingDepth >= _FPDF_MAX_TYPE3_FORM_LEVEL_)
return nullptr;
auto it = m_CacheMap.find(charcode);
@@ -111,7 +112,9 @@ CPDF_Type3Char* CPDF_Type3Font::LoadChar(uint32_t charcode, int level) {
// This can trigger recursion into this method. The content of |m_CacheMap|
// can change as a result. Thus after it returns, check the cache again for
// a cache hit.
- pNewChar->m_pForm->ParseContent(nullptr, nullptr, pNewChar.get(), level + 1);
+ m_CharLoadingDepth++;
+ pNewChar->m_pForm->ParseContent(nullptr, nullptr, pNewChar.get());
+ m_CharLoadingDepth--;
it = m_CacheMap.find(charcode);
if (it != m_CacheMap.end())
return it->second.get();
@@ -139,18 +142,18 @@ CPDF_Type3Char* CPDF_Type3Font::LoadChar(uint32_t charcode, int level) {
return pCachedChar;
}
-int CPDF_Type3Font::GetCharWidthF(uint32_t charcode, int level) {
+int CPDF_Type3Font::GetCharWidthF(uint32_t charcode) {
if (charcode >= FX_ArraySize(m_CharWidthL))
charcode = 0;
if (m_CharWidthL[charcode])
return m_CharWidthL[charcode];
- const CPDF_Type3Char* pChar = LoadChar(charcode, level);
+ const CPDF_Type3Char* pChar = LoadChar(charcode);
return pChar ? pChar->m_Width : 0;
}
-FX_RECT CPDF_Type3Font::GetCharBBox(uint32_t charcode, int level) {
- const CPDF_Type3Char* pChar = LoadChar(charcode, level);
+FX_RECT CPDF_Type3Font::GetCharBBox(uint32_t charcode) {
+ const CPDF_Type3Char* pChar = LoadChar(charcode);
return pChar ? pChar->m_BBox : FX_RECT();
}
diff --git a/core/fpdfapi/fpdf_font/cpdf_type3font.h b/core/fpdfapi/fpdf_font/cpdf_type3font.h
index 2b840f2267..03078298f1 100644
--- a/core/fpdfapi/fpdf_font/cpdf_type3font.h
+++ b/core/fpdfapi/fpdf_font/cpdf_type3font.h
@@ -26,13 +26,13 @@ class CPDF_Type3Font : public CPDF_SimpleFont {
bool IsType3Font() const override;
const CPDF_Type3Font* AsType3Font() const override;
CPDF_Type3Font* AsType3Font() override;
- int GetCharWidthF(uint32_t charcode, int level = 0) override;
- FX_RECT GetCharBBox(uint32_t charcode, int level = 0) override;
+ int GetCharWidthF(uint32_t charcode) override;
+ FX_RECT GetCharBBox(uint32_t charcode) override;
void SetPageResources(CPDF_Dictionary* pResources) {
m_pPageResources = pResources;
}
- CPDF_Type3Char* LoadChar(uint32_t charcode, int level = 0);
+ CPDF_Type3Char* LoadChar(uint32_t charcode);
void CheckType3FontMetrics();
CFX_Matrix& GetFontMatrix() { return m_FontMatrix; }
@@ -52,6 +52,8 @@ class CPDF_Type3Font : public CPDF_SimpleFont {
CPDF_Dictionary* m_pPageResources;
CPDF_Dictionary* m_pFontResources;
std::map<uint32_t, std::unique_ptr<CPDF_Type3Char>> m_CacheMap;
+ // The depth char loading is in, to avoid recurive calling LoadChar().
+ int m_CharLoadingDepth;
};
#endif // CORE_FPDFAPI_FPDF_FONT_CPDF_TYPE3FONT_H_
diff --git a/core/fpdfapi/fpdf_page/cpdf_textobject.cpp b/core/fpdfapi/fpdf_page/cpdf_textobject.cpp
index 4b9f335ea3..1119d2965f 100644
--- a/core/fpdfapi/fpdf_page/cpdf_textobject.cpp
+++ b/core/fpdfapi/fpdf_page/cpdf_textobject.cpp
@@ -217,7 +217,7 @@ FX_FLOAT CPDF_TextObject::GetCharWidth(uint32_t charcode) const {
bVertWriting = pCIDFont->IsVertWriting();
}
if (!bVertWriting)
- return pFont->GetCharWidthF(charcode, 0) * fontsize;
+ return pFont->GetCharWidthF(charcode) * fontsize;
uint16_t CID = pCIDFont->CIDFromCharCode(charcode);
return pCIDFont->GetVertWidth(CID) * fontsize;
@@ -241,8 +241,7 @@ FX_FLOAT CPDF_TextObject::GetFontSize() const {
void CPDF_TextObject::CalcPositionData(FX_FLOAT* pTextAdvanceX,
FX_FLOAT* pTextAdvanceY,
- FX_FLOAT horz_scale,
- int level) {
+ FX_FLOAT horz_scale) {
FX_FLOAT curpos = 0;
FX_FLOAT min_x = 10000 * 1.0f;
FX_FLOAT max_x = -10000 * 1.0f;
@@ -265,7 +264,7 @@ void CPDF_TextObject::CalcPositionData(FX_FLOAT* pTextAdvanceX,
}
m_pCharPos[i - 1] = curpos;
}
- FX_RECT char_rect = pFont->GetCharBBox(charcode, level);
+ FX_RECT char_rect = pFont->GetCharBBox(charcode);
FX_FLOAT charwidth;
if (!bVertWriting) {
if (min_y > char_rect.top) {
@@ -294,7 +293,7 @@ void CPDF_TextObject::CalcPositionData(FX_FLOAT* pTextAdvanceX,
if (max_x < char_right) {
max_x = char_right;
}
- charwidth = pFont->GetCharWidthF(charcode, level) * fontsize / 1000;
+ charwidth = pFont->GetCharWidthF(charcode) * fontsize / 1000;
} else {
uint16_t CID = pCIDFont->CIDFromCharCode(charcode);
short vx;
diff --git a/core/fpdfapi/fpdf_page/cpdf_textobject.h b/core/fpdfapi/fpdf_page/cpdf_textobject.h
index c09da96040..05a08a9c89 100644
--- a/core/fpdfapi/fpdf_page/cpdf_textobject.h
+++ b/core/fpdfapi/fpdf_page/cpdf_textobject.h
@@ -56,8 +56,7 @@ class CPDF_TextObject : public CPDF_PageObject {
void CalcPositionData(FX_FLOAT* pTextAdvanceX,
FX_FLOAT* pTextAdvanceY,
- FX_FLOAT horz_scale,
- int level = 0);
+ FX_FLOAT horz_scale);
FX_FLOAT m_PosX;
FX_FLOAT m_PosY;
diff --git a/core/fpdfapi/fpdf_page/fpdf_page_parser.cpp b/core/fpdfapi/fpdf_page/fpdf_page_parser.cpp
index 18a2e2d882..4fc4bdc934 100644
--- a/core/fpdfapi/fpdf_page/fpdf_page_parser.cpp
+++ b/core/fpdfapi/fpdf_page/fpdf_page_parser.cpp
@@ -1252,7 +1252,7 @@ void CPDF_StreamContentParser::AddTextObject(CFX_ByteString* pStrs,
FX_FLOAT x_advance;
FX_FLOAT y_advance;
pText->CalcPositionData(&x_advance, &y_advance,
- m_pCurStates->m_TextHorzScale, m_Level);
+ m_pCurStates->m_TextHorzScale);
m_pCurStates->m_TextX += x_advance;
m_pCurStates->m_TextY += y_advance;
if (TextRenderingModeIsClipMode(text_mode)) {