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