Replace CXFA_StrokeArray and CXFA_WidgetArray with std::vector
Review-Url: https://codereview.chromium.org/2648773003
diff --git a/xfa/fxfa/app/xfa_ffpageview.cpp b/xfa/fxfa/app/xfa_ffpageview.cpp
index 5ef1086..3dfa237 100644
--- a/xfa/fxfa/app/xfa_ffpageview.cpp
+++ b/xfa/fxfa/app/xfa_ffpageview.cpp
@@ -6,6 +6,11 @@
#include "xfa/fxfa/xfa_ffpageview.h"
+#include <memory>
+#include <vector>
+
+#include "third_party/base/ptr_util.h"
+#include "third_party/base/stl_util.h"
#include "xfa/fde/fde_render.h"
#include "xfa/fxfa/app/xfa_ffcheckbutton.h"
#include "xfa/fxfa/app/xfa_ffchoicelist.h"
@@ -228,32 +233,34 @@
CreateTabOrderWidgetArray();
m_iCurWidget = -1;
}
+
CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::MoveToFirst() {
- if (m_TabOrderWidgetArray.GetSize() > 0) {
- for (int32_t i = 0; i < m_TabOrderWidgetArray.GetSize(); i++) {
- if (PageWidgetFilter(m_TabOrderWidgetArray[i], m_dwFilter, true,
- m_bIgnorerelevant)) {
- m_iCurWidget = i;
- return m_TabOrderWidgetArray[m_iCurWidget];
- }
+ for (int32_t i = 0;
+ i < pdfium::CollectionSize<int32_t>(m_TabOrderWidgetArray); i++) {
+ if (PageWidgetFilter(m_TabOrderWidgetArray[i], m_dwFilter, true,
+ m_bIgnorerelevant)) {
+ m_iCurWidget = i;
+ return m_TabOrderWidgetArray[m_iCurWidget];
}
}
return nullptr;
}
+
CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::MoveToLast() {
- if (m_TabOrderWidgetArray.GetSize() > 0) {
- for (int32_t i = m_TabOrderWidgetArray.GetSize() - 1; i >= 0; i--) {
- if (PageWidgetFilter(m_TabOrderWidgetArray[i], m_dwFilter, true,
- m_bIgnorerelevant)) {
- m_iCurWidget = i;
- return m_TabOrderWidgetArray[m_iCurWidget];
- }
+ for (int32_t i = pdfium::CollectionSize<int32_t>(m_TabOrderWidgetArray) - 1;
+ i >= 0; i--) {
+ if (PageWidgetFilter(m_TabOrderWidgetArray[i], m_dwFilter, true,
+ m_bIgnorerelevant)) {
+ m_iCurWidget = i;
+ return m_TabOrderWidgetArray[m_iCurWidget];
}
}
return nullptr;
}
+
CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::MoveToNext() {
- for (int32_t i = m_iCurWidget + 1; i < m_TabOrderWidgetArray.GetSize(); i++) {
+ for (int32_t i = m_iCurWidget + 1;
+ i < pdfium::CollectionSize<int32_t>(m_TabOrderWidgetArray); i++) {
if (PageWidgetFilter(m_TabOrderWidgetArray[i], m_dwFilter, true,
m_bIgnorerelevant)) {
m_iCurWidget = i;
@@ -263,6 +270,7 @@
m_iCurWidget = -1;
return nullptr;
}
+
CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::MoveToPrevious() {
for (int32_t i = m_iCurWidget - 1; i >= 0; i--) {
if (PageWidgetFilter(m_TabOrderWidgetArray[i], m_dwFilter, true,
@@ -274,21 +282,22 @@
m_iCurWidget = -1;
return nullptr;
}
+
CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::GetCurrentWidget() {
- if (m_iCurWidget >= 0) {
- return m_TabOrderWidgetArray[m_iCurWidget];
- }
- return nullptr;
+ return m_iCurWidget >= 0 ? m_TabOrderWidgetArray[m_iCurWidget] : nullptr;
}
+
bool CXFA_FFTabOrderPageWidgetIterator::SetCurrentWidget(
CXFA_FFWidget* hWidget) {
- int32_t iWidgetIndex = m_TabOrderWidgetArray.Find(hWidget);
- if (iWidgetIndex >= 0) {
- m_iCurWidget = iWidgetIndex;
- return true;
- }
- return false;
+ auto it = std::find(m_TabOrderWidgetArray.begin(),
+ m_TabOrderWidgetArray.end(), hWidget);
+ if (it == m_TabOrderWidgetArray.end())
+ return false;
+
+ m_iCurWidget = it - m_TabOrderWidgetArray.begin();
+ return true;
}
+
CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::GetTraverseWidget(
CXFA_FFWidget* pWidget) {
CXFA_WidgetAcc* pAcc = pWidget->GetDataAcc();
@@ -309,29 +318,36 @@
CXFA_FFWidget* pRefWidget) {
return pRefWidget->GetDocView()->GetWidgetByName(wsWidgetName, pRefWidget);
}
+
void CXFA_FFTabOrderPageWidgetIterator::CreateTabOrderWidgetArray() {
- m_TabOrderWidgetArray.RemoveAll();
- CXFA_WidgetArray SpaceOrderWidgetArray;
- CreateSpaceOrderWidgetArray(SpaceOrderWidgetArray);
- int32_t nWidgetCount = SpaceOrderWidgetArray.GetSize();
- if (nWidgetCount < 1) {
+ m_TabOrderWidgetArray.clear();
+
+ std::vector<CXFA_FFWidget*> SpaceOrderWidgetArray;
+ CreateSpaceOrderWidgetArray(&SpaceOrderWidgetArray);
+ if (SpaceOrderWidgetArray.empty())
return;
- }
+
+ int32_t nWidgetCount = pdfium::CollectionSize<int32_t>(SpaceOrderWidgetArray);
CXFA_FFWidget* hWidget = SpaceOrderWidgetArray[0];
- for (; m_TabOrderWidgetArray.GetSize() < nWidgetCount;) {
- if (m_TabOrderWidgetArray.Find(hWidget) < 0) {
- m_TabOrderWidgetArray.Add(hWidget);
+ while (pdfium::CollectionSize<int32_t>(m_TabOrderWidgetArray) <
+ nWidgetCount) {
+ if (!pdfium::ContainsValue(m_TabOrderWidgetArray, hWidget)) {
+ m_TabOrderWidgetArray.push_back(hWidget);
CXFA_WidgetAcc* pWidgetAcc = hWidget->GetDataAcc();
if (pWidgetAcc->GetUIType() == XFA_Element::ExclGroup) {
- int32_t iWidgetIndex = SpaceOrderWidgetArray.Find(hWidget) + 1;
+ auto it = std::find(SpaceOrderWidgetArray.begin(),
+ SpaceOrderWidgetArray.end(), hWidget);
+ int32_t iWidgetIndex = it != SpaceOrderWidgetArray.end()
+ ? it - SpaceOrderWidgetArray.begin() + 1
+ : 0;
while (true) {
CXFA_FFWidget* pRadio =
- SpaceOrderWidgetArray[(iWidgetIndex) % nWidgetCount];
+ SpaceOrderWidgetArray[iWidgetIndex % nWidgetCount];
if (pRadio->GetDataAcc()->GetExclGroup() != pWidgetAcc) {
break;
}
- if (m_TabOrderWidgetArray.Find(hWidget) < 0) {
- m_TabOrderWidgetArray.Add(pRadio);
+ if (!pdfium::ContainsValue(m_TabOrderWidgetArray, hWidget)) {
+ m_TabOrderWidgetArray.push_back(pRadio);
}
iWidgetIndex++;
}
@@ -341,10 +357,15 @@
continue;
}
}
- int32_t iWidgetIndex = SpaceOrderWidgetArray.Find(hWidget);
- hWidget = SpaceOrderWidgetArray[(iWidgetIndex + 1) % nWidgetCount];
+ auto it = std::find(SpaceOrderWidgetArray.begin(),
+ SpaceOrderWidgetArray.end(), hWidget);
+ int32_t iWidgetIndex = it != SpaceOrderWidgetArray.end()
+ ? it - SpaceOrderWidgetArray.begin() + 1
+ : 0;
+ hWidget = SpaceOrderWidgetArray[iWidgetIndex % nWidgetCount];
}
}
+
static int32_t XFA_TabOrderWidgetComparator(const void* phWidget1,
const void* phWidget2) {
CXFA_FFWidget* pWidget1 = (*(CXFA_TabParam**)phWidget1)->m_pWidget;
@@ -407,36 +428,35 @@
XFA_TabOrderWidgetComparator);
}
for (int32_t iStart = 0; iStart < iChildren; iStart++) {
- CXFA_TabParam* pParam = tabParams[iStart];
- pContainer->m_Children.Add(pParam->m_pWidget);
- if (pParam->m_Children.GetSize() > 0) {
- pContainer->m_Children.Append(pParam->m_Children);
- }
- delete pParam;
+ std::unique_ptr<CXFA_TabParam> pParam(tabParams[iStart]);
+ pContainer->m_Children.push_back(pParam->m_pWidget);
+ pContainer->m_Children.insert(pContainer->m_Children.end(),
+ pParam->m_Children.begin(),
+ pParam->m_Children.end());
}
tabParams.RemoveAll();
}
void CXFA_FFTabOrderPageWidgetIterator::CreateSpaceOrderWidgetArray(
- CXFA_WidgetArray& WidgetArray) {
+ std::vector<CXFA_FFWidget*>* WidgetArray) {
CXFA_LayoutItemIterator sIterator;
sIterator.Init(m_pPageView);
- CXFA_TabParam* pParam = new CXFA_TabParam;
+ auto pParam = pdfium::MakeUnique<CXFA_TabParam>();
bool bCurrentItem = false;
bool bContentArea = false;
- OrderContainer(&sIterator, nullptr, pParam, bCurrentItem, bContentArea);
- if (pParam->m_Children.GetSize() > 0) {
- WidgetArray.Append(pParam->m_Children);
- }
+ OrderContainer(&sIterator, nullptr, pParam.get(), bCurrentItem, bContentArea);
+ WidgetArray->insert(WidgetArray->end(), pParam->m_Children.begin(),
+ pParam->m_Children.end());
+
sIterator.Reset();
bCurrentItem = false;
bContentArea = false;
- pParam->m_Children.RemoveAll();
- OrderContainer(&sIterator, nullptr, pParam, bCurrentItem, bContentArea, true);
- if (pParam->m_Children.GetSize() > 0) {
- WidgetArray.Append(pParam->m_Children);
- }
- delete pParam;
+ pParam->m_Children.clear();
+ OrderContainer(&sIterator, nullptr, pParam.get(), bCurrentItem, bContentArea,
+ true);
+ WidgetArray->insert(WidgetArray->end(), pParam->m_Children.begin(),
+ pParam->m_Children.end());
}
+
CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::GetWidget(
CXFA_LayoutItem* pLayoutItem) {
if (CXFA_FFWidget* pWidget = XFA_GetWidgetFromLayoutItem(pLayoutItem)) {
diff --git a/xfa/fxfa/app/xfa_ffwidget.cpp b/xfa/fxfa/app/xfa_ffwidget.cpp
index 64aed4f..c182247 100644
--- a/xfa/fxfa/app/xfa_ffwidget.cpp
+++ b/xfa/fxfa/app/xfa_ffwidget.cpp
@@ -1217,7 +1217,7 @@
startAngle, sweepAngle);
}
static void XFA_BOX_GetPath(CXFA_Box box,
- const CXFA_StrokeArray& strokes,
+ const std::vector<CXFA_Stroke>& strokes,
CFX_RectF rtWidget,
CFX_Path& path,
int32_t nIndex,
@@ -1385,7 +1385,7 @@
}
}
static void XFA_BOX_GetFillPath(CXFA_Box box,
- const CXFA_StrokeArray& strokes,
+ const std::vector<CXFA_Stroke>& strokes,
CFX_RectF rtWidget,
CFX_Path& fillPath,
uint16_t dwFlags) {
@@ -1631,7 +1631,7 @@
pGS->FillPath(&fillPath, FXFILL_WINDING, pMatrix);
}
static void XFA_BOX_Fill(CXFA_Box box,
- const CXFA_StrokeArray& strokes,
+ const std::vector<CXFA_Stroke>& strokes,
CFX_Graphics* pGS,
const CFX_RectF& rtWidget,
CFX_Matrix* pMatrix,
@@ -1870,7 +1870,7 @@
XFA_Draw3DRect(pGS, rtInner, fHalfWidth, pMatrix, 0xFF000000, 0xFF808080);
}
static void XFA_BOX_Stroke_Rect(CXFA_Box box,
- const CXFA_StrokeArray& strokes,
+ const std::vector<CXFA_Stroke>& strokes,
CFX_Graphics* pGS,
CFX_RectF rtWidget,
CFX_Matrix* pMatrix) {
@@ -1961,7 +1961,7 @@
}
}
static void XFA_BOX_Stroke(CXFA_Box box,
- const CXFA_StrokeArray& strokes,
+ const std::vector<CXFA_Stroke>& strokes,
CFX_Graphics* pGS,
CFX_RectF rtWidget,
CFX_Matrix* pMatrix,
@@ -2038,10 +2038,10 @@
eType != XFA_Element::Rectangle) {
return;
}
- CXFA_StrokeArray strokes;
- if (!(dwFlags & XFA_DRAWBOX_ForceRound) && eType != XFA_Element::Arc) {
- box.GetStrokes(strokes);
- }
+ std::vector<CXFA_Stroke> strokes;
+ if (!(dwFlags & XFA_DRAWBOX_ForceRound) && eType != XFA_Element::Arc)
+ box.GetStrokes(&strokes);
+
XFA_BOX_Fill(box, strokes, pGS, rtWidget, pMatrix, dwFlags);
XFA_BOX_Stroke(box, strokes, pGS, rtWidget, pMatrix, dwFlags);
}
diff --git a/xfa/fxfa/parser/cxfa_box.cpp b/xfa/fxfa/parser/cxfa_box.cpp
index 9d9b4b4..552c980 100644
--- a/xfa/fxfa/parser/cxfa_box.cpp
+++ b/xfa/fxfa/parser/cxfa_box.cpp
@@ -13,53 +13,47 @@
namespace {
void GetStrokesInternal(CXFA_Node* pNode,
- CXFA_StrokeArray& strokes,
+ std::vector<CXFA_Stroke>* strokes,
bool bNull) {
- strokes.RemoveAll();
+ strokes->clear();
if (!pNode)
return;
- strokes.SetSize(8);
+ strokes->resize(8);
int32_t i, j;
for (i = 0, j = 0; i < 4; i++) {
CXFA_Corner corner =
CXFA_Corner(pNode->GetProperty(i, XFA_Element::Corner, i == 0));
- if (corner || i == 0)
- strokes.SetAt(j, corner);
- else if (bNull)
- strokes.SetAt(j, CXFA_Stroke(nullptr));
- else if (i == 1)
- strokes.SetAt(j, strokes[0]);
- else if (i == 2)
- strokes.SetAt(j, strokes[0]);
- else
- strokes.SetAt(j, strokes[2]);
-
+ if (corner || i == 0) {
+ (*strokes)[j] = corner;
+ } else if (!bNull) {
+ if (i == 1 || i == 2)
+ (*strokes)[j] = (*strokes)[0];
+ else
+ (*strokes)[j] = (*strokes)[2];
+ }
j++;
CXFA_Edge edge =
CXFA_Edge(pNode->GetProperty(i, XFA_Element::Edge, i == 0));
- if (edge || i == 0)
- strokes.SetAt(j, edge);
- else if (bNull)
- strokes.SetAt(j, CXFA_Stroke(nullptr));
- else if (i == 1)
- strokes.SetAt(j, strokes[1]);
- else if (i == 2)
- strokes.SetAt(j, strokes[1]);
- else
- strokes.SetAt(j, strokes[3]);
-
+ if (edge || i == 0) {
+ (*strokes)[j] = edge;
+ } else if (!bNull) {
+ if (i == 1 || i == 2)
+ (*strokes)[j] = (*strokes)[1];
+ else
+ (*strokes)[j] = (*strokes)[3];
+ }
j++;
}
}
-static int32_t Style3D(const CXFA_StrokeArray& strokes, CXFA_Stroke& stroke) {
- int32_t iCount = strokes.GetSize();
- if (iCount < 1)
+static int32_t Style3D(const std::vector<CXFA_Stroke>& strokes,
+ CXFA_Stroke& stroke) {
+ if (strokes.empty())
return 0;
stroke = strokes[0];
- for (int32_t i = 1; i < iCount; i++) {
+ for (size_t i = 1; i < strokes.size(); i++) {
CXFA_Stroke find = strokes[i];
if (!find)
continue;
@@ -105,7 +99,7 @@
: nullptr);
}
-void CXFA_Box::GetStrokes(CXFA_StrokeArray& strokes) const {
+void CXFA_Box::GetStrokes(std::vector<CXFA_Stroke>* strokes) const {
GetStrokesInternal(m_pNode, strokes, false);
}
@@ -158,8 +152,8 @@
if (IsArc())
return 0;
- CXFA_StrokeArray strokes;
- GetStrokesInternal(m_pNode, strokes, true);
+ std::vector<CXFA_Stroke> strokes;
+ GetStrokesInternal(m_pNode, &strokes, true);
CXFA_Stroke stroke(nullptr);
int32_t iType = Style3D(strokes, stroke);
if (iType) {
diff --git a/xfa/fxfa/parser/cxfa_box.h b/xfa/fxfa/parser/cxfa_box.h
index 014155c..a0af2f4 100644
--- a/xfa/fxfa/parser/cxfa_box.h
+++ b/xfa/fxfa/parser/cxfa_box.h
@@ -7,6 +7,8 @@
#ifndef XFA_FXFA_PARSER_CXFA_BOX_H_
#define XFA_FXFA_PARSER_CXFA_BOX_H_
+#include <vector>
+
#include "core/fxcrt/fx_system.h"
#include "xfa/fxfa/parser/cxfa_data.h"
#include "xfa/fxfa/parser/cxfa_edge.h"
@@ -28,7 +30,7 @@
int32_t GetPresence() const;
int32_t CountEdges() const;
CXFA_Edge GetEdge(int32_t nIndex = 0) const;
- void GetStrokes(CXFA_StrokeArray& strokes) const;
+ void GetStrokes(std::vector<CXFA_Stroke>* strokes) const;
bool IsCircular() const;
bool GetStartAngle(FX_FLOAT& fStartAngle) const;
FX_FLOAT GetStartAngle() const {
diff --git a/xfa/fxfa/parser/cxfa_stroke.h b/xfa/fxfa/parser/cxfa_stroke.h
index a3287d2..cf941c8 100644
--- a/xfa/fxfa/parser/cxfa_stroke.h
+++ b/xfa/fxfa/parser/cxfa_stroke.h
@@ -21,6 +21,7 @@
class CXFA_Stroke : public CXFA_Data {
public:
+ CXFA_Stroke() : CXFA_Stroke(nullptr) {}
explicit CXFA_Stroke(CXFA_Node* pNode) : CXFA_Data(pNode) {}
bool IsCorner() const { return GetElementType() == XFA_Element::Corner; }
@@ -40,6 +41,4 @@
bool SameStyles(CXFA_Stroke stroke, uint32_t dwFlags = 0) const;
};
-typedef CFX_ArrayTemplate<CXFA_Stroke> CXFA_StrokeArray;
-
#endif // XFA_FXFA_PARSER_CXFA_STROKE_H_
diff --git a/xfa/fxfa/parser/cxfa_widgetdata.cpp b/xfa/fxfa/parser/cxfa_widgetdata.cpp
index 31c5cf4..e77fa55 100644
--- a/xfa/fxfa/parser/cxfa_widgetdata.cpp
+++ b/xfa/fxfa/parser/cxfa_widgetdata.cpp
@@ -18,7 +18,7 @@
namespace {
-FX_FLOAT GetEdgeThickness(const CXFA_StrokeArray& strokes,
+FX_FLOAT GetEdgeThickness(const std::vector<CXFA_Stroke>& strokes,
bool b3DStyle,
int32_t nIndex) {
FX_FLOAT fThickness = 0;
@@ -431,8 +431,8 @@
FX_FLOAT fThickness = 0;
border.Get3DStyle(bVisible, fThickness);
if (!bLeft || !bTop || !bRight || !bBottom) {
- CXFA_StrokeArray strokes;
- border.GetStrokes(strokes);
+ std::vector<CXFA_Stroke> strokes;
+ border.GetStrokes(&strokes);
if (!bTop)
fTopInset = GetEdgeThickness(strokes, bVisible, 0);
if (!bRight)
diff --git a/xfa/fxfa/xfa_ffpageview.h b/xfa/fxfa/xfa_ffpageview.h
index c6bbe7d..089e276 100644
--- a/xfa/fxfa/xfa_ffpageview.h
+++ b/xfa/fxfa/xfa_ffpageview.h
@@ -1,4 +1,4 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
+// Copyrig 2014 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.
@@ -7,6 +7,8 @@
#ifndef XFA_FXFA_XFA_FFPAGEVIEW_H_
#define XFA_FXFA_XFA_FFPAGEVIEW_H_
+#include <vector>
+
#include "xfa/fxfa/parser/cxfa_containerlayoutitem.h"
#include "xfa/fxfa/parser/cxfa_contentlayoutitem.h"
#include "xfa/fxfa/parser/cxfa_traversestrategy_layoutitem.h"
@@ -59,7 +61,6 @@
bool m_bIgnorerelevant;
CXFA_LayoutItemIterator m_sIterator;
};
-typedef CFX_ArrayTemplate<CXFA_FFWidget*> CXFA_WidgetArray;
class CXFA_TabParam {
public:
@@ -67,7 +68,7 @@
~CXFA_TabParam();
CXFA_FFWidget* m_pWidget;
- CXFA_WidgetArray m_Children;
+ std::vector<CXFA_FFWidget*> m_Children;
};
class CXFA_FFTabOrderPageWidgetIterator : public IXFA_WidgetIterator {
@@ -89,7 +90,7 @@
CXFA_FFWidget* FindWidgetByName(const CFX_WideString& wsWidgetName,
CXFA_FFWidget* pRefWidget);
void CreateTabOrderWidgetArray();
- void CreateSpaceOrderWidgetArray(CXFA_WidgetArray& WidgetArray);
+ void CreateSpaceOrderWidgetArray(std::vector<CXFA_FFWidget*>* WidgetArray);
CXFA_FFWidget* GetWidget(CXFA_LayoutItem* pLayoutItem);
void OrderContainer(CXFA_LayoutItemIterator* sIterator,
CXFA_LayoutItem* pContainerItem,
@@ -98,7 +99,7 @@
bool& bContentArea,
bool bMarsterPage = false);
- CXFA_WidgetArray m_TabOrderWidgetArray;
+ std::vector<CXFA_FFWidget*> m_TabOrderWidgetArray;
CXFA_FFPageView* m_pPageView;
uint32_t m_dwFilter;
int32_t m_iCurWidget;