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