Split off CPDF_Form::PareseContentForType3Char() from ParseContent(). -- Also add no-arg form of ParseContent() itself. Change-Id: Ibd34f63ec1a9bfd95bc2b9a979047d4e1f2b0289 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/57850 Commit-Queue: Tom Sepez <tsepez@chromium.org> Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/edit/cpdf_pagecontentgenerator_unittest.cpp b/core/fpdfapi/edit/cpdf_pagecontentgenerator_unittest.cpp index 5473041..1518e2a 100644 --- a/core/fpdfapi/edit/cpdf_pagecontentgenerator_unittest.cpp +++ b/core/fpdfapi/edit/cpdf_pagecontentgenerator_unittest.cpp
@@ -379,7 +379,7 @@ // Create an empty form. auto pTestForm = pdfium::MakeUnique<CPDF_Form>(pDoc.get(), nullptr, pStream.Get()); - pTestForm->ParseContent(nullptr, nullptr, nullptr, nullptr); + pTestForm->ParseContent(); ASSERT_EQ(CPDF_PageObjectHolder::ParseState::kParsed, pTestForm->GetParseState()); @@ -408,7 +408,7 @@ // Create a form with a non-empty stream. auto pTestForm = pdfium::MakeUnique<CPDF_Form>(pDoc.get(), nullptr, pStream.Get()); - pTestForm->ParseContent(nullptr, nullptr, nullptr, nullptr); + pTestForm->ParseContent(); ASSERT_EQ(CPDF_PageObjectHolder::ParseState::kParsed, pTestForm->GetParseState());
diff --git a/core/fpdfapi/font/cpdf_type3font.cpp b/core/fpdfapi/font/cpdf_type3font.cpp index 97d473e..2c9d815 100644 --- a/core/fpdfapi/font/cpdf_type3font.cpp +++ b/core/fpdfapi/font/cpdf_type3font.cpp
@@ -121,7 +121,7 @@ { AutoRestorer<int> restorer(&m_CharLoadingDepth); m_CharLoadingDepth++; - pForm->ParseContent(nullptr, nullptr, pNewChar.get(), nullptr); + pForm->ParseContentForType3Char(pNewChar.get()); } it = m_CacheMap.find(charcode); if (it != m_CacheMap.end())
diff --git a/core/fpdfapi/page/cpdf_contentparser.cpp b/core/fpdfapi/page/cpdf_contentparser.cpp index 1b313ca..70b9bd4 100644 --- a/core/fpdfapi/page/cpdf_contentparser.cpp +++ b/core/fpdfapi/page/cpdf_contentparser.cpp
@@ -54,7 +54,7 @@ const CPDF_AllStates* pGraphicStates, const CFX_Matrix* pParentMatrix, CPDF_Type3Char* pType3Char, - std::set<const uint8_t*>* parsedSet) + std::set<const uint8_t*>* pParsedSet) : m_CurrentStage(Stage::kParse), m_pObjectHolder(pForm), m_pType3Char(pType3Char) { @@ -84,7 +84,7 @@ m_pParser = pdfium::MakeUnique<CPDF_StreamContentParser>( pForm->GetDocument(), pForm->m_pPageResources.Get(), pForm->m_pResources.Get(), pParentMatrix, pForm, pResources, form_bbox, - pGraphicStates, parsedSet); + pGraphicStates, pParsedSet); m_pParser->GetCurStates()->m_CTM = form_matrix; m_pParser->GetCurStates()->m_ParentMatrix = form_matrix; if (ClipPath.HasRef()) { @@ -184,12 +184,12 @@ CPDF_ContentParser::Stage CPDF_ContentParser::Parse() { if (!m_pParser) { - m_parsedSet = pdfium::MakeUnique<std::set<const uint8_t*>>(); + m_pParsedSet = pdfium::MakeUnique<std::set<const uint8_t*>>(); m_pParser = pdfium::MakeUnique<CPDF_StreamContentParser>( m_pObjectHolder->GetDocument(), m_pObjectHolder->m_pPageResources.Get(), nullptr, nullptr, m_pObjectHolder.Get(), m_pObjectHolder->m_pResources.Get(), m_pObjectHolder->GetBBox(), - nullptr, m_parsedSet.get()); + nullptr, m_pParsedSet.get()); m_pParser->GetCurStates()->m_ColorState.SetDefault(); } if (m_CurrentOffset >= m_Size)
diff --git a/core/fpdfapi/page/cpdf_contentparser.h b/core/fpdfapi/page/cpdf_contentparser.h index f87b015..8b83695 100644 --- a/core/fpdfapi/page/cpdf_contentparser.h +++ b/core/fpdfapi/page/cpdf_contentparser.h
@@ -32,7 +32,7 @@ const CPDF_AllStates* pGraphicStates, const CFX_Matrix* pParentMatrix, CPDF_Type3Char* pType3Char, - std::set<const uint8_t*>* parsedSet); + std::set<const uint8_t*>* pParsedSet); ~CPDF_ContentParser(); const CPDF_AllStates* GetCurStates() const { @@ -71,9 +71,9 @@ uint32_t m_CurrentOffset = 0; // Only used when parsing pages. - std::unique_ptr<std::set<const uint8_t*>> m_parsedSet; + std::unique_ptr<std::set<const uint8_t*>> m_pParsedSet; - // |m_pParser| has a reference to |m_parsedSet|, so must be below and thus + // |m_pParser| has a reference to |m_pParsedSet|, so must be below and thus // destroyed first. std::unique_ptr<CPDF_StreamContentParser> m_pParser; };
diff --git a/core/fpdfapi/page/cpdf_form.cpp b/core/fpdfapi/page/cpdf_form.cpp index 72c90a8..cef03d0 100644 --- a/core/fpdfapi/page/cpdf_form.cpp +++ b/core/fpdfapi/page/cpdf_form.cpp
@@ -48,21 +48,35 @@ CPDF_Form::~CPDF_Form() = default; +void CPDF_Form::ParseContent() { + ParseContentInternal(nullptr, nullptr, nullptr, nullptr); +} + void CPDF_Form::ParseContent(const CPDF_AllStates* pGraphicStates, const CFX_Matrix* pParentMatrix, - CPDF_Type3Char* pType3Char, - std::set<const uint8_t*>* parsedSet) { + std::set<const uint8_t*>* pParsedSet) { + ParseContentInternal(pGraphicStates, pParentMatrix, nullptr, pParsedSet); +} + +void CPDF_Form::ParseContentForType3Char(CPDF_Type3Char* pType3Char) { + ParseContentInternal(nullptr, nullptr, pType3Char, nullptr); +} + +void CPDF_Form::ParseContentInternal(const CPDF_AllStates* pGraphicStates, + const CFX_Matrix* pParentMatrix, + CPDF_Type3Char* pType3Char, + std::set<const uint8_t*>* pParsedSet) { if (GetParseState() == ParseState::kParsed) return; if (GetParseState() == ParseState::kNotParsed) { - if (!parsedSet) { + if (!pParsedSet) { if (!m_ParsedSet) m_ParsedSet = pdfium::MakeUnique<std::set<const uint8_t*>>(); - parsedSet = m_ParsedSet.get(); + pParsedSet = m_ParsedSet.get(); } StartParse(pdfium::MakeUnique<CPDF_ContentParser>( - this, pGraphicStates, pParentMatrix, pType3Char, parsedSet)); + this, pGraphicStates, pParentMatrix, pType3Char, pParsedSet)); } ASSERT(GetParseState() == ParseState::kParsing);
diff --git a/core/fpdfapi/page/cpdf_form.h b/core/fpdfapi/page/cpdf_form.h index 69bac7d..68f92d5 100644 --- a/core/fpdfapi/page/cpdf_form.h +++ b/core/fpdfapi/page/cpdf_form.h
@@ -36,10 +36,11 @@ CPDF_Dictionary* pParentResources); ~CPDF_Form() override; + void ParseContent(); void ParseContent(const CPDF_AllStates* pGraphicStates, const CFX_Matrix* pParentMatrix, - CPDF_Type3Char* pType3Char, - std::set<const uint8_t*>* parsedSet); + std::set<const uint8_t*>* pParsedSet); + void ParseContentForType3Char(CPDF_Type3Char* pType3Char); CFX_FloatRect CalcBoundingBox() const; const CPDF_Stream* GetStream() const; @@ -48,6 +49,11 @@ const CPDF_ImageObject* GetSoleImageOfForm() const; private: + void ParseContentInternal(const CPDF_AllStates* pGraphicStates, + const CFX_Matrix* pParentMatrix, + CPDF_Type3Char* pType3Char, + std::set<const uint8_t*>* pParsedSet); + std::unique_ptr<std::set<const uint8_t*>> m_ParsedSet; RetainPtr<CPDF_Stream> const m_pFormStream; };
diff --git a/core/fpdfapi/page/cpdf_streamcontentparser.cpp b/core/fpdfapi/page/cpdf_streamcontentparser.cpp index 6eba6dd..c4021d8 100644 --- a/core/fpdfapi/page/cpdf_streamcontentparser.cpp +++ b/core/fpdfapi/page/cpdf_streamcontentparser.cpp
@@ -256,7 +256,7 @@ CPDF_Dictionary* pResources, const CFX_FloatRect& rcBBox, const CPDF_AllStates* pStates, - std::set<const uint8_t*>* parsedSet) + std::set<const uint8_t*>* pParsedSet) : m_pDocument(pDocument), m_pPageResources(pPageResources), m_pParentResources(pParentResources), @@ -264,7 +264,7 @@ pParentResources, pPageResources)), m_pObjectHolder(pObjHolder), - m_ParsedSet(parsedSet), + m_ParsedSet(pParsedSet), m_BBox(rcBBox), m_ParamStartPos(0), m_ParamCount(0), @@ -784,7 +784,7 @@ status.m_TextState = m_pCurStates->m_TextState; auto form = pdfium::MakeUnique<CPDF_Form>( m_pDocument.Get(), m_pPageResources.Get(), pStream, m_pResources.Get()); - form->ParseContent(&status, nullptr, nullptr, m_ParsedSet.Get()); + form->ParseContent(&status, nullptr, m_ParsedSet.Get()); CFX_Matrix matrix = m_pCurStates->m_CTM * m_mtContentToUser;
diff --git a/core/fpdfapi/page/cpdf_streamcontentparser.h b/core/fpdfapi/page/cpdf_streamcontentparser.h index 6e4b46f..a20dbe1 100644 --- a/core/fpdfapi/page/cpdf_streamcontentparser.h +++ b/core/fpdfapi/page/cpdf_streamcontentparser.h
@@ -44,7 +44,7 @@ CPDF_Dictionary* pResources, const CFX_FloatRect& rcBBox, const CPDF_AllStates* pStates, - std::set<const uint8_t*>* parsedSet); + std::set<const uint8_t*>* pParsedSet); ~CPDF_StreamContentParser(); uint32_t Parse(const uint8_t* pData,
diff --git a/core/fpdfapi/page/cpdf_tilingpattern.cpp b/core/fpdfapi/page/cpdf_tilingpattern.cpp index eca6478d..46a59db 100644 --- a/core/fpdfapi/page/cpdf_tilingpattern.cpp +++ b/core/fpdfapi/page/cpdf_tilingpattern.cpp
@@ -47,7 +47,7 @@ allStates.m_GraphState.Emplace(); allStates.m_TextState.Emplace(); allStates.m_GeneralState = pPageObj->m_GeneralState; - form->ParseContent(&allStates, &matrix, nullptr, nullptr); + form->ParseContent(&allStates, &matrix, nullptr); m_BBox = pDict->GetRectFor("BBox"); return form; }
diff --git a/core/fpdfapi/render/cpdf_renderstatus.cpp b/core/fpdfapi/render/cpdf_renderstatus.cpp index ec3af9e..b32c995 100644 --- a/core/fpdfapi/render/cpdf_renderstatus.cpp +++ b/core/fpdfapi/render/cpdf_renderstatus.cpp
@@ -2530,7 +2530,7 @@ CPDF_Form form(m_pContext->GetDocument(), m_pContext->GetPageResources(), pGroup); - form.ParseContent(nullptr, nullptr, nullptr, nullptr); + form.ParseContent(); CFX_DefaultRenderDevice bitmap_device; bool bLuminosity =
diff --git a/core/fpdfdoc/cpdf_annot.cpp b/core/fpdfdoc/cpdf_annot.cpp index b74d699..6d542ee 100644 --- a/core/fpdfdoc/cpdf_annot.cpp +++ b/core/fpdfdoc/cpdf_annot.cpp
@@ -199,7 +199,7 @@ auto pNewForm = pdfium::MakeUnique<CPDF_Form>( m_pDocument.Get(), pPage->m_pResources.Get(), pStream); - pNewForm->ParseContent(nullptr, nullptr, nullptr, nullptr); + pNewForm->ParseContent(); CPDF_Form* pResult = pNewForm.get(); m_APMap[pStream] = std::move(pNewForm);
diff --git a/fpdfsdk/cpdf_annotcontext.cpp b/fpdfsdk/cpdf_annotcontext.cpp index 0beebe1..f363ef2 100644 --- a/fpdfsdk/cpdf_annotcontext.cpp +++ b/fpdfsdk/cpdf_annotcontext.cpp
@@ -31,5 +31,5 @@ m_pAnnotForm = pdfium::MakeUnique<CPDF_Form>( m_pPage->GetDocument(), m_pPage->m_pResources.Get(), pStream); - m_pAnnotForm->ParseContent(nullptr, nullptr, nullptr, nullptr); + m_pAnnotForm->ParseContent(); }