diff options
-rw-r--r-- | xfa/fgas/layout/fgas_rtfbreak.cpp | 29 | ||||
-rw-r--r-- | xfa/fgas/layout/fgas_rtfbreak.h | 32 | ||||
-rw-r--r-- | xfa/fxfa/app/cxfa_textlayout.cpp | 14 | ||||
-rw-r--r-- | xfa/fxfa/app/xfa_textpiece.cpp | 8 | ||||
-rw-r--r-- | xfa/fxfa/app/xfa_textpiece.h | 6 |
5 files changed, 41 insertions, 48 deletions
diff --git a/xfa/fgas/layout/fgas_rtfbreak.cpp b/xfa/fgas/layout/fgas_rtfbreak.cpp index dd3f34c739..fdc9a57038 100644 --- a/xfa/fgas/layout/fgas_rtfbreak.cpp +++ b/xfa/fgas/layout/fgas_rtfbreak.cpp @@ -882,11 +882,8 @@ int32_t CFX_RTFBreak::GetDisplayPos(const FX_RTFTEXTOBJ* pText, if (!pText || pText->iLength < 1) return 0; - ASSERT(pText->pStr && pText->pWidths && pText->pFont && pText->pRect); + ASSERT(pText->pFont && pText->pRect); - const FX_WCHAR* pStr = pText->pStr; - int32_t* pWidths = pText->pWidths; - int32_t iLength = pText->iLength - 1; CFX_RetainPtr<CFGAS_GEFont> pFont = pText->pFont; CFX_RectF rtText(*pText->pRect); bool bRTLPiece = FX_IsOdd(pText->iBidiLevel); @@ -920,9 +917,9 @@ int32_t CFX_RTFBreak::GetDisplayPos(const FX_RTFTEXTOBJ* pText, fY += fAscent; int32_t iCount = 0; - for (int32_t i = 0; i <= iLength; i++) { - wch = *pStr++; - iWidth = *pWidths++; + for (int32_t i = 0; i < pText->iLength; i++) { + wch = pText->pStr[i]; + iWidth = pText->pWidths[i]; dwProps = FX_GetUnicodeProperties(wch); dwCharType = (dwProps & FX_CHARTYPEBITSMASK); if (dwCharType == FX_CHARTYPE_ArabicAlef && iWidth == 0) { @@ -942,10 +939,10 @@ int32_t CFX_RTFBreak::GetDisplayPos(const FX_RTFTEXTOBJ* pText, iCharWidth /= iFontSize; wForm = wch; if (dwCharType >= FX_CHARTYPE_ArabicAlef) { - if (i < iLength) { - wNext = *pStr; - if (*pWidths < 0 && i + 1 < iLength) - wNext = pStr[1]; + if (i + 1 < pText->iLength) { + wNext = pText->pStr[i + 1]; + if (pText->pWidths[i + 1] < 0 && i + 2 < pText->iLength) + wNext = pText->pStr[i + 2]; } else { wNext = 0xFEFF; } @@ -1040,14 +1037,12 @@ CFX_RTFLine::~CFX_RTFLine() { } FX_RTFTEXTOBJ::FX_RTFTEXTOBJ() - : pStr(nullptr), - pWidths(nullptr), - iLength(0), - pFont(nullptr), - fFontSize(12.0f), - iBidiLevel(0), + : pFont(nullptr), pRect(nullptr), wLineBreakChar(L'\n'), + fFontSize(12.0f), + iLength(0), + iBidiLevel(0), iHorizontalScale(100), iVerticalScale(100) {} diff --git a/xfa/fgas/layout/fgas_rtfbreak.h b/xfa/fgas/layout/fgas_rtfbreak.h index 81ec60ee48..55b99ae298 100644 --- a/xfa/fgas/layout/fgas_rtfbreak.h +++ b/xfa/fgas/layout/fgas_rtfbreak.h @@ -33,14 +33,14 @@ struct FX_RTFTEXTOBJ { FX_RTFTEXTOBJ(); ~FX_RTFTEXTOBJ(); - const FX_WCHAR* pStr; - int32_t* pWidths; - int32_t iLength; + CFX_WideString pStr; + std::vector<int32_t> pWidths; CFX_RetainPtr<CFGAS_GEFont> pFont; - FX_FLOAT fFontSize; - int32_t iBidiLevel; const CFX_RectF* pRect; FX_WCHAR wLineBreakChar; + FX_FLOAT fFontSize; + int32_t iLength; + int32_t iBidiLevel; int32_t iHorizontalScale; int32_t iVerticalScale; }; @@ -59,18 +59,20 @@ class CFX_RTFPiece { return (*m_pChars)[m_iStartChar + index]; } - void GetString(FX_WCHAR* pText) const { - ASSERT(pText); - int32_t iEndChar = m_iStartChar + m_iChars; - for (int32_t i = m_iStartChar; i < iEndChar; i++) - *pText++ = static_cast<FX_WCHAR>((*m_pChars)[i].m_wCharCode); + CFX_WideString GetString() const { + CFX_WideString ret; + ret.Reserve(m_iChars); + for (int32_t i = m_iStartChar; i < m_iStartChar + m_iChars; i++) + ret += static_cast<FX_WCHAR>((*m_pChars)[i].m_wCharCode); + return ret; } - void GetWidths(int32_t* pWidths) const { - ASSERT(pWidths); - int32_t iEndChar = m_iStartChar + m_iChars; - for (int32_t i = m_iStartChar; i < iEndChar; i++) - *pWidths++ = (*m_pChars)[i].m_iCharWidth; + std::vector<int32_t> GetWidths() const { + std::vector<int32_t> ret; + ret.reserve(m_iChars); + for (int32_t i = m_iStartChar; i < m_iStartChar + m_iChars; i++) + ret.push_back((*m_pChars)[i].m_iCharWidth); + return ret; } void Reset() { diff --git a/xfa/fxfa/app/cxfa_textlayout.cpp b/xfa/fxfa/app/cxfa_textlayout.cpp index 9735dc7b13..715dbb32dd 100644 --- a/xfa/fxfa/app/cxfa_textlayout.cpp +++ b/xfa/fxfa/app/cxfa_textlayout.cpp @@ -999,10 +999,10 @@ void CXFA_TextLayout::DoTabstops(CFDE_CSSComputedStyle* pStyle, } else if (dwAlign == FX_HashCode_GetW(L"decimal", false)) { int32_t iChars = pPiece->iChars; for (int32_t i = 0; i < iChars; i++) { - if (pPiece->pszText[i] == L'.') + if (pPiece->szText[i] == L'.') break; - fLeft += pPiece->pWidths[i] / 20000.0f; + fLeft += pPiece->Widths[i] / 20000.0f; } } m_pTabstopContext->m_fLeft = @@ -1041,11 +1041,9 @@ void CXFA_TextLayout::AppendTextLine(CFX_RTFBreakType dwStatus, FX_FLOAT fVerScale = pPiece->m_iVerticalScale / 100.0f; 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); + pTP->szText = pPiece->GetString(); + pTP->Widths = pPiece->GetWidths(); pTP->iBidiLevel = pPiece->m_iBidiLevel; pTP->iHorScale = pPiece->m_iHorizontalScale; pTP->iVerScale = pPiece->m_iVerticalScale; @@ -1301,10 +1299,10 @@ bool CXFA_TextLayout::ToRun(const XFA_TextPiece* pPiece, FX_RTFTEXTOBJ* tr) { if (iLength < 1) return false; - tr->pStr = pPiece->pszText; + tr->pStr = pPiece->szText; tr->pFont = pPiece->pFont; tr->pRect = &pPiece->rtPiece; - tr->pWidths = pPiece->pWidths; + tr->pWidths = pPiece->Widths; tr->iLength = iLength; tr->fFontSize = pPiece->fFontSize; tr->iBidiLevel = pPiece->iBidiLevel; diff --git a/xfa/fxfa/app/xfa_textpiece.cpp b/xfa/fxfa/app/xfa_textpiece.cpp index e65cc16667..c53e45f91a 100644 --- a/xfa/fxfa/app/xfa_textpiece.cpp +++ b/xfa/fxfa/app/xfa_textpiece.cpp @@ -8,10 +8,6 @@ #include "xfa/fxfa/app/cxfa_linkuserdata.h" -XFA_TextPiece::XFA_TextPiece() - : pszText(nullptr), pWidths(nullptr), pFont(nullptr) {} +XFA_TextPiece::XFA_TextPiece() {} -XFA_TextPiece::~XFA_TextPiece() { - FX_Free(pszText); - FX_Free(pWidths); -} +XFA_TextPiece::~XFA_TextPiece() {} diff --git a/xfa/fxfa/app/xfa_textpiece.h b/xfa/fxfa/app/xfa_textpiece.h index 6c7b3d4217..6802df5566 100644 --- a/xfa/fxfa/app/xfa_textpiece.h +++ b/xfa/fxfa/app/xfa_textpiece.h @@ -7,6 +7,8 @@ #ifndef XFA_FXFA_APP_XFA_TEXTPIECE_H_ #define XFA_FXFA_APP_XFA_TEXTPIECE_H_ +#include <vector> + #include "core/fxcrt/fx_basic.h" #include "core/fxcrt/fx_coordinates.h" #include "core/fxcrt/fx_string.h" @@ -20,9 +22,9 @@ class XFA_TextPiece { XFA_TextPiece(); ~XFA_TextPiece(); - FX_WCHAR* pszText; + CFX_WideString szText; + std::vector<int32_t> Widths; int32_t iChars; - int32_t* pWidths; int32_t iHorScale; int32_t iVerScale; int32_t iBidiLevel; |