// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#include "../../../include/fpdfapi/fpdf_page.h"
#include "../../../include/fpdfapi/fpdf_pageobj.h"
#include "pageint.h"
CPDF_ImageObject::CPDF_ImageObject()
{
    m_pImage = NULL;
    m_Type = PDFPAGE_IMAGE;
}
CPDF_ImageObject::~CPDF_ImageObject()
{
    if (!m_pImage) {
        return;
    }
    if (m_pImage->IsInline() || (m_pImage->GetStream() && m_pImage->GetStream()->GetObjNum() == 0)) {
        delete m_pImage;
    } else {
        m_pImage->GetDocument()->GetPageData()->ReleaseImage(m_pImage->GetStream());
    }
}
void CPDF_ImageObject::CopyData(const CPDF_PageObject* pSrc)
{
    const CPDF_ImageObject* pSrcObj = (const CPDF_ImageObject*)pSrc;
    if (m_pImage) {
        m_pImage->Release();
    }
    m_pImage = pSrcObj->m_pImage->Clone();
    m_Matrix = pSrcObj->m_Matrix;
}
void CPDF_ImageObject::Transform(const CFX_AffineMatrix& matrix)
{
    m_Matrix.Concat(matrix);
    CalcBoundingBox();
}
void CPDF_ImageObject::CalcBoundingBox()
{
    m_Left = m_Bottom = 0;
    m_Right = m_Top = 1.0f;
    m_Matrix.TransformRect(m_Left, m_Right, m_Top, m_Bottom);
}
void CPDF_Image::Release()
{
    if (m_bInline || (m_pStream && m_pStream->GetObjNum() == 0)) {
        delete this;
    }
}
CPDF_Image* CPDF_Image::Clone()
{
    if (m_pStream->GetObjNum()) {
        return m_pDocument->GetPageData()->GetImage(m_pStream);
    }
    CPDF_Image* pImage = new CPDF_Image(m_pDocument);
    pImage->LoadImageF((CPDF_Stream*)((CPDF_Object*)m_pStream)->Clone(), m_bInline);
    if (m_bInline) {
        CPDF_Dictionary *pInlineDict = (CPDF_Dictionary*)m_pInlineDict->Clone(true);
        pImage->SetInlineDict(pInlineDict);
    }
    return pImage;
}
CPDF_Image::CPDF_Image(CPDF_Document* pDoc)
{
    m_pDocument = pDoc;
    m_pStream = NULL;
    m_pOC = NULL;
    m_bInline = false;
    m_pInlineDict = NULL;
    m_pDIBSource = NULL;
    m_pMask = NULL;
    m_MatteColor = 0;
}
CPDF_Image::~CPDF_Image()
{
    if (m_bInline) {
        if (m_pStream) {
            m_pStream->Release();
        }
        if (m_pInlineDict) {
            m_pInlineDict->Release();
        }
    }
}
bool CPDF_Image::LoadImageF(CPDF_Stream* pStream, bool bInline)
{
    m_pStream = pStream;
    if (m_bInline && m_pInlineDict) {
        m_pInlineDict->Release();
        m_pInlineDict = NULL;
    }
    m_bInline = bInline;
    CPDF_Dictionary* pDict = pStream->GetDict();
    if (m_bInline) {
        m_pInlineDict = (CPDF_Dictionary*)pDict->Clone();
    }
    m_pOC = pDict->GetDict(FX_BSTRC("OC"));
    m_bIsMask = !pDict->KeyExist(FX_BSTRC("ColorSpace")) || pDict->GetInteger(FX_BSTRC("ImageMask"));
    m_bInterpolate = pDict->GetInteger(FX_BSTRC("Interpolate"));
    m_Height = pDict->GetInteger(FX_BSTRC("Height"));
    m_Width = pDict->GetInteger(FX_BSTRC("Width"));
    return true;
}
