diff --git a/xfa/fde/cfde_texteditengine.cpp b/xfa/fde/cfde_texteditengine.cpp
index 0ff4e41..24192b7 100644
--- a/xfa/fde/cfde_texteditengine.cpp
+++ b/xfa/fde/cfde_texteditengine.cpp
@@ -1072,7 +1072,7 @@
 }
 
 void CFDE_TextEditEngine::RebuildPieces() {
-  text_break_.EndBreak(CFX_BreakType::kParagraph);
+  text_break_.EndBreak(CFX_Char::BreakType::kParagraph);
   text_break_.ClearBreakPieces();
 
   char_widths_.clear();
@@ -1091,10 +1091,10 @@
   while (!iter.IsEOF(false)) {
     iter.Next(false);
 
-    CFX_BreakType break_status = text_break_.AppendChar(
+    CFX_Char::BreakType break_status = text_break_.AppendChar(
         password_mode_ ? password_alias_ : iter.GetChar());
     if (iter.IsEOF(false) && CFX_BreakTypeNoneOrPiece(break_status))
-      break_status = text_break_.EndBreak(CFX_BreakType::kParagraph);
+      break_status = text_break_.EndBreak(CFX_Char::BreakType::kParagraph);
 
     if (CFX_BreakTypeNoneOrPiece(break_status))
       continue;
diff --git a/xfa/fde/cfde_textout.cpp b/xfa/fde/cfde_textout.cpp
index ce7a1d2..9c24ea3 100644
--- a/xfa/fde/cfde_textout.cpp
+++ b/xfa/fde/cfde_textout.cpp
@@ -213,7 +213,7 @@
   float fWidth = 0.0f;
   float fHeight = 0.0f;
   float fStartPos = pRect->right();
-  CFX_BreakType dwBreakStatus = CFX_BreakType::kNone;
+  CFX_Char::BreakType dwBreakStatus = CFX_Char::BreakType::kNone;
   bool break_char_is_set = false;
   for (const wchar_t& wch : str) {
     if (!break_char_is_set && (wch == L'\n' || wch == L'\r')) {
@@ -225,7 +225,7 @@
       RetrieveLineWidth(dwBreakStatus, &fStartPos, &fWidth, &fHeight);
   }
 
-  dwBreakStatus = m_pTxtBreak->EndBreak(CFX_BreakType::kParagraph);
+  dwBreakStatus = m_pTxtBreak->EndBreak(CFX_Char::BreakType::kParagraph);
   if (!CFX_BreakTypeNoneOrPiece(dwBreakStatus))
     RetrieveLineWidth(dwBreakStatus, &fStartPos, &fWidth, &fHeight);
 
@@ -244,7 +244,7 @@
     pRect->height -= m_fLineSpace - m_fFontSize;
 }
 
-bool CFDE_TextOut::RetrieveLineWidth(CFX_BreakType dwBreakStatus,
+bool CFDE_TextOut::RetrieveLineWidth(CFX_Char::BreakType dwBreakStatus,
                                      float* pStartPos,
                                      float* pWidth,
                                      float* pHeight) {
@@ -261,9 +261,9 @@
   }
   m_pTxtBreak->ClearBreakPieces();
 
-  if (dwBreakStatus == CFX_BreakType::kParagraph)
+  if (dwBreakStatus == CFX_Char::BreakType::kParagraph)
     m_pTxtBreak->Reset();
-  if (!m_Styles.line_wrap_ && dwBreakStatus == CFX_BreakType::kLine) {
+  if (!m_Styles.line_wrap_ && dwBreakStatus == CFX_Char::BreakType::kLine) {
     *pWidth += fLineWidth;
   } else {
     *pWidth = std::max(*pWidth, fLineWidth);
@@ -329,7 +329,7 @@
   m_fLinePos = rect.top;
   size_t start_char = 0;
   int32_t iPieceWidths = 0;
-  CFX_BreakType dwBreakStatus;
+  CFX_Char::BreakType dwBreakStatus;
   bool bRet = false;
   for (const auto& wch : str) {
     dwBreakStatus = m_pTxtBreak->AppendChar(wch);
@@ -338,9 +338,9 @@
 
     bool bEndofLine =
         RetrievePieces(dwBreakStatus, false, rect, &start_char, &iPieceWidths);
-    if (bEndofLine &&
-        (m_Styles.line_wrap_ || dwBreakStatus == CFX_BreakType::kParagraph ||
-         dwBreakStatus == CFX_BreakType::kPage)) {
+    if (bEndofLine && (m_Styles.line_wrap_ ||
+                       dwBreakStatus == CFX_Char::BreakType::kParagraph ||
+                       dwBreakStatus == CFX_Char::BreakType::kPage)) {
       iPieceWidths = 0;
       ++m_iCurLine;
       m_fLinePos += fLineStep;
@@ -353,7 +353,7 @@
     }
   }
 
-  dwBreakStatus = m_pTxtBreak->EndBreak(CFX_BreakType::kParagraph);
+  dwBreakStatus = m_pTxtBreak->EndBreak(CFX_Char::BreakType::kParagraph);
   if (!CFX_BreakTypeNoneOrPiece(dwBreakStatus) && !bRet)
     RetrievePieces(dwBreakStatus, false, rect, &start_char, &iPieceWidths);
 
@@ -361,7 +361,7 @@
   m_pTxtBreak->Reset();
 }
 
-bool CFDE_TextOut::RetrievePieces(CFX_BreakType dwBreakStatus,
+bool CFDE_TextOut::RetrievePieces(CFX_Char::BreakType dwBreakStatus,
                                   bool bReload,
                                   const CFX_RectF& rect,
                                   size_t* pStartChar,
@@ -411,7 +411,7 @@
   m_pTxtBreak->ClearBreakPieces();
 
   return m_Styles.single_line_ || m_Styles.line_wrap_ || bNeedReload ||
-         dwBreakStatus == CFX_BreakType::kParagraph;
+         dwBreakStatus == CFX_Char::BreakType::kParagraph;
 }
 
 void CFDE_TextOut::AppendPiece(const Piece& piece,
@@ -456,7 +456,7 @@
   size_t start_char = 0;
   size_t piece_count = line->GetSize();
   int32_t piece_widths = 0;
-  CFX_BreakType break_status = CFX_BreakType::kNone;
+  CFX_Char::BreakType break_status = CFX_Char::BreakType::kNone;
   for (size_t piece_index = 0; piece_index < piece_count; ++piece_index) {
     const Piece* piece = line->GetPieceAtIndex(piece_index);
     if (piece_index == 0) {
@@ -471,7 +471,7 @@
     }
   }
 
-  break_status = m_pTxtBreak->EndBreak(CFX_BreakType::kParagraph);
+  break_status = m_pTxtBreak->EndBreak(CFX_Char::BreakType::kParagraph);
   if (!CFX_BreakTypeNoneOrPiece(break_status))
     RetrievePieces(break_status, true, rect, &start_char, &piece_widths);
 
diff --git a/xfa/fde/cfde_textout.h b/xfa/fde/cfde_textout.h
index 70cb176..97f0d19 100644
--- a/xfa/fde/cfde_textout.h
+++ b/xfa/fde/cfde_textout.h
@@ -81,7 +81,7 @@
     std::deque<Piece> pieces_;
   };
 
-  bool RetrieveLineWidth(CFX_BreakType dwBreakStatus,
+  bool RetrieveLineWidth(CFX_Char::BreakType dwBreakStatus,
                          float* pStartPos,
                          float* pWidth,
                          float* pHeight);
@@ -89,7 +89,7 @@
 
   void Reload(const CFX_RectF& rect);
   void ReloadLinePiece(Line* pLine, const CFX_RectF& rect);
-  bool RetrievePieces(CFX_BreakType dwBreakStatus,
+  bool RetrievePieces(CFX_Char::BreakType dwBreakStatus,
                       bool bReload,
                       const CFX_RectF& rect,
                       size_t* pStartChar,
diff --git a/xfa/fgas/layout/cfx_break.cpp b/xfa/fgas/layout/cfx_break.cpp
index 2532725..39ed44c 100644
--- a/xfa/fgas/layout/cfx_break.cpp
+++ b/xfa/fgas/layout/cfx_break.cpp
@@ -75,8 +75,8 @@
     return;
 
   CFX_Char* tc = m_pCurLine->GetChar(m_pCurLine->m_LineChars.size() - 1);
-  if (tc->m_dwStatus == CFX_BreakType::kNone)
-    tc->m_dwStatus = CFX_BreakType::kPiece;
+  if (tc->m_dwStatus == CFX_Char::BreakType::kNone)
+    tc->m_dwStatus = CFX_Char::BreakType::kPiece;
 }
 
 bool CFX_Break::IsGreaterThanLineWidth(int32_t width) const {
diff --git a/xfa/fgas/layout/cfx_breakpiece.h b/xfa/fgas/layout/cfx_breakpiece.h
index a708bf1..a61b764 100644
--- a/xfa/fgas/layout/cfx_breakpiece.h
+++ b/xfa/fgas/layout/cfx_breakpiece.h
@@ -29,7 +29,7 @@
   WideString GetString() const;
   std::vector<int32_t> GetWidths() const;
 
-  CFX_BreakType m_dwStatus = CFX_BreakType::kPiece;
+  CFX_Char::BreakType m_dwStatus = CFX_Char::BreakType::kPiece;
   int32_t m_iStartPos = 0;
   int32_t m_iWidth = -1;
   int32_t m_iStartChar = 0;
diff --git a/xfa/fgas/layout/cfx_char.h b/xfa/fgas/layout/cfx_char.h
index deca8e9..3e26a62 100644
--- a/xfa/fgas/layout/cfx_char.h
+++ b/xfa/fgas/layout/cfx_char.h
@@ -16,16 +16,16 @@
 #include "xfa/fgas/layout/cfx_textuserdata.h"
 #include "xfa/fgas/layout/fx_linebreak.h"
 
-enum class CFX_BreakType : uint8_t {
-  kNone = 0,
-  kPiece,
-  kLine,
-  kParagraph,
-  kPage
-};
-
 class CFX_Char {
  public:
+  enum class BreakType : uint8_t {
+    kNone = 0,
+    kPiece,
+    kLine,
+    kParagraph,
+    kPage
+  };
+
   static void BidiLine(std::vector<CFX_Char>* chars, size_t iCount);
 
   explicit CFX_Char(uint16_t wCharCode);
@@ -36,12 +36,11 @@
   ~CFX_Char();
 
   FX_CHARTYPE GetCharType() const;
-
   uint16_t char_code() const { return m_wCharCode; }
   int16_t horizonal_scale() const { return m_iHorizontalScale; }
   int16_t vertical_scale() const { return m_iVerticalScale; }
 
-  CFX_BreakType m_dwStatus = CFX_BreakType::kNone;
+  BreakType m_dwStatus = BreakType::kNone;
   FX_BIDICLASS m_iBidiClass = FX_BIDICLASS::kON;
   FX_LINEBREAKTYPE m_eLineBreakType = FX_LINEBREAKTYPE::kUNKNOWN;
   uint32_t m_dwCharStyles = 0;
diff --git a/xfa/fgas/layout/cfx_rtfbreak.cpp b/xfa/fgas/layout/cfx_rtfbreak.cpp
index 2f94768..fdc14d8 100644
--- a/xfa/fgas/layout/cfx_rtfbreak.cpp
+++ b/xfa/fgas/layout/cfx_rtfbreak.cpp
@@ -68,7 +68,7 @@
   return true;
 }
 
-CFX_BreakType CFX_RTFBreak::AppendChar(wchar_t wch) {
+CFX_Char::BreakType CFX_RTFBreak::AppendChar(wchar_t wch) {
   DCHECK(m_pCurLine);
 
   FX_CHARTYPE chartype = FX_GetCharType(wch);
@@ -79,19 +79,19 @@
   pCurChar->m_dwIdentity = m_dwIdentity;
   pCurChar->m_pUserData = m_pUserData;
 
-  CFX_BreakType dwRet1 = CFX_BreakType::kNone;
+  CFX_Char::BreakType dwRet1 = CFX_Char::BreakType::kNone;
   if (chartype != FX_CHARTYPE::kCombination &&
       GetUnifiedCharType(m_eCharType) != GetUnifiedCharType(chartype) &&
       m_eCharType != FX_CHARTYPE::kUnknown &&
       IsGreaterThanLineWidth(m_pCurLine->GetLineEnd()) &&
       (m_eCharType != FX_CHARTYPE::kSpace ||
        chartype != FX_CHARTYPE::kControl)) {
-    dwRet1 = EndBreak(CFX_BreakType::kLine);
+    dwRet1 = EndBreak(CFX_Char::BreakType::kLine);
     if (!m_pCurLine->m_LineChars.empty())
       pCurChar = &m_pCurLine->m_LineChars.back();
   }
 
-  CFX_BreakType dwRet2 = CFX_BreakType::kNone;
+  CFX_Char::BreakType dwRet2 = CFX_Char::BreakType::kNone;
   switch (chartype) {
     case FX_CHARTYPE::kTab:
       AppendChar_Tab(pCurChar);
@@ -173,31 +173,31 @@
   iLineWidth += iCharWidth;
 }
 
-CFX_BreakType CFX_RTFBreak::AppendChar_Control(CFX_Char* pCurChar) {
-  CFX_BreakType dwRet2 = CFX_BreakType::kNone;
+CFX_Char::BreakType CFX_RTFBreak::AppendChar_Control(CFX_Char* pCurChar) {
+  CFX_Char::BreakType dwRet2 = CFX_Char::BreakType::kNone;
   switch (pCurChar->char_code()) {
     case L'\v':
     case 0x2028:
-      dwRet2 = CFX_BreakType::kLine;
+      dwRet2 = CFX_Char::BreakType::kLine;
       break;
     case L'\f':
-      dwRet2 = CFX_BreakType::kPage;
+      dwRet2 = CFX_Char::BreakType::kPage;
       break;
     case 0x2029:
-      dwRet2 = CFX_BreakType::kParagraph;
+      dwRet2 = CFX_Char::BreakType::kParagraph;
       break;
     default:
       if (pCurChar->char_code() == m_wParagraphBreakChar)
-        dwRet2 = CFX_BreakType::kParagraph;
+        dwRet2 = CFX_Char::BreakType::kParagraph;
       break;
   }
-  if (dwRet2 != CFX_BreakType::kNone)
+  if (dwRet2 != CFX_Char::BreakType::kNone)
     dwRet2 = EndBreak(dwRet2);
 
   return dwRet2;
 }
 
-CFX_BreakType CFX_RTFBreak::AppendChar_Arabic(CFX_Char* pCurChar) {
+CFX_Char::BreakType CFX_RTFBreak::AppendChar_Arabic(CFX_Char* pCurChar) {
   m_pCurLine->IncrementArabicCharCount();
 
   CFX_Char* pLastChar = nullptr;
@@ -232,7 +232,7 @@
       FX_SAFE_INT32 checked_width = m_pCurLine->m_iWidth;
       checked_width += iCharWidthValid;
       if (!checked_width.IsValid())
-        return CFX_BreakType::kNone;
+        return CFX_Char::BreakType::kNone;
 
       m_pCurLine->m_iWidth = checked_width.ValueOrDie();
       iCharWidth = 0;
@@ -261,16 +261,16 @@
   FX_SAFE_INT32 checked_width = m_pCurLine->m_iWidth;
   checked_width += iCharWidthValid;
   if (!checked_width.IsValid())
-    return CFX_BreakType::kNone;
+    return CFX_Char::BreakType::kNone;
 
   m_pCurLine->m_iWidth = checked_width.ValueOrDie();
 
   if (IsGreaterThanLineWidth(m_pCurLine->GetLineEnd()))
-    return EndBreak(CFX_BreakType::kLine);
-  return CFX_BreakType::kNone;
+    return EndBreak(CFX_Char::BreakType::kLine);
+  return CFX_Char::BreakType::kNone;
 }
 
-CFX_BreakType CFX_RTFBreak::AppendChar_Others(CFX_Char* pCurChar) {
+CFX_Char::BreakType CFX_RTFBreak::AppendChar_Others(CFX_Char* pCurChar) {
   FX_CHARTYPE chartype = pCurChar->GetCharType();
   wchar_t wForm = pCurChar->char_code();
   FX_SAFE_INT32 iCharWidth;
@@ -291,41 +291,41 @@
   FX_SAFE_INT32 checked_width = m_pCurLine->m_iWidth;
   checked_width += iCharWidthValid;
   if (!checked_width.IsValid())
-    return CFX_BreakType::kNone;
+    return CFX_Char::BreakType::kNone;
 
   m_pCurLine->m_iWidth = checked_width.ValueOrDie();
   if (chartype != FX_CHARTYPE::kSpace &&
       IsGreaterThanLineWidth(m_pCurLine->GetLineEnd())) {
-    return EndBreak(CFX_BreakType::kLine);
+    return EndBreak(CFX_Char::BreakType::kLine);
   }
-  return CFX_BreakType::kNone;
+  return CFX_Char::BreakType::kNone;
 }
 
-CFX_BreakType CFX_RTFBreak::EndBreak(CFX_BreakType dwStatus) {
-  DCHECK(dwStatus != CFX_BreakType::kNone);
+CFX_Char::BreakType CFX_RTFBreak::EndBreak(CFX_Char::BreakType dwStatus) {
+  DCHECK(dwStatus != CFX_Char::BreakType::kNone);
 
   ++m_dwIdentity;
   if (!m_pCurLine->m_LinePieces.empty()) {
-    if (dwStatus != CFX_BreakType::kPiece)
+    if (dwStatus != CFX_Char::BreakType::kPiece)
       m_pCurLine->m_LinePieces.back().m_dwStatus = dwStatus;
     return m_pCurLine->m_LinePieces.back().m_dwStatus;
   }
 
   if (HasLine()) {
     if (m_Lines[m_iReadyLineIndex].m_LinePieces.empty())
-      return CFX_BreakType::kNone;
+      return CFX_Char::BreakType::kNone;
 
-    if (dwStatus != CFX_BreakType::kPiece)
+    if (dwStatus != CFX_Char::BreakType::kPiece)
       m_Lines[m_iReadyLineIndex].m_LinePieces.back().m_dwStatus = dwStatus;
     return m_Lines[m_iReadyLineIndex].m_LinePieces.back().m_dwStatus;
   }
 
   if (m_pCurLine->m_LineChars.empty())
-    return CFX_BreakType::kNone;
+    return CFX_Char::BreakType::kNone;
 
   CFX_Char* tc = m_pCurLine->GetChar(m_pCurLine->m_LineChars.size() - 1);
   tc->m_dwStatus = dwStatus;
-  if (dwStatus == CFX_BreakType::kPiece)
+  if (dwStatus == CFX_Char::BreakType::kPiece)
     return dwStatus;
 
   m_iReadyLineIndex = m_pCurLine == &m_Lines[0] ? 0 : 1;
@@ -349,7 +349,7 @@
 
 bool CFX_RTFBreak::EndBreak_SplitLine(CFX_BreakLine* pNextLine,
                                       bool bAllChars,
-                                      CFX_BreakType dwStatus) {
+                                      CFX_Char::BreakType dwStatus) {
   bool bDone = false;
   if (IsGreaterThanLineWidth(m_pCurLine->GetLineEnd())) {
     const CFX_Char* tc =
@@ -398,7 +398,7 @@
       bNew = false;
     }
 
-    if (i == iLast || pTC->m_dwStatus != CFX_BreakType::kNone ||
+    if (i == iLast || pTC->m_dwStatus != CFX_Char::BreakType::kNone ||
         pTC->m_dwIdentity != dwIdentity) {
       tp.m_iCharCount = i - j;
       if (pTC->m_dwIdentity == dwIdentity) {
@@ -418,7 +418,7 @@
 }
 
 void CFX_RTFBreak::EndBreak_BidiLine(std::deque<FX_TPO>* tpos,
-                                     CFX_BreakType dwStatus) {
+                                     CFX_Char::BreakType dwStatus) {
   CFX_Char* pTC;
   std::vector<CFX_Char>& chars = m_pCurLine->m_LineChars;
   if (!m_bPagination && m_pCurLine->HasArabicChar()) {
@@ -442,7 +442,7 @@
   }
 
   CFX_BreakPiece tp;
-  tp.m_dwStatus = CFX_BreakType::kPiece;
+  tp.m_dwStatus = CFX_Char::BreakType::kPiece;
   tp.m_iStartPos = m_pCurLine->m_iStart;
   tp.m_pChars = &chars;
 
@@ -467,7 +467,7 @@
       dwIdentity = pTC->m_dwIdentity;
       tp.m_dwIdentity = dwIdentity;
       tp.m_pUserData = pTC->m_pUserData;
-      tp.m_dwStatus = CFX_BreakType::kPiece;
+      tp.m_dwStatus = CFX_Char::BreakType::kPiece;
       ++i;
     } else if (iBidiLevel != pTC->m_iBidiLevel ||
                pTC->m_dwIdentity != dwIdentity) {
@@ -509,7 +509,7 @@
 
 void CFX_RTFBreak::EndBreak_Alignment(const std::deque<FX_TPO>& tpos,
                                       bool bAllChars,
-                                      CFX_BreakType dwStatus) {
+                                      CFX_Char::BreakType dwStatus) {
   int32_t iNetWidth = m_pCurLine->m_iWidth;
   int32_t iGapChars = 0;
   bool bFind = false;
@@ -549,7 +549,7 @@
   int32_t iOffset = m_iLineWidth - iNetWidth;
   if (iGapChars > 0 && (m_iAlignment == CFX_RTFLineAlignment::Distributed ||
                         (m_iAlignment == CFX_RTFLineAlignment::Justified &&
-                         dwStatus != CFX_BreakType::kParagraph))) {
+                         dwStatus != CFX_Char::BreakType::kParagraph))) {
     int32_t iStart = -1;
     for (const auto& tpo : tpos) {
       CFX_BreakPiece& ttp = m_pCurLine->m_LinePieces[tpo.index];
@@ -715,7 +715,7 @@
       pCurLine->DecrementArabicCharCount();
       pNextLine->IncrementArabicCharCount();
     }
-    pNextLine->m_LineChars[i].m_dwStatus = CFX_BreakType::kNone;
+    pNextLine->m_LineChars[i].m_dwStatus = CFX_Char::BreakType::kNone;
   }
 }
 
diff --git a/xfa/fgas/layout/cfx_rtfbreak.h b/xfa/fgas/layout/cfx_rtfbreak.h
index e056b61..6d2475c 100644
--- a/xfa/fgas/layout/cfx_rtfbreak.h
+++ b/xfa/fgas/layout/cfx_rtfbreak.h
@@ -39,19 +39,19 @@
 
   void AddPositionedTab(float fTabPos);
 
-  CFX_BreakType EndBreak(CFX_BreakType dwStatus);
+  CFX_Char::BreakType EndBreak(CFX_Char::BreakType dwStatus);
 
   size_t GetDisplayPos(const CFX_TextPiece* pPiece,
                        std::vector<TextCharPos>* pCharPos) const;
 
-  CFX_BreakType AppendChar(wchar_t wch);
+  CFX_Char::BreakType AppendChar(wchar_t wch);
 
  private:
   void AppendChar_Combination(CFX_Char* pCurChar);
   void AppendChar_Tab(CFX_Char* pCurChar);
-  CFX_BreakType AppendChar_Control(CFX_Char* pCurChar);
-  CFX_BreakType AppendChar_Arabic(CFX_Char* pCurChar);
-  CFX_BreakType AppendChar_Others(CFX_Char* pCurChar);
+  CFX_Char::BreakType AppendChar_Control(CFX_Char* pCurChar);
+  CFX_Char::BreakType AppendChar_Arabic(CFX_Char* pCurChar);
+  CFX_Char::BreakType AppendChar_Others(CFX_Char* pCurChar);
   bool GetPositionedTab(int32_t* iTabPos) const;
 
   int32_t GetBreakPos(std::vector<CFX_Char>& tca,
@@ -63,11 +63,12 @@
                      bool bAllChars);
   bool EndBreak_SplitLine(CFX_BreakLine* pNextLine,
                           bool bAllChars,
-                          CFX_BreakType dwStatus);
-  void EndBreak_BidiLine(std::deque<FX_TPO>* tpos, CFX_BreakType dwStatus);
+                          CFX_Char::BreakType dwStatus);
+  void EndBreak_BidiLine(std::deque<FX_TPO>* tpos,
+                         CFX_Char::BreakType dwStatus);
   void EndBreak_Alignment(const std::deque<FX_TPO>& tpos,
                           bool bAllChars,
-                          CFX_BreakType dwStatus);
+                          CFX_Char::BreakType dwStatus);
 
   bool m_bPagination;
   std::vector<int32_t> m_PositionedTabs;
diff --git a/xfa/fgas/layout/cfx_rtfbreak_unittest.cpp b/xfa/fgas/layout/cfx_rtfbreak_unittest.cpp
index 4261a43..b300cd8 100644
--- a/xfa/fgas/layout/cfx_rtfbreak_unittest.cpp
+++ b/xfa/fgas/layout/cfx_rtfbreak_unittest.cpp
@@ -41,9 +41,9 @@
 
   WideString str(L"Input String.");
   for (wchar_t ch : str)
-    EXPECT_EQ(CFX_BreakType::kNone, rtf_break->AppendChar(ch));
+    EXPECT_EQ(CFX_Char::BreakType::kNone, rtf_break->AppendChar(ch));
 
-  EXPECT_EQ(CFX_BreakType::kParagraph, rtf_break->AppendChar(L'\n'));
+  EXPECT_EQ(CFX_Char::BreakType::kParagraph, rtf_break->AppendChar(L'\n'));
   ASSERT_EQ(1, rtf_break->CountBreakPieces());
   EXPECT_EQ(str + L"\n", rtf_break->GetBreakPieceUnstable(0)->GetString());
 
@@ -53,22 +53,22 @@
 
   str = L"Second str.";
   for (wchar_t ch : str)
-    EXPECT_EQ(CFX_BreakType::kNone, rtf_break->AppendChar(ch));
+    EXPECT_EQ(CFX_Char::BreakType::kNone, rtf_break->AppendChar(ch));
 
   // Force the end of the break at the end of the string.
-  rtf_break->EndBreak(CFX_BreakType::kParagraph);
+  rtf_break->EndBreak(CFX_Char::BreakType::kParagraph);
   ASSERT_EQ(1, rtf_break->CountBreakPieces());
   EXPECT_EQ(str, rtf_break->GetBreakPieceUnstable(0)->GetString());
 }
 
 TEST_F(CFX_RTFBreakTest, ControlCharacters) {
   auto rtf_break = CreateBreak(FX_LAYOUTSTYLE_ExpandTab);
-  EXPECT_EQ(CFX_BreakType::kLine, rtf_break->AppendChar(L'\v'));
-  EXPECT_EQ(CFX_BreakType::kPage, rtf_break->AppendChar(L'\f'));
+  EXPECT_EQ(CFX_Char::BreakType::kLine, rtf_break->AppendChar(L'\v'));
+  EXPECT_EQ(CFX_Char::BreakType::kPage, rtf_break->AppendChar(L'\f'));
   const wchar_t kUnicodeParagraphSeparator = 0x2029;
-  EXPECT_EQ(CFX_BreakType::kParagraph,
+  EXPECT_EQ(CFX_Char::BreakType::kParagraph,
             rtf_break->AppendChar(kUnicodeParagraphSeparator));
-  EXPECT_EQ(CFX_BreakType::kParagraph, rtf_break->AppendChar(L'\n'));
+  EXPECT_EQ(CFX_Char::BreakType::kParagraph, rtf_break->AppendChar(L'\n'));
 
   ASSERT_EQ(1, rtf_break->CountBreakPieces());
   EXPECT_EQ(L"\v", rtf_break->GetBreakPieceUnstable(0)->GetString());
diff --git a/xfa/fgas/layout/cfx_txtbreak.cpp b/xfa/fgas/layout/cfx_txtbreak.cpp
index 5565518..3de42fc 100644
--- a/xfa/fgas/layout/cfx_txtbreak.cpp
+++ b/xfa/fgas/layout/cfx_txtbreak.cpp
@@ -101,34 +101,34 @@
   m_eCharType = FX_CHARTYPE::kTab;
 }
 
-CFX_BreakType CFX_TxtBreak::AppendChar_Control(CFX_Char* pCurChar) {
+CFX_Char::BreakType CFX_TxtBreak::AppendChar_Control(CFX_Char* pCurChar) {
   m_eCharType = FX_CHARTYPE::kControl;
-  CFX_BreakType dwRet = CFX_BreakType::kNone;
+  CFX_Char::BreakType dwRet = CFX_Char::BreakType::kNone;
   if (!m_bSingleLine) {
     wchar_t wch = pCurChar->char_code();
     switch (wch) {
       case L'\v':
       case 0x2028:
-        dwRet = CFX_BreakType::kLine;
+        dwRet = CFX_Char::BreakType::kLine;
         break;
       case L'\f':
-        dwRet = CFX_BreakType::kPage;
+        dwRet = CFX_Char::BreakType::kPage;
         break;
       case 0x2029:
-        dwRet = CFX_BreakType::kParagraph;
+        dwRet = CFX_Char::BreakType::kParagraph;
         break;
       default:
         if (wch == m_wParagraphBreakChar)
-          dwRet = CFX_BreakType::kParagraph;
+          dwRet = CFX_Char::BreakType::kParagraph;
         break;
     }
-    if (dwRet != CFX_BreakType::kNone)
+    if (dwRet != CFX_Char::BreakType::kNone)
       dwRet = EndBreak(dwRet);
   }
   return dwRet;
 }
 
-CFX_BreakType CFX_TxtBreak::AppendChar_Arabic(CFX_Char* pCurChar) {
+CFX_Char::BreakType CFX_TxtBreak::AppendChar_Arabic(CFX_Char* pCurChar) {
   FX_CHARTYPE chartype = pCurChar->GetCharType();
   int32_t& iLineWidth = m_pCurLine->m_iWidth;
   wchar_t wForm;
@@ -191,11 +191,11 @@
 
   m_pCurLine->IncrementArabicCharCount();
   if (!m_bSingleLine && IsGreaterThanLineWidth(iLineWidth))
-    return EndBreak(CFX_BreakType::kLine);
-  return CFX_BreakType::kNone;
+    return EndBreak(CFX_Char::BreakType::kLine);
+  return CFX_Char::BreakType::kNone;
 }
 
-CFX_BreakType CFX_TxtBreak::AppendChar_Others(CFX_Char* pCurChar) {
+CFX_Char::BreakType CFX_TxtBreak::AppendChar_Others(CFX_Char* pCurChar) {
   FX_CHARTYPE chartype = pCurChar->GetCharType();
   int32_t& iLineWidth = m_pCurLine->m_iWidth;
   FX_SAFE_INT32 iCharWidth = 0;
@@ -224,37 +224,37 @@
   iLineWidth += iCharWidthValid;
   if (!m_bSingleLine && chartype != FX_CHARTYPE::kSpace &&
       IsGreaterThanLineWidth(iLineWidth)) {
-    return EndBreak(CFX_BreakType::kLine);
+    return EndBreak(CFX_Char::BreakType::kLine);
   }
 
-  return CFX_BreakType::kNone;
+  return CFX_Char::BreakType::kNone;
 }
 
-CFX_BreakType CFX_TxtBreak::AppendChar(wchar_t wch) {
+CFX_Char::BreakType CFX_TxtBreak::AppendChar(wchar_t wch) {
   FX_CHARTYPE chartype = FX_GetCharType(wch);
   m_pCurLine->m_LineChars.emplace_back(wch, m_iHorizontalScale,
                                        m_iVerticalScale);
   CFX_Char* pCurChar = &m_pCurLine->m_LineChars.back();
   pCurChar->m_dwCharStyles = m_iAlignment | (1 << 8);
 
-  CFX_BreakType dwRet1 = CFX_BreakType::kNone;
+  CFX_Char::BreakType dwRet1 = CFX_Char::BreakType::kNone;
   if (chartype != FX_CHARTYPE::kCombination &&
       GetUnifiedCharType(m_eCharType) != GetUnifiedCharType(chartype) &&
       m_eCharType != FX_CHARTYPE::kUnknown && !m_bSingleLine &&
       IsGreaterThanLineWidth(m_pCurLine->m_iWidth) &&
       (m_eCharType != FX_CHARTYPE::kSpace ||
        chartype != FX_CHARTYPE::kControl)) {
-    dwRet1 = EndBreak(CFX_BreakType::kLine);
+    dwRet1 = EndBreak(CFX_Char::BreakType::kLine);
     if (!m_pCurLine->m_LineChars.empty())
       pCurChar = &m_pCurLine->m_LineChars.back();
   }
 
-  CFX_BreakType dwRet2 = CFX_BreakType::kNone;
+  CFX_Char::BreakType dwRet2 = CFX_Char::BreakType::kNone;
   if (wch == m_wParagraphBreakChar) {
     // This is handled in AppendChar_Control, but it seems like \n and \r
     // don't get matched as control characters so we go into AppendChar_other
     // and never detect the new paragraph ...
-    dwRet2 = CFX_BreakType::kParagraph;
+    dwRet2 = CFX_Char::BreakType::kParagraph;
     EndBreak(dwRet2);
   } else {
     switch (chartype) {
@@ -311,7 +311,7 @@
 }
 
 void CFX_TxtBreak::EndBreak_BidiLine(std::deque<FX_TPO>* tpos,
-                                     CFX_BreakType dwStatus) {
+                                     CFX_Char::BreakType dwStatus) {
   CFX_BreakPiece tp;
   FX_TPO tpo;
   CFX_Char* pTC;
@@ -343,7 +343,7 @@
   }
   CFX_Char::BidiLine(&chars, iBidiNum + 1);
 
-  tp.m_dwStatus = CFX_BreakType::kPiece;
+  tp.m_dwStatus = CFX_Char::BreakType::kPiece;
   tp.m_iStartPos = m_pCurLine->m_iStart;
   tp.m_pChars = &m_pCurLine->m_LineChars;
   int32_t iBidiLevel = -1;
@@ -361,10 +361,10 @@
       tp.m_dwCharStyles = pTC->m_dwCharStyles;
       tp.m_iHorizontalScale = pTC->horizonal_scale();
       tp.m_iVerticalScale = pTC->vertical_scale();
-      tp.m_dwStatus = CFX_BreakType::kPiece;
+      tp.m_dwStatus = CFX_Char::BreakType::kPiece;
     }
     if (iBidiLevel != pTC->m_iBidiLevel ||
-        pTC->m_dwStatus != CFX_BreakType::kNone) {
+        pTC->m_dwStatus != CFX_Char::BreakType::kNone) {
       if (iBidiLevel == pTC->m_iBidiLevel) {
         tp.m_dwStatus = pTC->m_dwStatus;
         iCharWidth = pTC->m_iCharWidth;
@@ -414,7 +414,7 @@
 
 void CFX_TxtBreak::EndBreak_Alignment(const std::deque<FX_TPO>& tpos,
                                       bool bAllChars,
-                                      CFX_BreakType dwStatus) {
+                                      CFX_Char::BreakType dwStatus) {
   int32_t iNetWidth = m_pCurLine->m_iWidth;
   int32_t iGapChars = 0;
   bool bFind = false;
@@ -449,7 +449,7 @@
 
   int32_t iOffset = m_iLineWidth - iNetWidth;
   if (iGapChars > 0 && m_iAlignment & CFX_TxtLineAlignment_Justified &&
-      dwStatus != CFX_BreakType::kParagraph) {
+      dwStatus != CFX_Char::BreakType::kParagraph) {
     int32_t iStart = -1;
     for (auto& tpo : tpos) {
       CFX_BreakPiece& ttp = m_pCurLine->m_LinePieces[tpo.index];
@@ -485,29 +485,29 @@
   }
 }
 
-CFX_BreakType CFX_TxtBreak::EndBreak(CFX_BreakType dwStatus) {
-  DCHECK(dwStatus != CFX_BreakType::kNone);
+CFX_Char::BreakType CFX_TxtBreak::EndBreak(CFX_Char::BreakType dwStatus) {
+  DCHECK(dwStatus != CFX_Char::BreakType::kNone);
 
   if (!m_pCurLine->m_LinePieces.empty()) {
-    if (dwStatus != CFX_BreakType::kPiece)
+    if (dwStatus != CFX_Char::BreakType::kPiece)
       m_pCurLine->m_LinePieces.back().m_dwStatus = dwStatus;
     return m_pCurLine->m_LinePieces.back().m_dwStatus;
   }
 
   if (HasLine()) {
     if (m_Lines[m_iReadyLineIndex].m_LinePieces.empty())
-      return CFX_BreakType::kNone;
+      return CFX_Char::BreakType::kNone;
 
-    if (dwStatus != CFX_BreakType::kPiece)
+    if (dwStatus != CFX_Char::BreakType::kPiece)
       m_Lines[m_iReadyLineIndex].m_LinePieces.back().m_dwStatus = dwStatus;
     return m_Lines[m_iReadyLineIndex].m_LinePieces.back().m_dwStatus;
   }
 
   if (m_pCurLine->m_LineChars.empty())
-    return CFX_BreakType::kNone;
+    return CFX_Char::BreakType::kNone;
 
   m_pCurLine->m_LineChars.back().m_dwStatus = dwStatus;
-  if (dwStatus == CFX_BreakType::kPiece)
+  if (dwStatus == CFX_Char::BreakType::kPiece)
     return dwStatus;
 
   m_iReadyLineIndex = m_pCurLine == &m_Lines[0] ? 0 : 1;
@@ -648,7 +648,7 @@
       pNextLine->IncrementArabicCharCount();
     }
     iWidth += std::max(0, pNextLine->m_LineChars[i].m_iCharWidth);
-    pNextLine->m_LineChars[i].m_dwStatus = CFX_BreakType::kNone;
+    pNextLine->m_LineChars[i].m_dwStatus = CFX_Char::BreakType::kNone;
   }
   pNextLine->m_iWidth = iWidth;
 }
diff --git a/xfa/fgas/layout/cfx_txtbreak.h b/xfa/fgas/layout/cfx_txtbreak.h
index ba9e6e9..81e157d 100644
--- a/xfa/fgas/layout/cfx_txtbreak.h
+++ b/xfa/fgas/layout/cfx_txtbreak.h
@@ -27,8 +27,9 @@
   CFX_TxtLineAlignment_Justified = 1 << 2
 };
 
-inline bool CFX_BreakTypeNoneOrPiece(CFX_BreakType type) {
-  return type == CFX_BreakType::kNone || type == CFX_BreakType::kPiece;
+inline bool CFX_BreakTypeNoneOrPiece(CFX_Char::BreakType type) {
+  return type == CFX_Char::BreakType::kNone ||
+         type == CFX_Char::BreakType::kPiece;
 }
 
 class CFX_TxtBreak final : public CFX_Break {
@@ -68,25 +69,26 @@
   void SetLineWidth(float fLineWidth);
   void SetAlignment(int32_t iAlignment);
   void SetCombWidth(float fCombWidth);
-  CFX_BreakType EndBreak(CFX_BreakType dwStatus);
+  CFX_Char::BreakType EndBreak(CFX_Char::BreakType dwStatus);
 
   size_t GetDisplayPos(const Run* pTxtRun, TextCharPos* pCharPos) const;
   std::vector<CFX_RectF> GetCharRects(const Run* pTxtRun, bool bCharBBox) const;
-  CFX_BreakType AppendChar(wchar_t wch);
+  CFX_Char::BreakType AppendChar(wchar_t wch);
 
  private:
   void AppendChar_Combination(CFX_Char* pCurChar);
   void AppendChar_Tab(CFX_Char* pCurChar);
-  CFX_BreakType AppendChar_Control(CFX_Char* pCurChar);
-  CFX_BreakType AppendChar_Arabic(CFX_Char* pCurChar);
-  CFX_BreakType AppendChar_Others(CFX_Char* pCurChar);
+  CFX_Char::BreakType AppendChar_Control(CFX_Char* pCurChar);
+  CFX_Char::BreakType AppendChar_Arabic(CFX_Char* pCurChar);
+  CFX_Char::BreakType AppendChar_Others(CFX_Char* pCurChar);
 
   void ResetContextCharStyles();
   void EndBreak_SplitLine(CFX_BreakLine* pNextLine, bool bAllChars);
-  void EndBreak_BidiLine(std::deque<FX_TPO>* tpos, CFX_BreakType dwStatus);
+  void EndBreak_BidiLine(std::deque<FX_TPO>* tpos,
+                         CFX_Char::BreakType dwStatus);
   void EndBreak_Alignment(const std::deque<FX_TPO>& tpos,
                           bool bAllChars,
-                          CFX_BreakType dwStatus);
+                          CFX_Char::BreakType dwStatus);
   int32_t GetBreakPos(std::vector<CFX_Char>* pChars,
                       bool bAllChars,
                       bool bOnlyBrk,
diff --git a/xfa/fxfa/cxfa_textlayout.cpp b/xfa/fxfa/cxfa_textlayout.cpp
index e6a1135..3904e34 100644
--- a/xfa/fxfa/cxfa_textlayout.cpp
+++ b/xfa/fxfa/cxfa_textlayout.cpp
@@ -722,7 +722,7 @@
   if (bRet && m_pLoader)
     m_pLoader->pNode = pNode;
   else
-    EndBreak(CFX_BreakType::kParagraph, pLinePos, bSavePieces);
+    EndBreak(CFX_Char::BreakType::kParagraph, pLinePos, bSavePieces);
 }
 
 bool CXFA_TextLayout::LoadRichText(
@@ -874,7 +874,7 @@
         m_pLoader->bFilterSpace = true;
     }
     if (bCurLi)
-      EndBreak(CFX_BreakType::kLine, pLinePos, bSavePieces);
+      EndBreak(CFX_Char::BreakType::kLine, pLinePos, bSavePieces);
   } else {
     if (pContext)
       eDisplay = pContext->GetDisplay();
@@ -883,9 +883,9 @@
   if (!pContext || bContentNode)
     return true;
 
-  CFX_BreakType dwStatus = (eDisplay == CFX_CSSDisplay::Block)
-                               ? CFX_BreakType::kParagraph
-                               : CFX_BreakType::kPiece;
+  CFX_Char::BreakType dwStatus = (eDisplay == CFX_CSSDisplay::Block)
+                                     ? CFX_Char::BreakType::kParagraph
+                                     : CFX_Char::BreakType::kPiece;
   EndBreak(dwStatus, pLinePos, bSavePieces);
   if (eDisplay == CFX_CSSDisplay::Block) {
     *pLinePos += fSpaceBelow;
@@ -906,7 +906,7 @@
                                  float* pLinePos,
                                  float fSpaceAbove,
                                  bool bSavePieces) {
-  CFX_BreakType dwStatus = CFX_BreakType::kNone;
+  CFX_Char::BreakType dwStatus = CFX_Char::BreakType::kNone;
   int32_t iChar = 0;
   if (m_pLoader)
     iChar = m_pLoader->iChar;
@@ -918,14 +918,15 @@
       wch = 0x20;
 
     dwStatus = m_pBreak->AppendChar(wch);
-    if (dwStatus != CFX_BreakType::kNone && dwStatus != CFX_BreakType::kPiece) {
+    if (dwStatus != CFX_Char::BreakType::kNone &&
+        dwStatus != CFX_Char::BreakType::kPiece) {
       AppendTextLine(dwStatus, pLinePos, bSavePieces, false);
       if (IsEnd(bSavePieces)) {
         if (m_pLoader)
           m_pLoader->iChar = i;
         return true;
       }
-      if (dwStatus == CFX_BreakType::kParagraph && m_bRichText)
+      if (dwStatus == CFX_Char::BreakType::kParagraph && m_bRichText)
         *pLinePos += fSpaceAbove;
     }
   }
@@ -943,11 +944,12 @@
   return false;
 }
 
-void CXFA_TextLayout::EndBreak(CFX_BreakType dwStatus,
+void CXFA_TextLayout::EndBreak(CFX_Char::BreakType dwStatus,
                                float* pLinePos,
                                bool bSavePieces) {
   dwStatus = m_pBreak->EndBreak(dwStatus);
-  if (dwStatus != CFX_BreakType::kNone && dwStatus != CFX_BreakType::kPiece)
+  if (dwStatus != CFX_Char::BreakType::kNone &&
+      dwStatus != CFX_Char::BreakType::kPiece)
     AppendTextLine(dwStatus, pLinePos, bSavePieces, true);
 }
 
@@ -1006,7 +1008,7 @@
   }
 }
 
-void CXFA_TextLayout::AppendTextLine(CFX_BreakType dwStatus,
+void CXFA_TextLayout::AppendTextLine(CFX_Char::BreakType dwStatus,
                                      float* pLinePos,
                                      bool bSavePieces,
                                      bool bEndBreak) {
@@ -1110,7 +1112,7 @@
   }
 
   m_pBreak->ClearBreakPieces();
-  if (dwStatus == CFX_BreakType::kParagraph) {
+  if (dwStatus == CFX_Char::BreakType::kParagraph) {
     m_pBreak->Reset();
     if (!pStyle && bEndBreak) {
       CXFA_Para* para = m_pTextProvider->GetParaIfExists();
diff --git a/xfa/fxfa/cxfa_textlayout.h b/xfa/fxfa/cxfa_textlayout.h
index 7264ebd..398bb0b 100644
--- a/xfa/fxfa/cxfa_textlayout.h
+++ b/xfa/fxfa/cxfa_textlayout.h
@@ -147,11 +147,11 @@
                   float* pLinePos,
                   float fSpaceAbove,
                   bool bSavePieces);
-  void AppendTextLine(CFX_BreakType dwStatus,
+  void AppendTextLine(CFX_Char::BreakType dwStatus,
                       float* pLinePos,
                       bool bSavePieces,
                       bool bEndBreak);
-  void EndBreak(CFX_BreakType dwStatus, float* pLinePos, bool bDefault);
+  void EndBreak(CFX_Char::BreakType dwStatus, float* pLinePos, bool bDefault);
   bool IsEnd(bool bSavePieces);
   void UpdateAlign(float fHeight, float fBottom);
   void RenderString(CFX_RenderDevice* pDevice,
