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 7d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/cxfa_textlayout.h" 84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <algorithm> 104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <utility> 114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 12d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/css/cfx_csscomputedstyle.h" 13d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/css/cfx_cssstyleselector.h" 14d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/xml/cfx_xmlelement.h" 15d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/xml/cfx_xmlnode.h" 16d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/xml/cfx_xmltext.h" 17d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxge/cfx_graphstatedata.h" 18d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxge/cfx_pathdata.h" 19d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "fxjs/xfa/cjx_object.h" 204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "third_party/base/ptr_util.h" 214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "third_party/base/stl_util.h" 22d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fde/cfde_textout.h" 23d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fgas/font/cfgas_gefont.h" 24d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/cxfa_linkuserdata.h" 25d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/cxfa_loadercontext.h" 26d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/cxfa_pieceline.h" 27d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/cxfa_textparsecontext.h" 28d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/cxfa_textpiece.h" 29d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/cxfa_textprovider.h" 30d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/cxfa_texttabstopscontext.h" 31d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/cxfa_textuserdata.h" 324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/parser/cxfa_font.h" 33d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_node.h" 344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/parser/cxfa_para.h" 354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define XFA_LOADERCNTXTFLG_FILTERSPACE 0x001 374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 38d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_TextLayout::CXFA_TextLayout(CXFA_FFDoc* doc, 39d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_TextProvider* pTextProvider) 404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann : m_bHasBlock(false), 41d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_pDoc(doc), 424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pTextProvider(pTextProvider), 434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pTextDataNode(nullptr), 444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_bRichText(false), 454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iLines(0), 464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_fMaxWidth(0), 474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_bBlockContinue(true) { 484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(m_pTextProvider); 494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCXFA_TextLayout::~CXFA_TextLayout() { 524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_textParser.Reset(); 534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann Unload(); 544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_TextLayout::Unload() { 574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pieceLines.clear(); 584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pBreak.reset(); 594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_TextLayout::GetTextDataNode() { 624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_pTextProvider) 634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Node* pNode = m_pTextProvider->GetTextNode(m_bRichText); 664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pNode && m_bRichText) 674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_textParser.Reset(); 684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pTextDataNode = pNode; 704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 72d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCFX_XMLNode* CXFA_TextLayout::GetXMLContainerNode() { 734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_bRichText) 744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nullptr; 754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 76d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFX_XMLNode* pXMLRoot = m_pTextDataNode->GetXMLMappingNode(); 774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pXMLRoot) 784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nullptr; 794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 80d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFX_XMLNode* pXMLContainer = nullptr; 81d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (CFX_XMLNode* pXMLChild = pXMLRoot->GetNodeItem(CFX_XMLNode::FirstChild); 824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pXMLChild; 83d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pXMLChild = pXMLChild->GetNodeItem(CFX_XMLNode::NextSibling)) { 84d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (pXMLChild->GetType() == FX_XMLNODE_Element) { 85d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFX_XMLElement* pXMLElement = static_cast<CFX_XMLElement*>(pXMLChild); 86d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsTag = pXMLElement->GetLocalTagName(); 8733357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann if (wsTag == L"body" || wsTag == L"html") { 884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pXMLContainer = pXMLChild; 894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return pXMLContainer; 944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmannstd::unique_ptr<CFX_RTFBreak> CXFA_TextLayout::CreateBreak(bool bDefault) { 97d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann uint32_t dwStyle = FX_LAYOUTSTYLE_ExpandTab; 984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!bDefault) 99d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann dwStyle |= FX_LAYOUTSTYLE_Pagination; 1004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 10133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann auto pBreak = pdfium::MakeUnique<CFX_RTFBreak>(dwStyle); 1024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pBreak->SetLineBreakTolerance(1); 103d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pBreak->SetFont(m_textParser.GetFont(m_pDoc, m_pTextProvider, nullptr)); 1044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pBreak->SetFontSize(m_textParser.GetFontSize(m_pTextProvider, nullptr)); 1054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return pBreak; 1064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 108d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CXFA_TextLayout::InitBreak(float fLineWidth) { 109d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Para* para = m_pTextProvider->GetParaIfExists(); 110d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fStart = 0; 111d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fStartPos = 0; 1124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (para) { 11333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann CFX_RTFLineAlignment iAlign = CFX_RTFLineAlignment::Left; 114d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann switch (para->GetHorizontalAlign()) { 115d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case XFA_AttributeEnum::Center: 11633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann iAlign = CFX_RTFLineAlignment::Center; 1174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 118d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case XFA_AttributeEnum::Right: 11933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann iAlign = CFX_RTFLineAlignment::Right; 1204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 121d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case XFA_AttributeEnum::Justify: 12233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann iAlign = CFX_RTFLineAlignment::Justified; 1234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 124d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case XFA_AttributeEnum::JustifyAll: 12533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann iAlign = CFX_RTFLineAlignment::Distributed; 1264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 127d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case XFA_AttributeEnum::Left: 128d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case XFA_AttributeEnum::Radix: 129d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann break; 130d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann default: 131d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann NOTREACHED(); 132d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann break; 1334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pBreak->SetAlignment(iAlign); 1354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 136d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann fStart = para->GetMarginLeft(); 1374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_pTextProvider->IsCheckButtonAndAutoWidth()) { 13833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann if (iAlign != CFX_RTFLineAlignment::Left) 139d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann fLineWidth -= para->GetMarginRight(); 1404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 141d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann fLineWidth -= para->GetMarginRight(); 1424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (fLineWidth < 0) 1444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLineWidth = fStart; 1454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fStartPos = fStart; 147d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fIndent = para->GetTextIndent(); 1484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (fIndent > 0) 1494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fStartPos += fIndent; 1504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pBreak->SetLineBoundary(fStart, fLineWidth); 1534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pBreak->SetLineStartPos(fStartPos); 154d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 155d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Font* font = m_pTextProvider->GetFontIfExists(); 1564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (font) { 157d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_pBreak->SetHorizontalScale( 158d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann static_cast<int32_t>(font->GetHorizontalScale())); 159d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_pBreak->SetVerticalScale(static_cast<int32_t>(font->GetVerticalScale())); 160d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_pBreak->SetCharSpace(font->GetLetterSpacing()); 1614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 163d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fFontSize = m_textParser.GetFontSize(m_pTextProvider, nullptr); 1644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pBreak->SetFontSize(fFontSize); 165d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_pBreak->SetFont(m_textParser.GetFont(m_pDoc, m_pTextProvider, nullptr)); 1664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pBreak->SetLineBreakTolerance(fFontSize * 0.2f); 1674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 169d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CXFA_TextLayout::InitBreak(CFX_CSSComputedStyle* pStyle, 170d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFX_CSSDisplay eDisplay, 171d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fLineWidth, 172d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFX_XMLNode* pXMLNode, 173d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFX_CSSComputedStyle* pParentStyle) { 1744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pStyle) { 1754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann InitBreak(fLineWidth); 1764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 1774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 179d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (eDisplay == CFX_CSSDisplay::Block || 180d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann eDisplay == CFX_CSSDisplay::ListItem) { 18133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann CFX_RTFLineAlignment iAlign = CFX_RTFLineAlignment::Left; 1824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann switch (pStyle->GetTextAlign()) { 183d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case CFX_CSSTextAlign::Right: 18433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann iAlign = CFX_RTFLineAlignment::Right; 1854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 186d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case CFX_CSSTextAlign::Center: 18733357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann iAlign = CFX_RTFLineAlignment::Center; 1884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 189d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case CFX_CSSTextAlign::Justify: 19033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann iAlign = CFX_RTFLineAlignment::Justified; 1914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 192d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case CFX_CSSTextAlign::JustifyAll: 19333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann iAlign = CFX_RTFLineAlignment::Distributed; 1944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 1954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann default: 1964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 1974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pBreak->SetAlignment(iAlign); 19933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann 200d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fStart = 0; 201d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const CFX_CSSRect* pRect = pStyle->GetMarginWidth(); 202d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const CFX_CSSRect* pPaddingRect = pStyle->GetPaddingWidth(); 2034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pRect) { 2044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fStart = pRect->left.GetValue(); 2054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLineWidth -= pRect->right.GetValue(); 2064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pPaddingRect) { 2074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fStart += pPaddingRect->left.GetValue(); 2084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLineWidth -= pPaddingRect->right.GetValue(); 2094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 210d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (eDisplay == CFX_CSSDisplay::ListItem) { 211d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const CFX_CSSRect* pParRect = pParentStyle->GetMarginWidth(); 212d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const CFX_CSSRect* pParPaddingRect = pParentStyle->GetPaddingWidth(); 2134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pParRect) { 2144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fStart += pParRect->left.GetValue(); 2154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLineWidth -= pParRect->right.GetValue(); 2164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pParPaddingRect) { 2174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fStart += pParPaddingRect->left.GetValue(); 2184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLineWidth -= pParPaddingRect->right.GetValue(); 2194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 221d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFX_CSSRect pNewRect; 222d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNewRect.left.Set(CFX_CSSLengthUnit::Point, fStart); 223d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNewRect.right.Set(CFX_CSSLengthUnit::Point, pRect->right.GetValue()); 224d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNewRect.top.Set(CFX_CSSLengthUnit::Point, pRect->top.GetValue()); 225d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNewRect.bottom.Set(CFX_CSSLengthUnit::Point, pRect->bottom.GetValue()); 2264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pStyle->SetMarginWidth(pNewRect); 2274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pBreak->SetLineBoundary(fStart, fLineWidth); 230d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fIndent = pStyle->GetTextIndent().GetValue(); 2314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (fIndent > 0) 2324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fStart += fIndent; 2334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pBreak->SetLineStartPos(fStart); 2354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pBreak->SetTabWidth(m_textParser.GetTabInterval(pStyle)); 2364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_pTabstopContext) 2374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pTabstopContext = pdfium::MakeUnique<CXFA_TextTabstopsContext>(); 2384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_textParser.GetTabstops(pStyle, m_pTabstopContext.get()); 239d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (const auto& stop : m_pTabstopContext->m_tabstops) 240d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_pBreak->AddPositionedTab(stop.fTabstops); 2414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 242d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fFontSize = m_textParser.GetFontSize(m_pTextProvider, pStyle); 2434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pBreak->SetFontSize(fFontSize); 2444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pBreak->SetLineBreakTolerance(fFontSize * 0.2f); 245d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_pBreak->SetFont(m_textParser.GetFont(m_pDoc, m_pTextProvider, pStyle)); 2464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pBreak->SetHorizontalScale( 2474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_textParser.GetHorScale(m_pTextProvider, pStyle, pXMLNode)); 2484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pBreak->SetVerticalScale(m_textParser.GetVerScale(m_pTextProvider, pStyle)); 2494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pBreak->SetCharSpace(pStyle->GetLetterSpacing().GetValue()); 2504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 252d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannfloat CXFA_TextLayout::GetLayoutHeight() { 2534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_pLoader) 2544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 0; 2554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 256d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (m_pLoader->m_lineHeights.empty() && m_pLoader->m_fWidth > 0) { 2574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_SizeF szMax(m_pLoader->m_fWidth, m_pLoader->m_fHeight); 2584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_bSaveLineHeight = true; 2594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_fLastPos = 0; 260d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFX_SizeF szDef = CalcSize(szMax, szMax); 2614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_bSaveLineHeight = false; 26233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann return szDef.height; 2634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 265d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fHeight = m_pLoader->m_fHeight; 2664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (fHeight < 0.1f) { 2674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fHeight = 0; 268d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (float value : m_pLoader->m_lineHeights) 269d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann fHeight += value; 2704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return fHeight; 2724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 274d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannfloat CXFA_TextLayout::StartLayout(float fWidth) { 2754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_pLoader) 2764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader = pdfium::MakeUnique<CXFA_LoaderContext>(); 2774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 278d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (fWidth < 0 || 279d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann (m_pLoader->m_fWidth > -1 && fabs(fWidth - m_pLoader->m_fWidth) > 0)) { 280d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_pLoader->m_lineHeights.clear(); 281d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_Blocks.clear(); 2824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann Unload(); 2834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_fStartLineOffset = 0; 2844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_fWidth = fWidth; 2864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 287d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (fWidth >= 0) 288d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return fWidth; 289d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 290d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFX_SizeF szMax; 291d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 292d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_pLoader->m_bSaveLineHeight = true; 293d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_pLoader->m_fLastPos = 0; 294d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFX_SizeF szDef = CalcSize(szMax, szMax); 295d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_pLoader->m_bSaveLineHeight = false; 296d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return szDef.width; 2974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 299d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannfloat CXFA_TextLayout::DoLayout(int32_t iBlockIndex, 300d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fCalcHeight, 301d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fContentAreaHeight, 302d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fTextHeight) { 3034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_pLoader) 304d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return fCalcHeight; 3054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 306d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t iBlockCount = pdfium::CollectionSize<int32_t>(m_Blocks); 307d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fHeight = fTextHeight; 3084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (fHeight < 0) 3094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fHeight = GetLayoutHeight(); 3104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_fHeight = fHeight; 3124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (fContentAreaHeight < 0) 313d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return fCalcHeight; 3144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_bHasBlock = true; 3164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iBlockCount == 0 && fHeight > 0) { 3174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fHeight = fTextHeight - GetLayoutHeight(); 3184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (fHeight > 0) { 319d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_AttributeEnum iAlign = m_textParser.GetVAlign(m_pTextProvider); 320d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (iAlign == XFA_AttributeEnum::Middle) 3214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fHeight /= 2.0f; 322d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann else if (iAlign != XFA_AttributeEnum::Bottom) 3234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fHeight = 0; 3244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_fStartLineOffset = fHeight; 3254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 328d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fLinePos = m_pLoader->m_fStartLineOffset; 3294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iLineIndex = 0; 3304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iBlockCount > 1) { 3314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iBlockCount >= (iBlockIndex + 1) * 2) { 332d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann iLineIndex = m_Blocks[iBlockIndex * 2]; 3334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 334d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann iLineIndex = m_Blocks[iBlockCount - 1] + m_Blocks[iBlockCount - 2]; 3354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_pLoader->m_BlocksHeight.empty()) { 3374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < iBlockIndex; i++) 3384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLinePos -= m_pLoader->m_BlocksHeight[i * 2 + 1]; 3394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 342d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t iCount = pdfium::CollectionSize<int32_t>(m_pLoader->m_lineHeights); 3434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t i = 0; 3444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (i = iLineIndex; i < iCount; i++) { 345d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fLineHeight = m_pLoader->m_lineHeights[i]; 346d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (i == iLineIndex && fLineHeight - fContentAreaHeight > 0.001) 347d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return 0; 348d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 3494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (fLinePos + fLineHeight - fContentAreaHeight > 0.001) { 3504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iBlockCount >= (iBlockIndex + 1) * 2) { 351d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_Blocks[iBlockIndex * 2] = iLineIndex; 352d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_Blocks[iBlockIndex * 2 + 1] = i - iLineIndex; 3534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 354d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_Blocks.push_back(iLineIndex); 355d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_Blocks.push_back(i - iLineIndex); 3564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (i == iLineIndex) { 3584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (fCalcHeight <= fLinePos) { 3594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pdfium::CollectionSize<int32_t>(m_pLoader->m_BlocksHeight) > 3604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iBlockIndex * 2 && 3614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (m_pLoader->m_BlocksHeight[iBlockIndex * 2] == iBlockIndex)) { 3624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_BlocksHeight[iBlockIndex * 2 + 1] = fCalcHeight; 3634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 364d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_pLoader->m_BlocksHeight.push_back((float)iBlockIndex); 3654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_BlocksHeight.push_back(fCalcHeight); 3664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 368d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return fCalcHeight; 3694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 370d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return fLinePos; 3714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLinePos += fLineHeight; 3734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 374d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return fCalcHeight; 3754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 3764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint32_t CXFA_TextLayout::CountBlocks() const { 378d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t iCount = pdfium::CollectionSize<int32_t>(m_Blocks) / 2; 3794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return iCount > 0 ? iCount : 1; 3804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 3814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 382d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCFX_SizeF CXFA_TextLayout::CalcSize(const CFX_SizeF& minSize, 383d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const CFX_SizeF& maxSize) { 384d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float width = maxSize.width; 385d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (width < 1) 386d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann width = 0xFFFF; 3874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 38833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann m_pBreak = CreateBreak(false); 389d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fLinePos = 0; 3904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iLines = 0; 3914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_fMaxWidth = 0; 392d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann Loader(width, fLinePos, false); 3934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (fLinePos < 0.1f) 3944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLinePos = m_textParser.GetFontSize(m_pTextProvider, nullptr); 3954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pTabstopContext.reset(); 397d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return CFX_SizeF(m_fMaxWidth, fLinePos); 3984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 3994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 400d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannfloat CXFA_TextLayout::Layout(const CFX_SizeF& size) { 40133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann if (size.width < 1) 402d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return 0.f; 4034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann Unload(); 40533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann m_pBreak = CreateBreak(true); 4064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_pLoader) { 4074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_iTotalLines = -1; 4084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_iChar = 0; 4094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iLines = 0; 412d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fLinePos = 0; 413d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann Loader(size.width, fLinePos, true); 41433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann UpdateAlign(size.height, fLinePos); 4154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pTabstopContext.reset(); 416d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return fLinePos; 4174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 4184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_TextLayout::Layout(int32_t iBlock) { 4204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_pLoader || iBlock < 0 || iBlock >= CountBlocks()) 4214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 4224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_pLoader->m_fWidth < 1) 4234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 4244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_iTotalLines = -1; 4264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iLines = 0; 427d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fLinePos = 0; 4284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Node* pNode = nullptr; 4294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_SizeF szText(m_pLoader->m_fWidth, m_pLoader->m_fHeight); 430d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t iCount = pdfium::CollectionSize<int32_t>(m_Blocks); 4314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iBlocksHeightCount = 4324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pdfium::CollectionSize<int32_t>(m_pLoader->m_BlocksHeight); 4334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iBlocksHeightCount /= 2; 4344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iBlock < iBlocksHeightCount) 4354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 4364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iBlock == iBlocksHeightCount) { 4374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann Unload(); 43833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann m_pBreak = CreateBreak(true); 4394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLinePos = m_pLoader->m_fStartLineOffset; 4404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < iBlocksHeightCount; i++) 4414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLinePos -= m_pLoader->m_BlocksHeight[i * 2 + 1]; 4424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_iChar = 0; 4444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iCount > 1) 445d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_pLoader->m_iTotalLines = m_Blocks[iBlock * 2 + 1]; 4464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 447d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann Loader(szText.width, fLinePos, true); 4484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iCount == 0 && m_pLoader->m_fStartLineOffset < 0.1f) 44933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann UpdateAlign(szText.height, fLinePos); 4504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (m_pTextDataNode) { 4514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iBlock *= 2; 4524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iBlock < iCount - 2) 453d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_pLoader->m_iTotalLines = m_Blocks[iBlock + 1]; 4544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pBreak->Reset(); 4564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_bRichText) { 457d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFX_XMLNode* pContainerNode = GetXMLContainerNode(); 4584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pContainerNode) 4594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 4604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 461d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFX_XMLNode* pXMLNode = m_pLoader->m_pXMLNode; 4624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pXMLNode) 4634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 4644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 465d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFX_XMLNode* pSaveXMLNode = m_pLoader->m_pXMLNode; 4664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (; pXMLNode; 467d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pXMLNode = pXMLNode->GetNodeItem(CFX_XMLNode::NextSibling)) { 468d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!LoadRichText(pXMLNode, szText.width, fLinePos, 469d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_pLoader->m_pParentStyle, true, nullptr)) { 4704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 4714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (!pXMLNode) { 474d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pXMLNode = pSaveXMLNode->GetNodeItem(CFX_XMLNode::Parent); 4754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pXMLNode == pContainerNode) 4764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 477d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!LoadRichText(pXMLNode, szText.width, fLinePos, 478d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_pLoader->m_pParentStyle, true, nullptr, false)) { 4794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 4804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pSaveXMLNode = pXMLNode; 482d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pXMLNode = pXMLNode->GetNodeItem(CFX_XMLNode::NextSibling); 4834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pXMLNode) 4844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 4854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (; pXMLNode; 486d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pXMLNode = pXMLNode->GetNodeItem(CFX_XMLNode::NextSibling)) { 487d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!LoadRichText(pXMLNode, szText.width, fLinePos, 48833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann m_pLoader->m_pParentStyle, true, nullptr)) { 4894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 4904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 4944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pNode = m_pLoader->m_pNode; 4954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pNode) 4964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 497d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann LoadText(pNode, szText.width, fLinePos, true); 4984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iBlock == iCount) { 5014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pTabstopContext.reset(); 5024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader.reset(); 5034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 5054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 5064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_TextLayout::ItemBlocks(const CFX_RectF& rtText, int32_t iBlockIndex) { 5084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_pLoader) 5094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 5104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 511d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t iCountHeight = 512d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pdfium::CollectionSize<int32_t>(m_pLoader->m_lineHeights); 5134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iCountHeight == 0) 5144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 5154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bEndItem = true; 517d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t iBlockCount = pdfium::CollectionSize<int32_t>(m_Blocks); 518d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fLinePos = m_pLoader->m_fStartLineOffset; 5194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iLineIndex = 0; 5204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iBlockIndex > 0) { 5214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iBlockHeightCount = 5224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pdfium::CollectionSize<int32_t>(m_pLoader->m_BlocksHeight); 5234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iBlockHeightCount /= 2; 5244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iBlockHeightCount >= iBlockIndex) { 5254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < iBlockIndex; i++) 5264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLinePos -= m_pLoader->m_BlocksHeight[i * 2 + 1]; 5274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 5284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLinePos = 0; 5294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iLineIndex = m_Blocks[iBlockCount - 1] + m_Blocks[iBlockCount - 2]; 5314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t i = 0; 5344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (i = iLineIndex; i < iCountHeight; i++) { 535d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fLineHeight = m_pLoader->m_lineHeights[i]; 5364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (fLinePos + fLineHeight - rtText.height > 0.001) { 537d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_Blocks.push_back(iLineIndex); 538d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_Blocks.push_back(i - iLineIndex); 5394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bEndItem = false; 5404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 5414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLinePos += fLineHeight; 5434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iCountHeight > 0 && (i - iLineIndex) > 0 && bEndItem) { 545d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_Blocks.push_back(iLineIndex); 546d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_Blocks.push_back(i - iLineIndex); 5474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 5494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_TextLayout::DrawString(CFX_RenderDevice* pFxDevice, 5514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const CFX_Matrix& tmDoc2Device, 5524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const CFX_RectF& rtClip, 5534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iBlock) { 5544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pFxDevice) 5554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 5564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 557d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pFxDevice->SaveState(); 558d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pFxDevice->SetClip_Rect(rtClip); 5594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_pieceLines.empty()) { 5614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iBlockCount = CountBlocks(); 5624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < iBlockCount; i++) 5634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann Layout(i); 5644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FXTEXT_CHARPOS* pCharPos = nullptr; 5674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iCharCount = 0; 5684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iLineStart = 0; 5694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iPieceLines = pdfium::CollectionSize<int32_t>(m_pieceLines); 570d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t iCount = pdfium::CollectionSize<int32_t>(m_Blocks); 5714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iCount > 0) { 5724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iBlock *= 2; 5734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iBlock < iCount) { 574d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann iLineStart = m_Blocks[iBlock]; 575d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann iPieceLines = m_Blocks[iBlock + 1]; 5764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 5774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iPieceLines = 0; 5784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < iPieceLines; i++) { 5824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (i + iLineStart >= pdfium::CollectionSize<int32_t>(m_pieceLines)) 5834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 5844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_PieceLine* pPieceLine = m_pieceLines[i + iLineStart].get(); 5864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iPieces = pdfium::CollectionSize<int32_t>(pPieceLine->m_textPieces); 5874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t j = 0; 5884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (j = 0; j < iPieces; j++) { 589d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const CXFA_TextPiece* pPiece = pPieceLine->m_textPieces[j].get(); 5904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iChars = pPiece->iChars; 5914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iCharCount < iChars) { 5924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_Free(pCharPos); 5934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos = FX_Alloc(FXTEXT_CHARPOS, iChars); 5944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharCount = iChars; 5954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 596d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann memset(pCharPos, 0, iCharCount * sizeof(FXTEXT_CHARPOS)); 597d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann RenderString(pFxDevice, pPieceLine, j, pCharPos, tmDoc2Device); 5984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 599d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (j = 0; j < iPieces; j++) 600d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann RenderPath(pFxDevice, pPieceLine, j, pCharPos, tmDoc2Device); 6014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 602d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pFxDevice->RestoreState(false); 6034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_Free(pCharPos); 6044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return iPieceLines > 0; 6054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 6064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 607d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CXFA_TextLayout::UpdateAlign(float fHeight, float fBottom) { 6084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fHeight -= fBottom; 6094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (fHeight < 0.1f) 6104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 6114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann switch (m_textParser.GetVAlign(m_pTextProvider)) { 613d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case XFA_AttributeEnum::Middle: 6144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fHeight /= 2.0f; 6154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 616d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case XFA_AttributeEnum::Bottom: 6174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 6184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann default: 6194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 6204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (const auto& pPieceLine : m_pieceLines) { 6234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (const auto& pPiece : pPieceLine->m_textPieces) 6244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pPiece->rtPiece.top += fHeight; 6254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 6274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 628d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CXFA_TextLayout::Loader(float textWidth, 629d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float& fLinePos, 6304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bSavePieces) { 6314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann GetTextDataNode(); 6324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_pTextDataNode) 6334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 6344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_bRichText) { 636d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFX_XMLNode* pXMLContainer = GetXMLContainerNode(); 6374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pXMLContainer) { 6384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_textParser.IsParsed()) 6394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_textParser.DoParse(pXMLContainer, m_pTextProvider); 6404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 64133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann auto pRootStyle = m_textParser.CreateRootStyle(m_pTextProvider); 642d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann LoadRichText(pXMLContainer, textWidth, fLinePos, pRootStyle, bSavePieces, 64333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann nullptr); 6444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 646d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann LoadText(m_pTextDataNode, textWidth, fLinePos, bSavePieces); 6474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 6494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 6504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_TextLayout::LoadText(CXFA_Node* pNode, 652d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float textWidth, 653d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float& fLinePos, 6544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bSavePieces) { 655d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann InitBreak(textWidth); 6564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 657d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Para* para = m_pTextProvider->GetParaIfExists(); 658d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fSpaceAbove = 0; 6594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (para) { 660d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann fSpaceAbove = para->GetSpaceAbove(); 661d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (fSpaceAbove < 0.1f) 6624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fSpaceAbove = 0; 663d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 664d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann switch (para->GetVerticalAlign()) { 665d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case XFA_AttributeEnum::Top: 666d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case XFA_AttributeEnum::Middle: 667d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case XFA_AttributeEnum::Bottom: { 6684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLinePos += fSpaceAbove; 6694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 6704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 671d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann default: 672d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann NOTREACHED(); 673d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann break; 6744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 677d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsText = pNode->JSObject()->GetContent(false); 6784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsText.TrimRight(L" "); 6794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bRet = AppendChar(wsText, fLinePos, fSpaceAbove, bSavePieces); 6804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bRet && m_pLoader) 6814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_pNode = pNode; 6824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else 683d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann EndBreak(CFX_BreakType::Paragraph, fLinePos, bSavePieces); 6844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 6854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 68633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmannbool CXFA_TextLayout::LoadRichText( 687d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFX_XMLNode* pXMLNode, 688d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float textWidth, 689d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float& fLinePos, 690d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const RetainPtr<CFX_CSSComputedStyle>& pParentStyle, 69133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann bool bSavePieces, 692d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann RetainPtr<CXFA_LinkUserData> pLinkData, 69333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann bool bEndBreak, 69433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann bool bIsOl, 69533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann int32_t iLiCount) { 6964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pXMLNode) 6974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 6984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_TextParseContext* pContext = 7004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_textParser.GetParseContextFromMap(pXMLNode); 701d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFX_CSSDisplay eDisplay = CFX_CSSDisplay::None; 7024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bContentNode = false; 703d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fSpaceBelow = 0; 704d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann RetainPtr<CFX_CSSComputedStyle> pStyle; 705d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsName; 7064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bEndBreak) { 7074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bCurOl = false; 7084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bCurLi = false; 709d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFX_XMLElement* pElement = nullptr; 7104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pContext) { 7114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_bBlockContinue || 7124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (m_pLoader && pXMLNode == m_pLoader->m_pXMLNode)) { 7134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_bBlockContinue = true; 7144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 715d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (pXMLNode->GetType() == FX_XMLNODE_Text) { 7164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bContentNode = true; 717d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } else if (pXMLNode->GetType() == FX_XMLNODE_Element) { 718d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pElement = static_cast<CFX_XMLElement*>(pXMLNode); 719d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsName = pElement->GetLocalTagName(); 7204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 72133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann if (wsName == L"ol") { 7224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bIsOl = true; 7234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bCurOl = true; 7244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 7254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_bBlockContinue || bContentNode == false) { 7264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann eDisplay = pContext->GetDisplay(); 727d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (eDisplay != CFX_CSSDisplay::Block && 728d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann eDisplay != CFX_CSSDisplay::Inline && 729d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann eDisplay != CFX_CSSDisplay::ListItem) { 7304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 7314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 7324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 73333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann pStyle = m_textParser.ComputeStyle(pXMLNode, pParentStyle.Get()); 73433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann InitBreak(bContentNode ? pParentStyle.Get() : pStyle.Get(), eDisplay, 735d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann textWidth, pXMLNode, pParentStyle.Get()); 736d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if ((eDisplay == CFX_CSSDisplay::Block || 737d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann eDisplay == CFX_CSSDisplay::ListItem) && 7384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pStyle && 73933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann (wsName.IsEmpty() || (wsName != L"body" && wsName != L"html" && 74033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann wsName != L"ol" && wsName != L"ul"))) { 741d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const CFX_CSSRect* pRect = pStyle->GetMarginWidth(); 7424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pRect) { 7434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLinePos += pRect->top.GetValue(); 7444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fSpaceBelow = pRect->bottom.GetValue(); 7454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 7464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 7474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 74833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann if (wsName == L"a") { 7494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(pElement); 750d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsLinkContent = pElement->GetString(L"href"); 7514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!wsLinkContent.IsEmpty()) { 75233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann pLinkData = pdfium::MakeRetain<CXFA_LinkUserData>( 7534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsLinkContent.GetBuffer(wsLinkContent.GetLength())); 7544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsLinkContent.ReleaseBuffer(wsLinkContent.GetLength()); 7554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 7564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 7574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 75833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann int32_t iTabCount = m_textParser.CountTabs( 75933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann bContentNode ? pParentStyle.Get() : pStyle.Get()); 76033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann bool bSpaceRun = m_textParser.IsSpaceRun( 76133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann bContentNode ? pParentStyle.Get() : pStyle.Get()); 762d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsText; 7634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bContentNode && iTabCount == 0) { 764d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsText = static_cast<CFX_XMLText*>(pXMLNode)->GetText(); 76533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann } else if (wsName == L"br") { 7664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsText = L'\n'; 76733357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann } else if (wsName == L"li") { 7684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bCurLi = true; 7694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bIsOl) 770d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsText = WideString::Format(L"%d. ", iLiCount); 7714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else 772d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsText = 0x00B7 + WideStringView(L" ", 1); 7734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (!bContentNode) { 7744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iTabCount > 0) { 7754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (iTabCount-- > 0) 7764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsText += L'\t'; 7774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 7784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_textParser.GetEmbbedObj(m_pTextProvider, pXMLNode, wsText); 7794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 7804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 7814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 7824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iLength = wsText.GetLength(); 7834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iLength > 0 && bContentNode && !bSpaceRun) 7844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ProcessText(wsText); 7854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 7864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_pLoader) { 7874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (wsText.GetLength() > 0 && 7884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (m_pLoader->m_dwFlags & XFA_LOADERCNTXTFLG_FILTERSPACE)) { 789d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsText.TrimLeft(L" "); 7904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 791d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (CFX_CSSDisplay::Block == eDisplay) { 7924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_dwFlags |= XFA_LOADERCNTXTFLG_FILTERSPACE; 793d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } else if (CFX_CSSDisplay::Inline == eDisplay && 7944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (m_pLoader->m_dwFlags & XFA_LOADERCNTXTFLG_FILTERSPACE)) { 7954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_dwFlags &= ~XFA_LOADERCNTXTFLG_FILTERSPACE; 7964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (wsText.GetLength() > 0 && 797d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann (0x20 == wsText[wsText.GetLength() - 1])) { 7984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_dwFlags |= XFA_LOADERCNTXTFLG_FILTERSPACE; 7994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (wsText.GetLength() != 0) { 8004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_dwFlags &= ~XFA_LOADERCNTXTFLG_FILTERSPACE; 8014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (wsText.GetLength() > 0) { 8054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_pLoader || m_pLoader->m_iChar == 0) { 80633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann auto pUserData = pdfium::MakeRetain<CXFA_TextUserData>( 8074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bContentNode ? pParentStyle : pStyle, pLinkData); 8084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pBreak->SetUserData(pUserData); 8094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (AppendChar(wsText, fLinePos, 0, bSavePieces)) { 8124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_pLoader) 8134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_dwFlags &= ~XFA_LOADERCNTXTFLG_FILTERSPACE; 8144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (IsEnd(bSavePieces)) { 8154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_pLoader && m_pLoader->m_iTotalLines > -1) { 8164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_pXMLNode = pXMLNode; 8174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_pParentStyle = pParentStyle; 8184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 8204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 8224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 827d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (CFX_XMLNode* pChildNode = 828d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pXMLNode->GetNodeItem(CFX_XMLNode::FirstChild); 8294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pChildNode; 830d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pChildNode = pChildNode->GetNodeItem(CFX_XMLNode::NextSibling)) { 8314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bCurOl) 8324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iLiCount++; 8334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 834d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!LoadRichText(pChildNode, textWidth, fLinePos, 8354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext ? pStyle : pParentStyle, bSavePieces, 8364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pLinkData, true, bIsOl, iLiCount)) 8374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 8384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_pLoader) { 841d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (CFX_CSSDisplay::Block == eDisplay) 8424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_dwFlags |= XFA_LOADERCNTXTFLG_FILTERSPACE; 8434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bCurLi) 845d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann EndBreak(CFX_BreakType::Line, fLinePos, bSavePieces); 8464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 8474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pContext) 8484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann eDisplay = pContext->GetDisplay(); 8494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_bBlockContinue) { 8524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pContext && !bContentNode) { 853d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFX_BreakType dwStatus = (eDisplay == CFX_CSSDisplay::Block) 854d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ? CFX_BreakType::Paragraph 855d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann : CFX_BreakType::Piece; 8564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EndBreak(dwStatus, fLinePos, bSavePieces); 857d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (eDisplay == CFX_CSSDisplay::Block) { 8584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLinePos += fSpaceBelow; 8594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_pTabstopContext) 8604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pTabstopContext->RemoveAll(); 8614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (IsEnd(bSavePieces)) { 8634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_pLoader && m_pLoader->m_iTotalLines > -1) { 8644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_pXMLNode = 865d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pXMLNode->GetNodeItem(CFX_XMLNode::NextSibling); 8664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_pParentStyle = pParentStyle; 8674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 8694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 8734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 8744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 875d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CXFA_TextLayout::AppendChar(const WideString& wsText, 876d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float& fLinePos, 877d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fSpaceAbove, 8784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bSavePieces) { 879d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFX_BreakType dwStatus = CFX_BreakType::None; 8804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iChar = 0; 8814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_pLoader) 8824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iChar = m_pLoader->m_iChar; 8834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iLength = wsText.GetLength(); 8854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = iChar; i < iLength; i++) { 886d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wchar_t wch = wsText[i]; 8874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (wch == 0xA0) 8884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wch = 0x20; 8894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 89033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann dwStatus = m_pBreak->AppendChar(wch); 891d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (dwStatus != CFX_BreakType::None && dwStatus != CFX_BreakType::Piece) { 8924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann AppendTextLine(dwStatus, fLinePos, bSavePieces); 8934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (IsEnd(bSavePieces)) { 8944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_pLoader) 8954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_iChar = i; 8964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 8974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 898d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (dwStatus == CFX_BreakType::Paragraph && m_bRichText) 8994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLinePos += fSpaceAbove; 9004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 9014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 9024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_pLoader) 9034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_iChar = 0; 9044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 9064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 9074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_TextLayout::IsEnd(bool bSavePieces) { 9094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!bSavePieces) 9104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 9114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_pLoader && m_pLoader->m_iTotalLines > 0) 9124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return m_iLines >= m_pLoader->m_iTotalLines; 9134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 9144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 9154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 916d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CXFA_TextLayout::ProcessText(WideString& wsText) { 9174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iLen = wsText.GetLength(); 9184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iLen == 0) 9194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 9204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 921d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wchar_t* psz = wsText.GetBuffer(iLen); 9224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iTrimLeft = 0; 923d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wchar_t wch = 0, wPrev = 0; 9244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < iLen; i++) { 9254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wch = psz[i]; 9264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (wch < 0x20) 9274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wch = 0x20; 9284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (wch == 0x20 && wPrev == 0x20) 9294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 9304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wPrev = wch; 9324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann psz[iTrimLeft++] = wch; 9334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 9344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsText.ReleaseBuffer(iLen); 9354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsText = wsText.Left(iTrimLeft); 9364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 9374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 938d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CXFA_TextLayout::EndBreak(CFX_BreakType dwStatus, 939d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float& fLinePos, 9404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bSavePieces) { 9414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dwStatus = m_pBreak->EndBreak(dwStatus); 942d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (dwStatus != CFX_BreakType::None && dwStatus != CFX_BreakType::Piece) 9434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann AppendTextLine(dwStatus, fLinePos, bSavePieces, true); 9444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 9454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 946d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CXFA_TextLayout::DoTabstops(CFX_CSSComputedStyle* pStyle, 9474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_PieceLine* pPieceLine) { 9484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pStyle || !pPieceLine) 9494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 9504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 951d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!m_pTabstopContext || m_pTabstopContext->m_tabstops.empty()) 952d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return; 953d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 9544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iPieces = pdfium::CollectionSize<int32_t>(pPieceLine->m_textPieces); 9554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iPieces == 0) 9564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 9574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 958d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_TextPiece* pPiece = pPieceLine->m_textPieces[iPieces - 1].get(); 9594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t& iTabstopsIndex = m_pTabstopContext->m_iTabIndex; 9604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iCount = m_textParser.CountTabs(pStyle); 961d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!pdfium::IndexInBounds(m_pTabstopContext->m_tabstops, iTabstopsIndex)) 9624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 9634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iCount > 0) { 9654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iTabstopsIndex++; 9664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pTabstopContext->m_bTabstops = true; 967d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fRight = 0; 9684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iPieces > 1) { 969d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_TextPiece* p = pPieceLine->m_textPieces[iPieces - 2].get(); 9704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fRight = p->rtPiece.right(); 9714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 9724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pTabstopContext->m_fTabWidth = 9734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pPiece->rtPiece.width + pPiece->rtPiece.left - fRight; 9744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (iTabstopsIndex > -1) { 975d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fLeft = 0; 9764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_pTabstopContext->m_bTabstops) { 977d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann uint32_t dwAlign = m_pTabstopContext->m_tabstops[iTabstopsIndex].dwAlign; 9784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (dwAlign == FX_HashCode_GetW(L"center", false)) { 9794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLeft = pPiece->rtPiece.width / 2.0f; 9804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (dwAlign == FX_HashCode_GetW(L"right", false) || 9814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dwAlign == FX_HashCode_GetW(L"before", false)) { 9824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLeft = pPiece->rtPiece.width; 9834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (dwAlign == FX_HashCode_GetW(L"decimal", false)) { 9844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iChars = pPiece->iChars; 9854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < iChars; i++) { 98633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann if (pPiece->szText[i] == L'.') 9874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 9884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 98933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann fLeft += pPiece->Widths[i] / 20000.0f; 9904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 9914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 9924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pTabstopContext->m_fLeft = 9934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::min(fLeft, m_pTabstopContext->m_fTabWidth); 9944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pTabstopContext->m_bTabstops = false; 9954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pTabstopContext->m_fTabWidth = 0; 9964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 9974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pPiece->rtPiece.left -= m_pTabstopContext->m_fLeft; 9984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 9994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 10004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1001d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CXFA_TextLayout::AppendTextLine(CFX_BreakType dwStatus, 1002d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float& fLinePos, 10034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bSavePieces, 10044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bEndBreak) { 10054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iPieces = m_pBreak->CountBreakPieces(); 10064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iPieces < 1) 10074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 10084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1009d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann RetainPtr<CFX_CSSComputedStyle> pStyle; 10104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bSavePieces) { 10114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto pNew = pdfium::MakeUnique<CXFA_PieceLine>(); 10124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_PieceLine* pPieceLine = pNew.get(); 10134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pieceLines.push_back(std::move(pNew)); 10144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_pTabstopContext) 10154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pTabstopContext->Reset(); 10164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1017d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fLineStep = 0, fBaseLine = 0; 10184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t i = 0; 10194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (i = 0; i < iPieces; i++) { 1020d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const CFX_BreakPiece* pPiece = m_pBreak->GetBreakPieceUnstable(i); 1021d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_TextUserData* pUserData = pPiece->m_pUserData.Get(); 10224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pUserData) 10234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pStyle = pUserData->m_pStyle; 1024d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fVerScale = pPiece->m_iVerticalScale / 100.0f; 10254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1026d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann auto pTP = pdfium::MakeUnique<CXFA_TextPiece>(); 10274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pTP->iChars = pPiece->m_iChars; 102833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann pTP->szText = pPiece->GetString(); 102933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann pTP->Widths = pPiece->GetWidths(); 10304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pTP->iBidiLevel = pPiece->m_iBidiLevel; 10314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pTP->iHorScale = pPiece->m_iHorizontalScale; 10324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pTP->iVerScale = pPiece->m_iVerticalScale; 103333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann m_textParser.GetUnderline(m_pTextProvider, pStyle.Get(), pTP->iUnderline, 10344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pTP->iPeriod); 103533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann m_textParser.GetLinethrough(m_pTextProvider, pStyle.Get(), 103633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann pTP->iLineThrough); 103733357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann pTP->dwColor = m_textParser.GetColor(m_pTextProvider, pStyle.Get()); 1038d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pTP->pFont = m_textParser.GetFont(m_pDoc, m_pTextProvider, pStyle.Get()); 103933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann pTP->fFontSize = m_textParser.GetFontSize(m_pTextProvider, pStyle.Get()); 10404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pTP->rtPiece.left = pPiece->m_iStartPos / 20000.0f; 10414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pTP->rtPiece.width = pPiece->m_iWidth / 20000.0f; 1042d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pTP->rtPiece.height = (float)pPiece->m_iFontSize * fVerScale / 20.0f; 1043d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fBaseLineTemp = 104433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann m_textParser.GetBaseline(m_pTextProvider, pStyle.Get()); 10454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pTP->rtPiece.top = fBaseLineTemp; 10464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1047d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fLineHeight = m_textParser.GetLineHeight( 104833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann m_pTextProvider, pStyle.Get(), m_iLines == 0, fVerScale); 10494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (fBaseLineTemp > 0) { 1050d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fLineHeightTmp = fBaseLineTemp + pTP->rtPiece.height; 10514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (fLineHeight < fLineHeightTmp) 10524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLineHeight = fLineHeightTmp; 10534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else 10544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fBaseLineTemp = 0; 10554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (fBaseLine < -fBaseLineTemp) { 10564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fBaseLine = -fBaseLineTemp; 10574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 10584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLineStep = std::max(fLineStep, fLineHeight); 105933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann pTP->pLinkData = pUserData ? pUserData->m_pLinkData : nullptr; 10604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pPieceLine->m_textPieces.push_back(std::move(pTP)); 106133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann DoTabstops(pStyle.Get(), pPieceLine); 10624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 10634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (const auto& pTP : pPieceLine->m_textPieces) { 1064d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float& fTop = pTP->rtPiece.top; 1065d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fBaseLineTemp = fTop; 10664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fTop = fLinePos + fLineStep - pTP->rtPiece.height - fBaseLineTemp; 10674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fTop = std::max(0.0f, fTop); 10684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 10694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLinePos += fLineStep + fBaseLine; 10704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 1071d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fLineStep = 0; 1072d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fLineWidth = 0; 10734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < iPieces; i++) { 1074d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const CFX_BreakPiece* pPiece = m_pBreak->GetBreakPieceUnstable(i); 1075d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_TextUserData* pUserData = pPiece->m_pUserData.Get(); 10764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pUserData) 10774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pStyle = pUserData->m_pStyle; 1078d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fVerScale = pPiece->m_iVerticalScale / 100.0f; 1079d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fBaseLine = m_textParser.GetBaseline(m_pTextProvider, pStyle.Get()); 1080d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fLineHeight = m_textParser.GetLineHeight( 108133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann m_pTextProvider, pStyle.Get(), m_iLines == 0, fVerScale); 10824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (fBaseLine > 0) { 1083d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fLineHeightTmp = 1084d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann fBaseLine + (float)pPiece->m_iFontSize * fVerScale / 20.0f; 10854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (fLineHeight < fLineHeightTmp) { 10864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLineHeight = fLineHeightTmp; 10874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 10884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 10894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLineStep = std::max(fLineStep, fLineHeight); 10904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLineWidth += pPiece->m_iWidth / 20000.0f; 10914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 10924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLinePos += fLineStep; 10934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_fMaxWidth = std::max(m_fMaxWidth, fLineWidth); 10944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_pLoader && m_pLoader->m_bSaveLineHeight) { 1095d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fHeight = fLinePos - m_pLoader->m_fLastPos; 10964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLoader->m_fLastPos = fLinePos; 1097d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_pLoader->m_lineHeights.push_back(fHeight); 10984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 10994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 11004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 11014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pBreak->ClearBreakPieces(); 1102d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (dwStatus == CFX_BreakType::Paragraph) { 11034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pBreak->Reset(); 11044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pStyle && bEndBreak) { 1105d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Para* para = m_pTextProvider->GetParaIfExists(); 11064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (para) { 1107d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fStartPos = para->GetMarginLeft(); 1108d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fIndent = para->GetTextIndent(); 11094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (fIndent > 0) 11104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fStartPos += fIndent; 11114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1112d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fSpaceBelow = para->GetSpaceBelow(); 11134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (fSpaceBelow < 0.1f) 11144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fSpaceBelow = 0; 11154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 11164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pBreak->SetLineStartPos(fStartPos); 11174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fLinePos += fSpaceBelow; 11184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 11194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 11204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 11214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 11224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pStyle) { 1123d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fStart = 0; 1124d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const CFX_CSSRect* pRect = pStyle->GetMarginWidth(); 11254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pRect) 11264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fStart = pRect->left.GetValue(); 11274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1128d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fTextIndent = pStyle->GetTextIndent().GetValue(); 11294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (fTextIndent < 0) 11304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fStart -= fTextIndent; 11314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 11324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pBreak->SetLineStartPos(fStart); 11334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 11344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iLines++; 11354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 11364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1137d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CXFA_TextLayout::RenderString(CFX_RenderDevice* pDevice, 11384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_PieceLine* pPieceLine, 11394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iPiece, 11404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FXTEXT_CHARPOS* pCharPos, 11414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const CFX_Matrix& tmDoc2Device) { 1142d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const CXFA_TextPiece* pPiece = pPieceLine->m_textPieces[iPiece].get(); 11434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iCount = GetDisplayPos(pPiece, pCharPos); 11444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iCount > 0) { 1145d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFDE_TextOut::DrawString(pDevice, pPiece->dwColor, pPiece->pFont, pCharPos, 1146d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann iCount, pPiece->fFontSize, &tmDoc2Device); 11474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1148d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pPieceLine->m_charCounts.push_back(iCount); 11494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 11504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1151d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CXFA_TextLayout::RenderPath(CFX_RenderDevice* pDevice, 11524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_PieceLine* pPieceLine, 11534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iPiece, 11544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FXTEXT_CHARPOS* pCharPos, 11554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const CFX_Matrix& tmDoc2Device) { 1156d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_TextPiece* pPiece = pPieceLine->m_textPieces[iPiece].get(); 11574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bNoUnderline = pPiece->iUnderline < 1 || pPiece->iUnderline > 2; 11584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bNoLineThrough = pPiece->iLineThrough < 1 || pPiece->iLineThrough > 2; 11594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bNoUnderline && bNoLineThrough) 11604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 11614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1162d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFX_PathData path; 11634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iChars = GetDisplayPos(pPiece, pCharPos); 11644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iChars > 0) { 11654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_PointF pt1, pt2; 1166d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fEndY = pCharPos[0].m_Origin.y + 1.05f; 1167d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (pPiece->iPeriod == XFA_AttributeEnum::Word) { 11684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < pPiece->iUnderline; i++) { 11694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t j = 0; j < iChars; j++) { 117033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann pt1.x = pCharPos[j].m_Origin.x; 11714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pt2.x = 11724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pt1.x + pCharPos[j].m_FontCharWidth * pPiece->fFontSize / 1000.0f; 11734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pt1.y = pt2.y = fEndY; 1174d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann path.AppendLine(pt1, pt2); 11754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 11764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fEndY += 2.0f; 11774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 11784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 117933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann pt1.x = pCharPos[0].m_Origin.x; 11804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pt2.x = 118133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann pCharPos[iChars - 1].m_Origin.x + 11824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos[iChars - 1].m_FontCharWidth * pPiece->fFontSize / 1000.0f; 11834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < pPiece->iUnderline; i++) { 11844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pt1.y = pt2.y = fEndY; 1185d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann path.AppendLine(pt1, pt2); 11864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fEndY += 2.0f; 11874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 11884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 118933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann fEndY = pCharPos[0].m_Origin.y - pPiece->rtPiece.height * 0.25f; 119033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann pt1.x = pCharPos[0].m_Origin.x; 119133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann pt2.x = pCharPos[iChars - 1].m_Origin.x + 11924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos[iChars - 1].m_FontCharWidth * pPiece->fFontSize / 1000.0f; 11934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < pPiece->iLineThrough; i++) { 11944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pt1.y = pt2.y = fEndY; 1195d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann path.AppendLine(pt1, pt2); 11964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fEndY += 2.0f; 11974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 11984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 11994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bNoLineThrough && 1200d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann (bNoUnderline || pPiece->iPeriod != XFA_AttributeEnum::All)) { 12014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 12024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 12034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iCharsTmp = 0; 1204d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t iPiecePrev = iPiece; 1205d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t iPieceNext = iPiece; 12064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (iPiecePrev > 0) { 12074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iPiecePrev--; 1208d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann iCharsTmp = pPieceLine->m_charCounts[iPiecePrev]; 12094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iCharsTmp > 0) 12104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 12114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 12124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iCharsTmp == 0) 12134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 12144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 12154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharsTmp = 0; 12164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iPieces = pdfium::CollectionSize<int32_t>(pPieceLine->m_textPieces); 12174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (iPieceNext < iPieces - 1) { 12184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iPieceNext++; 1219d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann iCharsTmp = pPieceLine->m_charCounts[iPieceNext]; 12204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iCharsTmp > 0) 12214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 12224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 12234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iCharsTmp == 0) 12244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 12254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1226d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fOrgX = 0.0f; 1227d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fEndX = 0.0f; 12284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pPiece = pPieceLine->m_textPieces[iPiecePrev].get(); 12294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iChars = GetDisplayPos(pPiece, pCharPos); 12304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iChars < 1) 12314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 12324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 123333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann fOrgX = pCharPos[iChars - 1].m_Origin.x + 12344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos[iChars - 1].m_FontCharWidth * pPiece->fFontSize / 1000.0f; 12354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pPiece = pPieceLine->m_textPieces[iPieceNext].get(); 12364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iChars = GetDisplayPos(pPiece, pCharPos); 12374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iChars < 1) 12384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 12394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 124033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann fEndX = pCharPos[0].m_Origin.x; 124133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann CFX_PointF pt1; 124233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann CFX_PointF pt2; 124333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann pt1.x = fOrgX; 124433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann pt2.x = fEndX; 1245d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fEndY = pCharPos[0].m_Origin.y + 1.05f; 12464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < pPiece->iUnderline; i++) { 124733357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann pt1.y = fEndY; 124833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann pt2.y = fEndY; 1249d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann path.AppendLine(pt1, pt2); 12504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fEndY += 2.0f; 12514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 125233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann fEndY = pCharPos[0].m_Origin.y - pPiece->rtPiece.height * 0.25f; 12534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < pPiece->iLineThrough; i++) { 125433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann pt1.y = fEndY; 125533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann pt2.y = fEndY; 1256d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann path.AppendLine(pt1, pt2); 12574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fEndY += 2.0f; 12584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 12594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1260d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1261d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFX_GraphStateData graphState; 1262d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann graphState.m_LineCap = CFX_GraphStateData::LineCapButt; 1263d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann graphState.m_LineJoin = CFX_GraphStateData::LineJoinMiter; 1264d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann graphState.m_LineWidth = 1; 1265d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann graphState.m_MiterLimit = 10; 1266d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann graphState.m_DashPhase = 0; 1267d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pDevice->DrawPath(&path, &tmDoc2Device, &graphState, 0, pPiece->dwColor, 0); 12684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 12694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1270d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannint32_t CXFA_TextLayout::GetDisplayPos(const CXFA_TextPiece* pPiece, 12714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FXTEXT_CHARPOS* pCharPos, 12724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bCharCode) { 12734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pPiece) 12744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 0; 12754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 12764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_RTFTEXTOBJ tr; 12774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!ToRun(pPiece, &tr)) 12784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 0; 12794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return m_pBreak->GetDisplayPos(&tr, pCharPos, bCharCode); 12804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 12814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1282d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CXFA_TextLayout::ToRun(const CXFA_TextPiece* pPiece, FX_RTFTEXTOBJ* tr) { 12834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iLength = pPiece->iChars; 12844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iLength < 1) 12854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 12864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 128733357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann tr->pStr = pPiece->szText; 12884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tr->pFont = pPiece->pFont; 12894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tr->pRect = &pPiece->rtPiece; 129033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann tr->pWidths = pPiece->Widths; 12914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tr->iLength = iLength; 12924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tr->fFontSize = pPiece->fFontSize; 12934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tr->iBidiLevel = pPiece->iBidiLevel; 12944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tr->wLineBreakChar = L'\n'; 12954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tr->iVerticalScale = pPiece->iVerScale; 12964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tr->iHorizontalScale = pPiece->iHorScale; 12974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 12984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1299