// 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) {
  for (int32_t i = 0; i < nCount; i++) {
    switch (pPathData[i].type) {
      case PWLPT_MOVETO:
        path.AppendPoint(pPathData[i].point.x, pPathData[i].point.y,
                         FXPT_TYPE::MoveTo, false);
        break;
      case PWLPT_LINETO:
        path.AppendPoint(pPathData[i].point.x, pPathData[i].point.y,
                         FXPT_TYPE::LineTo, false);
        break;
      case PWLPT_BEZIERTO:
        path.AppendPoint(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.AppendPoint(pPts[0].x, pPts[0].y, FXPT_TYPE::MoveTo, false);
  for (int32_t i = 1; i < nCount; i++)
    path.AppendPoint(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.AppendPoint(ptMoveTo.x, ptMoveTo.y, FXPT_TYPE::MoveTo, false);
  path.AppendPoint(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.AppendPoint(fLeft + fWidth / 2.0f, fBottom + fWidth / 2.0f,
                         FXPT_TYPE::MoveTo, false);
        path.AppendPoint(fLeft + fWidth / 2.0f, fTop - fWidth / 2.0f,
                         FXPT_TYPE::LineTo, false);
        path.AppendPoint(fRight - fWidth / 2.0f, fTop - fWidth / 2.0f,
                         FXPT_TYPE::LineTo, false);
        path.AppendPoint(fRight - fWidth / 2.0f, fBottom + fWidth / 2.0f,
                         FXPT_TYPE::LineTo, false);
        path.AppendPoint(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.AppendPoint(fLeft + fHalfWidth, fBottom + fHalfWidth,
                           FXPT_TYPE::MoveTo, false);
        pathLT.AppendPoint(fLeft + fHalfWidth, fTop - fHalfWidth,
                           FXPT_TYPE::LineTo, false);
        pathLT.AppendPoint(fRight - fHalfWidth, fTop - fHalfWidth,
                           FXPT_TYPE::LineTo, false);
        pathLT.AppendPoint(fRight - fHalfWidth * 2, fTop - fHalfWidth * 2,
                           FXPT_TYPE::LineTo, false);
        pathLT.AppendPoint(fLeft + fHalfWidth * 2, fTop - fHalfWidth * 2,
                           FXPT_TYPE::LineTo, false);
        pathLT.AppendPoint(fLeft + fHalfWidth * 2, fBottom + fHalfWidth * 2,
                           FXPT_TYPE::LineTo, false);
        pathLT.AppendPoint(fLeft + fHalfWidth, fBottom + fHalfWidth,
                           FXPT_TYPE::LineTo, false);

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

        CFX_PathData pathRB;
        pathRB.AppendPoint(fRight - fHalfWidth, fTop - fHalfWidth,
                           FXPT_TYPE::MoveTo, false);
        pathRB.AppendPoint(fRight - fHalfWidth, fBottom + fHalfWidth,
                           FXPT_TYPE::LineTo, false);
        pathRB.AppendPoint(fLeft + fHalfWidth, fBottom + fHalfWidth,
                           FXPT_TYPE::LineTo, false);
        pathRB.AppendPoint(fLeft + fHalfWidth * 2, fBottom + fHalfWidth * 2,
                           FXPT_TYPE::LineTo, false);
        pathRB.AppendPoint(fRight - fHalfWidth * 2, fBottom + fHalfWidth * 2,
                           FXPT_TYPE::LineTo, false);
        pathRB.AppendPoint(fRight - fHalfWidth * 2, fTop - fHalfWidth * 2,
                           FXPT_TYPE::LineTo, false);
        pathRB.AppendPoint(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.AppendPoint(fLeft, fBottom + fWidth / 2, FXPT_TYPE::MoveTo, false);
        path.AppendPoint(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;
}
