// 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 ||
      pAnnotDict->GetConstString("Subtype") != FX_BSTRC("Widget")) {
    return FALSE;
  }
  CFX_ByteString field_type = FPDF_GetFieldAttr(pAnnotDict, "FT")->GetString();
  FX_DWORD flags = FPDF_GetFieldAttr(pAnnotDict, "Ff")
                       ? FPDF_GetFieldAttr(pAnnotDict, "Ff")->GetInteger()
                       : 0;
  if (field_type == "Tx") {
    return CPVT_GenerateAP::GenerateTextFieldAP(pDoc, pAnnotDict);
  }
  if (field_type == "Ch") {
    return (flags & (1 << 17))
               ? CPVT_GenerateAP::GenerateComboBoxAP(pDoc, pAnnotDict)
               : CPVT_GenerateAP::GenerateListBoxAP(pDoc, pAnnotDict);
  }
  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);
  ~CPVT_FontMap() override;

  // IPVT_FontMap
  CPDF_Font* GetPDFFont(int32_t nFontIndex) override;
  CFX_ByteString GetPDFFontAlias(int32_t nFontIndex) override;

  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(int32_t 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(int32_t 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() {}
int32_t CPVT_Provider::GetCharWidth(int32_t nFontIndex,
                                    FX_WORD word,
                                    int32_t nWordStyle) {
  if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex)) {
    FX_DWORD charcode = pPDFFont->CharCodeFromUnicode(word);
    if (charcode != -1) {
      return pPDFFont->GetCharWidthF(charcode);
    }
  }
  return 0;
}
int32_t CPVT_Provider::GetTypeAscent(int32_t nFontIndex) {
  if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex)) {
    return pPDFFont->GetTypeAscent();
  }
  return 0;
}
int32_t CPVT_Provider::GetTypeDescent(int32_t nFontIndex) {
  if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex)) {
    return pPDFFont->GetTypeDescent();
  }
  return 0;
}
int32_t CPVT_Provider::GetWordFontIndex(FX_WORD word,
                                        int32_t charset,
                                        int32_t 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;
}
int32_t CPVT_Provider::GetDefaultFontIndex() {
  return 0;
}
static CFX_ByteString GetPDFWordString(IPVT_FontMap* pFontMap,
                                       int32_t 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,
                                       int32_t 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 int32_t& nWidgetType) {
  CPDF_Dictionary* pFormDict = NULL;
  if (CPDF_Dictionary* pRootDict = pDoc->GetRoot()) {
    pFormDict = pRootDict->GetDict("AcroForm");
  }
  if (!pFormDict) {
    return FALSE;
  }
  CFX_ByteString DA;
  if (CPDF_Object* pDAObj = FPDF_GetFieldAttr(pAnnotDict, "DA")) {
    DA = pDAObj->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 (pDRDict && (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;
  }
  CPDF_Rect rcAnnot = pAnnotDict->GetRect("Rect");
  int32_t 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;
  }
  int32_t 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;
    }
    int32_t 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")
              ? FPDF_GetFieldAttr(pAnnotDict, "V")->GetUnicodeText()
              : CFX_WideString();
      int32_t nAlign = FPDF_GetFieldAttr(pAnnotDict, "Q")
                           ? FPDF_GetFieldAttr(pAnnotDict, "Q")->GetInteger()
                           : 0;
      FX_DWORD dwFlags = FPDF_GetFieldAttr(pAnnotDict, "Ff")
                             ? FPDF_GetFieldAttr(pAnnotDict, "Ff")->GetInteger()
                             : 0;
      FX_DWORD dwMaxLen =
          FPDF_GetFieldAttr(pAnnotDict, "MaxLen")
              ? FPDF_GetFieldAttr(pAnnotDict, "MaxLen")->GetInteger()
              : 0;
      CPVT_FontMap map(pDoc,
                       pStreamDict ? pStreamDict->GetDict("Resources") : NULL,
                       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.c_str());
      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")
              ? FPDF_GetFieldAttr(pAnnotDict, "V")->GetUnicodeText()
              : CFX_WideString();
      CPVT_FontMap map(pDoc,
                       pStreamDict ? pStreamDict->GetDict("Resources") : NULL,
                       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.c_str());
      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 ? pStreamDict->GetDict("Resources") : NULL,
                       pDefFont, sFontName.Right(sFontName.GetLength() - 1));
      CPVT_Provider prd(&map);
      CPDF_Array* pOpts = FPDF_GetFieldAttr(pAnnotDict, "Opt")
                              ? FPDF_GetFieldAttr(pAnnotDict, "Opt")->GetArray()
                              : NULL;
      CPDF_Array* pSels = FPDF_GetFieldAttr(pAnnotDict, "I")
                              ? FPDF_GetFieldAttr(pAnnotDict, "I")->GetArray()
                              : NULL;
      int32_t nTop = FPDF_GetFieldAttr(pAnnotDict, "TI")
                         ? FPDF_GetFieldAttr(pAnnotDict, "TI")->GetInteger()
                         : 0;
      CFX_ByteTextBuf sBody;
      if (pOpts) {
        FX_FLOAT fy = rcBody.top;
        for (int32_t 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.c_str());
            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((uint8_t*)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);
  int32_t 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,
    int32_t 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();
}
