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/fpdfdoc/fpdf_doc.h" 8e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "../../include/fpdfdoc/fpdf_vt.h" 9e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "pdf_vt.h" 10e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovconst FX_BYTE gFontSizeSteps[] = { 4, 6, 8, 9, 10, 12, 14, 18, 20, 25, 30, 35, 40, 45, 50, 55, 60, 70, 80, 90, 100, 110, 120, 130, 144}; 11e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define PVT_RETURN_LENGTH 1 12e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define PVT_DEFAULT_FONTSIZE 18.0f 13e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define PVTWORD_SCRIPT_NORMAL 0 14e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define PVTWORD_SCRIPT_SUPER 1 15e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define PVTWORD_SCRIPT_SUB 2 16e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define PVT_FONTSCALE 0.001f 17e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define PVT_PERCENT 0.01f 18e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define PVT_HALF 0.5f 19e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCLine::CLine() 20e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 21e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 22e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCLine::~CLine() 23e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 24e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 25e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CLine::GetBeginWordPlace() const 26e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 27e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return CPVT_WordPlace(LinePlace.nSecIndex, LinePlace.nLineIndex, -1); 28e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 29e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CLine::GetEndWordPlace() const 30e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 31e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return CPVT_WordPlace(LinePlace.nSecIndex, LinePlace.nLineIndex, m_LineInfo.nEndWordIndex); 32e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 33e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CLine::GetPrevWordPlace(const CPVT_WordPlace & place) const 34e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 35e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (place.nWordIndex > m_LineInfo.nEndWordIndex) { 36e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, m_LineInfo.nEndWordIndex); 37e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 38e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, place.nWordIndex - 1); 39e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 40e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CLine::GetNextWordPlace(const CPVT_WordPlace & place) const 41e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 42e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (place.nWordIndex < m_LineInfo.nBeginWordIndex) { 43e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, m_LineInfo.nBeginWordIndex); 44e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 45e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, place.nWordIndex + 1); 46e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 47e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCSection::CSection(CPDF_VariableText * pVT) : m_pVT(pVT) 48e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 49e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 50e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCSection::~CSection() 51e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 52e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ResetAll(); 53e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 54e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CSection::ResetAll() 55e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 56e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ResetWordArray(); 57e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ResetLineArray(); 58e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 59e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CSection::ResetLineArray() 60e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 61e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_LineArray.RemoveAll(); 62e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 63e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CSection::ResetWordArray() 64e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 65e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (FX_INT32 i = 0, sz = m_WordArray.GetSize(); i < sz; i++) { 66e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov delete m_WordArray.GetAt(i); 67e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 68e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_WordArray.RemoveAll(); 69e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 70e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CSection::ResetLinePlace() 71e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 72e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (FX_INT32 i = 0, sz = m_LineArray.GetSize(); i < sz; i++) { 73e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CLine * pLine = m_LineArray.GetAt(i)) { 74e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pLine->LinePlace = CPVT_WordPlace(SecPlace.nSecIndex, i, -1); 75e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 76e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 77e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 78e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CSection::AddWord(const CPVT_WordPlace & place, const CPVT_WordInfo & wordinfo) 79e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 80e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPVT_WordInfo * pWord = new CPVT_WordInfo(wordinfo); 81e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_INT32 nWordIndex = FPDF_MAX(FPDF_MIN(place.nWordIndex, this->m_WordArray.GetSize()), 0); 82e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (nWordIndex == m_WordArray.GetSize()) { 83e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_WordArray.Add(pWord); 84e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 85e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_WordArray.InsertAt(nWordIndex, pWord); 86e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 87e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return place; 88e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 89e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CSection::AddLine(const CPVT_LineInfo & lineinfo) 90e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 91e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return CPVT_WordPlace(SecPlace.nSecIndex, m_LineArray.Add(lineinfo), -1); 92e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 93e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_FloatRect CSection::Rearrange() 94e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 95e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ASSERT(m_pVT != NULL); 96e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (m_pVT->m_nCharArray > 0) { 97e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return CTypeset(this).CharArray(); 98e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 99e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return CTypeset(this).Typeset(); 100e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 101e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 102e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_Size CSection::GetSectionSize(FX_FLOAT fFontSize) 103e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 104e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return CTypeset(this).GetEditSize(fFontSize); 105e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 106e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CSection::GetBeginWordPlace() const 107e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 108e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CLine * pLine = m_LineArray.GetAt(0)) { 109e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return pLine->GetBeginWordPlace(); 110e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 111e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return SecPlace; 112e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 113e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 114e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CSection::GetEndWordPlace() const 115e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 116e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CLine * pLine = m_LineArray.GetAt(m_LineArray.GetSize() - 1)) { 117e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return pLine->GetEndWordPlace(); 118e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 119e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return this->SecPlace; 120e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 121e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 122e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CSection::GetPrevWordPlace(const CPVT_WordPlace & place) const 123e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 124e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (place.nLineIndex < 0) { 125e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return GetBeginWordPlace(); 126e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 127e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (place.nLineIndex >= m_LineArray.GetSize()) { 128e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return GetEndWordPlace(); 129e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 130e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CLine * pLine = m_LineArray.GetAt(place.nLineIndex)) { 131e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (place.nWordIndex == pLine->m_LineInfo.nBeginWordIndex) { 132e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, -1); 133e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else if (place.nWordIndex < pLine->m_LineInfo.nBeginWordIndex) { 134e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CLine * pPrevLine = m_LineArray.GetAt(place.nLineIndex - 1)) { 135e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return pPrevLine->GetEndWordPlace(); 136e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 137e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 138e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return pLine->GetPrevWordPlace(place); 139e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 140e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 141e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return place; 142e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 143e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CSection::GetNextWordPlace(const CPVT_WordPlace & place) const 144e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 145e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (place.nLineIndex < 0) { 146e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return GetBeginWordPlace(); 147e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 148e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (place.nLineIndex >= m_LineArray.GetSize()) { 149e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return GetEndWordPlace(); 150e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 151e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CLine * pLine = m_LineArray.GetAt(place.nLineIndex)) { 152e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (place.nWordIndex >= pLine->m_LineInfo.nEndWordIndex) { 153e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CLine * pNextLine = m_LineArray.GetAt(place.nLineIndex + 1)) { 154e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return pNextLine->GetBeginWordPlace(); 155e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 156e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 157e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return pLine->GetNextWordPlace(place); 158e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 159e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 160e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return place; 161e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 162e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CSection::UpdateWordPlace(CPVT_WordPlace & place) const 163e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 164e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_INT32 nLeft = 0; 165e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_INT32 nRight = m_LineArray.GetSize() - 1; 166e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_INT32 nMid = (nLeft + nRight) / 2; 167e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov while (nLeft <= nRight) { 168e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CLine * pLine = m_LineArray.GetAt(nMid)) { 169e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (place.nWordIndex < pLine->m_LineInfo.nBeginWordIndex) { 170e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov nRight = nMid - 1; 171e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov nMid = (nLeft + nRight) / 2; 172e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else if (place.nWordIndex > pLine->m_LineInfo.nEndWordIndex) { 173e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov nLeft = nMid + 1; 174e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov nMid = (nLeft + nRight) / 2; 175e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 176e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov place.nLineIndex = nMid; 177e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return; 178e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 179e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 180e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 181e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 182e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 183e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 184e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CSection::SearchWordPlace(const CPDF_Point & point) const 185e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 186e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ASSERT(m_pVT != NULL); 187e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPVT_WordPlace place = GetBeginWordPlace(); 188e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_BOOL bUp = TRUE; 189e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_BOOL bDown = TRUE; 190e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_INT32 nLeft = 0; 191e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_INT32 nRight = m_LineArray.GetSize() - 1; 192e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_INT32 nMid = m_LineArray.GetSize() / 2; 193e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_FLOAT fTop = 0; 194e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_FLOAT fBottom = 0; 195e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov while (nLeft <= nRight) { 196e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CLine * pLine = m_LineArray.GetAt(nMid)) { 197e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fTop = pLine->m_LineInfo.fLineY - pLine->m_LineInfo.fLineAscent - m_pVT->GetLineLeading(m_SecInfo); 198e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fBottom = pLine->m_LineInfo.fLineY - pLine->m_LineInfo.fLineDescent; 199e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (IsFloatBigger(point.y, fTop)) { 200e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov bUp = FALSE; 201e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 202e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (IsFloatSmaller(point.y, fBottom)) { 203e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov bDown = FALSE; 204e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 205e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (IsFloatSmaller(point.y, fTop)) { 206e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov nRight = nMid - 1; 207e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov nMid = (nLeft + nRight) / 2; 208e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov continue; 209e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else if (IsFloatBigger(point.y, fBottom)) { 210e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov nLeft = nMid + 1; 211e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov nMid = (nLeft + nRight) / 2; 212e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov continue; 213e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 214e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov place = SearchWordPlace(point.x, 215e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPVT_WordRange(pLine->GetNextWordPlace(pLine->GetBeginWordPlace()), pLine->GetEndWordPlace()) 216e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ); 217e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov place.nLineIndex = nMid; 218e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return place; 219e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 220e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 221e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 222e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (bUp) { 223e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov place = GetBeginWordPlace(); 224e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 225e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (bDown) { 226e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov place = GetEndWordPlace(); 227e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 228e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return place; 229e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 230e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CSection::SearchWordPlace(FX_FLOAT fx, const CPVT_WordPlace & lineplace) const 231e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 232e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CLine * pLine = m_LineArray.GetAt(lineplace.nLineIndex)) { 233e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return SearchWordPlace(fx - m_SecInfo.rcSection.left, 234e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPVT_WordRange(pLine->GetNextWordPlace(pLine->GetBeginWordPlace()), pLine->GetEndWordPlace())); 235e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 236e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return GetBeginWordPlace(); 237e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 238e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CSection::SearchWordPlace(FX_FLOAT fx, const CPVT_WordRange & range) const 239e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 240e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPVT_WordPlace wordplace = range.BeginPos; 241e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov wordplace.nWordIndex = -1; 242e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!m_pVT) { 243e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return wordplace; 244e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 245e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_INT32 nLeft = range.BeginPos.nWordIndex; 246e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_INT32 nRight = range.EndPos.nWordIndex + 1; 247e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_INT32 nMid = (nLeft + nRight) / 2; 248e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov while (nLeft < nRight) { 249e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (nMid == nLeft) { 250e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 251e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 252e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (nMid == nRight) { 253e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov nMid--; 254e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 255e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 256e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CPVT_WordInfo * pWord = m_WordArray.GetAt(nMid)) { 257e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (fx > pWord->fWordX + m_pVT->GetWordWidth(*pWord) * PVT_HALF) { 258e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov nLeft = nMid; 259e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov nMid = (nLeft + nRight) / 2; 260e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov continue; 261e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 262e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov nRight = nMid; 263e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov nMid = (nLeft + nRight) / 2; 264e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov continue; 265e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 266e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 267e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 268e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 269e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 270e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CPVT_WordInfo * pWord = m_WordArray.GetAt(nMid)) { 271e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (fx > pWord->fWordX + m_pVT->GetWordWidth(*pWord) * PVT_HALF) { 272e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov wordplace.nWordIndex = nMid; 273e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 274e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 275e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return wordplace; 276e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 277e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CSection::ClearLeftWords(FX_INT32 nWordIndex) 278e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 279e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (FX_INT32 i = nWordIndex; i >= 0; i--) { 280e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov delete m_WordArray.GetAt(i); 281e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_WordArray.RemoveAt(i); 282e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 283e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 284e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CSection::ClearRightWords(FX_INT32 nWordIndex) 285e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 286e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (FX_INT32 i = m_WordArray.GetSize() - 1; i > nWordIndex; i--) { 287e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov delete m_WordArray.GetAt(i); 288e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_WordArray.RemoveAt(i); 289e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 290e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 291e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CSection::ClearMidWords(FX_INT32 nBeginIndex, FX_INT32 nEndIndex) 292e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 293e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (FX_INT32 i = nEndIndex; i > nBeginIndex; i--) { 294e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov delete m_WordArray.GetAt(i); 295e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_WordArray.RemoveAt(i); 296e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 297e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 298e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CSection::ClearWords(const CPVT_WordRange & PlaceRange) 299e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 300e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPVT_WordPlace SecBeginPos = GetBeginWordPlace(); 301e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPVT_WordPlace SecEndPos = GetEndWordPlace(); 302e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (PlaceRange.BeginPos.WordCmp(SecBeginPos) >= 0) { 303e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (PlaceRange.EndPos.WordCmp(SecEndPos) <= 0) { 304e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ClearMidWords(PlaceRange.BeginPos.nWordIndex, PlaceRange.EndPos.nWordIndex); 305e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 306e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ClearRightWords(PlaceRange.BeginPos.nWordIndex); 307e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 308e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else if (PlaceRange.EndPos.WordCmp(SecEndPos) <= 0) { 309e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ClearLeftWords(PlaceRange.EndPos.nWordIndex); 310e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 311e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ResetWordArray(); 312e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 313e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 314e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CSection::ClearWord(const CPVT_WordPlace & place) 315e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 316e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov delete m_WordArray.GetAt(place.nWordIndex); 317e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_WordArray.RemoveAt(place.nWordIndex); 318e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 319e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCTypeset::CTypeset(CSection * pSection) : m_rcRet(0.0f, 0.0f, 0.0f, 0.0f), m_pVT(pSection->m_pVT), m_pSection(pSection) 320e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 321e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 322e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCTypeset::~CTypeset() 323e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 324e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 325e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_FloatRect CTypeset::CharArray() 326e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 327e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ASSERT(m_pSection != NULL); 328e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ASSERT(m_pVT != NULL); 329e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_FLOAT fLineAscent = m_pVT->GetFontAscent(m_pVT->GetDefaultFontIndex(), m_pVT->GetFontSize()); 330e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_FLOAT fLineDescent = m_pVT->GetFontDescent(m_pVT->GetDefaultFontIndex(), m_pVT->GetFontSize()); 331e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_rcRet.Default(); 332e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_FLOAT x = 0.0f, y = 0.0f; 333e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_FLOAT fNextWidth; 334e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_INT32 nStart = 0; 335e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_FLOAT fNodeWidth = m_pVT->GetPlateWidth() / (m_pVT->m_nCharArray <= 0 ? 1 : m_pVT->m_nCharArray); 336e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CLine * pLine = m_pSection->m_LineArray.GetAt(0)) { 337e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov x = 0.0f; 338e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov y += m_pVT->GetLineLeading(m_pSection->m_SecInfo); 339e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov y += fLineAscent; 340e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov nStart = 0; 341e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov switch (m_pVT->GetAlignment(m_pSection->m_SecInfo)) { 342e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case 0: 343e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pLine->m_LineInfo.fLineX = fNodeWidth * PVT_HALF; 344e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 345e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case 1: 346e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov nStart = (m_pVT->m_nCharArray - m_pSection->m_WordArray.GetSize()) / 2; 347e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pLine->m_LineInfo.fLineX = fNodeWidth * nStart - fNodeWidth * PVT_HALF; 348e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 349e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case 2: 350e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov nStart = m_pVT->m_nCharArray - m_pSection->m_WordArray.GetSize(); 351e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pLine->m_LineInfo.fLineX = fNodeWidth * nStart - fNodeWidth * PVT_HALF; 352e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 353e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 354e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (FX_INT32 w = 0, sz = m_pSection->m_WordArray.GetSize(); w < sz; w++) { 355e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (w >= m_pVT->m_nCharArray) { 356e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 357e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 358e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fNextWidth = 0; 359e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CPVT_WordInfo * pNextWord = (CPVT_WordInfo *)m_pSection->m_WordArray.GetAt(w + 1)) { 360e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pNextWord->fWordTail = 0; 361e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fNextWidth = m_pVT->GetWordWidth(*pNextWord); 362e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 363e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CPVT_WordInfo * pWord = (CPVT_WordInfo *)m_pSection->m_WordArray.GetAt(w)) { 364e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pWord->fWordTail = 0; 365e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_FLOAT fWordWidth = m_pVT->GetWordWidth(*pWord); 366e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_FLOAT fWordAscent = m_pVT->GetWordAscent(*pWord); 367e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_FLOAT fWordDescent = m_pVT->GetWordDescent(*pWord); 368e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov x = (FX_FLOAT)(fNodeWidth * (w + nStart + 0.5) - fWordWidth * PVT_HALF); 369e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pWord->fWordX = x; 370e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pWord->fWordY = y; 371e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (w == 0) { 372e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pLine->m_LineInfo.fLineX = x; 373e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 374e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (w != m_pSection->m_WordArray.GetSize() - 1) 375e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pWord->fWordTail = (fNodeWidth - (fWordWidth + fNextWidth) * PVT_HALF > 0 ? 376e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fNodeWidth - (fWordWidth + fNextWidth) * PVT_HALF : 0); 377e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov else { 378e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pWord->fWordTail = 0; 379e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 380e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov x += fWordWidth; 381e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fLineAscent = FPDF_MAX(fLineAscent, fWordAscent); 382e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fLineDescent = FPDF_MIN(fLineDescent, fWordDescent); 383e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 384e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 385e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pLine->m_LineInfo.nBeginWordIndex = 0; 386e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pLine->m_LineInfo.nEndWordIndex = m_pSection->m_WordArray.GetSize() - 1; 387e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pLine->m_LineInfo.fLineY = y; 388e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pLine->m_LineInfo.fLineWidth = x - pLine->m_LineInfo.fLineX; 389e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pLine->m_LineInfo.fLineAscent = fLineAscent; 390e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pLine->m_LineInfo.fLineDescent = fLineDescent; 391e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov y += (-fLineDescent); 392e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 393e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return m_rcRet = CPVT_FloatRect(0, 0, x, y); 394e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 395e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_Size CTypeset::GetEditSize(FX_FLOAT fFontSize) 396e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 397e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ASSERT(m_pSection != NULL); 398e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ASSERT(m_pVT != NULL); 399e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov SplitLines(FALSE, fFontSize); 400e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return CPVT_Size(m_rcRet.Width(), m_rcRet.Height()); 401e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 402e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_FloatRect CTypeset::Typeset() 403e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 404e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ASSERT(m_pSection != NULL); 405e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ASSERT(m_pVT != NULL); 406e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_pSection->m_LineArray.Empty(); 407e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov SplitLines(TRUE, 0.0f); 408e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_pSection->m_LineArray.Clear(); 409e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov OutputLines(); 410e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return m_rcRet; 411e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 412e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstatic int special_chars[128] = { 413e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x0000, 0x000C, 0x0008, 0x000C, 0x0008, 0x0000, 0x0020, 0x0000, 414e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 415e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 416e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 417e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x0000, 0x0008, 0x0008, 0x0000, 0x0010, 0x0000, 0x0000, 0x0028, 418e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x000C, 0x0008, 0x0000, 0x0000, 0x0028, 0x0028, 0x0028, 0x0028, 419e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 420e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x0002, 0x0002, 0x0008, 0x0008, 0x0000, 0x0000, 0x0000, 0x0008, 421e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 422e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 423e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 424e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x0001, 0x0001, 0x0001, 0x000C, 0x0000, 0x0008, 0x0000, 0x0000, 425e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 426e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 427e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 428e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x0001, 0x0001, 0x0001, 0x000C, 0x0000, 0x0008, 0x0000, 0x0000, 429e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}; 430e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstatic FX_BOOL IsLatin(FX_WORD word) 431e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 432e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (word <= 0x007F) { 433e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (special_chars[word] & 0x0001) { 434e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 435e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 436e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 437e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if ((word >= 0x00C0 && word <= 0x00FF) || 438e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (word >= 0x0100 && word <= 0x024F) || 439e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (word >= 0x1E00 && word <= 0x1EFF) || 440e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (word >= 0x2C60 && word <= 0x2C7F) || 441e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (word >= 0xA720 && word <= 0xA7FF) || 442e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (word >= 0xFF21 && word <= 0xFF3A) || 443e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (word >= 0xFF41 && word <= 0xFF5A)) { 444e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 445e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 446e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 447e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 448e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstatic FX_BOOL IsDigit(FX_DWORD word) 449e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 450e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return (word >= 0x0030 && word <= 0x0039) ? TRUE : FALSE; 451e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 452e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstatic FX_BOOL IsCJK(FX_DWORD word) 453e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 454e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if ((word >= 0x1100 && word <= 0x11FF) || 455e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (word >= 0x2E80 && word <= 0x2FFF) || 456e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (word >= 0x3040 && word <= 0x9FBF) || 457e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (word >= 0xAC00 && word <= 0xD7AF) || 458e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (word >= 0xF900 && word <= 0xFAFF) || 459e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (word >= 0xFE30 && word <= 0xFE4F) || 460e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (word >= 0x20000 && word <= 0x2A6DF) || 461e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (word >= 0x2F800 && word <= 0x2FA1F)) { 462e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 463e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 464e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (word >= 0x3000 && word <= 0x303F) { 465e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (word == 0x3005 || word == 0x3006 || word == 0x3021 || word == 0x3022 || 466e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov word == 0x3023 || word == 0x3024 || word == 0x3025 || word == 0x3026 || 467e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov word == 0x3027 || word == 0x3028 || word == 0x3029 || word == 0x3031 || 468e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov word == 0x3032 || word == 0x3033 || word == 0x3034 || word == 0x3035) { 469e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 470e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 471e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 472e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 473e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (word >= 0xFF66 && word <= 0xFF9D) { 474e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 475e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 476e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 477e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 478e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstatic FX_BOOL IsPunctuation(FX_DWORD word) 479e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 480e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (word <= 0x007F) { 481e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if ((special_chars[word] >> 3) & 1) { 482e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 483e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 484e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else if (word >= 0x0080 && word <= 0x00FF) { 485e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (word == 0x0082 || word == 0x0084 || word == 0x0085 || word == 0x0091 || 486e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov word == 0x0092 || word == 0x0093 || word <= 0x0094 || word == 0x0096 || 487e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov word == 0x00B4 || word == 0x00B8) { 488e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 489e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 490e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else if (word >= 0x2000 && word <= 0x206F) { 491e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (word == 0x2010 || word == 0x2011 || word == 0x2012 || word == 0x2013 || 492e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov word == 0x2018 || word == 0x2019 || word == 0x201A || word == 0x201B || 493e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov word == 0x201C || word == 0x201D || word == 0x201E || word == 0x201F || 494e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov word == 0x2032 || word == 0x2033 || word == 0x2034 || word == 0x2035 || 495e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov word == 0x2036 || word == 0x2037 || word == 0x203C || word == 0x203D || 496e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov word == 0x203E || word == 0x2044) { 497e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 498e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 499e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else if (word >= 0x3000 && word <= 0x303F) { 500e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (word == 0x3001 || word == 0x3002 || word == 0x3003 || word == 0x3005 || 501e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov word == 0x3009 || word == 0x300A || word == 0x300B || word == 0x300C || 502e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov word == 0x300D || word == 0x300F || word == 0x300E || word == 0x3010 || 503e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov word == 0x3011 || word == 0x3014 || word == 0x3015 || word == 0x3016 || 504e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov word == 0x3017 || word == 0x3018 || word == 0x3019 || word == 0x301A || 505e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov word == 0x301B || word == 0x301D || word == 0x301E || word == 0x301F) { 506e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 507e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 508e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else if (word >= 0xFE50 && word <= 0xFE6F) { 509e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if ((word >= 0xFE50 && word <= 0xFE5E) || word == 0xFE63) { 510e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 511e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 512e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else if (word >= 0xFF00 && word <= 0xFFEF) { 513e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (word == 0xFF01 || word == 0xFF02 || word == 0xFF07 || word == 0xFF08 || 514e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov word == 0xFF09 || word == 0xFF0C || word == 0xFF0E || word == 0xFF0F || 515e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov word == 0xFF1A || word == 0xFF1B || word == 0xFF1F || word == 0xFF3B || 516e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov word == 0xFF3D || word == 0xFF40 || word == 0xFF5B || word == 0xFF5C || 517e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov word == 0xFF5D || word == 0xFF61 || word == 0xFF62 || word == 0xFF63 || 518e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov word == 0xFF64 || word == 0xFF65 || word == 0xFF9E || word == 0xFF9F) { 519e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 520e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 521e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 522e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 523e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 524e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstatic FX_BOOL IsConnectiveSymbol(FX_DWORD word) 525e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 526e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (word <= 0x007F) { 527e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if ((special_chars[word] >> 5) & 1) { 528e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 529e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 530e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 531e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 532e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 533e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstatic FX_BOOL IsOpenStylePunctuation(FX_DWORD word) 534e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 535e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (word <= 0x007F) { 536e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if ((special_chars[word] >> 2) & 1) { 537e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 538e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 539e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else if (word == 0x300A || word == 0x300C || word == 0x300E || word == 0x3010 || 540e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov word == 0x3014 || word == 0x3016 || word == 0x3018 || word == 0x301A || 541e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov word == 0xFF08 || word == 0xFF3B || word == 0xFF5B || word == 0xFF62) { 542e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 543e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 544e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 545e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 546e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstatic FX_BOOL IsCurrencySymbol(FX_WORD word) 547e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 548e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (word == 0x0024 || word == 0x0080 || word == 0x00A2 || word == 0x00A3 || 549e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov word == 0x00A4 || word == 0x00A5 || (word >= 0x20A0 && word <= 0x20CF) || 550e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov word == 0xFE69 || word == 0xFF04 || word == 0xFFE0 || word == 0xFFE1 || 551e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov word == 0xFFE5 || word == 0xFFE6) { 552e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 553e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 554e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 555e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 556e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstatic FX_BOOL IsPrefixSymbol(FX_WORD word) 557e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 558e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (IsCurrencySymbol(word)) { 559e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 560e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 561e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (word == 0x2116) { 562e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 563e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 564e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 565e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 566e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstatic FX_BOOL IsSpace(FX_WORD word) 567e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 568e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return (word == 0x0020 || word == 0x3000) ? TRUE : FALSE; 569e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 570e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstatic FX_BOOL NeedDivision(FX_WORD prevWord, FX_WORD curWord) 571e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 572e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if ((IsLatin(prevWord) || IsDigit(prevWord)) && (IsLatin(curWord) || IsDigit(curWord))) { 573e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 574e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else if (IsSpace(curWord) || IsPunctuation(curWord)) { 575e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 576e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else if (IsConnectiveSymbol(prevWord) || IsConnectiveSymbol(curWord)) { 577e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 578e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else if (IsSpace(prevWord) || IsPunctuation(prevWord)) { 579e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 580e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else if (IsPrefixSymbol(prevWord)) { 581e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 582e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else if (IsPrefixSymbol(curWord) || IsCJK(curWord)) { 583e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 584e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else if (IsCJK(prevWord)) { 585e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 586e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 587e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 588e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 589e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CTypeset::SplitLines(FX_BOOL bTypeset, FX_FLOAT fFontSize) 590e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 591e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ASSERT(m_pVT != NULL); 592e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ASSERT(m_pSection != NULL); 593e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_INT32 nLineHead = 0; 594e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_INT32 nLineTail = 0; 595e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_FLOAT fMaxX = 0.0f, fMaxY = 0.0f; 596e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_FLOAT fLineWidth = 0.0f, fBackupLineWidth = 0.0f; 597e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_FLOAT fLineAscent = 0.0f, fBackupLineAscent = 0.0f; 598e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_FLOAT fLineDescent = 0.0f, fBackupLineDescent = 0.0f; 599e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_INT32 nWordStartPos = 0; 600e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_BOOL bFullWord = FALSE; 601e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_INT32 nLineFullWordIndex = 0; 602e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_INT32 nCharIndex = 0; 603e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPVT_LineInfo line; 604e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_FLOAT fWordWidth = 0; 605e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_FLOAT fTypesetWidth = FPDF_MAX(m_pVT->GetPlateWidth() - m_pVT->GetLineIndent(m_pSection->m_SecInfo), 0.0f); 606e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_INT32 nTotalWords = m_pSection->m_WordArray.GetSize(); 607e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_BOOL bOpened = FALSE; 608e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (nTotalWords > 0) { 609e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_INT32 i = 0; 610e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov while (i < nTotalWords) { 611e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPVT_WordInfo * pWord = m_pSection->m_WordArray.GetAt(i); 612e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPVT_WordInfo* pOldWord = pWord; 613e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (i > 0) { 614e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pOldWord = m_pSection->m_WordArray.GetAt(i - 1); 615e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 616e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pWord) { 617e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (bTypeset) { 618e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fLineAscent = FPDF_MAX(fLineAscent, m_pVT->GetWordAscent(*pWord, TRUE)); 619e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fLineDescent = FPDF_MIN(fLineDescent, m_pVT->GetWordDescent(*pWord, TRUE)); 620e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fWordWidth = m_pVT->GetWordWidth(*pWord); 621e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 622e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fLineAscent = FPDF_MAX(fLineAscent, m_pVT->GetWordAscent(*pWord, fFontSize)); 623e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fLineDescent = FPDF_MIN(fLineDescent, m_pVT->GetWordDescent(*pWord, fFontSize)); 624e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fWordWidth = m_pVT->GetWordWidth(pWord->nFontIndex, 625e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pWord->Word, 626e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_pVT->m_wSubWord, 627e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_pVT->m_fCharSpace, 628e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_pVT->m_nHorzScale, 629e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fFontSize, 630e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pWord->fWordTail, 631e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0); 632e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 633e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!bOpened) { 634e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (IsOpenStylePunctuation(pWord->Word)) { 635e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov bOpened = TRUE; 636e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov bFullWord = TRUE; 637e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else if (pOldWord != NULL) { 638e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (NeedDivision(pOldWord->Word, pWord->Word)) { 639e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov bFullWord = TRUE; 640e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 641e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 642e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 643e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!IsSpace(pWord->Word) && !IsOpenStylePunctuation(pWord->Word)) { 644e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov bOpened = FALSE; 645e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 646e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 647e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (bFullWord) { 648e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov bFullWord = FALSE; 649e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (nCharIndex > 0) { 650e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov nLineFullWordIndex ++; 651e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 652e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov nWordStartPos = i; 653e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fBackupLineWidth = fLineWidth; 654e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fBackupLineAscent = fLineAscent; 655e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fBackupLineDescent = fLineDescent; 656e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 657e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov nCharIndex++; 658e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 659e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (m_pVT->m_bLimitWidth && fTypesetWidth > 0 && 660e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fLineWidth + fWordWidth > fTypesetWidth) { 661e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (nLineFullWordIndex > 0) { 662e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov i = nWordStartPos; 663e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fLineWidth = fBackupLineWidth; 664e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fLineAscent = fBackupLineAscent; 665e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fLineDescent = fBackupLineDescent; 666e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 667e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (nCharIndex == 1) { 668e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fLineWidth = fWordWidth; 669e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov i++; 670e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 671e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov nLineTail = i - 1; 672e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (bTypeset) { 673e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov line.nBeginWordIndex = nLineHead; 674e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov line.nEndWordIndex = nLineTail; 675e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov line.nTotalWord = nLineTail - nLineHead + 1; 676e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov line.fLineWidth = fLineWidth; 677e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov line.fLineAscent = fLineAscent; 678e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov line.fLineDescent = fLineDescent; 679e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_pSection->AddLine(line); 680e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 681e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fMaxY += (fLineAscent + m_pVT->GetLineLeading(m_pSection->m_SecInfo)); 682e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fMaxY += (-fLineDescent); 683e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fMaxX = FPDF_MAX(fLineWidth, fMaxX); 684e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov nLineHead = i; 685e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fLineWidth = 0.0f; 686e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fLineAscent = 0.0f; 687e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fLineDescent = 0.0f; 688e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov nCharIndex = 0; 689e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov nLineFullWordIndex = 0; 690e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov bFullWord = FALSE; 691e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 692e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fLineWidth += fWordWidth; 693e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov i++; 694e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 695e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 696e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (nLineHead <= nTotalWords - 1) { 697e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov nLineTail = nTotalWords - 1; 698e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (bTypeset) { 699e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov line.nBeginWordIndex = nLineHead; 700e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov line.nEndWordIndex = nLineTail; 701e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov line.nTotalWord = nLineTail - nLineHead + 1; 702e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov line.fLineWidth = fLineWidth; 703e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov line.fLineAscent = fLineAscent; 704e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov line.fLineDescent = fLineDescent; 705e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_pSection->AddLine(line); 706e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 707e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fMaxY += (fLineAscent + m_pVT->GetLineLeading(m_pSection->m_SecInfo)); 708e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fMaxY += (-fLineDescent); 709e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fMaxX = FPDF_MAX(fLineWidth, fMaxX); 710e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 711e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 712e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (bTypeset) { 713e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fLineAscent = m_pVT->GetLineAscent(m_pSection->m_SecInfo); 714e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fLineDescent = m_pVT->GetLineDescent(m_pSection->m_SecInfo); 715e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 716e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fLineAscent = m_pVT->GetFontAscent(m_pVT->GetDefaultFontIndex(), fFontSize); 717e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fLineDescent = m_pVT->GetFontDescent(m_pVT->GetDefaultFontIndex(), fFontSize); 718e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 719e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (bTypeset) { 720e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov line.nBeginWordIndex = -1; 721e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov line.nEndWordIndex = -1; 722e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov line.nTotalWord = 0; 723e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov line.fLineWidth = 0; 724e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov line.fLineAscent = fLineAscent; 725e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov line.fLineDescent = fLineDescent; 726e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_pSection->AddLine(line); 727e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 728e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fMaxY += (m_pVT->GetLineLeading(m_pSection->m_SecInfo) + fLineAscent + (-fLineDescent)); 729e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 730e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_rcRet = CPVT_FloatRect(0, 0, fMaxX, fMaxY); 731e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 732e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CTypeset::OutputLines() 733e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 734e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ASSERT(m_pVT != NULL); 735e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ASSERT(m_pSection != NULL); 736e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_FLOAT fMinX = 0.0f, fMinY = 0.0f, fMaxX = 0.0f, fMaxY = 0.0f; 737e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_FLOAT fPosX = 0.0f, fPosY = 0.0f; 738e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_FLOAT fLineIndent = m_pVT->GetLineIndent(m_pSection->m_SecInfo); 739e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_FLOAT fTypesetWidth = FPDF_MAX(m_pVT->GetPlateWidth() - fLineIndent, 0.0f); 740e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov switch (m_pVT->GetAlignment(m_pSection->m_SecInfo)) { 741e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov default: 742e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case 0: 743e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fMinX = 0.0f; 744e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 745e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case 1: 746e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fMinX = (fTypesetWidth - m_rcRet.Width()) * PVT_HALF; 747e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 748e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case 2: 749e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fMinX = fTypesetWidth - m_rcRet.Width(); 750e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 751e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 752e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fMaxX = fMinX + m_rcRet.Width(); 753e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fMinY = 0.0f; 754e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fMaxY = m_rcRet.Height(); 755e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_INT32 nTotalLines = m_pSection->m_LineArray.GetSize(); 756e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (nTotalLines > 0) { 757e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_pSection->m_SecInfo.nTotalLine = nTotalLines; 758e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (FX_INT32 l = 0; l < nTotalLines; l++) { 759e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CLine * pLine = m_pSection->m_LineArray.GetAt(l)) { 760e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov switch (m_pVT->GetAlignment(m_pSection->m_SecInfo)) { 761e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov default: 762e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case 0: 763e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fPosX = 0; 764e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 765e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case 1: 766e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fPosX = (fTypesetWidth - pLine->m_LineInfo.fLineWidth) * PVT_HALF; 767e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 768e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case 2: 769e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fPosX = fTypesetWidth - pLine->m_LineInfo.fLineWidth; 770e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 771e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 772e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fPosX += fLineIndent; 773e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fPosY += m_pVT->GetLineLeading(m_pSection->m_SecInfo); 774e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fPosY += pLine->m_LineInfo.fLineAscent; 775e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pLine->m_LineInfo.fLineX = fPosX - fMinX; 776e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pLine->m_LineInfo.fLineY = fPosY - fMinY; 777e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (FX_INT32 w = pLine->m_LineInfo.nBeginWordIndex; w <= pLine->m_LineInfo.nEndWordIndex; w++) { 778e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CPVT_WordInfo * pWord = m_pSection->m_WordArray.GetAt(w)) { 779e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pWord->fWordX = fPosX - fMinX; 780e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pWord->pWordProps) { 781e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov switch (pWord->pWordProps->nScriptType) { 782e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov default: 783e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case PVTWORD_SCRIPT_NORMAL: 784e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pWord->fWordY = fPosY - fMinY; 785e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 786e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case PVTWORD_SCRIPT_SUPER: 787e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pWord->fWordY = fPosY - m_pVT->GetWordAscent(*pWord) - fMinY; 788e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 789e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case PVTWORD_SCRIPT_SUB: 790e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pWord->fWordY = fPosY - m_pVT->GetWordDescent(*pWord) - fMinY; 791e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 792e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 793e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 794e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pWord->fWordY = fPosY - fMinY; 795e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 796e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fPosX += m_pVT->GetWordWidth(*pWord); 797e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 798e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 799e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fPosY += (-pLine->m_LineInfo.fLineDescent); 800e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 801e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 802e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 803e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_rcRet = CPVT_FloatRect(fMinX, fMinY, fMaxX, fMaxY); 804e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 805e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPDF_VariableText::CPDF_VariableText() : 806e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_nLimitChar(0), 807e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_nCharArray(0), 808e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_bMultiLine(FALSE), 809e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_bLimitWidth(FALSE), 810e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_bAutoFontSize(FALSE), 811e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_nAlignment(0), 812e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_fLineLeading(0.0f), 813e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_fCharSpace(0.0f), 814e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_nHorzScale(100), 815e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_wSubWord(0), 816e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_fFontSize(0.0f), 817e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_bInitial(FALSE), 818e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_bRichText(FALSE), 819e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_pVTProvider(NULL), 820e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_pVTIterator(NULL) 821e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 822e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 823e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPDF_VariableText::~CPDF_VariableText() 824e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 825e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (m_pVTIterator) { 826e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov delete m_pVTIterator; 827e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_pVTIterator = NULL; 828e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 829e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ResetAll(); 830e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 831e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPDF_VariableText::Initialize() 832e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 833e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!m_bInitial) { 834e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPVT_SectionInfo secinfo; 835e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (m_bRichText) { 836e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov secinfo.pSecProps = new CPVT_SecProps(0.0f, 0.0f, 0); 837e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov secinfo.pWordProps = new CPVT_WordProps(GetDefaultFontIndex(), PVT_DEFAULT_FONTSIZE, 0, 0, 0); 838e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 839e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPVT_WordPlace place; 840e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov place.nSecIndex = 0; 841e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov AddSection(place, secinfo); 842e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPVT_LineInfo lineinfo; 843e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov lineinfo.fLineAscent = GetFontAscent(GetDefaultFontIndex(), GetFontSize()); 844e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov lineinfo.fLineDescent = GetFontDescent(GetDefaultFontIndex(), GetFontSize()); 845e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov AddLine(place, lineinfo); 846e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CSection * pSection = m_SectionArray.GetAt(0)) { 847e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pSection->ResetLinePlace(); 848e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 849e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_bInitial = TRUE; 850e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 851e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 852e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPDF_VariableText::ResetAll() 853e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 854e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_bInitial = FALSE; 855e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ResetSectionArray(); 856e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 857e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CPDF_VariableText::InsertWord(const CPVT_WordPlace & place, FX_WORD word, FX_INT32 charset, 858e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov const CPVT_WordProps * pWordProps) 859e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 860e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_INT32 nTotlaWords = this->GetTotalWords(); 861e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (m_nLimitChar > 0 && nTotlaWords >= m_nLimitChar) { 862e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return place; 863e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 864e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (m_nCharArray > 0 && nTotlaWords >= m_nCharArray) { 865e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return place; 866e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 867e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPVT_WordPlace newplace = place; 868e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov newplace.nWordIndex ++; 869e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (m_bRichText) { 870e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPVT_WordProps * pNewProps = pWordProps ? new CPVT_WordProps(*pWordProps) : new CPVT_WordProps(); 871e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pNewProps->nFontIndex = GetWordFontIndex(word, charset, pWordProps->nFontIndex); 872e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return AddWord(newplace, CPVT_WordInfo(word, charset, -1, pNewProps)); 873e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 874e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_INT32 nFontIndex = GetSubWord() > 0 ? GetDefaultFontIndex() : GetWordFontIndex(word, charset, GetDefaultFontIndex()); 875e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return AddWord(newplace, CPVT_WordInfo(word, charset, nFontIndex, NULL)); 876e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 877e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return place; 878e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 879e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CPDF_VariableText::InsertSection(const CPVT_WordPlace & place, const CPVT_SecProps * pSecProps, 880e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov const CPVT_WordProps * pWordProps) 881e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 882e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_INT32 nTotlaWords = this->GetTotalWords(); 883e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (m_nLimitChar > 0 && nTotlaWords >= m_nLimitChar) { 884e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return place; 885e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 886e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (m_nCharArray > 0 && nTotlaWords >= m_nCharArray) { 887e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return place; 888e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 889e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!m_bMultiLine) { 890e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return place; 891e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 892e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPVT_WordPlace wordplace = place; 893e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov UpdateWordPlace(wordplace); 894e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPVT_WordPlace newplace = place; 895e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CSection * pSection = m_SectionArray.GetAt(wordplace.nSecIndex)) { 896e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPVT_WordPlace NewPlace(wordplace.nSecIndex + 1, 0, -1); 897e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPVT_SectionInfo secinfo; 898e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (m_bRichText) { 899e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pSecProps) { 900e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov secinfo.pSecProps = new CPVT_SecProps(*pSecProps); 901e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 902e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pWordProps) { 903e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov secinfo.pWordProps = new CPVT_WordProps(*pWordProps); 904e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 905e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 906e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov AddSection(NewPlace, secinfo); 907e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov newplace = NewPlace; 908e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CSection * pNewSection = m_SectionArray.GetAt(NewPlace.nSecIndex)) { 909e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (FX_INT32 w = wordplace.nWordIndex + 1, sz = pSection->m_WordArray.GetSize(); w < sz; w++) { 910e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CPVT_WordInfo * pWord = pSection->m_WordArray.GetAt(w)) { 911e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov NewPlace.nWordIndex++; 912e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pNewSection->AddWord(NewPlace, *pWord); 913e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 914e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 915e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 916e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ClearSectionRightWords(wordplace); 917e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 918e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return newplace; 919e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 920e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CPDF_VariableText::InsertText(const CPVT_WordPlace & place, FX_LPCWSTR text, FX_INT32 charset, 921e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov const CPVT_SecProps * pSecProps, const CPVT_WordProps * pProps) 922e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 923e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CFX_WideString swText = text; 924e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPVT_WordPlace wp = place; 925e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (FX_INT32 i = 0, sz = swText.GetLength(); i < sz; i++) { 926e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPVT_WordPlace oldwp = wp; 927e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_WORD word = swText.GetAt(i); 928e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov switch (word) { 929e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case 0x0D: 930e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (m_bMultiLine) { 931e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (swText.GetAt(i + 1) == 0x0A) { 932e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov i += 1; 933e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 934e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov wp = InsertSection(wp, pSecProps, pProps); 935e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 936e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 937e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case 0x0A: 938e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (m_bMultiLine) { 939e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (swText.GetAt(i + 1) == 0x0D) { 940e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov i += 1; 941e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 942e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov wp = InsertSection(wp, pSecProps, pProps); 943e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 944e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 945e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case 0x09: 946e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov word = 0x20; 947e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov default: 948e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov wp = InsertWord(wp, word, charset, pProps); 949e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 950e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 951e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (wp == oldwp) { 952e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 953e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 954e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 955e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return wp; 956e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 957e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CPDF_VariableText::DeleteWords(const CPVT_WordRange & PlaceRange) 958e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 959e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_BOOL bLastSecPos = FALSE; 960e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CSection * pSection = m_SectionArray.GetAt(PlaceRange.EndPos.nSecIndex)) { 961e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov bLastSecPos = (PlaceRange.EndPos == pSection->GetEndWordPlace()); 962e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 963e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ClearWords(PlaceRange); 964e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (PlaceRange.BeginPos.nSecIndex != PlaceRange.EndPos.nSecIndex) { 965e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ClearEmptySections(PlaceRange); 966e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!bLastSecPos) { 967e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov LinkLatterSection(PlaceRange.BeginPos); 968e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 969e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 970e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return PlaceRange.BeginPos; 971e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 972e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CPDF_VariableText::DeleteWord(const CPVT_WordPlace & place) 973e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 974e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return ClearRightWord(AjustLineHeader(place, TRUE)); 975e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 976e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CPDF_VariableText::BackSpaceWord(const CPVT_WordPlace & place) 977e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 978e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return ClearLeftWord(AjustLineHeader(place, TRUE)); 979e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 980e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPDF_VariableText::SetText(FX_LPCWSTR text, FX_INT32 charset, const CPVT_SecProps * pSecProps, 981e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov const CPVT_WordProps * pWordProps) 982e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 983e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov DeleteWords(CPVT_WordRange(GetBeginWordPlace(), GetEndWordPlace())); 984e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CFX_WideString swText = text; 985e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPVT_WordPlace wp(0, 0, -1); 986e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPVT_SectionInfo secinfo; 987e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (m_bRichText) { 988e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pSecProps) { 989e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov secinfo.pSecProps = new CPVT_SecProps(*pSecProps); 990e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 991e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pWordProps) { 992e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov secinfo.pWordProps = new CPVT_WordProps(*pWordProps); 993e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 994e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 995e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CSection * pSection = m_SectionArray.GetAt(0)) { 996e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pSection->m_SecInfo = secinfo; 997e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 998e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_INT32 nCharCount = 0; 999e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (FX_INT32 i = 0, sz = swText.GetLength(); i < sz; i++) { 1000e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (m_nLimitChar > 0 && nCharCount >= m_nLimitChar) { 1001e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 1002e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1003e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (m_nCharArray > 0 && nCharCount >= m_nCharArray) { 1004e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 1005e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1006e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_WORD word = swText.GetAt(i); 1007e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov switch (word) { 1008e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case 0x0D: 1009e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (m_bMultiLine) { 1010e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (swText.GetAt(i + 1) == 0x0A) { 1011e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov i += 1; 1012e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1013e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov wp.nSecIndex ++; 1014e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov wp.nLineIndex = 0; 1015e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov wp.nWordIndex = -1; 1016e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov AddSection(wp, secinfo); 1017e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1018e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 1019e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case 0x0A: 1020e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (m_bMultiLine) { 1021e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (swText.GetAt(i + 1) == 0x0D) { 1022e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov i += 1; 1023e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1024e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov wp.nSecIndex ++; 1025e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov wp.nLineIndex = 0; 1026e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov wp.nWordIndex = -1; 1027e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov AddSection(wp, secinfo); 1028e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1029e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 1030e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case 0x09: 1031e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov word = 0x20; 1032e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov default: 1033e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov wp = InsertWord(wp, word, charset, pWordProps); 1034e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 1035e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1036e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov nCharCount++; 1037e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1038e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1039e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPDF_VariableText::UpdateWordPlace(CPVT_WordPlace & place) const 1040e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1041e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (place.nSecIndex < 0) { 1042e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov place = GetBeginWordPlace(); 1043e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1044e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (place.nSecIndex >= m_SectionArray.GetSize()) { 1045e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov place = GetEndWordPlace(); 1046e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1047e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov place = AjustLineHeader(place, TRUE); 1048e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) { 1049e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pSection->UpdateWordPlace(place); 1050e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1051e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1052e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_INT32 CPDF_VariableText::WordPlaceToWordIndex(const CPVT_WordPlace & place) const 1053e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1054e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPVT_WordPlace newplace = place; 1055e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov UpdateWordPlace(newplace); 1056e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_INT32 nIndex = 0; 1057e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_INT32 i = 0; 1058e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_INT32 sz = 0; 1059e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (i = 0, sz = m_SectionArray.GetSize(); i < sz && i < newplace.nSecIndex; i++) { 1060e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CSection * pSection = m_SectionArray.GetAt(i)) { 1061e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov nIndex += pSection->m_WordArray.GetSize(); 1062e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (i != m_SectionArray.GetSize() - 1) { 1063e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov nIndex += PVT_RETURN_LENGTH; 1064e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1065e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1066e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1067e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (i >= 0 && i < m_SectionArray.GetSize()) { 1068e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov nIndex += newplace.nWordIndex + PVT_RETURN_LENGTH; 1069e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1070e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return nIndex; 1071e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1072e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CPDF_VariableText::WordIndexToWordPlace(FX_INT32 index) const 1073e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1074e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPVT_WordPlace place = GetBeginWordPlace(); 1075e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_INT32 nOldIndex = 0 , nIndex = 0; 1076e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_BOOL bFind = FALSE; 1077e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (FX_INT32 i = 0, sz = m_SectionArray.GetSize(); i < sz; i++) { 1078e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CSection * pSection = m_SectionArray.GetAt(i)) { 1079e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov nIndex += pSection->m_WordArray.GetSize(); 1080e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (nIndex == index) { 1081e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov place = pSection->GetEndWordPlace(); 1082e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov bFind = TRUE; 1083e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 1084e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else if (nIndex > index) { 1085e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov place.nSecIndex = i; 1086e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov place.nWordIndex = index - nOldIndex - 1; 1087e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pSection->UpdateWordPlace(place); 1088e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov bFind = TRUE; 1089e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 1090e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1091e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (i != m_SectionArray.GetSize() - 1) { 1092e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov nIndex += PVT_RETURN_LENGTH; 1093e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1094e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov nOldIndex = nIndex; 1095e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1096e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1097e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!bFind) { 1098e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov place = GetEndWordPlace(); 1099e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1100e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return place; 1101e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1102e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CPDF_VariableText::GetBeginWordPlace() const 1103e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1104e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return m_bInitial ? CPVT_WordPlace(0, 0, -1) : CPVT_WordPlace(); 1105e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1106e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CPDF_VariableText::GetEndWordPlace() const 1107e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1108e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CSection * pSection = m_SectionArray.GetAt(m_SectionArray.GetSize() - 1)) { 1109e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return pSection->GetEndWordPlace(); 1110e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1111e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return CPVT_WordPlace(); 1112e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1113e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CPDF_VariableText::GetPrevWordPlace(const CPVT_WordPlace & place) const 1114e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1115e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if( place.nSecIndex < 0) { 1116e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return GetBeginWordPlace(); 1117e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1118e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (place.nSecIndex >= m_SectionArray.GetSize()) { 1119e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return GetEndWordPlace(); 1120e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1121e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) { 1122e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (place.WordCmp(pSection->GetBeginWordPlace()) <= 0) { 1123e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CSection * pPrevSection = m_SectionArray.GetAt(place.nSecIndex - 1)) { 1124e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return pPrevSection->GetEndWordPlace(); 1125e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 1126e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return GetBeginWordPlace(); 1127e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1128e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 1129e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return pSection->GetPrevWordPlace(place); 1130e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1131e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1132e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return place; 1133e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1134e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CPDF_VariableText::GetNextWordPlace(const CPVT_WordPlace & place) const 1135e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1136e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (place.nSecIndex < 0) { 1137e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return GetBeginWordPlace(); 1138e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1139e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (place.nSecIndex >= m_SectionArray.GetSize()) { 1140e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return GetEndWordPlace(); 1141e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1142e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) { 1143e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (place.WordCmp(pSection->GetEndWordPlace()) >= 0) { 1144e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CSection * pNextSection = m_SectionArray.GetAt(place.nSecIndex + 1)) { 1145e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return pNextSection->GetBeginWordPlace(); 1146e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 1147e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return GetEndWordPlace(); 1148e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1149e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 1150e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return pSection->GetNextWordPlace(place); 1151e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1152e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1153e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return place; 1154e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1155e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CPDF_VariableText::SearchWordPlace(const CPDF_Point & point) const 1156e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1157e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPDF_Point pt = OutToIn(point); 1158e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPVT_WordPlace place = GetBeginWordPlace(); 1159e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_INT32 nLeft = 0; 1160e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_INT32 nRight = m_SectionArray.GetSize() - 1; 1161e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_INT32 nMid = m_SectionArray.GetSize() / 2; 1162e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_BOOL bUp = TRUE; 1163e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_BOOL bDown = TRUE; 1164e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov while (nLeft <= nRight) { 1165e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CSection * pSection = m_SectionArray.GetAt(nMid)) { 1166e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (IsFloatBigger(pt.y, pSection->m_SecInfo.rcSection.top)) { 1167e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov bUp = FALSE; 1168e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1169e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (IsFloatBigger(pSection->m_SecInfo.rcSection.bottom, pt.y)) { 1170e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov bDown = FALSE; 1171e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1172e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (IsFloatSmaller(pt.y, pSection->m_SecInfo.rcSection.top)) { 1173e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov nRight = nMid - 1; 1174e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov nMid = (nLeft + nRight) / 2; 1175e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov continue; 1176e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else if (IsFloatBigger(pt.y, pSection->m_SecInfo.rcSection.bottom)) { 1177e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov nLeft = nMid + 1; 1178e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov nMid = (nLeft + nRight) / 2; 1179e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov continue; 1180e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 1181e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov place = pSection->SearchWordPlace( 1182e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPDF_Point(pt.x - pSection->m_SecInfo.rcSection.left, pt.y - pSection->m_SecInfo.rcSection.top) 1183e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ); 1184e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov place.nSecIndex = nMid; 1185e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return place; 1186e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1187e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 1188e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 1189e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1190e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1191e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (bUp) { 1192e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov place = GetBeginWordPlace(); 1193e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1194e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (bDown) { 1195e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov place = GetEndWordPlace(); 1196e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1197e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return place; 1198e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1199e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CPDF_VariableText::GetUpWordPlace(const CPVT_WordPlace & place, const CPDF_Point & point) const 1200e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1201e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) { 1202e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPVT_WordPlace temp = place; 1203e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPDF_Point pt = OutToIn(point); 1204e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (temp.nLineIndex-- > 0) { 1205e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return pSection->SearchWordPlace(pt.x - pSection->m_SecInfo.rcSection.left, temp); 1206e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 1207e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (temp.nSecIndex-- > 0) { 1208e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CSection * pLastSection = m_SectionArray.GetAt(temp.nSecIndex)) { 1209e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov temp.nLineIndex = pLastSection->m_LineArray.GetSize() - 1; 1210e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return pLastSection->SearchWordPlace(pt.x - pLastSection->m_SecInfo.rcSection.left, temp); 1211e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1212e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1213e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1214e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1215e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return place; 1216e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1217e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CPDF_VariableText::GetDownWordPlace(const CPVT_WordPlace & place, const CPDF_Point & point) const 1218e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1219e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) { 1220e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPVT_WordPlace temp = place; 1221e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPDF_Point pt = OutToIn(point); 1222e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (temp.nLineIndex++ < pSection->m_LineArray.GetSize() - 1) { 1223e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return pSection->SearchWordPlace(pt.x - pSection->m_SecInfo.rcSection.left, temp); 1224e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 1225e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (temp.nSecIndex++ < m_SectionArray.GetSize() - 1) { 1226e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CSection * pNextSection = m_SectionArray.GetAt(temp.nSecIndex)) { 1227e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov temp.nLineIndex = 0; 1228e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return pNextSection->SearchWordPlace(pt.x - pSection->m_SecInfo.rcSection.left, temp); 1229e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1230e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1231e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1232e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1233e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return place; 1234e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1235e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CPDF_VariableText::GetLineBeginPlace(const CPVT_WordPlace & place) const 1236e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1237e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, -1); 1238e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1239e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CPDF_VariableText::GetLineEndPlace(const CPVT_WordPlace & place) const 1240e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1241e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) 1242e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CLine * pLine = pSection->m_LineArray.GetAt(place.nLineIndex)) { 1243e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return pLine->GetEndWordPlace(); 1244e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1245e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return place; 1246e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1247e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CPDF_VariableText::GetSectionBeginPlace(const CPVT_WordPlace & place) const 1248e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1249e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return CPVT_WordPlace(place.nSecIndex, 0, -1); 1250e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1251e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CPDF_VariableText::GetSectionEndPlace(const CPVT_WordPlace & place) const 1252e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1253e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) { 1254e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return pSection->GetEndWordPlace(); 1255e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1256e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return place; 1257e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1258e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_INT32 CPDF_VariableText::GetTotalWords() const 1259e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1260e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_INT32 nTotal = 0; 1261e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (FX_INT32 i = 0, sz = m_SectionArray.GetSize(); i < sz; i++) 1262e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CSection * pSection = m_SectionArray.GetAt(i)) { 1263e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov nTotal += (pSection->m_WordArray.GetSize() + PVT_RETURN_LENGTH); 1264e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1265e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return nTotal - PVT_RETURN_LENGTH; 1266e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1267e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPDF_VariableText::ResetSectionArray() 1268e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1269e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (FX_INT32 s = 0, sz = m_SectionArray.GetSize(); s < sz; s++) { 1270e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov delete m_SectionArray.GetAt(s); 1271e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1272e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_SectionArray.RemoveAll(); 1273e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1274e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CPDF_VariableText::AddSection(const CPVT_WordPlace & place, const CPVT_SectionInfo & secinfo) 1275e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1276e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (IsValid() && !m_bMultiLine) { 1277e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return place; 1278e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1279e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_INT32 nSecIndex = FPDF_MAX(FPDF_MIN(place.nSecIndex, m_SectionArray.GetSize()), 0); 1280e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CSection * pSection = new CSection(this); 1281e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pSection->m_SecInfo = secinfo; 1282e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pSection->SecPlace.nSecIndex = nSecIndex; 1283e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (nSecIndex == m_SectionArray.GetSize()) { 1284e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_SectionArray.Add(pSection); 1285e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 1286e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_SectionArray.InsertAt(nSecIndex, pSection); 1287e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1288e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return place; 1289e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1290e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CPDF_VariableText::AddLine(const CPVT_WordPlace & place, const CPVT_LineInfo & lineinfo) 1291e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1292e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (m_SectionArray.IsEmpty()) { 1293e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return place; 1294e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1295e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) { 1296e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return pSection->AddLine(lineinfo); 1297e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1298e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return place; 1299e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1300e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CPDF_VariableText::AddWord(const CPVT_WordPlace & place, const CPVT_WordInfo & wordinfo) 1301e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1302e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (m_SectionArray.GetSize() <= 0) { 1303e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return place; 1304e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1305e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPVT_WordPlace newplace = place; 1306e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov newplace.nSecIndex = FPDF_MAX(FPDF_MIN(newplace.nSecIndex, m_SectionArray.GetSize() - 1), 0); 1307e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CSection * pSection = m_SectionArray.GetAt(newplace.nSecIndex)) { 1308e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return pSection->AddWord(newplace, wordinfo); 1309e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1310e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return place; 1311e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1312e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL CPDF_VariableText::GetWordInfo(const CPVT_WordPlace & place, CPVT_WordInfo & wordinfo) 1313e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1314e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) { 1315e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CPVT_WordInfo * pWord = pSection->m_WordArray.GetAt(place.nWordIndex)) { 1316e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov wordinfo = *pWord; 1317e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 1318e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1319e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1320e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 1321e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1322e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL CPDF_VariableText::SetWordInfo(const CPVT_WordPlace & place, const CPVT_WordInfo & wordinfo) 1323e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1324e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) { 1325e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CPVT_WordInfo * pWord = pSection->m_WordArray.GetAt(place.nWordIndex)) { 1326e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *pWord = wordinfo; 1327e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 1328e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1329e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1330e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 1331e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1332e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL CPDF_VariableText::GetLineInfo(const CPVT_WordPlace & place, CPVT_LineInfo & lineinfo) 1333e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1334e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) { 1335e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CLine * pLine = pSection->m_LineArray.GetAt(place.nLineIndex)) { 1336e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov lineinfo = pLine->m_LineInfo; 1337e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 1338e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1339e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1340e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 1341e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1342e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL CPDF_VariableText::GetSectionInfo(const CPVT_WordPlace & place, CPVT_SectionInfo & secinfo) 1343e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1344e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) { 1345e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov secinfo = pSection->m_SecInfo; 1346e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 1347e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1348e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 1349e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1350e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPDF_Rect CPDF_VariableText::GetContentRect() const 1351e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1352e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return InToOut(CPDF_EditContainer::GetContentRect()); 1353e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1354e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_FLOAT CPDF_VariableText::GetWordFontSize(const CPVT_WordInfo & WordInfo, FX_BOOL bFactFontSize) 1355e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1356e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return m_bRichText && WordInfo.pWordProps ? (WordInfo.pWordProps->nScriptType == PVTWORD_SCRIPT_NORMAL || bFactFontSize ? WordInfo.pWordProps->fFontSize : WordInfo.pWordProps->fFontSize * PVT_HALF) : GetFontSize(); 1357e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1358e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_INT32 CPDF_VariableText::GetWordFontIndex(const CPVT_WordInfo & WordInfo) 1359e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1360e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return m_bRichText && WordInfo.pWordProps ? WordInfo.pWordProps->nFontIndex : WordInfo.nFontIndex; 1361e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1362e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_FLOAT CPDF_VariableText::GetWordWidth(FX_INT32 nFontIndex, FX_WORD Word, FX_WORD SubWord, 1363e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_FLOAT fCharSpace, FX_INT32 nHorzScale, 1364e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_FLOAT fFontSize, FX_FLOAT fWordTail, FX_INT32 nWordStyle) 1365e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1366e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return (GetCharWidth(nFontIndex, Word, SubWord, nWordStyle) * fFontSize * PVT_FONTSCALE + fCharSpace) * nHorzScale * PVT_PERCENT + fWordTail; 1367e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1368e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_FLOAT CPDF_VariableText::GetWordWidth(const CPVT_WordInfo & WordInfo) 1369e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1370e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return GetWordWidth(GetWordFontIndex(WordInfo), WordInfo.Word, GetSubWord(), GetCharSpace(WordInfo), GetHorzScale(WordInfo), 1371e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov GetWordFontSize(WordInfo), WordInfo.fWordTail, 1372e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov WordInfo.pWordProps ? WordInfo.pWordProps->nWordStyle : 0); 1373e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1374e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_FLOAT CPDF_VariableText::GetLineAscent(const CPVT_SectionInfo & SecInfo) 1375e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1376e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return m_bRichText && SecInfo.pWordProps ? GetFontAscent(SecInfo.pWordProps->nFontIndex, SecInfo.pWordProps->fFontSize) : 1377e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov GetFontAscent(GetDefaultFontIndex(), GetFontSize()); 1378e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1379e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_FLOAT CPDF_VariableText::GetLineDescent(const CPVT_SectionInfo & SecInfo) 1380e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1381e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return m_bRichText && SecInfo.pWordProps ? GetFontDescent(SecInfo.pWordProps->nFontIndex, SecInfo.pWordProps->fFontSize) : 1382e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov GetFontDescent(GetDefaultFontIndex(), GetFontSize()); 1383e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1384e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_FLOAT CPDF_VariableText::GetFontAscent(FX_INT32 nFontIndex, FX_FLOAT fFontSize) 1385e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1386e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return (FX_FLOAT)GetTypeAscent(nFontIndex) * fFontSize * PVT_FONTSCALE; 1387e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1388e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_FLOAT CPDF_VariableText::GetFontDescent(FX_INT32 nFontIndex, FX_FLOAT fFontSize) 1389e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1390e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return (FX_FLOAT)GetTypeDescent(nFontIndex) * fFontSize * PVT_FONTSCALE; 1391e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1392e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_FLOAT CPDF_VariableText::GetWordAscent(const CPVT_WordInfo & WordInfo, FX_FLOAT fFontSize) 1393e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1394e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return GetFontAscent(GetWordFontIndex(WordInfo), fFontSize); 1395e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1396e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_FLOAT CPDF_VariableText::GetWordDescent(const CPVT_WordInfo & WordInfo, FX_FLOAT fFontSize) 1397e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1398e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return GetFontDescent(GetWordFontIndex(WordInfo), fFontSize); 1399e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1400e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_FLOAT CPDF_VariableText::GetWordAscent(const CPVT_WordInfo & WordInfo, FX_BOOL bFactFontSize) 1401e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1402e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return GetFontAscent(GetWordFontIndex(WordInfo), GetWordFontSize(WordInfo, bFactFontSize)); 1403e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1404e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_FLOAT CPDF_VariableText::GetWordDescent(const CPVT_WordInfo & WordInfo, FX_BOOL bFactFontSize) 1405e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1406e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return GetFontDescent(GetWordFontIndex(WordInfo), GetWordFontSize(WordInfo, bFactFontSize)); 1407e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1408e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_FLOAT CPDF_VariableText::GetLineLeading(const CPVT_SectionInfo & SecInfo) 1409e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1410e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return m_bRichText && SecInfo.pSecProps ? SecInfo.pSecProps->fLineLeading : m_fLineLeading; 1411e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1412e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_FLOAT CPDF_VariableText::GetLineIndent(const CPVT_SectionInfo & SecInfo) 1413e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1414e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return m_bRichText && SecInfo.pSecProps ? SecInfo.pSecProps->fLineIndent : 0.0f; 1415e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1416e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_INT32 CPDF_VariableText::GetAlignment(const CPVT_SectionInfo& SecInfo) 1417e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1418e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return m_bRichText && SecInfo.pSecProps ? SecInfo.pSecProps->nAlignment : this->m_nAlignment; 1419e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1420e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_FLOAT CPDF_VariableText::GetCharSpace(const CPVT_WordInfo & WordInfo) 1421e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1422e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return m_bRichText && WordInfo.pWordProps ? WordInfo.pWordProps->fCharSpace : m_fCharSpace; 1423e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1424e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_INT32 CPDF_VariableText::GetHorzScale(const CPVT_WordInfo & WordInfo) 1425e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1426e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return m_bRichText && WordInfo.pWordProps ? WordInfo.pWordProps->nHorzScale : m_nHorzScale; 1427e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1428e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPDF_VariableText::ClearSectionRightWords(const CPVT_WordPlace & place) 1429e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1430e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPVT_WordPlace wordplace = AjustLineHeader(place, TRUE); 1431e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) { 1432e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (FX_INT32 w = pSection->m_WordArray.GetSize() - 1; w > wordplace.nWordIndex; w--) { 1433e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov delete pSection->m_WordArray.GetAt(w); 1434e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pSection->m_WordArray.RemoveAt(w); 1435e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1436e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1437e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1438e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CPDF_VariableText::AjustLineHeader(const CPVT_WordPlace & place, FX_BOOL bPrevOrNext) const 1439e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1440e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (place.nWordIndex < 0 && place.nLineIndex > 0) { 1441e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (bPrevOrNext) { 1442e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return GetPrevWordPlace(place); 1443e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 1444e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return GetNextWordPlace(place); 1445e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1446e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1447e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return place; 1448e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1449e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL CPDF_VariableText::ClearEmptySection(const CPVT_WordPlace & place) 1450e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1451e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (place.nSecIndex == 0 && m_SectionArray.GetSize() == 1) { 1452e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 1453e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1454e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) { 1455e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pSection->m_WordArray.GetSize() == 0) { 1456e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov delete pSection; 1457e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_SectionArray.RemoveAt(place.nSecIndex); 1458e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 1459e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1460e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1461e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 1462e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1463e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPDF_VariableText::ClearEmptySections(const CPVT_WordRange & PlaceRange) 1464e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1465e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPVT_WordPlace wordplace; 1466e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (FX_INT32 s = PlaceRange.EndPos.nSecIndex; s > PlaceRange.BeginPos.nSecIndex; s--) { 1467e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov wordplace.nSecIndex = s; 1468e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ClearEmptySection(wordplace); 1469e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1470e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1471e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPDF_VariableText::LinkLatterSection(const CPVT_WordPlace & place) 1472e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1473e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPVT_WordPlace oldplace = AjustLineHeader(place, TRUE); 1474e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CSection * pNextSection = m_SectionArray.GetAt(place.nSecIndex + 1)) { 1475e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CSection * pSection = m_SectionArray.GetAt(oldplace.nSecIndex)) { 1476e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (FX_INT32 w = 0, sz = pNextSection->m_WordArray.GetSize(); w < sz; w++) { 1477e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CPVT_WordInfo * pWord = pNextSection->m_WordArray.GetAt(w)) { 1478e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov oldplace.nWordIndex ++; 1479e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pSection->AddWord(oldplace, *pWord); 1480e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1481e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1482e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1483e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov delete pNextSection; 1484e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_SectionArray.RemoveAt(place.nSecIndex + 1); 1485e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1486e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1487e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPDF_VariableText::ClearWords(const CPVT_WordRange & PlaceRange) 1488e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1489e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPVT_WordRange NewRange; 1490e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov NewRange.BeginPos = AjustLineHeader(PlaceRange.BeginPos, TRUE); 1491e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov NewRange.EndPos = AjustLineHeader(PlaceRange.EndPos, TRUE); 1492e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (FX_INT32 s = NewRange.EndPos.nSecIndex; s >= NewRange.BeginPos.nSecIndex; s--) { 1493e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CSection * pSection = m_SectionArray.GetAt(s)) { 1494e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pSection->ClearWords(NewRange); 1495e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1496e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1497e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1498e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CPDF_VariableText::ClearLeftWord(const CPVT_WordPlace & place) 1499e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1500e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) { 1501e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPVT_WordPlace leftplace = this->GetPrevWordPlace(place); 1502e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (leftplace != place) { 1503e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (leftplace.nSecIndex != place.nSecIndex) { 1504e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pSection->m_WordArray.GetSize() == 0) { 1505e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov this->ClearEmptySection(place); 1506e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 1507e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov this->LinkLatterSection(leftplace); 1508e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1509e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 1510e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pSection->ClearWord(place); 1511e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1512e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1513e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return leftplace; 1514e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1515e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return place; 1516e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1517e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CPDF_VariableText::ClearRightWord(const CPVT_WordPlace & place) 1518e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1519e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) { 1520e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPVT_WordPlace rightplace = AjustLineHeader(this->GetNextWordPlace(place), FALSE); 1521e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (rightplace != place) { 1522e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if(rightplace.nSecIndex != place.nSecIndex) { 1523e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov LinkLatterSection(place); 1524e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 1525e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pSection->ClearWord(rightplace); 1526e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1527e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1528e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1529e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return place; 1530e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1531e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPDF_VariableText::RearrangeAll() 1532e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1533e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov Rearrange(CPVT_WordRange(GetBeginWordPlace(), GetEndWordPlace())); 1534e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1535e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPDF_VariableText::RearrangePart(const CPVT_WordRange & PlaceRange) 1536e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1537e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov Rearrange(PlaceRange); 1538e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1539e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_FloatRect CPDF_VariableText::Rearrange(const CPVT_WordRange & PlaceRange) 1540e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1541e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPVT_FloatRect rcRet; 1542e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (IsValid()) { 1543e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (m_bAutoFontSize) { 1544e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov SetFontSize(GetAutoFontSize()); 1545e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov rcRet = RearrangeSections(CPVT_WordRange(GetBeginWordPlace(), GetEndWordPlace())); 1546e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 1547e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov rcRet = RearrangeSections(PlaceRange); 1548e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1549e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1550e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov SetContentRect(rcRet); 1551e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return rcRet; 1552e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1553e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_FLOAT CPDF_VariableText::GetAutoFontSize() 1554e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1555e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_INT32 nTotal = sizeof(gFontSizeSteps) / sizeof(FX_BYTE); 1556e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (IsMultiLine()) { 1557e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov nTotal /= 4; 1558e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1559e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (nTotal <= 0) { 1560e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return 0; 1561e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1562e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (GetPlateWidth() <= 0) { 1563e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return 0; 1564e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1565e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_INT32 nLeft = 0; 1566e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_INT32 nRight = nTotal - 1; 1567e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_INT32 nMid = nTotal / 2; 1568e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov while (nLeft <= nRight) { 1569e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (IsBigger(gFontSizeSteps[nMid])) { 1570e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov nRight = nMid - 1; 1571e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov nMid = (nLeft + nRight) / 2; 1572e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov continue; 1573e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 1574e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov nLeft = nMid + 1; 1575e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov nMid = (nLeft + nRight) / 2; 1576e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov continue; 1577e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1578e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1579e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return (FX_FLOAT)gFontSizeSteps[nMid]; 1580e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1581e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL CPDF_VariableText::IsBigger(FX_FLOAT fFontSize) 1582e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1583e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_BOOL bBigger = FALSE; 1584e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPVT_Size szTotal; 1585e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (FX_INT32 s = 0, sz = m_SectionArray.GetSize(); s < sz; s++) { 1586e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CSection * pSection = m_SectionArray.GetAt(s)) { 1587e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPVT_Size size = pSection->GetSectionSize(fFontSize); 1588e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov szTotal.x = FPDF_MAX(size.x, szTotal.x); 1589e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov szTotal.y += size.y; 1590e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (IsFloatBigger(szTotal.x, GetPlateWidth()) 1591e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov || IsFloatBigger(szTotal.y, GetPlateHeight()) 1592e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ) { 1593e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov bBigger = TRUE; 1594e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 1595e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1596e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1597e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1598e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return bBigger; 1599e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1600e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_FloatRect CPDF_VariableText::RearrangeSections(const CPVT_WordRange & PlaceRange) 1601e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1602e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPVT_WordPlace place; 1603e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_FLOAT fPosY = 0; 1604e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_FLOAT fOldHeight; 1605e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_INT32 nSSecIndex = PlaceRange.BeginPos.nSecIndex; 1606e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_INT32 nESecIndex = PlaceRange.EndPos.nSecIndex; 1607e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPVT_FloatRect rcRet; 1608e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (FX_INT32 s = 0, sz = m_SectionArray.GetSize(); s < sz; s++) { 1609e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov place.nSecIndex = s; 1610e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CSection * pSection = m_SectionArray.GetAt(s)) { 1611e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pSection->SecPlace = place; 1612e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPVT_FloatRect rcSec = pSection->m_SecInfo.rcSection; 1613e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (s >= nSSecIndex) { 1614e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (s <= nESecIndex) { 1615e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov rcSec = pSection->Rearrange(); 1616e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov rcSec.top += fPosY; 1617e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov rcSec.bottom += fPosY; 1618e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 1619e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fOldHeight = pSection->m_SecInfo.rcSection.bottom - pSection->m_SecInfo.rcSection.top; 1620e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov rcSec.top = fPosY; 1621e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov rcSec.bottom = fPosY + fOldHeight; 1622e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1623e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pSection->m_SecInfo.rcSection = rcSec; 1624e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pSection->ResetLinePlace(); 1625e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1626e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (s == 0) { 1627e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov rcRet = rcSec; 1628e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 1629e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov rcRet.left = FPDF_MIN(rcSec.left, rcRet.left); 1630e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov rcRet.top = FPDF_MIN(rcSec.top, rcRet.top); 1631e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov rcRet.right = FPDF_MAX(rcSec.right, rcRet.right); 1632e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov rcRet.bottom = FPDF_MAX(rcSec.bottom, rcRet.bottom); 1633e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1634e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fPosY += rcSec.Height(); 1635e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1636e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1637e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return rcRet; 1638e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1639e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_INT32 CPDF_VariableText::GetCharWidth(FX_INT32 nFontIndex, FX_WORD Word, FX_WORD SubWord, FX_INT32 nWordStyle) 1640e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1641e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (m_pVTProvider) { 1642e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (SubWord > 0) { 1643e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return m_pVTProvider->GetCharWidth(nFontIndex, SubWord, nWordStyle); 1644e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 1645e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return m_pVTProvider->GetCharWidth(nFontIndex, Word, nWordStyle); 1646e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1647e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1648e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return 0; 1649e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1650e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_INT32 CPDF_VariableText::GetTypeAscent(FX_INT32 nFontIndex) 1651e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1652e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return m_pVTProvider ? m_pVTProvider->GetTypeAscent(nFontIndex) : 0; 1653e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1654e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_INT32 CPDF_VariableText::GetTypeDescent(FX_INT32 nFontIndex) 1655e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1656e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return m_pVTProvider ? m_pVTProvider->GetTypeDescent(nFontIndex) : 0; 1657e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1658e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_INT32 CPDF_VariableText::GetWordFontIndex(FX_WORD word, FX_INT32 charset, FX_INT32 nFontIndex) 1659e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1660e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return m_pVTProvider ? m_pVTProvider->GetWordFontIndex(word, charset, nFontIndex) : -1; 1661e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1662e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_INT32 CPDF_VariableText::GetDefaultFontIndex() 1663e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1664e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return m_pVTProvider ? m_pVTProvider->GetDefaultFontIndex() : -1; 1665e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1666e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL CPDF_VariableText::IsLatinWord(FX_WORD word) 1667e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1668e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return m_pVTProvider ? m_pVTProvider->IsLatinWord(word) : FALSE; 1669e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1670e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovIPDF_VariableText_Iterator * CPDF_VariableText::GetIterator() 1671e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1672e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!m_pVTIterator) { 1673e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_pVTIterator = new CPDF_VariableText_Iterator(this); 1674e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1675e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return m_pVTIterator; 1676e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1677e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovIPDF_VariableText_Provider* CPDF_VariableText::SetProvider(IPDF_VariableText_Provider * pProvider) 1678e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1679e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov IPDF_VariableText_Provider* pOld = m_pVTProvider; 1680e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_pVTProvider = pProvider; 1681e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return pOld; 1682e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1683e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPDF_VariableText_Iterator::CPDF_VariableText_Iterator(CPDF_VariableText * pVT): 1684e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_CurPos(-1, -1, -1), 1685e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_pVT(pVT) 1686e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1687e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1688e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPDF_VariableText_Iterator::~CPDF_VariableText_Iterator() 1689e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1690e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1691e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPDF_VariableText_Iterator::SetAt(FX_INT32 nWordIndex) 1692e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1693e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ASSERT(m_pVT != NULL); 1694e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_CurPos = m_pVT->WordIndexToWordPlace(nWordIndex); 1695e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1696e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPDF_VariableText_Iterator::SetAt(const CPVT_WordPlace & place) 1697e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1698e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ASSERT(m_pVT != NULL); 1699e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_CurPos = place; 1700e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1701e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL CPDF_VariableText_Iterator::NextWord() 1702e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1703e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ASSERT(m_pVT != NULL); 1704e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (m_CurPos == m_pVT->GetEndWordPlace()) { 1705e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 1706e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1707e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_CurPos = m_pVT->GetNextWordPlace(m_CurPos); 1708e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 1709e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1710e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL CPDF_VariableText_Iterator::PrevWord() 1711e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1712e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ASSERT(m_pVT != NULL); 1713e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (m_CurPos == m_pVT->GetBeginWordPlace()) { 1714e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 1715e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1716e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_CurPos = m_pVT->GetPrevWordPlace(m_CurPos); 1717e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 1718e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1719e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL CPDF_VariableText_Iterator::NextLine() 1720e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1721e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ASSERT(m_pVT != NULL); 1722e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CSection * pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) { 1723e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (m_CurPos.nLineIndex < pSection->m_LineArray.GetSize() - 1) { 1724e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_CurPos = CPVT_WordPlace(m_CurPos.nSecIndex, m_CurPos.nLineIndex + 1, -1); 1725e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 1726e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 1727e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (m_CurPos.nSecIndex < m_pVT->m_SectionArray.GetSize() - 1) { 1728e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_CurPos = CPVT_WordPlace(m_CurPos.nSecIndex + 1, 0, -1); 1729e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 1730e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1731e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1732e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1733e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 1734e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1735e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL CPDF_VariableText_Iterator::PrevLine() 1736e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1737e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ASSERT(m_pVT != NULL); 1738e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) { 1739e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (m_CurPos.nLineIndex > 0) { 1740e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_CurPos = CPVT_WordPlace(m_CurPos.nSecIndex, m_CurPos.nLineIndex - 1, -1); 1741e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 1742e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 1743e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (m_CurPos.nSecIndex > 0) { 1744e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CSection * pLastSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex - 1)) { 1745e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_CurPos = CPVT_WordPlace(m_CurPos.nSecIndex - 1, pLastSection->m_LineArray.GetSize() - 1, -1); 1746e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 1747e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1748e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1749e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1750e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1751e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 1752e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1753e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL CPDF_VariableText_Iterator::NextSection() 1754e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1755e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ASSERT(m_pVT != NULL); 1756e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (m_CurPos.nSecIndex < m_pVT->m_SectionArray.GetSize() - 1) { 1757e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_CurPos = CPVT_WordPlace(m_CurPos.nSecIndex + 1, 0, -1); 1758e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 1759e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1760e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 1761e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1762e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL CPDF_VariableText_Iterator::PrevSection() 1763e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1764e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ASSERT(m_pVT != NULL); 1765e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (m_CurPos.nSecIndex > 0) { 1766e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_CurPos = CPVT_WordPlace(m_CurPos.nSecIndex - 1, 0, -1); 1767e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 1768e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1769e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 1770e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1771e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL CPDF_VariableText_Iterator::GetWord(CPVT_Word & word) const 1772e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1773e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ASSERT(m_pVT != NULL); 1774e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov word.WordPlace = m_CurPos; 1775e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CSection * pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) { 1776e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pSection->m_LineArray.GetAt(m_CurPos.nLineIndex)) { 1777e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CPVT_WordInfo * pWord = pSection->m_WordArray.GetAt(m_CurPos.nWordIndex)) { 1778e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov word.Word = pWord->Word; 1779e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov word.nCharset = pWord->nCharset; 1780e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov word.fWidth = m_pVT->GetWordWidth(*pWord); 1781e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov word.ptWord = m_pVT->InToOut( 1782e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPDF_Point(pWord->fWordX + pSection->m_SecInfo.rcSection.left, 1783e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pWord->fWordY + pSection->m_SecInfo.rcSection.top) ); 1784e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov word.fAscent = m_pVT->GetWordAscent(*pWord); 1785e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov word.fDescent = m_pVT->GetWordDescent(*pWord); 1786e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pWord->pWordProps) { 1787e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov word.WordProps = *pWord->pWordProps; 1788e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1789e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov word.nFontIndex = m_pVT->GetWordFontIndex(*pWord); 1790e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov word.fFontSize = m_pVT->GetWordFontSize(*pWord); 1791e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 1792e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1793e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1794e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1795e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 1796e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1797e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL CPDF_VariableText_Iterator::SetWord(const CPVT_Word & word) 1798e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1799e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ASSERT(m_pVT != NULL); 1800e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CSection * pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) { 1801e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CPVT_WordInfo * pWord = pSection->m_WordArray.GetAt(m_CurPos.nWordIndex)) { 1802e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pWord->pWordProps) { 1803e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *pWord->pWordProps = word.WordProps; 1804e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1805e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 1806e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1807e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1808e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 1809e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1810e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL CPDF_VariableText_Iterator::GetLine(CPVT_Line & line) const 1811e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1812e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ASSERT(m_pVT != NULL); 1813e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov line.lineplace = CPVT_WordPlace(m_CurPos.nSecIndex, m_CurPos.nLineIndex, -1); 1814e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CSection * pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) { 1815e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CLine * pLine = pSection->m_LineArray.GetAt(m_CurPos.nLineIndex)) { 1816e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov line.ptLine = m_pVT->InToOut( 1817e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPDF_Point(pLine->m_LineInfo.fLineX + pSection->m_SecInfo.rcSection.left, 1818e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pLine->m_LineInfo.fLineY + pSection->m_SecInfo.rcSection.top) ); 1819e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov line.fLineWidth = pLine->m_LineInfo.fLineWidth; 1820e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov line.fLineAscent = pLine->m_LineInfo.fLineAscent; 1821e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov line.fLineDescent = pLine->m_LineInfo.fLineDescent; 1822e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov line.lineEnd = pLine->GetEndWordPlace(); 1823e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 1824e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1825e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1826e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 1827e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1828e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL CPDF_VariableText_Iterator::GetSection(CPVT_Section & section) const 1829e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1830e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ASSERT(m_pVT != NULL); 1831e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov section.secplace = CPVT_WordPlace(m_CurPos.nSecIndex, 0, -1); 1832e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CSection * pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) { 1833e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov section.rcSection = m_pVT->InToOut(pSection->m_SecInfo.rcSection); 1834e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pSection->m_SecInfo.pSecProps) { 1835e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov section.SecProps = *pSection->m_SecInfo.pSecProps; 1836e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1837e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pSection->m_SecInfo.pWordProps) { 1838e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov section.WordProps = *pSection->m_SecInfo.pWordProps; 1839e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1840e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 1841e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1842e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 1843e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1844e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL CPDF_VariableText_Iterator::SetSection(const CPVT_Section & section) 1845e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 1846e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ASSERT(m_pVT != NULL); 1847e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CSection * pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) { 1848e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pSection->m_SecInfo.pSecProps) { 1849e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *pSection->m_SecInfo.pSecProps = section.SecProps; 1850e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1851e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pSection->m_SecInfo.pWordProps) { 1852e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *pSection->m_SecInfo.pWordProps = section.WordProps; 1853e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1854e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 1855e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1856e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 1857e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1858