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

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

#include "../../include/pdfwindow/PDFWindow.h"
#include "../../include/pdfwindow/PWL_Wnd.h"
#include "../../include/pdfwindow/PWL_Utils.h"
#include "../../include/pdfwindow/PWL_Icon.h"

#define IsFloatZero(f)						((f) < 0.0001 && (f) > -0.0001)
#define IsFloatBigger(fa,fb)				((fa) > (fb) && !IsFloatZero((fa) - (fb)))
#define IsFloatSmaller(fa,fb)				((fa) < (fb) && !IsFloatZero((fa) - (fb)))
#define IsFloatEqual(fa,fb)					IsFloatZero((fa)-(fb))

/* ---------------------------- CPWL_Utils ------------------------------ */

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

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

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

	return csAP.GetByteString();
}

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

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


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

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

	return rcRet;
}

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

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

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

	return left < right && bottom < top;
}

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

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

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

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

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

	return wrRet;
}

CFX_ByteString CPWL_Utils::GetAP_Check(const CPDF_Rect & crBBox)
{
	CFX_ByteTextBuf csAP;

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

	const int32_t num = 8;

	CPWL_Point pts[num*3] =
	{
		//1
		CPWL_Point(0.28f, 0.52f),
		CPWL_Point(0.27f, 0.48f),
		CPWL_Point(0.29f, 0.40f),

		//2
		CPWL_Point(0.30f, 0.33f),
		CPWL_Point(0.31f, 0.29f),
		CPWL_Point(0.31f, 0.28f),

		//3
		CPWL_Point(0.39f, 0.28f),
		CPWL_Point(0.49f, 0.29f),
		CPWL_Point(0.77f, 0.67f),

		//4
		CPWL_Point(0.76f, 0.68f),
		CPWL_Point(0.78f, 0.69f),
		CPWL_Point(0.76f, 0.75f),

		//5
		CPWL_Point(0.76f, 0.75f),
		CPWL_Point(0.73f, 0.80f),
		CPWL_Point(0.68f, 0.75f),

		//6
		CPWL_Point(0.68f, 0.74f),
		CPWL_Point(0.68f, 0.74f),
		CPWL_Point(0.44f, 0.47f),

		//7
		CPWL_Point(0.43f, 0.47f),
		CPWL_Point(0.40f, 0.47f),
		CPWL_Point(0.41f, 0.58f),

		//8
		CPWL_Point(0.40f, 0.60f),
		CPWL_Point(0.28f, 0.66f),
		CPWL_Point(0.30f, 0.56f)
	};

	for (int32_t j=0; j<num*3; j++)
	{
		pts[j].x *= fWidth;
		pts[j].x += crBBox.left;

		pts[j].y *= fHeight;
		pts[j].y += crBBox.bottom;
	}

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

	for (int32_t i=0; i<num; i++)
	{
		int32_t nCur = i*3;
		int32_t n1 = i*3 + 1;
		int32_t n2 = i*3 + 2;
		int32_t nNext = (i < num-1 ? (i+1)*3 : 0);

		FX_FLOAT px1 = pts[n1].x - pts[nCur].x;
		FX_FLOAT py1 = pts[n1].y - pts[nCur].y;
		FX_FLOAT px2 = pts[n2].x - pts[nNext].x;
		FX_FLOAT py2 = pts[n2].y - pts[nNext].y;

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

	return csAP.GetByteString();
}

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

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

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

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

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

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

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

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

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

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

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

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

	return csAP.GetByteString();
}

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

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

	return csAP.GetByteString();
}

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

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

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

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

	return csAP.GetByteString();
}

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

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

	return csAP.GetByteString();
}

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

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

	FX_FLOAT px[5],py[5];

	FX_FLOAT fAngel = PWL_PI/10.0f;

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

		fAngel += PWL_PI * 2 / 5.0f;
	}

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

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

	return csAP.GetByteString();
}

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

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

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

	FX_FLOAT px,py;

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


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

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

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

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

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

	return csAP.GetByteString();
}


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

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

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

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

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

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

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

CFX_ByteString CPWL_Utils::GetRectFillAppStream(const CPDF_Rect & rect,const CPWL_Color & color)
{
	CFX_ByteTextBuf sAppStream;

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

	return sAppStream.GetByteString();
}

CFX_ByteString CPWL_Utils::GetCircleFillAppStream(const CPDF_Rect & rect,const CPWL_Color & color)
{
	CFX_ByteTextBuf sAppStream;

	CFX_ByteString sColor = GetColorAppStream(color,TRUE);
	if (sColor.GetLength() > 0)
	{
		sAppStream << "q\n" << sColor << CPWL_Utils::GetAP_Circle(rect) << "f\nQ\n";
	}

	return sAppStream.GetByteString();
}

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

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

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

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

CFX_ByteString CPWL_Utils::GetEditAppStream(IFX_Edit* pEdit, const CPDF_Point & ptOffset, const CPVT_WordRange * pRange,
														FX_BOOL bContinuous, FX_WORD SubWord)
{
	return IFX_Edit::GetEditAppearanceStream(pEdit,ptOffset,pRange,bContinuous,SubWord);
}

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

static CFX_ByteString GetSquigglyAppearanceStream(FX_FLOAT fStartX, FX_FLOAT fEndX, FX_FLOAT fY, FX_FLOAT fStep)
{
	CFX_ByteTextBuf sRet;

	sRet << "0 w\n" << fStartX << " " << fY << " m\n";

	FX_FLOAT fx;
	int32_t i;

	for (i=1,fx=fStartX+fStep; fx<fEndX; fx+=fStep,i++)
	{
		sRet << fx << " " << fY + (i&1)*fStep << " l\n";
	}

	sRet << "S\n";

	return sRet.GetByteString();
}

static CFX_ByteString GetWordSpellCheckAppearanceStream(IFX_Edit_Iterator* pIterator, const CPDF_Point & ptOffset,
																  const CPVT_WordRange & wrWord)
{
	CFX_ByteTextBuf sRet;

	FX_FLOAT fStartX = 0.0f;
	FX_FLOAT fEndX = 0.0f;
	FX_FLOAT fY = 0.0f;
	FX_FLOAT fStep = 0.0f;

	FX_BOOL bBreak = FALSE;

	if (pIterator)
	{
		pIterator->SetAt(wrWord.BeginPos);

		do
		{
			CPVT_WordPlace place = pIterator->GetAt();

			CPVT_Line line;
			if (pIterator->GetLine(line))
			{
				fY = line.ptLine.y;
				fStep = (line.fLineAscent - line.fLineDescent) / 16.0f;
			}

			if (place.LineCmp(wrWord.BeginPos) == 0)
			{
				pIterator->SetAt(wrWord.BeginPos);
				CPVT_Word word;
				if (pIterator->GetWord(word))
				{
					fStartX = word.ptWord.x;
				}
			}
			else
			{
				fStartX = line.ptLine.x;
			}

			if (place.LineCmp(wrWord.EndPos) == 0)
			{
				pIterator->SetAt(wrWord.EndPos);
				CPVT_Word word;
				if (pIterator->GetWord(word))
				{
					fEndX = word.ptWord.x + word.fWidth;
				}

				bBreak = TRUE;
			}
			else
			{
				fEndX = line.ptLine.x + line.fLineWidth;
			}

			sRet << GetSquigglyAppearanceStream(fStartX + ptOffset.x, fEndX + ptOffset.x, fY + ptOffset.y,fStep);

			if (bBreak) break;
		}
		while (pIterator->NextLine());
	}

	return sRet.GetByteString();
}

CFX_ByteString CPWL_Utils::GetSpellCheckAppStream(IFX_Edit* pEdit, IPWL_SpellCheck* pSpellCheck, const CPDF_Point & ptOffset,
								const CPVT_WordRange * pRange)
{
	ASSERT(pEdit != NULL);
	ASSERT(pSpellCheck != NULL);

	CFX_ByteTextBuf sRet;

	if (pRange && pRange->IsExist())
	{
		if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator())
		{
			pIterator->SetAt(pRange->BeginPos);

			FX_BOOL bLatinWord = FALSE;
			CPVT_WordPlace wpWordStart;
			CFX_ByteString sWord;

			CPVT_WordPlace oldplace;
			while (pIterator->NextWord())
			{
				CPVT_WordPlace place = pIterator->GetAt();
				if (pRange && place.WordCmp(pRange->EndPos) > 0) break;

				CPVT_Word word;
				if (pIterator->GetWord(word))
				{
					if (FX_EDIT_ISLATINWORD(word.Word))
					{
						if (!bLatinWord)
						{
							wpWordStart = place;
							bLatinWord = TRUE;
						}

						sWord += (char)word.Word;
						oldplace = place;
					}
					else
					{
						if (bLatinWord)
						{
							if (!pSpellCheck->CheckWord(sWord))
							{
								sRet << GetWordSpellCheckAppearanceStream(pIterator,ptOffset,CPVT_WordRange(wpWordStart,oldplace));
								pIterator->SetAt(place);
							}
							bLatinWord = FALSE;
						}

						sWord.Empty();
					}
				}
				else
				{
					if (bLatinWord)
					{
						if (!pSpellCheck->CheckWord(sWord))
							sRet << GetWordSpellCheckAppearanceStream(pIterator,ptOffset,CPVT_WordRange(wpWordStart,oldplace));
						bLatinWord = FALSE;
						sWord.Empty();
					}
				}
			}

			if (bLatinWord)
			{
				if (!pSpellCheck->CheckWord(sWord))
					sRet << GetWordSpellCheckAppearanceStream(pIterator,ptOffset,CPVT_WordRange(wpWordStart,oldplace));

				bLatinWord = FALSE;
				sWord.Empty();
			}
		}
	}

	return sRet.GetByteString();
}

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

	if (IFX_Edit * pEdit = IFX_Edit::NewEdit())
	{
		pEdit->SetFontMap(pFontMap);
		pEdit->SetPlateRect(rcBBox);
		pEdit->SetAlignmentH(nAlignmentH);
		pEdit->SetAlignmentV(nAlignmentV);
		pEdit->SetMultiLine(bMultiLine);
		pEdit->SetAutoReturn(bAutoReturn);
		if (IsFloatZero(fFontSize))
			pEdit->SetAutoFontSize(TRUE);
		else
			pEdit->SetFontSize(fFontSize);

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

		CFX_ByteString sEdit = CPWL_Utils::GetEditAppStream(pEdit, CPDF_Point(0.0f,0.0f));
		if (sEdit.GetLength() > 0)
		{
			sRet << "BT\n" << CPWL_Utils::GetColorAppStream(crText) << sEdit << "ET\n";
		}
		IFX_Edit::DelEdit(pEdit);
	}

	return sRet.GetByteString();
}

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

	if (IFX_Edit * pEdit = IFX_Edit::NewEdit())
	{
		pEdit->SetFontMap(pFontMap);
		pEdit->SetAlignmentH(1);
		pEdit->SetAlignmentV(1);
		pEdit->SetMultiLine(FALSE);
		pEdit->SetAutoReturn(FALSE);
		if (IsFloatZero(fFontSize))
			pEdit->SetAutoFontSize(TRUE);
		else
			pEdit->SetFontSize(fFontSize);

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

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

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

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

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

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

			break;
		case PPBL_LABELTOPICONBOTTOM:

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

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

			break;
		case PPBL_ICONLEFTLABELRIGHT:

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

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

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

			break;
		case PPBL_LABELLEFTICONRIGHT:

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

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

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

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

		CFX_ByteTextBuf sAppStream,sTemp;

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

		Icon.Destroy();

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

		IFX_Edit::DelEdit(pEdit);

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

		return sAppStream.GetByteString();
	}

	return "";
}

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

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

	return sColorStream.GetByteString();
}

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

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

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

		sAppStream << "q\n";

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

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

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

		sAppStream << "Q\n";
	}

	return sAppStream.GetByteString();
}

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






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

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

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

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

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

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

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

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

		sAppStream << "Q\n";
	}

	return sAppStream.GetByteString();
}

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

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

	return sRet;
}

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

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

	return sRet;
}

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

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

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

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

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

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

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

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

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

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

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

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

	return sAppStream.GetByteString();
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	CFX_GraphStateData gsd;
	gsd.m_LineWidth = fWidth;

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

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

	CFX_GraphStateData gsd;
	gsd.m_LineWidth = fWidth;

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

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

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

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

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

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

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

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

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

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

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

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

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

				CFX_PathData pathLT;

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

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

				CFX_PathData pathRB;

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

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

				CFX_PathData path;

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

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

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

				CFX_GraphStateData gsd;
				gsd.m_LineWidth = fWidth;

				pDevice->DrawPath(&path, pUser2Device, &gsd,0,  PWLColorToFXColor(color,nTransparancy), FXFILL_ALTERNATE);
			}
			break;
		case PBS_SHADOW:
			{
				CFX_PathData path;
				path.AppendRect(fLeft, fBottom, fRight, fTop);
				path.AppendRect(fLeft + fWidth, fBottom + fWidth, fRight - fWidth, fTop - fWidth);
				pDevice->DrawPath(&path, pUser2Device, NULL, PWLColorToFXColor(color,nTransparancy/2), 0, FXFILL_ALTERNATE);
			}
			break;
		}
	}
}

static void AddSquigglyPath(CFX_PathData & PathData, FX_FLOAT fStartX, FX_FLOAT fEndX, FX_FLOAT fY, FX_FLOAT fStep)
{
	PathData.AddPointCount(1);
	PathData.SetPoint(PathData.GetPointCount() - 1, fStartX, fY, FXPT_MOVETO);

	FX_FLOAT fx;
	int32_t i;

	for (i=1,fx=fStartX+fStep; fx<fEndX; fx+=fStep,i++)
	{
		PathData.AddPointCount(1);
		PathData.SetPoint(PathData.GetPointCount() - 1, fx, fY + (i&1)*fStep, FXPT_LINETO);
	}
}

static void AddSpellCheckObj(CFX_PathData & PathData, IFX_Edit* pEdit, const CPVT_WordRange& wrWord)
{
	FX_FLOAT fStartX = 0.0f;
	FX_FLOAT fEndX = 0.0f;
	FX_FLOAT fY = 0.0f;
	FX_FLOAT fStep = 0.0f;

	FX_BOOL bBreak = FALSE;

	if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator())
	{
		pIterator->SetAt(wrWord.BeginPos);

		do
		{
			CPVT_WordPlace place = pIterator->GetAt();

			CPVT_Line line;
			if (pIterator->GetLine(line))
			{
				fY = line.ptLine.y;
				fStep = (line.fLineAscent - line.fLineDescent) / 16.0f;
			}

			if (place.LineCmp(wrWord.BeginPos) == 0)
			{
				pIterator->SetAt(wrWord.BeginPos);
				CPVT_Word word;
				if (pIterator->GetWord(word))
				{
					fStartX = word.ptWord.x;
				}
			}
			else
			{
				fStartX = line.ptLine.x;
			}

			if (place.LineCmp(wrWord.EndPos) == 0)
			{
				pIterator->SetAt(wrWord.EndPos);
				CPVT_Word word;
				if (pIterator->GetWord(word))
				{
					fEndX = word.ptWord.x + word.fWidth;
				}

				bBreak = TRUE;
			}
			else
			{
				fEndX = line.ptLine.x + line.fLineWidth;
			}

			AddSquigglyPath(PathData, fStartX, fEndX, fY, fStep);

			if (bBreak) break;
		}
		while (pIterator->NextLine());
	}
}

void CPWL_Utils::DrawEditSpellCheck(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, IFX_Edit* pEdit,
						const CPDF_Rect& rcClip, const CPDF_Point& ptOffset, const CPVT_WordRange* pRange,
						IPWL_SpellCheck * pSpellCheck)
{
	const FX_COLORREF crSpell = ArgbEncode(255,255,0,0);

	//for spellcheck
	FX_BOOL bLatinWord = FALSE;
	CPVT_WordPlace wpWordStart;
	CFX_ByteString sLatinWord;

	CFX_PathData pathSpell;

	pDevice->SaveState();

	if (!rcClip.IsEmpty())
	{
		CPDF_Rect rcTemp = rcClip;
		pUser2Device->TransformRect(rcTemp);
		FX_RECT rcDevClip;
		rcDevClip.left = (int32_t)rcTemp.left;
		rcDevClip.right = (int32_t)rcTemp.right;
		rcDevClip.top = (int32_t)rcTemp.top;
		rcDevClip.bottom = (int32_t)rcTemp.bottom;
		pDevice->SetClip_Rect(&rcDevClip);
	}

	if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator())
	{
		if (pEdit->GetFontMap())
		{
			if (pRange)
				pIterator->SetAt(pRange->BeginPos);
			else
				pIterator->SetAt(0);

			CPVT_WordPlace oldplace;

			while (pIterator->NextWord())
			{
				CPVT_WordPlace place = pIterator->GetAt();
				if (pRange && place.WordCmp(pRange->EndPos) > 0) break;

				CPVT_Word word;
				if (pIterator->GetWord(word))
				{
					if (FX_EDIT_ISLATINWORD(word.Word))
					{
						if (!bLatinWord)
						{
							wpWordStart = place;
							bLatinWord = TRUE;
						}

						sLatinWord += (char)word.Word;
					}
					else
					{
						if (bLatinWord)
						{
							if (!sLatinWord.IsEmpty())
							{
								if (pSpellCheck && !pSpellCheck->CheckWord(sLatinWord))
								{
									AddSpellCheckObj(pathSpell,pEdit,CPVT_WordRange(wpWordStart,oldplace));
									pIterator->SetAt(place);
								}
							}
							bLatinWord = FALSE;
						}

						sLatinWord.Empty();
					}

					oldplace = place;
				}
				else
				{
					if (bLatinWord)
					{
						if (!sLatinWord.IsEmpty())
						{
							if (pSpellCheck && !pSpellCheck->CheckWord(sLatinWord))
							{
								AddSpellCheckObj(pathSpell,pEdit,CPVT_WordRange(wpWordStart,oldplace));
								pIterator->SetAt(place);
							}
						}
						bLatinWord = FALSE;
					}

					sLatinWord.Empty();
				}
			}

			if (!sLatinWord.IsEmpty())
			{
				if (pSpellCheck && !pSpellCheck->CheckWord(sLatinWord))
				{
					AddSpellCheckObj(pathSpell,pEdit,CPVT_WordRange(wpWordStart,oldplace));
				}
			}
		}
	}

	CFX_GraphStateData gsd;
	gsd.m_LineWidth = 0;
	if (pathSpell.GetPointCount() > 0)
		pDevice->DrawPath(&pathSpell, pUser2Device, &gsd, 0, crSpell, FXFILL_ALTERNATE);

	pDevice->RestoreState();
}

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

	return TRUE;
}

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

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

	return crRet;
}

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

	CFX_ByteString sPath;
	CFX_PathData path;

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

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

	return sAppStream;
}

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

	CFX_ByteString sPath;
	CFX_PathData path;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	FX_FLOAT fAngel = PWL_PI/10.0f;

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

		fAngel += PWL_PI * 2 / 5.0f;
	}

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

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

		fAngel += PWL_PI * 2 / 5.0f;
	}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


