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