OLD | NEW |
1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 | 6 |
7 #include "core/src/fpdfapi/fpdf_render/render_int.h" | 7 #include "core/src/fpdfapi/fpdf_render/render_int.h" |
8 | 8 |
9 #include "core/include/fpdfapi/fpdf_module.h" | 9 #include "core/include/fpdfapi/fpdf_module.h" |
10 #include "core/include/fpdfapi/fpdf_render.h" | 10 #include "core/include/fpdfapi/fpdf_render.h" |
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
237 m_Transparency = transparency; | 237 m_Transparency = transparency; |
238 return TRUE; | 238 return TRUE; |
239 } | 239 } |
240 void CPDF_RenderStatus::RenderObjectList( | 240 void CPDF_RenderStatus::RenderObjectList( |
241 const CPDF_PageObjectHolder* pObjectHolder, | 241 const CPDF_PageObjectHolder* pObjectHolder, |
242 const CFX_Matrix* pObj2Device) { | 242 const CFX_Matrix* pObj2Device) { |
243 CFX_FloatRect clip_rect = m_pDevice->GetClipBox(); | 243 CFX_FloatRect clip_rect = m_pDevice->GetClipBox(); |
244 CFX_Matrix device2object; | 244 CFX_Matrix device2object; |
245 device2object.SetReverse(*pObj2Device); | 245 device2object.SetReverse(*pObj2Device); |
246 device2object.TransformRect(clip_rect); | 246 device2object.TransformRect(clip_rect); |
247 int index = 0; | 247 |
248 FX_POSITION pos = pObjectHolder->GetPageObjectList()->GetHeadPosition(); | 248 for (const auto& pCurObj : *pObjectHolder->GetPageObjectList()) { |
249 while (pos) { | 249 if (pCurObj.get() == m_pStopObj) { |
250 index++; | |
251 CPDF_PageObject* pCurObj = | |
252 pObjectHolder->GetPageObjectList()->GetNextObject(pos); | |
253 if (pCurObj == m_pStopObj) { | |
254 m_bStopped = TRUE; | 250 m_bStopped = TRUE; |
255 return; | 251 return; |
256 } | 252 } |
257 if (!pCurObj) { | 253 if (!pCurObj) |
258 continue; | 254 continue; |
259 } | 255 |
260 if (!pCurObj || pCurObj->m_Left > clip_rect.right || | 256 if (pCurObj->m_Left > clip_rect.right || |
261 pCurObj->m_Right < clip_rect.left || | 257 pCurObj->m_Right < clip_rect.left || |
262 pCurObj->m_Bottom > clip_rect.top || | 258 pCurObj->m_Bottom > clip_rect.top || |
263 pCurObj->m_Top < clip_rect.bottom) { | 259 pCurObj->m_Top < clip_rect.bottom) { |
264 continue; | 260 continue; |
265 } | 261 } |
266 RenderSingleObject(pCurObj, pObj2Device); | 262 RenderSingleObject(pCurObj.get(), pObj2Device); |
267 if (m_bStopped) { | 263 if (m_bStopped) |
268 return; | 264 return; |
269 } | |
270 } | 265 } |
271 } | 266 } |
272 void CPDF_RenderStatus::RenderSingleObject(const CPDF_PageObject* pObj, | 267 void CPDF_RenderStatus::RenderSingleObject(const CPDF_PageObject* pObj, |
273 const CFX_Matrix* pObj2Device) { | 268 const CFX_Matrix* pObj2Device) { |
274 CFX_AutoRestorer<int> restorer(&s_CurrentRecursionDepth); | 269 CFX_AutoRestorer<int> restorer(&s_CurrentRecursionDepth); |
275 if (++s_CurrentRecursionDepth > kRenderMaxRecursionDepth) { | 270 if (++s_CurrentRecursionDepth > kRenderMaxRecursionDepth) { |
276 return; | 271 return; |
277 } | 272 } |
278 m_pCurObj = pObj; | 273 m_pCurObj = pObj; |
279 if (m_Options.m_pOCContext && pObj->m_ContentMark.NotNull()) { | 274 if (m_Options.m_pOCContext && pObj->m_ContentMark.NotNull()) { |
(...skipping 750 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1030 | 1025 |
1031 CPDF_ProgressiveRenderer::CPDF_ProgressiveRenderer( | 1026 CPDF_ProgressiveRenderer::CPDF_ProgressiveRenderer( |
1032 CPDF_RenderContext* pContext, | 1027 CPDF_RenderContext* pContext, |
1033 CFX_RenderDevice* pDevice, | 1028 CFX_RenderDevice* pDevice, |
1034 const CPDF_RenderOptions* pOptions) | 1029 const CPDF_RenderOptions* pOptions) |
1035 : m_Status(Ready), | 1030 : m_Status(Ready), |
1036 m_pContext(pContext), | 1031 m_pContext(pContext), |
1037 m_pDevice(pDevice), | 1032 m_pDevice(pDevice), |
1038 m_pOptions(pOptions), | 1033 m_pOptions(pOptions), |
1039 m_LayerIndex(0), | 1034 m_LayerIndex(0), |
1040 m_pCurrentLayer(nullptr), | 1035 m_pCurrentLayer(nullptr) {} |
1041 m_LastObjectRendered(nullptr) {} | |
1042 | 1036 |
1043 CPDF_ProgressiveRenderer::~CPDF_ProgressiveRenderer() { | 1037 CPDF_ProgressiveRenderer::~CPDF_ProgressiveRenderer() { |
1044 if (m_pRenderStatus) | 1038 if (m_pRenderStatus) |
1045 m_pDevice->RestoreState(); | 1039 m_pDevice->RestoreState(); |
1046 } | 1040 } |
1047 | 1041 |
1048 void CPDF_ProgressiveRenderer::Start(IFX_Pause* pPause) { | 1042 void CPDF_ProgressiveRenderer::Start(IFX_Pause* pPause) { |
1049 if (!m_pContext || !m_pDevice || m_Status != Ready) { | 1043 if (!m_pContext || !m_pDevice || m_Status != Ready) { |
1050 m_Status = Failed; | 1044 m_Status = Failed; |
1051 return; | 1045 return; |
1052 } | 1046 } |
1053 m_Status = ToBeContinued; | 1047 m_Status = ToBeContinued; |
1054 Continue(pPause); | 1048 Continue(pPause); |
1055 } | 1049 } |
1056 | 1050 |
1057 void CPDF_ProgressiveRenderer::Continue(IFX_Pause* pPause) { | 1051 void CPDF_ProgressiveRenderer::Continue(IFX_Pause* pPause) { |
1058 while (m_Status == ToBeContinued) { | 1052 while (m_Status == ToBeContinued) { |
1059 if (!m_pCurrentLayer) { | 1053 if (!m_pCurrentLayer) { |
1060 if (m_LayerIndex >= m_pContext->CountLayers()) { | 1054 if (m_LayerIndex >= m_pContext->CountLayers()) { |
1061 m_Status = Done; | 1055 m_Status = Done; |
1062 return; | 1056 return; |
1063 } | 1057 } |
1064 m_pCurrentLayer = m_pContext->GetLayer(m_LayerIndex); | 1058 m_pCurrentLayer = m_pContext->GetLayer(m_LayerIndex); |
1065 m_LastObjectRendered = nullptr; | 1059 m_LastObjectRendered = |
| 1060 m_pCurrentLayer->m_pObjectHolder->GetPageObjectList()->end(); |
1066 m_pRenderStatus.reset(new CPDF_RenderStatus()); | 1061 m_pRenderStatus.reset(new CPDF_RenderStatus()); |
1067 m_pRenderStatus->Initialize( | 1062 m_pRenderStatus->Initialize( |
1068 m_pContext, m_pDevice, NULL, NULL, NULL, NULL, m_pOptions, | 1063 m_pContext, m_pDevice, NULL, NULL, NULL, NULL, m_pOptions, |
1069 m_pCurrentLayer->m_pObjectHolder->m_Transparency, FALSE, NULL); | 1064 m_pCurrentLayer->m_pObjectHolder->m_Transparency, FALSE, NULL); |
1070 m_pDevice->SaveState(); | 1065 m_pDevice->SaveState(); |
1071 m_ClipRect = m_pDevice->GetClipBox(); | 1066 m_ClipRect = m_pDevice->GetClipBox(); |
1072 CFX_Matrix device2object; | 1067 CFX_Matrix device2object; |
1073 device2object.SetReverse(m_pCurrentLayer->m_Matrix); | 1068 device2object.SetReverse(m_pCurrentLayer->m_Matrix); |
1074 device2object.TransformRect(m_ClipRect); | 1069 device2object.TransformRect(m_ClipRect); |
1075 } | 1070 } |
1076 FX_POSITION pos; | 1071 CPDF_PageObjectList::iterator iter; |
1077 if (m_LastObjectRendered) { | 1072 CPDF_PageObjectList::iterator iterEnd = |
1078 pos = m_LastObjectRendered; | 1073 m_pCurrentLayer->m_pObjectHolder->GetPageObjectList()->end(); |
1079 m_pCurrentLayer->m_pObjectHolder->GetPageObjectList()->GetNextObject(pos); | 1074 if (m_LastObjectRendered != iterEnd) { |
| 1075 iter = m_LastObjectRendered; |
| 1076 ++iter; |
1080 } else { | 1077 } else { |
1081 pos = m_pCurrentLayer->m_pObjectHolder->GetPageObjectList() | 1078 iter = m_pCurrentLayer->m_pObjectHolder->GetPageObjectList()->begin(); |
1082 ->GetHeadPosition(); | |
1083 } | 1079 } |
1084 int nObjsToGo = kStepLimit; | 1080 int nObjsToGo = kStepLimit; |
1085 while (pos) { | 1081 while (iter != iterEnd) { |
1086 CPDF_PageObject* pCurObj = | 1082 CPDF_PageObject* pCurObj = iter->get(); |
1087 m_pCurrentLayer->m_pObjectHolder->GetPageObjectList()->GetObjectAt( | |
1088 pos); | |
1089 if (pCurObj && pCurObj->m_Left <= m_ClipRect.right && | 1083 if (pCurObj && pCurObj->m_Left <= m_ClipRect.right && |
1090 pCurObj->m_Right >= m_ClipRect.left && | 1084 pCurObj->m_Right >= m_ClipRect.left && |
1091 pCurObj->m_Bottom <= m_ClipRect.top && | 1085 pCurObj->m_Bottom <= m_ClipRect.top && |
1092 pCurObj->m_Top >= m_ClipRect.bottom) { | 1086 pCurObj->m_Top >= m_ClipRect.bottom) { |
1093 if (m_pRenderStatus->ContinueSingleObject( | 1087 if (m_pRenderStatus->ContinueSingleObject( |
1094 pCurObj, &m_pCurrentLayer->m_Matrix, pPause)) { | 1088 pCurObj, &m_pCurrentLayer->m_Matrix, pPause)) { |
1095 return; | 1089 return; |
1096 } | 1090 } |
1097 if (pCurObj->m_Type == CPDF_PageObject::IMAGE && | 1091 if (pCurObj->m_Type == CPDF_PageObject::IMAGE && |
1098 m_pRenderStatus->m_Options.m_Flags & RENDER_LIMITEDIMAGECACHE) { | 1092 m_pRenderStatus->m_Options.m_Flags & RENDER_LIMITEDIMAGECACHE) { |
1099 m_pContext->GetPageCache()->CacheOptimization( | 1093 m_pContext->GetPageCache()->CacheOptimization( |
1100 m_pRenderStatus->m_Options.m_dwLimitCacheSize); | 1094 m_pRenderStatus->m_Options.m_dwLimitCacheSize); |
1101 } | 1095 } |
1102 if (pCurObj->m_Type == CPDF_PageObject::FORM || | 1096 if (pCurObj->m_Type == CPDF_PageObject::FORM || |
1103 pCurObj->m_Type == CPDF_PageObject::SHADING) { | 1097 pCurObj->m_Type == CPDF_PageObject::SHADING) { |
1104 nObjsToGo = 0; | 1098 nObjsToGo = 0; |
1105 } else { | 1099 } else { |
1106 --nObjsToGo; | 1100 --nObjsToGo; |
1107 } | 1101 } |
1108 } | 1102 } |
1109 m_LastObjectRendered = pos; | 1103 m_LastObjectRendered = iter; |
1110 if (nObjsToGo == 0) { | 1104 if (nObjsToGo == 0) { |
1111 if (pPause && pPause->NeedToPauseNow()) | 1105 if (pPause && pPause->NeedToPauseNow()) |
1112 return; | 1106 return; |
1113 nObjsToGo = kStepLimit; | 1107 nObjsToGo = kStepLimit; |
1114 } | 1108 } |
1115 m_pCurrentLayer->m_pObjectHolder->GetPageObjectList()->GetNextObject(pos); | 1109 ++iter; |
1116 } | 1110 } |
1117 if (m_pCurrentLayer->m_pObjectHolder->IsParsed()) { | 1111 if (m_pCurrentLayer->m_pObjectHolder->IsParsed()) { |
1118 m_pRenderStatus.reset(); | 1112 m_pRenderStatus.reset(); |
1119 m_pDevice->RestoreState(); | 1113 m_pDevice->RestoreState(); |
1120 m_pCurrentLayer = nullptr; | 1114 m_pCurrentLayer = nullptr; |
1121 m_LastObjectRendered = nullptr; | |
1122 m_LayerIndex++; | 1115 m_LayerIndex++; |
1123 if (pPause && pPause->NeedToPauseNow()) { | 1116 if (pPause && pPause->NeedToPauseNow()) { |
1124 return; | 1117 return; |
1125 } | 1118 } |
1126 } else { | 1119 } else { |
1127 m_pCurrentLayer->m_pObjectHolder->ContinueParse(pPause); | 1120 m_pCurrentLayer->m_pObjectHolder->ContinueParse(pPause); |
1128 if (!m_pCurrentLayer->m_pObjectHolder->IsParsed()) | 1121 if (!m_pCurrentLayer->m_pObjectHolder->IsParsed()) |
1129 return; | 1122 return; |
1130 } | 1123 } |
1131 } | 1124 } |
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1341 for (int i = 0; i < nItems; i++) { | 1334 for (int i = 0; i < nItems; i++) { |
1342 CPDF_ContentMarkItem& item = pData->GetItem(i); | 1335 CPDF_ContentMarkItem& item = pData->GetItem(i); |
1343 if (item.GetName() == "OC" && | 1336 if (item.GetName() == "OC" && |
1344 item.GetParamType() == CPDF_ContentMarkItem::PropertiesDict && | 1337 item.GetParamType() == CPDF_ContentMarkItem::PropertiesDict && |
1345 !CheckOCGVisible(item.GetParam())) { | 1338 !CheckOCGVisible(item.GetParam())) { |
1346 return FALSE; | 1339 return FALSE; |
1347 } | 1340 } |
1348 } | 1341 } |
1349 return TRUE; | 1342 return TRUE; |
1350 } | 1343 } |
OLD | NEW |