| Index: xfa/fxfa/app/cxfa_textlayout.cpp
|
| diff --git a/xfa/fxfa/app/cxfa_textlayout.cpp b/xfa/fxfa/app/cxfa_textlayout.cpp
|
| index a1870f1f58b23f84a5e06c0f3baae2017f9a3cbe..f6d80501fe1bf8b4bcd7d042ae7c2e20a8589fab 100644
|
| --- a/xfa/fxfa/app/cxfa_textlayout.cpp
|
| +++ b/xfa/fxfa/app/cxfa_textlayout.cpp
|
| @@ -7,6 +7,7 @@
|
| #include "xfa/fxfa/app/cxfa_textlayout.h"
|
|
|
| #include <algorithm>
|
| +#include <utility>
|
|
|
| #include "third_party/base/ptr_util.h"
|
| #include "third_party/base/stl_util.h"
|
| @@ -46,28 +47,10 @@ CXFA_TextLayout::~CXFA_TextLayout() {
|
| }
|
|
|
| void CXFA_TextLayout::Unload() {
|
| - for (int32_t i = 0; i < m_pieceLines.GetSize(); i++) {
|
| - CXFA_PieceLine* pLine = m_pieceLines.GetAt(i);
|
| - for (int32_t i = 0; i < pLine->m_textPieces.GetSize(); i++) {
|
| - XFA_TextPiece* pPiece = pLine->m_textPieces.GetAt(i);
|
| - // Release text and widths in a text piece.
|
| - delete pPiece->pszText;
|
| - delete pPiece->pWidths;
|
| - // Release text piece.
|
| - delete pPiece;
|
| - }
|
| - pLine->m_textPieces.RemoveAll();
|
| - // Release line.
|
| - delete pLine;
|
| - }
|
| - m_pieceLines.RemoveAll();
|
| + m_pieceLines.clear();
|
| m_pBreak.reset();
|
| }
|
|
|
| -const CFX_ArrayTemplate<CXFA_PieceLine*>* CXFA_TextLayout::GetPieceLines() {
|
| - return &m_pieceLines;
|
| -}
|
| -
|
| void CXFA_TextLayout::GetTextDataNode() {
|
| if (!m_pTextProvider)
|
| return;
|
| @@ -586,7 +569,7 @@ bool CXFA_TextLayout::DrawString(CFX_RenderDevice* pFxDevice,
|
|
|
| auto pSolidBrush = pdfium::MakeUnique<CFDE_Brush>();
|
| auto pPen = pdfium::MakeUnique<CFDE_Pen>();
|
| - if (m_pieceLines.GetSize() == 0) {
|
| + if (m_pieceLines.empty()) {
|
| int32_t iBlockCount = CountBlocks();
|
| for (int32_t i = 0; i < iBlockCount; i++)
|
| Layout(i);
|
| @@ -595,7 +578,7 @@ bool CXFA_TextLayout::DrawString(CFX_RenderDevice* pFxDevice,
|
| FXTEXT_CHARPOS* pCharPos = nullptr;
|
| int32_t iCharCount = 0;
|
| int32_t iLineStart = 0;
|
| - int32_t iPieceLines = m_pieceLines.GetSize();
|
| + int32_t iPieceLines = pdfium::CollectionSize<int32_t>(m_pieceLines);
|
| int32_t iCount = m_Blocks.GetSize();
|
| if (iCount > 0) {
|
| iBlock *= 2;
|
| @@ -608,14 +591,14 @@ bool CXFA_TextLayout::DrawString(CFX_RenderDevice* pFxDevice,
|
| }
|
|
|
| for (int32_t i = 0; i < iPieceLines; i++) {
|
| - if (i + iLineStart >= m_pieceLines.GetSize())
|
| + if (i + iLineStart >= pdfium::CollectionSize<int32_t>(m_pieceLines))
|
| break;
|
|
|
| - CXFA_PieceLine* pPieceLine = m_pieceLines.GetAt(i + iLineStart);
|
| - int32_t iPieces = pPieceLine->m_textPieces.GetSize();
|
| + CXFA_PieceLine* pPieceLine = m_pieceLines[i + iLineStart].get();
|
| + int32_t iPieces = pdfium::CollectionSize<int32_t>(pPieceLine->m_textPieces);
|
| int32_t j = 0;
|
| for (j = 0; j < iPieces; j++) {
|
| - const XFA_TextPiece* pPiece = pPieceLine->m_textPieces.GetAt(j);
|
| + const XFA_TextPiece* pPiece = pPieceLine->m_textPieces[j].get();
|
| int32_t iChars = pPiece->iChars;
|
| if (iCharCount < iChars) {
|
| FX_Free(pCharPos);
|
| @@ -651,15 +634,9 @@ void CXFA_TextLayout::UpdateAlign(FX_FLOAT fHeight, FX_FLOAT fBottom) {
|
| return;
|
| }
|
|
|
| - int32_t iCount = m_pieceLines.GetSize();
|
| - for (int32_t i = 0; i < iCount; i++) {
|
| - CXFA_PieceLine* pPieceLine = m_pieceLines.GetAt(i);
|
| - int32_t iPieces = pPieceLine->m_textPieces.GetSize();
|
| - for (int32_t j = 0; j < iPieces; j++) {
|
| - XFA_TextPiece* pPiece = pPieceLine->m_textPieces.GetAt(j);
|
| - CFX_RectF& rect = pPiece->rtPiece;
|
| - rect.top += fHeight;
|
| - }
|
| + for (const auto& pPieceLine : m_pieceLines) {
|
| + for (const auto& pPiece : pPieceLine->m_textPieces)
|
| + pPiece->rtPiece.top += fHeight;
|
| }
|
| }
|
|
|
| @@ -1004,11 +981,11 @@ void CXFA_TextLayout::DoTabstops(CFDE_CSSComputedStyle* pStyle,
|
| if (!pStyle || !pPieceLine)
|
| return;
|
|
|
| - int32_t iPieces = pPieceLine->m_textPieces.GetSize();
|
| + int32_t iPieces = pdfium::CollectionSize<int32_t>(pPieceLine->m_textPieces);
|
| if (iPieces == 0)
|
| return;
|
|
|
| - XFA_TextPiece* pPiece = pPieceLine->m_textPieces.GetAt(iPieces - 1);
|
| + XFA_TextPiece* pPiece = pPieceLine->m_textPieces[iPieces - 1].get();
|
| int32_t& iTabstopsIndex = m_pTabstopContext->m_iTabIndex;
|
| int32_t iCount = m_textParser.CountTabs(pStyle);
|
| if (iTabstopsIndex > m_pTabstopContext->m_iTabCount - 1)
|
| @@ -1019,7 +996,7 @@ void CXFA_TextLayout::DoTabstops(CFDE_CSSComputedStyle* pStyle,
|
| m_pTabstopContext->m_bTabstops = true;
|
| FX_FLOAT fRight = 0;
|
| if (iPieces > 1) {
|
| - XFA_TextPiece* p = pPieceLine->m_textPieces.GetAt(iPieces - 2);
|
| + XFA_TextPiece* p = pPieceLine->m_textPieces[iPieces - 2].get();
|
| fRight = p->rtPiece.right();
|
| }
|
| m_pTabstopContext->m_fTabWidth =
|
| @@ -1063,8 +1040,9 @@ void CXFA_TextLayout::AppendTextLine(uint32_t dwStatus,
|
|
|
| CFDE_CSSComputedStyle* pStyle = nullptr;
|
| if (bSavePieces) {
|
| - CXFA_PieceLine* pPieceLine = new CXFA_PieceLine;
|
| - m_pieceLines.Add(pPieceLine);
|
| + auto pNew = pdfium::MakeUnique<CXFA_PieceLine>();
|
| + CXFA_PieceLine* pPieceLine = pNew.get();
|
| + m_pieceLines.push_back(std::move(pNew));
|
| if (m_pTabstopContext)
|
| m_pTabstopContext->Reset();
|
|
|
| @@ -1077,11 +1055,9 @@ void CXFA_TextLayout::AppendTextLine(uint32_t dwStatus,
|
| pStyle = pUserData->m_pStyle;
|
| FX_FLOAT fVerScale = pPiece->m_iVerticalScale / 100.0f;
|
|
|
| - XFA_TextPiece* pTP = new XFA_TextPiece();
|
| - pTP->pszText =
|
| - (FX_WCHAR*)FX_Alloc(uint8_t, pPiece->m_iChars * sizeof(FX_WCHAR));
|
| - pTP->pWidths =
|
| - (int32_t*)FX_Alloc(uint8_t, pPiece->m_iChars * sizeof(int32_t));
|
| + auto pTP = pdfium::MakeUnique<XFA_TextPiece>();
|
| + pTP->pszText = FX_Alloc(FX_WCHAR, pPiece->m_iChars);
|
| + pTP->pWidths = FX_Alloc(int32_t, pPiece->m_iChars);
|
| pTP->iChars = pPiece->m_iChars;
|
| pPiece->GetString(pTP->pszText);
|
| pPiece->GetWidths(pTP->pWidths);
|
| @@ -1100,7 +1076,6 @@ void CXFA_TextLayout::AppendTextLine(uint32_t dwStatus,
|
| FX_FLOAT fBaseLineTemp =
|
| m_textParser.GetBaseline(m_pTextProvider, pStyle);
|
| pTP->rtPiece.top = fBaseLineTemp;
|
| - pPieceLine->m_textPieces.Add(pTP);
|
|
|
| FX_FLOAT fLineHeight = m_textParser.GetLineHeight(
|
| m_pTextProvider, pStyle, m_iLines == 0, fVerScale);
|
| @@ -1120,10 +1095,10 @@ void CXFA_TextLayout::AppendTextLine(uint32_t dwStatus,
|
| } else {
|
| pTP->pLinkData = nullptr;
|
| }
|
| + pPieceLine->m_textPieces.push_back(std::move(pTP));
|
| DoTabstops(pStyle, pPieceLine);
|
| }
|
| - for (i = 0; i < iPieces; i++) {
|
| - XFA_TextPiece* pTP = pPieceLine->m_textPieces.GetAt(i);
|
| + for (const auto& pTP : pPieceLine->m_textPieces) {
|
| FX_FLOAT& fTop = pTP->rtPiece.top;
|
| FX_FLOAT fBaseLineTemp = fTop;
|
| fTop = fLinePos + fLineStep - pTP->rtPiece.height - fBaseLineTemp;
|
| @@ -1206,7 +1181,7 @@ void CXFA_TextLayout::RenderString(CFDE_RenderDevice* pDevice,
|
| int32_t iPiece,
|
| FXTEXT_CHARPOS* pCharPos,
|
| const CFX_Matrix& tmDoc2Device) {
|
| - const XFA_TextPiece* pPiece = pPieceLine->m_textPieces.GetAt(iPiece);
|
| + const XFA_TextPiece* pPiece = pPieceLine->m_textPieces[iPiece].get();
|
| int32_t iCount = GetDisplayPos(pPiece, pCharPos);
|
| if (iCount > 0) {
|
| pBrush->SetColor(pPiece->dwColor);
|
| @@ -1222,7 +1197,7 @@ void CXFA_TextLayout::RenderPath(CFDE_RenderDevice* pDevice,
|
| int32_t iPiece,
|
| FXTEXT_CHARPOS* pCharPos,
|
| const CFX_Matrix& tmDoc2Device) {
|
| - XFA_TextPiece* pPiece = pPieceLine->m_textPieces.GetAt(iPiece);
|
| + XFA_TextPiece* pPiece = pPieceLine->m_textPieces[iPiece].get();
|
| bool bNoUnderline = pPiece->iUnderline < 1 || pPiece->iUnderline > 2;
|
| bool bNoLineThrough = pPiece->iLineThrough < 1 || pPiece->iLineThrough > 2;
|
| if (bNoUnderline && bNoLineThrough)
|
| @@ -1282,7 +1257,7 @@ void CXFA_TextLayout::RenderPath(CFDE_RenderDevice* pDevice,
|
| return;
|
|
|
| iCharsTmp = 0;
|
| - int32_t iPieces = pPieceLine->m_textPieces.GetSize();
|
| + int32_t iPieces = pdfium::CollectionSize<int32_t>(pPieceLine->m_textPieces);
|
| while (iPieceNext < iPieces - 1) {
|
| iPieceNext++;
|
| iCharsTmp = pPieceLine->m_charCounts.GetAt(iPieceNext);
|
| @@ -1294,14 +1269,14 @@ void CXFA_TextLayout::RenderPath(CFDE_RenderDevice* pDevice,
|
|
|
| FX_FLOAT fOrgX = 0.0f;
|
| FX_FLOAT fEndX = 0.0f;
|
| - pPiece = pPieceLine->m_textPieces.GetAt(iPiecePrev);
|
| + pPiece = pPieceLine->m_textPieces[iPiecePrev].get();
|
| iChars = GetDisplayPos(pPiece, pCharPos);
|
| if (iChars < 1)
|
| return;
|
|
|
| fOrgX = pCharPos[iChars - 1].m_OriginX +
|
| pCharPos[iChars - 1].m_FontCharWidth * pPiece->fFontSize / 1000.0f;
|
| - pPiece = pPieceLine->m_textPieces.GetAt(iPieceNext);
|
| + pPiece = pPieceLine->m_textPieces[iPieceNext].get();
|
| iChars = GetDisplayPos(pPiece, pCharPos);
|
| if (iChars < 1)
|
| return;
|
| @@ -1332,27 +1307,27 @@ int32_t CXFA_TextLayout::GetDisplayPos(const XFA_TextPiece* pPiece,
|
| return 0;
|
|
|
| FX_RTFTEXTOBJ tr;
|
| - if (!ToRun(pPiece, tr))
|
| + if (!ToRun(pPiece, &tr))
|
| return 0;
|
| return m_pBreak->GetDisplayPos(&tr, pCharPos, bCharCode);
|
| }
|
|
|
| -bool CXFA_TextLayout::ToRun(const XFA_TextPiece* pPiece, FX_RTFTEXTOBJ& tr) {
|
| +bool CXFA_TextLayout::ToRun(const XFA_TextPiece* pPiece, FX_RTFTEXTOBJ* tr) {
|
| int32_t iLength = pPiece->iChars;
|
| if (iLength < 1)
|
| return false;
|
|
|
| - tr.pStr = pPiece->pszText;
|
| - tr.pFont = pPiece->pFont;
|
| - tr.pRect = &pPiece->rtPiece;
|
| - tr.pWidths = pPiece->pWidths;
|
| - tr.iLength = iLength;
|
| - tr.fFontSize = pPiece->fFontSize;
|
| - tr.iBidiLevel = pPiece->iBidiLevel;
|
| - tr.iCharRotation = 0;
|
| - tr.wLineBreakChar = L'\n';
|
| - tr.iVerticalScale = pPiece->iVerScale;
|
| - tr.dwLayoutStyles = FX_RTFLAYOUTSTYLE_ExpandTab;
|
| - tr.iHorizontalScale = pPiece->iHorScale;
|
| + tr->pStr = pPiece->pszText;
|
| + tr->pFont = pPiece->pFont;
|
| + tr->pRect = &pPiece->rtPiece;
|
| + tr->pWidths = pPiece->pWidths;
|
| + tr->iLength = iLength;
|
| + tr->fFontSize = pPiece->fFontSize;
|
| + tr->iBidiLevel = pPiece->iBidiLevel;
|
| + tr->iCharRotation = 0;
|
| + tr->wLineBreakChar = L'\n';
|
| + tr->iVerticalScale = pPiece->iVerScale;
|
| + tr->dwLayoutStyles = FX_RTFLAYOUTSTYLE_ExpandTab;
|
| + tr->iHorizontalScale = pPiece->iHorScale;
|
| return true;
|
| }
|
|
|