remove bool from CPDF_SteamContentParser::FindPattern().
Slight duplication of code allows for more precise return types once
split off into a FindShading() method.
Change-Id: Ic460e3ff7426806f5f2674087437f4f0a8dec3fb
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/81251
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfapi/page/cpdf_docpagedata.cpp b/core/fpdfapi/page/cpdf_docpagedata.cpp
index 56b9880..7b1b032 100644
--- a/core/fpdfapi/page/cpdf_docpagedata.cpp
+++ b/core/fpdfapi/page/cpdf_docpagedata.cpp
@@ -326,7 +326,6 @@
}
RetainPtr<CPDF_Pattern> CPDF_DocPageData::GetPattern(CPDF_Object* pPatternObj,
- bool bShading,
const CFX_Matrix& matrix) {
if (!pPatternObj)
return nullptr;
@@ -335,27 +334,37 @@
if (it != m_PatternMap.end() && it->second)
return pdfium::WrapRetain(it->second.Get());
+ CPDF_Dictionary* pDict = pPatternObj->GetDict();
+ if (!pDict)
+ return nullptr;
+
RetainPtr<CPDF_Pattern> pPattern;
- if (bShading) {
+ int type = pDict->GetIntegerFor("PatternType");
+ if (type == CPDF_Pattern::kTiling) {
+ pPattern = pdfium::MakeRetain<CPDF_TilingPattern>(GetDocument(),
+ pPatternObj, matrix);
+ } else if (type == CPDF_Pattern::kShading) {
pPattern = pdfium::MakeRetain<CPDF_ShadingPattern>(
- GetDocument(), pPatternObj, true, matrix);
+ GetDocument(), pPatternObj, false, matrix);
} else {
- CPDF_Dictionary* pDict = pPatternObj->GetDict();
- if (!pDict)
- return nullptr;
-
- int type = pDict->GetIntegerFor("PatternType");
- if (type == CPDF_Pattern::kTiling) {
- pPattern = pdfium::MakeRetain<CPDF_TilingPattern>(GetDocument(),
- pPatternObj, matrix);
- } else if (type == CPDF_Pattern::kShading) {
- pPattern = pdfium::MakeRetain<CPDF_ShadingPattern>(
- GetDocument(), pPatternObj, false, matrix);
- } else {
- return nullptr;
- }
+ return nullptr;
}
+ m_PatternMap[pPatternObj].Reset(pPattern.Get());
+ return pPattern;
+}
+RetainPtr<CPDF_ShadingPattern> CPDF_DocPageData::GetShading(
+ CPDF_Object* pPatternObj,
+ const CFX_Matrix& matrix) {
+ if (!pPatternObj)
+ return nullptr;
+
+ auto it = m_PatternMap.find(pPatternObj);
+ if (it != m_PatternMap.end() && it->second)
+ return pdfium::WrapRetain(it->second->AsShadingPattern());
+
+ auto pPattern = pdfium::MakeRetain<CPDF_ShadingPattern>(
+ GetDocument(), pPatternObj, true, matrix);
m_PatternMap[pPatternObj].Reset(pPattern.Get());
return pPattern;
}
diff --git a/core/fpdfapi/page/cpdf_docpagedata.h b/core/fpdfapi/page/cpdf_docpagedata.h
index c382308..5fbcd0a 100644
--- a/core/fpdfapi/page/cpdf_docpagedata.h
+++ b/core/fpdfapi/page/cpdf_docpagedata.h
@@ -74,8 +74,9 @@
std::set<const CPDF_Object*>* pVisited);
RetainPtr<CPDF_Pattern> GetPattern(CPDF_Object* pPatternObj,
- bool bShading,
const CFX_Matrix& matrix);
+ RetainPtr<CPDF_ShadingPattern> GetShading(CPDF_Object* pPatternObj,
+ const CFX_Matrix& matrix);
RetainPtr<CPDF_Image> GetImage(uint32_t dwStreamObjNum);
void MaybePurgeImage(uint32_t dwStreamObjNum);
diff --git a/core/fpdfapi/page/cpdf_streamcontentparser.cpp b/core/fpdfapi/page/cpdf_streamcontentparser.cpp
index 38aec36..79189cf 100644
--- a/core/fpdfapi/page/cpdf_streamcontentparser.cpp
+++ b/core/fpdfapi/page/cpdf_streamcontentparser.cpp
@@ -1043,7 +1043,7 @@
// A valid |pLastParam| implies |m_ParamCount| > 0, so GetNamedColors() call
// below is safe.
- RetainPtr<CPDF_Pattern> pPattern = FindPattern(GetString(0), false);
+ RetainPtr<CPDF_Pattern> pPattern = FindPattern(GetString(0));
if (pPattern)
m_pCurStates->m_ColorState.SetFillPattern(pPattern, GetNamedColors());
}
@@ -1060,17 +1060,13 @@
// A valid |pLastParam| implies |m_ParamCount| > 0, so GetNamedColors() call
// below is safe.
- RetainPtr<CPDF_Pattern> pPattern = FindPattern(GetString(0), false);
+ RetainPtr<CPDF_Pattern> pPattern = FindPattern(GetString(0));
if (pPattern)
m_pCurStates->m_ColorState.SetStrokePattern(pPattern, GetNamedColors());
}
void CPDF_StreamContentParser::Handle_ShadeFill() {
- RetainPtr<CPDF_Pattern> pPattern = FindPattern(GetString(0), true);
- if (!pPattern)
- return;
-
- CPDF_ShadingPattern* pShading = pPattern->AsShadingPattern();
+ RetainPtr<CPDF_ShadingPattern> pShading = FindShading(GetString(0));
if (!pShading)
return;
@@ -1079,12 +1075,12 @@
CFX_Matrix matrix = m_pCurStates->m_CTM * m_mtContentToUser;
auto pObj = std::make_unique<CPDF_ShadingObject>(GetCurrentStreamIndex(),
- pShading, matrix);
+ pShading.Get(), matrix);
SetGraphicStates(pObj.get(), false, false, false);
CFX_FloatRect bbox =
pObj->m_ClipPath.HasRef() ? pObj->m_ClipPath.GetClipBox() : m_BBox;
if (pShading->IsMeshShading())
- bbox.Intersect(GetShadingBBox(pShading, pObj->matrix()));
+ bbox.Intersect(GetShadingBBox(pShading.Get(), pObj->matrix()));
pObj->SetRect(bbox);
m_pObjectHolder->AppendPageObject(std::move(pObj));
}
@@ -1186,16 +1182,25 @@
}
RetainPtr<CPDF_Pattern> CPDF_StreamContentParser::FindPattern(
- const ByteString& name,
- bool bShading) {
- CPDF_Object* pPattern =
- FindResourceObj(bShading ? "Shading" : "Pattern", name);
+ const ByteString& name) {
+ CPDF_Object* pPattern = FindResourceObj("Pattern", name);
if (!pPattern || (!pPattern->IsDictionary() && !pPattern->IsStream())) {
m_bResourceMissing = true;
return nullptr;
}
return CPDF_DocPageData::FromDocument(m_pDocument.Get())
- ->GetPattern(pPattern, bShading, m_pCurStates->m_ParentMatrix);
+ ->GetPattern(pPattern, m_pCurStates->m_ParentMatrix);
+}
+
+RetainPtr<CPDF_ShadingPattern> CPDF_StreamContentParser::FindShading(
+ const ByteString& name) {
+ CPDF_Object* pPattern = FindResourceObj("Shading", name);
+ if (!pPattern || (!pPattern->IsDictionary() && !pPattern->IsStream())) {
+ m_bResourceMissing = true;
+ return nullptr;
+ }
+ return CPDF_DocPageData::FromDocument(m_pDocument.Get())
+ ->GetShading(pPattern, m_pCurStates->m_ParentMatrix);
}
void CPDF_StreamContentParser::AddTextObject(const ByteString* pStrs,
diff --git a/core/fpdfapi/page/cpdf_streamcontentparser.h b/core/fpdfapi/page/cpdf_streamcontentparser.h
index 51d459e..343faf5 100644
--- a/core/fpdfapi/page/cpdf_streamcontentparser.h
+++ b/core/fpdfapi/page/cpdf_streamcontentparser.h
@@ -32,6 +32,7 @@
class CPDF_PageObject;
class CPDF_PageObjectHolder;
class CPDF_Pattern;
+class CPDF_ShadingPattern;
class CPDF_Stream;
class CPDF_StreamParser;
class CPDF_TextObject;
@@ -120,7 +121,8 @@
bool bText,
bool bGraph);
RetainPtr<CPDF_ColorSpace> FindColorSpace(const ByteString& name);
- RetainPtr<CPDF_Pattern> FindPattern(const ByteString& name, bool bShading);
+ RetainPtr<CPDF_Pattern> FindPattern(const ByteString& name);
+ RetainPtr<CPDF_ShadingPattern> FindShading(const ByteString& name);
CPDF_Dictionary* FindResourceHolder(const ByteString& type);
CPDF_Object* FindResourceObj(const ByteString& type, const ByteString& name);