summaryrefslogtreecommitdiff
path: root/core/fpdfapi/render/cpdf_progressiverenderer.cpp
diff options
context:
space:
mode:
authorrbpotter <rbpotter@chromium.org>2017-08-16 16:45:44 -0700
committerChromium commit bot <commit-bot@chromium.org>2017-08-17 00:06:48 +0000
commit8d7672e941fa58326c4c6aeac47418e9b36527e9 (patch)
treefd24ca408405e8e47fe508dd9e673bdfaca74d3c /core/fpdfapi/render/cpdf_progressiverenderer.cpp
parent574015e0ad53c592fe8a923390b31edeb30c41fe (diff)
downloadpdfium-8d7672e941fa58326c4c6aeac47418e9b36527e9.tar.xz
Fix some issues with individual image mask rendering
Re-enable individual image mask rendering to improve spool sizes, with bug fixes and improvements: - Fix bug with missing images by ensuring all masks are recorded - Fix printing to landscape paper sizes - Improve spool sizes by processing the location of the masks in the progressive renderer when rendering to the printer instead of needlessly fully rendering them (they will be rendered as bitmaps anyway). Bug: chromium:753700 Change-Id: I86bdcce9f10855274c56ba2ddae2c2522b36426d Reviewed-on: https://pdfium-review.googlesource.com/11115 Commit-Queue: Rebekah Potter <rbpotter@chromium.org> Reviewed-by: Lei Zhang <thestig@chromium.org>
Diffstat (limited to 'core/fpdfapi/render/cpdf_progressiverenderer.cpp')
-rw-r--r--core/fpdfapi/render/cpdf_progressiverenderer.cpp21
1 files changed, 16 insertions, 5 deletions
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())