Correctly draw text with pattern. CPDF_RenderStatus::DrawTextPathWithPattern() does the drawing by creating a new path object in memory and rendering that. However, it does not take the existing clip path into account. Add CPDF_ClipPath::CopyClipPath() and use that in DrawTextPathWithPattern() to copy the existing clip path into the path object that draws the text path. Bug: pdfium:632 Change-Id: I6d82697315b4c7537ec2c4136a0689fd5f8a48c7 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/60752 Commit-Queue: Lei Zhang <thestig@chromium.org> Reviewed-by: Nicolás Peña Moreno <npm@chromium.org>
diff --git a/core/fpdfapi/page/cpdf_clippath.cpp b/core/fpdfapi/page/cpdf_clippath.cpp index c04fafa..5db9208 100644 --- a/core/fpdfapi/page/cpdf_clippath.cpp +++ b/core/fpdfapi/page/cpdf_clippath.cpp
@@ -102,6 +102,14 @@ pTexts->clear(); } +void CPDF_ClipPath::CopyClipPath(const CPDF_ClipPath& that) { + if (*this == that || !that.HasRef()) + return; + + for (size_t i = 0; i < that.GetPathCount(); ++i) + AppendPath(that.GetPath(i), that.GetClipType(i), /*bAutoMerge=*/false); +} + void CPDF_ClipPath::Transform(const CFX_Matrix& matrix) { PathData* pData = m_Ref.GetPrivateCopy(); for (auto& obj : pData->m_PathAndTypeList)
diff --git a/core/fpdfapi/page/cpdf_clippath.h b/core/fpdfapi/page/cpdf_clippath.h index 6db7b3a..0e807c1 100644 --- a/core/fpdfapi/page/cpdf_clippath.h +++ b/core/fpdfapi/page/cpdf_clippath.h
@@ -41,6 +41,7 @@ CFX_FloatRect GetClipBox() const; void AppendPath(CPDF_Path path, uint8_t type, bool bAutoMerge); void AppendTexts(std::vector<std::unique_ptr<CPDF_TextObject>>* pTexts); + void CopyClipPath(const CPDF_ClipPath& that); void Transform(const CFX_Matrix& matrix); private:
diff --git a/core/fpdfapi/render/cpdf_renderstatus.cpp b/core/fpdfapi/render/cpdf_renderstatus.cpp index 615b583..484eff1 100644 --- a/core/fpdfapi/render/cpdf_renderstatus.cpp +++ b/core/fpdfapi/render/cpdf_renderstatus.cpp
@@ -1958,6 +1958,7 @@ CPDF_PathObject path; path.set_filltype(FXFILL_WINDING); + path.m_ClipPath.CopyClipPath(m_LastClipPath); path.m_ClipPath.AppendTexts(&pCopy); path.m_ColorState = textobj->m_ColorState; path.m_GeneralState = textobj->m_GeneralState;
diff --git a/testing/SUPPRESSIONS b/testing/SUPPRESSIONS index 8ee6d6c..beca1be 100644 --- a/testing/SUPPRESSIONS +++ b/testing/SUPPRESSIONS
@@ -328,9 +328,6 @@ # TODO(pdfium:304): Remove after associated bug is fixed bug_304.pdf * * * -# TODO(pdfium:632): Remove after associated bug is fixed -bug_632.in * * * - # TODO(pdfium:1331): Remove after associated bug is fixed bug_1331.in * * *