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_flatten.h" | 7 #include "public/fpdf_flatten.h" |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 | 10 |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
165 rcRet.left = GetMinMaxValue(*pRectArray, MIN, LEFT); | 165 rcRet.left = GetMinMaxValue(*pRectArray, MIN, LEFT); |
166 rcRet.top = GetMinMaxValue(*pRectArray, MAX, TOP); | 166 rcRet.top = GetMinMaxValue(*pRectArray, MAX, TOP); |
167 rcRet.right = GetMinMaxValue(*pRectArray, MAX, RIGHT); | 167 rcRet.right = GetMinMaxValue(*pRectArray, MAX, RIGHT); |
168 rcRet.bottom = GetMinMaxValue(*pRectArray, MIN, BOTTOM); | 168 rcRet.bottom = GetMinMaxValue(*pRectArray, MIN, BOTTOM); |
169 | 169 |
170 return rcRet; | 170 return rcRet; |
171 } | 171 } |
172 | 172 |
173 uint32_t NewIndirectContentsStream(const CFX_ByteString& key, | 173 uint32_t NewIndirectContentsStream(const CFX_ByteString& key, |
174 CPDF_Document* pDocument) { | 174 CPDF_Document* pDocument) { |
175 CPDF_Stream* pNewContents = new CPDF_Stream( | 175 CPDF_Stream* pNewContents = pDocument->NewIndirect<CPDF_Stream>( |
176 nullptr, 0, new CPDF_Dictionary(pDocument->GetByteStringPool())); | 176 nullptr, 0, new CPDF_Dictionary(pDocument->GetByteStringPool())); |
177 CFX_ByteString sStream; | 177 CFX_ByteString sStream; |
178 sStream.Format("q 1 0 0 1 0 0 cm /%s Do Q", key.c_str()); | 178 sStream.Format("q 1 0 0 1 0 0 cm /%s Do Q", key.c_str()); |
179 pNewContents->SetData(sStream.raw_str(), sStream.GetLength()); | 179 pNewContents->SetData(sStream.raw_str(), sStream.GetLength()); |
180 return pDocument->AddIndirectObject(pNewContents); | 180 return pNewContents->GetObjNum(); |
181 } | 181 } |
182 | 182 |
183 void SetPageContents(const CFX_ByteString& key, | 183 void SetPageContents(const CFX_ByteString& key, |
184 CPDF_Dictionary* pPage, | 184 CPDF_Dictionary* pPage, |
185 CPDF_Document* pDocument) { | 185 CPDF_Document* pDocument) { |
186 CPDF_Array* pContentsArray = nullptr; | 186 CPDF_Array* pContentsArray = nullptr; |
187 CPDF_Stream* pContentsStream = pPage->GetStreamFor("Contents"); | 187 CPDF_Stream* pContentsStream = pPage->GetStreamFor("Contents"); |
188 if (!pContentsStream) { | 188 if (!pContentsStream) { |
189 pContentsArray = pPage->GetArrayFor("Contents"); | 189 pContentsArray = pPage->GetArrayFor("Contents"); |
190 if (!pContentsArray) { | 190 if (!pContentsArray) { |
191 if (!key.IsEmpty()) { | 191 if (!key.IsEmpty()) { |
192 pPage->SetReferenceFor("Contents", pDocument, | 192 pPage->SetReferenceFor("Contents", pDocument, |
193 NewIndirectContentsStream(key, pDocument)); | 193 NewIndirectContentsStream(key, pDocument)); |
194 } | 194 } |
195 return; | 195 return; |
196 } | 196 } |
197 } | 197 } |
198 pPage->ConvertToIndirectObjectFor("Contents", pDocument); | 198 pPage->ConvertToIndirectObjectFor("Contents", pDocument); |
199 if (!pContentsArray) { | 199 if (!pContentsArray) { |
200 pContentsArray = new CPDF_Array; | 200 pContentsArray = pDocument->NewIndirect<CPDF_Array>(); |
201 CPDF_StreamAcc acc; | 201 CPDF_StreamAcc acc; |
202 acc.LoadAllData(pContentsStream); | 202 acc.LoadAllData(pContentsStream); |
203 CFX_ByteString sStream = "q\n"; | 203 CFX_ByteString sStream = "q\n"; |
204 CFX_ByteString sBody = | 204 CFX_ByteString sBody = |
205 CFX_ByteString((const FX_CHAR*)acc.GetData(), acc.GetSize()); | 205 CFX_ByteString((const FX_CHAR*)acc.GetData(), acc.GetSize()); |
206 sStream = sStream + sBody + "\nQ"; | 206 sStream = sStream + sBody + "\nQ"; |
207 pContentsStream->SetData(sStream.raw_str(), sStream.GetLength()); | 207 pContentsStream->SetData(sStream.raw_str(), sStream.GetLength()); |
208 pContentsArray->AddReference(pDocument, pContentsStream->GetObjNum()); | 208 pContentsArray->AddReference(pDocument, pContentsStream->GetObjNum()); |
209 pPage->SetReferenceFor("Contents", pDocument, | 209 pPage->SetReferenceFor("Contents", pDocument, pContentsArray); |
210 pDocument->AddIndirectObject(pContentsArray)); | |
211 } | 210 } |
212 if (!key.IsEmpty()) { | 211 if (!key.IsEmpty()) { |
213 pContentsArray->AddReference(pDocument, | 212 pContentsArray->AddReference(pDocument, |
214 NewIndirectContentsStream(key, pDocument)); | 213 NewIndirectContentsStream(key, pDocument)); |
215 } | 214 } |
216 } | 215 } |
217 | 216 |
218 CFX_Matrix GetMatrix(CFX_FloatRect rcAnnot, | 217 CFX_Matrix GetMatrix(CFX_FloatRect rcAnnot, |
219 CFX_FloatRect rcStream, | 218 CFX_FloatRect rcStream, |
220 const CFX_Matrix& matrix) { | 219 const CFX_Matrix& matrix) { |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
286 pCropBox->Add(new CPDF_Number(rcOriginalCB.top)); | 285 pCropBox->Add(new CPDF_Number(rcOriginalCB.top)); |
287 pPageDict->SetFor("ArtBox", pCropBox); | 286 pPageDict->SetFor("ArtBox", pCropBox); |
288 } | 287 } |
289 | 288 |
290 CPDF_Dictionary* pRes = pPageDict->GetDictFor("Resources"); | 289 CPDF_Dictionary* pRes = pPageDict->GetDictFor("Resources"); |
291 if (!pRes) { | 290 if (!pRes) { |
292 pRes = new CPDF_Dictionary(pDocument->GetByteStringPool()); | 291 pRes = new CPDF_Dictionary(pDocument->GetByteStringPool()); |
293 pPageDict->SetFor("Resources", pRes); | 292 pPageDict->SetFor("Resources", pRes); |
294 } | 293 } |
295 | 294 |
296 CPDF_Stream* pNewXObject = new CPDF_Stream( | 295 CPDF_Stream* pNewXObject = pDocument->NewIndirect<CPDF_Stream>( |
297 nullptr, 0, new CPDF_Dictionary(pDocument->GetByteStringPool())); | 296 nullptr, 0, new CPDF_Dictionary(pDocument->GetByteStringPool())); |
298 | 297 |
299 uint32_t dwObjNum = pDocument->AddIndirectObject(pNewXObject); | 298 uint32_t dwObjNum = pNewXObject->GetObjNum(); |
300 CPDF_Dictionary* pPageXObject = pRes->GetDictFor("XObject"); | 299 CPDF_Dictionary* pPageXObject = pRes->GetDictFor("XObject"); |
301 if (!pPageXObject) { | 300 if (!pPageXObject) { |
302 pPageXObject = new CPDF_Dictionary(pDocument->GetByteStringPool()); | 301 pPageXObject = new CPDF_Dictionary(pDocument->GetByteStringPool()); |
303 pRes->SetFor("XObject", pPageXObject); | 302 pRes->SetFor("XObject", pPageXObject); |
304 } | 303 } |
305 | 304 |
306 CFX_ByteString key = ""; | 305 CFX_ByteString key = ""; |
307 int nStreams = pdfium::CollectionSize<int>(ObjectArray); | 306 int nStreams = pdfium::CollectionSize<int>(ObjectArray); |
308 if (nStreams > 0) { | 307 if (nStreams > 0) { |
309 for (int iKey = 0; /*iKey < 100*/; iKey++) { | 308 for (int iKey = 0; /*iKey < 100*/; iKey++) { |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
376 else if (pAPDic->KeyExist("BBox")) | 375 else if (pAPDic->KeyExist("BBox")) |
377 rcStream = pAPDic->GetRectFor("BBox"); | 376 rcStream = pAPDic->GetRectFor("BBox"); |
378 | 377 |
379 if (rcStream.IsEmpty()) | 378 if (rcStream.IsEmpty()) |
380 continue; | 379 continue; |
381 | 380 |
382 CPDF_Object* pObj = pAPStream; | 381 CPDF_Object* pObj = pAPStream; |
383 if (pObj->IsInline()) { | 382 if (pObj->IsInline()) { |
384 std::unique_ptr<CPDF_Object> pNew = pObj->Clone(); | 383 std::unique_ptr<CPDF_Object> pNew = pObj->Clone(); |
385 pObj = pNew.get(); | 384 pObj = pNew.get(); |
386 pDocument->AddIndirectObject(pNew.release()); | 385 pDocument->AddIndirectObject(std::move(pNew)); |
387 } | 386 } |
388 | 387 |
389 CPDF_Dictionary* pObjDic = pObj->GetDict(); | 388 CPDF_Dictionary* pObjDic = pObj->GetDict(); |
390 if (pObjDic) { | 389 if (pObjDic) { |
391 pObjDic->SetNameFor("Type", "XObject"); | 390 pObjDic->SetNameFor("Type", "XObject"); |
392 pObjDic->SetNameFor("Subtype", "Form"); | 391 pObjDic->SetNameFor("Subtype", "Form"); |
393 } | 392 } |
394 | 393 |
395 CPDF_Dictionary* pXObject = pNewXORes->GetDictFor("XObject"); | 394 CPDF_Dictionary* pXObject = pNewXORes->GetDictFor("XObject"); |
396 if (!pXObject) { | 395 if (!pXObject) { |
(...skipping 23 matching lines...) Expand all Loading... |
420 CFX_ByteString sTemp; | 419 CFX_ByteString sTemp; |
421 CFX_Matrix m = GetMatrix(rcAnnot, rcStream, matrix); | 420 CFX_Matrix m = GetMatrix(rcAnnot, rcStream, matrix); |
422 sTemp.Format("q %f 0 0 %f %f %f cm /%s Do Q\n", m.a, m.d, m.e, m.f, | 421 sTemp.Format("q %f 0 0 %f %f %f cm /%s Do Q\n", m.a, m.d, m.e, m.f, |
423 sFormName.c_str()); | 422 sFormName.c_str()); |
424 sStream += sTemp; | 423 sStream += sTemp; |
425 pNewXObject->SetData(sStream.raw_str(), sStream.GetLength()); | 424 pNewXObject->SetData(sStream.raw_str(), sStream.GetLength()); |
426 } | 425 } |
427 pPageDict->RemoveFor("Annots"); | 426 pPageDict->RemoveFor("Annots"); |
428 return FLATTEN_SUCCESS; | 427 return FLATTEN_SUCCESS; |
429 } | 428 } |
OLD | NEW |