summaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/fpdfapi/page/cpdf_streamcontentparser.cpp6
-rw-r--r--core/fpdfapi/render/cpdf_progressiverenderer.cpp21
-rw-r--r--core/fpdfapi/render/cpdf_renderstatus.cpp2
-rw-r--r--core/fpdfapi/render/cpdf_renderstatus.h3
4 files changed, 24 insertions, 8 deletions
diff --git a/core/fpdfapi/page/cpdf_streamcontentparser.cpp b/core/fpdfapi/page/cpdf_streamcontentparser.cpp
index 692de0f5eb..1e6bf6c3c8 100644
--- a/core/fpdfapi/page/cpdf_streamcontentparser.cpp
+++ b/core/fpdfapi/page/cpdf_streamcontentparser.cpp
@@ -658,7 +658,11 @@ void CPDF_StreamContentParser::Handle_BeginImage() {
break;
}
}
- AddImage(std::move(pStream));
+ CPDF_ImageObject* pObj = AddImage(std::move(pStream));
+ // Record the bounding box of this image, so rendering code can draw it
+ // properly.
+ if (pObj->GetImage()->IsMask())
+ m_pObjectHolder->AddImageMaskBoundingBox(pObj->GetRect());
}
void CPDF_StreamContentParser::Handle_BeginMarkedContent() {
diff --git a/core/fpdfapi/render/cpdf_progressiverenderer.cpp b/core/fpdfapi/render/cpdf_progressiverenderer.cpp
index 4ddc528342..c61902cda7 100644
--- a/core/fpdfapi/render/cpdf_progressiverenderer.cpp
+++ b/core/fpdfapi/render/cpdf_progressiverenderer.cpp
@@ -72,12 +72,23 @@ void CPDF_ProgressiveRenderer::Continue(IFX_Pause* pPause) {
iter = m_pCurrentLayer->m_pObjectHolder->GetPageObjectList()->begin();
}
int nObjsToGo = kStepLimit;
+ bool is_mask = false;
while (iter != iterEnd) {
CPDF_PageObject* pCurObj = iter->get();
if (pCurObj && pCurObj->m_Left <= m_ClipRect.right &&
pCurObj->m_Right >= m_ClipRect.left &&
pCurObj->m_Bottom <= m_ClipRect.top &&
pCurObj->m_Top >= m_ClipRect.bottom) {
+ if (m_pOptions->m_Flags & RENDER_BREAKFORMASKS && pCurObj->IsImage() &&
+ pCurObj->AsImage()->GetImage()->IsMask()) {
+ if (m_pDevice->GetDeviceCaps(FXDC_DEVICE_CLASS) == FXDC_PRINTER) {
+ m_LastObjectRendered = iter;
+ m_pRenderStatus->ProcessClipPath(pCurObj->m_ClipPath,
+ &m_pCurrentLayer->m_Matrix);
+ return;
+ }
+ is_mask = true;
+ }
if (m_pRenderStatus->ContinueSingleObject(
pCurObj, &m_pCurrentLayer->m_Matrix, pPause)) {
return;
@@ -98,20 +109,20 @@ void CPDF_ProgressiveRenderer::Continue(IFX_Pause* pPause) {
return;
nObjsToGo = kStepLimit;
}
- if (pCurObj->IsImage() && pCurObj->AsImage()->GetImage()->IsMask() &&
- (m_pOptions->m_Flags & RENDER_BREAKFORMASKS)) {
- return;
- }
++iter;
+ if (is_mask && iter != iterEnd)
+ return;
}
if (m_pCurrentLayer->m_pObjectHolder->IsParsed()) {
m_pRenderStatus.reset();
m_pDevice->RestoreState(false);
m_pCurrentLayer = nullptr;
m_LayerIndex++;
- if (pPause && pPause->NeedToPauseNow()) {
+ if (is_mask || (pPause && pPause->NeedToPauseNow())) {
return;
}
+ } else if (is_mask) {
+ return;
} else {
m_pCurrentLayer->m_pObjectHolder->ContinueParse(pPause);
if (!m_pCurrentLayer->m_pObjectHolder->IsParsed())
diff --git a/core/fpdfapi/render/cpdf_renderstatus.cpp b/core/fpdfapi/render/cpdf_renderstatus.cpp
index 6c5d7bc102..439ad4e5f0 100644
--- a/core/fpdfapi/render/cpdf_renderstatus.cpp
+++ b/core/fpdfapi/render/cpdf_renderstatus.cpp
@@ -1383,7 +1383,7 @@ FX_ARGB CPDF_RenderStatus::GetStrokeArgb(CPDF_PageObject* pObj) const {
return m_Options.TranslateColor(ArgbEncode(alpha, rgb));
}
-void CPDF_RenderStatus::ProcessClipPath(CPDF_ClipPath ClipPath,
+void CPDF_RenderStatus::ProcessClipPath(const CPDF_ClipPath& ClipPath,
const CFX_Matrix* pObj2Device) {
if (!ClipPath.HasRef()) {
if (m_LastClipPath.HasRef()) {
diff --git a/core/fpdfapi/render/cpdf_renderstatus.h b/core/fpdfapi/render/cpdf_renderstatus.h
index 47fbac8a7c..cfaa966ed1 100644
--- a/core/fpdfapi/render/cpdf_renderstatus.h
+++ b/core/fpdfapi/render/cpdf_renderstatus.h
@@ -62,6 +62,8 @@ class CPDF_RenderStatus {
bool ContinueSingleObject(CPDF_PageObject* pObj,
const CFX_Matrix* pObj2Device,
IFX_Pause* pPause);
+ void ProcessClipPath(const CPDF_ClipPath& ClipPath,
+ const CFX_Matrix* pObj2Device);
CPDF_RenderContext* GetContext() const { return m_pContext.Get(); }
#if defined _SKIA_SUPPORT_
@@ -77,7 +79,6 @@ class CPDF_RenderStatus {
friend class CPDF_ImageRenderer;
friend class CPDF_RenderContext;
- void ProcessClipPath(CPDF_ClipPath ClipPath, const CFX_Matrix* pObj2Device);
bool ProcessTransparency(CPDF_PageObject* PageObj,
const CFX_Matrix* pObj2Device);
void ProcessObjectNoClip(CPDF_PageObject* PageObj,