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