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 "../../public/fpdf_transformpage.h" | 7 #include "../../public/fpdf_transformpage.h" |
8 #include "../include/fsdk_define.h" | 8 #include "../include/fsdk_define.h" |
9 | 9 |
10 namespace { | 10 namespace { |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
128 CPDF_Stream* pEndStream = new CPDF_Stream(nullptr, 0, pDic); | 128 CPDF_Stream* pEndStream = new CPDF_Stream(nullptr, 0, pDic); |
129 pEndStream->SetData((const uint8_t*)" Q", 2, FALSE, FALSE); | 129 pEndStream->SetData((const uint8_t*)" Q", 2, FALSE, FALSE); |
130 pDoc->AddIndirectObject(pEndStream); | 130 pDoc->AddIndirectObject(pEndStream); |
131 | 131 |
132 CPDF_Array* pContentArray = nullptr; | 132 CPDF_Array* pContentArray = nullptr; |
133 if (CPDF_Array* pArray = ToArray(pContentObj)) { | 133 if (CPDF_Array* pArray = ToArray(pContentObj)) { |
134 pContentArray = pArray; | 134 pContentArray = pArray; |
135 CPDF_Reference* pRef = new CPDF_Reference(pDoc, pStream->GetObjNum()); | 135 CPDF_Reference* pRef = new CPDF_Reference(pDoc, pStream->GetObjNum()); |
136 pContentArray->InsertAt(0, pRef); | 136 pContentArray->InsertAt(0, pRef); |
137 pContentArray->AddReference(pDoc, pEndStream); | 137 pContentArray->AddReference(pDoc, pEndStream); |
138 } else if (pContentObj && pContentObj->GetType() == PDFOBJ_REFERENCE) { | 138 } else if (CPDF_Reference* pReference = ToReference(pContentObj)) { |
139 CPDF_Reference* pReference = (CPDF_Reference*)pContentObj; | |
140 CPDF_Object* pDirectObj = pReference->GetDirect(); | 139 CPDF_Object* pDirectObj = pReference->GetDirect(); |
141 if (pDirectObj) { | 140 if (pDirectObj) { |
142 if (CPDF_Array* pArray = pDirectObj->AsArray()) { | 141 if (CPDF_Array* pArray = pDirectObj->AsArray()) { |
143 pContentArray = pArray; | 142 pContentArray = pArray; |
144 CPDF_Reference* pRef = new CPDF_Reference(pDoc, pStream->GetObjNum()); | 143 CPDF_Reference* pRef = new CPDF_Reference(pDoc, pStream->GetObjNum()); |
145 pContentArray->InsertAt(0, pRef); | 144 pContentArray->InsertAt(0, pRef); |
146 pContentArray->AddReference(pDoc, pEndStream); | 145 pContentArray->AddReference(pDoc, pEndStream); |
147 } else if (pDirectObj->IsStream()) { | 146 } else if (pDirectObj->IsStream()) { |
148 pContentArray = new CPDF_Array(); | 147 pContentArray = new CPDF_Array(); |
149 pContentArray->AddReference(pDoc, pStream->GetObjNum()); | 148 pContentArray->AddReference(pDoc, pStream->GetObjNum()); |
150 pContentArray->AddReference(pDoc, pDirectObj->GetObjNum()); | 149 pContentArray->AddReference(pDoc, pDirectObj->GetObjNum()); |
151 pContentArray->AddReference(pDoc, pEndStream); | 150 pContentArray->AddReference(pDoc, pEndStream); |
152 pPageDic->SetAtReference("Contents", pDoc, | 151 pPageDic->SetAtReference("Contents", pDoc, |
153 pDoc->AddIndirectObject(pContentArray)); | 152 pDoc->AddIndirectObject(pContentArray)); |
154 } | 153 } |
155 } | 154 } |
156 } | 155 } |
157 | 156 |
158 // Need to transform the patterns as well. | 157 // Need to transform the patterns as well. |
159 CPDF_Dictionary* pRes = pPageDic->GetDict(FX_BSTRC("Resources")); | 158 CPDF_Dictionary* pRes = pPageDic->GetDict(FX_BSTRC("Resources")); |
160 if (pRes) { | 159 if (pRes) { |
161 CPDF_Dictionary* pPattenDict = pRes->GetDict(FX_BSTRC("Pattern")); | 160 CPDF_Dictionary* pPattenDict = pRes->GetDict(FX_BSTRC("Pattern")); |
162 if (pPattenDict) { | 161 if (pPattenDict) { |
163 FX_POSITION pos = pPattenDict->GetStartPos(); | 162 FX_POSITION pos = pPattenDict->GetStartPos(); |
164 while (pos) { | 163 while (pos) { |
165 CPDF_Dictionary* pDict = nullptr; | 164 CPDF_Dictionary* pDict = nullptr; |
166 CFX_ByteString key; | 165 CFX_ByteString key; |
167 CPDF_Object* pObj = pPattenDict->GetNextElement(pos, key); | 166 CPDF_Object* pObj = pPattenDict->GetNextElement(pos, key); |
168 if (pObj->GetType() == PDFOBJ_REFERENCE) | 167 if (pObj->IsReference()) |
169 pObj = pObj->GetDirect(); | 168 pObj = pObj->GetDirect(); |
170 | 169 |
171 if (pObj->IsDictionary()) | 170 if (pObj->IsDictionary()) |
172 pDict = pObj->AsDictionary(); | 171 pDict = pObj->AsDictionary(); |
173 else if (CPDF_Stream* pStream = pObj->AsStream()) | 172 else if (CPDF_Stream* pStream = pObj->AsStream()) |
174 pDict = pStream->GetDict(); | 173 pDict = pStream->GetDict(); |
175 else | 174 else |
176 continue; | 175 continue; |
177 | 176 |
178 CFX_AffineMatrix m = pDict->GetMatrix(FX_BSTRC("Matrix")); | 177 CFX_AffineMatrix m = pDict->GetMatrix(FX_BSTRC("Matrix")); |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
299 CPDF_Document* pDoc = pPage->m_pDocument; | 298 CPDF_Document* pDoc = pPage->m_pDocument; |
300 if (!pDoc) | 299 if (!pDoc) |
301 return; | 300 return; |
302 pDoc->AddIndirectObject(pStream); | 301 pDoc->AddIndirectObject(pStream); |
303 | 302 |
304 CPDF_Array* pContentArray = nullptr; | 303 CPDF_Array* pContentArray = nullptr; |
305 if (CPDF_Array* pArray = ToArray(pContentObj)) { | 304 if (CPDF_Array* pArray = ToArray(pContentObj)) { |
306 pContentArray = pArray; | 305 pContentArray = pArray; |
307 CPDF_Reference* pRef = new CPDF_Reference(pDoc, pStream->GetObjNum()); | 306 CPDF_Reference* pRef = new CPDF_Reference(pDoc, pStream->GetObjNum()); |
308 pContentArray->InsertAt(0, pRef); | 307 pContentArray->InsertAt(0, pRef); |
309 } else if (pContentObj && pContentObj->GetType() == PDFOBJ_REFERENCE) { | 308 } else if (CPDF_Reference* pReference = ToReference(pContentObj)) { |
310 CPDF_Reference* pReference = (CPDF_Reference*)pContentObj; | |
311 CPDF_Object* pDirectObj = pReference->GetDirect(); | 309 CPDF_Object* pDirectObj = pReference->GetDirect(); |
312 if (pDirectObj) { | 310 if (pDirectObj) { |
313 if (CPDF_Array* pArray = pDirectObj->AsArray()) { | 311 if (CPDF_Array* pArray = pDirectObj->AsArray()) { |
314 pContentArray = pArray; | 312 pContentArray = pArray; |
315 CPDF_Reference* pRef = new CPDF_Reference(pDoc, pStream->GetObjNum()); | 313 CPDF_Reference* pRef = new CPDF_Reference(pDoc, pStream->GetObjNum()); |
316 pContentArray->InsertAt(0, pRef); | 314 pContentArray->InsertAt(0, pRef); |
317 } else if (pDirectObj->IsStream()) { | 315 } else if (pDirectObj->IsStream()) { |
318 pContentArray = new CPDF_Array(); | 316 pContentArray = new CPDF_Array(); |
319 pContentArray->AddReference(pDoc, pStream->GetObjNum()); | 317 pContentArray->AddReference(pDoc, pStream->GetObjNum()); |
320 pContentArray->AddReference(pDoc, pDirectObj->GetObjNum()); | 318 pContentArray->AddReference(pDoc, pDirectObj->GetObjNum()); |
321 pPageDic->SetAtReference("Contents", pDoc, | 319 pPageDic->SetAtReference("Contents", pDoc, |
322 pDoc->AddIndirectObject(pContentArray)); | 320 pDoc->AddIndirectObject(pContentArray)); |
323 } | 321 } |
324 } | 322 } |
325 } | 323 } |
326 } | 324 } |
OLD | NEW |