1e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved.
2e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Use of this source code is governed by a BSD-style license that can be
3e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// found in the LICENSE file.
4e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
5e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
7e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "../../include/pdfwindow/PDFWindow.h"
8e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "../../include/pdfwindow/PWL_Wnd.h"
9e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "../../include/pdfwindow/PWL_Utils.h"
10e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "../../include/pdfwindow/PWL_Icon.h"
11e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
12e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define IsFloatZero(f)						((f) < 0.0001 && (f) > -0.0001)
13e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define IsFloatBigger(fa,fb)				((fa) > (fb) && !IsFloatZero((fa) - (fb)))
14e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define IsFloatSmaller(fa,fb)				((fa) < (fb) && !IsFloatZero((fa) - (fb)))
15e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define IsFloatEqual(fa,fb)					IsFloatZero((fa)-(fb))
16e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
17e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* ---------------------------- CPWL_Utils ------------------------------ */
18e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
19e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCFX_ByteString CPWL_Utils::GetAppStreamFromArray(const CPWL_PathData* pPathData, FX_INT32 nCount)
20e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
21e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CFX_ByteTextBuf csAP;
22e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
23e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	for (FX_INT32 i=0; i<nCount; i++)
24e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
25e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		switch (pPathData[i].type)
26e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		{
27e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		case PWLPT_MOVETO:
28e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			csAP << pPathData[i].point.x << " " << pPathData[i].point.y << " m\n";
29e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			break;
30e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		case PWLPT_LINETO:
31e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			csAP << pPathData[i].point.x << " " << pPathData[i].point.y << " l\n";
32e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			break;
33e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		case PWLPT_BEZIERTO:
34e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			csAP << pPathData[i].point.x << " " << pPathData[i].point.y << " "
35e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				 << pPathData[i+1].point.x << " " << pPathData[i+1].point.y << " "
36e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				 << pPathData[i+2].point.x << " " << pPathData[i+2].point.y << " c\n";
37e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
38e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			i += 2;
39e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			break;
40e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		default:
41e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			break;
42e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		}
43e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	}
44e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
45e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	return csAP.GetByteString();
46e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
47e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
48e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPWL_Utils::GetPathDataFromArray(CFX_PathData& path, const CPWL_PathData* pPathData, FX_INT32 nCount)
49e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
50e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	path.SetPointCount(nCount);
51e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
52e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	for (FX_INT32 i=0; i<nCount; i++)
53e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
54e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		switch (pPathData[i].type)
55e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		{
56e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		case PWLPT_MOVETO:
57e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			path.SetPoint(i, pPathData[i].point.x, pPathData[i].point.y, FXPT_MOVETO);
58e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			break;
59e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		case PWLPT_LINETO:
60e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			path.SetPoint(i, pPathData[i].point.x, pPathData[i].point.y, FXPT_LINETO);
61e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			break;
62e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		case PWLPT_BEZIERTO:
63e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			path.SetPoint(i, pPathData[i].point.x, pPathData[i].point.y, FXPT_BEZIERTO);
64e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			break;
65e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		default:
66e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			break;
67e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		}
68e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	}
69e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
70e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
71e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
72e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPDF_Rect CPWL_Utils::MaxRect(const CPDF_Rect & rect1,const CPDF_Rect & rect2)
73e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
74e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPDF_Rect rcRet;
75e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
76e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	rcRet.left = PWL_MIN(rect1.left,rect2.left);
77e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	rcRet.bottom = PWL_MIN(rect1.bottom,rect2.bottom);
78e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	rcRet.right = PWL_MAX(rect1.right,rect2.right);
79e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	rcRet.top = PWL_MAX(rect1.top,rect2.top);
80e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
81e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	return rcRet;
82e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
83e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
84e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPDF_Rect CPWL_Utils::OffsetRect(const CPDF_Rect & rect,FX_FLOAT x,FX_FLOAT y)
85e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
86e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	return CPDF_Rect(rect.left + x,rect.bottom + y,
87e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		rect.right + x,rect.top + y);
88e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
89e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
90e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL CPWL_Utils::ContainsRect(const CPDF_Rect& rcParent, const CPDF_Rect& rcChild)
91e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
92e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	return rcChild.left >= rcParent.left && rcChild.bottom >= rcParent.bottom &&
93e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			rcChild.right <= rcParent.right && rcChild.top <= rcParent.top;
94e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
95e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
96e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL CPWL_Utils::IntersectRect(const CPDF_Rect& rect1, const CPDF_Rect& rect2)
97e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
98e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT left = rect1.left > rect2.left ? rect1.left : rect2.left;
99e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT right = rect1.right < rect2.right ? rect1.right : rect2.right;
100e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT bottom = rect1.bottom > rect2.bottom ? rect1.bottom : rect2.bottom;
101e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT top = rect1.top < rect2.top ? rect1.top : rect2.top;
102e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
103e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	return left < right && bottom < top;
104e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
105e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
106e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPDF_Point CPWL_Utils::OffsetPoint(const CPDF_Point& point,FX_FLOAT x,FX_FLOAT y)
107e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
108e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	return CPDF_Point(point.x + x,point.y + y);
109e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
110e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
111e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordRange CPWL_Utils::OverlapWordRange(const CPVT_WordRange & wr1, const CPVT_WordRange & wr2)
112e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
113e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPVT_WordRange wrRet;
114e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
115e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if (wr2.EndPos.WordCmp(wr1.BeginPos) < 0 || wr2.BeginPos.WordCmp(wr1.EndPos) > 0) return wrRet;
116e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if (wr1.EndPos.WordCmp(wr2.BeginPos) < 0 || wr1.BeginPos.WordCmp(wr2.EndPos) > 0) return wrRet;
117e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
118e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if (wr1.BeginPos.WordCmp(wr2.BeginPos) < 0)
119e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
120e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		wrRet.BeginPos = wr2.BeginPos;
121e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	}
122e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	else
123e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
124e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		wrRet.BeginPos = wr1.BeginPos;
125e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	}
126e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
127e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if (wr1.EndPos.WordCmp(wr2.EndPos) < 0)
128e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
129e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		wrRet.EndPos = wr1.EndPos;
130e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	}
131e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	else
132e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
133e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		wrRet.EndPos = wr2.EndPos;
134e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	}
135e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
136e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	return wrRet;
137e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
138e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
139e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCFX_ByteString CPWL_Utils::GetAP_Check(const CPDF_Rect & crBBox)
140e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
141e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CFX_ByteTextBuf csAP;
142e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
143e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fWidth = crBBox.right - crBBox.left;
144e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
145e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
146e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	const FX_INT32 num = 8;
147e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
148e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPWL_Point pts[num*3] =
149e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
150e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		//1
151e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_Point(0.28f, 0.52f),
152e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_Point(0.27f, 0.48f),
153e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_Point(0.29f, 0.40f),
154e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
155e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		//2
156e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_Point(0.30f, 0.33f),
157e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_Point(0.31f, 0.29f),
158e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_Point(0.31f, 0.28f),
159e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
160e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		//3
161e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_Point(0.39f, 0.28f),
162e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_Point(0.49f, 0.29f),
163e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_Point(0.77f, 0.67f),
164e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
165e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		//4
166e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_Point(0.76f, 0.68f),
167e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_Point(0.78f, 0.69f),
168e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_Point(0.76f, 0.75f),
169e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
170e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		//5
171e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_Point(0.76f, 0.75f),
172e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_Point(0.73f, 0.80f),
173e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_Point(0.68f, 0.75f),
174e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
175e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		//6
176e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_Point(0.68f, 0.74f),
177e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_Point(0.68f, 0.74f),
178e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_Point(0.44f, 0.47f),
179e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
180e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		//7
181e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_Point(0.43f, 0.47f),
182e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_Point(0.40f, 0.47f),
183e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_Point(0.41f, 0.58f),
184e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
185e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		//8
186e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_Point(0.40f, 0.60f),
187e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_Point(0.28f, 0.66f),
188e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_Point(0.30f, 0.56f)
189e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	};
190e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
191e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	for (FX_INT32 j=0; j<num*3; j++)
192e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
193e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		pts[j].x *= fWidth;
194e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		pts[j].x += crBBox.left;
195e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
196e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		pts[j].y *= fHeight;
197e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		pts[j].y += crBBox.bottom;
198e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	}
199e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
200e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	csAP << pts[0].x << " " << pts[0].y << " m\n";
201e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
202e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	for (FX_INT32 i=0; i<num; i++)
203e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
204e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		FX_INT32 nCur = i*3;
205e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		FX_INT32 n1 = i*3 + 1;
206e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		FX_INT32 n2 = i*3 + 2;
207e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		FX_INT32 nNext = (i < num-1 ? (i+1)*3 : 0);
208e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
209e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		FX_FLOAT px1 = pts[n1].x - pts[nCur].x;
210e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		FX_FLOAT py1 = pts[n1].y - pts[nCur].y;
211e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		FX_FLOAT px2 = pts[n2].x - pts[nNext].x;
212e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		FX_FLOAT py2 = pts[n2].y - pts[nNext].y;
213e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
214e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		csAP << pts[nCur].x + px1 * PWL_BEZIER << " " << pts[nCur].y + py1 * PWL_BEZIER << " "
215e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			<< pts[nNext].x + px2 * PWL_BEZIER << " " << pts[nNext].y + py2 * PWL_BEZIER << " "
216e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			<< pts[nNext].x << " " << pts[nNext].y << " c\n";
217e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	}
218e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
219e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	return csAP.GetByteString();
220e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
221e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
222e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCFX_ByteString CPWL_Utils::GetAP_Circle(const CPDF_Rect & crBBox)
223e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
224e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CFX_ByteTextBuf csAP;
225e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
226e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fWidth = crBBox.right - crBBox.left;
227e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
228e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
229e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPDF_Point pt1(crBBox.left,crBBox.bottom + fHeight / 2);
230e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPDF_Point pt2(crBBox.left + fWidth / 2,crBBox.top);
231e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPDF_Point pt3(crBBox.right,crBBox.bottom + fHeight / 2);
232e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPDF_Point pt4(crBBox.left + fWidth / 2,crBBox.bottom);
233e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
234e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	csAP << pt1.x << " " << pt1.y << " m\n";
235e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
236e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT px = pt2.x - pt1.x;
237e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT py = pt2.y - pt1.y;
238e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
239e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	csAP << pt1.x << " " << pt1.y + py * PWL_BEZIER << " "
240e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		<< pt2.x - px * PWL_BEZIER << " " << pt2.y << " "
241e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		<< pt2.x << " " << pt2.y << " c\n";
242e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
243e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	px = pt3.x - pt2.x;
244e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	py = pt2.y - pt3.y;
245e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
246e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	csAP << pt2.x + px * PWL_BEZIER << " " << pt2.y << " "
247e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		<< pt3.x << " " << pt3.y + py * PWL_BEZIER << " "
248e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		<< pt3.x << " " << pt3.y << " c\n";
249e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
250e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	px = pt3.x - pt4.x;
251e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	py = pt3.y - pt4.y;
252e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
253e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	csAP << pt3.x << " " << pt3.y - py * PWL_BEZIER << " "
254e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		<< pt4.x + px * PWL_BEZIER << " " << pt4.y << " "
255e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		<< pt4.x << " " << pt4.y << " c\n";
256e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
257e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	px = pt4.x - pt1.x;
258e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	py = pt1.y - pt4.y;
259e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
260e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	csAP << pt4.x - px * PWL_BEZIER << " " << pt4.y << " "
261e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		<< pt1.x << " " << pt1.y - py * PWL_BEZIER << " "
262e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		<< pt1.x << " " << pt1.y << " c\n";
263e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
264e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	return csAP.GetByteString();
265e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
266e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
267e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCFX_ByteString CPWL_Utils::GetAP_Cross(const CPDF_Rect & crBBox)
268e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
269e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CFX_ByteTextBuf csAP;
270e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
271e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	csAP << crBBox.left << " " << crBBox.top << " m\n";
272e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	csAP << crBBox.right << " " << crBBox.bottom << " l\n";
273e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	csAP << crBBox.left << " " << crBBox.bottom << " m\n";
274e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	csAP << crBBox.right << " " << crBBox.top << " l\n";
275e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
276e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	return csAP.GetByteString();
277e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
278e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
279e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCFX_ByteString CPWL_Utils::GetAP_Diamond(const CPDF_Rect & crBBox)
280e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
281e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CFX_ByteTextBuf csAP;
282e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
283e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fWidth = crBBox.right - crBBox.left;
284e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
285e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
286e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPDF_Point pt1(crBBox.left,crBBox.bottom + fHeight / 2);
287e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPDF_Point pt2(crBBox.left + fWidth / 2,crBBox.top);
288e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPDF_Point pt3(crBBox.right,crBBox.bottom + fHeight / 2);
289e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPDF_Point pt4(crBBox.left + fWidth / 2,crBBox.bottom);
290e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
291e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	csAP << pt1.x << " " << pt1.y << " m\n";
292e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	csAP << pt2.x << " " << pt2.y << " l\n";
293e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	csAP << pt3.x << " " << pt3.y << " l\n";
294e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	csAP << pt4.x << " " << pt4.y << " l\n";
295e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	csAP << pt1.x << " " << pt1.y << " l\n";
296e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
297e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	return csAP.GetByteString();
298e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
299e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
300e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCFX_ByteString CPWL_Utils::GetAP_Square(const CPDF_Rect & crBBox)
301e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
302e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CFX_ByteTextBuf csAP;
303e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
304e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	csAP << crBBox.left << " " << crBBox.top << " m\n";
305e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	csAP << crBBox.right << " " << crBBox.top << " l\n";
306e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	csAP << crBBox.right << " " << crBBox.bottom << " l\n";
307e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	csAP << crBBox.left << " " << crBBox.bottom << " l\n";
308e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	csAP << crBBox.left << " " << crBBox.top << " l\n";
309e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
310e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	return csAP.GetByteString();
311e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
312e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
313e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCFX_ByteString CPWL_Utils::GetAP_Star(const CPDF_Rect & crBBox)
314e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
315e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CFX_ByteTextBuf csAP;
316e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
317e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fRadius = (crBBox.top - crBBox.bottom)/(1+(FX_FLOAT)cos(PWL_PI/5.0f));
318e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPDF_Point ptCenter = CPDF_Point((crBBox.left + crBBox.right) / 2.0f,(crBBox.top + crBBox.bottom) / 2.0f);
319e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
320e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT px[5],py[5];
321e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
322e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fAngel = PWL_PI/10.0f;
323e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
324e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	for (FX_INT32 i=0; i<5; i++)
325e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
326e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		px[i] = ptCenter.x + fRadius * (FX_FLOAT)cos(fAngel);
327e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		py[i] = ptCenter.y + fRadius * (FX_FLOAT)sin(fAngel);
328e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
329e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		fAngel += PWL_PI * 2 / 5.0f;
330e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	}
331e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
332e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	csAP << px[0] << " " << py[0] << " m\n";
333e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
334e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_INT32 nNext = 0;
335e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	for (FX_INT32 j=0; j<5; j++)
336e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
337e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		nNext += 2;
338e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		if (nNext >= 5) nNext -= 5;
339e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		csAP << px[nNext] << " " << py[nNext] << " l\n";
340e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	}
341e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
342e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	return csAP.GetByteString();
343e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
344e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
345e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCFX_ByteString CPWL_Utils::GetAP_HalfCircle(const CPDF_Rect & crBBox,FX_FLOAT fRotate)
346e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
347e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CFX_ByteTextBuf csAP;
348e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
349e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fWidth = crBBox.right - crBBox.left;
350e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
351e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
352e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPDF_Point pt1(-fWidth/2,0);
353e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPDF_Point pt2(0,fHeight/2);
354e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPDF_Point pt3(fWidth/2,0);
355e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
356e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT px,py;
357e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
358e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	csAP << cos(fRotate) << " " << sin(fRotate) << " " << -sin(fRotate) << " " << cos(fRotate) << " "
359e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		<< crBBox.left + fWidth / 2 << " " << crBBox.bottom + fHeight / 2 << " cm\n";
360e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
361e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
362e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	csAP << pt1.x << " " << pt1.y << " m\n";
363e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
364e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	px = pt2.x - pt1.x;
365e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	py = pt2.y - pt1.y;
366e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
367e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	csAP << pt1.x << " " << pt1.y + py * PWL_BEZIER << " "
368e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		<< pt2.x - px * PWL_BEZIER << " " << pt2.y << " "
369e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		<< pt2.x << " " << pt2.y << " c\n";
370e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
371e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	px = pt3.x - pt2.x;
372e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	py = pt2.y - pt3.y;
373e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
374e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	csAP << pt2.x + px * PWL_BEZIER << " " << pt2.y << " "
375e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		<< pt3.x << " " << pt3.y + py * PWL_BEZIER << " "
376e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		<< pt3.x << " " << pt3.y << " c\n";
377e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
378e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	return csAP.GetByteString();
379e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
380e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
381e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
382e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPDF_Rect CPWL_Utils::InflateRect(const CPDF_Rect & rcRect, FX_FLOAT fSize)
383e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
384e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if (rcRect.IsEmpty()) return rcRect;
385e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
386e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPDF_Rect rcNew(rcRect.left - fSize,
387e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					rcRect.bottom - fSize,
388e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					rcRect.right + fSize,
389e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					rcRect.top + fSize);
390e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	rcNew.Normalize();
391e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	return rcNew;
392e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
393e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
394e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPDF_Rect CPWL_Utils::DeflateRect(const CPDF_Rect & rcRect, FX_FLOAT fSize)
395e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
396e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if (rcRect.IsEmpty()) return rcRect;
397e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
398e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPDF_Rect rcNew(rcRect.left + fSize,
399e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					rcRect.bottom + fSize,
400e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					rcRect.right - fSize,
401e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					rcRect.top - fSize);
402e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	rcNew.Normalize();
403e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	return rcNew;
404e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
405e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
406e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPDF_Rect CPWL_Utils::ScaleRect(const CPDF_Rect & rcRect,FX_FLOAT fScale)
407e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
408e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fHalfWidth = (rcRect.right - rcRect.left) / 2.0f;
409e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fHalfHeight = (rcRect.top - rcRect.bottom) / 2.0f;
410e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
411e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPDF_Point ptCenter = CPDF_Point((rcRect.left + rcRect.right) / 2,(rcRect.top + rcRect.bottom) / 2);
412e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
413e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	return CPDF_Rect(ptCenter.x - fHalfWidth * fScale,
414e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				ptCenter.y - fHalfHeight * fScale,
415e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				ptCenter.x + fHalfWidth * fScale,
416e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				ptCenter.y + fHalfHeight * fScale);
417e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
418e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
419e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCFX_ByteString CPWL_Utils::GetRectFillAppStream(const CPDF_Rect & rect,const CPWL_Color & color)
420e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
421e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CFX_ByteTextBuf sAppStream;
422e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
423e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CFX_ByteString sColor = GetColorAppStream(color,TRUE);
424e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if (sColor.GetLength() > 0)
425e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
426e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sAppStream << "q\n" << sColor;
427e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sAppStream << rect.left << " " << rect.bottom << " "
428e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			<< rect.right - rect.left << " " << rect.top - rect.bottom << " re f\nQ\n";
429e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	}
430e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
431e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	return sAppStream.GetByteString();
432e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
433e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
434e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCFX_ByteString CPWL_Utils::GetCircleFillAppStream(const CPDF_Rect & rect,const CPWL_Color & color)
435e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
436e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CFX_ByteTextBuf sAppStream;
437e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
438e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CFX_ByteString sColor = GetColorAppStream(color,TRUE);
439e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if (sColor.GetLength() > 0)
440e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
441e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sAppStream << "q\n" << sColor << CPWL_Utils::GetAP_Circle(rect) << "f\nQ\n";
442e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	}
443e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
444e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	return sAppStream.GetByteString();
445e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
446e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
447e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPDF_Rect CPWL_Utils::GetCenterSquare(const CPDF_Rect & rect)
448e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
449e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fWidth = rect.right -  rect.left;
450e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fHeight = rect.top - rect.bottom;
451e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
452e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fCenterX = (rect.left + rect.right)/2.0f;
453e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fCenterY = (rect.top + rect.bottom)/2.0f;
454e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
455e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fRadius = (fWidth > fHeight) ? fHeight / 2 : fWidth / 2;
456e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
457e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	return CPDF_Rect(fCenterX - fRadius,fCenterY - fRadius,fCenterX + fRadius,fCenterY + fRadius);
458e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
459e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
460e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCFX_ByteString CPWL_Utils::GetEditAppStream(IFX_Edit* pEdit, const CPDF_Point & ptOffset, const CPVT_WordRange * pRange,
461e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov														FX_BOOL bContinuous, FX_WORD SubWord)
462e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
463e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	return IFX_Edit::GetEditAppearanceStream(pEdit,ptOffset,pRange,bContinuous,SubWord);
464e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
465e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
466e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCFX_ByteString CPWL_Utils::GetEditSelAppStream(IFX_Edit* pEdit, const CPDF_Point & ptOffset,
467e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov								const CPVT_WordRange * pRange)
468e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
469e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	return IFX_Edit::GetSelectAppearanceStream(pEdit,ptOffset,pRange);
470e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
471e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
472e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstatic CFX_ByteString GetSquigglyAppearanceStream(FX_FLOAT fStartX, FX_FLOAT fEndX, FX_FLOAT fY, FX_FLOAT fStep)
473e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
474e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CFX_ByteTextBuf sRet;
475e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
476e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	sRet << "0 w\n" << fStartX << " " << fY << " m\n";
477e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
478e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fx;
479e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_INT32 i;
480e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
481e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	for (i=1,fx=fStartX+fStep; fx<fEndX; fx+=fStep,i++)
482e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
483e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sRet << fx << " " << fY + (i&1)*fStep << " l\n";
484e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	}
485e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
486e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	sRet << "S\n";
487e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
488e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	return sRet.GetByteString();
489e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
490e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
491e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstatic CFX_ByteString GetWordSpellCheckAppearanceStream(IFX_Edit_Iterator* pIterator, const CPDF_Point & ptOffset,
492e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov																  const CPVT_WordRange & wrWord)
493e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
494e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CFX_ByteTextBuf sRet;
495e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
496e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fStartX = 0.0f;
497e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fEndX = 0.0f;
498e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fY = 0.0f;
499e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fStep = 0.0f;
500e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
501e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_BOOL bBreak = FALSE;
502e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
503e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if (pIterator)
504e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
505e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		pIterator->SetAt(wrWord.BeginPos);
506e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
507e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		do
508e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		{
509e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			CPVT_WordPlace place = pIterator->GetAt();
510e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
511e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			CPVT_Line line;
512e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			if (pIterator->GetLine(line))
513e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			{
514e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				fY = line.ptLine.y;
515e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				fStep = (line.fLineAscent - line.fLineDescent) / 16.0f;
516e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			}
517e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
518e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			if (place.LineCmp(wrWord.BeginPos) == 0)
519e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			{
520e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				pIterator->SetAt(wrWord.BeginPos);
521e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				CPVT_Word word;
522e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				if (pIterator->GetWord(word))
523e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				{
524e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					fStartX = word.ptWord.x;
525e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				}
526e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			}
527e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			else
528e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			{
529e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				fStartX = line.ptLine.x;
530e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			}
531e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
532e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			if (place.LineCmp(wrWord.EndPos) == 0)
533e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			{
534e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				pIterator->SetAt(wrWord.EndPos);
535e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				CPVT_Word word;
536e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				if (pIterator->GetWord(word))
537e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				{
538e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					fEndX = word.ptWord.x + word.fWidth;
539e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				}
540e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
541e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				bBreak = TRUE;
542e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			}
543e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			else
544e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			{
545e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				fEndX = line.ptLine.x + line.fLineWidth;
546e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			}
547e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
548e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			sRet << GetSquigglyAppearanceStream(fStartX + ptOffset.x, fEndX + ptOffset.x, fY + ptOffset.y,fStep);
549e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
550e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			if (bBreak) break;
551e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		}
552e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		while (pIterator->NextLine());
553e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	}
554e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
555e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	return sRet.GetByteString();
556e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
557e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
558e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCFX_ByteString CPWL_Utils::GetSpellCheckAppStream(IFX_Edit* pEdit, IPWL_SpellCheck* pSpellCheck, const CPDF_Point & ptOffset,
559e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov								const CPVT_WordRange * pRange)
560e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
561e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	ASSERT(pEdit != NULL);
562e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	ASSERT(pSpellCheck != NULL);
563e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
564e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CFX_ByteTextBuf sRet;
565e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
566e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if (pRange && pRange->IsExist())
567e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
568e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator())
569e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		{
570e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			pIterator->SetAt(pRange->BeginPos);
571e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
572e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			FX_BOOL bLatinWord = FALSE;
573e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			CPVT_WordPlace wpWordStart;
574e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			CFX_ByteString sWord;
575e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
576e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			CPVT_WordPlace oldplace;
577e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			while (pIterator->NextWord())
578e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			{
579e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				CPVT_WordPlace place = pIterator->GetAt();
580e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				if (pRange && place.WordCmp(pRange->EndPos) > 0) break;
581e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
582e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				CPVT_Word word;
583e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				if (pIterator->GetWord(word))
584e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				{
585e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					if (FX_EDIT_ISLATINWORD(word.Word))
586e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					{
587e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						if (!bLatinWord)
588e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						{
589e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							wpWordStart = place;
590e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							bLatinWord = TRUE;
591e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						}
592e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
593e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						sWord += (char)word.Word;
594e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						oldplace = place;
595e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					}
596e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					else
597e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					{
598e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						if (bLatinWord)
599e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						{
600e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							if (!pSpellCheck->CheckWord(sWord))
601e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							{
602e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov								sRet << GetWordSpellCheckAppearanceStream(pIterator,ptOffset,CPVT_WordRange(wpWordStart,oldplace));
603e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov								pIterator->SetAt(place);
604e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							}
605e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							bLatinWord = FALSE;
606e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						}
607e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
608e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						sWord.Empty();
609e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					}
610e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				}
611e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				else
612e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				{
613e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					if (bLatinWord)
614e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					{
615e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						if (!pSpellCheck->CheckWord(sWord))
616e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							sRet << GetWordSpellCheckAppearanceStream(pIterator,ptOffset,CPVT_WordRange(wpWordStart,oldplace));
617e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						bLatinWord = FALSE;
618e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						sWord.Empty();
619e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					}
620e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				}
621e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			}
622e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
623e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			if (bLatinWord)
624e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			{
625e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				if (!pSpellCheck->CheckWord(sWord))
626e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					sRet << GetWordSpellCheckAppearanceStream(pIterator,ptOffset,CPVT_WordRange(wpWordStart,oldplace));
627e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
628e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				bLatinWord = FALSE;
629e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				sWord.Empty();
630e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			}
631e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		}
632e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	}
633e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
634e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	return sRet.GetByteString();
635e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
636e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
637e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCFX_ByteString CPWL_Utils::GetTextAppStream(const CPDF_Rect & rcBBox,IFX_Edit_FontMap * pFontMap,
638e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov														const CFX_WideString & sText, FX_INT32 nAlignmentH, FX_INT32 nAlignmentV,
639e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov														FX_FLOAT fFontSize, FX_BOOL bMultiLine, FX_BOOL bAutoReturn, const CPWL_Color & crText)
640e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
641e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CFX_ByteTextBuf sRet;
642e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
643e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if (IFX_Edit * pEdit = IFX_Edit::NewEdit())
644e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
645e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		pEdit->SetFontMap(pFontMap);
646e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		pEdit->SetPlateRect(rcBBox);
647e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		pEdit->SetAlignmentH(nAlignmentH);
648e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		pEdit->SetAlignmentV(nAlignmentV);
649e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		pEdit->SetMultiLine(bMultiLine);
650e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		pEdit->SetAutoReturn(bAutoReturn);
651e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		if (IsFloatZero(fFontSize))
652e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			pEdit->SetAutoFontSize(TRUE);
653e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		else
654e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			pEdit->SetFontSize(fFontSize);
655e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
656e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		pEdit->Initialize();
657e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		pEdit->SetText(sText.c_str());
658e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
659e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CFX_ByteString sEdit = CPWL_Utils::GetEditAppStream(pEdit, CPDF_Point(0.0f,0.0f));
660e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		if (sEdit.GetLength() > 0)
661e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		{
662e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			sRet << "BT\n" << CPWL_Utils::GetColorAppStream(crText) << sEdit << "ET\n";
663e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		}
664e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		IFX_Edit::DelEdit(pEdit);
665e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	}
666e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
667e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	return sRet.GetByteString();
668e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
669e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
670e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCFX_ByteString CPWL_Utils::GetPushButtonAppStream(const CPDF_Rect & rcBBox,
671e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov											IFX_Edit_FontMap * pFontMap,
672e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov											CPDF_Stream * pIconStream,
673e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov											CPDF_IconFit & IconFit,
674e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov											const CFX_WideString & sLabel,
675e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov											const CPWL_Color & crText,
676e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov											FX_FLOAT fFontSize,
677e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov											FX_INT32 nLayOut)
678e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
679e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	const FX_FLOAT fAutoFontScale = 1.0f / 3.0f;
680e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
681e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if (IFX_Edit * pEdit = IFX_Edit::NewEdit())
682e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
683e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		pEdit->SetFontMap(pFontMap);
684e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		pEdit->SetAlignmentH(1);
685e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		pEdit->SetAlignmentV(1);
686e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		pEdit->SetMultiLine(FALSE);
687e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		pEdit->SetAutoReturn(FALSE);
688e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		if (IsFloatZero(fFontSize))
689e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			pEdit->SetAutoFontSize(TRUE);
690e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		else
691e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			pEdit->SetFontSize(fFontSize);
692e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
693e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		pEdit->Initialize();
694e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		pEdit->SetText(sLabel.c_str());
695e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
696e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPDF_Rect rcLabelContent = pEdit->GetContentRect();
697e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_Icon Icon;
698e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		PWL_CREATEPARAM cp;
699e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		cp.dwFlags = PWS_VISIBLE;
700e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		Icon.Create(cp);
701e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		Icon.SetIconFit(&IconFit);
702e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		Icon.SetPDFStream(pIconStream);
703e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
704e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPDF_Rect rcLabel = CPDF_Rect(0,0,0,0);
705e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPDF_Rect rcIcon = CPDF_Rect(0,0,0,0);
706e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		FX_FLOAT fWidth = 0.0f;
707e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		FX_FLOAT fHeight = 0.0f;
708e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
709e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		switch (nLayOut)
710e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		{
711e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		case PPBL_LABEL:
712e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			rcLabel = rcBBox;
713e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			rcIcon = CPDF_Rect(0,0,0,0);
714e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			break;
715e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		case PPBL_ICON:
716e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			rcIcon = rcBBox;
717e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			rcLabel = CPDF_Rect(0,0,0,0);
718e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			break;
719e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		case PPBL_ICONTOPLABELBOTTOM:
720e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
721e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			if (pIconStream)
722e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			{
723e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				if (IsFloatZero(fFontSize))
724e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				{
725e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					fHeight = rcBBox.top - rcBBox.bottom;
726e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					rcLabel = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcBBox.right,rcBBox.bottom + fHeight * fAutoFontScale);
727e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					rcIcon = CPDF_Rect(rcBBox.left,rcLabel.top,rcBBox.right,rcBBox.top);
728e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				}
729e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				else
730e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				{
731e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					fHeight = rcLabelContent.Height();
732e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
733e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					if (rcBBox.bottom + fHeight > rcBBox.top)
734e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					{
735e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						rcIcon = CPDF_Rect(0,0,0,0);
736e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						rcLabel = rcBBox;
737e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					}
738e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					else
739e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					{
740e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						rcLabel = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcBBox.right,rcBBox.bottom + fHeight);
741e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						rcIcon = CPDF_Rect(rcBBox.left,rcLabel.top,rcBBox.right,rcBBox.top);
742e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					}
743e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				}
744e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			}
745e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			else
746e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			{
747e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				rcLabel = rcBBox;
748e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				rcIcon = CPDF_Rect(0,0,0,0);
749e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			}
750e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
751e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			break;
752e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		case PPBL_LABELTOPICONBOTTOM:
753e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
754e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			if (pIconStream)
755e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			{
756e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				if (IsFloatZero(fFontSize))
757e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				{
758e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					fHeight = rcBBox.top - rcBBox.bottom;
759e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					rcLabel = CPDF_Rect(rcBBox.left,rcBBox.top - fHeight * fAutoFontScale ,rcBBox.right,rcBBox.top);
760e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					rcIcon = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcBBox.right,rcLabel.bottom);
761e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				}
762e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				else
763e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				{
764e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					fHeight = rcLabelContent.Height();
765e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
766e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					if (rcBBox.bottom + fHeight > rcBBox.top)
767e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					{
768e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						rcIcon = CPDF_Rect(0,0,0,0);
769e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						rcLabel = rcBBox;
770e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					}
771e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					else
772e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					{
773e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						rcLabel = CPDF_Rect(rcBBox.left,rcBBox.top - fHeight,rcBBox.right,rcBBox.top);
774e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						rcIcon = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcBBox.right,rcLabel.bottom);
775e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					}
776e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				}
777e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			}
778e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			else
779e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			{
780e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				rcLabel = rcBBox;
781e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				rcIcon = CPDF_Rect(0,0,0,0);
782e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			}
783e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
784e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			break;
785e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		case PPBL_ICONLEFTLABELRIGHT:
786e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
787e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			if (pIconStream)
788e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			{
789e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				if (IsFloatZero(fFontSize))
790e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				{
791e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					fWidth = rcBBox.right - rcBBox.left;
792e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					rcLabel = CPDF_Rect(rcBBox.right - fWidth * fAutoFontScale,rcBBox.bottom,rcBBox.right,rcBBox.top);
793e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					rcIcon = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcLabel.left,rcBBox.top);
794e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
795e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					if (rcLabelContent.Width() < fWidth * fAutoFontScale)
796e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					{
797e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					}
798e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					else
799e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					{
800e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						if (rcLabelContent.Width() < fWidth)
801e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						{
802e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							rcLabel = CPDF_Rect(rcBBox.right - rcLabelContent.Width(),rcBBox.bottom,rcBBox.right,rcBBox.top);
803e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							rcIcon = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcLabel.left,rcBBox.top);
804e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						}
805e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						else
806e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						{
807e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							rcLabel = rcBBox;
808e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							rcIcon = CPDF_Rect(0,0,0,0);
809e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						}
810e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					}
811e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				}
812e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				else
813e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				{
814e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					fWidth = rcLabelContent.Width();
815e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
816e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					if (rcBBox.left + fWidth > rcBBox.right)
817e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					{
818e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						rcLabel = rcBBox;
819e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						rcIcon = CPDF_Rect(0,0,0,0);
820e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					}
821e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					else
822e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					{
823e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						rcLabel = CPDF_Rect(rcBBox.right - fWidth,rcBBox.bottom,rcBBox.right,rcBBox.top);
824e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						rcIcon = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcLabel.left,rcBBox.top);
825e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					}
826e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				}
827e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			}
828e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			else
829e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			{
830e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				rcLabel = rcBBox;
831e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				rcIcon = CPDF_Rect(0,0,0,0);
832e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			}
833e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
834e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			break;
835e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		case PPBL_LABELLEFTICONRIGHT:
836e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
837e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			if (pIconStream)
838e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			{
839e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				if (IsFloatZero(fFontSize))
840e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				{
841e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					fWidth = rcBBox.right - rcBBox.left;
842e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					rcLabel = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcBBox.left + fWidth * fAutoFontScale,rcBBox.top);
843e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					rcIcon = CPDF_Rect(rcLabel.right,rcBBox.bottom,rcBBox.right,rcBBox.top);
844e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
845e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					if (rcLabelContent.Width() < fWidth * fAutoFontScale)
846e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					{
847e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					}
848e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					else
849e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					{
850e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						if (rcLabelContent.Width() < fWidth)
851e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						{
852e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							rcLabel = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcBBox.left + rcLabelContent.Width(),rcBBox.top);
853e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							rcIcon = CPDF_Rect(rcLabel.right,rcBBox.bottom,rcBBox.right,rcBBox.top);
854e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						}
855e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						else
856e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						{
857e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							rcLabel = rcBBox;
858e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							rcIcon = CPDF_Rect(0,0,0,0);
859e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						}
860e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					}
861e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				}
862e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				else
863e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				{
864e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					fWidth = rcLabelContent.Width();
865e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
866e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					if (rcBBox.left + fWidth > rcBBox.right)
867e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					{
868e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						rcLabel = rcBBox;
869e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						rcIcon = CPDF_Rect(0,0,0,0);
870e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					}
871e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					else
872e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					{
873e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						rcLabel = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcBBox.left + fWidth,rcBBox.top);
874e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						rcIcon = CPDF_Rect(rcLabel.right,rcBBox.bottom,rcBBox.right,rcBBox.top);
875e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					}
876e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				}
877e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			}
878e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			else
879e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			{
880e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				rcLabel = rcBBox;
881e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				rcIcon = CPDF_Rect(0,0,0,0);
882e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			}
883e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
884e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			break;
885e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		case PPBL_LABELOVERICON:
886e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			rcLabel = rcBBox;
887e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			rcIcon = rcBBox;
888e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			break;
889e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		}
890e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
891e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CFX_ByteTextBuf sAppStream,sTemp;
892e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
893e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		if (!rcIcon.IsEmpty())
894e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		{
895e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			Icon.Move(rcIcon, FALSE, FALSE);
896e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			sTemp << Icon.GetImageAppStream();
897e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		}
898e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
899e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		Icon.Destroy();
900e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
901e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		if (!rcLabel.IsEmpty())
902e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		{
903e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			pEdit->SetPlateRect(rcLabel);
904e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			CFX_ByteString sEdit = CPWL_Utils::GetEditAppStream(pEdit,CPDF_Point(0.0f,0.0f));
905e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			if (sEdit.GetLength() > 0)
906e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			{
907e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				sTemp << "BT\n" << CPWL_Utils::GetColorAppStream(crText) << sEdit << "ET\n";
908e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			}
909e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		}
910e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
911e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		IFX_Edit::DelEdit(pEdit);
912e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
913e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		if (sTemp.GetSize() > 0)
914e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		{
915e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			sAppStream << "q\n" << rcBBox.left << " " << rcBBox.bottom << " "
916e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				<< rcBBox.right - rcBBox.left << " " << rcBBox.top - rcBBox.bottom << " re W n\n";
917e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			sAppStream << sTemp << "Q\n";
918e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		}
919e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
920e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		return sAppStream.GetByteString();
921e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	}
922e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
923e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	return "";
924e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
925e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
926e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCFX_ByteString CPWL_Utils::GetColorAppStream(const CPWL_Color & color,const FX_BOOL & bFillOrStroke)
927e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
928e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CFX_ByteTextBuf sColorStream;
929e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
930e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	switch (color.nColorType)
931e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
932e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case COLORTYPE_RGB:
933e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sColorStream << color.fColor1 << " " << color.fColor2 << " " << color.fColor3 << " "
934e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			<< (bFillOrStroke ? "rg" : "RG") << "\n";
935e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
936e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case COLORTYPE_GRAY:
937e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sColorStream << color.fColor1 << " " << (bFillOrStroke ? "g" : "G") << "\n";
938e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
939e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case COLORTYPE_CMYK:
940e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sColorStream << color.fColor1 << " " << color.fColor2 << " " << color.fColor3 << " " << color.fColor4 << " "
941e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			<< (bFillOrStroke ? "k" : "K") << "\n";
942e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
943e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	}
944e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
945e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	return sColorStream.GetByteString();
946e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
947e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
948e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCFX_ByteString CPWL_Utils::GetBorderAppStream(const CPDF_Rect & rect, FX_FLOAT fWidth,
949e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov												const CPWL_Color & color, const CPWL_Color & crLeftTop, const CPWL_Color & crRightBottom,
950e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov												FX_INT32 nStyle, const CPWL_Dash & dash)
951e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
952e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CFX_ByteTextBuf sAppStream;
953e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CFX_ByteString sColor;
954e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
955e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fLeft = rect.left;
956e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fRight = rect.right;
957e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fTop = rect.top;
958e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fBottom = rect.bottom;
959e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
960e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if (fWidth > 0.0f)
961e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
962e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		FX_FLOAT fHalfWidth = fWidth / 2.0f;
963e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
964e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sAppStream << "q\n";
965e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
966e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		switch (nStyle)
967e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		{
968e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		default:
969e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		case PBS_SOLID:
970e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			sColor = CPWL_Utils::GetColorAppStream(color,TRUE);
971e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			if (sColor.GetLength() > 0)
972e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			{
973e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				sAppStream << sColor;
974e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				sAppStream << fLeft << " " << fBottom << " " << fRight - fLeft << " " << fTop - fBottom << " re\n";
975e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				sAppStream << fLeft + fWidth << " " << fBottom + fWidth << " "
976e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					<< fRight - fLeft - fWidth * 2 << " " << fTop - fBottom - fWidth * 2 << " re\n";
977e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				sAppStream << "f*\n";
978e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			}
979e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			break;
980e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		case PBS_DASH:
981e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			sColor = CPWL_Utils::GetColorAppStream(color,FALSE);
982e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			if (sColor.GetLength() > 0)
983e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			{
984e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				sAppStream << sColor;
985e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				sAppStream << fWidth << " w" << " [" << dash.nDash << " " << dash.nGap << "] " << dash.nPhase << " d\n";
986e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				sAppStream << fLeft + fWidth / 2 << " " << fBottom + fWidth / 2 << " m\n";
987e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				sAppStream << fLeft + fWidth / 2 << " " << fTop - fWidth / 2 << " l\n";
988e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				sAppStream << fRight - fWidth / 2 << " " << fTop - fWidth / 2 << " l\n";
989e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				sAppStream << fRight - fWidth / 2 << " " << fBottom + fWidth / 2 << " l\n";
990e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				sAppStream << fLeft + fWidth / 2 << " " << fBottom + fWidth / 2 << " l S\n";
991e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			}
992e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			break;
993e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		case PBS_BEVELED:
994e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		case PBS_INSET:
995e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			sColor = CPWL_Utils::GetColorAppStream(crLeftTop,TRUE);
996e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			if (sColor.GetLength() > 0)
997e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			{
998e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				sAppStream << sColor;
999e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth << " m\n";
1000e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				sAppStream << fLeft + fHalfWidth << " " << fTop - fHalfWidth << " l\n";
1001e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				sAppStream << fRight - fHalfWidth << " " << fTop - fHalfWidth << " l\n";
1002e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				sAppStream << fRight - fHalfWidth * 2 << " " << fTop - fHalfWidth * 2 << " l\n";
1003e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				sAppStream << fLeft + fHalfWidth * 2 << " " << fTop - fHalfWidth * 2 << " l\n";
1004e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				sAppStream << fLeft + fHalfWidth * 2 << " " << fBottom + fHalfWidth * 2 << " l f\n";
1005e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			}
1006e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1007e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			sColor = CPWL_Utils::GetColorAppStream(crRightBottom,TRUE);
1008e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			if (sColor.GetLength() > 0)
1009e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			{
1010e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				sAppStream << sColor;
1011e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				sAppStream << fRight - fHalfWidth << " " <<	fTop - fHalfWidth << " m\n";
1012e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				sAppStream << fRight - fHalfWidth << " " <<	fBottom + fHalfWidth << " l\n";
1013e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				sAppStream << fLeft + fHalfWidth << " " << 	fBottom + fHalfWidth << " l\n";
1014e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				sAppStream << fLeft + fHalfWidth * 2 << " " << fBottom + fHalfWidth * 2 << " l\n";
1015e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				sAppStream << fRight - fHalfWidth * 2 << " " << fBottom + fHalfWidth * 2 << " l\n";
1016e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				sAppStream << fRight - fHalfWidth * 2 << " " << fTop - fHalfWidth * 2 << " l f\n";
1017e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			}
1018e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1019e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			sColor = CPWL_Utils::GetColorAppStream(color,TRUE);
1020e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			if (sColor.GetLength() > 0)
1021e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			{
1022e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				sAppStream << sColor;
1023e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				sAppStream << fLeft << " " << fBottom << " " <<	fRight - fLeft << " " << fTop - fBottom << " re\n";
1024e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth << " "
1025e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					<< fRight - fLeft - fHalfWidth * 2 << " " << fTop - fBottom - fHalfWidth * 2 << " re f*\n";
1026e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			}
1027e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			break;
1028e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		case PBS_UNDERLINED:
1029e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			sColor = CPWL_Utils::GetColorAppStream(color,FALSE);
1030e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			if (sColor.GetLength() > 0)
1031e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			{
1032e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				sAppStream << sColor;
1033e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				sAppStream << fWidth << " w\n";
1034e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				sAppStream << fLeft << " " << fBottom + fWidth / 2 << " m\n";
1035e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				sAppStream << fRight << " " << fBottom + fWidth / 2 << " l S\n";
1036e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			}
1037e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			break;
1038e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		}
1039e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1040e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sAppStream << "Q\n";
1041e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	}
1042e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1043e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	return sAppStream.GetByteString();
1044e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1045e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1046e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCFX_ByteString CPWL_Utils::GetCircleBorderAppStream(const CPDF_Rect & rect, FX_FLOAT fWidth,
1047e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov												const CPWL_Color & color, const CPWL_Color & crLeftTop, const CPWL_Color & crRightBottom,
1048e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov												FX_INT32 nStyle, const CPWL_Dash & dash)
1049e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1050e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CFX_ByteTextBuf sAppStream;
1051e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CFX_ByteString sColor;
1052e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1053e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1054e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1055e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1056e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1057e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1058e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if (fWidth > 0.0f)
1059e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
1060e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sAppStream << "q\n";
1061e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1062e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		switch (nStyle)
1063e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		{
1064e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		default:
1065e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		case PBS_SOLID:
1066e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		case PBS_UNDERLINED:
1067e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			{
1068e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				sColor = CPWL_Utils::GetColorAppStream(color,FALSE);
1069e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				if (sColor.GetLength() > 0)
1070e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				{
1071e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					sAppStream << "q\n" << fWidth << " w\n" << sColor
1072e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						<< CPWL_Utils::GetAP_Circle(CPWL_Utils::DeflateRect(rect,fWidth / 2.0f))
1073e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						<< " S\nQ\n";
1074e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				}
1075e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			}
1076e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			break;
1077e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		case PBS_DASH:
1078e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			{
1079e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				sColor = CPWL_Utils::GetColorAppStream(color,FALSE);
1080e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				if (sColor.GetLength() > 0)
1081e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				{
1082e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					sAppStream << "q\n" << fWidth << " w\n"
1083e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						<< "[" << dash.nDash << " " << dash.nGap << "] " << dash.nPhase << " d\n"
1084e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						<< sColor << CPWL_Utils::GetAP_Circle(CPWL_Utils::DeflateRect(rect,fWidth / 2.0f))
1085e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						<< " S\nQ\n";
1086e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				}
1087e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			}
1088e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			break;
1089e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		case PBS_BEVELED:
1090e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			{
1091e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				FX_FLOAT fHalfWidth = fWidth / 2.0f;
1092e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1093e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				sColor = CPWL_Utils::GetColorAppStream(color,FALSE);
1094e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				if (sColor.GetLength() > 0)
1095e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				{
1096e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					sAppStream << "q\n" << fHalfWidth << " w\n"
1097e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						<< sColor << CPWL_Utils::GetAP_Circle(rect)
1098e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						<< " S\nQ\n";
1099e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				}
1100e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1101e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				sColor = CPWL_Utils::GetColorAppStream(crLeftTop,FALSE);
1102e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				if (sColor.GetLength() > 0)
1103e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				{
1104e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					sAppStream << "q\n" << fHalfWidth << " w\n"
1105e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						<< sColor << CPWL_Utils::GetAP_HalfCircle(CPWL_Utils::DeflateRect(rect,fHalfWidth * 0.75f),PWL_PI/4.0f)
1106e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						<< " S\nQ\n";
1107e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				}
1108e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1109e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				sColor = CPWL_Utils::GetColorAppStream(crRightBottom,FALSE);
1110e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				if (sColor.GetLength() > 0)
1111e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				{
1112e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					sAppStream << "q\n" << fHalfWidth << " w\n"
1113e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						<< sColor << CPWL_Utils::GetAP_HalfCircle(CPWL_Utils::DeflateRect(rect,fHalfWidth * 0.75f),PWL_PI*5/4.0f)
1114e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						<< " S\nQ\n";
1115e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				}
1116e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			}
1117e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			break;
1118e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		case PBS_INSET:
1119e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			{
1120e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				FX_FLOAT fHalfWidth = fWidth / 2.0f;
1121e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1122e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				sColor = CPWL_Utils::GetColorAppStream(color,FALSE);
1123e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				if (sColor.GetLength() > 0)
1124e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				{
1125e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					sAppStream << "q\n" << fHalfWidth << " w\n"
1126e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						<< sColor << CPWL_Utils::GetAP_Circle(rect)
1127e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						<< " S\nQ\n";
1128e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				}
1129e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1130e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				sColor = CPWL_Utils::GetColorAppStream(crLeftTop,FALSE);
1131e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				if (sColor.GetLength() > 0)
1132e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				{
1133e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					sAppStream << "q\n" << fHalfWidth << " w\n"
1134e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						<< sColor << CPWL_Utils::GetAP_HalfCircle(CPWL_Utils::DeflateRect(rect,fHalfWidth * 0.75f),PWL_PI/4.0f)
1135e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						<< " S\nQ\n";
1136e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				}
1137e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1138e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				sColor = CPWL_Utils::GetColorAppStream(crRightBottom,FALSE);
1139e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				if (sColor.GetLength() > 0)
1140e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				{
1141e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					sAppStream << "q\n" << fHalfWidth << " w\n"
1142e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						<< sColor << CPWL_Utils::GetAP_HalfCircle(CPWL_Utils::DeflateRect(rect,fHalfWidth * 0.75f),PWL_PI*5/4.0f)
1143e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						<< " S\nQ\n";
1144e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				}
1145e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			}
1146e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			break;
1147e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		}
1148e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1149e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sAppStream << "Q\n";
1150e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	}
1151e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1152e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	return sAppStream.GetByteString();
1153e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1154e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1155e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPWL_Color CPWL_Utils::SubstractColor(const CPWL_Color & sColor,FX_FLOAT fColorSub)
1156e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1157e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPWL_Color sRet;
1158e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	sRet.nColorType = sColor.nColorType;
1159e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1160e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	switch (sColor.nColorType)
1161e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
1162e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case COLORTYPE_TRANSPARENT:
1163e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sRet.nColorType = COLORTYPE_RGB;
1164e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sRet.fColor1 = PWL_MAX(1 - fColorSub,0.0f);
1165e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sRet.fColor2 = PWL_MAX(1 - fColorSub,0.0f);
1166e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sRet.fColor3 = PWL_MAX(1 - fColorSub,0.0f);
1167e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
1168e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case COLORTYPE_RGB:
1169e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case COLORTYPE_GRAY:
1170e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case COLORTYPE_CMYK:
1171e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sRet.fColor1 = PWL_MAX(sColor.fColor1 - fColorSub,0.0f);
1172e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sRet.fColor2 = PWL_MAX(sColor.fColor2 - fColorSub,0.0f);
1173e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sRet.fColor3 = PWL_MAX(sColor.fColor3 - fColorSub,0.0f);
1174e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sRet.fColor4 = PWL_MAX(sColor.fColor4 - fColorSub,0.0f);
1175e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
1176e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	}
1177e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1178e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	return sRet;
1179e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1180e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1181e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPWL_Color CPWL_Utils::DevideColor(const CPWL_Color & sColor,FX_FLOAT fColorDevide)
1182e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1183e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPWL_Color sRet;
1184e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	sRet.nColorType = sColor.nColorType;
1185e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1186e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	switch (sColor.nColorType)
1187e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
1188e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case COLORTYPE_TRANSPARENT:
1189e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sRet.nColorType = COLORTYPE_RGB;
1190e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sRet.fColor1 = 1 / fColorDevide;
1191e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sRet.fColor2 = 1 / fColorDevide;
1192e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sRet.fColor3 = 1 / fColorDevide;
1193e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
1194e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case COLORTYPE_RGB:
1195e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case COLORTYPE_GRAY:
1196e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case COLORTYPE_CMYK:
1197e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sRet = sColor;
1198e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sRet.fColor1 /= fColorDevide;
1199e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sRet.fColor2 /= fColorDevide;
1200e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sRet.fColor3 /= fColorDevide;
1201e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sRet.fColor4 /= fColorDevide;
1202e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
1203e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	}
1204e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1205e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	return sRet;
1206e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1207e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1208e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCFX_ByteString CPWL_Utils::GetAppStream_Check(const CPDF_Rect & rcBBox, const CPWL_Color & crText)
1209e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1210e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CFX_ByteTextBuf sAP;
1211e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	sAP << "q\n" << CPWL_Utils::GetColorAppStream(crText,TRUE) << CPWL_Utils::GetAP_Check(rcBBox) << "f\nQ\n";
1212e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	return sAP.GetByteString();
1213e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1214e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1215e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCFX_ByteString CPWL_Utils::GetAppStream_Circle(const CPDF_Rect & rcBBox, const CPWL_Color & crText)
1216e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1217e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CFX_ByteTextBuf sAP;
1218e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	sAP << "q\n" << CPWL_Utils::GetColorAppStream(crText,TRUE) << CPWL_Utils::GetAP_Circle(rcBBox) << "f\nQ\n";
1219e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	return sAP.GetByteString();
1220e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1221e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1222e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCFX_ByteString CPWL_Utils::GetAppStream_Cross(const CPDF_Rect & rcBBox, const CPWL_Color & crText)
1223e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1224e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CFX_ByteTextBuf sAP;
1225e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	sAP << "q\n" << CPWL_Utils::GetColorAppStream(crText,FALSE) << CPWL_Utils::GetAP_Cross(rcBBox) << "S\nQ\n";
1226e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	return sAP.GetByteString();
1227e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1228e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1229e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCFX_ByteString CPWL_Utils::GetAppStream_Diamond(const CPDF_Rect & rcBBox, const CPWL_Color & crText)
1230e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1231e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CFX_ByteTextBuf sAP;
1232e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	sAP << "q\n1 w\n" << CPWL_Utils::GetColorAppStream(crText,TRUE) << CPWL_Utils::GetAP_Diamond(rcBBox) << "f\nQ\n";
1233e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	return sAP.GetByteString();
1234e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1235e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1236e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCFX_ByteString CPWL_Utils::GetAppStream_Square(const CPDF_Rect & rcBBox, const CPWL_Color & crText)
1237e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1238e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CFX_ByteTextBuf sAP;
1239e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	sAP << "q\n" << CPWL_Utils::GetColorAppStream(crText,TRUE) << CPWL_Utils::GetAP_Square(rcBBox) << "f\nQ\n";
1240e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	return sAP.GetByteString();
1241e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1242e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1243e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCFX_ByteString CPWL_Utils::GetAppStream_Star(const CPDF_Rect & rcBBox, const CPWL_Color & crText)
1244e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1245e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CFX_ByteTextBuf sAP;
1246e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	sAP << "q\n" << CPWL_Utils::GetColorAppStream(crText,TRUE) << CPWL_Utils::GetAP_Star(rcBBox) << "f\nQ\n";
1247e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	return sAP.GetByteString();
1248e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1249e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1250e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCFX_ByteString CPWL_Utils::GetCheckBoxAppStream(const CPDF_Rect & rcBBox,
1251e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov													FX_INT32 nStyle,
1252e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov													const CPWL_Color & crText)
1253e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1254e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPDF_Rect rcCenter = GetCenterSquare(rcBBox);
1255e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	switch (nStyle)
1256e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
1257e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	default:
1258e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PCS_CHECK:
1259e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		return GetAppStream_Check(rcCenter,crText);
1260e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PCS_CIRCLE:
1261e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		return GetAppStream_Circle(ScaleRect(rcCenter,2.0f/3.0f),crText);
1262e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PCS_CROSS:
1263e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		return GetAppStream_Cross(rcCenter,crText);
1264e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PCS_DIAMOND:
1265e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		return GetAppStream_Diamond(ScaleRect(rcCenter,2.0f/3.0f),crText);
1266e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PCS_SQUARE:
1267e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		return GetAppStream_Square(ScaleRect(rcCenter,2.0f/3.0f),crText);
1268e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PCS_STAR:
1269e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		return GetAppStream_Star(ScaleRect(rcCenter,2.0f/3.0f),crText);
1270e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	}
1271e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1272e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1273e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCFX_ByteString CPWL_Utils::GetRadioButtonAppStream(const CPDF_Rect & rcBBox,
1274e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov													FX_INT32 nStyle,
1275e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov													const CPWL_Color & crText)
1276e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1277e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPDF_Rect rcCenter = GetCenterSquare(rcBBox);
1278e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	switch (nStyle)
1279e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
1280e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	default:
1281e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PCS_CHECK:
1282e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		return GetAppStream_Check(rcCenter,crText);
1283e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PCS_CIRCLE:
1284e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		return GetAppStream_Circle(ScaleRect(rcCenter,1.0f/2.0f),crText);
1285e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PCS_CROSS:
1286e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		return GetAppStream_Cross(rcCenter,crText);
1287e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PCS_DIAMOND:
1288e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		return GetAppStream_Diamond(ScaleRect(rcCenter,2.0f/3.0f),crText);
1289e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PCS_SQUARE:
1290e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		return GetAppStream_Square(ScaleRect(rcCenter,2.0f/3.0f),crText);
1291e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PCS_STAR:
1292e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		return GetAppStream_Star(ScaleRect(rcCenter,2.0f/3.0f),crText);
1293e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	}
1294e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1295e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1296e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCFX_ByteString CPWL_Utils::GetDropButtonAppStream(const CPDF_Rect & rcBBox)
1297e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1298e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CFX_ByteTextBuf sAppStream;
1299e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1300e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if (!rcBBox.IsEmpty())
1301e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
1302e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sAppStream << "q\n" << CPWL_Utils::GetColorAppStream(CPWL_Color(COLORTYPE_RGB,220.0f/255.0f,220.0f/255.0f,220.0f/255.0f),TRUE);
1303e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sAppStream << rcBBox.left << " " << rcBBox.bottom << " "
1304e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				<< rcBBox.right - rcBBox.left << " " << rcBBox.top - rcBBox.bottom << " re f\n";
1305e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sAppStream << "Q\n";
1306e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1307e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sAppStream << "q\n" <<
1308e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			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))
1309e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			<< "Q\n";
1310e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1311e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPDF_Point ptCenter = CPDF_Point((rcBBox.left + rcBBox.right)/2,(rcBBox.top + rcBBox.bottom)/2);
1312e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		if (IsFloatBigger(rcBBox.right - rcBBox.left,6) && IsFloatBigger(rcBBox.top - rcBBox.bottom,6))
1313e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		{
1314e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			sAppStream << "q\n" << " 0 g\n";
1315e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			sAppStream << ptCenter.x - 3 << " " << ptCenter.y + 1.5f << " m\n";
1316e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			sAppStream << ptCenter.x + 3 << " " << ptCenter.y + 1.5f << " l\n";
1317e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			sAppStream << ptCenter.x << " " << ptCenter.y - 1.5f << " l\n";
1318e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			sAppStream << ptCenter.x - 3 << " " << ptCenter.y + 1.5f << " l f\n";
1319e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			sAppStream << "Q\n";
1320e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		}
1321e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	}
1322e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1323e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	return sAppStream.GetByteString();
1324e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1325e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1326e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPWL_Utils::ConvertCMYK2GRAY(FX_FLOAT dC,FX_FLOAT dM,FX_FLOAT dY,FX_FLOAT dK,FX_FLOAT &dGray)
1327e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1328e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if (dC<0 || dC>1 || dM<0 || dM>1 || dY < 0 || dY >1 || dK < 0 || dK >1)
1329e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		return;
1330e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	dGray = 1.0f - FX_MIN(1.0f,0.3f*dC+0.59f * dM + 0.11f*dY+dK);
1331e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1332e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1333e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPWL_Utils::ConvertGRAY2CMYK(FX_FLOAT dGray,FX_FLOAT  &dC,FX_FLOAT &dM,FX_FLOAT &dY,FX_FLOAT &dK)
1334e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1335e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if (dGray <0 || dGray >1)
1336e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		return;
1337e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	dC = 0.0f;
1338e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	dM = 0.0f;
1339e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	dY = 0.0f;
1340e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	dK = 1.0f-dGray;
1341e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1342e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1343e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPWL_Utils::ConvertGRAY2RGB(FX_FLOAT dGray,FX_FLOAT &dR,FX_FLOAT &dG,FX_FLOAT &dB)
1344e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1345e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if (dGray <0 || dGray >1)
1346e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		return;
1347e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	dR = dGray;
1348e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	dG = dGray;
1349e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	dB = dGray;
1350e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1351e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1352e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPWL_Utils::ConvertRGB2GRAY(FX_FLOAT dR,FX_FLOAT dG,FX_FLOAT dB,FX_FLOAT &dGray)
1353e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1354e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if (dR<0 || dR>1 || dG<0 || dG > 0 || dB < 0 || dB >1)
1355e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		return;
1356e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	dGray = 0.3f*dR+0.59f*dG+0.11f*dB;
1357e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1358e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1359e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPWL_Utils::ConvertCMYK2RGB(FX_FLOAT dC,FX_FLOAT dM,FX_FLOAT dY,FX_FLOAT dK,FX_FLOAT &dR,FX_FLOAT &dG,FX_FLOAT &dB)
1360e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1361e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if (dC <0 || dC>1 || dM < 0 || dM > 1 || dY < 0 || dY > 1 || dK < 0 || dK > 1 )
1362e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		return;
1363e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	dR = 1.0f - FX_MIN(1.0f, dC + dK);
1364e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	dG = 1.0f - FX_MIN(1.0f, dM + dK);
1365e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	dB = 1.0f - FX_MIN(1.0f, dY + dK);
1366e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1367e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1368e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPWL_Utils::ConvertRGB2CMYK(FX_FLOAT dR,FX_FLOAT dG,FX_FLOAT dB,FX_FLOAT &dC,FX_FLOAT &dM,FX_FLOAT &dY,FX_FLOAT &dK)
1369e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1370e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if (dR<0 || dR>1 || dG<0 || dG>1 || dB<0 || dB>1)
1371e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		return;
1372e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1373e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	dC = 1.0f - dR;
1374e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	dM = 1.0f - dG;
1375e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	dY = 1.0f - dB;
1376e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	dK = FX_MIN(dC, FX_MIN(dM, dY));
1377e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1378e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1379e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPWL_Utils::PWLColorToARGB(const CPWL_Color& color, FX_INT32& alpha, FX_FLOAT& red, FX_FLOAT& green, FX_FLOAT& blue)
1380e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1381e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	switch (color.nColorType)
1382e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
1383e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case COLORTYPE_TRANSPARENT:
1384e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		{
1385e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			alpha = 0;
1386e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		}
1387e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
1388e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case COLORTYPE_GRAY:
1389e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		{
1390e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			ConvertGRAY2RGB(color.fColor1, red, green, blue);
1391e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		}
1392e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
1393e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case COLORTYPE_RGB:
1394e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		{
1395e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			red = color.fColor1;
1396e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			green = color.fColor2;
1397e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			blue = color.fColor3;
1398e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		}
1399e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
1400e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case COLORTYPE_CMYK:
1401e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		{
1402e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			ConvertCMYK2RGB(color.fColor1, color.fColor2, color.fColor3, color.fColor4,
1403e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				red, green, blue);
1404e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		}
1405e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
1406e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	}
1407e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1408e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1409e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_COLORREF CPWL_Utils::PWLColorToFXColor(const CPWL_Color& color, FX_INT32 nTransparancy)
1410e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1411e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_INT32 nAlpha = nTransparancy;
1412e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT dRed = 0;
1413e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT dGreen = 0;
1414e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT dBlue = 0;
1415e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1416e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	PWLColorToARGB(color, nAlpha, dRed, dGreen, dBlue);
1417e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1418e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	return ArgbEncode(nAlpha, (FX_INT32)(dRed*255), (FX_INT32)(dGreen*255), (FX_INT32)(dBlue*255));
1419e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1420e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1421e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPWL_Utils::DrawFillRect(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,const CPDF_Rect & rect,
1422e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							  const FX_COLORREF & color)
1423e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1424e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CFX_PathData path;
1425e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPDF_Rect rcTemp(rect);
1426e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	path.AppendRect(rcTemp.left,rcTemp.bottom,rcTemp.right,rcTemp.top);
1427e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	pDevice->DrawPath(&path, pUser2Device, NULL, color, 0, FXFILL_WINDING);
1428e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1429e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1430e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPWL_Utils::DrawFillArea(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
1431e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							const CPDF_Point* pPts, FX_INT32 nCount, const FX_COLORREF& color)
1432e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1433e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CFX_PathData path;
1434e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	path.SetPointCount(nCount);
1435e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1436e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	path.SetPoint(0, pPts[0].x, pPts[0].y, FXPT_MOVETO);
1437e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	for (FX_INT32 i=1; i<nCount; i++)
1438e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		path.SetPoint(i, pPts[i].x, pPts[i].y, FXPT_LINETO);
1439e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1440e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	pDevice->DrawPath(&path, pUser2Device, NULL, color, 0, FXFILL_ALTERNATE);
1441e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1442e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1443e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPWL_Utils::DrawStrokeRect(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,const CPDF_Rect & rect,
1444e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							  const FX_COLORREF & color, FX_FLOAT fWidth)
1445e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1446e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CFX_PathData path;
1447e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPDF_Rect rcTemp(rect);
1448e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	path.AppendRect(rcTemp.left,rcTemp.bottom,rcTemp.right,rcTemp.top);
1449e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1450e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CFX_GraphStateData gsd;
1451e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	gsd.m_LineWidth = fWidth;
1452e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1453e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	pDevice->DrawPath(&path, pUser2Device, &gsd, 0, color, FXFILL_ALTERNATE);
1454e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1455e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1456e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPWL_Utils::DrawStrokeLine(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
1457e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							const CPDF_Point & ptMoveTo, const CPDF_Point & ptLineTo, const FX_COLORREF & color, FX_FLOAT fWidth)
1458e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1459e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CFX_PathData path;
1460e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	path.SetPointCount(2);
1461e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	path.SetPoint(0, ptMoveTo.x, ptMoveTo.y, FXPT_MOVETO);
1462e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	path.SetPoint(1, ptLineTo.x, ptLineTo.y, FXPT_LINETO);
1463e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1464e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CFX_GraphStateData gsd;
1465e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	gsd.m_LineWidth = fWidth;
1466e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1467e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	pDevice->DrawPath(&path, pUser2Device, &gsd, 0, color, FXFILL_ALTERNATE);
1468e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1469e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1470e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPWL_Utils::DrawFillRect(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,const CPDF_Rect & rect,
1471e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							  const CPWL_Color & color, FX_INT32 nTransparancy)
1472e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1473e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPWL_Utils::DrawFillRect(pDevice,pUser2Device,rect,PWLColorToFXColor(color,nTransparancy));
1474e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1475e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1476e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPWL_Utils::DrawShadow(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
1477e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov														FX_BOOL bVertical, FX_BOOL bHorizontal, CPDF_Rect rect,
1478e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov														FX_INT32 nTransparancy, FX_INT32 nStartGray, FX_INT32 nEndGray)
1479e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1480e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fStepGray = 1.0f;
1481e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1482e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if (bVertical)
1483e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
1484e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		fStepGray = (nEndGray - nStartGray) / rect.Height();
1485e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1486e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		for (FX_FLOAT fy=rect.bottom+0.5f; fy<=rect.top-0.5f; fy+=1.0f)
1487e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		{
1488e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			FX_INT32 nGray = nStartGray + (FX_INT32)(fStepGray * (fy-rect.bottom));
1489e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, CPDF_Point(rect.left, fy),
1490e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				CPDF_Point(rect.right, fy), ArgbEncode(nTransparancy, nGray, nGray, nGray), 1.5f);
1491e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		}
1492e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	}
1493e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1494e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if (bHorizontal)
1495e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
1496e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		fStepGray = (nEndGray - nStartGray) / rect.Width();
1497e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1498e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		for (FX_FLOAT fx=rect.left+0.5f; fx<=rect.right-0.5f; fx+=1.0f)
1499e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		{
1500e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			FX_INT32 nGray = nStartGray + (FX_INT32)(fStepGray * (fx-rect.left));
1501e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, CPDF_Point(fx, rect.bottom),
1502e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				CPDF_Point(fx, rect.top), ArgbEncode(nTransparancy, nGray, nGray, nGray), 1.5f);
1503e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		}
1504e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	}
1505e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1506e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1507e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPWL_Utils::DrawBorder(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
1508e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov												const CPDF_Rect & rect, FX_FLOAT fWidth,
1509e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov												const CPWL_Color & color, const CPWL_Color & crLeftTop, const CPWL_Color & crRightBottom,
1510e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov												FX_INT32 nStyle, const CPWL_Dash & dash, FX_INT32 nTransparancy)
1511e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1512e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fLeft = rect.left;
1513e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fRight = rect.right;
1514e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fTop = rect.top;
1515e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fBottom = rect.bottom;
1516e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1517e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if (fWidth > 0.0f)
1518e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
1519e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		FX_FLOAT fHalfWidth = fWidth / 2.0f;
1520e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1521e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		switch (nStyle)
1522e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		{
1523e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		default:
1524e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		case PBS_SOLID:
1525e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			{
1526e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				CFX_PathData path;
1527e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				path.AppendRect(fLeft, fBottom, fRight, fTop);
1528e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				path.AppendRect(fLeft + fWidth, fBottom + fWidth, fRight - fWidth, fTop - fWidth);
1529e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				pDevice->DrawPath(&path, pUser2Device, NULL, PWLColorToFXColor(color,nTransparancy), 0, FXFILL_ALTERNATE);
1530e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			}
1531e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			break;
1532e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		case PBS_DASH:
1533e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			{
1534e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				CFX_PathData path;
1535e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1536e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				path.SetPointCount(5);
1537e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				path.SetPoint(0, fLeft + fWidth / 2.0f, fBottom + fWidth / 2.0f, FXPT_MOVETO);
1538e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				path.SetPoint(1, fLeft + fWidth / 2.0f, fTop - fWidth / 2.0f, FXPT_LINETO);
1539e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				path.SetPoint(2, fRight - fWidth / 2.0f, fTop - fWidth / 2.0f, FXPT_LINETO);
1540e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				path.SetPoint(3, fRight - fWidth / 2.0f, fBottom + fWidth / 2.0f, FXPT_LINETO);
1541e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				path.SetPoint(4, fLeft + fWidth / 2.0f, fBottom + fWidth / 2.0f, FXPT_LINETO);
1542e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1543e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				CFX_GraphStateData gsd;
1544e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				gsd.SetDashCount(2);
1545e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				gsd.m_DashArray[0] = 3.0f;
1546e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				gsd.m_DashArray[1] = 3.0f;
1547e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				gsd.m_DashPhase = 0;
1548e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1549e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				gsd.m_LineWidth = fWidth;
1550e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				pDevice->DrawPath(&path, pUser2Device, &gsd, 0, PWLColorToFXColor(color,nTransparancy), FXFILL_WINDING);
1551e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			}
1552e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			break;
1553e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		case PBS_BEVELED:
1554e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		case PBS_INSET:
1555e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			{
1556e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				CFX_GraphStateData gsd;
1557e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				gsd.m_LineWidth = fHalfWidth;
1558e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1559e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				CFX_PathData pathLT;
1560e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1561e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				pathLT.SetPointCount(7);
1562e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				pathLT.SetPoint(0, fLeft + fHalfWidth, fBottom + fHalfWidth, FXPT_MOVETO);
1563e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				pathLT.SetPoint(1, fLeft + fHalfWidth, fTop - fHalfWidth, FXPT_LINETO);
1564e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				pathLT.SetPoint(2, fRight - fHalfWidth, fTop - fHalfWidth, FXPT_LINETO);
1565e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				pathLT.SetPoint(3, fRight - fHalfWidth * 2, fTop - fHalfWidth * 2, FXPT_LINETO);
1566e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				pathLT.SetPoint(4, fLeft + fHalfWidth * 2, fTop - fHalfWidth * 2, FXPT_LINETO);
1567e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				pathLT.SetPoint(5, fLeft + fHalfWidth * 2, fBottom + fHalfWidth * 2, FXPT_LINETO);
1568e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				pathLT.SetPoint(6, fLeft + fHalfWidth, fBottom + fHalfWidth, FXPT_LINETO);
1569e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1570e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				pDevice->DrawPath(&pathLT, pUser2Device, &gsd, PWLColorToFXColor(crLeftTop,nTransparancy), 0, FXFILL_ALTERNATE);
1571e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1572e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				CFX_PathData pathRB;
1573e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1574e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				pathRB.SetPointCount(7);
1575e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				pathRB.SetPoint(0, fRight - fHalfWidth, fTop - fHalfWidth, FXPT_MOVETO);
1576e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				pathRB.SetPoint(1, fRight - fHalfWidth, fBottom + fHalfWidth, FXPT_LINETO);
1577e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				pathRB.SetPoint(2, fLeft + fHalfWidth, fBottom + fHalfWidth, FXPT_LINETO);
1578e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				pathRB.SetPoint(3, fLeft + fHalfWidth * 2, fBottom + fHalfWidth * 2, FXPT_LINETO);
1579e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				pathRB.SetPoint(4, fRight - fHalfWidth * 2, fBottom + fHalfWidth * 2, FXPT_LINETO);
1580e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				pathRB.SetPoint(5, fRight - fHalfWidth * 2, fTop - fHalfWidth * 2, FXPT_LINETO);
1581e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				pathRB.SetPoint(6, fRight - fHalfWidth, fTop - fHalfWidth, FXPT_LINETO);
1582e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1583e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				pDevice->DrawPath(&pathRB, pUser2Device, &gsd, PWLColorToFXColor(crRightBottom,nTransparancy), 0, FXFILL_ALTERNATE);
1584e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1585e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				CFX_PathData path;
1586e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1587e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				path.AppendRect(fLeft, fBottom, fRight, fTop);
1588e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				path.AppendRect(fLeft + fHalfWidth, fBottom + fHalfWidth, fRight - fHalfWidth, fTop - fHalfWidth);
1589e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1590e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				pDevice->DrawPath(&path, pUser2Device, &gsd, PWLColorToFXColor(color,nTransparancy), 0, FXFILL_ALTERNATE);
1591e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			}
1592e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			break;
1593e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		case PBS_UNDERLINED:
1594e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			{
1595e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				CFX_PathData path;
1596e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1597e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				path.SetPointCount(2);
1598e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				path.SetPoint(0, fLeft, fBottom + fWidth / 2, FXPT_MOVETO);
1599e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				path.SetPoint(1, fRight, fBottom + fWidth / 2, FXPT_LINETO);
1600e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1601e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				CFX_GraphStateData gsd;
1602e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				gsd.m_LineWidth = fWidth;
1603e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1604e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				pDevice->DrawPath(&path, pUser2Device, &gsd,0,  PWLColorToFXColor(color,nTransparancy), FXFILL_ALTERNATE);
1605e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			}
1606e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			break;
1607e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		case PBS_SHADOW:
1608e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			{
1609e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				CFX_PathData path;
1610e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				path.AppendRect(fLeft, fBottom, fRight, fTop);
1611e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				path.AppendRect(fLeft + fWidth, fBottom + fWidth, fRight - fWidth, fTop - fWidth);
1612e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				pDevice->DrawPath(&path, pUser2Device, NULL, PWLColorToFXColor(color,nTransparancy/2), 0, FXFILL_ALTERNATE);
1613e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			}
1614e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			break;
1615e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		}
1616e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	}
1617e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1618e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1619e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstatic void AddSquigglyPath(CFX_PathData & PathData, FX_FLOAT fStartX, FX_FLOAT fEndX, FX_FLOAT fY, FX_FLOAT fStep)
1620e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1621e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	PathData.AddPointCount(1);
1622e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	PathData.SetPoint(PathData.GetPointCount() - 1, fStartX, fY, FXPT_MOVETO);
1623e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1624e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fx;
1625e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_INT32 i;
1626e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1627e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	for (i=1,fx=fStartX+fStep; fx<fEndX; fx+=fStep,i++)
1628e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
1629e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		PathData.AddPointCount(1);
1630e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		PathData.SetPoint(PathData.GetPointCount() - 1, fx, fY + (i&1)*fStep, FXPT_LINETO);
1631e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	}
1632e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1633e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1634e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstatic void AddSpellCheckObj(CFX_PathData & PathData, IFX_Edit* pEdit, const CPVT_WordRange& wrWord)
1635e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1636e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fStartX = 0.0f;
1637e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fEndX = 0.0f;
1638e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fY = 0.0f;
1639e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fStep = 0.0f;
1640e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1641e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_BOOL bBreak = FALSE;
1642e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1643e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator())
1644e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
1645e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		pIterator->SetAt(wrWord.BeginPos);
1646e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1647e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		do
1648e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		{
1649e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			CPVT_WordPlace place = pIterator->GetAt();
1650e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1651e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			CPVT_Line line;
1652e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			if (pIterator->GetLine(line))
1653e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			{
1654e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				fY = line.ptLine.y;
1655e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				fStep = (line.fLineAscent - line.fLineDescent) / 16.0f;
1656e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			}
1657e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1658e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			if (place.LineCmp(wrWord.BeginPos) == 0)
1659e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			{
1660e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				pIterator->SetAt(wrWord.BeginPos);
1661e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				CPVT_Word word;
1662e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				if (pIterator->GetWord(word))
1663e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				{
1664e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					fStartX = word.ptWord.x;
1665e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				}
1666e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			}
1667e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			else
1668e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			{
1669e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				fStartX = line.ptLine.x;
1670e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			}
1671e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1672e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			if (place.LineCmp(wrWord.EndPos) == 0)
1673e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			{
1674e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				pIterator->SetAt(wrWord.EndPos);
1675e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				CPVT_Word word;
1676e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				if (pIterator->GetWord(word))
1677e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				{
1678e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					fEndX = word.ptWord.x + word.fWidth;
1679e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				}
1680e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1681e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				bBreak = TRUE;
1682e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			}
1683e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			else
1684e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			{
1685e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				fEndX = line.ptLine.x + line.fLineWidth;
1686e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			}
1687e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1688e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			AddSquigglyPath(PathData, fStartX, fEndX, fY, fStep);
1689e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1690e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			if (bBreak) break;
1691e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		}
1692e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		while (pIterator->NextLine());
1693e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	}
1694e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1695e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1696e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPWL_Utils::DrawEditSpellCheck(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, IFX_Edit* pEdit,
1697e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						const CPDF_Rect& rcClip, const CPDF_Point& ptOffset, const CPVT_WordRange* pRange,
1698e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						IPWL_SpellCheck * pSpellCheck)
1699e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1700e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	const FX_COLORREF crSpell = ArgbEncode(255,255,0,0);
1701e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1702e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	//for spellcheck
1703e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_BOOL bLatinWord = FALSE;
1704e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPVT_WordPlace wpWordStart;
1705e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CFX_ByteString sLatinWord;
1706e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1707e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CFX_PathData pathSpell;
1708e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1709e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	pDevice->SaveState();
1710e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1711e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if (!rcClip.IsEmpty())
1712e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
1713e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPDF_Rect rcTemp = rcClip;
1714e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		pUser2Device->TransformRect(rcTemp);
1715e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		FX_RECT rcDevClip;
1716e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		rcDevClip.left = (FX_INT32)rcTemp.left;
1717e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		rcDevClip.right = (FX_INT32)rcTemp.right;
1718e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		rcDevClip.top = (FX_INT32)rcTemp.top;
1719e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		rcDevClip.bottom = (FX_INT32)rcTemp.bottom;
1720e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		pDevice->SetClip_Rect(&rcDevClip);
1721e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	}
1722e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1723e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator())
1724e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
1725e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		if (pEdit->GetFontMap())
1726e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		{
1727e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			if (pRange)
1728e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				pIterator->SetAt(pRange->BeginPos);
1729e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			else
1730e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				pIterator->SetAt(0);
1731e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1732e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			CPVT_WordPlace oldplace;
1733e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1734e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			while (pIterator->NextWord())
1735e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			{
1736e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				CPVT_WordPlace place = pIterator->GetAt();
1737e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				if (pRange && place.WordCmp(pRange->EndPos) > 0) break;
1738e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1739e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				CPVT_Word word;
1740e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				if (pIterator->GetWord(word))
1741e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				{
1742e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					if (FX_EDIT_ISLATINWORD(word.Word))
1743e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					{
1744e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						if (!bLatinWord)
1745e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						{
1746e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							wpWordStart = place;
1747e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							bLatinWord = TRUE;
1748e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						}
1749e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1750e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						sLatinWord += (char)word.Word;
1751e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					}
1752e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					else
1753e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					{
1754e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						if (bLatinWord)
1755e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						{
1756e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							if (!sLatinWord.IsEmpty())
1757e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							{
1758e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov								if (pSpellCheck && !pSpellCheck->CheckWord(sLatinWord))
1759e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov								{
1760e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov									AddSpellCheckObj(pathSpell,pEdit,CPVT_WordRange(wpWordStart,oldplace));
1761e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov									pIterator->SetAt(place);
1762e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov								}
1763e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							}
1764e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							bLatinWord = FALSE;
1765e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						}
1766e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1767e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						sLatinWord.Empty();
1768e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					}
1769e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1770e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					oldplace = place;
1771e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				}
1772e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				else
1773e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				{
1774e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					if (bLatinWord)
1775e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					{
1776e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						if (!sLatinWord.IsEmpty())
1777e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						{
1778e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							if (pSpellCheck && !pSpellCheck->CheckWord(sLatinWord))
1779e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							{
1780e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov								AddSpellCheckObj(pathSpell,pEdit,CPVT_WordRange(wpWordStart,oldplace));
1781e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov								pIterator->SetAt(place);
1782e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							}
1783e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						}
1784e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						bLatinWord = FALSE;
1785e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					}
1786e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1787e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					sLatinWord.Empty();
1788e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				}
1789e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			}
1790e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1791e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			if (!sLatinWord.IsEmpty())
1792e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			{
1793e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				if (pSpellCheck && !pSpellCheck->CheckWord(sLatinWord))
1794e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				{
1795e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					AddSpellCheckObj(pathSpell,pEdit,CPVT_WordRange(wpWordStart,oldplace));
1796e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				}
1797e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			}
1798e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		}
1799e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	}
1800e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1801e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CFX_GraphStateData gsd;
1802e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	gsd.m_LineWidth = 0;
1803e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if (pathSpell.GetPointCount() > 0)
1804e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		pDevice->DrawPath(&pathSpell, pUser2Device, &gsd, 0, crSpell, FXFILL_ALTERNATE);
1805e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1806e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	pDevice->RestoreState();
1807e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1808e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1809e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL CPWL_Utils::IsBlackOrWhite(const CPWL_Color& color)
1810e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1811e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	switch (color.nColorType)
1812e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
1813e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case COLORTYPE_TRANSPARENT:
1814e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		return FALSE;
1815e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case COLORTYPE_GRAY:
1816e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		return color.fColor1 < 0.5f;
1817e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case COLORTYPE_RGB:
1818e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		return color.fColor1 + color.fColor2 + color.fColor3 < 1.5f;
1819e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case COLORTYPE_CMYK:
1820e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		return color.fColor1 + color.fColor2 + color.fColor3 + color.fColor4 > 2.0f;
1821e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	}
1822e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1823e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	return TRUE;
1824e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1825e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1826e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPWL_Color CPWL_Utils::GetReverseColor(const CPWL_Color& color)
1827e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1828e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPWL_Color crRet = color;
1829e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1830e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	switch (color.nColorType)
1831e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
1832e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case COLORTYPE_GRAY:
1833e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		crRet.fColor1 = 1.0f - crRet.fColor1;
1834e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
1835e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case COLORTYPE_RGB:
1836e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		crRet.fColor1 = 1.0f - crRet.fColor1;
1837e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		crRet.fColor2 = 1.0f - crRet.fColor2;
1838e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		crRet.fColor3 = 1.0f - crRet.fColor3;
1839e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
1840e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case COLORTYPE_CMYK:
1841e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		crRet.fColor1 = 1.0f - crRet.fColor1;
1842e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		crRet.fColor2 = 1.0f - crRet.fColor2;
1843e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		crRet.fColor3 = 1.0f - crRet.fColor3;
1844e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		crRet.fColor4 = 1.0f - crRet.fColor4;
1845e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
1846e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	}
1847e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1848e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	return crRet;
1849e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1850e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1851e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCFX_ByteString CPWL_Utils::GetIconAppStream(FX_INT32 nType, const CPDF_Rect& rect, const CPWL_Color& crFill,
1852e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov												const CPWL_Color& crStroke)
1853e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1854e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CFX_ByteString sAppStream = CPWL_Utils::GetColorAppStream(crStroke, FALSE);
1855e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	sAppStream += CPWL_Utils::GetColorAppStream(crFill, TRUE);
1856e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1857e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CFX_ByteString sPath;
1858e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CFX_PathData path;
1859e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1860e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	switch (nType)
1861e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
1862e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PWL_ICONTYPE_CHECKMARK:
1863e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetGraphics_Checkmark(sPath, path, rect, PWLPT_STREAM);
1864e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
1865e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PWL_ICONTYPE_CIRCLE:
1866e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetGraphics_Circle(sPath, path, rect, PWLPT_STREAM);
1867e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
1868e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PWL_ICONTYPE_COMMENT:
1869e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetGraphics_Comment(sPath, path, rect, PWLPT_STREAM);
1870e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
1871e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PWL_ICONTYPE_CROSS:
1872e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetGraphics_Cross(sPath, path, rect, PWLPT_STREAM);
1873e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
1874e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PWL_ICONTYPE_HELP:
1875e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetGraphics_Help(sPath, path, rect, PWLPT_STREAM);
1876e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
1877e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PWL_ICONTYPE_INSERTTEXT:
1878e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetGraphics_InsertText(sPath, path, rect, PWLPT_STREAM);
1879e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
1880e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PWL_ICONTYPE_KEY:
1881e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetGraphics_Key(sPath, path, rect, PWLPT_STREAM);
1882e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
1883e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PWL_ICONTYPE_NEWPARAGRAPH:
1884e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetGraphics_NewParagraph(sPath, path, rect, PWLPT_STREAM);
1885e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
1886e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PWL_ICONTYPE_TEXTNOTE:
1887e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetGraphics_TextNote(sPath, path, rect, PWLPT_STREAM);
1888e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
1889e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PWL_ICONTYPE_PARAGRAPH:
1890e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetGraphics_Paragraph(sPath, path, rect, PWLPT_STREAM);
1891e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
1892e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PWL_ICONTYPE_RIGHTARROW:
1893e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetGraphics_RightArrow(sPath, path, rect, PWLPT_STREAM);
1894e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
1895e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PWL_ICONTYPE_RIGHTPOINTER:
1896e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetGraphics_RightPointer(sPath, path, rect, PWLPT_STREAM);
1897e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
1898e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PWL_ICONTYPE_STAR:
1899e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetGraphics_Star(sPath, path, rect, PWLPT_STREAM);
1900e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
1901e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PWL_ICONTYPE_UPARROW:
1902e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetGraphics_UpArrow(sPath, path, rect, PWLPT_STREAM);
1903e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
1904e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PWL_ICONTYPE_UPLEFTARROW:
1905e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetGraphics_UpLeftArrow(sPath, path, rect, PWLPT_STREAM);
1906e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
1907e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PWL_ICONTYPE_GRAPH:
1908e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetGraphics_Graph(sPath, path, rect, PWLPT_STREAM);
1909e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
1910e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PWL_ICONTYPE_PAPERCLIP:
1911e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetGraphics_Paperclip(sPath, path, rect, PWLPT_STREAM);
1912e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
1913e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PWL_ICONTYPE_ATTACHMENT:
1914e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetGraphics_Attachment(sPath, path, rect, PWLPT_STREAM);
1915e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
1916e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PWL_ICONTYPE_TAG:
1917e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetGraphics_Tag(sPath, path, rect, PWLPT_STREAM);
1918e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
1919e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PWL_ICONTYPE_FOXIT:
1920e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetGraphics_Foxit(sPath, path, rect, PWLPT_STREAM);
1921e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
1922e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	}
1923e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1924e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	sAppStream += sPath;
1925e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if (crStroke.nColorType != COLORTYPE_TRANSPARENT)
1926e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sAppStream += "B*\n";
1927e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	else
1928e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sAppStream += "f*\n";
1929e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1930e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	return sAppStream;
1931e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1932e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1933e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPWL_Utils::DrawIconAppStream(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
1934e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						FX_INT32 nType, const CPDF_Rect & rect, const CPWL_Color& crFill, const CPWL_Color& crStroke, const FX_INT32 nTransparancy)
1935e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1936e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CFX_GraphStateData gsd;
1937e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	gsd.m_LineWidth = 1.0f;
1938e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1939e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CFX_ByteString sPath;
1940e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CFX_PathData path;
1941e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1942e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	switch (nType)
1943e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
1944e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PWL_ICONTYPE_CHECKMARK:
1945e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetGraphics_Checkmark(sPath, path, rect, PWLPT_PATHDATA);
1946e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
1947e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PWL_ICONTYPE_CIRCLE:
1948e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetGraphics_Circle(sPath, path, rect, PWLPT_PATHDATA);
1949e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
1950e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PWL_ICONTYPE_COMMENT:
1951e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetGraphics_Comment(sPath, path, rect, PWLPT_PATHDATA);
1952e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
1953e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PWL_ICONTYPE_CROSS:
1954e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetGraphics_Cross(sPath, path, rect, PWLPT_PATHDATA);
1955e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
1956e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PWL_ICONTYPE_HELP:
1957e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetGraphics_Help(sPath, path, rect, PWLPT_PATHDATA);
1958e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
1959e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PWL_ICONTYPE_INSERTTEXT:
1960e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetGraphics_InsertText(sPath, path, rect, PWLPT_PATHDATA);
1961e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
1962e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PWL_ICONTYPE_KEY:
1963e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetGraphics_Key(sPath, path, rect, PWLPT_PATHDATA);
1964e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
1965e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PWL_ICONTYPE_NEWPARAGRAPH:
1966e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetGraphics_NewParagraph(sPath, path, rect, PWLPT_PATHDATA);
1967e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
1968e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PWL_ICONTYPE_TEXTNOTE:
1969e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetGraphics_TextNote(sPath, path, rect, PWLPT_PATHDATA);
1970e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
1971e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PWL_ICONTYPE_PARAGRAPH:
1972e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetGraphics_Paragraph(sPath, path, rect, PWLPT_PATHDATA);
1973e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
1974e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PWL_ICONTYPE_RIGHTARROW:
1975e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetGraphics_RightArrow(sPath, path, rect, PWLPT_PATHDATA);
1976e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
1977e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PWL_ICONTYPE_RIGHTPOINTER:
1978e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetGraphics_RightPointer(sPath, path, rect, PWLPT_PATHDATA);
1979e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
1980e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PWL_ICONTYPE_STAR:
1981e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetGraphics_Star(sPath, path, rect, PWLPT_PATHDATA);
1982e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
1983e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PWL_ICONTYPE_UPARROW:
1984e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetGraphics_UpArrow(sPath, path, rect, PWLPT_PATHDATA);
1985e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
1986e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PWL_ICONTYPE_UPLEFTARROW:
1987e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetGraphics_UpLeftArrow(sPath, path, rect, PWLPT_PATHDATA);
1988e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
1989e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PWL_ICONTYPE_GRAPH:
1990e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetGraphics_Graph(sPath, path, rect, PWLPT_PATHDATA);
1991e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
1992e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PWL_ICONTYPE_PAPERCLIP:
1993e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetGraphics_Paperclip(sPath, path, rect, PWLPT_PATHDATA);
1994e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
1995e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PWL_ICONTYPE_ATTACHMENT:
1996e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetGraphics_Attachment(sPath, path, rect, PWLPT_PATHDATA);
1997e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
1998e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PWL_ICONTYPE_TAG:
1999e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetGraphics_Tag(sPath, path, rect, PWLPT_PATHDATA);
2000e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
2001e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case PWL_ICONTYPE_FOXIT:
2002e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetGraphics_Foxit(sPath, path, rect, PWLPT_PATHDATA);
2003e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
2004e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	default:
2005e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		return;
2006e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	}
2007e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2008e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	pDevice->DrawPath(&path, pUser2Device, &gsd,
2009e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		PWLColorToFXColor(crFill,nTransparancy), PWLColorToFXColor(crStroke,nTransparancy), FXFILL_ALTERNATE);
2010e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
2011e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2012e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPWL_Utils::GetGraphics_Checkmark(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
2013e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
2014e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fWidth = crBBox.right - crBBox.left;
2015e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
2016e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2017e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPWL_PathData PathArray[] =
2018e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
2019e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left  + fWidth / 15.0f, crBBox.bottom + fHeight * 2 / 5.0f),PWLPT_MOVETO),
2020e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left  + fWidth / 15.0f + PWL_BEZIER*(fWidth / 7.0f - fWidth / 15.0f),
2021e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					  crBBox.bottom + fHeight * 2 / 5.0f + PWL_BEZIER*(fHeight * 2 / 7.0f - fHeight * 2 / 5.0f)), PWLPT_BEZIERTO),
2022e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 4.5f + PWL_BEZIER*(fWidth / 5.0f - fWidth / 4.5f),
2023e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					  crBBox.bottom + fHeight / 16.0f + PWL_BEZIER*(fHeight / 5.0f - fHeight / 16.0f)), PWLPT_BEZIERTO),
2024e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 4.5f, crBBox.bottom + fHeight / 16.0f), PWLPT_BEZIERTO),
2025e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 4.5f + PWL_BEZIER*(fWidth / 4.4f - fWidth / 4.5f),
2026e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		              crBBox.bottom + fHeight / 16.0f - PWL_BEZIER*fHeight / 16.0f), PWLPT_BEZIERTO),
2027e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 3.0f + PWL_BEZIER*(fWidth / 4.0f - fWidth / 3.0f),
2028e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		              crBBox.bottom), PWLPT_BEZIERTO),
2029e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 3.0f, crBBox.bottom), PWLPT_BEZIERTO),
2030e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 3.0f + PWL_BEZIER*fWidth*(1/7.0f + 2/15.0f),
2031e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		              crBBox.bottom + PWL_BEZIER*fHeight * 4 / 5.0f), PWLPT_BEZIERTO),
2032e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left  + fWidth * 14 / 15.0f + PWL_BEZIER*fWidth*(1/7.0f - 7/15.0f),
2033e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		              crBBox.bottom + fHeight * 15/16.0f + PWL_BEZIER*(fHeight * 4/5.0f - fHeight * 15/16.0f)), PWLPT_BEZIERTO),
2034e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left  + fWidth * 14 / 15.0f,crBBox.bottom + fHeight * 15 / 16.0f), PWLPT_BEZIERTO),
2035e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left  + fWidth * 14 / 15.0f + PWL_BEZIER*(fWidth * 7 / 15.0f - fWidth * 14 / 15.0f),
2036e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		              crBBox.bottom + fHeight * 15 / 16.0f + PWL_BEZIER*(fHeight * 8 / 7.0f - fHeight * 15 / 16.0f)), PWLPT_BEZIERTO),
2037e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 3.6f + PWL_BEZIER*(fWidth / 3.4f - fWidth / 3.6f),
2038e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		              crBBox.bottom + fHeight / 3.5f + PWL_BEZIER*(fHeight / 3.5f - fHeight / 3.5f)), PWLPT_BEZIERTO),
2039e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 3.6f,crBBox.bottom + fHeight / 3.5f), PWLPT_BEZIERTO),
2040e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 3.6f,
2041e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		              crBBox.bottom + fHeight / 3.5f + PWL_BEZIER*(fHeight / 4.0f - fHeight / 3.5f)), PWLPT_BEZIERTO),
2042e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left  + fWidth / 15.0f + PWL_BEZIER*(fWidth / 3.5f - fWidth / 15.0f),
2043e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		              crBBox.bottom + fHeight * 2 / 5.0f + PWL_BEZIER*(fHeight * 3.5f / 5.0f - fHeight * 2 / 5.0f)), PWLPT_BEZIERTO),
2044e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left  + fWidth / 15.0f,crBBox.bottom + fHeight * 2 / 5.0f), PWLPT_BEZIERTO)
2045e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	};
2046e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2047e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if(type == PWLPT_STREAM)
2048e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sPathData = GetAppStreamFromArray(PathArray, 16);
2049e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	else
2050e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetPathDataFromArray(path, PathArray, 16);
2051e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
2052e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2053e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPWL_Utils::GetGraphics_Circle(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
2054e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
2055e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fWidth = crBBox.right - crBBox.left;
2056e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
2057e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2058e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPWL_PathData PathArray[] =
2059e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
2060e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/15.0f,crBBox.bottom + fHeight/2.0f), PWLPT_MOVETO),
2061e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/15.0f,
2062e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		              crBBox.bottom + fHeight/2.0f + PWL_BEZIER*(fHeight*14/15.0f - fHeight/2.0f)), PWLPT_BEZIERTO),
2063e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f - PWL_BEZIER*(fWidth/2.0f - fWidth/15.0f), crBBox.top - fHeight/15.0f), PWLPT_BEZIERTO),
2064e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f,crBBox.top - fHeight/15.0f), PWLPT_BEZIERTO),
2065e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		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),
2066e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		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),
2067e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f, crBBox.bottom + fHeight/2.0f), PWLPT_BEZIERTO),
2068e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f, crBBox.bottom + fHeight/2.0f - PWL_BEZIER*(fHeight/2.0f - fHeight/15.0f)), PWLPT_BEZIERTO),
2069e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		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),
2070e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.bottom + fHeight/15.0f), PWLPT_BEZIERTO),
2071e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f - PWL_BEZIER*(fWidth/2.0f - fWidth/15.0f), crBBox.bottom + fHeight/15.0f), PWLPT_BEZIERTO),
2072e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/15.0f, crBBox.bottom + fHeight/2.0f - PWL_BEZIER*(fHeight/2.0f - fHeight/15.0f)), PWLPT_BEZIERTO),
2073e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/15.0f,crBBox.bottom + fHeight/2.0f), PWLPT_BEZIERTO),
2074e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*3/15.0f, crBBox.bottom + fHeight/2.0f), PWLPT_MOVETO),
2075e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		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),
2076e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		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),
2077e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.top - fHeight*3/15.0f), PWLPT_BEZIERTO),
2078e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		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),
2079e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		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),
2080e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth*3/15.0f, crBBox.bottom + fHeight/2.0f), PWLPT_BEZIERTO),
2081e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		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),
2082e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		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),
2083e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.bottom + fHeight*3/15.0f), PWLPT_BEZIERTO),
2084e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		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),
2085e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		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),
2086e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*3/15.0f, crBBox.bottom + fHeight/2.0f), PWLPT_BEZIERTO)
2087e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	};
2088e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2089e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if(type == PWLPT_STREAM)
2090e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sPathData = GetAppStreamFromArray(PathArray, 26);
2091e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	else
2092e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetPathDataFromArray(path, PathArray, 26);
2093e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
2094e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2095e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPWL_Utils::GetGraphics_Comment(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
2096e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
2097e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fWidth = crBBox.right - crBBox.left;
2098e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
2099e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2100e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPWL_PathData PathArray[] =
2101e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
2102e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/15.0f, crBBox.top - fHeight/6.0f), PWLPT_MOVETO),
2103e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/15.0f, crBBox.top - fHeight/6.0f + PWL_BEZIER*(fHeight/6.0f - fHeight/10.0f)), PWLPT_BEZIERTO),
2104e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*2/15.0f - PWL_BEZIER*fWidth/15.0f, crBBox.top - fHeight/10.0f), PWLPT_BEZIERTO),
2105e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*2/15.0f, crBBox.top - fHeight/10.0f), PWLPT_BEZIERTO),
2106e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth*2/15.0f, crBBox.top - fHeight/10.0f), PWLPT_LINETO),
2107e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth*2/15.0f + PWL_BEZIER*fWidth/15.0f, crBBox.top - fHeight/10.0f), PWLPT_BEZIERTO),
2108e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f, crBBox.top - fHeight/6 + PWL_BEZIER*(fHeight/6.0f - fHeight/10.0f)), PWLPT_BEZIERTO),
2109e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f, crBBox.top - fHeight/6.0f), PWLPT_BEZIERTO),
2110e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f, crBBox.bottom + fHeight/3.0f), PWLPT_LINETO),
2111e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f, crBBox.bottom + fHeight*4/15.0f + PWL_BEZIER*fHeight/15.0f), PWLPT_BEZIERTO),
2112e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth*2/15.0f + PWL_BEZIER*fWidth/15.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_BEZIERTO),
2113e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth*2/15.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_BEZIERTO),
2114e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*5/15.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_LINETO),
2115e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*5/15.0f, crBBox.bottom + fHeight*2/15 + PWL_BEZIER*fHeight*2/15.0f), PWLPT_BEZIERTO),
2116e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*5/15.0f - PWL_BEZIER*fWidth*2/15.0f, crBBox.bottom + fHeight*2/15.0f), PWLPT_BEZIERTO),
2117e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*6/30.0f, crBBox.bottom + fHeight*2/15.0f), PWLPT_BEZIERTO),
2118e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*7/30.0f + PWL_BEZIER*fWidth/30.0f, crBBox.bottom + fHeight*2/15.0f), PWLPT_BEZIERTO),
2119e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*7/30.0f, crBBox.bottom + fHeight*2/15.0f + PWL_BEZIER*fHeight*2/15.0f), PWLPT_BEZIERTO),
2120e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*7/30.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_BEZIERTO),
2121e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*2/15.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_LINETO),
2122e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*2/15.0f - PWL_BEZIER*fWidth/15.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_BEZIERTO),
2123e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/15.0f, crBBox.bottom + fHeight/3.0f - PWL_BEZIER*fHeight/15.0f), PWLPT_BEZIERTO),
2124e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/15.0f, crBBox.bottom + fHeight/3.0f), PWLPT_BEZIERTO),
2125e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/15.0f, crBBox.top - fHeight/6.0f), PWLPT_LINETO),
2126e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*2/15.0f, crBBox.top - fHeight*8/30.0f), PWLPT_MOVETO),
2127e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth*2/15.0f, crBBox.top - fHeight*8/30.0f), PWLPT_LINETO),
2128e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*2/15, crBBox.top - fHeight*25/60.0f), PWLPT_MOVETO),
2129e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth*2/15.0f, crBBox.top - fHeight*25/60.0f), PWLPT_LINETO),
2130e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*2/15.0f, crBBox.top - fHeight*17/30.0f), PWLPT_MOVETO),
2131e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth*4/15.0f, crBBox.top - fHeight*17/30.0f), PWLPT_LINETO)
2132e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	};
2133e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2134e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if(type == PWLPT_STREAM)
2135e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sPathData = GetAppStreamFromArray(PathArray, 30);
2136e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	else
2137e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetPathDataFromArray(path, PathArray, 30);
2138e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
2139e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2140e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPWL_Utils::GetGraphics_Cross(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
2141e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
2142e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fWidth = crBBox.right - crBBox.left;
2143e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
2144e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	//FX_FLOAT fcatercorner = (FX_FLOAT)sqrt(fWidth*fWidth + fHeight*fHeight);
2145e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPWL_Point center_point(crBBox.left + fWidth/2, crBBox.bottom + fHeight/2);
2146e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2147e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPWL_PathData PathArray[] =
2148e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
2149e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(center_point.x, center_point.y + fHeight/10.0f), PWLPT_MOVETO),
2150e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(center_point.x + fWidth*0.3f, center_point.y + fHeight/10.0f + fWidth*0.3f), PWLPT_LINETO),
2151e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(center_point.x + fWidth/10.0f + fWidth*0.3f, center_point.y + fHeight*0.3f), PWLPT_LINETO),
2152e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(center_point.x + fWidth/10.0f, center_point.y), PWLPT_LINETO),
2153e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(center_point.x + fWidth/10.0f + fWidth*0.3f, center_point.y - fHeight*0.3f), PWLPT_LINETO),
2154e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(center_point.x + fWidth*0.3f, center_point.y - fHeight/10.0f - fHeight*0.3f), PWLPT_LINETO),
2155e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(center_point.x, center_point.y - fHeight/10.0f), PWLPT_LINETO),
2156e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(center_point.x - fWidth*0.3f, center_point.y - fHeight/10 - fHeight*0.3f), PWLPT_LINETO),
2157e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(center_point.x - fWidth/10.0f - fWidth*0.3f, center_point.y - fHeight*0.3f), PWLPT_LINETO),
2158e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(center_point.x - fWidth/10, center_point.y), PWLPT_LINETO),
2159e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(center_point.x - fWidth/10 - fWidth*0.3f, center_point.y + fHeight*0.3f), PWLPT_LINETO),
2160e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(center_point.x - fWidth*0.3f, center_point.y + fHeight/10.0f + fHeight*0.3f), PWLPT_LINETO),
2161e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(center_point.x, center_point.y + fHeight/10.0f), PWLPT_LINETO)
2162e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	};
2163e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2164e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if(type == PWLPT_STREAM)
2165e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sPathData = GetAppStreamFromArray(PathArray, 13);
2166e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	else
2167e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetPathDataFromArray(path, PathArray, 13);
2168e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
2169e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2170e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPWL_Utils::GetGraphics_Help(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
2171e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
2172e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fWidth = crBBox.right - crBBox.left;
2173e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
2174e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2175e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPWL_PathData PathArray[] =
2176e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
2177e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/60.0f, crBBox.bottom + fHeight/2.0f), PWLPT_MOVETO),
2178e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/60.0f, crBBox.bottom + fHeight/2.0f + PWL_BEZIER*(fHeight/60.0f - fHeight/2.0f)), PWLPT_BEZIERTO),
2179e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f - PWL_BEZIER*(fWidth/2.0f - fWidth/60.0f), crBBox.bottom + fHeight/60.0f), PWLPT_BEZIERTO),
2180e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.bottom + fHeight/60.0f), PWLPT_BEZIERTO),
2181e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f + PWL_BEZIER*fWidth*29/60.0f, crBBox.bottom + fHeight/60.0f), PWLPT_BEZIERTO),
2182e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth/60.0f, crBBox.bottom + fHeight/2.0f + PWL_BEZIER*(fHeight/60.0f - fHeight/2.0f)), PWLPT_BEZIERTO),
2183e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth/60.0f, crBBox.bottom + fHeight/2.0f), PWLPT_BEZIERTO),
2184e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth/60.0f, crBBox.bottom + fHeight/2.0f + PWL_BEZIER*fHeight*29/60.0f), PWLPT_BEZIERTO),
2185e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f + PWL_BEZIER*fWidth*29/60.0f, crBBox.top - fHeight/60.0f), PWLPT_BEZIERTO),
2186e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.top - fHeight/60.0f), PWLPT_BEZIERTO),
2187e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f - PWL_BEZIER*fWidth*29/60.0f, crBBox.top - fHeight/60.0f), PWLPT_BEZIERTO),
2188e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/60.0f, crBBox.bottom + fHeight/2.0f  + PWL_BEZIER*fHeight*29/60.0f), PWLPT_BEZIERTO),
2189e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/60.0f, crBBox.bottom + fHeight/2.0f), PWLPT_BEZIERTO),
2190e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.27f, crBBox.top - fHeight*0.36f), PWLPT_MOVETO),
2191e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.27f, crBBox.top - fHeight*0.36f + PWL_BEZIER*fHeight*0.23f), PWLPT_BEZIERTO),
2192e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f - PWL_BEZIER*fWidth*0.23f, crBBox.bottom + fHeight*0.87f), PWLPT_BEZIERTO),
2193e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f, crBBox.bottom + fHeight*0.87f), PWLPT_BEZIERTO),
2194e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f + PWL_BEZIER*fWidth*0.23f, crBBox.bottom + fHeight*0.87f), PWLPT_BEZIERTO),
2195e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.27f, crBBox.top - fHeight*0.36f + PWL_BEZIER*fHeight*0.23f), PWLPT_BEZIERTO),
2196e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.27f, crBBox.top - fHeight*0.36f), PWLPT_BEZIERTO),
2197e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		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),
2198e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		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),
2199e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.35f, crBBox.top - fHeight*0.51f), PWLPT_BEZIERTO),
2200e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		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),
2201e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		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),
2202e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.45f, crBBox.top - fHeight*0.68f), PWLPT_BEZIERTO),
2203e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.45f, crBBox.bottom + fHeight*0.30f), PWLPT_LINETO),
2204e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.45f, crBBox.bottom + fHeight*0.30f - fWidth*0.1f*0.7f), PWLPT_BEZIERTO),
2205e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.55f, crBBox.bottom + fHeight*0.30f - fWidth*0.1f*0.7f), PWLPT_BEZIERTO),
2206e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.55f, crBBox.bottom + fHeight*0.30f), PWLPT_BEZIERTO),
2207e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.55f, crBBox.top - fHeight*0.66f), PWLPT_LINETO),
2208e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		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),
2209e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		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),
2210e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.45f, crBBox.top - fHeight*0.48f), PWLPT_BEZIERTO),
2211e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		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),
2212e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		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),
2213e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.37f, crBBox.top - fHeight*0.36f), PWLPT_BEZIERTO),
2214e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.37f, crBBox.top - fHeight*0.36f + PWL_BEZIER*fHeight*0.13f), PWLPT_BEZIERTO),
2215e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f + PWL_BEZIER*fWidth*0.13f, crBBox.bottom + fHeight*0.77f), PWLPT_BEZIERTO),
2216e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f, crBBox.bottom + fHeight*0.77f), PWLPT_BEZIERTO),
2217e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f - PWL_BEZIER*fWidth*0.13f, crBBox.bottom + fHeight*0.77f), PWLPT_BEZIERTO),
2218e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.37f, crBBox.top - fHeight*0.36f + PWL_BEZIER*fHeight*0.13f), PWLPT_BEZIERTO),
2219e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.37f, crBBox.top - fHeight*0.36f), PWLPT_BEZIERTO),
2220e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.37f, crBBox.top - fHeight*0.36f - fWidth*0.1f*0.6f), PWLPT_BEZIERTO),
2221e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.27f, crBBox.top - fHeight*0.36f - fWidth*0.1f*0.6f), PWLPT_BEZIERTO),
2222e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.27f, crBBox.top - fHeight*0.36f), PWLPT_BEZIERTO),
2223e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.56f, crBBox.bottom + fHeight*0.13f), PWLPT_MOVETO),
2224e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.56f, crBBox.bottom + fHeight*0.13f + PWL_BEZIER*fHeight*0.055f), PWLPT_BEZIERTO),
2225e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.505f - PWL_BEZIER*fWidth*0.095f, crBBox.bottom + fHeight*0.185f), PWLPT_BEZIERTO),
2226e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.505f, crBBox.bottom + fHeight*0.185f), PWLPT_BEZIERTO),
2227e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.505f + PWL_BEZIER*fWidth*0.065f, crBBox.bottom + fHeight*0.185f), PWLPT_BEZIERTO),
2228e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.44f, crBBox.bottom + fHeight*0.13f + PWL_BEZIER*fHeight*0.055f), PWLPT_BEZIERTO),
2229e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.44f, crBBox.bottom + fHeight*0.13f), PWLPT_BEZIERTO),
2230e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.44f, crBBox.bottom + fHeight*0.13f - PWL_BEZIER*fHeight*0.055f), PWLPT_BEZIERTO),
2231e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.505f + PWL_BEZIER*fWidth*0.065f, crBBox.bottom + fHeight*0.075f), PWLPT_BEZIERTO),
2232e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.505f, crBBox.bottom + fHeight*0.075f), PWLPT_BEZIERTO),
2233e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.505f - PWL_BEZIER*fWidth*0.065f, crBBox.bottom + fHeight*0.075f), PWLPT_BEZIERTO),
2234e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.56f, crBBox.bottom + fHeight*0.13f - PWL_BEZIER*fHeight*0.055f), PWLPT_BEZIERTO),
2235e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.56f, crBBox.bottom + fHeight*0.13f), PWLPT_BEZIERTO)
2236e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	};
2237e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2238e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if(type == PWLPT_STREAM)
2239e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sPathData = GetAppStreamFromArray(PathArray, 59);
2240e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	else
2241e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetPathDataFromArray(path, PathArray, 59);
2242e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
2243e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2244e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPWL_Utils::GetGraphics_InsertText(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
2245e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
2246e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fWidth = crBBox.right - crBBox.left;
2247e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
2248e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2249e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPWL_PathData PathArray[] =
2250e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
2251e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/10, crBBox.bottom + fHeight/10), PWLPT_MOVETO),
2252e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2, crBBox.top - fHeight*2/15), PWLPT_LINETO),
2253e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth/10, crBBox.bottom + fHeight/10), PWLPT_LINETO),
2254e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/10, crBBox.bottom + fHeight/10), PWLPT_LINETO)
2255e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	};
2256e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2257e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if(type == PWLPT_STREAM)
2258e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sPathData = GetAppStreamFromArray(PathArray, 4);
2259e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	else
2260e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetPathDataFromArray(path, PathArray, 4);
2261e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
2262e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2263e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPWL_Utils::GetGraphics_Key(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
2264e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
2265e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fWidth = crBBox.right - crBBox.left;
2266e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
2267e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT k = -fHeight/fWidth;
2268e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPWL_Point tail;
2269e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPWL_Point CicleCenter;
2270e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	tail.x = crBBox.left + fWidth*0.9f;
2271e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	tail.y = k*(tail.x - crBBox.right) + crBBox.bottom;
2272e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CicleCenter.x = crBBox.left + fWidth*0.15f;
2273e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CicleCenter.y = k*(CicleCenter.x - crBBox.right) + crBBox.bottom;
2274e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2275e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPWL_PathData PathArray[] =
2276e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
2277e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(tail.x + fWidth/30.0f, -fWidth/30.0f/k + tail.y), PWLPT_MOVETO),
2278e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(tail.x + fWidth/30.0f - fWidth*0.18f, -k*fWidth*0.18f - fWidth/30/k + tail.y), PWLPT_LINETO),
2279e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(tail.x + fWidth/30 - fWidth*0.18f + fWidth*0.07f,
2280e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		              -fWidth*0.07f/k - k*fWidth*0.18f - fWidth/30/k + tail.y), PWLPT_LINETO),
2281e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(tail.x + fWidth/30 - fWidth*0.18f - fWidth/20 + fWidth*0.07f,
2282e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		              -fWidth*0.07f/k - k*fWidth/20 - k*fWidth*0.18f - fWidth/30/k + tail.y), PWLPT_LINETO),
2283e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(tail.x + fWidth/30 - fWidth*0.18f - fWidth/20,
2284e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		              -k*fWidth/20 - k*fWidth*0.18f - fWidth/30/k + tail.y), PWLPT_LINETO),
2285e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(tail.x + fWidth/30 - fWidth*0.18f - fWidth/20 - fWidth/15,
2286e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		              -k*fWidth/15 - k*fWidth/20 - k*fWidth*0.18f - fWidth/30/k + tail.y), PWLPT_LINETO),
2287e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(tail.x + fWidth/30 - fWidth*0.18f - fWidth/20 - fWidth/15 + fWidth*0.07f,
2288e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		              -fWidth*0.07f/k - k*fWidth/15 - k*fWidth/20 - k*fWidth*0.18f - fWidth/30/k + tail.y), PWLPT_LINETO),
2289e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(tail.x + fWidth/30 - fWidth*0.18f - fWidth/20 - fWidth/15 - fWidth/20 + fWidth*0.07f,
2290e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		              -fWidth*0.07f/k + -k*fWidth/20 + -k*fWidth/15 - k*fWidth/20 - k*fWidth*0.18f - fWidth/30/k + tail.y), PWLPT_LINETO),
2291e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(tail.x + fWidth/30 - fWidth*0.18f - fWidth/20 - fWidth/15 - fWidth/20,
2292e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		              -k*fWidth/20 + -k*fWidth/15 - k*fWidth/20 - k*fWidth*0.18f - fWidth/30/k + tail.y), PWLPT_LINETO),
2293e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(tail.x + fWidth/30 - fWidth*0.45f, -k*fWidth*0.45f - fWidth/30/k + tail.y), PWLPT_LINETO),
2294e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(tail.x + fWidth/30 - fWidth*0.45f + fWidth*0.2f,
2295e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		              -fWidth*0.4f/k - k*fWidth*0.45f - fWidth/30/k + tail.y), PWLPT_BEZIERTO),
2296e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(CicleCenter.x + fWidth*0.2f, - fWidth*0.1f/k + CicleCenter.y), PWLPT_BEZIERTO),
2297e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(CicleCenter.x, CicleCenter.y), PWLPT_BEZIERTO),
2298e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(CicleCenter.x - fWidth/60.0f, -k*fWidth/60 + CicleCenter.y), PWLPT_BEZIERTO),
2299e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(CicleCenter.x - fWidth/60, -k*fWidth/60 + CicleCenter.y), PWLPT_BEZIERTO),
2300e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(CicleCenter.x, CicleCenter.y), PWLPT_BEZIERTO),
2301e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(CicleCenter.x - fWidth*0.22f, fWidth*0.35f/k + CicleCenter.y - fHeight*0.05f), PWLPT_BEZIERTO),
2302e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		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),
2303e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(tail.x - fWidth/30.0f - fWidth*0.45f, -k*fWidth*0.45f + fWidth/30.0f/k + tail.y), PWLPT_BEZIERTO),
2304e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(tail.x - fWidth/30.0f, fWidth/30.0f/k + tail.y), PWLPT_LINETO),
2305e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(tail.x + fWidth/30, -fWidth/30/k + tail.y), PWLPT_LINETO),
2306e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 		CPWL_PathData(CPWL_Point(CicleCenter.x + fWidth*0.08f, k*fWidth*0.08f + CicleCenter.y), PWLPT_MOVETO),
2307e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 		CPWL_PathData(CPWL_Point(CicleCenter.x + fWidth*0.08f + fWidth*0.1f, -fWidth*0.1f/k + k*fWidth*0.08f + CicleCenter.y), PWLPT_BEZIERTO),
2308e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 		CPWL_PathData(CPWL_Point(CicleCenter.x + fWidth*0.22f + fWidth*0.1f, k*fWidth*0.22f + CicleCenter.y - fWidth*0.1f/k), PWLPT_BEZIERTO),
2309e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 		CPWL_PathData(CPWL_Point(CicleCenter.x + fWidth*0.22f, k*fWidth*0.22f + CicleCenter.y), PWLPT_BEZIERTO),
2310e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 		CPWL_PathData(CPWL_Point(CicleCenter.x + fWidth*0.22f - fWidth*0.1f, fWidth*0.1f/k + k*fWidth*0.22f + CicleCenter.y), PWLPT_BEZIERTO),
2311e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(CicleCenter.x + fWidth*0.08f - fWidth*0.1f, fWidth*0.1f/k + k*fWidth*0.08f + CicleCenter.y), PWLPT_BEZIERTO),
2312e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 		CPWL_PathData(CPWL_Point(CicleCenter.x + fWidth*0.08f, k*fWidth*0.08f + CicleCenter.y), PWLPT_BEZIERTO)
2313e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	};
2314e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2315e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if(type == PWLPT_STREAM)
2316e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sPathData = GetAppStreamFromArray(PathArray, 28);
2317e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	else
2318e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetPathDataFromArray(path, PathArray, 28);
2319e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
2320e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2321e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPWL_Utils::GetGraphics_NewParagraph(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
2322e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
2323e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fWidth = crBBox.right - crBBox.left;
2324e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
2325e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2326e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPWL_PathData PathArray[] =
2327e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
2328e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.top - fHeight/20.0f), PWLPT_MOVETO),
2329e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/10.0f, crBBox.top - fHeight/2.0f), PWLPT_LINETO),
2330e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth/10.0f, crBBox.top - fHeight/2.0f), PWLPT_LINETO),
2331e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.top - fHeight/20.0f), PWLPT_LINETO),
2332e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.12f, crBBox.top - fHeight*17/30.0f), PWLPT_MOVETO),
2333e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.12f, crBBox.bottom + fHeight/10.0f), PWLPT_LINETO),
2334e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.22f, crBBox.bottom + fHeight/10.0f), PWLPT_LINETO),
2335e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.22f, crBBox.top - fHeight*17/30.0f - fWidth*0.14f), PWLPT_LINETO),
2336e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.38f, crBBox.bottom + fHeight/10.0f), PWLPT_LINETO),
2337e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.48f, crBBox.bottom + fHeight/10.0f), PWLPT_LINETO),
2338e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.48f, crBBox.top - fHeight*17/30.0f), PWLPT_LINETO),
2339e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.38f, crBBox.top - fHeight*17/30.0f), PWLPT_LINETO),
2340e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.38f, crBBox.bottom + fWidth*0.24f), PWLPT_LINETO),
2341e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.22f, crBBox.top - fHeight*17/30.0f), PWLPT_LINETO),
2342e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.12f, crBBox.top - fHeight*17/30.0f), PWLPT_LINETO),
2343e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.bottom + fHeight/10.0f), PWLPT_MOVETO),
2344e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.7f, crBBox.bottom + fHeight/10.0f), PWLPT_LINETO),
2345e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.7f, crBBox.bottom + fHeight/10.0f + fHeight/7.0f), PWLPT_LINETO),
2346e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.97f, crBBox.bottom + fHeight/10.0f + fHeight/7.0f), PWLPT_BEZIERTO),
2347e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.97f, crBBox.top - fHeight*17/30.0f), PWLPT_BEZIERTO),
2348e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.7f, crBBox.top - fHeight*17/30.0f), PWLPT_BEZIERTO),
2349e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.top - fHeight*17/30.0f), PWLPT_LINETO),
2350e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.bottom + fHeight/10.0f), PWLPT_LINETO),
2351e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.7f, crBBox.bottom + fHeight/7 + fHeight*0.18f), PWLPT_MOVETO),
2352e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.85f, crBBox.bottom + fHeight/7 + fHeight*0.18f), PWLPT_BEZIERTO),
2353e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.85f, crBBox.top - fHeight*17/30.0f - fHeight*0.08f), PWLPT_BEZIERTO),
2354e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.7f, crBBox.top - fHeight*17/30.0f - fHeight*0.08f), PWLPT_BEZIERTO),
2355e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.7f, crBBox.bottom + fHeight/7 + fHeight*0.18f), PWLPT_LINETO)
2356e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	};
2357e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2358e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if(type == PWLPT_STREAM)
2359e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sPathData = GetAppStreamFromArray(PathArray, 28);
2360e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	else
2361e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetPathDataFromArray(path, PathArray, 28);
2362e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
2363e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2364e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPWL_Utils::GetGraphics_TextNote(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
2365e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
2366e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fWidth = crBBox.right - crBBox.left;
2367e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
2368e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2369e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPWL_PathData PathArray[] =
2370e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
2371e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth*3/10.0f, crBBox.bottom + fHeight/15.0f), PWLPT_MOVETO),
2372e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*7/10.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_LINETO),
2373e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth/10.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_LINETO),
2374e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth/10.0f, crBBox.top - fHeight/15.0f), PWLPT_LINETO),
2375e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/10.0f, crBBox.top - fHeight/15.0f), PWLPT_LINETO),
2376e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/10.0f, crBBox.bottom + fHeight/15.0f), PWLPT_LINETO),
2377e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth*3/10.0f, crBBox.bottom + fHeight/15.0f), PWLPT_LINETO),
2378e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth/10.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_LINETO),
2379e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth*3/10.0f, crBBox.bottom + fHeight/15.0f), PWLPT_LINETO),
2380e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth*3/10.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_LINETO),
2381e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth/10.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_LINETO),
2382e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/5.0f, crBBox.top - fHeight*4/15.0f), PWLPT_MOVETO),
2383e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth/5.0f, crBBox.top - fHeight*4/15.0f), PWLPT_LINETO),
2384e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/5.0f, crBBox.top - fHeight*7/15.0f), PWLPT_MOVETO),
2385e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth/5.0f, crBBox.top - fHeight*7/15.0f), PWLPT_LINETO),
2386e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/5.0f, crBBox.top - fHeight*10/15.0f), PWLPT_MOVETO),
2387e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth*3/10.0f, crBBox.top - fHeight*10/15.0f), PWLPT_LINETO)
2388e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	};
2389e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2390e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if(type == PWLPT_STREAM)
2391e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sPathData = GetAppStreamFromArray(PathArray, 17);
2392e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	else
2393e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetPathDataFromArray(path, PathArray, 17);
2394e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
2395e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2396e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPWL_Utils::GetGraphics_Paragraph(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
2397e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
2398e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fWidth = crBBox.right - crBBox.left;
2399e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
2400e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2401e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPWL_PathData PathArray[] =
2402e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
2403e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.top - fHeight/15.0f), PWLPT_MOVETO),
2404e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.7f, crBBox.top - fHeight/15.0f), PWLPT_LINETO),
2405e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.7f, crBBox.bottom + fHeight/15.0f), PWLPT_LINETO),
2406e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.634f, crBBox.bottom + fHeight/15.0f), PWLPT_LINETO),
2407e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.634f, crBBox.top - fHeight*2/15.0f), PWLPT_LINETO),
2408e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.566f, crBBox.top - fHeight*2/15.0f), PWLPT_LINETO),
2409e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.566f, crBBox.bottom + fHeight/15.0f), PWLPT_LINETO),
2410e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.bottom + fHeight/15.0f), PWLPT_LINETO),
2411e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.top - fHeight/15.0f - fHeight*0.4f), PWLPT_LINETO),
2412e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.2f, crBBox.top - fHeight/15.0f - fHeight*0.4f), PWLPT_BEZIERTO),
2413e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.2f, crBBox.top - fHeight/15.0f), PWLPT_BEZIERTO),
2414e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.top - fHeight/15.0f), PWLPT_BEZIERTO)
2415e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	};
2416e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2417e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if(type == PWLPT_STREAM)
2418e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sPathData = GetAppStreamFromArray(PathArray, 12);
2419e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	else
2420e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetPathDataFromArray(path, PathArray, 12);
2421e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
2422e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2423e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPWL_Utils::GetGraphics_RightArrow(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
2424e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
2425e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fWidth = crBBox.right - crBBox.left;
2426e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
2427e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2428e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPWL_PathData PathArray[] =
2429e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
2430e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f, crBBox.top - fHeight/2.0f), PWLPT_MOVETO),
2431e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f + fWidth/8.0f, crBBox.bottom + fHeight/5.0f), PWLPT_LINETO),
2432e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.bottom + fHeight/5.0f), PWLPT_LINETO),
2433e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f - fWidth*0.15f, crBBox.top - fHeight/2.0f - fWidth/25.0f), PWLPT_LINETO),
2434e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.1f, crBBox.top - fHeight/2.0f - fWidth/25.0f), PWLPT_LINETO),
2435e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.1f, crBBox.top - fHeight/2.0f + fWidth/25.0f), PWLPT_LINETO),
2436e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f - fWidth*0.15f, crBBox.top - fHeight/2.0f + fWidth/25.0f), PWLPT_LINETO),
2437e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.top - fHeight/5.0f), PWLPT_LINETO),
2438e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f + fWidth/8.0f, crBBox.top - fHeight/5.0f), PWLPT_LINETO),
2439e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f, crBBox.top - fHeight/2.0f), PWLPT_LINETO)
2440e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	};
2441e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2442e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if(type == PWLPT_STREAM)
2443e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sPathData = GetAppStreamFromArray(PathArray, 10);
2444e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	else
2445e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetPathDataFromArray(path, PathArray, 10);
2446e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
2447e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2448e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPWL_Utils::GetGraphics_RightPointer(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
2449e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
2450e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fWidth = crBBox.right - crBBox.left;
2451e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
2452e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2453e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPWL_PathData PathArray[] =
2454e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
2455e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth/30.0f, crBBox.top - fHeight/2.0f), PWLPT_MOVETO),
2456e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/30.0f, crBBox.bottom + fHeight/6.0f), PWLPT_LINETO),
2457e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*4/15.0f, crBBox.top - fHeight/2.0f), PWLPT_LINETO),
2458e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/30.0f, crBBox.top - fHeight/6.0f), PWLPT_LINETO),
2459e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth/30.0f, crBBox.top - fHeight/2.0f), PWLPT_LINETO)
2460e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	};
2461e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2462e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if(type == PWLPT_STREAM)
2463e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sPathData = GetAppStreamFromArray(PathArray, 5);
2464e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	else
2465e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetPathDataFromArray(path, PathArray, 5);
2466e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
2467e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2468e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPWL_Utils::GetGraphics_Star(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
2469e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
2470e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fLongRadius = (crBBox.top - crBBox.bottom)/(1+(FX_FLOAT)cos(PWL_PI/5.0f));
2471e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	fLongRadius = fLongRadius * 0.7f;
2472e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fShortRadius = fLongRadius * 0.55f;
2473e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPDF_Point ptCenter = CPDF_Point((crBBox.left + crBBox.right) / 2.0f,(crBBox.top + crBBox.bottom) / 2.0f);
2474e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2475e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT px1[5], py1[5];
2476e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT px2[5], py2[5];
2477e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2478e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fAngel = PWL_PI/10.0f;
2479e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2480e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	for (FX_INT32 i=0; i<5; i++)
2481e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
2482e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		px1[i] = ptCenter.x + fLongRadius * (FX_FLOAT)cos(fAngel);
2483e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		py1[i] = ptCenter.y + fLongRadius * (FX_FLOAT)sin(fAngel);
2484e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2485e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		fAngel += PWL_PI * 2 / 5.0f;
2486e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	}
2487e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2488e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	fAngel = PWL_PI/5.0f + PWL_PI/10.0f;
2489e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2490e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	for (FX_INT32 j=0; j<5; j++)
2491e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
2492e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		px2[j] = ptCenter.x + fShortRadius * (FX_FLOAT)cos(fAngel);
2493e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		py2[j] = ptCenter.y + fShortRadius * (FX_FLOAT)sin(fAngel);
2494e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2495e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		fAngel += PWL_PI * 2 / 5.0f;
2496e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	}
2497e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2498e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPWL_PathData PathArray[11];
2499e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	PathArray[0] = CPWL_PathData(CPWL_Point(px1[0], py1[0]), PWLPT_MOVETO);
2500e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	PathArray[1] = CPWL_PathData(CPWL_Point(px2[0], py2[0]), PWLPT_LINETO);
2501e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2502e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	for(FX_INT32 k = 0; k < 4; k++)
2503e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
2504e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		PathArray[(k+1)*2] = CPWL_PathData(CPWL_Point(px1[k+1], py1[k+1]), PWLPT_LINETO);
2505e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		PathArray[(k+1)*2 + 1] = CPWL_PathData(CPWL_Point(px2[k+1], py2[k+1]), PWLPT_LINETO);
2506e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	}
2507e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2508e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	PathArray[10] = CPWL_PathData(CPWL_Point(px1[0], py1[0]), PWLPT_LINETO);
2509e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2510e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if(type == PWLPT_STREAM)
2511e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sPathData = GetAppStreamFromArray(PathArray, 11);
2512e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	else
2513e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetPathDataFromArray(path, PathArray, 11);
2514e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
2515e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2516e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPWL_Utils::GetGraphics_UpArrow(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
2517e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
2518e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fWidth = crBBox.right - crBBox.left;
2519e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
2520e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2521e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPWL_PathData PathArray[] =
2522e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
2523e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.top - fHeight/15.0f), PWLPT_MOVETO),
2524e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth/10.0f, crBBox.top - fWidth*3/5.0f), PWLPT_LINETO),
2525e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.top - fWidth*3/5.0f), PWLPT_LINETO),
2526e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.bottom + fHeight/15.0f), PWLPT_LINETO),
2527e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.bottom + fHeight/15.0f), PWLPT_LINETO),
2528e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fWidth*3/5.0f), PWLPT_LINETO),
2529e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/10, crBBox.top - fWidth*3/5.0f), PWLPT_LINETO),
2530e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.top - fHeight/15.0f), PWLPT_LINETO)
2531e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	};
2532e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2533e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if(type == PWLPT_STREAM)
2534e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sPathData = GetAppStreamFromArray(PathArray, 8);
2535e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	else
2536e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetPathDataFromArray(path, PathArray, 8);
2537e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
2538e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2539e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPWL_Utils::GetGraphics_UpLeftArrow(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
2540e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
2541e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fWidth = crBBox.right - crBBox.left;
2542e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
2543e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPWL_Point leftup(crBBox.left, crBBox.top);
2544e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPWL_Point rightdown(crBBox.right, crBBox.bottom);
2545e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT k = -fHeight/fWidth;
2546e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPWL_Point tail;
2547e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	tail.x = crBBox.left + fWidth*4/5.0f;
2548e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	tail.y = k*(tail.x - crBBox.right) + rightdown.y;
2549e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2550e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPWL_PathData PathArray[] =
2551e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
2552e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/20.0f, k*(crBBox.left + fWidth/20.0f - rightdown.x) + rightdown.y), PWLPT_MOVETO),
2553e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(fHeight*17/60.0f/k + tail.x + fWidth/10.0f + fWidth/5.0f,
2554e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		              -fWidth/5.0f/k + tail.y - fWidth/10.0f/k + fHeight*17/60.0f), PWLPT_LINETO),
2555e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(fHeight*17/60.0f/k + tail.x + fWidth/10.0f,
2556e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		              tail.y - fWidth/10.0f/k + fHeight*17/60.0f), PWLPT_LINETO),
2557e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(tail.x + fWidth/10.0f, tail.y - fWidth/10.0f/k), PWLPT_LINETO),
2558e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(tail.x - fWidth/10.0f, tail.y + fWidth/10.0f/k), PWLPT_LINETO),
2559e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		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),
2560e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(fHeight*17/60.0f/k + tail.x - fWidth/10.0f - fWidth/5.0f,
2561e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		              fWidth/5.0f/k + tail.y + fWidth/10.0f/k + fHeight*17/60.0f), PWLPT_LINETO),
2562e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/20.0f, k*(crBBox.left + fWidth/20.0f - rightdown.x) + rightdown.y), PWLPT_LINETO)
2563e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	};
2564e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2565e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if(type == PWLPT_STREAM)
2566e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sPathData = GetAppStreamFromArray(PathArray, 8);
2567e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	else
2568e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetPathDataFromArray(path, PathArray, 8);
2569e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
2570e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2571e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPWL_Utils::GetGraphics_Graph(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
2572e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
2573e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fWidth = crBBox.right - crBBox.left;
2574e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
2575e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2576e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPWL_PathData PathArray[] =
2577e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
2578e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.05f, crBBox.top - fWidth*0.15f), PWLPT_MOVETO),
2579e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.25f, crBBox.top - fHeight*0.15f), PWLPT_LINETO),
2580e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.275f, crBBox.bottom + fHeight*0.08f), PWLPT_LINETO),
2581e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.05f, crBBox.bottom + fHeight*0.08f), PWLPT_LINETO),
2582e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.05f, crBBox.top - fWidth*0.15f), PWLPT_LINETO),
2583e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2584e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.275f, crBBox.top - fWidth*0.45f), PWLPT_MOVETO),
2585e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.475f, crBBox.top - fWidth*0.45f), PWLPT_LINETO),
2586e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.475f, crBBox.bottom + fHeight*0.08f), PWLPT_LINETO),
2587e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.275f, crBBox.bottom + fHeight*0.08f), PWLPT_LINETO),
2588e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.275f, crBBox.top - fWidth*0.45f), PWLPT_LINETO),
2589e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2590e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f, crBBox.top - fHeight*0.05f), PWLPT_MOVETO),
2591e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.7f, crBBox.top - fHeight*0.05f), PWLPT_LINETO),
2592e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.7f, crBBox.bottom + fHeight*0.08f), PWLPT_LINETO),
2593e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f, crBBox.bottom + fHeight*0.08f), PWLPT_LINETO),
2594e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f, crBBox.top - fHeight*0.05f), PWLPT_LINETO),
2595e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2596e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.725f, crBBox.top - fWidth*0.35f), PWLPT_MOVETO),
2597e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.925f, crBBox.top - fWidth*0.35f), PWLPT_LINETO),
2598e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.925f, crBBox.bottom + fHeight*0.08f), PWLPT_LINETO),
2599e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.725f, crBBox.bottom + fHeight*0.08f), PWLPT_LINETO),
2600e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.725f, crBBox.top - fWidth*0.35f), PWLPT_LINETO)
2601e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	};
2602e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2603e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if(type == PWLPT_STREAM)
2604e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sPathData = GetAppStreamFromArray(PathArray, 20);
2605e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	else
2606e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetPathDataFromArray(path, PathArray, 20);
2607e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
2608e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2609e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPWL_Utils::GetGraphics_Paperclip(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
2610e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
2611e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fWidth = crBBox.right - crBBox.left;
2612e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
2613e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2614e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPWL_PathData PathArray[] =
2615e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
2616e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/60, crBBox.top - fHeight*0.25f), PWLPT_MOVETO),
2617e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/60, crBBox.bottom + fHeight*0.25f), PWLPT_LINETO),
2618e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/60, crBBox.bottom + fHeight*0.25f - fWidth*57/60.0f*0.35f), PWLPT_BEZIERTO),
2619e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth/30, crBBox.bottom + fHeight*0.25f - fWidth*57/60.0f*0.35f), PWLPT_BEZIERTO),
2620e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth/30, crBBox.bottom + fHeight*0.25f), PWLPT_BEZIERTO),
2621e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2622e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth/30, crBBox.top - fHeight*0.33f), PWLPT_LINETO),
2623e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth/30, crBBox.top - fHeight*0.33f + fHeight/15*0.5f), PWLPT_BEZIERTO),
2624e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth/30 - fWidth*0.12f, crBBox.top - fHeight*0.33f + fHeight/15*0.5f), PWLPT_BEZIERTO),
2625e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth/30 - fWidth*0.12f, crBBox.top - fHeight*0.33f), PWLPT_BEZIERTO),
2626e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2627e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth/30 - fWidth*0.12f, crBBox.bottom + fHeight*0.2f), PWLPT_LINETO),
2628e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		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),
2629e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		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),
2630e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/60 + fWidth*0.12f, crBBox.bottom + fHeight*0.2f), PWLPT_BEZIERTO),
2631e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2632e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/60 + fWidth*0.12f, crBBox.top - fHeight*0.2f), PWLPT_LINETO),
2633e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		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),
2634e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		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),
2635e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15 - fWidth*0.24f, crBBox.top - fHeight*0.2f), PWLPT_BEZIERTO),
2636e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2637e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15 - fWidth*0.24f, crBBox.bottom + fHeight*0.25f), PWLPT_LINETO),
2638e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		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),
2639e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		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),
2640e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.29f, crBBox.bottom + fHeight*0.25f), PWLPT_BEZIERTO),
2641e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2642e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.29f, crBBox.top - fHeight*0.33f), PWLPT_LINETO),
2643e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.29f, crBBox.top - fHeight*0.33f + fWidth*0.12f*0.35f), PWLPT_BEZIERTO),
2644e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.17f, crBBox.top - fHeight*0.33f + fWidth*0.12f*0.35f), PWLPT_BEZIERTO),
2645e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.17f, crBBox.top - fHeight*0.33f), PWLPT_BEZIERTO),
2646e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2647e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.17f, crBBox.bottom + fHeight*0.3f), PWLPT_LINETO),
2648e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.17f, crBBox.bottom + fHeight*0.3f - fWidth*(14/15.0f - 0.29f)*0.35f), PWLPT_BEZIERTO),
2649e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		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),
2650e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15 - fWidth*0.12f, crBBox.bottom + fHeight*0.3f), PWLPT_BEZIERTO),
2651e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2652e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15 - fWidth*0.12f, crBBox.top - fHeight*0.25f), PWLPT_LINETO),
2653e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		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),
2654e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/60, crBBox.top - fHeight*0.25f + fWidth*0.35f*(11/12.0f - 0.12f)), PWLPT_BEZIERTO),
2655e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth/60, crBBox.top - fHeight*0.25f), PWLPT_BEZIERTO)
2656e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	};
2657e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2658e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if(type == PWLPT_STREAM)
2659e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sPathData = GetAppStreamFromArray(PathArray, 33);
2660e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	else
2661e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetPathDataFromArray(path, PathArray, 33);
2662e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
2663e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2664e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPWL_Utils::GetGraphics_Attachment(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
2665e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
2666e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fWidth = crBBox.right - crBBox.left;
2667e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
2668e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2669e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPWL_PathData PathArray[] =
2670e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
2671e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.25f, crBBox.top - fHeight*0.1f), PWLPT_MOVETO),
2672e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.23f), PWLPT_LINETO),
2673e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.5f), PWLPT_LINETO),
2674e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.5f + fWidth*0.04f), PWLPT_BEZIERTO),
2675e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.top - fHeight*0.5f + fWidth*0.04f), PWLPT_BEZIERTO),
2676e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.top - fHeight*0.5f), PWLPT_BEZIERTO),
2677e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2678e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.top - fHeight*0.23f), PWLPT_LINETO),
2679e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.25f, crBBox.top - fHeight*0.1f), PWLPT_LINETO),
2680e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.25f, crBBox.top - fHeight*0.1f), PWLPT_LINETO),
2681e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.23f), PWLPT_LINETO),
2682e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.top - fHeight*0.23f), PWLPT_LINETO),
2683e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2684e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.5f), PWLPT_MOVETO),
2685e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f - fWidth*0.25f*0.4f, crBBox.top - fHeight*0.5f), PWLPT_BEZIERTO),
2686e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.15f, crBBox.top - fHeight*0.65f + fHeight*0.15f*0.4f), PWLPT_BEZIERTO),
2687e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.15f, crBBox.top - fHeight*0.65f), PWLPT_BEZIERTO),
2688e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2689e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.15f, crBBox.top - fHeight*0.65f), PWLPT_LINETO),
2690e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.15f, crBBox.top - fHeight*0.65f + fHeight*0.15f*0.4f), PWLPT_BEZIERTO),
2691e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f + fWidth*0.25f*0.4f, crBBox.top - fHeight*0.5f), PWLPT_BEZIERTO),
2692e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.top - fHeight*0.5f), PWLPT_BEZIERTO),
2693e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2694e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.top - fHeight*0.5f + fWidth*0.04f), PWLPT_BEZIERTO),
2695e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.5f + fWidth*0.04f), PWLPT_BEZIERTO),
2696e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.5f), PWLPT_BEZIERTO),
2697e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2698e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f, crBBox.top - fHeight*0.65f), PWLPT_MOVETO),
2699e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f, crBBox.bottom + fHeight*0.1f), PWLPT_LINETO)
2700e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	};
2701e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2702e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if(type == PWLPT_STREAM)
2703e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sPathData = GetAppStreamFromArray(PathArray, 24);
2704e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	else
2705e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetPathDataFromArray(path, PathArray, 24);
2706e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
2707e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2708e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPWL_Utils::GetGraphics_Tag(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
2709e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
2710e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fWidth = crBBox.right - crBBox.left;
2711e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
2712e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2713e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPWL_PathData PathArray[] =
2714e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
2715e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.1f), PWLPT_MOVETO),
2716e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.1f, crBBox.top - fHeight*0.5f), PWLPT_LINETO),
2717e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.3f, crBBox.bottom + fHeight*0.1f), PWLPT_LINETO),
2718e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.1f, crBBox.bottom + fHeight*0.1f), PWLPT_LINETO),
2719e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.1f, crBBox.top - fHeight*0.1f), PWLPT_LINETO),
2720e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.1f), PWLPT_LINETO),
2721e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.3f), PWLPT_MOVETO),
2722e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.2f, crBBox.top - fHeight*0.3f), PWLPT_LINETO),
2723e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.5f), PWLPT_MOVETO),
2724e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.2f, crBBox.top - fHeight*0.5f), PWLPT_LINETO),
2725e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.7f), PWLPT_MOVETO),
2726e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.2f, crBBox.top - fHeight*0.7f), PWLPT_LINETO)
2727e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	};
2728e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2729e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if(type == PWLPT_STREAM)
2730e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sPathData = GetAppStreamFromArray(PathArray, 12);
2731e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	else
2732e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetPathDataFromArray(path, PathArray, 12);
2733e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
2734e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2735e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPWL_Utils::GetGraphics_Foxit(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
2736e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
2737e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fOutWidth = crBBox.right - crBBox.left;
2738e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fOutHeight = crBBox.top - crBBox.bottom;
2739e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2740e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPDF_Rect crInBox = crBBox;
2741e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	crInBox.left = crBBox.left + fOutWidth*0.08f;
2742e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	crInBox.right = crBBox.right - fOutWidth*0.08f;
2743e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	crInBox.top = crBBox.top - fOutHeight*0.08f;
2744e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	crInBox.bottom = crBBox.bottom + fOutHeight*0.08f;
2745e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2746e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fWidth = crInBox.right - crInBox.left;
2747e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fHeight = crInBox.top - crInBox.bottom;
2748e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2749e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPWL_PathData PathArray[] =
2750e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
2751e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crInBox.left, crInBox.top), PWLPT_MOVETO),
2752e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.45f, crInBox.top), PWLPT_LINETO),
2753e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.45f, crInBox.top - PWL_BEZIER * fHeight * 0.4f), PWLPT_BEZIERTO),
2754e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.45f  - PWL_BEZIER * fWidth * 0.45f, crInBox.top - fHeight*0.4f), PWLPT_BEZIERTO),
2755e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crInBox.left, crInBox.top - fHeight*0.4f), PWLPT_BEZIERTO),
2756e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crInBox.left, crInBox.top), PWLPT_LINETO),
2757e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2758e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.60f, crInBox.top), PWLPT_MOVETO),
2759e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.75f, crInBox.top), PWLPT_LINETO),
2760e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.75f, crInBox.top - PWL_BEZIER * fHeight * 0.7f), PWLPT_BEZIERTO),
2761e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.75f  - PWL_BEZIER * fWidth * 0.75f, crInBox.top - fHeight*0.7f), PWLPT_BEZIERTO),
2762e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crInBox.left, crInBox.top - fHeight*0.7f), PWLPT_BEZIERTO),
2763e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crInBox.left, crInBox.top - fHeight*0.55f), PWLPT_LINETO),
2764e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crInBox.left + PWL_BEZIER * fWidth*0.60f, crInBox.top - fHeight*0.55f), PWLPT_BEZIERTO),
2765e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crInBox.left + fWidth * 0.60f, crInBox.top - PWL_BEZIER * fHeight * 0.55f), PWLPT_BEZIERTO),
2766e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crInBox.left + fWidth * 0.60f, crInBox.top), PWLPT_BEZIERTO),
2767e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2768e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.90f, crInBox.top), PWLPT_MOVETO),
2769e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.90f, crInBox.top - PWL_BEZIER * fHeight * 0.85f), PWLPT_BEZIERTO),
2770e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.90f  - PWL_BEZIER * fWidth * 0.90f, crInBox.top - fHeight*0.85f), PWLPT_BEZIERTO),
2771e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crInBox.left, crInBox.top - fHeight*0.85f), PWLPT_BEZIERTO),
2772e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crInBox.left, crInBox.bottom), PWLPT_LINETO),
2773e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crInBox.right, crInBox.bottom), PWLPT_LINETO),
2774e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crInBox.right, crInBox.top), PWLPT_LINETO),
2775e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.90f, crInBox.top), PWLPT_LINETO),
2776e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2777e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		/*
2778e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left, crBBox.top), PWLPT_MOVETO),
2779e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right, crBBox.top), PWLPT_LINETO),
2780e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right, crBBox.bottom), PWLPT_LINETO),
2781e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left, crBBox.bottom), PWLPT_LINETO),
2782e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left, crBBox.top), PWLPT_LINETO),
2783e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2784e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left+fOutWidth*0.04f, crBBox.top-fOutHeight*0.04f), PWLPT_MOVETO),
2785e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right-fOutWidth*0.04f, crBBox.top-fOutHeight*0.04f), PWLPT_LINETO),
2786e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.right-fOutWidth*0.04f, crBBox.bottom+fOutHeight*0.04f), PWLPT_LINETO),
2787e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left+fOutWidth*0.04f, crBBox.bottom+fOutHeight*0.04f), PWLPT_LINETO),
2788e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPWL_PathData(CPWL_Point(crBBox.left+fOutWidth*0.04f, crBBox.top-fOutHeight*0.04f), PWLPT_LINETO),
2789e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		*/
2790e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	};
2791e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2792e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if(type == PWLPT_STREAM)
2793e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		sPathData = GetAppStreamFromArray(PathArray, 23);
2794e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	else
2795e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		GetPathDataFromArray(path, PathArray, 23);
2796e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
2797e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2798e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPWL_Color::ConvertColorType(FX_INT32 nColorType)
2799e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
2800e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	switch (this->nColorType)
2801e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
2802e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case COLORTYPE_TRANSPARENT:
2803e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
2804e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case COLORTYPE_GRAY:
2805e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		switch (nColorType)
2806e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		{
2807e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		case COLORTYPE_RGB:
2808e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			CPWL_Utils::ConvertGRAY2RGB(this->fColor1, this->fColor1, this->fColor2, this->fColor3);
2809e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			break;
2810e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		case COLORTYPE_CMYK:
2811e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			CPWL_Utils::ConvertGRAY2CMYK(this->fColor1, this->fColor1, this->fColor2, this->fColor3, this->fColor4);
2812e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			break;
2813e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		}
2814e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
2815e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case COLORTYPE_RGB:
2816e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		switch (nColorType)
2817e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		{
2818e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		case COLORTYPE_GRAY:
2819e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			CPWL_Utils::ConvertRGB2GRAY(this->fColor1, this->fColor2, this->fColor3, this->fColor1);
2820e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			break;
2821e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		case COLORTYPE_CMYK:
2822e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			CPWL_Utils::ConvertRGB2CMYK(this->fColor1, this->fColor2, this->fColor3, this->fColor1, this->fColor2, this->fColor3, this->fColor4);
2823e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			break;
2824e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		}
2825e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
2826e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	case COLORTYPE_CMYK:
2827e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		switch (nColorType)
2828e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		{
2829e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		case COLORTYPE_GRAY:
2830e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			CPWL_Utils::ConvertCMYK2GRAY(this->fColor1, this->fColor2, this->fColor3, this->fColor4, this->fColor1);
2831e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			break;
2832e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		case COLORTYPE_RGB:
2833e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			CPWL_Utils::ConvertCMYK2RGB(this->fColor1, this->fColor2, this->fColor3, this->fColor4, this->fColor1, this->fColor2, this->fColor3);
2834e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			break;
2835e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		}
2836e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		break;
2837e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	}
2838e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	this->nColorType = nColorType;
2839e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
2840e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2841e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2842