1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7 #include "public/fpdf_edit.h"
8
9 #include "core/fpdfapi/cpdf_modulemgr.h"
10 #include "core/fpdfapi/page/cpdf_image.h"
11 #include "core/fpdfapi/page/cpdf_imageobject.h"
12 #include "core/fpdfapi/page/cpdf_pageobject.h"
13 #include "fpdfsdk/fsdk_define.h"
14 #include "third_party/base/ptr_util.h"
15
16 DLLEXPORT FPDF_PAGEOBJECT STDCALL
FPDFPageObj_NewImgeObj(FPDF_DOCUMENT document)17 FPDFPageObj_NewImgeObj(FPDF_DOCUMENT document) {
18 CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document);
19 if (!pDoc)
20 return nullptr;
21
22 CPDF_ImageObject* pImageObj = new CPDF_ImageObject;
23 pImageObj->SetOwnedImage(pdfium::MakeUnique<CPDF_Image>(pDoc));
24 return pImageObj;
25 }
26
FPDFImageObj_LoadJpegHelper(FPDF_PAGE * pages,int nCount,FPDF_PAGEOBJECT image_object,FPDF_FILEACCESS * fileAccess,bool inlineJpeg)27 FPDF_BOOL FPDFImageObj_LoadJpegHelper(FPDF_PAGE* pages,
28 int nCount,
29 FPDF_PAGEOBJECT image_object,
30 FPDF_FILEACCESS* fileAccess,
31 bool inlineJpeg) {
32 if (!image_object || !fileAccess || !pages)
33 return false;
34
35 CFX_RetainPtr<IFX_SeekableReadStream> pFile =
36 MakeSeekableReadStream(fileAccess);
37 CPDF_ImageObject* pImgObj = reinterpret_cast<CPDF_ImageObject*>(image_object);
38 for (int index = 0; index < nCount; index++) {
39 CPDF_Page* pPage = CPDFPageFromFPDFPage(pages[index]);
40 if (pPage)
41 pImgObj->GetImage()->ResetCache(pPage, nullptr);
42 }
43
44 if (inlineJpeg)
45 pImgObj->GetImage()->SetJpegImageInline(pFile);
46 else
47 pImgObj->GetImage()->SetJpegImage(pFile);
48
49 return true;
50 }
51
52 DLLEXPORT FPDF_BOOL STDCALL
FPDFImageObj_LoadJpegFile(FPDF_PAGE * pages,int nCount,FPDF_PAGEOBJECT image_object,FPDF_FILEACCESS * fileAccess)53 FPDFImageObj_LoadJpegFile(FPDF_PAGE* pages,
54 int nCount,
55 FPDF_PAGEOBJECT image_object,
56 FPDF_FILEACCESS* fileAccess) {
57 return FPDFImageObj_LoadJpegHelper(pages, nCount, image_object, fileAccess,
58 false);
59 }
60
61 DLLEXPORT FPDF_BOOL STDCALL
FPDFImageObj_LoadJpegFileInline(FPDF_PAGE * pages,int nCount,FPDF_PAGEOBJECT image_object,FPDF_FILEACCESS * fileAccess)62 FPDFImageObj_LoadJpegFileInline(FPDF_PAGE* pages,
63 int nCount,
64 FPDF_PAGEOBJECT image_object,
65 FPDF_FILEACCESS* fileAccess) {
66 return FPDFImageObj_LoadJpegHelper(pages, nCount, image_object, fileAccess,
67 true);
68 }
69
FPDFImageObj_SetMatrix(FPDF_PAGEOBJECT image_object,double a,double b,double c,double d,double e,double f)70 DLLEXPORT FPDF_BOOL STDCALL FPDFImageObj_SetMatrix(FPDF_PAGEOBJECT image_object,
71 double a,
72 double b,
73 double c,
74 double d,
75 double e,
76 double f) {
77 if (!image_object)
78 return false;
79
80 CPDF_ImageObject* pImgObj = reinterpret_cast<CPDF_ImageObject*>(image_object);
81 pImgObj->set_matrix(
82 CFX_Matrix(static_cast<FX_FLOAT>(a), static_cast<FX_FLOAT>(b),
83 static_cast<FX_FLOAT>(c), static_cast<FX_FLOAT>(d),
84 static_cast<FX_FLOAT>(e), static_cast<FX_FLOAT>(f)));
85 pImgObj->CalcBoundingBox();
86 return true;
87 }
88
FPDFImageObj_SetBitmap(FPDF_PAGE * pages,int nCount,FPDF_PAGEOBJECT image_object,FPDF_BITMAP bitmap)89 DLLEXPORT FPDF_BOOL STDCALL FPDFImageObj_SetBitmap(FPDF_PAGE* pages,
90 int nCount,
91 FPDF_PAGEOBJECT image_object,
92 FPDF_BITMAP bitmap) {
93 if (!image_object || !bitmap || !pages)
94 return false;
95
96 CPDF_ImageObject* pImgObj = reinterpret_cast<CPDF_ImageObject*>(image_object);
97 for (int index = 0; index < nCount; index++) {
98 CPDF_Page* pPage = CPDFPageFromFPDFPage(pages[index]);
99 if (pPage)
100 pImgObj->GetImage()->ResetCache(pPage, nullptr);
101 }
102 pImgObj->GetImage()->SetImage(reinterpret_cast<CFX_DIBitmap*>(bitmap));
103 pImgObj->CalcBoundingBox();
104 return true;
105 }
106