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

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

Issue 1699443002: Rework progressive render loop. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Remove CPDF_RenderConfig. Created 4 years, 10 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
« no previous file with comments | « core/include/fpdfapi/fpdf_render.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "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"
11 #include "core/include/fxge/fx_ge.h" 11 #include "core/include/fxge/fx_ge.h"
12 #include "core/src/fpdfapi/fpdf_page/pageint.h" 12 #include "core/src/fpdfapi/fpdf_page/pageint.h"
13 13
14 CPDF_DocRenderData::CPDF_DocRenderData(CPDF_Document* pPDFDoc) 14 CPDF_DocRenderData::CPDF_DocRenderData(CPDF_Document* pPDFDoc)
15 : m_pPDFDoc(pPDFDoc), m_pFontCache(new CFX_FontCache) {} 15 : m_pPDFDoc(pPDFDoc), m_pFontCache(new CFX_FontCache) {}
16 16
17 CPDF_DocRenderData::~CPDF_DocRenderData() { 17 CPDF_DocRenderData::~CPDF_DocRenderData() {
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
80 void ClearDocData(CPDF_DocRenderData* p) override; 80 void ClearDocData(CPDF_DocRenderData* p) override;
81 81
82 CPDF_DocRenderData* GetRenderData() override { return &m_RenderData; } 82 CPDF_DocRenderData* GetRenderData() override { return &m_RenderData; }
83 83
84 CPDF_PageRenderCache* CreatePageCache(CPDF_Page* pPage) override { 84 CPDF_PageRenderCache* CreatePageCache(CPDF_Page* pPage) override {
85 return new CPDF_PageRenderCache(pPage); 85 return new CPDF_PageRenderCache(pPage);
86 } 86 }
87 87
88 void DestroyPageCache(CPDF_PageRenderCache* pCache) override; 88 void DestroyPageCache(CPDF_PageRenderCache* pCache) override;
89 89
90 CPDF_RenderConfig* GetConfig() override { return &m_RenderConfig; }
91
92 CPDF_DocRenderData m_RenderData; 90 CPDF_DocRenderData m_RenderData;
93 CPDF_RenderConfig m_RenderConfig;
94 }; 91 };
95 92
96 CPDF_DocRenderData* CPDF_RenderModule::CreateDocData(CPDF_Document* pDoc) { 93 CPDF_DocRenderData* CPDF_RenderModule::CreateDocData(CPDF_Document* pDoc) {
97 return new CPDF_DocRenderData(pDoc); 94 return new CPDF_DocRenderData(pDoc);
98 } 95 }
99 void CPDF_RenderModule::DestroyDocData(CPDF_DocRenderData* pDocData) { 96 void CPDF_RenderModule::DestroyDocData(CPDF_DocRenderData* pDocData) {
100 delete pDocData; 97 delete pDocData;
101 } 98 }
102 void CPDF_RenderModule::ClearDocData(CPDF_DocRenderData* p) { 99 void CPDF_RenderModule::ClearDocData(CPDF_DocRenderData* p) {
103 if (p) { 100 if (p) {
(...skipping 927 matching lines...) Expand 10 before | Expand all | Expand 10 after
1031 1028
1032 CPDF_ProgressiveRenderer::CPDF_ProgressiveRenderer( 1029 CPDF_ProgressiveRenderer::CPDF_ProgressiveRenderer(
1033 CPDF_RenderContext* pContext, 1030 CPDF_RenderContext* pContext,
1034 CFX_RenderDevice* pDevice, 1031 CFX_RenderDevice* pDevice,
1035 const CPDF_RenderOptions* pOptions) 1032 const CPDF_RenderOptions* pOptions)
1036 : m_Status(Ready), 1033 : m_Status(Ready),
1037 m_pContext(pContext), 1034 m_pContext(pContext),
1038 m_pDevice(pDevice), 1035 m_pDevice(pDevice),
1039 m_pOptions(pOptions), 1036 m_pOptions(pOptions),
1040 m_LayerIndex(0), 1037 m_LayerIndex(0),
1041 m_ObjectIndex(0), 1038 m_pCurrentLayer(nullptr),
1042 m_ObjectPos(nullptr), 1039 m_LastObjectRendered(nullptr) {}
1043 m_PrevLastPos(nullptr) {
1044 }
1045 1040
1046 CPDF_ProgressiveRenderer::~CPDF_ProgressiveRenderer() { 1041 CPDF_ProgressiveRenderer::~CPDF_ProgressiveRenderer() {
1047 if (m_pRenderStatus) 1042 if (m_pRenderStatus)
1048 m_pDevice->RestoreState(); 1043 m_pDevice->RestoreState();
1049 } 1044 }
1050 1045
1051 void CPDF_ProgressiveRenderer::Start(IFX_Pause* pPause) { 1046 void CPDF_ProgressiveRenderer::Start(IFX_Pause* pPause) {
1052 if (!m_pContext || !m_pDevice || m_Status != Ready) { 1047 if (!m_pContext || !m_pDevice || m_Status != Ready) {
1053 m_Status = Failed; 1048 m_Status = Failed;
1054 return; 1049 return;
1055 } 1050 }
1056 m_Status = ToBeContinued; 1051 m_Status = ToBeContinued;
1057 Continue(pPause); 1052 Continue(pPause);
1058 } 1053 }
1059 1054
1060 void CPDF_ProgressiveRenderer::Continue(IFX_Pause* pPause) { 1055 void CPDF_ProgressiveRenderer::Continue(IFX_Pause* pPause) {
1061 if (m_Status != ToBeContinued) { 1056 while (m_Status == ToBeContinued) {
1062 return; 1057 if (!m_pCurrentLayer) {
1063 } 1058 if (m_LayerIndex >= m_pContext->CountLayers()) {
1064 FX_DWORD nLayers = m_pContext->CountLayers(); 1059 m_Status = Done;
1065 for (; m_LayerIndex < nLayers; m_LayerIndex++) { 1060 return;
1066 CPDF_RenderContext::Layer* pLayer = m_pContext->GetLayer(m_LayerIndex);
1067 FX_POSITION LastPos = pLayer->m_pObjectList->GetLastObjectPosition();
1068 if (!m_ObjectPos) {
1069 if (LastPos == m_PrevLastPos) {
1070 if (!pLayer->m_pObjectList->IsParsed()) {
1071 pLayer->m_pObjectList->ContinueParse(pPause);
1072 if (!pLayer->m_pObjectList->IsParsed()) {
1073 return;
1074 }
1075 LastPos = pLayer->m_pObjectList->GetLastObjectPosition();
1076 }
1077 } 1061 }
1078 if (LastPos == m_PrevLastPos) { 1062 m_pCurrentLayer = m_pContext->GetLayer(m_LayerIndex);
1079 if (m_pRenderStatus) { 1063 m_LastObjectRendered = nullptr;
1080 m_pRenderStatus.reset();
1081 m_pDevice->RestoreState();
1082 m_ObjectPos = NULL;
1083 m_PrevLastPos = NULL;
1084 }
1085 continue;
1086 }
1087 if (m_PrevLastPos) {
1088 m_ObjectPos = m_PrevLastPos;
1089 pLayer->m_pObjectList->GetNextObject(m_ObjectPos);
1090 } else {
1091 m_ObjectPos = pLayer->m_pObjectList->GetFirstObjectPosition();
1092 }
1093 m_PrevLastPos = LastPos;
1094 }
1095 if (!m_pRenderStatus) {
1096 m_ObjectPos = pLayer->m_pObjectList->GetFirstObjectPosition();
1097 m_ObjectIndex = 0;
1098 m_pRenderStatus.reset(new CPDF_RenderStatus()); 1064 m_pRenderStatus.reset(new CPDF_RenderStatus());
1099 m_pRenderStatus->Initialize( 1065 m_pRenderStatus->Initialize(
1100 m_pContext, m_pDevice, NULL, NULL, NULL, NULL, m_pOptions, 1066 m_pContext, m_pDevice, NULL, NULL, NULL, NULL, m_pOptions,
1101 pLayer->m_pObjectList->m_Transparency, FALSE, NULL); 1067 m_pCurrentLayer->m_pObjectList->m_Transparency, FALSE, NULL);
1102 m_pDevice->SaveState(); 1068 m_pDevice->SaveState();
1103 m_ClipRect = m_pDevice->GetClipBox(); 1069 m_ClipRect = m_pDevice->GetClipBox();
1104 CFX_Matrix device2object; 1070 CFX_Matrix device2object;
1105 device2object.SetReverse(pLayer->m_Matrix); 1071 device2object.SetReverse(m_pCurrentLayer->m_Matrix);
1106 device2object.TransformRect(m_ClipRect); 1072 device2object.TransformRect(m_ClipRect);
1107 } 1073 }
1108 int objs_to_go = CPDF_ModuleMgr::Get() 1074 FX_POSITION pos;
1109 ->GetRenderModule() 1075 if (m_LastObjectRendered) {
1110 ->GetConfig() 1076 pos = m_LastObjectRendered;
1111 ->m_RenderStepLimit; 1077 m_pCurrentLayer->m_pObjectList->GetNextObject(pos);
1112 while (m_ObjectPos) { 1078 } else {
1079 pos = m_pCurrentLayer->m_pObjectList->GetFirstObjectPosition();
1080 }
1081 int nObjsToGo = kStepLimit;
1082 while (pos) {
1113 CPDF_PageObject* pCurObj = 1083 CPDF_PageObject* pCurObj =
1114 pLayer->m_pObjectList->GetObjectAt(m_ObjectPos); 1084 m_pCurrentLayer->m_pObjectList->GetObjectAt(pos);
1115 if (pCurObj && pCurObj->m_Left <= m_ClipRect.right && 1085 if (pCurObj && pCurObj->m_Left <= m_ClipRect.right &&
1116 pCurObj->m_Right >= m_ClipRect.left && 1086 pCurObj->m_Right >= m_ClipRect.left &&
1117 pCurObj->m_Bottom <= m_ClipRect.top && 1087 pCurObj->m_Bottom <= m_ClipRect.top &&
1118 pCurObj->m_Top >= m_ClipRect.bottom) { 1088 pCurObj->m_Top >= m_ClipRect.bottom) {
1119 if (m_pRenderStatus->ContinueSingleObject(pCurObj, &pLayer->m_Matrix, 1089 if (m_pRenderStatus->ContinueSingleObject(
1120 pPause)) { 1090 pCurObj, &m_pCurrentLayer->m_Matrix, pPause)) {
1121 return; 1091 return;
1122 } 1092 }
1123 if (pCurObj->m_Type == CPDF_PageObject::IMAGE && 1093 if (pCurObj->m_Type == CPDF_PageObject::IMAGE &&
1124 m_pRenderStatus->m_Options.m_Flags & RENDER_LIMITEDIMAGECACHE) { 1094 m_pRenderStatus->m_Options.m_Flags & RENDER_LIMITEDIMAGECACHE) {
1125 m_pContext->GetPageCache()->CacheOptimization( 1095 m_pContext->GetPageCache()->CacheOptimization(
1126 m_pRenderStatus->m_Options.m_dwLimitCacheSize); 1096 m_pRenderStatus->m_Options.m_dwLimitCacheSize);
1127 } 1097 }
1128 if (pCurObj->m_Type == CPDF_PageObject::FORM || 1098 if (pCurObj->m_Type == CPDF_PageObject::FORM ||
1129 pCurObj->m_Type == CPDF_PageObject::SHADING) { 1099 pCurObj->m_Type == CPDF_PageObject::SHADING) {
1130 objs_to_go = 0; 1100 nObjsToGo = 0;
1131 } else { 1101 } else {
1132 objs_to_go--; 1102 --nObjsToGo;
1133 } 1103 }
1134 } 1104 }
1135 m_ObjectIndex++; 1105 m_LastObjectRendered = pos;
1136 pLayer->m_pObjectList->GetNextObject(m_ObjectPos); 1106 if (nObjsToGo == 0) {
1137 if (objs_to_go == 0) { 1107 if (pPause && pPause->NeedToPauseNow())
1138 if (pPause && pPause->NeedToPauseNow()) {
1139 return; 1108 return;
1140 } 1109 nObjsToGo = kStepLimit;
1141 objs_to_go = CPDF_ModuleMgr::Get()
1142 ->GetRenderModule()
1143 ->GetConfig()
1144 ->m_RenderStepLimit;
1145 } 1110 }
1111 m_pCurrentLayer->m_pObjectList->GetNextObject(pos);
1146 } 1112 }
1147 if (!pLayer->m_pObjectList->IsParsed()) { 1113 if (m_pCurrentLayer->m_pObjectList->IsParsed()) {
1148 return; 1114 m_pRenderStatus.reset();
1149 } 1115 m_pDevice->RestoreState();
1150 m_pRenderStatus.reset(); 1116 m_pCurrentLayer = nullptr;
1151 m_pDevice->RestoreState(); 1117 m_LastObjectRendered = nullptr;
1152 m_ObjectPos = NULL;
1153 m_PrevLastPos = NULL;
1154 if (pPause && pPause->NeedToPauseNow()) {
1155 m_LayerIndex++; 1118 m_LayerIndex++;
1156 return; 1119 if (pPause && pPause->NeedToPauseNow()) {
1120 return;
1121 }
1122 } else {
1123 m_pCurrentLayer->m_pObjectList->ContinueParse(pPause);
1124 if (!m_pCurrentLayer->m_pObjectList->IsParsed())
1125 return;
1157 } 1126 }
1158 } 1127 }
1159 m_Status = Done;
1160 } 1128 }
1161 int CPDF_ProgressiveRenderer::EstimateProgress() { 1129
1162 if (!m_pContext) {
1163 return 0;
1164 }
1165 FX_DWORD nLayers = m_pContext->CountLayers();
1166 int nTotal = 0;
1167 int nRendered = 0;
1168 for (FX_DWORD layer = 0; layer < nLayers; layer++) {
1169 CPDF_RenderContext::Layer* pLayer = m_pContext->GetLayer(layer);
1170 int nObjs = pLayer->m_pObjectList->CountObjects();
1171 if (layer == m_LayerIndex) {
1172 nRendered += m_ObjectIndex;
1173 } else if (layer < m_LayerIndex) {
1174 nRendered += nObjs;
1175 }
1176 nTotal += nObjs;
1177 }
1178 if (nTotal == 0) {
1179 return 0;
1180 }
1181 return 100 * nRendered / nTotal;
1182 }
1183 CPDF_TransferFunc* CPDF_DocRenderData::GetTransferFunc(CPDF_Object* pObj) { 1130 CPDF_TransferFunc* CPDF_DocRenderData::GetTransferFunc(CPDF_Object* pObj) {
1184 if (!pObj) 1131 if (!pObj)
1185 return nullptr; 1132 return nullptr;
1186 1133
1187 auto it = m_TransferFuncMap.find(pObj); 1134 auto it = m_TransferFuncMap.find(pObj);
1188 if (it != m_TransferFuncMap.end()) { 1135 if (it != m_TransferFuncMap.end()) {
1189 CPDF_CountedObject<CPDF_TransferFunc>* pTransferCounter = it->second; 1136 CPDF_CountedObject<CPDF_TransferFunc>* pTransferCounter = it->second;
1190 return pTransferCounter->AddRef(); 1137 return pTransferCounter->AddRef();
1191 } 1138 }
1192 1139
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
1245 1192
1246 pTransfer->m_bIdentity = bIdentity; 1193 pTransfer->m_bIdentity = bIdentity;
1247 return pTransferCounter->AddRef(); 1194 return pTransferCounter->AddRef();
1248 } 1195 }
1249 1196
1250 void CPDF_DocRenderData::ReleaseTransferFunc(CPDF_Object* pObj) { 1197 void CPDF_DocRenderData::ReleaseTransferFunc(CPDF_Object* pObj) {
1251 auto it = m_TransferFuncMap.find(pObj); 1198 auto it = m_TransferFuncMap.find(pObj);
1252 if (it != m_TransferFuncMap.end()) 1199 if (it != m_TransferFuncMap.end())
1253 it->second->RemoveRef(); 1200 it->second->RemoveRef();
1254 } 1201 }
1255 CPDF_RenderConfig::CPDF_RenderConfig() {
1256 m_HalftoneLimit = 0;
1257 m_RenderStepLimit = 100;
1258 }
1259 CPDF_RenderConfig::~CPDF_RenderConfig() {}
1260 1202
1261 CPDF_DeviceBuffer::CPDF_DeviceBuffer() 1203 CPDF_DeviceBuffer::CPDF_DeviceBuffer()
1262 : m_pDevice(nullptr), m_pContext(nullptr), m_pObject(nullptr) {} 1204 : m_pDevice(nullptr), m_pContext(nullptr), m_pObject(nullptr) {}
1263 1205
1264 CPDF_DeviceBuffer::~CPDF_DeviceBuffer() { 1206 CPDF_DeviceBuffer::~CPDF_DeviceBuffer() {
1265 } 1207 }
1266 1208
1267 FX_BOOL CPDF_DeviceBuffer::Initialize(CPDF_RenderContext* pContext, 1209 FX_BOOL CPDF_DeviceBuffer::Initialize(CPDF_RenderContext* pContext,
1268 CFX_RenderDevice* pDevice, 1210 CFX_RenderDevice* pDevice,
1269 FX_RECT* pRect, 1211 FX_RECT* pRect,
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
1398 item.GetParamType() == CPDF_ContentMarkItem::PropertiesDict) { 1340 item.GetParamType() == CPDF_ContentMarkItem::PropertiesDict) {
1399 CPDF_Dictionary* pOCG = 1341 CPDF_Dictionary* pOCG =
1400 ToDictionary(static_cast<CPDF_Object*>(item.GetParam())); 1342 ToDictionary(static_cast<CPDF_Object*>(item.GetParam()));
1401 if (!CheckOCGVisible(pOCG)) { 1343 if (!CheckOCGVisible(pOCG)) {
1402 return FALSE; 1344 return FALSE;
1403 } 1345 }
1404 } 1346 }
1405 } 1347 }
1406 return TRUE; 1348 return TRUE;
1407 } 1349 }
OLDNEW
« no previous file with comments | « core/include/fpdfapi/fpdf_render.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698