// 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_module.h"
#include "../../../include/fdrm/fx_crypt.h"
#include "../fpdf_font/font_int.h"
#include "pageint.h"

class CPDF_PageModule : public IPDF_PageModule
{
public:
    CPDF_PageModule()
        : m_StockGrayCS(nullptr, PDFCS_DEVICEGRAY),
          m_StockRGBCS(nullptr, PDFCS_DEVICERGB),
          m_StockCMYKCS(nullptr, PDFCS_DEVICECMYK),
          m_StockPatternCS(nullptr) {}

private:
    ~CPDF_PageModule() override {}

    CPDF_DocPageData* CreateDocData(CPDF_Document* pDoc) override
    {
        return new CPDF_DocPageData(pDoc);
    }

    void ReleaseDoc(CPDF_Document* pDoc) override;
    void ClearDoc(CPDF_Document* pDoc) override;

    CPDF_FontGlobals* GetFontGlobals() override
    {
        return &m_FontGlobals;
    }

    void ClearStockFont(CPDF_Document* pDoc) override
    {
        m_FontGlobals.Clear(pDoc);
    }

    CPDF_ColorSpace* GetStockCS(int family) override;
    void NotifyCJKAvailable() override;

    CPDF_FontGlobals m_FontGlobals;
    CPDF_DeviceCS m_StockGrayCS;
    CPDF_DeviceCS m_StockRGBCS;
    CPDF_DeviceCS m_StockCMYKCS;
    CPDF_PatternCS m_StockPatternCS;
};

CPDF_ColorSpace* CPDF_PageModule::GetStockCS(int family)
{
    if (family == PDFCS_DEVICEGRAY) {
        return &m_StockGrayCS;
    }
    if (family == PDFCS_DEVICERGB) {
        return &m_StockRGBCS;
    }
    if (family == PDFCS_DEVICECMYK) {
        return &m_StockCMYKCS;
    }
    if (family == PDFCS_PATTERN) {
        return &m_StockPatternCS;
    }
    return NULL;
}

void CPDF_ModuleMgr::InitPageModule()
{
    m_pPageModule.reset(new CPDF_PageModule);
}

void CPDF_PageModule::ReleaseDoc(CPDF_Document* pDoc)
{
    delete pDoc->GetPageData();
}
void CPDF_PageModule::ClearDoc(CPDF_Document* pDoc)
{
    pDoc->GetPageData()->Clear(FALSE);
}
void CPDF_PageModule::NotifyCJKAvailable()
{
    m_FontGlobals.m_CMapManager.ReloadAll();
}

CPDF_Font* CPDF_Document::LoadFont(CPDF_Dictionary* pFontDict)
{
    ASSERT(pFontDict);
    return GetValidatePageData()->GetFont(pFontDict, FALSE);
}

CPDF_StreamAcc* CPDF_Document::LoadFontFile(CPDF_Stream* pStream)
{
    return GetValidatePageData()->GetFontFileStreamAcc(pStream);
}

CPDF_ColorSpace* _CSFromName(const CFX_ByteString& name);
CPDF_ColorSpace* CPDF_Document::LoadColorSpace(CPDF_Object* pCSObj, CPDF_Dictionary* pResources)
{
    return GetValidatePageData()->GetColorSpace(pCSObj, pResources);
}
CPDF_Pattern* CPDF_Document::LoadPattern(CPDF_Object* pPatternObj, FX_BOOL bShading, const CFX_AffineMatrix* matrix)
{
    return GetValidatePageData()->GetPattern(pPatternObj, bShading, matrix);
}
CPDF_IccProfile* CPDF_Document::LoadIccProfile(CPDF_Stream* pStream)
{
    return GetValidatePageData()->GetIccProfile(pStream);
}
CPDF_Image* CPDF_Document::LoadImageF(CPDF_Object* pObj)
{
    if (!pObj) {
        return NULL;
    }
    FXSYS_assert(pObj->GetObjNum());
    return GetValidatePageData()->GetImage(pObj);
}
void CPDF_Document::RemoveColorSpaceFromPageData(CPDF_Object* pCSObj)
{
    if (!pCSObj) {
        return;
    }
    GetPageData()->ReleaseColorSpace(pCSObj);
}
CPDF_DocPageData::CPDF_DocPageData(CPDF_Document* pPDFDoc)
    : m_pPDFDoc(pPDFDoc),
      m_bForceClear(FALSE)
{
}

CPDF_DocPageData::~CPDF_DocPageData()
{
    Clear(FALSE);
    Clear(TRUE);

    for (auto& it : m_PatternMap)
        delete it.second;
    m_PatternMap.clear();

    for (auto& it : m_FontMap)
        delete it.second;
    m_FontMap.clear();

    for (auto& it : m_ColorSpaceMap)
        delete it.second;
    m_ColorSpaceMap.clear();
}

void CPDF_DocPageData::Clear(FX_BOOL bForceRelease)
{
    m_bForceClear = bForceRelease;

    for (auto& it : m_PatternMap) {
        CPDF_CountedPattern* ptData = it.second;
        if (!ptData->get())
            continue;

        if (bForceRelease || ptData->use_count() < 2) {
            ptData->get()->SetForceClear(bForceRelease);
            ptData->clear();
        }
    }

    for (auto& it : m_FontMap) {
        CPDF_CountedFont* fontData = it.second;
        if (!fontData->get())
            continue;

        if (bForceRelease || fontData->use_count() < 2) {
            fontData->clear();
        }
    }

    for (auto& it : m_ColorSpaceMap) {
        CPDF_CountedColorSpace* csData = it.second;
        if (!csData->get())
            continue;

        if (bForceRelease || csData->use_count() < 2) {
            csData->get()->ReleaseCS();
            csData->reset(nullptr);
        }
    }

    for (auto it = m_IccProfileMap.begin(); it != m_IccProfileMap.end();) {
        auto curr_it = it++;
        CPDF_CountedIccProfile* ipData = curr_it->second;
        if (!ipData->get())
            continue;

        if (bForceRelease || ipData->use_count() < 2) {
            CPDF_Stream* ipKey = curr_it->first;
            FX_POSITION pos2 = m_HashProfileMap.GetStartPosition();
            while (pos2) {
                CFX_ByteString bsKey;
                CPDF_Stream* pFindStream = nullptr;
                m_HashProfileMap.GetNextAssoc(pos2, bsKey, (void*&)pFindStream);
                if (ipKey == pFindStream) {
                    m_HashProfileMap.RemoveKey(bsKey);
                    break;
                }
            }
            delete ipData->get();
            delete ipData;
            m_IccProfileMap.erase(curr_it);
        }
    }

    for (auto it = m_FontFileMap.begin(); it != m_FontFileMap.end();) {
        auto curr_it = it++;
        CPDF_CountedStreamAcc* ftData = curr_it->second;
        if (!ftData->get())
            continue;

        if (bForceRelease || ftData->use_count() < 2) {
            delete ftData->get();
            delete ftData;
            m_FontFileMap.erase(curr_it);
        }
    }

    for (auto it = m_ImageMap.begin(); it != m_ImageMap.end();) {
        auto curr_it = it++;
        CPDF_CountedImage* imageData = curr_it->second;
        if (!imageData->get())
            continue;

        if (bForceRelease || imageData->use_count() < 2) {
            delete imageData->get();
            delete imageData;
            m_ImageMap.erase(curr_it);
        }
    }
}

CPDF_Font* CPDF_DocPageData::GetFont(CPDF_Dictionary* pFontDict, FX_BOOL findOnly)
{
    if (!pFontDict) {
        return NULL;
    }
    if (findOnly) {
        auto it = m_FontMap.find(pFontDict);
        if (it != m_FontMap.end() && it->second->get()) {
            return it->second->AddRef();
        }
        return nullptr;
    }

    CPDF_CountedFont* fontData = nullptr;
    auto it = m_FontMap.find(pFontDict);
    if (it != m_FontMap.end()) {
        fontData = it->second;
        if (fontData->get()) {
            return fontData->AddRef();
        }
    }

    CPDF_Font* pFont = CPDF_Font::CreateFontF(m_pPDFDoc, pFontDict);
    if (!pFont) {
        return nullptr;
    }
    if (!fontData) {
        fontData = new CPDF_CountedFont(pFont);
        m_FontMap[pFontDict] = fontData;
    } else {
        fontData->reset(pFont);
    }
    return fontData->AddRef();
}

CPDF_Font* CPDF_DocPageData::GetStandardFont(const CFX_ByteStringC& fontName, CPDF_FontEncoding* pEncoding)
{
    if (fontName.IsEmpty())
        return nullptr;

    for (auto& it : m_FontMap) {
        CPDF_CountedFont* fontData = it.second;
        CPDF_Font* pFont = fontData->get();
        if (!pFont)
            continue;
        if (pFont->GetBaseFont() != fontName)
            continue;
        if (pFont->IsEmbedded())
            continue;
        if (pFont->GetFontType() != PDFFONT_TYPE1)
            continue;
        if (pFont->GetFontDict()->KeyExist(FX_BSTRC("Widths")))
            continue;

        CPDF_Type1Font* pT1Font = pFont->GetType1Font();
        if (pEncoding && !pT1Font->GetEncoding()->IsIdentical(pEncoding))
            continue;

        return fontData->AddRef();
    }

    CPDF_Dictionary* pDict = new CPDF_Dictionary;
    pDict->SetAtName(FX_BSTRC("Type"), FX_BSTRC("Font"));
    pDict->SetAtName(FX_BSTRC("Subtype"), FX_BSTRC("Type1"));
    pDict->SetAtName(FX_BSTRC("BaseFont"), fontName);
    if (pEncoding) {
        pDict->SetAt(FX_BSTRC("Encoding"), pEncoding->Realize());
    }
    m_pPDFDoc->AddIndirectObject(pDict);
    CPDF_Font* pFont = CPDF_Font::CreateFontF(m_pPDFDoc, pDict);
    if (!pFont) {
        return nullptr;
    }
    CPDF_CountedFont* fontData = new CPDF_CountedFont(pFont);
    m_FontMap[pDict] = fontData;
    return fontData->AddRef();
}

void CPDF_DocPageData::ReleaseFont(CPDF_Dictionary* pFontDict)
{
    if (!pFontDict)
        return;

    auto it = m_FontMap.find(pFontDict);
    if (it == m_FontMap.end())
        return;

    CPDF_CountedFont* fontData = it->second;
    if (fontData->get()) {
        fontData->RemoveRef();
        if (fontData->use_count() == 0) {
            fontData->clear();
        }
    }
}

CPDF_ColorSpace* CPDF_DocPageData::GetColorSpace(CPDF_Object* pCSObj, CPDF_Dictionary* pResources)
{
    if (!pCSObj) {
        return NULL;
    }
    if (pCSObj->GetType() == PDFOBJ_NAME) {
        CFX_ByteString name = pCSObj->GetConstString();
        CPDF_ColorSpace* pCS = _CSFromName(name);
        if (!pCS && pResources) {
            CPDF_Dictionary* pList = pResources->GetDict(FX_BSTRC("ColorSpace"));
            if (pList) {
                pCSObj = pList->GetElementValue(name);
                return GetColorSpace(pCSObj, NULL);
            }
        }
        if (pCS == NULL || pResources == NULL) {
            return pCS;
        }
        CPDF_Dictionary* pColorSpaces = pResources->GetDict(FX_BSTRC("ColorSpace"));
        if (pColorSpaces == NULL) {
            return pCS;
        }
        CPDF_Object* pDefaultCS = NULL;
        switch (pCS->GetFamily()) {
            case PDFCS_DEVICERGB:
                pDefaultCS = pColorSpaces->GetElementValue(FX_BSTRC("DefaultRGB"));
                break;
            case PDFCS_DEVICEGRAY:
                pDefaultCS = pColorSpaces->GetElementValue(FX_BSTRC("DefaultGray"));
                break;
            case PDFCS_DEVICECMYK:
                pDefaultCS = pColorSpaces->GetElementValue(FX_BSTRC("DefaultCMYK"));
                break;
        }
        if (pDefaultCS == NULL) {
            return pCS;
        }
        return GetColorSpace(pDefaultCS, NULL);
    }

    if (pCSObj->GetType() != PDFOBJ_ARRAY)
        return nullptr;
    CPDF_Array* pArray = (CPDF_Array*)pCSObj;
    if (pArray->GetCount() == 0)
        return nullptr;
    if (pArray->GetCount() == 1)
        return GetColorSpace(pArray->GetElementValue(0), pResources);

    CPDF_CountedColorSpace* csData = nullptr;
    auto it = m_ColorSpaceMap.find(pCSObj);
    if (it != m_ColorSpaceMap.end()) {
        csData = it->second;
        if (csData->get()) {
            return csData->AddRef();
        }
    }

    CPDF_ColorSpace* pCS = CPDF_ColorSpace::Load(m_pPDFDoc, pArray);
    if (!pCS)
        return nullptr;

    if (!csData) {
        csData = new CPDF_CountedColorSpace(pCS);
        m_ColorSpaceMap[pCSObj] = csData;
    } else {
        csData->reset(pCS);
    }
    return csData->AddRef();
}

CPDF_ColorSpace* CPDF_DocPageData::GetCopiedColorSpace(CPDF_Object* pCSObj)
{
    if (!pCSObj)
        return nullptr;

    auto it = m_ColorSpaceMap.find(pCSObj);
    if (it != m_ColorSpaceMap.end())
        return it->second->AddRef();

    return nullptr;
}

void CPDF_DocPageData::ReleaseColorSpace(CPDF_Object* pColorSpace)
{
    if (!pColorSpace)
        return;

    auto it = m_ColorSpaceMap.find(pColorSpace);
    if (it == m_ColorSpaceMap.end())
        return;

    CPDF_CountedColorSpace* csData = it->second;
    if (csData->get()) {
        csData->RemoveRef();
        if (csData->use_count() == 0) {
            csData->get()->ReleaseCS();
            csData->reset(nullptr);
        }
    }
}

CPDF_Pattern* CPDF_DocPageData::GetPattern(CPDF_Object* pPatternObj, FX_BOOL bShading, const CFX_AffineMatrix* matrix)
{
    if (!pPatternObj)
        return nullptr;

    CPDF_CountedPattern* ptData = nullptr;
    auto it = m_PatternMap.find(pPatternObj);
    if (it != m_PatternMap.end()) {
        ptData = it->second;
        if (ptData->get()) {
            return ptData->AddRef();
        }
    }
    CPDF_Pattern* pPattern = nullptr;
    if (bShading) {
        pPattern = new CPDF_ShadingPattern(m_pPDFDoc, pPatternObj, bShading, matrix);
    } else {
        CPDF_Dictionary* pDict = pPatternObj ? pPatternObj->GetDict() : nullptr;
        if (pDict) {
            int type = pDict->GetInteger(FX_BSTRC("PatternType"));
            if (type == 1) {
                pPattern = new CPDF_TilingPattern(m_pPDFDoc, pPatternObj, matrix);
            } else if (type == 2) {
                pPattern = new CPDF_ShadingPattern(m_pPDFDoc, pPatternObj, FALSE, matrix);
            }
        }
    }
    if (!pPattern)
        return nullptr;

    if (!ptData) {
        ptData = new CPDF_CountedPattern(pPattern);
        m_PatternMap[pPatternObj] = ptData;
    } else {
        ptData->reset(pPattern);
    }
    return ptData->AddRef();
}

void CPDF_DocPageData::ReleasePattern(CPDF_Object* pPatternObj)
{
    if (!pPatternObj)
        return;

    auto it = m_PatternMap.find(pPatternObj);
    if (it == m_PatternMap.end())
        return;

    CPDF_CountedPattern* ptData = it->second;
    if (ptData->get()) {
        ptData->RemoveRef();
        if (ptData->use_count() == 0) {
            ptData->clear();
        }
    }
}

CPDF_Image* CPDF_DocPageData::GetImage(CPDF_Object* pImageStream)
{
    if (!pImageStream)
        return nullptr;

    const FX_DWORD dwImageObjNum = pImageStream->GetObjNum();
    auto it = m_ImageMap.find(dwImageObjNum);
    if (it != m_ImageMap.end()) {
        return it->second->AddRef();
    }

    CPDF_Image* pImage = new CPDF_Image(m_pPDFDoc);
    pImage->LoadImageF((CPDF_Stream*)pImageStream, FALSE);

    CPDF_CountedImage* imageData = new CPDF_CountedImage(pImage);
    m_ImageMap[dwImageObjNum] = imageData;
    return imageData->AddRef();
}

void CPDF_DocPageData::ReleaseImage(CPDF_Object* pImageStream)
{
    if (!pImageStream || !pImageStream->GetObjNum())
        return;

    auto it = m_ImageMap.find(pImageStream->GetObjNum());
    if (it == m_ImageMap.end())
        return;

    CPDF_CountedImage* image = it->second;
    if (!image)
        return;

    image->RemoveRef();
    if (image->use_count() == 0) {
        delete image->get();
        delete image;
        m_ImageMap.erase(it);
    }
}

CPDF_IccProfile* CPDF_DocPageData::GetIccProfile(CPDF_Stream* pIccProfileStream)
{
    if (!pIccProfileStream)
        return NULL;

    auto it = m_IccProfileMap.find(pIccProfileStream);
    if (it != m_IccProfileMap.end()) {
        return it->second->AddRef();
    }

    CPDF_StreamAcc stream;
    stream.LoadAllData(pIccProfileStream, FALSE);
    uint8_t digest[20];
    CPDF_Stream* pCopiedStream = nullptr;
    CRYPT_SHA1Generate(stream.GetData(), stream.GetSize(), digest);
    if (m_HashProfileMap.Lookup(CFX_ByteStringC(digest, 20), (void*&)pCopiedStream)) {
        auto it_copied_stream = m_IccProfileMap.find(pCopiedStream);
        return it_copied_stream->second->AddRef();
    }
    CPDF_IccProfile* pProfile = new CPDF_IccProfile(stream.GetData(), stream.GetSize());
    CPDF_CountedIccProfile* ipData = new CPDF_CountedIccProfile(pProfile);
    m_IccProfileMap[pIccProfileStream] = ipData;
    m_HashProfileMap.SetAt(CFX_ByteStringC(digest, 20), pIccProfileStream);
    return ipData->AddRef();
}

void CPDF_DocPageData::ReleaseIccProfile(CPDF_IccProfile* pIccProfile)
{
    ASSERT(pIccProfile);

    for (auto it = m_IccProfileMap.begin(); it != m_IccProfileMap.end(); ++it) {
        CPDF_CountedIccProfile* profile = it->second;
        if (profile->get() != pIccProfile)
            continue;

        profile->RemoveRef();
        if (profile->use_count() == 0) {
            delete profile->get();
            delete profile;
            m_IccProfileMap.erase(it);
            return;
        }
    }
}

CPDF_StreamAcc* CPDF_DocPageData::GetFontFileStreamAcc(CPDF_Stream* pFontStream)
{
    ASSERT(pFontStream);

    auto it = m_FontFileMap.find(pFontStream);
    if (it != m_FontFileMap.end())
        return it->second->AddRef();

    CPDF_Dictionary* pFontDict = pFontStream->GetDict();
    int32_t org_size = pFontDict->GetInteger(FX_BSTRC("Length1")) +
                       pFontDict->GetInteger(FX_BSTRC("Length2")) +
                       pFontDict->GetInteger(FX_BSTRC("Length3"));
    if (org_size < 0)
        org_size = 0;

    CPDF_StreamAcc* pFontFile = new CPDF_StreamAcc;
    pFontFile->LoadAllData(pFontStream, FALSE, org_size);

    CPDF_CountedStreamAcc* ftData = new CPDF_CountedStreamAcc(pFontFile);
    m_FontFileMap[pFontStream] = ftData;
    return ftData->AddRef();
}

void CPDF_DocPageData::ReleaseFontFileStreamAcc(CPDF_Stream* pFontStream, FX_BOOL bForce)
{
    if (!pFontStream)
        return;

    auto it = m_FontFileMap.find(pFontStream);
    if (it == m_FontFileMap.end())
        return;

    CPDF_CountedStreamAcc* findData = it->second;
    if (!findData)
        return;

    findData->RemoveRef();
    if (findData->use_count() == 0 || bForce) {
        delete findData->get();
        delete findData;
        m_FontFileMap.erase(it);
    }
}

CPDF_CountedColorSpace* CPDF_DocPageData::FindColorSpacePtr(CPDF_Object* pCSObj) const
{
    if (!pCSObj)
        return nullptr;

    auto it = m_ColorSpaceMap.find(pCSObj);
    return it != m_ColorSpaceMap.end() ? it->second : nullptr;
}

CPDF_CountedPattern* CPDF_DocPageData::FindPatternPtr(CPDF_Object* pPatternObj) const
{
    if (!pPatternObj)
        return nullptr;

    auto it = m_PatternMap.find(pPatternObj);
    return it != m_PatternMap.end() ? it->second : nullptr;
}
