// 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, FX_INT32 nCount)
{
	CFX_ByteTextBuf csAP;

	for (FX_INT32 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, FX_INT32 nCount)
{
	path.SetPointCount(nCount);

	for (FX_INT32 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 FX_INT32 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 (FX_INT32 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 (FX_INT32 i=0; i<num; i++)
	{
		FX_INT32 nCur = i*3;
		FX_INT32 n1 = i*3 + 1;
		FX_INT32 n2 = i*3 + 2;
		FX_INT32 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 (FX_INT32 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";

	FX_INT32 nNext = 0;
	for (FX_INT32 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;
	FX_INT32 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, FX_INT32 nAlignmentH, FX_INT32 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,
											FX_INT32 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,
												FX_INT32 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,
												FX_INT32 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,
													FX_INT32 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,
													FX_INT32 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, FX_INT32& 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, FX_INT32 nTransparancy)
{
	FX_INT32 nAlpha = nTransparancy;
	FX_FLOAT dRed = 0;
	FX_FLOAT dGreen = 0;
	FX_FLOAT dBlue = 0;

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

	return ArgbEncode(nAlpha, (FX_INT32)(dRed*255), (FX_INT32)(dGreen*255), (FX_INT32)(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, FX_INT32 nCount, const FX_COLORREF& color)
{
	CFX_PathData path;
	path.SetPointCount(nCount);

	path.SetPoint(0, pPts[0].x, pPts[0].y, FXPT_MOVETO);
	for (FX_INT32 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, FX_INT32 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,
														FX_INT32 nTransparancy, FX_INT32 nStartGray, FX_INT32 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)
		{			
			FX_INT32 nGray = nStartGray + (FX_INT32)(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)
		{			
			FX_INT32 nGray = nStartGray + (FX_INT32)(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,
												FX_INT32 nStyle, const CPWL_Dash & dash, FX_INT32 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;
	FX_INT32 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 = (FX_INT32)rcTemp.left;
		rcDevClip.right = (FX_INT32)rcTemp.right;
		rcDevClip.top = (FX_INT32)rcTemp.top;
		rcDevClip.bottom = (FX_INT32)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(FX_INT32 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,
						FX_INT32 nType, const CPDF_Rect & rect, const CPWL_Color& crFill, const CPWL_Color& crStroke, const FX_INT32 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 (FX_INT32 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 (FX_INT32 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(FX_INT32 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),

		/*
		CPWL_PathData(CPWL_Point(crBBox.left, crBBox.top), PWLPT_MOVETO),
		CPWL_PathData(CPWL_Point(crBBox.right, crBBox.top), PWLPT_LINETO),
		CPWL_PathData(CPWL_Point(crBBox.right, crBBox.bottom), PWLPT_LINETO),
		CPWL_PathData(CPWL_Point(crBBox.left, crBBox.bottom), PWLPT_LINETO),
		CPWL_PathData(CPWL_Point(crBBox.left, crBBox.top), PWLPT_LINETO),

		CPWL_PathData(CPWL_Point(crBBox.left+fOutWidth*0.04f, crBBox.top-fOutHeight*0.04f), PWLPT_MOVETO),
		CPWL_PathData(CPWL_Point(crBBox.right-fOutWidth*0.04f, crBBox.top-fOutHeight*0.04f), PWLPT_LINETO),
		CPWL_PathData(CPWL_Point(crBBox.right-fOutWidth*0.04f, crBBox.bottom+fOutHeight*0.04f), PWLPT_LINETO),
		CPWL_PathData(CPWL_Point(crBBox.left+fOutWidth*0.04f, crBBox.bottom+fOutHeight*0.04f), PWLPT_LINETO),
		CPWL_PathData(CPWL_Point(crBBox.left+fOutWidth*0.04f, crBBox.top-fOutHeight*0.04f), PWLPT_LINETO),
		*/
	};

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

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


