14d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Copyright 2016 PDFium Authors. All rights reserved.
24d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be
34d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// found in the LICENSE file.
44d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
54d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
64d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
74d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfdoc/cpvt_generateap.h"
84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <algorithm>
104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <memory>
114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <utility>
124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/font/cpdf_font.h"
144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_boolean.h"
154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_dictionary.h"
164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_document.h"
174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_name.h"
184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_number.h"
194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_reference.h"
204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_simple_parser.h"
214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_stream.h"
224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_string.h"
234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/fpdf_parser_decode.h"
244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfdoc/cpdf_annot.h"
254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfdoc/cpdf_formfield.h"
264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfdoc/cpvt_color.h"
274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfdoc/cpvt_fontmap.h"
284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfdoc/cpvt_word.h"
294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "third_party/base/ptr_util.h"
304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannnamespace {
324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool GenerateWidgetAP(CPDF_Document* pDoc,
344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                      CPDF_Dictionary* pAnnotDict,
354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                      const int32_t& nWidgetType) {
364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Dictionary* pFormDict = nullptr;
374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (CPDF_Dictionary* pRootDict = pDoc->GetRoot())
384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pFormDict = pRootDict->GetDictFor("AcroForm");
394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pFormDict)
404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteString DA;
434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (CPDF_Object* pDAObj = FPDF_GetFieldAttr(pAnnotDict, "DA"))
444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    DA = pDAObj->GetString();
454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (DA.IsEmpty())
464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    DA = pFormDict->GetStringFor("DA");
474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (DA.IsEmpty())
484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_SimpleParser syntax(DA.AsStringC());
514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  syntax.FindTagParamFromStart("Tf", 2);
524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteString sFontName(syntax.GetWord());
534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  sFontName = PDF_NameDecode(sFontName);
544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (sFontName.IsEmpty())
554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_FLOAT fFontSize = FX_atof(syntax.GetWord());
584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPVT_Color crText = CPVT_Color::ParseColor(DA);
594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Dictionary* pDRDict = pFormDict->GetDictFor("DR");
604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pDRDict)
614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Dictionary* pDRFontDict = pDRDict->GetDictFor("Font");
644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pDRFontDict)
654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Dictionary* pFontDict = pDRFontDict->GetDictFor(sFontName.Mid(1));
684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pFontDict) {
694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pFontDict = pDoc->NewIndirect<CPDF_Dictionary>();
704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pFontDict->SetNewFor<CPDF_Name>("Type", "Font");
714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pFontDict->SetNewFor<CPDF_Name>("Subtype", "Type1");
724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pFontDict->SetNewFor<CPDF_Name>("BaseFont", "Helvetica");
734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pFontDict->SetNewFor<CPDF_Name>("Encoding", "WinAnsiEncoding");
744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pDRFontDict->SetNewFor<CPDF_Reference>(sFontName.Mid(1), pDoc,
754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                           pFontDict->GetObjNum());
764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Font* pDefFont = pDoc->LoadFont(pFontDict);
784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pDefFont)
794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_FloatRect rcAnnot = pAnnotDict->GetRectFor("Rect");
824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t nRotate = 0;
834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (CPDF_Dictionary* pMKDict = pAnnotDict->GetDictFor("MK"))
844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    nRotate = pMKDict->GetIntegerFor("R");
854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_FloatRect rcBBox;
874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_Matrix matrix;
884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  switch (nRotate % 360) {
894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case 0:
904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      rcBBox = CFX_FloatRect(0, 0, rcAnnot.right - rcAnnot.left,
914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                             rcAnnot.top - rcAnnot.bottom);
924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case 90:
944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      matrix = CFX_Matrix(0, 1, -1, 0, rcAnnot.right - rcAnnot.left, 0);
954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      rcBBox = CFX_FloatRect(0, 0, rcAnnot.top - rcAnnot.bottom,
964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                             rcAnnot.right - rcAnnot.left);
974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case 180:
994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      matrix = CFX_Matrix(-1, 0, 0, -1, rcAnnot.right - rcAnnot.left,
1004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                          rcAnnot.top - rcAnnot.bottom);
1014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      rcBBox = CFX_FloatRect(0, 0, rcAnnot.right - rcAnnot.left,
1024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                             rcAnnot.top - rcAnnot.bottom);
1034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
1044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case 270:
1054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      matrix = CFX_Matrix(0, -1, 1, 0, 0, rcAnnot.top - rcAnnot.bottom);
1064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      rcBBox = CFX_FloatRect(0, 0, rcAnnot.top - rcAnnot.bottom,
1074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                             rcAnnot.right - rcAnnot.left);
1084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
1094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  BorderStyle nBorderStyle = BorderStyle::SOLID;
1124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_FLOAT fBorderWidth = 1;
1134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPVT_Dash dsBorder(3, 0, 0);
1144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPVT_Color crLeftTop, crRightBottom;
1154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (CPDF_Dictionary* pBSDict = pAnnotDict->GetDictFor("BS")) {
1164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (pBSDict->KeyExist("W"))
1174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      fBorderWidth = pBSDict->GetNumberFor("W");
1184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (CPDF_Array* pArray = pBSDict->GetArrayFor("D")) {
1204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      dsBorder = CPVT_Dash(pArray->GetIntegerAt(0), pArray->GetIntegerAt(1),
1214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                           pArray->GetIntegerAt(2));
1224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
1234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    switch (pBSDict->GetStringFor("S").GetAt(0)) {
1244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      case 'S':
1254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        nBorderStyle = BorderStyle::SOLID;
1264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        break;
1274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      case 'D':
1284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        nBorderStyle = BorderStyle::DASH;
1294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        break;
1304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      case 'B':
1314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        nBorderStyle = BorderStyle::BEVELED;
1324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        fBorderWidth *= 2;
1334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        crLeftTop = CPVT_Color(CPVT_Color::kGray, 1);
1344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        crRightBottom = CPVT_Color(CPVT_Color::kGray, 0.5);
1354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        break;
1364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      case 'I':
1374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        nBorderStyle = BorderStyle::INSET;
1384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        fBorderWidth *= 2;
1394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        crLeftTop = CPVT_Color(CPVT_Color::kGray, 0.5);
1404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        crRightBottom = CPVT_Color(CPVT_Color::kGray, 0.75);
1414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        break;
1424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      case 'U':
1434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        nBorderStyle = BorderStyle::UNDERLINE;
1444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        break;
1454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
1464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPVT_Color crBorder, crBG;
1484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (CPDF_Dictionary* pMKDict = pAnnotDict->GetDictFor("MK")) {
1494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (CPDF_Array* pArray = pMKDict->GetArrayFor("BC"))
1504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      crBorder = CPVT_Color::ParseColor(*pArray);
1514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (CPDF_Array* pArray = pMKDict->GetArrayFor("BG"))
1524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      crBG = CPVT_Color::ParseColor(*pArray);
1534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteTextBuf sAppStream;
1554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteString sBG =
1564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CPVT_GenerateAP::GenerateColorAP(crBG, PaintOperation::FILL);
1574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (sBG.GetLength() > 0) {
1584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    sAppStream << "q\n" << sBG << rcBBox.left << " " << rcBBox.bottom << " "
1594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann               << rcBBox.Width() << " " << rcBBox.Height() << " re f\n"
1604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann               << "Q\n";
1614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteString sBorderStream = CPVT_GenerateAP::GenerateBorderAP(
1634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      rcBBox, fBorderWidth, crBorder, crLeftTop, crRightBottom, nBorderStyle,
1644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      dsBorder);
1654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (sBorderStream.GetLength() > 0)
1664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    sAppStream << "q\n" << sBorderStream << "Q\n";
1674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_FloatRect rcBody =
1694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CFX_FloatRect(rcBBox.left + fBorderWidth, rcBBox.bottom + fBorderWidth,
1704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                    rcBBox.right - fBorderWidth, rcBBox.top - fBorderWidth);
1714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  rcBody.Normalize();
1724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Dictionary* pAPDict = pAnnotDict->GetDictFor("AP");
1744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pAPDict)
1754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pAPDict = pAnnotDict->SetNewFor<CPDF_Dictionary>("AP");
1764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Stream* pNormalStream = pAPDict->GetStreamFor("N");
1784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pNormalStream) {
1794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pNormalStream = pDoc->NewIndirect<CPDF_Stream>();
1804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pAPDict->SetNewFor<CPDF_Reference>("N", pDoc, pNormalStream->GetObjNum());
1814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Dictionary* pStreamDict = pNormalStream->GetDict();
1834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pStreamDict) {
1844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pStreamDict->SetMatrixFor("Matrix", matrix);
1854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pStreamDict->SetRectFor("BBox", rcBBox);
1864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_Dictionary* pStreamResList = pStreamDict->GetDictFor("Resources");
1874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (pStreamResList) {
1884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CPDF_Dictionary* pStreamResFontList = pStreamResList->GetDictFor("Font");
1894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (!pStreamResFontList)
1904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        pStreamResFontList = pStreamResList->SetNewFor<CPDF_Dictionary>("Font");
1914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (!pStreamResFontList->KeyExist(sFontName)) {
1924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        pStreamResFontList->SetNewFor<CPDF_Reference>(sFontName, pDoc,
1934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                                      pFontDict->GetObjNum());
1944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
1954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } else {
1964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      pStreamDict->SetFor("Resources", pFormDict->GetDictFor("DR")->Clone());
1974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      pStreamResList = pStreamDict->GetDictFor("Resources");
1984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
1994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
2004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  switch (nWidgetType) {
2014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case 0: {
2024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CFX_WideString swValue =
2034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          FPDF_GetFieldAttr(pAnnotDict, "V")
2044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann              ? FPDF_GetFieldAttr(pAnnotDict, "V")->GetUnicodeText()
2054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann              : CFX_WideString();
2064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      int32_t nAlign = FPDF_GetFieldAttr(pAnnotDict, "Q")
2074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                           ? FPDF_GetFieldAttr(pAnnotDict, "Q")->GetInteger()
2084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                           : 0;
2094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      uint32_t dwFlags = FPDF_GetFieldAttr(pAnnotDict, "Ff")
2104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                             ? FPDF_GetFieldAttr(pAnnotDict, "Ff")->GetInteger()
2114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                             : 0;
2124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      uint32_t dwMaxLen =
2134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          FPDF_GetFieldAttr(pAnnotDict, "MaxLen")
2144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann              ? FPDF_GetFieldAttr(pAnnotDict, "MaxLen")->GetInteger()
2154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann              : 0;
2164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CPVT_FontMap map(
2174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          pDoc, pStreamDict ? pStreamDict->GetDictFor("Resources") : nullptr,
2184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          pDefFont, sFontName.Right(sFontName.GetLength() - 1));
2194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CPDF_VariableText::Provider prd(&map);
2204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CPDF_VariableText vt;
2214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      vt.SetProvider(&prd);
2224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      vt.SetPlateRect(rcBody);
2234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      vt.SetAlignment(nAlign);
2244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (IsFloatZero(fFontSize))
2254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        vt.SetAutoFontSize(true);
2264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      else
2274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        vt.SetFontSize(fFontSize);
2284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      bool bMultiLine = (dwFlags >> 12) & 1;
2304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (bMultiLine) {
2314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        vt.SetMultiLine(true);
2324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        vt.SetAutoReturn(true);
2334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
2344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      uint16_t subWord = 0;
2354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if ((dwFlags >> 13) & 1) {
2364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        subWord = '*';
2374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        vt.SetPasswordChar(subWord);
2384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
2394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      bool bCharArray = (dwFlags >> 24) & 1;
2404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (bCharArray)
2414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        vt.SetCharArray(dwMaxLen);
2424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      else
2434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        vt.SetLimitChar(dwMaxLen);
2444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      vt.Initialize();
2464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      vt.SetText(swValue);
2474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      vt.RearrangeAll();
2484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CFX_FloatRect rcContent = vt.GetContentRect();
2495ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann      CFX_PointF ptOffset;
2504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (!bMultiLine) {
2514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        ptOffset =
2525ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann            CFX_PointF(0.0f, (rcContent.Height() - rcBody.Height()) / 2.0f);
2534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
2544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CFX_ByteString sBody = CPVT_GenerateAP::GenerateEditAP(
2554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          &map, vt.GetIterator(), ptOffset, !bCharArray, subWord);
2564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (sBody.GetLength() > 0) {
2574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        sAppStream << "/Tx BMC\n"
2584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                   << "q\n";
2594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (rcContent.Width() > rcBody.Width() ||
2604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            rcContent.Height() > rcBody.Height()) {
2614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          sAppStream << rcBody.left << " " << rcBody.bottom << " "
2624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                     << rcBody.Width() << " " << rcBody.Height()
2634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                     << " re\nW\nn\n";
2644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
2654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        sAppStream << "BT\n"
2664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                   << CPVT_GenerateAP::GenerateColorAP(crText,
2674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                                       PaintOperation::FILL)
2684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                   << sBody << "ET\n"
2694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                   << "Q\nEMC\n";
2704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
2714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } break;
2724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case 1: {
2734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CFX_WideString swValue =
2744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          FPDF_GetFieldAttr(pAnnotDict, "V")
2754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann              ? FPDF_GetFieldAttr(pAnnotDict, "V")->GetUnicodeText()
2764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann              : CFX_WideString();
2774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CPVT_FontMap map(
2784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          pDoc, pStreamDict ? pStreamDict->GetDictFor("Resources") : nullptr,
2794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          pDefFont, sFontName.Right(sFontName.GetLength() - 1));
2804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CPDF_VariableText::Provider prd(&map);
2814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CPDF_VariableText vt;
2824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      vt.SetProvider(&prd);
2834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CFX_FloatRect rcButton = rcBody;
2844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      rcButton.left = rcButton.right - 13;
2854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      rcButton.Normalize();
2864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CFX_FloatRect rcEdit = rcBody;
2874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      rcEdit.right = rcButton.left;
2884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      rcEdit.Normalize();
2894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      vt.SetPlateRect(rcEdit);
2904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (IsFloatZero(fFontSize))
2914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        vt.SetAutoFontSize(true);
2924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      else
2934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        vt.SetFontSize(fFontSize);
2944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      vt.Initialize();
2964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      vt.SetText(swValue);
2974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      vt.RearrangeAll();
2984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CFX_FloatRect rcContent = vt.GetContentRect();
2995ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann      CFX_PointF ptOffset =
3005ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann          CFX_PointF(0.0f, (rcContent.Height() - rcEdit.Height()) / 2.0f);
3014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CFX_ByteString sEdit = CPVT_GenerateAP::GenerateEditAP(
3024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          &map, vt.GetIterator(), ptOffset, true, 0);
3034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (sEdit.GetLength() > 0) {
3044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        sAppStream << "/Tx BMC\n"
3054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                   << "q\n";
3064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        sAppStream << rcEdit.left << " " << rcEdit.bottom << " "
3074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                   << rcEdit.Width() << " " << rcEdit.Height() << " re\nW\nn\n";
3084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        sAppStream << "BT\n"
3094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                   << CPVT_GenerateAP::GenerateColorAP(crText,
3104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                                       PaintOperation::FILL)
3114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                   << sEdit << "ET\n"
3124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                   << "Q\nEMC\n";
3134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
3144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CFX_ByteString sButton = CPVT_GenerateAP::GenerateColorAP(
3154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          CPVT_Color(CPVT_Color::kRGB, 220.0f / 255.0f, 220.0f / 255.0f,
3164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                     220.0f / 255.0f),
3174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          PaintOperation::FILL);
3184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (sButton.GetLength() > 0 && !rcButton.IsEmpty()) {
3194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        sAppStream << "q\n" << sButton;
3204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        sAppStream << rcButton.left << " " << rcButton.bottom << " "
3214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                   << rcButton.Width() << " " << rcButton.Height() << " re f\n";
3224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        sAppStream << "Q\n";
3234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        CFX_ByteString sButtonBorder = CPVT_GenerateAP::GenerateBorderAP(
3244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            rcButton, 2, CPVT_Color(CPVT_Color::kGray, 0),
3254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            CPVT_Color(CPVT_Color::kGray, 1),
3264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            CPVT_Color(CPVT_Color::kGray, 0.5), BorderStyle::BEVELED,
3274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            CPVT_Dash(3, 0, 0));
3284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (sButtonBorder.GetLength() > 0)
3294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          sAppStream << "q\n" << sButtonBorder << "Q\n";
3304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3315ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann        CFX_PointF ptCenter = CFX_PointF((rcButton.left + rcButton.right) / 2,
3325ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                                         (rcButton.top + rcButton.bottom) / 2);
3334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (IsFloatBigger(rcButton.Width(), 6) &&
3344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            IsFloatBigger(rcButton.Height(), 6)) {
3354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          sAppStream << "q\n"
3364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                     << " 0 g\n";
3374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          sAppStream << ptCenter.x - 3 << " " << ptCenter.y + 1.5f << " m\n";
3384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          sAppStream << ptCenter.x + 3 << " " << ptCenter.y + 1.5f << " l\n";
3394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          sAppStream << ptCenter.x << " " << ptCenter.y - 1.5f << " l\n";
3404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          sAppStream << ptCenter.x - 3 << " " << ptCenter.y + 1.5f << " l f\n";
3414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          sAppStream << sButton << "Q\n";
3424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
3434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
3444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } break;
3454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case 2: {
3464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CPVT_FontMap map(
3474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          pDoc, pStreamDict ? pStreamDict->GetDictFor("Resources") : nullptr,
3484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          pDefFont, sFontName.Right(sFontName.GetLength() - 1));
3494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CPDF_VariableText::Provider prd(&map);
3504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CPDF_Array* pOpts = ToArray(FPDF_GetFieldAttr(pAnnotDict, "Opt"));
3514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CPDF_Array* pSels = ToArray(FPDF_GetFieldAttr(pAnnotDict, "I"));
3524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CPDF_Object* pTi = FPDF_GetFieldAttr(pAnnotDict, "TI");
3534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      int32_t nTop = pTi ? pTi->GetInteger() : 0;
3544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CFX_ByteTextBuf sBody;
3554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (pOpts) {
3564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        FX_FLOAT fy = rcBody.top;
3574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        for (size_t i = nTop, sz = pOpts->GetCount(); i < sz; i++) {
3584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          if (IsFloatSmaller(fy, rcBody.bottom))
3594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            break;
3604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          if (CPDF_Object* pOpt = pOpts->GetDirectObjectAt(i)) {
3624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            CFX_WideString swItem;
3634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            if (pOpt->IsString())
3644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann              swItem = pOpt->GetUnicodeText();
3654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            else if (CPDF_Array* pArray = pOpt->AsArray())
3664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann              swItem = pArray->GetDirectObjectAt(1)->GetUnicodeText();
3674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            bool bSelected = false;
3694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            if (pSels) {
3704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann              for (size_t s = 0, ssz = pSels->GetCount(); s < ssz; s++) {
3714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                int value = pSels->GetIntegerAt(s);
3724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                if (value >= 0 && i == static_cast<size_t>(value)) {
3734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                  bSelected = true;
3744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                  break;
3754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                }
3764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann              }
3774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            }
3784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            CPDF_VariableText vt;
3794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            vt.SetProvider(&prd);
3804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            vt.SetPlateRect(
3814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                CFX_FloatRect(rcBody.left, 0.0f, rcBody.right, 0.0f));
3824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            vt.SetFontSize(IsFloatZero(fFontSize) ? 12.0f : fFontSize);
3834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            vt.Initialize();
3854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            vt.SetText(swItem);
3864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            vt.RearrangeAll();
3874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            FX_FLOAT fItemHeight = vt.GetContentRect().Height();
3884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            if (bSelected) {
3894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann              CFX_FloatRect rcItem = CFX_FloatRect(
3904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                  rcBody.left, fy - fItemHeight, rcBody.right, fy);
3914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann              sBody << "q\n"
3924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                    << CPVT_GenerateAP::GenerateColorAP(
3934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                           CPVT_Color(CPVT_Color::kRGB, 0, 51.0f / 255.0f,
3944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                      113.0f / 255.0f),
3954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                           PaintOperation::FILL)
3964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                    << rcItem.left << " " << rcItem.bottom << " "
3974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                    << rcItem.Width() << " " << rcItem.Height() << " re f\n"
3984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                    << "Q\n";
3994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann              sBody << "BT\n"
4004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                    << CPVT_GenerateAP::GenerateColorAP(
4014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                           CPVT_Color(CPVT_Color::kGray, 1),
4024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                           PaintOperation::FILL)
4034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                    << CPVT_GenerateAP::GenerateEditAP(&map, vt.GetIterator(),
4045ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                                                       CFX_PointF(0.0f, fy),
4054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                                       true, 0)
4064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                    << "ET\n";
4074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            } else {
4084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann              sBody << "BT\n"
4094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                    << CPVT_GenerateAP::GenerateColorAP(crText,
4104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                                        PaintOperation::FILL)
4114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                    << CPVT_GenerateAP::GenerateEditAP(&map, vt.GetIterator(),
4125ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                                                       CFX_PointF(0.0f, fy),
4134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                                       true, 0)
4144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                    << "ET\n";
4154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            }
4164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            fy -= fItemHeight;
4174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          }
4184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
4194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
4204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (sBody.GetSize() > 0) {
4214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        sAppStream << "/Tx BMC\nq\n"
4224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                   << rcBody.left << " " << rcBody.bottom << " "
4234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                   << rcBody.Width() << " " << rcBody.Height() << " re\nW\nn\n"
4244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                   << sBody.AsStringC() << "Q\nEMC\n";
4254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
4264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } break;
4274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
4284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pNormalStream) {
4294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pNormalStream->SetData(sAppStream.GetBuffer(), sAppStream.GetSize());
4304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pStreamDict = pNormalStream->GetDict();
4314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (pStreamDict) {
4324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      pStreamDict->SetMatrixFor("Matrix", matrix);
4334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      pStreamDict->SetRectFor("BBox", rcBBox);
4344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CPDF_Dictionary* pStreamResList = pStreamDict->GetDictFor("Resources");
4354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (pStreamResList) {
4364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        CPDF_Dictionary* pStreamResFontList =
4374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            pStreamResList->GetDictFor("Font");
4384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (!pStreamResFontList) {
4394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          pStreamResFontList =
4404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann              pStreamResList->SetNewFor<CPDF_Dictionary>("Font");
4414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
4424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (!pStreamResFontList->KeyExist(sFontName)) {
4434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          pStreamResFontList->SetNewFor<CPDF_Reference>(sFontName, pDoc,
4444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                                        pFontDict->GetObjNum());
4454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
4464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      } else {
4474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        pStreamDict->SetFor("Resources", pFormDict->GetDictFor("DR")->Clone());
4484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        pStreamResList = pStreamDict->GetDictFor("Resources");
4494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
4504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
4514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
4524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return true;
4534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_ByteString GetColorStringWithDefault(CPDF_Array* pColor,
4564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                         const CPVT_Color& crDefaultColor,
4574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                         PaintOperation nOperation) {
4584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pColor) {
4594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPVT_Color color = CPVT_Color::ParseColor(*pColor);
4604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return CPVT_GenerateAP::GenerateColorAP(color, nOperation);
4614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
4624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return CPVT_GenerateAP::GenerateColorAP(crDefaultColor, nOperation);
4644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFX_FLOAT GetBorderWidth(const CPDF_Dictionary& pAnnotDict) {
4674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (CPDF_Dictionary* pBorderStyleDict = pAnnotDict.GetDictFor("BS")) {
4684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (pBorderStyleDict->KeyExist("W"))
4694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return pBorderStyleDict->GetNumberFor("W");
4704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
4714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (CPDF_Array* pBorderArray = pAnnotDict.GetArrayFor("Border")) {
4734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (pBorderArray->GetCount() > 2)
4744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return pBorderArray->GetNumberAt(2);
4754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
4764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return 1;
4784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_Array* GetDashArray(const CPDF_Dictionary& pAnnotDict) {
4814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (CPDF_Dictionary* pBorderStyleDict = pAnnotDict.GetDictFor("BS")) {
4824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (pBorderStyleDict->GetStringFor("S") == "D")
4834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return pBorderStyleDict->GetArrayFor("D");
4844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
4854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (CPDF_Array* pBorderArray = pAnnotDict.GetArrayFor("Border")) {
4874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (pBorderArray->GetCount() == 4)
4884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return pBorderArray->GetArrayAt(3);
4894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
4904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return nullptr;
4924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_ByteString GetDashPatternString(const CPDF_Dictionary& pAnnotDict) {
4954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Array* pDashArray = GetDashArray(pAnnotDict);
4964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pDashArray || pDashArray->IsEmpty())
4974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return CFX_ByteString();
4984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  // Support maximum of ten elements in the dash array.
5004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  size_t pDashArrayCount = std::min<size_t>(pDashArray->GetCount(), 10);
5014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteTextBuf sDashStream;
5024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  sDashStream << "[";
5044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (size_t i = 0; i < pDashArrayCount; ++i)
5054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    sDashStream << pDashArray->GetNumberAt(i) << " ";
5064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  sDashStream << "] 0 d\n";
5074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return sDashStream.MakeString();
5094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_ByteString GetPopupContentsString(CPDF_Document* pDoc,
5124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                      const CPDF_Dictionary& pAnnotDict,
5134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                      CPDF_Font* pDefFont,
5144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                      const CFX_ByteString& sFontName) {
5154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_WideString swValue(pAnnotDict.GetUnicodeTextFor("T"));
5164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  swValue += L'\n';
5174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  swValue += pAnnotDict.GetUnicodeTextFor("Contents");
5184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPVT_FontMap map(pDoc, nullptr, pDefFont, sFontName);
5194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_VariableText::Provider prd(&map);
5214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_VariableText vt;
5224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  vt.SetProvider(&prd);
5234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  vt.SetPlateRect(pAnnotDict.GetRectFor("Rect"));
5244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  vt.SetFontSize(12);
5254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  vt.SetAutoReturn(true);
5264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  vt.SetMultiLine(true);
5274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  vt.Initialize();
5294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  vt.SetText(swValue);
5304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  vt.RearrangeAll();
5315ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann  CFX_PointF ptOffset(3.0f, -3.0f);
5324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteString sContent = CPVT_GenerateAP::GenerateEditAP(
5334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      &map, vt.GetIterator(), ptOffset, false, 0);
5344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (sContent.IsEmpty())
5364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return CFX_ByteString();
5374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteTextBuf sAppStream;
5394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  sAppStream << "BT\n"
5404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann             << CPVT_GenerateAP::GenerateColorAP(
5414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                    CPVT_Color(CPVT_Color::kRGB, 0, 0, 0), PaintOperation::FILL)
5424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann             << sContent << "ET\n"
5434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann             << "Q\n";
5444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return sAppStream.MakeString();
5454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannstd::unique_ptr<CPDF_Dictionary> GenerateExtGStateDict(
5484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    const CPDF_Dictionary& pAnnotDict,
5494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    const CFX_ByteString& sExtGSDictName,
5504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    const CFX_ByteString& sBlendMode) {
5514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto pGSDict =
5524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      pdfium::MakeUnique<CPDF_Dictionary>(pAnnotDict.GetByteStringPool());
5534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pGSDict->SetNewFor<CPDF_String>("Type", "ExtGState", false);
5544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_FLOAT fOpacity =
5564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      pAnnotDict.KeyExist("CA") ? pAnnotDict.GetNumberFor("CA") : 1;
5574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pGSDict->SetNewFor<CPDF_Number>("CA", fOpacity);
5584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pGSDict->SetNewFor<CPDF_Number>("ca", fOpacity);
5594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pGSDict->SetNewFor<CPDF_Boolean>("AIS", false);
5604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pGSDict->SetNewFor<CPDF_String>("BM", sBlendMode, false);
5614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto pExtGStateDict =
5634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      pdfium::MakeUnique<CPDF_Dictionary>(pAnnotDict.GetByteStringPool());
5644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pExtGStateDict->SetFor(sExtGSDictName, std::move(pGSDict));
5654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return pExtGStateDict;
5664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannstd::unique_ptr<CPDF_Dictionary> GenerateResourceFontDict(
5694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_Document* pDoc,
5704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    const CFX_ByteString& sFontDictName) {
5714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Dictionary* pFontDict = pDoc->NewIndirect<CPDF_Dictionary>();
5724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pFontDict->SetNewFor<CPDF_Name>("Type", "Font");
5734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pFontDict->SetNewFor<CPDF_Name>("Subtype", "Type1");
5744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pFontDict->SetNewFor<CPDF_Name>("BaseFont", "Helvetica");
5754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pFontDict->SetNewFor<CPDF_Name>("Encoding", "WinAnsiEncoding");
5764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto pResourceFontDict =
5784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      pdfium::MakeUnique<CPDF_Dictionary>(pDoc->GetByteStringPool());
5794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pResourceFontDict->SetNewFor<CPDF_Reference>(sFontDictName, pDoc,
5804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                               pFontDict->GetObjNum());
5814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return pResourceFontDict;
5824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannstd::unique_ptr<CPDF_Dictionary> GenerateResourceDict(
5854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_Document* pDoc,
5864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    std::unique_ptr<CPDF_Dictionary> pExtGStateDict,
5874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    std::unique_ptr<CPDF_Dictionary> pResourceFontDict) {
5884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto pResourceDict =
5894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      pdfium::MakeUnique<CPDF_Dictionary>(pDoc->GetByteStringPool());
5904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pExtGStateDict)
5914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pResourceDict->SetFor("ExtGState", std::move(pExtGStateDict));
5924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pResourceFontDict)
5934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pResourceDict->SetFor("Font", std::move(pResourceFontDict));
5944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return pResourceDict;
5954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid GenerateAndSetAPDict(CPDF_Document* pDoc,
5984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                          CPDF_Dictionary* pAnnotDict,
5994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                          const CFX_ByteTextBuf& sAppStream,
6004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                          std::unique_ptr<CPDF_Dictionary> pResourceDict,
6014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                          bool bIsTextMarkupAnnotation) {
6024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Stream* pNormalStream = pDoc->NewIndirect<CPDF_Stream>();
6034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pNormalStream->SetData(sAppStream.GetBuffer(), sAppStream.GetSize());
6044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Dictionary* pAPDict = pAnnotDict->SetNewFor<CPDF_Dictionary>("AP");
6064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pAPDict->SetNewFor<CPDF_Reference>("N", pDoc, pNormalStream->GetObjNum());
6074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Dictionary* pStreamDict = pNormalStream->GetDict();
6094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pStreamDict->SetNewFor<CPDF_Number>("FormType", 1);
6104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pStreamDict->SetNewFor<CPDF_String>("Subtype", "Form", false);
6114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pStreamDict->SetMatrixFor("Matrix", CFX_Matrix());
6124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_FloatRect rect = bIsTextMarkupAnnotation
6144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                           ? CPDF_Annot::RectFromQuadPoints(pAnnotDict)
6154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                           : pAnnotDict->GetRectFor("Rect");
6164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pStreamDict->SetRectFor("BBox", rect);
6174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pStreamDict->SetFor("Resources", std::move(pResourceDict));
6184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
6194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_ByteString GetPaintOperatorString(bool bIsStrokeRect, bool bIsFillRect) {
6214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (bIsStrokeRect)
6224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return bIsFillRect ? "b" : "s";
6234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return bIsFillRect ? "f" : "n";
6244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
6254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_ByteString GenerateTextSymbolAP(const CFX_FloatRect& rect) {
6274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteTextBuf sAppStream;
6284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  sAppStream << CPVT_GenerateAP::GenerateColorAP(
6294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CPVT_Color(CPVT_Color::kRGB, 1, 1, 0), PaintOperation::FILL);
6304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  sAppStream << CPVT_GenerateAP::GenerateColorAP(
6314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CPVT_Color(CPVT_Color::kRGB, 0, 0, 0), PaintOperation::STROKE);
6324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  const FX_FLOAT fBorderWidth = 1;
6344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  sAppStream << fBorderWidth << " w\n";
6354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  const FX_FLOAT fHalfWidth = fBorderWidth / 2;
6374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  const FX_FLOAT fTipDelta = 4;
6384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_FloatRect outerRect1 = rect;
6404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  outerRect1.Deflate(fHalfWidth, fHalfWidth);
6414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  outerRect1.bottom += fTipDelta;
6424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_FloatRect outerRect2 = outerRect1;
6444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  outerRect2.left += fTipDelta;
6454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  outerRect2.right = outerRect2.left + fTipDelta;
6464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  outerRect2.top = outerRect2.bottom - fTipDelta;
6474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_FLOAT outerRect2Middle = (outerRect2.left + outerRect2.right) / 2;
6484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  // Draw outer boxes.
6504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  sAppStream << outerRect1.left << " " << outerRect1.bottom << " m\n"
6514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann             << outerRect1.left << " " << outerRect1.top << " l\n"
6524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann             << outerRect1.right << " " << outerRect1.top << " l\n"
6534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann             << outerRect1.right << " " << outerRect1.bottom << " l\n"
6544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann             << outerRect2.right << " " << outerRect2.bottom << " l\n"
6554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann             << outerRect2Middle << " " << outerRect2.top << " l\n"
6564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann             << outerRect2.left << " " << outerRect2.bottom << " l\n"
6574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann             << outerRect1.left << " " << outerRect1.bottom << " l\n";
6584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  // Draw inner lines.
6604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_FloatRect lineRect = outerRect1;
6614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  const FX_FLOAT fXDelta = 2;
6624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  const FX_FLOAT fYDelta = (lineRect.top - lineRect.bottom) / 4;
6634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  lineRect.left += fXDelta;
6654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  lineRect.right -= fXDelta;
6664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (int i = 0; i < 3; ++i) {
6674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    lineRect.top -= fYDelta;
6684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    sAppStream << lineRect.left << " " << lineRect.top << " m\n"
6694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann               << lineRect.right << " " << lineRect.top << " l\n";
6704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
6714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  sAppStream << "B*\n";
6724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return sAppStream.MakeString();
6744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
6754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}  // namespace
6774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool FPDF_GenerateAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict) {
6794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pAnnotDict || pAnnotDict->GetStringFor("Subtype") != "Widget")
6804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
6814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Object* pFieldTypeObj = FPDF_GetFieldAttr(pAnnotDict, "FT");
6834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pFieldTypeObj)
6844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
6854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteString field_type = pFieldTypeObj->GetString();
6874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (field_type == "Tx")
6884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return CPVT_GenerateAP::GenerateTextFieldAP(pDoc, pAnnotDict);
6894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Object* pFieldFlagsObj = FPDF_GetFieldAttr(pAnnotDict, "Ff");
6914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint32_t flags = pFieldFlagsObj ? pFieldFlagsObj->GetInteger() : 0;
6924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (field_type == "Ch") {
6934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return (flags & (1 << 17))
6944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann               ? CPVT_GenerateAP::GenerateComboBoxAP(pDoc, pAnnotDict)
6954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann               : CPVT_GenerateAP::GenerateListBoxAP(pDoc, pAnnotDict);
6964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
6974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (field_type == "Btn") {
6994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (!(flags & (1 << 16))) {
7004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (!pAnnotDict->KeyExist("AS")) {
7014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (CPDF_Dictionary* pParentDict = pAnnotDict->GetDictFor("Parent")) {
7024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          if (pParentDict->KeyExist("AS")) {
7034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            pAnnotDict->SetNewFor<CPDF_String>(
7044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                "AS", pParentDict->GetStringFor("AS"), false);
7054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          }
7064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
7074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
7084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
7094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
7104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return false;
7124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
7134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Static.
7154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPVT_GenerateAP::GenerateComboBoxAP(CPDF_Document* pDoc,
7164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                         CPDF_Dictionary* pAnnotDict) {
7174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return GenerateWidgetAP(pDoc, pAnnotDict, 1);
7184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
7194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Static.
7214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPVT_GenerateAP::GenerateListBoxAP(CPDF_Document* pDoc,
7224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                        CPDF_Dictionary* pAnnotDict) {
7234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return GenerateWidgetAP(pDoc, pAnnotDict, 2);
7244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
7254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Static.
7274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPVT_GenerateAP::GenerateTextFieldAP(CPDF_Document* pDoc,
7284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                          CPDF_Dictionary* pAnnotDict) {
7294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return GenerateWidgetAP(pDoc, pAnnotDict, 0);
7304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
7314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPVT_GenerateAP::GenerateCircleAP(CPDF_Document* pDoc,
7334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                       CPDF_Dictionary* pAnnotDict) {
7344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteTextBuf sAppStream;
7354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteString sExtGSDictName = "GS";
7364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  sAppStream << "/" << sExtGSDictName << " gs ";
7374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Array* pInteriorColor = pAnnotDict->GetArrayFor("IC");
7394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  sAppStream << GetColorStringWithDefault(pInteriorColor,
7404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                          CPVT_Color(CPVT_Color::kTransparent),
7414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                          PaintOperation::FILL);
7424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  sAppStream << GetColorStringWithDefault(pAnnotDict->GetArrayFor("C"),
7444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                          CPVT_Color(CPVT_Color::kRGB, 0, 0, 0),
7454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                          PaintOperation::STROKE);
7464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_FLOAT fBorderWidth = GetBorderWidth(*pAnnotDict);
7484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool bIsStrokeRect = fBorderWidth > 0;
7494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (bIsStrokeRect) {
7514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    sAppStream << fBorderWidth << " w ";
7524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    sAppStream << GetDashPatternString(*pAnnotDict);
7534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
7544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_FloatRect rect = pAnnotDict->GetRectFor("Rect");
7564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  rect.Normalize();
7574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (bIsStrokeRect) {
7594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    // Deflating rect because stroking a path entails painting all points whose
7604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    // perpendicular distance from the path in user space is less than or equal
7614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    // to half the line width.
7624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    rect.Deflate(fBorderWidth / 2, fBorderWidth / 2);
7634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
7644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  const FX_FLOAT fMiddleX = (rect.left + rect.right) / 2;
7664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  const FX_FLOAT fMiddleY = (rect.top + rect.bottom) / 2;
7674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  // |fL| is precalculated approximate value of 4 * tan((3.14 / 2) / 4) / 3,
7694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  // where |fL| * radius is a good approximation of control points for
7704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  // arc with 90 degrees.
7714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  const FX_FLOAT fL = 0.5523f;
7724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  const FX_FLOAT fDeltaX = fL * rect.Width() / 2.0;
7734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  const FX_FLOAT fDeltaY = fL * rect.Height() / 2.0;
7744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  // Starting point
7764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  sAppStream << fMiddleX << " " << rect.top << " m\n";
7774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  // First Bezier Curve
7784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  sAppStream << fMiddleX + fDeltaX << " " << rect.top << " " << rect.right
7794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann             << " " << fMiddleY + fDeltaY << " " << rect.right << " "
7804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann             << fMiddleY << " c\n";
7814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  // Second Bezier Curve
7824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  sAppStream << rect.right << " " << fMiddleY - fDeltaY << " "
7834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann             << fMiddleX + fDeltaX << " " << rect.bottom << " " << fMiddleX
7844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann             << " " << rect.bottom << " c\n";
7854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  // Third Bezier Curve
7864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  sAppStream << fMiddleX - fDeltaX << " " << rect.bottom << " " << rect.left
7874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann             << " " << fMiddleY - fDeltaY << " " << rect.left << " " << fMiddleY
7884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann             << " c\n";
7894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  // Fourth Bezier Curve
7904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  sAppStream << rect.left << " " << fMiddleY + fDeltaY << " "
7914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann             << fMiddleX - fDeltaX << " " << rect.top << " " << fMiddleX << " "
7924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann             << rect.top << " c\n";
7934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool bIsFillRect = pInteriorColor && !pInteriorColor->IsEmpty();
7954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  sAppStream << GetPaintOperatorString(bIsStrokeRect, bIsFillRect) << "\n";
7964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto pExtGStateDict =
7984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal");
7994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto pResourceDict =
8004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      GenerateResourceDict(pDoc, std::move(pExtGStateDict), nullptr);
8014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, std::move(pResourceDict),
8024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                       false /*IsTextMarkupAnnotation*/);
8034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return true;
8044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
8054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPVT_GenerateAP::GenerateHighlightAP(CPDF_Document* pDoc,
8074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                          CPDF_Dictionary* pAnnotDict) {
8084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteTextBuf sAppStream;
8094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteString sExtGSDictName = "GS";
8104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  sAppStream << "/" << sExtGSDictName << " gs ";
8114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  sAppStream << GetColorStringWithDefault(pAnnotDict->GetArrayFor("C"),
8134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                          CPVT_Color(CPVT_Color::kRGB, 1, 1, 0),
8144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                          PaintOperation::FILL);
8154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_FloatRect rect = CPDF_Annot::RectFromQuadPoints(pAnnotDict);
8174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  rect.Normalize();
8184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  sAppStream << rect.left << " " << rect.top << " m " << rect.right << " "
8204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann             << rect.top << " l " << rect.right << " " << rect.bottom << " l "
8214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann             << rect.left << " " << rect.bottom << " l "
8224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann             << "h f\n";
8234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto pExtGStateDict =
8254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Multiply");
8264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto pResourceDict =
8274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      GenerateResourceDict(pDoc, std::move(pExtGStateDict), nullptr);
8284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, std::move(pResourceDict),
8294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                       true /*IsTextMarkupAnnotation*/);
8304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return true;
8324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
8334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPVT_GenerateAP::GenerateInkAP(CPDF_Document* pDoc,
8354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                    CPDF_Dictionary* pAnnotDict) {
8364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_FLOAT fBorderWidth = GetBorderWidth(*pAnnotDict);
8374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool bIsStroke = fBorderWidth > 0;
8384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!bIsStroke)
8404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
8414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Array* pInkList = pAnnotDict->GetArrayFor("InkList");
8434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pInkList || pInkList->IsEmpty())
8444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
8454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteTextBuf sAppStream;
8474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteString sExtGSDictName = "GS";
8484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  sAppStream << "/" << sExtGSDictName << " gs ";
8494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  sAppStream << GetColorStringWithDefault(pAnnotDict->GetArrayFor("C"),
8514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                          CPVT_Color(CPVT_Color::kRGB, 0, 0, 0),
8524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                          PaintOperation::STROKE);
8534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  sAppStream << fBorderWidth << " w ";
8554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  sAppStream << GetDashPatternString(*pAnnotDict);
8564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  // Set inflated rect as a new rect because paths near the border with large
8584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  // width should not be clipped to the original rect.
8594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_FloatRect rect = pAnnotDict->GetRectFor("Rect");
8604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  rect.Inflate(fBorderWidth / 2, fBorderWidth / 2);
8614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pAnnotDict->SetRectFor("Rect", rect);
8624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (size_t i = 0; i < pInkList->GetCount(); i++) {
8644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_Array* pInkCoordList = pInkList->GetArrayAt(i);
8654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (!pInkCoordList || pInkCoordList->GetCount() < 2)
8664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      continue;
8674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    sAppStream << pInkCoordList->GetNumberAt(0) << " "
8694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann               << pInkCoordList->GetNumberAt(1) << " m ";
8704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    for (size_t j = 0; j < pInkCoordList->GetCount() - 1; j += 2) {
8724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      sAppStream << pInkCoordList->GetNumberAt(j) << " "
8734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                 << pInkCoordList->GetNumberAt(j + 1) << " l ";
8744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
8754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    sAppStream << "S\n";
8774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
8784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto pExtGStateDict =
8804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal");
8814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto pResourceDict =
8824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      GenerateResourceDict(pDoc, std::move(pExtGStateDict), nullptr);
8834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, std::move(pResourceDict),
8844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                       false /*IsTextMarkupAnnotation*/);
8854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return true;
8864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
8874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPVT_GenerateAP::GenerateTextAP(CPDF_Document* pDoc,
8894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                     CPDF_Dictionary* pAnnotDict) {
8904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteTextBuf sAppStream;
8914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteString sExtGSDictName = "GS";
8924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  sAppStream << "/" << sExtGSDictName << " gs ";
8934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_FloatRect rect = pAnnotDict->GetRectFor("Rect");
8954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  const FX_FLOAT fNoteLength = 20;
8964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_FloatRect noteRect(rect.left, rect.bottom, rect.left + fNoteLength,
8974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                         rect.bottom + fNoteLength);
8984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pAnnotDict->SetRectFor("Rect", noteRect);
8994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  sAppStream << GenerateTextSymbolAP(noteRect);
9014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto pExtGStateDict =
9034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal");
9044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto pResourceDict =
9054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      GenerateResourceDict(pDoc, std::move(pExtGStateDict), nullptr);
9064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, std::move(pResourceDict),
9074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                       false /*IsTextMarkupAnnotation*/);
9084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return true;
9094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
9104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPVT_GenerateAP::GenerateUnderlineAP(CPDF_Document* pDoc,
9124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                          CPDF_Dictionary* pAnnotDict) {
9134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteTextBuf sAppStream;
9144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteString sExtGSDictName = "GS";
9154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  sAppStream << "/" << sExtGSDictName << " gs ";
9164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  sAppStream << GetColorStringWithDefault(pAnnotDict->GetArrayFor("C"),
9184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                          CPVT_Color(CPVT_Color::kRGB, 0, 0, 0),
9194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                          PaintOperation::STROKE);
9204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_FloatRect rect = CPDF_Annot::RectFromQuadPoints(pAnnotDict);
9224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  rect.Normalize();
9234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_FLOAT fLineWidth = 1.0;
9254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  sAppStream << fLineWidth << " w " << rect.left << " "
9264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann             << rect.bottom + fLineWidth << " m " << rect.right << " "
9274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann             << rect.bottom + fLineWidth << " l S\n";
9284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto pExtGStateDict =
9304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal");
9314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto pResourceDict =
9324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      GenerateResourceDict(pDoc, std::move(pExtGStateDict), nullptr);
9334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, std::move(pResourceDict),
9344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                       true /*IsTextMarkupAnnotation*/);
9354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return true;
9364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
9374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPVT_GenerateAP::GeneratePopupAP(CPDF_Document* pDoc,
9394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                      CPDF_Dictionary* pAnnotDict) {
9404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteTextBuf sAppStream;
9414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteString sExtGSDictName = "GS";
9424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  sAppStream << "/" << sExtGSDictName << " gs\n";
9434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  sAppStream << GenerateColorAP(CPVT_Color(CPVT_Color::kRGB, 1, 1, 0),
9454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                PaintOperation::FILL);
9464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  sAppStream << GenerateColorAP(CPVT_Color(CPVT_Color::kRGB, 0, 0, 0),
9474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                PaintOperation::STROKE);
9484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  const FX_FLOAT fBorderWidth = 1;
9504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  sAppStream << fBorderWidth << " w\n";
9514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_FloatRect rect = pAnnotDict->GetRectFor("Rect");
9534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  rect.Normalize();
9544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  rect.Deflate(fBorderWidth / 2, fBorderWidth / 2);
9554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  sAppStream << rect.left << " " << rect.bottom << " " << rect.Width() << " "
9574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann             << rect.Height() << " re b\n";
9584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteString sFontName = "FONT";
9604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto pResourceFontDict = GenerateResourceFontDict(pDoc, sFontName);
9614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Font* pDefFont = pDoc->LoadFont(pResourceFontDict.get());
9624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pDefFont)
9634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
9644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto pExtGStateDict =
9664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal");
9674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto pResourceDict = GenerateResourceDict(pDoc, std::move(pResourceFontDict),
9684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                            std::move(pExtGStateDict));
9694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  sAppStream << GetPopupContentsString(pDoc, *pAnnotDict, pDefFont, sFontName);
9714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, std::move(pResourceDict),
9724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                       false /*IsTextMarkupAnnotation*/);
9734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return true;
9744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
9754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPVT_GenerateAP::GenerateSquareAP(CPDF_Document* pDoc,
9774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                       CPDF_Dictionary* pAnnotDict) {
9784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteTextBuf sAppStream;
9794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteString sExtGSDictName = "GS";
9804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  sAppStream << "/" << sExtGSDictName << " gs ";
9814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Array* pInteriorColor = pAnnotDict->GetArrayFor("IC");
9834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  sAppStream << GetColorStringWithDefault(pInteriorColor,
9844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                          CPVT_Color(CPVT_Color::kTransparent),
9854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                          PaintOperation::FILL);
9864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  sAppStream << GetColorStringWithDefault(pAnnotDict->GetArrayFor("C"),
9884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                          CPVT_Color(CPVT_Color::kRGB, 0, 0, 0),
9894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                          PaintOperation::STROKE);
9904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_FLOAT fBorderWidth = GetBorderWidth(*pAnnotDict);
9924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool bIsStrokeRect = fBorderWidth > 0;
9934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (bIsStrokeRect) {
9954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    sAppStream << fBorderWidth << " w ";
9964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    sAppStream << GetDashPatternString(*pAnnotDict);
9974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
9984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_FloatRect rect = pAnnotDict->GetRectFor("Rect");
10004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  rect.Normalize();
10014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
10024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (bIsStrokeRect) {
10034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    // Deflating rect because stroking a path entails painting all points whose
10044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    // perpendicular distance from the path in user space is less than or equal
10054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    // to half the line width.
10064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    rect.Deflate(fBorderWidth / 2, fBorderWidth / 2);
10074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
10084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
10094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool bIsFillRect = pInteriorColor && (pInteriorColor->GetCount() > 0);
10104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
10114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  sAppStream << rect.left << " " << rect.bottom << " " << rect.Width() << " "
10124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann             << rect.Height() << " re "
10134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann             << GetPaintOperatorString(bIsStrokeRect, bIsFillRect) << "\n";
10144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
10154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto pExtGStateDict =
10164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal");
10174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto pResourceDict =
10184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      GenerateResourceDict(pDoc, std::move(pExtGStateDict), nullptr);
10194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, std::move(pResourceDict),
10204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                       false /*IsTextMarkupAnnotation*/);
10214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return true;
10224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
10234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
10244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPVT_GenerateAP::GenerateSquigglyAP(CPDF_Document* pDoc,
10254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                         CPDF_Dictionary* pAnnotDict) {
10264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteTextBuf sAppStream;
10274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteString sExtGSDictName = "GS";
10284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  sAppStream << "/" << sExtGSDictName << " gs ";
10294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
10304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  sAppStream << GetColorStringWithDefault(pAnnotDict->GetArrayFor("C"),
10314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                          CPVT_Color(CPVT_Color::kRGB, 0, 0, 0),
10324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                          PaintOperation::STROKE);
10334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
10344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_FloatRect rect = CPDF_Annot::RectFromQuadPoints(pAnnotDict);
10354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  rect.Normalize();
10364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
10374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_FLOAT fLineWidth = 1.0;
10384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  sAppStream << fLineWidth << " w ";
10394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
10404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  const FX_FLOAT fDelta = 2.0;
10414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  const FX_FLOAT fTop = rect.bottom + fDelta;
10424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  const FX_FLOAT fBottom = rect.bottom;
10434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
10444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  sAppStream << rect.left << " " << fTop << " m ";
10454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
10464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_FLOAT fX = rect.left + fDelta;
10474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool isUpwards = false;
10484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
10494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  while (fX < rect.right) {
10504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    sAppStream << fX << " " << (isUpwards ? fTop : fBottom) << " l ";
10514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
10524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    fX += fDelta;
10534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    isUpwards = !isUpwards;
10544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
10554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
10564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_FLOAT fRemainder = rect.right - (fX - fDelta);
10574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (isUpwards)
10584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    sAppStream << rect.right << " " << fBottom + fRemainder << " l ";
10594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  else
10604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    sAppStream << rect.right << " " << fTop - fRemainder << " l ";
10614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
10624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  sAppStream << "S\n";
10634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
10644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto pExtGStateDict =
10654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal");
10664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto pResourceDict =
10674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      GenerateResourceDict(pDoc, std::move(pExtGStateDict), nullptr);
10684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, std::move(pResourceDict),
10694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                       true /*IsTextMarkupAnnotation*/);
10704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return true;
10714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
10724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
10734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPVT_GenerateAP::GenerateStrikeOutAP(CPDF_Document* pDoc,
10744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                          CPDF_Dictionary* pAnnotDict) {
10754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteTextBuf sAppStream;
10764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteString sExtGSDictName = "GS";
10774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  sAppStream << "/" << sExtGSDictName << " gs ";
10784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
10794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  sAppStream << GetColorStringWithDefault(pAnnotDict->GetArrayFor("C"),
10804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                          CPVT_Color(CPVT_Color::kRGB, 0, 0, 0),
10814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                          PaintOperation::STROKE);
10824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
10834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_FloatRect rect = CPDF_Annot::RectFromQuadPoints(pAnnotDict);
10844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  rect.Normalize();
10854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
10864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_FLOAT fLineWidth = 1.0;
10874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_FLOAT fY = (rect.top + rect.bottom) / 2;
10884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  sAppStream << fLineWidth << " w " << rect.left << " " << fY << " m "
10894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann             << rect.right << " " << fY << " l S\n";
10904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
10914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto pExtGStateDict =
10924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal");
10934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto pResourceDict =
10944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      GenerateResourceDict(pDoc, std::move(pExtGStateDict), nullptr);
10954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, std::move(pResourceDict),
10964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                       true /*IsTextMarkupAnnotation*/);
10974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return true;
10984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
10994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
11004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Static.
11014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_ByteString CPVT_GenerateAP::GenerateEditAP(
11024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    IPVT_FontMap* pFontMap,
11034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_VariableText::Iterator* pIterator,
11045ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann    const CFX_PointF& ptOffset,
11054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    bool bContinuous,
11064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    uint16_t SubWord) {
11074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteTextBuf sEditStream;
11084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteTextBuf sLineStream;
11094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteTextBuf sWords;
11105ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann  CFX_PointF ptOld;
11115ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann  CFX_PointF ptNew;
11124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t nCurFontIndex = -1;
11134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPVT_WordPlace oldplace;
11144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
11154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pIterator->SetAt(0);
11164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  while (pIterator->NextWord()) {
11174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPVT_WordPlace place = pIterator->GetAt();
11184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (bContinuous) {
11194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (place.LineCmp(oldplace) != 0) {
11204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (sWords.GetSize() > 0) {
11214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          sLineStream << GetWordRenderString(sWords.MakeString());
11224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          sEditStream << sLineStream;
11234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          sLineStream.Clear();
11244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          sWords.Clear();
11254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
11264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        CPVT_Word word;
11274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (pIterator->GetWord(word)) {
11285ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann          ptNew = CFX_PointF(word.ptWord.x + ptOffset.x,
11295ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                             word.ptWord.y + ptOffset.y);
11304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        } else {
11314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          CPVT_Line line;
11324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          pIterator->GetLine(line);
11335ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann          ptNew = CFX_PointF(line.ptLine.x + ptOffset.x,
11345ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                             line.ptLine.y + ptOffset.y);
11354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
11364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (ptNew != ptOld) {
11374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          sLineStream << ptNew.x - ptOld.x << " " << ptNew.y - ptOld.y
11384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                      << " Td\n";
11394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          ptOld = ptNew;
11404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
11414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
11424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CPVT_Word word;
11434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (pIterator->GetWord(word)) {
11444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (word.nFontIndex != nCurFontIndex) {
11454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          if (sWords.GetSize() > 0) {
11464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            sLineStream << GetWordRenderString(sWords.MakeString());
11474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            sWords.Clear();
11484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          }
11494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          sLineStream << GetFontSetString(pFontMap, word.nFontIndex,
11504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                          word.fFontSize);
11514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          nCurFontIndex = word.nFontIndex;
11524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
11534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        sWords << GetPDFWordString(pFontMap, nCurFontIndex, word.Word, SubWord);
11544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
11554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      oldplace = place;
11564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } else {
11574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CPVT_Word word;
11584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (pIterator->GetWord(word)) {
11595ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann        ptNew =
11605ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann            CFX_PointF(word.ptWord.x + ptOffset.x, word.ptWord.y + ptOffset.y);
11614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (ptNew != ptOld) {
11624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          sEditStream << ptNew.x - ptOld.x << " " << ptNew.y - ptOld.y
11634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                      << " Td\n";
11644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          ptOld = ptNew;
11654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
11664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (word.nFontIndex != nCurFontIndex) {
11674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          sEditStream << GetFontSetString(pFontMap, word.nFontIndex,
11684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                          word.fFontSize);
11694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          nCurFontIndex = word.nFontIndex;
11704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
11714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        sEditStream << GetWordRenderString(
11724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            GetPDFWordString(pFontMap, nCurFontIndex, word.Word, SubWord));
11734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
11744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
11754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
11764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (sWords.GetSize() > 0) {
11774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    sLineStream << GetWordRenderString(sWords.MakeString());
11784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    sEditStream << sLineStream;
11794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    sWords.Clear();
11804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
11814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return sEditStream.MakeString();
11824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
11834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
11844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Static.
11854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_ByteString CPVT_GenerateAP::GenerateBorderAP(
11864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    const CFX_FloatRect& rect,
11874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    FX_FLOAT fWidth,
11884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    const CPVT_Color& color,
11894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    const CPVT_Color& crLeftTop,
11904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    const CPVT_Color& crRightBottom,
11914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    BorderStyle nStyle,
11924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    const CPVT_Dash& dash) {
11934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteTextBuf sAppStream;
11944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteString sColor;
11954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_FLOAT fLeft = rect.left;
11964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_FLOAT fRight = rect.right;
11974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_FLOAT fTop = rect.top;
11984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_FLOAT fBottom = rect.bottom;
11994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (fWidth > 0.0f) {
12004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    FX_FLOAT fHalfWidth = fWidth / 2.0f;
12014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    switch (nStyle) {
12024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      default:
12034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      case BorderStyle::SOLID:
12044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        sColor = GenerateColorAP(color, PaintOperation::FILL);
12054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (sColor.GetLength() > 0) {
12064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          sAppStream << sColor;
12074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          sAppStream << fLeft << " " << fBottom << " " << fRight - fLeft << " "
12084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                     << fTop - fBottom << " re\n";
12094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          sAppStream << fLeft + fWidth << " " << fBottom + fWidth << " "
12104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                     << fRight - fLeft - fWidth * 2 << " "
12114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                     << fTop - fBottom - fWidth * 2 << " re\n";
12124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          sAppStream << "f*\n";
12134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
12144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        break;
12154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      case BorderStyle::DASH:
12164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        sColor = GenerateColorAP(color, PaintOperation::STROKE);
12174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (sColor.GetLength() > 0) {
12184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          sAppStream << sColor;
12194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          sAppStream << fWidth << " w"
12204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                     << " [" << dash.nDash << " " << dash.nGap << "] "
12214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                     << dash.nPhase << " d\n";
12224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          sAppStream << fLeft + fWidth / 2 << " " << fBottom + fWidth / 2
12234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                     << " m\n";
12244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          sAppStream << fLeft + fWidth / 2 << " " << fTop - fWidth / 2
12254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                     << " l\n";
12264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          sAppStream << fRight - fWidth / 2 << " " << fTop - fWidth / 2
12274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                     << " l\n";
12284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          sAppStream << fRight - fWidth / 2 << " " << fBottom + fWidth / 2
12294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                     << " l\n";
12304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          sAppStream << fLeft + fWidth / 2 << " " << fBottom + fWidth / 2
12314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                     << " l S\n";
12324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
12334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        break;
12344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      case BorderStyle::BEVELED:
12354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      case BorderStyle::INSET:
12364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        sColor = GenerateColorAP(crLeftTop, PaintOperation::FILL);
12374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (sColor.GetLength() > 0) {
12384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          sAppStream << sColor;
12394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth
12404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                     << " m\n";
12414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          sAppStream << fLeft + fHalfWidth << " " << fTop - fHalfWidth
12424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                     << " l\n";
12434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          sAppStream << fRight - fHalfWidth << " " << fTop - fHalfWidth
12444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                     << " l\n";
12454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          sAppStream << fRight - fHalfWidth * 2 << " " << fTop - fHalfWidth * 2
12464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                     << " l\n";
12474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          sAppStream << fLeft + fHalfWidth * 2 << " " << fTop - fHalfWidth * 2
12484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                     << " l\n";
12494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          sAppStream << fLeft + fHalfWidth * 2 << " "
12504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                     << fBottom + fHalfWidth * 2 << " l f\n";
12514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
12524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        sColor = GenerateColorAP(crRightBottom, PaintOperation::FILL);
12534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (sColor.GetLength() > 0) {
12544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          sAppStream << sColor;
12554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          sAppStream << fRight - fHalfWidth << " " << fTop - fHalfWidth
12564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                     << " m\n";
12574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          sAppStream << fRight - fHalfWidth << " " << fBottom + fHalfWidth
12584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                     << " l\n";
12594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth
12604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                     << " l\n";
12614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          sAppStream << fLeft + fHalfWidth * 2 << " "
12624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                     << fBottom + fHalfWidth * 2 << " l\n";
12634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          sAppStream << fRight - fHalfWidth * 2 << " "
12644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                     << fBottom + fHalfWidth * 2 << " l\n";
12654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          sAppStream << fRight - fHalfWidth * 2 << " " << fTop - fHalfWidth * 2
12664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                     << " l f\n";
12674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
12684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        sColor = GenerateColorAP(color, PaintOperation::FILL);
12694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (sColor.GetLength() > 0) {
12704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          sAppStream << sColor;
12714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          sAppStream << fLeft << " " << fBottom << " " << fRight - fLeft << " "
12724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                     << fTop - fBottom << " re\n";
12734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth << " "
12744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                     << fRight - fLeft - fHalfWidth * 2 << " "
12754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                     << fTop - fBottom - fHalfWidth * 2 << " re f*\n";
12764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
12774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        break;
12784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      case BorderStyle::UNDERLINE:
12794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        sColor = GenerateColorAP(color, PaintOperation::STROKE);
12804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (sColor.GetLength() > 0) {
12814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          sAppStream << sColor;
12824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          sAppStream << fWidth << " w\n";
12834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          sAppStream << fLeft << " " << fBottom + fWidth / 2 << " m\n";
12844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          sAppStream << fRight << " " << fBottom + fWidth / 2 << " l S\n";
12854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
12864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        break;
12874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
12884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
12894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return sAppStream.MakeString();
12904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
12914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
12924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Static.
12934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_ByteString CPVT_GenerateAP::GenerateColorAP(const CPVT_Color& color,
12944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                                PaintOperation nOperation) {
12954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteTextBuf sColorStream;
12964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  switch (color.nColorType) {
12974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case CPVT_Color::kRGB:
12984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      sColorStream << color.fColor1 << " " << color.fColor2 << " "
12994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                   << color.fColor3 << " "
13004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                   << (nOperation == PaintOperation::STROKE ? "RG" : "rg")
13014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                   << "\n";
13024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
13034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case CPVT_Color::kGray:
13044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      sColorStream << color.fColor1 << " "
13054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                   << (nOperation == PaintOperation::STROKE ? "G" : "g")
13064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                   << "\n";
13074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
13084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case CPVT_Color::kCMYK:
13094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      sColorStream << color.fColor1 << " " << color.fColor2 << " "
13104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                   << color.fColor3 << " " << color.fColor4 << " "
13114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                   << (nOperation == PaintOperation::STROKE ? "K" : "k")
13124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                   << "\n";
13134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
13144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case CPVT_Color::kTransparent:
13154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
13164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
13174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return sColorStream.MakeString();
13184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
13194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
13204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Static.
13214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_ByteString CPVT_GenerateAP::GetPDFWordString(IPVT_FontMap* pFontMap,
13224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                                 int32_t nFontIndex,
13234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                                 uint16_t Word,
13244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                                 uint16_t SubWord) {
13254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteString sWord;
13264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (SubWord > 0) {
13274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    sWord.Format("%c", SubWord);
13284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return sWord;
13294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
13304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
13314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pFontMap)
13324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return sWord;
13334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
13344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (CPDF_Font* pPDFFont = pFontMap->GetPDFFont(nFontIndex)) {
13354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (pPDFFont->GetBaseFont().Compare("Symbol") == 0 ||
13364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        pPDFFont->GetBaseFont().Compare("ZapfDingbats") == 0) {
13374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      sWord.Format("%c", Word);
13384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } else {
13394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      uint32_t dwCharCode = pPDFFont->CharCodeFromUnicode(Word);
13404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (dwCharCode != CPDF_Font::kInvalidCharCode)
13414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        pPDFFont->AppendChar(sWord, dwCharCode);
13424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
13434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
13444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return sWord;
13454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
13464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
13474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Static.
13484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_ByteString CPVT_GenerateAP::GetWordRenderString(
13494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    const CFX_ByteString& strWords) {
13504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (strWords.GetLength() > 0)
13514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return PDF_EncodeString(strWords) + " Tj\n";
13524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return "";
13534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
13544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
13554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Static.
13564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_ByteString CPVT_GenerateAP::GetFontSetString(IPVT_FontMap* pFontMap,
13574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                                 int32_t nFontIndex,
13584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                                 FX_FLOAT fFontSize) {
13594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteTextBuf sRet;
13604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pFontMap) {
13614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CFX_ByteString sFontAlias = pFontMap->GetPDFFontAlias(nFontIndex);
13624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (sFontAlias.GetLength() > 0 && fFontSize > 0)
13634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      sRet << "/" << sFontAlias << " " << fFontSize << " Tf\n";
13644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
13654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return sRet.MakeString();
13664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1367