Change CFDE_TextOut::Piece members from int to size_t.
Character indices and counts should never be negative. Also initialize
the POD struct members.
Change-Id: Iaf9826bdbb17ad6058bea316ad0bffc2f77df01a
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/70218
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/xfa/fde/cfde_textout.cpp b/xfa/fde/cfde_textout.cpp
index 3f7617a..ab0e030 100644
--- a/xfa/fde/cfde_textout.cpp
+++ b/xfa/fde/cfde_textout.cpp
@@ -323,7 +323,7 @@
float fLineStep = (m_fLineSpace > m_fFontSize) ? m_fLineSpace : m_fFontSize;
float fLineStop = rect.bottom();
m_fLinePos = rect.top;
- int32_t iStartChar = 0;
+ size_t start_char = 0;
int32_t iPieceWidths = 0;
CFX_BreakType dwBreakStatus;
bool bRet = false;
@@ -333,7 +333,7 @@
continue;
bool bEndofLine =
- RetrievePieces(dwBreakStatus, false, rect, &iStartChar, &iPieceWidths);
+ RetrievePieces(dwBreakStatus, false, rect, &start_char, &iPieceWidths);
if (bEndofLine &&
(m_Styles.line_wrap_ || dwBreakStatus == CFX_BreakType::Paragraph ||
dwBreakStatus == CFX_BreakType::Page)) {
@@ -351,7 +351,7 @@
dwBreakStatus = m_pTxtBreak->EndBreak(CFX_BreakType::Paragraph);
if (!CFX_BreakTypeNoneOrPiece(dwBreakStatus) && !bRet)
- RetrievePieces(dwBreakStatus, false, rect, &iStartChar, &iPieceWidths);
+ RetrievePieces(dwBreakStatus, false, rect, &start_char, &iPieceWidths);
m_pTxtBreak->ClearBreakPieces();
m_pTxtBreak->Reset();
@@ -360,7 +360,7 @@
bool CFDE_TextOut::RetrievePieces(CFX_BreakType dwBreakStatus,
bool bReload,
const CFX_RectF& rect,
- int32_t* pStartChar,
+ size_t* pStartChar,
int32_t* pPieceWidths) {
float fLineStep = (m_fLineSpace > m_fFontSize) ? m_fLineSpace : m_fFontSize;
bool bNeedReload = false;
@@ -452,19 +452,19 @@
size_t iPieceIndex = 0;
size_t iPieceCount = pLine->GetSize();
const Piece* pPiece = pLine->GetPieceAtIndex(0);
- int32_t iStartChar = pPiece->start_char;
+ size_t start_char = pPiece->start_char;
int32_t iPieceWidths = 0;
CFX_BreakType dwBreakStatus = CFX_BreakType::None;
m_fLinePos = pPiece->bounds.top;
while (iPieceIndex < iPieceCount) {
- int32_t iStart = iStartChar;
- int32_t iEnd = pPiece->char_count + iStart;
- while (iStart < iEnd) {
- dwBreakStatus = m_pTxtBreak->AppendChar(text_span[iStart]);
+ size_t start = start_char;
+ size_t end = pPiece->char_count + start;
+ while (start < end) {
+ dwBreakStatus = m_pTxtBreak->AppendChar(text_span[start]);
if (!CFX_BreakTypeNoneOrPiece(dwBreakStatus))
- RetrievePieces(dwBreakStatus, true, rect, &iStartChar, &iPieceWidths);
+ RetrievePieces(dwBreakStatus, true, rect, &start_char, &iPieceWidths);
- ++iStart;
+ ++start;
}
++iPieceIndex;
pPiece = pLine->GetPieceAtIndex(iPieceIndex);
@@ -472,7 +472,7 @@
dwBreakStatus = m_pTxtBreak->EndBreak(CFX_BreakType::Paragraph);
if (!CFX_BreakTypeNoneOrPiece(dwBreakStatus))
- RetrievePieces(dwBreakStatus, true, rect, &iStartChar, &iPieceWidths);
+ RetrievePieces(dwBreakStatus, true, rect, &start_char, &iPieceWidths);
m_pTxtBreak->Reset();
}
@@ -501,9 +501,7 @@
}
size_t CFDE_TextOut::GetDisplayPos(const Piece* pPiece) {
- ASSERT(pPiece->char_count >= 0);
-
- if (pdfium::CollectionSize<int32_t>(m_CharPos) < pPiece->char_count)
+ if (m_CharPos.size() < pPiece->char_count)
m_CharPos.resize(pPiece->char_count, TextCharPos());
CFX_TxtBreak::Run tr;
diff --git a/xfa/fde/cfde_textout.h b/xfa/fde/cfde_textout.h
index 61efc4a..efb88b6 100644
--- a/xfa/fde/cfde_textout.h
+++ b/xfa/fde/cfde_textout.h
@@ -56,9 +56,9 @@
Piece(const Piece& that);
~Piece();
- int32_t start_char;
- int32_t char_count;
- uint32_t char_styles;
+ size_t start_char = 0;
+ size_t char_count = 0;
+ uint32_t char_styles = 0;
CFX_RectF bounds;
};
@@ -93,7 +93,7 @@
bool RetrievePieces(CFX_BreakType dwBreakStatus,
bool bReload,
const CFX_RectF& rect,
- int32_t* pStartChar,
+ size_t* pStartChar,
int32_t* pPieceWidths);
void AppendPiece(const Piece& piece, bool bNeedReload, bool bEnd);
void DoAlignment(const CFX_RectF& rect);
diff --git a/xfa/fgas/layout/cfx_txtbreak.h b/xfa/fgas/layout/cfx_txtbreak.h
index 9c16b26..9b7351f 100644
--- a/xfa/fgas/layout/cfx_txtbreak.h
+++ b/xfa/fgas/layout/cfx_txtbreak.h
@@ -49,6 +49,7 @@
CFX_TxtBreak::Engine* pEdtEngine = nullptr;
WideString wsStr;
int32_t* pWidths = nullptr;
+ // TODO(thestig): These 2 members probably should be size_t.
int32_t iStart = 0;
int32_t iLength = 0;
RetainPtr<CFGAS_GEFont> pFont;