summaryrefslogtreecommitdiff
path: root/xfa
diff options
context:
space:
mode:
Diffstat (limited to 'xfa')
-rw-r--r--xfa/fde/cfde_txtedtengine.cpp11
-rw-r--r--xfa/fde/tto/fde_textout.cpp4
-rw-r--r--xfa/fgas/layout/fgas_textbreak.cpp212
-rw-r--r--xfa/fgas/layout/fgas_textbreak.h50
4 files changed, 107 insertions, 170 deletions
diff --git a/xfa/fde/cfde_txtedtengine.cpp b/xfa/fde/cfde_txtedtengine.cpp
index a61f6ab4d9..fbc5e159ed 100644
--- a/xfa/fde/cfde_txtedtengine.cpp
+++ b/xfa/fde/cfde_txtedtengine.cpp
@@ -53,7 +53,7 @@ FDE_TXTEDT_TEXTCHANGE_INFO::FDE_TXTEDT_TEXTCHANGE_INFO() {}
FDE_TXTEDT_TEXTCHANGE_INFO::~FDE_TXTEDT_TEXTCHANGE_INFO() {}
CFDE_TxtEdtEngine::CFDE_TxtEdtEngine()
- : m_pTxtBuf(new CFDE_TxtEdtBuf()),
+ : m_pTxtBuf(pdfium::MakeUnique<CFDE_TxtEdtBuf>()),
m_nPageLineCount(20),
m_nLineCount(0),
m_nAnchorPos(-1),
@@ -81,11 +81,11 @@ CFDE_TxtEdtEngine::~CFDE_TxtEdtEngine() {
void CFDE_TxtEdtEngine::SetEditParams(const FDE_TXTEDTPARAMS& params) {
if (!m_pTextBreak)
- m_pTextBreak = pdfium::MakeUnique<CFX_TxtBreak>(FX_TXTBREAKPOLICY_None);
+ m_pTextBreak = pdfium::MakeUnique<CFX_TxtBreak>();
m_Param = params;
m_wLineEnd = params.wLineBreakChar;
- m_bAutoLineEnd = (m_Param.nLineEnd == FDE_TXTEDIT_LINEEND_Auto);
+ m_bAutoLineEnd = m_Param.nLineEnd == FDE_TXTEDIT_LINEEND_Auto;
UpdateTxtBreak();
}
@@ -930,8 +930,7 @@ void CFDE_TxtEdtEngine::RebuildParagraphs() {
FX_WCHAR wChar = L' ';
int32_t nParagStart = 0;
int32_t nIndex = 0;
- std::unique_ptr<IFX_CharIter> pIter(
- new CFDE_TxtEdtBuf::Iterator(m_pTxtBuf.get()));
+ auto pIter = pdfium::MakeUnique<CFDE_TxtEdtBuf::Iterator>(m_pTxtBuf.get());
pIter->SetAt(0);
do {
wChar = pIter->GetChar();
@@ -1376,7 +1375,7 @@ bool CFDE_TxtEdtEngine::MoveEnd() {
}
bool CFDE_TxtEdtEngine::IsFitArea(CFX_WideString& wsText) {
- std::unique_ptr<CFDE_TextOut> pTextOut(new CFDE_TextOut);
+ auto pTextOut = pdfium::MakeUnique<CFDE_TextOut>();
pTextOut->SetLineSpace(m_Param.fLineSpace);
pTextOut->SetFont(m_Param.pFont);
pTextOut->SetFontSize(m_Param.fFontSize);
diff --git a/xfa/fde/tto/fde_textout.cpp b/xfa/fde/tto/fde_textout.cpp
index 421876b48d..b4bbe67238 100644
--- a/xfa/fde/tto/fde_textout.cpp
+++ b/xfa/fde/tto/fde_textout.cpp
@@ -23,7 +23,7 @@ FDE_TTOPIECE::FDE_TTOPIECE(const FDE_TTOPIECE& that) = default;
FDE_TTOPIECE::~FDE_TTOPIECE() = default;
CFDE_TextOut::CFDE_TextOut()
- : m_pTxtBreak(new CFX_TxtBreak(FX_TXTBREAKPOLICY_None)),
+ : m_pTxtBreak(pdfium::MakeUnique<CFX_TxtBreak>()),
m_pFont(nullptr),
m_fFontSize(12.0f),
m_fLineSpace(m_fFontSize),
@@ -771,7 +771,7 @@ void CFDE_TextOut::DrawLine(const FDE_TTOPIECE* pPiece, CFDE_Pen* pPen) {
if (!bUnderLine && !bStrikeOut && !bHotKey)
return;
- std::unique_ptr<CFDE_Path> pPath(new CFDE_Path);
+ auto pPath = pdfium::MakeUnique<CFDE_Path>();
int32_t iLineCount = 0;
CFX_RectF rtText = pPiece->rtPiece;
CFX_PointF pt1, pt2;
diff --git a/xfa/fgas/layout/fgas_textbreak.cpp b/xfa/fgas/layout/fgas_textbreak.cpp
index 153d575139..e458f4c283 100644
--- a/xfa/fgas/layout/fgas_textbreak.cpp
+++ b/xfa/fgas/layout/fgas_textbreak.cpp
@@ -37,9 +37,8 @@ bool IsCtrlCode(FX_WCHAR ch) {
} // namespace
-CFX_TxtBreak::CFX_TxtBreak(uint32_t dwPolicies)
- : m_dwPolicies(dwPolicies),
- m_iLineWidth(2000000),
+CFX_TxtBreak::CFX_TxtBreak()
+ : m_iLineWidth(2000000),
m_dwLayoutStyles(0),
m_bVertical(false),
m_bArabicContext(false),
@@ -71,11 +70,7 @@ CFX_TxtBreak::CFX_TxtBreak(uint32_t dwPolicies)
m_iTolerance(0),
m_iHorScale(100),
m_iCharSpace(0) {
- m_bPagination = (m_dwPolicies & FX_TXTBREAKPOLICY_Pagination) != 0;
- int32_t iSize = m_bPagination ? sizeof(CFX_Char) : sizeof(CFX_TxtChar);
- m_pTxtLine1 = pdfium::MakeUnique<CFX_TxtLine>(iSize);
- m_pTxtLine2 = pdfium::MakeUnique<CFX_TxtLine>(iSize);
- m_pCurLine = m_pTxtLine1.get();
+ m_pCurLine = &m_TxtLine1;
ResetArabicContext();
}
@@ -214,9 +209,6 @@ void CFX_TxtBreak::SetUserData(void* pUserData) {
}
void CFX_TxtBreak::SetBreakStatus() {
- if (m_bPagination)
- return;
-
int32_t iCount = m_pCurLine->CountChars();
if (iCount < 1)
return;
@@ -247,7 +239,7 @@ int32_t CFX_TxtBreak::GetLineRotation(uint32_t dwStyles) const {
}
CFX_TxtChar* CFX_TxtBreak::GetLastChar(int32_t index, bool bOmitChar) const {
- std::vector<CFX_TxtChar>& ca = *m_pCurLine->m_pLineChars.get();
+ std::vector<CFX_TxtChar>& ca = m_pCurLine->m_LineChars;
int32_t iCount = pdfium::CollectionSize<int32_t>(ca);
if (index < 0 || index >= iCount)
return nullptr;
@@ -263,17 +255,17 @@ CFX_TxtChar* CFX_TxtBreak::GetLastChar(int32_t index, bool bOmitChar) const {
return nullptr;
}
-CFX_TxtLine* CFX_TxtBreak::GetTxtLine() const {
+const CFX_TxtLine* CFX_TxtBreak::GetTxtLine() const {
if (m_iReady == 1)
- return m_pTxtLine1.get();
+ return &m_TxtLine1;
if (m_iReady == 2)
- return m_pTxtLine2.get();
+ return &m_TxtLine2;
return nullptr;
}
-CFX_TxtPieceArray* CFX_TxtBreak::GetTxtPieces() const {
- CFX_TxtLine* pTxtLine = GetTxtLine();
- return pTxtLine ? pTxtLine->m_pLinePieces.get() : nullptr;
+const CFX_TxtPieceArray* CFX_TxtBreak::GetTxtPieces() const {
+ const CFX_TxtLine* pTxtLine = GetTxtLine();
+ return pTxtLine ? &pTxtLine->m_LinePieces : nullptr;
}
inline FX_CHARTYPE CFX_TxtBreak::GetUnifiedCharType(
@@ -289,13 +281,8 @@ void CFX_TxtBreak::ResetArabicContext() {
m_iCurAlignment |= (m_iAlignment & FX_TXTLINEALIGNMENT_HigherMask);
m_bArabicNumber = m_iArabicContext >= 1 && m_bArabicShapes;
} else {
- if (m_bPagination) {
- m_bCurRTL = false;
- m_iCurAlignment = 0;
- } else {
- m_bCurRTL = m_bRTL;
- m_iCurAlignment = m_iAlignment;
- }
+ m_bCurRTL = m_bRTL;
+ m_iCurAlignment = m_iAlignment;
if (m_bRTL)
m_bArabicNumber = m_iArabicContext >= 1;
else
@@ -308,10 +295,9 @@ void CFX_TxtBreak::ResetArabicContext() {
void CFX_TxtBreak::AppendChar_PageLoad(CFX_TxtChar* pCurChar,
uint32_t dwProps) {
- if (!m_bPagination) {
- pCurChar->m_dwStatus = 0;
- pCurChar->m_pUserData = m_pUserData;
- }
+ pCurChar->m_dwStatus = 0;
+ pCurChar->m_pUserData = m_pUserData;
+
if (m_bArabicContext || m_bArabicShapes) {
int32_t iBidiCls = (dwProps & FX_BIDICLASSBITSMASK) >> FX_BIDICLASSBITS;
int32_t iArabicContext =
@@ -325,11 +311,9 @@ void CFX_TxtBreak::AppendChar_PageLoad(CFX_TxtChar* pCurChar,
m_iCurArabicContext = iArabicContext;
ResetArabicContext();
- if (!m_bPagination) {
- CFX_TxtChar* pLastChar = GetLastChar(1, false);
- if (pLastChar && pLastChar->m_dwStatus < 1)
- pLastChar->m_dwStatus = FX_TXTBREAK_PieceBreak;
- }
+ CFX_TxtChar* pLastChar = GetLastChar(1, false);
+ if (pLastChar && pLastChar->m_dwStatus < 1)
+ pLastChar->m_dwStatus = FX_TXTBREAK_PieceBreak;
}
}
pCurChar->m_dwCharStyles = m_dwContextCharStyles;
@@ -348,29 +332,27 @@ uint32_t CFX_TxtBreak::AppendChar_Combination(CFX_TxtChar* pCurChar,
iCharWidth = 1000;
} else {
wForm = wch;
- if (!m_bPagination) {
- CFX_TxtChar* pLastChar = GetLastChar(0, false);
- if (pLastChar &&
- (pLastChar->m_dwCharStyles & FX_TXTCHARSTYLE_ArabicShadda) == 0) {
- bool bShadda = false;
- if (wch == 0x0651) {
- FX_WCHAR wLast = pLastChar->m_wCharCode;
- if (wLast >= 0x064C && wLast <= 0x0650) {
- wForm = FX_GetArabicFromShaddaTable(wLast);
- bShadda = true;
- }
- } else if (wch >= 0x064C && wch <= 0x0650) {
- if (pLastChar->m_wCharCode == 0x0651) {
- wForm = FX_GetArabicFromShaddaTable(wch);
- bShadda = true;
- }
+ CFX_TxtChar* pLastChar = GetLastChar(0, false);
+ if (pLastChar &&
+ (pLastChar->m_dwCharStyles & FX_TXTCHARSTYLE_ArabicShadda) == 0) {
+ bool bShadda = false;
+ if (wch == 0x0651) {
+ FX_WCHAR wLast = pLastChar->m_wCharCode;
+ if (wLast >= 0x064C && wLast <= 0x0650) {
+ wForm = FX_GetArabicFromShaddaTable(wLast);
+ bShadda = true;
}
- if (bShadda) {
- pLastChar->m_dwCharStyles |= FX_TXTCHARSTYLE_ArabicShadda;
- pLastChar->m_iCharWidth = 0;
- pCurChar->m_dwCharStyles |= FX_TXTCHARSTYLE_ArabicShadda;
+ } else if (wch >= 0x064C && wch <= 0x0650) {
+ if (pLastChar->m_wCharCode == 0x0651) {
+ wForm = FX_GetArabicFromShaddaTable(wch);
+ bShadda = true;
}
}
+ if (bShadda) {
+ pLastChar->m_dwCharStyles |= FX_TXTCHARSTYLE_ArabicShadda;
+ pLastChar->m_iCharWidth = 0;
+ pCurChar->m_dwCharStyles |= FX_TXTCHARSTYLE_ArabicShadda;
+ }
}
if (!m_pFont->GetCharWidth(wForm, iCharWidth, false))
iCharWidth = 0;
@@ -541,10 +523,10 @@ uint32_t CFX_TxtBreak::AppendChar_Others(CFX_TxtChar* pCurChar,
iCharWidth += m_iCharSpace;
pCurChar->m_iCharWidth = iCharWidth;
iLineWidth += iCharWidth;
- bool bBreak = (chartype != FX_CHARTYPE_Space ||
- (m_dwPolicies & FX_TXTBREAKPOLICY_SpaceBreak) != 0);
- if (!m_bSingleLine && bBreak && iLineWidth > m_iLineWidth + m_iTolerance)
+ if (!m_bSingleLine && chartype != FX_CHARTYPE_Space &&
+ iLineWidth > m_iLineWidth + m_iTolerance) {
return EndBreak(FX_TXTBREAK_LineBreak);
+ }
return FX_TXTBREAK_None;
}
@@ -552,9 +534,9 @@ uint32_t CFX_TxtBreak::AppendChar_Others(CFX_TxtChar* pCurChar,
uint32_t CFX_TxtBreak::AppendChar(FX_WCHAR wch) {
uint32_t dwProps = kTextLayoutCodeProperties[static_cast<uint16_t>(wch)];
FX_CHARTYPE chartype = GetCharTypeFromProp(dwProps);
- m_pCurLine->m_pLineChars->emplace_back();
+ m_pCurLine->m_LineChars.emplace_back();
- CFX_TxtChar* pCurChar = &m_pCurLine->m_pLineChars->back();
+ CFX_TxtChar* pCurChar = &m_pCurLine->m_LineChars.back();
pCurChar->m_wCharCode = static_cast<uint16_t>(wch);
pCurChar->m_nRotation = m_iCharRotation;
pCurChar->m_dwCharProps = dwProps;
@@ -578,7 +560,7 @@ uint32_t CFX_TxtBreak::AppendChar(FX_WCHAR wch) {
dwRet1 = EndBreak(FX_TXTBREAK_LineBreak);
int32_t iCount = m_pCurLine->CountChars();
if (iCount > 0)
- pCurChar = &(*m_pCurLine->m_pLineChars)[iCount - 1];
+ pCurChar = &m_pCurLine->m_LineChars[iCount - 1];
}
int32_t iRotation = m_iRotation;
@@ -657,43 +639,20 @@ bool CFX_TxtBreak::EndBreak_SplitLine(CFX_TxtLine* pNextLine,
switch (pTC->GetCharType()) {
case FX_CHARTYPE_Tab:
case FX_CHARTYPE_Control:
- break;
case FX_CHARTYPE_Space:
- if ((m_dwPolicies & FX_TXTBREAKPOLICY_SpaceBreak) != 0) {
- SplitTextLine(m_pCurLine, pNextLine, !m_bPagination && bAllChars);
- bDone = true;
- }
break;
default:
- SplitTextLine(m_pCurLine, pNextLine, !m_bPagination && bAllChars);
+ SplitTextLine(m_pCurLine, pNextLine, bAllChars);
bDone = true;
break;
}
}
iCount = m_pCurLine->CountChars();
- CFX_TxtPieceArray* pCurPieces = m_pCurLine->m_pLinePieces.get();
CFX_TxtPiece tp;
- if (m_bPagination) {
- tp.m_dwStatus = dwStatus;
- tp.m_iStartPos = m_pCurLine->m_iStart;
- tp.m_iWidth = m_pCurLine->m_iWidth;
- tp.m_iStartChar = 0;
- tp.m_iChars = iCount;
- tp.m_pChars = m_pCurLine->m_pLineChars.get();
- tp.m_pUserData = m_pUserData;
- pTC = m_pCurLine->GetCharPtr(0);
- tp.m_dwCharStyles = pTC->m_dwCharStyles;
- tp.m_iHorizontalScale = pTC->m_iHorizontalScale;
- tp.m_iVerticalScale = pTC->m_iVerticalScale;
- pCurPieces->Add(tp);
- m_pCurLine = pNextLine;
- m_eCharType = FX_CHARTYPE_Unknown;
- return true;
- }
if (bAllChars && !bDone) {
int32_t iEndPos = m_pCurLine->m_iWidth;
- GetBreakPos(*m_pCurLine->m_pLineChars.get(), iEndPos, bAllChars, true);
+ GetBreakPos(m_pCurLine->m_LineChars, iEndPos, bAllChars, true);
}
return false;
}
@@ -705,10 +664,10 @@ void CFX_TxtBreak::EndBreak_BidiLine(std::deque<FX_TPO>* tpos,
CFX_TxtChar* pTC;
int32_t i;
int32_t j;
- std::vector<CFX_TxtChar>& chars = *m_pCurLine->m_pLineChars.get();
+ std::vector<CFX_TxtChar>& chars = m_pCurLine->m_LineChars;
int32_t iCount = m_pCurLine->CountChars();
bool bDone = (m_pCurLine->m_iArabicChars > 0 || m_bCurRTL);
- if (!m_bPagination && bDone) {
+ if (bDone) {
int32_t iBidiNum = 0;
for (i = 0; i < iCount; i++) {
pTC = &chars[i];
@@ -721,12 +680,11 @@ void CFX_TxtBreak::EndBreak_BidiLine(std::deque<FX_TPO>* tpos,
FX_BidiLine(chars, iBidiNum + 1, m_bCurRTL ? 1 : 0);
}
- CFX_TxtPieceArray* pCurPieces = m_pCurLine->m_pLinePieces.get();
- if (!m_bPagination &&
- (bDone || (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_MutipleFormat) != 0)) {
+ CFX_TxtPieceArray* pCurPieces = &m_pCurLine->m_LinePieces;
+ if (bDone || (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_MutipleFormat) != 0) {
tp.m_dwStatus = FX_TXTBREAK_PieceBreak;
tp.m_iStartPos = m_pCurLine->m_iStart;
- tp.m_pChars = m_pCurLine->m_pLineChars.get();
+ tp.m_pChars = &m_pCurLine->m_LineChars;
int32_t iBidiLevel = -1;
int32_t iCharWidth;
i = 0;
@@ -797,7 +755,7 @@ void CFX_TxtBreak::EndBreak_BidiLine(std::deque<FX_TPO>* tpos,
tp.m_iWidth = m_pCurLine->m_iWidth;
tp.m_iStartChar = 0;
tp.m_iChars = iCount;
- tp.m_pChars = m_pCurLine->m_pLineChars.get();
+ tp.m_pChars = &m_pCurLine->m_LineChars;
tp.m_pUserData = m_pUserData;
pTC = &chars[0];
tp.m_dwCharStyles = pTC->m_dwCharStyles;
@@ -814,7 +772,7 @@ void CFX_TxtBreak::EndBreak_Alignment(const std::deque<FX_TPO>& tpos,
int32_t iNetWidth = m_pCurLine->m_iWidth;
int32_t iGapChars = 0;
int32_t iCharWidth;
- CFX_TxtPieceArray* pCurPieces = m_pCurLine->m_pLinePieces.get();
+ CFX_TxtPieceArray* pCurPieces = &m_pCurLine->m_LinePieces;
int32_t i;
int32_t j;
int32_t iCount = pCurPieces->GetSize();
@@ -899,7 +857,7 @@ void CFX_TxtBreak::EndBreak_Alignment(const std::deque<FX_TPO>& tpos,
uint32_t CFX_TxtBreak::EndBreak(uint32_t dwStatus) {
ASSERT(dwStatus >= FX_TXTBREAK_PieceBreak &&
dwStatus <= FX_TXTBREAK_PageBreak);
- CFX_TxtPieceArray* pCurPieces = m_pCurLine->m_pLinePieces.get();
+ const CFX_TxtPieceArray* pCurPieces = &m_pCurLine->m_LinePieces;
int32_t iCount = pCurPieces->GetSize();
if (iCount > 0) {
CFX_TxtPiece* pLastPiece = pCurPieces->GetPtrAt(--iCount);
@@ -909,9 +867,9 @@ uint32_t CFX_TxtBreak::EndBreak(uint32_t dwStatus) {
dwStatus = pLastPiece->m_dwStatus;
return dwStatus;
} else {
- CFX_TxtLine* pLastLine = GetTxtLine();
+ const CFX_TxtLine* pLastLine = GetTxtLine();
if (pLastLine) {
- pCurPieces = pLastLine->m_pLinePieces.get();
+ pCurPieces = &pLastLine->m_LinePieces;
iCount = pCurPieces->GetSize();
if (iCount-- > 0) {
CFX_TxtPiece* pLastPiece = pCurPieces->GetPtrAt(iCount);
@@ -927,17 +885,16 @@ uint32_t CFX_TxtBreak::EndBreak(uint32_t dwStatus) {
iCount = m_pCurLine->CountChars();
if (iCount < 1)
return FX_TXTBREAK_None;
- if (!m_bPagination) {
- CFX_TxtChar* pTC = m_pCurLine->GetCharPtr(iCount - 1);
- pTC->m_dwStatus = dwStatus;
- }
+
+ CFX_TxtChar* pTC = m_pCurLine->GetCharPtr(iCount - 1);
+ pTC->m_dwStatus = dwStatus;
if (dwStatus <= FX_TXTBREAK_PieceBreak)
return dwStatus;
}
- m_iReady = (m_pCurLine == m_pTxtLine1.get()) ? 1 : 2;
+ m_iReady = m_pCurLine == &m_TxtLine1 ? 1 : 2;
CFX_TxtLine* pNextLine =
- (m_pCurLine == m_pTxtLine1.get()) ? m_pTxtLine2.get() : m_pTxtLine1.get();
+ m_pCurLine == &m_TxtLine1 ? &m_TxtLine2 : &m_TxtLine1;
bool bAllChars = (m_iCurAlignment > FX_TXTLINEALIGNMENT_Right);
if (m_bArabicShapes)
EndBreak_UpdateArabicShapes();
@@ -945,7 +902,7 @@ uint32_t CFX_TxtBreak::EndBreak(uint32_t dwStatus) {
if (!EndBreak_SplitLine(pNextLine, bAllChars, dwStatus)) {
std::deque<FX_TPO> tpos;
EndBreak_BidiLine(&tpos, dwStatus);
- if (!m_bPagination && m_iCurAlignment > FX_TXTLINEALIGNMENT_Left)
+ if (m_iCurAlignment > FX_TXTLINEALIGNMENT_Left)
EndBreak_Alignment(tpos, bAllChars, dwStatus);
}
@@ -981,8 +938,6 @@ int32_t CFX_TxtBreak::GetBreakPos(std::vector<CFX_TxtChar>& ca,
iBreakPos = iEndPos;
}
- bool bSpaceBreak = (m_dwPolicies & FX_TXTBREAKPOLICY_SpaceBreak) != 0;
- bool bNumberBreak = (m_dwPolicies & FX_TXTBREAKPOLICY_NumberBreak) != 0;
FX_LINEBREAKTYPE eType;
uint32_t nCodeProp;
uint32_t nCur;
@@ -1003,11 +958,9 @@ int32_t CFX_TxtBreak::GetBreakPos(std::vector<CFX_TxtChar>& ca,
nCur = nCodeProp & 0x003F;
if (nCur == FX_CBP_SP) {
if (nNext == FX_CBP_SP)
- eType = bSpaceBreak ? FX_LBT_DIRECT_BRK : FX_LBT_PROHIBITED_BRK;
+ eType = FX_LBT_PROHIBITED_BRK;
else
eType = gs_FX_LineBreak_PairTable[nCur][nNext];
- } else if (bNumberBreak && nCur == FX_CBP_NU && nNext == FX_CBP_NU) {
- eType = FX_LBT_DIRECT_BRK;
} else {
if (nNext == FX_CBP_SP)
eType = FX_LBT_PROHIBITED_BRK;
@@ -1017,8 +970,7 @@ int32_t CFX_TxtBreak::GetBreakPos(std::vector<CFX_TxtChar>& ca,
if (bAllChars)
pCur->m_nBreakType = static_cast<uint8_t>(eType);
if (!bOnlyBrk) {
- if (m_bSingleLine || iEndPos <= m_iLineWidth ||
- (nCur == FX_CBP_SP && !bSpaceBreak)) {
+ if (m_bSingleLine || iEndPos <= m_iLineWidth || nCur == FX_CBP_SP) {
if (eType == FX_LBT_DIRECT_BRK && iBreak < 0) {
iBreak = iLength;
iBreakPos = iEndPos;
@@ -1066,7 +1018,7 @@ void CFX_TxtBreak::SplitTextLine(CFX_TxtLine* pCurLine,
return;
int32_t iEndPos = pCurLine->m_iWidth;
- std::vector<CFX_TxtChar>& curChars = *pCurLine->m_pLineChars;
+ std::vector<CFX_TxtChar>& curChars = pCurLine->m_LineChars;
int32_t iCharPos = GetBreakPos(curChars, iEndPos, bAllChars, false);
if (iCharPos < 0)
iCharPos = 0;
@@ -1079,40 +1031,32 @@ void CFX_TxtBreak::SplitTextLine(CFX_TxtLine* pCurLine,
return;
}
- // m_pLineChars is a unique_ptr<vector>. Assign the ref into nextChars
- // so we can change the m_pLineChars vector ...
- std::vector<CFX_TxtChar>& nextChars = *pNextLine->m_pLineChars;
- nextChars =
+ pNextLine->m_LineChars =
std::vector<CFX_TxtChar>(curChars.begin() + iCharPos, curChars.end());
curChars.erase(curChars.begin() + iCharPos, curChars.end());
pCurLine->m_iWidth = iEndPos;
CFX_TxtChar* pTC = &curChars[iCharPos - 1];
pTC->m_nBreakType = FX_LBT_UNKNOWN;
- iCount = pdfium::CollectionSize<int>(nextChars);
+ iCount = pdfium::CollectionSize<int>(pNextLine->m_LineChars);
int32_t iWidth = 0;
for (int32_t i = 0; i < iCount; i++) {
- if (nextChars[i].GetCharType() >= FX_CHARTYPE_ArabicAlef) {
+ if (pNextLine->m_LineChars[i].GetCharType() >= FX_CHARTYPE_ArabicAlef) {
pCurLine->m_iArabicChars--;
pNextLine->m_iArabicChars++;
}
- int32_t iCharWidth = nextChars[i].m_iCharWidth;
- if (iCharWidth > 0)
- iWidth += iCharWidth;
- if (m_bPagination)
- continue;
-
- nextChars[i].m_dwStatus = 0;
+ iWidth += std::max(0, pNextLine->m_LineChars[i].m_iCharWidth);
+ pNextLine->m_LineChars[i].m_dwStatus = 0;
}
pNextLine->m_iWidth = iWidth;
}
int32_t CFX_TxtBreak::CountBreakPieces() const {
- CFX_TxtPieceArray* pTxtPieces = GetTxtPieces();
+ const CFX_TxtPieceArray* pTxtPieces = GetTxtPieces();
return pTxtPieces ? pTxtPieces->GetSize() : 0;
}
const CFX_TxtPiece* CFX_TxtBreak::GetBreakPiece(int32_t index) const {
- CFX_TxtPieceArray* pTxtPieces = GetTxtPieces();
+ const CFX_TxtPieceArray* pTxtPieces = GetTxtPieces();
if (!pTxtPieces)
return nullptr;
if (index < 0 || index >= pTxtPieces->GetSize())
@@ -1121,9 +1065,9 @@ const CFX_TxtPiece* CFX_TxtBreak::GetBreakPiece(int32_t index) const {
}
void CFX_TxtBreak::ClearBreakPieces() {
- CFX_TxtLine* pTxtLine = GetTxtLine();
+ const CFX_TxtLine* pTxtLine = GetTxtLine();
if (pTxtLine)
- pTxtLine->RemoveAll(true);
+ const_cast<CFX_TxtLine*>(pTxtLine)->RemoveAll(true);
m_iReady = 0;
}
@@ -1132,8 +1076,8 @@ void CFX_TxtBreak::Reset() {
m_iArabicContext = 1;
m_iCurArabicContext = 1;
ResetArabicContext();
- m_pTxtLine1->RemoveAll(true);
- m_pTxtLine2->RemoveAll(true);
+ m_TxtLine1.RemoveAll(true);
+ m_TxtLine2.RemoveAll(true);
}
struct FX_FORMCHAR {
@@ -1660,12 +1604,8 @@ CFX_TxtPiece::CFX_TxtPiece()
m_pChars(nullptr),
m_pUserData(nullptr) {}
-CFX_TxtLine::CFX_TxtLine(int32_t iBlockSize)
- : m_pLineChars(new std::vector<CFX_TxtChar>),
- m_pLinePieces(new CFX_TxtPieceArray(16)),
- m_iStart(0),
- m_iWidth(0),
- m_iArabicChars(0) {}
+CFX_TxtLine::CFX_TxtLine()
+ : m_LinePieces(16), m_iStart(0), m_iWidth(0), m_iArabicChars(0) {}
CFX_TxtLine::~CFX_TxtLine() {
RemoveAll();
diff --git a/xfa/fgas/layout/fgas_textbreak.h b/xfa/fgas/layout/fgas_textbreak.h
index 69ca835fad..72fab9d6a1 100644
--- a/xfa/fgas/layout/fgas_textbreak.h
+++ b/xfa/fgas/layout/fgas_textbreak.h
@@ -23,10 +23,6 @@ class CFX_TxtPiece;
class IFX_TxtAccess;
struct FDE_TEXTEDITPIECE;
-#define FX_TXTBREAKPOLICY_None 0x00
-#define FX_TXTBREAKPOLICY_Pagination 0x01
-#define FX_TXTBREAKPOLICY_SpaceBreak 0x02
-#define FX_TXTBREAKPOLICY_NumberBreak 0x04
#define FX_TXTBREAK_None 0x00
#define FX_TXTBREAK_PieceBreak 0x01
#define FX_TXTBREAK_LineBreak 0x02
@@ -162,42 +158,46 @@ typedef CFX_BaseArrayTemplate<CFX_TxtPiece> CFX_TxtPieceArray;
class CFX_TxtLine {
public:
- explicit CFX_TxtLine(int32_t iBlockSize);
+ CFX_TxtLine();
~CFX_TxtLine();
int32_t CountChars() const {
- return pdfium::CollectionSize<int32_t>(*m_pLineChars);
+ return pdfium::CollectionSize<int32_t>(m_LineChars);
}
- CFX_TxtChar* GetCharPtr(int32_t index) const {
- ASSERT(index >= 0 &&
- index < pdfium::CollectionSize<int32_t>(*m_pLineChars));
- return &(*m_pLineChars)[index];
+ CFX_TxtChar* GetCharPtr(int32_t index) {
+ ASSERT(index >= 0 && index < pdfium::CollectionSize<int32_t>(m_LineChars));
+ return &m_LineChars[index];
+ }
+
+ const CFX_TxtChar* GetCharPtr(int32_t index) const {
+ ASSERT(index >= 0 && index < pdfium::CollectionSize<int32_t>(m_LineChars));
+ return &m_LineChars[index];
}
- int32_t CountPieces() const { return m_pLinePieces->GetSize(); }
+ int32_t CountPieces() const { return m_LinePieces.GetSize(); }
CFX_TxtPiece* GetPiecePtr(int32_t index) const {
- ASSERT(index > -1 && index < m_pLinePieces->GetSize());
- return m_pLinePieces->GetPtrAt(index);
+ ASSERT(index > -1 && index < m_LinePieces.GetSize());
+ return m_LinePieces.GetPtrAt(index);
}
void GetString(CFX_WideString& wsStr) const {
- int32_t iCount = pdfium::CollectionSize<int32_t>(*m_pLineChars);
+ int32_t iCount = pdfium::CollectionSize<int32_t>(m_LineChars);
FX_WCHAR* pBuf = wsStr.GetBuffer(iCount);
for (int32_t i = 0; i < iCount; i++)
- *pBuf++ = static_cast<FX_WCHAR>((*m_pLineChars)[i].m_wCharCode);
+ *pBuf++ = static_cast<FX_WCHAR>(m_LineChars[i].m_wCharCode);
wsStr.ReleaseBuffer(iCount);
}
void RemoveAll(bool bLeaveMemory = false) {
- m_pLineChars->clear();
- m_pLinePieces->RemoveAll(bLeaveMemory);
+ m_LineChars.clear();
+ m_LinePieces.RemoveAll(bLeaveMemory);
m_iWidth = 0;
m_iArabicChars = 0;
}
- std::unique_ptr<std::vector<CFX_TxtChar>> m_pLineChars;
- std::unique_ptr<CFX_TxtPieceArray> m_pLinePieces;
+ std::vector<CFX_TxtChar> m_LineChars;
+ CFX_TxtPieceArray m_LinePieces;
int32_t m_iStart;
int32_t m_iWidth;
int32_t m_iArabicChars;
@@ -205,7 +205,7 @@ class CFX_TxtLine {
class CFX_TxtBreak {
public:
- explicit CFX_TxtBreak(uint32_t dwPolicies);
+ CFX_TxtBreak();
~CFX_TxtBreak();
void SetLineWidth(FX_FLOAT fLineWidth);
@@ -248,8 +248,8 @@ class CFX_TxtBreak {
void SetBreakStatus();
int32_t GetLineRotation(uint32_t dwStyles) const;
CFX_TxtChar* GetLastChar(int32_t index, bool bOmitChar = true) const;
- CFX_TxtLine* GetTxtLine() const;
- CFX_TxtPieceArray* GetTxtPieces() const;
+ const CFX_TxtLine* GetTxtLine() const;
+ const CFX_TxtPieceArray* GetTxtPieces() const;
FX_CHARTYPE GetUnifiedCharType(FX_CHARTYPE dwType) const;
void ResetArabicContext();
void ResetContextCharStyles();
@@ -269,8 +269,6 @@ class CFX_TxtBreak {
CFX_TxtLine* pNextLine,
bool bAllChars = false);
- uint32_t m_dwPolicies;
- bool m_bPagination;
int32_t m_iLineWidth;
uint32_t m_dwLayoutStyles;
bool m_bVertical;
@@ -300,8 +298,8 @@ class CFX_TxtBreak {
int32_t m_iCurAlignment;
bool m_bArabicNumber;
bool m_bArabicComma;
- std::unique_ptr<CFX_TxtLine> m_pTxtLine1;
- std::unique_ptr<CFX_TxtLine> m_pTxtLine2;
+ CFX_TxtLine m_TxtLine1;
+ CFX_TxtLine m_TxtLine2;
CFX_TxtLine* m_pCurLine;
int32_t m_iReady;
int32_t m_iTolerance;