| 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_edit.h" | 7 #include "public/fpdf_edit.h" |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <memory> | 10 #include <memory> |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 76 DateStr.Format("D:%04d%02d%02d%02d%02d%02d", pTM->tm_year + 1900, | 76 DateStr.Format("D:%04d%02d%02d%02d%02d%02d", pTM->tm_year + 1900, |
| 77 pTM->tm_mon + 1, pTM->tm_mday, pTM->tm_hour, pTM->tm_min, | 77 pTM->tm_mon + 1, pTM->tm_mday, pTM->tm_hour, pTM->tm_min, |
| 78 pTM->tm_sec); | 78 pTM->tm_sec); |
| 79 } | 79 } |
| 80 } | 80 } |
| 81 } | 81 } |
| 82 | 82 |
| 83 CPDF_Dictionary* pInfoDict = nullptr; | 83 CPDF_Dictionary* pInfoDict = nullptr; |
| 84 pInfoDict = pDoc->GetInfo(); | 84 pInfoDict = pDoc->GetInfo(); |
| 85 if (pInfoDict) { | 85 if (pInfoDict) { |
| 86 if (FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS)) { | 86 if (FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS)) |
| 87 pInfoDict->SetFor("CreationDate", | 87 pInfoDict->SetNewFor<CPDF_String>("CreationDate", DateStr, false); |
| 88 new CPDF_String(nullptr, DateStr, false)); | 88 pInfoDict->SetNewFor<CPDF_String>("Creator", L"PDFium"); |
| 89 } | |
| 90 pInfoDict->SetFor("Creator", new CPDF_String(L"PDFium")); | |
| 91 } | 89 } |
| 92 | 90 |
| 93 return FPDFDocumentFromCPDFDocument(pDoc); | 91 return FPDFDocumentFromCPDFDocument(pDoc); |
| 94 } | 92 } |
| 95 | 93 |
| 96 DLLEXPORT void STDCALL FPDFPage_Delete(FPDF_DOCUMENT document, int page_index) { | 94 DLLEXPORT void STDCALL FPDFPage_Delete(FPDF_DOCUMENT document, int page_index) { |
| 97 if (UnderlyingDocumentType* pDoc = UnderlyingFromFPDFDocument(document)) | 95 if (UnderlyingDocumentType* pDoc = UnderlyingFromFPDFDocument(document)) |
| 98 pDoc->DeletePage(page_index); | 96 pDoc->DeletePage(page_index); |
| 99 } | 97 } |
| 100 | 98 |
| 101 DLLEXPORT FPDF_PAGE STDCALL FPDFPage_New(FPDF_DOCUMENT document, | 99 DLLEXPORT FPDF_PAGE STDCALL FPDFPage_New(FPDF_DOCUMENT document, |
| 102 int page_index, | 100 int page_index, |
| 103 double width, | 101 double width, |
| 104 double height) { | 102 double height) { |
| 105 CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); | 103 CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); |
| 106 if (!pDoc) | 104 if (!pDoc) |
| 107 return nullptr; | 105 return nullptr; |
| 108 | 106 |
| 109 page_index = std::min(std::max(page_index, 0), pDoc->GetPageCount()); | 107 page_index = std::min(std::max(page_index, 0), pDoc->GetPageCount()); |
| 110 CPDF_Dictionary* pPageDict = pDoc->CreateNewPage(page_index); | 108 CPDF_Dictionary* pPageDict = pDoc->CreateNewPage(page_index); |
| 111 if (!pPageDict) | 109 if (!pPageDict) |
| 112 return nullptr; | 110 return nullptr; |
| 113 | 111 |
| 114 CPDF_Array* pMediaBoxArray = new CPDF_Array; | 112 CPDF_Array* pMediaBoxArray = pPageDict->SetNewFor<CPDF_Array>("MediaBox"); |
| 115 pMediaBoxArray->AddNew<CPDF_Number>(0); | 113 pMediaBoxArray->AddNew<CPDF_Number>(0); |
| 116 pMediaBoxArray->AddNew<CPDF_Number>(0); | 114 pMediaBoxArray->AddNew<CPDF_Number>(0); |
| 117 pMediaBoxArray->AddNew<CPDF_Number>(static_cast<FX_FLOAT>(width)); | 115 pMediaBoxArray->AddNew<CPDF_Number>(static_cast<FX_FLOAT>(width)); |
| 118 pMediaBoxArray->AddNew<CPDF_Number>(static_cast<FX_FLOAT>(height)); | 116 pMediaBoxArray->AddNew<CPDF_Number>(static_cast<FX_FLOAT>(height)); |
| 119 pPageDict->SetFor("MediaBox", pMediaBoxArray); | 117 pPageDict->SetNewFor<CPDF_Number>("Rotate", 0); |
| 120 pPageDict->SetFor("Rotate", new CPDF_Number(0)); | 118 pPageDict->SetNewFor<CPDF_Dictionary>("Resources"); |
| 121 pPageDict->SetFor("Resources", | |
| 122 new CPDF_Dictionary(pDoc->GetByteStringPool())); | |
| 123 | 119 |
| 124 #ifdef PDF_ENABLE_XFA | 120 #ifdef PDF_ENABLE_XFA |
| 125 CPDFXFA_Page* pPage = | 121 CPDFXFA_Page* pPage = |
| 126 new CPDFXFA_Page(static_cast<CPDFXFA_Context*>(document), page_index); | 122 new CPDFXFA_Page(static_cast<CPDFXFA_Context*>(document), page_index); |
| 127 pPage->LoadPDFPage(pPageDict); | 123 pPage->LoadPDFPage(pPageDict); |
| 128 #else // PDF_ENABLE_XFA | 124 #else // PDF_ENABLE_XFA |
| 129 CPDF_Page* pPage = new CPDF_Page(pDoc, pPageDict, true); | 125 CPDF_Page* pPage = new CPDF_Page(pDoc, pPageDict, true); |
| 130 pPage->ParseContent(); | 126 pPage->ParseContent(); |
| 131 #endif // PDF_ENABLE_XFA | 127 #endif // PDF_ENABLE_XFA |
| 132 | 128 |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 289 | 285 |
| 290 CPDF_AnnotList AnnotList(pPage); | 286 CPDF_AnnotList AnnotList(pPage); |
| 291 for (size_t i = 0; i < AnnotList.Count(); ++i) { | 287 for (size_t i = 0; i < AnnotList.Count(); ++i) { |
| 292 CPDF_Annot* pAnnot = AnnotList.GetAt(i); | 288 CPDF_Annot* pAnnot = AnnotList.GetAt(i); |
| 293 CFX_FloatRect rect = pAnnot->GetRect(); // transformAnnots Rectangle | 289 CFX_FloatRect rect = pAnnot->GetRect(); // transformAnnots Rectangle |
| 294 CFX_Matrix matrix((FX_FLOAT)a, (FX_FLOAT)b, (FX_FLOAT)c, (FX_FLOAT)d, | 290 CFX_Matrix matrix((FX_FLOAT)a, (FX_FLOAT)b, (FX_FLOAT)c, (FX_FLOAT)d, |
| 295 (FX_FLOAT)e, (FX_FLOAT)f); | 291 (FX_FLOAT)e, (FX_FLOAT)f); |
| 296 rect.Transform(&matrix); | 292 rect.Transform(&matrix); |
| 297 | 293 |
| 298 CPDF_Array* pRectArray = pAnnot->GetAnnotDict()->GetArrayFor("Rect"); | 294 CPDF_Array* pRectArray = pAnnot->GetAnnotDict()->GetArrayFor("Rect"); |
| 299 if (!pRectArray) { | 295 if (!pRectArray) |
| 300 pRectArray = new CPDF_Array; | 296 pRectArray = pAnnot->GetAnnotDict()->SetNewFor<CPDF_Array>("Rect"); |
| 301 pAnnot->GetAnnotDict()->SetFor("Rect", pRectArray); | 297 |
| 302 } | |
| 303 pRectArray->SetNewAt<CPDF_Number>(0, rect.left); | 298 pRectArray->SetNewAt<CPDF_Number>(0, rect.left); |
| 304 pRectArray->SetNewAt<CPDF_Number>(1, rect.bottom); | 299 pRectArray->SetNewAt<CPDF_Number>(1, rect.bottom); |
| 305 pRectArray->SetNewAt<CPDF_Number>(2, rect.right); | 300 pRectArray->SetNewAt<CPDF_Number>(2, rect.right); |
| 306 pRectArray->SetNewAt<CPDF_Number>(3, rect.top); | 301 pRectArray->SetNewAt<CPDF_Number>(3, rect.top); |
| 307 | 302 |
| 308 // TODO: Transform AP's rectangle | 303 // TODO: Transform AP's rectangle |
| 309 } | 304 } |
| 310 } | 305 } |
| 311 | 306 |
| 312 DLLEXPORT void STDCALL FPDFPage_SetRotation(FPDF_PAGE page, int rotate) { | 307 DLLEXPORT void STDCALL FPDFPage_SetRotation(FPDF_PAGE page, int rotate) { |
| 313 CPDF_Page* pPage = CPDFPageFromFPDFPage(page); | 308 CPDF_Page* pPage = CPDFPageFromFPDFPage(page); |
| 314 if (!IsPageObject(pPage)) | 309 if (!IsPageObject(pPage)) |
| 315 return; | 310 return; |
| 316 | 311 |
| 317 CPDF_Dictionary* pDict = pPage->m_pFormDict; | 312 CPDF_Dictionary* pDict = pPage->m_pFormDict; |
| 318 rotate %= 4; | 313 rotate %= 4; |
| 319 pDict->SetFor("Rotate", new CPDF_Number(rotate * 90)); | 314 pDict->SetNewFor<CPDF_Number>("Rotate", rotate * 90); |
| 320 } | 315 } |
| OLD | NEW |