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