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