diff --git a/xfa/fgas/layout/cfx_break.cpp b/xfa/fgas/layout/cfx_break.cpp
index 8be1d17..a8280b1 100644
--- a/xfa/fgas/layout/cfx_break.cpp
+++ b/xfa/fgas/layout/cfx_break.cpp
@@ -38,12 +38,16 @@
 
 CFX_Break::~CFX_Break() {}
 
+void CFX_Break::Reset() {
+  m_eCharType = FX_CHARTYPE_Unknown;
+  m_Line[0].Clear();
+  m_Line[1].Clear();
+}
+
 void CFX_Break::SetLayoutStyles(uint32_t dwLayoutStyles) {
   m_dwLayoutStyles = dwLayoutStyles;
   m_bSingleLine = (m_dwLayoutStyles & FX_LAYOUTSTYLE_SingleLine) != 0;
   m_bCombText = (m_dwLayoutStyles & FX_LAYOUTSTYLE_CombText) != 0;
-
-  ResetArabicContext();
 }
 
 void CFX_Break::SetHorizontalScale(int32_t iScale) {
diff --git a/xfa/fgas/layout/cfx_break.h b/xfa/fgas/layout/cfx_break.h
index d1bbde0..631cc5a 100644
--- a/xfa/fgas/layout/cfx_break.h
+++ b/xfa/fgas/layout/cfx_break.h
@@ -32,6 +32,8 @@
  public:
   virtual ~CFX_Break();
 
+  void Reset();
+
   void SetLayoutStyles(uint32_t dwLayoutStyles);
   uint32_t GetLayoutStyles() const { return m_dwLayoutStyles; }
 
@@ -49,7 +51,6 @@
   void SetDefaultChar(wchar_t wch);
 
   virtual void SetBreakStatus() = 0;
-  virtual void ResetArabicContext() {}
 
  protected:
   explicit CFX_Break(uint32_t dwLayoutStyles);
diff --git a/xfa/fgas/layout/fgas_rtfbreak.cpp b/xfa/fgas/layout/fgas_rtfbreak.cpp
index f4faf00..81fbea0 100644
--- a/xfa/fgas/layout/fgas_rtfbreak.cpp
+++ b/xfa/fgas/layout/fgas_rtfbreak.cpp
@@ -723,12 +723,6 @@
   m_iReadyLineIndex = -1;
 }
 
-void CFX_RTFBreak::Reset() {
-  m_eCharType = FX_CHARTYPE_Unknown;
-  m_Line[0].Clear();
-  m_Line[1].Clear();
-}
-
 int32_t CFX_RTFBreak::GetDisplayPos(const FX_RTFTEXTOBJ* pText,
                                     FXTEXT_CHARPOS* pCharPos,
                                     bool bCharCode) const {
diff --git a/xfa/fgas/layout/fgas_rtfbreak.h b/xfa/fgas/layout/fgas_rtfbreak.h
index 681dc58..865b17f 100644
--- a/xfa/fgas/layout/fgas_rtfbreak.h
+++ b/xfa/fgas/layout/fgas_rtfbreak.h
@@ -60,8 +60,6 @@
   const CFX_BreakPiece* GetBreakPieceUnstable(int32_t index) const;
   void ClearBreakPieces();
 
-  void Reset();
-
   int32_t GetDisplayPos(const FX_RTFTEXTOBJ* pText,
                         FXTEXT_CHARPOS* pCharPos,
                         bool bCharCode) const;
diff --git a/xfa/fgas/layout/fgas_textbreak.cpp b/xfa/fgas/layout/fgas_textbreak.cpp
index 8fc425f..4109170 100644
--- a/xfa/fgas/layout/fgas_textbreak.cpp
+++ b/xfa/fgas/layout/fgas_textbreak.cpp
@@ -25,13 +25,8 @@
 
 CFX_TxtBreak::CFX_TxtBreak()
     : CFX_Break(FX_LAYOUTSTYLE_None),
-      m_iArabicContext(1),
-      m_iCurArabicContext(1),
       m_iAlignment(CFX_TxtLineAlignment_Left),
-      m_dwContextCharStyles(0),
-      m_iCombWidth(360000) {
-  ResetArabicContext();
-}
+      m_iCombWidth(360000) {}
 
 CFX_TxtBreak::~CFX_TxtBreak() {}
 
@@ -45,7 +40,6 @@
   ASSERT(iAlignment >= CFX_TxtLineAlignment_Left &&
          iAlignment <= CFX_TxtLineAlignment_Justified);
   m_iAlignment = iAlignment;
-  ResetArabicContext();
 }
 
 void CFX_TxtBreak::SetCombWidth(float fCombWidth) {
@@ -83,15 +77,9 @@
   return chartype >= FX_CHARTYPE_ArabicAlef ? FX_CHARTYPE_Arabic : chartype;
 }
 
-void CFX_TxtBreak::ResetArabicContext() {
-  m_iCurAlignment = m_iAlignment;
-  m_dwContextCharStyles = m_iAlignment;
-  m_dwContextCharStyles |= (m_iArabicContext << 8);
-}
-
 void CFX_TxtBreak::AppendChar_PageLoad(CFX_Char* pCurChar, uint32_t dwProps) {
   pCurChar->m_dwStatus = CFX_BreakType::None;
-  pCurChar->m_dwCharStyles = m_dwContextCharStyles;
+  pCurChar->m_dwCharStyles = m_iAlignment | (1 << 8);
 }
 
 void CFX_TxtBreak::AppendChar_Combination(CFX_Char* pCurChar) {
@@ -479,7 +467,7 @@
   }
 
   int32_t iOffset = m_iLineWidth - iNetWidth;
-  if (iGapChars > 0 && m_iCurAlignment & CFX_TxtLineAlignment_Justified &&
+  if (iGapChars > 0 && m_iAlignment & CFX_TxtLineAlignment_Justified &&
       dwStatus != CFX_BreakType::Paragraph) {
     int32_t iStart = -1;
     for (auto& tpo : tpos) {
@@ -504,10 +492,10 @@
       }
       iStart += ttp.m_iWidth;
     }
-  } else if (m_iCurAlignment & CFX_TxtLineAlignment_Center ||
-             m_iCurAlignment & CFX_TxtLineAlignment_Right) {
-    if (m_iCurAlignment & CFX_TxtLineAlignment_Center &&
-        !(m_iCurAlignment & CFX_TxtLineAlignment_Right)) {
+  } else if (m_iAlignment & CFX_TxtLineAlignment_Center ||
+             m_iAlignment & CFX_TxtLineAlignment_Right) {
+    if (m_iAlignment & CFX_TxtLineAlignment_Center &&
+        !(m_iAlignment & CFX_TxtLineAlignment_Right)) {
       iOffset /= 2;
     }
     if (iOffset > 0) {
@@ -545,21 +533,18 @@
 
   m_iReadyLineIndex = m_pCurLine == &m_Line[0] ? 0 : 1;
   CFX_BreakLine* pNextLine = &m_Line[1 - m_iReadyLineIndex];
-  bool bAllChars = m_iCurAlignment > CFX_TxtLineAlignment_Right;
+  bool bAllChars = m_iAlignment > CFX_TxtLineAlignment_Right;
   if (!EndBreak_SplitLine(pNextLine, bAllChars)) {
     std::deque<FX_TPO> tpos;
     EndBreak_BidiLine(&tpos, dwStatus);
-    if (m_iCurAlignment > CFX_TxtLineAlignment_Left)
+    if (m_iAlignment > CFX_TxtLineAlignment_Left)
       EndBreak_Alignment(tpos, bAllChars, dwStatus);
   }
 
   m_pCurLine = pNextLine;
   CFX_Char* pTC = GetLastChar(0, false);
   m_eCharType = pTC ? pTC->GetCharType() : FX_CHARTYPE_Unknown;
-  if (dwStatus == CFX_BreakType::Paragraph) {
-    m_iArabicContext = m_iCurArabicContext = 1;
-    ResetArabicContext();
-  }
+
   return dwStatus;
 }
 
@@ -719,15 +704,6 @@
   m_iReadyLineIndex = -1;
 }
 
-void CFX_TxtBreak::Reset() {
-  m_eCharType = FX_CHARTYPE_Unknown;
-  m_iArabicContext = 1;
-  m_iCurArabicContext = 1;
-  ResetArabicContext();
-  m_Line[0].Clear();
-  m_Line[1].Clear();
-}
-
 struct FX_FORMCHAR {
   uint16_t wch;
   uint16_t wForm;
diff --git a/xfa/fgas/layout/fgas_textbreak.h b/xfa/fgas/layout/fgas_textbreak.h
index 0fe4268..439a7ee 100644
--- a/xfa/fgas/layout/fgas_textbreak.h
+++ b/xfa/fgas/layout/fgas_textbreak.h
@@ -67,7 +67,7 @@
   int32_t CountBreakPieces() const;
   const CFX_BreakPiece* GetBreakPiece(int32_t index) const;
   void ClearBreakPieces();
-  void Reset();
+
   int32_t GetDisplayPos(const FX_TXTRUN* pTxtRun,
                         FXTEXT_CHARPOS* pCharPos,
                         bool bCharCode = false,
@@ -88,7 +88,6 @@
   CFX_Char* GetLastChar(int32_t index, bool bOmitChar = true) const;
   bool HasTxtLine() const { return m_iReadyLineIndex >= 0; }
   FX_CHARTYPE GetUnifiedCharType(FX_CHARTYPE dwType) const;
-  void ResetArabicContext() override;
   void ResetContextCharStyles();
   bool EndBreak_SplitLine(CFX_BreakLine* pNextLine, bool bAllChars);
   void EndBreak_BidiLine(std::deque<FX_TPO>* tpos, CFX_BreakType dwStatus);
@@ -103,12 +102,8 @@
                      CFX_BreakLine* pNextLine,
                      bool bAllChars = false);
 
-  int32_t m_iArabicContext;
-  int32_t m_iCurArabicContext;
   int32_t m_iAlignment;
-  uint32_t m_dwContextCharStyles;
   int32_t m_iCombWidth;
-  int32_t m_iCurAlignment;
 };
 
 #endif  // XFA_FGAS_LAYOUT_FGAS_TEXTBREAK_H_
