summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Sepez <tsepez@chromium.org>2017-03-02 12:21:15 -0800
committerChromium commit bot <commit-bot@chromium.org>2017-03-02 21:01:30 +0000
commitc803cbcad51355ffa38dce0851a51dfdcf279645 (patch)
tree82fa82015ec801285231cf507ed97bdea5fc7e08
parentc3f74e91b2f019c3035395f5605cb98409502385 (diff)
downloadpdfium-c803cbcad51355ffa38dce0851a51dfdcf279645.tar.xz
Use std::deque for CFX_MassArrayTemplate<FDE_TEXTEDITPIECE>
Change-Id: I1080eefb4e47d7bc86fb3384fd7479a1fd49b203 Reviewed-on: https://pdfium-review.googlesource.com/2898 Reviewed-by: dsinclair <dsinclair@chromium.org> Commit-Queue: dsinclair <dsinclair@chromium.org>
-rw-r--r--xfa/fde/cfde_txtedtpage.cpp107
-rw-r--r--xfa/fde/cfde_txtedtpage.h5
-rw-r--r--xfa/fde/cfde_txtedttextset.cpp40
-rw-r--r--xfa/fde/cfde_txtedttextset.h9
-rw-r--r--xfa/fde/fde_render.cpp9
-rw-r--r--xfa/fde/fde_visualset.h12
-rw-r--r--xfa/fde/tto/fde_textout.cpp4
-rw-r--r--xfa/fgas/layout/fgas_textbreak.cpp25
-rw-r--r--xfa/fgas/layout/fgas_textbreak.h5
9 files changed, 92 insertions, 124 deletions
diff --git a/xfa/fde/cfde_txtedtpage.cpp b/xfa/fde/cfde_txtedtpage.cpp
index 56e1a04a55..8b58b2b443 100644
--- a/xfa/fde/cfde_txtedtpage.cpp
+++ b/xfa/fde/cfde_txtedtpage.cpp
@@ -31,7 +31,6 @@ IFDE_TxtEdtPage* IFDE_TxtEdtPage::Create(CFDE_TxtEdtEngine* pEngine,
CFDE_TxtEdtPage::CFDE_TxtEdtPage(CFDE_TxtEdtEngine* pEngine, int32_t nPageIndex)
: m_pEditEngine(pEngine),
- m_PieceMassArr(100),
m_pBgnParag(nullptr),
m_pEndParag(nullptr),
m_nRefCount(0),
@@ -41,9 +40,7 @@ CFDE_TxtEdtPage::CFDE_TxtEdtPage(CFDE_TxtEdtEngine* pEngine, int32_t nPageIndex)
m_bLoaded(false) {
}
-CFDE_TxtEdtPage::~CFDE_TxtEdtPage() {
- m_PieceMassArr.RemoveAll(true);
-}
+CFDE_TxtEdtPage::~CFDE_TxtEdtPage() {}
CFDE_TxtEdtEngine* CFDE_TxtEdtPage::GetEngine() const {
return m_pEditEngine;
@@ -53,25 +50,23 @@ FDE_VISUALOBJTYPE CFDE_TxtEdtPage::GetType() {
return FDE_VISUALOBJ_Text;
}
-void CFDE_TxtEdtPage::GetRect(FDE_TEXTEDITPIECE* hVisualObj, CFX_RectF& rt) {}
+CFX_RectF CFDE_TxtEdtPage::GetRect(const FDE_TEXTEDITPIECE& hVisualObj) {
+ return CFX_RectF();
+}
int32_t CFDE_TxtEdtPage::GetCharRect(int32_t nIndex,
CFX_RectF& rect,
bool bBBox) const {
ASSERT(m_nRefCount > 0);
ASSERT(nIndex >= 0 && nIndex < m_nCharCount);
- if (m_nRefCount < 1) {
+ if (m_nRefCount < 1)
return 0;
- }
- int32_t nCount = m_PieceMassArr.GetSize();
- for (int32_t i = 0; i < nCount; i++) {
- const FDE_TEXTEDITPIECE* pPiece = m_PieceMassArr.GetPtrAt(i);
- if (nIndex >= pPiece->nStart &&
- nIndex < (pPiece->nStart + pPiece->nCount)) {
- std::vector<CFX_RectF> rectArr;
- m_pTextSet->GetCharRects(pPiece, &rectArr, bBBox);
- rect = rectArr[nIndex - pPiece->nStart];
- return pPiece->nBidiLevel;
+
+ for (const auto& piece : m_Pieces) {
+ if (nIndex >= piece.nStart && nIndex < piece.nStart + piece.nCount) {
+ std::vector<CFX_RectF> rectArr = m_pTextSet->GetCharRects(&piece, bBBox);
+ rect = rectArr[nIndex - piece.nStart];
+ return piece.nBidiLevel;
}
}
ASSERT(0);
@@ -81,14 +76,14 @@ int32_t CFDE_TxtEdtPage::GetCharRect(int32_t nIndex,
int32_t CFDE_TxtEdtPage::GetCharIndex(const CFX_PointF& fPoint, bool& bBefore) {
CFX_PointF ptF = fPoint;
NormalizePt2Rect(ptF, m_rtPageContents, kTolerance);
- int32_t nCount = m_PieceMassArr.GetSize();
+ int32_t nCount = pdfium::CollectionSize<int32_t>(m_Pieces);
CFX_RectF rtLine;
int32_t nBgn = 0;
int32_t nEnd = 0;
bool bInLine = false;
int32_t i = 0;
for (i = 0; i < nCount; i++) {
- const FDE_TEXTEDITPIECE* pPiece = m_PieceMassArr.GetPtrAt(i);
+ const FDE_TEXTEDITPIECE* pPiece = &m_Pieces[i];
if (!bInLine &&
(pPiece->rtPiece.top <= ptF.y && pPiece->rtPiece.bottom() > ptF.y)) {
nBgn = nEnd = i;
@@ -107,11 +102,10 @@ int32_t CFDE_TxtEdtPage::GetCharIndex(const CFX_PointF& fPoint, bool& bBefore) {
int32_t nCaret = 0;
FDE_TEXTEDITPIECE* pPiece = nullptr;
for (i = nBgn; i <= nEnd; i++) {
- pPiece = m_PieceMassArr.GetPtrAt(i);
+ pPiece = &m_Pieces[i];
nCaret = m_nPageStart + pPiece->nStart;
if (pPiece->rtPiece.Contains(ptF)) {
- std::vector<CFX_RectF> rectArr;
- m_pTextSet->GetCharRects(pPiece, &rectArr, false);
+ std::vector<CFX_RectF> rectArr = m_pTextSet->GetCharRects(pPiece, false);
int32_t nRtCount = pdfium::CollectionSize<int32_t>(rectArr);
for (int32_t j = 0; j < nRtCount; j++) {
if (rectArr[j].Contains(ptF)) {
@@ -158,17 +152,12 @@ int32_t CFDE_TxtEdtPage::GetDisplayPos(const CFX_RectF& rtClip,
CFX_RectF* pBBox) const {
pCharPos = FX_Alloc(FXTEXT_CHARPOS, m_nCharCount);
int32_t nCharPosCount = 0;
- FDE_TEXTEDITPIECE* pPiece = nullptr;
- int32_t nVisualObjCount = m_PieceMassArr.GetSize();
FXTEXT_CHARPOS* pos = pCharPos;
- CFX_RectF rtObj;
- for (int32_t i = 0; i < nVisualObjCount; i++) {
- pPiece = m_PieceMassArr.GetPtrAt(i);
- m_pTextSet->GetRect(pPiece, rtObj);
- if (!rtClip.IntersectWith(rtObj)) {
+ for (const auto& piece : m_Pieces) {
+ if (!rtClip.IntersectWith(m_pTextSet->GetRect(piece)))
continue;
- }
- int32_t nCount = m_pTextSet->GetDisplayPos(pPiece, pos, false);
+
+ int32_t nCount = m_pTextSet->GetDisplayPos(piece, pos, false);
nCharPosCount += nCount;
pos += nCount;
}
@@ -185,22 +174,19 @@ void CFDE_TxtEdtPage::CalcRangeRectArray(
int32_t nStart,
int32_t nCount,
std::vector<CFX_RectF>* pRectFArr) const {
- int32_t nPieceCount = m_PieceMassArr.GetSize();
int32_t nEnd = nStart + nCount - 1;
bool bInRange = false;
- for (int32_t i = 0; i < nPieceCount; i++) {
- FDE_TEXTEDITPIECE* piece = m_PieceMassArr.GetPtrAt(i);
+ for (const auto& piece : m_Pieces) {
if (!bInRange) {
- if (nStart >= piece->nStart && nStart < (piece->nStart + piece->nCount)) {
- int32_t nRangeEnd = piece->nCount - 1;
+ if (nStart >= piece.nStart && nStart < piece.nStart + piece.nCount) {
+ int32_t nRangeEnd = piece.nCount - 1;
bool bEnd = false;
- if (nEnd >= piece->nStart && nEnd < (piece->nStart + piece->nCount)) {
- nRangeEnd = nEnd - piece->nStart;
+ if (nEnd >= piece.nStart && nEnd < piece.nStart + piece.nCount) {
+ nRangeEnd = nEnd - piece.nStart;
bEnd = true;
}
- std::vector<CFX_RectF> rcArr;
- m_pTextSet->GetCharRects(piece, &rcArr, false);
- CFX_RectF rectPiece = rcArr[nStart - piece->nStart];
+ std::vector<CFX_RectF> rcArr = m_pTextSet->GetCharRects(&piece, false);
+ CFX_RectF rectPiece = rcArr[nStart - piece.nStart];
rectPiece.Union(rcArr[nRangeEnd]);
pRectFArr->push_back(rectPiece);
if (bEnd)
@@ -209,15 +195,14 @@ void CFDE_TxtEdtPage::CalcRangeRectArray(
bInRange = true;
}
} else {
- if (nEnd >= piece->nStart && nEnd < (piece->nStart + piece->nCount)) {
- std::vector<CFX_RectF> rcArr;
- m_pTextSet->GetCharRects(piece, &rcArr, false);
+ if (nEnd >= piece.nStart && nEnd < piece.nStart + piece.nCount) {
+ std::vector<CFX_RectF> rcArr = m_pTextSet->GetCharRects(&piece, false);
CFX_RectF rectPiece = rcArr[0];
- rectPiece.Union(rcArr[nEnd - piece->nStart]);
+ rectPiece.Union(rcArr[nEnd - piece.nStart]);
pRectFArr->push_back(rectPiece);
return;
}
- pRectFArr->push_back(piece->rtPiece);
+ pRectFArr->push_back(piece.rtPiece);
}
}
}
@@ -288,7 +273,7 @@ int32_t CFDE_TxtEdtPage::LoadPage(const CFX_RectF* pClipBox,
if (!m_pTextSet)
m_pTextSet = pdfium::MakeUnique<CFDE_TxtEdtTextSet>(this);
- m_PieceMassArr.RemoveAll(true);
+ m_Pieces.clear();
uint32_t dwBreakStatus = FX_TXTBREAK_None;
int32_t nPieceStart = 0;
@@ -362,7 +347,7 @@ int32_t CFDE_TxtEdtPage::LoadPage(const CFX_RectF* pClipBox,
m_rtPageContents.Union(TxtEdtPiece.rtPiece);
}
nPieceStart += TxtEdtPiece.nCount;
- m_PieceMassArr.Add(TxtEdtPiece);
+ m_Pieces.push_back(TxtEdtPiece);
for (int32_t k = 0; k < TxtEdtPiece.nCount; k++) {
CFX_Char* ptc = pPiece->GetCharPtr(k);
m_CharWidths[TxtEdtPiece.nStart + k] = ptc->m_iCharWidth;
@@ -393,19 +378,15 @@ int32_t CFDE_TxtEdtPage::LoadPage(const CFX_RectF* pClipBox,
}
}
FX_FLOAT fOffset = m_rtPageContents.left - fDelta;
- int32_t nCount = m_PieceMassArr.GetSize();
- for (int32_t i = 0; i < nCount; i++) {
- FDE_TEXTEDITPIECE* pPiece = m_PieceMassArr.GetPtrAt(i);
- pPiece->rtPiece.Offset(-fOffset, 0.0f);
- }
+ for (auto& piece : m_Pieces)
+ piece.rtPiece.Offset(-fOffset, 0.0f);
+
m_rtPageContents.Offset(-fOffset, 0.0f);
}
if (m_pEditEngine->GetEditParams()->dwLayoutStyles &
FDE_TEXTEDITLAYOUT_LastLineHeight) {
m_rtPageContents.height -= pParams->fLineSpace - pParams->fFontSize;
- int32_t nCount = m_PieceMassArr.GetSize();
- FDE_TEXTEDITPIECE* pPiece = m_PieceMassArr.GetPtrAt(nCount - 1);
- pPiece->rtPiece.height = pParams->fFontSize;
+ m_Pieces.back().rtPiece.height = pParams->fFontSize;
}
m_nRefCount = 1;
m_bLoaded = true;
@@ -418,7 +399,7 @@ void CFDE_TxtEdtPage::UnloadPage(const CFX_RectF* pClipBox) {
if (m_nRefCount != 0)
return;
- m_PieceMassArr.RemoveAll(false);
+ m_Pieces.clear();
m_pTextSet.reset();
m_CharWidths.clear();
if (m_pBgnParag) {
@@ -437,7 +418,7 @@ const CFX_RectF& CFDE_TxtEdtPage::GetContentsBox() {
}
FX_POSITION CFDE_TxtEdtPage::GetFirstPosition() {
- if (m_PieceMassArr.GetSize() < 1)
+ if (m_Pieces.empty())
return nullptr;
return (FX_POSITION)1;
}
@@ -450,20 +431,20 @@ FDE_TEXTEDITPIECE* CFDE_TxtEdtPage::GetNext(FX_POSITION& pos,
}
int32_t nPos = (int32_t)(uintptr_t)pos;
pVisualSet = m_pTextSet.get();
- if (nPos + 1 > m_PieceMassArr.GetSize()) {
+ if (nPos + 1 > pdfium::CollectionSize<int32_t>(m_Pieces))
pos = nullptr;
- } else {
+ else
pos = (FX_POSITION)(uintptr_t)(nPos + 1);
- }
- return m_PieceMassArr.GetPtrAt(nPos - 1);
+
+ return &m_Pieces[nPos - 1];
}
FX_WCHAR CFDE_TxtEdtPage::GetChar(const FDE_TEXTEDITPIECE* pIdentity,
int32_t index) const {
int32_t nIndex = m_nPageStart + pIdentity->nStart + index;
- if (nIndex != m_pIter->GetAt()) {
+ if (nIndex != m_pIter->GetAt())
m_pIter->SetAt(nIndex);
- }
+
FX_WCHAR wChar = m_pIter->GetChar();
m_pIter->Next();
return wChar;
diff --git a/xfa/fde/cfde_txtedtpage.h b/xfa/fde/cfde_txtedtpage.h
index 57ade45bbc..63ec7e7cf3 100644
--- a/xfa/fde/cfde_txtedtpage.h
+++ b/xfa/fde/cfde_txtedtpage.h
@@ -7,6 +7,7 @@
#ifndef XFA_FDE_CFDE_TXTEDTPAGE_H_
#define XFA_FDE_CFDE_TXTEDTPAGE_H_
+#include <deque>
#include <memory>
#include <vector>
@@ -44,7 +45,7 @@ class CFDE_TxtEdtPage : public IFDE_TxtEdtPage {
// IFDE_VisualSet:
FDE_VISUALOBJTYPE GetType() override;
- void GetRect(FDE_TEXTEDITPIECE* pPiece, CFX_RectF& rt) override;
+ CFX_RectF GetRect(const FDE_TEXTEDITPIECE& pPiece) override;
// IFDE_CanvasSet:
FX_POSITION GetFirstPosition() override;
@@ -65,7 +66,7 @@ class CFDE_TxtEdtPage : public IFDE_TxtEdtPage {
std::unique_ptr<IFX_CharIter> m_pIter;
std::unique_ptr<CFDE_TxtEdtTextSet> m_pTextSet;
CFDE_TxtEdtEngine* const m_pEditEngine;
- CFX_MassArrayTemplate<FDE_TEXTEDITPIECE> m_PieceMassArr;
+ std::deque<FDE_TEXTEDITPIECE> m_Pieces;
CFDE_TxtEdtParag* m_pBgnParag;
CFDE_TxtEdtParag* m_pEndParag;
int32_t m_nRefCount;
diff --git a/xfa/fde/cfde_txtedttextset.cpp b/xfa/fde/cfde_txtedttextset.cpp
index a885ad4508..8d32f75ff3 100644
--- a/xfa/fde/cfde_txtedttextset.cpp
+++ b/xfa/fde/cfde_txtedttextset.cpp
@@ -19,8 +19,8 @@ FDE_VISUALOBJTYPE CFDE_TxtEdtTextSet::GetType() {
return FDE_VISUALOBJ_Text;
}
-void CFDE_TxtEdtTextSet::GetRect(FDE_TEXTEDITPIECE* pPiece, CFX_RectF& rt) {
- rt = pPiece->rtPiece;
+CFX_RectF CFDE_TxtEdtTextSet::GetRect(const FDE_TEXTEDITPIECE& pPiece) {
+ return pPiece.rtPiece;
}
int32_t CFDE_TxtEdtTextSet::GetString(FDE_TEXTEDITPIECE* pPiece,
@@ -45,14 +45,11 @@ FX_ARGB CFDE_TxtEdtTextSet::GetFontColor() {
return m_pPage->GetEngine()->GetEditParams()->dwFontColor;
}
-int32_t CFDE_TxtEdtTextSet::GetDisplayPos(FDE_TEXTEDITPIECE* pPiece,
+int32_t CFDE_TxtEdtTextSet::GetDisplayPos(const FDE_TEXTEDITPIECE& piece,
FXTEXT_CHARPOS* pCharPos,
bool bCharCode,
CFX_WideString* pWSForms) {
- if (!pPiece)
- return 0;
-
- int32_t nLength = pPiece->nCount;
+ int32_t nLength = piece.nCount;
if (nLength < 1)
return 0;
@@ -63,42 +60,37 @@ int32_t CFDE_TxtEdtTextSet::GetDisplayPos(FDE_TEXTEDITPIECE* pPiece,
uint32_t dwLayoutStyle = pBreak->GetLayoutStyles();
FX_TXTRUN tr;
tr.pAccess = m_pPage;
- tr.pIdentity = pPiece;
+ tr.pIdentity = &piece;
tr.iLength = nLength;
tr.pFont = pTextParams->pFont;
tr.fFontSize = pTextParams->fFontSize;
tr.dwStyles = dwLayoutStyle;
tr.iCharRotation = pTextParams->nCharRotation;
- tr.dwCharStyles = pPiece->dwCharStyles;
- tr.pRect = &(pPiece->rtPiece);
+ tr.dwCharStyles = piece.dwCharStyles;
+ tr.pRect = &piece.rtPiece;
tr.wLineBreakChar = pTextParams->wLineBreakChar;
return pBreak->GetDisplayPos(&tr, pCharPos, bCharCode, pWSForms);
}
-int32_t CFDE_TxtEdtTextSet::GetCharRects(const FDE_TEXTEDITPIECE* pPiece,
- std::vector<CFX_RectF>* rtArray,
- bool bBBox) {
- if (!pPiece)
- return 0;
-
- CFDE_TxtEdtEngine* pEngine =
- static_cast<CFDE_TxtEdtEngine*>(m_pPage->GetEngine());
- int32_t nLength = pPiece->nCount;
- if (nLength < 1)
- return 0;
+std::vector<CFX_RectF> CFDE_TxtEdtTextSet::GetCharRects(
+ const FDE_TEXTEDITPIECE* pPiece,
+ bool bBBox) {
+ if (!pPiece || pPiece->nCount < 1)
+ return std::vector<CFX_RectF>();
+ auto pEngine = static_cast<CFDE_TxtEdtEngine*>(m_pPage->GetEngine());
const FDE_TXTEDTPARAMS* pTextParams = pEngine->GetEditParams();
uint32_t dwLayoutStyle = pEngine->GetTextBreak()->GetLayoutStyles();
FX_TXTRUN tr;
tr.pAccess = m_pPage;
tr.pIdentity = pPiece;
- tr.iLength = nLength;
+ tr.iLength = pPiece->nCount;
tr.pFont = pTextParams->pFont;
tr.fFontSize = pTextParams->fFontSize;
tr.dwStyles = dwLayoutStyle;
tr.iCharRotation = pTextParams->nCharRotation;
tr.dwCharStyles = pPiece->dwCharStyles;
- tr.pRect = &(pPiece->rtPiece);
+ tr.pRect = &pPiece->rtPiece;
tr.wLineBreakChar = pTextParams->wLineBreakChar;
- return pEngine->GetTextBreak()->GetCharRects(&tr, rtArray, bBBox);
+ return pEngine->GetTextBreak()->GetCharRects(&tr, bBBox);
}
diff --git a/xfa/fde/cfde_txtedttextset.h b/xfa/fde/cfde_txtedttextset.h
index 561419affe..8ab6578793 100644
--- a/xfa/fde/cfde_txtedttextset.h
+++ b/xfa/fde/cfde_txtedttextset.h
@@ -20,20 +20,19 @@ class CFDE_TxtEdtTextSet : public IFDE_TextSet {
// IFDE_VisualSet
FDE_VISUALOBJTYPE GetType() override;
- void GetRect(FDE_TEXTEDITPIECE* hVisualObj, CFX_RectF& rt) override;
+ CFX_RectF GetRect(const FDE_TEXTEDITPIECE& hVisualObj) override;
// IFDE_TextSet
int32_t GetString(FDE_TEXTEDITPIECE* pPiece, CFX_WideString& wsText) override;
CFX_RetainPtr<CFGAS_GEFont> GetFont() override;
FX_FLOAT GetFontSize() override;
FX_ARGB GetFontColor() override;
- int32_t GetDisplayPos(FDE_TEXTEDITPIECE* pPiece,
+ int32_t GetDisplayPos(const FDE_TEXTEDITPIECE& pPiece,
FXTEXT_CHARPOS* pCharPos,
bool bCharCode = false,
CFX_WideString* pWSForms = nullptr) override;
- int32_t GetCharRects(const FDE_TEXTEDITPIECE* pPiece,
- std::vector<CFX_RectF>* rtArray,
- bool bBBox) override;
+ std::vector<CFX_RectF> GetCharRects(const FDE_TEXTEDITPIECE* pPiece,
+ bool bBBox) override;
private:
CFDE_TxtEdtPage* const m_pPage;
diff --git a/xfa/fde/fde_render.cpp b/xfa/fde/fde_render.cpp
index c0fb926c36..b6a8f7edd0 100644
--- a/xfa/fde/fde_render.cpp
+++ b/xfa/fde/fde_render.cpp
@@ -61,7 +61,6 @@ FDE_RENDERSTATUS CFDE_RenderContext::DoRender(IFX_Pause* pPause) {
rm.TransformRect(rtDocClip);
IFDE_VisualSet* pVisualSet;
FDE_TEXTEDITPIECE* pPiece;
- CFX_RectF rtObj;
int32_t iCount = 0;
while (true) {
pPiece = m_pIterator->GetNext(pVisualSet);
@@ -69,9 +68,7 @@ FDE_RENDERSTATUS CFDE_RenderContext::DoRender(IFX_Pause* pPause) {
eStatus = FDE_RENDERSTATUS_Done;
break;
}
- rtObj.Empty();
- pVisualSet->GetRect(pPiece, rtObj);
- if (!rtDocClip.IntersectWith(rtObj))
+ if (!rtDocClip.IntersectWith(pVisualSet->GetRect(*pPiece)))
continue;
switch (pVisualSet->GetType()) {
@@ -111,7 +108,7 @@ void CFDE_RenderContext::RenderText(IFDE_TextSet* pTextSet,
if (!pFont)
return;
- int32_t iCount = pTextSet->GetDisplayPos(pText, nullptr, false);
+ int32_t iCount = pTextSet->GetDisplayPos(*pText, nullptr, false);
if (iCount < 1)
return;
@@ -121,7 +118,7 @@ void CFDE_RenderContext::RenderText(IFDE_TextSet* pTextSet,
if (m_CharPos.size() < static_cast<size_t>(iCount))
m_CharPos.resize(iCount, FXTEXT_CHARPOS());
- iCount = pTextSet->GetDisplayPos(pText, m_CharPos.data(), false);
+ iCount = pTextSet->GetDisplayPos(*pText, m_CharPos.data(), false);
FX_FLOAT fFontSize = pTextSet->GetFontSize();
FX_ARGB dwColor = pTextSet->GetFontColor();
m_pBrush->SetColor(dwColor);
diff --git a/xfa/fde/fde_visualset.h b/xfa/fde/fde_visualset.h
index 3260caee79..5cf02cde9c 100644
--- a/xfa/fde/fde_visualset.h
+++ b/xfa/fde/fde_visualset.h
@@ -26,6 +26,7 @@ enum FDE_VISUALOBJTYPE {
struct FDE_TEXTEDITPIECE {
FDE_TEXTEDITPIECE();
+ FDE_TEXTEDITPIECE(const FDE_TEXTEDITPIECE& that);
~FDE_TEXTEDITPIECE();
int32_t nStart;
@@ -35,13 +36,15 @@ struct FDE_TEXTEDITPIECE {
uint32_t dwCharStyles;
};
inline FDE_TEXTEDITPIECE::FDE_TEXTEDITPIECE() = default;
+inline FDE_TEXTEDITPIECE::FDE_TEXTEDITPIECE(const FDE_TEXTEDITPIECE& that) =
+ default;
inline FDE_TEXTEDITPIECE::~FDE_TEXTEDITPIECE() = default;
class IFDE_VisualSet {
public:
virtual ~IFDE_VisualSet() {}
virtual FDE_VISUALOBJTYPE GetType() = 0;
- virtual void GetRect(FDE_TEXTEDITPIECE* hVisualObj, CFX_RectF& rt) = 0;
+ virtual CFX_RectF GetRect(const FDE_TEXTEDITPIECE& hVisualObj) = 0;
};
class IFDE_CanvasSet : public IFDE_VisualSet {
@@ -58,13 +61,12 @@ class IFDE_TextSet : public IFDE_VisualSet {
virtual CFX_RetainPtr<CFGAS_GEFont> GetFont() = 0;
virtual FX_FLOAT GetFontSize() = 0;
virtual FX_ARGB GetFontColor() = 0;
- virtual int32_t GetDisplayPos(FDE_TEXTEDITPIECE* hText,
+ virtual int32_t GetDisplayPos(const FDE_TEXTEDITPIECE& hText,
FXTEXT_CHARPOS* pCharPos,
bool bCharCode = false,
CFX_WideString* pWSForms = nullptr) = 0;
- virtual int32_t GetCharRects(const FDE_TEXTEDITPIECE* hText,
- std::vector<CFX_RectF>* rtArray,
- bool bbox) = 0;
+ virtual std::vector<CFX_RectF> GetCharRects(const FDE_TEXTEDITPIECE* hText,
+ bool bbox) = 0;
};
#endif // XFA_FDE_FDE_VISUALSET_H_
diff --git a/xfa/fde/tto/fde_textout.cpp b/xfa/fde/tto/fde_textout.cpp
index 7e9ff08ffd..421876b48d 100644
--- a/xfa/fde/tto/fde_textout.cpp
+++ b/xfa/fde/tto/fde_textout.cpp
@@ -745,8 +745,8 @@ int32_t CFDE_TextOut::GetDisplayPos(FDE_TTOPIECE* pPiece) {
int32_t CFDE_TextOut::GetCharRects(const FDE_TTOPIECE* pPiece) {
FX_TXTRUN tr = ToTextRun(pPiece);
- m_rectArray.clear();
- return m_pTxtBreak->GetCharRects(&tr, &m_rectArray);
+ m_rectArray = m_pTxtBreak->GetCharRects(&tr);
+ return pdfium::CollectionSize<int32_t>(m_rectArray);
}
FX_TXTRUN CFDE_TextOut::ToTextRun(const FDE_TTOPIECE* pPiece) {
diff --git a/xfa/fgas/layout/fgas_textbreak.cpp b/xfa/fgas/layout/fgas_textbreak.cpp
index fd1646503e..8be72f2c7b 100644
--- a/xfa/fgas/layout/fgas_textbreak.cpp
+++ b/xfa/fgas/layout/fgas_textbreak.cpp
@@ -1513,11 +1513,10 @@ int32_t CFX_TxtBreak::GetDisplayPos(const FX_TXTRUN* pTxtRun,
return iCount;
}
-int32_t CFX_TxtBreak::GetCharRects(const FX_TXTRUN* pTxtRun,
- std::vector<CFX_RectF>* rtArray,
- bool bCharBBox) const {
+std::vector<CFX_RectF> CFX_TxtBreak::GetCharRects(const FX_TXTRUN* pTxtRun,
+ bool bCharBBox) const {
if (!pTxtRun || pTxtRun->iLength < 1)
- return 0;
+ return std::vector<CFX_RectF>();
IFX_TxtAccess* pAccess = pTxtRun->pAccess;
const FDE_TEXTEDITPIECE* pIdentity = pTxtRun->pIdentity;
@@ -1525,7 +1524,6 @@ int32_t CFX_TxtBreak::GetCharRects(const FX_TXTRUN* pTxtRun,
int32_t* pWidths = pTxtRun->pWidths;
int32_t iLength = pTxtRun->iLength;
CFX_RectF rect(*pTxtRun->pRect);
- bool bRTLPiece = (pTxtRun->dwCharStyles & FX_TXTCHARSTYLE_OddBidiLevel) != 0;
FX_FLOAT fFontSize = pTxtRun->fFontSize;
int32_t iFontSize = FXSYS_round(fFontSize * 20.0f);
FX_FLOAT fScale = fFontSize / 1000.0f;
@@ -1539,12 +1537,10 @@ int32_t CFX_TxtBreak::GetCharRects(const FX_TXTRUN* pTxtRun,
FX_FLOAT fLeft = std::max(0.0f, bbox.left * fScale);
FX_FLOAT fHeight = FXSYS_fabs(bbox.height * fScale);
- rtArray->clear();
- rtArray->resize(iLength);
-
- bool bVertical = (pTxtRun->dwStyles & FX_TXTLAYOUTSTYLE_VerticalLayout) != 0;
- bool bSingleLine = (pTxtRun->dwStyles & FX_TXTLAYOUTSTYLE_SingleLine) != 0;
- bool bCombText = (pTxtRun->dwStyles & FX_TXTLAYOUTSTYLE_CombText) != 0;
+ bool bRTLPiece = !!(pTxtRun->dwCharStyles & FX_TXTCHARSTYLE_OddBidiLevel);
+ bool bVertical = !!(pTxtRun->dwStyles & FX_TXTLAYOUTSTYLE_VerticalLayout);
+ bool bSingleLine = !!(pTxtRun->dwStyles & FX_TXTLAYOUTSTYLE_SingleLine);
+ bool bCombText = !!(pTxtRun->dwStyles & FX_TXTLAYOUTSTYLE_CombText);
FX_WCHAR wch;
FX_WCHAR wLineBreakChar = pTxtRun->wLineBreakChar;
int32_t iCharSize;
@@ -1555,6 +1551,7 @@ int32_t CFX_TxtBreak::GetCharRects(const FX_TXTRUN* pTxtRun,
else
fStart = bRTLPiece ? rect.right() : rect.left;
+ std::vector<CFX_RectF> rtArray(iLength);
for (int32_t i = 0; i < iLength; i++) {
if (pAccess) {
wch = pAccess->GetChar(pIdentity, i);
@@ -1617,12 +1614,12 @@ int32_t CFX_TxtBreak::GetCharRects(const FX_TXTRUN* pTxtRun,
rtBBoxF.height = fHeight;
rtBBoxF.top = std::max(rtBBoxF.top, 0.0f);
}
- (*rtArray)[i] = rtBBoxF;
+ rtArray[i] = rtBBoxF;
continue;
}
- (*rtArray)[i] = rect;
+ rtArray[i] = rect;
}
- return iLength;
+ return rtArray;
}
FX_TXTRUN::FX_TXTRUN()
diff --git a/xfa/fgas/layout/fgas_textbreak.h b/xfa/fgas/layout/fgas_textbreak.h
index b64a2422eb..69ca835fad 100644
--- a/xfa/fgas/layout/fgas_textbreak.h
+++ b/xfa/fgas/layout/fgas_textbreak.h
@@ -234,9 +234,8 @@ class CFX_TxtBreak {
FXTEXT_CHARPOS* pCharPos,
bool bCharCode = false,
CFX_WideString* pWSForms = nullptr) const;
- int32_t GetCharRects(const FX_TXTRUN* pTxtRun,
- std::vector<CFX_RectF>* rtArray,
- bool bCharBBox = false) const;
+ std::vector<CFX_RectF> GetCharRects(const FX_TXTRUN* pTxtRun,
+ bool bCharBBox = false) const;
void AppendChar_PageLoad(CFX_TxtChar* pCurChar, uint32_t dwProps);
uint32_t AppendChar_Combination(CFX_TxtChar* pCurChar, int32_t iRotation);
uint32_t AppendChar_Tab(CFX_TxtChar* pCurChar, int32_t iRotation);