// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
 
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#include "../../include/fpdfdoc/fpdf_doc.h"
#include "../../include/fpdfdoc/fpdf_vt.h"
#include "pdf_vt.h"
#include "../../include/fpdfdoc/fpdf_ap.h"
FX_BOOL FPDF_GenerateAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict)
{
    if (pAnnotDict->GetConstString("Subtype") != FX_BSTRC("Widget")) {
        return FALSE;
    }
    CFX_ByteString field_type = FPDF_GetFieldAttr(pAnnotDict, "FT")->GetString();
    FX_DWORD flags = FPDF_GetFieldAttr(pAnnotDict, "Ff")->GetInteger();
    if (field_type == "Tx") {
        return CPVT_GenerateAP::GenerateTextFieldAP(pDoc, pAnnotDict);
    } else if (field_type == "Ch") {
        if (flags & (1 << 17)) {
            return CPVT_GenerateAP::GenerateComboBoxAP(pDoc, pAnnotDict);
        } else {
            return CPVT_GenerateAP::GenerateListBoxAP(pDoc, pAnnotDict);
        }
    } else if (field_type == "Btn") {
        if (!(flags & (1 << 16))) {
            if (!pAnnotDict->KeyExist("AS")) {
                if (CPDF_Dictionary* pParentDict = pAnnotDict->GetDict("Parent")) {
                    if (pParentDict->KeyExist("AS")) {
                        pAnnotDict->SetAtString("AS", pParentDict->GetString("AS"));
                    }
                }
            }
        }
    }
    return FALSE;
}
class CPVT_FontMap : public IPVT_FontMap
{
public:
    CPVT_FontMap(CPDF_Document * pDoc, CPDF_Dictionary * pResDict, CPDF_Font * pDefFont,
                 const CFX_ByteString & sDefFontAlias);
    virtual ~CPVT_FontMap();
    CPDF_Font*						GetPDFFont(FX_INT32 nFontIndex);
    CFX_ByteString					GetPDFFontAlias(FX_INT32 nFontIndex);
    static void						GetAnnotSysPDFFont(CPDF_Document * pDoc, CPDF_Dictionary * pResDict,
            CPDF_Font * & pSysFont, CFX_ByteString & sSysFontAlias);
private:
    CPDF_Document*					m_pDocument;
    CPDF_Dictionary*				m_pResDict;
    CPDF_Font*						m_pDefFont;
    CFX_ByteString					m_sDefFontAlias;
    CPDF_Font*						m_pSysFont;
    CFX_ByteString					m_sSysFontAlias;
};
CPVT_FontMap::CPVT_FontMap(CPDF_Document * pDoc, CPDF_Dictionary * pResDict, CPDF_Font * pDefFont,
                           const CFX_ByteString & sDefFontAlias) :
    m_pDocument(pDoc),
    m_pResDict(pResDict),
    m_pDefFont(pDefFont),
    m_sDefFontAlias(sDefFontAlias),
    m_pSysFont(NULL),
    m_sSysFontAlias()
{
}
CPVT_FontMap::~CPVT_FontMap()
{
}
extern CPDF_Font*		AddNativeInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, CFX_ByteString& csNameTag);
void CPVT_FontMap::GetAnnotSysPDFFont(CPDF_Document * pDoc, CPDF_Dictionary * pResDict,
                                      CPDF_Font * & pSysFont, CFX_ByteString & sSysFontAlias)
{
    if (pDoc && pResDict) {
        CFX_ByteString sFontAlias;
        CPDF_Dictionary* pFormDict = pDoc->GetRoot()->GetDict("AcroForm");
        if (CPDF_Font * pPDFFont = AddNativeInterFormFont(pFormDict, pDoc, sSysFontAlias)) {
            if (CPDF_Dictionary * pFontList = pResDict->GetDict("Font")) {
                if (!pFontList->KeyExist(sSysFontAlias)) {
                    pFontList->SetAtReference(sSysFontAlias, pDoc, pPDFFont->GetFontDict());
                }
            }
            pSysFont = pPDFFont;
        }
    }
}
CPDF_Font* CPVT_FontMap::GetPDFFont(FX_INT32 nFontIndex)
{
    switch (nFontIndex) {
        case 0:
            return m_pDefFont;
        case 1:
            if (!m_pSysFont) {
                GetAnnotSysPDFFont(m_pDocument, m_pResDict, m_pSysFont, m_sSysFontAlias);
            }
            return m_pSysFont;
    }
    return NULL;
}
CFX_ByteString CPVT_FontMap::GetPDFFontAlias(FX_INT32 nFontIndex)
{
    switch (nFontIndex) {
        case 0:
            return m_sDefFontAlias;
        case 1:
            if (!m_pSysFont) {
                GetAnnotSysPDFFont(m_pDocument, m_pResDict, m_pSysFont, m_sSysFontAlias);
            }
            return m_sSysFontAlias;
    }
    return "";
}
CPVT_Provider::CPVT_Provider(IPVT_FontMap * pFontMap) : m_pFontMap(pFontMap)
{
    ASSERT (m_pFontMap != NULL);
}
CPVT_Provider::~CPVT_Provider()
{
}
FX_INT32 CPVT_Provider::GetCharWidth(FX_INT32 nFontIndex, FX_WORD word, FX_INT32 nWordStyle)
{
    if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex)) {
        FX_DWORD charcode = pPDFFont->CharCodeFromUnicode(word);
        if (charcode != -1) {
            return pPDFFont->GetCharWidthF(charcode);
        }
    }
    return 0;
}
FX_INT32 CPVT_Provider::GetTypeAscent(FX_INT32 nFontIndex)
{
    if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex)) {
        return pPDFFont->GetTypeAscent();
    }
    return 0;
}
FX_INT32 CPVT_Provider::GetTypeDescent(FX_INT32 nFontIndex)
{
    if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex)) {
        return pPDFFont->GetTypeDescent();
    }
    return 0;
}
FX_INT32 CPVT_Provider::GetWordFontIndex(FX_WORD word, FX_INT32 charset, FX_INT32 nFontIndex)
{
    if (CPDF_Font* pDefFont = m_pFontMap->GetPDFFont(0)) {
        if (pDefFont->CharCodeFromUnicode(word) != -1) {
            return 0;
        }
    }
    if (CPDF_Font* pSysFont = m_pFontMap->GetPDFFont(1))
        if (pSysFont->CharCodeFromUnicode(word) != -1) {
            return 1;
        }
    return -1;
}
FX_BOOL CPVT_Provider::IsLatinWord(FX_WORD word)
{
    if ((word >= 0x61 && word <= 0x7A) || (word >= 0x41 && word <= 0x5A) || word == 0x2D || word == 0x27) {
        return TRUE;
    }
    return FALSE;
}
FX_INT32 CPVT_Provider::GetDefaultFontIndex()
{
    return 0;
}
static CFX_ByteString GetPDFWordString(IPVT_FontMap * pFontMap, FX_INT32 nFontIndex, FX_WORD Word, FX_WORD SubWord)
{
    CFX_ByteString sWord;
    if (SubWord > 0) {
        sWord.Format("%c", SubWord);
    } else {
        if (pFontMap) {
            if (CPDF_Font * pPDFFont = pFontMap->GetPDFFont(nFontIndex)) {
                if (pPDFFont->GetBaseFont().Compare("Symbol") == 0 || pPDFFont->GetBaseFont().Compare("ZapfDingbats") == 0) {
                    sWord.Format("%c", Word);
                } else {
                    FX_DWORD dwCharCode = pPDFFont->CharCodeFromUnicode(Word);
                    if (dwCharCode != -1) {
                        pPDFFont->AppendChar(sWord, dwCharCode);
                    }
                }
            }
        }
    }
    return sWord;
}
static CFX_ByteString GetWordRenderString(const CFX_ByteString & strWords)
{
    if (strWords.GetLength() > 0) {
        return PDF_EncodeString(strWords) + " Tj\n";
    }
    return "";
}
static CFX_ByteString GetFontSetString(IPVT_FontMap * pFontMap, FX_INT32 nFontIndex, FX_FLOAT fFontSize)
{
    CFX_ByteTextBuf sRet;
    if (pFontMap) {
        CFX_ByteString sFontAlias = pFontMap->GetPDFFontAlias(nFontIndex);
        if (sFontAlias.GetLength() > 0 && fFontSize > 0 ) {
            sRet << "/" << sFontAlias << " " << fFontSize << " Tf\n";
        }
    }
    return sRet.GetByteString();
}
static CPVT_Color ParseColor(const CFX_ByteString & str)
{
    CPDF_SimpleParser syntax(str);
    syntax.SetPos(0);
    if (syntax.FindTagParam("g", 1)) {
        return CPVT_Color(CT_GRAY, FX_atof(syntax.GetWord()));
    }
    syntax.SetPos(0);
    if (syntax.FindTagParam("rg", 3)) {
        FX_FLOAT f1 = FX_atof(syntax.GetWord());
        FX_FLOAT f2 = FX_atof(syntax.GetWord());
        FX_FLOAT f3 = FX_atof(syntax.GetWord());
        return CPVT_Color(CT_RGB, f1, f2, f3);
    }
    syntax.SetPos(0);
    if (syntax.FindTagParam("k", 4)) {
        FX_FLOAT f1 = FX_atof(syntax.GetWord());
        FX_FLOAT f2 = FX_atof(syntax.GetWord());
        FX_FLOAT f3 = FX_atof(syntax.GetWord());
        FX_FLOAT f4 = FX_atof(syntax.GetWord());
        return CPVT_Color(CT_CMYK, f1, f2, f3, f4);
    }
    return CPVT_Color(CT_TRANSPARENT);
}
static CPVT_Color ParseColor(const CPDF_Array & array)
{
    CPVT_Color rt;
    switch (array.GetCount()) {
        case 1:
            rt = CPVT_Color(CT_GRAY, array.GetFloat(0));
            break;
        case 3:
            rt = CPVT_Color(CT_RGB, array.GetFloat(0), array.GetFloat(1), array.GetFloat(2));
            break;
        case 4:
            rt = CPVT_Color(CT_CMYK, array.GetFloat(0), array.GetFloat(1), array.GetFloat(2), array.GetFloat(3));
            break;
    }
    return rt;
}
static FX_BOOL GenerateWidgetAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict, const FX_INT32 & nWidgetType)
{
    CPDF_Dictionary* pFormDict = NULL;
    if (CPDF_Dictionary * pRootDict = pDoc->GetRoot()) {
        pFormDict = pRootDict->GetDict("AcroForm");
    }
    if (!pFormDict) {
        return FALSE;
    }
    CFX_ByteString DA = FPDF_GetFieldAttr(pAnnotDict, "DA")->GetString();
    if (DA.IsEmpty()) {
        DA = pFormDict->GetString("DA");
    }
    if (DA.IsEmpty()) {
        return FALSE;
    }
    CPDF_SimpleParser syntax(DA);
    syntax.FindTagParam("Tf", 2);
    CFX_ByteString sFontName = syntax.GetWord();
    sFontName = PDF_NameDecode(sFontName);
    if (sFontName.IsEmpty()) {
        return FALSE;
    }
    FX_FLOAT fFontSize = FX_atof(syntax.GetWord());
    CPVT_Color crText = ParseColor(DA);
    FX_BOOL bUseFormRes = FALSE;
    CPDF_Dictionary * pFontDict = NULL;
    CPDF_Dictionary* pDRDict = pAnnotDict->GetDict(FX_BSTRC("DR"));
    if (pDRDict == NULL) {
        pDRDict = pFormDict->GetDict(FX_BSTRC("DR"));
        bUseFormRes = TRUE;
    }
    CPDF_Dictionary * pDRFontDict = NULL;
    if ((pDRFontDict = pDRDict->GetDict("Font"))) {
        pFontDict = pDRFontDict->GetDict(sFontName.Mid(1));
        if (!pFontDict && !bUseFormRes) {
            pDRDict = pFormDict->GetDict(FX_BSTRC("DR"));
            pDRFontDict = pDRDict->GetDict("Font");
            if (pDRFontDict) {
                pFontDict = pDRFontDict->GetDict(sFontName.Mid(1));
            }
        }
    }
    if (!pDRFontDict) {
        return FALSE;
    }
    if (!pFontDict) {
        pFontDict = CPDF_Dictionary::Create();
        if (pFontDict == NULL) {
            return FALSE;
        }
        pFontDict->SetAtName(FX_BSTRC("Type"), "Font");
        pFontDict->SetAtName(FX_BSTRC("Subtype"), "Type1");
        pFontDict->SetAtName(FX_BSTRC("BaseFont"), "Helvetica");
        pFontDict->SetAtName(FX_BSTRC("Encoding"), "WinAnsiEncoding");
        pDoc->AddIndirectObject(pFontDict);
        pDRFontDict->SetAtReference(sFontName.Mid(1), pDoc, pFontDict);
    }
    CPDF_Font* pDefFont = pDoc->LoadFont(pFontDict);
    if (!pDefFont) {
        return FALSE;
    }
    CFX_CharMap* pCharMap = pDefFont->GetCharMap();
    CPDF_Rect rcAnnot = pAnnotDict->GetRect("Rect");
    FX_INT32 nRotate = 0;
    if (CPDF_Dictionary * pMKDict = pAnnotDict->GetDict("MK")) {
        nRotate = pMKDict->GetInteger("R");
    }
    CPDF_Rect rcBBox;
    CPDF_Matrix matrix;
    switch (nRotate % 360) {
        case 0:
            rcBBox = CPDF_Rect(0, 0, rcAnnot.right - rcAnnot.left, rcAnnot.top - rcAnnot.bottom);
            break;
        case 90:
            matrix = CPDF_Matrix(0, 1, -1, 0, rcAnnot.right - rcAnnot.left, 0);
            rcBBox = CPDF_Rect(0, 0, rcAnnot.top - rcAnnot.bottom, rcAnnot.right - rcAnnot.left);
            break;
        case 180:
            matrix = CPDF_Matrix(-1, 0, 0, -1, rcAnnot.right - rcAnnot.left, rcAnnot.top - rcAnnot.bottom);
            rcBBox = CPDF_Rect(0, 0, rcAnnot.right - rcAnnot.left, rcAnnot.top - rcAnnot.bottom);
            break;
        case 270:
            matrix = CPDF_Matrix(0, -1, 1, 0, 0, rcAnnot.top - rcAnnot.bottom);
            rcBBox = CPDF_Rect(0, 0, rcAnnot.top - rcAnnot.bottom, rcAnnot.right - rcAnnot.left);
            break;
    }
    FX_INT32 nBorderStyle = PBS_SOLID;
    FX_FLOAT fBorderWidth = 1;
    CPVT_Dash dsBorder(3, 0, 0);
    CPVT_Color crLeftTop, crRightBottom;
    if (CPDF_Dictionary * pBSDict = pAnnotDict->GetDict("BS")) {
        if (pBSDict->KeyExist("W")) {
            fBorderWidth = pBSDict->GetNumber("W");
        }
        if (CPDF_Array * pArray = pBSDict->GetArray("D")) {
            dsBorder = CPVT_Dash(pArray->GetInteger(0), pArray->GetInteger(1), pArray->GetInteger(2));
        }
        switch (pBSDict->GetString("S").GetAt(0)) {
            case 'S':
                nBorderStyle = PBS_SOLID;
                break;
            case 'D':
                nBorderStyle = PBS_DASH;
                break;
            case 'B':
                nBorderStyle = PBS_BEVELED;
                fBorderWidth *= 2;
                crLeftTop = CPVT_Color(CT_GRAY, 1);
                crRightBottom = CPVT_Color(CT_GRAY, 0.5);
                break;
            case 'I':
                nBorderStyle = PBS_INSET;
                fBorderWidth *= 2;
                crLeftTop = CPVT_Color(CT_GRAY, 0.5);
                crRightBottom = CPVT_Color(CT_GRAY, 0.75);
                break;
            case 'U':
                nBorderStyle = PBS_UNDERLINED;
                break;
        }
    }
    CPVT_Color crBorder, crBG;
    if (CPDF_Dictionary * pMKDict = pAnnotDict->GetDict("MK")) {
        if (CPDF_Array * pArray = pMKDict->GetArray("BC")) {
            crBorder = ParseColor(*pArray);
        }
        if (CPDF_Array * pArray = pMKDict->GetArray("BG")) {
            crBG = ParseColor(*pArray);
        }
    }
    CFX_ByteTextBuf sAppStream;
    CFX_ByteString sBG = CPVT_GenerateAP::GenerateColorAP(crBG, TRUE);
    if (sBG.GetLength() > 0) {
        sAppStream << "q\n" << sBG << rcBBox.left << " " << rcBBox.bottom << " "
                   << rcBBox.Width() << " " << rcBBox.Height() << " re f\n" << "Q\n";
    }
    CFX_ByteString sBorderStream = CPVT_GenerateAP::GenerateBorderAP(rcBBox, fBorderWidth,
                                   crBorder, crLeftTop, crRightBottom, nBorderStyle, dsBorder);
    if (sBorderStream.GetLength() > 0) {
        sAppStream << "q\n" << sBorderStream << "Q\n";
    }
    CPDF_Rect rcBody = CPDF_Rect(rcBBox.left + fBorderWidth, rcBBox.bottom + fBorderWidth,
                                 rcBBox.right - fBorderWidth, rcBBox.top - fBorderWidth);
    rcBody.Normalize();
    CPDF_Dictionary* pAPDict = pAnnotDict->GetDict("AP");
    if (pAPDict == NULL) {
        pAPDict = CPDF_Dictionary::Create();
        if (pAPDict == NULL) {
            return FALSE;
        }
        pAnnotDict->SetAt("AP", pAPDict);
    }
    CPDF_Stream* pNormalStream = pAPDict->GetStream("N");
    if (pNormalStream == NULL) {
        pNormalStream = CPDF_Stream::Create(NULL, 0, NULL);
        if (pNormalStream == NULL) {
            return FALSE;
        }
        FX_INT32 objnum = pDoc->AddIndirectObject(pNormalStream);
        pAnnotDict->GetDict("AP")->SetAtReference("N", pDoc, objnum);
    }
    CPDF_Dictionary * pStreamDict = pNormalStream->GetDict();
    if (pStreamDict) {
        pStreamDict->SetAtMatrix("Matrix", matrix);
        pStreamDict->SetAtRect("BBox", rcBBox);
        CPDF_Dictionary* pStreamResList = pStreamDict->GetDict("Resources");
        if (pStreamResList) {
            CPDF_Dictionary* pStreamResFontList = pStreamResList->GetDict("Font");
            if (!pStreamResFontList) {
                pStreamResFontList = CPDF_Dictionary::Create();
                if (pStreamResFontList == NULL) {
                    return FALSE;
                }
                pStreamResList->SetAt("Font", pStreamResFontList);
            }
            if (!pStreamResFontList->KeyExist(sFontName)) {
                pStreamResFontList->SetAtReference(sFontName, pDoc, pFontDict);
            }
        } else {
            pStreamDict->SetAt("Resources", pFormDict->GetDict("DR")->Clone());
            pStreamResList = pStreamDict->GetDict("Resources");
        }
    }
    switch (nWidgetType) {
        case 0: {
                CFX_WideString swValue = FPDF_GetFieldAttr(pAnnotDict, "V")->GetUnicodeText();
                FX_INT32 nAlign = FPDF_GetFieldAttr(pAnnotDict, "Q")->GetInteger();
                FX_DWORD dwFlags = FPDF_GetFieldAttr(pAnnotDict, "Ff")->GetInteger();
                FX_DWORD dwMaxLen = FPDF_GetFieldAttr(pAnnotDict, "MaxLen")->GetInteger();
                CPVT_FontMap map(pDoc, pStreamDict->GetDict("Resources"), pDefFont, sFontName.Right(sFontName.GetLength() - 1));
                CPVT_Provider prd(&map);
                CPDF_VariableText vt;
                vt.SetProvider(&prd);
                vt.SetPlateRect(rcBody);
                vt.SetAlignment(nAlign);
                if (IsFloatZero(fFontSize)) {
                    vt.SetAutoFontSize(TRUE);
                } else {
                    vt.SetFontSize(fFontSize);
                }
                FX_BOOL bMultiLine = (dwFlags >> 12) & 1;
                if (bMultiLine) {
                    vt.SetMultiLine(TRUE);
                    vt.SetAutoReturn(TRUE);
                }
                FX_WORD subWord = 0;
                if ((dwFlags >> 13) & 1) {
                    subWord = '*';
                    vt.SetPasswordChar(subWord);
                }
                FX_BOOL bCharArray = (dwFlags >> 24) & 1;
                if (bCharArray) {
                    vt.SetCharArray(dwMaxLen);
                } else {
                    vt.SetLimitChar(dwMaxLen);
                }
                vt.Initialize();
                vt.SetText(swValue);
                vt.RearrangeAll();
                CPDF_Rect rcContent = vt.GetContentRect();
                CPDF_Point ptOffset(0.0f, 0.0f);
                if (!bMultiLine) {
                    ptOffset = CPDF_Point(0.0f, (rcContent.Height() - rcBody.Height()) / 2.0f);
                }
                CFX_ByteString sBody = CPVT_GenerateAP::GenerateEditAP(&map, vt.GetIterator(), ptOffset, !bCharArray, subWord);
                if (sBody.GetLength() > 0) {
                    sAppStream << "/Tx BMC\n" << "q\n";
                    if (rcContent.Width() > rcBody.Width() ||
                            rcContent.Height() > rcBody.Height()) {
                        sAppStream << rcBody.left << " " << rcBody.bottom << " "
                                   << rcBody.Width() << " " << rcBody.Height() << " re\nW\nn\n";
                    }
                    sAppStream << "BT\n" << CPVT_GenerateAP::GenerateColorAP(crText, TRUE) << sBody << "ET\n" << "Q\nEMC\n";
                }
            }
            break;
        case 1: {
                CFX_WideString swValue = FPDF_GetFieldAttr(pAnnotDict, "V")->GetUnicodeText();
                CPVT_FontMap map(pDoc, pStreamDict->GetDict("Resources"), pDefFont, sFontName.Right(sFontName.GetLength() - 1));
                CPVT_Provider prd(&map);
                CPDF_VariableText vt;
                vt.SetProvider(&prd);
                CPDF_Rect rcButton = rcBody;
                rcButton.left = rcButton.right - 13;
                rcButton.Normalize();
                CPDF_Rect rcEdit = rcBody;
                rcEdit.right = rcButton.left;
                rcEdit.Normalize();
                vt.SetPlateRect(rcEdit);
                if (IsFloatZero(fFontSize)) {
                    vt.SetAutoFontSize(TRUE);
                } else {
                    vt.SetFontSize(fFontSize);
                }
                vt.Initialize();
                vt.SetText(swValue);
                vt.RearrangeAll();
                CPDF_Rect rcContent = vt.GetContentRect();
                CPDF_Point ptOffset = CPDF_Point(0.0f, (rcContent.Height() - rcEdit.Height()) / 2.0f);
                CFX_ByteString sEdit = CPVT_GenerateAP::GenerateEditAP(&map, vt.GetIterator(), ptOffset, TRUE, 0);
                if (sEdit.GetLength() > 0) {
                    sAppStream << "/Tx BMC\n" << "q\n";
                    sAppStream << rcEdit.left << " " << rcEdit.bottom << " "
                               << rcEdit.Width() << " " << rcEdit.Height() << " re\nW\nn\n";
                    sAppStream << "BT\n" << CPVT_GenerateAP::GenerateColorAP(crText, TRUE) << sEdit << "ET\n" << "Q\nEMC\n";
                }
                CFX_ByteString sButton = CPVT_GenerateAP::GenerateColorAP(CPVT_Color(CT_RGB, 220.0f / 255.0f, 220.0f / 255.0f, 220.0f / 255.0f), TRUE);
                if (sButton.GetLength() > 0 && !rcButton.IsEmpty()) {
                    sAppStream << "q\n" << sButton;
                    sAppStream << rcButton.left << " " << rcButton.bottom << " "
                               << rcButton.Width() << " " << rcButton.Height() << " re f\n";
                    sAppStream << "Q\n";
                    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));
                    if (sButtonBorder.GetLength() > 0) {
                        sAppStream << "q\n" << sButtonBorder << "Q\n";
                    }
                    CPDF_Point ptCenter = CPDF_Point((rcButton.left + rcButton.right) / 2, (rcButton.top + rcButton.bottom) / 2);
                    if (IsFloatBigger(rcButton.Width(), 6) && IsFloatBigger(rcButton.Height(), 6)) {
                        sAppStream << "q\n" << " 0 g\n";
                        sAppStream << ptCenter.x - 3 << " " << ptCenter.y + 1.5f << " m\n";
                        sAppStream << ptCenter.x + 3 << " " << ptCenter.y + 1.5f << " l\n";
                        sAppStream << ptCenter.x << " " << ptCenter.y - 1.5f << " l\n";
                        sAppStream << ptCenter.x - 3 << " " << ptCenter.y + 1.5f << " l f\n";
                        sAppStream << sButton << "Q\n";
                    }
                }
            }
            break;
        case 2: {
                CPVT_FontMap map(pDoc, pStreamDict->GetDict("Resources"), pDefFont, sFontName.Right(sFontName.GetLength() - 1));
                CPVT_Provider prd(&map);
                CPDF_Array * pOpts = FPDF_GetFieldAttr(pAnnotDict, "Opt")->GetArray();
                CPDF_Array * pSels = FPDF_GetFieldAttr(pAnnotDict, "I")->GetArray();
                FX_INT32 nTop = FPDF_GetFieldAttr(pAnnotDict, "TI")->GetInteger();
                CFX_ByteTextBuf sBody;
                if (pOpts) {
                    FX_FLOAT fy = rcBody.top;
                    for (FX_INT32 i = nTop, sz = pOpts->GetCount(); i < sz; i++) {
                        if (IsFloatSmaller(fy, rcBody.bottom)) {
                            break;
                        }
                        if (CPDF_Object* pOpt = pOpts->GetElementValue(i)) {
                            CFX_WideString swItem;
                            if (pOpt->GetType() == PDFOBJ_STRING) {
                                swItem = pOpt->GetUnicodeText();
                            } else if (pOpt->GetType() == PDFOBJ_ARRAY) {
                                swItem = ((CPDF_Array*)pOpt)->GetElementValue(1)->GetUnicodeText();
                            }
                            FX_BOOL bSelected = FALSE;
                            if (pSels) {
                                for (FX_DWORD s = 0, ssz = pSels->GetCount(); s < ssz; s++) {
                                    if (i == pSels->GetInteger(s)) {
                                        bSelected = TRUE;
                                        break;
                                    }
                                }
                            }
                            CPDF_VariableText vt;
                            vt.SetProvider(&prd);
                            vt.SetPlateRect(CPDF_Rect(rcBody.left, 0.0f, rcBody.right, 0.0f));
                            if (IsFloatZero(fFontSize)) {
                                vt.SetFontSize(12.0f);
                            } else {
                                vt.SetFontSize(fFontSize);
                            }
                            vt.Initialize();
                            vt.SetText(swItem);
                            vt.RearrangeAll();
                            FX_FLOAT fItemHeight = vt.GetContentRect().Height();
                            if (bSelected) {
                                CPDF_Rect rcItem = CPDF_Rect(rcBody.left, fy - fItemHeight, rcBody.right, fy);
                                sBody << "q\n" << CPVT_GenerateAP::GenerateColorAP(CPVT_Color(CT_RGB, 0, 51.0f / 255.0f, 113.0f / 255.0f), TRUE)
                                      << rcItem.left << " " << rcItem.bottom << " " << rcItem.Width() << " " << rcItem.Height() << " re f\n" << "Q\n";
                                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";
                            } else {
                                sBody << "BT\n" << CPVT_GenerateAP::GenerateColorAP(crText, TRUE) << CPVT_GenerateAP::GenerateEditAP(&map, vt.GetIterator(), CPDF_Point(0.0f, fy), TRUE, 0) << "ET\n";
                            }
                            fy -= fItemHeight;
                        }
                    }
                }
                if (sBody.GetSize() > 0) {
                    sAppStream << "/Tx BMC\n" << "q\n";
                    sAppStream << rcBody.left << " " << rcBody.bottom << " "
                               << rcBody.Width() << " " << rcBody.Height() << " re\nW\nn\n";
                    sAppStream << sBody.GetByteString() << "Q\nEMC\n";
                }
            }
            break;
    }
    if (pNormalStream) {
        pNormalStream->SetData((FX_BYTE*)sAppStream.GetBuffer(), sAppStream.GetSize(), FALSE, FALSE);
        pStreamDict = pNormalStream->GetDict();
        if (pStreamDict) {
            pStreamDict->SetAtMatrix("Matrix", matrix);
            pStreamDict->SetAtRect("BBox", rcBBox);
            CPDF_Dictionary* pStreamResList = pStreamDict->GetDict("Resources");
            if (pStreamResList) {
                CPDF_Dictionary* pStreamResFontList = pStreamResList->GetDict("Font");
                if (!pStreamResFontList) {
                    pStreamResFontList = CPDF_Dictionary::Create();
                    if (pStreamResFontList == NULL) {
                        return FALSE;
                    }
                    pStreamResList->SetAt("Font", pStreamResFontList);
                }
                if (!pStreamResFontList->KeyExist(sFontName)) {
                    pStreamResFontList->SetAtReference(sFontName, pDoc, pFontDict);
                }
            } else {
                pStreamDict->SetAt("Resources", pFormDict->GetDict("DR")->Clone());
                pStreamResList = pStreamDict->GetDict("Resources");
            }
        }
    }
    return TRUE;
}
FX_BOOL CPVT_GenerateAP::GenerateTextFieldAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict)
{
    return GenerateWidgetAP(pDoc, pAnnotDict, 0);
}
FX_BOOL CPVT_GenerateAP::GenerateComboBoxAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict)
{
    return GenerateWidgetAP(pDoc, pAnnotDict, 1);
}
FX_BOOL CPVT_GenerateAP::GenerateListBoxAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict)
{
    return GenerateWidgetAP(pDoc, pAnnotDict, 2);
}
CFX_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)
{
    CFX_ByteTextBuf sEditStream, sLineStream, sWords;
    CPDF_Point ptOld(0.0f, 0.0f), ptNew(0.0f, 0.0f);
    FX_INT32 nCurFontIndex = -1;
    if (pIterator) {
        if (pVisible) {
            pIterator->SetAt(pVisible->BeginPos);
        } else {
            pIterator->SetAt(0);
        }
        CPVT_WordPlace oldplace;
        while (pIterator->NextWord()) {
            CPVT_WordPlace place = pIterator->GetAt();
            if (pVisible && place.WordCmp(pVisible->EndPos) > 0) {
                break;
            }
            if (bContinuous) {
                if (place.LineCmp(oldplace) != 0) {
                    if (sWords.GetSize() > 0) {
                        sLineStream << GetWordRenderString(sWords.GetByteString());
                        sEditStream << sLineStream;
                        sLineStream.Clear();
                        sWords.Clear();
                    }
                    CPVT_Word word;
                    if (pIterator->GetWord(word)) {
                        ptNew = CPDF_Point(word.ptWord.x + ptOffset.x, word.ptWord.y + ptOffset.y);
                    } else {
                        CPVT_Line line;
                        pIterator->GetLine(line);
                        ptNew = CPDF_Point(line.ptLine.x + ptOffset.x, line.ptLine.y + ptOffset.y);
                    }
                    if (ptNew.x != ptOld.x || ptNew.y != ptOld.y) {
                        sLineStream << ptNew.x - ptOld.x << " " << ptNew.y - ptOld.y << " Td\n";
                        ptOld = ptNew;
                    }
                }
                CPVT_Word word;
                if (pIterator->GetWord(word)) {
                    if (word.nFontIndex != nCurFontIndex) {
                        if (sWords.GetSize() > 0) {
                            sLineStream << GetWordRenderString(sWords.GetByteString());
                            sWords.Clear();
                        }
                        sLineStream << GetFontSetString(pFontMap, word.nFontIndex, word.fFontSize);
                        nCurFontIndex = word.nFontIndex;
                    }
                    sWords << GetPDFWordString(pFontMap, nCurFontIndex, word.Word, SubWord);
                }
                oldplace = place;
            } else {
                CPVT_Word word;
                if (pIterator->GetWord(word)) {
                    ptNew = CPDF_Point(word.ptWord.x + ptOffset.x, word.ptWord.y + ptOffset.y);
                    if (ptNew.x != ptOld.x || ptNew.y != ptOld.y) {
                        sEditStream << ptNew.x - ptOld.x << " " << ptNew.y - ptOld.y << " Td\n";
                        ptOld = ptNew;
                    }
                    if (word.nFontIndex != nCurFontIndex) {
                        sEditStream << GetFontSetString(pFontMap, word.nFontIndex, word.fFontSize);
                        nCurFontIndex = word.nFontIndex;
                    }
                    sEditStream << GetWordRenderString(GetPDFWordString(pFontMap, nCurFontIndex, word.Word, SubWord));
                }
            }
        }
        if (sWords.GetSize() > 0) {
            sLineStream << GetWordRenderString(sWords.GetByteString());
            sEditStream << sLineStream;
            sWords.Clear();
        }
    }
    return sEditStream.GetByteString();
}
CFX_ByteString CPVT_GenerateAP::GenerateBorderAP(const CPDF_Rect & rect, FX_FLOAT fWidth,
        const CPVT_Color & color, const CPVT_Color & crLeftTop, const CPVT_Color & crRightBottom,
        FX_INT32 nStyle, const CPVT_Dash & dash)
{
    CFX_ByteTextBuf sAppStream;
    CFX_ByteString sColor;
    FX_FLOAT fLeft = rect.left;
    FX_FLOAT fRight = rect.right;
    FX_FLOAT fTop = rect.top;
    FX_FLOAT fBottom = rect.bottom;
    if (fWidth > 0.0f) {
        FX_FLOAT fHalfWidth = fWidth / 2.0f;
        switch (nStyle) {
            default:
            case PBS_SOLID:
                sColor = GenerateColorAP(color, TRUE);
                if (sColor.GetLength() > 0) {
                    sAppStream << sColor;
                    sAppStream << fLeft << " " << fBottom << " " << fRight - fLeft << " " << fTop - fBottom << " re\n";
                    sAppStream << fLeft + fWidth << " " << fBottom + fWidth << " "
                               << fRight - fLeft - fWidth * 2 << " " << fTop - fBottom - fWidth * 2 << " re\n";
                    sAppStream << "f*\n";
                }
                break;
            case PBS_DASH:
                sColor = GenerateColorAP(color, FALSE);
                if (sColor.GetLength() > 0) {
                    sAppStream << sColor;
                    sAppStream << fWidth << " w" << " [" << dash.nDash << " " << dash.nGap << "] " << dash.nPhase << " d\n";
                    sAppStream << fLeft + fWidth / 2 << " " << fBottom + fWidth / 2 << " m\n";
                    sAppStream << fLeft + fWidth / 2 << " " << fTop - fWidth / 2 << " l\n";
                    sAppStream << fRight - fWidth / 2 << " " << fTop - fWidth / 2 << " l\n";
                    sAppStream << fRight - fWidth / 2 << " " << fBottom + fWidth / 2 << " l\n";
                    sAppStream << fLeft + fWidth / 2 << " " << fBottom + fWidth / 2 << " l S\n";
                }
                break;
            case PBS_BEVELED:
            case PBS_INSET:
                sColor = GenerateColorAP(crLeftTop, TRUE);
                if (sColor.GetLength() > 0) {
                    sAppStream << sColor;
                    sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth << " m\n";
                    sAppStream << fLeft + fHalfWidth << " " << fTop - fHalfWidth << " l\n";
                    sAppStream << fRight - fHalfWidth << " " << fTop - fHalfWidth << " l\n";
                    sAppStream << fRight - fHalfWidth * 2 << " " << fTop - fHalfWidth * 2 << " l\n";
                    sAppStream << fLeft + fHalfWidth * 2 << " " << fTop - fHalfWidth * 2 << " l\n";
                    sAppStream << fLeft + fHalfWidth * 2 << " " << fBottom + fHalfWidth * 2 << " l f\n";
                }
                sColor = GenerateColorAP(crRightBottom, TRUE);
                if (sColor.GetLength() > 0) {
                    sAppStream << sColor;
                    sAppStream << fRight - fHalfWidth << " " <<	fTop - fHalfWidth << " m\n";
                    sAppStream << fRight - fHalfWidth << " " <<	fBottom + fHalfWidth << " l\n";
                    sAppStream << fLeft + fHalfWidth << " " << 	fBottom + fHalfWidth << " l\n";
                    sAppStream << fLeft + fHalfWidth * 2 << " " << fBottom + fHalfWidth * 2 << " l\n";
                    sAppStream << fRight - fHalfWidth * 2 << " " << fBottom + fHalfWidth * 2 << " l\n";
                    sAppStream << fRight - fHalfWidth * 2 << " " << fTop - fHalfWidth * 2 << " l f\n";
                }
                sColor = GenerateColorAP(color, TRUE);
                if (sColor.GetLength() > 0) {
                    sAppStream << sColor;
                    sAppStream << fLeft << " " << fBottom << " " <<	fRight - fLeft << " " << fTop - fBottom << " re\n";
                    sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth << " "
                               << fRight - fLeft - fHalfWidth * 2 << " " << fTop - fBottom - fHalfWidth * 2 << " re f*\n";
                }
                break;
            case PBS_UNDERLINED:
                sColor = GenerateColorAP(color, FALSE);
                if (sColor.GetLength() > 0) {
                    sAppStream << sColor;
                    sAppStream << fWidth << " w\n";
                    sAppStream << fLeft << " " << fBottom + fWidth / 2 << " m\n";
                    sAppStream << fRight << " " << fBottom + fWidth / 2 << " l S\n";
                }
                break;
        }
    }
    return sAppStream.GetByteString();
}
CFX_ByteString CPVT_GenerateAP::GenerateColorAP(const CPVT_Color & color, const FX_BOOL & bFillOrStroke)
{
    CFX_ByteTextBuf sColorStream;
    switch (color.nColorType) {
        case CT_RGB:
            sColorStream << color.fColor1 << " " << color.fColor2 << " " << color.fColor3 << " "
                         << (bFillOrStroke ? "rg" : "RG") << "\n";
            break;
        case CT_GRAY:
            sColorStream << color.fColor1 << " " << (bFillOrStroke ? "g" : "G") << "\n";
            break;
        case CT_CMYK:
            sColorStream << color.fColor1 << " " << color.fColor2 << " " << color.fColor3 << " " << color.fColor4 << " "
                         << (bFillOrStroke ? "k" : "K") << "\n";
            break;
    }
    return sColorStream.GetByteString();
}
