| 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 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 188 CPDF_Object* pContentsObj = pPage->GetStreamFor("Contents"); | 188 CPDF_Object* pContentsObj = pPage->GetStreamFor("Contents"); |
| 189 if (!pContentsObj) { | 189 if (!pContentsObj) { |
| 190 pContentsObj = pPage->GetArrayFor("Contents"); | 190 pContentsObj = pPage->GetArrayFor("Contents"); |
| 191 } | 191 } |
| 192 | 192 |
| 193 if (!pContentsObj) { | 193 if (!pContentsObj) { |
| 194 // Create a new contents dictionary | 194 // Create a new contents dictionary |
| 195 if (!key.IsEmpty()) { | 195 if (!key.IsEmpty()) { |
| 196 CPDF_Stream* pNewContents = | 196 CPDF_Stream* pNewContents = |
| 197 new CPDF_Stream(nullptr, 0, new CPDF_Dictionary); | 197 new CPDF_Stream(nullptr, 0, new CPDF_Dictionary); |
| 198 pPage->SetReferenceFor("Contents", pDocument, | |
| 199 pDocument->AddIndirectObject(pNewContents)); | |
| 200 | |
| 201 CFX_ByteString sStream; | 198 CFX_ByteString sStream; |
| 202 sStream.Format("q 1 0 0 1 0 0 cm /%s Do Q", key.c_str()); | 199 sStream.Format("q 1 0 0 1 0 0 cm /%s Do Q", key.c_str()); |
| 203 pNewContents->SetData(sStream.raw_str(), sStream.GetLength()); | 200 pNewContents->SetData(sStream.raw_str(), sStream.GetLength()); |
| 201 pPage->SetReferenceFor("Contents", pDocument, |
| 202 pDocument->AddIndirectObject(pNewContents)); |
| 204 } | 203 } |
| 205 return; | 204 return; |
| 206 } | 205 } |
| 207 | 206 |
| 208 CPDF_Array* pContentsArray = nullptr; | 207 CPDF_Array* pContentsArray = nullptr; |
| 209 | 208 |
| 210 switch (pContentsObj->GetType()) { | 209 switch (pContentsObj->GetType()) { |
| 211 case CPDF_Object::STREAM: { | 210 case CPDF_Object::STREAM: { |
| 212 pContentsArray = new CPDF_Array; | 211 pContentsArray = new CPDF_Array; |
| 213 CPDF_Stream* pContents = pContentsObj->AsStream(); | 212 CPDF_Stream* pContents = pContentsObj->AsStream(); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 227 pContentsArray = pContentsObj->AsArray(); | 226 pContentsArray = pContentsObj->AsArray(); |
| 228 break; | 227 break; |
| 229 } | 228 } |
| 230 default: | 229 default: |
| 231 break; | 230 break; |
| 232 } | 231 } |
| 233 | 232 |
| 234 if (!pContentsArray) | 233 if (!pContentsArray) |
| 235 return; | 234 return; |
| 236 | 235 |
| 237 uint32_t dwObjNum = pDocument->AddIndirectObject(pContentsArray); | 236 pPage->SetReferenceFor("Contents", pDocument, |
| 238 pPage->SetReferenceFor("Contents", pDocument, dwObjNum); | 237 pDocument->AddIndirectObject(pContentsArray)); |
| 239 | 238 |
| 240 if (!key.IsEmpty()) { | 239 if (!key.IsEmpty()) { |
| 241 CPDF_Stream* pNewContents = | 240 CPDF_Stream* pNewContents = |
| 242 new CPDF_Stream(nullptr, 0, new CPDF_Dictionary); | 241 new CPDF_Stream(nullptr, 0, new CPDF_Dictionary); |
| 243 dwObjNum = pDocument->AddIndirectObject(pNewContents); | |
| 244 pContentsArray->AddReference(pDocument, dwObjNum); | |
| 245 | |
| 246 CFX_ByteString sStream; | 242 CFX_ByteString sStream; |
| 247 sStream.Format("q 1 0 0 1 0 0 cm /%s Do Q", key.c_str()); | 243 sStream.Format("q 1 0 0 1 0 0 cm /%s Do Q", key.c_str()); |
| 248 pNewContents->SetData(sStream.raw_str(), sStream.GetLength()); | 244 pNewContents->SetData(sStream.raw_str(), sStream.GetLength()); |
| 245 pContentsArray->AddReference(pDocument, |
| 246 pDocument->AddIndirectObject(pNewContents)); |
| 249 } | 247 } |
| 250 } | 248 } |
| 251 | 249 |
| 252 CFX_Matrix GetMatrix(CFX_FloatRect rcAnnot, | 250 CFX_Matrix GetMatrix(CFX_FloatRect rcAnnot, |
| 253 CFX_FloatRect rcStream, | 251 CFX_FloatRect rcStream, |
| 254 const CFX_Matrix& matrix) { | 252 const CFX_Matrix& matrix) { |
| 255 if (rcStream.IsEmpty()) | 253 if (rcStream.IsEmpty()) |
| 256 return CFX_Matrix(); | 254 return CFX_Matrix(); |
| 257 | 255 |
| 258 matrix.TransformRect(rcStream); | 256 matrix.TransformRect(rcStream); |
| (...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 475 } | 473 } |
| 476 | 474 |
| 477 CPDF_Dictionary* pXObject = pNewXORes->GetDictFor("XObject"); | 475 CPDF_Dictionary* pXObject = pNewXORes->GetDictFor("XObject"); |
| 478 if (!pXObject) { | 476 if (!pXObject) { |
| 479 pXObject = new CPDF_Dictionary; | 477 pXObject = new CPDF_Dictionary; |
| 480 pNewXORes->SetFor("XObject", pXObject); | 478 pNewXORes->SetFor("XObject", pXObject); |
| 481 } | 479 } |
| 482 | 480 |
| 483 CFX_ByteString sFormName; | 481 CFX_ByteString sFormName; |
| 484 sFormName.Format("F%d", i); | 482 sFormName.Format("F%d", i); |
| 485 uint32_t dwStreamObjNum = pDocument->AddIndirectObject(pObj); | 483 pXObject->SetReferenceFor(sFormName, pDocument, |
| 486 pXObject->SetReferenceFor(sFormName, pDocument, dwStreamObjNum); | 484 pDocument->AddIndirectObject(pObj)); |
| 487 | 485 |
| 488 CPDF_StreamAcc acc; | 486 CPDF_StreamAcc acc; |
| 489 acc.LoadAllData(pNewXObject); | 487 acc.LoadAllData(pNewXObject); |
| 490 | 488 |
| 491 const uint8_t* pData = acc.GetData(); | 489 const uint8_t* pData = acc.GetData(); |
| 492 CFX_ByteString sStream(pData, acc.GetSize()); | 490 CFX_ByteString sStream(pData, acc.GetSize()); |
| 493 CFX_ByteString sTemp; | |
| 494 | 491 |
| 495 if (matrix.IsIdentity()) { | 492 if (matrix.IsIdentity()) { |
| 496 matrix.a = 1.0f; | 493 matrix.a = 1.0f; |
| 497 matrix.b = 0.0f; | 494 matrix.b = 0.0f; |
| 498 matrix.c = 0.0f; | 495 matrix.c = 0.0f; |
| 499 matrix.d = 1.0f; | 496 matrix.d = 1.0f; |
| 500 matrix.e = 0.0f; | 497 matrix.e = 0.0f; |
| 501 matrix.f = 0.0f; | 498 matrix.f = 0.0f; |
| 502 } | 499 } |
| 503 | 500 |
| 501 CFX_ByteString sTemp; |
| 504 CFX_Matrix m = GetMatrix(rcAnnot, rcStream, matrix); | 502 CFX_Matrix m = GetMatrix(rcAnnot, rcStream, matrix); |
| 505 sTemp.Format("q %f 0 0 %f %f %f cm /%s Do Q\n", m.a, m.d, m.e, m.f, | 503 sTemp.Format("q %f 0 0 %f %f %f cm /%s Do Q\n", m.a, m.d, m.e, m.f, |
| 506 sFormName.c_str()); | 504 sFormName.c_str()); |
| 507 sStream += sTemp; | 505 sStream += sTemp; |
| 508 pNewXObject->SetData(sStream.raw_str(), sStream.GetLength()); | 506 pNewXObject->SetData(sStream.raw_str(), sStream.GetLength()); |
| 509 } | 507 } |
| 510 pPageDict->RemoveFor("Annots"); | 508 pPageDict->RemoveFor("Annots"); |
| 511 | 509 |
| 512 ObjectArray.RemoveAll(); | 510 ObjectArray.RemoveAll(); |
| 513 RectArray.RemoveAll(); | 511 RectArray.RemoveAll(); |
| 514 | 512 |
| 515 return FLATTEN_SUCCESS; | 513 return FLATTEN_SUCCESS; |
| 516 } | 514 } |
| OLD | NEW |