OLD | NEW |
1 // Copyright 2016 PDFium Authors. All rights reserved. | 1 // Copyright 2016 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/fpdfapi/page/cpdf_contentparser.h" | 7 #include "core/fpdfapi/page/cpdf_contentparser.h" |
8 | 8 |
9 #include "core/fpdfapi/font/cpdf_type3char.h" | 9 #include "core/fpdfapi/font/cpdf_type3char.h" |
10 #include "core/fpdfapi/page/cpdf_allstates.h" | 10 #include "core/fpdfapi/page/cpdf_allstates.h" |
11 #include "core/fpdfapi/page/cpdf_form.h" | 11 #include "core/fpdfapi/page/cpdf_form.h" |
12 #include "core/fpdfapi/page/cpdf_page.h" | 12 #include "core/fpdfapi/page/cpdf_page.h" |
13 #include "core/fpdfapi/page/cpdf_pageobject.h" | 13 #include "core/fpdfapi/page/cpdf_pageobject.h" |
14 #include "core/fpdfapi/page/cpdf_path.h" | 14 #include "core/fpdfapi/page/cpdf_path.h" |
15 #include "core/fpdfapi/parser/cpdf_array.h" | 15 #include "core/fpdfapi/parser/cpdf_array.h" |
16 #include "core/fpdfapi/parser/cpdf_dictionary.h" | 16 #include "core/fpdfapi/parser/cpdf_dictionary.h" |
17 #include "core/fpdfapi/parser/cpdf_stream.h" | 17 #include "core/fpdfapi/parser/cpdf_stream.h" |
18 #include "core/fpdfapi/parser/cpdf_stream_acc.h" | 18 #include "core/fpdfapi/parser/cpdf_stream_acc.h" |
19 #include "core/fxcrt/fx_safe_types.h" | 19 #include "core/fxcrt/fx_safe_types.h" |
| 20 #include "third_party/base/ptr_util.h" |
20 | 21 |
21 #define PARSE_STEP_LIMIT 100 | 22 #define PARSE_STEP_LIMIT 100 |
22 | 23 |
23 CPDF_ContentParser::CPDF_ContentParser() | 24 CPDF_ContentParser::CPDF_ContentParser() |
24 : m_Status(Ready), | 25 : m_Status(Ready), |
25 m_InternalStage(STAGE_GETCONTENT), | 26 m_InternalStage(STAGE_GETCONTENT), |
26 m_pObjectHolder(nullptr), | 27 m_pObjectHolder(nullptr), |
27 m_bForm(false), | 28 m_bForm(false), |
28 m_pType3Char(nullptr), | 29 m_pType3Char(nullptr), |
29 m_pData(nullptr), | 30 m_pData(nullptr), |
(...skipping 17 matching lines...) Expand all Loading... |
47 m_InternalStage = STAGE_GETCONTENT; | 48 m_InternalStage = STAGE_GETCONTENT; |
48 m_CurrentOffset = 0; | 49 m_CurrentOffset = 0; |
49 | 50 |
50 CPDF_Object* pContent = pPage->m_pFormDict->GetDirectObjectFor("Contents"); | 51 CPDF_Object* pContent = pPage->m_pFormDict->GetDirectObjectFor("Contents"); |
51 if (!pContent) { | 52 if (!pContent) { |
52 m_Status = Done; | 53 m_Status = Done; |
53 return; | 54 return; |
54 } | 55 } |
55 if (CPDF_Stream* pStream = pContent->AsStream()) { | 56 if (CPDF_Stream* pStream = pContent->AsStream()) { |
56 m_nStreams = 0; | 57 m_nStreams = 0; |
57 m_pSingleStream.reset(new CPDF_StreamAcc); | 58 m_pSingleStream = pdfium::MakeUnique<CPDF_StreamAcc>(); |
58 m_pSingleStream->LoadAllData(pStream, false); | 59 m_pSingleStream->LoadAllData(pStream, false); |
59 } else if (CPDF_Array* pArray = pContent->AsArray()) { | 60 } else if (CPDF_Array* pArray = pContent->AsArray()) { |
60 m_nStreams = pArray->GetCount(); | 61 m_nStreams = pArray->GetCount(); |
61 if (m_nStreams) | 62 if (m_nStreams) |
62 m_StreamArray.resize(m_nStreams); | 63 m_StreamArray.resize(m_nStreams); |
63 else | 64 else |
64 m_Status = Done; | 65 m_Status = Done; |
65 } else { | 66 } else { |
66 m_Status = Done; | 67 m_Status = Done; |
67 } | 68 } |
(...skipping 19 matching lines...) Expand all Loading... |
87 ClipPath.AppendRect(form_bbox.left, form_bbox.bottom, form_bbox.right, | 88 ClipPath.AppendRect(form_bbox.left, form_bbox.bottom, form_bbox.right, |
88 form_bbox.top); | 89 form_bbox.top); |
89 ClipPath.Transform(&form_matrix); | 90 ClipPath.Transform(&form_matrix); |
90 if (pParentMatrix) | 91 if (pParentMatrix) |
91 ClipPath.Transform(pParentMatrix); | 92 ClipPath.Transform(pParentMatrix); |
92 form_bbox.Transform(&form_matrix); | 93 form_bbox.Transform(&form_matrix); |
93 if (pParentMatrix) | 94 if (pParentMatrix) |
94 form_bbox.Transform(pParentMatrix); | 95 form_bbox.Transform(pParentMatrix); |
95 } | 96 } |
96 CPDF_Dictionary* pResources = pForm->m_pFormDict->GetDictFor("Resources"); | 97 CPDF_Dictionary* pResources = pForm->m_pFormDict->GetDictFor("Resources"); |
97 m_pParser.reset(new CPDF_StreamContentParser( | 98 m_pParser = pdfium::MakeUnique<CPDF_StreamContentParser>( |
98 pForm->m_pDocument, pForm->m_pPageResources, pForm->m_pResources, | 99 pForm->m_pDocument, pForm->m_pPageResources, pForm->m_pResources, |
99 pParentMatrix, pForm, pResources, &form_bbox, pGraphicStates, level)); | 100 pParentMatrix, pForm, pResources, &form_bbox, pGraphicStates, level); |
100 m_pParser->GetCurStates()->m_CTM = form_matrix; | 101 m_pParser->GetCurStates()->m_CTM = form_matrix; |
101 m_pParser->GetCurStates()->m_ParentMatrix = form_matrix; | 102 m_pParser->GetCurStates()->m_ParentMatrix = form_matrix; |
102 if (ClipPath) { | 103 if (ClipPath) { |
103 m_pParser->GetCurStates()->m_ClipPath.AppendPath(ClipPath, FXFILL_WINDING, | 104 m_pParser->GetCurStates()->m_ClipPath.AppendPath(ClipPath, FXFILL_WINDING, |
104 true); | 105 true); |
105 } | 106 } |
106 if (pForm->m_Transparency & PDFTRANS_GROUP) { | 107 if (pForm->m_Transparency & PDFTRANS_GROUP) { |
107 CPDF_GeneralState* pState = &m_pParser->GetCurStates()->m_GeneralState; | 108 CPDF_GeneralState* pState = &m_pParser->GetCurStates()->m_GeneralState; |
108 pState->SetBlendType(FXDIB_BLEND_NORMAL); | 109 pState->SetBlendType(FXDIB_BLEND_NORMAL); |
109 pState->SetStrokeAlpha(1.0f); | 110 pState->SetStrokeAlpha(1.0f); |
110 pState->SetFillAlpha(1.0f); | 111 pState->SetFillAlpha(1.0f); |
111 pState->SetSoftMask(nullptr); | 112 pState->SetSoftMask(nullptr); |
112 } | 113 } |
113 m_nStreams = 0; | 114 m_nStreams = 0; |
114 m_pSingleStream.reset(new CPDF_StreamAcc); | 115 m_pSingleStream = pdfium::MakeUnique<CPDF_StreamAcc>(); |
115 m_pSingleStream->LoadAllData(pForm->m_pFormStream, false); | 116 m_pSingleStream->LoadAllData(pForm->m_pFormStream, false); |
116 m_pData = (uint8_t*)m_pSingleStream->GetData(); | 117 m_pData = (uint8_t*)m_pSingleStream->GetData(); |
117 m_Size = m_pSingleStream->GetSize(); | 118 m_Size = m_pSingleStream->GetSize(); |
118 m_Status = ToBeContinued; | 119 m_Status = ToBeContinued; |
119 m_InternalStage = STAGE_PARSE; | 120 m_InternalStage = STAGE_PARSE; |
120 m_CurrentOffset = 0; | 121 m_CurrentOffset = 0; |
121 } | 122 } |
122 | 123 |
123 void CPDF_ContentParser::Continue(IFX_Pause* pPause) { | 124 void CPDF_ContentParser::Continue(IFX_Pause* pPause) { |
124 int steps = 0; | 125 int steps = 0; |
(...skipping 21 matching lines...) Expand all Loading... |
146 m_StreamArray.clear(); | 147 m_StreamArray.clear(); |
147 } else { | 148 } else { |
148 m_pData = (uint8_t*)m_pSingleStream->GetData(); | 149 m_pData = (uint8_t*)m_pSingleStream->GetData(); |
149 m_Size = m_pSingleStream->GetSize(); | 150 m_Size = m_pSingleStream->GetSize(); |
150 } | 151 } |
151 m_InternalStage = STAGE_PARSE; | 152 m_InternalStage = STAGE_PARSE; |
152 m_CurrentOffset = 0; | 153 m_CurrentOffset = 0; |
153 } else { | 154 } else { |
154 CPDF_Array* pContent = | 155 CPDF_Array* pContent = |
155 m_pObjectHolder->m_pFormDict->GetArrayFor("Contents"); | 156 m_pObjectHolder->m_pFormDict->GetArrayFor("Contents"); |
156 m_StreamArray[m_CurrentOffset].reset(new CPDF_StreamAcc); | 157 m_StreamArray[m_CurrentOffset] = pdfium::MakeUnique<CPDF_StreamAcc>(); |
157 CPDF_Stream* pStreamObj = ToStream( | 158 CPDF_Stream* pStreamObj = ToStream( |
158 pContent ? pContent->GetDirectObjectAt(m_CurrentOffset) : nullptr); | 159 pContent ? pContent->GetDirectObjectAt(m_CurrentOffset) : nullptr); |
159 m_StreamArray[m_CurrentOffset]->LoadAllData(pStreamObj, false); | 160 m_StreamArray[m_CurrentOffset]->LoadAllData(pStreamObj, false); |
160 m_CurrentOffset++; | 161 m_CurrentOffset++; |
161 } | 162 } |
162 } | 163 } |
163 if (m_InternalStage == STAGE_PARSE) { | 164 if (m_InternalStage == STAGE_PARSE) { |
164 if (!m_pParser) { | 165 if (!m_pParser) { |
165 m_pParser.reset(new CPDF_StreamContentParser( | 166 m_pParser = pdfium::MakeUnique<CPDF_StreamContentParser>( |
166 m_pObjectHolder->m_pDocument, m_pObjectHolder->m_pPageResources, | 167 m_pObjectHolder->m_pDocument, m_pObjectHolder->m_pPageResources, |
167 nullptr, nullptr, m_pObjectHolder, m_pObjectHolder->m_pResources, | 168 nullptr, nullptr, m_pObjectHolder, m_pObjectHolder->m_pResources, |
168 &m_pObjectHolder->m_BBox, nullptr, 0)); | 169 &m_pObjectHolder->m_BBox, nullptr, 0); |
169 m_pParser->GetCurStates()->m_ColorState.SetDefault(); | 170 m_pParser->GetCurStates()->m_ColorState.SetDefault(); |
170 } | 171 } |
171 if (m_CurrentOffset >= m_Size) { | 172 if (m_CurrentOffset >= m_Size) { |
172 m_InternalStage = STAGE_CHECKCLIP; | 173 m_InternalStage = STAGE_CHECKCLIP; |
173 } else { | 174 } else { |
174 m_CurrentOffset += | 175 m_CurrentOffset += |
175 m_pParser->Parse(m_pData + m_CurrentOffset, | 176 m_pParser->Parse(m_pData + m_CurrentOffset, |
176 m_Size - m_CurrentOffset, PARSE_STEP_LIMIT); | 177 m_Size - m_CurrentOffset, PARSE_STEP_LIMIT); |
177 } | 178 } |
178 } | 179 } |
(...skipping 29 matching lines...) Expand all Loading... |
208 pObj->m_ClipPath.SetNull(); | 209 pObj->m_ClipPath.SetNull(); |
209 } | 210 } |
210 m_Status = Done; | 211 m_Status = Done; |
211 return; | 212 return; |
212 } | 213 } |
213 steps++; | 214 steps++; |
214 if (pPause && pPause->NeedToPauseNow()) | 215 if (pPause && pPause->NeedToPauseNow()) |
215 break; | 216 break; |
216 } | 217 } |
217 } | 218 } |
OLD | NEW |