Home | History | Annotate | Download | only in pdfwindow
      1 // Copyright 2014 PDFium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
      6 
      7 #include "fpdfsdk/include/pdfwindow/PWL_Utils.h"
      8 
      9 #include <algorithm>
     10 
     11 #include "fpdfsdk/include/pdfwindow/PWL_Icon.h"
     12 #include "fpdfsdk/include/pdfwindow/PWL_Wnd.h"
     13 
     14 #define IsFloatZero(f) ((f) < 0.0001 && (f) > -0.0001)
     15 #define IsFloatBigger(fa, fb) ((fa) > (fb) && !IsFloatZero((fa) - (fb)))
     16 #define IsFloatSmaller(fa, fb) ((fa) < (fb) && !IsFloatZero((fa) - (fb)))
     17 #define IsFloatEqual(fa, fb) IsFloatZero((fa) - (fb))
     18 
     19 CFX_ByteString CPWL_Utils::GetAppStreamFromArray(const CPWL_PathData* pPathData,
     20                                                  int32_t nCount) {
     21   CFX_ByteTextBuf csAP;
     22 
     23   for (int32_t i = 0; i < nCount; i++) {
     24     switch (pPathData[i].type) {
     25       case PWLPT_MOVETO:
     26         csAP << pPathData[i].point.x << " " << pPathData[i].point.y << " m\n";
     27         break;
     28       case PWLPT_LINETO:
     29         csAP << pPathData[i].point.x << " " << pPathData[i].point.y << " l\n";
     30         break;
     31       case PWLPT_BEZIERTO:
     32         csAP << pPathData[i].point.x << " " << pPathData[i].point.y << " "
     33              << pPathData[i + 1].point.x << " " << pPathData[i + 1].point.y
     34              << " " << pPathData[i + 2].point.x << " "
     35              << pPathData[i + 2].point.y << " c\n";
     36 
     37         i += 2;
     38         break;
     39       default:
     40         break;
     41     }
     42   }
     43 
     44   return csAP.GetByteString();
     45 }
     46 
     47 void CPWL_Utils::GetPathDataFromArray(CFX_PathData& path,
     48                                       const CPWL_PathData* pPathData,
     49                                       int32_t nCount) {
     50   path.SetPointCount(nCount);
     51 
     52   for (int32_t i = 0; i < nCount; i++) {
     53     switch (pPathData[i].type) {
     54       case PWLPT_MOVETO:
     55         path.SetPoint(i, pPathData[i].point.x, pPathData[i].point.y,
     56                       FXPT_MOVETO);
     57         break;
     58       case PWLPT_LINETO:
     59         path.SetPoint(i, pPathData[i].point.x, pPathData[i].point.y,
     60                       FXPT_LINETO);
     61         break;
     62       case PWLPT_BEZIERTO:
     63         path.SetPoint(i, pPathData[i].point.x, pPathData[i].point.y,
     64                       FXPT_BEZIERTO);
     65         break;
     66       default:
     67         break;
     68     }
     69   }
     70 }
     71 
     72 CPDF_Rect CPWL_Utils::MaxRect(const CPDF_Rect& rect1, const CPDF_Rect& rect2) {
     73   CPDF_Rect rcRet;
     74 
     75   rcRet.left = PWL_MIN(rect1.left, rect2.left);
     76   rcRet.bottom = PWL_MIN(rect1.bottom, rect2.bottom);
     77   rcRet.right = PWL_MAX(rect1.right, rect2.right);
     78   rcRet.top = PWL_MAX(rect1.top, rect2.top);
     79 
     80   return rcRet;
     81 }
     82 
     83 CPDF_Rect CPWL_Utils::OffsetRect(const CPDF_Rect& rect,
     84                                  FX_FLOAT x,
     85                                  FX_FLOAT y) {
     86   return CPDF_Rect(rect.left + x, rect.bottom + y, rect.right + x,
     87                    rect.top + y);
     88 }
     89 
     90 FX_BOOL CPWL_Utils::ContainsRect(const CPDF_Rect& rcParent,
     91                                  const CPDF_Rect& rcChild) {
     92   return rcChild.left >= rcParent.left && rcChild.bottom >= rcParent.bottom &&
     93          rcChild.right <= rcParent.right && rcChild.top <= rcParent.top;
     94 }
     95 
     96 FX_BOOL CPWL_Utils::IntersectRect(const CPDF_Rect& rect1,
     97                                   const CPDF_Rect& rect2) {
     98   FX_FLOAT left = rect1.left > rect2.left ? rect1.left : rect2.left;
     99   FX_FLOAT right = rect1.right < rect2.right ? rect1.right : rect2.right;
    100   FX_FLOAT bottom = rect1.bottom > rect2.bottom ? rect1.bottom : rect2.bottom;
    101   FX_FLOAT top = rect1.top < rect2.top ? rect1.top : rect2.top;
    102 
    103   return left < right && bottom < top;
    104 }
    105 
    106 CPDF_Point CPWL_Utils::OffsetPoint(const CPDF_Point& point,
    107                                    FX_FLOAT x,
    108                                    FX_FLOAT y) {
    109   return CPDF_Point(point.x + x, point.y + y);
    110 }
    111 
    112 CPVT_WordRange CPWL_Utils::OverlapWordRange(const CPVT_WordRange& wr1,
    113                                             const CPVT_WordRange& wr2) {
    114   CPVT_WordRange wrRet;
    115 
    116   if (wr2.EndPos.WordCmp(wr1.BeginPos) < 0 ||
    117       wr2.BeginPos.WordCmp(wr1.EndPos) > 0)
    118     return wrRet;
    119   if (wr1.EndPos.WordCmp(wr2.BeginPos) < 0 ||
    120       wr1.BeginPos.WordCmp(wr2.EndPos) > 0)
    121     return wrRet;
    122 
    123   if (wr1.BeginPos.WordCmp(wr2.BeginPos) < 0) {
    124     wrRet.BeginPos = wr2.BeginPos;
    125   } else {
    126     wrRet.BeginPos = wr1.BeginPos;
    127   }
    128 
    129   if (wr1.EndPos.WordCmp(wr2.EndPos) < 0) {
    130     wrRet.EndPos = wr1.EndPos;
    131   } else {
    132     wrRet.EndPos = wr2.EndPos;
    133   }
    134 
    135   return wrRet;
    136 }
    137 
    138 CFX_ByteString CPWL_Utils::GetAP_Check(const CPDF_Rect& crBBox) {
    139   const FX_FLOAT fWidth = crBBox.right - crBBox.left;
    140   const FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
    141 
    142   CPWL_Point pts[8][3] = {{CPWL_Point(0.28f, 0.52f), CPWL_Point(0.27f, 0.48f),
    143                            CPWL_Point(0.29f, 0.40f)},
    144                           {CPWL_Point(0.30f, 0.33f), CPWL_Point(0.31f, 0.29f),
    145                            CPWL_Point(0.31f, 0.28f)},
    146                           {CPWL_Point(0.39f, 0.28f), CPWL_Point(0.49f, 0.29f),
    147                            CPWL_Point(0.77f, 0.67f)},
    148                           {CPWL_Point(0.76f, 0.68f), CPWL_Point(0.78f, 0.69f),
    149                            CPWL_Point(0.76f, 0.75f)},
    150                           {CPWL_Point(0.76f, 0.75f), CPWL_Point(0.73f, 0.80f),
    151                            CPWL_Point(0.68f, 0.75f)},
    152                           {CPWL_Point(0.68f, 0.74f), CPWL_Point(0.68f, 0.74f),
    153                            CPWL_Point(0.44f, 0.47f)},
    154                           {CPWL_Point(0.43f, 0.47f), CPWL_Point(0.40f, 0.47f),
    155                            CPWL_Point(0.41f, 0.58f)},
    156                           {CPWL_Point(0.40f, 0.60f), CPWL_Point(0.28f, 0.66f),
    157                            CPWL_Point(0.30f, 0.56f)}};
    158 
    159   for (size_t i = 0; i < FX_ArraySize(pts); ++i) {
    160     for (size_t j = 0; j < FX_ArraySize(pts[0]); ++j) {
    161       pts[i][j].x = pts[i][j].x * fWidth + crBBox.left;
    162       pts[i][j].y *= pts[i][j].y * fHeight + crBBox.bottom;
    163     }
    164   }
    165 
    166   CFX_ByteTextBuf csAP;
    167   csAP << pts[0][0].x << " " << pts[0][0].y << " m\n";
    168 
    169   for (size_t i = 0; i < FX_ArraySize(pts); ++i) {
    170     size_t nNext = i < FX_ArraySize(pts) - 1 ? i + 1 : 0;
    171 
    172     FX_FLOAT px1 = pts[i][1].x - pts[i][0].x;
    173     FX_FLOAT py1 = pts[i][1].y - pts[i][0].y;
    174     FX_FLOAT px2 = pts[i][2].x - pts[nNext][0].x;
    175     FX_FLOAT py2 = pts[i][2].y - pts[nNext][0].y;
    176 
    177     csAP << pts[i][0].x + px1 * PWL_BEZIER << " "
    178          << pts[i][0].y + py1 * PWL_BEZIER << " "
    179          << pts[nNext][0].x + px2 * PWL_BEZIER << " "
    180          << pts[nNext][0].y + py2 * PWL_BEZIER << " " << pts[nNext][0].x << " "
    181          << pts[nNext][0].y << " c\n";
    182   }
    183 
    184   return csAP.GetByteString();
    185 }
    186 
    187 CFX_ByteString CPWL_Utils::GetAP_Circle(const CPDF_Rect& crBBox) {
    188   CFX_ByteTextBuf csAP;
    189 
    190   FX_FLOAT fWidth = crBBox.right - crBBox.left;
    191   FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
    192 
    193   CPDF_Point pt1(crBBox.left, crBBox.bottom + fHeight / 2);
    194   CPDF_Point pt2(crBBox.left + fWidth / 2, crBBox.top);
    195   CPDF_Point pt3(crBBox.right, crBBox.bottom + fHeight / 2);
    196   CPDF_Point pt4(crBBox.left + fWidth / 2, crBBox.bottom);
    197 
    198   csAP << pt1.x << " " << pt1.y << " m\n";
    199 
    200   FX_FLOAT px = pt2.x - pt1.x;
    201   FX_FLOAT py = pt2.y - pt1.y;
    202 
    203   csAP << pt1.x << " " << pt1.y + py * PWL_BEZIER << " "
    204        << pt2.x - px * PWL_BEZIER << " " << pt2.y << " " << pt2.x << " "
    205        << pt2.y << " c\n";
    206 
    207   px = pt3.x - pt2.x;
    208   py = pt2.y - pt3.y;
    209 
    210   csAP << pt2.x + px * PWL_BEZIER << " " << pt2.y << " " << pt3.x << " "
    211        << pt3.y + py * PWL_BEZIER << " " << pt3.x << " " << pt3.y << " c\n";
    212 
    213   px = pt3.x - pt4.x;
    214   py = pt3.y - pt4.y;
    215 
    216   csAP << pt3.x << " " << pt3.y - py * PWL_BEZIER << " "
    217        << pt4.x + px * PWL_BEZIER << " " << pt4.y << " " << pt4.x << " "
    218        << pt4.y << " c\n";
    219 
    220   px = pt4.x - pt1.x;
    221   py = pt1.y - pt4.y;
    222 
    223   csAP << pt4.x - px * PWL_BEZIER << " " << pt4.y << " " << pt1.x << " "
    224        << pt1.y - py * PWL_BEZIER << " " << pt1.x << " " << pt1.y << " c\n";
    225 
    226   return csAP.GetByteString();
    227 }
    228 
    229 CFX_ByteString CPWL_Utils::GetAP_Cross(const CPDF_Rect& crBBox) {
    230   CFX_ByteTextBuf csAP;
    231 
    232   csAP << crBBox.left << " " << crBBox.top << " m\n";
    233   csAP << crBBox.right << " " << crBBox.bottom << " l\n";
    234   csAP << crBBox.left << " " << crBBox.bottom << " m\n";
    235   csAP << crBBox.right << " " << crBBox.top << " l\n";
    236 
    237   return csAP.GetByteString();
    238 }
    239 
    240 CFX_ByteString CPWL_Utils::GetAP_Diamond(const CPDF_Rect& crBBox) {
    241   CFX_ByteTextBuf csAP;
    242 
    243   FX_FLOAT fWidth = crBBox.right - crBBox.left;
    244   FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
    245 
    246   CPDF_Point pt1(crBBox.left, crBBox.bottom + fHeight / 2);
    247   CPDF_Point pt2(crBBox.left + fWidth / 2, crBBox.top);
    248   CPDF_Point pt3(crBBox.right, crBBox.bottom + fHeight / 2);
    249   CPDF_Point pt4(crBBox.left + fWidth / 2, crBBox.bottom);
    250 
    251   csAP << pt1.x << " " << pt1.y << " m\n";
    252   csAP << pt2.x << " " << pt2.y << " l\n";
    253   csAP << pt3.x << " " << pt3.y << " l\n";
    254   csAP << pt4.x << " " << pt4.y << " l\n";
    255   csAP << pt1.x << " " << pt1.y << " l\n";
    256 
    257   return csAP.GetByteString();
    258 }
    259 
    260 CFX_ByteString CPWL_Utils::GetAP_Square(const CPDF_Rect& crBBox) {
    261   CFX_ByteTextBuf csAP;
    262 
    263   csAP << crBBox.left << " " << crBBox.top << " m\n";
    264   csAP << crBBox.right << " " << crBBox.top << " l\n";
    265   csAP << crBBox.right << " " << crBBox.bottom << " l\n";
    266   csAP << crBBox.left << " " << crBBox.bottom << " l\n";
    267   csAP << crBBox.left << " " << crBBox.top << " l\n";
    268 
    269   return csAP.GetByteString();
    270 }
    271 
    272 CFX_ByteString CPWL_Utils::GetAP_Star(const CPDF_Rect& crBBox) {
    273   CFX_ByteTextBuf csAP;
    274 
    275   FX_FLOAT fRadius =
    276       (crBBox.top - crBBox.bottom) / (1 + (FX_FLOAT)cos(PWL_PI / 5.0f));
    277   CPDF_Point ptCenter = CPDF_Point((crBBox.left + crBBox.right) / 2.0f,
    278                                    (crBBox.top + crBBox.bottom) / 2.0f);
    279 
    280   FX_FLOAT px[5], py[5];
    281 
    282   FX_FLOAT fAngel = PWL_PI / 10.0f;
    283 
    284   for (int32_t i = 0; i < 5; i++) {
    285     px[i] = ptCenter.x + fRadius * (FX_FLOAT)cos(fAngel);
    286     py[i] = ptCenter.y + fRadius * (FX_FLOAT)sin(fAngel);
    287 
    288     fAngel += PWL_PI * 2 / 5.0f;
    289   }
    290 
    291   csAP << px[0] << " " << py[0] << " m\n";
    292 
    293   int32_t nNext = 0;
    294   for (int32_t j = 0; j < 5; j++) {
    295     nNext += 2;
    296     if (nNext >= 5)
    297       nNext -= 5;
    298     csAP << px[nNext] << " " << py[nNext] << " l\n";
    299   }
    300 
    301   return csAP.GetByteString();
    302 }
    303 
    304 CFX_ByteString CPWL_Utils::GetAP_HalfCircle(const CPDF_Rect& crBBox,
    305                                             FX_FLOAT fRotate) {
    306   CFX_ByteTextBuf csAP;
    307 
    308   FX_FLOAT fWidth = crBBox.right - crBBox.left;
    309   FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
    310 
    311   CPDF_Point pt1(-fWidth / 2, 0);
    312   CPDF_Point pt2(0, fHeight / 2);
    313   CPDF_Point pt3(fWidth / 2, 0);
    314 
    315   FX_FLOAT px, py;
    316 
    317   csAP << cos(fRotate) << " " << sin(fRotate) << " " << -sin(fRotate) << " "
    318        << cos(fRotate) << " " << crBBox.left + fWidth / 2 << " "
    319        << crBBox.bottom + fHeight / 2 << " cm\n";
    320 
    321   csAP << pt1.x << " " << pt1.y << " m\n";
    322 
    323   px = pt2.x - pt1.x;
    324   py = pt2.y - pt1.y;
    325 
    326   csAP << pt1.x << " " << pt1.y + py * PWL_BEZIER << " "
    327        << pt2.x - px * PWL_BEZIER << " " << pt2.y << " " << pt2.x << " "
    328        << pt2.y << " c\n";
    329 
    330   px = pt3.x - pt2.x;
    331   py = pt2.y - pt3.y;
    332 
    333   csAP << pt2.x + px * PWL_BEZIER << " " << pt2.y << " " << pt3.x << " "
    334        << pt3.y + py * PWL_BEZIER << " " << pt3.x << " " << pt3.y << " c\n";
    335 
    336   return csAP.GetByteString();
    337 }
    338 
    339 CPDF_Rect CPWL_Utils::InflateRect(const CPDF_Rect& rcRect, FX_FLOAT fSize) {
    340   if (rcRect.IsEmpty())
    341     return rcRect;
    342 
    343   CPDF_Rect rcNew(rcRect.left - fSize, rcRect.bottom - fSize,
    344                   rcRect.right + fSize, rcRect.top + fSize);
    345   rcNew.Normalize();
    346   return rcNew;
    347 }
    348 
    349 CPDF_Rect CPWL_Utils::DeflateRect(const CPDF_Rect& rcRect, FX_FLOAT fSize) {
    350   if (rcRect.IsEmpty())
    351     return rcRect;
    352 
    353   CPDF_Rect rcNew(rcRect.left + fSize, rcRect.bottom + fSize,
    354                   rcRect.right - fSize, rcRect.top - fSize);
    355   rcNew.Normalize();
    356   return rcNew;
    357 }
    358 
    359 CPDF_Rect CPWL_Utils::ScaleRect(const CPDF_Rect& rcRect, FX_FLOAT fScale) {
    360   FX_FLOAT fHalfWidth = (rcRect.right - rcRect.left) / 2.0f;
    361   FX_FLOAT fHalfHeight = (rcRect.top - rcRect.bottom) / 2.0f;
    362 
    363   CPDF_Point ptCenter = CPDF_Point((rcRect.left + rcRect.right) / 2,
    364                                    (rcRect.top + rcRect.bottom) / 2);
    365 
    366   return CPDF_Rect(
    367       ptCenter.x - fHalfWidth * fScale, ptCenter.y - fHalfHeight * fScale,
    368       ptCenter.x + fHalfWidth * fScale, ptCenter.y + fHalfHeight * fScale);
    369 }
    370 
    371 CFX_ByteString CPWL_Utils::GetRectFillAppStream(const CPDF_Rect& rect,
    372                                                 const CPWL_Color& color) {
    373   CFX_ByteTextBuf sAppStream;
    374 
    375   CFX_ByteString sColor = GetColorAppStream(color, TRUE);
    376   if (sColor.GetLength() > 0) {
    377     sAppStream << "q\n" << sColor;
    378     sAppStream << rect.left << " " << rect.bottom << " "
    379                << rect.right - rect.left << " " << rect.top - rect.bottom
    380                << " re f\nQ\n";
    381   }
    382 
    383   return sAppStream.GetByteString();
    384 }
    385 
    386 CFX_ByteString CPWL_Utils::GetCircleFillAppStream(const CPDF_Rect& rect,
    387                                                   const CPWL_Color& color) {
    388   CFX_ByteTextBuf sAppStream;
    389 
    390   CFX_ByteString sColor = GetColorAppStream(color, TRUE);
    391   if (sColor.GetLength() > 0) {
    392     sAppStream << "q\n" << sColor << CPWL_Utils::GetAP_Circle(rect) << "f\nQ\n";
    393   }
    394 
    395   return sAppStream.GetByteString();
    396 }
    397 
    398 CPDF_Rect CPWL_Utils::GetCenterSquare(const CPDF_Rect& rect) {
    399   FX_FLOAT fWidth = rect.right - rect.left;
    400   FX_FLOAT fHeight = rect.top - rect.bottom;
    401 
    402   FX_FLOAT fCenterX = (rect.left + rect.right) / 2.0f;
    403   FX_FLOAT fCenterY = (rect.top + rect.bottom) / 2.0f;
    404 
    405   FX_FLOAT fRadius = (fWidth > fHeight) ? fHeight / 2 : fWidth / 2;
    406 
    407   return CPDF_Rect(fCenterX - fRadius, fCenterY - fRadius, fCenterX + fRadius,
    408                    fCenterY + fRadius);
    409 }
    410 
    411 CFX_ByteString CPWL_Utils::GetEditAppStream(IFX_Edit* pEdit,
    412                                             const CPDF_Point& ptOffset,
    413                                             const CPVT_WordRange* pRange,
    414                                             FX_BOOL bContinuous,
    415                                             FX_WORD SubWord) {
    416   return IFX_Edit::GetEditAppearanceStream(pEdit, ptOffset, pRange, bContinuous,
    417                                            SubWord);
    418 }
    419 
    420 CFX_ByteString CPWL_Utils::GetEditSelAppStream(IFX_Edit* pEdit,
    421                                                const CPDF_Point& ptOffset,
    422                                                const CPVT_WordRange* pRange) {
    423   return IFX_Edit::GetSelectAppearanceStream(pEdit, ptOffset, pRange);
    424 }
    425 
    426 static CFX_ByteString GetSquigglyAppearanceStream(FX_FLOAT fStartX,
    427                                                   FX_FLOAT fEndX,
    428                                                   FX_FLOAT fY,
    429                                                   FX_FLOAT fStep) {
    430   CFX_ByteTextBuf sRet;
    431 
    432   sRet << "0 w\n" << fStartX << " " << fY << " m\n";
    433 
    434   FX_FLOAT fx;
    435   int32_t i;
    436 
    437   for (i = 1, fx = fStartX + fStep; fx < fEndX; fx += fStep, i++) {
    438     sRet << fx << " " << fY + (i & 1) * fStep << " l\n";
    439   }
    440 
    441   sRet << "S\n";
    442 
    443   return sRet.GetByteString();
    444 }
    445 
    446 static CFX_ByteString GetWordSpellCheckAppearanceStream(
    447     IFX_Edit_Iterator* pIterator,
    448     const CPDF_Point& ptOffset,
    449     const CPVT_WordRange& wrWord) {
    450   CFX_ByteTextBuf sRet;
    451 
    452   FX_FLOAT fStartX = 0.0f;
    453   FX_FLOAT fEndX = 0.0f;
    454   FX_FLOAT fY = 0.0f;
    455   FX_FLOAT fStep = 0.0f;
    456 
    457   FX_BOOL bBreak = FALSE;
    458 
    459   if (pIterator) {
    460     pIterator->SetAt(wrWord.BeginPos);
    461 
    462     do {
    463       CPVT_WordPlace place = pIterator->GetAt();
    464 
    465       CPVT_Line line;
    466       if (pIterator->GetLine(line)) {
    467         fY = line.ptLine.y;
    468         fStep = (line.fLineAscent - line.fLineDescent) / 16.0f;
    469       }
    470 
    471       if (place.LineCmp(wrWord.BeginPos) == 0) {
    472         pIterator->SetAt(wrWord.BeginPos);
    473         CPVT_Word word;
    474         if (pIterator->GetWord(word)) {
    475           fStartX = word.ptWord.x;
    476         }
    477       } else {
    478         fStartX = line.ptLine.x;
    479       }
    480 
    481       if (place.LineCmp(wrWord.EndPos) == 0) {
    482         pIterator->SetAt(wrWord.EndPos);
    483         CPVT_Word word;
    484         if (pIterator->GetWord(word)) {
    485           fEndX = word.ptWord.x + word.fWidth;
    486         }
    487 
    488         bBreak = TRUE;
    489       } else {
    490         fEndX = line.ptLine.x + line.fLineWidth;
    491       }
    492 
    493       sRet << GetSquigglyAppearanceStream(
    494           fStartX + ptOffset.x, fEndX + ptOffset.x, fY + ptOffset.y, fStep);
    495 
    496       if (bBreak)
    497         break;
    498     } while (pIterator->NextLine());
    499   }
    500 
    501   return sRet.GetByteString();
    502 }
    503 
    504 CFX_ByteString CPWL_Utils::GetSpellCheckAppStream(
    505     IFX_Edit* pEdit,
    506     IPWL_SpellCheck* pSpellCheck,
    507     const CPDF_Point& ptOffset,
    508     const CPVT_WordRange* pRange) {
    509   CFX_ByteTextBuf sRet;
    510 
    511   if (pRange && pRange->IsExist()) {
    512     if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator()) {
    513       pIterator->SetAt(pRange->BeginPos);
    514 
    515       FX_BOOL bLatinWord = FALSE;
    516       CPVT_WordPlace wpWordStart;
    517       CFX_ByteString sWord;
    518 
    519       CPVT_WordPlace oldplace;
    520       while (pIterator->NextWord()) {
    521         CPVT_WordPlace place = pIterator->GetAt();
    522         if (pRange && place.WordCmp(pRange->EndPos) > 0)
    523           break;
    524 
    525         CPVT_Word word;
    526         if (pIterator->GetWord(word)) {
    527           if (FX_EDIT_ISLATINWORD(word.Word)) {
    528             if (!bLatinWord) {
    529               wpWordStart = place;
    530               bLatinWord = TRUE;
    531             }
    532 
    533             sWord += (char)word.Word;
    534             oldplace = place;
    535           } else {
    536             if (bLatinWord) {
    537               if (!pSpellCheck->CheckWord(sWord)) {
    538                 sRet << GetWordSpellCheckAppearanceStream(
    539                     pIterator, ptOffset, CPVT_WordRange(wpWordStart, oldplace));
    540                 pIterator->SetAt(place);
    541               }
    542               bLatinWord = FALSE;
    543             }
    544 
    545             sWord.Empty();
    546           }
    547         } else {
    548           if (bLatinWord) {
    549             if (!pSpellCheck->CheckWord(sWord))
    550               sRet << GetWordSpellCheckAppearanceStream(
    551                   pIterator, ptOffset, CPVT_WordRange(wpWordStart, oldplace));
    552             bLatinWord = FALSE;
    553             sWord.Empty();
    554           }
    555         }
    556       }
    557 
    558       if (bLatinWord) {
    559         if (!pSpellCheck->CheckWord(sWord))
    560           sRet << GetWordSpellCheckAppearanceStream(
    561               pIterator, ptOffset, CPVT_WordRange(wpWordStart, oldplace));
    562 
    563         bLatinWord = FALSE;
    564         sWord.Empty();
    565       }
    566     }
    567   }
    568 
    569   return sRet.GetByteString();
    570 }
    571 
    572 CFX_ByteString CPWL_Utils::GetTextAppStream(const CPDF_Rect& rcBBox,
    573                                             IFX_Edit_FontMap* pFontMap,
    574                                             const CFX_WideString& sText,
    575                                             int32_t nAlignmentH,
    576                                             int32_t nAlignmentV,
    577                                             FX_FLOAT fFontSize,
    578                                             FX_BOOL bMultiLine,
    579                                             FX_BOOL bAutoReturn,
    580                                             const CPWL_Color& crText) {
    581   CFX_ByteTextBuf sRet;
    582 
    583   if (IFX_Edit* pEdit = IFX_Edit::NewEdit()) {
    584     pEdit->SetFontMap(pFontMap);
    585     pEdit->SetPlateRect(rcBBox);
    586     pEdit->SetAlignmentH(nAlignmentH);
    587     pEdit->SetAlignmentV(nAlignmentV);
    588     pEdit->SetMultiLine(bMultiLine);
    589     pEdit->SetAutoReturn(bAutoReturn);
    590     if (IsFloatZero(fFontSize))
    591       pEdit->SetAutoFontSize(TRUE);
    592     else
    593       pEdit->SetFontSize(fFontSize);
    594 
    595     pEdit->Initialize();
    596     pEdit->SetText(sText.c_str());
    597 
    598     CFX_ByteString sEdit =
    599         CPWL_Utils::GetEditAppStream(pEdit, CPDF_Point(0.0f, 0.0f));
    600     if (sEdit.GetLength() > 0) {
    601       sRet << "BT\n" << CPWL_Utils::GetColorAppStream(crText) << sEdit
    602            << "ET\n";
    603     }
    604     IFX_Edit::DelEdit(pEdit);
    605   }
    606 
    607   return sRet.GetByteString();
    608 }
    609 
    610 CFX_ByteString CPWL_Utils::GetPushButtonAppStream(const CPDF_Rect& rcBBox,
    611                                                   IFX_Edit_FontMap* pFontMap,
    612                                                   CPDF_Stream* pIconStream,
    613                                                   CPDF_IconFit& IconFit,
    614                                                   const CFX_WideString& sLabel,
    615                                                   const CPWL_Color& crText,
    616                                                   FX_FLOAT fFontSize,
    617                                                   int32_t nLayOut) {
    618   const FX_FLOAT fAutoFontScale = 1.0f / 3.0f;
    619 
    620   if (IFX_Edit* pEdit = IFX_Edit::NewEdit()) {
    621     pEdit->SetFontMap(pFontMap);
    622     pEdit->SetAlignmentH(1);
    623     pEdit->SetAlignmentV(1);
    624     pEdit->SetMultiLine(FALSE);
    625     pEdit->SetAutoReturn(FALSE);
    626     if (IsFloatZero(fFontSize))
    627       pEdit->SetAutoFontSize(TRUE);
    628     else
    629       pEdit->SetFontSize(fFontSize);
    630 
    631     pEdit->Initialize();
    632     pEdit->SetText(sLabel.c_str());
    633 
    634     CPDF_Rect rcLabelContent = pEdit->GetContentRect();
    635     CPWL_Icon Icon;
    636     PWL_CREATEPARAM cp;
    637     cp.dwFlags = PWS_VISIBLE;
    638     Icon.Create(cp);
    639     Icon.SetIconFit(&IconFit);
    640     Icon.SetPDFStream(pIconStream);
    641 
    642     CPDF_Rect rcLabel = CPDF_Rect(0, 0, 0, 0);
    643     CPDF_Rect rcIcon = CPDF_Rect(0, 0, 0, 0);
    644     FX_FLOAT fWidth = 0.0f;
    645     FX_FLOAT fHeight = 0.0f;
    646 
    647     switch (nLayOut) {
    648       case PPBL_LABEL:
    649         rcLabel = rcBBox;
    650         rcIcon = CPDF_Rect(0, 0, 0, 0);
    651         break;
    652       case PPBL_ICON:
    653         rcIcon = rcBBox;
    654         rcLabel = CPDF_Rect(0, 0, 0, 0);
    655         break;
    656       case PPBL_ICONTOPLABELBOTTOM:
    657 
    658         if (pIconStream) {
    659           if (IsFloatZero(fFontSize)) {
    660             fHeight = rcBBox.top - rcBBox.bottom;
    661             rcLabel = CPDF_Rect(rcBBox.left, rcBBox.bottom, rcBBox.right,
    662                                 rcBBox.bottom + fHeight * fAutoFontScale);
    663             rcIcon =
    664                 CPDF_Rect(rcBBox.left, rcLabel.top, rcBBox.right, rcBBox.top);
    665           } else {
    666             fHeight = rcLabelContent.Height();
    667 
    668             if (rcBBox.bottom + fHeight > rcBBox.top) {
    669               rcIcon = CPDF_Rect(0, 0, 0, 0);
    670               rcLabel = rcBBox;
    671             } else {
    672               rcLabel = CPDF_Rect(rcBBox.left, rcBBox.bottom, rcBBox.right,
    673                                   rcBBox.bottom + fHeight);
    674               rcIcon =
    675                   CPDF_Rect(rcBBox.left, rcLabel.top, rcBBox.right, rcBBox.top);
    676             }
    677           }
    678         } else {
    679           rcLabel = rcBBox;
    680           rcIcon = CPDF_Rect(0, 0, 0, 0);
    681         }
    682 
    683         break;
    684       case PPBL_LABELTOPICONBOTTOM:
    685 
    686         if (pIconStream) {
    687           if (IsFloatZero(fFontSize)) {
    688             fHeight = rcBBox.top - rcBBox.bottom;
    689             rcLabel =
    690                 CPDF_Rect(rcBBox.left, rcBBox.top - fHeight * fAutoFontScale,
    691                           rcBBox.right, rcBBox.top);
    692             rcIcon = CPDF_Rect(rcBBox.left, rcBBox.bottom, rcBBox.right,
    693                                rcLabel.bottom);
    694           } else {
    695             fHeight = rcLabelContent.Height();
    696 
    697             if (rcBBox.bottom + fHeight > rcBBox.top) {
    698               rcIcon = CPDF_Rect(0, 0, 0, 0);
    699               rcLabel = rcBBox;
    700             } else {
    701               rcLabel = CPDF_Rect(rcBBox.left, rcBBox.top - fHeight,
    702                                   rcBBox.right, rcBBox.top);
    703               rcIcon = CPDF_Rect(rcBBox.left, rcBBox.bottom, rcBBox.right,
    704                                  rcLabel.bottom);
    705             }
    706           }
    707         } else {
    708           rcLabel = rcBBox;
    709           rcIcon = CPDF_Rect(0, 0, 0, 0);
    710         }
    711 
    712         break;
    713       case PPBL_ICONLEFTLABELRIGHT:
    714 
    715         if (pIconStream) {
    716           if (IsFloatZero(fFontSize)) {
    717             fWidth = rcBBox.right - rcBBox.left;
    718             rcLabel = CPDF_Rect(rcBBox.right - fWidth * fAutoFontScale,
    719                                 rcBBox.bottom, rcBBox.right, rcBBox.top);
    720             rcIcon =
    721                 CPDF_Rect(rcBBox.left, rcBBox.bottom, rcLabel.left, rcBBox.top);
    722 
    723             if (rcLabelContent.Width() < fWidth * fAutoFontScale) {
    724             } else {
    725               if (rcLabelContent.Width() < fWidth) {
    726                 rcLabel = CPDF_Rect(rcBBox.right - rcLabelContent.Width(),
    727                                     rcBBox.bottom, rcBBox.right, rcBBox.top);
    728                 rcIcon = CPDF_Rect(rcBBox.left, rcBBox.bottom, rcLabel.left,
    729                                    rcBBox.top);
    730               } else {
    731                 rcLabel = rcBBox;
    732                 rcIcon = CPDF_Rect(0, 0, 0, 0);
    733               }
    734             }
    735           } else {
    736             fWidth = rcLabelContent.Width();
    737 
    738             if (rcBBox.left + fWidth > rcBBox.right) {
    739               rcLabel = rcBBox;
    740               rcIcon = CPDF_Rect(0, 0, 0, 0);
    741             } else {
    742               rcLabel = CPDF_Rect(rcBBox.right - fWidth, rcBBox.bottom,
    743                                   rcBBox.right, rcBBox.top);
    744               rcIcon = CPDF_Rect(rcBBox.left, rcBBox.bottom, rcLabel.left,
    745                                  rcBBox.top);
    746             }
    747           }
    748         } else {
    749           rcLabel = rcBBox;
    750           rcIcon = CPDF_Rect(0, 0, 0, 0);
    751         }
    752 
    753         break;
    754       case PPBL_LABELLEFTICONRIGHT:
    755 
    756         if (pIconStream) {
    757           if (IsFloatZero(fFontSize)) {
    758             fWidth = rcBBox.right - rcBBox.left;
    759             rcLabel =
    760                 CPDF_Rect(rcBBox.left, rcBBox.bottom,
    761                           rcBBox.left + fWidth * fAutoFontScale, rcBBox.top);
    762             rcIcon = CPDF_Rect(rcLabel.right, rcBBox.bottom, rcBBox.right,
    763                                rcBBox.top);
    764 
    765             if (rcLabelContent.Width() < fWidth * fAutoFontScale) {
    766             } else {
    767               if (rcLabelContent.Width() < fWidth) {
    768                 rcLabel =
    769                     CPDF_Rect(rcBBox.left, rcBBox.bottom,
    770                               rcBBox.left + rcLabelContent.Width(), rcBBox.top);
    771                 rcIcon = CPDF_Rect(rcLabel.right, rcBBox.bottom, rcBBox.right,
    772                                    rcBBox.top);
    773               } else {
    774                 rcLabel = rcBBox;
    775                 rcIcon = CPDF_Rect(0, 0, 0, 0);
    776               }
    777             }
    778           } else {
    779             fWidth = rcLabelContent.Width();
    780 
    781             if (rcBBox.left + fWidth > rcBBox.right) {
    782               rcLabel = rcBBox;
    783               rcIcon = CPDF_Rect(0, 0, 0, 0);
    784             } else {
    785               rcLabel = CPDF_Rect(rcBBox.left, rcBBox.bottom,
    786                                   rcBBox.left + fWidth, rcBBox.top);
    787               rcIcon = CPDF_Rect(rcLabel.right, rcBBox.bottom, rcBBox.right,
    788                                  rcBBox.top);
    789             }
    790           }
    791         } else {
    792           rcLabel = rcBBox;
    793           rcIcon = CPDF_Rect(0, 0, 0, 0);
    794         }
    795 
    796         break;
    797       case PPBL_LABELOVERICON:
    798         rcLabel = rcBBox;
    799         rcIcon = rcBBox;
    800         break;
    801     }
    802 
    803     CFX_ByteTextBuf sAppStream, sTemp;
    804 
    805     if (!rcIcon.IsEmpty()) {
    806       Icon.Move(rcIcon, FALSE, FALSE);
    807       sTemp << Icon.GetImageAppStream();
    808     }
    809 
    810     Icon.Destroy();
    811 
    812     if (!rcLabel.IsEmpty()) {
    813       pEdit->SetPlateRect(rcLabel);
    814       CFX_ByteString sEdit =
    815           CPWL_Utils::GetEditAppStream(pEdit, CPDF_Point(0.0f, 0.0f));
    816       if (sEdit.GetLength() > 0) {
    817         sTemp << "BT\n" << CPWL_Utils::GetColorAppStream(crText) << sEdit
    818               << "ET\n";
    819       }
    820     }
    821 
    822     IFX_Edit::DelEdit(pEdit);
    823 
    824     if (sTemp.GetSize() > 0) {
    825       sAppStream << "q\n" << rcBBox.left << " " << rcBBox.bottom << " "
    826                  << rcBBox.right - rcBBox.left << " "
    827                  << rcBBox.top - rcBBox.bottom << " re W n\n";
    828       sAppStream << sTemp << "Q\n";
    829     }
    830 
    831     return sAppStream.GetByteString();
    832   }
    833 
    834   return "";
    835 }
    836 
    837 CFX_ByteString CPWL_Utils::GetColorAppStream(const CPWL_Color& color,
    838                                              const FX_BOOL& bFillOrStroke) {
    839   CFX_ByteTextBuf sColorStream;
    840 
    841   switch (color.nColorType) {
    842     case COLORTYPE_RGB:
    843       sColorStream << color.fColor1 << " " << color.fColor2 << " "
    844                    << color.fColor3 << " " << (bFillOrStroke ? "rg" : "RG")
    845                    << "\n";
    846       break;
    847     case COLORTYPE_GRAY:
    848       sColorStream << color.fColor1 << " " << (bFillOrStroke ? "g" : "G")
    849                    << "\n";
    850       break;
    851     case COLORTYPE_CMYK:
    852       sColorStream << color.fColor1 << " " << color.fColor2 << " "
    853                    << color.fColor3 << " " << color.fColor4 << " "
    854                    << (bFillOrStroke ? "k" : "K") << "\n";
    855       break;
    856   }
    857 
    858   return sColorStream.GetByteString();
    859 }
    860 
    861 CFX_ByteString CPWL_Utils::GetBorderAppStream(const CPDF_Rect& rect,
    862                                               FX_FLOAT fWidth,
    863                                               const CPWL_Color& color,
    864                                               const CPWL_Color& crLeftTop,
    865                                               const CPWL_Color& crRightBottom,
    866                                               int32_t nStyle,
    867                                               const CPWL_Dash& dash) {
    868   CFX_ByteTextBuf sAppStream;
    869   CFX_ByteString sColor;
    870 
    871   FX_FLOAT fLeft = rect.left;
    872   FX_FLOAT fRight = rect.right;
    873   FX_FLOAT fTop = rect.top;
    874   FX_FLOAT fBottom = rect.bottom;
    875 
    876   if (fWidth > 0.0f) {
    877     FX_FLOAT fHalfWidth = fWidth / 2.0f;
    878 
    879     sAppStream << "q\n";
    880 
    881     switch (nStyle) {
    882       default:
    883       case PBS_SOLID:
    884         sColor = CPWL_Utils::GetColorAppStream(color, TRUE);
    885         if (sColor.GetLength() > 0) {
    886           sAppStream << sColor;
    887           sAppStream << fLeft << " " << fBottom << " " << fRight - fLeft << " "
    888                      << fTop - fBottom << " re\n";
    889           sAppStream << fLeft + fWidth << " " << fBottom + fWidth << " "
    890                      << fRight - fLeft - fWidth * 2 << " "
    891                      << fTop - fBottom - fWidth * 2 << " re\n";
    892           sAppStream << "f*\n";
    893         }
    894         break;
    895       case PBS_DASH:
    896         sColor = CPWL_Utils::GetColorAppStream(color, FALSE);
    897         if (sColor.GetLength() > 0) {
    898           sAppStream << sColor;
    899           sAppStream << fWidth << " w"
    900                      << " [" << dash.nDash << " " << dash.nGap << "] "
    901                      << dash.nPhase << " d\n";
    902           sAppStream << fLeft + fWidth / 2 << " " << fBottom + fWidth / 2
    903                      << " m\n";
    904           sAppStream << fLeft + fWidth / 2 << " " << fTop - fWidth / 2
    905                      << " l\n";
    906           sAppStream << fRight - fWidth / 2 << " " << fTop - fWidth / 2
    907                      << " l\n";
    908           sAppStream << fRight - fWidth / 2 << " " << fBottom + fWidth / 2
    909                      << " l\n";
    910           sAppStream << fLeft + fWidth / 2 << " " << fBottom + fWidth / 2
    911                      << " l S\n";
    912         }
    913         break;
    914       case PBS_BEVELED:
    915       case PBS_INSET:
    916         sColor = CPWL_Utils::GetColorAppStream(crLeftTop, TRUE);
    917         if (sColor.GetLength() > 0) {
    918           sAppStream << sColor;
    919           sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth
    920                      << " m\n";
    921           sAppStream << fLeft + fHalfWidth << " " << fTop - fHalfWidth
    922                      << " l\n";
    923           sAppStream << fRight - fHalfWidth << " " << fTop - fHalfWidth
    924                      << " l\n";
    925           sAppStream << fRight - fHalfWidth * 2 << " " << fTop - fHalfWidth * 2
    926                      << " l\n";
    927           sAppStream << fLeft + fHalfWidth * 2 << " " << fTop - fHalfWidth * 2
    928                      << " l\n";
    929           sAppStream << fLeft + fHalfWidth * 2 << " "
    930                      << fBottom + fHalfWidth * 2 << " l f\n";
    931         }
    932 
    933         sColor = CPWL_Utils::GetColorAppStream(crRightBottom, TRUE);
    934         if (sColor.GetLength() > 0) {
    935           sAppStream << sColor;
    936           sAppStream << fRight - fHalfWidth << " " << fTop - fHalfWidth
    937                      << " m\n";
    938           sAppStream << fRight - fHalfWidth << " " << fBottom + fHalfWidth
    939                      << " l\n";
    940           sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth
    941                      << " l\n";
    942           sAppStream << fLeft + fHalfWidth * 2 << " "
    943                      << fBottom + fHalfWidth * 2 << " l\n";
    944           sAppStream << fRight - fHalfWidth * 2 << " "
    945                      << fBottom + fHalfWidth * 2 << " l\n";
    946           sAppStream << fRight - fHalfWidth * 2 << " " << fTop - fHalfWidth * 2
    947                      << " l f\n";
    948         }
    949 
    950         sColor = CPWL_Utils::GetColorAppStream(color, TRUE);
    951         if (sColor.GetLength() > 0) {
    952           sAppStream << sColor;
    953           sAppStream << fLeft << " " << fBottom << " " << fRight - fLeft << " "
    954                      << fTop - fBottom << " re\n";
    955           sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth << " "
    956                      << fRight - fLeft - fHalfWidth * 2 << " "
    957                      << fTop - fBottom - fHalfWidth * 2 << " re f*\n";
    958         }
    959         break;
    960       case PBS_UNDERLINED:
    961         sColor = CPWL_Utils::GetColorAppStream(color, FALSE);
    962         if (sColor.GetLength() > 0) {
    963           sAppStream << sColor;
    964           sAppStream << fWidth << " w\n";
    965           sAppStream << fLeft << " " << fBottom + fWidth / 2 << " m\n";
    966           sAppStream << fRight << " " << fBottom + fWidth / 2 << " l S\n";
    967         }
    968         break;
    969     }
    970 
    971     sAppStream << "Q\n";
    972   }
    973 
    974   return sAppStream.GetByteString();
    975 }
    976 
    977 CFX_ByteString CPWL_Utils::GetCircleBorderAppStream(
    978     const CPDF_Rect& rect,
    979     FX_FLOAT fWidth,
    980     const CPWL_Color& color,
    981     const CPWL_Color& crLeftTop,
    982     const CPWL_Color& crRightBottom,
    983     int32_t nStyle,
    984     const CPWL_Dash& dash) {
    985   CFX_ByteTextBuf sAppStream;
    986   CFX_ByteString sColor;
    987 
    988   if (fWidth > 0.0f) {
    989     sAppStream << "q\n";
    990 
    991     switch (nStyle) {
    992       default:
    993       case PBS_SOLID:
    994       case PBS_UNDERLINED: {
    995         sColor = CPWL_Utils::GetColorAppStream(color, FALSE);
    996         if (sColor.GetLength() > 0) {
    997           sAppStream << "q\n" << fWidth << " w\n" << sColor
    998                      << CPWL_Utils::GetAP_Circle(
    999                             CPWL_Utils::DeflateRect(rect, fWidth / 2.0f))
   1000                      << " S\nQ\n";
   1001         }
   1002       } break;
   1003       case PBS_DASH: {
   1004         sColor = CPWL_Utils::GetColorAppStream(color, FALSE);
   1005         if (sColor.GetLength() > 0) {
   1006           sAppStream << "q\n" << fWidth << " w\n"
   1007                      << "[" << dash.nDash << " " << dash.nGap << "] "
   1008                      << dash.nPhase << " d\n" << sColor
   1009                      << CPWL_Utils::GetAP_Circle(
   1010                             CPWL_Utils::DeflateRect(rect, fWidth / 2.0f))
   1011                      << " S\nQ\n";
   1012         }
   1013       } break;
   1014       case PBS_BEVELED: {
   1015         FX_FLOAT fHalfWidth = fWidth / 2.0f;
   1016 
   1017         sColor = CPWL_Utils::GetColorAppStream(color, FALSE);
   1018         if (sColor.GetLength() > 0) {
   1019           sAppStream << "q\n" << fHalfWidth << " w\n" << sColor
   1020                      << CPWL_Utils::GetAP_Circle(rect) << " S\nQ\n";
   1021         }
   1022 
   1023         sColor = CPWL_Utils::GetColorAppStream(crLeftTop, FALSE);
   1024         if (sColor.GetLength() > 0) {
   1025           sAppStream << "q\n" << fHalfWidth << " w\n" << sColor
   1026                      << CPWL_Utils::GetAP_HalfCircle(
   1027                             CPWL_Utils::DeflateRect(rect, fHalfWidth * 0.75f),
   1028                             PWL_PI / 4.0f)
   1029                      << " S\nQ\n";
   1030         }
   1031 
   1032         sColor = CPWL_Utils::GetColorAppStream(crRightBottom, FALSE);
   1033         if (sColor.GetLength() > 0) {
   1034           sAppStream << "q\n" << fHalfWidth << " w\n" << sColor
   1035                      << CPWL_Utils::GetAP_HalfCircle(
   1036                             CPWL_Utils::DeflateRect(rect, fHalfWidth * 0.75f),
   1037                             PWL_PI * 5 / 4.0f)
   1038                      << " S\nQ\n";
   1039         }
   1040       } break;
   1041       case PBS_INSET: {
   1042         FX_FLOAT fHalfWidth = fWidth / 2.0f;
   1043 
   1044         sColor = CPWL_Utils::GetColorAppStream(color, FALSE);
   1045         if (sColor.GetLength() > 0) {
   1046           sAppStream << "q\n" << fHalfWidth << " w\n" << sColor
   1047                      << CPWL_Utils::GetAP_Circle(rect) << " S\nQ\n";
   1048         }
   1049 
   1050         sColor = CPWL_Utils::GetColorAppStream(crLeftTop, FALSE);
   1051         if (sColor.GetLength() > 0) {
   1052           sAppStream << "q\n" << fHalfWidth << " w\n" << sColor
   1053                      << CPWL_Utils::GetAP_HalfCircle(
   1054                             CPWL_Utils::DeflateRect(rect, fHalfWidth * 0.75f),
   1055                             PWL_PI / 4.0f)
   1056                      << " S\nQ\n";
   1057         }
   1058 
   1059         sColor = CPWL_Utils::GetColorAppStream(crRightBottom, FALSE);
   1060         if (sColor.GetLength() > 0) {
   1061           sAppStream << "q\n" << fHalfWidth << " w\n" << sColor
   1062                      << CPWL_Utils::GetAP_HalfCircle(
   1063                             CPWL_Utils::DeflateRect(rect, fHalfWidth * 0.75f),
   1064                             PWL_PI * 5 / 4.0f)
   1065                      << " S\nQ\n";
   1066         }
   1067       } break;
   1068     }
   1069 
   1070     sAppStream << "Q\n";
   1071   }
   1072 
   1073   return sAppStream.GetByteString();
   1074 }
   1075 
   1076 CPWL_Color CPWL_Utils::SubstractColor(const CPWL_Color& sColor,
   1077                                       FX_FLOAT fColorSub) {
   1078   CPWL_Color sRet;
   1079   sRet.nColorType = sColor.nColorType;
   1080 
   1081   switch (sColor.nColorType) {
   1082     case COLORTYPE_TRANSPARENT:
   1083       sRet.nColorType = COLORTYPE_RGB;
   1084       sRet.fColor1 = PWL_MAX(1 - fColorSub, 0.0f);
   1085       sRet.fColor2 = PWL_MAX(1 - fColorSub, 0.0f);
   1086       sRet.fColor3 = PWL_MAX(1 - fColorSub, 0.0f);
   1087       break;
   1088     case COLORTYPE_RGB:
   1089     case COLORTYPE_GRAY:
   1090     case COLORTYPE_CMYK:
   1091       sRet.fColor1 = PWL_MAX(sColor.fColor1 - fColorSub, 0.0f);
   1092       sRet.fColor2 = PWL_MAX(sColor.fColor2 - fColorSub, 0.0f);
   1093       sRet.fColor3 = PWL_MAX(sColor.fColor3 - fColorSub, 0.0f);
   1094       sRet.fColor4 = PWL_MAX(sColor.fColor4 - fColorSub, 0.0f);
   1095       break;
   1096   }
   1097 
   1098   return sRet;
   1099 }
   1100 
   1101 CPWL_Color CPWL_Utils::DevideColor(const CPWL_Color& sColor,
   1102                                    FX_FLOAT fColorDevide) {
   1103   CPWL_Color sRet;
   1104   sRet.nColorType = sColor.nColorType;
   1105 
   1106   switch (sColor.nColorType) {
   1107     case COLORTYPE_TRANSPARENT:
   1108       sRet.nColorType = COLORTYPE_RGB;
   1109       sRet.fColor1 = 1 / fColorDevide;
   1110       sRet.fColor2 = 1 / fColorDevide;
   1111       sRet.fColor3 = 1 / fColorDevide;
   1112       break;
   1113     case COLORTYPE_RGB:
   1114     case COLORTYPE_GRAY:
   1115     case COLORTYPE_CMYK:
   1116       sRet = sColor;
   1117       sRet.fColor1 /= fColorDevide;
   1118       sRet.fColor2 /= fColorDevide;
   1119       sRet.fColor3 /= fColorDevide;
   1120       sRet.fColor4 /= fColorDevide;
   1121       break;
   1122   }
   1123 
   1124   return sRet;
   1125 }
   1126 
   1127 CFX_ByteString CPWL_Utils::GetAppStream_Check(const CPDF_Rect& rcBBox,
   1128                                               const CPWL_Color& crText) {
   1129   CFX_ByteTextBuf sAP;
   1130   sAP << "q\n" << CPWL_Utils::GetColorAppStream(crText, TRUE)
   1131       << CPWL_Utils::GetAP_Check(rcBBox) << "f\nQ\n";
   1132   return sAP.GetByteString();
   1133 }
   1134 
   1135 CFX_ByteString CPWL_Utils::GetAppStream_Circle(const CPDF_Rect& rcBBox,
   1136                                                const CPWL_Color& crText) {
   1137   CFX_ByteTextBuf sAP;
   1138   sAP << "q\n" << CPWL_Utils::GetColorAppStream(crText, TRUE)
   1139       << CPWL_Utils::GetAP_Circle(rcBBox) << "f\nQ\n";
   1140   return sAP.GetByteString();
   1141 }
   1142 
   1143 CFX_ByteString CPWL_Utils::GetAppStream_Cross(const CPDF_Rect& rcBBox,
   1144                                               const CPWL_Color& crText) {
   1145   CFX_ByteTextBuf sAP;
   1146   sAP << "q\n" << CPWL_Utils::GetColorAppStream(crText, FALSE)
   1147       << CPWL_Utils::GetAP_Cross(rcBBox) << "S\nQ\n";
   1148   return sAP.GetByteString();
   1149 }
   1150 
   1151 CFX_ByteString CPWL_Utils::GetAppStream_Diamond(const CPDF_Rect& rcBBox,
   1152                                                 const CPWL_Color& crText) {
   1153   CFX_ByteTextBuf sAP;
   1154   sAP << "q\n1 w\n" << CPWL_Utils::GetColorAppStream(crText, TRUE)
   1155       << CPWL_Utils::GetAP_Diamond(rcBBox) << "f\nQ\n";
   1156   return sAP.GetByteString();
   1157 }
   1158 
   1159 CFX_ByteString CPWL_Utils::GetAppStream_Square(const CPDF_Rect& rcBBox,
   1160                                                const CPWL_Color& crText) {
   1161   CFX_ByteTextBuf sAP;
   1162   sAP << "q\n" << CPWL_Utils::GetColorAppStream(crText, TRUE)
   1163       << CPWL_Utils::GetAP_Square(rcBBox) << "f\nQ\n";
   1164   return sAP.GetByteString();
   1165 }
   1166 
   1167 CFX_ByteString CPWL_Utils::GetAppStream_Star(const CPDF_Rect& rcBBox,
   1168                                              const CPWL_Color& crText) {
   1169   CFX_ByteTextBuf sAP;
   1170   sAP << "q\n" << CPWL_Utils::GetColorAppStream(crText, TRUE)
   1171       << CPWL_Utils::GetAP_Star(rcBBox) << "f\nQ\n";
   1172   return sAP.GetByteString();
   1173 }
   1174 
   1175 CFX_ByteString CPWL_Utils::GetCheckBoxAppStream(const CPDF_Rect& rcBBox,
   1176                                                 int32_t nStyle,
   1177                                                 const CPWL_Color& crText) {
   1178   CPDF_Rect rcCenter = GetCenterSquare(rcBBox);
   1179   switch (nStyle) {
   1180     default:
   1181     case PCS_CHECK:
   1182       return GetAppStream_Check(rcCenter, crText);
   1183     case PCS_CIRCLE:
   1184       return GetAppStream_Circle(ScaleRect(rcCenter, 2.0f / 3.0f), crText);
   1185     case PCS_CROSS:
   1186       return GetAppStream_Cross(rcCenter, crText);
   1187     case PCS_DIAMOND:
   1188       return GetAppStream_Diamond(ScaleRect(rcCenter, 2.0f / 3.0f), crText);
   1189     case PCS_SQUARE:
   1190       return GetAppStream_Square(ScaleRect(rcCenter, 2.0f / 3.0f), crText);
   1191     case PCS_STAR:
   1192       return GetAppStream_Star(ScaleRect(rcCenter, 2.0f / 3.0f), crText);
   1193   }
   1194 }
   1195 
   1196 CFX_ByteString CPWL_Utils::GetRadioButtonAppStream(const CPDF_Rect& rcBBox,
   1197                                                    int32_t nStyle,
   1198                                                    const CPWL_Color& crText) {
   1199   CPDF_Rect rcCenter = GetCenterSquare(rcBBox);
   1200   switch (nStyle) {
   1201     default:
   1202     case PCS_CHECK:
   1203       return GetAppStream_Check(rcCenter, crText);
   1204     case PCS_CIRCLE:
   1205       return GetAppStream_Circle(ScaleRect(rcCenter, 1.0f / 2.0f), crText);
   1206     case PCS_CROSS:
   1207       return GetAppStream_Cross(rcCenter, crText);
   1208     case PCS_DIAMOND:
   1209       return GetAppStream_Diamond(ScaleRect(rcCenter, 2.0f / 3.0f), crText);
   1210     case PCS_SQUARE:
   1211       return GetAppStream_Square(ScaleRect(rcCenter, 2.0f / 3.0f), crText);
   1212     case PCS_STAR:
   1213       return GetAppStream_Star(ScaleRect(rcCenter, 2.0f / 3.0f), crText);
   1214   }
   1215 }
   1216 
   1217 CFX_ByteString CPWL_Utils::GetDropButtonAppStream(const CPDF_Rect& rcBBox) {
   1218   CFX_ByteTextBuf sAppStream;
   1219 
   1220   if (!rcBBox.IsEmpty()) {
   1221     sAppStream << "q\n" << CPWL_Utils::GetColorAppStream(
   1222                                CPWL_Color(COLORTYPE_RGB, 220.0f / 255.0f,
   1223                                           220.0f / 255.0f, 220.0f / 255.0f),
   1224                                TRUE);
   1225     sAppStream << rcBBox.left << " " << rcBBox.bottom << " "
   1226                << rcBBox.right - rcBBox.left << " "
   1227                << rcBBox.top - rcBBox.bottom << " re f\n";
   1228     sAppStream << "Q\n";
   1229 
   1230     sAppStream << "q\n" << CPWL_Utils::GetBorderAppStream(
   1231                                rcBBox, 2, CPWL_Color(COLORTYPE_GRAY, 0),
   1232                                CPWL_Color(COLORTYPE_GRAY, 1),
   1233                                CPWL_Color(COLORTYPE_GRAY, 0.5), PBS_BEVELED,
   1234                                CPWL_Dash(3, 0, 0))
   1235                << "Q\n";
   1236 
   1237     CPDF_Point ptCenter = CPDF_Point((rcBBox.left + rcBBox.right) / 2,
   1238                                      (rcBBox.top + rcBBox.bottom) / 2);
   1239     if (IsFloatBigger(rcBBox.right - rcBBox.left, 6) &&
   1240         IsFloatBigger(rcBBox.top - rcBBox.bottom, 6)) {
   1241       sAppStream << "q\n"
   1242                  << " 0 g\n";
   1243       sAppStream << ptCenter.x - 3 << " " << ptCenter.y + 1.5f << " m\n";
   1244       sAppStream << ptCenter.x + 3 << " " << ptCenter.y + 1.5f << " l\n";
   1245       sAppStream << ptCenter.x << " " << ptCenter.y - 1.5f << " l\n";
   1246       sAppStream << ptCenter.x - 3 << " " << ptCenter.y + 1.5f << " l f\n";
   1247       sAppStream << "Q\n";
   1248     }
   1249   }
   1250 
   1251   return sAppStream.GetByteString();
   1252 }
   1253 
   1254 void CPWL_Utils::ConvertCMYK2GRAY(FX_FLOAT dC,
   1255                                   FX_FLOAT dM,
   1256                                   FX_FLOAT dY,
   1257                                   FX_FLOAT dK,
   1258                                   FX_FLOAT& dGray) {
   1259   if (dC < 0 || dC > 1 || dM < 0 || dM > 1 || dY < 0 || dY > 1 || dK < 0 ||
   1260       dK > 1)
   1261     return;
   1262   dGray = 1.0f - std::min(1.0f, 0.3f * dC + 0.59f * dM + 0.11f * dY + dK);
   1263 }
   1264 
   1265 void CPWL_Utils::ConvertGRAY2CMYK(FX_FLOAT dGray,
   1266                                   FX_FLOAT& dC,
   1267                                   FX_FLOAT& dM,
   1268                                   FX_FLOAT& dY,
   1269                                   FX_FLOAT& dK) {
   1270   if (dGray < 0 || dGray > 1)
   1271     return;
   1272   dC = 0.0f;
   1273   dM = 0.0f;
   1274   dY = 0.0f;
   1275   dK = 1.0f - dGray;
   1276 }
   1277 
   1278 void CPWL_Utils::ConvertGRAY2RGB(FX_FLOAT dGray,
   1279                                  FX_FLOAT& dR,
   1280                                  FX_FLOAT& dG,
   1281                                  FX_FLOAT& dB) {
   1282   if (dGray < 0 || dGray > 1)
   1283     return;
   1284   dR = dGray;
   1285   dG = dGray;
   1286   dB = dGray;
   1287 }
   1288 
   1289 void CPWL_Utils::ConvertRGB2GRAY(FX_FLOAT dR,
   1290                                  FX_FLOAT dG,
   1291                                  FX_FLOAT dB,
   1292                                  FX_FLOAT& dGray) {
   1293   if (dR < 0 || dR > 1 || dG < 0 || dG > 0 || dB < 0 || dB > 1)
   1294     return;
   1295   dGray = 0.3f * dR + 0.59f * dG + 0.11f * dB;
   1296 }
   1297 
   1298 void CPWL_Utils::ConvertCMYK2RGB(FX_FLOAT dC,
   1299                                  FX_FLOAT dM,
   1300                                  FX_FLOAT dY,
   1301                                  FX_FLOAT dK,
   1302                                  FX_FLOAT& dR,
   1303                                  FX_FLOAT& dG,
   1304                                  FX_FLOAT& dB) {
   1305   if (dC < 0 || dC > 1 || dM < 0 || dM > 1 || dY < 0 || dY > 1 || dK < 0 ||
   1306       dK > 1)
   1307     return;
   1308   dR = 1.0f - std::min(1.0f, dC + dK);
   1309   dG = 1.0f - std::min(1.0f, dM + dK);
   1310   dB = 1.0f - std::min(1.0f, dY + dK);
   1311 }
   1312 
   1313 void CPWL_Utils::ConvertRGB2CMYK(FX_FLOAT dR,
   1314                                  FX_FLOAT dG,
   1315                                  FX_FLOAT dB,
   1316                                  FX_FLOAT& dC,
   1317                                  FX_FLOAT& dM,
   1318                                  FX_FLOAT& dY,
   1319                                  FX_FLOAT& dK) {
   1320   if (dR < 0 || dR > 1 || dG < 0 || dG > 1 || dB < 0 || dB > 1)
   1321     return;
   1322 
   1323   dC = 1.0f - dR;
   1324   dM = 1.0f - dG;
   1325   dY = 1.0f - dB;
   1326   dK = std::min(dC, std::min(dM, dY));
   1327 }
   1328 
   1329 void CPWL_Utils::PWLColorToARGB(const CPWL_Color& color,
   1330                                 int32_t& alpha,
   1331                                 FX_FLOAT& red,
   1332                                 FX_FLOAT& green,
   1333                                 FX_FLOAT& blue) {
   1334   switch (color.nColorType) {
   1335     case COLORTYPE_TRANSPARENT: {
   1336       alpha = 0;
   1337     } break;
   1338     case COLORTYPE_GRAY: {
   1339       ConvertGRAY2RGB(color.fColor1, red, green, blue);
   1340     } break;
   1341     case COLORTYPE_RGB: {
   1342       red = color.fColor1;
   1343       green = color.fColor2;
   1344       blue = color.fColor3;
   1345     } break;
   1346     case COLORTYPE_CMYK: {
   1347       ConvertCMYK2RGB(color.fColor1, color.fColor2, color.fColor3,
   1348                       color.fColor4, red, green, blue);
   1349     } break;
   1350   }
   1351 }
   1352 
   1353 FX_COLORREF CPWL_Utils::PWLColorToFXColor(const CPWL_Color& color,
   1354                                           int32_t nTransparancy) {
   1355   int32_t nAlpha = nTransparancy;
   1356   FX_FLOAT dRed = 0;
   1357   FX_FLOAT dGreen = 0;
   1358   FX_FLOAT dBlue = 0;
   1359 
   1360   PWLColorToARGB(color, nAlpha, dRed, dGreen, dBlue);
   1361 
   1362   return ArgbEncode(nAlpha, (int32_t)(dRed * 255), (int32_t)(dGreen * 255),
   1363                     (int32_t)(dBlue * 255));
   1364 }
   1365 
   1366 void CPWL_Utils::DrawFillRect(CFX_RenderDevice* pDevice,
   1367                               CFX_Matrix* pUser2Device,
   1368                               const CPDF_Rect& rect,
   1369                               const FX_COLORREF& color) {
   1370   CFX_PathData path;
   1371   CPDF_Rect rcTemp(rect);
   1372   path.AppendRect(rcTemp.left, rcTemp.bottom, rcTemp.right, rcTemp.top);
   1373   pDevice->DrawPath(&path, pUser2Device, NULL, color, 0, FXFILL_WINDING);
   1374 }
   1375 
   1376 void CPWL_Utils::DrawFillArea(CFX_RenderDevice* pDevice,
   1377                               CFX_Matrix* pUser2Device,
   1378                               const CPDF_Point* pPts,
   1379                               int32_t nCount,
   1380                               const FX_COLORREF& color) {
   1381   CFX_PathData path;
   1382   path.SetPointCount(nCount);
   1383 
   1384   path.SetPoint(0, pPts[0].x, pPts[0].y, FXPT_MOVETO);
   1385   for (int32_t i = 1; i < nCount; i++)
   1386     path.SetPoint(i, pPts[i].x, pPts[i].y, FXPT_LINETO);
   1387 
   1388   pDevice->DrawPath(&path, pUser2Device, NULL, color, 0, FXFILL_ALTERNATE);
   1389 }
   1390 
   1391 void CPWL_Utils::DrawStrokeRect(CFX_RenderDevice* pDevice,
   1392                                 CFX_Matrix* pUser2Device,
   1393                                 const CPDF_Rect& rect,
   1394                                 const FX_COLORREF& color,
   1395                                 FX_FLOAT fWidth) {
   1396   CFX_PathData path;
   1397   CPDF_Rect rcTemp(rect);
   1398   path.AppendRect(rcTemp.left, rcTemp.bottom, rcTemp.right, rcTemp.top);
   1399 
   1400   CFX_GraphStateData gsd;
   1401   gsd.m_LineWidth = fWidth;
   1402 
   1403   pDevice->DrawPath(&path, pUser2Device, &gsd, 0, color, FXFILL_ALTERNATE);
   1404 }
   1405 
   1406 void CPWL_Utils::DrawStrokeLine(CFX_RenderDevice* pDevice,
   1407                                 CFX_Matrix* pUser2Device,
   1408                                 const CPDF_Point& ptMoveTo,
   1409                                 const CPDF_Point& ptLineTo,
   1410                                 const FX_COLORREF& color,
   1411                                 FX_FLOAT fWidth) {
   1412   CFX_PathData path;
   1413   path.SetPointCount(2);
   1414   path.SetPoint(0, ptMoveTo.x, ptMoveTo.y, FXPT_MOVETO);
   1415   path.SetPoint(1, ptLineTo.x, ptLineTo.y, FXPT_LINETO);
   1416 
   1417   CFX_GraphStateData gsd;
   1418   gsd.m_LineWidth = fWidth;
   1419 
   1420   pDevice->DrawPath(&path, pUser2Device, &gsd, 0, color, FXFILL_ALTERNATE);
   1421 }
   1422 
   1423 void CPWL_Utils::DrawFillRect(CFX_RenderDevice* pDevice,
   1424                               CFX_Matrix* pUser2Device,
   1425                               const CPDF_Rect& rect,
   1426                               const CPWL_Color& color,
   1427                               int32_t nTransparancy) {
   1428   CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rect,
   1429                            PWLColorToFXColor(color, nTransparancy));
   1430 }
   1431 
   1432 void CPWL_Utils::DrawShadow(CFX_RenderDevice* pDevice,
   1433                             CFX_Matrix* pUser2Device,
   1434                             FX_BOOL bVertical,
   1435                             FX_BOOL bHorizontal,
   1436                             CPDF_Rect rect,
   1437                             int32_t nTransparancy,
   1438                             int32_t nStartGray,
   1439                             int32_t nEndGray) {
   1440   FX_FLOAT fStepGray = 1.0f;
   1441 
   1442   if (bVertical) {
   1443     fStepGray = (nEndGray - nStartGray) / rect.Height();
   1444 
   1445     for (FX_FLOAT fy = rect.bottom + 0.5f; fy <= rect.top - 0.5f; fy += 1.0f) {
   1446       int32_t nGray = nStartGray + (int32_t)(fStepGray * (fy - rect.bottom));
   1447       CPWL_Utils::DrawStrokeLine(
   1448           pDevice, pUser2Device, CPDF_Point(rect.left, fy),
   1449           CPDF_Point(rect.right, fy),
   1450           ArgbEncode(nTransparancy, nGray, nGray, nGray), 1.5f);
   1451     }
   1452   }
   1453 
   1454   if (bHorizontal) {
   1455     fStepGray = (nEndGray - nStartGray) / rect.Width();
   1456 
   1457     for (FX_FLOAT fx = rect.left + 0.5f; fx <= rect.right - 0.5f; fx += 1.0f) {
   1458       int32_t nGray = nStartGray + (int32_t)(fStepGray * (fx - rect.left));
   1459       CPWL_Utils::DrawStrokeLine(
   1460           pDevice, pUser2Device, CPDF_Point(fx, rect.bottom),
   1461           CPDF_Point(fx, rect.top),
   1462           ArgbEncode(nTransparancy, nGray, nGray, nGray), 1.5f);
   1463     }
   1464   }
   1465 }
   1466 
   1467 void CPWL_Utils::DrawBorder(CFX_RenderDevice* pDevice,
   1468                             CFX_Matrix* pUser2Device,
   1469                             const CPDF_Rect& rect,
   1470                             FX_FLOAT fWidth,
   1471                             const CPWL_Color& color,
   1472                             const CPWL_Color& crLeftTop,
   1473                             const CPWL_Color& crRightBottom,
   1474                             int32_t nStyle,
   1475                             int32_t nTransparancy) {
   1476   FX_FLOAT fLeft = rect.left;
   1477   FX_FLOAT fRight = rect.right;
   1478   FX_FLOAT fTop = rect.top;
   1479   FX_FLOAT fBottom = rect.bottom;
   1480 
   1481   if (fWidth > 0.0f) {
   1482     FX_FLOAT fHalfWidth = fWidth / 2.0f;
   1483 
   1484     switch (nStyle) {
   1485       default:
   1486       case PBS_SOLID: {
   1487         CFX_PathData path;
   1488         path.AppendRect(fLeft, fBottom, fRight, fTop);
   1489         path.AppendRect(fLeft + fWidth, fBottom + fWidth, fRight - fWidth,
   1490                         fTop - fWidth);
   1491         pDevice->DrawPath(&path, pUser2Device, NULL,
   1492                           PWLColorToFXColor(color, nTransparancy), 0,
   1493                           FXFILL_ALTERNATE);
   1494       } break;
   1495       case PBS_DASH: {
   1496         CFX_PathData path;
   1497 
   1498         path.SetPointCount(5);
   1499         path.SetPoint(0, fLeft + fWidth / 2.0f, fBottom + fWidth / 2.0f,
   1500                       FXPT_MOVETO);
   1501         path.SetPoint(1, fLeft + fWidth / 2.0f, fTop - fWidth / 2.0f,
   1502                       FXPT_LINETO);
   1503         path.SetPoint(2, fRight - fWidth / 2.0f, fTop - fWidth / 2.0f,
   1504                       FXPT_LINETO);
   1505         path.SetPoint(3, fRight - fWidth / 2.0f, fBottom + fWidth / 2.0f,
   1506                       FXPT_LINETO);
   1507         path.SetPoint(4, fLeft + fWidth / 2.0f, fBottom + fWidth / 2.0f,
   1508                       FXPT_LINETO);
   1509 
   1510         CFX_GraphStateData gsd;
   1511         gsd.SetDashCount(2);
   1512         gsd.m_DashArray[0] = 3.0f;
   1513         gsd.m_DashArray[1] = 3.0f;
   1514         gsd.m_DashPhase = 0;
   1515 
   1516         gsd.m_LineWidth = fWidth;
   1517         pDevice->DrawPath(&path, pUser2Device, &gsd, 0,
   1518                           PWLColorToFXColor(color, nTransparancy),
   1519                           FXFILL_WINDING);
   1520       } break;
   1521       case PBS_BEVELED:
   1522       case PBS_INSET: {
   1523         CFX_GraphStateData gsd;
   1524         gsd.m_LineWidth = fHalfWidth;
   1525 
   1526         CFX_PathData pathLT;
   1527 
   1528         pathLT.SetPointCount(7);
   1529         pathLT.SetPoint(0, fLeft + fHalfWidth, fBottom + fHalfWidth,
   1530                         FXPT_MOVETO);
   1531         pathLT.SetPoint(1, fLeft + fHalfWidth, fTop - fHalfWidth, FXPT_LINETO);
   1532         pathLT.SetPoint(2, fRight - fHalfWidth, fTop - fHalfWidth, FXPT_LINETO);
   1533         pathLT.SetPoint(3, fRight - fHalfWidth * 2, fTop - fHalfWidth * 2,
   1534                         FXPT_LINETO);
   1535         pathLT.SetPoint(4, fLeft + fHalfWidth * 2, fTop - fHalfWidth * 2,
   1536                         FXPT_LINETO);
   1537         pathLT.SetPoint(5, fLeft + fHalfWidth * 2, fBottom + fHalfWidth * 2,
   1538                         FXPT_LINETO);
   1539         pathLT.SetPoint(6, fLeft + fHalfWidth, fBottom + fHalfWidth,
   1540                         FXPT_LINETO);
   1541 
   1542         pDevice->DrawPath(&pathLT, pUser2Device, &gsd,
   1543                           PWLColorToFXColor(crLeftTop, nTransparancy), 0,
   1544                           FXFILL_ALTERNATE);
   1545 
   1546         CFX_PathData pathRB;
   1547 
   1548         pathRB.SetPointCount(7);
   1549         pathRB.SetPoint(0, fRight - fHalfWidth, fTop - fHalfWidth, FXPT_MOVETO);
   1550         pathRB.SetPoint(1, fRight - fHalfWidth, fBottom + fHalfWidth,
   1551                         FXPT_LINETO);
   1552         pathRB.SetPoint(2, fLeft + fHalfWidth, fBottom + fHalfWidth,
   1553                         FXPT_LINETO);
   1554         pathRB.SetPoint(3, fLeft + fHalfWidth * 2, fBottom + fHalfWidth * 2,
   1555                         FXPT_LINETO);
   1556         pathRB.SetPoint(4, fRight - fHalfWidth * 2, fBottom + fHalfWidth * 2,
   1557                         FXPT_LINETO);
   1558         pathRB.SetPoint(5, fRight - fHalfWidth * 2, fTop - fHalfWidth * 2,
   1559                         FXPT_LINETO);
   1560         pathRB.SetPoint(6, fRight - fHalfWidth, fTop - fHalfWidth, FXPT_LINETO);
   1561 
   1562         pDevice->DrawPath(&pathRB, pUser2Device, &gsd,
   1563                           PWLColorToFXColor(crRightBottom, nTransparancy), 0,
   1564                           FXFILL_ALTERNATE);
   1565 
   1566         CFX_PathData path;
   1567 
   1568         path.AppendRect(fLeft, fBottom, fRight, fTop);
   1569         path.AppendRect(fLeft + fHalfWidth, fBottom + fHalfWidth,
   1570                         fRight - fHalfWidth, fTop - fHalfWidth);
   1571 
   1572         pDevice->DrawPath(&path, pUser2Device, &gsd,
   1573                           PWLColorToFXColor(color, nTransparancy), 0,
   1574                           FXFILL_ALTERNATE);
   1575       } break;
   1576       case PBS_UNDERLINED: {
   1577         CFX_PathData path;
   1578 
   1579         path.SetPointCount(2);
   1580         path.SetPoint(0, fLeft, fBottom + fWidth / 2, FXPT_MOVETO);
   1581         path.SetPoint(1, fRight, fBottom + fWidth / 2, FXPT_LINETO);
   1582 
   1583         CFX_GraphStateData gsd;
   1584         gsd.m_LineWidth = fWidth;
   1585 
   1586         pDevice->DrawPath(&path, pUser2Device, &gsd, 0,
   1587                           PWLColorToFXColor(color, nTransparancy),
   1588                           FXFILL_ALTERNATE);
   1589       } break;
   1590       case PBS_SHADOW: {
   1591         CFX_PathData path;
   1592         path.AppendRect(fLeft, fBottom, fRight, fTop);
   1593         path.AppendRect(fLeft + fWidth, fBottom + fWidth, fRight - fWidth,
   1594                         fTop - fWidth);
   1595         pDevice->DrawPath(&path, pUser2Device, NULL,
   1596                           PWLColorToFXColor(color, nTransparancy / 2), 0,
   1597                           FXFILL_ALTERNATE);
   1598       } break;
   1599     }
   1600   }
   1601 }
   1602 
   1603 static void AddSquigglyPath(CFX_PathData& PathData,
   1604                             FX_FLOAT fStartX,
   1605                             FX_FLOAT fEndX,
   1606                             FX_FLOAT fY,
   1607                             FX_FLOAT fStep) {
   1608   PathData.AddPointCount(1);
   1609   PathData.SetPoint(PathData.GetPointCount() - 1, fStartX, fY, FXPT_MOVETO);
   1610 
   1611   FX_FLOAT fx;
   1612   int32_t i;
   1613 
   1614   for (i = 1, fx = fStartX + fStep; fx < fEndX; fx += fStep, i++) {
   1615     PathData.AddPointCount(1);
   1616     PathData.SetPoint(PathData.GetPointCount() - 1, fx, fY + (i & 1) * fStep,
   1617                       FXPT_LINETO);
   1618   }
   1619 }
   1620 
   1621 static void AddSpellCheckObj(CFX_PathData& PathData,
   1622                              IFX_Edit* pEdit,
   1623                              const CPVT_WordRange& wrWord) {
   1624   FX_FLOAT fStartX = 0.0f;
   1625   FX_FLOAT fEndX = 0.0f;
   1626   FX_FLOAT fY = 0.0f;
   1627   FX_FLOAT fStep = 0.0f;
   1628 
   1629   FX_BOOL bBreak = FALSE;
   1630 
   1631   if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator()) {
   1632     pIterator->SetAt(wrWord.BeginPos);
   1633 
   1634     do {
   1635       CPVT_WordPlace place = pIterator->GetAt();
   1636 
   1637       CPVT_Line line;
   1638       if (pIterator->GetLine(line)) {
   1639         fY = line.ptLine.y;
   1640         fStep = (line.fLineAscent - line.fLineDescent) / 16.0f;
   1641       }
   1642 
   1643       if (place.LineCmp(wrWord.BeginPos) == 0) {
   1644         pIterator->SetAt(wrWord.BeginPos);
   1645         CPVT_Word word;
   1646         if (pIterator->GetWord(word)) {
   1647           fStartX = word.ptWord.x;
   1648         }
   1649       } else {
   1650         fStartX = line.ptLine.x;
   1651       }
   1652 
   1653       if (place.LineCmp(wrWord.EndPos) == 0) {
   1654         pIterator->SetAt(wrWord.EndPos);
   1655         CPVT_Word word;
   1656         if (pIterator->GetWord(word)) {
   1657           fEndX = word.ptWord.x + word.fWidth;
   1658         }
   1659 
   1660         bBreak = TRUE;
   1661       } else {
   1662         fEndX = line.ptLine.x + line.fLineWidth;
   1663       }
   1664 
   1665       AddSquigglyPath(PathData, fStartX, fEndX, fY, fStep);
   1666 
   1667       if (bBreak)
   1668         break;
   1669     } while (pIterator->NextLine());
   1670   }
   1671 }
   1672 
   1673 void CPWL_Utils::DrawEditSpellCheck(CFX_RenderDevice* pDevice,
   1674                                     CFX_Matrix* pUser2Device,
   1675                                     IFX_Edit* pEdit,
   1676                                     const CPDF_Rect& rcClip,
   1677                                     const CPDF_Point& ptOffset,
   1678                                     const CPVT_WordRange* pRange,
   1679                                     IPWL_SpellCheck* pSpellCheck) {
   1680   const FX_COLORREF crSpell = ArgbEncode(255, 255, 0, 0);
   1681 
   1682   // for spellcheck
   1683   FX_BOOL bLatinWord = FALSE;
   1684   CPVT_WordPlace wpWordStart;
   1685   CFX_ByteString sLatinWord;
   1686 
   1687   CFX_PathData pathSpell;
   1688 
   1689   pDevice->SaveState();
   1690 
   1691   if (!rcClip.IsEmpty()) {
   1692     CPDF_Rect rcTemp = rcClip;
   1693     pUser2Device->TransformRect(rcTemp);
   1694     FX_RECT rcDevClip;
   1695     rcDevClip.left = (int32_t)rcTemp.left;
   1696     rcDevClip.right = (int32_t)rcTemp.right;
   1697     rcDevClip.top = (int32_t)rcTemp.top;
   1698     rcDevClip.bottom = (int32_t)rcTemp.bottom;
   1699     pDevice->SetClip_Rect(&rcDevClip);
   1700   }
   1701 
   1702   if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator()) {
   1703     if (pEdit->GetFontMap()) {
   1704       if (pRange)
   1705         pIterator->SetAt(pRange->BeginPos);
   1706       else
   1707         pIterator->SetAt(0);
   1708 
   1709       CPVT_WordPlace oldplace;
   1710 
   1711       while (pIterator->NextWord()) {
   1712         CPVT_WordPlace place = pIterator->GetAt();
   1713         if (pRange && place.WordCmp(pRange->EndPos) > 0)
   1714           break;
   1715 
   1716         CPVT_Word word;
   1717         if (pIterator->GetWord(word)) {
   1718           if (FX_EDIT_ISLATINWORD(word.Word)) {
   1719             if (!bLatinWord) {
   1720               wpWordStart = place;
   1721               bLatinWord = TRUE;
   1722             }
   1723 
   1724             sLatinWord += (char)word.Word;
   1725           } else {
   1726             if (bLatinWord) {
   1727               if (!sLatinWord.IsEmpty()) {
   1728                 if (pSpellCheck && !pSpellCheck->CheckWord(sLatinWord)) {
   1729                   AddSpellCheckObj(pathSpell, pEdit,
   1730                                    CPVT_WordRange(wpWordStart, oldplace));
   1731                   pIterator->SetAt(place);
   1732                 }
   1733               }
   1734               bLatinWord = FALSE;
   1735             }
   1736 
   1737             sLatinWord.Empty();
   1738           }
   1739 
   1740           oldplace = place;
   1741         } else {
   1742           if (bLatinWord) {
   1743             if (!sLatinWord.IsEmpty()) {
   1744               if (pSpellCheck && !pSpellCheck->CheckWord(sLatinWord)) {
   1745                 AddSpellCheckObj(pathSpell, pEdit,
   1746                                  CPVT_WordRange(wpWordStart, oldplace));
   1747                 pIterator->SetAt(place);
   1748               }
   1749             }
   1750             bLatinWord = FALSE;
   1751           }
   1752 
   1753           sLatinWord.Empty();
   1754         }
   1755       }
   1756 
   1757       if (!sLatinWord.IsEmpty()) {
   1758         if (pSpellCheck && !pSpellCheck->CheckWord(sLatinWord)) {
   1759           AddSpellCheckObj(pathSpell, pEdit,
   1760                            CPVT_WordRange(wpWordStart, oldplace));
   1761         }
   1762       }
   1763     }
   1764   }
   1765 
   1766   CFX_GraphStateData gsd;
   1767   gsd.m_LineWidth = 0;
   1768   if (pathSpell.GetPointCount() > 0)
   1769     pDevice->DrawPath(&pathSpell, pUser2Device, &gsd, 0, crSpell,
   1770                       FXFILL_ALTERNATE);
   1771 
   1772   pDevice->RestoreState();
   1773 }
   1774 
   1775 FX_BOOL CPWL_Utils::IsBlackOrWhite(const CPWL_Color& color) {
   1776   switch (color.nColorType) {
   1777     case COLORTYPE_TRANSPARENT:
   1778       return FALSE;
   1779     case COLORTYPE_GRAY:
   1780       return color.fColor1 < 0.5f;
   1781     case COLORTYPE_RGB:
   1782       return color.fColor1 + color.fColor2 + color.fColor3 < 1.5f;
   1783     case COLORTYPE_CMYK:
   1784       return color.fColor1 + color.fColor2 + color.fColor3 + color.fColor4 >
   1785              2.0f;
   1786   }
   1787 
   1788   return TRUE;
   1789 }
   1790 
   1791 CPWL_Color CPWL_Utils::GetReverseColor(const CPWL_Color& color) {
   1792   CPWL_Color crRet = color;
   1793 
   1794   switch (color.nColorType) {
   1795     case COLORTYPE_GRAY:
   1796       crRet.fColor1 = 1.0f - crRet.fColor1;
   1797       break;
   1798     case COLORTYPE_RGB:
   1799       crRet.fColor1 = 1.0f - crRet.fColor1;
   1800       crRet.fColor2 = 1.0f - crRet.fColor2;
   1801       crRet.fColor3 = 1.0f - crRet.fColor3;
   1802       break;
   1803     case COLORTYPE_CMYK:
   1804       crRet.fColor1 = 1.0f - crRet.fColor1;
   1805       crRet.fColor2 = 1.0f - crRet.fColor2;
   1806       crRet.fColor3 = 1.0f - crRet.fColor3;
   1807       crRet.fColor4 = 1.0f - crRet.fColor4;
   1808       break;
   1809   }
   1810 
   1811   return crRet;
   1812 }
   1813 
   1814 CFX_ByteString CPWL_Utils::GetIconAppStream(int32_t nType,
   1815                                             const CPDF_Rect& rect,
   1816                                             const CPWL_Color& crFill,
   1817                                             const CPWL_Color& crStroke) {
   1818   CFX_ByteString sAppStream = CPWL_Utils::GetColorAppStream(crStroke, FALSE);
   1819   sAppStream += CPWL_Utils::GetColorAppStream(crFill, TRUE);
   1820 
   1821   CFX_ByteString sPath;
   1822   CFX_PathData path;
   1823 
   1824   switch (nType) {
   1825     case PWL_ICONTYPE_CHECKMARK:
   1826       GetGraphics_Checkmark(sPath, path, rect, PWLPT_STREAM);
   1827       break;
   1828     case PWL_ICONTYPE_CIRCLE:
   1829       GetGraphics_Circle(sPath, path, rect, PWLPT_STREAM);
   1830       break;
   1831     case PWL_ICONTYPE_COMMENT:
   1832       GetGraphics_Comment(sPath, path, rect, PWLPT_STREAM);
   1833       break;
   1834     case PWL_ICONTYPE_CROSS:
   1835       GetGraphics_Cross(sPath, path, rect, PWLPT_STREAM);
   1836       break;
   1837     case PWL_ICONTYPE_HELP:
   1838       GetGraphics_Help(sPath, path, rect, PWLPT_STREAM);
   1839       break;
   1840     case PWL_ICONTYPE_INSERTTEXT:
   1841       GetGraphics_InsertText(sPath, path, rect, PWLPT_STREAM);
   1842       break;
   1843     case PWL_ICONTYPE_KEY:
   1844       GetGraphics_Key(sPath, path, rect, PWLPT_STREAM);
   1845       break;
   1846     case PWL_ICONTYPE_NEWPARAGRAPH:
   1847       GetGraphics_NewParagraph(sPath, path, rect, PWLPT_STREAM);
   1848       break;
   1849     case PWL_ICONTYPE_TEXTNOTE:
   1850       GetGraphics_TextNote(sPath, path, rect, PWLPT_STREAM);
   1851       break;
   1852     case PWL_ICONTYPE_PARAGRAPH:
   1853       GetGraphics_Paragraph(sPath, path, rect, PWLPT_STREAM);
   1854       break;
   1855     case PWL_ICONTYPE_RIGHTARROW:
   1856       GetGraphics_RightArrow(sPath, path, rect, PWLPT_STREAM);
   1857       break;
   1858     case PWL_ICONTYPE_RIGHTPOINTER:
   1859       GetGraphics_RightPointer(sPath, path, rect, PWLPT_STREAM);
   1860       break;
   1861     case PWL_ICONTYPE_STAR:
   1862       GetGraphics_Star(sPath, path, rect, PWLPT_STREAM);
   1863       break;
   1864     case PWL_ICONTYPE_UPARROW:
   1865       GetGraphics_UpArrow(sPath, path, rect, PWLPT_STREAM);
   1866       break;
   1867     case PWL_ICONTYPE_UPLEFTARROW:
   1868       GetGraphics_UpLeftArrow(sPath, path, rect, PWLPT_STREAM);
   1869       break;
   1870     case PWL_ICONTYPE_GRAPH:
   1871       GetGraphics_Graph(sPath, path, rect, PWLPT_STREAM);
   1872       break;
   1873     case PWL_ICONTYPE_PAPERCLIP:
   1874       GetGraphics_Paperclip(sPath, path, rect, PWLPT_STREAM);
   1875       break;
   1876     case PWL_ICONTYPE_ATTACHMENT:
   1877       GetGraphics_Attachment(sPath, path, rect, PWLPT_STREAM);
   1878       break;
   1879     case PWL_ICONTYPE_TAG:
   1880       GetGraphics_Tag(sPath, path, rect, PWLPT_STREAM);
   1881       break;
   1882     case PWL_ICONTYPE_FOXIT:
   1883       GetGraphics_Foxit(sPath, path, rect, PWLPT_STREAM);
   1884       break;
   1885   }
   1886 
   1887   sAppStream += sPath;
   1888   if (crStroke.nColorType != COLORTYPE_TRANSPARENT)
   1889     sAppStream += "B*\n";
   1890   else
   1891     sAppStream += "f*\n";
   1892 
   1893   return sAppStream;
   1894 }
   1895 
   1896 void CPWL_Utils::DrawIconAppStream(CFX_RenderDevice* pDevice,
   1897                                    CFX_Matrix* pUser2Device,
   1898                                    int32_t nType,
   1899                                    const CPDF_Rect& rect,
   1900                                    const CPWL_Color& crFill,
   1901                                    const CPWL_Color& crStroke,
   1902                                    const int32_t nTransparancy) {
   1903   CFX_GraphStateData gsd;
   1904   gsd.m_LineWidth = 1.0f;
   1905 
   1906   CFX_ByteString sPath;
   1907   CFX_PathData path;
   1908 
   1909   switch (nType) {
   1910     case PWL_ICONTYPE_CHECKMARK:
   1911       GetGraphics_Checkmark(sPath, path, rect, PWLPT_PATHDATA);
   1912       break;
   1913     case PWL_ICONTYPE_CIRCLE:
   1914       GetGraphics_Circle(sPath, path, rect, PWLPT_PATHDATA);
   1915       break;
   1916     case PWL_ICONTYPE_COMMENT:
   1917       GetGraphics_Comment(sPath, path, rect, PWLPT_PATHDATA);
   1918       break;
   1919     case PWL_ICONTYPE_CROSS:
   1920       GetGraphics_Cross(sPath, path, rect, PWLPT_PATHDATA);
   1921       break;
   1922     case PWL_ICONTYPE_HELP:
   1923       GetGraphics_Help(sPath, path, rect, PWLPT_PATHDATA);
   1924       break;
   1925     case PWL_ICONTYPE_INSERTTEXT:
   1926       GetGraphics_InsertText(sPath, path, rect, PWLPT_PATHDATA);
   1927       break;
   1928     case PWL_ICONTYPE_KEY:
   1929       GetGraphics_Key(sPath, path, rect, PWLPT_PATHDATA);
   1930       break;
   1931     case PWL_ICONTYPE_NEWPARAGRAPH:
   1932       GetGraphics_NewParagraph(sPath, path, rect, PWLPT_PATHDATA);
   1933       break;
   1934     case PWL_ICONTYPE_TEXTNOTE:
   1935       GetGraphics_TextNote(sPath, path, rect, PWLPT_PATHDATA);
   1936       break;
   1937     case PWL_ICONTYPE_PARAGRAPH:
   1938       GetGraphics_Paragraph(sPath, path, rect, PWLPT_PATHDATA);
   1939       break;
   1940     case PWL_ICONTYPE_RIGHTARROW:
   1941       GetGraphics_RightArrow(sPath, path, rect, PWLPT_PATHDATA);
   1942       break;
   1943     case PWL_ICONTYPE_RIGHTPOINTER:
   1944       GetGraphics_RightPointer(sPath, path, rect, PWLPT_PATHDATA);
   1945       break;
   1946     case PWL_ICONTYPE_STAR:
   1947       GetGraphics_Star(sPath, path, rect, PWLPT_PATHDATA);
   1948       break;
   1949     case PWL_ICONTYPE_UPARROW:
   1950       GetGraphics_UpArrow(sPath, path, rect, PWLPT_PATHDATA);
   1951       break;
   1952     case PWL_ICONTYPE_UPLEFTARROW:
   1953       GetGraphics_UpLeftArrow(sPath, path, rect, PWLPT_PATHDATA);
   1954       break;
   1955     case PWL_ICONTYPE_GRAPH:
   1956       GetGraphics_Graph(sPath, path, rect, PWLPT_PATHDATA);
   1957       break;
   1958     case PWL_ICONTYPE_PAPERCLIP:
   1959       GetGraphics_Paperclip(sPath, path, rect, PWLPT_PATHDATA);
   1960       break;
   1961     case PWL_ICONTYPE_ATTACHMENT:
   1962       GetGraphics_Attachment(sPath, path, rect, PWLPT_PATHDATA);
   1963       break;
   1964     case PWL_ICONTYPE_TAG:
   1965       GetGraphics_Tag(sPath, path, rect, PWLPT_PATHDATA);
   1966       break;
   1967     case PWL_ICONTYPE_FOXIT:
   1968       GetGraphics_Foxit(sPath, path, rect, PWLPT_PATHDATA);
   1969       break;
   1970     default:
   1971       return;
   1972   }
   1973 
   1974   pDevice->DrawPath(
   1975       &path, pUser2Device, &gsd, PWLColorToFXColor(crFill, nTransparancy),
   1976       PWLColorToFXColor(crStroke, nTransparancy), FXFILL_ALTERNATE);
   1977 }
   1978 
   1979 void CPWL_Utils::GetGraphics_Checkmark(CFX_ByteString& sPathData,
   1980                                        CFX_PathData& path,
   1981                                        const CPDF_Rect& crBBox,
   1982                                        const PWL_PATH_TYPE type) {
   1983   FX_FLOAT fWidth = crBBox.right - crBBox.left;
   1984   FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
   1985 
   1986   CPWL_PathData PathArray[] = {
   1987       CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 15.0f,
   1988                                crBBox.bottom + fHeight * 2 / 5.0f),
   1989                     PWLPT_MOVETO),
   1990       CPWL_PathData(
   1991           CPWL_Point(
   1992               crBBox.left + fWidth / 15.0f +
   1993                   PWL_BEZIER * (fWidth / 7.0f - fWidth / 15.0f),
   1994               crBBox.bottom + fHeight * 2 / 5.0f +
   1995                   PWL_BEZIER * (fHeight * 2 / 7.0f - fHeight * 2 / 5.0f)),
   1996           PWLPT_BEZIERTO),
   1997       CPWL_PathData(
   1998           CPWL_Point(crBBox.left + fWidth / 4.5f +
   1999                          PWL_BEZIER * (fWidth / 5.0f - fWidth / 4.5f),
   2000                      crBBox.bottom + fHeight / 16.0f +
   2001                          PWL_BEZIER * (fHeight / 5.0f - fHeight / 16.0f)),
   2002           PWLPT_BEZIERTO),
   2003       CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 4.5f,
   2004                                crBBox.bottom + fHeight / 16.0f),
   2005                     PWLPT_BEZIERTO),
   2006       CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 4.5f +
   2007                                    PWL_BEZIER * (fWidth / 4.4f - fWidth / 4.5f),
   2008                                crBBox.bottom + fHeight / 16.0f -
   2009                                    PWL_BEZIER * fHeight / 16.0f),
   2010                     PWLPT_BEZIERTO),
   2011       CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 3.0f +
   2012                                    PWL_BEZIER * (fWidth / 4.0f - fWidth / 3.0f),
   2013                                crBBox.bottom),
   2014                     PWLPT_BEZIERTO),
   2015       CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 3.0f, crBBox.bottom),
   2016                     PWLPT_BEZIERTO),
   2017       CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 3.0f +
   2018                                    PWL_BEZIER * fWidth * (1 / 7.0f + 2 / 15.0f),
   2019                                crBBox.bottom + PWL_BEZIER * fHeight * 4 / 5.0f),
   2020                     PWLPT_BEZIERTO),
   2021       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 14 / 15.0f +
   2022                                    PWL_BEZIER * fWidth * (1 / 7.0f - 7 / 15.0f),
   2023                                crBBox.bottom + fHeight * 15 / 16.0f +
   2024                                    PWL_BEZIER * (fHeight * 4 / 5.0f -
   2025                                                  fHeight * 15 / 16.0f)),
   2026                     PWLPT_BEZIERTO),
   2027       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 14 / 15.0f,
   2028                                crBBox.bottom + fHeight * 15 / 16.0f),
   2029                     PWLPT_BEZIERTO),
   2030       CPWL_PathData(
   2031           CPWL_Point(
   2032               crBBox.left + fWidth * 14 / 15.0f +
   2033                   PWL_BEZIER * (fWidth * 7 / 15.0f - fWidth * 14 / 15.0f),
   2034               crBBox.bottom + fHeight * 15 / 16.0f +
   2035                   PWL_BEZIER * (fHeight * 8 / 7.0f - fHeight * 15 / 16.0f)),
   2036           PWLPT_BEZIERTO),
   2037       CPWL_PathData(
   2038           CPWL_Point(crBBox.left + fWidth / 3.6f +
   2039                          PWL_BEZIER * (fWidth / 3.4f - fWidth / 3.6f),
   2040                      crBBox.bottom + fHeight / 3.5f +
   2041                          PWL_BEZIER * (fHeight / 3.5f - fHeight / 3.5f)),
   2042           PWLPT_BEZIERTO),
   2043       CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 3.6f,
   2044                                crBBox.bottom + fHeight / 3.5f),
   2045                     PWLPT_BEZIERTO),
   2046       CPWL_PathData(
   2047           CPWL_Point(crBBox.left + fWidth / 3.6f,
   2048                      crBBox.bottom + fHeight / 3.5f +
   2049                          PWL_BEZIER * (fHeight / 4.0f - fHeight / 3.5f)),
   2050           PWLPT_BEZIERTO),
   2051       CPWL_PathData(
   2052           CPWL_Point(
   2053               crBBox.left + fWidth / 15.0f +
   2054                   PWL_BEZIER * (fWidth / 3.5f - fWidth / 15.0f),
   2055               crBBox.bottom + fHeight * 2 / 5.0f +
   2056                   PWL_BEZIER * (fHeight * 3.5f / 5.0f - fHeight * 2 / 5.0f)),
   2057           PWLPT_BEZIERTO),
   2058       CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 15.0f,
   2059                                crBBox.bottom + fHeight * 2 / 5.0f),
   2060                     PWLPT_BEZIERTO)};
   2061 
   2062   if (type == PWLPT_STREAM)
   2063     sPathData = GetAppStreamFromArray(PathArray, 16);
   2064   else
   2065     GetPathDataFromArray(path, PathArray, 16);
   2066 }
   2067 
   2068 void CPWL_Utils::GetGraphics_Circle(CFX_ByteString& sPathData,
   2069                                     CFX_PathData& path,
   2070                                     const CPDF_Rect& crBBox,
   2071                                     const PWL_PATH_TYPE type) {
   2072   FX_FLOAT fWidth = crBBox.right - crBBox.left;
   2073   FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
   2074 
   2075   CPWL_PathData PathArray[] = {
   2076       CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 15.0f,
   2077                                crBBox.bottom + fHeight / 2.0f),
   2078                     PWLPT_MOVETO),
   2079       CPWL_PathData(
   2080           CPWL_Point(crBBox.left + fWidth / 15.0f,
   2081                      crBBox.bottom + fHeight / 2.0f +
   2082                          PWL_BEZIER * (fHeight * 14 / 15.0f - fHeight / 2.0f)),
   2083           PWLPT_BEZIERTO),
   2084       CPWL_PathData(
   2085           CPWL_Point(crBBox.left + fWidth / 2.0f -
   2086                          PWL_BEZIER * (fWidth / 2.0f - fWidth / 15.0f),
   2087                      crBBox.top - fHeight / 15.0f),
   2088           PWLPT_BEZIERTO),
   2089       CPWL_PathData(
   2090           CPWL_Point(crBBox.left + fWidth / 2.0f, crBBox.top - fHeight / 15.0f),
   2091           PWLPT_BEZIERTO),
   2092       CPWL_PathData(
   2093           CPWL_Point(crBBox.left + fWidth / 2.0f +
   2094                          PWL_BEZIER * (fWidth * 14 / 15.0f - fWidth / 2.0f),
   2095                      crBBox.top - fHeight / 15.0f),
   2096           PWLPT_BEZIERTO),
   2097       CPWL_PathData(
   2098           CPWL_Point(crBBox.right - fWidth / 15.0f,
   2099                      crBBox.bottom + fHeight / 2.0f +
   2100                          PWL_BEZIER * (fHeight * 14 / 15.0f - fHeight / 2.0f)),
   2101           PWLPT_BEZIERTO),
   2102       CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 15.0f,
   2103                                crBBox.bottom + fHeight / 2.0f),
   2104                     PWLPT_BEZIERTO),
   2105       CPWL_PathData(
   2106           CPWL_Point(crBBox.right - fWidth / 15.0f,
   2107                      crBBox.bottom + fHeight / 2.0f -
   2108                          PWL_BEZIER * (fHeight / 2.0f - fHeight / 15.0f)),
   2109           PWLPT_BEZIERTO),
   2110       CPWL_PathData(
   2111           CPWL_Point(crBBox.left + fWidth / 2.0f +
   2112                          PWL_BEZIER * (fWidth * 14 / 15.0f - fWidth / 2.0f),
   2113                      crBBox.bottom + fHeight / 15.0f),
   2114           PWLPT_BEZIERTO),
   2115       CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 2.0f,
   2116                                crBBox.bottom + fHeight / 15.0f),
   2117                     PWLPT_BEZIERTO),
   2118       CPWL_PathData(
   2119           CPWL_Point(crBBox.left + fWidth / 2.0f -
   2120                          PWL_BEZIER * (fWidth / 2.0f - fWidth / 15.0f),
   2121                      crBBox.bottom + fHeight / 15.0f),
   2122           PWLPT_BEZIERTO),
   2123       CPWL_PathData(
   2124           CPWL_Point(crBBox.left + fWidth / 15.0f,
   2125                      crBBox.bottom + fHeight / 2.0f -
   2126                          PWL_BEZIER * (fHeight / 2.0f - fHeight / 15.0f)),
   2127           PWLPT_BEZIERTO),
   2128       CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 15.0f,
   2129                                crBBox.bottom + fHeight / 2.0f),
   2130                     PWLPT_BEZIERTO),
   2131       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 3 / 15.0f,
   2132                                crBBox.bottom + fHeight / 2.0f),
   2133                     PWLPT_MOVETO),
   2134       CPWL_PathData(
   2135           CPWL_Point(crBBox.left + fWidth * 3 / 15.0f,
   2136                      crBBox.bottom + fHeight / 2.0f +
   2137                          PWL_BEZIER * (fHeight * 4 / 5.0f - fHeight / 2.0f)),
   2138           PWLPT_BEZIERTO),
   2139       CPWL_PathData(
   2140           CPWL_Point(crBBox.left + fWidth / 2.0f -
   2141                          PWL_BEZIER * (fWidth / 2.0f - fWidth * 3 / 15.0f),
   2142                      crBBox.top - fHeight * 3 / 15.0f),
   2143           PWLPT_BEZIERTO),
   2144       CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 2.0f,
   2145                                crBBox.top - fHeight * 3 / 15.0f),
   2146                     PWLPT_BEZIERTO),
   2147       CPWL_PathData(
   2148           CPWL_Point(crBBox.left + fWidth / 2.0f +
   2149                          PWL_BEZIER * (fWidth * 4 / 5.0f - fWidth / 2.0f),
   2150                      crBBox.top - fHeight * 3 / 15.0f),
   2151           PWLPT_BEZIERTO),
   2152       CPWL_PathData(
   2153           CPWL_Point(crBBox.right - fWidth * 3 / 15.0f,
   2154                      crBBox.bottom + fHeight / 2.0f +
   2155                          PWL_BEZIER * (fHeight * 4 / 5.0f - fHeight / 2.0f)),
   2156           PWLPT_BEZIERTO),
   2157       CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 3 / 15.0f,
   2158                                crBBox.bottom + fHeight / 2.0f),
   2159                     PWLPT_BEZIERTO),
   2160       CPWL_PathData(
   2161           CPWL_Point(crBBox.right - fWidth * 3 / 15.0f,
   2162                      crBBox.bottom + fHeight / 2.0f -
   2163                          PWL_BEZIER * (fHeight * 4 / 5.0f - fHeight / 2.0f)),
   2164           PWLPT_BEZIERTO),
   2165       CPWL_PathData(
   2166           CPWL_Point(crBBox.left + fWidth / 2.0f +
   2167                          PWL_BEZIER * (fWidth * 4 / 5.0f - fWidth / 2.0f),
   2168                      crBBox.bottom + fHeight * 3 / 15.0f),
   2169           PWLPT_BEZIERTO),
   2170       CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 2.0f,
   2171                                crBBox.bottom + fHeight * 3 / 15.0f),
   2172                     PWLPT_BEZIERTO),
   2173       CPWL_PathData(
   2174           CPWL_Point(crBBox.left + fWidth / 2.0f -
   2175                          PWL_BEZIER * (fWidth * 4 / 5.0f - fWidth / 2.0f),
   2176                      crBBox.bottom + fHeight * 3 / 15.0f),
   2177           PWLPT_BEZIERTO),
   2178       CPWL_PathData(
   2179           CPWL_Point(crBBox.left + fWidth * 3 / 15.0f,
   2180                      crBBox.bottom + fHeight / 2.0f -
   2181                          PWL_BEZIER * (fHeight * 4 / 5.0f - fHeight / 2.0f)),
   2182           PWLPT_BEZIERTO),
   2183       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 3 / 15.0f,
   2184                                crBBox.bottom + fHeight / 2.0f),
   2185                     PWLPT_BEZIERTO)};
   2186 
   2187   if (type == PWLPT_STREAM)
   2188     sPathData = GetAppStreamFromArray(PathArray, 26);
   2189   else
   2190     GetPathDataFromArray(path, PathArray, 26);
   2191 }
   2192 
   2193 void CPWL_Utils::GetGraphics_Comment(CFX_ByteString& sPathData,
   2194                                      CFX_PathData& path,
   2195                                      const CPDF_Rect& crBBox,
   2196                                      const PWL_PATH_TYPE type) {
   2197   FX_FLOAT fWidth = crBBox.right - crBBox.left;
   2198   FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
   2199 
   2200   CPWL_PathData PathArray[] = {
   2201       CPWL_PathData(
   2202           CPWL_Point(crBBox.left + fWidth / 15.0f, crBBox.top - fHeight / 6.0f),
   2203           PWLPT_MOVETO),
   2204       CPWL_PathData(
   2205           CPWL_Point(crBBox.left + fWidth / 15.0f,
   2206                      crBBox.top - fHeight / 6.0f +
   2207                          PWL_BEZIER * (fHeight / 6.0f - fHeight / 10.0f)),
   2208           PWLPT_BEZIERTO),
   2209       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 2 / 15.0f -
   2210                                    PWL_BEZIER * fWidth / 15.0f,
   2211                                crBBox.top - fHeight / 10.0f),
   2212                     PWLPT_BEZIERTO),
   2213       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 2 / 15.0f,
   2214                                crBBox.top - fHeight / 10.0f),
   2215                     PWLPT_BEZIERTO),
   2216       CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 2 / 15.0f,
   2217                                crBBox.top - fHeight / 10.0f),
   2218                     PWLPT_LINETO),
   2219       CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 2 / 15.0f +
   2220                                    PWL_BEZIER * fWidth / 15.0f,
   2221                                crBBox.top - fHeight / 10.0f),
   2222                     PWLPT_BEZIERTO),
   2223       CPWL_PathData(
   2224           CPWL_Point(crBBox.right - fWidth / 15.0f,
   2225                      crBBox.top - fHeight / 6 +
   2226                          PWL_BEZIER * (fHeight / 6.0f - fHeight / 10.0f)),
   2227           PWLPT_BEZIERTO),
   2228       CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 15.0f,
   2229                                crBBox.top - fHeight / 6.0f),
   2230                     PWLPT_BEZIERTO),
   2231       CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 15.0f,
   2232                                crBBox.bottom + fHeight / 3.0f),
   2233                     PWLPT_LINETO),
   2234       CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 15.0f,
   2235                                crBBox.bottom + fHeight * 4 / 15.0f +
   2236                                    PWL_BEZIER * fHeight / 15.0f),
   2237                     PWLPT_BEZIERTO),
   2238       CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 2 / 15.0f +
   2239                                    PWL_BEZIER * fWidth / 15.0f,
   2240                                crBBox.bottom + fHeight * 4 / 15.0f),
   2241                     PWLPT_BEZIERTO),
   2242       CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 2 / 15.0f,
   2243                                crBBox.bottom + fHeight * 4 / 15.0f),
   2244                     PWLPT_BEZIERTO),
   2245       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 5 / 15.0f,
   2246                                crBBox.bottom + fHeight * 4 / 15.0f),
   2247                     PWLPT_LINETO),
   2248       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 5 / 15.0f,
   2249                                crBBox.bottom + fHeight * 2 / 15 +
   2250                                    PWL_BEZIER * fHeight * 2 / 15.0f),
   2251                     PWLPT_BEZIERTO),
   2252       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 5 / 15.0f -
   2253                                    PWL_BEZIER * fWidth * 2 / 15.0f,
   2254                                crBBox.bottom + fHeight * 2 / 15.0f),
   2255                     PWLPT_BEZIERTO),
   2256       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 6 / 30.0f,
   2257                                crBBox.bottom + fHeight * 2 / 15.0f),
   2258                     PWLPT_BEZIERTO),
   2259       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 7 / 30.0f +
   2260                                    PWL_BEZIER * fWidth / 30.0f,
   2261                                crBBox.bottom + fHeight * 2 / 15.0f),
   2262                     PWLPT_BEZIERTO),
   2263       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 7 / 30.0f,
   2264                                crBBox.bottom + fHeight * 2 / 15.0f +
   2265                                    PWL_BEZIER * fHeight * 2 / 15.0f),
   2266                     PWLPT_BEZIERTO),
   2267       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 7 / 30.0f,
   2268                                crBBox.bottom + fHeight * 4 / 15.0f),
   2269                     PWLPT_BEZIERTO),
   2270       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 2 / 15.0f,
   2271                                crBBox.bottom + fHeight * 4 / 15.0f),
   2272                     PWLPT_LINETO),
   2273       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 2 / 15.0f -
   2274                                    PWL_BEZIER * fWidth / 15.0f,
   2275                                crBBox.bottom + fHeight * 4 / 15.0f),
   2276                     PWLPT_BEZIERTO),
   2277       CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 15.0f,
   2278                                crBBox.bottom + fHeight / 3.0f -
   2279                                    PWL_BEZIER * fHeight / 15.0f),
   2280                     PWLPT_BEZIERTO),
   2281       CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 15.0f,
   2282                                crBBox.bottom + fHeight / 3.0f),
   2283                     PWLPT_BEZIERTO),
   2284       CPWL_PathData(
   2285           CPWL_Point(crBBox.left + fWidth / 15.0f, crBBox.top - fHeight / 6.0f),
   2286           PWLPT_LINETO),
   2287       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 2 / 15.0f,
   2288                                crBBox.top - fHeight * 8 / 30.0f),
   2289                     PWLPT_MOVETO),
   2290       CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 2 / 15.0f,
   2291                                crBBox.top - fHeight * 8 / 30.0f),
   2292                     PWLPT_LINETO),
   2293       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 2 / 15,
   2294                                crBBox.top - fHeight * 25 / 60.0f),
   2295                     PWLPT_MOVETO),
   2296       CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 2 / 15.0f,
   2297                                crBBox.top - fHeight * 25 / 60.0f),
   2298                     PWLPT_LINETO),
   2299       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 2 / 15.0f,
   2300                                crBBox.top - fHeight * 17 / 30.0f),
   2301                     PWLPT_MOVETO),
   2302       CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 4 / 15.0f,
   2303                                crBBox.top - fHeight * 17 / 30.0f),
   2304                     PWLPT_LINETO)};
   2305 
   2306   if (type == PWLPT_STREAM)
   2307     sPathData = GetAppStreamFromArray(PathArray, 30);
   2308   else
   2309     GetPathDataFromArray(path, PathArray, 30);
   2310 }
   2311 
   2312 void CPWL_Utils::GetGraphics_Cross(CFX_ByteString& sPathData,
   2313                                    CFX_PathData& path,
   2314                                    const CPDF_Rect& crBBox,
   2315                                    const PWL_PATH_TYPE type) {
   2316   FX_FLOAT fWidth = crBBox.right - crBBox.left;
   2317   FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
   2318   CPWL_Point center_point(crBBox.left + fWidth / 2,
   2319                           crBBox.bottom + fHeight / 2);
   2320 
   2321   CPWL_PathData PathArray[] = {
   2322       CPWL_PathData(
   2323           CPWL_Point(center_point.x, center_point.y + fHeight / 10.0f),
   2324           PWLPT_MOVETO),
   2325       CPWL_PathData(
   2326           CPWL_Point(center_point.x + fWidth * 0.3f,
   2327                      center_point.y + fHeight / 10.0f + fWidth * 0.3f),
   2328           PWLPT_LINETO),
   2329       CPWL_PathData(CPWL_Point(center_point.x + fWidth / 10.0f + fWidth * 0.3f,
   2330                                center_point.y + fHeight * 0.3f),
   2331                     PWLPT_LINETO),
   2332       CPWL_PathData(CPWL_Point(center_point.x + fWidth / 10.0f, center_point.y),
   2333                     PWLPT_LINETO),
   2334       CPWL_PathData(CPWL_Point(center_point.x + fWidth / 10.0f + fWidth * 0.3f,
   2335                                center_point.y - fHeight * 0.3f),
   2336                     PWLPT_LINETO),
   2337       CPWL_PathData(
   2338           CPWL_Point(center_point.x + fWidth * 0.3f,
   2339                      center_point.y - fHeight / 10.0f - fHeight * 0.3f),
   2340           PWLPT_LINETO),
   2341       CPWL_PathData(
   2342           CPWL_Point(center_point.x, center_point.y - fHeight / 10.0f),
   2343           PWLPT_LINETO),
   2344       CPWL_PathData(CPWL_Point(center_point.x - fWidth * 0.3f,
   2345                                center_point.y - fHeight / 10 - fHeight * 0.3f),
   2346                     PWLPT_LINETO),
   2347       CPWL_PathData(CPWL_Point(center_point.x - fWidth / 10.0f - fWidth * 0.3f,
   2348                                center_point.y - fHeight * 0.3f),
   2349                     PWLPT_LINETO),
   2350       CPWL_PathData(CPWL_Point(center_point.x - fWidth / 10, center_point.y),
   2351                     PWLPT_LINETO),
   2352       CPWL_PathData(CPWL_Point(center_point.x - fWidth / 10 - fWidth * 0.3f,
   2353                                center_point.y + fHeight * 0.3f),
   2354                     PWLPT_LINETO),
   2355       CPWL_PathData(
   2356           CPWL_Point(center_point.x - fWidth * 0.3f,
   2357                      center_point.y + fHeight / 10.0f + fHeight * 0.3f),
   2358           PWLPT_LINETO),
   2359       CPWL_PathData(
   2360           CPWL_Point(center_point.x, center_point.y + fHeight / 10.0f),
   2361           PWLPT_LINETO)};
   2362 
   2363   if (type == PWLPT_STREAM)
   2364     sPathData = GetAppStreamFromArray(PathArray, 13);
   2365   else
   2366     GetPathDataFromArray(path, PathArray, 13);
   2367 }
   2368 
   2369 void CPWL_Utils::GetGraphics_Help(CFX_ByteString& sPathData,
   2370                                   CFX_PathData& path,
   2371                                   const CPDF_Rect& crBBox,
   2372                                   const PWL_PATH_TYPE type) {
   2373   FX_FLOAT fWidth = crBBox.right - crBBox.left;
   2374   FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
   2375 
   2376   CPWL_PathData PathArray[] = {
   2377       CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 60.0f,
   2378                                crBBox.bottom + fHeight / 2.0f),
   2379                     PWLPT_MOVETO),
   2380       CPWL_PathData(
   2381           CPWL_Point(crBBox.left + fWidth / 60.0f,
   2382                      crBBox.bottom + fHeight / 2.0f +
   2383                          PWL_BEZIER * (fHeight / 60.0f - fHeight / 2.0f)),
   2384           PWLPT_BEZIERTO),
   2385       CPWL_PathData(
   2386           CPWL_Point(crBBox.left + fWidth / 2.0f -
   2387                          PWL_BEZIER * (fWidth / 2.0f - fWidth / 60.0f),
   2388                      crBBox.bottom + fHeight / 60.0f),
   2389           PWLPT_BEZIERTO),
   2390       CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 2.0f,
   2391                                crBBox.bottom + fHeight / 60.0f),
   2392                     PWLPT_BEZIERTO),
   2393       CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 2.0f +
   2394                                    PWL_BEZIER * fWidth * 29 / 60.0f,
   2395                                crBBox.bottom + fHeight / 60.0f),
   2396                     PWLPT_BEZIERTO),
   2397       CPWL_PathData(
   2398           CPWL_Point(crBBox.right - fWidth / 60.0f,
   2399                      crBBox.bottom + fHeight / 2.0f +
   2400                          PWL_BEZIER * (fHeight / 60.0f - fHeight / 2.0f)),
   2401           PWLPT_BEZIERTO),
   2402       CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 60.0f,
   2403                                crBBox.bottom + fHeight / 2.0f),
   2404                     PWLPT_BEZIERTO),
   2405       CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 60.0f,
   2406                                crBBox.bottom + fHeight / 2.0f +
   2407                                    PWL_BEZIER * fHeight * 29 / 60.0f),
   2408                     PWLPT_BEZIERTO),
   2409       CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 2.0f +
   2410                                    PWL_BEZIER * fWidth * 29 / 60.0f,
   2411                                crBBox.top - fHeight / 60.0f),
   2412                     PWLPT_BEZIERTO),
   2413       CPWL_PathData(
   2414           CPWL_Point(crBBox.left + fWidth / 2.0f, crBBox.top - fHeight / 60.0f),
   2415           PWLPT_BEZIERTO),
   2416       CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 2.0f -
   2417                                    PWL_BEZIER * fWidth * 29 / 60.0f,
   2418                                crBBox.top - fHeight / 60.0f),
   2419                     PWLPT_BEZIERTO),
   2420       CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 60.0f,
   2421                                crBBox.bottom + fHeight / 2.0f +
   2422                                    PWL_BEZIER * fHeight * 29 / 60.0f),
   2423                     PWLPT_BEZIERTO),
   2424       CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 60.0f,
   2425                                crBBox.bottom + fHeight / 2.0f),
   2426                     PWLPT_BEZIERTO),
   2427       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.27f,
   2428                                crBBox.top - fHeight * 0.36f),
   2429                     PWLPT_MOVETO),
   2430       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.27f,
   2431                                crBBox.top - fHeight * 0.36f +
   2432                                    PWL_BEZIER * fHeight * 0.23f),
   2433                     PWLPT_BEZIERTO),
   2434       CPWL_PathData(
   2435           CPWL_Point(crBBox.left + fWidth * 0.5f - PWL_BEZIER * fWidth * 0.23f,
   2436                      crBBox.bottom + fHeight * 0.87f),
   2437           PWLPT_BEZIERTO),
   2438       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.5f,
   2439                                crBBox.bottom + fHeight * 0.87f),
   2440                     PWLPT_BEZIERTO),
   2441       CPWL_PathData(
   2442           CPWL_Point(crBBox.left + fWidth * 0.5f + PWL_BEZIER * fWidth * 0.23f,
   2443                      crBBox.bottom + fHeight * 0.87f),
   2444           PWLPT_BEZIERTO),
   2445       CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.27f,
   2446                                crBBox.top - fHeight * 0.36f +
   2447                                    PWL_BEZIER * fHeight * 0.23f),
   2448                     PWLPT_BEZIERTO),
   2449       CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.27f,
   2450                                crBBox.top - fHeight * 0.36f),
   2451                     PWLPT_BEZIERTO),
   2452       CPWL_PathData(
   2453           CPWL_Point(crBBox.right - fWidth * 0.27f - fWidth * 0.08f * 0.2f,
   2454                      crBBox.top - fHeight * 0.36f - fHeight * 0.15f * 0.7f),
   2455           PWLPT_BEZIERTO),
   2456       CPWL_PathData(
   2457           CPWL_Point(crBBox.right - fWidth * 0.35f + fWidth * 0.08f * 0.2f,
   2458                      crBBox.top - fHeight * 0.51f + fHeight * 0.15f * 0.2f),
   2459           PWLPT_BEZIERTO),
   2460       CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.35f,
   2461                                crBBox.top - fHeight * 0.51f),
   2462                     PWLPT_BEZIERTO),
   2463       CPWL_PathData(
   2464           CPWL_Point(crBBox.right - fWidth * 0.35f - fWidth * 0.1f * 0.5f,
   2465                      crBBox.top - fHeight * 0.51f - fHeight * 0.15f * 0.3f),
   2466           PWLPT_BEZIERTO),
   2467       CPWL_PathData(
   2468           CPWL_Point(crBBox.right - fWidth * 0.45f - fWidth * 0.1f * 0.5f,
   2469                      crBBox.top - fHeight * 0.68f + fHeight * 0.15f * 0.5f),
   2470           PWLPT_BEZIERTO),
   2471       CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.45f,
   2472                                crBBox.top - fHeight * 0.68f),
   2473                     PWLPT_BEZIERTO),
   2474       CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.45f,
   2475                                crBBox.bottom + fHeight * 0.30f),
   2476                     PWLPT_LINETO),
   2477       CPWL_PathData(
   2478           CPWL_Point(crBBox.right - fWidth * 0.45f,
   2479                      crBBox.bottom + fHeight * 0.30f - fWidth * 0.1f * 0.7f),
   2480           PWLPT_BEZIERTO),
   2481       CPWL_PathData(
   2482           CPWL_Point(crBBox.right - fWidth * 0.55f,
   2483                      crBBox.bottom + fHeight * 0.30f - fWidth * 0.1f * 0.7f),
   2484           PWLPT_BEZIERTO),
   2485       CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.55f,
   2486                                crBBox.bottom + fHeight * 0.30f),
   2487                     PWLPT_BEZIERTO),
   2488       CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.55f,
   2489                                crBBox.top - fHeight * 0.66f),
   2490                     PWLPT_LINETO),
   2491       CPWL_PathData(
   2492           CPWL_Point(crBBox.right - fWidth * 0.55f - fWidth * 0.1f * 0.05f,
   2493                      crBBox.top - fHeight * 0.66f + fHeight * 0.18f * 0.5f),
   2494           PWLPT_BEZIERTO),
   2495       CPWL_PathData(
   2496           CPWL_Point(crBBox.right - fWidth * 0.45f - fWidth * 0.1f * 0.05f,
   2497                      crBBox.top - fHeight * 0.48f - fHeight * 0.18f * 0.3f),
   2498           PWLPT_BEZIERTO),
   2499       CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.45f,
   2500                                crBBox.top - fHeight * 0.48f),
   2501                     PWLPT_BEZIERTO),
   2502       CPWL_PathData(
   2503           CPWL_Point(crBBox.right - fWidth * 0.45f + fWidth * 0.08f * 0.2f,
   2504                      crBBox.top - fHeight * 0.48f + fHeight * 0.18f * 0.2f),
   2505           PWLPT_BEZIERTO),
   2506       CPWL_PathData(
   2507           CPWL_Point(crBBox.right - fWidth * 0.37f - fWidth * 0.08f * 0.2f,
   2508                      crBBox.top - fHeight * 0.36f - fHeight * 0.18f * 0.7f),
   2509           PWLPT_BEZIERTO),
   2510       CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.37f,
   2511                                crBBox.top - fHeight * 0.36f),
   2512                     PWLPT_BEZIERTO),
   2513       CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.37f,
   2514                                crBBox.top - fHeight * 0.36f +
   2515                                    PWL_BEZIER * fHeight * 0.13f),
   2516                     PWLPT_BEZIERTO),
   2517       CPWL_PathData(
   2518           CPWL_Point(crBBox.left + fWidth * 0.5f + PWL_BEZIER * fWidth * 0.13f,
   2519                      crBBox.bottom + fHeight * 0.77f),
   2520           PWLPT_BEZIERTO),
   2521       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.5f,
   2522                                crBBox.bottom + fHeight * 0.77f),
   2523                     PWLPT_BEZIERTO),
   2524       CPWL_PathData(
   2525           CPWL_Point(crBBox.left + fWidth * 0.5f - PWL_BEZIER * fWidth * 0.13f,
   2526                      crBBox.bottom + fHeight * 0.77f),
   2527           PWLPT_BEZIERTO),
   2528       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.37f,
   2529                                crBBox.top - fHeight * 0.36f +
   2530                                    PWL_BEZIER * fHeight * 0.13f),
   2531                     PWLPT_BEZIERTO),
   2532       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.37f,
   2533                                crBBox.top - fHeight * 0.36f),
   2534                     PWLPT_BEZIERTO),
   2535       CPWL_PathData(
   2536           CPWL_Point(crBBox.left + fWidth * 0.37f,
   2537                      crBBox.top - fHeight * 0.36f - fWidth * 0.1f * 0.6f),
   2538           PWLPT_BEZIERTO),
   2539       CPWL_PathData(
   2540           CPWL_Point(crBBox.left + fWidth * 0.27f,
   2541                      crBBox.top - fHeight * 0.36f - fWidth * 0.1f * 0.6f),
   2542           PWLPT_BEZIERTO),
   2543       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.27f,
   2544                                crBBox.top - fHeight * 0.36f),
   2545                     PWLPT_BEZIERTO),
   2546       CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.56f,
   2547                                crBBox.bottom + fHeight * 0.13f),
   2548                     PWLPT_MOVETO),
   2549       CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.56f,
   2550                                crBBox.bottom + fHeight * 0.13f +
   2551                                    PWL_BEZIER * fHeight * 0.055f),
   2552                     PWLPT_BEZIERTO),
   2553       CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.505f -
   2554                                    PWL_BEZIER * fWidth * 0.095f,
   2555                                crBBox.bottom + fHeight * 0.185f),
   2556                     PWLPT_BEZIERTO),
   2557       CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.505f,
   2558                                crBBox.bottom + fHeight * 0.185f),
   2559                     PWLPT_BEZIERTO),
   2560       CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.505f +
   2561                                    PWL_BEZIER * fWidth * 0.065f,
   2562                                crBBox.bottom + fHeight * 0.185f),
   2563                     PWLPT_BEZIERTO),
   2564       CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.44f,
   2565                                crBBox.bottom + fHeight * 0.13f +
   2566                                    PWL_BEZIER * fHeight * 0.055f),
   2567                     PWLPT_BEZIERTO),
   2568       CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.44f,
   2569                                crBBox.bottom + fHeight * 0.13f),
   2570                     PWLPT_BEZIERTO),
   2571       CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.44f,
   2572                                crBBox.bottom + fHeight * 0.13f -
   2573                                    PWL_BEZIER * fHeight * 0.055f),
   2574                     PWLPT_BEZIERTO),
   2575       CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.505f +
   2576                                    PWL_BEZIER * fWidth * 0.065f,
   2577                                crBBox.bottom + fHeight * 0.075f),
   2578                     PWLPT_BEZIERTO),
   2579       CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.505f,
   2580                                crBBox.bottom + fHeight * 0.075f),
   2581                     PWLPT_BEZIERTO),
   2582       CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.505f -
   2583                                    PWL_BEZIER * fWidth * 0.065f,
   2584                                crBBox.bottom + fHeight * 0.075f),
   2585                     PWLPT_BEZIERTO),
   2586       CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.56f,
   2587                                crBBox.bottom + fHeight * 0.13f -
   2588                                    PWL_BEZIER * fHeight * 0.055f),
   2589                     PWLPT_BEZIERTO),
   2590       CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.56f,
   2591                                crBBox.bottom + fHeight * 0.13f),
   2592                     PWLPT_BEZIERTO)};
   2593 
   2594   if (type == PWLPT_STREAM)
   2595     sPathData = GetAppStreamFromArray(PathArray, 59);
   2596   else
   2597     GetPathDataFromArray(path, PathArray, 59);
   2598 }
   2599 
   2600 void CPWL_Utils::GetGraphics_InsertText(CFX_ByteString& sPathData,
   2601                                         CFX_PathData& path,
   2602                                         const CPDF_Rect& crBBox,
   2603                                         const PWL_PATH_TYPE type) {
   2604   FX_FLOAT fWidth = crBBox.right - crBBox.left;
   2605   FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
   2606 
   2607   CPWL_PathData PathArray[] = {
   2608       CPWL_PathData(
   2609           CPWL_Point(crBBox.left + fWidth / 10, crBBox.bottom + fHeight / 10),
   2610           PWLPT_MOVETO),
   2611       CPWL_PathData(
   2612           CPWL_Point(crBBox.left + fWidth / 2, crBBox.top - fHeight * 2 / 15),
   2613           PWLPT_LINETO),
   2614       CPWL_PathData(
   2615           CPWL_Point(crBBox.right - fWidth / 10, crBBox.bottom + fHeight / 10),
   2616           PWLPT_LINETO),
   2617       CPWL_PathData(
   2618           CPWL_Point(crBBox.left + fWidth / 10, crBBox.bottom + fHeight / 10),
   2619           PWLPT_LINETO)};
   2620 
   2621   if (type == PWLPT_STREAM)
   2622     sPathData = GetAppStreamFromArray(PathArray, 4);
   2623   else
   2624     GetPathDataFromArray(path, PathArray, 4);
   2625 }
   2626 
   2627 void CPWL_Utils::GetGraphics_Key(CFX_ByteString& sPathData,
   2628                                  CFX_PathData& path,
   2629                                  const CPDF_Rect& crBBox,
   2630                                  const PWL_PATH_TYPE type) {
   2631   FX_FLOAT fWidth = crBBox.right - crBBox.left;
   2632   FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
   2633   FX_FLOAT k = -fHeight / fWidth;
   2634   CPWL_Point tail;
   2635   CPWL_Point CicleCenter;
   2636   tail.x = crBBox.left + fWidth * 0.9f;
   2637   tail.y = k * (tail.x - crBBox.right) + crBBox.bottom;
   2638   CicleCenter.x = crBBox.left + fWidth * 0.15f;
   2639   CicleCenter.y = k * (CicleCenter.x - crBBox.right) + crBBox.bottom;
   2640 
   2641   CPWL_PathData PathArray[] = {
   2642       CPWL_PathData(
   2643           CPWL_Point(tail.x + fWidth / 30.0f, -fWidth / 30.0f / k + tail.y),
   2644           PWLPT_MOVETO),
   2645       CPWL_PathData(CPWL_Point(tail.x + fWidth / 30.0f - fWidth * 0.18f,
   2646                                -k * fWidth * 0.18f - fWidth / 30 / k + tail.y),
   2647                     PWLPT_LINETO),
   2648       CPWL_PathData(
   2649           CPWL_Point(tail.x + fWidth / 30 - fWidth * 0.18f + fWidth * 0.07f,
   2650                      -fWidth * 0.07f / k - k * fWidth * 0.18f -
   2651                          fWidth / 30 / k + tail.y),
   2652           PWLPT_LINETO),
   2653       CPWL_PathData(
   2654           CPWL_Point(tail.x + fWidth / 30 - fWidth * 0.18f - fWidth / 20 +
   2655                          fWidth * 0.07f,
   2656                      -fWidth * 0.07f / k - k * fWidth / 20 -
   2657                          k * fWidth * 0.18f - fWidth / 30 / k + tail.y),
   2658           PWLPT_LINETO),
   2659       CPWL_PathData(
   2660           CPWL_Point(
   2661               tail.x + fWidth / 30 - fWidth * 0.18f - fWidth / 20,
   2662               -k * fWidth / 20 - k * fWidth * 0.18f - fWidth / 30 / k + tail.y),
   2663           PWLPT_LINETO),
   2664       CPWL_PathData(
   2665           CPWL_Point(
   2666               tail.x + fWidth / 30 - fWidth * 0.18f - fWidth / 20 - fWidth / 15,
   2667               -k * fWidth / 15 - k * fWidth / 20 - k * fWidth * 0.18f -
   2668                   fWidth / 30 / k + tail.y),
   2669           PWLPT_LINETO),
   2670       CPWL_PathData(
   2671           CPWL_Point(tail.x + fWidth / 30 - fWidth * 0.18f - fWidth / 20 -
   2672                          fWidth / 15 + fWidth * 0.07f,
   2673                      -fWidth * 0.07f / k - k * fWidth / 15 - k * fWidth / 20 -
   2674                          k * fWidth * 0.18f - fWidth / 30 / k + tail.y),
   2675           PWLPT_LINETO),
   2676       CPWL_PathData(
   2677           CPWL_Point(tail.x + fWidth / 30 - fWidth * 0.18f - fWidth / 20 -
   2678                          fWidth / 15 - fWidth / 20 + fWidth * 0.07f,
   2679                      -fWidth * 0.07f / k + -k * fWidth / 20 + -k * fWidth / 15 -
   2680                          k * fWidth / 20 - k * fWidth * 0.18f -
   2681                          fWidth / 30 / k + tail.y),
   2682           PWLPT_LINETO),
   2683       CPWL_PathData(
   2684           CPWL_Point(tail.x + fWidth / 30 - fWidth * 0.18f - fWidth / 20 -
   2685                          fWidth / 15 - fWidth / 20,
   2686                      -k * fWidth / 20 + -k * fWidth / 15 - k * fWidth / 20 -
   2687                          k * fWidth * 0.18f - fWidth / 30 / k + tail.y),
   2688           PWLPT_LINETO),
   2689       CPWL_PathData(CPWL_Point(tail.x + fWidth / 30 - fWidth * 0.45f,
   2690                                -k * fWidth * 0.45f - fWidth / 30 / k + tail.y),
   2691                     PWLPT_LINETO),
   2692       CPWL_PathData(
   2693           CPWL_Point(tail.x + fWidth / 30 - fWidth * 0.45f + fWidth * 0.2f,
   2694                      -fWidth * 0.4f / k - k * fWidth * 0.45f - fWidth / 30 / k +
   2695                          tail.y),
   2696           PWLPT_BEZIERTO),
   2697       CPWL_PathData(CPWL_Point(CicleCenter.x + fWidth * 0.2f,
   2698                                -fWidth * 0.1f / k + CicleCenter.y),
   2699                     PWLPT_BEZIERTO),
   2700       CPWL_PathData(CPWL_Point(CicleCenter.x, CicleCenter.y), PWLPT_BEZIERTO),
   2701       CPWL_PathData(CPWL_Point(CicleCenter.x - fWidth / 60.0f,
   2702                                -k * fWidth / 60 + CicleCenter.y),
   2703                     PWLPT_BEZIERTO),
   2704       CPWL_PathData(CPWL_Point(CicleCenter.x - fWidth / 60,
   2705                                -k * fWidth / 60 + CicleCenter.y),
   2706                     PWLPT_BEZIERTO),
   2707       CPWL_PathData(CPWL_Point(CicleCenter.x, CicleCenter.y), PWLPT_BEZIERTO),
   2708       CPWL_PathData(
   2709           CPWL_Point(CicleCenter.x - fWidth * 0.22f,
   2710                      fWidth * 0.35f / k + CicleCenter.y - fHeight * 0.05f),
   2711           PWLPT_BEZIERTO),
   2712       CPWL_PathData(
   2713           CPWL_Point(tail.x - fWidth / 30 - fWidth * 0.45f - fWidth * 0.18f,
   2714                      fWidth * 0.05f / k - k * fWidth * 0.45f + fWidth / 30 / k +
   2715                          tail.y - fHeight * 0.05f),
   2716           PWLPT_BEZIERTO),
   2717       CPWL_PathData(
   2718           CPWL_Point(tail.x - fWidth / 30.0f - fWidth * 0.45f,
   2719                      -k * fWidth * 0.45f + fWidth / 30.0f / k + tail.y),
   2720           PWLPT_BEZIERTO),
   2721       CPWL_PathData(
   2722           CPWL_Point(tail.x - fWidth / 30.0f, fWidth / 30.0f / k + tail.y),
   2723           PWLPT_LINETO),
   2724       CPWL_PathData(CPWL_Point(tail.x + fWidth / 30, -fWidth / 30 / k + tail.y),
   2725                     PWLPT_LINETO),
   2726       CPWL_PathData(CPWL_Point(CicleCenter.x + fWidth * 0.08f,
   2727                                k * fWidth * 0.08f + CicleCenter.y),
   2728                     PWLPT_MOVETO),
   2729       CPWL_PathData(
   2730           CPWL_Point(CicleCenter.x + fWidth * 0.08f + fWidth * 0.1f,
   2731                      -fWidth * 0.1f / k + k * fWidth * 0.08f + CicleCenter.y),
   2732           PWLPT_BEZIERTO),
   2733       CPWL_PathData(
   2734           CPWL_Point(CicleCenter.x + fWidth * 0.22f + fWidth * 0.1f,
   2735                      k * fWidth * 0.22f + CicleCenter.y - fWidth * 0.1f / k),
   2736           PWLPT_BEZIERTO),
   2737       CPWL_PathData(CPWL_Point(CicleCenter.x + fWidth * 0.22f,
   2738                                k * fWidth * 0.22f + CicleCenter.y),
   2739                     PWLPT_BEZIERTO),
   2740       CPWL_PathData(
   2741           CPWL_Point(CicleCenter.x + fWidth * 0.22f - fWidth * 0.1f,
   2742                      fWidth * 0.1f / k + k * fWidth * 0.22f + CicleCenter.y),
   2743           PWLPT_BEZIERTO),
   2744       CPWL_PathData(
   2745           CPWL_Point(CicleCenter.x + fWidth * 0.08f - fWidth * 0.1f,
   2746                      fWidth * 0.1f / k + k * fWidth * 0.08f + CicleCenter.y),
   2747           PWLPT_BEZIERTO),
   2748       CPWL_PathData(CPWL_Point(CicleCenter.x + fWidth * 0.08f,
   2749                                k * fWidth * 0.08f + CicleCenter.y),
   2750                     PWLPT_BEZIERTO)};
   2751 
   2752   if (type == PWLPT_STREAM)
   2753     sPathData = GetAppStreamFromArray(PathArray, 28);
   2754   else
   2755     GetPathDataFromArray(path, PathArray, 28);
   2756 }
   2757 
   2758 void CPWL_Utils::GetGraphics_NewParagraph(CFX_ByteString& sPathData,
   2759                                           CFX_PathData& path,
   2760                                           const CPDF_Rect& crBBox,
   2761                                           const PWL_PATH_TYPE type) {
   2762   FX_FLOAT fWidth = crBBox.right - crBBox.left;
   2763   FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
   2764 
   2765   CPWL_PathData PathArray[] = {
   2766       CPWL_PathData(
   2767           CPWL_Point(crBBox.left + fWidth / 2.0f, crBBox.top - fHeight / 20.0f),
   2768           PWLPT_MOVETO),
   2769       CPWL_PathData(
   2770           CPWL_Point(crBBox.left + fWidth / 10.0f, crBBox.top - fHeight / 2.0f),
   2771           PWLPT_LINETO),
   2772       CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 10.0f,
   2773                                crBBox.top - fHeight / 2.0f),
   2774                     PWLPT_LINETO),
   2775       CPWL_PathData(
   2776           CPWL_Point(crBBox.left + fWidth / 2.0f, crBBox.top - fHeight / 20.0f),
   2777           PWLPT_LINETO),
   2778       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.12f,
   2779                                crBBox.top - fHeight * 17 / 30.0f),
   2780                     PWLPT_MOVETO),
   2781       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.12f,
   2782                                crBBox.bottom + fHeight / 10.0f),
   2783                     PWLPT_LINETO),
   2784       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.22f,
   2785                                crBBox.bottom + fHeight / 10.0f),
   2786                     PWLPT_LINETO),
   2787       CPWL_PathData(
   2788           CPWL_Point(crBBox.left + fWidth * 0.22f,
   2789                      crBBox.top - fHeight * 17 / 30.0f - fWidth * 0.14f),
   2790           PWLPT_LINETO),
   2791       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.38f,
   2792                                crBBox.bottom + fHeight / 10.0f),
   2793                     PWLPT_LINETO),
   2794       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.48f,
   2795                                crBBox.bottom + fHeight / 10.0f),
   2796                     PWLPT_LINETO),
   2797       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.48f,
   2798                                crBBox.top - fHeight * 17 / 30.0f),
   2799                     PWLPT_LINETO),
   2800       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.38f,
   2801                                crBBox.top - fHeight * 17 / 30.0f),
   2802                     PWLPT_LINETO),
   2803       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.38f,
   2804                                crBBox.bottom + fWidth * 0.24f),
   2805                     PWLPT_LINETO),
   2806       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.22f,
   2807                                crBBox.top - fHeight * 17 / 30.0f),
   2808                     PWLPT_LINETO),
   2809       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.12f,
   2810                                crBBox.top - fHeight * 17 / 30.0f),
   2811                     PWLPT_LINETO),
   2812       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.6f,
   2813                                crBBox.bottom + fHeight / 10.0f),
   2814                     PWLPT_MOVETO),
   2815       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.7f,
   2816                                crBBox.bottom + fHeight / 10.0f),
   2817                     PWLPT_LINETO),
   2818       CPWL_PathData(
   2819           CPWL_Point(crBBox.left + fWidth * 0.7f,
   2820                      crBBox.bottom + fHeight / 10.0f + fHeight / 7.0f),
   2821           PWLPT_LINETO),
   2822       CPWL_PathData(
   2823           CPWL_Point(crBBox.left + fWidth * 0.97f,
   2824                      crBBox.bottom + fHeight / 10.0f + fHeight / 7.0f),
   2825           PWLPT_BEZIERTO),
   2826       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.97f,
   2827                                crBBox.top - fHeight * 17 / 30.0f),
   2828                     PWLPT_BEZIERTO),
   2829       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.7f,
   2830                                crBBox.top - fHeight * 17 / 30.0f),
   2831                     PWLPT_BEZIERTO),
   2832       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.6f,
   2833                                crBBox.top - fHeight * 17 / 30.0f),
   2834                     PWLPT_LINETO),
   2835       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.6f,
   2836                                crBBox.bottom + fHeight / 10.0f),
   2837                     PWLPT_LINETO),
   2838       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.7f,
   2839                                crBBox.bottom + fHeight / 7 + fHeight * 0.18f),
   2840                     PWLPT_MOVETO),
   2841       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.85f,
   2842                                crBBox.bottom + fHeight / 7 + fHeight * 0.18f),
   2843                     PWLPT_BEZIERTO),
   2844       CPWL_PathData(
   2845           CPWL_Point(crBBox.left + fWidth * 0.85f,
   2846                      crBBox.top - fHeight * 17 / 30.0f - fHeight * 0.08f),
   2847           PWLPT_BEZIERTO),
   2848       CPWL_PathData(
   2849           CPWL_Point(crBBox.left + fWidth * 0.7f,
   2850                      crBBox.top - fHeight * 17 / 30.0f - fHeight * 0.08f),
   2851           PWLPT_BEZIERTO),
   2852       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.7f,
   2853                                crBBox.bottom + fHeight / 7 + fHeight * 0.18f),
   2854                     PWLPT_LINETO)};
   2855 
   2856   if (type == PWLPT_STREAM)
   2857     sPathData = GetAppStreamFromArray(PathArray, 28);
   2858   else
   2859     GetPathDataFromArray(path, PathArray, 28);
   2860 }
   2861 
   2862 void CPWL_Utils::GetGraphics_TextNote(CFX_ByteString& sPathData,
   2863                                       CFX_PathData& path,
   2864                                       const CPDF_Rect& crBBox,
   2865                                       const PWL_PATH_TYPE type) {
   2866   FX_FLOAT fWidth = crBBox.right - crBBox.left;
   2867   FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
   2868 
   2869   CPWL_PathData PathArray[] = {
   2870       CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 3 / 10.0f,
   2871                                crBBox.bottom + fHeight / 15.0f),
   2872                     PWLPT_MOVETO),
   2873       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 7 / 10.0f,
   2874                                crBBox.bottom + fHeight * 4 / 15.0f),
   2875                     PWLPT_LINETO),
   2876       CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 10.0f,
   2877                                crBBox.bottom + fHeight * 4 / 15.0f),
   2878                     PWLPT_LINETO),
   2879       CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 10.0f,
   2880                                crBBox.top - fHeight / 15.0f),
   2881                     PWLPT_LINETO),
   2882       CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 10.0f,
   2883                                crBBox.top - fHeight / 15.0f),
   2884                     PWLPT_LINETO),
   2885       CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 10.0f,
   2886                                crBBox.bottom + fHeight / 15.0f),
   2887                     PWLPT_LINETO),
   2888       CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 3 / 10.0f,
   2889                                crBBox.bottom + fHeight / 15.0f),
   2890                     PWLPT_LINETO),
   2891       CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 10.0f,
   2892                                crBBox.bottom + fHeight * 4 / 15.0f),
   2893                     PWLPT_LINETO),
   2894       CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 3 / 10.0f,
   2895                                crBBox.bottom + fHeight / 15.0f),
   2896                     PWLPT_LINETO),
   2897       CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 3 / 10.0f,
   2898                                crBBox.bottom + fHeight * 4 / 15.0f),
   2899                     PWLPT_LINETO),
   2900       CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 10.0f,
   2901                                crBBox.bottom + fHeight * 4 / 15.0f),
   2902                     PWLPT_LINETO),
   2903       CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 5.0f,
   2904                                crBBox.top - fHeight * 4 / 15.0f),
   2905                     PWLPT_MOVETO),
   2906       CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 5.0f,
   2907                                crBBox.top - fHeight * 4 / 15.0f),
   2908                     PWLPT_LINETO),
   2909       CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 5.0f,
   2910                                crBBox.top - fHeight * 7 / 15.0f),
   2911                     PWLPT_MOVETO),
   2912       CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 5.0f,
   2913                                crBBox.top - fHeight * 7 / 15.0f),
   2914                     PWLPT_LINETO),
   2915       CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 5.0f,
   2916                                crBBox.top - fHeight * 10 / 15.0f),
   2917                     PWLPT_MOVETO),
   2918       CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 3 / 10.0f,
   2919                                crBBox.top - fHeight * 10 / 15.0f),
   2920                     PWLPT_LINETO)};
   2921 
   2922   if (type == PWLPT_STREAM)
   2923     sPathData = GetAppStreamFromArray(PathArray, 17);
   2924   else
   2925     GetPathDataFromArray(path, PathArray, 17);
   2926 }
   2927 
   2928 void CPWL_Utils::GetGraphics_Paragraph(CFX_ByteString& sPathData,
   2929                                        CFX_PathData& path,
   2930                                        const CPDF_Rect& crBBox,
   2931                                        const PWL_PATH_TYPE type) {
   2932   FX_FLOAT fWidth = crBBox.right - crBBox.left;
   2933   FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
   2934 
   2935   CPWL_PathData PathArray[] = {
   2936       CPWL_PathData(
   2937           CPWL_Point(crBBox.left + fWidth / 2.0f, crBBox.top - fHeight / 15.0f),
   2938           PWLPT_MOVETO),
   2939       CPWL_PathData(
   2940           CPWL_Point(crBBox.left + fWidth * 0.7f, crBBox.top - fHeight / 15.0f),
   2941           PWLPT_LINETO),
   2942       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.7f,
   2943                                crBBox.bottom + fHeight / 15.0f),
   2944                     PWLPT_LINETO),
   2945       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.634f,
   2946                                crBBox.bottom + fHeight / 15.0f),
   2947                     PWLPT_LINETO),
   2948       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.634f,
   2949                                crBBox.top - fHeight * 2 / 15.0f),
   2950                     PWLPT_LINETO),
   2951       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.566f,
   2952                                crBBox.top - fHeight * 2 / 15.0f),
   2953                     PWLPT_LINETO),
   2954       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.566f,
   2955                                crBBox.bottom + fHeight / 15.0f),
   2956                     PWLPT_LINETO),
   2957       CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 2.0f,
   2958                                crBBox.bottom + fHeight / 15.0f),
   2959                     PWLPT_LINETO),
   2960       CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 2.0f,
   2961                                crBBox.top - fHeight / 15.0f - fHeight * 0.4f),
   2962                     PWLPT_LINETO),
   2963       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.2f,
   2964                                crBBox.top - fHeight / 15.0f - fHeight * 0.4f),
   2965                     PWLPT_BEZIERTO),
   2966       CPWL_PathData(
   2967           CPWL_Point(crBBox.left + fWidth * 0.2f, crBBox.top - fHeight / 15.0f),
   2968           PWLPT_BEZIERTO),
   2969       CPWL_PathData(
   2970           CPWL_Point(crBBox.left + fWidth / 2.0f, crBBox.top - fHeight / 15.0f),
   2971           PWLPT_BEZIERTO)};
   2972 
   2973   if (type == PWLPT_STREAM)
   2974     sPathData = GetAppStreamFromArray(PathArray, 12);
   2975   else
   2976     GetPathDataFromArray(path, PathArray, 12);
   2977 }
   2978 
   2979 void CPWL_Utils::GetGraphics_RightArrow(CFX_ByteString& sPathData,
   2980                                         CFX_PathData& path,
   2981                                         const CPDF_Rect& crBBox,
   2982                                         const PWL_PATH_TYPE type) {
   2983   FX_FLOAT fWidth = crBBox.right - crBBox.left;
   2984   FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
   2985 
   2986   CPWL_PathData PathArray[] = {
   2987       CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 15.0f,
   2988                                crBBox.top - fHeight / 2.0f),
   2989                     PWLPT_MOVETO),
   2990       CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 2.0f + fWidth / 8.0f,
   2991                                crBBox.bottom + fHeight / 5.0f),
   2992                     PWLPT_LINETO),
   2993       CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 2.0f,
   2994                                crBBox.bottom + fHeight / 5.0f),
   2995                     PWLPT_LINETO),
   2996       CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 15.0f - fWidth * 0.15f,
   2997                                crBBox.top - fHeight / 2.0f - fWidth / 25.0f),
   2998                     PWLPT_LINETO),
   2999       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.1f,
   3000                                crBBox.top - fHeight / 2.0f - fWidth / 25.0f),
   3001                     PWLPT_LINETO),
   3002       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.1f,
   3003                                crBBox.top - fHeight / 2.0f + fWidth / 25.0f),
   3004                     PWLPT_LINETO),
   3005       CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 15.0f - fWidth * 0.15f,
   3006                                crBBox.top - fHeight / 2.0f + fWidth / 25.0f),
   3007                     PWLPT_LINETO),
   3008       CPWL_PathData(
   3009           CPWL_Point(crBBox.left + fWidth / 2.0f, crBBox.top - fHeight / 5.0f),
   3010           PWLPT_LINETO),
   3011       CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 2.0f + fWidth / 8.0f,
   3012                                crBBox.top - fHeight / 5.0f),
   3013                     PWLPT_LINETO),
   3014       CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 15.0f,
   3015                                crBBox.top - fHeight / 2.0f),
   3016                     PWLPT_LINETO)};
   3017 
   3018   if (type == PWLPT_STREAM)
   3019     sPathData = GetAppStreamFromArray(PathArray, 10);
   3020   else
   3021     GetPathDataFromArray(path, PathArray, 10);
   3022 }
   3023 
   3024 void CPWL_Utils::GetGraphics_RightPointer(CFX_ByteString& sPathData,
   3025                                           CFX_PathData& path,
   3026                                           const CPDF_Rect& crBBox,
   3027                                           const PWL_PATH_TYPE type) {
   3028   FX_FLOAT fWidth = crBBox.right - crBBox.left;
   3029   FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
   3030 
   3031   CPWL_PathData PathArray[] = {
   3032       CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 30.0f,
   3033                                crBBox.top - fHeight / 2.0f),
   3034                     PWLPT_MOVETO),
   3035       CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 30.0f,
   3036                                crBBox.bottom + fHeight / 6.0f),
   3037                     PWLPT_LINETO),
   3038       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 4 / 15.0f,
   3039                                crBBox.top - fHeight / 2.0f),
   3040                     PWLPT_LINETO),
   3041       CPWL_PathData(
   3042           CPWL_Point(crBBox.left + fWidth / 30.0f, crBBox.top - fHeight / 6.0f),
   3043           PWLPT_LINETO),
   3044       CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 30.0f,
   3045                                crBBox.top - fHeight / 2.0f),
   3046                     PWLPT_LINETO)};
   3047 
   3048   if (type == PWLPT_STREAM)
   3049     sPathData = GetAppStreamFromArray(PathArray, 5);
   3050   else
   3051     GetPathDataFromArray(path, PathArray, 5);
   3052 }
   3053 
   3054 void CPWL_Utils::GetGraphics_Star(CFX_ByteString& sPathData,
   3055                                   CFX_PathData& path,
   3056                                   const CPDF_Rect& crBBox,
   3057                                   const PWL_PATH_TYPE type) {
   3058   FX_FLOAT fLongRadius =
   3059       (crBBox.top - crBBox.bottom) / (1 + (FX_FLOAT)cos(PWL_PI / 5.0f));
   3060   fLongRadius = fLongRadius * 0.7f;
   3061   FX_FLOAT fShortRadius = fLongRadius * 0.55f;
   3062   CPDF_Point ptCenter = CPDF_Point((crBBox.left + crBBox.right) / 2.0f,
   3063                                    (crBBox.top + crBBox.bottom) / 2.0f);
   3064 
   3065   FX_FLOAT px1[5], py1[5];
   3066   FX_FLOAT px2[5], py2[5];
   3067 
   3068   FX_FLOAT fAngel = PWL_PI / 10.0f;
   3069 
   3070   for (int32_t i = 0; i < 5; i++) {
   3071     px1[i] = ptCenter.x + fLongRadius * (FX_FLOAT)cos(fAngel);
   3072     py1[i] = ptCenter.y + fLongRadius * (FX_FLOAT)sin(fAngel);
   3073 
   3074     fAngel += PWL_PI * 2 / 5.0f;
   3075   }
   3076 
   3077   fAngel = PWL_PI / 5.0f + PWL_PI / 10.0f;
   3078 
   3079   for (int32_t j = 0; j < 5; j++) {
   3080     px2[j] = ptCenter.x + fShortRadius * (FX_FLOAT)cos(fAngel);
   3081     py2[j] = ptCenter.y + fShortRadius * (FX_FLOAT)sin(fAngel);
   3082 
   3083     fAngel += PWL_PI * 2 / 5.0f;
   3084   }
   3085 
   3086   CPWL_PathData PathArray[11];
   3087   PathArray[0] = CPWL_PathData(CPWL_Point(px1[0], py1[0]), PWLPT_MOVETO);
   3088   PathArray[1] = CPWL_PathData(CPWL_Point(px2[0], py2[0]), PWLPT_LINETO);
   3089 
   3090   for (int32_t k = 0; k < 4; k++) {
   3091     PathArray[(k + 1) * 2] =
   3092         CPWL_PathData(CPWL_Point(px1[k + 1], py1[k + 1]), PWLPT_LINETO);
   3093     PathArray[(k + 1) * 2 + 1] =
   3094         CPWL_PathData(CPWL_Point(px2[k + 1], py2[k + 1]), PWLPT_LINETO);
   3095   }
   3096 
   3097   PathArray[10] = CPWL_PathData(CPWL_Point(px1[0], py1[0]), PWLPT_LINETO);
   3098 
   3099   if (type == PWLPT_STREAM)
   3100     sPathData = GetAppStreamFromArray(PathArray, 11);
   3101   else
   3102     GetPathDataFromArray(path, PathArray, 11);
   3103 }
   3104 
   3105 void CPWL_Utils::GetGraphics_UpArrow(CFX_ByteString& sPathData,
   3106                                      CFX_PathData& path,
   3107                                      const CPDF_Rect& crBBox,
   3108                                      const PWL_PATH_TYPE type) {
   3109   FX_FLOAT fWidth = crBBox.right - crBBox.left;
   3110   FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
   3111 
   3112   CPWL_PathData PathArray[] = {
   3113       CPWL_PathData(
   3114           CPWL_Point(crBBox.left + fWidth / 2.0f, crBBox.top - fHeight / 15.0f),
   3115           PWLPT_MOVETO),
   3116       CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 10.0f,
   3117                                crBBox.top - fWidth * 3 / 5.0f),
   3118                     PWLPT_LINETO),
   3119       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.6f,
   3120                                crBBox.top - fWidth * 3 / 5.0f),
   3121                     PWLPT_LINETO),
   3122       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.6f,
   3123                                crBBox.bottom + fHeight / 15.0f),
   3124                     PWLPT_LINETO),
   3125       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.4f,
   3126                                crBBox.bottom + fHeight / 15.0f),
   3127                     PWLPT_LINETO),
   3128       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.4f,
   3129                                crBBox.top - fWidth * 3 / 5.0f),
   3130                     PWLPT_LINETO),
   3131       CPWL_PathData(
   3132           CPWL_Point(crBBox.left + fWidth / 10, crBBox.top - fWidth * 3 / 5.0f),
   3133           PWLPT_LINETO),
   3134       CPWL_PathData(
   3135           CPWL_Point(crBBox.left + fWidth / 2.0f, crBBox.top - fHeight / 15.0f),
   3136           PWLPT_LINETO)};
   3137 
   3138   if (type == PWLPT_STREAM)
   3139     sPathData = GetAppStreamFromArray(PathArray, 8);
   3140   else
   3141     GetPathDataFromArray(path, PathArray, 8);
   3142 }
   3143 
   3144 void CPWL_Utils::GetGraphics_UpLeftArrow(CFX_ByteString& sPathData,
   3145                                          CFX_PathData& path,
   3146                                          const CPDF_Rect& crBBox,
   3147                                          const PWL_PATH_TYPE type) {
   3148   FX_FLOAT fWidth = crBBox.right - crBBox.left;
   3149   FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
   3150   CPWL_Point leftup(crBBox.left, crBBox.top);
   3151   CPWL_Point rightdown(crBBox.right, crBBox.bottom);
   3152   FX_FLOAT k = -fHeight / fWidth;
   3153   CPWL_Point tail;
   3154   tail.x = crBBox.left + fWidth * 4 / 5.0f;
   3155   tail.y = k * (tail.x - crBBox.right) + rightdown.y;
   3156 
   3157   CPWL_PathData PathArray[] = {
   3158       CPWL_PathData(
   3159           CPWL_Point(
   3160               crBBox.left + fWidth / 20.0f,
   3161               k * (crBBox.left + fWidth / 20.0f - rightdown.x) + rightdown.y),
   3162           PWLPT_MOVETO),
   3163       CPWL_PathData(CPWL_Point(fHeight * 17 / 60.0f / k + tail.x +
   3164                                    fWidth / 10.0f + fWidth / 5.0f,
   3165                                -fWidth / 5.0f / k + tail.y -
   3166                                    fWidth / 10.0f / k + fHeight * 17 / 60.0f),
   3167                     PWLPT_LINETO),
   3168       CPWL_PathData(
   3169           CPWL_Point(fHeight * 17 / 60.0f / k + tail.x + fWidth / 10.0f,
   3170                      tail.y - fWidth / 10.0f / k + fHeight * 17 / 60.0f),
   3171           PWLPT_LINETO),
   3172       CPWL_PathData(
   3173           CPWL_Point(tail.x + fWidth / 10.0f, tail.y - fWidth / 10.0f / k),
   3174           PWLPT_LINETO),
   3175       CPWL_PathData(
   3176           CPWL_Point(tail.x - fWidth / 10.0f, tail.y + fWidth / 10.0f / k),
   3177           PWLPT_LINETO),
   3178       CPWL_PathData(
   3179           CPWL_Point(fHeight * 17 / 60.0f / k + tail.x - fWidth / 10.0f,
   3180                      tail.y + fWidth / 10.0f / k + fHeight * 17 / 60.0f),
   3181           PWLPT_LINETO),
   3182       CPWL_PathData(CPWL_Point(fHeight * 17 / 60.0f / k + tail.x -
   3183                                    fWidth / 10.0f - fWidth / 5.0f,
   3184                                fWidth / 5.0f / k + tail.y + fWidth / 10.0f / k +
   3185                                    fHeight * 17 / 60.0f),
   3186                     PWLPT_LINETO),
   3187       CPWL_PathData(
   3188           CPWL_Point(
   3189               crBBox.left + fWidth / 20.0f,
   3190               k * (crBBox.left + fWidth / 20.0f - rightdown.x) + rightdown.y),
   3191           PWLPT_LINETO)};
   3192 
   3193   if (type == PWLPT_STREAM)
   3194     sPathData = GetAppStreamFromArray(PathArray, 8);
   3195   else
   3196     GetPathDataFromArray(path, PathArray, 8);
   3197 }
   3198 
   3199 void CPWL_Utils::GetGraphics_Graph(CFX_ByteString& sPathData,
   3200                                    CFX_PathData& path,
   3201                                    const CPDF_Rect& crBBox,
   3202                                    const PWL_PATH_TYPE type) {
   3203   FX_FLOAT fWidth = crBBox.right - crBBox.left;
   3204   FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
   3205 
   3206   CPWL_PathData PathArray[] = {
   3207       CPWL_PathData(
   3208           CPWL_Point(crBBox.left + fWidth * 0.05f, crBBox.top - fWidth * 0.15f),
   3209           PWLPT_MOVETO),
   3210       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.25f,
   3211                                crBBox.top - fHeight * 0.15f),
   3212                     PWLPT_LINETO),
   3213       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.275f,
   3214                                crBBox.bottom + fHeight * 0.08f),
   3215                     PWLPT_LINETO),
   3216       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.05f,
   3217                                crBBox.bottom + fHeight * 0.08f),
   3218                     PWLPT_LINETO),
   3219       CPWL_PathData(
   3220           CPWL_Point(crBBox.left + fWidth * 0.05f, crBBox.top - fWidth * 0.15f),
   3221           PWLPT_LINETO),
   3222 
   3223       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.275f,
   3224                                crBBox.top - fWidth * 0.45f),
   3225                     PWLPT_MOVETO),
   3226       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.475f,
   3227                                crBBox.top - fWidth * 0.45f),
   3228                     PWLPT_LINETO),
   3229       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.475f,
   3230                                crBBox.bottom + fHeight * 0.08f),
   3231                     PWLPT_LINETO),
   3232       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.275f,
   3233                                crBBox.bottom + fHeight * 0.08f),
   3234                     PWLPT_LINETO),
   3235       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.275f,
   3236                                crBBox.top - fWidth * 0.45f),
   3237                     PWLPT_LINETO),
   3238 
   3239       CPWL_PathData(
   3240           CPWL_Point(crBBox.left + fWidth * 0.5f, crBBox.top - fHeight * 0.05f),
   3241           PWLPT_MOVETO),
   3242       CPWL_PathData(
   3243           CPWL_Point(crBBox.left + fWidth * 0.7f, crBBox.top - fHeight * 0.05f),
   3244           PWLPT_LINETO),
   3245       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.7f,
   3246                                crBBox.bottom + fHeight * 0.08f),
   3247                     PWLPT_LINETO),
   3248       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.5f,
   3249                                crBBox.bottom + fHeight * 0.08f),
   3250                     PWLPT_LINETO),
   3251       CPWL_PathData(
   3252           CPWL_Point(crBBox.left + fWidth * 0.5f, crBBox.top - fHeight * 0.05f),
   3253           PWLPT_LINETO),
   3254 
   3255       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.725f,
   3256                                crBBox.top - fWidth * 0.35f),
   3257                     PWLPT_MOVETO),
   3258       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.925f,
   3259                                crBBox.top - fWidth * 0.35f),
   3260                     PWLPT_LINETO),
   3261       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.925f,
   3262                                crBBox.bottom + fHeight * 0.08f),
   3263                     PWLPT_LINETO),
   3264       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.725f,
   3265                                crBBox.bottom + fHeight * 0.08f),
   3266                     PWLPT_LINETO),
   3267       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.725f,
   3268                                crBBox.top - fWidth * 0.35f),
   3269                     PWLPT_LINETO)};
   3270 
   3271   if (type == PWLPT_STREAM)
   3272     sPathData = GetAppStreamFromArray(PathArray, 20);
   3273   else
   3274     GetPathDataFromArray(path, PathArray, 20);
   3275 }
   3276 
   3277 void CPWL_Utils::GetGraphics_Paperclip(CFX_ByteString& sPathData,
   3278                                        CFX_PathData& path,
   3279                                        const CPDF_Rect& crBBox,
   3280                                        const PWL_PATH_TYPE type) {
   3281   FX_FLOAT fWidth = crBBox.right - crBBox.left;
   3282   FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
   3283 
   3284   CPWL_PathData PathArray[] = {
   3285       CPWL_PathData(
   3286           CPWL_Point(crBBox.left + fWidth / 60, crBBox.top - fHeight * 0.25f),
   3287           PWLPT_MOVETO),
   3288       CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 60,
   3289                                crBBox.bottom + fHeight * 0.25f),
   3290                     PWLPT_LINETO),
   3291       CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 60,
   3292                                crBBox.bottom + fHeight * 0.25f -
   3293                                    fWidth * 57 / 60.0f * 0.35f),
   3294                     PWLPT_BEZIERTO),
   3295       CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 30,
   3296                                crBBox.bottom + fHeight * 0.25f -
   3297                                    fWidth * 57 / 60.0f * 0.35f),
   3298                     PWLPT_BEZIERTO),
   3299       CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 30,
   3300                                crBBox.bottom + fHeight * 0.25f),
   3301                     PWLPT_BEZIERTO),
   3302 
   3303       CPWL_PathData(
   3304           CPWL_Point(crBBox.right - fWidth / 30, crBBox.top - fHeight * 0.33f),
   3305           PWLPT_LINETO),
   3306       CPWL_PathData(
   3307           CPWL_Point(crBBox.right - fWidth / 30,
   3308                      crBBox.top - fHeight * 0.33f + fHeight / 15 * 0.5f),
   3309           PWLPT_BEZIERTO),
   3310       CPWL_PathData(
   3311           CPWL_Point(crBBox.right - fWidth / 30 - fWidth * 0.12f,
   3312                      crBBox.top - fHeight * 0.33f + fHeight / 15 * 0.5f),
   3313           PWLPT_BEZIERTO),
   3314       CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 30 - fWidth * 0.12f,
   3315                                crBBox.top - fHeight * 0.33f),
   3316                     PWLPT_BEZIERTO),
   3317 
   3318       CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 30 - fWidth * 0.12f,
   3319                                crBBox.bottom + fHeight * 0.2f),
   3320                     PWLPT_LINETO),
   3321       CPWL_PathData(
   3322           CPWL_Point(crBBox.right - fWidth / 30 - fWidth * 0.12f,
   3323                      crBBox.bottom + fHeight * 0.2f -
   3324                          (fWidth * 57 / 60.0f - fWidth * 0.24f) * 0.25f),
   3325           PWLPT_BEZIERTO),
   3326       CPWL_PathData(
   3327           CPWL_Point(crBBox.left + fWidth / 60 + fWidth * 0.12f,
   3328                      crBBox.bottom + fHeight * 0.2f -
   3329                          (fWidth * 57 / 60.0f - fWidth * 0.24f) * 0.25f),
   3330           PWLPT_BEZIERTO),
   3331       CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 60 + fWidth * 0.12f,
   3332                                crBBox.bottom + fHeight * 0.2f),
   3333                     PWLPT_BEZIERTO),
   3334 
   3335       CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 60 + fWidth * 0.12f,
   3336                                crBBox.top - fHeight * 0.2f),
   3337                     PWLPT_LINETO),
   3338       CPWL_PathData(
   3339           CPWL_Point(crBBox.left + fWidth / 60 + fWidth * 0.12f,
   3340                      crBBox.top - fHeight * 0.2f +
   3341                          (fWidth * 11 / 12.0f - fWidth * 0.36f) * 0.25f),
   3342           PWLPT_BEZIERTO),
   3343       CPWL_PathData(
   3344           CPWL_Point(crBBox.right - fWidth / 15 - fWidth * 0.24f,
   3345                      crBBox.top - fHeight * 0.2f +
   3346                          (fWidth * 11 / 12.0f - fWidth * 0.36f) * 0.25f),
   3347           PWLPT_BEZIERTO),
   3348       CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 15 - fWidth * 0.24f,
   3349                                crBBox.top - fHeight * 0.2f),
   3350                     PWLPT_BEZIERTO),
   3351 
   3352       CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 15 - fWidth * 0.24f,
   3353                                crBBox.bottom + fHeight * 0.25f),
   3354                     PWLPT_LINETO),
   3355       CPWL_PathData(
   3356           CPWL_Point(crBBox.right - fWidth / 15 - fWidth * 0.24f,
   3357                      crBBox.bottom + fHeight * 0.25f -
   3358                          (fWidth * 14 / 15.0f - fWidth * 0.53f) * 0.25f),
   3359           PWLPT_BEZIERTO),
   3360       CPWL_PathData(
   3361           CPWL_Point(crBBox.left + fWidth * 0.29f,
   3362                      crBBox.bottom + fHeight * 0.25f -
   3363                          (fWidth * 14 / 15.0f - fWidth * 0.53f) * 0.25f),
   3364           PWLPT_BEZIERTO),
   3365       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.29f,
   3366                                crBBox.bottom + fHeight * 0.25f),
   3367                     PWLPT_BEZIERTO),
   3368 
   3369       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.29f,
   3370                                crBBox.top - fHeight * 0.33f),
   3371                     PWLPT_LINETO),
   3372       CPWL_PathData(
   3373           CPWL_Point(crBBox.left + fWidth * 0.29f,
   3374                      crBBox.top - fHeight * 0.33f + fWidth * 0.12f * 0.35f),
   3375           PWLPT_BEZIERTO),
   3376       CPWL_PathData(
   3377           CPWL_Point(crBBox.left + fWidth * 0.17f,
   3378                      crBBox.top - fHeight * 0.33f + fWidth * 0.12f * 0.35f),
   3379           PWLPT_BEZIERTO),
   3380       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.17f,
   3381                                crBBox.top - fHeight * 0.33f),
   3382                     PWLPT_BEZIERTO),
   3383 
   3384       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.17f,
   3385                                crBBox.bottom + fHeight * 0.3f),
   3386                     PWLPT_LINETO),
   3387       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.17f,
   3388                                crBBox.bottom + fHeight * 0.3f -
   3389                                    fWidth * (14 / 15.0f - 0.29f) * 0.35f),
   3390                     PWLPT_BEZIERTO),
   3391       CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 15 - fWidth * 0.12f,
   3392                                crBBox.bottom + fHeight * 0.3f -
   3393                                    fWidth * (14 / 15.0f - 0.29f) * 0.35f),
   3394                     PWLPT_BEZIERTO),
   3395       CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 15 - fWidth * 0.12f,
   3396                                crBBox.bottom + fHeight * 0.3f),
   3397                     PWLPT_BEZIERTO),
   3398 
   3399       CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 15 - fWidth * 0.12f,
   3400                                crBBox.top - fHeight * 0.25f),
   3401                     PWLPT_LINETO),
   3402       CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 15 - fWidth * 0.12f,
   3403                                crBBox.top - fHeight * 0.25f +
   3404                                    fWidth * 0.35f * (11 / 12.0f - 0.12f)),
   3405                     PWLPT_BEZIERTO),
   3406       CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 60,
   3407                                crBBox.top - fHeight * 0.25f +
   3408                                    fWidth * 0.35f * (11 / 12.0f - 0.12f)),
   3409                     PWLPT_BEZIERTO),
   3410       CPWL_PathData(
   3411           CPWL_Point(crBBox.left + fWidth / 60, crBBox.top - fHeight * 0.25f),
   3412           PWLPT_BEZIERTO)};
   3413 
   3414   if (type == PWLPT_STREAM)
   3415     sPathData = GetAppStreamFromArray(PathArray, 33);
   3416   else
   3417     GetPathDataFromArray(path, PathArray, 33);
   3418 }
   3419 
   3420 void CPWL_Utils::GetGraphics_Attachment(CFX_ByteString& sPathData,
   3421                                         CFX_PathData& path,
   3422                                         const CPDF_Rect& crBBox,
   3423                                         const PWL_PATH_TYPE type) {
   3424   FX_FLOAT fWidth = crBBox.right - crBBox.left;
   3425   FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
   3426 
   3427   CPWL_PathData PathArray[] = {
   3428       CPWL_PathData(
   3429           CPWL_Point(crBBox.left + fWidth * 0.25f, crBBox.top - fHeight * 0.1f),
   3430           PWLPT_MOVETO),
   3431       CPWL_PathData(
   3432           CPWL_Point(crBBox.left + fWidth * 0.4f, crBBox.top - fHeight * 0.23f),
   3433           PWLPT_LINETO),
   3434       CPWL_PathData(
   3435           CPWL_Point(crBBox.left + fWidth * 0.4f, crBBox.top - fHeight * 0.5f),
   3436           PWLPT_LINETO),
   3437       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.4f,
   3438                                crBBox.top - fHeight * 0.5f + fWidth * 0.04f),
   3439                     PWLPT_BEZIERTO),
   3440       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.6f,
   3441                                crBBox.top - fHeight * 0.5f + fWidth * 0.04f),
   3442                     PWLPT_BEZIERTO),
   3443       CPWL_PathData(
   3444           CPWL_Point(crBBox.left + fWidth * 0.6f, crBBox.top - fHeight * 0.5f),
   3445           PWLPT_BEZIERTO),
   3446 
   3447       CPWL_PathData(
   3448           CPWL_Point(crBBox.left + fWidth * 0.6f, crBBox.top - fHeight * 0.23f),
   3449           PWLPT_LINETO),
   3450       CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.25f,
   3451                                crBBox.top - fHeight * 0.1f),
   3452                     PWLPT_LINETO),
   3453       CPWL_PathData(
   3454           CPWL_Point(crBBox.left + fWidth * 0.25f, crBBox.top - fHeight * 0.1f),
   3455           PWLPT_LINETO),
   3456       CPWL_PathData(
   3457           CPWL_Point(crBBox.left + fWidth * 0.4f, crBBox.top - fHeight * 0.23f),
   3458           PWLPT_LINETO),
   3459       CPWL_PathData(
   3460           CPWL_Point(crBBox.left + fWidth * 0.6f, crBBox.top - fHeight * 0.23f),
   3461           PWLPT_LINETO),
   3462 
   3463       CPWL_PathData(
   3464           CPWL_Point(crBBox.left + fWidth * 0.4f, crBBox.top - fHeight * 0.5f),
   3465           PWLPT_MOVETO),
   3466       CPWL_PathData(
   3467           CPWL_Point(crBBox.left + fWidth * 0.4f - fWidth * 0.25f * 0.4f,
   3468                      crBBox.top - fHeight * 0.5f),
   3469           PWLPT_BEZIERTO),
   3470       CPWL_PathData(
   3471           CPWL_Point(crBBox.left + fWidth * 0.15f,
   3472                      crBBox.top - fHeight * 0.65f + fHeight * 0.15f * 0.4f),
   3473           PWLPT_BEZIERTO),
   3474       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.15f,
   3475                                crBBox.top - fHeight * 0.65f),
   3476                     PWLPT_BEZIERTO),
   3477 
   3478       CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.15f,
   3479                                crBBox.top - fHeight * 0.65f),
   3480                     PWLPT_LINETO),
   3481       CPWL_PathData(
   3482           CPWL_Point(crBBox.right - fWidth * 0.15f,
   3483                      crBBox.top - fHeight * 0.65f + fHeight * 0.15f * 0.4f),
   3484           PWLPT_BEZIERTO),
   3485       CPWL_PathData(
   3486           CPWL_Point(crBBox.left + fWidth * 0.6f + fWidth * 0.25f * 0.4f,
   3487                      crBBox.top - fHeight * 0.5f),
   3488           PWLPT_BEZIERTO),
   3489       CPWL_PathData(
   3490           CPWL_Point(crBBox.left + fWidth * 0.6f, crBBox.top - fHeight * 0.5f),
   3491           PWLPT_BEZIERTO),
   3492 
   3493       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.6f,
   3494                                crBBox.top - fHeight * 0.5f + fWidth * 0.04f),
   3495                     PWLPT_BEZIERTO),
   3496       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.4f,
   3497                                crBBox.top - fHeight * 0.5f + fWidth * 0.04f),
   3498                     PWLPT_BEZIERTO),
   3499       CPWL_PathData(
   3500           CPWL_Point(crBBox.left + fWidth * 0.4f, crBBox.top - fHeight * 0.5f),
   3501           PWLPT_BEZIERTO),
   3502 
   3503       CPWL_PathData(
   3504           CPWL_Point(crBBox.left + fWidth * 0.5f, crBBox.top - fHeight * 0.65f),
   3505           PWLPT_MOVETO),
   3506       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.5f,
   3507                                crBBox.bottom + fHeight * 0.1f),
   3508                     PWLPT_LINETO)};
   3509 
   3510   if (type == PWLPT_STREAM)
   3511     sPathData = GetAppStreamFromArray(PathArray, 24);
   3512   else
   3513     GetPathDataFromArray(path, PathArray, 24);
   3514 }
   3515 
   3516 void CPWL_Utils::GetGraphics_Tag(CFX_ByteString& sPathData,
   3517                                  CFX_PathData& path,
   3518                                  const CPDF_Rect& crBBox,
   3519                                  const PWL_PATH_TYPE type) {
   3520   FX_FLOAT fWidth = crBBox.right - crBBox.left;
   3521   FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
   3522 
   3523   CPWL_PathData PathArray[] = {
   3524       CPWL_PathData(
   3525           CPWL_Point(crBBox.left + fWidth * 0.4f, crBBox.top - fHeight * 0.1f),
   3526           PWLPT_MOVETO),
   3527       CPWL_PathData(
   3528           CPWL_Point(crBBox.left + fWidth * 0.1f, crBBox.top - fHeight * 0.5f),
   3529           PWLPT_LINETO),
   3530       CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.3f,
   3531                                crBBox.bottom + fHeight * 0.1f),
   3532                     PWLPT_LINETO),
   3533       CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.1f,
   3534                                crBBox.bottom + fHeight * 0.1f),
   3535                     PWLPT_LINETO),
   3536       CPWL_PathData(
   3537           CPWL_Point(crBBox.right - fWidth * 0.1f, crBBox.top - fHeight * 0.1f),
   3538           PWLPT_LINETO),
   3539       CPWL_PathData(
   3540           CPWL_Point(crBBox.left + fWidth * 0.4f, crBBox.top - fHeight * 0.1f),
   3541           PWLPT_LINETO),
   3542       CPWL_PathData(
   3543           CPWL_Point(crBBox.left + fWidth * 0.4f, crBBox.top - fHeight * 0.3f),
   3544           PWLPT_MOVETO),
   3545       CPWL_PathData(
   3546           CPWL_Point(crBBox.right - fWidth * 0.2f, crBBox.top - fHeight * 0.3f),
   3547           PWLPT_LINETO),
   3548       CPWL_PathData(
   3549           CPWL_Point(crBBox.left + fWidth * 0.4f, crBBox.top - fHeight * 0.5f),
   3550           PWLPT_MOVETO),
   3551       CPWL_PathData(
   3552           CPWL_Point(crBBox.right - fWidth * 0.2f, crBBox.top - fHeight * 0.5f),
   3553           PWLPT_LINETO),
   3554       CPWL_PathData(
   3555           CPWL_Point(crBBox.left + fWidth * 0.4f, crBBox.top - fHeight * 0.7f),
   3556           PWLPT_MOVETO),
   3557       CPWL_PathData(
   3558           CPWL_Point(crBBox.right - fWidth * 0.2f, crBBox.top - fHeight * 0.7f),
   3559           PWLPT_LINETO)};
   3560 
   3561   if (type == PWLPT_STREAM)
   3562     sPathData = GetAppStreamFromArray(PathArray, 12);
   3563   else
   3564     GetPathDataFromArray(path, PathArray, 12);
   3565 }
   3566 
   3567 void CPWL_Utils::GetGraphics_Foxit(CFX_ByteString& sPathData,
   3568                                    CFX_PathData& path,
   3569                                    const CPDF_Rect& crBBox,
   3570                                    const PWL_PATH_TYPE type) {
   3571   FX_FLOAT fOutWidth = crBBox.right - crBBox.left;
   3572   FX_FLOAT fOutHeight = crBBox.top - crBBox.bottom;
   3573 
   3574   CPDF_Rect crInBox = crBBox;
   3575   crInBox.left = crBBox.left + fOutWidth * 0.08f;
   3576   crInBox.right = crBBox.right - fOutWidth * 0.08f;
   3577   crInBox.top = crBBox.top - fOutHeight * 0.08f;
   3578   crInBox.bottom = crBBox.bottom + fOutHeight * 0.08f;
   3579 
   3580   FX_FLOAT fWidth = crInBox.right - crInBox.left;
   3581   FX_FLOAT fHeight = crInBox.top - crInBox.bottom;
   3582 
   3583   CPWL_PathData PathArray[] = {
   3584       CPWL_PathData(CPWL_Point(crInBox.left, crInBox.top), PWLPT_MOVETO),
   3585       CPWL_PathData(CPWL_Point(crInBox.left + fWidth * 0.45f, crInBox.top),
   3586                     PWLPT_LINETO),
   3587       CPWL_PathData(CPWL_Point(crInBox.left + fWidth * 0.45f,
   3588                                crInBox.top - PWL_BEZIER * fHeight * 0.4f),
   3589                     PWLPT_BEZIERTO),
   3590       CPWL_PathData(CPWL_Point(crInBox.left + fWidth * 0.45f -
   3591                                    PWL_BEZIER * fWidth * 0.45f,
   3592                                crInBox.top - fHeight * 0.4f),
   3593                     PWLPT_BEZIERTO),
   3594       CPWL_PathData(CPWL_Point(crInBox.left, crInBox.top - fHeight * 0.4f),
   3595                     PWLPT_BEZIERTO),
   3596       CPWL_PathData(CPWL_Point(crInBox.left, crInBox.top), PWLPT_LINETO),
   3597 
   3598       CPWL_PathData(CPWL_Point(crInBox.left + fWidth * 0.60f, crInBox.top),
   3599                     PWLPT_MOVETO),
   3600       CPWL_PathData(CPWL_Point(crInBox.left + fWidth * 0.75f, crInBox.top),
   3601                     PWLPT_LINETO),
   3602       CPWL_PathData(CPWL_Point(crInBox.left + fWidth * 0.75f,
   3603                                crInBox.top - PWL_BEZIER * fHeight * 0.7f),
   3604                     PWLPT_BEZIERTO),
   3605       CPWL_PathData(CPWL_Point(crInBox.left + fWidth * 0.75f -
   3606                                    PWL_BEZIER * fWidth * 0.75f,
   3607                                crInBox.top - fHeight * 0.7f),
   3608                     PWLPT_BEZIERTO),
   3609       CPWL_PathData(CPWL_Point(crInBox.left, crInBox.top - fHeight * 0.7f),
   3610                     PWLPT_BEZIERTO),
   3611       CPWL_PathData(CPWL_Point(crInBox.left, crInBox.top - fHeight * 0.55f),
   3612                     PWLPT_LINETO),
   3613       CPWL_PathData(CPWL_Point(crInBox.left + PWL_BEZIER * fWidth * 0.60f,
   3614                                crInBox.top - fHeight * 0.55f),
   3615                     PWLPT_BEZIERTO),
   3616       CPWL_PathData(CPWL_Point(crInBox.left + fWidth * 0.60f,
   3617                                crInBox.top - PWL_BEZIER * fHeight * 0.55f),
   3618                     PWLPT_BEZIERTO),
   3619       CPWL_PathData(CPWL_Point(crInBox.left + fWidth * 0.60f, crInBox.top),
   3620                     PWLPT_BEZIERTO),
   3621 
   3622       CPWL_PathData(CPWL_Point(crInBox.left + fWidth * 0.90f, crInBox.top),
   3623                     PWLPT_MOVETO),
   3624       CPWL_PathData(CPWL_Point(crInBox.left + fWidth * 0.90f,
   3625                                crInBox.top - PWL_BEZIER * fHeight * 0.85f),
   3626                     PWLPT_BEZIERTO),
   3627       CPWL_PathData(CPWL_Point(crInBox.left + fWidth * 0.90f -
   3628                                    PWL_BEZIER * fWidth * 0.90f,
   3629                                crInBox.top - fHeight * 0.85f),
   3630                     PWLPT_BEZIERTO),
   3631       CPWL_PathData(CPWL_Point(crInBox.left, crInBox.top - fHeight * 0.85f),
   3632                     PWLPT_BEZIERTO),
   3633       CPWL_PathData(CPWL_Point(crInBox.left, crInBox.bottom), PWLPT_LINETO),
   3634       CPWL_PathData(CPWL_Point(crInBox.right, crInBox.bottom), PWLPT_LINETO),
   3635       CPWL_PathData(CPWL_Point(crInBox.right, crInBox.top), PWLPT_LINETO),
   3636       CPWL_PathData(CPWL_Point(crInBox.left + fWidth * 0.90f, crInBox.top),
   3637                     PWLPT_LINETO),
   3638   };
   3639 
   3640   if (type == PWLPT_STREAM)
   3641     sPathData = GetAppStreamFromArray(PathArray, 23);
   3642   else
   3643     GetPathDataFromArray(path, PathArray, 23);
   3644 }
   3645 
   3646 void CPWL_Color::ConvertColorType(int32_t other_nColorType) {
   3647   switch (other_nColorType) {
   3648     case COLORTYPE_TRANSPARENT:
   3649       break;
   3650     case COLORTYPE_GRAY:
   3651       switch (other_nColorType) {
   3652         case COLORTYPE_RGB:
   3653           CPWL_Utils::ConvertGRAY2RGB(fColor1, fColor1, fColor2, fColor3);
   3654           break;
   3655         case COLORTYPE_CMYK:
   3656           CPWL_Utils::ConvertGRAY2CMYK(fColor1, fColor1, fColor2, fColor3,
   3657                                        fColor4);
   3658           break;
   3659       }
   3660       break;
   3661     case COLORTYPE_RGB:
   3662       switch (other_nColorType) {
   3663         case COLORTYPE_GRAY:
   3664           CPWL_Utils::ConvertRGB2GRAY(fColor1, fColor2, fColor3, fColor1);
   3665           break;
   3666         case COLORTYPE_CMYK:
   3667           CPWL_Utils::ConvertRGB2CMYK(fColor1, fColor2, fColor3, fColor1,
   3668                                       fColor2, fColor3, fColor4);
   3669           break;
   3670       }
   3671       break;
   3672     case COLORTYPE_CMYK:
   3673       switch (other_nColorType) {
   3674         case COLORTYPE_GRAY:
   3675           CPWL_Utils::ConvertCMYK2GRAY(fColor1, fColor2, fColor3, fColor4,
   3676                                        fColor1);
   3677           break;
   3678         case COLORTYPE_RGB:
   3679           CPWL_Utils::ConvertCMYK2RGB(fColor1, fColor2, fColor3, fColor4,
   3680                                       fColor1, fColor2, fColor3);
   3681           break;
   3682       }
   3683       break;
   3684   }
   3685   nColorType = other_nColorType;
   3686 }
   3687