// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#include "fpdfsdk/pdfwindow/PWL_Utils.h"

#include <algorithm>

#include "core/fpdfdoc/cpvt_word.h"
#include "core/fxge/cfx_graphstatedata.h"
#include "core/fxge/cfx_pathdata.h"
#include "core/fxge/cfx_renderdevice.h"
#include "fpdfsdk/fxedit/fxet_edit.h"
#include "fpdfsdk/pdfwindow/PWL_Icon.h"
#include "fpdfsdk/pdfwindow/PWL_Wnd.h"

CFX_ByteString CPWL_Utils::GetAppStreamFromArray(const CPWL_PathData* pPathData,
                                                 int32_t nCount) {
  CFX_ByteTextBuf csAP;

  for (int32_t i = 0; i < nCount; i++) {
    switch (pPathData[i].type) {
      case PWLPT_MOVETO:
        csAP << pPathData[i].point.x << " " << pPathData[i].point.y << " m\n";
        break;
      case PWLPT_LINETO:
        csAP << pPathData[i].point.x << " " << pPathData[i].point.y << " l\n";
        break;
      case PWLPT_BEZIERTO:
        csAP << pPathData[i].point.x << " " << pPathData[i].point.y << " "
             << pPathData[i + 1].point.x << " " << pPathData[i + 1].point.y
             << " " << pPathData[i + 2].point.x << " "
             << pPathData[i + 2].point.y << " c\n";

        i += 2;
        break;
      default:
        break;
    }
  }

  return csAP.MakeString();
}

void CPWL_Utils::GetPathDataFromArray(CFX_PathData& path,
                                      const CPWL_PathData* pPathData,
                                      int32_t nCount) {
  path.SetPointCount(nCount);

  for (int32_t i = 0; i < nCount; i++) {
    switch (pPathData[i].type) {
      case PWLPT_MOVETO:
        path.SetPoint(i, pPathData[i].point.x, pPathData[i].point.y,
                      FXPT_MOVETO);
        break;
      case PWLPT_LINETO:
        path.SetPoint(i, pPathData[i].point.x, pPathData[i].point.y,
                      FXPT_LINETO);
        break;
      case PWLPT_BEZIERTO:
        path.SetPoint(i, pPathData[i].point.x, pPathData[i].point.y,
                      FXPT_BEZIERTO);
        break;
      default:
        break;
    }
  }
}

CFX_FloatRect CPWL_Utils::MaxRect(const CFX_FloatRect& rect1,
                                  const CFX_FloatRect& rect2) {
  CFX_FloatRect rcRet;

  rcRet.left = PWL_MIN(rect1.left, rect2.left);
  rcRet.bottom = PWL_MIN(rect1.bottom, rect2.bottom);
  rcRet.right = PWL_MAX(rect1.right, rect2.right);
  rcRet.top = PWL_MAX(rect1.top, rect2.top);

  return rcRet;
}

CFX_FloatRect CPWL_Utils::OffsetRect(const CFX_FloatRect& rect,
                                     FX_FLOAT x,
                                     FX_FLOAT y) {
  return CFX_FloatRect(rect.left + x, rect.bottom + y, rect.right + x,
                       rect.top + y);
}

FX_BOOL CPWL_Utils::ContainsRect(const CFX_FloatRect& rcParent,
                                 const CFX_FloatRect& rcChild) {
  return rcChild.left >= rcParent.left && rcChild.bottom >= rcParent.bottom &&
         rcChild.right <= rcParent.right && rcChild.top <= rcParent.top;
}

FX_BOOL CPWL_Utils::IntersectRect(const CFX_FloatRect& rect1,
                                  const CFX_FloatRect& rect2) {
  FX_FLOAT left = rect1.left > rect2.left ? rect1.left : rect2.left;
  FX_FLOAT right = rect1.right < rect2.right ? rect1.right : rect2.right;
  FX_FLOAT bottom = rect1.bottom > rect2.bottom ? rect1.bottom : rect2.bottom;
  FX_FLOAT top = rect1.top < rect2.top ? rect1.top : rect2.top;

  return left < right && bottom < top;
}

CFX_FloatPoint CPWL_Utils::OffsetPoint(const CFX_FloatPoint& point,
                                       FX_FLOAT x,
                                       FX_FLOAT y) {
  return CFX_FloatPoint(point.x + x, point.y + y);
}

CPVT_WordRange CPWL_Utils::OverlapWordRange(const CPVT_WordRange& wr1,
                                            const CPVT_WordRange& wr2) {
  CPVT_WordRange wrRet;

  if (wr2.EndPos.WordCmp(wr1.BeginPos) < 0 ||
      wr2.BeginPos.WordCmp(wr1.EndPos) > 0)
    return wrRet;
  if (wr1.EndPos.WordCmp(wr2.BeginPos) < 0 ||
      wr1.BeginPos.WordCmp(wr2.EndPos) > 0)
    return wrRet;

  if (wr1.BeginPos.WordCmp(wr2.BeginPos) < 0) {
    wrRet.BeginPos = wr2.BeginPos;
  } else {
    wrRet.BeginPos = wr1.BeginPos;
  }

  if (wr1.EndPos.WordCmp(wr2.EndPos) < 0) {
    wrRet.EndPos = wr1.EndPos;
  } else {
    wrRet.EndPos = wr2.EndPos;
  }

  return wrRet;
}

CFX_ByteString CPWL_Utils::GetAP_Check(const CFX_FloatRect& crBBox) {
  const FX_FLOAT fWidth = crBBox.right - crBBox.left;
  const FX_FLOAT fHeight = crBBox.top - crBBox.bottom;

  CPWL_Point pts[8][3] = {{CPWL_Point(0.28f, 0.52f), CPWL_Point(0.27f, 0.48f),
                           CPWL_Point(0.29f, 0.40f)},
                          {CPWL_Point(0.30f, 0.33f), CPWL_Point(0.31f, 0.29f),
                           CPWL_Point(0.31f, 0.28f)},
                          {CPWL_Point(0.39f, 0.28f), CPWL_Point(0.49f, 0.29f),
                           CPWL_Point(0.77f, 0.67f)},
                          {CPWL_Point(0.76f, 0.68f), CPWL_Point(0.78f, 0.69f),
                           CPWL_Point(0.76f, 0.75f)},
                          {CPWL_Point(0.76f, 0.75f), CPWL_Point(0.73f, 0.80f),
                           CPWL_Point(0.68f, 0.75f)},
                          {CPWL_Point(0.68f, 0.74f), CPWL_Point(0.68f, 0.74f),
                           CPWL_Point(0.44f, 0.47f)},
                          {CPWL_Point(0.43f, 0.47f), CPWL_Point(0.40f, 0.47f),
                           CPWL_Point(0.41f, 0.58f)},
                          {CPWL_Point(0.40f, 0.60f), CPWL_Point(0.28f, 0.66f),
                           CPWL_Point(0.30f, 0.56f)}};

  for (size_t i = 0; i < FX_ArraySize(pts); ++i) {
    for (size_t j = 0; j < FX_ArraySize(pts[0]); ++j) {
      pts[i][j].x = pts[i][j].x * fWidth + crBBox.left;
      pts[i][j].y *= pts[i][j].y * fHeight + crBBox.bottom;
    }
  }

  CFX_ByteTextBuf csAP;
  csAP << pts[0][0].x << " " << pts[0][0].y << " m\n";

  for (size_t i = 0; i < FX_ArraySize(pts); ++i) {
    size_t nNext = i < FX_ArraySize(pts) - 1 ? i + 1 : 0;

    FX_FLOAT px1 = pts[i][1].x - pts[i][0].x;
    FX_FLOAT py1 = pts[i][1].y - pts[i][0].y;
    FX_FLOAT px2 = pts[i][2].x - pts[nNext][0].x;
    FX_FLOAT py2 = pts[i][2].y - pts[nNext][0].y;

    csAP << pts[i][0].x + px1 * FX_BEZIER << " "
         << pts[i][0].y + py1 * FX_BEZIER << " "
         << pts[nNext][0].x + px2 * FX_BEZIER << " "
         << pts[nNext][0].y + py2 * FX_BEZIER << " " << pts[nNext][0].x << " "
         << pts[nNext][0].y << " c\n";
  }

  return csAP.MakeString();
}

CFX_ByteString CPWL_Utils::GetAP_Circle(const CFX_FloatRect& crBBox) {
  CFX_ByteTextBuf csAP;

  FX_FLOAT fWidth = crBBox.right - crBBox.left;
  FX_FLOAT fHeight = crBBox.top - crBBox.bottom;

  CFX_FloatPoint pt1(crBBox.left, crBBox.bottom + fHeight / 2);
  CFX_FloatPoint pt2(crBBox.left + fWidth / 2, crBBox.top);
  CFX_FloatPoint pt3(crBBox.right, crBBox.bottom + fHeight / 2);
  CFX_FloatPoint pt4(crBBox.left + fWidth / 2, crBBox.bottom);

  csAP << pt1.x << " " << pt1.y << " m\n";

  FX_FLOAT px = pt2.x - pt1.x;
  FX_FLOAT py = pt2.y - pt1.y;

  csAP << pt1.x << " " << pt1.y + py * FX_BEZIER << " "
       << pt2.x - px * FX_BEZIER << " " << pt2.y << " " << pt2.x << " " << pt2.y
       << " c\n";

  px = pt3.x - pt2.x;
  py = pt2.y - pt3.y;

  csAP << pt2.x + px * FX_BEZIER << " " << pt2.y << " " << pt3.x << " "
       << pt3.y + py * FX_BEZIER << " " << pt3.x << " " << pt3.y << " c\n";

  px = pt3.x - pt4.x;
  py = pt3.y - pt4.y;

  csAP << pt3.x << " " << pt3.y - py * FX_BEZIER << " "
       << pt4.x + px * FX_BEZIER << " " << pt4.y << " " << pt4.x << " " << pt4.y
       << " c\n";

  px = pt4.x - pt1.x;
  py = pt1.y - pt4.y;

  csAP << pt4.x - px * FX_BEZIER << " " << pt4.y << " " << pt1.x << " "
       << pt1.y - py * FX_BEZIER << " " << pt1.x << " " << pt1.y << " c\n";

  return csAP.MakeString();
}

CFX_ByteString CPWL_Utils::GetAP_Cross(const CFX_FloatRect& crBBox) {
  CFX_ByteTextBuf csAP;

  csAP << crBBox.left << " " << crBBox.top << " m\n";
  csAP << crBBox.right << " " << crBBox.bottom << " l\n";
  csAP << crBBox.left << " " << crBBox.bottom << " m\n";
  csAP << crBBox.right << " " << crBBox.top << " l\n";

  return csAP.MakeString();
}

CFX_ByteString CPWL_Utils::GetAP_Diamond(const CFX_FloatRect& crBBox) {
  CFX_ByteTextBuf csAP;

  FX_FLOAT fWidth = crBBox.right - crBBox.left;
  FX_FLOAT fHeight = crBBox.top - crBBox.bottom;

  CFX_FloatPoint pt1(crBBox.left, crBBox.bottom + fHeight / 2);
  CFX_FloatPoint pt2(crBBox.left + fWidth / 2, crBBox.top);
  CFX_FloatPoint pt3(crBBox.right, crBBox.bottom + fHeight / 2);
  CFX_FloatPoint pt4(crBBox.left + fWidth / 2, crBBox.bottom);

  csAP << pt1.x << " " << pt1.y << " m\n";
  csAP << pt2.x << " " << pt2.y << " l\n";
  csAP << pt3.x << " " << pt3.y << " l\n";
  csAP << pt4.x << " " << pt4.y << " l\n";
  csAP << pt1.x << " " << pt1.y << " l\n";

  return csAP.MakeString();
}

CFX_ByteString CPWL_Utils::GetAP_Square(const CFX_FloatRect& crBBox) {
  CFX_ByteTextBuf csAP;

  csAP << crBBox.left << " " << crBBox.top << " m\n";
  csAP << crBBox.right << " " << crBBox.top << " l\n";
  csAP << crBBox.right << " " << crBBox.bottom << " l\n";
  csAP << crBBox.left << " " << crBBox.bottom << " l\n";
  csAP << crBBox.left << " " << crBBox.top << " l\n";

  return csAP.MakeString();
}

CFX_ByteString CPWL_Utils::GetAP_Star(const CFX_FloatRect& crBBox) {
  CFX_ByteTextBuf csAP;

  FX_FLOAT fRadius =
      (crBBox.top - crBBox.bottom) / (1 + (FX_FLOAT)cos(FX_PI / 5.0f));
  CFX_FloatPoint ptCenter = CFX_FloatPoint((crBBox.left + crBBox.right) / 2.0f,
                                           (crBBox.top + crBBox.bottom) / 2.0f);

  FX_FLOAT px[5], py[5];

  FX_FLOAT fAngel = FX_PI / 10.0f;

  for (int32_t i = 0; i < 5; i++) {
    px[i] = ptCenter.x + fRadius * (FX_FLOAT)cos(fAngel);
    py[i] = ptCenter.y + fRadius * (FX_FLOAT)sin(fAngel);

    fAngel += FX_PI * 2 / 5.0f;
  }

  csAP << px[0] << " " << py[0] << " m\n";

  int32_t nNext = 0;
  for (int32_t j = 0; j < 5; j++) {
    nNext += 2;
    if (nNext >= 5)
      nNext -= 5;
    csAP << px[nNext] << " " << py[nNext] << " l\n";
  }

  return csAP.MakeString();
}

CFX_ByteString CPWL_Utils::GetAP_HalfCircle(const CFX_FloatRect& crBBox,
                                            FX_FLOAT fRotate) {
  CFX_ByteTextBuf csAP;

  FX_FLOAT fWidth = crBBox.right - crBBox.left;
  FX_FLOAT fHeight = crBBox.top - crBBox.bottom;

  CFX_FloatPoint pt1(-fWidth / 2, 0);
  CFX_FloatPoint pt2(0, fHeight / 2);
  CFX_FloatPoint pt3(fWidth / 2, 0);

  FX_FLOAT px, py;

  csAP << cos(fRotate) << " " << sin(fRotate) << " " << -sin(fRotate) << " "
       << cos(fRotate) << " " << crBBox.left + fWidth / 2 << " "
       << crBBox.bottom + fHeight / 2 << " cm\n";

  csAP << pt1.x << " " << pt1.y << " m\n";

  px = pt2.x - pt1.x;
  py = pt2.y - pt1.y;

  csAP << pt1.x << " " << pt1.y + py * FX_BEZIER << " "
       << pt2.x - px * FX_BEZIER << " " << pt2.y << " " << pt2.x << " " << pt2.y
       << " c\n";

  px = pt3.x - pt2.x;
  py = pt2.y - pt3.y;

  csAP << pt2.x + px * FX_BEZIER << " " << pt2.y << " " << pt3.x << " "
       << pt3.y + py * FX_BEZIER << " " << pt3.x << " " << pt3.y << " c\n";

  return csAP.MakeString();
}

CFX_FloatRect CPWL_Utils::InflateRect(const CFX_FloatRect& rcRect,
                                      FX_FLOAT fSize) {
  if (rcRect.IsEmpty())
    return rcRect;

  CFX_FloatRect rcNew(rcRect.left - fSize, rcRect.bottom - fSize,
                      rcRect.right + fSize, rcRect.top + fSize);
  rcNew.Normalize();
  return rcNew;
}

CFX_FloatRect CPWL_Utils::DeflateRect(const CFX_FloatRect& rcRect,
                                      FX_FLOAT fSize) {
  if (rcRect.IsEmpty())
    return rcRect;

  CFX_FloatRect rcNew(rcRect.left + fSize, rcRect.bottom + fSize,
                      rcRect.right - fSize, rcRect.top - fSize);
  rcNew.Normalize();
  return rcNew;
}

CFX_FloatRect CPWL_Utils::ScaleRect(const CFX_FloatRect& rcRect,
                                    FX_FLOAT fScale) {
  FX_FLOAT fHalfWidth = (rcRect.right - rcRect.left) / 2.0f;
  FX_FLOAT fHalfHeight = (rcRect.top - rcRect.bottom) / 2.0f;

  CFX_FloatPoint ptCenter = CFX_FloatPoint((rcRect.left + rcRect.right) / 2,
                                           (rcRect.top + rcRect.bottom) / 2);

  return CFX_FloatRect(
      ptCenter.x - fHalfWidth * fScale, ptCenter.y - fHalfHeight * fScale,
      ptCenter.x + fHalfWidth * fScale, ptCenter.y + fHalfHeight * fScale);
}

CFX_ByteString CPWL_Utils::GetRectFillAppStream(const CFX_FloatRect& rect,
                                                const CPWL_Color& color) {
  CFX_ByteTextBuf sAppStream;
  CFX_ByteString sColor = GetColorAppStream(color, TRUE);
  if (sColor.GetLength() > 0) {
    sAppStream << "q\n" << sColor;
    sAppStream << rect.left << " " << rect.bottom << " "
               << rect.right - rect.left << " " << rect.top - rect.bottom
               << " re f\nQ\n";
  }

  return sAppStream.MakeString();
}

CFX_ByteString CPWL_Utils::GetCircleFillAppStream(const CFX_FloatRect& rect,
                                                  const CPWL_Color& color) {
  CFX_ByteTextBuf sAppStream;
  CFX_ByteString sColor = GetColorAppStream(color, TRUE);
  if (sColor.GetLength() > 0) {
    sAppStream << "q\n" << sColor << CPWL_Utils::GetAP_Circle(rect) << "f\nQ\n";
  }
  return sAppStream.MakeString();
}

CFX_FloatRect CPWL_Utils::GetCenterSquare(const CFX_FloatRect& rect) {
  FX_FLOAT fWidth = rect.right - rect.left;
  FX_FLOAT fHeight = rect.top - rect.bottom;

  FX_FLOAT fCenterX = (rect.left + rect.right) / 2.0f;
  FX_FLOAT fCenterY = (rect.top + rect.bottom) / 2.0f;

  FX_FLOAT fRadius = (fWidth > fHeight) ? fHeight / 2 : fWidth / 2;

  return CFX_FloatRect(fCenterX - fRadius, fCenterY - fRadius,
                       fCenterX + fRadius, fCenterY + fRadius);
}

CFX_ByteString CPWL_Utils::GetEditAppStream(CFX_Edit* pEdit,
                                            const CFX_FloatPoint& ptOffset,
                                            const CPVT_WordRange* pRange,
                                            FX_BOOL bContinuous,
                                            uint16_t SubWord) {
  return CFX_Edit::GetEditAppearanceStream(pEdit, ptOffset, pRange, bContinuous,
                                           SubWord);
}

CFX_ByteString CPWL_Utils::GetEditSelAppStream(CFX_Edit* pEdit,
                                               const CFX_FloatPoint& ptOffset,
                                               const CPVT_WordRange* pRange) {
  return CFX_Edit::GetSelectAppearanceStream(pEdit, ptOffset, pRange);
}

CFX_ByteString CPWL_Utils::GetTextAppStream(const CFX_FloatRect& rcBBox,
                                            IPVT_FontMap* pFontMap,
                                            const CFX_WideString& sText,
                                            int32_t nAlignmentH,
                                            int32_t nAlignmentV,
                                            FX_FLOAT fFontSize,
                                            FX_BOOL bMultiLine,
                                            FX_BOOL bAutoReturn,
                                            const CPWL_Color& crText) {
  CFX_ByteTextBuf sRet;

  std::unique_ptr<CFX_Edit> pEdit(new CFX_Edit);
  pEdit->SetFontMap(pFontMap);
  pEdit->SetPlateRect(rcBBox);
  pEdit->SetAlignmentH(nAlignmentH, TRUE);
  pEdit->SetAlignmentV(nAlignmentV, TRUE);
  pEdit->SetMultiLine(bMultiLine, TRUE);
  pEdit->SetAutoReturn(bAutoReturn, TRUE);
  if (IsFloatZero(fFontSize))
    pEdit->SetAutoFontSize(TRUE, TRUE);
  else
    pEdit->SetFontSize(fFontSize);

  pEdit->Initialize();
  pEdit->SetText(sText);

  CFX_ByteString sEdit =
      CPWL_Utils::GetEditAppStream(pEdit.get(), CFX_FloatPoint(0.0f, 0.0f));
  if (sEdit.GetLength() > 0)
    sRet << "BT\n" << CPWL_Utils::GetColorAppStream(crText) << sEdit << "ET\n";

  return sRet.MakeString();
}

CFX_ByteString CPWL_Utils::GetPushButtonAppStream(const CFX_FloatRect& rcBBox,
                                                  IPVT_FontMap* pFontMap,
                                                  CPDF_Stream* pIconStream,
                                                  CPDF_IconFit& IconFit,
                                                  const CFX_WideString& sLabel,
                                                  const CPWL_Color& crText,
                                                  FX_FLOAT fFontSize,
                                                  int32_t nLayOut) {
  const FX_FLOAT fAutoFontScale = 1.0f / 3.0f;

  std::unique_ptr<CFX_Edit> pEdit(new CFX_Edit);
  pEdit->SetFontMap(pFontMap);
  pEdit->SetAlignmentH(1, TRUE);
  pEdit->SetAlignmentV(1, TRUE);
  pEdit->SetMultiLine(FALSE, TRUE);
  pEdit->SetAutoReturn(FALSE, TRUE);
  if (IsFloatZero(fFontSize))
    pEdit->SetAutoFontSize(TRUE, TRUE);
  else
    pEdit->SetFontSize(fFontSize);

  pEdit->Initialize();
  pEdit->SetText(sLabel);

  CFX_FloatRect rcLabelContent = pEdit->GetContentRect();
  CPWL_Icon Icon;
  PWL_CREATEPARAM cp;
  cp.dwFlags = PWS_VISIBLE;
  Icon.Create(cp);
  Icon.SetIconFit(&IconFit);
  Icon.SetPDFStream(pIconStream);

  CFX_FloatRect rcLabel = CFX_FloatRect(0, 0, 0, 0);
  CFX_FloatRect rcIcon = CFX_FloatRect(0, 0, 0, 0);
  FX_FLOAT fWidth = 0.0f;
  FX_FLOAT fHeight = 0.0f;

  switch (nLayOut) {
    case PPBL_LABEL:
      rcLabel = rcBBox;
      rcIcon = CFX_FloatRect(0, 0, 0, 0);
      break;
    case PPBL_ICON:
      rcIcon = rcBBox;
      rcLabel = CFX_FloatRect(0, 0, 0, 0);
      break;
    case PPBL_ICONTOPLABELBOTTOM:

      if (pIconStream) {
        if (IsFloatZero(fFontSize)) {
          fHeight = rcBBox.top - rcBBox.bottom;
          rcLabel = CFX_FloatRect(rcBBox.left, rcBBox.bottom, rcBBox.right,
                                  rcBBox.bottom + fHeight * fAutoFontScale);
          rcIcon =
              CFX_FloatRect(rcBBox.left, rcLabel.top, rcBBox.right, rcBBox.top);
        } else {
          fHeight = rcLabelContent.Height();

          if (rcBBox.bottom + fHeight > rcBBox.top) {
            rcIcon = CFX_FloatRect(0, 0, 0, 0);
            rcLabel = rcBBox;
          } else {
            rcLabel = CFX_FloatRect(rcBBox.left, rcBBox.bottom, rcBBox.right,
                                    rcBBox.bottom + fHeight);
            rcIcon = CFX_FloatRect(rcBBox.left, rcLabel.top, rcBBox.right,
                                   rcBBox.top);
          }
        }
      } else {
        rcLabel = rcBBox;
        rcIcon = CFX_FloatRect(0, 0, 0, 0);
      }

      break;
    case PPBL_LABELTOPICONBOTTOM:

      if (pIconStream) {
        if (IsFloatZero(fFontSize)) {
          fHeight = rcBBox.top - rcBBox.bottom;
          rcLabel =
              CFX_FloatRect(rcBBox.left, rcBBox.top - fHeight * fAutoFontScale,
                            rcBBox.right, rcBBox.top);
          rcIcon = CFX_FloatRect(rcBBox.left, rcBBox.bottom, rcBBox.right,
                                 rcLabel.bottom);
        } else {
          fHeight = rcLabelContent.Height();

          if (rcBBox.bottom + fHeight > rcBBox.top) {
            rcIcon = CFX_FloatRect(0, 0, 0, 0);
            rcLabel = rcBBox;
          } else {
            rcLabel = CFX_FloatRect(rcBBox.left, rcBBox.top - fHeight,
                                    rcBBox.right, rcBBox.top);
            rcIcon = CFX_FloatRect(rcBBox.left, rcBBox.bottom, rcBBox.right,
                                   rcLabel.bottom);
          }
        }
      } else {
        rcLabel = rcBBox;
        rcIcon = CFX_FloatRect(0, 0, 0, 0);
      }

      break;
    case PPBL_ICONLEFTLABELRIGHT:

      if (pIconStream) {
        if (IsFloatZero(fFontSize)) {
          fWidth = rcBBox.right - rcBBox.left;
          rcLabel = CFX_FloatRect(rcBBox.right - fWidth * fAutoFontScale,
                                  rcBBox.bottom, rcBBox.right, rcBBox.top);
          rcIcon = CFX_FloatRect(rcBBox.left, rcBBox.bottom, rcLabel.left,
                                 rcBBox.top);

          if (rcLabelContent.Width() < fWidth * fAutoFontScale) {
          } else {
            if (rcLabelContent.Width() < fWidth) {
              rcLabel = CFX_FloatRect(rcBBox.right - rcLabelContent.Width(),
                                      rcBBox.bottom, rcBBox.right, rcBBox.top);
              rcIcon = CFX_FloatRect(rcBBox.left, rcBBox.bottom, rcLabel.left,
                                     rcBBox.top);
            } else {
              rcLabel = rcBBox;
              rcIcon = CFX_FloatRect(0, 0, 0, 0);
            }
          }
        } else {
          fWidth = rcLabelContent.Width();

          if (rcBBox.left + fWidth > rcBBox.right) {
            rcLabel = rcBBox;
            rcIcon = CFX_FloatRect(0, 0, 0, 0);
          } else {
            rcLabel = CFX_FloatRect(rcBBox.right - fWidth, rcBBox.bottom,
                                    rcBBox.right, rcBBox.top);
            rcIcon = CFX_FloatRect(rcBBox.left, rcBBox.bottom, rcLabel.left,
                                   rcBBox.top);
          }
        }
      } else {
        rcLabel = rcBBox;
        rcIcon = CFX_FloatRect(0, 0, 0, 0);
      }

      break;
    case PPBL_LABELLEFTICONRIGHT:

      if (pIconStream) {
        if (IsFloatZero(fFontSize)) {
          fWidth = rcBBox.right - rcBBox.left;
          rcLabel =
              CFX_FloatRect(rcBBox.left, rcBBox.bottom,
                            rcBBox.left + fWidth * fAutoFontScale, rcBBox.top);
          rcIcon = CFX_FloatRect(rcLabel.right, rcBBox.bottom, rcBBox.right,
                                 rcBBox.top);

          if (rcLabelContent.Width() < fWidth * fAutoFontScale) {
          } else {
            if (rcLabelContent.Width() < fWidth) {
              rcLabel = CFX_FloatRect(rcBBox.left, rcBBox.bottom,
                                      rcBBox.left + rcLabelContent.Width(),
                                      rcBBox.top);
              rcIcon = CFX_FloatRect(rcLabel.right, rcBBox.bottom, rcBBox.right,
                                     rcBBox.top);
            } else {
              rcLabel = rcBBox;
              rcIcon = CFX_FloatRect(0, 0, 0, 0);
            }
          }
        } else {
          fWidth = rcLabelContent.Width();

          if (rcBBox.left + fWidth > rcBBox.right) {
            rcLabel = rcBBox;
            rcIcon = CFX_FloatRect(0, 0, 0, 0);
          } else {
            rcLabel = CFX_FloatRect(rcBBox.left, rcBBox.bottom,
                                    rcBBox.left + fWidth, rcBBox.top);
            rcIcon = CFX_FloatRect(rcLabel.right, rcBBox.bottom, rcBBox.right,
                                   rcBBox.top);
          }
        }
      } else {
        rcLabel = rcBBox;
        rcIcon = CFX_FloatRect(0, 0, 0, 0);
      }

      break;
    case PPBL_LABELOVERICON:
      rcLabel = rcBBox;
      rcIcon = rcBBox;
      break;
  }

  CFX_ByteTextBuf sAppStream, sTemp;

  if (!rcIcon.IsEmpty()) {
    Icon.Move(rcIcon, FALSE, FALSE);
    sTemp << Icon.GetImageAppStream();
  }

  Icon.Destroy();

  if (!rcLabel.IsEmpty()) {
    pEdit->SetPlateRect(rcLabel);
    CFX_ByteString sEdit =
        CPWL_Utils::GetEditAppStream(pEdit.get(), CFX_FloatPoint(0.0f, 0.0f));
    if (sEdit.GetLength() > 0) {
      sTemp << "BT\n"
            << CPWL_Utils::GetColorAppStream(crText) << sEdit << "ET\n";
    }
  }

  if (sTemp.GetSize() > 0) {
    sAppStream << "q\n"
               << rcBBox.left << " " << rcBBox.bottom << " "
               << rcBBox.right - rcBBox.left << " "
               << rcBBox.top - rcBBox.bottom << " re W n\n";
    sAppStream << sTemp << "Q\n";
  }
  return sAppStream.MakeString();
}

CFX_ByteString CPWL_Utils::GetColorAppStream(const CPWL_Color& color,
                                             const FX_BOOL& bFillOrStroke) {
  CFX_ByteTextBuf sColorStream;

  switch (color.nColorType) {
    case COLORTYPE_RGB:
      sColorStream << color.fColor1 << " " << color.fColor2 << " "
                   << color.fColor3 << " " << (bFillOrStroke ? "rg" : "RG")
                   << "\n";
      break;
    case COLORTYPE_GRAY:
      sColorStream << color.fColor1 << " " << (bFillOrStroke ? "g" : "G")
                   << "\n";
      break;
    case COLORTYPE_CMYK:
      sColorStream << color.fColor1 << " " << color.fColor2 << " "
                   << color.fColor3 << " " << color.fColor4 << " "
                   << (bFillOrStroke ? "k" : "K") << "\n";
      break;
  }

  return sColorStream.MakeString();
}

CFX_ByteString CPWL_Utils::GetBorderAppStream(const CFX_FloatRect& rect,
                                              FX_FLOAT fWidth,
                                              const CPWL_Color& color,
                                              const CPWL_Color& crLeftTop,
                                              const CPWL_Color& crRightBottom,
                                              BorderStyle nStyle,
                                              const CPWL_Dash& dash) {
  CFX_ByteTextBuf sAppStream;
  CFX_ByteString sColor;

  FX_FLOAT fLeft = rect.left;
  FX_FLOAT fRight = rect.right;
  FX_FLOAT fTop = rect.top;
  FX_FLOAT fBottom = rect.bottom;

  if (fWidth > 0.0f) {
    FX_FLOAT fHalfWidth = fWidth / 2.0f;

    sAppStream << "q\n";

    switch (nStyle) {
      default:
      case BorderStyle::SOLID:
        sColor = CPWL_Utils::GetColorAppStream(color, TRUE);
        if (sColor.GetLength() > 0) {
          sAppStream << sColor;
          sAppStream << fLeft << " " << fBottom << " " << fRight - fLeft << " "
                     << fTop - fBottom << " re\n";
          sAppStream << fLeft + fWidth << " " << fBottom + fWidth << " "
                     << fRight - fLeft - fWidth * 2 << " "
                     << fTop - fBottom - fWidth * 2 << " re\n";
          sAppStream << "f*\n";
        }
        break;
      case BorderStyle::DASH:
        sColor = CPWL_Utils::GetColorAppStream(color, FALSE);
        if (sColor.GetLength() > 0) {
          sAppStream << sColor;
          sAppStream << fWidth << " w"
                     << " [" << dash.nDash << " " << dash.nGap << "] "
                     << dash.nPhase << " d\n";
          sAppStream << fLeft + fWidth / 2 << " " << fBottom + fWidth / 2
                     << " m\n";
          sAppStream << fLeft + fWidth / 2 << " " << fTop - fWidth / 2
                     << " l\n";
          sAppStream << fRight - fWidth / 2 << " " << fTop - fWidth / 2
                     << " l\n";
          sAppStream << fRight - fWidth / 2 << " " << fBottom + fWidth / 2
                     << " l\n";
          sAppStream << fLeft + fWidth / 2 << " " << fBottom + fWidth / 2
                     << " l S\n";
        }
        break;
      case BorderStyle::BEVELED:
      case BorderStyle::INSET:
        sColor = CPWL_Utils::GetColorAppStream(crLeftTop, TRUE);
        if (sColor.GetLength() > 0) {
          sAppStream << sColor;
          sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth
                     << " m\n";
          sAppStream << fLeft + fHalfWidth << " " << fTop - fHalfWidth
                     << " l\n";
          sAppStream << fRight - fHalfWidth << " " << fTop - fHalfWidth
                     << " l\n";
          sAppStream << fRight - fHalfWidth * 2 << " " << fTop - fHalfWidth * 2
                     << " l\n";
          sAppStream << fLeft + fHalfWidth * 2 << " " << fTop - fHalfWidth * 2
                     << " l\n";
          sAppStream << fLeft + fHalfWidth * 2 << " "
                     << fBottom + fHalfWidth * 2 << " l f\n";
        }

        sColor = CPWL_Utils::GetColorAppStream(crRightBottom, TRUE);
        if (sColor.GetLength() > 0) {
          sAppStream << sColor;
          sAppStream << fRight - fHalfWidth << " " << fTop - fHalfWidth
                     << " m\n";
          sAppStream << fRight - fHalfWidth << " " << fBottom + fHalfWidth
                     << " l\n";
          sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth
                     << " l\n";
          sAppStream << fLeft + fHalfWidth * 2 << " "
                     << fBottom + fHalfWidth * 2 << " l\n";
          sAppStream << fRight - fHalfWidth * 2 << " "
                     << fBottom + fHalfWidth * 2 << " l\n";
          sAppStream << fRight - fHalfWidth * 2 << " " << fTop - fHalfWidth * 2
                     << " l f\n";
        }

        sColor = CPWL_Utils::GetColorAppStream(color, TRUE);
        if (sColor.GetLength() > 0) {
          sAppStream << sColor;
          sAppStream << fLeft << " " << fBottom << " " << fRight - fLeft << " "
                     << fTop - fBottom << " re\n";
          sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth << " "
                     << fRight - fLeft - fHalfWidth * 2 << " "
                     << fTop - fBottom - fHalfWidth * 2 << " re f*\n";
        }
        break;
      case BorderStyle::UNDERLINE:
        sColor = CPWL_Utils::GetColorAppStream(color, FALSE);
        if (sColor.GetLength() > 0) {
          sAppStream << sColor;
          sAppStream << fWidth << " w\n";
          sAppStream << fLeft << " " << fBottom + fWidth / 2 << " m\n";
          sAppStream << fRight << " " << fBottom + fWidth / 2 << " l S\n";
        }
        break;
    }

    sAppStream << "Q\n";
  }

  return sAppStream.MakeString();
}

CFX_ByteString CPWL_Utils::GetCircleBorderAppStream(
    const CFX_FloatRect& rect,
    FX_FLOAT fWidth,
    const CPWL_Color& color,
    const CPWL_Color& crLeftTop,
    const CPWL_Color& crRightBottom,
    BorderStyle nStyle,
    const CPWL_Dash& dash) {
  CFX_ByteTextBuf sAppStream;
  CFX_ByteString sColor;

  if (fWidth > 0.0f) {
    sAppStream << "q\n";

    switch (nStyle) {
      default:
      case BorderStyle::SOLID:
      case BorderStyle::UNDERLINE: {
        sColor = CPWL_Utils::GetColorAppStream(color, FALSE);
        if (sColor.GetLength() > 0) {
          sAppStream << "q\n" << fWidth << " w\n" << sColor
                     << CPWL_Utils::GetAP_Circle(
                            CPWL_Utils::DeflateRect(rect, fWidth / 2.0f))
                     << " S\nQ\n";
        }
      } break;
      case BorderStyle::DASH: {
        sColor = CPWL_Utils::GetColorAppStream(color, FALSE);
        if (sColor.GetLength() > 0) {
          sAppStream << "q\n" << fWidth << " w\n"
                     << "[" << dash.nDash << " " << dash.nGap << "] "
                     << dash.nPhase << " d\n" << sColor
                     << CPWL_Utils::GetAP_Circle(
                            CPWL_Utils::DeflateRect(rect, fWidth / 2.0f))
                     << " S\nQ\n";
        }
      } break;
      case BorderStyle::BEVELED: {
        FX_FLOAT fHalfWidth = fWidth / 2.0f;

        sColor = CPWL_Utils::GetColorAppStream(color, FALSE);
        if (sColor.GetLength() > 0) {
          sAppStream << "q\n" << fHalfWidth << " w\n" << sColor
                     << CPWL_Utils::GetAP_Circle(rect) << " S\nQ\n";
        }

        sColor = CPWL_Utils::GetColorAppStream(crLeftTop, FALSE);
        if (sColor.GetLength() > 0) {
          sAppStream << "q\n" << fHalfWidth << " w\n" << sColor
                     << CPWL_Utils::GetAP_HalfCircle(
                            CPWL_Utils::DeflateRect(rect, fHalfWidth * 0.75f),
                            FX_PI / 4.0f)
                     << " S\nQ\n";
        }

        sColor = CPWL_Utils::GetColorAppStream(crRightBottom, FALSE);
        if (sColor.GetLength() > 0) {
          sAppStream << "q\n" << fHalfWidth << " w\n" << sColor
                     << CPWL_Utils::GetAP_HalfCircle(
                            CPWL_Utils::DeflateRect(rect, fHalfWidth * 0.75f),
                            FX_PI * 5 / 4.0f)
                     << " S\nQ\n";
        }
      } break;
      case BorderStyle::INSET: {
        FX_FLOAT fHalfWidth = fWidth / 2.0f;

        sColor = CPWL_Utils::GetColorAppStream(color, FALSE);
        if (sColor.GetLength() > 0) {
          sAppStream << "q\n" << fHalfWidth << " w\n" << sColor
                     << CPWL_Utils::GetAP_Circle(rect) << " S\nQ\n";
        }

        sColor = CPWL_Utils::GetColorAppStream(crLeftTop, FALSE);
        if (sColor.GetLength() > 0) {
          sAppStream << "q\n" << fHalfWidth << " w\n" << sColor
                     << CPWL_Utils::GetAP_HalfCircle(
                            CPWL_Utils::DeflateRect(rect, fHalfWidth * 0.75f),
                            FX_PI / 4.0f)
                     << " S\nQ\n";
        }

        sColor = CPWL_Utils::GetColorAppStream(crRightBottom, FALSE);
        if (sColor.GetLength() > 0) {
          sAppStream << "q\n" << fHalfWidth << " w\n" << sColor
                     << CPWL_Utils::GetAP_HalfCircle(
                            CPWL_Utils::DeflateRect(rect, fHalfWidth * 0.75f),
                            FX_PI * 5 / 4.0f)
                     << " S\nQ\n";
        }
      } break;
    }

    sAppStream << "Q\n";
  }

  return sAppStream.MakeString();
}

CPWL_Color CPWL_Utils::SubstractColor(const CPWL_Color& sColor,
                                      FX_FLOAT fColorSub) {
  CPWL_Color sRet;
  sRet.nColorType = sColor.nColorType;

  switch (sColor.nColorType) {
    case COLORTYPE_TRANSPARENT:
      sRet.nColorType = COLORTYPE_RGB;
      sRet.fColor1 = PWL_MAX(1 - fColorSub, 0.0f);
      sRet.fColor2 = PWL_MAX(1 - fColorSub, 0.0f);
      sRet.fColor3 = PWL_MAX(1 - fColorSub, 0.0f);
      break;
    case COLORTYPE_RGB:
    case COLORTYPE_GRAY:
    case COLORTYPE_CMYK:
      sRet.fColor1 = PWL_MAX(sColor.fColor1 - fColorSub, 0.0f);
      sRet.fColor2 = PWL_MAX(sColor.fColor2 - fColorSub, 0.0f);
      sRet.fColor3 = PWL_MAX(sColor.fColor3 - fColorSub, 0.0f);
      sRet.fColor4 = PWL_MAX(sColor.fColor4 - fColorSub, 0.0f);
      break;
  }

  return sRet;
}

CPWL_Color CPWL_Utils::DevideColor(const CPWL_Color& sColor,
                                   FX_FLOAT fColorDevide) {
  CPWL_Color sRet;
  sRet.nColorType = sColor.nColorType;

  switch (sColor.nColorType) {
    case COLORTYPE_TRANSPARENT:
      sRet.nColorType = COLORTYPE_RGB;
      sRet.fColor1 = 1 / fColorDevide;
      sRet.fColor2 = 1 / fColorDevide;
      sRet.fColor3 = 1 / fColorDevide;
      break;
    case COLORTYPE_RGB:
    case COLORTYPE_GRAY:
    case COLORTYPE_CMYK:
      sRet = sColor;
      sRet.fColor1 /= fColorDevide;
      sRet.fColor2 /= fColorDevide;
      sRet.fColor3 /= fColorDevide;
      sRet.fColor4 /= fColorDevide;
      break;
  }

  return sRet;
}

CFX_ByteString CPWL_Utils::GetAppStream_Check(const CFX_FloatRect& rcBBox,
                                              const CPWL_Color& crText) {
  CFX_ByteTextBuf sAP;
  sAP << "q\n" << CPWL_Utils::GetColorAppStream(crText, TRUE)
      << CPWL_Utils::GetAP_Check(rcBBox) << "f\nQ\n";
  return sAP.MakeString();
}

CFX_ByteString CPWL_Utils::GetAppStream_Circle(const CFX_FloatRect& rcBBox,
                                               const CPWL_Color& crText) {
  CFX_ByteTextBuf sAP;
  sAP << "q\n" << CPWL_Utils::GetColorAppStream(crText, TRUE)
      << CPWL_Utils::GetAP_Circle(rcBBox) << "f\nQ\n";
  return sAP.MakeString();
}

CFX_ByteString CPWL_Utils::GetAppStream_Cross(const CFX_FloatRect& rcBBox,
                                              const CPWL_Color& crText) {
  CFX_ByteTextBuf sAP;
  sAP << "q\n" << CPWL_Utils::GetColorAppStream(crText, FALSE)
      << CPWL_Utils::GetAP_Cross(rcBBox) << "S\nQ\n";
  return sAP.MakeString();
}

CFX_ByteString CPWL_Utils::GetAppStream_Diamond(const CFX_FloatRect& rcBBox,
                                                const CPWL_Color& crText) {
  CFX_ByteTextBuf sAP;
  sAP << "q\n1 w\n" << CPWL_Utils::GetColorAppStream(crText, TRUE)
      << CPWL_Utils::GetAP_Diamond(rcBBox) << "f\nQ\n";
  return sAP.MakeString();
}

CFX_ByteString CPWL_Utils::GetAppStream_Square(const CFX_FloatRect& rcBBox,
                                               const CPWL_Color& crText) {
  CFX_ByteTextBuf sAP;
  sAP << "q\n" << CPWL_Utils::GetColorAppStream(crText, TRUE)
      << CPWL_Utils::GetAP_Square(rcBBox) << "f\nQ\n";
  return sAP.MakeString();
}

CFX_ByteString CPWL_Utils::GetAppStream_Star(const CFX_FloatRect& rcBBox,
                                             const CPWL_Color& crText) {
  CFX_ByteTextBuf sAP;
  sAP << "q\n" << CPWL_Utils::GetColorAppStream(crText, TRUE)
      << CPWL_Utils::GetAP_Star(rcBBox) << "f\nQ\n";
  return sAP.MakeString();
}

CFX_ByteString CPWL_Utils::GetCheckBoxAppStream(const CFX_FloatRect& rcBBox,
                                                int32_t nStyle,
                                                const CPWL_Color& crText) {
  CFX_FloatRect rcCenter = GetCenterSquare(rcBBox);
  switch (nStyle) {
    default:
    case PCS_CHECK:
      return GetAppStream_Check(rcCenter, crText);
    case PCS_CIRCLE:
      return GetAppStream_Circle(ScaleRect(rcCenter, 2.0f / 3.0f), crText);
    case PCS_CROSS:
      return GetAppStream_Cross(rcCenter, crText);
    case PCS_DIAMOND:
      return GetAppStream_Diamond(ScaleRect(rcCenter, 2.0f / 3.0f), crText);
    case PCS_SQUARE:
      return GetAppStream_Square(ScaleRect(rcCenter, 2.0f / 3.0f), crText);
    case PCS_STAR:
      return GetAppStream_Star(ScaleRect(rcCenter, 2.0f / 3.0f), crText);
  }
}

CFX_ByteString CPWL_Utils::GetRadioButtonAppStream(const CFX_FloatRect& rcBBox,
                                                   int32_t nStyle,
                                                   const CPWL_Color& crText) {
  CFX_FloatRect rcCenter = GetCenterSquare(rcBBox);
  switch (nStyle) {
    default:
    case PCS_CHECK:
      return GetAppStream_Check(rcCenter, crText);
    case PCS_CIRCLE:
      return GetAppStream_Circle(ScaleRect(rcCenter, 1.0f / 2.0f), crText);
    case PCS_CROSS:
      return GetAppStream_Cross(rcCenter, crText);
    case PCS_DIAMOND:
      return GetAppStream_Diamond(ScaleRect(rcCenter, 2.0f / 3.0f), crText);
    case PCS_SQUARE:
      return GetAppStream_Square(ScaleRect(rcCenter, 2.0f / 3.0f), crText);
    case PCS_STAR:
      return GetAppStream_Star(ScaleRect(rcCenter, 2.0f / 3.0f), crText);
  }
}

CFX_ByteString CPWL_Utils::GetDropButtonAppStream(const CFX_FloatRect& rcBBox) {
  CFX_ByteTextBuf sAppStream;

  if (!rcBBox.IsEmpty()) {
    sAppStream << "q\n" << CPWL_Utils::GetColorAppStream(
                               CPWL_Color(COLORTYPE_RGB, 220.0f / 255.0f,
                                          220.0f / 255.0f, 220.0f / 255.0f),
                               TRUE);
    sAppStream << rcBBox.left << " " << rcBBox.bottom << " "
               << rcBBox.right - rcBBox.left << " "
               << rcBBox.top - rcBBox.bottom << " re f\n";
    sAppStream << "Q\n";

    sAppStream << "q\n"
               << CPWL_Utils::GetBorderAppStream(
                      rcBBox, 2, CPWL_Color(COLORTYPE_GRAY, 0),
                      CPWL_Color(COLORTYPE_GRAY, 1),
                      CPWL_Color(COLORTYPE_GRAY, 0.5), BorderStyle::BEVELED,
                      CPWL_Dash(3, 0, 0))
               << "Q\n";

    CFX_FloatPoint ptCenter = CFX_FloatPoint((rcBBox.left + rcBBox.right) / 2,
                                             (rcBBox.top + rcBBox.bottom) / 2);
    if (IsFloatBigger(rcBBox.right - rcBBox.left, 6) &&
        IsFloatBigger(rcBBox.top - rcBBox.bottom, 6)) {
      sAppStream << "q\n"
                 << " 0 g\n";
      sAppStream << ptCenter.x - 3 << " " << ptCenter.y + 1.5f << " m\n";
      sAppStream << ptCenter.x + 3 << " " << ptCenter.y + 1.5f << " l\n";
      sAppStream << ptCenter.x << " " << ptCenter.y - 1.5f << " l\n";
      sAppStream << ptCenter.x - 3 << " " << ptCenter.y + 1.5f << " l f\n";
      sAppStream << "Q\n";
    }
  }

  return sAppStream.MakeString();
}

void CPWL_Utils::ConvertCMYK2GRAY(FX_FLOAT dC,
                                  FX_FLOAT dM,
                                  FX_FLOAT dY,
                                  FX_FLOAT dK,
                                  FX_FLOAT& dGray) {
  if (dC < 0 || dC > 1 || dM < 0 || dM > 1 || dY < 0 || dY > 1 || dK < 0 ||
      dK > 1)
    return;
  dGray = 1.0f - std::min(1.0f, 0.3f * dC + 0.59f * dM + 0.11f * dY + dK);
}

void CPWL_Utils::ConvertGRAY2CMYK(FX_FLOAT dGray,
                                  FX_FLOAT& dC,
                                  FX_FLOAT& dM,
                                  FX_FLOAT& dY,
                                  FX_FLOAT& dK) {
  if (dGray < 0 || dGray > 1)
    return;
  dC = 0.0f;
  dM = 0.0f;
  dY = 0.0f;
  dK = 1.0f - dGray;
}

void CPWL_Utils::ConvertGRAY2RGB(FX_FLOAT dGray,
                                 FX_FLOAT& dR,
                                 FX_FLOAT& dG,
                                 FX_FLOAT& dB) {
  if (dGray < 0 || dGray > 1)
    return;
  dR = dGray;
  dG = dGray;
  dB = dGray;
}

void CPWL_Utils::ConvertRGB2GRAY(FX_FLOAT dR,
                                 FX_FLOAT dG,
                                 FX_FLOAT dB,
                                 FX_FLOAT& dGray) {
  if (dR < 0 || dR > 1 || dG < 0 || dG > 0 || dB < 0 || dB > 1)
    return;
  dGray = 0.3f * dR + 0.59f * dG + 0.11f * dB;
}

void CPWL_Utils::ConvertCMYK2RGB(FX_FLOAT dC,
                                 FX_FLOAT dM,
                                 FX_FLOAT dY,
                                 FX_FLOAT dK,
                                 FX_FLOAT& dR,
                                 FX_FLOAT& dG,
                                 FX_FLOAT& dB) {
  if (dC < 0 || dC > 1 || dM < 0 || dM > 1 || dY < 0 || dY > 1 || dK < 0 ||
      dK > 1)
    return;
  dR = 1.0f - std::min(1.0f, dC + dK);
  dG = 1.0f - std::min(1.0f, dM + dK);
  dB = 1.0f - std::min(1.0f, dY + dK);
}

void CPWL_Utils::ConvertRGB2CMYK(FX_FLOAT dR,
                                 FX_FLOAT dG,
                                 FX_FLOAT dB,
                                 FX_FLOAT& dC,
                                 FX_FLOAT& dM,
                                 FX_FLOAT& dY,
                                 FX_FLOAT& dK) {
  if (dR < 0 || dR > 1 || dG < 0 || dG > 1 || dB < 0 || dB > 1)
    return;

  dC = 1.0f - dR;
  dM = 1.0f - dG;
  dY = 1.0f - dB;
  dK = std::min(dC, std::min(dM, dY));
}

void CPWL_Utils::PWLColorToARGB(const CPWL_Color& color,
                                int32_t& alpha,
                                FX_FLOAT& red,
                                FX_FLOAT& green,
                                FX_FLOAT& blue) {
  switch (color.nColorType) {
    case COLORTYPE_TRANSPARENT: {
      alpha = 0;
    } break;
    case COLORTYPE_GRAY: {
      ConvertGRAY2RGB(color.fColor1, red, green, blue);
    } break;
    case COLORTYPE_RGB: {
      red = color.fColor1;
      green = color.fColor2;
      blue = color.fColor3;
    } break;
    case COLORTYPE_CMYK: {
      ConvertCMYK2RGB(color.fColor1, color.fColor2, color.fColor3,
                      color.fColor4, red, green, blue);
    } break;
  }
}

FX_COLORREF CPWL_Utils::PWLColorToFXColor(const CPWL_Color& color,
                                          int32_t nTransparancy) {
  int32_t nAlpha = nTransparancy;
  FX_FLOAT dRed = 0;
  FX_FLOAT dGreen = 0;
  FX_FLOAT dBlue = 0;

  PWLColorToARGB(color, nAlpha, dRed, dGreen, dBlue);

  return ArgbEncode(nAlpha, (int32_t)(dRed * 255), (int32_t)(dGreen * 255),
                    (int32_t)(dBlue * 255));
}

void CPWL_Utils::DrawFillRect(CFX_RenderDevice* pDevice,
                              CFX_Matrix* pUser2Device,
                              const CFX_FloatRect& rect,
                              const FX_COLORREF& color) {
  CFX_PathData path;
  CFX_FloatRect rcTemp(rect);
  path.AppendRect(rcTemp.left, rcTemp.bottom, rcTemp.right, rcTemp.top);
  pDevice->DrawPath(&path, pUser2Device, nullptr, color, 0, FXFILL_WINDING);
}

void CPWL_Utils::DrawFillArea(CFX_RenderDevice* pDevice,
                              CFX_Matrix* pUser2Device,
                              const CFX_FloatPoint* pPts,
                              int32_t nCount,
                              const FX_COLORREF& color) {
  CFX_PathData path;
  path.SetPointCount(nCount);

  path.SetPoint(0, pPts[0].x, pPts[0].y, FXPT_MOVETO);
  for (int32_t i = 1; i < nCount; i++)
    path.SetPoint(i, pPts[i].x, pPts[i].y, FXPT_LINETO);

  pDevice->DrawPath(&path, pUser2Device, nullptr, color, 0, FXFILL_ALTERNATE);
}

void CPWL_Utils::DrawStrokeRect(CFX_RenderDevice* pDevice,
                                CFX_Matrix* pUser2Device,
                                const CFX_FloatRect& rect,
                                const FX_COLORREF& color,
                                FX_FLOAT fWidth) {
  CFX_PathData path;
  CFX_FloatRect rcTemp(rect);
  path.AppendRect(rcTemp.left, rcTemp.bottom, rcTemp.right, rcTemp.top);

  CFX_GraphStateData gsd;
  gsd.m_LineWidth = fWidth;

  pDevice->DrawPath(&path, pUser2Device, &gsd, 0, color, FXFILL_ALTERNATE);
}

void CPWL_Utils::DrawStrokeLine(CFX_RenderDevice* pDevice,
                                CFX_Matrix* pUser2Device,
                                const CFX_FloatPoint& ptMoveTo,
                                const CFX_FloatPoint& ptLineTo,
                                const FX_COLORREF& color,
                                FX_FLOAT fWidth) {
  CFX_PathData path;
  path.SetPointCount(2);
  path.SetPoint(0, ptMoveTo.x, ptMoveTo.y, FXPT_MOVETO);
  path.SetPoint(1, ptLineTo.x, ptLineTo.y, FXPT_LINETO);

  CFX_GraphStateData gsd;
  gsd.m_LineWidth = fWidth;

  pDevice->DrawPath(&path, pUser2Device, &gsd, 0, color, FXFILL_ALTERNATE);
}

void CPWL_Utils::DrawFillRect(CFX_RenderDevice* pDevice,
                              CFX_Matrix* pUser2Device,
                              const CFX_FloatRect& rect,
                              const CPWL_Color& color,
                              int32_t nTransparancy) {
  CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rect,
                           PWLColorToFXColor(color, nTransparancy));
}

void CPWL_Utils::DrawShadow(CFX_RenderDevice* pDevice,
                            CFX_Matrix* pUser2Device,
                            FX_BOOL bVertical,
                            FX_BOOL bHorizontal,
                            CFX_FloatRect rect,
                            int32_t nTransparancy,
                            int32_t nStartGray,
                            int32_t nEndGray) {
  FX_FLOAT fStepGray = 1.0f;

  if (bVertical) {
    fStepGray = (nEndGray - nStartGray) / rect.Height();

    for (FX_FLOAT fy = rect.bottom + 0.5f; fy <= rect.top - 0.5f; fy += 1.0f) {
      int32_t nGray = nStartGray + (int32_t)(fStepGray * (fy - rect.bottom));
      CPWL_Utils::DrawStrokeLine(
          pDevice, pUser2Device, CFX_FloatPoint(rect.left, fy),
          CFX_FloatPoint(rect.right, fy),
          ArgbEncode(nTransparancy, nGray, nGray, nGray), 1.5f);
    }
  }

  if (bHorizontal) {
    fStepGray = (nEndGray - nStartGray) / rect.Width();

    for (FX_FLOAT fx = rect.left + 0.5f; fx <= rect.right - 0.5f; fx += 1.0f) {
      int32_t nGray = nStartGray + (int32_t)(fStepGray * (fx - rect.left));
      CPWL_Utils::DrawStrokeLine(
          pDevice, pUser2Device, CFX_FloatPoint(fx, rect.bottom),
          CFX_FloatPoint(fx, rect.top),
          ArgbEncode(nTransparancy, nGray, nGray, nGray), 1.5f);
    }
  }
}

void CPWL_Utils::DrawBorder(CFX_RenderDevice* pDevice,
                            CFX_Matrix* pUser2Device,
                            const CFX_FloatRect& rect,
                            FX_FLOAT fWidth,
                            const CPWL_Color& color,
                            const CPWL_Color& crLeftTop,
                            const CPWL_Color& crRightBottom,
                            BorderStyle nStyle,
                            int32_t nTransparancy) {
  FX_FLOAT fLeft = rect.left;
  FX_FLOAT fRight = rect.right;
  FX_FLOAT fTop = rect.top;
  FX_FLOAT fBottom = rect.bottom;

  if (fWidth > 0.0f) {
    FX_FLOAT fHalfWidth = fWidth / 2.0f;

    switch (nStyle) {
      default:
      case BorderStyle::SOLID: {
        CFX_PathData path;
        path.AppendRect(fLeft, fBottom, fRight, fTop);
        path.AppendRect(fLeft + fWidth, fBottom + fWidth, fRight - fWidth,
                        fTop - fWidth);
        pDevice->DrawPath(&path, pUser2Device, nullptr,
                          PWLColorToFXColor(color, nTransparancy), 0,
                          FXFILL_ALTERNATE);
        break;
      }
      case BorderStyle::DASH: {
        CFX_PathData path;

        path.SetPointCount(5);
        path.SetPoint(0, fLeft + fWidth / 2.0f, fBottom + fWidth / 2.0f,
                      FXPT_MOVETO);
        path.SetPoint(1, fLeft + fWidth / 2.0f, fTop - fWidth / 2.0f,
                      FXPT_LINETO);
        path.SetPoint(2, fRight - fWidth / 2.0f, fTop - fWidth / 2.0f,
                      FXPT_LINETO);
        path.SetPoint(3, fRight - fWidth / 2.0f, fBottom + fWidth / 2.0f,
                      FXPT_LINETO);
        path.SetPoint(4, fLeft + fWidth / 2.0f, fBottom + fWidth / 2.0f,
                      FXPT_LINETO);

        CFX_GraphStateData gsd;
        gsd.SetDashCount(2);
        gsd.m_DashArray[0] = 3.0f;
        gsd.m_DashArray[1] = 3.0f;
        gsd.m_DashPhase = 0;

        gsd.m_LineWidth = fWidth;
        pDevice->DrawPath(&path, pUser2Device, &gsd, 0,
                          PWLColorToFXColor(color, nTransparancy),
                          FXFILL_WINDING);
        break;
      }
      case BorderStyle::BEVELED:
      case BorderStyle::INSET: {
        CFX_GraphStateData gsd;
        gsd.m_LineWidth = fHalfWidth;

        CFX_PathData pathLT;

        pathLT.SetPointCount(7);
        pathLT.SetPoint(0, fLeft + fHalfWidth, fBottom + fHalfWidth,
                        FXPT_MOVETO);
        pathLT.SetPoint(1, fLeft + fHalfWidth, fTop - fHalfWidth, FXPT_LINETO);
        pathLT.SetPoint(2, fRight - fHalfWidth, fTop - fHalfWidth, FXPT_LINETO);
        pathLT.SetPoint(3, fRight - fHalfWidth * 2, fTop - fHalfWidth * 2,
                        FXPT_LINETO);
        pathLT.SetPoint(4, fLeft + fHalfWidth * 2, fTop - fHalfWidth * 2,
                        FXPT_LINETO);
        pathLT.SetPoint(5, fLeft + fHalfWidth * 2, fBottom + fHalfWidth * 2,
                        FXPT_LINETO);
        pathLT.SetPoint(6, fLeft + fHalfWidth, fBottom + fHalfWidth,
                        FXPT_LINETO);

        pDevice->DrawPath(&pathLT, pUser2Device, &gsd,
                          PWLColorToFXColor(crLeftTop, nTransparancy), 0,
                          FXFILL_ALTERNATE);

        CFX_PathData pathRB;

        pathRB.SetPointCount(7);
        pathRB.SetPoint(0, fRight - fHalfWidth, fTop - fHalfWidth, FXPT_MOVETO);
        pathRB.SetPoint(1, fRight - fHalfWidth, fBottom + fHalfWidth,
                        FXPT_LINETO);
        pathRB.SetPoint(2, fLeft + fHalfWidth, fBottom + fHalfWidth,
                        FXPT_LINETO);
        pathRB.SetPoint(3, fLeft + fHalfWidth * 2, fBottom + fHalfWidth * 2,
                        FXPT_LINETO);
        pathRB.SetPoint(4, fRight - fHalfWidth * 2, fBottom + fHalfWidth * 2,
                        FXPT_LINETO);
        pathRB.SetPoint(5, fRight - fHalfWidth * 2, fTop - fHalfWidth * 2,
                        FXPT_LINETO);
        pathRB.SetPoint(6, fRight - fHalfWidth, fTop - fHalfWidth, FXPT_LINETO);

        pDevice->DrawPath(&pathRB, pUser2Device, &gsd,
                          PWLColorToFXColor(crRightBottom, nTransparancy), 0,
                          FXFILL_ALTERNATE);

        CFX_PathData path;

        path.AppendRect(fLeft, fBottom, fRight, fTop);
        path.AppendRect(fLeft + fHalfWidth, fBottom + fHalfWidth,
                        fRight - fHalfWidth, fTop - fHalfWidth);

        pDevice->DrawPath(&path, pUser2Device, &gsd,
                          PWLColorToFXColor(color, nTransparancy), 0,
                          FXFILL_ALTERNATE);
        break;
      }
      case BorderStyle::UNDERLINE: {
        CFX_PathData path;

        path.SetPointCount(2);
        path.SetPoint(0, fLeft, fBottom + fWidth / 2, FXPT_MOVETO);
        path.SetPoint(1, fRight, fBottom + fWidth / 2, FXPT_LINETO);

        CFX_GraphStateData gsd;
        gsd.m_LineWidth = fWidth;

        pDevice->DrawPath(&path, pUser2Device, &gsd, 0,
                          PWLColorToFXColor(color, nTransparancy),
                          FXFILL_ALTERNATE);
        break;
      }
    }
  }
}

FX_BOOL CPWL_Utils::IsBlackOrWhite(const CPWL_Color& color) {
  switch (color.nColorType) {
    case COLORTYPE_TRANSPARENT:
      return FALSE;
    case COLORTYPE_GRAY:
      return color.fColor1 < 0.5f;
    case COLORTYPE_RGB:
      return color.fColor1 + color.fColor2 + color.fColor3 < 1.5f;
    case COLORTYPE_CMYK:
      return color.fColor1 + color.fColor2 + color.fColor3 + color.fColor4 >
             2.0f;
  }

  return TRUE;
}

CPWL_Color CPWL_Utils::GetReverseColor(const CPWL_Color& color) {
  CPWL_Color crRet = color;

  switch (color.nColorType) {
    case COLORTYPE_GRAY:
      crRet.fColor1 = 1.0f - crRet.fColor1;
      break;
    case COLORTYPE_RGB:
      crRet.fColor1 = 1.0f - crRet.fColor1;
      crRet.fColor2 = 1.0f - crRet.fColor2;
      crRet.fColor3 = 1.0f - crRet.fColor3;
      break;
    case COLORTYPE_CMYK:
      crRet.fColor1 = 1.0f - crRet.fColor1;
      crRet.fColor2 = 1.0f - crRet.fColor2;
      crRet.fColor3 = 1.0f - crRet.fColor3;
      crRet.fColor4 = 1.0f - crRet.fColor4;
      break;
  }

  return crRet;
}

CFX_ByteString CPWL_Utils::GetIconAppStream(int32_t nType,
                                            const CFX_FloatRect& rect,
                                            const CPWL_Color& crFill,
                                            const CPWL_Color& crStroke) {
  CFX_ByteString sAppStream = CPWL_Utils::GetColorAppStream(crStroke, FALSE);
  sAppStream += CPWL_Utils::GetColorAppStream(crFill, TRUE);

  CFX_ByteString sPath;
  CFX_PathData path;

  switch (nType) {
    case PWL_ICONTYPE_CHECKMARK:
      GetGraphics_Checkmark(sPath, path, rect, PWLPT_STREAM);
      break;
    case PWL_ICONTYPE_CIRCLE:
      GetGraphics_Circle(sPath, path, rect, PWLPT_STREAM);
      break;
    case PWL_ICONTYPE_COMMENT:
      GetGraphics_Comment(sPath, path, rect, PWLPT_STREAM);
      break;
    case PWL_ICONTYPE_CROSS:
      GetGraphics_Cross(sPath, path, rect, PWLPT_STREAM);
      break;
    case PWL_ICONTYPE_HELP:
      GetGraphics_Help(sPath, path, rect, PWLPT_STREAM);
      break;
    case PWL_ICONTYPE_INSERTTEXT:
      GetGraphics_InsertText(sPath, path, rect, PWLPT_STREAM);
      break;
    case PWL_ICONTYPE_KEY:
      GetGraphics_Key(sPath, path, rect, PWLPT_STREAM);
      break;
    case PWL_ICONTYPE_NEWPARAGRAPH:
      GetGraphics_NewParagraph(sPath, path, rect, PWLPT_STREAM);
      break;
    case PWL_ICONTYPE_TEXTNOTE:
      GetGraphics_TextNote(sPath, path, rect, PWLPT_STREAM);
      break;
    case PWL_ICONTYPE_PARAGRAPH:
      GetGraphics_Paragraph(sPath, path, rect, PWLPT_STREAM);
      break;
    case PWL_ICONTYPE_RIGHTARROW:
      GetGraphics_RightArrow(sPath, path, rect, PWLPT_STREAM);
      break;
    case PWL_ICONTYPE_RIGHTPOINTER:
      GetGraphics_RightPointer(sPath, path, rect, PWLPT_STREAM);
      break;
    case PWL_ICONTYPE_STAR:
      GetGraphics_Star(sPath, path, rect, PWLPT_STREAM);
      break;
    case PWL_ICONTYPE_UPARROW:
      GetGraphics_UpArrow(sPath, path, rect, PWLPT_STREAM);
      break;
    case PWL_ICONTYPE_UPLEFTARROW:
      GetGraphics_UpLeftArrow(sPath, path, rect, PWLPT_STREAM);
      break;
    case PWL_ICONTYPE_GRAPH:
      GetGraphics_Graph(sPath, path, rect, PWLPT_STREAM);
      break;
    case PWL_ICONTYPE_PAPERCLIP:
      GetGraphics_Paperclip(sPath, path, rect, PWLPT_STREAM);
      break;
    case PWL_ICONTYPE_ATTACHMENT:
      GetGraphics_Attachment(sPath, path, rect, PWLPT_STREAM);
      break;
    case PWL_ICONTYPE_TAG:
      GetGraphics_Tag(sPath, path, rect, PWLPT_STREAM);
      break;
    case PWL_ICONTYPE_FOXIT:
      GetGraphics_Foxit(sPath, path, rect, PWLPT_STREAM);
      break;
  }

  sAppStream += sPath;
  if (crStroke.nColorType != COLORTYPE_TRANSPARENT)
    sAppStream += "B*\n";
  else
    sAppStream += "f*\n";

  return sAppStream;
}

void CPWL_Utils::DrawIconAppStream(CFX_RenderDevice* pDevice,
                                   CFX_Matrix* pUser2Device,
                                   int32_t nType,
                                   const CFX_FloatRect& rect,
                                   const CPWL_Color& crFill,
                                   const CPWL_Color& crStroke,
                                   const int32_t nTransparancy) {
  CFX_GraphStateData gsd;
  gsd.m_LineWidth = 1.0f;

  CFX_ByteString sPath;
  CFX_PathData path;

  switch (nType) {
    case PWL_ICONTYPE_CHECKMARK:
      GetGraphics_Checkmark(sPath, path, rect, PWLPT_PATHDATA);
      break;
    case PWL_ICONTYPE_CIRCLE:
      GetGraphics_Circle(sPath, path, rect, PWLPT_PATHDATA);
      break;
    case PWL_ICONTYPE_COMMENT:
      GetGraphics_Comment(sPath, path, rect, PWLPT_PATHDATA);
      break;
    case PWL_ICONTYPE_CROSS:
      GetGraphics_Cross(sPath, path, rect, PWLPT_PATHDATA);
      break;
    case PWL_ICONTYPE_HELP:
      GetGraphics_Help(sPath, path, rect, PWLPT_PATHDATA);
      break;
    case PWL_ICONTYPE_INSERTTEXT:
      GetGraphics_InsertText(sPath, path, rect, PWLPT_PATHDATA);
      break;
    case PWL_ICONTYPE_KEY:
      GetGraphics_Key(sPath, path, rect, PWLPT_PATHDATA);
      break;
    case PWL_ICONTYPE_NEWPARAGRAPH:
      GetGraphics_NewParagraph(sPath, path, rect, PWLPT_PATHDATA);
      break;
    case PWL_ICONTYPE_TEXTNOTE:
      GetGraphics_TextNote(sPath, path, rect, PWLPT_PATHDATA);
      break;
    case PWL_ICONTYPE_PARAGRAPH:
      GetGraphics_Paragraph(sPath, path, rect, PWLPT_PATHDATA);
      break;
    case PWL_ICONTYPE_RIGHTARROW:
      GetGraphics_RightArrow(sPath, path, rect, PWLPT_PATHDATA);
      break;
    case PWL_ICONTYPE_RIGHTPOINTER:
      GetGraphics_RightPointer(sPath, path, rect, PWLPT_PATHDATA);
      break;
    case PWL_ICONTYPE_STAR:
      GetGraphics_Star(sPath, path, rect, PWLPT_PATHDATA);
      break;
    case PWL_ICONTYPE_UPARROW:
      GetGraphics_UpArrow(sPath, path, rect, PWLPT_PATHDATA);
      break;
    case PWL_ICONTYPE_UPLEFTARROW:
      GetGraphics_UpLeftArrow(sPath, path, rect, PWLPT_PATHDATA);
      break;
    case PWL_ICONTYPE_GRAPH:
      GetGraphics_Graph(sPath, path, rect, PWLPT_PATHDATA);
      break;
    case PWL_ICONTYPE_PAPERCLIP:
      GetGraphics_Paperclip(sPath, path, rect, PWLPT_PATHDATA);
      break;
    case PWL_ICONTYPE_ATTACHMENT:
      GetGraphics_Attachment(sPath, path, rect, PWLPT_PATHDATA);
      break;
    case PWL_ICONTYPE_TAG:
      GetGraphics_Tag(sPath, path, rect, PWLPT_PATHDATA);
      break;
    case PWL_ICONTYPE_FOXIT:
      GetGraphics_Foxit(sPath, path, rect, PWLPT_PATHDATA);
      break;
    default:
      return;
  }

  pDevice->DrawPath(
      &path, pUser2Device, &gsd, PWLColorToFXColor(crFill, nTransparancy),
      PWLColorToFXColor(crStroke, nTransparancy), FXFILL_ALTERNATE);
}

void CPWL_Utils::GetGraphics_Checkmark(CFX_ByteString& sPathData,
                                       CFX_PathData& path,
                                       const CFX_FloatRect& crBBox,
                                       const PWL_PATH_TYPE type) {
  FX_FLOAT fWidth = crBBox.right - crBBox.left;
  FX_FLOAT fHeight = crBBox.top - crBBox.bottom;

  CPWL_PathData PathArray[] = {
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 15.0f,
                               crBBox.bottom + fHeight * 2 / 5.0f),
                    PWLPT_MOVETO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth / 15.0f +
                         FX_BEZIER * (fWidth / 7.0f - fWidth / 15.0f),
                     crBBox.bottom + fHeight * 2 / 5.0f +
                         FX_BEZIER * (fHeight * 2 / 7.0f - fHeight * 2 / 5.0f)),
          PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth / 4.5f +
                         FX_BEZIER * (fWidth / 5.0f - fWidth / 4.5f),
                     crBBox.bottom + fHeight / 16.0f +
                         FX_BEZIER * (fHeight / 5.0f - fHeight / 16.0f)),
          PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 4.5f,
                               crBBox.bottom + fHeight / 16.0f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 4.5f +
                                   FX_BEZIER * (fWidth / 4.4f - fWidth / 4.5f),
                               crBBox.bottom + fHeight / 16.0f -
                                   FX_BEZIER * fHeight / 16.0f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 3.0f +
                                   FX_BEZIER * (fWidth / 4.0f - fWidth / 3.0f),
                               crBBox.bottom),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 3.0f, crBBox.bottom),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 3.0f +
                                   FX_BEZIER * fWidth * (1 / 7.0f + 2 / 15.0f),
                               crBBox.bottom + FX_BEZIER * fHeight * 4 / 5.0f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 14 / 15.0f +
                                   FX_BEZIER * fWidth * (1 / 7.0f - 7 / 15.0f),
                               crBBox.bottom + fHeight * 15 / 16.0f +
                                   FX_BEZIER * (fHeight * 4 / 5.0f -
                                                fHeight * 15 / 16.0f)),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 14 / 15.0f,
                               crBBox.bottom + fHeight * 15 / 16.0f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(
              crBBox.left + fWidth * 14 / 15.0f +
                  FX_BEZIER * (fWidth * 7 / 15.0f - fWidth * 14 / 15.0f),
              crBBox.bottom + fHeight * 15 / 16.0f +
                  FX_BEZIER * (fHeight * 8 / 7.0f - fHeight * 15 / 16.0f)),
          PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth / 3.6f +
                         FX_BEZIER * (fWidth / 3.4f - fWidth / 3.6f),
                     crBBox.bottom + fHeight / 3.5f +
                         FX_BEZIER * (fHeight / 3.5f - fHeight / 3.5f)),
          PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 3.6f,
                               crBBox.bottom + fHeight / 3.5f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth / 3.6f,
                     crBBox.bottom + fHeight / 3.5f +
                         FX_BEZIER * (fHeight / 4.0f - fHeight / 3.5f)),
          PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 15.0f +
                                   FX_BEZIER * (fWidth / 3.5f - fWidth / 15.0f),
                               crBBox.bottom + fHeight * 2 / 5.0f +
                                   FX_BEZIER * (fHeight * 3.5f / 5.0f -
                                                fHeight * 2 / 5.0f)),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 15.0f,
                               crBBox.bottom + fHeight * 2 / 5.0f),
                    PWLPT_BEZIERTO)};

  if (type == PWLPT_STREAM)
    sPathData = GetAppStreamFromArray(PathArray, 16);
  else
    GetPathDataFromArray(path, PathArray, 16);
}

void CPWL_Utils::GetGraphics_Circle(CFX_ByteString& sPathData,
                                    CFX_PathData& path,
                                    const CFX_FloatRect& crBBox,
                                    const PWL_PATH_TYPE type) {
  FX_FLOAT fWidth = crBBox.right - crBBox.left;
  FX_FLOAT fHeight = crBBox.top - crBBox.bottom;

  CPWL_PathData PathArray[] = {
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 15.0f,
                               crBBox.bottom + fHeight / 2.0f),
                    PWLPT_MOVETO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth / 15.0f,
                     crBBox.bottom + fHeight / 2.0f +
                         FX_BEZIER * (fHeight * 14 / 15.0f - fHeight / 2.0f)),
          PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 2.0f -
                                   FX_BEZIER * (fWidth / 2.0f - fWidth / 15.0f),
                               crBBox.top - fHeight / 15.0f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth / 2.0f, crBBox.top - fHeight / 15.0f),
          PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth / 2.0f +
                         FX_BEZIER * (fWidth * 14 / 15.0f - fWidth / 2.0f),
                     crBBox.top - fHeight / 15.0f),
          PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crBBox.right - fWidth / 15.0f,
                     crBBox.bottom + fHeight / 2.0f +
                         FX_BEZIER * (fHeight * 14 / 15.0f - fHeight / 2.0f)),
          PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 15.0f,
                               crBBox.bottom + fHeight / 2.0f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crBBox.right - fWidth / 15.0f,
                     crBBox.bottom + fHeight / 2.0f -
                         FX_BEZIER * (fHeight / 2.0f - fHeight / 15.0f)),
          PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth / 2.0f +
                         FX_BEZIER * (fWidth * 14 / 15.0f - fWidth / 2.0f),
                     crBBox.bottom + fHeight / 15.0f),
          PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 2.0f,
                               crBBox.bottom + fHeight / 15.0f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 2.0f -
                                   FX_BEZIER * (fWidth / 2.0f - fWidth / 15.0f),
                               crBBox.bottom + fHeight / 15.0f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth / 15.0f,
                     crBBox.bottom + fHeight / 2.0f -
                         FX_BEZIER * (fHeight / 2.0f - fHeight / 15.0f)),
          PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 15.0f,
                               crBBox.bottom + fHeight / 2.0f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 3 / 15.0f,
                               crBBox.bottom + fHeight / 2.0f),
                    PWLPT_MOVETO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth * 3 / 15.0f,
                     crBBox.bottom + fHeight / 2.0f +
                         FX_BEZIER * (fHeight * 4 / 5.0f - fHeight / 2.0f)),
          PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth / 2.0f -
                         FX_BEZIER * (fWidth / 2.0f - fWidth * 3 / 15.0f),
                     crBBox.top - fHeight * 3 / 15.0f),
          PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 2.0f,
                               crBBox.top - fHeight * 3 / 15.0f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth / 2.0f +
                         FX_BEZIER * (fWidth * 4 / 5.0f - fWidth / 2.0f),
                     crBBox.top - fHeight * 3 / 15.0f),
          PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crBBox.right - fWidth * 3 / 15.0f,
                     crBBox.bottom + fHeight / 2.0f +
                         FX_BEZIER * (fHeight * 4 / 5.0f - fHeight / 2.0f)),
          PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 3 / 15.0f,
                               crBBox.bottom + fHeight / 2.0f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crBBox.right - fWidth * 3 / 15.0f,
                     crBBox.bottom + fHeight / 2.0f -
                         FX_BEZIER * (fHeight * 4 / 5.0f - fHeight / 2.0f)),
          PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth / 2.0f +
                         FX_BEZIER * (fWidth * 4 / 5.0f - fWidth / 2.0f),
                     crBBox.bottom + fHeight * 3 / 15.0f),
          PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 2.0f,
                               crBBox.bottom + fHeight * 3 / 15.0f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth / 2.0f -
                         FX_BEZIER * (fWidth * 4 / 5.0f - fWidth / 2.0f),
                     crBBox.bottom + fHeight * 3 / 15.0f),
          PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth * 3 / 15.0f,
                     crBBox.bottom + fHeight / 2.0f -
                         FX_BEZIER * (fHeight * 4 / 5.0f - fHeight / 2.0f)),
          PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 3 / 15.0f,
                               crBBox.bottom + fHeight / 2.0f),
                    PWLPT_BEZIERTO)};

  if (type == PWLPT_STREAM)
    sPathData = GetAppStreamFromArray(PathArray, 26);
  else
    GetPathDataFromArray(path, PathArray, 26);
}

void CPWL_Utils::GetGraphics_Comment(CFX_ByteString& sPathData,
                                     CFX_PathData& path,
                                     const CFX_FloatRect& crBBox,
                                     const PWL_PATH_TYPE type) {
  FX_FLOAT fWidth = crBBox.right - crBBox.left;
  FX_FLOAT fHeight = crBBox.top - crBBox.bottom;

  CPWL_PathData PathArray[] = {
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth / 15.0f, crBBox.top - fHeight / 6.0f),
          PWLPT_MOVETO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth / 15.0f,
                     crBBox.top - fHeight / 6.0f +
                         FX_BEZIER * (fHeight / 6.0f - fHeight / 10.0f)),
          PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 2 / 15.0f -
                                   FX_BEZIER * fWidth / 15.0f,
                               crBBox.top - fHeight / 10.0f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 2 / 15.0f,
                               crBBox.top - fHeight / 10.0f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 2 / 15.0f,
                               crBBox.top - fHeight / 10.0f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 2 / 15.0f +
                                   FX_BEZIER * fWidth / 15.0f,
                               crBBox.top - fHeight / 10.0f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crBBox.right - fWidth / 15.0f,
                     crBBox.top - fHeight / 6 +
                         FX_BEZIER * (fHeight / 6.0f - fHeight / 10.0f)),
          PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 15.0f,
                               crBBox.top - fHeight / 6.0f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 15.0f,
                               crBBox.bottom + fHeight / 3.0f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 15.0f,
                               crBBox.bottom + fHeight * 4 / 15.0f +
                                   FX_BEZIER * fHeight / 15.0f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 2 / 15.0f +
                                   FX_BEZIER * fWidth / 15.0f,
                               crBBox.bottom + fHeight * 4 / 15.0f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 2 / 15.0f,
                               crBBox.bottom + fHeight * 4 / 15.0f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 5 / 15.0f,
                               crBBox.bottom + fHeight * 4 / 15.0f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 5 / 15.0f,
                               crBBox.bottom + fHeight * 2 / 15 +
                                   FX_BEZIER * fHeight * 2 / 15.0f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 5 / 15.0f -
                                   FX_BEZIER * fWidth * 2 / 15.0f,
                               crBBox.bottom + fHeight * 2 / 15.0f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 6 / 30.0f,
                               crBBox.bottom + fHeight * 2 / 15.0f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 7 / 30.0f +
                                   FX_BEZIER * fWidth / 30.0f,
                               crBBox.bottom + fHeight * 2 / 15.0f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 7 / 30.0f,
                               crBBox.bottom + fHeight * 2 / 15.0f +
                                   FX_BEZIER * fHeight * 2 / 15.0f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 7 / 30.0f,
                               crBBox.bottom + fHeight * 4 / 15.0f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 2 / 15.0f,
                               crBBox.bottom + fHeight * 4 / 15.0f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 2 / 15.0f -
                                   FX_BEZIER * fWidth / 15.0f,
                               crBBox.bottom + fHeight * 4 / 15.0f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 15.0f,
                               crBBox.bottom + fHeight / 3.0f -
                                   FX_BEZIER * fHeight / 15.0f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 15.0f,
                               crBBox.bottom + fHeight / 3.0f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth / 15.0f, crBBox.top - fHeight / 6.0f),
          PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 2 / 15.0f,
                               crBBox.top - fHeight * 8 / 30.0f),
                    PWLPT_MOVETO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 2 / 15.0f,
                               crBBox.top - fHeight * 8 / 30.0f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 2 / 15,
                               crBBox.top - fHeight * 25 / 60.0f),
                    PWLPT_MOVETO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 2 / 15.0f,
                               crBBox.top - fHeight * 25 / 60.0f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 2 / 15.0f,
                               crBBox.top - fHeight * 17 / 30.0f),
                    PWLPT_MOVETO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 4 / 15.0f,
                               crBBox.top - fHeight * 17 / 30.0f),
                    PWLPT_LINETO)};

  if (type == PWLPT_STREAM)
    sPathData = GetAppStreamFromArray(PathArray, 30);
  else
    GetPathDataFromArray(path, PathArray, 30);
}

void CPWL_Utils::GetGraphics_Cross(CFX_ByteString& sPathData,
                                   CFX_PathData& path,
                                   const CFX_FloatRect& crBBox,
                                   const PWL_PATH_TYPE type) {
  FX_FLOAT fWidth = crBBox.right - crBBox.left;
  FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
  CPWL_Point center_point(crBBox.left + fWidth / 2,
                          crBBox.bottom + fHeight / 2);

  CPWL_PathData PathArray[] = {
      CPWL_PathData(
          CPWL_Point(center_point.x, center_point.y + fHeight / 10.0f),
          PWLPT_MOVETO),
      CPWL_PathData(
          CPWL_Point(center_point.x + fWidth * 0.3f,
                     center_point.y + fHeight / 10.0f + fWidth * 0.3f),
          PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(center_point.x + fWidth / 10.0f + fWidth * 0.3f,
                               center_point.y + fHeight * 0.3f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(center_point.x + fWidth / 10.0f, center_point.y),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(center_point.x + fWidth / 10.0f + fWidth * 0.3f,
                               center_point.y - fHeight * 0.3f),
                    PWLPT_LINETO),
      CPWL_PathData(
          CPWL_Point(center_point.x + fWidth * 0.3f,
                     center_point.y - fHeight / 10.0f - fHeight * 0.3f),
          PWLPT_LINETO),
      CPWL_PathData(
          CPWL_Point(center_point.x, center_point.y - fHeight / 10.0f),
          PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(center_point.x - fWidth * 0.3f,
                               center_point.y - fHeight / 10 - fHeight * 0.3f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(center_point.x - fWidth / 10.0f - fWidth * 0.3f,
                               center_point.y - fHeight * 0.3f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(center_point.x - fWidth / 10, center_point.y),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(center_point.x - fWidth / 10 - fWidth * 0.3f,
                               center_point.y + fHeight * 0.3f),
                    PWLPT_LINETO),
      CPWL_PathData(
          CPWL_Point(center_point.x - fWidth * 0.3f,
                     center_point.y + fHeight / 10.0f + fHeight * 0.3f),
          PWLPT_LINETO),
      CPWL_PathData(
          CPWL_Point(center_point.x, center_point.y + fHeight / 10.0f),
          PWLPT_LINETO)};

  if (type == PWLPT_STREAM)
    sPathData = GetAppStreamFromArray(PathArray, 13);
  else
    GetPathDataFromArray(path, PathArray, 13);
}

void CPWL_Utils::GetGraphics_Help(CFX_ByteString& sPathData,
                                  CFX_PathData& path,
                                  const CFX_FloatRect& crBBox,
                                  const PWL_PATH_TYPE type) {
  FX_FLOAT fWidth = crBBox.right - crBBox.left;
  FX_FLOAT fHeight = crBBox.top - crBBox.bottom;

  CPWL_PathData PathArray[] = {
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 60.0f,
                               crBBox.bottom + fHeight / 2.0f),
                    PWLPT_MOVETO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth / 60.0f,
                     crBBox.bottom + fHeight / 2.0f +
                         FX_BEZIER * (fHeight / 60.0f - fHeight / 2.0f)),
          PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 2.0f -
                                   FX_BEZIER * (fWidth / 2.0f - fWidth / 60.0f),
                               crBBox.bottom + fHeight / 60.0f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 2.0f,
                               crBBox.bottom + fHeight / 60.0f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 2.0f +
                                   FX_BEZIER * fWidth * 29 / 60.0f,
                               crBBox.bottom + fHeight / 60.0f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crBBox.right - fWidth / 60.0f,
                     crBBox.bottom + fHeight / 2.0f +
                         FX_BEZIER * (fHeight / 60.0f - fHeight / 2.0f)),
          PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 60.0f,
                               crBBox.bottom + fHeight / 2.0f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 60.0f,
                               crBBox.bottom + fHeight / 2.0f +
                                   FX_BEZIER * fHeight * 29 / 60.0f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 2.0f +
                                   FX_BEZIER * fWidth * 29 / 60.0f,
                               crBBox.top - fHeight / 60.0f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth / 2.0f, crBBox.top - fHeight / 60.0f),
          PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 2.0f -
                                   FX_BEZIER * fWidth * 29 / 60.0f,
                               crBBox.top - fHeight / 60.0f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 60.0f,
                               crBBox.bottom + fHeight / 2.0f +
                                   FX_BEZIER * fHeight * 29 / 60.0f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 60.0f,
                               crBBox.bottom + fHeight / 2.0f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.27f,
                               crBBox.top - fHeight * 0.36f),
                    PWLPT_MOVETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.27f,
                               crBBox.top - fHeight * 0.36f +
                                   FX_BEZIER * fHeight * 0.23f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth * 0.5f - FX_BEZIER * fWidth * 0.23f,
                     crBBox.bottom + fHeight * 0.87f),
          PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.5f,
                               crBBox.bottom + fHeight * 0.87f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth * 0.5f + FX_BEZIER * fWidth * 0.23f,
                     crBBox.bottom + fHeight * 0.87f),
          PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.27f,
                               crBBox.top - fHeight * 0.36f +
                                   FX_BEZIER * fHeight * 0.23f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.27f,
                               crBBox.top - fHeight * 0.36f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crBBox.right - fWidth * 0.27f - fWidth * 0.08f * 0.2f,
                     crBBox.top - fHeight * 0.36f - fHeight * 0.15f * 0.7f),
          PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crBBox.right - fWidth * 0.35f + fWidth * 0.08f * 0.2f,
                     crBBox.top - fHeight * 0.51f + fHeight * 0.15f * 0.2f),
          PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.35f,
                               crBBox.top - fHeight * 0.51f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crBBox.right - fWidth * 0.35f - fWidth * 0.1f * 0.5f,
                     crBBox.top - fHeight * 0.51f - fHeight * 0.15f * 0.3f),
          PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crBBox.right - fWidth * 0.45f - fWidth * 0.1f * 0.5f,
                     crBBox.top - fHeight * 0.68f + fHeight * 0.15f * 0.5f),
          PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.45f,
                               crBBox.top - fHeight * 0.68f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.45f,
                               crBBox.bottom + fHeight * 0.30f),
                    PWLPT_LINETO),
      CPWL_PathData(
          CPWL_Point(crBBox.right - fWidth * 0.45f,
                     crBBox.bottom + fHeight * 0.30f - fWidth * 0.1f * 0.7f),
          PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crBBox.right - fWidth * 0.55f,
                     crBBox.bottom + fHeight * 0.30f - fWidth * 0.1f * 0.7f),
          PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.55f,
                               crBBox.bottom + fHeight * 0.30f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.55f,
                               crBBox.top - fHeight * 0.66f),
                    PWLPT_LINETO),
      CPWL_PathData(
          CPWL_Point(crBBox.right - fWidth * 0.55f - fWidth * 0.1f * 0.05f,
                     crBBox.top - fHeight * 0.66f + fHeight * 0.18f * 0.5f),
          PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crBBox.right - fWidth * 0.45f - fWidth * 0.1f * 0.05f,
                     crBBox.top - fHeight * 0.48f - fHeight * 0.18f * 0.3f),
          PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.45f,
                               crBBox.top - fHeight * 0.48f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crBBox.right - fWidth * 0.45f + fWidth * 0.08f * 0.2f,
                     crBBox.top - fHeight * 0.48f + fHeight * 0.18f * 0.2f),
          PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crBBox.right - fWidth * 0.37f - fWidth * 0.08f * 0.2f,
                     crBBox.top - fHeight * 0.36f - fHeight * 0.18f * 0.7f),
          PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.37f,
                               crBBox.top - fHeight * 0.36f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.37f,
                               crBBox.top - fHeight * 0.36f +
                                   FX_BEZIER * fHeight * 0.13f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth * 0.5f + FX_BEZIER * fWidth * 0.13f,
                     crBBox.bottom + fHeight * 0.77f),
          PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.5f,
                               crBBox.bottom + fHeight * 0.77f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth * 0.5f - FX_BEZIER * fWidth * 0.13f,
                     crBBox.bottom + fHeight * 0.77f),
          PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.37f,
                               crBBox.top - fHeight * 0.36f +
                                   FX_BEZIER * fHeight * 0.13f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.37f,
                               crBBox.top - fHeight * 0.36f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth * 0.37f,
                     crBBox.top - fHeight * 0.36f - fWidth * 0.1f * 0.6f),
          PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth * 0.27f,
                     crBBox.top - fHeight * 0.36f - fWidth * 0.1f * 0.6f),
          PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.27f,
                               crBBox.top - fHeight * 0.36f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.56f,
                               crBBox.bottom + fHeight * 0.13f),
                    PWLPT_MOVETO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.56f,
                               crBBox.bottom + fHeight * 0.13f +
                                   FX_BEZIER * fHeight * 0.055f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.505f -
                                   FX_BEZIER * fWidth * 0.095f,
                               crBBox.bottom + fHeight * 0.185f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.505f,
                               crBBox.bottom + fHeight * 0.185f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.505f +
                                   FX_BEZIER * fWidth * 0.065f,
                               crBBox.bottom + fHeight * 0.185f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.44f,
                               crBBox.bottom + fHeight * 0.13f +
                                   FX_BEZIER * fHeight * 0.055f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.44f,
                               crBBox.bottom + fHeight * 0.13f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.44f,
                               crBBox.bottom + fHeight * 0.13f -
                                   FX_BEZIER * fHeight * 0.055f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.505f +
                                   FX_BEZIER * fWidth * 0.065f,
                               crBBox.bottom + fHeight * 0.075f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.505f,
                               crBBox.bottom + fHeight * 0.075f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.505f -
                                   FX_BEZIER * fWidth * 0.065f,
                               crBBox.bottom + fHeight * 0.075f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.56f,
                               crBBox.bottom + fHeight * 0.13f -
                                   FX_BEZIER * fHeight * 0.055f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.56f,
                               crBBox.bottom + fHeight * 0.13f),
                    PWLPT_BEZIERTO)};

  if (type == PWLPT_STREAM)
    sPathData = GetAppStreamFromArray(PathArray, 59);
  else
    GetPathDataFromArray(path, PathArray, 59);
}

void CPWL_Utils::GetGraphics_InsertText(CFX_ByteString& sPathData,
                                        CFX_PathData& path,
                                        const CFX_FloatRect& crBBox,
                                        const PWL_PATH_TYPE type) {
  FX_FLOAT fWidth = crBBox.right - crBBox.left;
  FX_FLOAT fHeight = crBBox.top - crBBox.bottom;

  CPWL_PathData PathArray[] = {
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth / 10, crBBox.bottom + fHeight / 10),
          PWLPT_MOVETO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth / 2, crBBox.top - fHeight * 2 / 15),
          PWLPT_LINETO),
      CPWL_PathData(
          CPWL_Point(crBBox.right - fWidth / 10, crBBox.bottom + fHeight / 10),
          PWLPT_LINETO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth / 10, crBBox.bottom + fHeight / 10),
          PWLPT_LINETO)};

  if (type == PWLPT_STREAM)
    sPathData = GetAppStreamFromArray(PathArray, 4);
  else
    GetPathDataFromArray(path, PathArray, 4);
}

void CPWL_Utils::GetGraphics_Key(CFX_ByteString& sPathData,
                                 CFX_PathData& path,
                                 const CFX_FloatRect& crBBox,
                                 const PWL_PATH_TYPE type) {
  FX_FLOAT fWidth = crBBox.right - crBBox.left;
  FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
  FX_FLOAT k = -fHeight / fWidth;
  CPWL_Point tail;
  CPWL_Point CicleCenter;
  tail.x = crBBox.left + fWidth * 0.9f;
  tail.y = k * (tail.x - crBBox.right) + crBBox.bottom;
  CicleCenter.x = crBBox.left + fWidth * 0.15f;
  CicleCenter.y = k * (CicleCenter.x - crBBox.right) + crBBox.bottom;

  CPWL_PathData PathArray[] = {
      CPWL_PathData(
          CPWL_Point(tail.x + fWidth / 30.0f, -fWidth / 30.0f / k + tail.y),
          PWLPT_MOVETO),
      CPWL_PathData(CPWL_Point(tail.x + fWidth / 30.0f - fWidth * 0.18f,
                               -k * fWidth * 0.18f - fWidth / 30 / k + tail.y),
                    PWLPT_LINETO),
      CPWL_PathData(
          CPWL_Point(tail.x + fWidth / 30 - fWidth * 0.18f + fWidth * 0.07f,
                     -fWidth * 0.07f / k - k * fWidth * 0.18f -
                         fWidth / 30 / k + tail.y),
          PWLPT_LINETO),
      CPWL_PathData(
          CPWL_Point(tail.x + fWidth / 30 - fWidth * 0.18f - fWidth / 20 +
                         fWidth * 0.07f,
                     -fWidth * 0.07f / k - k * fWidth / 20 -
                         k * fWidth * 0.18f - fWidth / 30 / k + tail.y),
          PWLPT_LINETO),
      CPWL_PathData(
          CPWL_Point(
              tail.x + fWidth / 30 - fWidth * 0.18f - fWidth / 20,
              -k * fWidth / 20 - k * fWidth * 0.18f - fWidth / 30 / k + tail.y),
          PWLPT_LINETO),
      CPWL_PathData(
          CPWL_Point(
              tail.x + fWidth / 30 - fWidth * 0.18f - fWidth / 20 - fWidth / 15,
              -k * fWidth / 15 - k * fWidth / 20 - k * fWidth * 0.18f -
                  fWidth / 30 / k + tail.y),
          PWLPT_LINETO),
      CPWL_PathData(
          CPWL_Point(tail.x + fWidth / 30 - fWidth * 0.18f - fWidth / 20 -
                         fWidth / 15 + fWidth * 0.07f,
                     -fWidth * 0.07f / k - k * fWidth / 15 - k * fWidth / 20 -
                         k * fWidth * 0.18f - fWidth / 30 / k + tail.y),
          PWLPT_LINETO),
      CPWL_PathData(
          CPWL_Point(tail.x + fWidth / 30 - fWidth * 0.18f - fWidth / 20 -
                         fWidth / 15 - fWidth / 20 + fWidth * 0.07f,
                     -fWidth * 0.07f / k + -k * fWidth / 20 + -k * fWidth / 15 -
                         k * fWidth / 20 - k * fWidth * 0.18f -
                         fWidth / 30 / k + tail.y),
          PWLPT_LINETO),
      CPWL_PathData(
          CPWL_Point(tail.x + fWidth / 30 - fWidth * 0.18f - fWidth / 20 -
                         fWidth / 15 - fWidth / 20,
                     -k * fWidth / 20 + -k * fWidth / 15 - k * fWidth / 20 -
                         k * fWidth * 0.18f - fWidth / 30 / k + tail.y),
          PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(tail.x + fWidth / 30 - fWidth * 0.45f,
                               -k * fWidth * 0.45f - fWidth / 30 / k + tail.y),
                    PWLPT_LINETO),
      CPWL_PathData(
          CPWL_Point(tail.x + fWidth / 30 - fWidth * 0.45f + fWidth * 0.2f,
                     -fWidth * 0.4f / k - k * fWidth * 0.45f - fWidth / 30 / k +
                         tail.y),
          PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(CicleCenter.x + fWidth * 0.2f,
                               -fWidth * 0.1f / k + CicleCenter.y),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(CicleCenter.x, CicleCenter.y), PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(CicleCenter.x - fWidth / 60.0f,
                               -k * fWidth / 60 + CicleCenter.y),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(CicleCenter.x - fWidth / 60,
                               -k * fWidth / 60 + CicleCenter.y),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(CicleCenter.x, CicleCenter.y), PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(CicleCenter.x - fWidth * 0.22f,
                     fWidth * 0.35f / k + CicleCenter.y - fHeight * 0.05f),
          PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(tail.x - fWidth / 30 - fWidth * 0.45f - fWidth * 0.18f,
                     fWidth * 0.05f / k - k * fWidth * 0.45f + fWidth / 30 / k +
                         tail.y - fHeight * 0.05f),
          PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(tail.x - fWidth / 30.0f - fWidth * 0.45f,
                     -k * fWidth * 0.45f + fWidth / 30.0f / k + tail.y),
          PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(tail.x - fWidth / 30.0f, fWidth / 30.0f / k + tail.y),
          PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(tail.x + fWidth / 30, -fWidth / 30 / k + tail.y),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(CicleCenter.x + fWidth * 0.08f,
                               k * fWidth * 0.08f + CicleCenter.y),
                    PWLPT_MOVETO),
      CPWL_PathData(
          CPWL_Point(CicleCenter.x + fWidth * 0.08f + fWidth * 0.1f,
                     -fWidth * 0.1f / k + k * fWidth * 0.08f + CicleCenter.y),
          PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(CicleCenter.x + fWidth * 0.22f + fWidth * 0.1f,
                     k * fWidth * 0.22f + CicleCenter.y - fWidth * 0.1f / k),
          PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(CicleCenter.x + fWidth * 0.22f,
                               k * fWidth * 0.22f + CicleCenter.y),
                    PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(CicleCenter.x + fWidth * 0.22f - fWidth * 0.1f,
                     fWidth * 0.1f / k + k * fWidth * 0.22f + CicleCenter.y),
          PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(CicleCenter.x + fWidth * 0.08f - fWidth * 0.1f,
                     fWidth * 0.1f / k + k * fWidth * 0.08f + CicleCenter.y),
          PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(CicleCenter.x + fWidth * 0.08f,
                               k * fWidth * 0.08f + CicleCenter.y),
                    PWLPT_BEZIERTO)};

  if (type == PWLPT_STREAM)
    sPathData = GetAppStreamFromArray(PathArray, 28);
  else
    GetPathDataFromArray(path, PathArray, 28);
}

void CPWL_Utils::GetGraphics_NewParagraph(CFX_ByteString& sPathData,
                                          CFX_PathData& path,
                                          const CFX_FloatRect& crBBox,
                                          const PWL_PATH_TYPE type) {
  FX_FLOAT fWidth = crBBox.right - crBBox.left;
  FX_FLOAT fHeight = crBBox.top - crBBox.bottom;

  CPWL_PathData PathArray[] = {
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth / 2.0f, crBBox.top - fHeight / 20.0f),
          PWLPT_MOVETO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth / 10.0f, crBBox.top - fHeight / 2.0f),
          PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 10.0f,
                               crBBox.top - fHeight / 2.0f),
                    PWLPT_LINETO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth / 2.0f, crBBox.top - fHeight / 20.0f),
          PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.12f,
                               crBBox.top - fHeight * 17 / 30.0f),
                    PWLPT_MOVETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.12f,
                               crBBox.bottom + fHeight / 10.0f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.22f,
                               crBBox.bottom + fHeight / 10.0f),
                    PWLPT_LINETO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth * 0.22f,
                     crBBox.top - fHeight * 17 / 30.0f - fWidth * 0.14f),
          PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.38f,
                               crBBox.bottom + fHeight / 10.0f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.48f,
                               crBBox.bottom + fHeight / 10.0f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.48f,
                               crBBox.top - fHeight * 17 / 30.0f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.38f,
                               crBBox.top - fHeight * 17 / 30.0f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.38f,
                               crBBox.bottom + fWidth * 0.24f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.22f,
                               crBBox.top - fHeight * 17 / 30.0f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.12f,
                               crBBox.top - fHeight * 17 / 30.0f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.6f,
                               crBBox.bottom + fHeight / 10.0f),
                    PWLPT_MOVETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.7f,
                               crBBox.bottom + fHeight / 10.0f),
                    PWLPT_LINETO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth * 0.7f,
                     crBBox.bottom + fHeight / 10.0f + fHeight / 7.0f),
          PWLPT_LINETO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth * 0.97f,
                     crBBox.bottom + fHeight / 10.0f + fHeight / 7.0f),
          PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.97f,
                               crBBox.top - fHeight * 17 / 30.0f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.7f,
                               crBBox.top - fHeight * 17 / 30.0f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.6f,
                               crBBox.top - fHeight * 17 / 30.0f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.6f,
                               crBBox.bottom + fHeight / 10.0f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.7f,
                               crBBox.bottom + fHeight / 7 + fHeight * 0.18f),
                    PWLPT_MOVETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.85f,
                               crBBox.bottom + fHeight / 7 + fHeight * 0.18f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth * 0.85f,
                     crBBox.top - fHeight * 17 / 30.0f - fHeight * 0.08f),
          PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth * 0.7f,
                     crBBox.top - fHeight * 17 / 30.0f - fHeight * 0.08f),
          PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.7f,
                               crBBox.bottom + fHeight / 7 + fHeight * 0.18f),
                    PWLPT_LINETO)};

  if (type == PWLPT_STREAM)
    sPathData = GetAppStreamFromArray(PathArray, 28);
  else
    GetPathDataFromArray(path, PathArray, 28);
}

void CPWL_Utils::GetGraphics_TextNote(CFX_ByteString& sPathData,
                                      CFX_PathData& path,
                                      const CFX_FloatRect& crBBox,
                                      const PWL_PATH_TYPE type) {
  FX_FLOAT fWidth = crBBox.right - crBBox.left;
  FX_FLOAT fHeight = crBBox.top - crBBox.bottom;

  CPWL_PathData PathArray[] = {
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 3 / 10.0f,
                               crBBox.bottom + fHeight / 15.0f),
                    PWLPT_MOVETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 7 / 10.0f,
                               crBBox.bottom + fHeight * 4 / 15.0f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 10.0f,
                               crBBox.bottom + fHeight * 4 / 15.0f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 10.0f,
                               crBBox.top - fHeight / 15.0f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 10.0f,
                               crBBox.top - fHeight / 15.0f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 10.0f,
                               crBBox.bottom + fHeight / 15.0f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 3 / 10.0f,
                               crBBox.bottom + fHeight / 15.0f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 10.0f,
                               crBBox.bottom + fHeight * 4 / 15.0f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 3 / 10.0f,
                               crBBox.bottom + fHeight / 15.0f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 3 / 10.0f,
                               crBBox.bottom + fHeight * 4 / 15.0f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 10.0f,
                               crBBox.bottom + fHeight * 4 / 15.0f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 5.0f,
                               crBBox.top - fHeight * 4 / 15.0f),
                    PWLPT_MOVETO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 5.0f,
                               crBBox.top - fHeight * 4 / 15.0f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 5.0f,
                               crBBox.top - fHeight * 7 / 15.0f),
                    PWLPT_MOVETO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 5.0f,
                               crBBox.top - fHeight * 7 / 15.0f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 5.0f,
                               crBBox.top - fHeight * 10 / 15.0f),
                    PWLPT_MOVETO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 3 / 10.0f,
                               crBBox.top - fHeight * 10 / 15.0f),
                    PWLPT_LINETO)};

  if (type == PWLPT_STREAM)
    sPathData = GetAppStreamFromArray(PathArray, 17);
  else
    GetPathDataFromArray(path, PathArray, 17);
}

void CPWL_Utils::GetGraphics_Paragraph(CFX_ByteString& sPathData,
                                       CFX_PathData& path,
                                       const CFX_FloatRect& crBBox,
                                       const PWL_PATH_TYPE type) {
  FX_FLOAT fWidth = crBBox.right - crBBox.left;
  FX_FLOAT fHeight = crBBox.top - crBBox.bottom;

  CPWL_PathData PathArray[] = {
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth / 2.0f, crBBox.top - fHeight / 15.0f),
          PWLPT_MOVETO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth * 0.7f, crBBox.top - fHeight / 15.0f),
          PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.7f,
                               crBBox.bottom + fHeight / 15.0f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.634f,
                               crBBox.bottom + fHeight / 15.0f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.634f,
                               crBBox.top - fHeight * 2 / 15.0f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.566f,
                               crBBox.top - fHeight * 2 / 15.0f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.566f,
                               crBBox.bottom + fHeight / 15.0f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 2.0f,
                               crBBox.bottom + fHeight / 15.0f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 2.0f,
                               crBBox.top - fHeight / 15.0f - fHeight * 0.4f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.2f,
                               crBBox.top - fHeight / 15.0f - fHeight * 0.4f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth * 0.2f, crBBox.top - fHeight / 15.0f),
          PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth / 2.0f, crBBox.top - fHeight / 15.0f),
          PWLPT_BEZIERTO)};

  if (type == PWLPT_STREAM)
    sPathData = GetAppStreamFromArray(PathArray, 12);
  else
    GetPathDataFromArray(path, PathArray, 12);
}

void CPWL_Utils::GetGraphics_RightArrow(CFX_ByteString& sPathData,
                                        CFX_PathData& path,
                                        const CFX_FloatRect& crBBox,
                                        const PWL_PATH_TYPE type) {
  FX_FLOAT fWidth = crBBox.right - crBBox.left;
  FX_FLOAT fHeight = crBBox.top - crBBox.bottom;

  CPWL_PathData PathArray[] = {
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 15.0f,
                               crBBox.top - fHeight / 2.0f),
                    PWLPT_MOVETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 2.0f + fWidth / 8.0f,
                               crBBox.bottom + fHeight / 5.0f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 2.0f,
                               crBBox.bottom + fHeight / 5.0f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 15.0f - fWidth * 0.15f,
                               crBBox.top - fHeight / 2.0f - fWidth / 25.0f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.1f,
                               crBBox.top - fHeight / 2.0f - fWidth / 25.0f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.1f,
                               crBBox.top - fHeight / 2.0f + fWidth / 25.0f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 15.0f - fWidth * 0.15f,
                               crBBox.top - fHeight / 2.0f + fWidth / 25.0f),
                    PWLPT_LINETO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth / 2.0f, crBBox.top - fHeight / 5.0f),
          PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 2.0f + fWidth / 8.0f,
                               crBBox.top - fHeight / 5.0f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 15.0f,
                               crBBox.top - fHeight / 2.0f),
                    PWLPT_LINETO)};

  if (type == PWLPT_STREAM)
    sPathData = GetAppStreamFromArray(PathArray, 10);
  else
    GetPathDataFromArray(path, PathArray, 10);
}

void CPWL_Utils::GetGraphics_RightPointer(CFX_ByteString& sPathData,
                                          CFX_PathData& path,
                                          const CFX_FloatRect& crBBox,
                                          const PWL_PATH_TYPE type) {
  FX_FLOAT fWidth = crBBox.right - crBBox.left;
  FX_FLOAT fHeight = crBBox.top - crBBox.bottom;

  CPWL_PathData PathArray[] = {
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 30.0f,
                               crBBox.top - fHeight / 2.0f),
                    PWLPT_MOVETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 30.0f,
                               crBBox.bottom + fHeight / 6.0f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 4 / 15.0f,
                               crBBox.top - fHeight / 2.0f),
                    PWLPT_LINETO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth / 30.0f, crBBox.top - fHeight / 6.0f),
          PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 30.0f,
                               crBBox.top - fHeight / 2.0f),
                    PWLPT_LINETO)};

  if (type == PWLPT_STREAM)
    sPathData = GetAppStreamFromArray(PathArray, 5);
  else
    GetPathDataFromArray(path, PathArray, 5);
}

void CPWL_Utils::GetGraphics_Star(CFX_ByteString& sPathData,
                                  CFX_PathData& path,
                                  const CFX_FloatRect& crBBox,
                                  const PWL_PATH_TYPE type) {
  FX_FLOAT fLongRadius =
      (crBBox.top - crBBox.bottom) / (1 + (FX_FLOAT)cos(FX_PI / 5.0f));
  fLongRadius = fLongRadius * 0.7f;
  FX_FLOAT fShortRadius = fLongRadius * 0.55f;
  CFX_FloatPoint ptCenter = CFX_FloatPoint((crBBox.left + crBBox.right) / 2.0f,
                                           (crBBox.top + crBBox.bottom) / 2.0f);

  FX_FLOAT px1[5], py1[5];
  FX_FLOAT px2[5], py2[5];

  FX_FLOAT fAngel = FX_PI / 10.0f;

  for (int32_t i = 0; i < 5; i++) {
    px1[i] = ptCenter.x + fLongRadius * (FX_FLOAT)cos(fAngel);
    py1[i] = ptCenter.y + fLongRadius * (FX_FLOAT)sin(fAngel);

    fAngel += FX_PI * 2 / 5.0f;
  }

  fAngel = FX_PI / 5.0f + FX_PI / 10.0f;

  for (int32_t j = 0; j < 5; j++) {
    px2[j] = ptCenter.x + fShortRadius * (FX_FLOAT)cos(fAngel);
    py2[j] = ptCenter.y + fShortRadius * (FX_FLOAT)sin(fAngel);

    fAngel += FX_PI * 2 / 5.0f;
  }

  CPWL_PathData PathArray[11];
  PathArray[0] = CPWL_PathData(CPWL_Point(px1[0], py1[0]), PWLPT_MOVETO);
  PathArray[1] = CPWL_PathData(CPWL_Point(px2[0], py2[0]), PWLPT_LINETO);

  for (int32_t k = 0; k < 4; k++) {
    PathArray[(k + 1) * 2] =
        CPWL_PathData(CPWL_Point(px1[k + 1], py1[k + 1]), PWLPT_LINETO);
    PathArray[(k + 1) * 2 + 1] =
        CPWL_PathData(CPWL_Point(px2[k + 1], py2[k + 1]), PWLPT_LINETO);
  }

  PathArray[10] = CPWL_PathData(CPWL_Point(px1[0], py1[0]), PWLPT_LINETO);

  if (type == PWLPT_STREAM)
    sPathData = GetAppStreamFromArray(PathArray, 11);
  else
    GetPathDataFromArray(path, PathArray, 11);
}

void CPWL_Utils::GetGraphics_UpArrow(CFX_ByteString& sPathData,
                                     CFX_PathData& path,
                                     const CFX_FloatRect& crBBox,
                                     const PWL_PATH_TYPE type) {
  FX_FLOAT fWidth = crBBox.right - crBBox.left;
  FX_FLOAT fHeight = crBBox.top - crBBox.bottom;

  CPWL_PathData PathArray[] = {
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth / 2.0f, crBBox.top - fHeight / 15.0f),
          PWLPT_MOVETO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 10.0f,
                               crBBox.top - fWidth * 3 / 5.0f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.6f,
                               crBBox.top - fWidth * 3 / 5.0f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.6f,
                               crBBox.bottom + fHeight / 15.0f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.4f,
                               crBBox.bottom + fHeight / 15.0f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.4f,
                               crBBox.top - fWidth * 3 / 5.0f),
                    PWLPT_LINETO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth / 10, crBBox.top - fWidth * 3 / 5.0f),
          PWLPT_LINETO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth / 2.0f, crBBox.top - fHeight / 15.0f),
          PWLPT_LINETO)};

  if (type == PWLPT_STREAM)
    sPathData = GetAppStreamFromArray(PathArray, 8);
  else
    GetPathDataFromArray(path, PathArray, 8);
}

void CPWL_Utils::GetGraphics_UpLeftArrow(CFX_ByteString& sPathData,
                                         CFX_PathData& path,
                                         const CFX_FloatRect& crBBox,
                                         const PWL_PATH_TYPE type) {
  FX_FLOAT fWidth = crBBox.right - crBBox.left;
  FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
  CPWL_Point leftup(crBBox.left, crBBox.top);
  CPWL_Point rightdown(crBBox.right, crBBox.bottom);
  FX_FLOAT k = -fHeight / fWidth;
  CPWL_Point tail;
  tail.x = crBBox.left + fWidth * 4 / 5.0f;
  tail.y = k * (tail.x - crBBox.right) + rightdown.y;

  CPWL_PathData PathArray[] = {
      CPWL_PathData(
          CPWL_Point(
              crBBox.left + fWidth / 20.0f,
              k * (crBBox.left + fWidth / 20.0f - rightdown.x) + rightdown.y),
          PWLPT_MOVETO),
      CPWL_PathData(CPWL_Point(fHeight * 17 / 60.0f / k + tail.x +
                                   fWidth / 10.0f + fWidth / 5.0f,
                               -fWidth / 5.0f / k + tail.y -
                                   fWidth / 10.0f / k + fHeight * 17 / 60.0f),
                    PWLPT_LINETO),
      CPWL_PathData(
          CPWL_Point(fHeight * 17 / 60.0f / k + tail.x + fWidth / 10.0f,
                     tail.y - fWidth / 10.0f / k + fHeight * 17 / 60.0f),
          PWLPT_LINETO),
      CPWL_PathData(
          CPWL_Point(tail.x + fWidth / 10.0f, tail.y - fWidth / 10.0f / k),
          PWLPT_LINETO),
      CPWL_PathData(
          CPWL_Point(tail.x - fWidth / 10.0f, tail.y + fWidth / 10.0f / k),
          PWLPT_LINETO),
      CPWL_PathData(
          CPWL_Point(fHeight * 17 / 60.0f / k + tail.x - fWidth / 10.0f,
                     tail.y + fWidth / 10.0f / k + fHeight * 17 / 60.0f),
          PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(fHeight * 17 / 60.0f / k + tail.x -
                                   fWidth / 10.0f - fWidth / 5.0f,
                               fWidth / 5.0f / k + tail.y + fWidth / 10.0f / k +
                                   fHeight * 17 / 60.0f),
                    PWLPT_LINETO),
      CPWL_PathData(
          CPWL_Point(
              crBBox.left + fWidth / 20.0f,
              k * (crBBox.left + fWidth / 20.0f - rightdown.x) + rightdown.y),
          PWLPT_LINETO)};

  if (type == PWLPT_STREAM)
    sPathData = GetAppStreamFromArray(PathArray, 8);
  else
    GetPathDataFromArray(path, PathArray, 8);
}

void CPWL_Utils::GetGraphics_Graph(CFX_ByteString& sPathData,
                                   CFX_PathData& path,
                                   const CFX_FloatRect& crBBox,
                                   const PWL_PATH_TYPE type) {
  FX_FLOAT fWidth = crBBox.right - crBBox.left;
  FX_FLOAT fHeight = crBBox.top - crBBox.bottom;

  CPWL_PathData PathArray[] = {
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth * 0.05f, crBBox.top - fWidth * 0.15f),
          PWLPT_MOVETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.25f,
                               crBBox.top - fHeight * 0.15f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.275f,
                               crBBox.bottom + fHeight * 0.08f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.05f,
                               crBBox.bottom + fHeight * 0.08f),
                    PWLPT_LINETO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth * 0.05f, crBBox.top - fWidth * 0.15f),
          PWLPT_LINETO),

      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.275f,
                               crBBox.top - fWidth * 0.45f),
                    PWLPT_MOVETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.475f,
                               crBBox.top - fWidth * 0.45f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.475f,
                               crBBox.bottom + fHeight * 0.08f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.275f,
                               crBBox.bottom + fHeight * 0.08f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.275f,
                               crBBox.top - fWidth * 0.45f),
                    PWLPT_LINETO),

      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth * 0.5f, crBBox.top - fHeight * 0.05f),
          PWLPT_MOVETO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth * 0.7f, crBBox.top - fHeight * 0.05f),
          PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.7f,
                               crBBox.bottom + fHeight * 0.08f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.5f,
                               crBBox.bottom + fHeight * 0.08f),
                    PWLPT_LINETO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth * 0.5f, crBBox.top - fHeight * 0.05f),
          PWLPT_LINETO),

      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.725f,
                               crBBox.top - fWidth * 0.35f),
                    PWLPT_MOVETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.925f,
                               crBBox.top - fWidth * 0.35f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.925f,
                               crBBox.bottom + fHeight * 0.08f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.725f,
                               crBBox.bottom + fHeight * 0.08f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.725f,
                               crBBox.top - fWidth * 0.35f),
                    PWLPT_LINETO)};

  if (type == PWLPT_STREAM)
    sPathData = GetAppStreamFromArray(PathArray, 20);
  else
    GetPathDataFromArray(path, PathArray, 20);
}

void CPWL_Utils::GetGraphics_Paperclip(CFX_ByteString& sPathData,
                                       CFX_PathData& path,
                                       const CFX_FloatRect& crBBox,
                                       const PWL_PATH_TYPE type) {
  FX_FLOAT fWidth = crBBox.right - crBBox.left;
  FX_FLOAT fHeight = crBBox.top - crBBox.bottom;

  CPWL_PathData PathArray[] = {
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth / 60, crBBox.top - fHeight * 0.25f),
          PWLPT_MOVETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 60,
                               crBBox.bottom + fHeight * 0.25f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 60,
                               crBBox.bottom + fHeight * 0.25f -
                                   fWidth * 57 / 60.0f * 0.35f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 30,
                               crBBox.bottom + fHeight * 0.25f -
                                   fWidth * 57 / 60.0f * 0.35f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 30,
                               crBBox.bottom + fHeight * 0.25f),
                    PWLPT_BEZIERTO),

      CPWL_PathData(
          CPWL_Point(crBBox.right - fWidth / 30, crBBox.top - fHeight * 0.33f),
          PWLPT_LINETO),
      CPWL_PathData(
          CPWL_Point(crBBox.right - fWidth / 30,
                     crBBox.top - fHeight * 0.33f + fHeight / 15 * 0.5f),
          PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crBBox.right - fWidth / 30 - fWidth * 0.12f,
                     crBBox.top - fHeight * 0.33f + fHeight / 15 * 0.5f),
          PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 30 - fWidth * 0.12f,
                               crBBox.top - fHeight * 0.33f),
                    PWLPT_BEZIERTO),

      CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 30 - fWidth * 0.12f,
                               crBBox.bottom + fHeight * 0.2f),
                    PWLPT_LINETO),
      CPWL_PathData(
          CPWL_Point(crBBox.right - fWidth / 30 - fWidth * 0.12f,
                     crBBox.bottom + fHeight * 0.2f -
                         (fWidth * 57 / 60.0f - fWidth * 0.24f) * 0.25f),
          PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth / 60 + fWidth * 0.12f,
                     crBBox.bottom + fHeight * 0.2f -
                         (fWidth * 57 / 60.0f - fWidth * 0.24f) * 0.25f),
          PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 60 + fWidth * 0.12f,
                               crBBox.bottom + fHeight * 0.2f),
                    PWLPT_BEZIERTO),

      CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 60 + fWidth * 0.12f,
                               crBBox.top - fHeight * 0.2f),
                    PWLPT_LINETO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth / 60 + fWidth * 0.12f,
                     crBBox.top - fHeight * 0.2f +
                         (fWidth * 11 / 12.0f - fWidth * 0.36f) * 0.25f),
          PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crBBox.right - fWidth / 15 - fWidth * 0.24f,
                     crBBox.top - fHeight * 0.2f +
                         (fWidth * 11 / 12.0f - fWidth * 0.36f) * 0.25f),
          PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 15 - fWidth * 0.24f,
                               crBBox.top - fHeight * 0.2f),
                    PWLPT_BEZIERTO),

      CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 15 - fWidth * 0.24f,
                               crBBox.bottom + fHeight * 0.25f),
                    PWLPT_LINETO),
      CPWL_PathData(
          CPWL_Point(crBBox.right - fWidth / 15 - fWidth * 0.24f,
                     crBBox.bottom + fHeight * 0.25f -
                         (fWidth * 14 / 15.0f - fWidth * 0.53f) * 0.25f),
          PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth * 0.29f,
                     crBBox.bottom + fHeight * 0.25f -
                         (fWidth * 14 / 15.0f - fWidth * 0.53f) * 0.25f),
          PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.29f,
                               crBBox.bottom + fHeight * 0.25f),
                    PWLPT_BEZIERTO),

      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.29f,
                               crBBox.top - fHeight * 0.33f),
                    PWLPT_LINETO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth * 0.29f,
                     crBBox.top - fHeight * 0.33f + fWidth * 0.12f * 0.35f),
          PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth * 0.17f,
                     crBBox.top - fHeight * 0.33f + fWidth * 0.12f * 0.35f),
          PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.17f,
                               crBBox.top - fHeight * 0.33f),
                    PWLPT_BEZIERTO),

      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.17f,
                               crBBox.bottom + fHeight * 0.3f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.17f,
                               crBBox.bottom + fHeight * 0.3f -
                                   fWidth * (14 / 15.0f - 0.29f) * 0.35f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 15 - fWidth * 0.12f,
                               crBBox.bottom + fHeight * 0.3f -
                                   fWidth * (14 / 15.0f - 0.29f) * 0.35f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 15 - fWidth * 0.12f,
                               crBBox.bottom + fHeight * 0.3f),
                    PWLPT_BEZIERTO),

      CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 15 - fWidth * 0.12f,
                               crBBox.top - fHeight * 0.25f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 15 - fWidth * 0.12f,
                               crBBox.top - fHeight * 0.25f +
                                   fWidth * 0.35f * (11 / 12.0f - 0.12f)),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 60,
                               crBBox.top - fHeight * 0.25f +
                                   fWidth * 0.35f * (11 / 12.0f - 0.12f)),
                    PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth / 60, crBBox.top - fHeight * 0.25f),
          PWLPT_BEZIERTO)};

  if (type == PWLPT_STREAM)
    sPathData = GetAppStreamFromArray(PathArray, 33);
  else
    GetPathDataFromArray(path, PathArray, 33);
}

void CPWL_Utils::GetGraphics_Attachment(CFX_ByteString& sPathData,
                                        CFX_PathData& path,
                                        const CFX_FloatRect& crBBox,
                                        const PWL_PATH_TYPE type) {
  FX_FLOAT fWidth = crBBox.right - crBBox.left;
  FX_FLOAT fHeight = crBBox.top - crBBox.bottom;

  CPWL_PathData PathArray[] = {
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth * 0.25f, crBBox.top - fHeight * 0.1f),
          PWLPT_MOVETO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth * 0.4f, crBBox.top - fHeight * 0.23f),
          PWLPT_LINETO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth * 0.4f, crBBox.top - fHeight * 0.5f),
          PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.4f,
                               crBBox.top - fHeight * 0.5f + fWidth * 0.04f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.6f,
                               crBBox.top - fHeight * 0.5f + fWidth * 0.04f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth * 0.6f, crBBox.top - fHeight * 0.5f),
          PWLPT_BEZIERTO),

      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth * 0.6f, crBBox.top - fHeight * 0.23f),
          PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.25f,
                               crBBox.top - fHeight * 0.1f),
                    PWLPT_LINETO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth * 0.25f, crBBox.top - fHeight * 0.1f),
          PWLPT_LINETO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth * 0.4f, crBBox.top - fHeight * 0.23f),
          PWLPT_LINETO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth * 0.6f, crBBox.top - fHeight * 0.23f),
          PWLPT_LINETO),

      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth * 0.4f, crBBox.top - fHeight * 0.5f),
          PWLPT_MOVETO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth * 0.4f - fWidth * 0.25f * 0.4f,
                     crBBox.top - fHeight * 0.5f),
          PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth * 0.15f,
                     crBBox.top - fHeight * 0.65f + fHeight * 0.15f * 0.4f),
          PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.15f,
                               crBBox.top - fHeight * 0.65f),
                    PWLPT_BEZIERTO),

      CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.15f,
                               crBBox.top - fHeight * 0.65f),
                    PWLPT_LINETO),
      CPWL_PathData(
          CPWL_Point(crBBox.right - fWidth * 0.15f,
                     crBBox.top - fHeight * 0.65f + fHeight * 0.15f * 0.4f),
          PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth * 0.6f + fWidth * 0.25f * 0.4f,
                     crBBox.top - fHeight * 0.5f),
          PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth * 0.6f, crBBox.top - fHeight * 0.5f),
          PWLPT_BEZIERTO),

      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.6f,
                               crBBox.top - fHeight * 0.5f + fWidth * 0.04f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.4f,
                               crBBox.top - fHeight * 0.5f + fWidth * 0.04f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth * 0.4f, crBBox.top - fHeight * 0.5f),
          PWLPT_BEZIERTO),

      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth * 0.5f, crBBox.top - fHeight * 0.65f),
          PWLPT_MOVETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.5f,
                               crBBox.bottom + fHeight * 0.1f),
                    PWLPT_LINETO)};

  if (type == PWLPT_STREAM)
    sPathData = GetAppStreamFromArray(PathArray, 24);
  else
    GetPathDataFromArray(path, PathArray, 24);
}

void CPWL_Utils::GetGraphics_Tag(CFX_ByteString& sPathData,
                                 CFX_PathData& path,
                                 const CFX_FloatRect& crBBox,
                                 const PWL_PATH_TYPE type) {
  FX_FLOAT fWidth = crBBox.right - crBBox.left;
  FX_FLOAT fHeight = crBBox.top - crBBox.bottom;

  CPWL_PathData PathArray[] = {
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth * 0.4f, crBBox.top - fHeight * 0.1f),
          PWLPT_MOVETO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth * 0.1f, crBBox.top - fHeight * 0.5f),
          PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.3f,
                               crBBox.bottom + fHeight * 0.1f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.1f,
                               crBBox.bottom + fHeight * 0.1f),
                    PWLPT_LINETO),
      CPWL_PathData(
          CPWL_Point(crBBox.right - fWidth * 0.1f, crBBox.top - fHeight * 0.1f),
          PWLPT_LINETO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth * 0.4f, crBBox.top - fHeight * 0.1f),
          PWLPT_LINETO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth * 0.4f, crBBox.top - fHeight * 0.3f),
          PWLPT_MOVETO),
      CPWL_PathData(
          CPWL_Point(crBBox.right - fWidth * 0.2f, crBBox.top - fHeight * 0.3f),
          PWLPT_LINETO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth * 0.4f, crBBox.top - fHeight * 0.5f),
          PWLPT_MOVETO),
      CPWL_PathData(
          CPWL_Point(crBBox.right - fWidth * 0.2f, crBBox.top - fHeight * 0.5f),
          PWLPT_LINETO),
      CPWL_PathData(
          CPWL_Point(crBBox.left + fWidth * 0.4f, crBBox.top - fHeight * 0.7f),
          PWLPT_MOVETO),
      CPWL_PathData(
          CPWL_Point(crBBox.right - fWidth * 0.2f, crBBox.top - fHeight * 0.7f),
          PWLPT_LINETO)};

  if (type == PWLPT_STREAM)
    sPathData = GetAppStreamFromArray(PathArray, 12);
  else
    GetPathDataFromArray(path, PathArray, 12);
}

void CPWL_Utils::GetGraphics_Foxit(CFX_ByteString& sPathData,
                                   CFX_PathData& path,
                                   const CFX_FloatRect& crBBox,
                                   const PWL_PATH_TYPE type) {
  FX_FLOAT fOutWidth = crBBox.right - crBBox.left;
  FX_FLOAT fOutHeight = crBBox.top - crBBox.bottom;

  CFX_FloatRect crInBox = crBBox;
  crInBox.left = crBBox.left + fOutWidth * 0.08f;
  crInBox.right = crBBox.right - fOutWidth * 0.08f;
  crInBox.top = crBBox.top - fOutHeight * 0.08f;
  crInBox.bottom = crBBox.bottom + fOutHeight * 0.08f;

  FX_FLOAT fWidth = crInBox.right - crInBox.left;
  FX_FLOAT fHeight = crInBox.top - crInBox.bottom;

  CPWL_PathData PathArray[] = {
      CPWL_PathData(CPWL_Point(crInBox.left, crInBox.top), PWLPT_MOVETO),
      CPWL_PathData(CPWL_Point(crInBox.left + fWidth * 0.45f, crInBox.top),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crInBox.left + fWidth * 0.45f,
                               crInBox.top - FX_BEZIER * fHeight * 0.4f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crInBox.left + fWidth * 0.45f - FX_BEZIER * fWidth * 0.45f,
                     crInBox.top - fHeight * 0.4f),
          PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crInBox.left, crInBox.top - fHeight * 0.4f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crInBox.left, crInBox.top), PWLPT_LINETO),

      CPWL_PathData(CPWL_Point(crInBox.left + fWidth * 0.60f, crInBox.top),
                    PWLPT_MOVETO),
      CPWL_PathData(CPWL_Point(crInBox.left + fWidth * 0.75f, crInBox.top),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crInBox.left + fWidth * 0.75f,
                               crInBox.top - FX_BEZIER * fHeight * 0.7f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crInBox.left + fWidth * 0.75f - FX_BEZIER * fWidth * 0.75f,
                     crInBox.top - fHeight * 0.7f),
          PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crInBox.left, crInBox.top - fHeight * 0.7f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crInBox.left, crInBox.top - fHeight * 0.55f),
                    PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crInBox.left + FX_BEZIER * fWidth * 0.60f,
                               crInBox.top - fHeight * 0.55f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crInBox.left + fWidth * 0.60f,
                               crInBox.top - FX_BEZIER * fHeight * 0.55f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crInBox.left + fWidth * 0.60f, crInBox.top),
                    PWLPT_BEZIERTO),

      CPWL_PathData(CPWL_Point(crInBox.left + fWidth * 0.90f, crInBox.top),
                    PWLPT_MOVETO),
      CPWL_PathData(CPWL_Point(crInBox.left + fWidth * 0.90f,
                               crInBox.top - FX_BEZIER * fHeight * 0.85f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(
          CPWL_Point(crInBox.left + fWidth * 0.90f - FX_BEZIER * fWidth * 0.90f,
                     crInBox.top - fHeight * 0.85f),
          PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crInBox.left, crInBox.top - fHeight * 0.85f),
                    PWLPT_BEZIERTO),
      CPWL_PathData(CPWL_Point(crInBox.left, crInBox.bottom), PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crInBox.right, crInBox.bottom), PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crInBox.right, crInBox.top), PWLPT_LINETO),
      CPWL_PathData(CPWL_Point(crInBox.left + fWidth * 0.90f, crInBox.top),
                    PWLPT_LINETO),
  };

  if (type == PWLPT_STREAM)
    sPathData = GetAppStreamFromArray(PathArray, 23);
  else
    GetPathDataFromArray(path, PathArray, 23);
}

void CPWL_Color::ConvertColorType(int32_t nConvertColorType) {
  if (nColorType == nConvertColorType)
    return;

  switch (nColorType) {
    case COLORTYPE_TRANSPARENT:
      break;
    case COLORTYPE_GRAY:
      switch (nConvertColorType) {
        case COLORTYPE_RGB:
          CPWL_Utils::ConvertGRAY2RGB(fColor1, fColor1, fColor2, fColor3);
          break;
        case COLORTYPE_CMYK:
          CPWL_Utils::ConvertGRAY2CMYK(fColor1, fColor1, fColor2, fColor3,
                                       fColor4);
          break;
      }
      break;
    case COLORTYPE_RGB:
      switch (nConvertColorType) {
        case COLORTYPE_GRAY:
          CPWL_Utils::ConvertRGB2GRAY(fColor1, fColor2, fColor3, fColor1);
          break;
        case COLORTYPE_CMYK:
          CPWL_Utils::ConvertRGB2CMYK(fColor1, fColor2, fColor3, fColor1,
                                      fColor2, fColor3, fColor4);
          break;
      }
      break;
    case COLORTYPE_CMYK:
      switch (nConvertColorType) {
        case COLORTYPE_GRAY:
          CPWL_Utils::ConvertCMYK2GRAY(fColor1, fColor2, fColor3, fColor4,
                                       fColor1);
          break;
        case COLORTYPE_RGB:
          CPWL_Utils::ConvertCMYK2RGB(fColor1, fColor2, fColor3, fColor4,
                                      fColor1, fColor2, fColor3);
          break;
      }
      break;
  }
  nColorType = nConvertColorType;
}
