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