Use size_t for BlockData in CXFA_TextLayout. It never contains negative values. Change methods that use BlockData to use more size_t as well. Change-Id: I2981fc4ae1c8bbe895b01fc54f2ad7ea0cc77cbf Reviewed-on: https://pdfium-review.googlesource.com/c/49713 Commit-Queue: Lei Zhang <thestig@chromium.org> Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/xfa/fxfa/cxfa_loadercontext.h b/xfa/fxfa/cxfa_loadercontext.h index 1546968..ddcb909 100644 --- a/xfa/fxfa/cxfa_loadercontext.h +++ b/xfa/fxfa/cxfa_loadercontext.h
@@ -33,6 +33,7 @@ float fLastPos = 0; float fStartLineOffset = 0; int32_t iChar = 0; + // TODO(thestig): Make this size_t? int32_t iTotalLines = -1; UnownedPtr<const CFX_XMLNode> pXMLNode; UnownedPtr<CXFA_Node> pNode;
diff --git a/xfa/fxfa/cxfa_textlayout.cpp b/xfa/fxfa/cxfa_textlayout.cpp index cd3039c..037a2cf 100644 --- a/xfa/fxfa/cxfa_textlayout.cpp +++ b/xfa/fxfa/cxfa_textlayout.cpp
@@ -349,26 +349,25 @@ } float fLinePos = m_pLoader->fStartLineOffset; - int32_t iLineIndex = 0; + size_t szLineIndex = 0; if (!m_Blocks.empty()) { if (szBlockIndex < m_Blocks.size()) - iLineIndex = m_Blocks[szBlockIndex].iIndex; + szLineIndex = m_Blocks[szBlockIndex].szIndex; else - iLineIndex = GetNextIndexFromLastBlockData(); + szLineIndex = GetNextIndexFromLastBlockData(); if (!m_pLoader->blockHeights.empty()) { for (size_t i = 0; i < szBlockIndex; ++i) fLinePos -= m_pLoader->blockHeights[i].fHeight; } } - int32_t iLineCount = pdfium::CollectionSize<int32_t>(m_pLoader->lineHeights); - if (iLineIndex < 0 || iLineIndex >= iLineCount) + if (szLineIndex >= m_pLoader->lineHeights.size()) return fCalcHeight; - if (m_pLoader->lineHeights[iLineIndex] - fCalcHeight > kHeightTolerance) + if (m_pLoader->lineHeights[szLineIndex] - fCalcHeight > kHeightTolerance) return 0; - for (int32_t i = iLineIndex; i < iLineCount; ++i) { + for (size_t i = szLineIndex; i < m_pLoader->lineHeights.size(); ++i) { float fLineHeight = m_pLoader->lineHeights[i]; if (fLinePos + fLineHeight - fCalcHeight <= kHeightTolerance) { fLinePos += fLineHeight; @@ -376,11 +375,11 @@ } if (szBlockIndex < m_Blocks.size()) - m_Blocks[szBlockIndex] = {iLineIndex, i - iLineIndex}; + m_Blocks[szBlockIndex] = {szLineIndex, i - szLineIndex}; else - m_Blocks.push_back({iLineIndex, i - iLineIndex}); + m_Blocks.push_back({szLineIndex, i - szLineIndex}); - if (i != iLineIndex) + if (i != szLineIndex) return fLinePos; if (fCalcHeight > fLinePos) @@ -402,8 +401,8 @@ return iCount > 0 ? iCount : 1; } -int32_t CXFA_TextLayout::GetNextIndexFromLastBlockData() const { - return m_Blocks.back().iIndex + m_Blocks.back().iLength; +size_t CXFA_TextLayout::GetNextIndexFromLastBlockData() const { + return m_Blocks.back().szIndex + m_Blocks.back().szLength; } void CXFA_TextLayout::UpdateLoaderHeight(float fTextHeight) { @@ -474,14 +473,14 @@ m_pLoader->iChar = 0; if (iCount > 0) - m_pLoader->iTotalLines = m_Blocks[iBlock].iLength; + m_pLoader->iTotalLines = m_Blocks[iBlock].szLength; Loader(szText.width, &fLinePos, true); if (iCount == 0 && m_pLoader->fStartLineOffset < 0.1f) UpdateAlign(szText.height, fLinePos); } else if (m_pTextDataNode) { if (iBlock < iCount - 1) - m_pLoader->iTotalLines = m_Blocks[iBlock].iLength; + m_pLoader->iTotalLines = m_Blocks[iBlock].szLength; m_pBreak->Reset(); if (m_bRichText) { @@ -540,14 +539,13 @@ if (!m_pLoader) return; - int32_t iCountHeight = - pdfium::CollectionSize<int32_t>(m_pLoader->lineHeights); - if (iCountHeight == 0) + if (m_pLoader->lineHeights.empty()) return; float fLinePos = m_pLoader->fStartLineOffset; - int32_t iLineIndex = 0; + size_t szLineIndex = 0; if (iBlockIndex > 0) { + // TODO(thestig): Check this code for correctness, and convert to size_t. int32_t iBlockHeightCount = pdfium::CollectionSize<int32_t>(m_pLoader->blockHeights); if (iBlockIndex <= iBlockHeightCount) { @@ -556,20 +554,20 @@ } else { fLinePos = 0; } - iLineIndex = GetNextIndexFromLastBlockData(); + szLineIndex = GetNextIndexFromLastBlockData(); } - int32_t i = 0; - for (i = iLineIndex; i < iCountHeight; i++) { + size_t i; + for (i = szLineIndex; i < m_pLoader->lineHeights.size(); ++i) { float fLineHeight = m_pLoader->lineHeights[i]; if (fLinePos + fLineHeight - rtText.height > kHeightTolerance) { - m_Blocks.push_back({iLineIndex, i - iLineIndex}); + m_Blocks.push_back({szLineIndex, i - szLineIndex}); return; } fLinePos += fLineHeight; } - if (i > iLineIndex) - m_Blocks.push_back({iLineIndex, i - iLineIndex}); + if (i > szLineIndex) + m_Blocks.push_back({szLineIndex, i - szLineIndex}); } bool CXFA_TextLayout::DrawString(CFX_RenderDevice* pFxDevice, @@ -589,13 +587,14 @@ } FXTEXT_CHARPOS* pCharPos = FX_Alloc(FXTEXT_CHARPOS, 1); + // TODO(thestig): Make these size_t. int32_t iCharCount = 1; int32_t iLineStart = 0; int32_t iPieceLines = pdfium::CollectionSize<int32_t>(m_pieceLines); if (!m_Blocks.empty()) { if (iBlock < pdfium::CollectionSize<int32_t>(m_Blocks)) { - iLineStart = m_Blocks[iBlock].iIndex; - iPieceLines = m_Blocks[iBlock].iLength; + iLineStart = m_Blocks[iBlock].szIndex; + iPieceLines = m_Blocks[iBlock].szLength; } else { iPieceLines = 0; }
diff --git a/xfa/fxfa/cxfa_textlayout.h b/xfa/fxfa/cxfa_textlayout.h index 980d839..3a3f658 100644 --- a/xfa/fxfa/cxfa_textlayout.h +++ b/xfa/fxfa/cxfa_textlayout.h
@@ -63,8 +63,8 @@ private: struct BlockData { - int32_t iIndex; - int32_t iLength; + size_t szIndex; + size_t szLength; }; void GetTextDataNode(); @@ -116,7 +116,7 @@ void DoTabstops(CFX_CSSComputedStyle* pStyle, CXFA_PieceLine* pPieceLine); bool Layout(int32_t iBlock); int32_t CountBlocks() const; - int GetNextIndexFromLastBlockData() const; + size_t GetNextIndexFromLastBlockData() const; void UpdateLoaderHeight(float fTextHeight); bool m_bHasBlock = false;