Nest CXFA_TextPiece and CXFA_PieceLine in CXFA_TextLayout

Motivation: in an ideal world, anything starting with CXFA would get
garbage collected, and unique_ptr<CXFA_*> becomes an anti-pattern.

-- add some |const| where possible.

Change-Id: I03dfbfa67b981d062adb77b6315f4f684e52dc5e
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/73432
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Daniel Hosseinian <dhoss@chromium.org>
diff --git a/xfa/fxfa/BUILD.gn b/xfa/fxfa/BUILD.gn
index d4d4d7b..bb96f3b 100644
--- a/xfa/fxfa/BUILD.gn
+++ b/xfa/fxfa/BUILD.gn
@@ -71,8 +71,6 @@
     "cxfa_fwltheme.h",
     "cxfa_imagerenderer.cpp",
     "cxfa_imagerenderer.h",
-    "cxfa_pieceline.cpp",
-    "cxfa_pieceline.h",
     "cxfa_readynodeiterator.cpp",
     "cxfa_readynodeiterator.h",
     "cxfa_textlayout.cpp",
@@ -81,8 +79,6 @@
     "cxfa_textparsecontext.h",
     "cxfa_textparser.cpp",
     "cxfa_textparser.h",
-    "cxfa_textpiece.cpp",
-    "cxfa_textpiece.h",
     "cxfa_textprovider.cpp",
     "cxfa_textprovider.h",
     "cxfa_texttabstopscontext.cpp",
diff --git a/xfa/fxfa/cxfa_fftext.cpp b/xfa/fxfa/cxfa_fftext.cpp
index a2d1797..f9b2085 100644
--- a/xfa/fxfa/cxfa_fftext.cpp
+++ b/xfa/fxfa/cxfa_fftext.cpp
@@ -12,9 +12,7 @@
 #include "xfa/fxfa/cxfa_ffdoc.h"
 #include "xfa/fxfa/cxfa_ffpageview.h"
 #include "xfa/fxfa/cxfa_ffwidget.h"
-#include "xfa/fxfa/cxfa_pieceline.h"
 #include "xfa/fxfa/cxfa_textlayout.h"
-#include "xfa/fxfa/cxfa_textpiece.h"
 #include "xfa/fxfa/parser/cxfa_margin.h"
 #include "xfa/fxgraphics/cxfa_graphics.h"
 
diff --git a/xfa/fxfa/cxfa_pieceline.cpp b/xfa/fxfa/cxfa_pieceline.cpp
deleted file mode 100644
index 7f49249..0000000
--- a/xfa/fxfa/cxfa_pieceline.cpp
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2017 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/fxfa/cxfa_pieceline.h"
-
-#include "xfa/fxfa/cxfa_textpiece.h"
-
-CXFA_PieceLine::CXFA_PieceLine() {}
-
-CXFA_PieceLine::~CXFA_PieceLine() = default;
diff --git a/xfa/fxfa/cxfa_pieceline.h b/xfa/fxfa/cxfa_pieceline.h
deleted file mode 100644
index 0e233ac..0000000
--- a/xfa/fxfa/cxfa_pieceline.h
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2017 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_FXFA_CXFA_PIECELINE_H_
-#define XFA_FXFA_CXFA_PIECELINE_H_
-
-#include <memory>
-#include <vector>
-
-class CXFA_TextPiece;
-
-class CXFA_PieceLine {
- public:
-  CXFA_PieceLine();
-  ~CXFA_PieceLine();
-
-  std::vector<std::unique_ptr<CXFA_TextPiece>> m_textPieces;
-  std::vector<size_t> m_charCounts;
-};
-
-#endif  // XFA_FXFA_CXFA_PIECELINE_H_
diff --git a/xfa/fxfa/cxfa_textlayout.cpp b/xfa/fxfa/cxfa_textlayout.cpp
index 51678e8..1a4e941 100644
--- a/xfa/fxfa/cxfa_textlayout.cpp
+++ b/xfa/fxfa/cxfa_textlayout.cpp
@@ -27,9 +27,7 @@
 #include "xfa/fgas/layout/cfx_rtfbreak.h"
 #include "xfa/fgas/layout/cfx_textuserdata.h"
 #include "xfa/fxfa/cxfa_ffdoc.h"
-#include "xfa/fxfa/cxfa_pieceline.h"
 #include "xfa/fxfa/cxfa_textparsecontext.h"
-#include "xfa/fxfa/cxfa_textpiece.h"
 #include "xfa/fxfa/cxfa_textprovider.h"
 #include "xfa/fxfa/cxfa_texttabstopscontext.h"
 #include "xfa/fxfa/parser/cxfa_font.h"
@@ -66,6 +64,14 @@
 
 }  // namespace
 
+CXFA_TextLayout::TextPiece::TextPiece() = default;
+
+CXFA_TextLayout::TextPiece::~TextPiece() = default;
+
+CXFA_TextLayout::PieceLine::PieceLine() = default;
+
+CXFA_TextLayout::PieceLine::~PieceLine() = default;
+
 CXFA_TextLayout::LoaderContext::LoaderContext() = default;
 
 CXFA_TextLayout::LoaderContext::~LoaderContext() = default;
@@ -619,9 +625,9 @@
     if (i + szLineStart >= m_pieceLines.size())
       break;
 
-    CXFA_PieceLine* pPieceLine = m_pieceLines[i + szLineStart].get();
+    PieceLine* pPieceLine = m_pieceLines[i + szLineStart].get();
     for (size_t j = 0; j < pPieceLine->m_textPieces.size(); ++j) {
-      const CXFA_TextPiece* pPiece = pPieceLine->m_textPieces[j].get();
+      const TextPiece* pPiece = pPieceLine->m_textPieces[j].get();
       int32_t iChars = pPiece->iChars;
       if (pdfium::CollectionSize<int32_t>(char_pos) < iChars)
         char_pos.resize(iChars);
@@ -941,7 +947,7 @@
 }
 
 void CXFA_TextLayout::DoTabstops(CFX_CSSComputedStyle* pStyle,
-                                 CXFA_PieceLine* pPieceLine) {
+                                 PieceLine* pPieceLine) {
   if (!pStyle || !pPieceLine)
     return;
 
@@ -952,7 +958,7 @@
   if (iPieces == 0)
     return;
 
-  CXFA_TextPiece* pPiece = pPieceLine->m_textPieces[iPieces - 1].get();
+  TextPiece* pPiece = pPieceLine->m_textPieces[iPieces - 1].get();
   int32_t& iTabstopsIndex = m_pTabstopContext->m_iTabIndex;
   int32_t iCount = m_textParser.CountTabs(pStyle);
   if (!pdfium::IndexInBounds(m_pTabstopContext->m_tabstops, iTabstopsIndex))
@@ -963,7 +969,7 @@
     m_pTabstopContext->m_bHasTabstops = true;
     float fRight = 0;
     if (iPieces > 1) {
-      CXFA_TextPiece* p = pPieceLine->m_textPieces[iPieces - 2].get();
+      const TextPiece* p = pPieceLine->m_textPieces[iPieces - 2].get();
       fRight = p->rtPiece.right();
     }
     m_pTabstopContext->m_fTabWidth =
@@ -1005,8 +1011,8 @@
 
   RetainPtr<CFX_CSSComputedStyle> pStyle;
   if (bSavePieces) {
-    auto pNew = std::make_unique<CXFA_PieceLine>();
-    CXFA_PieceLine* pPieceLine = pNew.get();
+    auto pNew = std::make_unique<PieceLine>();
+    PieceLine* pPieceLine = pNew.get();
     m_pieceLines.push_back(std::move(pNew));
     if (m_pTabstopContext)
       m_pTabstopContext->Reset();
@@ -1020,7 +1026,7 @@
         pStyle = pUserData->m_pStyle;
       float fVerScale = pPiece->m_iVerticalScale / 100.0f;
 
-      auto pTP = std::make_unique<CXFA_TextPiece>();
+      auto pTP = std::make_unique<TextPiece>();
       pTP->iChars = pPiece->m_iCharCount;
       pTP->szText = pPiece->GetString();
       pTP->Widths = pPiece->GetWidths();
@@ -1133,11 +1139,11 @@
 }
 
 void CXFA_TextLayout::RenderString(CFX_RenderDevice* pDevice,
-                                   CXFA_PieceLine* pPieceLine,
+                                   PieceLine* pPieceLine,
                                    size_t szPiece,
                                    std::vector<TextCharPos>* pCharPos,
                                    const CFX_Matrix& mtDoc2Device) {
-  const CXFA_TextPiece* pPiece = pPieceLine->m_textPieces[szPiece].get();
+  const TextPiece* pPiece = pPieceLine->m_textPieces[szPiece].get();
   size_t szCount = GetDisplayPos(pPiece, pCharPos);
   if (szCount > 0) {
     auto span = pdfium::make_span(pCharPos->data(), szCount);
@@ -1148,11 +1154,11 @@
 }
 
 void CXFA_TextLayout::RenderPath(CFX_RenderDevice* pDevice,
-                                 CXFA_PieceLine* pPieceLine,
+                                 const PieceLine* pPieceLine,
                                  size_t szPiece,
                                  std::vector<TextCharPos>* pCharPos,
                                  const CFX_Matrix& mtDoc2Device) {
-  CXFA_TextPiece* pPiece = pPieceLine->m_textPieces[szPiece].get();
+  const TextPiece* pPiece = pPieceLine->m_textPieces[szPiece].get();
   bool bNoUnderline = pPiece->iUnderline < 1 || pPiece->iUnderline > 2;
   bool bNoLineThrough = pPiece->iLineThrough < 1 || pPiece->iLineThrough > 2;
   if (bNoUnderline && bNoLineThrough)
@@ -1271,7 +1277,7 @@
                     CFX_FillRenderOptions());
 }
 
-size_t CXFA_TextLayout::GetDisplayPos(const CXFA_TextPiece* pPiece,
+size_t CXFA_TextLayout::GetDisplayPos(const TextPiece* pPiece,
                                       std::vector<TextCharPos>* pCharPos) {
   if (!pPiece || pPiece->iChars < 1)
     return 0;
diff --git a/xfa/fxfa/cxfa_textlayout.h b/xfa/fxfa/cxfa_textlayout.h
index ae813cb..7512cfb 100644
--- a/xfa/fxfa/cxfa_textlayout.h
+++ b/xfa/fxfa/cxfa_textlayout.h
@@ -20,17 +20,17 @@
 #include "v8/include/cppgc/member.h"
 #include "v8/include/cppgc/visitor.h"
 #include "xfa/fgas/layout/cfx_char.h"
+#include "xfa/fgas/layout/cfx_textpiece.h"
 #include "xfa/fxfa/cxfa_textparser.h"
 
 class CFDE_RenderDevice;
+class CFX_LinkUserData;
 class CFX_CSSComputedStyle;
 class CFX_RTFBreak;
 class CFX_RenderDevice;
 class CFX_XMLNode;
 class CFX_LinkUserData;
 class CXFA_Node;
-class CXFA_PieceLine;
-class CXFA_TextPiece;
 class CXFA_TextProvider;
 class CXFA_TextTabstopsContext;
 class TextCharPos;
@@ -65,6 +65,27 @@
   const wchar_t* GetLinkURLAtPoint(const CFX_PointF& point);
 
  private:
+  class TextPiece : public CFX_TextPiece {
+   public:
+    TextPiece();
+    ~TextPiece();
+
+    int32_t iUnderline = 0;
+    int32_t iLineThrough = 0;
+    XFA_AttributeValue iPeriod = XFA_AttributeValue::All;
+    FX_ARGB dwColor = 0;
+    RetainPtr<CFX_LinkUserData> pLinkData;
+  };
+
+  class PieceLine {
+   public:
+    PieceLine();
+    ~PieceLine();
+
+    std::vector<std::unique_ptr<TextPiece>> m_textPieces;
+    std::vector<size_t> m_charCounts;
+  };
+
   struct BlockData {
     size_t szIndex;
     size_t szLength;
@@ -134,18 +155,18 @@
   bool IsEnd(bool bSavePieces);
   void UpdateAlign(float fHeight, float fBottom);
   void RenderString(CFX_RenderDevice* pDevice,
-                    CXFA_PieceLine* pPieceLine,
+                    PieceLine* pPieceLine,
                     size_t szPiece,
                     std::vector<TextCharPos>* pCharPos,
                     const CFX_Matrix& mtDoc2Device);
   void RenderPath(CFX_RenderDevice* pDevice,
-                  CXFA_PieceLine* pPieceLine,
+                  const PieceLine* pPieceLine,
                   size_t szPiece,
                   std::vector<TextCharPos>* pCharPos,
                   const CFX_Matrix& mtDoc2Device);
-  size_t GetDisplayPos(const CXFA_TextPiece* pPiece,
+  size_t GetDisplayPos(const TextPiece* pPiece,
                        std::vector<TextCharPos>* pCharPos);
-  void DoTabstops(CFX_CSSComputedStyle* pStyle, CXFA_PieceLine* pPieceLine);
+  void DoTabstops(CFX_CSSComputedStyle* pStyle, PieceLine* pPieceLine);
   bool LayoutInternal(size_t szBlockIndex);
   size_t CountBlocks() const;
   size_t GetNextIndexFromLastBlockData() const;
@@ -162,7 +183,7 @@
   std::unique_ptr<CFX_RTFBreak> m_pBreak;
   std::unique_ptr<LoaderContext> m_pLoader;
   CXFA_TextParser m_textParser;
-  std::vector<std::unique_ptr<CXFA_PieceLine>> m_pieceLines;
+  std::vector<std::unique_ptr<PieceLine>> m_pieceLines;
   std::unique_ptr<CXFA_TextTabstopsContext> m_pTabstopContext;
 };
 
diff --git a/xfa/fxfa/cxfa_textpiece.cpp b/xfa/fxfa/cxfa_textpiece.cpp
deleted file mode 100644
index 363361a..0000000
--- a/xfa/fxfa/cxfa_textpiece.cpp
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2017 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/fxfa/cxfa_textpiece.h"
-
-#include "xfa/fgas/layout/cfx_linkuserdata.h"
-
-CXFA_TextPiece::CXFA_TextPiece() = default;
-
-CXFA_TextPiece::~CXFA_TextPiece() = default;
diff --git a/xfa/fxfa/cxfa_textpiece.h b/xfa/fxfa/cxfa_textpiece.h
deleted file mode 100644
index c9d524d..0000000
--- a/xfa/fxfa/cxfa_textpiece.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2017 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_FXFA_CXFA_TEXTPIECE_H_
-#define XFA_FXFA_CXFA_TEXTPIECE_H_
-
-#include "core/fxcrt/retain_ptr.h"
-#include "core/fxge/fx_dib.h"
-#include "xfa/fgas/layout/cfx_textpiece.h"
-#include "xfa/fxfa/fxfa_basic.h"
-
-class CFX_LinkUserData;
-
-class CXFA_TextPiece : public CFX_TextPiece {
- public:
-  CXFA_TextPiece();
-  ~CXFA_TextPiece();
-
-  int32_t iUnderline;
-  int32_t iLineThrough;
-  XFA_AttributeValue iPeriod;
-  FX_ARGB dwColor;
-  RetainPtr<CFX_LinkUserData> pLinkData;
-};
-
-#endif  // XFA_FXFA_CXFA_TEXTPIECE_H_