diff --git a/xfa/fde/cfde_txtedtengine.cpp b/xfa/fde/cfde_txtedtengine.cpp
index a61f6ab..fbc5e15 100644
--- a/xfa/fde/cfde_txtedtengine.cpp
+++ b/xfa/fde/cfde_txtedtengine.cpp
@@ -53,7 +53,7 @@
 FDE_TXTEDT_TEXTCHANGE_INFO::~FDE_TXTEDT_TEXTCHANGE_INFO() {}
 
 CFDE_TxtEdtEngine::CFDE_TxtEdtEngine()
-    : m_pTxtBuf(new CFDE_TxtEdtBuf()),
+    : m_pTxtBuf(pdfium::MakeUnique<CFDE_TxtEdtBuf>()),
       m_nPageLineCount(20),
       m_nLineCount(0),
       m_nAnchorPos(-1),
@@ -81,11 +81,11 @@
 
 void CFDE_TxtEdtEngine::SetEditParams(const FDE_TXTEDTPARAMS& params) {
   if (!m_pTextBreak)
-    m_pTextBreak = pdfium::MakeUnique<CFX_TxtBreak>(FX_TXTBREAKPOLICY_None);
+    m_pTextBreak = pdfium::MakeUnique<CFX_TxtBreak>();
 
   m_Param = params;
   m_wLineEnd = params.wLineBreakChar;
-  m_bAutoLineEnd = (m_Param.nLineEnd == FDE_TXTEDIT_LINEEND_Auto);
+  m_bAutoLineEnd = m_Param.nLineEnd == FDE_TXTEDIT_LINEEND_Auto;
   UpdateTxtBreak();
 }
 
@@ -930,8 +930,7 @@
   FX_WCHAR wChar = L' ';
   int32_t nParagStart = 0;
   int32_t nIndex = 0;
-  std::unique_ptr<IFX_CharIter> pIter(
-      new CFDE_TxtEdtBuf::Iterator(m_pTxtBuf.get()));
+  auto pIter = pdfium::MakeUnique<CFDE_TxtEdtBuf::Iterator>(m_pTxtBuf.get());
   pIter->SetAt(0);
   do {
     wChar = pIter->GetChar();
@@ -1376,7 +1375,7 @@
 }
 
 bool CFDE_TxtEdtEngine::IsFitArea(CFX_WideString& wsText) {
-  std::unique_ptr<CFDE_TextOut> pTextOut(new CFDE_TextOut);
+  auto pTextOut = pdfium::MakeUnique<CFDE_TextOut>();
   pTextOut->SetLineSpace(m_Param.fLineSpace);
   pTextOut->SetFont(m_Param.pFont);
   pTextOut->SetFontSize(m_Param.fFontSize);
diff --git a/xfa/fde/tto/fde_textout.cpp b/xfa/fde/tto/fde_textout.cpp
index 421876b..b4bbe67 100644
--- a/xfa/fde/tto/fde_textout.cpp
+++ b/xfa/fde/tto/fde_textout.cpp
@@ -23,7 +23,7 @@
 FDE_TTOPIECE::~FDE_TTOPIECE() = default;
 
 CFDE_TextOut::CFDE_TextOut()
-    : m_pTxtBreak(new CFX_TxtBreak(FX_TXTBREAKPOLICY_None)),
+    : m_pTxtBreak(pdfium::MakeUnique<CFX_TxtBreak>()),
       m_pFont(nullptr),
       m_fFontSize(12.0f),
       m_fLineSpace(m_fFontSize),
@@ -771,7 +771,7 @@
   if (!bUnderLine && !bStrikeOut && !bHotKey)
     return;
 
-  std::unique_ptr<CFDE_Path> pPath(new CFDE_Path);
+  auto pPath = pdfium::MakeUnique<CFDE_Path>();
   int32_t iLineCount = 0;
   CFX_RectF rtText = pPiece->rtPiece;
   CFX_PointF pt1, pt2;
diff --git a/xfa/fgas/layout/fgas_textbreak.cpp b/xfa/fgas/layout/fgas_textbreak.cpp
index 153d575..e458f4c 100644
--- a/xfa/fgas/layout/fgas_textbreak.cpp
+++ b/xfa/fgas/layout/fgas_textbreak.cpp
@@ -37,9 +37,8 @@
 
 }  // namespace
 
-CFX_TxtBreak::CFX_TxtBreak(uint32_t dwPolicies)
-    : m_dwPolicies(dwPolicies),
-      m_iLineWidth(2000000),
+CFX_TxtBreak::CFX_TxtBreak()
+    : m_iLineWidth(2000000),
       m_dwLayoutStyles(0),
       m_bVertical(false),
       m_bArabicContext(false),
@@ -71,11 +70,7 @@
       m_iTolerance(0),
       m_iHorScale(100),
       m_iCharSpace(0) {
-  m_bPagination = (m_dwPolicies & FX_TXTBREAKPOLICY_Pagination) != 0;
-  int32_t iSize = m_bPagination ? sizeof(CFX_Char) : sizeof(CFX_TxtChar);
-  m_pTxtLine1 = pdfium::MakeUnique<CFX_TxtLine>(iSize);
-  m_pTxtLine2 = pdfium::MakeUnique<CFX_TxtLine>(iSize);
-  m_pCurLine = m_pTxtLine1.get();
+  m_pCurLine = &m_TxtLine1;
   ResetArabicContext();
 }
 
@@ -214,9 +209,6 @@
 }
 
 void CFX_TxtBreak::SetBreakStatus() {
-  if (m_bPagination)
-    return;
-
   int32_t iCount = m_pCurLine->CountChars();
   if (iCount < 1)
     return;
@@ -247,7 +239,7 @@
 }
 
 CFX_TxtChar* CFX_TxtBreak::GetLastChar(int32_t index, bool bOmitChar) const {
-  std::vector<CFX_TxtChar>& ca = *m_pCurLine->m_pLineChars.get();
+  std::vector<CFX_TxtChar>& ca = m_pCurLine->m_LineChars;
   int32_t iCount = pdfium::CollectionSize<int32_t>(ca);
   if (index < 0 || index >= iCount)
     return nullptr;
@@ -263,17 +255,17 @@
   return nullptr;
 }
 
-CFX_TxtLine* CFX_TxtBreak::GetTxtLine() const {
+const CFX_TxtLine* CFX_TxtBreak::GetTxtLine() const {
   if (m_iReady == 1)
-    return m_pTxtLine1.get();
+    return &m_TxtLine1;
   if (m_iReady == 2)
-    return m_pTxtLine2.get();
+    return &m_TxtLine2;
   return nullptr;
 }
 
-CFX_TxtPieceArray* CFX_TxtBreak::GetTxtPieces() const {
-  CFX_TxtLine* pTxtLine = GetTxtLine();
-  return pTxtLine ? pTxtLine->m_pLinePieces.get() : nullptr;
+const CFX_TxtPieceArray* CFX_TxtBreak::GetTxtPieces() const {
+  const CFX_TxtLine* pTxtLine = GetTxtLine();
+  return pTxtLine ? &pTxtLine->m_LinePieces : nullptr;
 }
 
 inline FX_CHARTYPE CFX_TxtBreak::GetUnifiedCharType(
@@ -289,13 +281,8 @@
     m_iCurAlignment |= (m_iAlignment & FX_TXTLINEALIGNMENT_HigherMask);
     m_bArabicNumber = m_iArabicContext >= 1 && m_bArabicShapes;
   } else {
-    if (m_bPagination) {
-      m_bCurRTL = false;
-      m_iCurAlignment = 0;
-    } else {
-      m_bCurRTL = m_bRTL;
-      m_iCurAlignment = m_iAlignment;
-    }
+    m_bCurRTL = m_bRTL;
+    m_iCurAlignment = m_iAlignment;
     if (m_bRTL)
       m_bArabicNumber = m_iArabicContext >= 1;
     else
@@ -308,10 +295,9 @@
 
 void CFX_TxtBreak::AppendChar_PageLoad(CFX_TxtChar* pCurChar,
                                        uint32_t dwProps) {
-  if (!m_bPagination) {
-    pCurChar->m_dwStatus = 0;
-    pCurChar->m_pUserData = m_pUserData;
-  }
+  pCurChar->m_dwStatus = 0;
+  pCurChar->m_pUserData = m_pUserData;
+
   if (m_bArabicContext || m_bArabicShapes) {
     int32_t iBidiCls = (dwProps & FX_BIDICLASSBITSMASK) >> FX_BIDICLASSBITS;
     int32_t iArabicContext =
@@ -325,11 +311,9 @@
         m_iCurArabicContext = iArabicContext;
 
       ResetArabicContext();
-      if (!m_bPagination) {
-        CFX_TxtChar* pLastChar = GetLastChar(1, false);
-        if (pLastChar && pLastChar->m_dwStatus < 1)
-          pLastChar->m_dwStatus = FX_TXTBREAK_PieceBreak;
-      }
+      CFX_TxtChar* pLastChar = GetLastChar(1, false);
+      if (pLastChar && pLastChar->m_dwStatus < 1)
+        pLastChar->m_dwStatus = FX_TXTBREAK_PieceBreak;
     }
   }
   pCurChar->m_dwCharStyles = m_dwContextCharStyles;
@@ -348,29 +332,27 @@
       iCharWidth = 1000;
     } else {
       wForm = wch;
-      if (!m_bPagination) {
-        CFX_TxtChar* pLastChar = GetLastChar(0, false);
-        if (pLastChar &&
-            (pLastChar->m_dwCharStyles & FX_TXTCHARSTYLE_ArabicShadda) == 0) {
-          bool bShadda = false;
-          if (wch == 0x0651) {
-            FX_WCHAR wLast = pLastChar->m_wCharCode;
-            if (wLast >= 0x064C && wLast <= 0x0650) {
-              wForm = FX_GetArabicFromShaddaTable(wLast);
-              bShadda = true;
-            }
-          } else if (wch >= 0x064C && wch <= 0x0650) {
-            if (pLastChar->m_wCharCode == 0x0651) {
-              wForm = FX_GetArabicFromShaddaTable(wch);
-              bShadda = true;
-            }
+      CFX_TxtChar* pLastChar = GetLastChar(0, false);
+      if (pLastChar &&
+          (pLastChar->m_dwCharStyles & FX_TXTCHARSTYLE_ArabicShadda) == 0) {
+        bool bShadda = false;
+        if (wch == 0x0651) {
+          FX_WCHAR wLast = pLastChar->m_wCharCode;
+          if (wLast >= 0x064C && wLast <= 0x0650) {
+            wForm = FX_GetArabicFromShaddaTable(wLast);
+            bShadda = true;
           }
-          if (bShadda) {
-            pLastChar->m_dwCharStyles |= FX_TXTCHARSTYLE_ArabicShadda;
-            pLastChar->m_iCharWidth = 0;
-            pCurChar->m_dwCharStyles |= FX_TXTCHARSTYLE_ArabicShadda;
+        } else if (wch >= 0x064C && wch <= 0x0650) {
+          if (pLastChar->m_wCharCode == 0x0651) {
+            wForm = FX_GetArabicFromShaddaTable(wch);
+            bShadda = true;
           }
         }
+        if (bShadda) {
+          pLastChar->m_dwCharStyles |= FX_TXTCHARSTYLE_ArabicShadda;
+          pLastChar->m_iCharWidth = 0;
+          pCurChar->m_dwCharStyles |= FX_TXTCHARSTYLE_ArabicShadda;
+        }
       }
       if (!m_pFont->GetCharWidth(wForm, iCharWidth, false))
         iCharWidth = 0;
@@ -541,10 +523,10 @@
   iCharWidth += m_iCharSpace;
   pCurChar->m_iCharWidth = iCharWidth;
   iLineWidth += iCharWidth;
-  bool bBreak = (chartype != FX_CHARTYPE_Space ||
-                 (m_dwPolicies & FX_TXTBREAKPOLICY_SpaceBreak) != 0);
-  if (!m_bSingleLine && bBreak && iLineWidth > m_iLineWidth + m_iTolerance)
+  if (!m_bSingleLine && chartype != FX_CHARTYPE_Space &&
+      iLineWidth > m_iLineWidth + m_iTolerance) {
     return EndBreak(FX_TXTBREAK_LineBreak);
+  }
 
   return FX_TXTBREAK_None;
 }
@@ -552,9 +534,9 @@
 uint32_t CFX_TxtBreak::AppendChar(FX_WCHAR wch) {
   uint32_t dwProps = kTextLayoutCodeProperties[static_cast<uint16_t>(wch)];
   FX_CHARTYPE chartype = GetCharTypeFromProp(dwProps);
-  m_pCurLine->m_pLineChars->emplace_back();
+  m_pCurLine->m_LineChars.emplace_back();
 
-  CFX_TxtChar* pCurChar = &m_pCurLine->m_pLineChars->back();
+  CFX_TxtChar* pCurChar = &m_pCurLine->m_LineChars.back();
   pCurChar->m_wCharCode = static_cast<uint16_t>(wch);
   pCurChar->m_nRotation = m_iCharRotation;
   pCurChar->m_dwCharProps = dwProps;
@@ -578,7 +560,7 @@
     dwRet1 = EndBreak(FX_TXTBREAK_LineBreak);
     int32_t iCount = m_pCurLine->CountChars();
     if (iCount > 0)
-      pCurChar = &(*m_pCurLine->m_pLineChars)[iCount - 1];
+      pCurChar = &m_pCurLine->m_LineChars[iCount - 1];
   }
 
   int32_t iRotation = m_iRotation;
@@ -657,43 +639,20 @@
     switch (pTC->GetCharType()) {
       case FX_CHARTYPE_Tab:
       case FX_CHARTYPE_Control:
-        break;
       case FX_CHARTYPE_Space:
-        if ((m_dwPolicies & FX_TXTBREAKPOLICY_SpaceBreak) != 0) {
-          SplitTextLine(m_pCurLine, pNextLine, !m_bPagination && bAllChars);
-          bDone = true;
-        }
         break;
       default:
-        SplitTextLine(m_pCurLine, pNextLine, !m_bPagination && bAllChars);
+        SplitTextLine(m_pCurLine, pNextLine, bAllChars);
         bDone = true;
         break;
     }
   }
 
   iCount = m_pCurLine->CountChars();
-  CFX_TxtPieceArray* pCurPieces = m_pCurLine->m_pLinePieces.get();
   CFX_TxtPiece tp;
-  if (m_bPagination) {
-    tp.m_dwStatus = dwStatus;
-    tp.m_iStartPos = m_pCurLine->m_iStart;
-    tp.m_iWidth = m_pCurLine->m_iWidth;
-    tp.m_iStartChar = 0;
-    tp.m_iChars = iCount;
-    tp.m_pChars = m_pCurLine->m_pLineChars.get();
-    tp.m_pUserData = m_pUserData;
-    pTC = m_pCurLine->GetCharPtr(0);
-    tp.m_dwCharStyles = pTC->m_dwCharStyles;
-    tp.m_iHorizontalScale = pTC->m_iHorizontalScale;
-    tp.m_iVerticalScale = pTC->m_iVerticalScale;
-    pCurPieces->Add(tp);
-    m_pCurLine = pNextLine;
-    m_eCharType = FX_CHARTYPE_Unknown;
-    return true;
-  }
   if (bAllChars && !bDone) {
     int32_t iEndPos = m_pCurLine->m_iWidth;
-    GetBreakPos(*m_pCurLine->m_pLineChars.get(), iEndPos, bAllChars, true);
+    GetBreakPos(m_pCurLine->m_LineChars, iEndPos, bAllChars, true);
   }
   return false;
 }
@@ -705,10 +664,10 @@
   CFX_TxtChar* pTC;
   int32_t i;
   int32_t j;
-  std::vector<CFX_TxtChar>& chars = *m_pCurLine->m_pLineChars.get();
+  std::vector<CFX_TxtChar>& chars = m_pCurLine->m_LineChars;
   int32_t iCount = m_pCurLine->CountChars();
   bool bDone = (m_pCurLine->m_iArabicChars > 0 || m_bCurRTL);
-  if (!m_bPagination && bDone) {
+  if (bDone) {
     int32_t iBidiNum = 0;
     for (i = 0; i < iCount; i++) {
       pTC = &chars[i];
@@ -721,12 +680,11 @@
     FX_BidiLine(chars, iBidiNum + 1, m_bCurRTL ? 1 : 0);
   }
 
-  CFX_TxtPieceArray* pCurPieces = m_pCurLine->m_pLinePieces.get();
-  if (!m_bPagination &&
-      (bDone || (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_MutipleFormat) != 0)) {
+  CFX_TxtPieceArray* pCurPieces = &m_pCurLine->m_LinePieces;
+  if (bDone || (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_MutipleFormat) != 0) {
     tp.m_dwStatus = FX_TXTBREAK_PieceBreak;
     tp.m_iStartPos = m_pCurLine->m_iStart;
-    tp.m_pChars = m_pCurLine->m_pLineChars.get();
+    tp.m_pChars = &m_pCurLine->m_LineChars;
     int32_t iBidiLevel = -1;
     int32_t iCharWidth;
     i = 0;
@@ -797,7 +755,7 @@
     tp.m_iWidth = m_pCurLine->m_iWidth;
     tp.m_iStartChar = 0;
     tp.m_iChars = iCount;
-    tp.m_pChars = m_pCurLine->m_pLineChars.get();
+    tp.m_pChars = &m_pCurLine->m_LineChars;
     tp.m_pUserData = m_pUserData;
     pTC = &chars[0];
     tp.m_dwCharStyles = pTC->m_dwCharStyles;
@@ -814,7 +772,7 @@
   int32_t iNetWidth = m_pCurLine->m_iWidth;
   int32_t iGapChars = 0;
   int32_t iCharWidth;
-  CFX_TxtPieceArray* pCurPieces = m_pCurLine->m_pLinePieces.get();
+  CFX_TxtPieceArray* pCurPieces = &m_pCurLine->m_LinePieces;
   int32_t i;
   int32_t j;
   int32_t iCount = pCurPieces->GetSize();
@@ -899,7 +857,7 @@
 uint32_t CFX_TxtBreak::EndBreak(uint32_t dwStatus) {
   ASSERT(dwStatus >= FX_TXTBREAK_PieceBreak &&
          dwStatus <= FX_TXTBREAK_PageBreak);
-  CFX_TxtPieceArray* pCurPieces = m_pCurLine->m_pLinePieces.get();
+  const CFX_TxtPieceArray* pCurPieces = &m_pCurLine->m_LinePieces;
   int32_t iCount = pCurPieces->GetSize();
   if (iCount > 0) {
     CFX_TxtPiece* pLastPiece = pCurPieces->GetPtrAt(--iCount);
@@ -909,9 +867,9 @@
       dwStatus = pLastPiece->m_dwStatus;
     return dwStatus;
   } else {
-    CFX_TxtLine* pLastLine = GetTxtLine();
+    const CFX_TxtLine* pLastLine = GetTxtLine();
     if (pLastLine) {
-      pCurPieces = pLastLine->m_pLinePieces.get();
+      pCurPieces = &pLastLine->m_LinePieces;
       iCount = pCurPieces->GetSize();
       if (iCount-- > 0) {
         CFX_TxtPiece* pLastPiece = pCurPieces->GetPtrAt(iCount);
@@ -927,17 +885,16 @@
     iCount = m_pCurLine->CountChars();
     if (iCount < 1)
       return FX_TXTBREAK_None;
-    if (!m_bPagination) {
-      CFX_TxtChar* pTC = m_pCurLine->GetCharPtr(iCount - 1);
-      pTC->m_dwStatus = dwStatus;
-    }
+
+    CFX_TxtChar* pTC = m_pCurLine->GetCharPtr(iCount - 1);
+    pTC->m_dwStatus = dwStatus;
     if (dwStatus <= FX_TXTBREAK_PieceBreak)
       return dwStatus;
   }
 
-  m_iReady = (m_pCurLine == m_pTxtLine1.get()) ? 1 : 2;
+  m_iReady = m_pCurLine == &m_TxtLine1 ? 1 : 2;
   CFX_TxtLine* pNextLine =
-      (m_pCurLine == m_pTxtLine1.get()) ? m_pTxtLine2.get() : m_pTxtLine1.get();
+      m_pCurLine == &m_TxtLine1 ? &m_TxtLine2 : &m_TxtLine1;
   bool bAllChars = (m_iCurAlignment > FX_TXTLINEALIGNMENT_Right);
   if (m_bArabicShapes)
     EndBreak_UpdateArabicShapes();
@@ -945,7 +902,7 @@
   if (!EndBreak_SplitLine(pNextLine, bAllChars, dwStatus)) {
     std::deque<FX_TPO> tpos;
     EndBreak_BidiLine(&tpos, dwStatus);
-    if (!m_bPagination && m_iCurAlignment > FX_TXTLINEALIGNMENT_Left)
+    if (m_iCurAlignment > FX_TXTLINEALIGNMENT_Left)
       EndBreak_Alignment(tpos, bAllChars, dwStatus);
   }
 
@@ -981,8 +938,6 @@
     iBreakPos = iEndPos;
   }
 
-  bool bSpaceBreak = (m_dwPolicies & FX_TXTBREAKPOLICY_SpaceBreak) != 0;
-  bool bNumberBreak = (m_dwPolicies & FX_TXTBREAKPOLICY_NumberBreak) != 0;
   FX_LINEBREAKTYPE eType;
   uint32_t nCodeProp;
   uint32_t nCur;
@@ -1003,11 +958,9 @@
     nCur = nCodeProp & 0x003F;
     if (nCur == FX_CBP_SP) {
       if (nNext == FX_CBP_SP)
-        eType = bSpaceBreak ? FX_LBT_DIRECT_BRK : FX_LBT_PROHIBITED_BRK;
+        eType = FX_LBT_PROHIBITED_BRK;
       else
         eType = gs_FX_LineBreak_PairTable[nCur][nNext];
-    } else if (bNumberBreak && nCur == FX_CBP_NU && nNext == FX_CBP_NU) {
-      eType = FX_LBT_DIRECT_BRK;
     } else {
       if (nNext == FX_CBP_SP)
         eType = FX_LBT_PROHIBITED_BRK;
@@ -1017,8 +970,7 @@
     if (bAllChars)
       pCur->m_nBreakType = static_cast<uint8_t>(eType);
     if (!bOnlyBrk) {
-      if (m_bSingleLine || iEndPos <= m_iLineWidth ||
-          (nCur == FX_CBP_SP && !bSpaceBreak)) {
+      if (m_bSingleLine || iEndPos <= m_iLineWidth || nCur == FX_CBP_SP) {
         if (eType == FX_LBT_DIRECT_BRK && iBreak < 0) {
           iBreak = iLength;
           iBreakPos = iEndPos;
@@ -1066,7 +1018,7 @@
     return;
 
   int32_t iEndPos = pCurLine->m_iWidth;
-  std::vector<CFX_TxtChar>& curChars = *pCurLine->m_pLineChars;
+  std::vector<CFX_TxtChar>& curChars = pCurLine->m_LineChars;
   int32_t iCharPos = GetBreakPos(curChars, iEndPos, bAllChars, false);
   if (iCharPos < 0)
     iCharPos = 0;
@@ -1079,40 +1031,32 @@
     return;
   }
 
-  // m_pLineChars is a unique_ptr<vector>. Assign the ref into nextChars
-  // so we can change the m_pLineChars vector ...
-  std::vector<CFX_TxtChar>& nextChars = *pNextLine->m_pLineChars;
-  nextChars =
+  pNextLine->m_LineChars =
       std::vector<CFX_TxtChar>(curChars.begin() + iCharPos, curChars.end());
   curChars.erase(curChars.begin() + iCharPos, curChars.end());
   pCurLine->m_iWidth = iEndPos;
   CFX_TxtChar* pTC = &curChars[iCharPos - 1];
   pTC->m_nBreakType = FX_LBT_UNKNOWN;
-  iCount = pdfium::CollectionSize<int>(nextChars);
+  iCount = pdfium::CollectionSize<int>(pNextLine->m_LineChars);
   int32_t iWidth = 0;
   for (int32_t i = 0; i < iCount; i++) {
-    if (nextChars[i].GetCharType() >= FX_CHARTYPE_ArabicAlef) {
+    if (pNextLine->m_LineChars[i].GetCharType() >= FX_CHARTYPE_ArabicAlef) {
       pCurLine->m_iArabicChars--;
       pNextLine->m_iArabicChars++;
     }
-    int32_t iCharWidth = nextChars[i].m_iCharWidth;
-    if (iCharWidth > 0)
-      iWidth += iCharWidth;
-    if (m_bPagination)
-      continue;
-
-    nextChars[i].m_dwStatus = 0;
+    iWidth += std::max(0, pNextLine->m_LineChars[i].m_iCharWidth);
+    pNextLine->m_LineChars[i].m_dwStatus = 0;
   }
   pNextLine->m_iWidth = iWidth;
 }
 
 int32_t CFX_TxtBreak::CountBreakPieces() const {
-  CFX_TxtPieceArray* pTxtPieces = GetTxtPieces();
+  const CFX_TxtPieceArray* pTxtPieces = GetTxtPieces();
   return pTxtPieces ? pTxtPieces->GetSize() : 0;
 }
 
 const CFX_TxtPiece* CFX_TxtBreak::GetBreakPiece(int32_t index) const {
-  CFX_TxtPieceArray* pTxtPieces = GetTxtPieces();
+  const CFX_TxtPieceArray* pTxtPieces = GetTxtPieces();
   if (!pTxtPieces)
     return nullptr;
   if (index < 0 || index >= pTxtPieces->GetSize())
@@ -1121,9 +1065,9 @@
 }
 
 void CFX_TxtBreak::ClearBreakPieces() {
-  CFX_TxtLine* pTxtLine = GetTxtLine();
+  const CFX_TxtLine* pTxtLine = GetTxtLine();
   if (pTxtLine)
-    pTxtLine->RemoveAll(true);
+    const_cast<CFX_TxtLine*>(pTxtLine)->RemoveAll(true);
   m_iReady = 0;
 }
 
@@ -1132,8 +1076,8 @@
   m_iArabicContext = 1;
   m_iCurArabicContext = 1;
   ResetArabicContext();
-  m_pTxtLine1->RemoveAll(true);
-  m_pTxtLine2->RemoveAll(true);
+  m_TxtLine1.RemoveAll(true);
+  m_TxtLine2.RemoveAll(true);
 }
 
 struct FX_FORMCHAR {
@@ -1660,12 +1604,8 @@
       m_pChars(nullptr),
       m_pUserData(nullptr) {}
 
-CFX_TxtLine::CFX_TxtLine(int32_t iBlockSize)
-    : m_pLineChars(new std::vector<CFX_TxtChar>),
-      m_pLinePieces(new CFX_TxtPieceArray(16)),
-      m_iStart(0),
-      m_iWidth(0),
-      m_iArabicChars(0) {}
+CFX_TxtLine::CFX_TxtLine()
+    : m_LinePieces(16), m_iStart(0), m_iWidth(0), m_iArabicChars(0) {}
 
 CFX_TxtLine::~CFX_TxtLine() {
   RemoveAll();
diff --git a/xfa/fgas/layout/fgas_textbreak.h b/xfa/fgas/layout/fgas_textbreak.h
index 69ca835..72fab9d 100644
--- a/xfa/fgas/layout/fgas_textbreak.h
+++ b/xfa/fgas/layout/fgas_textbreak.h
@@ -23,10 +23,6 @@
 class IFX_TxtAccess;
 struct FDE_TEXTEDITPIECE;
 
-#define FX_TXTBREAKPOLICY_None 0x00
-#define FX_TXTBREAKPOLICY_Pagination 0x01
-#define FX_TXTBREAKPOLICY_SpaceBreak 0x02
-#define FX_TXTBREAKPOLICY_NumberBreak 0x04
 #define FX_TXTBREAK_None 0x00
 #define FX_TXTBREAK_PieceBreak 0x01
 #define FX_TXTBREAK_LineBreak 0x02
@@ -162,42 +158,46 @@
 
 class CFX_TxtLine {
  public:
-  explicit CFX_TxtLine(int32_t iBlockSize);
+  CFX_TxtLine();
   ~CFX_TxtLine();
 
   int32_t CountChars() const {
-    return pdfium::CollectionSize<int32_t>(*m_pLineChars);
+    return pdfium::CollectionSize<int32_t>(m_LineChars);
   }
 
-  CFX_TxtChar* GetCharPtr(int32_t index) const {
-    ASSERT(index >= 0 &&
-           index < pdfium::CollectionSize<int32_t>(*m_pLineChars));
-    return &(*m_pLineChars)[index];
+  CFX_TxtChar* GetCharPtr(int32_t index) {
+    ASSERT(index >= 0 && index < pdfium::CollectionSize<int32_t>(m_LineChars));
+    return &m_LineChars[index];
   }
 
-  int32_t CountPieces() const { return m_pLinePieces->GetSize(); }
+  const CFX_TxtChar* GetCharPtr(int32_t index) const {
+    ASSERT(index >= 0 && index < pdfium::CollectionSize<int32_t>(m_LineChars));
+    return &m_LineChars[index];
+  }
+
+  int32_t CountPieces() const { return m_LinePieces.GetSize(); }
   CFX_TxtPiece* GetPiecePtr(int32_t index) const {
-    ASSERT(index > -1 && index < m_pLinePieces->GetSize());
-    return m_pLinePieces->GetPtrAt(index);
+    ASSERT(index > -1 && index < m_LinePieces.GetSize());
+    return m_LinePieces.GetPtrAt(index);
   }
 
   void GetString(CFX_WideString& wsStr) const {
-    int32_t iCount = pdfium::CollectionSize<int32_t>(*m_pLineChars);
+    int32_t iCount = pdfium::CollectionSize<int32_t>(m_LineChars);
     FX_WCHAR* pBuf = wsStr.GetBuffer(iCount);
     for (int32_t i = 0; i < iCount; i++)
-      *pBuf++ = static_cast<FX_WCHAR>((*m_pLineChars)[i].m_wCharCode);
+      *pBuf++ = static_cast<FX_WCHAR>(m_LineChars[i].m_wCharCode);
     wsStr.ReleaseBuffer(iCount);
   }
 
   void RemoveAll(bool bLeaveMemory = false) {
-    m_pLineChars->clear();
-    m_pLinePieces->RemoveAll(bLeaveMemory);
+    m_LineChars.clear();
+    m_LinePieces.RemoveAll(bLeaveMemory);
     m_iWidth = 0;
     m_iArabicChars = 0;
   }
 
-  std::unique_ptr<std::vector<CFX_TxtChar>> m_pLineChars;
-  std::unique_ptr<CFX_TxtPieceArray> m_pLinePieces;
+  std::vector<CFX_TxtChar> m_LineChars;
+  CFX_TxtPieceArray m_LinePieces;
   int32_t m_iStart;
   int32_t m_iWidth;
   int32_t m_iArabicChars;
@@ -205,7 +205,7 @@
 
 class CFX_TxtBreak {
  public:
-  explicit CFX_TxtBreak(uint32_t dwPolicies);
+  CFX_TxtBreak();
   ~CFX_TxtBreak();
 
   void SetLineWidth(FX_FLOAT fLineWidth);
@@ -248,8 +248,8 @@
   void SetBreakStatus();
   int32_t GetLineRotation(uint32_t dwStyles) const;
   CFX_TxtChar* GetLastChar(int32_t index, bool bOmitChar = true) const;
-  CFX_TxtLine* GetTxtLine() const;
-  CFX_TxtPieceArray* GetTxtPieces() const;
+  const CFX_TxtLine* GetTxtLine() const;
+  const CFX_TxtPieceArray* GetTxtPieces() const;
   FX_CHARTYPE GetUnifiedCharType(FX_CHARTYPE dwType) const;
   void ResetArabicContext();
   void ResetContextCharStyles();
@@ -269,8 +269,6 @@
                      CFX_TxtLine* pNextLine,
                      bool bAllChars = false);
 
-  uint32_t m_dwPolicies;
-  bool m_bPagination;
   int32_t m_iLineWidth;
   uint32_t m_dwLayoutStyles;
   bool m_bVertical;
@@ -300,8 +298,8 @@
   int32_t m_iCurAlignment;
   bool m_bArabicNumber;
   bool m_bArabicComma;
-  std::unique_ptr<CFX_TxtLine> m_pTxtLine1;
-  std::unique_ptr<CFX_TxtLine> m_pTxtLine2;
+  CFX_TxtLine m_TxtLine1;
+  CFX_TxtLine m_TxtLine2;
   CFX_TxtLine* m_pCurLine;
   int32_t m_iReady;
   int32_t m_iTolerance;
