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

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: Nits. 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 995 matching lines...) Expand 10 before | Expand all | Expand 10 after
1006 } 1006 }
1007 pDevice->RestoreState(); 1007 pDevice->RestoreState();
1008 } 1008 }
1009 } 1009 }
1010 void CPDF_RenderContext::DrawObjectList(CFX_RenderDevice* pDevice, CPDF_PageObje cts* pObjs, 1010 void CPDF_RenderContext::DrawObjectList(CFX_RenderDevice* pDevice, CPDF_PageObje cts* pObjs,
1011 const CFX_AffineMatrix* pObject2Device, const CPDF_RenderOptions* pOptions) 1011 const CFX_AffineMatrix* pObject2Device, const CPDF_RenderOptions* pOptions)
1012 { 1012 {
1013 AppendObjectList(pObjs, pObject2Device); 1013 AppendObjectList(pObjs, pObject2Device);
1014 Render(pDevice, pOptions); 1014 Render(pDevice, pOptions);
1015 } 1015 }
1016 CPDF_ProgressiveRenderer::CPDF_ProgressiveRenderer() 1016
1017 CPDF_ProgressiveRenderer::CPDF_ProgressiveRenderer(
1018 CPDF_RenderContext* pContext,
1019 CFX_RenderDevice* pDevice,
1020 const CPDF_RenderOptions* pOptions) :
1021 m_Status(Ready),
1022 m_pContext(pContext),
1023 m_pDevice(pDevice),
1024 m_pOptions(pOptions),
1025 m_LayerIndex(0),
1026 m_ObjectIndex(0),
1027 m_ObjectPos(nullptr),
1028 m_PrevLastPos(nullptr)
1017 { 1029 {
1018 m_pRenderer = NULL;
1019 m_pContext = NULL;
1020 m_pDevice = NULL;
1021 m_Status = Ready;
1022 } 1030 }
1031
1023 CPDF_ProgressiveRenderer::~CPDF_ProgressiveRenderer() 1032 CPDF_ProgressiveRenderer::~CPDF_ProgressiveRenderer()
1024 { 1033 {
1025 Clear(); 1034 if (m_pRenderStatus)
1035 m_pDevice->RestoreState();
1026 } 1036 }
1027 void CPDF_ProgressiveRenderer::Clear() 1037
1038 void CPDF_ProgressiveRenderer::Start(IFX_Pause* pPause)
1028 { 1039 {
1029 if (m_pRenderer) { 1040 if (!m_pContext || !m_pDevice || m_Status != Ready) {
1030 delete m_pRenderer;
1031 m_pDevice->RestoreState();
1032 m_pRenderer = NULL;
1033 }
1034 m_Status = Ready;
1035 }
1036 void CPDF_ProgressiveRenderer::Start(CPDF_RenderContext* pContext, CFX_RenderDev ice* pDevice,
1037 const CPDF_RenderOptions* pOptions, IFX_Pau se* pPause, FX_BOOL bDropObjects)
1038 {
1039 if (m_Status != Ready) {
1040 m_Status = Failed;
1041 return;
1042 }
1043 m_pContext = pContext;
1044 m_pDevice = pDevice;
1045 m_pOptions = pOptions;
1046 m_bDropObjects = bDropObjects;
1047 if (pContext == NULL || pDevice == NULL) {
1048 m_Status = Failed; 1041 m_Status = Failed;
1049 return; 1042 return;
1050 } 1043 }
1051 m_Status = ToBeContinued; 1044 m_Status = ToBeContinued;
1052 m_ObjectPos = NULL;
1053 m_LayerIndex = 0;
1054 m_ObjectIndex = 0;
1055 m_PrevLastPos = NULL;
1056 Continue(pPause); 1045 Continue(pPause);
1057 } 1046 }
1047
1058 #define RENDER_STEP_LIMIT 100 1048 #define RENDER_STEP_LIMIT 100
1059 void CPDF_ProgressiveRenderer::Continue(IFX_Pause* pPause) 1049 void CPDF_ProgressiveRenderer::Continue(IFX_Pause* pPause)
1060 { 1050 {
1061 if (m_Status != ToBeContinued) { 1051 if (m_Status != ToBeContinued) {
1062 return; 1052 return;
1063 } 1053 }
1064 FX_DWORD nLayers = m_pContext->m_ContentList.GetSize(); 1054 FX_DWORD nLayers = m_pContext->m_ContentList.GetSize();
1065 for (; m_LayerIndex < nLayers; m_LayerIndex ++) { 1055 for (; m_LayerIndex < nLayers; m_LayerIndex ++) {
1066 _PDF_RenderItem* pItem = m_pContext->m_ContentList.GetDataPtr(m_LayerInd ex); 1056 _PDF_RenderItem* pItem = m_pContext->m_ContentList.GetDataPtr(m_LayerInd ex);
1067 FX_POSITION LastPos = pItem->m_pObjectList->GetLastObjectPosition(); 1057 FX_POSITION LastPos = pItem->m_pObjectList->GetLastObjectPosition();
1068 if (m_ObjectPos == NULL) { 1058 if (m_ObjectPos == NULL) {
1069 if (LastPos == m_PrevLastPos) { 1059 if (LastPos == m_PrevLastPos) {
1070 if (!pItem->m_pObjectList->IsParsed()) { 1060 if (!pItem->m_pObjectList->IsParsed()) {
1071 pItem->m_pObjectList->ContinueParse(pPause); 1061 pItem->m_pObjectList->ContinueParse(pPause);
1072 if (!pItem->m_pObjectList->IsParsed()) { 1062 if (!pItem->m_pObjectList->IsParsed()) {
1073 return; 1063 return;
1074 } 1064 }
1075 LastPos = pItem->m_pObjectList->GetLastObjectPosition(); 1065 LastPos = pItem->m_pObjectList->GetLastObjectPosition();
1076 } 1066 }
1077 } 1067 }
1078 if (LastPos == m_PrevLastPos) { 1068 if (LastPos == m_PrevLastPos) {
1079 if (m_pRenderer) { 1069 if (m_pRenderStatus) {
1080 delete m_pRenderer; 1070 m_pRenderStatus.reset();
1081 m_pRenderer = NULL;
1082 m_pDevice->RestoreState(); 1071 m_pDevice->RestoreState();
1083 m_ObjectPos = NULL; 1072 m_ObjectPos = NULL;
1084 m_PrevLastPos = NULL; 1073 m_PrevLastPos = NULL;
1085 } 1074 }
1086 continue; 1075 continue;
1087 } 1076 }
1088 if (m_PrevLastPos) { 1077 if (m_PrevLastPos) {
1089 m_ObjectPos = m_PrevLastPos; 1078 m_ObjectPos = m_PrevLastPos;
1090 pItem->m_pObjectList->GetNextObject(m_ObjectPos); 1079 pItem->m_pObjectList->GetNextObject(m_ObjectPos);
1091 } else { 1080 } else {
1092 m_ObjectPos = pItem->m_pObjectList->GetFirstObjectPosition(); 1081 m_ObjectPos = pItem->m_pObjectList->GetFirstObjectPosition();
1093 } 1082 }
1094 m_PrevLastPos = LastPos; 1083 m_PrevLastPos = LastPos;
1095 } 1084 }
1096 if (m_pRenderer == NULL) { 1085 if (!m_pRenderStatus) {
1097 m_ObjectPos = pItem->m_pObjectList->GetFirstObjectPosition(); 1086 m_ObjectPos = pItem->m_pObjectList->GetFirstObjectPosition();
1098 m_ObjectIndex = 0; 1087 m_ObjectIndex = 0;
1099 m_pRenderer = new CPDF_RenderStatus(); 1088 m_pRenderStatus.reset(new CPDF_RenderStatus());
1100 m_pRenderer->Initialize(m_pContext, m_pDevice, NULL, NULL, NULL, NUL L, 1089 m_pRenderStatus->Initialize(
1101 m_pOptions, pItem->m_pObjectList->m_Transpar ency, m_bDropObjects, NULL); 1090 m_pContext, m_pDevice, NULL, NULL, NULL, NULL, m_pOptions,
1091 pItem->m_pObjectList->m_Transparency, FALSE, NULL);
1102 m_pDevice->SaveState(); 1092 m_pDevice->SaveState();
1103 m_ClipRect = m_pDevice->GetClipBox(); 1093 m_ClipRect = m_pDevice->GetClipBox();
1104 CFX_AffineMatrix device2object; 1094 CFX_AffineMatrix device2object;
1105 device2object.SetReverse(pItem->m_Matrix); 1095 device2object.SetReverse(pItem->m_Matrix);
1106 device2object.TransformRect(m_ClipRect); 1096 device2object.TransformRect(m_ClipRect);
1107 } 1097 }
1108 int objs_to_go = CPDF_ModuleMgr::Get()->GetRenderModule()->GetConfig()-> m_RenderStepLimit; 1098 int objs_to_go = CPDF_ModuleMgr::Get()->GetRenderModule()->GetConfig()-> m_RenderStepLimit;
1109 while (m_ObjectPos) { 1099 while (m_ObjectPos) {
1110 CPDF_PageObject* pCurObj = pItem->m_pObjectList->GetObjectAt(m_Objec tPos); 1100 CPDF_PageObject* pCurObj = pItem->m_pObjectList->GetObjectAt(m_Objec tPos);
1111 if (pCurObj && pCurObj->m_Left <= m_ClipRect.right && pCurObj->m_Rig ht >= m_ClipRect.left && 1101 if (pCurObj && pCurObj->m_Left <= m_ClipRect.right && pCurObj->m_Rig ht >= m_ClipRect.left &&
1112 pCurObj->m_Bottom <= m_ClipRect.top && pCurObj->m_Top >= m_C lipRect.bottom) { 1102 pCurObj->m_Bottom <= m_ClipRect.top && pCurObj->m_Top >= m_C lipRect.bottom) {
1113 if (m_pRenderer->ContinueSingleObject(pCurObj, &pItem->m_Matrix, pPause)) { 1103 if (m_pRenderStatus->ContinueSingleObject(pCurObj, &pItem->m_Mat rix, pPause)) {
1114 return; 1104 return;
1115 } 1105 }
1116 if (pCurObj->m_Type == PDFPAGE_IMAGE && m_pRenderer->m_Options.m _Flags & RENDER_LIMITEDIMAGECACHE) { 1106 if (pCurObj->m_Type == PDFPAGE_IMAGE && m_pRenderStatus->m_Optio ns.m_Flags & RENDER_LIMITEDIMAGECACHE) {
1117 m_pContext->GetPageCache()->CacheOptimization(m_pRenderer->m _Options.m_dwLimitCacheSize); 1107 m_pContext->GetPageCache()->CacheOptimization(m_pRenderStatu s->m_Options.m_dwLimitCacheSize);
1118 } 1108 }
1119 if (pCurObj->m_Type == PDFPAGE_FORM || pCurObj->m_Type == PDFPAG E_SHADING) { 1109 if (pCurObj->m_Type == PDFPAGE_FORM || pCurObj->m_Type == PDFPAG E_SHADING) {
1120 objs_to_go = 0; 1110 objs_to_go = 0;
1121 } else { 1111 } else {
1122 objs_to_go --; 1112 objs_to_go --;
1123 } 1113 }
1124 } 1114 }
1125 m_ObjectIndex ++; 1115 m_ObjectIndex ++;
1126 pItem->m_pObjectList->GetNextObject(m_ObjectPos); 1116 pItem->m_pObjectList->GetNextObject(m_ObjectPos);
1127 if (objs_to_go == 0) { 1117 if (objs_to_go == 0) {
1128 if (pPause && pPause->NeedToPauseNow()) { 1118 if (pPause && pPause->NeedToPauseNow()) {
1129 return; 1119 return;
1130 } 1120 }
1131 objs_to_go = CPDF_ModuleMgr::Get()->GetRenderModule()->GetConfig ()->m_RenderStepLimit; 1121 objs_to_go = CPDF_ModuleMgr::Get()->GetRenderModule()->GetConfig ()->m_RenderStepLimit;
1132 } 1122 }
1133 } 1123 }
1134 if (!pItem->m_pObjectList->IsParsed()) { 1124 if (!pItem->m_pObjectList->IsParsed()) {
1135 return; 1125 return;
1136 } 1126 }
1137 delete m_pRenderer; 1127 m_pRenderStatus.reset();
1138 m_pRenderer = NULL;
1139 m_pDevice->RestoreState(); 1128 m_pDevice->RestoreState();
1140 m_ObjectPos = NULL; 1129 m_ObjectPos = NULL;
1141 m_PrevLastPos = NULL; 1130 m_PrevLastPos = NULL;
1142 if (pPause && pPause->NeedToPauseNow()) { 1131 if (pPause && pPause->NeedToPauseNow()) {
1143 m_LayerIndex++; 1132 m_LayerIndex++;
1144 return; 1133 return;
1145 } 1134 }
1146 } 1135 }
1147 m_Status = Done; 1136 m_Status = Done;
1148 } 1137 }
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after
1391 CPDF_ContentMarkItem& item = pData->GetItem(i); 1380 CPDF_ContentMarkItem& item = pData->GetItem(i);
1392 if (item.GetName() == FX_BSTRC("OC") && item.GetParamType() == CPDF_Cont entMarkItem::PropertiesDict) { 1381 if (item.GetName() == FX_BSTRC("OC") && item.GetParamType() == CPDF_Cont entMarkItem::PropertiesDict) {
1393 CPDF_Dictionary* pOCG = (CPDF_Dictionary*)item.GetParam(); 1382 CPDF_Dictionary* pOCG = (CPDF_Dictionary*)item.GetParam();
1394 if (!CheckOCGVisible(pOCG)) { 1383 if (!CheckOCGVisible(pOCG)) {
1395 return FALSE; 1384 return FALSE;
1396 } 1385 }
1397 } 1386 }
1398 } 1387 }
1399 return TRUE; 1388 return TRUE;
1400 } 1389 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698