Use early return in CFX_TxtBreak::EndBreak_BidiLine().
Change-Id: Ic6feafc3d6358444c300d73c9073f67e2934219a
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/59792
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/xfa/fgas/layout/cfx_txtbreak.cpp b/xfa/fgas/layout/cfx_txtbreak.cpp
index ce722ed..2c60b6e 100644
--- a/xfa/fgas/layout/cfx_txtbreak.cpp
+++ b/xfa/fgas/layout/cfx_txtbreak.cpp
@@ -316,89 +316,7 @@
FX_TPO tpo;
CFX_Char* pTC;
std::vector<CFX_Char>& chars = m_pCurLine->m_LineChars;
- bool bDone = m_pCurLine->m_iArabicChars > 0;
- if (bDone) {
- size_t iBidiNum = 0;
- for (size_t i = 0; i < m_pCurLine->m_LineChars.size(); ++i) {
- pTC = &chars[i];
- pTC->m_iBidiPos = static_cast<int32_t>(i);
- if (pTC->GetCharType() != FX_CHARTYPE::kControl)
- iBidiNum = i;
- if (i == 0)
- pTC->m_iBidiLevel = 1;
- }
- CFX_Char::BidiLine(&chars, iBidiNum + 1);
- }
-
- if (bDone) {
- tp.m_dwStatus = CFX_BreakType::Piece;
- tp.m_iStartPos = m_pCurLine->m_iStart;
- tp.m_pChars = &m_pCurLine->m_LineChars;
- int32_t iBidiLevel = -1;
- int32_t iCharWidth;
- int32_t i = 0;
- int32_t j = -1;
- int32_t iCount = pdfium::CollectionSize<int32_t>(m_pCurLine->m_LineChars);
- while (i < iCount) {
- pTC = &chars[i];
- if (iBidiLevel < 0) {
- iBidiLevel = pTC->m_iBidiLevel;
- tp.m_iWidth = 0;
- tp.m_iBidiLevel = iBidiLevel;
- tp.m_iBidiPos = pTC->m_iBidiOrder;
- tp.m_dwCharStyles = pTC->m_dwCharStyles;
- tp.m_iHorizontalScale = pTC->horizonal_scale();
- tp.m_iVerticalScale = pTC->vertical_scale();
- tp.m_dwStatus = CFX_BreakType::Piece;
- }
- if (iBidiLevel != pTC->m_iBidiLevel ||
- pTC->m_dwStatus != CFX_BreakType::None) {
- if (iBidiLevel == pTC->m_iBidiLevel) {
- tp.m_dwStatus = pTC->m_dwStatus;
- iCharWidth = pTC->m_iCharWidth;
- if (iCharWidth > 0)
- tp.m_iWidth += iCharWidth;
-
- i++;
- }
- tp.m_iChars = i - tp.m_iStartChar;
- m_pCurLine->m_LinePieces.push_back(tp);
- tp.m_iStartPos += tp.m_iWidth;
- tp.m_iStartChar = i;
- tpo.index = ++j;
- tpo.pos = tp.m_iBidiPos;
- tpos->push_back(tpo);
- iBidiLevel = -1;
- } else {
- iCharWidth = pTC->m_iCharWidth;
- if (iCharWidth > 0)
- tp.m_iWidth += iCharWidth;
-
- i++;
- }
- }
- if (i > tp.m_iStartChar) {
- tp.m_dwStatus = dwStatus;
- tp.m_iChars = i - tp.m_iStartChar;
- m_pCurLine->m_LinePieces.push_back(tp);
- tpo.index = ++j;
- tpo.pos = tp.m_iBidiPos;
- tpos->push_back(tpo);
- }
- if (j > -1) {
- if (j > 0) {
- std::sort(tpos->begin(), tpos->end());
- int32_t iStartPos = 0;
- for (i = 0; i <= j; i++) {
- tpo = (*tpos)[i];
- CFX_BreakPiece& ttp = m_pCurLine->m_LinePieces[tpo.index];
- ttp.m_iStartPos = iStartPos;
- iStartPos += ttp.m_iWidth;
- }
- }
- m_pCurLine->m_LinePieces[j].m_dwStatus = dwStatus;
- }
- } else {
+ if (m_pCurLine->m_iArabicChars <= 0) {
tp.m_dwStatus = dwStatus;
tp.m_iStartPos = m_pCurLine->m_iStart;
tp.m_iWidth = m_pCurLine->m_iWidth;
@@ -411,6 +329,86 @@
tp.m_iVerticalScale = pTC->vertical_scale();
m_pCurLine->m_LinePieces.push_back(tp);
tpos->push_back({0, 0});
+ return;
+ }
+
+ size_t iBidiNum = 0;
+ for (size_t i = 0; i < m_pCurLine->m_LineChars.size(); ++i) {
+ pTC = &chars[i];
+ pTC->m_iBidiPos = static_cast<int32_t>(i);
+ if (pTC->GetCharType() != FX_CHARTYPE::kControl)
+ iBidiNum = i;
+ if (i == 0)
+ pTC->m_iBidiLevel = 1;
+ }
+ CFX_Char::BidiLine(&chars, iBidiNum + 1);
+
+ tp.m_dwStatus = CFX_BreakType::Piece;
+ tp.m_iStartPos = m_pCurLine->m_iStart;
+ tp.m_pChars = &m_pCurLine->m_LineChars;
+ int32_t iBidiLevel = -1;
+ int32_t iCharWidth;
+ int32_t i = 0;
+ int32_t j = -1;
+ int32_t iCount = pdfium::CollectionSize<int32_t>(m_pCurLine->m_LineChars);
+ while (i < iCount) {
+ pTC = &chars[i];
+ if (iBidiLevel < 0) {
+ iBidiLevel = pTC->m_iBidiLevel;
+ tp.m_iWidth = 0;
+ tp.m_iBidiLevel = iBidiLevel;
+ tp.m_iBidiPos = pTC->m_iBidiOrder;
+ tp.m_dwCharStyles = pTC->m_dwCharStyles;
+ tp.m_iHorizontalScale = pTC->horizonal_scale();
+ tp.m_iVerticalScale = pTC->vertical_scale();
+ tp.m_dwStatus = CFX_BreakType::Piece;
+ }
+ if (iBidiLevel != pTC->m_iBidiLevel ||
+ pTC->m_dwStatus != CFX_BreakType::None) {
+ if (iBidiLevel == pTC->m_iBidiLevel) {
+ tp.m_dwStatus = pTC->m_dwStatus;
+ iCharWidth = pTC->m_iCharWidth;
+ if (iCharWidth > 0)
+ tp.m_iWidth += iCharWidth;
+
+ i++;
+ }
+ tp.m_iChars = i - tp.m_iStartChar;
+ m_pCurLine->m_LinePieces.push_back(tp);
+ tp.m_iStartPos += tp.m_iWidth;
+ tp.m_iStartChar = i;
+ tpo.index = ++j;
+ tpo.pos = tp.m_iBidiPos;
+ tpos->push_back(tpo);
+ iBidiLevel = -1;
+ } else {
+ iCharWidth = pTC->m_iCharWidth;
+ if (iCharWidth > 0)
+ tp.m_iWidth += iCharWidth;
+
+ i++;
+ }
+ }
+ if (i > tp.m_iStartChar) {
+ tp.m_dwStatus = dwStatus;
+ tp.m_iChars = i - tp.m_iStartChar;
+ m_pCurLine->m_LinePieces.push_back(tp);
+ tpo.index = ++j;
+ tpo.pos = tp.m_iBidiPos;
+ tpos->push_back(tpo);
+ }
+ if (j > -1) {
+ if (j > 0) {
+ std::sort(tpos->begin(), tpos->end());
+ int32_t iStartPos = 0;
+ for (i = 0; i <= j; i++) {
+ tpo = (*tpos)[i];
+ CFX_BreakPiece& ttp = m_pCurLine->m_LinePieces[tpo.index];
+ ttp.m_iStartPos = iStartPos;
+ iStartPos += ttp.m_iWidth;
+ }
+ }
+ m_pCurLine->m_LinePieces[j].m_dwStatus = dwStatus;
}
}