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 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
179 rcRet.left = GetMinMaxValue(*pRectArray, MIN, LEFT); | 179 rcRet.left = GetMinMaxValue(*pRectArray, MIN, LEFT); |
180 rcRet.top = GetMinMaxValue(*pRectArray, MAX, TOP); | 180 rcRet.top = GetMinMaxValue(*pRectArray, MAX, TOP); |
181 rcRet.right = GetMinMaxValue(*pRectArray, MAX, RIGHT); | 181 rcRet.right = GetMinMaxValue(*pRectArray, MAX, RIGHT); |
182 rcRet.bottom = GetMinMaxValue(*pRectArray, MIN, BOTTOM); | 182 rcRet.bottom = GetMinMaxValue(*pRectArray, MIN, BOTTOM); |
183 | 183 |
184 return rcRet; | 184 return rcRet; |
185 } | 185 } |
186 | 186 |
187 uint32_t NewIndirectContentsStream(const CFX_ByteString& key, | 187 uint32_t NewIndirectContentsStream(const CFX_ByteString& key, |
188 CPDF_Document* pDocument) { | 188 CPDF_Document* pDocument) { |
189 CPDF_Stream* pNewContents = new CPDF_Stream( | 189 CPDF_Stream* pNewContents = pDocument->AddIndirectStream( |
190 nullptr, 0, new CPDF_Dictionary(pDocument->GetByteStringPool())); | 190 nullptr, 0, new CPDF_Dictionary(pDocument->GetByteStringPool())); |
191 CFX_ByteString sStream; | 191 CFX_ByteString sStream; |
192 sStream.Format("q 1 0 0 1 0 0 cm /%s Do Q", key.c_str()); | 192 sStream.Format("q 1 0 0 1 0 0 cm /%s Do Q", key.c_str()); |
193 pNewContents->SetData(sStream.raw_str(), sStream.GetLength()); | 193 pNewContents->SetData(sStream.raw_str(), sStream.GetLength()); |
194 return pDocument->AddIndirectObject(pNewContents); | 194 return pNewContents->GetObjNum(); |
195 } | 195 } |
196 | 196 |
197 void SetPageContents(const CFX_ByteString& key, | 197 void SetPageContents(const CFX_ByteString& key, |
198 CPDF_Dictionary* pPage, | 198 CPDF_Dictionary* pPage, |
199 CPDF_Document* pDocument) { | 199 CPDF_Document* pDocument) { |
200 CPDF_Array* pContentsArray = nullptr; | 200 CPDF_Array* pContentsArray = nullptr; |
201 CPDF_Stream* pContentsStream = pPage->GetStreamFor("Contents"); | 201 CPDF_Stream* pContentsStream = pPage->GetStreamFor("Contents"); |
202 if (!pContentsStream) { | 202 if (!pContentsStream) { |
203 pContentsArray = pPage->GetArrayFor("Contents"); | 203 pContentsArray = pPage->GetArrayFor("Contents"); |
204 if (!pContentsArray) { | 204 if (!pContentsArray) { |
205 if (!key.IsEmpty()) { | 205 if (!key.IsEmpty()) { |
206 pPage->SetReferenceFor("Contents", pDocument, | 206 pPage->SetReferenceFor("Contents", pDocument, |
207 NewIndirectContentsStream(key, pDocument)); | 207 NewIndirectContentsStream(key, pDocument)); |
208 } | 208 } |
209 return; | 209 return; |
210 } | 210 } |
211 } | 211 } |
212 pPage->ConvertToIndirectObjectFor("Contents", pDocument); | 212 pPage->ConvertToIndirectObjectFor("Contents", pDocument); |
213 if (!pContentsArray) { | 213 if (!pContentsArray) { |
214 pContentsArray = new CPDF_Array; | 214 pContentsArray = pDocument->AddIndirectArray(); |
215 CPDF_StreamAcc acc; | 215 CPDF_StreamAcc acc; |
216 acc.LoadAllData(pContentsStream); | 216 acc.LoadAllData(pContentsStream); |
217 CFX_ByteString sStream = "q\n"; | 217 CFX_ByteString sStream = "q\n"; |
218 CFX_ByteString sBody = | 218 CFX_ByteString sBody = CFX_ByteString(acc.GetData(), acc.GetSize()); |
219 CFX_ByteString((const FX_CHAR*)acc.GetData(), acc.GetSize()); | |
220 sStream = sStream + sBody + "\nQ"; | 219 sStream = sStream + sBody + "\nQ"; |
221 pContentsStream->SetData(sStream.raw_str(), sStream.GetLength()); | 220 pContentsStream->SetData(sStream.raw_str(), sStream.GetLength()); |
222 pContentsArray->AddReference(pDocument, pContentsStream->GetObjNum()); | 221 pContentsArray->AddReference(pDocument, pContentsStream->GetObjNum()); |
223 pPage->SetReferenceFor("Contents", pDocument, | 222 pPage->SetReferenceFor("Contents", pDocument, pContentsArray); |
224 pDocument->AddIndirectObject(pContentsArray)); | |
225 } | 223 } |
226 if (!key.IsEmpty()) { | 224 if (!key.IsEmpty()) { |
227 pContentsArray->AddReference(pDocument, | 225 pContentsArray->AddReference(pDocument, |
228 NewIndirectContentsStream(key, pDocument)); | 226 NewIndirectContentsStream(key, pDocument)); |
229 } | 227 } |
230 } | 228 } |
231 | 229 |
232 CFX_Matrix GetMatrix(CFX_FloatRect rcAnnot, | 230 CFX_Matrix GetMatrix(CFX_FloatRect rcAnnot, |
233 CFX_FloatRect rcStream, | 231 CFX_FloatRect rcStream, |
234 const CFX_Matrix& matrix) { | 232 const CFX_Matrix& matrix) { |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
311 pCropBox->Add(new CPDF_Number(rcOriginalCB.top)); | 309 pCropBox->Add(new CPDF_Number(rcOriginalCB.top)); |
312 pPageDict->SetFor("ArtBox", pCropBox); | 310 pPageDict->SetFor("ArtBox", pCropBox); |
313 } | 311 } |
314 | 312 |
315 CPDF_Dictionary* pRes = pPageDict->GetDictFor("Resources"); | 313 CPDF_Dictionary* pRes = pPageDict->GetDictFor("Resources"); |
316 if (!pRes) { | 314 if (!pRes) { |
317 pRes = new CPDF_Dictionary(pDocument->GetByteStringPool()); | 315 pRes = new CPDF_Dictionary(pDocument->GetByteStringPool()); |
318 pPageDict->SetFor("Resources", pRes); | 316 pPageDict->SetFor("Resources", pRes); |
319 } | 317 } |
320 | 318 |
321 CPDF_Stream* pNewXObject = new CPDF_Stream( | 319 CPDF_Stream* pNewXObject = pDocument->AddIndirectStream( |
322 nullptr, 0, new CPDF_Dictionary(pDocument->GetByteStringPool())); | 320 nullptr, 0, new CPDF_Dictionary(pDocument->GetByteStringPool())); |
323 | 321 |
324 uint32_t dwObjNum = pDocument->AddIndirectObject(pNewXObject); | 322 uint32_t dwObjNum = pNewXObject->GetObjNum(); |
325 CPDF_Dictionary* pPageXObject = pRes->GetDictFor("XObject"); | 323 CPDF_Dictionary* pPageXObject = pRes->GetDictFor("XObject"); |
326 if (!pPageXObject) { | 324 if (!pPageXObject) { |
327 pPageXObject = new CPDF_Dictionary(pDocument->GetByteStringPool()); | 325 pPageXObject = new CPDF_Dictionary(pDocument->GetByteStringPool()); |
328 pRes->SetFor("XObject", pPageXObject); | 326 pRes->SetFor("XObject", pPageXObject); |
329 } | 327 } |
330 | 328 |
331 CFX_ByteString key = ""; | 329 CFX_ByteString key = ""; |
332 int nStreams = pdfium::CollectionSize<int>(ObjectArray); | 330 int nStreams = pdfium::CollectionSize<int>(ObjectArray); |
333 | 331 |
334 if (nStreams > 0) { | 332 if (nStreams > 0) { |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
419 } | 417 } |
420 | 418 |
421 CPDF_Dictionary* pXObject = pNewXORes->GetDictFor("XObject"); | 419 CPDF_Dictionary* pXObject = pNewXORes->GetDictFor("XObject"); |
422 if (!pXObject) { | 420 if (!pXObject) { |
423 pXObject = new CPDF_Dictionary(pDocument->GetByteStringPool()); | 421 pXObject = new CPDF_Dictionary(pDocument->GetByteStringPool()); |
424 pNewXORes->SetFor("XObject", pXObject); | 422 pNewXORes->SetFor("XObject", pXObject); |
425 } | 423 } |
426 | 424 |
427 CFX_ByteString sFormName; | 425 CFX_ByteString sFormName; |
428 sFormName.Format("F%d", i); | 426 sFormName.Format("F%d", i); |
| 427 |
| 428 // TODO(tsepez): check |pObj| ownership. |
429 pXObject->SetReferenceFor(sFormName, pDocument, | 429 pXObject->SetReferenceFor(sFormName, pDocument, |
430 pDocument->AddIndirectObject(pObj)); | 430 pDocument->AddIndirectObject(UniqueObject(pObj))); |
431 | 431 |
432 CPDF_StreamAcc acc; | 432 CPDF_StreamAcc acc; |
433 acc.LoadAllData(pNewXObject); | 433 acc.LoadAllData(pNewXObject); |
434 | 434 |
435 const uint8_t* pData = acc.GetData(); | 435 const uint8_t* pData = acc.GetData(); |
436 CFX_ByteString sStream(pData, acc.GetSize()); | 436 CFX_ByteString sStream(pData, acc.GetSize()); |
437 | 437 |
438 if (matrix.IsIdentity()) { | 438 if (matrix.IsIdentity()) { |
439 matrix.a = 1.0f; | 439 matrix.a = 1.0f; |
440 matrix.b = 0.0f; | 440 matrix.b = 0.0f; |
441 matrix.c = 0.0f; | 441 matrix.c = 0.0f; |
442 matrix.d = 1.0f; | 442 matrix.d = 1.0f; |
443 matrix.e = 0.0f; | 443 matrix.e = 0.0f; |
444 matrix.f = 0.0f; | 444 matrix.f = 0.0f; |
445 } | 445 } |
446 | 446 |
447 CFX_ByteString sTemp; | 447 CFX_ByteString sTemp; |
448 CFX_Matrix m = GetMatrix(rcAnnot, rcStream, matrix); | 448 CFX_Matrix m = GetMatrix(rcAnnot, rcStream, matrix); |
449 sTemp.Format("q %f 0 0 %f %f %f cm /%s Do Q\n", m.a, m.d, m.e, m.f, | 449 sTemp.Format("q %f 0 0 %f %f %f cm /%s Do Q\n", m.a, m.d, m.e, m.f, |
450 sFormName.c_str()); | 450 sFormName.c_str()); |
451 sStream += sTemp; | 451 sStream += sTemp; |
452 pNewXObject->SetData(sStream.raw_str(), sStream.GetLength()); | 452 pNewXObject->SetData(sStream.raw_str(), sStream.GetLength()); |
453 } | 453 } |
454 pPageDict->RemoveFor("Annots"); | 454 pPageDict->RemoveFor("Annots"); |
455 | 455 |
456 RectArray.RemoveAll(); | 456 RectArray.RemoveAll(); |
457 return FLATTEN_SUCCESS; | 457 return FLATTEN_SUCCESS; |
458 } | 458 } |
OLD | NEW |