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