| 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 |
| 11 #include "core/fpdfapi/page/cpdf_page.h" | 11 #include "core/fpdfapi/page/cpdf_page.h" |
| 12 #include "core/fpdfapi/page/cpdf_pageobject.h" | 12 #include "core/fpdfapi/page/cpdf_pageobject.h" |
| 13 #include "core/fpdfapi/parser/cpdf_array.h" | 13 #include "core/fpdfapi/parser/cpdf_array.h" |
| 14 #include "core/fpdfapi/parser/cpdf_document.h" | 14 #include "core/fpdfapi/parser/cpdf_document.h" |
| 15 #include "core/fpdfapi/parser/cpdf_number.h" | 15 #include "core/fpdfapi/parser/cpdf_number.h" |
| 16 #include "core/fpdfapi/parser/cpdf_reference.h" |
| 16 #include "core/fpdfapi/parser/cpdf_stream.h" | 17 #include "core/fpdfapi/parser/cpdf_stream.h" |
| 17 #include "core/fpdfapi/parser/cpdf_stream_acc.h" | 18 #include "core/fpdfapi/parser/cpdf_stream_acc.h" |
| 18 #include "core/fpdfdoc/cpdf_annot.h" | 19 #include "core/fpdfdoc/cpdf_annot.h" |
| 19 #include "fpdfsdk/fsdk_define.h" | 20 #include "fpdfsdk/fsdk_define.h" |
| 20 #include "third_party/base/stl_util.h" | 21 #include "third_party/base/stl_util.h" |
| 21 | 22 |
| 22 enum FPDF_TYPE { MAX, MIN }; | 23 enum FPDF_TYPE { MAX, MIN }; |
| 23 enum FPDF_VALUE { TOP, LEFT, RIGHT, BOTTOM }; | 24 enum FPDF_VALUE { TOP, LEFT, RIGHT, BOTTOM }; |
| 24 | 25 |
| 25 namespace { | 26 namespace { |
| (...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 198 pPage->ConvertToIndirectObjectFor("Contents", pDocument); | 199 pPage->ConvertToIndirectObjectFor("Contents", pDocument); |
| 199 if (!pContentsArray) { | 200 if (!pContentsArray) { |
| 200 pContentsArray = pDocument->NewIndirect<CPDF_Array>(); | 201 pContentsArray = pDocument->NewIndirect<CPDF_Array>(); |
| 201 CPDF_StreamAcc acc; | 202 CPDF_StreamAcc acc; |
| 202 acc.LoadAllData(pContentsStream); | 203 acc.LoadAllData(pContentsStream); |
| 203 CFX_ByteString sStream = "q\n"; | 204 CFX_ByteString sStream = "q\n"; |
| 204 CFX_ByteString sBody = | 205 CFX_ByteString sBody = |
| 205 CFX_ByteString((const FX_CHAR*)acc.GetData(), acc.GetSize()); | 206 CFX_ByteString((const FX_CHAR*)acc.GetData(), acc.GetSize()); |
| 206 sStream = sStream + sBody + "\nQ"; | 207 sStream = sStream + sBody + "\nQ"; |
| 207 pContentsStream->SetData(sStream.raw_str(), sStream.GetLength()); | 208 pContentsStream->SetData(sStream.raw_str(), sStream.GetLength()); |
| 208 pContentsArray->AddReference(pDocument, pContentsStream->GetObjNum()); | 209 pContentsArray->AddNew<CPDF_Reference>(pDocument, |
| 210 pContentsStream->GetObjNum()); |
| 209 pPage->SetReferenceFor("Contents", pDocument, pContentsArray); | 211 pPage->SetReferenceFor("Contents", pDocument, pContentsArray); |
| 210 } | 212 } |
| 211 if (!key.IsEmpty()) { | 213 if (!key.IsEmpty()) { |
| 212 pContentsArray->AddReference(pDocument, | 214 pContentsArray->AddNew<CPDF_Reference>( |
| 213 NewIndirectContentsStream(key, pDocument)); | 215 pDocument, NewIndirectContentsStream(key, pDocument)); |
| 214 } | 216 } |
| 215 } | 217 } |
| 216 | 218 |
| 217 CFX_Matrix GetMatrix(CFX_FloatRect rcAnnot, | 219 CFX_Matrix GetMatrix(CFX_FloatRect rcAnnot, |
| 218 CFX_FloatRect rcStream, | 220 CFX_FloatRect rcStream, |
| 219 const CFX_Matrix& matrix) { | 221 const CFX_Matrix& matrix) { |
| 220 if (rcStream.IsEmpty()) | 222 if (rcStream.IsEmpty()) |
| 221 return CFX_Matrix(); | 223 return CFX_Matrix(); |
| 222 | 224 |
| 223 matrix.TransformRect(rcStream); | 225 matrix.TransformRect(rcStream); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 263 rcMerger.right = std::min(rcMerger.right, rcOriginalMB.right); | 265 rcMerger.right = std::min(rcMerger.right, rcOriginalMB.right); |
| 264 rcMerger.bottom = std::max(rcMerger.bottom, rcOriginalMB.bottom); | 266 rcMerger.bottom = std::max(rcMerger.bottom, rcOriginalMB.bottom); |
| 265 rcMerger.top = std::min(rcMerger.top, rcOriginalMB.top); | 267 rcMerger.top = std::min(rcMerger.top, rcOriginalMB.top); |
| 266 if (pPageDict->KeyExist("ArtBox")) | 268 if (pPageDict->KeyExist("ArtBox")) |
| 267 rcOriginalCB = pPageDict->GetRectFor("ArtBox"); | 269 rcOriginalCB = pPageDict->GetRectFor("ArtBox"); |
| 268 else | 270 else |
| 269 rcOriginalCB = rcOriginalMB; | 271 rcOriginalCB = rcOriginalMB; |
| 270 | 272 |
| 271 if (!rcOriginalMB.IsEmpty()) { | 273 if (!rcOriginalMB.IsEmpty()) { |
| 272 CPDF_Array* pMediaBox = new CPDF_Array(); | 274 CPDF_Array* pMediaBox = new CPDF_Array(); |
| 273 pMediaBox->Add(new CPDF_Number(rcOriginalMB.left)); | 275 pMediaBox->AddNew<CPDF_Number>(rcOriginalMB.left); |
| 274 pMediaBox->Add(new CPDF_Number(rcOriginalMB.bottom)); | 276 pMediaBox->AddNew<CPDF_Number>(rcOriginalMB.bottom); |
| 275 pMediaBox->Add(new CPDF_Number(rcOriginalMB.right)); | 277 pMediaBox->AddNew<CPDF_Number>(rcOriginalMB.right); |
| 276 pMediaBox->Add(new CPDF_Number(rcOriginalMB.top)); | 278 pMediaBox->AddNew<CPDF_Number>(rcOriginalMB.top); |
| 277 pPageDict->SetFor("MediaBox", pMediaBox); | 279 pPageDict->SetFor("MediaBox", pMediaBox); |
| 278 } | 280 } |
| 279 | 281 |
| 280 if (!rcOriginalCB.IsEmpty()) { | 282 if (!rcOriginalCB.IsEmpty()) { |
| 281 CPDF_Array* pCropBox = new CPDF_Array(); | 283 CPDF_Array* pCropBox = new CPDF_Array(); |
| 282 pCropBox->Add(new CPDF_Number(rcOriginalCB.left)); | 284 pCropBox->AddNew<CPDF_Number>(rcOriginalCB.left); |
| 283 pCropBox->Add(new CPDF_Number(rcOriginalCB.bottom)); | 285 pCropBox->AddNew<CPDF_Number>(rcOriginalCB.bottom); |
| 284 pCropBox->Add(new CPDF_Number(rcOriginalCB.right)); | 286 pCropBox->AddNew<CPDF_Number>(rcOriginalCB.right); |
| 285 pCropBox->Add(new CPDF_Number(rcOriginalCB.top)); | 287 pCropBox->AddNew<CPDF_Number>(rcOriginalCB.top); |
| 286 pPageDict->SetFor("ArtBox", pCropBox); | 288 pPageDict->SetFor("ArtBox", pCropBox); |
| 287 } | 289 } |
| 288 | 290 |
| 289 CPDF_Dictionary* pRes = pPageDict->GetDictFor("Resources"); | 291 CPDF_Dictionary* pRes = pPageDict->GetDictFor("Resources"); |
| 290 if (!pRes) { | 292 if (!pRes) { |
| 291 pRes = new CPDF_Dictionary(pDocument->GetByteStringPool()); | 293 pRes = new CPDF_Dictionary(pDocument->GetByteStringPool()); |
| 292 pPageDict->SetFor("Resources", pRes); | 294 pPageDict->SetFor("Resources", pRes); |
| 293 } | 295 } |
| 294 | 296 |
| 295 CPDF_Stream* pNewXObject = pDocument->NewIndirect<CPDF_Stream>( | 297 CPDF_Stream* pNewXObject = pDocument->NewIndirect<CPDF_Stream>( |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 419 CFX_ByteString sTemp; | 421 CFX_ByteString sTemp; |
| 420 CFX_Matrix m = GetMatrix(rcAnnot, rcStream, matrix); | 422 CFX_Matrix m = GetMatrix(rcAnnot, rcStream, matrix); |
| 421 sTemp.Format("q %f 0 0 %f %f %f cm /%s Do Q\n", m.a, m.d, m.e, m.f, | 423 sTemp.Format("q %f 0 0 %f %f %f cm /%s Do Q\n", m.a, m.d, m.e, m.f, |
| 422 sFormName.c_str()); | 424 sFormName.c_str()); |
| 423 sStream += sTemp; | 425 sStream += sTemp; |
| 424 pNewXObject->SetData(sStream.raw_str(), sStream.GetLength()); | 426 pNewXObject->SetData(sStream.raw_str(), sStream.GetLength()); |
| 425 } | 427 } |
| 426 pPageDict->RemoveFor("Annots"); | 428 pPageDict->RemoveFor("Annots"); |
| 427 return FLATTEN_SUCCESS; | 429 return FLATTEN_SUCCESS; |
| 428 } | 430 } |
| OLD | NEW |