1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved.
2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Use of this source code is governed by a BSD-style license that can be
3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// found in the LICENSE file.
4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/fpdfdoc/fpdf_doc.h"
8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic const int FPDFDOC_UTILS_MAXRECURSION = 32;
9ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_WideString	GetFullName(CPDF_Dictionary* pFieldDict);
10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid			InitInterFormDict(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument);
11ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_DWORD		CountInterFormFonts(CPDF_Dictionary* pFormDict);
12ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font*		GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, FX_DWORD index, CFX_ByteString& csNameTag);
13ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font*		GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csNameTag);
14ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font*		GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csFontName, CFX_ByteString& csNameTag);
15ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font*		GetNativeInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, FX_BYTE charSet, CFX_ByteString& csNameTag);
16ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font*		GetNativeInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString& csNameTag);
17ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL			FindInterFormFont(CPDF_Dictionary* pFormDict, const CPDF_Font* pFont, CFX_ByteString& csNameTag);
18ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL			FindInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csFontName, CPDF_Font*& pFont, CFX_ByteString& csNameTag);
19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid			AddInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, const CPDF_Font* pFont, CFX_ByteString& csNameTag);
20ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font*		AddNativeInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, FX_BYTE charSet, CFX_ByteString& csNameTag);
21ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font*		AddNativeInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, CFX_ByteString& csNameTag);
22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid			RemoveInterFormFont(CPDF_Dictionary* pFormDict, const CPDF_Font* pFont);
23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid			RemoveInterFormFont(CPDF_Dictionary* pFormDict, CFX_ByteString csNameTag);
24ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font*		GetDefaultInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument);
25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid			SetDefaultInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, const CPDF_Font* pFont);
26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid			SaveCheckedFieldStatus(CPDF_FormField* pField, CFX_ByteArray& statusArray);
27ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL			NeedPDFEncodeForFieldFullName(const CFX_WideString& csFieldName);
28ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL			NeedPDFEncodeForFieldTree(CPDF_Dictionary* pFieldDict, int nLevel = 0);
29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid			EncodeFieldName(const CFX_WideString& csName, CFX_ByteString& csT);
30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid			UpdateEncodeFieldName(CPDF_Dictionary* pFieldDict, int nLevel = 0);
31ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_WideString GetFullName(CPDF_Dictionary* pFieldDict)
32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_WideString full_name;
34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Dictionary* pLevel = pFieldDict;
35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (pLevel) {
36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_WideString short_name = pLevel->GetUnicodeText("T");
37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (short_name != L"") {
38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (full_name == L"") {
39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                full_name = short_name;
40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            } else {
41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                full_name = short_name + L"." + full_name;
42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pLevel = pLevel->GetDict("Parent");
45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return full_name;
47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
48ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DefaultAppearance::HasFont()
49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_csDA.IsEmpty()) {
51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_SimpleParser syntax(m_csDA);
54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return syntax.FindTagParam("Tf", 2);
55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
56ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString CPDF_DefaultAppearance::GetFontString()
57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteString csFont;
59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_csDA.IsEmpty()) {
60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return csFont;
61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_SimpleParser syntax(m_csDA);
63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (syntax.FindTagParam("Tf", 2)) {
64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        csFont += (CFX_ByteString)syntax.GetWord();
65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        csFont += " ";
66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        csFont += (CFX_ByteString)syntax.GetWord();
67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        csFont += " ";
68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        csFont += (CFX_ByteString)syntax.GetWord();
69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return csFont;
71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_DefaultAppearance::GetFont(CFX_ByteString& csFontNameTag, FX_FLOAT& fFontSize)
73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    csFontNameTag = "";
75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    fFontSize = 0;
76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_csDA.IsEmpty()) {
77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_SimpleParser syntax(m_csDA);
80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (syntax.FindTagParam("Tf", 2)) {
81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        csFontNameTag = (CFX_ByteString)syntax.GetWord();
82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        csFontNameTag.Delete(0, 1);
83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        fFontSize = FX_atof((CFX_ByteString)syntax.GetWord());
84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    csFontNameTag = PDF_NameDecode(csFontNameTag);
86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
87ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DefaultAppearance::HasColor(FX_BOOL bStrokingOperation)
88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_csDA.IsEmpty()) {
90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_SimpleParser syntax(m_csDA);
93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (syntax.FindTagParam(bStrokingOperation ? "G" : "g", 1)) {
94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return TRUE;
95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    syntax.SetPos(0);
97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (syntax.FindTagParam(bStrokingOperation ? "RG" : "rg", 3)) {
98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return TRUE;
99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    syntax.SetPos(0);
101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return syntax.FindTagParam(bStrokingOperation ? "K" : "k", 4);
102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
103ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString CPDF_DefaultAppearance::GetColorString(FX_BOOL bStrokingOperation)
104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteString csColor;
106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_csDA.IsEmpty()) {
107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return csColor;
108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_SimpleParser syntax(m_csDA);
110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (syntax.FindTagParam(bStrokingOperation ? "G" : "g", 1)) {
111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        csColor += (CFX_ByteString)syntax.GetWord();
112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        csColor += " ";
113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        csColor += (CFX_ByteString)syntax.GetWord();
114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return csColor;
115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    syntax.SetPos(0);
117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (syntax.FindTagParam(bStrokingOperation ? "RG" : "rg", 3)) {
118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        csColor += (CFX_ByteString)syntax.GetWord();
119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        csColor += " ";
120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        csColor += (CFX_ByteString)syntax.GetWord();
121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        csColor += " ";
122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        csColor += (CFX_ByteString)syntax.GetWord();
123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        csColor += " ";
124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        csColor += (CFX_ByteString)syntax.GetWord();
125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return csColor;
126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    syntax.SetPos(0);
128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (syntax.FindTagParam(bStrokingOperation ? "K" : "k", 4)) {
129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        csColor += (CFX_ByteString)syntax.GetWord();
130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        csColor += " ";
131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        csColor += (CFX_ByteString)syntax.GetWord();
132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        csColor += " ";
133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        csColor += (CFX_ByteString)syntax.GetWord();
134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        csColor += " ";
135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        csColor += (CFX_ByteString)syntax.GetWord();
136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        csColor += " ";
137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        csColor += (CFX_ByteString)syntax.GetWord();
138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return csColor;
140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_DefaultAppearance::GetColor(int& iColorType, FX_FLOAT fc[4], FX_BOOL bStrokingOperation)
142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    iColorType = COLORTYPE_TRANSPARENT;
144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for (int c = 0; c < 4; c ++) {
145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        fc[c] = 0;
146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_csDA.IsEmpty()) {
148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_SimpleParser syntax(m_csDA);
151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (syntax.FindTagParam(bStrokingOperation ? "G" : "g", 1)) {
152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        iColorType = COLORTYPE_GRAY;
153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        fc[0] = FX_atof((CFX_ByteString)syntax.GetWord());
154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    syntax.SetPos(0);
157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (syntax.FindTagParam(bStrokingOperation ? "RG" : "rg", 3)) {
158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        iColorType = COLORTYPE_RGB;
159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        fc[0] = FX_atof((CFX_ByteString)syntax.GetWord());
160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        fc[1] = FX_atof((CFX_ByteString)syntax.GetWord());
161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        fc[2] = FX_atof((CFX_ByteString)syntax.GetWord());
162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    syntax.SetPos(0);
165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (syntax.FindTagParam(bStrokingOperation ? "K" : "k", 4)) {
166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        iColorType = COLORTYPE_CMYK;
167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        fc[0] = FX_atof((CFX_ByteString)syntax.GetWord());
168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        fc[1] = FX_atof((CFX_ByteString)syntax.GetWord());
169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        fc[2] = FX_atof((CFX_ByteString)syntax.GetWord());
170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        fc[3] = FX_atof((CFX_ByteString)syntax.GetWord());
171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_DefaultAppearance::GetColor(FX_ARGB& color, int& iColorType, FX_BOOL bStrokingOperation)
174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    color = 0;
176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    iColorType = COLORTYPE_TRANSPARENT;
177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_csDA.IsEmpty()) {
178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_SimpleParser syntax(m_csDA);
181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (syntax.FindTagParam(bStrokingOperation ? "G" : "g", 1)) {
182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        iColorType = COLORTYPE_GRAY;
183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_FLOAT g = FX_atof((CFX_ByteString)syntax.GetWord()) * 255 + 0.5f;
184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        color = ArgbEncode(255, (int)g, (int)g, (int)g);
185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    syntax.SetPos(0);
188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (syntax.FindTagParam(bStrokingOperation ? "RG" : "rg", 3)) {
189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        iColorType = COLORTYPE_RGB;
190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_FLOAT r = FX_atof((CFX_ByteString)syntax.GetWord()) * 255 + 0.5f;
191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_FLOAT g = FX_atof((CFX_ByteString)syntax.GetWord()) * 255 + 0.5f;
192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_FLOAT b = FX_atof((CFX_ByteString)syntax.GetWord()) * 255 + 0.5f;
193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        color = ArgbEncode(255, (int)r, (int)g, (int)b);
194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    syntax.SetPos(0);
197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (syntax.FindTagParam(bStrokingOperation ? "K" : "k", 4)) {
198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        iColorType = COLORTYPE_CMYK;
199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_FLOAT c = FX_atof((CFX_ByteString)syntax.GetWord());
200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_FLOAT m = FX_atof((CFX_ByteString)syntax.GetWord());
201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_FLOAT y = FX_atof((CFX_ByteString)syntax.GetWord());
202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_FLOAT k = FX_atof((CFX_ByteString)syntax.GetWord());
203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_FLOAT r = 1.0f - FX_MIN(1.0f, c + k);
204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_FLOAT g = 1.0f - FX_MIN(1.0f, m + k);
205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_FLOAT b = 1.0f - FX_MIN(1.0f, y + k);
206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        color = ArgbEncode(255, (int)(r * 255 + 0.5f), (int)(g * 255 + 0.5f), (int)(b * 255 + 0.5f));
207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
209ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DefaultAppearance::HasTextMatrix()
210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_csDA.IsEmpty()) {
212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_SimpleParser syntax(m_csDA);
215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return syntax.FindTagParam("Tm", 6);
216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
217ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString CPDF_DefaultAppearance::GetTextMatrixString()
218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteString csTM;
220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_csDA.IsEmpty()) {
221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return csTM;
222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_SimpleParser syntax(m_csDA);
224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (syntax.FindTagParam("Tm", 6)) {
225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        for (int i = 0; i < 6; i ++) {
226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            csTM += (CFX_ByteString)syntax.GetWord();
227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            csTM += " ";
228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        csTM += (CFX_ByteString)syntax.GetWord();
230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return csTM;
232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
233ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_AffineMatrix CPDF_DefaultAppearance::GetTextMatrix()
234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_AffineMatrix tm;
236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_csDA.IsEmpty()) {
237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return tm;
238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_SimpleParser syntax(m_csDA);
240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (syntax.FindTagParam("Tm", 6)) {
241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_FLOAT f[6];
242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        for (int i = 0; i < 6; i ++) {
243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            f[i] = FX_atof((CFX_ByteString)syntax.GetWord());
244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        tm.Set(f[0], f[1], f[2], f[3], f[4], f[5]);
246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return tm;
248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid InitInterFormDict(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument)
250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pDocument == NULL) {
252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pFormDict == NULL) {
255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pFormDict = CPDF_Dictionary::Create();
256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pFormDict == NULL) {
257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return;
258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_DWORD dwObjNum = pDocument->AddIndirectObject(pFormDict);
260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Dictionary* pRoot = pDocument->GetRoot();
261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pRoot->SetAtReference("AcroForm", pDocument, dwObjNum);
262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteString csDA;
264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!pFormDict->KeyExist("DR")) {
265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Font* pFont = NULL;
266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_ByteString csBaseName, csDefault;
267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_BYTE charSet = CPDF_InterForm::GetNativeCharSet();
268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pFont = CPDF_InterForm::AddStandardFont(pDocument, "Helvetica");
269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pFont != NULL) {
270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            AddInterFormFont(pFormDict, pDocument, pFont, csBaseName);
271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            csDefault = csBaseName;
272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (charSet != 0) {
274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            CFX_ByteString csFontName = CPDF_InterForm::GetNativeFont(charSet, NULL);
275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (pFont == NULL || csFontName != "Helvetica") {
276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                pFont = CPDF_InterForm::AddNativeFont(pDocument);
277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (pFont != NULL) {
278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    csBaseName = "";
279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    AddInterFormFont(pFormDict, pDocument, pFont, csBaseName);
280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    csDefault = csBaseName;
281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pFont != NULL) {
285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            csDA = "/" + PDF_NameEncode(csDefault) + " 0 Tf";
286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!csDA.IsEmpty()) {
289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        csDA += " ";
290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    csDA += "0 g";
292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!pFormDict->KeyExist("DA")) {
293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pFormDict->SetAtString("DA", csDA);
294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
296ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_DWORD CountInterFormFonts(CPDF_Dictionary* pFormDict)
297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pFormDict == NULL) {
299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 0;
300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Dictionary* pDR = pFormDict->GetDict("DR");
302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pDR == NULL) {
303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 0;
304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Dictionary* pFonts = pDR->GetDict("Font");
306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pFonts == NULL) {
307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 0;
308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD dwCount = 0;
310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_POSITION pos = pFonts->GetStartPos();
311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (pos) {
312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Object* pObj = NULL;
313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_ByteString csKey;
314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pObj = pFonts->GetNextElement(pos, csKey);
315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pObj == NULL) {
316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Object* pDirect = pObj->GetDirect();
319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pDirect != NULL && pDirect->GetType() == PDFOBJ_DICTIONARY) {
320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (((CPDF_Dictionary*)pDirect)->GetString("Type") == "Font") {
321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                dwCount ++;
322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return dwCount;
326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
327ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font* GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, FX_DWORD index, CFX_ByteString& csNameTag)
328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pFormDict == NULL) {
330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Dictionary* pDR = pFormDict->GetDict("DR");
333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pDR == NULL) {
334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Dictionary* pFonts = pDR->GetDict("Font");
337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pFonts == NULL) {
338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD dwCount = 0;
341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_POSITION pos = pFonts->GetStartPos();
342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (pos) {
343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Object* pObj = NULL;
344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_ByteString csKey;
345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pObj = pFonts->GetNextElement(pos, csKey);
346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pObj == NULL) {
347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Object* pDirect = pObj->GetDirect();
350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pDirect == NULL || pDirect->GetType() != PDFOBJ_DICTIONARY) {
351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Dictionary* pElement = (CPDF_Dictionary*)pDirect;
354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pElement->GetString("Type") != "Font") {
355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (dwCount == index) {
358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            csNameTag = csKey;
359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return pDocument->LoadFont(pElement);
360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        dwCount ++;
362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return NULL;
364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
365ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font* GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csNameTag)
366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteString csAlias = PDF_NameDecode(csNameTag);
368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pFormDict == NULL || csAlias.IsEmpty()) {
369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Dictionary* pDR = pFormDict->GetDict("DR");
372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pDR == NULL) {
373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Dictionary* pFonts = pDR->GetDict("Font");
376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pFonts == NULL) {
377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Dictionary* pElement = pFonts->GetDict(csAlias);
380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pElement == NULL) {
381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pElement->GetString("Type") == "Font") {
384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return pDocument->LoadFont(pElement);
385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return NULL;
387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
388ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font* GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csFontName, CFX_ByteString& csNameTag)
389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pFormDict == NULL || csFontName.IsEmpty()) {
391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Dictionary* pDR = pFormDict->GetDict("DR");
394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pDR == NULL) {
395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Dictionary* pFonts = pDR->GetDict("Font");
398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pFonts == NULL) {
399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_POSITION pos = pFonts->GetStartPos();
402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (pos) {
403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Object* pObj = NULL;
404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_ByteString csKey;
405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pObj = pFonts->GetNextElement(pos, csKey);
406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pObj == NULL) {
407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Object* pDirect = pObj->GetDirect();
410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pDirect == NULL || pDirect->GetType() != PDFOBJ_DICTIONARY) {
411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Dictionary* pElement = (CPDF_Dictionary*)pDirect;
414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pElement->GetString("Type") != "Font") {
415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Font* pFind = pDocument->LoadFont(pElement);
418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pFind == NULL) {
419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_ByteString csBaseFont;
422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        csBaseFont = pFind->GetBaseFont();
423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        csBaseFont.Remove(' ');
424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (csBaseFont == csFontName) {
425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            csNameTag = csKey;
426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return pFind;
427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return NULL;
430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
431ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font* GetNativeInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, FX_BYTE charSet, CFX_ByteString& csNameTag)
432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pFormDict == NULL) {
434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Dictionary* pDR = pFormDict->GetDict("DR");
437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pDR == NULL) {
438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Dictionary* pFonts = pDR->GetDict("Font");
441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pFonts == NULL) {
442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_POSITION pos = pFonts->GetStartPos();
445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (pos) {
446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Object* pObj = NULL;
447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_ByteString csKey;
448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pObj = pFonts->GetNextElement(pos, csKey);
449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pObj == NULL) {
450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Object* pDirect = pObj->GetDirect();
453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pDirect == NULL || pDirect->GetType() != PDFOBJ_DICTIONARY) {
454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Dictionary* pElement = (CPDF_Dictionary*)pDirect;
457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pElement->GetString("Type") != "Font") {
458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Font* pFind = pDocument->LoadFont(pElement);
461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pFind == NULL) {
462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_SubstFont* pSubst = (CFX_SubstFont*)pFind->GetSubstFont();
465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pSubst == NULL) {
466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pSubst->m_Charset == (int)charSet) {
469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            csNameTag = csKey;
470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return pFind;
471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return NULL;
474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
475ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font* GetNativeInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString& csNameTag)
476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    csNameTag = "";
478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BYTE charSet = CPDF_InterForm::GetNativeCharSet();
479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_SubstFont* pSubst;
480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Font* pFont = GetDefaultInterFormFont(pFormDict, pDocument);
481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pFont != NULL) {
482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pSubst = (CFX_SubstFont*)pFont->GetSubstFont();
483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pSubst != NULL && pSubst->m_Charset == (int)charSet) {
484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FindInterFormFont(pFormDict, pFont, csNameTag);
485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return pFont;
486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return GetNativeInterFormFont(pFormDict, pDocument, charSet, csNameTag);
489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
490ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL FindInterFormFont(CPDF_Dictionary* pFormDict, const CPDF_Font* pFont, CFX_ByteString& csNameTag)
491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pFormDict == NULL || pFont == NULL) {
493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Dictionary* pDR = pFormDict->GetDict("DR");
496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pDR == NULL) {
497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Dictionary* pFonts = pDR->GetDict("Font");
500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pFonts == NULL) {
501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_POSITION pos = pFonts->GetStartPos();
504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (pos) {
505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Object* pObj = NULL;
506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_ByteString csKey;
507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pObj = pFonts->GetNextElement(pos, csKey);
508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pObj == NULL) {
509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Object* pDirect = pObj->GetDirect();
512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pDirect == NULL || pDirect->GetType() != PDFOBJ_DICTIONARY) {
513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Dictionary* pElement = (CPDF_Dictionary*)pDirect;
516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pElement->GetString("Type") != "Font") {
517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pFont->GetFontDict() == pElement) {
520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            csNameTag = csKey;
521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return TRUE;
522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return FALSE;
525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
526ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL FindInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csFontName, CPDF_Font*& pFont, CFX_ByteString& csNameTag)
527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pFormDict == NULL) {
529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Dictionary* pDR = pFormDict->GetDict("DR");
532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pDR == NULL) {
533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
534ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Dictionary* pFonts = pDR->GetDict("Font");
536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pFonts == NULL) {
537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (csFontName.GetLength() > 0) {
540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        csFontName.Remove(' ');
541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_POSITION pos = pFonts->GetStartPos();
543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (pos) {
544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Object* pObj = NULL;
545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_ByteString csKey, csTmp;
546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pObj = pFonts->GetNextElement(pos, csKey);
547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pObj == NULL) {
548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Object* pDirect = pObj->GetDirect();
551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pDirect == NULL || pDirect->GetType() != PDFOBJ_DICTIONARY) {
552ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Dictionary* pElement = (CPDF_Dictionary*)pDirect;
555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pElement->GetString("Type") != "Font") {
556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pFont = pDocument->LoadFont(pElement);
559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pFont == NULL) {
560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_ByteString csBaseFont;
563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        csBaseFont = pFont->GetBaseFont();
564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        csBaseFont.Remove(' ');
565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (csBaseFont == csFontName) {
566ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            csNameTag = csKey;
567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return TRUE;
568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return FALSE;
571ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid AddInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, const CPDF_Font* pFont, CFX_ByteString& csNameTag)
573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
574ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pFont == NULL) {
575ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
576ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pFormDict == NULL) {
578ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        InitInterFormDict(pFormDict, pDocument);
579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
580ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteString csTag;
581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (FindInterFormFont(pFormDict, pFont, csTag)) {
582ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        csNameTag = csTag;
583ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
584ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
585ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pFormDict == NULL) {
586ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        InitInterFormDict(pFormDict, pDocument);
587ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
588ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Dictionary* pDR = pFormDict->GetDict("DR");
589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pDR == NULL) {
590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pDR = CPDF_Dictionary::Create();
591ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pDR == NULL) {
592ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return;
593ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
594ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pFormDict->SetAt("DR", pDR);
595ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
596ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Dictionary* pFonts = pDR->GetDict("Font");
597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pFonts == NULL) {
598ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pFonts = CPDF_Dictionary::Create();
599ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pDR->SetAt("Font", pFonts);
600ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
601ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (csNameTag.IsEmpty()) {
602ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        csNameTag = pFont->GetBaseFont();
603ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
604ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    csNameTag.Remove(' ');
605ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    csNameTag = CPDF_InterForm::GenerateNewResourceName(pDR, "Font", 4, csNameTag);
606ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pFonts->SetAtReference(csNameTag, pDocument, pFont->GetFontDict());
607ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
608ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font* AddNativeInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, FX_BYTE charSet, CFX_ByteString& csNameTag)
609ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
610ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pFormDict == NULL) {
611ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        InitInterFormDict(pFormDict, pDocument);
612ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
613ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteString csTemp;
614ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Font* pFont = GetNativeInterFormFont(pFormDict, pDocument, charSet, csTemp);
615ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pFont != NULL) {
616ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        csNameTag = csTemp;
617ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return pFont;
618ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
619ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteString csFontName = CPDF_InterForm::GetNativeFont(charSet);
620ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!csFontName.IsEmpty()) {
621ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (FindInterFormFont(pFormDict, pDocument, csFontName, pFont, csNameTag)) {
622ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return pFont;
623ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
624ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
625ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pFont = CPDF_InterForm::AddNativeFont(charSet, pDocument);
626ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pFont != NULL) {
627ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        AddInterFormFont(pFormDict, pDocument, pFont, csNameTag);
628ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
629ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return pFont;
630ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
631ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font* AddNativeInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, CFX_ByteString& csNameTag)
632ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
633ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BYTE charSet = CPDF_InterForm::GetNativeCharSet();
634ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return AddNativeInterFormFont(pFormDict, pDocument, charSet, csNameTag);
635ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
636ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid RemoveInterFormFont(CPDF_Dictionary* pFormDict, const CPDF_Font* pFont)
637ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
638ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pFormDict == NULL || pFont == NULL) {
639ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
640ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
641ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteString csTag;
642ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!FindInterFormFont(pFormDict, pFont, csTag)) {
643ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
644ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
645ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Dictionary* pDR = pFormDict->GetDict("DR");
646ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Dictionary* pFonts = pDR->GetDict("Font");
647ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pFonts->RemoveAt(csTag);
648ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
649ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid RemoveInterFormFont(CPDF_Dictionary* pFormDict, CFX_ByteString csNameTag)
650ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
651ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pFormDict == NULL || csNameTag.IsEmpty()) {
652ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
653ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
654ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Dictionary* pDR = pFormDict->GetDict("DR");
655ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pDR == NULL) {
656ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
657ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
658ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Dictionary* pFonts = pDR->GetDict("Font");
659ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pFonts == NULL) {
660ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
661ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
662ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pFonts->RemoveAt(csNameTag);
663ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
664ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font* GetDefaultInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument)
665ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
666ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pFormDict == NULL) {
667ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
668ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
669ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_DefaultAppearance cDA = pFormDict->GetString("DA");
670ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteString csFontNameTag;
671ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FLOAT fFontSize;
672ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    cDA.GetFont(csFontNameTag, fFontSize);
673ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return GetInterFormFont(pFormDict, pDocument, csFontNameTag);
674ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
675ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_IconFit::ScaleMethod CPDF_IconFit::GetScaleMethod()
676ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
677ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pDict == NULL) {
678ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return Always;
679ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
680ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteString csSW = m_pDict->GetString("SW", "A");
681ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (csSW == "B") {
682ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return Bigger;
683ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else if (csSW == "S") {
684ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return Smaller;
685ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else if (csSW == "N") {
686ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return Never;
687ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
688ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return Always;
689ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
690ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_IconFit::IsProportionalScale()
691ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
692ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pDict == NULL) {
693ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return TRUE;
694ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
695ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return m_pDict->GetString("S", "P") != "A";
696ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
697ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_IconFit::GetIconPosition(FX_FLOAT& fLeft, FX_FLOAT& fBottom)
698ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
699ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    fLeft = fBottom = 0.5;
700ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pDict == NULL) {
701ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
702ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
703ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Array* pA = m_pDict->GetArray("A");
704ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pA != NULL) {
705ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_DWORD dwCount = pA->GetCount();
706ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (dwCount > 0) {
707ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            fLeft = pA->GetNumber(0);
708ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
709ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (dwCount > 1) {
710ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            fBottom = pA->GetNumber(1);
711ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
712ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
713ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
714ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_IconFit::GetFittingBounds()
715ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
716ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pDict == NULL) {
717ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
718ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
719ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return m_pDict->GetBoolean("FB");
720ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
721ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid SaveCheckedFieldStatus(CPDF_FormField* pField, CFX_ByteArray& statusArray)
722ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
723ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int iCount = pField->CountControls();
724ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for (int i = 0; i < iCount; i ++) {
725ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_FormControl* pControl = pField->GetControl(i);
726ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pControl == NULL) {
727ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
728ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
729ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        statusArray.Add(pControl->IsChecked() ? 1 : 0);
730ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
731ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
732ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Object* FPDF_GetFieldAttr(CPDF_Dictionary* pFieldDict, const FX_CHAR* name, int nLevel)
733ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
734ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (nLevel > FPDFDOC_UTILS_MAXRECURSION) {
735ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
736ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
737ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pFieldDict == NULL) {
738ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
739ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
740ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Object* pAttr = pFieldDict->GetElementValue(name);
741ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pAttr) {
742ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return pAttr;
743ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
744ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Dictionary* pParent = pFieldDict->GetDict("Parent");
745ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pParent == NULL) {
746ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
747ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
748ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return FPDF_GetFieldAttr(pParent, name, nLevel + 1);
749ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
750