• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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