14d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Copyright 2017 PDFium Authors. All rights reserved. 24d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be 34d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// found in the LICENSE file. 44d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 54d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 64d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 74d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/app/cxfa_textlayout.h" 84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <algorithm> 104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <utility> 114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "third_party/base/ptr_util.h" 134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "third_party/base/stl_util.h" 144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fde/cfde_path.h" 154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fde/css/cfde_csscomputedstyle.h" 164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fde/css/cfde_cssstyleselector.h" 174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fde/fde_gedevice.h" 184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fde/fde_object.h" 194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fde/xml/fde_xml_imp.h" 204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/app/cxfa_linkuserdata.h" 214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/app/cxfa_loadercontext.h" 224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/app/cxfa_pieceline.h" 234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/app/cxfa_textparsecontext.h" 244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/app/cxfa_texttabstopscontext.h" 254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/app/cxfa_textuserdata.h" 264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/app/xfa_ffwidgetacc.h" 274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/app/xfa_textpiece.h" 284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/parser/cxfa_font.h" 294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/parser/cxfa_para.h" 304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/parser/xfa_object.h" 314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define XFA_LOADERCNTXTFLG_FILTERSPACE 0x001 334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCXFA_TextLayout::CXFA_TextLayout(CXFA_TextProvider* pTextProvider) 354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann : m_bHasBlock(false), 364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pTextProvider(pTextProvider), 374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pTextDataNode(nullptr), 384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_bRichText(false), 394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iLines(0), 404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_fMaxWidth(0), 414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_bBlockContinue(true) { 424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(m_pTextProvider); 434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCXFA_TextLayout::~CXFA_TextLayout() { 464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_textParser.Reset(); 474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann Unload(); 484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_TextLayout::Unload() { 514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pieceLines.clear(); 524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pBreak.reset(); 534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_TextLayout::GetTextDataNode() { 564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_pTextProvider) 574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Node* pNode = m_pTextProvider->GetTextNode(m_bRichText); 604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pNode && m_bRichText) 614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_textParser.Reset(); 624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pTextDataNode = pNode; 644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFDE_XMLNode* CXFA_TextLayout::GetXMLContainerNode() { 674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_bRichText) 684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nullptr; 694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFDE_XMLNode* pXMLRoot = m_pTextDataNode->GetXMLMappingNode(); 714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pXMLRoot) 724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nullptr; 734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFDE_XMLNode* pXMLContainer = nullptr; 754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (CFDE_XMLNode* pXMLChild = 764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pXMLRoot->GetNodeItem(CFDE_XMLNode::FirstChild); 774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pXMLChild; 784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pXMLChild = pXMLChild->GetNodeItem(CFDE_XMLNode::NextSibling)) { 794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pXMLChild->GetType() == FDE_XMLNODE_Element) { 804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFDE_XMLElement* pXMLElement = static_cast<CFDE_XMLElement*>(pXMLChild); 814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_WideString wsTag; 824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pXMLElement->GetLocalTagName(wsTag); 835ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (wsTag == L"body" || wsTag == L"html") { 844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pXMLContainer = pXMLChild; 854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return pXMLContainer; 904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 925ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmannstd::unique_ptr<CFX_RTFBreak> CXFA_TextLayout::CreateBreak(bool bDefault) { 934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t dwStyle = FX_RTFLAYOUTSTYLE_ExpandTab; 944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!bDefault) 954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dwStyle |= FX_RTFLAYOUTSTYLE_Pagination; 964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 975ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann auto pBreak = pdfium::MakeUnique<CFX_RTFBreak>(dwStyle); 984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pBreak->SetLineBreakTolerance(1); 994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pBreak->SetFont(m_textParser.GetFont(m_pTextProvider, nullptr)); 1004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pBreak->SetFontSize(m_textParser.GetFontSize(m_pTextProvider, nullptr)); 1014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return pBreak; 1024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_TextLayout::InitBreak(FX_FLOAT fLineWidth) { 1054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Font font = m_pTextProvider->GetFontNode(); 1064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Para para = m_pTextProvider->GetParaNode(); 1074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fStart = 0; 1084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fStartPos = 0; 1094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (para) { 1105ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann CFX_RTFLineAlignment iAlign = CFX_RTFLineAlignment::Left; 1114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann switch (para.GetHorizontalAlign()) { 1124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_ATTRIBUTEENUM_Center: 1135ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann iAlign = CFX_RTFLineAlignment::Center; 1144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 1154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_ATTRIBUTEENUM_Right: 1165ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann iAlign = CFX_RTFLineAlignment::Right; 1174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 1184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_ATTRIBUTEENUM_Justify: 1195ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann iAlign = CFX_RTFLineAlignment::Justified; 1204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 1214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_ATTRIBUTEENUM_JustifyAll: 1225ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann iAlign = CFX_RTFLineAlignment::Distributed; 1234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 1244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pBreak->SetAlignment(iAlign); 1264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fStart = para.GetMarginLeft(); 1284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_pTextProvider->IsCheckButtonAndAutoWidth()) { 1295ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (iAlign != CFX_RTFLineAlignment::Left) 1304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLineWidth -= para.GetMarginRight(); 1314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 1324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLineWidth -= para.GetMarginRight(); 1334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (fLineWidth < 0) 1354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLineWidth = fStart; 1364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fStartPos = fStart; 1384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fIndent = para.GetTextIndent(); 1394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (fIndent > 0) 1404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fStartPos += fIndent; 1414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pBreak->SetLineBoundary(fStart, fLineWidth); 1444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pBreak->SetLineStartPos(fStartPos); 1454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (font) { 1464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pBreak->SetHorizontalScale((int32_t)font.GetHorizontalScale()); 1474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pBreak->SetVerticalScale((int32_t)font.GetVerticalScale()); 1484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pBreak->SetCharSpace(font.GetLetterSpacing()); 1494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fFontSize = m_textParser.GetFontSize(m_pTextProvider, nullptr); 1524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pBreak->SetFontSize(fFontSize); 1534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pBreak->SetFont(m_textParser.GetFont(m_pTextProvider, nullptr)); 1544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pBreak->SetLineBreakTolerance(fFontSize * 0.2f); 1554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_TextLayout::InitBreak(CFDE_CSSComputedStyle* pStyle, 1584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FDE_CSSDisplay eDisplay, 1594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fLineWidth, 1604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFDE_XMLNode* pXMLNode, 1614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFDE_CSSComputedStyle* pParentStyle) { 1624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pStyle) { 1634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann InitBreak(fLineWidth); 1644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 1654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (eDisplay == FDE_CSSDisplay::Block || 1684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann eDisplay == FDE_CSSDisplay::ListItem) { 1695ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann CFX_RTFLineAlignment iAlign = CFX_RTFLineAlignment::Left; 1704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann switch (pStyle->GetTextAlign()) { 1714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case FDE_CSSTextAlign::Right: 1725ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann iAlign = CFX_RTFLineAlignment::Right; 1734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 1744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case FDE_CSSTextAlign::Center: 1755ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann iAlign = CFX_RTFLineAlignment::Center; 1764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 1774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case FDE_CSSTextAlign::Justify: 1785ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann iAlign = CFX_RTFLineAlignment::Justified; 1794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 1804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case FDE_CSSTextAlign::JustifyAll: 1815ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann iAlign = CFX_RTFLineAlignment::Distributed; 1824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 1834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann default: 1844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 1854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pBreak->SetAlignment(iAlign); 1875ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 1884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fStart = 0; 1894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const FDE_CSSRect* pRect = pStyle->GetMarginWidth(); 1904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const FDE_CSSRect* pPaddingRect = pStyle->GetPaddingWidth(); 1914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pRect) { 1924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fStart = pRect->left.GetValue(); 1934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLineWidth -= pRect->right.GetValue(); 1944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pPaddingRect) { 1954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fStart += pPaddingRect->left.GetValue(); 1964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLineWidth -= pPaddingRect->right.GetValue(); 1974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (eDisplay == FDE_CSSDisplay::ListItem) { 1994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const FDE_CSSRect* pParRect = pParentStyle->GetMarginWidth(); 2004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const FDE_CSSRect* pParPaddingRect = pParentStyle->GetPaddingWidth(); 2014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pParRect) { 2024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fStart += pParRect->left.GetValue(); 2034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLineWidth -= pParRect->right.GetValue(); 2044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pParPaddingRect) { 2054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fStart += pParPaddingRect->left.GetValue(); 2064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLineWidth -= pParPaddingRect->right.GetValue(); 2074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FDE_CSSRect pNewRect; 2104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pNewRect.left.Set(FDE_CSSLengthUnit::Point, fStart); 2114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pNewRect.right.Set(FDE_CSSLengthUnit::Point, pRect->right.GetValue()); 2124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pNewRect.top.Set(FDE_CSSLengthUnit::Point, pRect->top.GetValue()); 2134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pNewRect.bottom.Set(FDE_CSSLengthUnit::Point, pRect->bottom.GetValue()); 2144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pStyle->SetMarginWidth(pNewRect); 2154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pBreak->SetLineBoundary(fStart, fLineWidth); 2184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fIndent = pStyle->GetTextIndent().GetValue(); 2194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (fIndent > 0) 2204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fStart += fIndent; 2214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pBreak->SetLineStartPos(fStart); 2234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pBreak->SetTabWidth(m_textParser.GetTabInterval(pStyle)); 2244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_pTabstopContext) 2254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pTabstopContext = pdfium::MakeUnique<CXFA_TextTabstopsContext>(); 2264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_textParser.GetTabstops(pStyle, m_pTabstopContext.get()); 2274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < m_pTabstopContext->m_iTabCount; i++) { 2284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann XFA_TABSTOPS* pTab = m_pTabstopContext->m_tabstops.GetDataPtr(i); 2294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pBreak->AddPositionedTab(pTab->fTabstops); 2304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fFontSize = m_textParser.GetFontSize(m_pTextProvider, pStyle); 2344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pBreak->SetFontSize(fFontSize); 2354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pBreak->SetLineBreakTolerance(fFontSize * 0.2f); 2364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pBreak->SetFont(m_textParser.GetFont(m_pTextProvider, pStyle)); 2374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pBreak->SetHorizontalScale( 2384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_textParser.GetHorScale(m_pTextProvider, pStyle, pXMLNode)); 2394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pBreak->SetVerticalScale(m_textParser.GetVerScale(m_pTextProvider, pStyle)); 2404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pBreak->SetCharSpace(pStyle->GetLetterSpacing().GetValue()); 2414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint32_t CXFA_TextLayout::GetText(CFX_WideString& wsText) { 2444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann GetTextDataNode(); 2454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsText.clear(); 2464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_bRichText) 2474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsText = m_pTextDataNode->GetContent(); 2484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return wsText.GetLength(); 2494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFX_FLOAT CXFA_TextLayout::GetLayoutHeight() { 2524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_pLoader) 2534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 0; 2544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iCount = m_pLoader->m_lineHeights.GetSize(); 2564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iCount == 0 && m_pLoader->m_fWidth > 0) { 2574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_SizeF szMax(m_pLoader->m_fWidth, m_pLoader->m_fHeight); 2584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_SizeF szDef; 2594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_bSaveLineHeight = true; 2604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_fLastPos = 0; 2614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CalcSize(szMax, szMax, szDef); 2624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_bSaveLineHeight = false; 2635ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann return szDef.height; 2644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fHeight = m_pLoader->m_fHeight; 2674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (fHeight < 0.1f) { 2684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fHeight = 0; 2694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < iCount; i++) 2704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fHeight += m_pLoader->m_lineHeights.ElementAt(i); 2714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return fHeight; 2734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFX_FLOAT CXFA_TextLayout::StartLayout(FX_FLOAT fWidth) { 2764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_pLoader) 2774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader = pdfium::MakeUnique<CXFA_LoaderContext>(); 2784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (fWidth < 0 || (m_pLoader->m_fWidth > -1 && 2804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FXSYS_fabs(fWidth - m_pLoader->m_fWidth) > 0)) { 2814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_lineHeights.RemoveAll(); 2824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Blocks.RemoveAll(); 2834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann Unload(); 2844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_fStartLineOffset = 0; 2854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_fWidth = fWidth; 2874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (fWidth < 0) { 2894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_SizeF szMax; 2904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_SizeF szDef; 2914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_bSaveLineHeight = true; 2924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_fLastPos = 0; 2934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CalcSize(szMax, szMax, szDef); 2944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_bSaveLineHeight = false; 2955ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann fWidth = szDef.width; 2964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return fWidth; 2984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_TextLayout::DoLayout(int32_t iBlockIndex, 3014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT& fCalcHeight, 3024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fContentAreaHeight, 3034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fTextHeight) { 3044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_pLoader) 3054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 3064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iBlockCount = m_Blocks.GetSize(); 3084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fHeight = fTextHeight; 3094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (fHeight < 0) 3104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fHeight = GetLayoutHeight(); 3114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_fHeight = fHeight; 3134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (fContentAreaHeight < 0) 3144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 3154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_bHasBlock = true; 3174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iBlockCount == 0 && fHeight > 0) { 3184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fHeight = fTextHeight - GetLayoutHeight(); 3194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (fHeight > 0) { 3204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iAlign = m_textParser.GetVAlign(m_pTextProvider); 3214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iAlign == XFA_ATTRIBUTEENUM_Middle) 3224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fHeight /= 2.0f; 3234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else if (iAlign != XFA_ATTRIBUTEENUM_Bottom) 3244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fHeight = 0; 3254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_fStartLineOffset = fHeight; 3264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fLinePos = m_pLoader->m_fStartLineOffset; 3304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iLineIndex = 0; 3314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iBlockCount > 1) { 3324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iBlockCount >= (iBlockIndex + 1) * 2) { 3334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iLineIndex = m_Blocks.ElementAt(iBlockIndex * 2); 3344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 3354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iLineIndex = m_Blocks.ElementAt(iBlockCount - 1) + 3364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Blocks.ElementAt(iBlockCount - 2); 3374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_pLoader->m_BlocksHeight.empty()) { 3394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < iBlockIndex; i++) 3404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLinePos -= m_pLoader->m_BlocksHeight[i * 2 + 1]; 3414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iCount = m_pLoader->m_lineHeights.GetSize(); 3454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t i = 0; 3464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (i = iLineIndex; i < iCount; i++) { 3474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fLineHeight = m_pLoader->m_lineHeights.ElementAt(i); 3484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((i == iLineIndex) && (fLineHeight - fContentAreaHeight > 0.001)) { 3494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fCalcHeight = 0; 3504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 3514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (fLinePos + fLineHeight - fContentAreaHeight > 0.001) { 3534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iBlockCount >= (iBlockIndex + 1) * 2) { 3544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Blocks.SetAt(iBlockIndex * 2, iLineIndex); 3554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Blocks.SetAt(iBlockIndex * 2 + 1, i - iLineIndex); 3564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 3574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Blocks.Add(iLineIndex); 3584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Blocks.Add(i - iLineIndex); 3594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (i == iLineIndex) { 3614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (fCalcHeight <= fLinePos) { 3624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pdfium::CollectionSize<int32_t>(m_pLoader->m_BlocksHeight) > 3634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iBlockIndex * 2 && 3644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (m_pLoader->m_BlocksHeight[iBlockIndex * 2] == iBlockIndex)) { 3654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_BlocksHeight[iBlockIndex * 2 + 1] = fCalcHeight; 3664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 3674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_BlocksHeight.push_back((FX_FLOAT)iBlockIndex); 3684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_BlocksHeight.push_back(fCalcHeight); 3694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 3724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fCalcHeight = fLinePos; 3754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 3764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLinePos += fLineHeight; 3784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 3804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 3814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint32_t CXFA_TextLayout::CountBlocks() const { 3834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iCount = m_Blocks.GetSize() / 2; 3844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return iCount > 0 ? iCount : 1; 3854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 3864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_TextLayout::CalcSize(const CFX_SizeF& minSize, 3884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const CFX_SizeF& maxSize, 3894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_SizeF& defaultSize) { 3905ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann defaultSize.width = maxSize.width; 3915ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (defaultSize.width < 1) 3925ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann defaultSize.width = 0xFFFF; 3934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3945ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann m_pBreak = CreateBreak(false); 3954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fLinePos = 0; 3964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iLines = 0; 3974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_fMaxWidth = 0; 3984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann Loader(defaultSize, fLinePos, false); 3994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (fLinePos < 0.1f) 4004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLinePos = m_textParser.GetFontSize(m_pTextProvider, nullptr); 4014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pTabstopContext.reset(); 4034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann defaultSize = CFX_SizeF(m_fMaxWidth, fLinePos); 4044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 4054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 4064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_TextLayout::Layout(const CFX_SizeF& size, FX_FLOAT* fHeight) { 4085ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (size.width < 1) 4094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 4104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann Unload(); 4125ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann m_pBreak = CreateBreak(true); 4134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_pLoader) { 4144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_iTotalLines = -1; 4154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_iChar = 0; 4164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iLines = 0; 4194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fLinePos = 0; 4204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann Loader(size, fLinePos, true); 4215ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann UpdateAlign(size.height, fLinePos); 4224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pTabstopContext.reset(); 4234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (fHeight) 4244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *fHeight = fLinePos; 4254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 4264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 4274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_TextLayout::Layout(int32_t iBlock) { 4294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_pLoader || iBlock < 0 || iBlock >= CountBlocks()) 4304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 4314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_pLoader->m_fWidth < 1) 4324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 4334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_iTotalLines = -1; 4354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iLines = 0; 4364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fLinePos = 0; 4374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Node* pNode = nullptr; 4384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_SizeF szText(m_pLoader->m_fWidth, m_pLoader->m_fHeight); 4394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iCount = m_Blocks.GetSize(); 4404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iBlocksHeightCount = 4414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pdfium::CollectionSize<int32_t>(m_pLoader->m_BlocksHeight); 4424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iBlocksHeightCount /= 2; 4434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iBlock < iBlocksHeightCount) 4444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 4454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iBlock == iBlocksHeightCount) { 4464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann Unload(); 4475ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann m_pBreak = CreateBreak(true); 4484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLinePos = m_pLoader->m_fStartLineOffset; 4494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < iBlocksHeightCount; i++) 4504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLinePos -= m_pLoader->m_BlocksHeight[i * 2 + 1]; 4514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_iChar = 0; 4534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iCount > 1) 4544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_iTotalLines = m_Blocks.ElementAt(iBlock * 2 + 1); 4554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann Loader(szText, fLinePos, true); 4574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iCount == 0 && m_pLoader->m_fStartLineOffset < 0.1f) 4585ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann UpdateAlign(szText.height, fLinePos); 4594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (m_pTextDataNode) { 4604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iBlock *= 2; 4614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iBlock < iCount - 2) 4624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_iTotalLines = m_Blocks.ElementAt(iBlock + 1); 4634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pBreak->Reset(); 4654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_bRichText) { 4664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFDE_XMLNode* pContainerNode = GetXMLContainerNode(); 4674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pContainerNode) 4684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 4694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFDE_XMLNode* pXMLNode = m_pLoader->m_pXMLNode; 4714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pXMLNode) 4724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 4734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFDE_XMLNode* pSaveXMLNode = m_pLoader->m_pXMLNode; 4754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (; pXMLNode; 4764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pXMLNode = pXMLNode->GetNodeItem(CFDE_XMLNode::NextSibling)) { 4774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!LoadRichText(pXMLNode, szText, fLinePos, m_pLoader->m_pParentStyle, 4785ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann true, nullptr)) { 4794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 4804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (!pXMLNode) { 4834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pXMLNode = pSaveXMLNode->GetNodeItem(CFDE_XMLNode::Parent); 4844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pXMLNode == pContainerNode) 4854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 4864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!LoadRichText(pXMLNode, szText, fLinePos, m_pLoader->m_pParentStyle, 4874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann true, nullptr, false)) { 4884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 4894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pSaveXMLNode = pXMLNode; 4914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pXMLNode = pXMLNode->GetNodeItem(CFDE_XMLNode::NextSibling); 4924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pXMLNode) 4934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 4944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (; pXMLNode; 4954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pXMLNode = pXMLNode->GetNodeItem(CFDE_XMLNode::NextSibling)) { 4964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!LoadRichText(pXMLNode, szText, fLinePos, 4975ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann m_pLoader->m_pParentStyle, true, nullptr)) { 4984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 4994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 5034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pNode = m_pLoader->m_pNode; 5044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pNode) 5054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 5064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann LoadText(pNode, szText, fLinePos, true); 5074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iBlock == iCount) { 5104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pTabstopContext.reset(); 5114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader.reset(); 5124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 5144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 5154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_TextLayout::ItemBlocks(const CFX_RectF& rtText, int32_t iBlockIndex) { 5174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_pLoader) 5184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 5194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iCountHeight = m_pLoader->m_lineHeights.GetSize(); 5214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iCountHeight == 0) 5224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 5234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bEndItem = true; 5254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iBlockCount = m_Blocks.GetSize(); 5264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fLinePos = m_pLoader->m_fStartLineOffset; 5274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iLineIndex = 0; 5284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iBlockIndex > 0) { 5294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iBlockHeightCount = 5304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pdfium::CollectionSize<int32_t>(m_pLoader->m_BlocksHeight); 5314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iBlockHeightCount /= 2; 5324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iBlockHeightCount >= iBlockIndex) { 5334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < iBlockIndex; i++) 5344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLinePos -= m_pLoader->m_BlocksHeight[i * 2 + 1]; 5354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 5364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLinePos = 0; 5374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iLineIndex = m_Blocks[iBlockCount - 1] + m_Blocks[iBlockCount - 2]; 5394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t i = 0; 5424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (i = iLineIndex; i < iCountHeight; i++) { 5434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fLineHeight = m_pLoader->m_lineHeights.ElementAt(i); 5444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (fLinePos + fLineHeight - rtText.height > 0.001) { 5454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Blocks.Add(iLineIndex); 5464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Blocks.Add(i - iLineIndex); 5474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bEndItem = false; 5484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 5494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLinePos += fLineHeight; 5514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iCountHeight > 0 && (i - iLineIndex) > 0 && bEndItem) { 5534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Blocks.Add(iLineIndex); 5544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Blocks.Add(i - iLineIndex); 5554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 5574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_TextLayout::DrawString(CFX_RenderDevice* pFxDevice, 5594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const CFX_Matrix& tmDoc2Device, 5604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const CFX_RectF& rtClip, 5614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iBlock) { 5624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pFxDevice) 5634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 5644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFDE_RenderDevice> pDevice( 5664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann new CFDE_RenderDevice(pFxDevice, false)); 5674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pDevice->SaveState(); 5684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pDevice->SetClipRect(rtClip); 5694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto pSolidBrush = pdfium::MakeUnique<CFDE_Brush>(); 5714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto pPen = pdfium::MakeUnique<CFDE_Pen>(); 5724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_pieceLines.empty()) { 5734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iBlockCount = CountBlocks(); 5744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < iBlockCount; i++) 5754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann Layout(i); 5764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FXTEXT_CHARPOS* pCharPos = nullptr; 5794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iCharCount = 0; 5804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iLineStart = 0; 5814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iPieceLines = pdfium::CollectionSize<int32_t>(m_pieceLines); 5824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iCount = m_Blocks.GetSize(); 5834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iCount > 0) { 5844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iBlock *= 2; 5854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iBlock < iCount) { 5864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iLineStart = m_Blocks.ElementAt(iBlock); 5874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iPieceLines = m_Blocks.ElementAt(iBlock + 1); 5884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 5894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iPieceLines = 0; 5904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < iPieceLines; i++) { 5944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (i + iLineStart >= pdfium::CollectionSize<int32_t>(m_pieceLines)) 5954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 5964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_PieceLine* pPieceLine = m_pieceLines[i + iLineStart].get(); 5984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iPieces = pdfium::CollectionSize<int32_t>(pPieceLine->m_textPieces); 5994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t j = 0; 6004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (j = 0; j < iPieces; j++) { 6014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const XFA_TextPiece* pPiece = pPieceLine->m_textPieces[j].get(); 6024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iChars = pPiece->iChars; 6034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iCharCount < iChars) { 6044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_Free(pCharPos); 6054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos = FX_Alloc(FXTEXT_CHARPOS, iChars); 6064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharCount = iChars; 6074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FXSYS_memset(pCharPos, 0, iCharCount * sizeof(FXTEXT_CHARPOS)); 6094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann RenderString(pDevice.get(), pSolidBrush.get(), pPieceLine, j, pCharPos, 6104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tmDoc2Device); 6114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (j = 0; j < iPieces; j++) { 6134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann RenderPath(pDevice.get(), pPen.get(), pPieceLine, j, pCharPos, 6144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tmDoc2Device); 6154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pDevice->RestoreState(); 6184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_Free(pCharPos); 6194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return iPieceLines > 0; 6204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 6214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_TextLayout::UpdateAlign(FX_FLOAT fHeight, FX_FLOAT fBottom) { 6234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fHeight -= fBottom; 6244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (fHeight < 0.1f) 6254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 6264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann switch (m_textParser.GetVAlign(m_pTextProvider)) { 6284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_ATTRIBUTEENUM_Middle: 6294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fHeight /= 2.0f; 6304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 6314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_ATTRIBUTEENUM_Bottom: 6324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 6334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann default: 6344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 6354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (const auto& pPieceLine : m_pieceLines) { 6384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (const auto& pPiece : pPieceLine->m_textPieces) 6394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pPiece->rtPiece.top += fHeight; 6404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 6424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_TextLayout::Loader(const CFX_SizeF& szText, 6444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT& fLinePos, 6454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bSavePieces) { 6464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann GetTextDataNode(); 6474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_pTextDataNode) 6484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 6494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_bRichText) { 6514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFDE_XMLNode* pXMLContainer = GetXMLContainerNode(); 6524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pXMLContainer) { 6534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_textParser.IsParsed()) 6544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_textParser.DoParse(pXMLContainer, m_pTextProvider); 6554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6565ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann auto pRootStyle = m_textParser.CreateRootStyle(m_pTextProvider); 6575ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann LoadRichText(pXMLContainer, szText, fLinePos, pRootStyle, bSavePieces, 6585ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann nullptr); 6594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 6614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann LoadText(m_pTextDataNode, szText, fLinePos, bSavePieces); 6624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 6644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 6654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_TextLayout::LoadText(CXFA_Node* pNode, 6674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const CFX_SizeF& szText, 6684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT& fLinePos, 6694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bSavePieces) { 6705ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann InitBreak(szText.width); 6714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Para para = m_pTextProvider->GetParaNode(); 6734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fSpaceAbove = 0; 6744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (para) { 6754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fSpaceAbove = para.GetSpaceAbove(); 6764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (fSpaceAbove < 0.1f) { 6774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fSpaceAbove = 0; 6784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t verAlign = para.GetVerticalAlign(); 6804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann switch (verAlign) { 6814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_ATTRIBUTEENUM_Top: 6824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_ATTRIBUTEENUM_Middle: 6834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_ATTRIBUTEENUM_Bottom: { 6844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLinePos += fSpaceAbove; 6854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 6864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_WideString wsText = pNode->GetContent(); 6914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsText.TrimRight(L" "); 6924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bRet = AppendChar(wsText, fLinePos, fSpaceAbove, bSavePieces); 6934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bRet && m_pLoader) 6944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_pNode = pNode; 6954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else 6965ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann EndBreak(CFX_RTFBreakType::Paragraph, fLinePos, bSavePieces); 6974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 6984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6995ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmannbool CXFA_TextLayout::LoadRichText( 7005ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann CFDE_XMLNode* pXMLNode, 7015ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann const CFX_SizeF& szText, 7025ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann FX_FLOAT& fLinePos, 7035ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann const CFX_RetainPtr<CFDE_CSSComputedStyle>& pParentStyle, 7045ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann bool bSavePieces, 7055ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann CFX_RetainPtr<CXFA_LinkUserData> pLinkData, 7065ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann bool bEndBreak, 7075ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann bool bIsOl, 7085ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann int32_t iLiCount) { 7094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pXMLNode) 7104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 7114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 7124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_TextParseContext* pContext = 7134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_textParser.GetParseContextFromMap(pXMLNode); 7144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FDE_CSSDisplay eDisplay = FDE_CSSDisplay::None; 7154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bContentNode = false; 7164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fSpaceBelow = 0; 7175ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann CFX_RetainPtr<CFDE_CSSComputedStyle> pStyle; 7184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_WideString wsName; 7194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bEndBreak) { 7204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bCurOl = false; 7214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bCurLi = false; 7224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFDE_XMLElement* pElement = nullptr; 7234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pContext) { 7244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_bBlockContinue || 7254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (m_pLoader && pXMLNode == m_pLoader->m_pXMLNode)) { 7264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_bBlockContinue = true; 7274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 7284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pXMLNode->GetType() == FDE_XMLNODE_Text) { 7294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bContentNode = true; 7304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (pXMLNode->GetType() == FDE_XMLNODE_Element) { 7314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pElement = static_cast<CFDE_XMLElement*>(pXMLNode); 7324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pElement->GetLocalTagName(wsName); 7334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 7345ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (wsName == L"ol") { 7354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bIsOl = true; 7364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bCurOl = true; 7374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 7384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_bBlockContinue || bContentNode == false) { 7394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann eDisplay = pContext->GetDisplay(); 7404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (eDisplay != FDE_CSSDisplay::Block && 7414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann eDisplay != FDE_CSSDisplay::Inline && 7424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann eDisplay != FDE_CSSDisplay::ListItem) { 7434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 7444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 7454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 7465ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann pStyle = m_textParser.ComputeStyle(pXMLNode, pParentStyle.Get()); 7475ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann InitBreak(bContentNode ? pParentStyle.Get() : pStyle.Get(), eDisplay, 7485ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann szText.width, pXMLNode, pParentStyle.Get()); 7494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((eDisplay == FDE_CSSDisplay::Block || 7504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann eDisplay == FDE_CSSDisplay::ListItem) && 7514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pStyle && 7525ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann (wsName.IsEmpty() || (wsName != L"body" && wsName != L"html" && 7535ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann wsName != L"ol" && wsName != L"ul"))) { 7544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const FDE_CSSRect* pRect = pStyle->GetMarginWidth(); 7554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pRect) { 7564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLinePos += pRect->top.GetValue(); 7574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fSpaceBelow = pRect->bottom.GetValue(); 7584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 7594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 7604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 7615ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (wsName == L"a") { 7624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_WideString wsLinkContent; 7634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(pElement); 7644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pElement->GetString(L"href", wsLinkContent); 7654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!wsLinkContent.IsEmpty()) { 7665ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann pLinkData = pdfium::MakeRetain<CXFA_LinkUserData>( 7674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsLinkContent.GetBuffer(wsLinkContent.GetLength())); 7684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsLinkContent.ReleaseBuffer(wsLinkContent.GetLength()); 7694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 7704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 7714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 7725ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann int32_t iTabCount = m_textParser.CountTabs( 7735ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann bContentNode ? pParentStyle.Get() : pStyle.Get()); 7745ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann bool bSpaceRun = m_textParser.IsSpaceRun( 7755ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann bContentNode ? pParentStyle.Get() : pStyle.Get()); 7764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_WideString wsText; 7774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bContentNode && iTabCount == 0) { 7784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann static_cast<CFDE_XMLText*>(pXMLNode)->GetText(wsText); 7795ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann } else if (wsName == L"br") { 7804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsText = L'\n'; 7815ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann } else if (wsName == L"li") { 7824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bCurLi = true; 7834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bIsOl) 7844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsText.Format(L"%d. ", iLiCount); 7854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else 7865ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann wsText = 0x00B7 + CFX_WideStringC(L" ", 1); 7874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (!bContentNode) { 7884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iTabCount > 0) { 7894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (iTabCount-- > 0) 7904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsText += L'\t'; 7914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 7924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_textParser.GetEmbbedObj(m_pTextProvider, pXMLNode, wsText); 7934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 7944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 7954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 7964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iLength = wsText.GetLength(); 7974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iLength > 0 && bContentNode && !bSpaceRun) 7984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ProcessText(wsText); 7994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_pLoader) { 8014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (wsText.GetLength() > 0 && 8024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (m_pLoader->m_dwFlags & XFA_LOADERCNTXTFLG_FILTERSPACE)) { 8034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsText.TrimLeft(0x20); 8044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (FDE_CSSDisplay::Block == eDisplay) { 8064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_dwFlags |= XFA_LOADERCNTXTFLG_FILTERSPACE; 8074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (FDE_CSSDisplay::Inline == eDisplay && 8084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (m_pLoader->m_dwFlags & XFA_LOADERCNTXTFLG_FILTERSPACE)) { 8094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_dwFlags &= ~XFA_LOADERCNTXTFLG_FILTERSPACE; 8104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (wsText.GetLength() > 0 && 8114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (0x20 == wsText.GetAt(wsText.GetLength() - 1))) { 8124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_dwFlags |= XFA_LOADERCNTXTFLG_FILTERSPACE; 8134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (wsText.GetLength() != 0) { 8144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_dwFlags &= ~XFA_LOADERCNTXTFLG_FILTERSPACE; 8154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (wsText.GetLength() > 0) { 8194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_pLoader || m_pLoader->m_iChar == 0) { 8205ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann auto pUserData = pdfium::MakeRetain<CXFA_TextUserData>( 8214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bContentNode ? pParentStyle : pStyle, pLinkData); 8224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pBreak->SetUserData(pUserData); 8234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (AppendChar(wsText, fLinePos, 0, bSavePieces)) { 8264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_pLoader) 8274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_dwFlags &= ~XFA_LOADERCNTXTFLG_FILTERSPACE; 8284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (IsEnd(bSavePieces)) { 8294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_pLoader && m_pLoader->m_iTotalLines > -1) { 8304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_pXMLNode = pXMLNode; 8314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_pParentStyle = pParentStyle; 8324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 8344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 8364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (CFDE_XMLNode* pChildNode = 8424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pXMLNode->GetNodeItem(CFDE_XMLNode::FirstChild); 8434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pChildNode; 8444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pChildNode = pChildNode->GetNodeItem(CFDE_XMLNode::NextSibling)) { 8454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bCurOl) 8464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iLiCount++; 8474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!LoadRichText(pChildNode, szText, fLinePos, 8494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext ? pStyle : pParentStyle, bSavePieces, 8504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pLinkData, true, bIsOl, iLiCount)) 8514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 8524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_pLoader) { 8554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (FDE_CSSDisplay::Block == eDisplay) 8564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_dwFlags |= XFA_LOADERCNTXTFLG_FILTERSPACE; 8574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bCurLi) 8595ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann EndBreak(CFX_RTFBreakType::Line, fLinePos, bSavePieces); 8604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 8614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pContext) 8624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann eDisplay = pContext->GetDisplay(); 8634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_bBlockContinue) { 8664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pContext && !bContentNode) { 8675ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann CFX_RTFBreakType dwStatus = (eDisplay == FDE_CSSDisplay::Block) 8685ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann ? CFX_RTFBreakType::Paragraph 8695ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann : CFX_RTFBreakType::Piece; 8704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EndBreak(dwStatus, fLinePos, bSavePieces); 8714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (eDisplay == FDE_CSSDisplay::Block) { 8724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLinePos += fSpaceBelow; 8734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_pTabstopContext) 8744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pTabstopContext->RemoveAll(); 8754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (IsEnd(bSavePieces)) { 8774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_pLoader && m_pLoader->m_iTotalLines > -1) { 8784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_pXMLNode = 8794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pXMLNode->GetNodeItem(CFDE_XMLNode::NextSibling); 8804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_pParentStyle = pParentStyle; 8814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 8834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 8874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 8884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_TextLayout::AppendChar(const CFX_WideString& wsText, 8904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT& fLinePos, 8914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fSpaceAbove, 8924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bSavePieces) { 8935ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann CFX_RTFBreakType dwStatus = CFX_RTFBreakType::None; 8944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iChar = 0; 8954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_pLoader) 8964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iChar = m_pLoader->m_iChar; 8974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iLength = wsText.GetLength(); 8994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = iChar; i < iLength; i++) { 9004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_WCHAR wch = wsText.GetAt(i); 9014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (wch == 0xA0) 9024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wch = 0x20; 9034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9045ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann dwStatus = m_pBreak->AppendChar(wch); 9055ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (dwStatus != CFX_RTFBreakType::None && 9065ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann dwStatus != CFX_RTFBreakType::Piece) { 9074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann AppendTextLine(dwStatus, fLinePos, bSavePieces); 9084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (IsEnd(bSavePieces)) { 9094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_pLoader) 9104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_iChar = i; 9114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 9124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 9135ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (dwStatus == CFX_RTFBreakType::Paragraph && m_bRichText) 9144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLinePos += fSpaceAbove; 9154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 9164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 9174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_pLoader) 9184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_iChar = 0; 9194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 9214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 9224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_TextLayout::IsEnd(bool bSavePieces) { 9244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!bSavePieces) 9254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 9264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_pLoader && m_pLoader->m_iTotalLines > 0) 9274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return m_iLines >= m_pLoader->m_iTotalLines; 9284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 9294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 9304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_TextLayout::ProcessText(CFX_WideString& wsText) { 9324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iLen = wsText.GetLength(); 9334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iLen == 0) 9344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 9354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_WCHAR* psz = wsText.GetBuffer(iLen); 9374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iTrimLeft = 0; 9384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_WCHAR wch = 0, wPrev = 0; 9394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < iLen; i++) { 9404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wch = psz[i]; 9414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (wch < 0x20) 9424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wch = 0x20; 9434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (wch == 0x20 && wPrev == 0x20) 9444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 9454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wPrev = wch; 9474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann psz[iTrimLeft++] = wch; 9484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 9494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsText.ReleaseBuffer(iLen); 9504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsText = wsText.Left(iTrimLeft); 9514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 9524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9535ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmannvoid CXFA_TextLayout::EndBreak(CFX_RTFBreakType dwStatus, 9544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT& fLinePos, 9554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bSavePieces) { 9564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dwStatus = m_pBreak->EndBreak(dwStatus); 9575ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (dwStatus != CFX_RTFBreakType::None && dwStatus != CFX_RTFBreakType::Piece) 9584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann AppendTextLine(dwStatus, fLinePos, bSavePieces, true); 9594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 9604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_TextLayout::DoTabstops(CFDE_CSSComputedStyle* pStyle, 9624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_PieceLine* pPieceLine) { 9634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_pTabstopContext || m_pTabstopContext->m_iTabCount == 0) 9644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 9654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pStyle || !pPieceLine) 9664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 9674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iPieces = pdfium::CollectionSize<int32_t>(pPieceLine->m_textPieces); 9694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iPieces == 0) 9704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 9714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann XFA_TextPiece* pPiece = pPieceLine->m_textPieces[iPieces - 1].get(); 9734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t& iTabstopsIndex = m_pTabstopContext->m_iTabIndex; 9744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iCount = m_textParser.CountTabs(pStyle); 9754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iTabstopsIndex > m_pTabstopContext->m_iTabCount - 1) 9764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 9774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iCount > 0) { 9794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iTabstopsIndex++; 9804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pTabstopContext->m_bTabstops = true; 9814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fRight = 0; 9824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iPieces > 1) { 9834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann XFA_TextPiece* p = pPieceLine->m_textPieces[iPieces - 2].get(); 9844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fRight = p->rtPiece.right(); 9854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 9864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pTabstopContext->m_fTabWidth = 9874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pPiece->rtPiece.width + pPiece->rtPiece.left - fRight; 9884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (iTabstopsIndex > -1) { 9894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fLeft = 0; 9904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_pTabstopContext->m_bTabstops) { 9914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann XFA_TABSTOPS* pTabstops = 9924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pTabstopContext->m_tabstops.GetDataPtr(iTabstopsIndex); 9934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t dwAlign = pTabstops->dwAlign; 9944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (dwAlign == FX_HashCode_GetW(L"center", false)) { 9954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLeft = pPiece->rtPiece.width / 2.0f; 9964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (dwAlign == FX_HashCode_GetW(L"right", false) || 9974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dwAlign == FX_HashCode_GetW(L"before", false)) { 9984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLeft = pPiece->rtPiece.width; 9994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (dwAlign == FX_HashCode_GetW(L"decimal", false)) { 10004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iChars = pPiece->iChars; 10014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < iChars; i++) { 10025ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (pPiece->szText[i] == L'.') 10034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 10044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 10055ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann fLeft += pPiece->Widths[i] / 20000.0f; 10064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 10074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 10084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pTabstopContext->m_fLeft = 10094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::min(fLeft, m_pTabstopContext->m_fTabWidth); 10104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pTabstopContext->m_bTabstops = false; 10114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pTabstopContext->m_fTabWidth = 0; 10124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 10134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pPiece->rtPiece.left -= m_pTabstopContext->m_fLeft; 10144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 10154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 10164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 10175ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmannvoid CXFA_TextLayout::AppendTextLine(CFX_RTFBreakType dwStatus, 10184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT& fLinePos, 10194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bSavePieces, 10204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bEndBreak) { 10214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iPieces = m_pBreak->CountBreakPieces(); 10224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iPieces < 1) 10234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 10244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 10255ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann CFX_RetainPtr<CFDE_CSSComputedStyle> pStyle; 10264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bSavePieces) { 10274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto pNew = pdfium::MakeUnique<CXFA_PieceLine>(); 10284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_PieceLine* pPieceLine = pNew.get(); 10294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pieceLines.push_back(std::move(pNew)); 10304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_pTabstopContext) 10314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pTabstopContext->Reset(); 10324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 10334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fLineStep = 0, fBaseLine = 0; 10344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t i = 0; 10354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (i = 0; i < iPieces; i++) { 10364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const CFX_RTFPiece* pPiece = m_pBreak->GetBreakPiece(i); 10375ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann CXFA_TextUserData* pUserData = 10385ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann static_cast<CXFA_TextUserData*>(pPiece->m_pUserData.Get()); 10394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pUserData) 10404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pStyle = pUserData->m_pStyle; 10414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fVerScale = pPiece->m_iVerticalScale / 100.0f; 10424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 10434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto pTP = pdfium::MakeUnique<XFA_TextPiece>(); 10444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pTP->iChars = pPiece->m_iChars; 10455ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann pTP->szText = pPiece->GetString(); 10465ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann pTP->Widths = pPiece->GetWidths(); 10474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pTP->iBidiLevel = pPiece->m_iBidiLevel; 10484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pTP->iHorScale = pPiece->m_iHorizontalScale; 10494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pTP->iVerScale = pPiece->m_iVerticalScale; 10505ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann m_textParser.GetUnderline(m_pTextProvider, pStyle.Get(), pTP->iUnderline, 10514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pTP->iPeriod); 10525ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann m_textParser.GetLinethrough(m_pTextProvider, pStyle.Get(), 10535ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann pTP->iLineThrough); 10545ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann pTP->dwColor = m_textParser.GetColor(m_pTextProvider, pStyle.Get()); 10555ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann pTP->pFont = m_textParser.GetFont(m_pTextProvider, pStyle.Get()); 10565ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann pTP->fFontSize = m_textParser.GetFontSize(m_pTextProvider, pStyle.Get()); 10574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pTP->rtPiece.left = pPiece->m_iStartPos / 20000.0f; 10584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pTP->rtPiece.width = pPiece->m_iWidth / 20000.0f; 10594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pTP->rtPiece.height = (FX_FLOAT)pPiece->m_iFontSize * fVerScale / 20.0f; 10604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fBaseLineTemp = 10615ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann m_textParser.GetBaseline(m_pTextProvider, pStyle.Get()); 10624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pTP->rtPiece.top = fBaseLineTemp; 10634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 10644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fLineHeight = m_textParser.GetLineHeight( 10655ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann m_pTextProvider, pStyle.Get(), m_iLines == 0, fVerScale); 10664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (fBaseLineTemp > 0) { 10674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fLineHeightTmp = fBaseLineTemp + pTP->rtPiece.height; 10684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (fLineHeight < fLineHeightTmp) 10694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLineHeight = fLineHeightTmp; 10704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else 10714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fBaseLineTemp = 0; 10724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (fBaseLine < -fBaseLineTemp) { 10734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fBaseLine = -fBaseLineTemp; 10744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 10754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLineStep = std::max(fLineStep, fLineHeight); 10765ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann pTP->pLinkData = pUserData ? pUserData->m_pLinkData : nullptr; 10774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pPieceLine->m_textPieces.push_back(std::move(pTP)); 10785ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann DoTabstops(pStyle.Get(), pPieceLine); 10794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 10804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (const auto& pTP : pPieceLine->m_textPieces) { 10814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT& fTop = pTP->rtPiece.top; 10824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fBaseLineTemp = fTop; 10834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fTop = fLinePos + fLineStep - pTP->rtPiece.height - fBaseLineTemp; 10844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fTop = std::max(0.0f, fTop); 10854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 10864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLinePos += fLineStep + fBaseLine; 10874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 10884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fLineStep = 0; 10894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fLineWidth = 0; 10904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < iPieces; i++) { 10914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const CFX_RTFPiece* pPiece = m_pBreak->GetBreakPiece(i); 10925ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann CXFA_TextUserData* pUserData = 10935ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann static_cast<CXFA_TextUserData*>(pPiece->m_pUserData.Get()); 10944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pUserData) 10954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pStyle = pUserData->m_pStyle; 10964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fVerScale = pPiece->m_iVerticalScale / 100.0f; 10975ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann FX_FLOAT fBaseLine = 10985ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann m_textParser.GetBaseline(m_pTextProvider, pStyle.Get()); 10994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fLineHeight = m_textParser.GetLineHeight( 11005ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann m_pTextProvider, pStyle.Get(), m_iLines == 0, fVerScale); 11014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (fBaseLine > 0) { 11024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fLineHeightTmp = 11034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fBaseLine + (FX_FLOAT)pPiece->m_iFontSize * fVerScale / 20.0f; 11044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (fLineHeight < fLineHeightTmp) { 11054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLineHeight = fLineHeightTmp; 11064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 11074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 11084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLineStep = std::max(fLineStep, fLineHeight); 11094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLineWidth += pPiece->m_iWidth / 20000.0f; 11104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 11114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLinePos += fLineStep; 11124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_fMaxWidth = std::max(m_fMaxWidth, fLineWidth); 11134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_pLoader && m_pLoader->m_bSaveLineHeight) { 11144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fHeight = fLinePos - m_pLoader->m_fLastPos; 11154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_fLastPos = fLinePos; 11164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_lineHeights.Add(fHeight); 11174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 11184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 11194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 11204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pBreak->ClearBreakPieces(); 11215ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (dwStatus == CFX_RTFBreakType::Paragraph) { 11224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pBreak->Reset(); 11234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pStyle && bEndBreak) { 11244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Para para = m_pTextProvider->GetParaNode(); 11254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (para) { 11264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fStartPos = para.GetMarginLeft(); 11274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fIndent = para.GetTextIndent(); 11284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (fIndent > 0) 11294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fStartPos += fIndent; 11304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 11314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fSpaceBelow = para.GetSpaceBelow(); 11324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (fSpaceBelow < 0.1f) 11334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fSpaceBelow = 0; 11344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 11354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pBreak->SetLineStartPos(fStartPos); 11364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLinePos += fSpaceBelow; 11374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 11384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 11394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 11404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 11414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pStyle) { 11424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fStart = 0; 11434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const FDE_CSSRect* pRect = pStyle->GetMarginWidth(); 11444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pRect) 11454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fStart = pRect->left.GetValue(); 11464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 11474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fTextIndent = pStyle->GetTextIndent().GetValue(); 11484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (fTextIndent < 0) 11494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fStart -= fTextIndent; 11504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 11514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pBreak->SetLineStartPos(fStart); 11524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 11534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iLines++; 11544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 11554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 11564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_TextLayout::RenderString(CFDE_RenderDevice* pDevice, 11574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFDE_Brush* pBrush, 11584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_PieceLine* pPieceLine, 11594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iPiece, 11604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FXTEXT_CHARPOS* pCharPos, 11614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const CFX_Matrix& tmDoc2Device) { 11624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const XFA_TextPiece* pPiece = pPieceLine->m_textPieces[iPiece].get(); 11634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iCount = GetDisplayPos(pPiece, pCharPos); 11644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iCount > 0) { 11654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pBrush->SetColor(pPiece->dwColor); 11664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pDevice->DrawString(pBrush, pPiece->pFont, pCharPos, iCount, 11674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pPiece->fFontSize, &tmDoc2Device); 11684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 11694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pPieceLine->m_charCounts.Add(iCount); 11704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 11714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 11724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_TextLayout::RenderPath(CFDE_RenderDevice* pDevice, 11734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFDE_Pen* pPen, 11744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_PieceLine* pPieceLine, 11754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iPiece, 11764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FXTEXT_CHARPOS* pCharPos, 11774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const CFX_Matrix& tmDoc2Device) { 11784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann XFA_TextPiece* pPiece = pPieceLine->m_textPieces[iPiece].get(); 11794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bNoUnderline = pPiece->iUnderline < 1 || pPiece->iUnderline > 2; 11804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bNoLineThrough = pPiece->iLineThrough < 1 || pPiece->iLineThrough > 2; 11814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bNoUnderline && bNoLineThrough) 11824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 11834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 11844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pPen->SetColor(pPiece->dwColor); 11854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFDE_Path> pPath(new CFDE_Path); 11864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iChars = GetDisplayPos(pPiece, pCharPos); 11874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iChars > 0) { 11884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_PointF pt1, pt2; 11895ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann FX_FLOAT fEndY = pCharPos[0].m_Origin.y + 1.05f; 11904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pPiece->iPeriod == XFA_ATTRIBUTEENUM_Word) { 11914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < pPiece->iUnderline; i++) { 11924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t j = 0; j < iChars; j++) { 11935ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann pt1.x = pCharPos[j].m_Origin.x; 11944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pt2.x = 11954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pt1.x + pCharPos[j].m_FontCharWidth * pPiece->fFontSize / 1000.0f; 11964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pt1.y = pt2.y = fEndY; 11974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pPath->AddLine(pt1, pt2); 11984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 11994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fEndY += 2.0f; 12004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 12014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 12025ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann pt1.x = pCharPos[0].m_Origin.x; 12034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pt2.x = 12045ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann pCharPos[iChars - 1].m_Origin.x + 12054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos[iChars - 1].m_FontCharWidth * pPiece->fFontSize / 1000.0f; 12064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < pPiece->iUnderline; i++) { 12074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pt1.y = pt2.y = fEndY; 12084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pPath->AddLine(pt1, pt2); 12094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fEndY += 2.0f; 12104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 12114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 12125ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann fEndY = pCharPos[0].m_Origin.y - pPiece->rtPiece.height * 0.25f; 12135ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann pt1.x = pCharPos[0].m_Origin.x; 12145ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann pt2.x = pCharPos[iChars - 1].m_Origin.x + 12154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos[iChars - 1].m_FontCharWidth * pPiece->fFontSize / 1000.0f; 12164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < pPiece->iLineThrough; i++) { 12174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pt1.y = pt2.y = fEndY; 12184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pPath->AddLine(pt1, pt2); 12194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fEndY += 2.0f; 12204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 12214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 12224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bNoLineThrough && 12234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (bNoUnderline || pPiece->iPeriod != XFA_ATTRIBUTEENUM_All)) { 12244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 12254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 12264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iCharsTmp = 0; 12274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iPiecePrev = iPiece, iPieceNext = iPiece; 12284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (iPiecePrev > 0) { 12294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iPiecePrev--; 12304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharsTmp = pPieceLine->m_charCounts.GetAt(iPiecePrev); 12314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iCharsTmp > 0) 12324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 12334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 12344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iCharsTmp == 0) 12354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 12364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 12374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharsTmp = 0; 12384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iPieces = pdfium::CollectionSize<int32_t>(pPieceLine->m_textPieces); 12394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (iPieceNext < iPieces - 1) { 12404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iPieceNext++; 12414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharsTmp = pPieceLine->m_charCounts.GetAt(iPieceNext); 12424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iCharsTmp > 0) 12434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 12444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 12454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iCharsTmp == 0) 12464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 12474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 12484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fOrgX = 0.0f; 12494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fEndX = 0.0f; 12504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pPiece = pPieceLine->m_textPieces[iPiecePrev].get(); 12514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iChars = GetDisplayPos(pPiece, pCharPos); 12524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iChars < 1) 12534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 12544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 12555ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann fOrgX = pCharPos[iChars - 1].m_Origin.x + 12564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos[iChars - 1].m_FontCharWidth * pPiece->fFontSize / 1000.0f; 12574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pPiece = pPieceLine->m_textPieces[iPieceNext].get(); 12584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iChars = GetDisplayPos(pPiece, pCharPos); 12594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iChars < 1) 12604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 12614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 12625ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann fEndX = pCharPos[0].m_Origin.x; 12635ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann CFX_PointF pt1; 12645ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann CFX_PointF pt2; 12655ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann pt1.x = fOrgX; 12665ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann pt2.x = fEndX; 12675ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann FX_FLOAT fEndY = pCharPos[0].m_Origin.y + 1.05f; 12684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < pPiece->iUnderline; i++) { 12695ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann pt1.y = fEndY; 12705ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann pt2.y = fEndY; 12714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pPath->AddLine(pt1, pt2); 12724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fEndY += 2.0f; 12734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 12745ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann fEndY = pCharPos[0].m_Origin.y - pPiece->rtPiece.height * 0.25f; 12754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < pPiece->iLineThrough; i++) { 12765ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann pt1.y = fEndY; 12775ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann pt2.y = fEndY; 12784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pPath->AddLine(pt1, pt2); 12794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fEndY += 2.0f; 12804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 12814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 12824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pDevice->DrawPath(pPen, 1, pPath.get(), &tmDoc2Device); 12834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 12844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 12854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint32_t CXFA_TextLayout::GetDisplayPos(const XFA_TextPiece* pPiece, 12864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FXTEXT_CHARPOS* pCharPos, 12874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bCharCode) { 12884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pPiece) 12894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 0; 12904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 12914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_RTFTEXTOBJ tr; 12924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!ToRun(pPiece, &tr)) 12934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 0; 12944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return m_pBreak->GetDisplayPos(&tr, pCharPos, bCharCode); 12954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 12964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 12974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_TextLayout::ToRun(const XFA_TextPiece* pPiece, FX_RTFTEXTOBJ* tr) { 12984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iLength = pPiece->iChars; 12994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iLength < 1) 13004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 13014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 13025ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann tr->pStr = pPiece->szText; 13034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tr->pFont = pPiece->pFont; 13044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tr->pRect = &pPiece->rtPiece; 13055ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann tr->pWidths = pPiece->Widths; 13064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tr->iLength = iLength; 13074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tr->fFontSize = pPiece->fFontSize; 13084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tr->iBidiLevel = pPiece->iBidiLevel; 13094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tr->wLineBreakChar = L'\n'; 13104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tr->iVerticalScale = pPiece->iVerScale; 13114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tr->iHorizontalScale = pPiece->iHorScale; 13124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 13134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1314