Initial commit.
[pdfium.git] / core / src / fpdfapi / fpdf_page / fpdf_page_image.cpp
1 // Copyright 2014 PDFium Authors. All rights reserved.\r
2 // Use of this source code is governed by a BSD-style license that can be\r
3 // found in the LICENSE file.\r
4  \r
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\r
6 \r
7 #include "../../../include/fpdfapi/fpdf_page.h"\r
8 #include "../../../include/fpdfapi/fpdf_pageobj.h"\r
9 #include "pageint.h"\r
10 CPDF_ImageObject::CPDF_ImageObject()\r
11 {\r
12     m_pImage = NULL;\r
13     m_Type = PDFPAGE_IMAGE;\r
14 }\r
15 CPDF_ImageObject::~CPDF_ImageObject()\r
16 {\r
17     if (!m_pImage) {\r
18         return;\r
19     }\r
20     if (m_pImage->IsInline() || (m_pImage->GetStream() && m_pImage->GetStream()->GetObjNum() == 0)) {\r
21         delete m_pImage;\r
22     } else {\r
23         m_pImage->GetDocument()->GetPageData()->ReleaseImage(m_pImage->GetStream());\r
24     }\r
25 }\r
26 void CPDF_ImageObject::CopyData(const CPDF_PageObject* pSrc)\r
27 {\r
28     const CPDF_ImageObject* pSrcObj = (const CPDF_ImageObject*)pSrc;\r
29     if (m_pImage) {\r
30         m_pImage->Release();\r
31     }\r
32     m_pImage = pSrcObj->m_pImage->Clone();\r
33     m_Matrix = pSrcObj->m_Matrix;\r
34 }\r
35 void CPDF_ImageObject::Transform(const CFX_AffineMatrix& matrix)\r
36 {\r
37     m_Matrix.Concat(matrix);\r
38     CalcBoundingBox();\r
39 }\r
40 void CPDF_ImageObject::CalcBoundingBox()\r
41 {\r
42     m_Left = m_Bottom = 0;\r
43     m_Right = m_Top = 1.0f;\r
44     m_Matrix.TransformRect(m_Left, m_Right, m_Top, m_Bottom);\r
45 }\r
46 void CPDF_Image::Release()\r
47 {\r
48     if (m_bInline || (m_pStream && m_pStream->GetObjNum() == 0)) {\r
49         delete this;\r
50     }\r
51 }\r
52 CPDF_Image* CPDF_Image::Clone()\r
53 {\r
54     if (m_pStream->GetObjNum()) {\r
55         return m_pDocument->GetPageData()->GetImage(m_pStream);\r
56     }\r
57     CPDF_Image* pImage = FX_NEW CPDF_Image(m_pDocument);\r
58     pImage->LoadImageF((CPDF_Stream*)((CPDF_Object*)m_pStream)->Clone(), m_bInline);\r
59     if (m_bInline) {\r
60         CPDF_Dictionary *pInlineDict = (CPDF_Dictionary*)m_pInlineDict->Clone(TRUE);\r
61         pImage->SetInlineDict(pInlineDict);\r
62     }\r
63     return pImage;\r
64 }\r
65 CPDF_Image::CPDF_Image(CPDF_Document* pDoc)\r
66 {\r
67     m_pDocument = pDoc;\r
68     m_pStream = NULL;\r
69     m_pOC = NULL;\r
70     m_bInline = FALSE;\r
71     m_pInlineDict = NULL;\r
72     m_pDIBSource = NULL;\r
73     m_pMask = NULL;\r
74     m_MatteColor = 0;\r
75 }\r
76 CPDF_Image::~CPDF_Image()\r
77 {\r
78     if (m_bInline) {\r
79         if (m_pStream) {\r
80 #ifndef FOXIT_CHROME_BUILD\r
81             CPDF_Dictionary* pDict = m_pStream->GetDict();\r
82             if (pDict) {\r
83                 CPDF_Object* pCSObj = pDict->GetElementValue(FX_BSTRC("ColorSpace"));\r
84                 if (pCSObj && m_pDocument) {\r
85                     m_pDocument->RemoveColorSpaceFromPageData(pCSObj);\r
86                 }\r
87             }\r
88 #endif\r
89             m_pStream->Release();\r
90         }\r
91         if (m_pInlineDict) {\r
92             m_pInlineDict->Release();\r
93         }\r
94     }\r
95 }\r
96 FX_BOOL CPDF_Image::LoadImageF(CPDF_Stream* pStream, FX_BOOL bInline)\r
97 {\r
98     m_pStream = pStream;\r
99     if (m_bInline && m_pInlineDict) {\r
100         m_pInlineDict->Release();\r
101         m_pInlineDict = NULL;\r
102     }\r
103     m_bInline = bInline;\r
104     CPDF_Dictionary* pDict = pStream->GetDict();\r
105     if (m_bInline) {\r
106         m_pInlineDict = (CPDF_Dictionary*)pDict->Clone();\r
107     }\r
108     m_pOC = pDict->GetDict(FX_BSTRC("OC"));\r
109     m_bIsMask = !pDict->KeyExist(FX_BSTRC("ColorSpace")) || pDict->GetInteger(FX_BSTRC("ImageMask"));\r
110 #ifndef _FPDFAPI_MINI_\r
111     m_bInterpolate = pDict->GetInteger(FX_BSTRC("Interpolate"));\r
112 #endif\r
113     m_Height = pDict->GetInteger(FX_BSTRC("Height"));\r
114     m_Width = pDict->GetInteger(FX_BSTRC("Width"));\r
115     return TRUE;\r
116 }\r