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/fxedit/fxet_stub.h"
8e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "../../include/fxedit/fx_edit.h"
9e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "../../include/fxedit/fxet_edit.h"
10e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
11e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define FX_EDIT_UNDERLINEHALFWIDTH				0.5f
12e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define FX_EDIT_CROSSOUTHALFWIDTH				0.5f
13e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
14e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovextern CFX_ByteString GetPDFWordString(IFX_Edit_FontMap * pFontMap, FX_INT32 nFontIndex, FX_WORD Word, FX_WORD SubWord);
15e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
16e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPDF_Rect GetUnderLineRect(const CPVT_Word& word)
17e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
18e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	return CPDF_Rect(word.ptWord.x, word.ptWord.y + word.fDescent * 0.5f,
19e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						word.ptWord.x + word.fWidth, word.ptWord.y + word.fDescent * 0.25f);
20e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
21e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
22e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPDF_Rect GetCrossoutRect(const CPVT_Word& word)
23e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
24e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	return CPDF_Rect(word.ptWord.x, word.ptWord.y + (word.fAscent + word.fDescent) * 0.5f + word.fDescent * 0.25f,
25e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							word.ptWord.x + word.fWidth, word.ptWord.y + (word.fAscent + word.fDescent) * 0.5f);
26e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
27e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
28e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstatic void DrawTextString(CFX_RenderDevice* pDevice, const CPDF_Point& pt, CPDF_Font* pFont, FX_FLOAT fFontSize, CPDF_Matrix* pUser2Device,
29e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					  const CFX_ByteString& str, FX_ARGB crTextFill, FX_ARGB crTextStroke, FX_INT32 nHorzScale)
30e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
31e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT x = pt.x, y = pt.y;
32e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	pUser2Device->Transform(x, y);
33e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
34e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if (pFont)
35e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
36e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		if (nHorzScale != 100)
37e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		{
38e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			CPDF_Matrix mt(nHorzScale/100.0f,0,0,1,0,0);
39e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			mt.Concat(*pUser2Device);
40e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
41e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			CPDF_RenderOptions ro;
42e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			ro.m_Flags = RENDER_CLEARTYPE;
43e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			ro.m_ColorMode = RENDER_COLOR_NORMAL;
44e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
45e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			if (crTextStroke != 0)
46e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			{
47e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				CPDF_Point pt1(0,0), pt2(1,0);
48e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				pUser2Device->Transform(pt1.x, pt1.y);
49e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				pUser2Device->Transform(pt2.x, pt2.y);
50e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				CFX_GraphStateData gsd;
51e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				gsd.m_LineWidth = (FX_FLOAT)FXSYS_fabs((pt2.x + pt2.y) - (pt1.x + pt1.y));
52e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
53e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				CPDF_TextRenderer::DrawTextString(pDevice,x, y, pFont, fFontSize, &mt, str, crTextFill, crTextStroke, &gsd, &ro);
54e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			}
55e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			else
56e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				CPDF_TextRenderer::DrawTextString(pDevice,x, y, pFont, fFontSize, &mt, str, crTextFill, 0, NULL, &ro);
57e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		}
58e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		else
59e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		{
60e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			CPDF_RenderOptions ro;
61e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			ro.m_Flags = RENDER_CLEARTYPE;
62e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			ro.m_ColorMode = RENDER_COLOR_NORMAL;
63e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
64e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			if (crTextStroke != 0)
65e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			{
66e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				CPDF_Point pt1(0,0), pt2(1,0);
67e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				pUser2Device->Transform(pt1.x, pt1.y);
68e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				pUser2Device->Transform(pt2.x, pt2.y);
69e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				CFX_GraphStateData gsd;
70e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				gsd.m_LineWidth = (FX_FLOAT)FXSYS_fabs((pt2.x + pt2.y) - (pt1.x + pt1.y));
71e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
72e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				CPDF_TextRenderer::DrawTextString(pDevice,x, y, pFont, fFontSize, pUser2Device, str, crTextFill, crTextStroke, &gsd, &ro);
73e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			}
74e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			else
75e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				CPDF_TextRenderer::DrawTextString(pDevice,x, y, pFont, fFontSize, pUser2Device, str, crTextFill, 0, NULL, &ro);
76e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		}
77e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	}
78e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
79e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
80e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid IFX_Edit::DrawUnderline(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, IFX_Edit* pEdit, FX_COLORREF color,
81e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov								const CPDF_Rect& rcClip, const CPDF_Point& ptOffset, const CPVT_WordRange* pRange)
82e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
83e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	pDevice->SaveState();
84e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
85e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if (!rcClip.IsEmpty())
86e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
87e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPDF_Rect rcTemp = rcClip;
88e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		pUser2Device->TransformRect(rcTemp);
89e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		FX_RECT rcDevClip;
90e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		rcDevClip.left = (FX_INT32)rcTemp.left;
91e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		rcDevClip.right = (FX_INT32)rcTemp.right;
92e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		rcDevClip.top = (FX_INT32)rcTemp.top;
93e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		rcDevClip.bottom = (FX_INT32)rcTemp.bottom;
94e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		pDevice->SetClip_Rect(&rcDevClip);
95e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	}
96e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
97e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator())
98e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
99e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		if (pEdit->GetFontMap())
100e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		{
101e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			if (pRange)
102e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				pIterator->SetAt(pRange->BeginPos);
103e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			else
104e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				pIterator->SetAt(0);
105e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
106e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			while (pIterator->NextWord())
107e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			{
108e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				CPVT_WordPlace place = pIterator->GetAt();
109e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				if (pRange && place.WordCmp(pRange->EndPos) > 0) break;
110e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
111e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				CPVT_Word word;
112e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				if (pIterator->GetWord(word))
113e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				{
114e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					CFX_PathData pathUnderline;
115e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					CPDF_Rect rcUnderline = GetUnderLineRect(word);
116e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					rcUnderline.left += ptOffset.x;
117e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					rcUnderline.right += ptOffset.x;
118e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					rcUnderline.top += ptOffset.y;
119e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					rcUnderline.bottom += ptOffset.y;
120e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					pathUnderline.AppendRect(rcUnderline.left, rcUnderline.bottom, rcUnderline.right, rcUnderline.top);
121e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
122e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					pDevice->DrawPath(&pathUnderline, pUser2Device, NULL, color, 0, FXFILL_WINDING);
123e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				}
124e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			}
125e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		}
126e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	}
127e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
128e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	pDevice->RestoreState();
129e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
130e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
131e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid IFX_Edit::DrawEdit(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, IFX_Edit* pEdit, FX_COLORREF crTextFill, FX_COLORREF crTextStroke,
132e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						const CPDF_Rect& rcClip, const CPDF_Point& ptOffset, const CPVT_WordRange* pRange, IFX_SystemHandler* pSystemHandler, void* pFFLData)
133e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
134e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
135e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_BOOL bContinuous = pEdit->GetCharArray() == 0;
136e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if (pEdit->GetCharSpace() > 0.0f)
137e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		bContinuous = FALSE;
138e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
139e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_WORD SubWord = pEdit->GetPasswordChar();
140e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fFontSize = pEdit->GetFontSize();
141e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPVT_WordRange wrSelect = pEdit->GetSelectWordRange();
142e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_INT32 nHorzScale = pEdit->GetHorzScale();
143e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
144e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_COLORREF crCurFill = crTextFill;
145e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_COLORREF crOldFill = crCurFill;
146e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
147e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_BOOL bSelect = FALSE;
148e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	const FX_COLORREF crWhite = ArgbEncode(255,255,255,255);
149e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	const FX_COLORREF crSelBK = ArgbEncode(255,0,51,113);
150e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
151e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CFX_ByteTextBuf sTextBuf;
152e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_INT32 nFontIndex = -1;
153e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPDF_Point ptBT(0.0f,0.0f);
154e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
155e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	pDevice->SaveState();
156e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
157e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if (!rcClip.IsEmpty())
158e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
159e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPDF_Rect rcTemp = rcClip;
160e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		pUser2Device->TransformRect(rcTemp);
161e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		FX_RECT rcDevClip;
162e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		rcDevClip.left = (FX_INT32)rcTemp.left;
163e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		rcDevClip.right = (FX_INT32)rcTemp.right;
164e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		rcDevClip.top = (FX_INT32)rcTemp.top;
165e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		rcDevClip.bottom = (FX_INT32)rcTemp.bottom;
166e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		pDevice->SetClip_Rect(&rcDevClip);
167e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	}
168e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
169e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator())
170e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
171e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		if (IFX_Edit_FontMap* pFontMap = pEdit->GetFontMap())
172e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		{
173e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			if (pRange)
174e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				pIterator->SetAt(pRange->BeginPos);
175e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			else
176e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				pIterator->SetAt(0);
177e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
178e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			CPVT_WordPlace oldplace;
179e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
180e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			while (pIterator->NextWord())
181e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			{
182e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				CPVT_WordPlace place = pIterator->GetAt();
183e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				if (pRange && place.WordCmp(pRange->EndPos) > 0) break;
184e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
185e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				if (wrSelect.IsExist())
186e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				{
187e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					bSelect = place.WordCmp(wrSelect.BeginPos) > 0 && place.WordCmp(wrSelect.EndPos) <= 0;
188e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					if (bSelect)
189e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					{
190e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						crCurFill = crWhite;
191e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					}
192e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					else
193e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					{
194e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						crCurFill = crTextFill;
195e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					}
196e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				}
197e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				if(pSystemHandler && pSystemHandler->IsSelectionImplemented())
198e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				{
199e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					crCurFill = crTextFill;
200e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 					crOldFill = crCurFill;
201e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				}
202e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				CPVT_Word word;
203e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				if (pIterator->GetWord(word))
204e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				{
205e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
206e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					if (bSelect)
207e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					{
208e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
209e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						CPVT_Line line;
210e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						pIterator->GetLine(line);
211e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
212e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						if(pSystemHandler && pSystemHandler->IsSelectionImplemented())
213e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						{
214e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							CPDF_Rect rc(word.ptWord.x,line.ptLine.y + line.fLineDescent,
215e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov								word.ptWord.x+word.fWidth,line.ptLine.y + line.fLineAscent);
216e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							rc.Intersect(rcClip);
217e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							//CFX_Edit* pEt = (CFX_Edit*)pEdit;
218e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							//CPDF_Rect rcEdit = pEt->VTToEdit(rc);
219e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							pSystemHandler->OutputSelectedRect(pFFLData,rc);
220e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						}
221e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						else
222e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						{
223e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 							CFX_PathData pathSelBK;
224e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 							pathSelBK.AppendRect(word.ptWord.x,line.ptLine.y + line.fLineDescent,
225e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 								word.ptWord.x+word.fWidth,line.ptLine.y + line.fLineAscent);
226e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
227e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 							pDevice->DrawPath(&pathSelBK, pUser2Device, NULL, crSelBK, 0, FXFILL_WINDING);
228e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						}
229e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					}
230e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
231e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					if (bContinuous)
232e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					{
233e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						if (place.LineCmp(oldplace) != 0 || word.nFontIndex != nFontIndex ||
234e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							crOldFill != crCurFill)
235e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						{
236e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							if (sTextBuf.GetLength() > 0)
237e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							{
238e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov								DrawTextString(pDevice, CPDF_Point(ptBT.x+ptOffset.x, ptBT.y+ptOffset.y), pFontMap->GetPDFFont(nFontIndex),
239e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov									fFontSize, pUser2Device, sTextBuf.GetByteString(), crOldFill, crTextStroke, nHorzScale);
240e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
241e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov								sTextBuf.Clear();
242e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							}
243e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							nFontIndex = word.nFontIndex;
244e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							ptBT = word.ptWord;
245e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							crOldFill = crCurFill;
246e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						}
247e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
248e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						sTextBuf << GetPDFWordString(pFontMap, word.nFontIndex, word.Word, SubWord);
249e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					}
250e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					else
251e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					{
252e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						DrawTextString(pDevice,CPDF_Point(word.ptWord.x+ptOffset.x, word.ptWord.y+ptOffset.y), pFontMap->GetPDFFont(word.nFontIndex),
253e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							fFontSize, pUser2Device, GetPDFWordString(pFontMap, word.nFontIndex, word.Word, SubWord), crCurFill, crTextStroke, nHorzScale);
254e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
255e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					}
256e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					oldplace = place;
257e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
258e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
259e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				}
260e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			}
261e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
262e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			if (sTextBuf.GetLength() > 0)
263e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			{
264e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				DrawTextString(pDevice, CPDF_Point(ptBT.x+ptOffset.x, ptBT.y+ptOffset.y), pFontMap->GetPDFFont(nFontIndex),
265e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					fFontSize, pUser2Device, sTextBuf.GetByteString(), crOldFill, crTextStroke, nHorzScale);
266e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			}
267e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		}
268e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	}
269e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
270e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	pDevice->RestoreState();
271e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
272e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
273e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid IFX_Edit::DrawRichEdit(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, IFX_Edit* pEdit,
274e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						const CPDF_Rect& rcClip, const CPDF_Point& ptOffset, const CPVT_WordRange* pRange)
275e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
276e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	//FX_FLOAT fFontSize = pEdit->GetFontSize();
277e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPVT_WordRange wrSelect = pEdit->GetSelectWordRange();
278e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
279e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_COLORREF crCurText = ArgbEncode(255, 0,0,0);
280e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_COLORREF crOld = crCurText;
281e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_BOOL bSelect = FALSE;
282e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	const FX_COLORREF crWhite = ArgbEncode(255,255,255,255);
283e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	const FX_COLORREF crSelBK = ArgbEncode(255,0,51,113);
284e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
285e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CFX_ByteTextBuf sTextBuf;
286e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPVT_WordProps wp;
287e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPDF_Point ptBT(0.0f,0.0f);
288e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
289e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	pDevice->SaveState();
290e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
291e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if (!rcClip.IsEmpty())
292e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
293e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		CPDF_Rect rcTemp = rcClip;
294e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		pUser2Device->TransformRect(rcTemp);
295e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		FX_RECT rcDevClip;
296e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		rcDevClip.left = (FX_INT32)rcTemp.left;
297e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		rcDevClip.right = (FX_INT32)rcTemp.right;
298e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		rcDevClip.top = (FX_INT32)rcTemp.top;
299e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		rcDevClip.bottom = (FX_INT32)rcTemp.bottom;
300e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		pDevice->SetClip_Rect(&rcDevClip);
301e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	}
302e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
303e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator())
304e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
305e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		if (IFX_Edit_FontMap* pFontMap = pEdit->GetFontMap())
306e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		{
307e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			if (pRange)
308e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				pIterator->SetAt(pRange->BeginPos);
309e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			else
310e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				pIterator->SetAt(0);
311e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
312e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			CPVT_WordPlace oldplace;
313e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
314e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			while (pIterator->NextWord())
315e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			{
316e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				CPVT_WordPlace place = pIterator->GetAt();
317e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				if (pRange && place.WordCmp(pRange->EndPos) > 0) break;
318e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
319e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				CPVT_Word word;
320e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				if (pIterator->GetWord(word))
321e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				{
322e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					word.WordProps.fFontSize = word.fFontSize;
323e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
324e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					crCurText = ArgbEncode(255,word.WordProps.dwWordColor);
325e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
326e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					if (wrSelect.IsExist())
327e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					{
328e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						bSelect = place.WordCmp(wrSelect.BeginPos) > 0 && place.WordCmp(wrSelect.EndPos) <= 0;
329e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						if (bSelect)
330e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						{
331e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							crCurText = crWhite;
332e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						}
333e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					}
334e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
335e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					if (bSelect)
336e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					{
337e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						CPVT_Line line;
338e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						pIterator->GetLine(line);
339e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
340e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						CFX_PathData pathSelBK;
341e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						pathSelBK.AppendRect(word.ptWord.x		+ ptOffset.x,
342e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							line.ptLine.y + line.fLineDescent	+ ptOffset.y,
343e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							word.ptWord.x+word.fWidth			+ ptOffset.x,
344e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							line.ptLine.y + line.fLineAscent	+ ptOffset.y);
345e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
346e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						pDevice->DrawPath(&pathSelBK, pUser2Device, NULL, crSelBK, 0, FXFILL_WINDING);
347e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					}
348e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
349e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					if (place.LineCmp(oldplace) != 0 || word.WordProps.fCharSpace > 0.0f || word.WordProps.nHorzScale != 100 ||
350e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						FXSYS_memcmp(&word.WordProps, &wp, sizeof(CPVT_WordProps)) != 0 ||
351e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						crOld != crCurText)
352e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					{
353e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						if (sTextBuf.GetLength() > 0)
354e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						{
355e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							DrawTextString(pDevice, CPDF_Point(ptBT.x+ptOffset.x, ptBT.y+ptOffset.y), pFontMap->GetPDFFont(wp.nFontIndex),
356e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov								wp.fFontSize, pUser2Device, sTextBuf.GetByteString(), crOld, 0, wp.nHorzScale);
357e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
358e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							sTextBuf.Clear();
359e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						}
360e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						wp = word.WordProps;
361e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						ptBT = word.ptWord;
362e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						crOld = crCurText;
363e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					}
364e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
365e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					sTextBuf << GetPDFWordString(pFontMap, word.WordProps.nFontIndex, word.Word, 0);
366e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
367e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					if (word.WordProps.nWordStyle & PVTWORD_STYLE_UNDERLINE)
368e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					{
369e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						CFX_PathData pathUnderline;
370e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						CPDF_Rect rcUnderline = GetUnderLineRect(word);
371e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						pathUnderline.AppendRect(rcUnderline.left, rcUnderline.bottom, rcUnderline.right, rcUnderline.top);
372e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
373e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						pDevice->DrawPath(&pathUnderline, pUser2Device, NULL, crCurText, 0, FXFILL_WINDING);
374e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					}
375e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
376e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					if (word.WordProps.nWordStyle & PVTWORD_STYLE_CROSSOUT)
377e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					{
378e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						CFX_PathData pathCrossout;
379e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						CPDF_Rect rcCrossout = GetCrossoutRect(word);
380e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						pathCrossout.AppendRect(rcCrossout.left, rcCrossout.bottom, rcCrossout.right, rcCrossout.top);
381e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
382e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						pDevice->DrawPath(&pathCrossout, pUser2Device, NULL, crCurText, 0, FXFILL_WINDING);
383e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					}
384e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
385e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					oldplace = place;
386e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				}
387e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			}
388e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
389e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			if (sTextBuf.GetLength() > 0)
390e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			{
391e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				DrawTextString(pDevice, CPDF_Point(ptBT.x+ptOffset.x, ptBT.y+ptOffset.y), pFontMap->GetPDFFont(wp.nFontIndex),
392e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					wp.fFontSize, pUser2Device, sTextBuf.GetByteString(), crOld, 0, wp.nHorzScale);
393e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			}
394e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		}
395e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	}
396e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
397e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	pDevice->RestoreState();
398e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
399e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
400e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstatic void AddRectToPageObjects(CPDF_PageObjects* pPageObjs, FX_COLORREF crFill, const CPDF_Rect& rcFill)
401e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
402e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPDF_PathObject* pPathObj = new CPDF_PathObject;
403e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPDF_PathData* pPathData = pPathObj->m_Path.GetModify();
404e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	pPathData->AppendRect(rcFill.left,rcFill.bottom,rcFill.right,rcFill.top);
405e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
406e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT rgb[3];
407e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	rgb[0] = FXARGB_R(crFill) / 255.0f ;
408e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	rgb[1] = FXARGB_G(crFill) / 255.0f;
409e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	rgb[2] = FXARGB_B(crFill) / 255.0f;
410e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	pPathObj->m_ColorState.SetFillColor(CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB), rgb, 3);
411e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
412e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	pPathObj->m_FillType = FXFILL_ALTERNATE;
413e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	pPathObj->m_bStroke = FALSE;
414e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
415e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	pPageObjs->InsertObject(pPageObjs->GetLastObjectPosition(),pPathObj);
416e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
417e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
418e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstatic CPDF_TextObject* AddTextObjToPageObjects(CPDF_PageObjects* pPageObjs, FX_COLORREF crText,
419e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							 CPDF_Font* pFont, FX_FLOAT fFontSize, FX_FLOAT fCharSpace, FX_INT32 nHorzScale,
420e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							 const CPDF_Point& point, const CFX_ByteString& text)
421e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
422e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPDF_TextObject* pTxtObj = new CPDF_TextObject;
423e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
424e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPDF_TextStateData* pTextStateData = pTxtObj->m_TextState.GetModify();
425e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	pTextStateData->m_pFont = pFont;
426e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	pTextStateData->m_FontSize = fFontSize;
427e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	pTextStateData->m_CharSpace = fCharSpace;
428e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	pTextStateData->m_WordSpace = 0;
429e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	pTextStateData->m_TextMode  = 0;
430e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	pTextStateData->m_Matrix[0] = nHorzScale / 100.0f;
431e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	pTextStateData->m_Matrix[1] = 0;
432e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	pTextStateData->m_Matrix[2] = 0;
433e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	pTextStateData->m_Matrix[3] = 1;
434e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
435e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT rgb[3];
436e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	rgb[0] = FXARGB_R(crText) / 255.0f ;
437e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	rgb[1] = FXARGB_G(crText) / 255.0f;
438e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	rgb[2] = FXARGB_B(crText) / 255.0f;
439e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	pTxtObj->m_ColorState.SetFillColor(CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB),rgb, 3);
440e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	pTxtObj->m_ColorState.SetStrokeColor(CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB),rgb, 3);
441e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
442e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	pTxtObj->SetPosition(point.x,point.y);
443e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	pTxtObj->SetText(text);
444e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
445e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	pPageObjs->InsertObject(pPageObjs->GetLastObjectPosition(),pTxtObj);
446e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
447e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	return pTxtObj;
448e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
449e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
450e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid IFX_Edit::GeneratePageObjects(CPDF_PageObjects* pPageObjects, IFX_Edit* pEdit,
451e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov								   const CPDF_Point& ptOffset, const CPVT_WordRange* pRange, FX_COLORREF crText, CFX_ArrayTemplate<CPDF_TextObject*>& ObjArray)
452e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
453e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_FLOAT fFontSize = pEdit->GetFontSize();
454e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
455e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_INT32 nOldFontIndex = -1;
456e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
457e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CFX_ByteTextBuf sTextBuf;
458e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPDF_Point ptBT(0.0f,0.0f);
459e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
460e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	ObjArray.RemoveAll();
461e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
462e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator())
463e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
464e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		if (IFX_Edit_FontMap* pFontMap = pEdit->GetFontMap())
465e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		{
466e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			if (pRange)
467e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				pIterator->SetAt(pRange->BeginPos);
468e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			else
469e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				pIterator->SetAt(0);
470e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
471e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			CPVT_WordPlace oldplace;
472e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
473e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			while (pIterator->NextWord())
474e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			{
475e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				CPVT_WordPlace place = pIterator->GetAt();
476e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				if (pRange && place.WordCmp(pRange->EndPos) > 0) break;
477e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
478e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				CPVT_Word word;
479e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				if (pIterator->GetWord(word))
480e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				{
481e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					if (place.LineCmp(oldplace) != 0 || nOldFontIndex != word.nFontIndex)
482e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					{
483e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						if (sTextBuf.GetLength() > 0)
484e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						{
485e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							ObjArray.Add(AddTextObjToPageObjects(pPageObjects, crText, pFontMap->GetPDFFont(nOldFontIndex), fFontSize, 0.0f, 100,
486e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov								CPDF_Point(ptBT.x+ptOffset.x, ptBT.y+ptOffset.y), sTextBuf.GetByteString()));
487e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
488e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							sTextBuf.Clear();
489e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						}
490e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
491e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						ptBT = word.ptWord;
492e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						nOldFontIndex = word.nFontIndex;
493e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					}
494e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
495e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					sTextBuf << GetPDFWordString(pFontMap, word.nFontIndex, word.Word, 0);
496e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					oldplace = place;
497e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				}
498e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			}
499e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
500e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			if (sTextBuf.GetLength() > 0)
501e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			{
502e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				ObjArray.Add(AddTextObjToPageObjects(pPageObjects, crText, pFontMap->GetPDFFont(nOldFontIndex), fFontSize, 0.0f, 100,
503e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					CPDF_Point(ptBT.x+ptOffset.x, ptBT.y+ptOffset.y), sTextBuf.GetByteString()));
504e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			}
505e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		}
506e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	}
507e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
508e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
509e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid IFX_Edit::GenerateRichPageObjects(CPDF_PageObjects* pPageObjects, IFX_Edit* pEdit,
510e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov								   const CPDF_Point& ptOffset, const CPVT_WordRange* pRange, CFX_ArrayTemplate<CPDF_TextObject*>& ObjArray)
511e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
512e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
513e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
514e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_COLORREF crCurText = ArgbEncode(255, 0, 0, 0);
515e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	FX_COLORREF crOld = crCurText;
516e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
517e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
518e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CFX_ByteTextBuf sTextBuf;
519e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPVT_WordProps wp;
520e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	CPDF_Point ptBT(0.0f,0.0f);
521e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
522e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	ObjArray.RemoveAll();
523e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
524e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator())
525e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
526e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		if (IFX_Edit_FontMap* pFontMap = pEdit->GetFontMap())
527e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		{
528e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			if (pRange)
529e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				pIterator->SetAt(pRange->BeginPos);
530e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			else
531e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				pIterator->SetAt(0);
532e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
533e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			CPVT_WordPlace oldplace;
534e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
535e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			while (pIterator->NextWord())
536e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			{
537e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				CPVT_WordPlace place = pIterator->GetAt();
538e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				if (pRange && place.WordCmp(pRange->EndPos) > 0) break;
539e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
540e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				CPVT_Word word;
541e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				if (pIterator->GetWord(word))
542e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				{
543e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					word.WordProps.fFontSize = word.fFontSize;
544e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
545e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					crCurText = ArgbEncode(255,word.WordProps.dwWordColor);
546e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
547e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					if (place.LineCmp(oldplace) != 0 || word.WordProps.fCharSpace > 0.0f || word.WordProps.nHorzScale != 100 ||
548e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						FXSYS_memcmp(&word.WordProps, &wp, sizeof(CPVT_WordProps)) != 0 ||
549e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						crOld != crCurText)
550e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					{
551e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						if (sTextBuf.GetLength() > 0)
552e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						{
553e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							ObjArray.Add(AddTextObjToPageObjects(pPageObjects, crOld, pFontMap->GetPDFFont(wp.nFontIndex), wp.fFontSize, wp.fCharSpace, wp.nHorzScale,
554e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov								CPDF_Point(ptBT.x+ptOffset.x, ptBT.y+ptOffset.y), sTextBuf.GetByteString()));
555e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
556e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							sTextBuf.Clear();
557e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						}
558e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
559e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						wp = word.WordProps;
560e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						ptBT = word.ptWord;
561e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						crOld = crCurText;
562e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
563e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					}
564e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
565e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					sTextBuf << GetPDFWordString(pFontMap, word.WordProps.nFontIndex, word.Word, 0);
566e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
567e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					if (word.WordProps.nWordStyle & PVTWORD_STYLE_UNDERLINE)
568e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					{/*
569e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						AddLineToPageObjects(pPageObjects, crCurText,
570e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							CPDF_Point(word.ptWord.x, word.ptWord.y + word.fDescent * 0.4f),
571e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov							CPDF_Point(word.ptWord.x + word.fWidth, word.ptWord.y + word.fDescent * 0.4f));
572e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov*/
573e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						CPDF_Rect rcUnderline = GetUnderLineRect(word);
574e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						rcUnderline.left += ptOffset.x;
575e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						rcUnderline.right += ptOffset.x;
576e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						rcUnderline.top += ptOffset.y;
577e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						rcUnderline.bottom += ptOffset.y;
578e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
579e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						AddRectToPageObjects(pPageObjects, crCurText, rcUnderline);
580e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					}
581e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
582e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					if (word.WordProps.nWordStyle & PVTWORD_STYLE_CROSSOUT)
583e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					{
584e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						CPDF_Rect rcCrossout = GetCrossoutRect(word);
585e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						rcCrossout.left += ptOffset.x;
586e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						rcCrossout.right += ptOffset.x;
587e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						rcCrossout.top += ptOffset.y;
588e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						rcCrossout.bottom += ptOffset.y;
589e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
590e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						AddRectToPageObjects(pPageObjects, crCurText, rcCrossout);
591e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					}
592e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
593e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					oldplace = place;
594e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				}
595e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			}
596e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
597e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			if (sTextBuf.GetLength() > 0)
598e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			{
599e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				ObjArray.Add(AddTextObjToPageObjects(pPageObjects, crOld, pFontMap->GetPDFFont(wp.nFontIndex), wp.fFontSize, wp.fCharSpace, wp.nHorzScale,
600e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					CPDF_Point(ptBT.x+ptOffset.x, ptBT.y+ptOffset.y), sTextBuf.GetByteString()));
601e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			}
602e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		}
603e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	}
604e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
605e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
606e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid IFX_Edit::GenerateUnderlineObjects(CPDF_PageObjects* pPageObjects, IFX_Edit* pEdit,
607e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov								   const CPDF_Point& ptOffset, const CPVT_WordRange* pRange, FX_COLORREF color)
608e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
609e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
610e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
611e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator())
612e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	{
613e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		if (pEdit->GetFontMap())
614e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		{
615e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			if (pRange)
616e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				pIterator->SetAt(pRange->BeginPos);
617e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			else
618e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				pIterator->SetAt(0);
619e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
620e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			CPVT_WordPlace oldplace;
621e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
622e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			while (pIterator->NextWord())
623e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			{
624e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				CPVT_WordPlace place = pIterator->GetAt();
625e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				if (pRange && place.WordCmp(pRange->EndPos) > 0) break;
626e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
627e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				CPVT_Word word;
628e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				if (pIterator->GetWord(word))
629e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				{
630e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					CPDF_Rect rcUnderline = GetUnderLineRect(word);
631e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					rcUnderline.left += ptOffset.x;
632e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					rcUnderline.right += ptOffset.x;
633e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					rcUnderline.top += ptOffset.y;
634e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					rcUnderline.bottom += ptOffset.y;
635e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					AddRectToPageObjects(pPageObjects, color, rcUnderline);
636e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				}
637e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			}
638e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		}
639e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	}
640e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
641e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
642