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 Ganov#include "../../include/fpdfdoc/fpdf_vt.h" 9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "pdf_vt.h" 10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/fpdfdoc/fpdf_ap.h" 11ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL FPDF_GenerateAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict) 12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pAnnotDict->GetConstString("Subtype") != FX_BSTRC("Widget")) { 14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString field_type = FPDF_GetFieldAttr(pAnnotDict, "FT")->GetString(); 17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD flags = FPDF_GetFieldAttr(pAnnotDict, "Ff")->GetInteger(); 18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (field_type == "Tx") { 19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return CPVT_GenerateAP::GenerateTextFieldAP(pDoc, pAnnotDict); 20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (field_type == "Ch") { 21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (flags & (1 << 17)) { 22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return CPVT_GenerateAP::GenerateComboBoxAP(pDoc, pAnnotDict); 23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return CPVT_GenerateAP::GenerateListBoxAP(pDoc, pAnnotDict); 25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (field_type == "Btn") { 27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!(flags & (1 << 16))) { 28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pAnnotDict->KeyExist("AS")) { 29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (CPDF_Dictionary* pParentDict = pAnnotDict->GetDict("Parent")) { 30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pParentDict->KeyExist("AS")) { 31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pAnnotDict->SetAtString("AS", pParentDict->GetString("AS")); 32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CPVT_FontMap : public IPVT_FontMap 40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic: 42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPVT_FontMap(CPDF_Document * pDoc, CPDF_Dictionary * pResDict, CPDF_Font * pDefFont, 43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const CFX_ByteString & sDefFontAlias); 44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual ~CPVT_FontMap(); 45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Font* GetPDFFont(FX_INT32 nFontIndex); 46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString GetPDFFontAlias(FX_INT32 nFontIndex); 47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static void GetAnnotSysPDFFont(CPDF_Document * pDoc, CPDF_Dictionary * pResDict, 48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Font * & pSysFont, CFX_ByteString & sSysFontAlias); 49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovprivate: 50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Document* m_pDocument; 51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary* m_pResDict; 52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Font* m_pDefFont; 53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString m_sDefFontAlias; 54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Font* m_pSysFont; 55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString m_sSysFontAlias; 56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 57ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPVT_FontMap::CPVT_FontMap(CPDF_Document * pDoc, CPDF_Dictionary * pResDict, CPDF_Font * pDefFont, 58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const CFX_ByteString & sDefFontAlias) : 59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pDocument(pDoc), 60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pResDict(pResDict), 61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pDefFont(pDefFont), 62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_sDefFontAlias(sDefFontAlias), 63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pSysFont(NULL), 64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_sSysFontAlias() 65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 67ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPVT_FontMap::~CPVT_FontMap() 68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovextern CPDF_Font* AddNativeInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, CFX_ByteString& csNameTag); 71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPVT_FontMap::GetAnnotSysPDFFont(CPDF_Document * pDoc, CPDF_Dictionary * pResDict, 72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Font * & pSysFont, CFX_ByteString & sSysFontAlias) 73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pDoc && pResDict) { 75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString sFontAlias; 76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary* pFormDict = pDoc->GetRoot()->GetDict("AcroForm"); 77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (CPDF_Font * pPDFFont = AddNativeInterFormFont(pFormDict, pDoc, sSysFontAlias)) { 78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (CPDF_Dictionary * pFontList = pResDict->GetDict("Font")) { 79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pFontList->KeyExist(sSysFontAlias)) { 80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pFontList->SetAtReference(sSysFontAlias, pDoc, pPDFFont->GetFontDict()); 81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pSysFont = pPDFFont; 84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 87ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font* CPVT_FontMap::GetPDFFont(FX_INT32 nFontIndex) 88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch (nFontIndex) { 90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 0: 91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_pDefFont; 92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 1: 93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_pSysFont) { 94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov GetAnnotSysPDFFont(m_pDocument, m_pResDict, m_pSysFont, m_sSysFontAlias); 95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_pSysFont; 97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 100ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString CPVT_FontMap::GetPDFFontAlias(FX_INT32 nFontIndex) 101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch (nFontIndex) { 103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 0: 104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_sDefFontAlias; 105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 1: 106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_pSysFont) { 107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov GetAnnotSysPDFFont(m_pDocument, m_pResDict, m_pSysFont, m_sSysFontAlias); 108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_sSysFontAlias; 110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return ""; 112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 113ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPVT_Provider::CPVT_Provider(IPVT_FontMap * pFontMap) : m_pFontMap(pFontMap) 114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ASSERT (m_pFontMap != NULL); 116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 117ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPVT_Provider::~CPVT_Provider() 118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 120ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_INT32 CPVT_Provider::GetCharWidth(FX_INT32 nFontIndex, FX_WORD word, FX_INT32 nWordStyle) 121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex)) { 123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD charcode = pPDFFont->CharCodeFromUnicode(word); 124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (charcode != -1) { 125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pPDFFont->GetCharWidthF(charcode); 126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 130ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_INT32 CPVT_Provider::GetTypeAscent(FX_INT32 nFontIndex) 131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex)) { 133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pPDFFont->GetTypeAscent(); 134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 137ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_INT32 CPVT_Provider::GetTypeDescent(FX_INT32 nFontIndex) 138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex)) { 140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pPDFFont->GetTypeDescent(); 141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 144ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_INT32 CPVT_Provider::GetWordFontIndex(FX_WORD word, FX_INT32 charset, FX_INT32 nFontIndex) 145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (CPDF_Font* pDefFont = m_pFontMap->GetPDFFont(0)) { 147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pDefFont->CharCodeFromUnicode(word) != -1) { 148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (CPDF_Font* pSysFont = m_pFontMap->GetPDFFont(1)) 152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pSysFont->CharCodeFromUnicode(word) != -1) { 153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 1; 154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return -1; 156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 157ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPVT_Provider::IsLatinWord(FX_WORD word) 158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((word >= 0x61 && word <= 0x7A) || (word >= 0x41 && word <= 0x5A) || word == 0x2D || word == 0x27) { 160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 164ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_INT32 CPVT_Provider::GetDefaultFontIndex() 165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic CFX_ByteString GetPDFWordString(IPVT_FontMap * pFontMap, FX_INT32 nFontIndex, FX_WORD Word, FX_WORD SubWord) 169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString sWord; 171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (SubWord > 0) { 172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sWord.Format("%c", SubWord); 173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pFontMap) { 175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (CPDF_Font * pPDFFont = pFontMap->GetPDFFont(nFontIndex)) { 176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pPDFFont->GetBaseFont().Compare("Symbol") == 0 || pPDFFont->GetBaseFont().Compare("ZapfDingbats") == 0) { 177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sWord.Format("%c", Word); 178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD dwCharCode = pPDFFont->CharCodeFromUnicode(Word); 180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (dwCharCode != -1) { 181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pPDFFont->AppendChar(sWord, dwCharCode); 182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return sWord; 188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic CFX_ByteString GetWordRenderString(const CFX_ByteString & strWords) 190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (strWords.GetLength() > 0) { 192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return PDF_EncodeString(strWords) + " Tj\n"; 193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return ""; 195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic CFX_ByteString GetFontSetString(IPVT_FontMap * pFontMap, FX_INT32 nFontIndex, FX_FLOAT fFontSize) 197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteTextBuf sRet; 199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pFontMap) { 200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString sFontAlias = pFontMap->GetPDFFontAlias(nFontIndex); 201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (sFontAlias.GetLength() > 0 && fFontSize > 0 ) { 202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sRet << "/" << sFontAlias << " " << fFontSize << " Tf\n"; 203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return sRet.GetByteString(); 206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic CPVT_Color ParseColor(const CFX_ByteString & str) 208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_SimpleParser syntax(str); 210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov syntax.SetPos(0); 211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (syntax.FindTagParam("g", 1)) { 212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return CPVT_Color(CT_GRAY, FX_atof(syntax.GetWord())); 213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov syntax.SetPos(0); 215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (syntax.FindTagParam("rg", 3)) { 216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT f1 = FX_atof(syntax.GetWord()); 217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT f2 = FX_atof(syntax.GetWord()); 218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT f3 = FX_atof(syntax.GetWord()); 219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return CPVT_Color(CT_RGB, f1, f2, f3); 220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov syntax.SetPos(0); 222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (syntax.FindTagParam("k", 4)) { 223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT f1 = FX_atof(syntax.GetWord()); 224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT f2 = FX_atof(syntax.GetWord()); 225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT f3 = FX_atof(syntax.GetWord()); 226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT f4 = FX_atof(syntax.GetWord()); 227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return CPVT_Color(CT_CMYK, f1, f2, f3, f4); 228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return CPVT_Color(CT_TRANSPARENT); 230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic CPVT_Color ParseColor(const CPDF_Array & array) 232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPVT_Color rt; 234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch (array.GetCount()) { 235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 1: 236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov rt = CPVT_Color(CT_GRAY, array.GetFloat(0)); 237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 3: 239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov rt = CPVT_Color(CT_RGB, array.GetFloat(0), array.GetFloat(1), array.GetFloat(2)); 240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 4: 242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov rt = CPVT_Color(CT_CMYK, array.GetFloat(0), array.GetFloat(1), array.GetFloat(2), array.GetFloat(3)); 243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return rt; 246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic FX_BOOL GenerateWidgetAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict, const FX_INT32 & nWidgetType) 248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary* pFormDict = NULL; 250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (CPDF_Dictionary * pRootDict = pDoc->GetRoot()) { 251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pFormDict = pRootDict->GetDict("AcroForm"); 252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pFormDict) { 254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString DA = FPDF_GetFieldAttr(pAnnotDict, "DA")->GetString(); 257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (DA.IsEmpty()) { 258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov DA = pFormDict->GetString("DA"); 259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (DA.IsEmpty()) { 261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_SimpleParser syntax(DA); 264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov syntax.FindTagParam("Tf", 2); 265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString sFontName = syntax.GetWord(); 266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sFontName = PDF_NameDecode(sFontName); 267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (sFontName.IsEmpty()) { 268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT fFontSize = FX_atof(syntax.GetWord()); 271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPVT_Color crText = ParseColor(DA); 272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bUseFormRes = FALSE; 273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary * pFontDict = NULL; 274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary* pDRDict = pAnnotDict->GetDict(FX_BSTRC("DR")); 275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pDRDict == NULL) { 276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pDRDict = pFormDict->GetDict(FX_BSTRC("DR")); 277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bUseFormRes = TRUE; 278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary * pDRFontDict = NULL; 280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((pDRFontDict = pDRDict->GetDict("Font"))) { 281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pFontDict = pDRFontDict->GetDict(sFontName.Mid(1)); 282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pFontDict && !bUseFormRes) { 283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pDRDict = pFormDict->GetDict(FX_BSTRC("DR")); 284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pDRFontDict = pDRDict->GetDict("Font"); 285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pDRFontDict) { 286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pFontDict = pDRFontDict->GetDict(sFontName.Mid(1)); 287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pDRFontDict) { 291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pFontDict) { 294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pFontDict = CPDF_Dictionary::Create(); 295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pFontDict == NULL) { 296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pFontDict->SetAtName(FX_BSTRC("Type"), "Font"); 299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pFontDict->SetAtName(FX_BSTRC("Subtype"), "Type1"); 300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pFontDict->SetAtName(FX_BSTRC("BaseFont"), "Helvetica"); 301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pFontDict->SetAtName(FX_BSTRC("Encoding"), "WinAnsiEncoding"); 302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pDoc->AddIndirectObject(pFontDict); 303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pDRFontDict->SetAtReference(sFontName.Mid(1), pDoc, pFontDict); 304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Font* pDefFont = pDoc->LoadFont(pFontDict); 306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pDefFont) { 307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_CharMap* pCharMap = pDefFont->GetCharMap(); 310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Rect rcAnnot = pAnnotDict->GetRect("Rect"); 311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 nRotate = 0; 312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (CPDF_Dictionary * pMKDict = pAnnotDict->GetDict("MK")) { 313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nRotate = pMKDict->GetInteger("R"); 314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Rect rcBBox; 316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Matrix matrix; 317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch (nRotate % 360) { 318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 0: 319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov rcBBox = CPDF_Rect(0, 0, rcAnnot.right - rcAnnot.left, rcAnnot.top - rcAnnot.bottom); 320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 90: 322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov matrix = CPDF_Matrix(0, 1, -1, 0, rcAnnot.right - rcAnnot.left, 0); 323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov rcBBox = CPDF_Rect(0, 0, rcAnnot.top - rcAnnot.bottom, rcAnnot.right - rcAnnot.left); 324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 180: 326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov matrix = CPDF_Matrix(-1, 0, 0, -1, rcAnnot.right - rcAnnot.left, rcAnnot.top - rcAnnot.bottom); 327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov rcBBox = CPDF_Rect(0, 0, rcAnnot.right - rcAnnot.left, rcAnnot.top - rcAnnot.bottom); 328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 270: 330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov matrix = CPDF_Matrix(0, -1, 1, 0, 0, rcAnnot.top - rcAnnot.bottom); 331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov rcBBox = CPDF_Rect(0, 0, rcAnnot.top - rcAnnot.bottom, rcAnnot.right - rcAnnot.left); 332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 nBorderStyle = PBS_SOLID; 335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT fBorderWidth = 1; 336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPVT_Dash dsBorder(3, 0, 0); 337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPVT_Color crLeftTop, crRightBottom; 338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (CPDF_Dictionary * pBSDict = pAnnotDict->GetDict("BS")) { 339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pBSDict->KeyExist("W")) { 340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fBorderWidth = pBSDict->GetNumber("W"); 341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (CPDF_Array * pArray = pBSDict->GetArray("D")) { 343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dsBorder = CPVT_Dash(pArray->GetInteger(0), pArray->GetInteger(1), pArray->GetInteger(2)); 344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch (pBSDict->GetString("S").GetAt(0)) { 346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 'S': 347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nBorderStyle = PBS_SOLID; 348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 'D': 350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nBorderStyle = PBS_DASH; 351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 'B': 353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nBorderStyle = PBS_BEVELED; 354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fBorderWidth *= 2; 355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov crLeftTop = CPVT_Color(CT_GRAY, 1); 356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov crRightBottom = CPVT_Color(CT_GRAY, 0.5); 357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 'I': 359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nBorderStyle = PBS_INSET; 360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fBorderWidth *= 2; 361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov crLeftTop = CPVT_Color(CT_GRAY, 0.5); 362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov crRightBottom = CPVT_Color(CT_GRAY, 0.75); 363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 'U': 365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nBorderStyle = PBS_UNDERLINED; 366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPVT_Color crBorder, crBG; 370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (CPDF_Dictionary * pMKDict = pAnnotDict->GetDict("MK")) { 371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (CPDF_Array * pArray = pMKDict->GetArray("BC")) { 372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov crBorder = ParseColor(*pArray); 373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (CPDF_Array * pArray = pMKDict->GetArray("BG")) { 375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov crBG = ParseColor(*pArray); 376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteTextBuf sAppStream; 379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString sBG = CPVT_GenerateAP::GenerateColorAP(crBG, TRUE); 380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (sBG.GetLength() > 0) { 381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << "q\n" << sBG << rcBBox.left << " " << rcBBox.bottom << " " 382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov << rcBBox.Width() << " " << rcBBox.Height() << " re f\n" << "Q\n"; 383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString sBorderStream = CPVT_GenerateAP::GenerateBorderAP(rcBBox, fBorderWidth, 385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov crBorder, crLeftTop, crRightBottom, nBorderStyle, dsBorder); 386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (sBorderStream.GetLength() > 0) { 387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << "q\n" << sBorderStream << "Q\n"; 388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Rect rcBody = CPDF_Rect(rcBBox.left + fBorderWidth, rcBBox.bottom + fBorderWidth, 390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov rcBBox.right - fBorderWidth, rcBBox.top - fBorderWidth); 391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov rcBody.Normalize(); 392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary* pAPDict = pAnnotDict->GetDict("AP"); 393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pAPDict == NULL) { 394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pAPDict = CPDF_Dictionary::Create(); 395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pAPDict == NULL) { 396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pAnnotDict->SetAt("AP", pAPDict); 399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Stream* pNormalStream = pAPDict->GetStream("N"); 401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pNormalStream == NULL) { 402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pNormalStream = CPDF_Stream::Create(NULL, 0, NULL); 403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pNormalStream == NULL) { 404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 objnum = pDoc->AddIndirectObject(pNormalStream); 407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pAnnotDict->GetDict("AP")->SetAtReference("N", pDoc, objnum); 408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary * pStreamDict = pNormalStream->GetDict(); 410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pStreamDict) { 411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pStreamDict->SetAtMatrix("Matrix", matrix); 412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pStreamDict->SetAtRect("BBox", rcBBox); 413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary* pStreamResList = pStreamDict->GetDict("Resources"); 414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pStreamResList) { 415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary* pStreamResFontList = pStreamResList->GetDict("Font"); 416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pStreamResFontList) { 417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pStreamResFontList = CPDF_Dictionary::Create(); 418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pStreamResFontList == NULL) { 419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pStreamResList->SetAt("Font", pStreamResFontList); 422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pStreamResFontList->KeyExist(sFontName)) { 424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pStreamResFontList->SetAtReference(sFontName, pDoc, pFontDict); 425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pStreamDict->SetAt("Resources", pFormDict->GetDict("DR")->Clone()); 428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pStreamResList = pStreamDict->GetDict("Resources"); 429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch (nWidgetType) { 432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 0: { 433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_WideString swValue = FPDF_GetFieldAttr(pAnnotDict, "V")->GetUnicodeText(); 434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 nAlign = FPDF_GetFieldAttr(pAnnotDict, "Q")->GetInteger(); 435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD dwFlags = FPDF_GetFieldAttr(pAnnotDict, "Ff")->GetInteger(); 436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD dwMaxLen = FPDF_GetFieldAttr(pAnnotDict, "MaxLen")->GetInteger(); 437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPVT_FontMap map(pDoc, pStreamDict->GetDict("Resources"), pDefFont, sFontName.Right(sFontName.GetLength() - 1)); 438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPVT_Provider prd(&map); 439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_VariableText vt; 440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov vt.SetProvider(&prd); 441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov vt.SetPlateRect(rcBody); 442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov vt.SetAlignment(nAlign); 443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (IsFloatZero(fFontSize)) { 444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov vt.SetAutoFontSize(TRUE); 445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov vt.SetFontSize(fFontSize); 447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bMultiLine = (dwFlags >> 12) & 1; 449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bMultiLine) { 450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov vt.SetMultiLine(TRUE); 451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov vt.SetAutoReturn(TRUE); 452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_WORD subWord = 0; 454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((dwFlags >> 13) & 1) { 455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov subWord = '*'; 456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov vt.SetPasswordChar(subWord); 457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bCharArray = (dwFlags >> 24) & 1; 459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bCharArray) { 460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov vt.SetCharArray(dwMaxLen); 461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov vt.SetLimitChar(dwMaxLen); 463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov vt.Initialize(); 465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov vt.SetText(swValue); 466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov vt.RearrangeAll(); 467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Rect rcContent = vt.GetContentRect(); 468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Point ptOffset(0.0f, 0.0f); 469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!bMultiLine) { 470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ptOffset = CPDF_Point(0.0f, (rcContent.Height() - rcBody.Height()) / 2.0f); 471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString sBody = CPVT_GenerateAP::GenerateEditAP(&map, vt.GetIterator(), ptOffset, !bCharArray, subWord); 473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (sBody.GetLength() > 0) { 474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << "/Tx BMC\n" << "q\n"; 475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (rcContent.Width() > rcBody.Width() || 476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov rcContent.Height() > rcBody.Height()) { 477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << rcBody.left << " " << rcBody.bottom << " " 478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov << rcBody.Width() << " " << rcBody.Height() << " re\nW\nn\n"; 479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << "BT\n" << CPVT_GenerateAP::GenerateColorAP(crText, TRUE) << sBody << "ET\n" << "Q\nEMC\n"; 481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 1: { 485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_WideString swValue = FPDF_GetFieldAttr(pAnnotDict, "V")->GetUnicodeText(); 486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPVT_FontMap map(pDoc, pStreamDict->GetDict("Resources"), pDefFont, sFontName.Right(sFontName.GetLength() - 1)); 487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPVT_Provider prd(&map); 488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_VariableText vt; 489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov vt.SetProvider(&prd); 490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Rect rcButton = rcBody; 491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov rcButton.left = rcButton.right - 13; 492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov rcButton.Normalize(); 493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Rect rcEdit = rcBody; 494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov rcEdit.right = rcButton.left; 495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov rcEdit.Normalize(); 496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov vt.SetPlateRect(rcEdit); 497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (IsFloatZero(fFontSize)) { 498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov vt.SetAutoFontSize(TRUE); 499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov vt.SetFontSize(fFontSize); 501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov vt.Initialize(); 503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov vt.SetText(swValue); 504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov vt.RearrangeAll(); 505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Rect rcContent = vt.GetContentRect(); 506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Point ptOffset = CPDF_Point(0.0f, (rcContent.Height() - rcEdit.Height()) / 2.0f); 507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString sEdit = CPVT_GenerateAP::GenerateEditAP(&map, vt.GetIterator(), ptOffset, TRUE, 0); 508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (sEdit.GetLength() > 0) { 509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << "/Tx BMC\n" << "q\n"; 510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << rcEdit.left << " " << rcEdit.bottom << " " 511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov << rcEdit.Width() << " " << rcEdit.Height() << " re\nW\nn\n"; 512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << "BT\n" << CPVT_GenerateAP::GenerateColorAP(crText, TRUE) << sEdit << "ET\n" << "Q\nEMC\n"; 513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString sButton = CPVT_GenerateAP::GenerateColorAP(CPVT_Color(CT_RGB, 220.0f / 255.0f, 220.0f / 255.0f, 220.0f / 255.0f), TRUE); 515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (sButton.GetLength() > 0 && !rcButton.IsEmpty()) { 516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << "q\n" << sButton; 517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << rcButton.left << " " << rcButton.bottom << " " 518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov << rcButton.Width() << " " << rcButton.Height() << " re f\n"; 519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << "Q\n"; 520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString sButtonBorder = CPVT_GenerateAP::GenerateBorderAP(rcButton, 2, CPVT_Color(CT_GRAY, 0), CPVT_Color(CT_GRAY, 1), CPVT_Color(CT_GRAY, 0.5), PBS_BEVELED, CPVT_Dash(3, 0, 0)); 521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (sButtonBorder.GetLength() > 0) { 522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << "q\n" << sButtonBorder << "Q\n"; 523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Point ptCenter = CPDF_Point((rcButton.left + rcButton.right) / 2, (rcButton.top + rcButton.bottom) / 2); 525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (IsFloatBigger(rcButton.Width(), 6) && IsFloatBigger(rcButton.Height(), 6)) { 526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << "q\n" << " 0 g\n"; 527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << ptCenter.x - 3 << " " << ptCenter.y + 1.5f << " m\n"; 528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << ptCenter.x + 3 << " " << ptCenter.y + 1.5f << " l\n"; 529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << ptCenter.x << " " << ptCenter.y - 1.5f << " l\n"; 530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << ptCenter.x - 3 << " " << ptCenter.y + 1.5f << " l f\n"; 531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << sButton << "Q\n"; 532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 534ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 2: { 537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPVT_FontMap map(pDoc, pStreamDict->GetDict("Resources"), pDefFont, sFontName.Right(sFontName.GetLength() - 1)); 538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPVT_Provider prd(&map); 539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Array * pOpts = FPDF_GetFieldAttr(pAnnotDict, "Opt")->GetArray(); 540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Array * pSels = FPDF_GetFieldAttr(pAnnotDict, "I")->GetArray(); 541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 nTop = FPDF_GetFieldAttr(pAnnotDict, "TI")->GetInteger(); 542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteTextBuf sBody; 543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pOpts) { 544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT fy = rcBody.top; 545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_INT32 i = nTop, sz = pOpts->GetCount(); i < sz; i++) { 546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (IsFloatSmaller(fy, rcBody.bottom)) { 547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (CPDF_Object* pOpt = pOpts->GetElementValue(i)) { 550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_WideString swItem; 551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pOpt->GetType() == PDFOBJ_STRING) { 552ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov swItem = pOpt->GetUnicodeText(); 553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (pOpt->GetType() == PDFOBJ_ARRAY) { 554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov swItem = ((CPDF_Array*)pOpt)->GetElementValue(1)->GetUnicodeText(); 555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bSelected = FALSE; 557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pSels) { 558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_DWORD s = 0, ssz = pSels->GetCount(); s < ssz; s++) { 559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (i == pSels->GetInteger(s)) { 560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bSelected = TRUE; 561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_VariableText vt; 566ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov vt.SetProvider(&prd); 567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov vt.SetPlateRect(CPDF_Rect(rcBody.left, 0.0f, rcBody.right, 0.0f)); 568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (IsFloatZero(fFontSize)) { 569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov vt.SetFontSize(12.0f); 570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 571ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov vt.SetFontSize(fFontSize); 572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov vt.Initialize(); 574ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov vt.SetText(swItem); 575ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov vt.RearrangeAll(); 576ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT fItemHeight = vt.GetContentRect().Height(); 577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bSelected) { 578ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Rect rcItem = CPDF_Rect(rcBody.left, fy - fItemHeight, rcBody.right, fy); 579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sBody << "q\n" << CPVT_GenerateAP::GenerateColorAP(CPVT_Color(CT_RGB, 0, 51.0f / 255.0f, 113.0f / 255.0f), TRUE) 580ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov << rcItem.left << " " << rcItem.bottom << " " << rcItem.Width() << " " << rcItem.Height() << " re f\n" << "Q\n"; 581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sBody << "BT\n" << CPVT_GenerateAP::GenerateColorAP(CPVT_Color(CT_GRAY, 1), TRUE) << CPVT_GenerateAP::GenerateEditAP(&map, vt.GetIterator(), CPDF_Point(0.0f, fy), TRUE, 0) << "ET\n"; 582ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 583ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sBody << "BT\n" << CPVT_GenerateAP::GenerateColorAP(crText, TRUE) << CPVT_GenerateAP::GenerateEditAP(&map, vt.GetIterator(), CPDF_Point(0.0f, fy), TRUE, 0) << "ET\n"; 584ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 585ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fy -= fItemHeight; 586ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 587ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 588ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (sBody.GetSize() > 0) { 590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << "/Tx BMC\n" << "q\n"; 591ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << rcBody.left << " " << rcBody.bottom << " " 592ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov << rcBody.Width() << " " << rcBody.Height() << " re\nW\nn\n"; 593ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << sBody.GetByteString() << "Q\nEMC\n"; 594ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 595ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 596ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 598ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pNormalStream) { 599ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pNormalStream->SetData((FX_BYTE*)sAppStream.GetBuffer(), sAppStream.GetSize(), FALSE, FALSE); 600ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pStreamDict = pNormalStream->GetDict(); 601ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pStreamDict) { 602ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pStreamDict->SetAtMatrix("Matrix", matrix); 603ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pStreamDict->SetAtRect("BBox", rcBBox); 604ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary* pStreamResList = pStreamDict->GetDict("Resources"); 605ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pStreamResList) { 606ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary* pStreamResFontList = pStreamResList->GetDict("Font"); 607ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pStreamResFontList) { 608ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pStreamResFontList = CPDF_Dictionary::Create(); 609ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pStreamResFontList == NULL) { 610ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 611ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 612ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pStreamResList->SetAt("Font", pStreamResFontList); 613ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 614ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pStreamResFontList->KeyExist(sFontName)) { 615ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pStreamResFontList->SetAtReference(sFontName, pDoc, pFontDict); 616ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 617ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 618ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pStreamDict->SetAt("Resources", pFormDict->GetDict("DR")->Clone()); 619ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pStreamResList = pStreamDict->GetDict("Resources"); 620ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 621ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 622ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 623ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 624ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 625ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPVT_GenerateAP::GenerateTextFieldAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict) 626ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 627ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return GenerateWidgetAP(pDoc, pAnnotDict, 0); 628ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 629ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPVT_GenerateAP::GenerateComboBoxAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict) 630ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 631ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return GenerateWidgetAP(pDoc, pAnnotDict, 1); 632ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 633ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPVT_GenerateAP::GenerateListBoxAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict) 634ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 635ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return GenerateWidgetAP(pDoc, pAnnotDict, 2); 636ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 637ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString CPVT_GenerateAP::GenerateEditAP(IPVT_FontMap * pFontMap, IPDF_VariableText_Iterator* pIterator, const CPDF_Point & ptOffset, FX_BOOL bContinuous, FX_WORD SubWord, const CPVT_WordRange * pVisible) 638ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 639ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteTextBuf sEditStream, sLineStream, sWords; 640ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Point ptOld(0.0f, 0.0f), ptNew(0.0f, 0.0f); 641ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 nCurFontIndex = -1; 642ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pIterator) { 643ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pVisible) { 644ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pIterator->SetAt(pVisible->BeginPos); 645ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 646ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pIterator->SetAt(0); 647ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 648ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPVT_WordPlace oldplace; 649ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (pIterator->NextWord()) { 650ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPVT_WordPlace place = pIterator->GetAt(); 651ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pVisible && place.WordCmp(pVisible->EndPos) > 0) { 652ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 653ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 654ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bContinuous) { 655ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (place.LineCmp(oldplace) != 0) { 656ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (sWords.GetSize() > 0) { 657ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sLineStream << GetWordRenderString(sWords.GetByteString()); 658ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sEditStream << sLineStream; 659ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sLineStream.Clear(); 660ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sWords.Clear(); 661ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 662ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPVT_Word word; 663ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pIterator->GetWord(word)) { 664ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ptNew = CPDF_Point(word.ptWord.x + ptOffset.x, word.ptWord.y + ptOffset.y); 665ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 666ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPVT_Line line; 667ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pIterator->GetLine(line); 668ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ptNew = CPDF_Point(line.ptLine.x + ptOffset.x, line.ptLine.y + ptOffset.y); 669ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 670ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ptNew.x != ptOld.x || ptNew.y != ptOld.y) { 671ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sLineStream << ptNew.x - ptOld.x << " " << ptNew.y - ptOld.y << " Td\n"; 672ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ptOld = ptNew; 673ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 674ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 675ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPVT_Word word; 676ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pIterator->GetWord(word)) { 677ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (word.nFontIndex != nCurFontIndex) { 678ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (sWords.GetSize() > 0) { 679ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sLineStream << GetWordRenderString(sWords.GetByteString()); 680ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sWords.Clear(); 681ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 682ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sLineStream << GetFontSetString(pFontMap, word.nFontIndex, word.fFontSize); 683ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nCurFontIndex = word.nFontIndex; 684ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 685ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sWords << GetPDFWordString(pFontMap, nCurFontIndex, word.Word, SubWord); 686ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 687ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov oldplace = place; 688ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 689ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPVT_Word word; 690ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pIterator->GetWord(word)) { 691ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ptNew = CPDF_Point(word.ptWord.x + ptOffset.x, word.ptWord.y + ptOffset.y); 692ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ptNew.x != ptOld.x || ptNew.y != ptOld.y) { 693ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sEditStream << ptNew.x - ptOld.x << " " << ptNew.y - ptOld.y << " Td\n"; 694ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ptOld = ptNew; 695ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 696ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (word.nFontIndex != nCurFontIndex) { 697ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sEditStream << GetFontSetString(pFontMap, word.nFontIndex, word.fFontSize); 698ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nCurFontIndex = word.nFontIndex; 699ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 700ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sEditStream << GetWordRenderString(GetPDFWordString(pFontMap, nCurFontIndex, word.Word, SubWord)); 701ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 702ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 703ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 704ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (sWords.GetSize() > 0) { 705ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sLineStream << GetWordRenderString(sWords.GetByteString()); 706ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sEditStream << sLineStream; 707ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sWords.Clear(); 708ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 709ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 710ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return sEditStream.GetByteString(); 711ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 712ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString CPVT_GenerateAP::GenerateBorderAP(const CPDF_Rect & rect, FX_FLOAT fWidth, 713ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const CPVT_Color & color, const CPVT_Color & crLeftTop, const CPVT_Color & crRightBottom, 714ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 nStyle, const CPVT_Dash & dash) 715ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 716ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteTextBuf sAppStream; 717ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString sColor; 718ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT fLeft = rect.left; 719ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT fRight = rect.right; 720ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT fTop = rect.top; 721ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT fBottom = rect.bottom; 722ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (fWidth > 0.0f) { 723ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT fHalfWidth = fWidth / 2.0f; 724ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch (nStyle) { 725ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov default: 726ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PBS_SOLID: 727ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sColor = GenerateColorAP(color, TRUE); 728ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (sColor.GetLength() > 0) { 729ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << sColor; 730ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << fLeft << " " << fBottom << " " << fRight - fLeft << " " << fTop - fBottom << " re\n"; 731ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << fLeft + fWidth << " " << fBottom + fWidth << " " 732ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov << fRight - fLeft - fWidth * 2 << " " << fTop - fBottom - fWidth * 2 << " re\n"; 733ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << "f*\n"; 734ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 735ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 736ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PBS_DASH: 737ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sColor = GenerateColorAP(color, FALSE); 738ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (sColor.GetLength() > 0) { 739ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << sColor; 740ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << fWidth << " w" << " [" << dash.nDash << " " << dash.nGap << "] " << dash.nPhase << " d\n"; 741ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << fLeft + fWidth / 2 << " " << fBottom + fWidth / 2 << " m\n"; 742ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << fLeft + fWidth / 2 << " " << fTop - fWidth / 2 << " l\n"; 743ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << fRight - fWidth / 2 << " " << fTop - fWidth / 2 << " l\n"; 744ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << fRight - fWidth / 2 << " " << fBottom + fWidth / 2 << " l\n"; 745ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << fLeft + fWidth / 2 << " " << fBottom + fWidth / 2 << " l S\n"; 746ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 747ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 748ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PBS_BEVELED: 749ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PBS_INSET: 750ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sColor = GenerateColorAP(crLeftTop, TRUE); 751ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (sColor.GetLength() > 0) { 752ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << sColor; 753ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth << " m\n"; 754ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << fLeft + fHalfWidth << " " << fTop - fHalfWidth << " l\n"; 755ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << fRight - fHalfWidth << " " << fTop - fHalfWidth << " l\n"; 756ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << fRight - fHalfWidth * 2 << " " << fTop - fHalfWidth * 2 << " l\n"; 757ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << fLeft + fHalfWidth * 2 << " " << fTop - fHalfWidth * 2 << " l\n"; 758ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << fLeft + fHalfWidth * 2 << " " << fBottom + fHalfWidth * 2 << " l f\n"; 759ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 760ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sColor = GenerateColorAP(crRightBottom, TRUE); 761ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (sColor.GetLength() > 0) { 762ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << sColor; 763ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << fRight - fHalfWidth << " " << fTop - fHalfWidth << " m\n"; 764ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << fRight - fHalfWidth << " " << fBottom + fHalfWidth << " l\n"; 765ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth << " l\n"; 766ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << fLeft + fHalfWidth * 2 << " " << fBottom + fHalfWidth * 2 << " l\n"; 767ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << fRight - fHalfWidth * 2 << " " << fBottom + fHalfWidth * 2 << " l\n"; 768ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << fRight - fHalfWidth * 2 << " " << fTop - fHalfWidth * 2 << " l f\n"; 769ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 770ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sColor = GenerateColorAP(color, TRUE); 771ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (sColor.GetLength() > 0) { 772ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << sColor; 773ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << fLeft << " " << fBottom << " " << fRight - fLeft << " " << fTop - fBottom << " re\n"; 774ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth << " " 775ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov << fRight - fLeft - fHalfWidth * 2 << " " << fTop - fBottom - fHalfWidth * 2 << " re f*\n"; 776ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 777ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 778ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PBS_UNDERLINED: 779ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sColor = GenerateColorAP(color, FALSE); 780ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (sColor.GetLength() > 0) { 781ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << sColor; 782ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << fWidth << " w\n"; 783ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << fLeft << " " << fBottom + fWidth / 2 << " m\n"; 784ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sAppStream << fRight << " " << fBottom + fWidth / 2 << " l S\n"; 785ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 786ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 787ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 788ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 789ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return sAppStream.GetByteString(); 790ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 791ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString CPVT_GenerateAP::GenerateColorAP(const CPVT_Color & color, const FX_BOOL & bFillOrStroke) 792ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 793ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteTextBuf sColorStream; 794ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch (color.nColorType) { 795ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case CT_RGB: 796ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sColorStream << color.fColor1 << " " << color.fColor2 << " " << color.fColor3 << " " 797ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov << (bFillOrStroke ? "rg" : "RG") << "\n"; 798ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 799ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case CT_GRAY: 800ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sColorStream << color.fColor1 << " " << (bFillOrStroke ? "g" : "G") << "\n"; 801ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 802ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case CT_CMYK: 803ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sColorStream << color.fColor1 << " " << color.fColor2 << " " << color.fColor3 << " " << color.fColor4 << " " 804ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov << (bFillOrStroke ? "k" : "K") << "\n"; 805ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 806ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 807ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return sColorStream.GetByteString(); 808ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 809