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


