// 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 <memory>

#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_TYPE::MoveTo, false);
        break;
      case PWLPT_LINETO:
        path.SetPoint(i, pPathData[i].point.x, pPathData[i].point.y,
                      FXPT_TYPE::LineTo, false);
        break;
      case PWLPT_BEZIERTO:
        path.SetPoint(i, pPathData[i].point.x, pPathData[i].point.y,
                      FXPT_TYPE::BezierTo, false);
        break;
      default:
        break;
    }
  }
}

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

  rcRet.left = std::min(rect1.left, rect2.left);
  rcRet.bottom = std::min(rect1.bottom, rect2.bottom);
  rcRet.right = std::max(rect1.right, rect2.right);
  rcRet.top = std::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);
}

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;
}

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_PointF CPWL_Utils::OffsetPoint(const CFX_PointF& point,
                                   FX_FLOAT x,
                                   FX_FLOAT y) {
  return CFX_PointF(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;

  CFX_PointF pts[8][3] = {{CFX_PointF(0.28f, 0.52f), CFX_PointF(0.27f, 0.48f),
                           CFX_PointF(0.29f, 0.40f)},
                          {CFX_PointF(0.30f, 0.33f), CFX_PointF(0.31f, 0.29f),
                           CFX_PointF(0.31f, 0.28f)},
                          {CFX_PointF(0.39f, 0.28f), CFX_PointF(0.49f, 0.29f),
                           CFX_PointF(0.77f, 0.67f)},
                          {CFX_PointF(0.76f, 0.68f), CFX_PointF(0.78f, 0.69f),
                           CFX_PointF(0.76f, 0.75f)},
                          {CFX_PointF(0.76f, 0.75f), CFX_PointF(0.73f, 0.80f),
                           CFX_PointF(0.68f, 0.75f)},
                          {CFX_PointF(0.68f, 0.74f), CFX_PointF(0.68f, 0.74f),
                           CFX_PointF(0.44f, 0.47f)},
                          {CFX_PointF(0.43f, 0.47f), CFX_PointF(0.40f, 0.47f),
                           CFX_PointF(0.41f, 0.58f)},
                          {CFX_PointF(0.40f, 0.60f), CFX_PointF(0.28f, 0.66f),
                           CFX_PointF(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_PointF pt1(crBBox.left, crBBox.bottom + fHeight / 2);
  CFX_PointF pt2(crBBox.left + fWidth / 2, crBBox.top);
  CFX_PointF pt3(crBBox.right, crBBox.bottom + fHeight / 2);
  CFX_PointF 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_PointF pt1(crBBox.left, crBBox.bottom + fHeight / 2);
  CFX_PointF pt2(crBBox.left + fWidth / 2, crBBox.top);
  CFX_PointF pt3(crBBox.right, crBBox.bottom + fHeight / 2);
  CFX_PointF 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_PointF ptCenter = CFX_PointF((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_PointF pt1(-fWidth / 2, 0);
  CFX_PointF pt2(0, fHeight / 2);
  CFX_PointF 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_PointF ptCenter = CFX_PointF((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_PointF& ptOffset,
                                            const CPVT_WordRange* pRange,
                                            bool bContinuous,
                                            uint16_t SubWord) {
  return CFX_Edit::GetEditAppearanceStream(pEdit, ptOffset, pRange, bContinuous,
                                           SubWord);
}

CFX_ByteString CPWL_Utils::GetEditSelAppStream(CFX_Edit* pEdit,
                                               const CFX_PointF& 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,
                                            bool bMultiLine,
                                            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_PointF(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_PointF(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 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 = std::max(1 - fColorSub, 0.0f);
      sRet.fColor2 = std::max(1 - fColorSub, 0.0f);
      sRet.fColor3 = std::max(1 - fColorSub, 0.0f);
      break;
    case COLORTYPE_RGB:
    case COLORTYPE_GRAY:
    case COLORTYPE_CMYK:
      sRet.fColor1 = std::max(sColor.fColor1 - fColorSub, 0.0f);
      sRet.fColor2 = std::max(sColor.fColor2 - fColorSub, 0.0f);
      sRet.fColor3 = std::max(sColor.fColor3 - fColorSub, 0.0f);
      sRet.fColor4 = std::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_PointF ptCenter = CFX_PointF((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_PointF* pPts,
                              int32_t nCount,
                              const FX_COLORREF& color) {
  CFX_PathData path;
  path.SetPointCount(nCount);

  path.SetPoint(0, pPts[0].x, pPts[0].y, FXPT_TYPE::MoveTo, false);
  for (int32_t i = 1; i < nCount; i++)
    path.SetPoint(i, pPts[i].x, pPts[i].y, FXPT_TYPE::LineTo, false);

  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_PointF& ptMoveTo,
                                const CFX_PointF& ptLineTo,
                                const FX_COLORREF& color,
                                FX_FLOAT fWidth) {
  CFX_PathData path;
  path.SetPointCount(2);
  path.SetPoint(0, ptMoveTo.x, ptMoveTo.y, FXPT_TYPE::MoveTo, false);
  path.SetPoint(1, ptLineTo.x, ptLineTo.y, FXPT_TYPE::LineTo, false);

  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,
                            bool bVertical,
                            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_PointF(rect.left, fy),
          CFX_PointF(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_PointF(fx, rect.bottom),
          CFX_PointF(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_TYPE::MoveTo, false);
        path.SetPoint(1, fLeft + fWidth / 2.0f, fTop - fWidth / 2.0f,
                      FXPT_TYPE::LineTo, false);
        path.SetPoint(2, fRight - fWidth / 2.0f, fTop - fWidth / 2.0f,
                      FXPT_TYPE::LineTo, false);
        path.SetPoint(3, fRight - fWidth / 2.0f, fBottom + fWidth / 2.0f,
                      FXPT_TYPE::LineTo, false);
        path.SetPoint(4, fLeft + fWidth / 2.0f, fBottom + fWidth / 2.0f,
                      FXPT_TYPE::LineTo, false);

        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_TYPE::MoveTo, false);
        pathLT.SetPoint(1, fLeft + fHalfWidth, fTop - fHalfWidth,
                        FXPT_TYPE::LineTo, false);
        pathLT.SetPoint(2, fRight - fHalfWidth, fTop - fHalfWidth,
                        FXPT_TYPE::LineTo, false);
        pathLT.SetPoint(3, fRight - fHalfWidth * 2, fTop - fHalfWidth * 2,
                        FXPT_TYPE::LineTo, false);
        pathLT.SetPoint(4, fLeft + fHalfWidth * 2, fTop - fHalfWidth * 2,
                        FXPT_TYPE::LineTo, false);
        pathLT.SetPoint(5, fLeft + fHalfWidth * 2, fBottom + fHalfWidth * 2,
                        FXPT_TYPE::LineTo, false);
        pathLT.SetPoint(6, fLeft + fHalfWidth, fBottom + fHalfWidth,
                        FXPT_TYPE::LineTo, false);

        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_TYPE::MoveTo, false);
        pathRB.SetPoint(1, fRight - fHalfWidth, fBottom + fHalfWidth,
                        FXPT_TYPE::LineTo, false);
        pathRB.SetPoint(2, fLeft + fHalfWidth, fBottom + fHalfWidth,
                        FXPT_TYPE::LineTo, false);
        pathRB.SetPoint(3, fLeft + fHalfWidth * 2, fBottom + fHalfWidth * 2,
                        FXPT_TYPE::LineTo, false);
        pathRB.SetPoint(4, fRight - fHalfWidth * 2, fBottom + fHalfWidth * 2,
                        FXPT_TYPE::LineTo, false);
        pathRB.SetPoint(5, fRight - fHalfWidth * 2, fTop - fHalfWidth * 2,
                        FXPT_TYPE::LineTo, false);
        pathRB.SetPoint(6, fRight - fHalfWidth, fTop - fHalfWidth,
                        FXPT_TYPE::LineTo, false);

        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_TYPE::MoveTo, false);
        path.SetPoint(1, fRight, fBottom + fWidth / 2, FXPT_TYPE::LineTo,
                      false);

        CFX_GraphStateData gsd;
        gsd.m_LineWidth = fWidth;

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

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[] = {
      {{crBBox.left + fWidth / 15.0f, crBBox.bottom + fHeight * 2 / 5.0f},
       PWLPT_MOVETO},
      {{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},
      {{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},
      {{crBBox.left + fWidth / 4.5f, crBBox.bottom + fHeight / 16.0f},
       PWLPT_BEZIERTO},
      {{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},
      {{crBBox.left + fWidth / 3.0f +
            FX_BEZIER * (fWidth / 4.0f - fWidth / 3.0f),
        crBBox.bottom},
       PWLPT_BEZIERTO},
      {{crBBox.left + fWidth / 3.0f, crBBox.bottom}, PWLPT_BEZIERTO},
      {{crBBox.left + fWidth / 3.0f +
            FX_BEZIER * fWidth * (1 / 7.0f + 2 / 15.0f),
        crBBox.bottom + FX_BEZIER * fHeight * 4 / 5.0f},
       PWLPT_BEZIERTO},
      {{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},
      {{crBBox.left + fWidth * 14 / 15.0f,
        crBBox.bottom + fHeight * 15 / 16.0f},
       PWLPT_BEZIERTO},
      {{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},
      {{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},
      {{crBBox.left + fWidth / 3.6f, crBBox.bottom + fHeight / 3.5f},
       PWLPT_BEZIERTO},
      {{crBBox.left + fWidth / 3.6f,
        crBBox.bottom + fHeight / 3.5f +
            FX_BEZIER * (fHeight / 4.0f - fHeight / 3.5f)},
       PWLPT_BEZIERTO},
      {{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},
      {{crBBox.left + fWidth / 15.0f, crBBox.bottom + fHeight * 2 / 5.0f},
       PWLPT_BEZIERTO}};

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

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[] = {
      {{crBBox.left + fWidth / 15.0f, crBBox.bottom + fHeight / 2.0f},
       PWLPT_MOVETO},
      {{crBBox.left + fWidth / 15.0f,
        crBBox.bottom + fHeight / 2.0f +
            FX_BEZIER * (fHeight * 14 / 15.0f - fHeight / 2.0f)},
       PWLPT_BEZIERTO},
      {{crBBox.left + fWidth / 2.0f -
            FX_BEZIER * (fWidth / 2.0f - fWidth / 15.0f),
        crBBox.top - fHeight / 15.0f},
       PWLPT_BEZIERTO},
      {{crBBox.left + fWidth / 2.0f, crBBox.top - fHeight / 15.0f},
       PWLPT_BEZIERTO},
      {{crBBox.left + fWidth / 2.0f +
            FX_BEZIER * (fWidth * 14 / 15.0f - fWidth / 2.0f),
        crBBox.top - fHeight / 15.0f},
       PWLPT_BEZIERTO},
      {{crBBox.right - fWidth / 15.0f,
        crBBox.bottom + fHeight / 2.0f +
            FX_BEZIER * (fHeight * 14 / 15.0f - fHeight / 2.0f)},
       PWLPT_BEZIERTO},
      {{crBBox.right - fWidth / 15.0f, crBBox.bottom + fHeight / 2.0f},
       PWLPT_BEZIERTO},
      {{crBBox.right - fWidth / 15.0f,
        crBBox.bottom + fHeight / 2.0f -
            FX_BEZIER * (fHeight / 2.0f - fHeight / 15.0f)},
       PWLPT_BEZIERTO},
      {{crBBox.left + fWidth / 2.0f +
            FX_BEZIER * (fWidth * 14 / 15.0f - fWidth / 2.0f),
        crBBox.bottom + fHeight / 15.0f},
       PWLPT_BEZIERTO},
      {{crBBox.left + fWidth / 2.0f, crBBox.bottom + fHeight / 15.0f},
       PWLPT_BEZIERTO},
      {{crBBox.left + fWidth / 2.0f -
            FX_BEZIER * (fWidth / 2.0f - fWidth / 15.0f),
        crBBox.bottom + fHeight / 15.0f},
       PWLPT_BEZIERTO},
      {{crBBox.left + fWidth / 15.0f,
        crBBox.bottom + fHeight / 2.0f -
            FX_BEZIER * (fHeight / 2.0f - fHeight / 15.0f)},
       PWLPT_BEZIERTO},
      {{crBBox.left + fWidth / 15.0f, crBBox.bottom + fHeight / 2.0f},
       PWLPT_BEZIERTO},
      {{crBBox.left + fWidth * 3 / 15.0f, crBBox.bottom + fHeight / 2.0f},
       PWLPT_MOVETO},
      {{crBBox.left + fWidth * 3 / 15.0f,
        crBBox.bottom + fHeight / 2.0f +
            FX_BEZIER * (fHeight * 4 / 5.0f - fHeight / 2.0f)},
       PWLPT_BEZIERTO},
      {{crBBox.left + fWidth / 2.0f -
            FX_BEZIER * (fWidth / 2.0f - fWidth * 3 / 15.0f),
        crBBox.top - fHeight * 3 / 15.0f},
       PWLPT_BEZIERTO},
      {{crBBox.left + fWidth / 2.0f, crBBox.top - fHeight * 3 / 15.0f},
       PWLPT_BEZIERTO},
      {{crBBox.left + fWidth / 2.0f +
            FX_BEZIER * (fWidth * 4 / 5.0f - fWidth / 2.0f),
        crBBox.top - fHeight * 3 / 15.0f},
       PWLPT_BEZIERTO},
      {{crBBox.right - fWidth * 3 / 15.0f,
        crBBox.bottom + fHeight / 2.0f +
            FX_BEZIER * (fHeight * 4 / 5.0f - fHeight / 2.0f)},
       PWLPT_BEZIERTO},
      {{crBBox.right - fWidth * 3 / 15.0f, crBBox.bottom + fHeight / 2.0f},
       PWLPT_BEZIERTO},
      {{crBBox.right - fWidth * 3 / 15.0f,
        crBBox.bottom + fHeight / 2.0f -
            FX_BEZIER * (fHeight * 4 / 5.0f - fHeight / 2.0f)},
       PWLPT_BEZIERTO},
      {{crBBox.left + fWidth / 2.0f +
            FX_BEZIER * (fWidth * 4 / 5.0f - fWidth / 2.0f),
        crBBox.bottom + fHeight * 3 / 15.0f},
       PWLPT_BEZIERTO},
      {{crBBox.left + fWidth / 2.0f, crBBox.bottom + fHeight * 3 / 15.0f},
       PWLPT_BEZIERTO},
      {{crBBox.left + fWidth / 2.0f -
            FX_BEZIER * (fWidth * 4 / 5.0f - fWidth / 2.0f),
        crBBox.bottom + fHeight * 3 / 15.0f},
       PWLPT_BEZIERTO},
      {{crBBox.left + fWidth * 3 / 15.0f,
        crBBox.bottom + fHeight / 2.0f -
            FX_BEZIER * (fHeight * 4 / 5.0f - fHeight / 2.0f)},
       PWLPT_BEZIERTO},
      {{crBBox.left + fWidth * 3 / 15.0f, crBBox.bottom + fHeight / 2.0f},
       PWLPT_BEZIERTO}};

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

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

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

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;
  CFX_PointF center_point(crBBox.left + fWidth / 2,
                          crBBox.bottom + fHeight / 2);

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

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

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

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

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[] = {
      {{crBBox.left + fWidth / 10, crBBox.bottom + fHeight / 10}, PWLPT_MOVETO},
      {{crBBox.left + fWidth / 2, crBBox.top - fHeight * 2 / 15}, PWLPT_LINETO},
      {{crBBox.right - fWidth / 10, crBBox.bottom + fHeight / 10},
       PWLPT_LINETO},
      {{crBBox.left + fWidth / 10, crBBox.bottom + fHeight / 10},
       PWLPT_LINETO}};

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

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;
  CFX_PointF tail;
  CFX_PointF 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[] = {
      {{tail.x + fWidth / 30.0f, -fWidth / 30.0f / k + tail.y}, PWLPT_MOVETO},
      {{tail.x + fWidth / 30.0f - fWidth * 0.18f,
        -k * fWidth * 0.18f - fWidth / 30 / k + tail.y},
       PWLPT_LINETO},
      {{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},
      {{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},
      {{tail.x + fWidth / 30 - fWidth * 0.18f - fWidth / 20,
        -k * fWidth / 20 - k * fWidth * 0.18f - fWidth / 30 / k + tail.y},
       PWLPT_LINETO},
      {{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},
      {{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},
      {{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},
      {{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},
      {{tail.x + fWidth / 30 - fWidth * 0.45f,
        -k * fWidth * 0.45f - fWidth / 30 / k + tail.y},
       PWLPT_LINETO},
      {{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},
      {{CicleCenter.x + fWidth * 0.2f, -fWidth * 0.1f / k + CicleCenter.y},
       PWLPT_BEZIERTO},
      {{CicleCenter.x, CicleCenter.y}, PWLPT_BEZIERTO},
      {{CicleCenter.x - fWidth / 60.0f, -k * fWidth / 60 + CicleCenter.y},
       PWLPT_BEZIERTO},
      {{CicleCenter.x - fWidth / 60, -k * fWidth / 60 + CicleCenter.y},
       PWLPT_BEZIERTO},
      {{CicleCenter.x, CicleCenter.y}, PWLPT_BEZIERTO},
      {{CicleCenter.x - fWidth * 0.22f,
        fWidth * 0.35f / k + CicleCenter.y - fHeight * 0.05f},
       PWLPT_BEZIERTO},
      {{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},
      {{tail.x - fWidth / 30.0f - fWidth * 0.45f,
        -k * fWidth * 0.45f + fWidth / 30.0f / k + tail.y},
       PWLPT_BEZIERTO},
      {{tail.x - fWidth / 30.0f, fWidth / 30.0f / k + tail.y}, PWLPT_LINETO},
      {{tail.x + fWidth / 30, -fWidth / 30 / k + tail.y}, PWLPT_LINETO},
      {{CicleCenter.x + fWidth * 0.08f, k * fWidth * 0.08f + CicleCenter.y},
       PWLPT_MOVETO},
      {{CicleCenter.x + fWidth * 0.08f + fWidth * 0.1f,
        -fWidth * 0.1f / k + k * fWidth * 0.08f + CicleCenter.y},
       PWLPT_BEZIERTO},
      {{CicleCenter.x + fWidth * 0.22f + fWidth * 0.1f,
        k * fWidth * 0.22f + CicleCenter.y - fWidth * 0.1f / k},
       PWLPT_BEZIERTO},
      {{CicleCenter.x + fWidth * 0.22f, k * fWidth * 0.22f + CicleCenter.y},
       PWLPT_BEZIERTO},
      {{CicleCenter.x + fWidth * 0.22f - fWidth * 0.1f,
        fWidth * 0.1f / k + k * fWidth * 0.22f + CicleCenter.y},
       PWLPT_BEZIERTO},
      {{CicleCenter.x + fWidth * 0.08f - fWidth * 0.1f,
        fWidth * 0.1f / k + k * fWidth * 0.08f + CicleCenter.y},
       PWLPT_BEZIERTO},
      {{CicleCenter.x + fWidth * 0.08f, k * fWidth * 0.08f + CicleCenter.y},
       PWLPT_BEZIERTO}};

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

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[] = {
      {{crBBox.left + fWidth / 2.0f, crBBox.top - fHeight / 20.0f},
       PWLPT_MOVETO},
      {{crBBox.left + fWidth / 10.0f, crBBox.top - fHeight / 2.0f},
       PWLPT_LINETO},
      {{crBBox.right - fWidth / 10.0f, crBBox.top - fHeight / 2.0f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth / 2.0f, crBBox.top - fHeight / 20.0f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth * 0.12f, crBBox.top - fHeight * 17 / 30.0f},
       PWLPT_MOVETO},
      {{crBBox.left + fWidth * 0.12f, crBBox.bottom + fHeight / 10.0f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth * 0.22f, crBBox.bottom + fHeight / 10.0f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth * 0.22f,
        crBBox.top - fHeight * 17 / 30.0f - fWidth * 0.14f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth * 0.38f, crBBox.bottom + fHeight / 10.0f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth * 0.48f, crBBox.bottom + fHeight / 10.0f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth * 0.48f, crBBox.top - fHeight * 17 / 30.0f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth * 0.38f, crBBox.top - fHeight * 17 / 30.0f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth * 0.38f, crBBox.bottom + fWidth * 0.24f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth * 0.22f, crBBox.top - fHeight * 17 / 30.0f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth * 0.12f, crBBox.top - fHeight * 17 / 30.0f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth * 0.6f, crBBox.bottom + fHeight / 10.0f},
       PWLPT_MOVETO},
      {{crBBox.left + fWidth * 0.7f, crBBox.bottom + fHeight / 10.0f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth * 0.7f,
        crBBox.bottom + fHeight / 10.0f + fHeight / 7.0f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth * 0.97f,
        crBBox.bottom + fHeight / 10.0f + fHeight / 7.0f},
       PWLPT_BEZIERTO},
      {{crBBox.left + fWidth * 0.97f, crBBox.top - fHeight * 17 / 30.0f},
       PWLPT_BEZIERTO},
      {{crBBox.left + fWidth * 0.7f, crBBox.top - fHeight * 17 / 30.0f},
       PWLPT_BEZIERTO},
      {{crBBox.left + fWidth * 0.6f, crBBox.top - fHeight * 17 / 30.0f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth * 0.6f, crBBox.bottom + fHeight / 10.0f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth * 0.7f,
        crBBox.bottom + fHeight / 7 + fHeight * 0.18f},
       PWLPT_MOVETO},
      {{crBBox.left + fWidth * 0.85f,
        crBBox.bottom + fHeight / 7 + fHeight * 0.18f},
       PWLPT_BEZIERTO},
      {{crBBox.left + fWidth * 0.85f,
        crBBox.top - fHeight * 17 / 30.0f - fHeight * 0.08f},
       PWLPT_BEZIERTO},
      {{crBBox.left + fWidth * 0.7f,
        crBBox.top - fHeight * 17 / 30.0f - fHeight * 0.08f},
       PWLPT_BEZIERTO},
      {{crBBox.left + fWidth * 0.7f,
        crBBox.bottom + fHeight / 7 + fHeight * 0.18f},
       PWLPT_LINETO}};

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

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[] = {
      {{crBBox.right - fWidth * 3 / 10.0f, crBBox.bottom + fHeight / 15.0f},
       PWLPT_MOVETO},
      {{crBBox.left + fWidth * 7 / 10.0f, crBBox.bottom + fHeight * 4 / 15.0f},
       PWLPT_LINETO},
      {{crBBox.right - fWidth / 10.0f, crBBox.bottom + fHeight * 4 / 15.0f},
       PWLPT_LINETO},
      {{crBBox.right - fWidth / 10.0f, crBBox.top - fHeight / 15.0f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth / 10.0f, crBBox.top - fHeight / 15.0f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth / 10.0f, crBBox.bottom + fHeight / 15.0f},
       PWLPT_LINETO},
      {{crBBox.right - fWidth * 3 / 10.0f, crBBox.bottom + fHeight / 15.0f},
       PWLPT_LINETO},
      {{crBBox.right - fWidth / 10.0f, crBBox.bottom + fHeight * 4 / 15.0f},
       PWLPT_LINETO},
      {{crBBox.right - fWidth * 3 / 10.0f, crBBox.bottom + fHeight / 15.0f},
       PWLPT_LINETO},
      {{crBBox.right - fWidth * 3 / 10.0f, crBBox.bottom + fHeight * 4 / 15.0f},
       PWLPT_LINETO},
      {{crBBox.right - fWidth / 10.0f, crBBox.bottom + fHeight * 4 / 15.0f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth / 5.0f, crBBox.top - fHeight * 4 / 15.0f},
       PWLPT_MOVETO},
      {{crBBox.right - fWidth / 5.0f, crBBox.top - fHeight * 4 / 15.0f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth / 5.0f, crBBox.top - fHeight * 7 / 15.0f},
       PWLPT_MOVETO},
      {{crBBox.right - fWidth / 5.0f, crBBox.top - fHeight * 7 / 15.0f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth / 5.0f, crBBox.top - fHeight * 10 / 15.0f},
       PWLPT_MOVETO},
      {{crBBox.right - fWidth * 3 / 10.0f, crBBox.top - fHeight * 10 / 15.0f},
       PWLPT_LINETO}};

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

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[] = {
      {{crBBox.left + fWidth / 2.0f, crBBox.top - fHeight / 15.0f},
       PWLPT_MOVETO},
      {{crBBox.left + fWidth * 0.7f, crBBox.top - fHeight / 15.0f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth * 0.7f, crBBox.bottom + fHeight / 15.0f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth * 0.634f, crBBox.bottom + fHeight / 15.0f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth * 0.634f, crBBox.top - fHeight * 2 / 15.0f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth * 0.566f, crBBox.top - fHeight * 2 / 15.0f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth * 0.566f, crBBox.bottom + fHeight / 15.0f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth / 2.0f, crBBox.bottom + fHeight / 15.0f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth / 2.0f,
        crBBox.top - fHeight / 15.0f - fHeight * 0.4f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth * 0.2f,
        crBBox.top - fHeight / 15.0f - fHeight * 0.4f},
       PWLPT_BEZIERTO},
      {{crBBox.left + fWidth * 0.2f, crBBox.top - fHeight / 15.0f},
       PWLPT_BEZIERTO},
      {{crBBox.left + fWidth / 2.0f, crBBox.top - fHeight / 15.0f},
       PWLPT_BEZIERTO}};

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

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[] = {
      {{crBBox.right - fWidth / 15.0f, crBBox.top - fHeight / 2.0f},
       PWLPT_MOVETO},
      {{crBBox.left + fWidth / 2.0f + fWidth / 8.0f,
        crBBox.bottom + fHeight / 5.0f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth / 2.0f, crBBox.bottom + fHeight / 5.0f},
       PWLPT_LINETO},
      {{crBBox.right - fWidth / 15.0f - fWidth * 0.15f,
        crBBox.top - fHeight / 2.0f - fWidth / 25.0f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth * 0.1f,
        crBBox.top - fHeight / 2.0f - fWidth / 25.0f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth * 0.1f,
        crBBox.top - fHeight / 2.0f + fWidth / 25.0f},
       PWLPT_LINETO},
      {{crBBox.right - fWidth / 15.0f - fWidth * 0.15f,
        crBBox.top - fHeight / 2.0f + fWidth / 25.0f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth / 2.0f, crBBox.top - fHeight / 5.0f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth / 2.0f + fWidth / 8.0f,
        crBBox.top - fHeight / 5.0f},
       PWLPT_LINETO},
      {{crBBox.right - fWidth / 15.0f, crBBox.top - fHeight / 2.0f},
       PWLPT_LINETO}};

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

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[] = {
      {{crBBox.right - fWidth / 30.0f, crBBox.top - fHeight / 2.0f},
       PWLPT_MOVETO},
      {{crBBox.left + fWidth / 30.0f, crBBox.bottom + fHeight / 6.0f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth * 4 / 15.0f, crBBox.top - fHeight / 2.0f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth / 30.0f, crBBox.top - fHeight / 6.0f},
       PWLPT_LINETO},
      {{crBBox.right - fWidth / 30.0f, crBBox.top - fHeight / 2.0f},
       PWLPT_LINETO}};

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

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_PointF ptCenter = CFX_PointF((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] = {{px1[0], py1[0]}, PWLPT_MOVETO};
  PathArray[1] = {{px2[0], py2[0]}, PWLPT_LINETO};

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

  PathArray[10] = {{px1[0], py1[0]}, PWLPT_LINETO};

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

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[] = {
      {{crBBox.left + fWidth / 2.0f, crBBox.top - fHeight / 15.0f},
       PWLPT_MOVETO},
      {{crBBox.right - fWidth / 10.0f, crBBox.top - fWidth * 3 / 5.0f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth * 0.6f, crBBox.top - fWidth * 3 / 5.0f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth * 0.6f, crBBox.bottom + fHeight / 15.0f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth * 0.4f, crBBox.bottom + fHeight / 15.0f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth * 0.4f, crBBox.top - fWidth * 3 / 5.0f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth / 10, crBBox.top - fWidth * 3 / 5.0f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth / 2.0f, crBBox.top - fHeight / 15.0f},
       PWLPT_LINETO}};

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

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;
  CFX_PointF leftup(crBBox.left, crBBox.top);
  CFX_PointF rightdown(crBBox.right, crBBox.bottom);
  FX_FLOAT k = -fHeight / fWidth;
  CFX_PointF tail;
  tail.x = crBBox.left + fWidth * 4 / 5.0f;
  tail.y = k * (tail.x - crBBox.right) + rightdown.y;

  CPWL_PathData PathArray[] = {
      {{crBBox.left + fWidth / 20.0f,
        k * (crBBox.left + fWidth / 20.0f - rightdown.x) + rightdown.y},
       PWLPT_MOVETO},
      {{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},
      {{fHeight * 17 / 60.0f / k + tail.x + fWidth / 10.0f,
        tail.y - fWidth / 10.0f / k + fHeight * 17 / 60.0f},
       PWLPT_LINETO},
      {{tail.x + fWidth / 10.0f, tail.y - fWidth / 10.0f / k}, PWLPT_LINETO},
      {{tail.x - fWidth / 10.0f, tail.y + fWidth / 10.0f / k}, PWLPT_LINETO},
      {{fHeight * 17 / 60.0f / k + tail.x - fWidth / 10.0f,
        tail.y + fWidth / 10.0f / k + fHeight * 17 / 60.0f},
       PWLPT_LINETO},
      {{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},
      {{crBBox.left + fWidth / 20.0f,
        k * (crBBox.left + fWidth / 20.0f - rightdown.x) + rightdown.y},
       PWLPT_LINETO}};

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

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[] = {
      {{crBBox.left + fWidth * 0.05f, crBBox.top - fWidth * 0.15f},
       PWLPT_MOVETO},
      {{crBBox.left + fWidth * 0.25f, crBBox.top - fHeight * 0.15f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth * 0.275f, crBBox.bottom + fHeight * 0.08f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth * 0.05f, crBBox.bottom + fHeight * 0.08f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth * 0.05f, crBBox.top - fWidth * 0.15f},
       PWLPT_LINETO},

      {{crBBox.left + fWidth * 0.275f, crBBox.top - fWidth * 0.45f},
       PWLPT_MOVETO},
      {{crBBox.left + fWidth * 0.475f, crBBox.top - fWidth * 0.45f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth * 0.475f, crBBox.bottom + fHeight * 0.08f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth * 0.275f, crBBox.bottom + fHeight * 0.08f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth * 0.275f, crBBox.top - fWidth * 0.45f},
       PWLPT_LINETO},

      {{crBBox.left + fWidth * 0.5f, crBBox.top - fHeight * 0.05f},
       PWLPT_MOVETO},
      {{crBBox.left + fWidth * 0.7f, crBBox.top - fHeight * 0.05f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth * 0.7f, crBBox.bottom + fHeight * 0.08f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth * 0.5f, crBBox.bottom + fHeight * 0.08f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth * 0.5f, crBBox.top - fHeight * 0.05f},
       PWLPT_LINETO},

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

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

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[] = {
      {{crBBox.left + fWidth / 60, crBBox.top - fHeight * 0.25f}, PWLPT_MOVETO},
      {{crBBox.left + fWidth / 60, crBBox.bottom + fHeight * 0.25f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth / 60,
        crBBox.bottom + fHeight * 0.25f - fWidth * 57 / 60.0f * 0.35f},
       PWLPT_BEZIERTO},
      {{crBBox.right - fWidth / 30,
        crBBox.bottom + fHeight * 0.25f - fWidth * 57 / 60.0f * 0.35f},
       PWLPT_BEZIERTO},
      {{crBBox.right - fWidth / 30, crBBox.bottom + fHeight * 0.25f},
       PWLPT_BEZIERTO},

      {{crBBox.right - fWidth / 30, crBBox.top - fHeight * 0.33f},
       PWLPT_LINETO},
      {{crBBox.right - fWidth / 30,
        crBBox.top - fHeight * 0.33f + fHeight / 15 * 0.5f},
       PWLPT_BEZIERTO},
      {{crBBox.right - fWidth / 30 - fWidth * 0.12f,
        crBBox.top - fHeight * 0.33f + fHeight / 15 * 0.5f},
       PWLPT_BEZIERTO},
      {{crBBox.right - fWidth / 30 - fWidth * 0.12f,
        crBBox.top - fHeight * 0.33f},
       PWLPT_BEZIERTO},

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

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

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

      {{crBBox.left + fWidth * 0.29f, crBBox.top - fHeight * 0.33f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth * 0.29f,
        crBBox.top - fHeight * 0.33f + fWidth * 0.12f * 0.35f},
       PWLPT_BEZIERTO},
      {{crBBox.left + fWidth * 0.17f,
        crBBox.top - fHeight * 0.33f + fWidth * 0.12f * 0.35f},
       PWLPT_BEZIERTO},
      {{crBBox.left + fWidth * 0.17f, crBBox.top - fHeight * 0.33f},
       PWLPT_BEZIERTO},

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

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

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

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[] = {
      {{crBBox.left + fWidth * 0.25f, crBBox.top - fHeight * 0.1f},
       PWLPT_MOVETO},
      {{crBBox.left + fWidth * 0.4f, crBBox.top - fHeight * 0.23f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth * 0.4f, crBBox.top - fHeight * 0.5f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth * 0.4f,
        crBBox.top - fHeight * 0.5f + fWidth * 0.04f},
       PWLPT_BEZIERTO},
      {{crBBox.left + fWidth * 0.6f,
        crBBox.top - fHeight * 0.5f + fWidth * 0.04f},
       PWLPT_BEZIERTO},
      {{crBBox.left + fWidth * 0.6f, crBBox.top - fHeight * 0.5f},
       PWLPT_BEZIERTO},

      {{crBBox.left + fWidth * 0.6f, crBBox.top - fHeight * 0.23f},
       PWLPT_LINETO},
      {{crBBox.right - fWidth * 0.25f, crBBox.top - fHeight * 0.1f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth * 0.25f, crBBox.top - fHeight * 0.1f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth * 0.4f, crBBox.top - fHeight * 0.23f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth * 0.6f, crBBox.top - fHeight * 0.23f},
       PWLPT_LINETO},

      {{crBBox.left + fWidth * 0.4f, crBBox.top - fHeight * 0.5f},
       PWLPT_MOVETO},
      {{crBBox.left + fWidth * 0.4f - fWidth * 0.25f * 0.4f,
        crBBox.top - fHeight * 0.5f},
       PWLPT_BEZIERTO},
      {{crBBox.left + fWidth * 0.15f,
        crBBox.top - fHeight * 0.65f + fHeight * 0.15f * 0.4f},
       PWLPT_BEZIERTO},
      {{crBBox.left + fWidth * 0.15f, crBBox.top - fHeight * 0.65f},
       PWLPT_BEZIERTO},

      {{crBBox.right - fWidth * 0.15f, crBBox.top - fHeight * 0.65f},
       PWLPT_LINETO},
      {{crBBox.right - fWidth * 0.15f,
        crBBox.top - fHeight * 0.65f + fHeight * 0.15f * 0.4f},
       PWLPT_BEZIERTO},
      {{crBBox.left + fWidth * 0.6f + fWidth * 0.25f * 0.4f,
        crBBox.top - fHeight * 0.5f},
       PWLPT_BEZIERTO},
      {{crBBox.left + fWidth * 0.6f, crBBox.top - fHeight * 0.5f},
       PWLPT_BEZIERTO},

      {{crBBox.left + fWidth * 0.6f,
        crBBox.top - fHeight * 0.5f + fWidth * 0.04f},
       PWLPT_BEZIERTO},
      {{crBBox.left + fWidth * 0.4f,
        crBBox.top - fHeight * 0.5f + fWidth * 0.04f},
       PWLPT_BEZIERTO},
      {{crBBox.left + fWidth * 0.4f, crBBox.top - fHeight * 0.5f},
       PWLPT_BEZIERTO},

      {{crBBox.left + fWidth * 0.5f, crBBox.top - fHeight * 0.65f},
       PWLPT_MOVETO},
      {{crBBox.left + fWidth * 0.5f, crBBox.bottom + fHeight * 0.1f},
       PWLPT_LINETO}};

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

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[] = {
      {{crBBox.left + fWidth * 0.4f, crBBox.top - fHeight * 0.1f},
       PWLPT_MOVETO},
      {{crBBox.left + fWidth * 0.1f, crBBox.top - fHeight * 0.5f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth * 0.3f, crBBox.bottom + fHeight * 0.1f},
       PWLPT_LINETO},
      {{crBBox.right - fWidth * 0.1f, crBBox.bottom + fHeight * 0.1f},
       PWLPT_LINETO},
      {{crBBox.right - fWidth * 0.1f, crBBox.top - fHeight * 0.1f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth * 0.4f, crBBox.top - fHeight * 0.1f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth * 0.4f, crBBox.top - fHeight * 0.3f},
       PWLPT_MOVETO},
      {{crBBox.right - fWidth * 0.2f, crBBox.top - fHeight * 0.3f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth * 0.4f, crBBox.top - fHeight * 0.5f},
       PWLPT_MOVETO},
      {{crBBox.right - fWidth * 0.2f, crBBox.top - fHeight * 0.5f},
       PWLPT_LINETO},
      {{crBBox.left + fWidth * 0.4f, crBBox.top - fHeight * 0.7f},
       PWLPT_MOVETO},
      {{crBBox.right - fWidth * 0.2f, crBBox.top - fHeight * 0.7f},
       PWLPT_LINETO}};

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

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[] = {
      {{crInBox.left, crInBox.top}, PWLPT_MOVETO},
      {{crInBox.left + fWidth * 0.45f, crInBox.top}, PWLPT_LINETO},
      {{crInBox.left + fWidth * 0.45f,
        crInBox.top - FX_BEZIER * fHeight * 0.4f},
       PWLPT_BEZIERTO},
      {{crInBox.left + fWidth * 0.45f - FX_BEZIER * fWidth * 0.45f,
        crInBox.top - fHeight * 0.4f},
       PWLPT_BEZIERTO},
      {{crInBox.left, crInBox.top - fHeight * 0.4f}, PWLPT_BEZIERTO},
      {{crInBox.left, crInBox.top}, PWLPT_LINETO},

      {{crInBox.left + fWidth * 0.60f, crInBox.top}, PWLPT_MOVETO},
      {{crInBox.left + fWidth * 0.75f, crInBox.top}, PWLPT_LINETO},
      {{crInBox.left + fWidth * 0.75f,
        crInBox.top - FX_BEZIER * fHeight * 0.7f},
       PWLPT_BEZIERTO},
      {{crInBox.left + fWidth * 0.75f - FX_BEZIER * fWidth * 0.75f,
        crInBox.top - fHeight * 0.7f},
       PWLPT_BEZIERTO},
      {{crInBox.left, crInBox.top - fHeight * 0.7f}, PWLPT_BEZIERTO},
      {{crInBox.left, crInBox.top - fHeight * 0.55f}, PWLPT_LINETO},
      {{crInBox.left + FX_BEZIER * fWidth * 0.60f,
        crInBox.top - fHeight * 0.55f},
       PWLPT_BEZIERTO},
      {{crInBox.left + fWidth * 0.60f,
        crInBox.top - FX_BEZIER * fHeight * 0.55f},
       PWLPT_BEZIERTO},
      {{crInBox.left + fWidth * 0.60f, crInBox.top}, PWLPT_BEZIERTO},

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

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

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;
}
