Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(970)

Side by Side Diff: core/src/fpdfapi/fpdf_render/fpdf_render.cpp

Issue 1233453014: Refactor progressive renderer class. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Untabify. Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 "../../../include/fpdfapi/fpdf_module.h" 7 #include "../../../include/fpdfapi/fpdf_module.h"
8 #include "../../../include/fpdfapi/fpdf_render.h" 8 #include "../../../include/fpdfapi/fpdf_render.h"
9 #include "../../../include/fxge/fx_ge.h" 9 #include "../../../include/fxge/fx_ge.h"
10 #include "../fpdf_page/pageint.h" 10 #include "../fpdf_page/pageint.h"
(...skipping 1001 matching lines...) Expand 10 before | Expand all | Expand 10 after
1012 } 1012 }
1013 pDevice->RestoreState(); 1013 pDevice->RestoreState();
1014 } 1014 }
1015 } 1015 }
1016 void CPDF_RenderContext::DrawObjectList(CFX_RenderDevice* pDevice, CPDF_PageObje cts* pObjs, 1016 void CPDF_RenderContext::DrawObjectList(CFX_RenderDevice* pDevice, CPDF_PageObje cts* pObjs,
1017 const CFX_AffineMatrix* pObject2Device, const CPDF_RenderOptions* pOptions) 1017 const CFX_AffineMatrix* pObject2Device, const CPDF_RenderOptions* pOptions)
1018 { 1018 {
1019 AppendObjectList(pObjs, pObject2Device); 1019 AppendObjectList(pObjs, pObject2Device);
1020 Render(pDevice, pOptions); 1020 Render(pDevice, pOptions);
1021 } 1021 }
1022 CPDF_ProgressiveRenderer::CPDF_ProgressiveRenderer() 1022
1023 CPDF_ProgressiveRenderer::CPDF_ProgressiveRenderer(
1024 CPDF_RenderContext* pContext,
1025 CFX_RenderDevice* pDevice,
1026 const CPDF_RenderOptions* pOptions) :
1027 m_Status(Ready),
1028 m_pContext(pContext),
1029 m_pDevice(pDevice),
1030 m_pOptions(pOptions),
1031 m_LayerIndex(0),
1032 m_ObjectIndex(0),
1033 m_ObjectPos(nullptr),
1034 m_PrevLastPos(nullptr)
1023 { 1035 {
1024 m_pRenderer = NULL;
1025 m_pContext = NULL;
1026 m_pDevice = NULL;
1027 m_Status = Ready;
1028 } 1036 }
1037
1029 CPDF_ProgressiveRenderer::~CPDF_ProgressiveRenderer() 1038 CPDF_ProgressiveRenderer::~CPDF_ProgressiveRenderer()
1030 { 1039 {
1031 Clear(); 1040 if (m_pRenderStatus)
1041 m_pDevice->RestoreState();
1032 } 1042 }
1033 void CPDF_ProgressiveRenderer::Clear() 1043
1044 void CPDF_ProgressiveRenderer::Start(IFX_Pause* pPause)
1034 { 1045 {
1035 if (m_pRenderer) { 1046 if (!m_pContext || !m_pDevice || m_Status != Ready) {
1036 delete m_pRenderer;
1037 m_pDevice->RestoreState();
1038 m_pRenderer = NULL;
1039 }
1040 m_Status = Ready;
1041 }
1042 void CPDF_ProgressiveRenderer::Start(CPDF_RenderContext* pContext, CFX_RenderDev ice* pDevice,
1043 const CPDF_RenderOptions* pOptions, IFX_Pau se* pPause, FX_BOOL bDropObjects)
1044 {
1045 if (m_Status != Ready) {
1046 m_Status = Failed;
1047 return;
1048 }
1049 m_pContext = pContext;
1050 m_pDevice = pDevice;
1051 m_pOptions = pOptions;
1052 m_bDropObjects = bDropObjects;
1053 if (pContext == NULL || pDevice == NULL) {
1054 m_Status = Failed; 1047 m_Status = Failed;
1055 return; 1048 return;
1056 } 1049 }
1057 m_Status = ToBeContinued; 1050 m_Status = ToBeContinued;
1058 m_ObjectPos = NULL;
1059 m_LayerIndex = 0;
1060 m_ObjectIndex = 0;
1061 m_PrevLastPos = NULL;
1062 Continue(pPause); 1051 Continue(pPause);
1063 } 1052 }
1053
1064 #define RENDER_STEP_LIMIT 100 1054 #define RENDER_STEP_LIMIT 100
1065 void CPDF_ProgressiveRenderer::Continue(IFX_Pause* pPause) 1055 void CPDF_ProgressiveRenderer::Continue(IFX_Pause* pPause)
1066 { 1056 {
1067 if (m_Status != ToBeContinued) { 1057 if (m_Status != ToBeContinued) {
1068 return; 1058 return;
1069 } 1059 }
1070 FX_DWORD nLayers = m_pContext->m_ContentList.GetSize(); 1060 FX_DWORD nLayers = m_pContext->m_ContentList.GetSize();
1071 for (; m_LayerIndex < nLayers; m_LayerIndex ++) { 1061 for (; m_LayerIndex < nLayers; m_LayerIndex ++) {
1072 _PDF_RenderItem* pItem = m_pContext->m_ContentList.GetDataPtr(m_LayerInd ex); 1062 _PDF_RenderItem* pItem = m_pContext->m_ContentList.GetDataPtr(m_LayerInd ex);
1073 FX_POSITION LastPos = pItem->m_pObjectList->GetLastObjectPosition(); 1063 FX_POSITION LastPos = pItem->m_pObjectList->GetLastObjectPosition();
1074 if (m_ObjectPos == NULL) { 1064 if (m_ObjectPos == NULL) {
1075 if (LastPos == m_PrevLastPos) { 1065 if (LastPos == m_PrevLastPos) {
1076 if (!pItem->m_pObjectList->IsParsed()) { 1066 if (!pItem->m_pObjectList->IsParsed()) {
1077 pItem->m_pObjectList->ContinueParse(pPause); 1067 pItem->m_pObjectList->ContinueParse(pPause);
1078 if (!pItem->m_pObjectList->IsParsed()) { 1068 if (!pItem->m_pObjectList->IsParsed()) {
1079 return; 1069 return;
1080 } 1070 }
1081 LastPos = pItem->m_pObjectList->GetLastObjectPosition(); 1071 LastPos = pItem->m_pObjectList->GetLastObjectPosition();
1082 } 1072 }
1083 } 1073 }
1084 if (LastPos == m_PrevLastPos) { 1074 if (LastPos == m_PrevLastPos) {
1085 if (m_pRenderer) { 1075 if (m_pRenderStatus) {
1086 delete m_pRenderer; 1076 m_pRenderStatus.reset(nullptr);
Lei Zhang 2015/07/17 01:06:35 just reset() ? ditto on line 1133
Tom Sepez 2015/07/17 16:58:22 Done.
1087 m_pRenderer = NULL;
1088 m_pDevice->RestoreState(); 1077 m_pDevice->RestoreState();
1089 m_ObjectPos = NULL; 1078 m_ObjectPos = NULL;
1090 m_PrevLastPos = NULL; 1079 m_PrevLastPos = NULL;
1091 } 1080 }
1092 continue; 1081 continue;
1093 } 1082 }
1094 if (m_PrevLastPos) { 1083 if (m_PrevLastPos) {
1095 m_ObjectPos = m_PrevLastPos; 1084 m_ObjectPos = m_PrevLastPos;
1096 pItem->m_pObjectList->GetNextObject(m_ObjectPos); 1085 pItem->m_pObjectList->GetNextObject(m_ObjectPos);
1097 } else { 1086 } else {
1098 m_ObjectPos = pItem->m_pObjectList->GetFirstObjectPosition(); 1087 m_ObjectPos = pItem->m_pObjectList->GetFirstObjectPosition();
1099 } 1088 }
1100 m_PrevLastPos = LastPos; 1089 m_PrevLastPos = LastPos;
1101 } 1090 }
1102 if (m_pRenderer == NULL) { 1091 if (!m_pRenderStatus) {
1103 m_ObjectPos = pItem->m_pObjectList->GetFirstObjectPosition(); 1092 m_ObjectPos = pItem->m_pObjectList->GetFirstObjectPosition();
1104 m_ObjectIndex = 0; 1093 m_ObjectIndex = 0;
1105 m_pRenderer = new CPDF_RenderStatus(); 1094 m_pRenderStatus.reset(new CPDF_RenderStatus());
1106 m_pRenderer->Initialize(m_pContext, m_pDevice, NULL, NULL, NULL, NUL L, 1095 m_pRenderStatus->Initialize(
1107 m_pOptions, pItem->m_pObjectList->m_Transpar ency, m_bDropObjects, NULL); 1096 m_pContext, m_pDevice, NULL, NULL, NULL, NULL, m_pOptions,
1097 pItem->m_pObjectList->m_Transparency, FALSE, NULL);
1108 m_pDevice->SaveState(); 1098 m_pDevice->SaveState();
1109 m_ClipRect = m_pDevice->GetClipBox(); 1099 m_ClipRect = m_pDevice->GetClipBox();
1110 CFX_AffineMatrix device2object; 1100 CFX_AffineMatrix device2object;
1111 device2object.SetReverse(pItem->m_Matrix); 1101 device2object.SetReverse(pItem->m_Matrix);
1112 device2object.TransformRect(m_ClipRect); 1102 device2object.TransformRect(m_ClipRect);
1113 } 1103 }
1114 int objs_to_go = CPDF_ModuleMgr::Get()->GetRenderModule()->GetConfig()-> m_RenderStepLimit; 1104 int objs_to_go = CPDF_ModuleMgr::Get()->GetRenderModule()->GetConfig()-> m_RenderStepLimit;
1115 while (m_ObjectPos) { 1105 while (m_ObjectPos) {
1116 CPDF_PageObject* pCurObj = pItem->m_pObjectList->GetObjectAt(m_Objec tPos); 1106 CPDF_PageObject* pCurObj = pItem->m_pObjectList->GetObjectAt(m_Objec tPos);
1117 if (pCurObj && pCurObj->m_Left <= m_ClipRect.right && pCurObj->m_Rig ht >= m_ClipRect.left && 1107 if (pCurObj && pCurObj->m_Left <= m_ClipRect.right && pCurObj->m_Rig ht >= m_ClipRect.left &&
1118 pCurObj->m_Bottom <= m_ClipRect.top && pCurObj->m_Top >= m_C lipRect.bottom) { 1108 pCurObj->m_Bottom <= m_ClipRect.top && pCurObj->m_Top >= m_C lipRect.bottom) {
1119 if (m_pRenderer->ContinueSingleObject(pCurObj, &pItem->m_Matrix, pPause)) { 1109 if (m_pRenderStatus->ContinueSingleObject(pCurObj, &pItem->m_Mat rix, pPause)) {
1120 return; 1110 return;
1121 } 1111 }
1122 if (pCurObj->m_Type == PDFPAGE_IMAGE && m_pRenderer->m_Options.m _Flags & RENDER_LIMITEDIMAGECACHE) { 1112 if (pCurObj->m_Type == PDFPAGE_IMAGE && m_pRenderStatus->m_Optio ns.m_Flags & RENDER_LIMITEDIMAGECACHE) {
1123 m_pContext->GetPageCache()->CacheOptimization(m_pRenderer->m _Options.m_dwLimitCacheSize); 1113 m_pContext->GetPageCache()->CacheOptimization(m_pRenderStatu s->m_Options.m_dwLimitCacheSize);
1124 } 1114 }
1125 if (pCurObj->m_Type == PDFPAGE_FORM || pCurObj->m_Type == PDFPAG E_SHADING) { 1115 if (pCurObj->m_Type == PDFPAGE_FORM || pCurObj->m_Type == PDFPAG E_SHADING) {
1126 objs_to_go = 0; 1116 objs_to_go = 0;
1127 } else { 1117 } else {
1128 objs_to_go --; 1118 objs_to_go --;
1129 } 1119 }
1130 } 1120 }
1131 m_ObjectIndex ++; 1121 m_ObjectIndex ++;
1132 pItem->m_pObjectList->GetNextObject(m_ObjectPos); 1122 pItem->m_pObjectList->GetNextObject(m_ObjectPos);
1133 if (objs_to_go == 0) { 1123 if (objs_to_go == 0) {
1134 if (pPause && pPause->NeedToPauseNow()) { 1124 if (pPause && pPause->NeedToPauseNow()) {
1135 return; 1125 return;
1136 } 1126 }
1137 objs_to_go = CPDF_ModuleMgr::Get()->GetRenderModule()->GetConfig ()->m_RenderStepLimit; 1127 objs_to_go = CPDF_ModuleMgr::Get()->GetRenderModule()->GetConfig ()->m_RenderStepLimit;
1138 } 1128 }
1139 } 1129 }
1140 if (!pItem->m_pObjectList->IsParsed()) { 1130 if (!pItem->m_pObjectList->IsParsed()) {
1141 return; 1131 return;
1142 } 1132 }
1143 delete m_pRenderer; 1133 m_pRenderStatus.reset(nullptr);
1144 m_pRenderer = NULL;
1145 m_pDevice->RestoreState(); 1134 m_pDevice->RestoreState();
1146 m_ObjectPos = NULL; 1135 m_ObjectPos = NULL;
1147 m_PrevLastPos = NULL; 1136 m_PrevLastPos = NULL;
1148 if (pPause && pPause->NeedToPauseNow()) { 1137 if (pPause && pPause->NeedToPauseNow()) {
1149 m_LayerIndex++; 1138 m_LayerIndex++;
1150 return; 1139 return;
1151 } 1140 }
1152 } 1141 }
1153 m_Status = Done; 1142 m_Status = Done;
1154 } 1143 }
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after
1401 CPDF_ContentMarkItem& item = pData->GetItem(i); 1390 CPDF_ContentMarkItem& item = pData->GetItem(i);
1402 if (item.GetName() == FX_BSTRC("OC") && item.GetParamType() == CPDF_Cont entMarkItem::PropertiesDict) { 1391 if (item.GetName() == FX_BSTRC("OC") && item.GetParamType() == CPDF_Cont entMarkItem::PropertiesDict) {
1403 CPDF_Dictionary* pOCG = (CPDF_Dictionary*)item.GetParam(); 1392 CPDF_Dictionary* pOCG = (CPDF_Dictionary*)item.GetParam();
1404 if (!CheckOCGVisible(pOCG)) { 1393 if (!CheckOCGVisible(pOCG)) {
1405 return FALSE; 1394 return FALSE;
1406 } 1395 }
1407 } 1396 }
1408 } 1397 }
1409 return TRUE; 1398 return TRUE;
1410 } 1399 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698