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_