summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--xfa/fgas/layout/fgas_rtfbreak.cpp50
-rw-r--r--xfa/fgas/layout/fgas_rtfbreak.h2
2 files changed, 19 insertions, 33 deletions
diff --git a/xfa/fgas/layout/fgas_rtfbreak.cpp b/xfa/fgas/layout/fgas_rtfbreak.cpp
index fdc9a57038..648897818f 100644
--- a/xfa/fgas/layout/fgas_rtfbreak.cpp
+++ b/xfa/fgas/layout/fgas_rtfbreak.cpp
@@ -41,7 +41,6 @@ CFX_RTFBreak::CFX_RTFBreak(uint32_t dwLayoutStyles)
m_iFontHeight(240),
m_iFontSize(240),
m_iTabWidth(720000),
- m_PositionedTabs(),
m_wDefChar(0xFEFF),
m_iDefChar(0),
m_wLineBreakChar(L'\n'),
@@ -65,7 +64,6 @@ CFX_RTFBreak::CFX_RTFBreak(uint32_t dwLayoutStyles)
CFX_RTFBreak::~CFX_RTFBreak() {
Reset();
- m_PositionedTabs.RemoveAll();
}
void CFX_RTFBreak::SetLineBoundary(FX_FLOAT fLineStart, FX_FLOAT fLineEnd) {
@@ -122,20 +120,13 @@ void CFX_RTFBreak::SetTabWidth(FX_FLOAT fTabWidth) {
}
void CFX_RTFBreak::AddPositionedTab(FX_FLOAT fTabPos) {
- int32_t iLineEnd = m_iBoundaryEnd;
- int32_t iTabPos = FXSYS_round(fTabPos * 20000.0f) + m_iBoundaryStart;
- if (iTabPos > iLineEnd)
- iTabPos = iLineEnd;
- if (m_PositionedTabs.Find(iTabPos, 0) > -1)
+ int32_t iTabPos = std::min(FXSYS_round(fTabPos * 20000.0f) + m_iBoundaryStart,
+ m_iBoundaryEnd);
+ auto it = std::lower_bound(m_PositionedTabs.begin(), m_PositionedTabs.end(),
+ iTabPos);
+ if (it != m_PositionedTabs.end() && *it == iTabPos)
return;
-
- int32_t iCount = m_PositionedTabs.GetSize();
- int32_t iFind = 0;
- for (; iFind < iCount; iFind++) {
- if (m_PositionedTabs[iFind] > iTabPos)
- break;
- }
- m_PositionedTabs.InsertAt(iFind, iTabPos);
+ m_PositionedTabs.insert(it, iTabPos);
}
void CFX_RTFBreak::SetLineBreakTolerance(FX_FLOAT fTolerance) {
@@ -222,21 +213,17 @@ inline FX_CHARTYPE CFX_RTFBreak::GetUnifiedCharType(
}
int32_t CFX_RTFBreak::GetLastPositionedTab() const {
- int32_t iCount = m_PositionedTabs.GetSize();
- if (iCount < 1)
- return m_iBoundaryStart;
- return m_PositionedTabs[iCount - 1];
+ return m_PositionedTabs.empty() ? m_iBoundaryStart : m_PositionedTabs.back();
}
bool CFX_RTFBreak::GetPositionedTab(int32_t* iTabPos) const {
- int32_t iCount = m_PositionedTabs.GetSize();
- for (int32_t i = 0; i < iCount; i++) {
- if (m_PositionedTabs[i] > *iTabPos) {
- *iTabPos = m_PositionedTabs[i];
- return true;
- }
- }
- return false;
+ auto it = std::upper_bound(m_PositionedTabs.begin(), m_PositionedTabs.end(),
+ *iTabPos);
+ if (it == m_PositionedTabs.end())
+ return false;
+
+ *iTabPos = *it;
+ return true;
}
CFX_RTFBreakType CFX_RTFBreak::AppendChar(FX_WCHAR wch) {
@@ -739,7 +726,7 @@ int32_t CFX_RTFBreak::GetBreakPos(std::vector<CFX_RTFChar>& tca,
CFX_RTFChar* pCharArray = tca.data();
CFX_RTFChar* pCur = pCharArray + iLength;
- iLength--;
+ --iLength;
if (bAllChars)
pCur->m_nBreakType = FX_LBT_UNKNOWN;
@@ -922,12 +909,11 @@ int32_t CFX_RTFBreak::GetDisplayPos(const FX_RTFTEXTOBJ* pText,
iWidth = pText->pWidths[i];
dwProps = FX_GetUnicodeProperties(wch);
dwCharType = (dwProps & FX_CHARTYPEBITSMASK);
- if (dwCharType == FX_CHARTYPE_ArabicAlef && iWidth == 0) {
- wPrev = 0xFEFF;
+ if (iWidth == 0) {
+ if (dwCharType == FX_CHARTYPE_ArabicAlef)
+ wPrev = 0xFEFF;
continue;
}
- if (iWidth == 0)
- continue;
iCharWidth = FXSYS_abs(iWidth);
bEmptyChar =
diff --git a/xfa/fgas/layout/fgas_rtfbreak.h b/xfa/fgas/layout/fgas_rtfbreak.h
index 55b99ae298..2b6c2cf19f 100644
--- a/xfa/fgas/layout/fgas_rtfbreak.h
+++ b/xfa/fgas/layout/fgas_rtfbreak.h
@@ -208,7 +208,7 @@ class CFX_RTFBreak {
int32_t m_iFontHeight;
int32_t m_iFontSize;
int32_t m_iTabWidth;
- CFX_ArrayTemplate<int32_t> m_PositionedTabs;
+ std::vector<int32_t> m_PositionedTabs;
FX_WCHAR m_wDefChar;
int32_t m_iDefChar;
FX_WCHAR m_wLineBreakChar;