// 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/fpdfdoc/fpdf_doc.h"
static const int FPDFDOC_UTILS_MAXRECURSION = 32;
CFX_WideString	GetFullName(CPDF_Dictionary* pFieldDict);
void			InitInterFormDict(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument);
FX_DWORD		CountInterFormFonts(CPDF_Dictionary* pFormDict);
CPDF_Font*		GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, FX_DWORD index, CFX_ByteString& csNameTag);
CPDF_Font*		GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csNameTag);
CPDF_Font*		GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csFontName, CFX_ByteString& csNameTag);
CPDF_Font*		GetNativeInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, FX_BYTE charSet, CFX_ByteString& csNameTag);
CPDF_Font*		GetNativeInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString& csNameTag);
FX_BOOL			FindInterFormFont(CPDF_Dictionary* pFormDict, const CPDF_Font* pFont, CFX_ByteString& csNameTag);
FX_BOOL			FindInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csFontName, CPDF_Font*& pFont, CFX_ByteString& csNameTag);
void			AddInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, const CPDF_Font* pFont, CFX_ByteString& csNameTag);
CPDF_Font*		AddNativeInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, FX_BYTE charSet, CFX_ByteString& csNameTag);
CPDF_Font*		AddNativeInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, CFX_ByteString& csNameTag);
void			RemoveInterFormFont(CPDF_Dictionary* pFormDict, const CPDF_Font* pFont);
void			RemoveInterFormFont(CPDF_Dictionary* pFormDict, CFX_ByteString csNameTag);
CPDF_Font*		GetDefaultInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument);
void			SetDefaultInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, const CPDF_Font* pFont);
void			SaveCheckedFieldStatus(CPDF_FormField* pField, CFX_ByteArray& statusArray);
FX_BOOL			NeedPDFEncodeForFieldFullName(const CFX_WideString& csFieldName);
FX_BOOL			NeedPDFEncodeForFieldTree(CPDF_Dictionary* pFieldDict, int nLevel = 0);
void			EncodeFieldName(const CFX_WideString& csName, CFX_ByteString& csT);
void			UpdateEncodeFieldName(CPDF_Dictionary* pFieldDict, int nLevel = 0);
CFX_WideString GetFullName(CPDF_Dictionary* pFieldDict)
{
    CFX_WideString full_name;
    CPDF_Dictionary* pLevel = pFieldDict;
    while (pLevel) {
        CFX_WideString short_name = pLevel->GetUnicodeText("T");
        if (short_name != L"") {
            if (full_name == L"") {
                full_name = short_name;
            } else {
                full_name = short_name + L"." + full_name;
            }
        }
        pLevel = pLevel->GetDict("Parent");
    }
    return full_name;
}
FX_BOOL CPDF_DefaultAppearance::HasFont()
{
    if (m_csDA.IsEmpty()) {
        return FALSE;
    }
    CPDF_SimpleParser syntax(m_csDA);
    return syntax.FindTagParam("Tf", 2);
}
CFX_ByteString CPDF_DefaultAppearance::GetFontString()
{
    CFX_ByteString csFont;
    if (m_csDA.IsEmpty()) {
        return csFont;
    }
    CPDF_SimpleParser syntax(m_csDA);
    if (syntax.FindTagParam("Tf", 2)) {
        csFont += (CFX_ByteString)syntax.GetWord();
        csFont += " ";
        csFont += (CFX_ByteString)syntax.GetWord();
        csFont += " ";
        csFont += (CFX_ByteString)syntax.GetWord();
    }
    return csFont;
}
void CPDF_DefaultAppearance::GetFont(CFX_ByteString& csFontNameTag, FX_FLOAT& fFontSize)
{
    csFontNameTag = "";
    fFontSize = 0;
    if (m_csDA.IsEmpty()) {
        return;
    }
    CPDF_SimpleParser syntax(m_csDA);
    if (syntax.FindTagParam("Tf", 2)) {
        csFontNameTag = (CFX_ByteString)syntax.GetWord();
        csFontNameTag.Delete(0, 1);
        fFontSize = FX_atof((CFX_ByteString)syntax.GetWord());
    }
    csFontNameTag = PDF_NameDecode(csFontNameTag);
}
FX_BOOL CPDF_DefaultAppearance::HasColor(FX_BOOL bStrokingOperation)
{
    if (m_csDA.IsEmpty()) {
        return FALSE;
    }
    CPDF_SimpleParser syntax(m_csDA);
    if (syntax.FindTagParam(bStrokingOperation ? "G" : "g", 1)) {
        return TRUE;
    }
    syntax.SetPos(0);
    if (syntax.FindTagParam(bStrokingOperation ? "RG" : "rg", 3)) {
        return TRUE;
    }
    syntax.SetPos(0);
    return syntax.FindTagParam(bStrokingOperation ? "K" : "k", 4);
}
CFX_ByteString CPDF_DefaultAppearance::GetColorString(FX_BOOL bStrokingOperation)
{
    CFX_ByteString csColor;
    if (m_csDA.IsEmpty()) {
        return csColor;
    }
    CPDF_SimpleParser syntax(m_csDA);
    if (syntax.FindTagParam(bStrokingOperation ? "G" : "g", 1)) {
        csColor += (CFX_ByteString)syntax.GetWord();
        csColor += " ";
        csColor += (CFX_ByteString)syntax.GetWord();
        return csColor;
    }
    syntax.SetPos(0);
    if (syntax.FindTagParam(bStrokingOperation ? "RG" : "rg", 3)) {
        csColor += (CFX_ByteString)syntax.GetWord();
        csColor += " ";
        csColor += (CFX_ByteString)syntax.GetWord();
        csColor += " ";
        csColor += (CFX_ByteString)syntax.GetWord();
        csColor += " ";
        csColor += (CFX_ByteString)syntax.GetWord();
        return csColor;
    }
    syntax.SetPos(0);
    if (syntax.FindTagParam(bStrokingOperation ? "K" : "k", 4)) {
        csColor += (CFX_ByteString)syntax.GetWord();
        csColor += " ";
        csColor += (CFX_ByteString)syntax.GetWord();
        csColor += " ";
        csColor += (CFX_ByteString)syntax.GetWord();
        csColor += " ";
        csColor += (CFX_ByteString)syntax.GetWord();
        csColor += " ";
        csColor += (CFX_ByteString)syntax.GetWord();
    }
    return csColor;
}
void CPDF_DefaultAppearance::GetColor(int& iColorType, FX_FLOAT fc[4], FX_BOOL bStrokingOperation)
{
    iColorType = COLORTYPE_TRANSPARENT;
    for (int c = 0; c < 4; c ++) {
        fc[c] = 0;
    }
    if (m_csDA.IsEmpty()) {
        return;
    }
    CPDF_SimpleParser syntax(m_csDA);
    if (syntax.FindTagParam(bStrokingOperation ? "G" : "g", 1)) {
        iColorType = COLORTYPE_GRAY;
        fc[0] = FX_atof((CFX_ByteString)syntax.GetWord());
        return;
    }
    syntax.SetPos(0);
    if (syntax.FindTagParam(bStrokingOperation ? "RG" : "rg", 3)) {
        iColorType = COLORTYPE_RGB;
        fc[0] = FX_atof((CFX_ByteString)syntax.GetWord());
        fc[1] = FX_atof((CFX_ByteString)syntax.GetWord());
        fc[2] = FX_atof((CFX_ByteString)syntax.GetWord());
        return;
    }
    syntax.SetPos(0);
    if (syntax.FindTagParam(bStrokingOperation ? "K" : "k", 4)) {
        iColorType = COLORTYPE_CMYK;
        fc[0] = FX_atof((CFX_ByteString)syntax.GetWord());
        fc[1] = FX_atof((CFX_ByteString)syntax.GetWord());
        fc[2] = FX_atof((CFX_ByteString)syntax.GetWord());
        fc[3] = FX_atof((CFX_ByteString)syntax.GetWord());
    }
}
void CPDF_DefaultAppearance::GetColor(FX_ARGB& color, int& iColorType, FX_BOOL bStrokingOperation)
{
    color = 0;
    iColorType = COLORTYPE_TRANSPARENT;
    if (m_csDA.IsEmpty()) {
        return;
    }
    CPDF_SimpleParser syntax(m_csDA);
    if (syntax.FindTagParam(bStrokingOperation ? "G" : "g", 1)) {
        iColorType = COLORTYPE_GRAY;
        FX_FLOAT g = FX_atof((CFX_ByteString)syntax.GetWord()) * 255 + 0.5f;
        color = ArgbEncode(255, (int)g, (int)g, (int)g);
        return;
    }
    syntax.SetPos(0);
    if (syntax.FindTagParam(bStrokingOperation ? "RG" : "rg", 3)) {
        iColorType = COLORTYPE_RGB;
        FX_FLOAT r = FX_atof((CFX_ByteString)syntax.GetWord()) * 255 + 0.5f;
        FX_FLOAT g = FX_atof((CFX_ByteString)syntax.GetWord()) * 255 + 0.5f;
        FX_FLOAT b = FX_atof((CFX_ByteString)syntax.GetWord()) * 255 + 0.5f;
        color = ArgbEncode(255, (int)r, (int)g, (int)b);
        return;
    }
    syntax.SetPos(0);
    if (syntax.FindTagParam(bStrokingOperation ? "K" : "k", 4)) {
        iColorType = COLORTYPE_CMYK;
        FX_FLOAT c = FX_atof((CFX_ByteString)syntax.GetWord());
        FX_FLOAT m = FX_atof((CFX_ByteString)syntax.GetWord());
        FX_FLOAT y = FX_atof((CFX_ByteString)syntax.GetWord());
        FX_FLOAT k = FX_atof((CFX_ByteString)syntax.GetWord());
        FX_FLOAT r = 1.0f - FX_MIN(1.0f, c + k);
        FX_FLOAT g = 1.0f - FX_MIN(1.0f, m + k);
        FX_FLOAT b = 1.0f - FX_MIN(1.0f, y + k);
        color = ArgbEncode(255, (int)(r * 255 + 0.5f), (int)(g * 255 + 0.5f), (int)(b * 255 + 0.5f));
    }
}
FX_BOOL CPDF_DefaultAppearance::HasTextMatrix()
{
    if (m_csDA.IsEmpty()) {
        return FALSE;
    }
    CPDF_SimpleParser syntax(m_csDA);
    return syntax.FindTagParam("Tm", 6);
}
CFX_ByteString CPDF_DefaultAppearance::GetTextMatrixString()
{
    CFX_ByteString csTM;
    if (m_csDA.IsEmpty()) {
        return csTM;
    }
    CPDF_SimpleParser syntax(m_csDA);
    if (syntax.FindTagParam("Tm", 6)) {
        for (int i = 0; i < 6; i ++) {
            csTM += (CFX_ByteString)syntax.GetWord();
            csTM += " ";
        }
        csTM += (CFX_ByteString)syntax.GetWord();
    }
    return csTM;
}
CFX_AffineMatrix CPDF_DefaultAppearance::GetTextMatrix()
{
    CFX_AffineMatrix tm;
    if (m_csDA.IsEmpty()) {
        return tm;
    }
    CPDF_SimpleParser syntax(m_csDA);
    if (syntax.FindTagParam("Tm", 6)) {
        FX_FLOAT f[6];
        for (int i = 0; i < 6; i ++) {
            f[i] = FX_atof((CFX_ByteString)syntax.GetWord());
        }
        tm.Set(f[0], f[1], f[2], f[3], f[4], f[5]);
    }
    return tm;
}
void InitInterFormDict(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument)
{
    if (pDocument == NULL) {
        return;
    }
    if (pFormDict == NULL) {
        pFormDict = CPDF_Dictionary::Create();
        if (pFormDict == NULL) {
            return;
        }
        FX_DWORD dwObjNum = pDocument->AddIndirectObject(pFormDict);
        CPDF_Dictionary* pRoot = pDocument->GetRoot();
        pRoot->SetAtReference("AcroForm", pDocument, dwObjNum);
    }
    CFX_ByteString csDA;
    if (!pFormDict->KeyExist("DR")) {
        CPDF_Font* pFont = NULL;
        CFX_ByteString csBaseName, csDefault;
        FX_BYTE charSet = CPDF_InterForm::GetNativeCharSet();
        pFont = CPDF_InterForm::AddStandardFont(pDocument, "Helvetica");
        if (pFont != NULL) {
            AddInterFormFont(pFormDict, pDocument, pFont, csBaseName);
            csDefault = csBaseName;
        }
        if (charSet != 0) {
            CFX_ByteString csFontName = CPDF_InterForm::GetNativeFont(charSet, NULL);
            if (pFont == NULL || csFontName != "Helvetica") {
                pFont = CPDF_InterForm::AddNativeFont(pDocument);
                if (pFont != NULL) {
                    csBaseName = "";
                    AddInterFormFont(pFormDict, pDocument, pFont, csBaseName);
                    csDefault = csBaseName;
                }
            }
        }
        if (pFont != NULL) {
            csDA = "/" + PDF_NameEncode(csDefault) + " 0 Tf";
        }
    }
    if (!csDA.IsEmpty()) {
        csDA += " ";
    }
    csDA += "0 g";
    if (!pFormDict->KeyExist("DA")) {
        pFormDict->SetAtString("DA", csDA);
    }
}
FX_DWORD CountInterFormFonts(CPDF_Dictionary* pFormDict)
{
    if (pFormDict == NULL) {
        return 0;
    }
    CPDF_Dictionary* pDR = pFormDict->GetDict("DR");
    if (pDR == NULL) {
        return 0;
    }
    CPDF_Dictionary* pFonts = pDR->GetDict("Font");
    if (pFonts == NULL) {
        return 0;
    }
    FX_DWORD dwCount = 0;
    FX_POSITION pos = pFonts->GetStartPos();
    while (pos) {
        CPDF_Object* pObj = NULL;
        CFX_ByteString csKey;
        pObj = pFonts->GetNextElement(pos, csKey);
        if (pObj == NULL) {
            continue;
        }
        CPDF_Object* pDirect = pObj->GetDirect();
        if (pDirect != NULL && pDirect->GetType() == PDFOBJ_DICTIONARY) {
            if (((CPDF_Dictionary*)pDirect)->GetString("Type") == "Font") {
                dwCount ++;
            }
        }
    }
    return dwCount;
}
CPDF_Font* GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, FX_DWORD index, CFX_ByteString& csNameTag)
{
    if (pFormDict == NULL) {
        return NULL;
    }
    CPDF_Dictionary* pDR = pFormDict->GetDict("DR");
    if (pDR == NULL) {
        return NULL;
    }
    CPDF_Dictionary* pFonts = pDR->GetDict("Font");
    if (pFonts == NULL) {
        return NULL;
    }
    FX_DWORD dwCount = 0;
    FX_POSITION pos = pFonts->GetStartPos();
    while (pos) {
        CPDF_Object* pObj = NULL;
        CFX_ByteString csKey;
        pObj = pFonts->GetNextElement(pos, csKey);
        if (pObj == NULL) {
            continue;
        }
        CPDF_Object* pDirect = pObj->GetDirect();
        if (pDirect == NULL || pDirect->GetType() != PDFOBJ_DICTIONARY) {
            continue;
        }
        CPDF_Dictionary* pElement = (CPDF_Dictionary*)pDirect;
        if (pElement->GetString("Type") != "Font") {
            continue;
        }
        if (dwCount == index) {
            csNameTag = csKey;
            return pDocument->LoadFont(pElement);
        }
        dwCount ++;
    }
    return NULL;
}
CPDF_Font* GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csNameTag)
{
    CFX_ByteString csAlias = PDF_NameDecode(csNameTag);
    if (pFormDict == NULL || csAlias.IsEmpty()) {
        return NULL;
    }
    CPDF_Dictionary* pDR = pFormDict->GetDict("DR");
    if (pDR == NULL) {
        return NULL;
    }
    CPDF_Dictionary* pFonts = pDR->GetDict("Font");
    if (pFonts == NULL) {
        return NULL;
    }
    CPDF_Dictionary* pElement = pFonts->GetDict(csAlias);
    if (pElement == NULL) {
        return NULL;
    }
    if (pElement->GetString("Type") == "Font") {
        return pDocument->LoadFont(pElement);
    }
    return NULL;
}
CPDF_Font* GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csFontName, CFX_ByteString& csNameTag)
{
    if (pFormDict == NULL || csFontName.IsEmpty()) {
        return NULL;
    }
    CPDF_Dictionary* pDR = pFormDict->GetDict("DR");
    if (pDR == NULL) {
        return NULL;
    }
    CPDF_Dictionary* pFonts = pDR->GetDict("Font");
    if (pFonts == NULL) {
        return NULL;
    }
    FX_POSITION pos = pFonts->GetStartPos();
    while (pos) {
        CPDF_Object* pObj = NULL;
        CFX_ByteString csKey;
        pObj = pFonts->GetNextElement(pos, csKey);
        if (pObj == NULL) {
            continue;
        }
        CPDF_Object* pDirect = pObj->GetDirect();
        if (pDirect == NULL || pDirect->GetType() != PDFOBJ_DICTIONARY) {
            continue;
        }
        CPDF_Dictionary* pElement = (CPDF_Dictionary*)pDirect;
        if (pElement->GetString("Type") != "Font") {
            continue;
        }
        CPDF_Font* pFind = pDocument->LoadFont(pElement);
        if (pFind == NULL) {
            continue;
        }
        CFX_ByteString csBaseFont;
        csBaseFont = pFind->GetBaseFont();
        csBaseFont.Remove(' ');
        if (csBaseFont == csFontName) {
            csNameTag = csKey;
            return pFind;
        }
    }
    return NULL;
}
CPDF_Font* GetNativeInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, FX_BYTE charSet, CFX_ByteString& csNameTag)
{
    if (pFormDict == NULL) {
        return NULL;
    }
    CPDF_Dictionary* pDR = pFormDict->GetDict("DR");
    if (pDR == NULL) {
        return NULL;
    }
    CPDF_Dictionary* pFonts = pDR->GetDict("Font");
    if (pFonts == NULL) {
        return NULL;
    }
    FX_POSITION pos = pFonts->GetStartPos();
    while (pos) {
        CPDF_Object* pObj = NULL;
        CFX_ByteString csKey;
        pObj = pFonts->GetNextElement(pos, csKey);
        if (pObj == NULL) {
            continue;
        }
        CPDF_Object* pDirect = pObj->GetDirect();
        if (pDirect == NULL || pDirect->GetType() != PDFOBJ_DICTIONARY) {
            continue;
        }
        CPDF_Dictionary* pElement = (CPDF_Dictionary*)pDirect;
        if (pElement->GetString("Type") != "Font") {
            continue;
        }
        CPDF_Font* pFind = pDocument->LoadFont(pElement);
        if (pFind == NULL) {
            continue;
        }
        CFX_SubstFont* pSubst = (CFX_SubstFont*)pFind->GetSubstFont();
        if (pSubst == NULL) {
            continue;
        }
        if (pSubst->m_Charset == (int)charSet) {
            csNameTag = csKey;
            return pFind;
        }
    }
    return NULL;
}
CPDF_Font* GetNativeInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString& csNameTag)
{
    csNameTag = "";
    FX_BYTE charSet = CPDF_InterForm::GetNativeCharSet();
    CFX_SubstFont* pSubst;
    CPDF_Font* pFont = GetDefaultInterFormFont(pFormDict, pDocument);
    if (pFont != NULL) {
        pSubst = (CFX_SubstFont*)pFont->GetSubstFont();
        if (pSubst != NULL && pSubst->m_Charset == (int)charSet) {
            FindInterFormFont(pFormDict, pFont, csNameTag);
            return pFont;
        }
    }
    return GetNativeInterFormFont(pFormDict, pDocument, charSet, csNameTag);
}
FX_BOOL FindInterFormFont(CPDF_Dictionary* pFormDict, const CPDF_Font* pFont, CFX_ByteString& csNameTag)
{
    if (pFormDict == NULL || pFont == NULL) {
        return FALSE;
    }
    CPDF_Dictionary* pDR = pFormDict->GetDict("DR");
    if (pDR == NULL) {
        return FALSE;
    }
    CPDF_Dictionary* pFonts = pDR->GetDict("Font");
    if (pFonts == NULL) {
        return FALSE;
    }
    FX_POSITION pos = pFonts->GetStartPos();
    while (pos) {
        CPDF_Object* pObj = NULL;
        CFX_ByteString csKey;
        pObj = pFonts->GetNextElement(pos, csKey);
        if (pObj == NULL) {
            continue;
        }
        CPDF_Object* pDirect = pObj->GetDirect();
        if (pDirect == NULL || pDirect->GetType() != PDFOBJ_DICTIONARY) {
            continue;
        }
        CPDF_Dictionary* pElement = (CPDF_Dictionary*)pDirect;
        if (pElement->GetString("Type") != "Font") {
            continue;
        }
        if (pFont->GetFontDict() == pElement) {
            csNameTag = csKey;
            return TRUE;
        }
    }
    return FALSE;
}
FX_BOOL FindInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csFontName, CPDF_Font*& pFont, CFX_ByteString& csNameTag)
{
    if (pFormDict == NULL) {
        return FALSE;
    }
    CPDF_Dictionary* pDR = pFormDict->GetDict("DR");
    if (pDR == NULL) {
        return FALSE;
    }
    CPDF_Dictionary* pFonts = pDR->GetDict("Font");
    if (pFonts == NULL) {
        return FALSE;
    }
    if (csFontName.GetLength() > 0) {
        csFontName.Remove(' ');
    }
    FX_POSITION pos = pFonts->GetStartPos();
    while (pos) {
        CPDF_Object* pObj = NULL;
        CFX_ByteString csKey, csTmp;
        pObj = pFonts->GetNextElement(pos, csKey);
        if (pObj == NULL) {
            continue;
        }
        CPDF_Object* pDirect = pObj->GetDirect();
        if (pDirect == NULL || pDirect->GetType() != PDFOBJ_DICTIONARY) {
            continue;
        }
        CPDF_Dictionary* pElement = (CPDF_Dictionary*)pDirect;
        if (pElement->GetString("Type") != "Font") {
            continue;
        }
        pFont = pDocument->LoadFont(pElement);
        if (pFont == NULL) {
            continue;
        }
        CFX_ByteString csBaseFont;
        csBaseFont = pFont->GetBaseFont();
        csBaseFont.Remove(' ');
        if (csBaseFont == csFontName) {
            csNameTag = csKey;
            return TRUE;
        }
    }
    return FALSE;
}
void AddInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, const CPDF_Font* pFont, CFX_ByteString& csNameTag)
{
    if (pFont == NULL) {
        return;
    }
    if (pFormDict == NULL) {
        InitInterFormDict(pFormDict, pDocument);
    }
    CFX_ByteString csTag;
    if (FindInterFormFont(pFormDict, pFont, csTag)) {
        csNameTag = csTag;
        return;
    }
    if (pFormDict == NULL) {
        InitInterFormDict(pFormDict, pDocument);
    }
    CPDF_Dictionary* pDR = pFormDict->GetDict("DR");
    if (pDR == NULL) {
        pDR = CPDF_Dictionary::Create();
        if (pDR == NULL) {
            return;
        }
        pFormDict->SetAt("DR", pDR);
    }
    CPDF_Dictionary* pFonts = pDR->GetDict("Font");
    if (pFonts == NULL) {
        pFonts = CPDF_Dictionary::Create();
        pDR->SetAt("Font", pFonts);
    }
    if (csNameTag.IsEmpty()) {
        csNameTag = pFont->GetBaseFont();
    }
    csNameTag.Remove(' ');
    csNameTag = CPDF_InterForm::GenerateNewResourceName(pDR, "Font", 4, csNameTag);
    pFonts->SetAtReference(csNameTag, pDocument, pFont->GetFontDict());
}
CPDF_Font* AddNativeInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, FX_BYTE charSet, CFX_ByteString& csNameTag)
{
    if (pFormDict == NULL) {
        InitInterFormDict(pFormDict, pDocument);
    }
    CFX_ByteString csTemp;
    CPDF_Font* pFont = GetNativeInterFormFont(pFormDict, pDocument, charSet, csTemp);
    if (pFont != NULL) {
        csNameTag = csTemp;
        return pFont;
    }
    CFX_ByteString csFontName = CPDF_InterForm::GetNativeFont(charSet);
    if (!csFontName.IsEmpty()) {
        if (FindInterFormFont(pFormDict, pDocument, csFontName, pFont, csNameTag)) {
            return pFont;
        }
    }
    pFont = CPDF_InterForm::AddNativeFont(charSet, pDocument);
    if (pFont != NULL) {
        AddInterFormFont(pFormDict, pDocument, pFont, csNameTag);
    }
    return pFont;
}
CPDF_Font* AddNativeInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, CFX_ByteString& csNameTag)
{
    FX_BYTE charSet = CPDF_InterForm::GetNativeCharSet();
    return AddNativeInterFormFont(pFormDict, pDocument, charSet, csNameTag);
}
void RemoveInterFormFont(CPDF_Dictionary* pFormDict, const CPDF_Font* pFont)
{
    if (pFormDict == NULL || pFont == NULL) {
        return;
    }
    CFX_ByteString csTag;
    if (!FindInterFormFont(pFormDict, pFont, csTag)) {
        return;
    }
    CPDF_Dictionary* pDR = pFormDict->GetDict("DR");
    CPDF_Dictionary* pFonts = pDR->GetDict("Font");
    pFonts->RemoveAt(csTag);
}
void RemoveInterFormFont(CPDF_Dictionary* pFormDict, CFX_ByteString csNameTag)
{
    if (pFormDict == NULL || csNameTag.IsEmpty()) {
        return;
    }
    CPDF_Dictionary* pDR = pFormDict->GetDict("DR");
    if (pDR == NULL) {
        return;
    }
    CPDF_Dictionary* pFonts = pDR->GetDict("Font");
    if (pFonts == NULL) {
        return;
    }
    pFonts->RemoveAt(csNameTag);
}
CPDF_Font* GetDefaultInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument)
{
    if (pFormDict == NULL) {
        return NULL;
    }
    CPDF_DefaultAppearance cDA = pFormDict->GetString("DA");
    CFX_ByteString csFontNameTag;
    FX_FLOAT fFontSize;
    cDA.GetFont(csFontNameTag, fFontSize);
    return GetInterFormFont(pFormDict, pDocument, csFontNameTag);
}
CPDF_IconFit::ScaleMethod CPDF_IconFit::GetScaleMethod()
{
    if (m_pDict == NULL) {
        return Always;
    }
    CFX_ByteString csSW = m_pDict->GetString("SW", "A");
    if (csSW == "B") {
        return Bigger;
    } else if (csSW == "S") {
        return Smaller;
    } else if (csSW == "N") {
        return Never;
    }
    return Always;
}
FX_BOOL CPDF_IconFit::IsProportionalScale()
{
    if (m_pDict == NULL) {
        return TRUE;
    }
    return m_pDict->GetString("S", "P") != "A";
}
void CPDF_IconFit::GetIconPosition(FX_FLOAT& fLeft, FX_FLOAT& fBottom)
{
    fLeft = fBottom = 0.5;
    if (m_pDict == NULL) {
        return;
    }
    CPDF_Array* pA = m_pDict->GetArray("A");
    if (pA != NULL) {
        FX_DWORD dwCount = pA->GetCount();
        if (dwCount > 0) {
            fLeft = pA->GetNumber(0);
        }
        if (dwCount > 1) {
            fBottom = pA->GetNumber(1);
        }
    }
}
FX_BOOL CPDF_IconFit::GetFittingBounds()
{
    if (m_pDict == NULL) {
        return FALSE;
    }
    return m_pDict->GetBoolean("FB");
}
void SaveCheckedFieldStatus(CPDF_FormField* pField, CFX_ByteArray& statusArray)
{
    int iCount = pField->CountControls();
    for (int i = 0; i < iCount; i ++) {
        CPDF_FormControl* pControl = pField->GetControl(i);
        if (pControl == NULL) {
            continue;
        }
        statusArray.Add(pControl->IsChecked() ? 1 : 0);
    }
}
CPDF_Object* FPDF_GetFieldAttr(CPDF_Dictionary* pFieldDict, const FX_CHAR* name, int nLevel)
{
    if (nLevel > FPDFDOC_UTILS_MAXRECURSION) {
        return NULL;
    }
    if (pFieldDict == NULL) {
        return NULL;
    }
    CPDF_Object* pAttr = pFieldDict->GetElementValue(name);
    if (pAttr) {
        return pAttr;
    }
    CPDF_Dictionary* pParent = pFieldDict->GetDict("Parent");
    if (pParent == NULL) {
        return NULL;
    }
    return FPDF_GetFieldAttr(pParent, name, nLevel + 1);
}
