diff --git a/xfa/fwl/cfwl_barcode.cpp b/xfa/fwl/cfwl_barcode.cpp
index 83ab74a..8b05927 100644
--- a/xfa/fwl/cfwl_barcode.cpp
+++ b/xfa/fwl/cfwl_barcode.cpp
@@ -165,27 +165,20 @@
   if (!m_pBarcodeEngine)
     return;
 
-  CFX_WideString wsText = GetText();
-
-  CFWL_ThemePart part;
-  part.m_pWidget = this;
-
   IFWL_ThemeProvider* pTheme = GetAvailableTheme();
-  CFGAS_GEFont* pFont = static_cast<CFGAS_GEFont*>(
-      pTheme->GetCapacity(&part, CFWL_WidgetCapacity::Font));
-  CFX_Font* pCXFont = pFont ? pFont->GetDevFont() : nullptr;
-  if (pCXFont)
-    m_pBarcodeEngine->SetFont(pCXFont);
+  if (pTheme) {
+    CFWL_ThemePart part;
+    part.m_pWidget = this;
 
-  FX_FLOAT* pFontSize = static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, CFWL_WidgetCapacity::FontSize));
-  if (pFontSize)
-    m_pBarcodeEngine->SetFontSize(*pFontSize);
-
-  FX_ARGB* pFontColor = static_cast<FX_ARGB*>(
-      pTheme->GetCapacity(&part, CFWL_WidgetCapacity::TextColor));
-  if (pFontColor)
-    m_pBarcodeEngine->SetFontColor(*pFontColor);
+    if (CFGAS_GEFont* pFont = pTheme->GetFont(&part)) {
+      if (CFX_Font* pCXFont = pFont->GetDevFont())
+        m_pBarcodeEngine->SetFont(pCXFont);
+    }
+    m_pBarcodeEngine->SetFontSize(pTheme->GetFontSize(&part));
+    m_pBarcodeEngine->SetFontColor(pTheme->GetTextColor(&part));
+  } else {
+    m_pBarcodeEngine->SetFontSize(FWLTHEME_CAPACITY_FontSize);
+  }
 
   m_pBarcodeEngine->SetHeight(int32_t(GetRTClient().height));
   m_pBarcodeEngine->SetWidth(int32_t(GetRTClient().width));
@@ -217,7 +210,7 @@
     m_pBarcodeEngine->SetTruncated(m_bTruncated);
 
   int32_t errorCode = 0;
-  m_dwStatus = m_pBarcodeEngine->Encode(wsText.AsStringC(), true, errorCode)
+  m_dwStatus = m_pBarcodeEngine->Encode(GetText().AsStringC(), true, errorCode)
                    ? XFA_BCS_EncodeSuccess
                    : 0;
 }
diff --git a/xfa/fwl/cfwl_combobox.cpp b/xfa/fwl/cfwl_combobox.cpp
index c07e0cf..03d2921 100644
--- a/xfa/fwl/cfwl_combobox.cpp
+++ b/xfa/fwl/cfwl_combobox.cpp
@@ -35,8 +35,7 @@
       m_pComboBoxProxy(nullptr),
       m_bLButtonDown(false),
       m_iCurSel(-1),
-      m_iBtnState(CFWL_PartState_Normal),
-      m_fComboFormHandler(0) {
+      m_iBtnState(CFWL_PartState_Normal) {
   m_rtClient.Reset();
   m_rtBtn.Reset();
   m_rtHandler.Reset();
@@ -117,11 +116,6 @@
     m_pProperties->m_pThemeProvider = GetAvailableTheme();
 
   Layout();
-  CFWL_ThemePart part;
-  part.m_pWidget = this;
-  m_fComboFormHandler =
-      *static_cast<FX_FLOAT*>(m_pProperties->m_pThemeProvider->GetCapacity(
-          &part, CFWL_WidgetCapacity::ComboFormHandler));
 }
 
 FWL_WidgetHit CFWL_ComboBox::HitTest(FX_FLOAT fx, FX_FLOAT fy) {
@@ -349,7 +343,6 @@
   CFWL_Event ev(CFWL_Event::Type::PreDropDown, this);
   DispatchEvent(&ev);
 
-  m_fItemHeight = m_pListBox->GetItemHeight();
   m_pListBox->SetFocus(true);
   m_pComboBoxProxy->DoModal();
   m_pListBox->SetFocus(false);
@@ -380,12 +373,11 @@
     return DisForm_Layout();
 
   m_rtClient = GetClientRect();
-  FX_FLOAT* pFWidth = static_cast<FX_FLOAT*>(
-      GetThemeCapacity(CFWL_WidgetCapacity::ScrollBarWidth));
-  if (!pFWidth)
+  IFWL_ThemeProvider* theme = GetAvailableTheme();
+  if (!theme)
     return;
 
-  FX_FLOAT fBtn = *pFWidth;
+  FX_FLOAT fBtn = theme->GetScrollBarWidth();
   m_rtBtn.Set(m_rtClient.right() - fBtn, m_rtClient.top, fBtn,
               m_rtClient.height);
   if (!IsDropDownStyle() || !m_pEdit)
@@ -680,24 +672,22 @@
 void CFWL_ComboBox::DisForm_Layout() {
   m_rtClient = GetClientRect();
   m_rtContent = m_rtClient;
-  FX_FLOAT* pFWidth = static_cast<FX_FLOAT*>(
-      GetThemeCapacity(CFWL_WidgetCapacity::ScrollBarWidth));
-  if (!pFWidth)
+  IFWL_ThemeProvider* theme = GetAvailableTheme();
+  if (!theme)
     return;
 
   FX_FLOAT borderWidth = 1;
-  FX_FLOAT fBtn = *pFWidth;
+  FX_FLOAT fBtn = theme->GetScrollBarWidth();
   if (!(GetStylesEx() & FWL_STYLEEXT_CMB_ReadOnly)) {
     m_rtBtn.Set(m_rtClient.right() - fBtn, m_rtClient.top + borderWidth,
                 fBtn - borderWidth, m_rtClient.height - 2 * borderWidth);
   }
 
-  CFX_RectF* pUIMargin =
-      static_cast<CFX_RectF*>(GetThemeCapacity(CFWL_WidgetCapacity::UIMargin));
-  if (pUIMargin) {
-    m_rtContent.Deflate(pUIMargin->left, pUIMargin->top, pUIMargin->width,
-                        pUIMargin->height);
-  }
+  CFWL_ThemePart part;
+  part.m_pWidget = this;
+  CFX_RectF pUIMargin = theme->GetUIMargin(&part);
+  m_rtContent.Deflate(pUIMargin.left, pUIMargin.top, pUIMargin.width,
+                      pUIMargin.height);
 
   if (!IsDropDownStyle() || !m_pEdit)
     return;
diff --git a/xfa/fwl/cfwl_combobox.h b/xfa/fwl/cfwl_combobox.h
index c1c4ed4..d8db10d 100644
--- a/xfa/fwl/cfwl_combobox.h
+++ b/xfa/fwl/cfwl_combobox.h
@@ -156,8 +156,6 @@
   bool m_bLButtonDown;
   int32_t m_iCurSel;
   int32_t m_iBtnState;
-  FX_FLOAT m_fComboFormHandler;
-  FX_FLOAT m_fItemHeight;
 };
 
 #endif  // XFA_FWL_CFWL_COMBOBOX_H_
diff --git a/xfa/fwl/cfwl_datetimepicker.cpp b/xfa/fwl/cfwl_datetimepicker.cpp
index 658cb03..861692f 100644
--- a/xfa/fwl/cfwl_datetimepicker.cpp
+++ b/xfa/fwl/cfwl_datetimepicker.cpp
@@ -79,12 +79,12 @@
 
   m_pEdit->SetThemeProvider(m_pProperties->m_pThemeProvider);
   m_rtClient = GetClientRect();
-  FX_FLOAT* pFWidth = static_cast<FX_FLOAT*>(
-      GetThemeCapacity(CFWL_WidgetCapacity::ScrollBarWidth));
-  if (!pFWidth)
+
+  IFWL_ThemeProvider* theme = GetAvailableTheme();
+  if (!theme)
     return;
 
-  FX_FLOAT fBtn = *pFWidth;
+  FX_FLOAT fBtn = theme->GetScrollBarWidth();
   m_rtBtn.Set(m_rtClient.right() - fBtn, m_rtClient.top, fBtn - 1,
               m_rtClient.height - 1);
 
@@ -426,12 +426,11 @@
   if (!m_pMonthCal->GetThemeProvider())
     m_pMonthCal->SetThemeProvider(m_pProperties->m_pThemeProvider);
 
-  FX_FLOAT* pWidth = static_cast<FX_FLOAT*>(
-      GetThemeCapacity(CFWL_WidgetCapacity::ScrollBarWidth));
-  if (!pWidth)
+  IFWL_ThemeProvider* theme = GetAvailableTheme();
+  if (!theme)
     return;
 
-  m_fBtn = *pWidth;
+  m_fBtn = theme->GetScrollBarWidth();
   CFX_RectF rtMonthCal = m_pMonthCal->GetAutosizedWidgetRect();
   CFX_RectF rtPopUp;
   rtPopUp.Set(rtMonthCal.left, rtMonthCal.top + kDateTimePickerHeight,
diff --git a/xfa/fwl/cfwl_edit.cpp b/xfa/fwl/cfwl_edit.cpp
index b0d9e8d..79b0b2d 100644
--- a/xfa/fwl/cfwl_edit.cpp
+++ b/xfa/fwl/cfwl_edit.cpp
@@ -92,16 +92,14 @@
 CFX_RectF CFWL_Edit::GetWidgetRect() {
   CFX_RectF rect = m_pProperties->m_rtWidget;
   if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_OuterScrollbar) {
+    IFWL_ThemeProvider* theme = GetAvailableTheme();
+    float scrollbarWidth = theme ? theme->GetScrollBarWidth() : 0.0f;
     if (IsShowScrollBar(true)) {
-      FX_FLOAT* pfWidth = static_cast<FX_FLOAT*>(
-          GetThemeCapacity(CFWL_WidgetCapacity::ScrollBarWidth));
-      rect.width += *pfWidth;
+      rect.width += scrollbarWidth;
       rect.width += kEditMargin;
     }
     if (IsShowScrollBar(false)) {
-      FX_FLOAT* pfWidth = static_cast<FX_FLOAT*>(
-          GetThemeCapacity(CFWL_WidgetCapacity::ScrollBarWidth));
-      rect.height += *pfWidth;
+      rect.height += scrollbarWidth;
       rect.height += kEditMargin;
     }
   }
@@ -679,26 +677,18 @@
     params.dwMode |= FDE_TEXTEDITMODE_ReadOnly;
   }
 
-  FX_FLOAT* pFontSize =
-      static_cast<FX_FLOAT*>(GetThemeCapacity(CFWL_WidgetCapacity::FontSize));
-  if (!pFontSize)
+  IFWL_ThemeProvider* theme = GetAvailableTheme();
+  CFWL_ThemePart part;
+  part.m_pWidget = this;
+  m_fFontSize = theme ? theme->GetFontSize(&part) : FWLTHEME_CAPACITY_FontSize;
+
+  if (!theme)
     return;
 
-  m_fFontSize = *pFontSize;
-  uint32_t* pFontColor =
-      static_cast<uint32_t*>(GetThemeCapacity(CFWL_WidgetCapacity::TextColor));
-  if (!pFontColor)
-    return;
+  params.dwFontColor = theme->GetTextColor(&part);
+  params.fLineSpace = theme->GetLineHeight(&part);
 
-  params.dwFontColor = *pFontColor;
-  FX_FLOAT* pLineHeight =
-      static_cast<FX_FLOAT*>(GetThemeCapacity(CFWL_WidgetCapacity::LineHeight));
-  if (!pLineHeight)
-    return;
-
-  params.fLineSpace = *pLineHeight;
-  CFGAS_GEFont* pFont =
-      static_cast<CFGAS_GEFont*>(GetThemeCapacity(CFWL_WidgetCapacity::Font));
+  CFGAS_GEFont* pFont = theme->GetFont(&part);
   if (!pFont)
     return;
 
@@ -790,11 +780,14 @@
   FX_FLOAT fOffsetY = 0.0f;
   FX_FLOAT fSpaceAbove = 0.0f;
   FX_FLOAT fSpaceBelow = 0.0f;
-  CFX_SizeF* pSpace = static_cast<CFX_SizeF*>(
-      GetThemeCapacity(CFWL_WidgetCapacity::SpaceAboveBelow));
-  if (pSpace) {
-    fSpaceAbove = pSpace->x;
-    fSpaceBelow = pSpace->y;
+  IFWL_ThemeProvider* theme = GetAvailableTheme();
+  if (theme) {
+    CFWL_ThemePart part;
+    part.m_pWidget = this;
+
+    CFX_SizeF pSpace = theme->GetSpaceAboveBelow(&part);
+    fSpaceAbove = pSpace.x;
+    fSpaceBelow = pSpace.y;
   }
   if (fSpaceAbove < 0.1f)
     fSpaceAbove = 0;
@@ -952,29 +945,22 @@
 void CFWL_Edit::Layout() {
   m_rtClient = GetClientRect();
   m_rtEngine = m_rtClient;
-  FX_FLOAT* pfWidth = static_cast<FX_FLOAT*>(
-      GetThemeCapacity(CFWL_WidgetCapacity::ScrollBarWidth));
-  if (!pfWidth)
+  IFWL_ThemeProvider* theme = GetAvailableTheme();
+  if (!theme)
     return;
 
-  FX_FLOAT fWidth = *pfWidth;
+  FX_FLOAT fWidth = theme->GetScrollBarWidth();
+  CFWL_ThemePart part;
   if (!m_pOuter) {
-    CFX_RectF* pUIMargin = static_cast<CFX_RectF*>(
-        GetThemeCapacity(CFWL_WidgetCapacity::UIMargin));
-    if (pUIMargin) {
-      m_rtEngine.Deflate(pUIMargin->left, pUIMargin->top, pUIMargin->width,
-                         pUIMargin->height);
-    }
+    part.m_pWidget = this;
+    CFX_RectF pUIMargin = theme->GetUIMargin(&part);
+    m_rtEngine.Deflate(pUIMargin.left, pUIMargin.top, pUIMargin.width,
+                       pUIMargin.height);
   } else if (m_pOuter->GetClassID() == FWL_Type::DateTimePicker) {
-    CFWL_ThemePart part;
     part.m_pWidget = m_pOuter;
-    CFX_RectF* pUIMargin =
-        static_cast<CFX_RectF*>(m_pOuter->GetThemeProvider()->GetCapacity(
-            &part, CFWL_WidgetCapacity::UIMargin));
-    if (pUIMargin) {
-      m_rtEngine.Deflate(pUIMargin->left, pUIMargin->top, pUIMargin->width,
-                         pUIMargin->height);
-    }
+    CFX_RectF pUIMargin = theme->GetUIMargin(&part);
+    m_rtEngine.Deflate(pUIMargin.left, pUIMargin.top, pUIMargin.width,
+                       pUIMargin.height);
   }
 
   bool bShowVertScrollbar = IsShowScrollBar(true);
@@ -1029,14 +1015,13 @@
     return;
   }
 
-  FX_FLOAT* pfWidth = nullptr;
   bool bShowVertScrollbar = IsShowScrollBar(true);
   bool bShowHorzScrollbar = IsShowScrollBar(false);
+
+  IFWL_ThemeProvider* theme = GetAvailableTheme();
+  FX_FLOAT fWidth = theme ? theme->GetScrollBarWidth() : 0;
   if (bShowVertScrollbar) {
     if (!m_pVertScrollBar) {
-      pfWidth = static_cast<FX_FLOAT*>(
-          GetThemeCapacity(CFWL_WidgetCapacity::ScrollBarWidth));
-      FX_FLOAT fWidth = pfWidth ? *pfWidth : 0;
       InitVerticalScrollBar();
       CFX_RectF rtVertScr;
       if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_OuterScrollbar) {
@@ -1058,12 +1043,6 @@
 
   if (bShowHorzScrollbar) {
     if (!m_pHorzScrollBar) {
-      if (!pfWidth) {
-        pfWidth = static_cast<FX_FLOAT*>(
-            GetThemeCapacity(CFWL_WidgetCapacity::ScrollBarWidth));
-      }
-
-      FX_FLOAT fWidth = pfWidth ? *pfWidth : 0;
       InitHorizontalScrollBar();
       CFX_RectF rtHoriScr;
       if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_OuterScrollbar) {
diff --git a/xfa/fwl/cfwl_form.cpp b/xfa/fwl/cfwl_form.cpp
index a40f74e..d0d6ef2 100644
--- a/xfa/fwl/cfwl_form.cpp
+++ b/xfa/fwl/cfwl_form.cpp
@@ -181,10 +181,9 @@
   m_rtRelative = GetRelativeRect();
 
 #ifndef FWL_UseMacSystemBorder
-  m_fCXBorder =
-      *static_cast<FX_FLOAT*>(GetThemeCapacity(CFWL_WidgetCapacity::CXBorder));
-  m_fCYBorder =
-      *static_cast<FX_FLOAT*>(GetThemeCapacity(CFWL_WidgetCapacity::CYBorder));
+  IFWL_ThemeProvider* theme = GetAvailableTheme();
+  m_fCXBorder = theme ? theme->GetCXBorderSize() : 0.0f;
+  m_fCYBorder = theme ? theme->GetCYBorderSize() : 0.0f;
 #endif
 }
 
diff --git a/xfa/fwl/cfwl_listbox.cpp b/xfa/fwl/cfwl_listbox.cpp
index d79e489..a7a568c 100644
--- a/xfa/fwl/cfwl_listbox.cpp
+++ b/xfa/fwl/cfwl_listbox.cpp
@@ -477,12 +477,12 @@
   CFX_RectF rtUIMargin;
   rtUIMargin.Set(0, 0, 0, 0);
   if (!m_pOuter) {
-    CFX_RectF* pUIMargin = static_cast<CFX_RectF*>(
-        GetThemeCapacity(CFWL_WidgetCapacity::UIMargin));
-    if (pUIMargin) {
-      m_rtConent.Deflate(pUIMargin->left, pUIMargin->top, pUIMargin->width,
-                         pUIMargin->height);
-    }
+    CFWL_ThemePart part;
+    part.m_pWidget = this;
+    IFWL_ThemeProvider* theme = GetAvailableTheme();
+    CFX_RectF pUIMargin = theme ? theme->GetUIMargin(&part) : CFX_RectF();
+    m_rtConent.Deflate(pUIMargin.left, pUIMargin.top, pUIMargin.width,
+                       pUIMargin.height);
   }
 
   FX_FLOAT fWidth = GetMaxTextWidth();
@@ -612,19 +612,15 @@
 }
 
 FX_FLOAT CFWL_ListBox::GetScrollWidth() {
-  FX_FLOAT* pfWidth = static_cast<FX_FLOAT*>(
-      GetThemeCapacity(CFWL_WidgetCapacity::ScrollBarWidth));
-  if (!pfWidth)
-    return 0;
-  return *pfWidth;
+  IFWL_ThemeProvider* theme = GetAvailableTheme();
+  return theme ? theme->GetScrollBarWidth() : 0.0f;
 }
 
 FX_FLOAT CFWL_ListBox::CalcItemHeight() {
-  FX_FLOAT* pfFont =
-      static_cast<FX_FLOAT*>(GetThemeCapacity(CFWL_WidgetCapacity::FontSize));
-  if (!pfFont)
-    return 20;
-  return *pfFont + 2 * kItemTextMargin;
+  IFWL_ThemeProvider* theme = GetAvailableTheme();
+  CFWL_ThemePart part;
+  part.m_pWidget = this;
+  return (theme ? theme->GetFontSize(&part) : 20.0f) + 2 * kItemTextMargin;
 }
 
 void CFWL_ListBox::InitVerticalScrollBar() {
diff --git a/xfa/fwl/cfwl_monthcalendar.cpp b/xfa/fwl/cfwl_monthcalendar.cpp
index c779665..b79dc3e 100644
--- a/xfa/fwl/cfwl_monthcalendar.cpp
+++ b/xfa/fwl/cfwl_monthcalendar.cpp
@@ -541,63 +541,6 @@
 void CFWL_MonthCalendar::GetCapValue() {
   if (!m_pProperties->m_pThemeProvider)
     m_pProperties->m_pThemeProvider = GetAvailableTheme();
-
-  IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
-  CFWL_ThemePart part;
-  part.m_pWidget = this;
-  m_fHeadWid = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, CFWL_WidgetCapacity::HeaderWidth));
-  m_fHeadHei = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, CFWL_WidgetCapacity::HeaderHeight));
-  m_fHeadBtnWid = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, CFWL_WidgetCapacity::HeaderBtnWidth));
-  m_fHeadBtnHei = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, CFWL_WidgetCapacity::HeaderBtnHeight));
-  m_fHeadBtnHMargin = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, CFWL_WidgetCapacity::HeaderBtnHMargin));
-  m_fHeadBtnVMargin = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, CFWL_WidgetCapacity::HeaderBtnVMargin));
-  m_fHeadTextWid = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, CFWL_WidgetCapacity::HeaderTextWidth));
-  m_fHeadTextHei = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, CFWL_WidgetCapacity::HeaderTextHeight));
-  m_fHeadTextHMargin = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, CFWL_WidgetCapacity::HeaderTextHMargin));
-  m_fHeadTextVMargin = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, CFWL_WidgetCapacity::HeaderTextVMargin));
-  m_fHSepWid = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, CFWL_WidgetCapacity::HSepWidth));
-  m_fHSepHei = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, CFWL_WidgetCapacity::HSepHeight));
-  m_fWeekNumWid = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, CFWL_WidgetCapacity::WeekNumWidth));
-  m_fSepDOffset = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, CFWL_WidgetCapacity::SepDOffset));
-  m_fSepX = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, CFWL_WidgetCapacity::SepX));
-  m_fSepY = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, CFWL_WidgetCapacity::SepY));
-  m_fWeekNumHeigh = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, CFWL_WidgetCapacity::WeekNumHeight));
-  m_fWeekWid = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, CFWL_WidgetCapacity::WeekWidth));
-  m_fWeekHei = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, CFWL_WidgetCapacity::WeekHeight));
-  m_fDateCellWid = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, CFWL_WidgetCapacity::DatesCellWidth));
-  m_fDateCellHei = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, CFWL_WidgetCapacity::DatesCellHeight));
-  m_fTodayWid = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, CFWL_WidgetCapacity::TodayWidth));
-  m_fTodayHei = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, CFWL_WidgetCapacity::TodayHeight));
-  m_fTodayFlagWid = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, CFWL_WidgetCapacity::TodayFlagWidth));
-  m_fMCWid = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, CFWL_WidgetCapacity::Width));
-
-  m_fMCHei = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, CFWL_WidgetCapacity::Height));
 }
 
 void CFWL_MonthCalendar::InitDate() {
@@ -826,7 +769,7 @@
   } else {
     CFWL_DateTimePicker* pIPicker = static_cast<CFWL_DateTimePicker*>(m_pOuter);
     if (pIPicker->IsMonthCalendarVisible())
-      m_bFlag = 1;
+      m_bFlag = true;
   }
 }
 
@@ -871,7 +814,7 @@
   } else if (m_bFlag && (!rt.Contains(pMsg->m_fx, pMsg->m_fy))) {
     pIPicker->ShowMonthCalendar(false);
   }
-  m_bFlag = 0;
+  m_bFlag = false;
 }
 
 void CFWL_MonthCalendar::DisForm_OnLButtonUp(CFWL_MessageMouse* pMsg) {
diff --git a/xfa/fwl/cfwl_monthcalendar.h b/xfa/fwl/cfwl_monthcalendar.h
index 979f53b..6c1d0d9 100644
--- a/xfa/fwl/cfwl_monthcalendar.h
+++ b/xfa/fwl/cfwl_monthcalendar.h
@@ -181,32 +181,6 @@
   CFX_SizeF m_szToday;
   CFX_ArrayTemplate<int32_t> m_arrSelDays;
   CFX_RectF m_rtClient;
-  FX_FLOAT m_fHeadWid;
-  FX_FLOAT m_fHeadHei;
-  FX_FLOAT m_fHeadBtnWid;
-  FX_FLOAT m_fHeadBtnHei;
-  FX_FLOAT m_fHeadBtnHMargin;
-  FX_FLOAT m_fHeadBtnVMargin;
-  FX_FLOAT m_fHeadTextWid;
-  FX_FLOAT m_fHeadTextHei;
-  FX_FLOAT m_fHeadTextHMargin;
-  FX_FLOAT m_fHeadTextVMargin;
-  FX_FLOAT m_fHSepWid;
-  FX_FLOAT m_fHSepHei;
-  FX_FLOAT m_fWeekNumWid;
-  FX_FLOAT m_fSepDOffset;
-  FX_FLOAT m_fSepX;
-  FX_FLOAT m_fSepY;
-  FX_FLOAT m_fWeekNumHeigh;
-  FX_FLOAT m_fWeekWid;
-  FX_FLOAT m_fWeekHei;
-  FX_FLOAT m_fDateCellWid;
-  FX_FLOAT m_fDateCellHei;
-  FX_FLOAT m_fTodayWid;
-  FX_FLOAT m_fTodayHei;
-  FX_FLOAT m_fTodayFlagWid;
-  FX_FLOAT m_fMCWid;
-  FX_FLOAT m_fMCHei;
   bool m_bFlag;
 };
 
diff --git a/xfa/fwl/cfwl_pushbutton.cpp b/xfa/fwl/cfwl_pushbutton.cpp
index 05f8d25..3f0be45 100644
--- a/xfa/fwl/cfwl_pushbutton.cpp
+++ b/xfa/fwl/cfwl_pushbutton.cpp
@@ -52,9 +52,6 @@
   UpdateTextOutStyles();
   m_rtClient = GetClientRect();
   m_rtCaption = m_rtClient;
-  FX_FLOAT* fcaption =
-      static_cast<FX_FLOAT*>(GetThemeCapacity(CFWL_WidgetCapacity::Margin));
-  m_rtCaption.Inflate(-*fcaption, -*fcaption);
 }
 
 void CFWL_PushButton::DrawWidget(CFX_Graphics* pGraphics,
diff --git a/xfa/fwl/cfwl_scrollbar.cpp b/xfa/fwl/cfwl_scrollbar.cpp
index 016afd6..d4dd888 100644
--- a/xfa/fwl/cfwl_scrollbar.cpp
+++ b/xfa/fwl/cfwl_scrollbar.cpp
@@ -20,7 +20,12 @@
 #include "xfa/fwl/ifwl_themeprovider.h"
 
 #define FWL_SCROLLBAR_Elapse 500
-#define FWL_SCROLLBAR_MinThumb 5
+
+namespace {
+
+const float kMinThumbSize = 5.0f;
+
+}  // namespace
 
 CFWL_ScrollBar::CFWL_ScrollBar(
     const CFWL_App* app,
@@ -46,7 +51,6 @@
       m_bMouseDown(false),
       m_fButtonLen(0),
       m_bMinSize(false),
-      m_fMinThumb(FWL_SCROLLBAR_MinThumb),
       m_Timer(this) {
   m_rtClient.Reset();
   m_rtThumb.Reset();
@@ -150,12 +154,8 @@
 }
 
 void CFWL_ScrollBar::Layout() {
-  IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
-  CFWL_ThemePart part;
-  part.m_pWidget = this;
-  m_fMinThumb = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, CFWL_WidgetCapacity::Size));
   m_rtClient = GetClientRect();
+
   CalcButtonLen();
   m_rtMinBtn = CalcMinButtonRect();
   m_rtMaxBtn = CalcMaxButtonRect();
@@ -226,7 +226,7 @@
     fLength = 0.0f;
 
   FX_FLOAT fThumbSize = fLength * fLength / (fRange + fLength);
-  fThumbSize = std::max(fThumbSize, m_fMinThumb);
+  fThumbSize = std::max(fThumbSize, kMinThumbSize);
 
   FX_FLOAT fDiff = std::max(fLength - fThumbSize, 0.0f);
   FX_FLOAT fTrackPos =
diff --git a/xfa/fwl/cfwl_scrollbar.h b/xfa/fwl/cfwl_scrollbar.h
index 40beb7a..62ce523 100644
--- a/xfa/fwl/cfwl_scrollbar.h
+++ b/xfa/fwl/cfwl_scrollbar.h
@@ -141,7 +141,6 @@
   CFX_RectF m_rtMaxBtn;
   CFX_RectF m_rtMinTrack;
   CFX_RectF m_rtMaxTrack;
-  FX_FLOAT m_fMinThumb;
   CFWL_ScrollBar::Timer m_Timer;
 };
 
diff --git a/xfa/fwl/cfwl_widget.cpp b/xfa/fwl/cfwl_widget.cpp
index 7da12fc..301ad5f 100644
--- a/xfa/fwl/cfwl_widget.cpp
+++ b/xfa/fwl/cfwl_widget.cpp
@@ -292,11 +292,10 @@
 }
 
 FX_FLOAT CFWL_Widget::GetBorderSize(bool bCX) {
-  FX_FLOAT* pfBorder = static_cast<FX_FLOAT*>(GetThemeCapacity(
-      bCX ? CFWL_WidgetCapacity::CXBorder : CFWL_WidgetCapacity::CYBorder));
-  if (!pfBorder)
-    return 0;
-  return *pfBorder;
+  IFWL_ThemeProvider* theme = GetAvailableTheme();
+  if (!theme)
+    return 0.0f;
+  return bCX ? theme->GetCXBorderSize() : theme->GetCYBorderSize();
 }
 
 CFX_RectF CFWL_Widget::GetRelativeRect() {
@@ -306,16 +305,6 @@
   return rect;
 }
 
-void* CFWL_Widget::GetThemeCapacity(CFWL_WidgetCapacity dwCapacity) {
-  IFWL_ThemeProvider* pTheme = GetAvailableTheme();
-  if (!pTheme)
-    return nullptr;
-
-  CFWL_ThemePart part;
-  part.m_pWidget = this;
-  return pTheme->GetCapacity(&part, dwCapacity);
-}
-
 IFWL_ThemeProvider* CFWL_Widget::GetAvailableTheme() {
   if (m_pProperties->m_pThemeProvider)
     return m_pProperties->m_pThemeProvider;
diff --git a/xfa/fwl/cfwl_widget.h b/xfa/fwl/cfwl_widget.h
index 759ab1f..74fa314 100644
--- a/xfa/fwl/cfwl_widget.h
+++ b/xfa/fwl/cfwl_widget.h
@@ -124,7 +124,6 @@
   CFX_RectF GetEdgeRect();
   FX_FLOAT GetBorderSize(bool bCX);
   CFX_RectF GetRelativeRect();
-  void* GetThemeCapacity(CFWL_WidgetCapacity dwCapacity);
   IFWL_ThemeProvider* GetAvailableTheme();
   CFX_SizeF CalcTextSize(const CFX_WideString& wsText,
                          IFWL_ThemeProvider* pTheme,
diff --git a/xfa/fwl/ifwl_themeprovider.h b/xfa/fwl/ifwl_themeprovider.h
index 69932e7..c0460fe 100644
--- a/xfa/fwl/ifwl_themeprovider.h
+++ b/xfa/fwl/ifwl_themeprovider.h
@@ -21,9 +21,16 @@
 
   virtual void DrawBackground(CFWL_ThemeBackground* pParams) = 0;
   virtual void DrawText(CFWL_ThemeText* pParams) = 0;
-  virtual void* GetCapacity(CFWL_ThemePart* pThemePart,
-                            CFWL_WidgetCapacity dwCapacity) = 0;
   virtual void CalcTextRect(CFWL_ThemeText* pParams, CFX_RectF& rect) = 0;
+  virtual float GetCXBorderSize() const = 0;
+  virtual float GetCYBorderSize() const = 0;
+  virtual CFX_RectF GetUIMargin(CFWL_ThemePart* pThemePart) const = 0;
+  virtual float GetFontSize(CFWL_ThemePart* pThemePart) const = 0;
+  virtual CFGAS_GEFont* GetFont(CFWL_ThemePart* pThemePart) const = 0;
+  virtual float GetLineHeight(CFWL_ThemePart* pThemePart) const = 0;
+  virtual float GetScrollBarWidth() const = 0;
+  virtual FX_COLORREF GetTextColor(CFWL_ThemePart* pThemePart) const = 0;
+  virtual CFX_SizeF GetSpaceAboveBelow(CFWL_ThemePart* pThemePart) const = 0;
 };
 
 #endif  // XFA_FWL_IFWL_THEMEPROVIDER_H_
diff --git a/xfa/fwl/theme/cfwl_comboboxtp.cpp b/xfa/fwl/theme/cfwl_comboboxtp.cpp
index 10409a8..8f961c9 100644
--- a/xfa/fwl/theme/cfwl_comboboxtp.cpp
+++ b/xfa/fwl/theme/cfwl_comboboxtp.cpp
@@ -13,12 +13,6 @@
 #include "xfa/fxgraphics/cfx_color.h"
 #include "xfa/fxgraphics/cfx_path.h"
 
-namespace {
-
-const float kComboFormHandler = 8.0f;
-
-}  // namespace
-
 CFWL_ComboBoxTP::CFWL_ComboBoxTP() {}
 
 CFWL_ComboBoxTP::~CFWL_ComboBoxTP() {}
@@ -84,15 +78,6 @@
   pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, &pParams->m_matrix);
 }
 
-void* CFWL_ComboBoxTP::GetCapacity(CFWL_ThemePart* pThemePart,
-                                   CFWL_WidgetCapacity dwCapacity) {
-  if (dwCapacity == CFWL_WidgetCapacity::ComboFormHandler) {
-    m_fValue = kComboFormHandler;
-    return &m_fValue;
-  }
-  return CFWL_WidgetTP::GetCapacity(pThemePart, dwCapacity);
-}
-
 void CFWL_ComboBoxTP::DrawDropDownButton(CFWL_ThemeBackground* pParams,
                                          uint32_t dwStates,
                                          CFX_Matrix* pMatrix) {
diff --git a/xfa/fwl/theme/cfwl_comboboxtp.h b/xfa/fwl/theme/cfwl_comboboxtp.h
index 6abca29..e253281 100644
--- a/xfa/fwl/theme/cfwl_comboboxtp.h
+++ b/xfa/fwl/theme/cfwl_comboboxtp.h
@@ -17,8 +17,6 @@
   // CFWL_WidgetTP
   bool IsValidWidget(CFWL_Widget* pWidget) override;
   void DrawBackground(CFWL_ThemeBackground* pParams) override;
-  void* GetCapacity(CFWL_ThemePart* pThemePart,
-                    CFWL_WidgetCapacity dwCapacity) override;
 
  protected:
   void DrawDropDownButton(CFWL_ThemeBackground* pParams,
diff --git a/xfa/fwl/theme/cfwl_monthcalendartp.cpp b/xfa/fwl/theme/cfwl_monthcalendartp.cpp
index a76d959..7e9ea0a 100644
--- a/xfa/fwl/theme/cfwl_monthcalendartp.cpp
+++ b/xfa/fwl/theme/cfwl_monthcalendartp.cpp
@@ -15,40 +15,6 @@
 #include "xfa/fxgraphics/cfx_color.h"
 #include "xfa/fxgraphics/cfx_path.h"
 
-namespace {
-
-const int kWidth = 200;
-const int kHeight = 160;
-
-const int kHeaderWidth = 200;
-const int kHeaderHeight = 30;
-
-const int kButtonWidth = 18;
-const int kButtonHeight = 16;
-const int kButtonHorizontalMargin = 5;
-const int kButtonVerticalMargin = (kHeaderHeight - kButtonHeight) / 2;
-
-const int kHeaderTextWidth = 100;
-const int kHeaderTextHeight = 20;
-const int kHeaderTextHorizontalMargin = (kHeaderWidth - kHeaderTextWidth) / 2;
-const int kHeaderTextVerticalMargin = (kHeaderHeight - kHeaderTextHeight) / 2;
-
-const int kDatesCellWidth = (kHeaderWidth / 7);
-const int kDatesCellHeight = 16;
-const int kWeekWidth = kDatesCellWidth * 7;
-const int kWeekNumWidth = 26;
-const int kWeekNumHeight = (6 * kDatesCellHeight);
-
-const int kHorizontalSeparatorWidth = kWeekWidth - 10;
-const int kHorizontalSeparatorHeight = 1;
-const int kVerticalSeparatorWidth = 1;
-const int kVerticalSeparatorHeight = kWeekNumHeight;
-const int kSeparatorDOffset = -4;
-const int kSeparatorX = 3;
-const int kSeparatorY = kHeaderHeight + kDatesCellHeight + kSeparatorDOffset;
-
-}  // namespace
-
 CFWL_MonthCalendarTP::CFWL_MonthCalendarTP() : m_pThemeData(new MCThemeData) {
   SetThemeData();
 }
@@ -130,136 +96,6 @@
   CFWL_WidgetTP::DrawText(pParams);
 }
 
-void* CFWL_MonthCalendarTP::GetCapacity(CFWL_ThemePart* pThemePart,
-                                        CFWL_WidgetCapacity dwCapacity) {
-  bool bDefPro = false;
-  bool bDwordVal = false;
-  switch (dwCapacity) {
-    case CFWL_WidgetCapacity::HeaderWidth: {
-      m_fValue = kHeaderWidth;
-      break;
-    }
-    case CFWL_WidgetCapacity::HeaderHeight: {
-      m_fValue = kHeaderHeight;
-      break;
-    }
-    case CFWL_WidgetCapacity::HeaderBtnWidth: {
-      m_fValue = kButtonWidth;
-      break;
-    }
-    case CFWL_WidgetCapacity::HeaderBtnHeight: {
-      m_fValue = kButtonHeight;
-      break;
-    }
-    case CFWL_WidgetCapacity::HeaderBtnHMargin: {
-      bDwordVal = true;
-      m_dwValue = kButtonHorizontalMargin;
-      break;
-    }
-    case CFWL_WidgetCapacity::HeaderBtnVMargin: {
-      m_fValue = kButtonVerticalMargin;
-      break;
-    }
-    case CFWL_WidgetCapacity::HeaderTextWidth: {
-      m_fValue = kHeaderTextWidth;
-      break;
-    }
-    case CFWL_WidgetCapacity::HeaderTextHeight: {
-      m_fValue = kHeaderTextHeight;
-      break;
-    }
-    case CFWL_WidgetCapacity::HeaderTextHMargin: {
-      m_fValue = kHeaderTextHorizontalMargin;
-      break;
-    }
-    case CFWL_WidgetCapacity::HeaderTextVMargin: {
-      m_fValue = kHeaderTextVerticalMargin;
-      break;
-    }
-    case CFWL_WidgetCapacity::HSepWidth: {
-      m_fValue = kHorizontalSeparatorWidth;
-      break;
-    }
-    case CFWL_WidgetCapacity::HSepHeight: {
-      m_fValue = kHorizontalSeparatorHeight;
-      break;
-    }
-    case CFWL_WidgetCapacity::VSepWidth: {
-      m_fValue = kVerticalSeparatorWidth;
-      break;
-    }
-    case CFWL_WidgetCapacity::VSepHeight: {
-      m_fValue = kVerticalSeparatorHeight;
-      break;
-    }
-    case CFWL_WidgetCapacity::WeekNumWidth: {
-      m_fValue = kWeekNumWidth;
-      break;
-    }
-    case CFWL_WidgetCapacity::WeekNumHeight: {
-      m_fValue = kWeekNumHeight;
-      break;
-    }
-    case CFWL_WidgetCapacity::WeekWidth: {
-      m_fValue = kWeekWidth;
-      break;
-    }
-    case CFWL_WidgetCapacity::WeekHeight: {
-      m_fValue = kDatesCellHeight;
-      break;
-    }
-    case CFWL_WidgetCapacity::SepDOffset: {
-      m_fValue = kSeparatorDOffset;
-      break;
-    }
-    case CFWL_WidgetCapacity::SepX: {
-      m_fValue = kSeparatorX;
-      break;
-    }
-    case CFWL_WidgetCapacity::SepY: {
-      m_fValue = kSeparatorY;
-      break;
-    }
-    case CFWL_WidgetCapacity::DatesCellWidth: {
-      m_fValue = kDatesCellWidth;
-      break;
-    }
-    case CFWL_WidgetCapacity::DatesCellHeight: {
-      m_fValue = kDatesCellHeight;
-      break;
-    }
-    case CFWL_WidgetCapacity::TodayWidth: {
-      m_fValue = kHeaderWidth;
-      break;
-    }
-    case CFWL_WidgetCapacity::TodayHeight: {
-      m_fValue = kDatesCellHeight;
-      break;
-    }
-    case CFWL_WidgetCapacity::TodayFlagWidth: {
-      m_fValue = kDatesCellWidth;
-      break;
-    }
-    case CFWL_WidgetCapacity::Width: {
-      m_fValue = kWidth;
-      break;
-    }
-    case CFWL_WidgetCapacity::Height: {
-      m_fValue = kHeight;
-      break;
-    }
-    default:
-      bDefPro = true;
-      break;
-  }
-  if (!bDefPro) {
-    if (bDwordVal)
-      return &m_dwValue;
-    return &m_fValue;
-  }
-  return CFWL_WidgetTP::GetCapacity(pThemePart, dwCapacity);
-}
-
 void CFWL_MonthCalendarTP::Initialize() {
   InitTTO();
   CFWL_WidgetTP::Initialize();
diff --git a/xfa/fwl/theme/cfwl_monthcalendartp.h b/xfa/fwl/theme/cfwl_monthcalendartp.h
index a0b1322..a5ef631 100644
--- a/xfa/fwl/theme/cfwl_monthcalendartp.h
+++ b/xfa/fwl/theme/cfwl_monthcalendartp.h
@@ -22,8 +22,6 @@
   bool IsValidWidget(CFWL_Widget* pWidget) override;
   void DrawBackground(CFWL_ThemeBackground* pParams) override;
   void DrawText(CFWL_ThemeText* pParams) override;
-  void* GetCapacity(CFWL_ThemePart* pThemePart,
-                    CFWL_WidgetCapacity dwCapacity) override;
 
  protected:
   struct MCThemeData {
diff --git a/xfa/fwl/theme/cfwl_pushbuttontp.cpp b/xfa/fwl/theme/cfwl_pushbuttontp.cpp
index 5515ffb..bf3baed 100644
--- a/xfa/fwl/theme/cfwl_pushbuttontp.cpp
+++ b/xfa/fwl/theme/cfwl_pushbuttontp.cpp
@@ -83,15 +83,6 @@
   }
 }
 
-void* CFWL_PushButtonTP::GetCapacity(CFWL_ThemePart* pThemePart,
-                                     CFWL_WidgetCapacity dwCapacity) {
-  if (dwCapacity == CFWL_WidgetCapacity::Margin) {
-    m_fValue = 0;
-    return &m_fValue;
-  }
-  return CFWL_WidgetTP::GetCapacity(pThemePart, dwCapacity);
-}
-
 void CFWL_PushButtonTP::Initialize() {
   InitTTO();
   CFWL_WidgetTP::Initialize();
diff --git a/xfa/fwl/theme/cfwl_pushbuttontp.h b/xfa/fwl/theme/cfwl_pushbuttontp.h
index b0efe03..64a0088 100644
--- a/xfa/fwl/theme/cfwl_pushbuttontp.h
+++ b/xfa/fwl/theme/cfwl_pushbuttontp.h
@@ -21,8 +21,6 @@
   void Finalize() override;
   bool IsValidWidget(CFWL_Widget* pWidget) override;
   void DrawBackground(CFWL_ThemeBackground* pParams) override;
-  void* GetCapacity(CFWL_ThemePart* pThemePart,
-                    CFWL_WidgetCapacity dwCapacity) override;
 
  protected:
   struct PBThemeData {
diff --git a/xfa/fwl/theme/cfwl_scrollbartp.cpp b/xfa/fwl/theme/cfwl_scrollbartp.cpp
index 0129f35..7f5d357 100644
--- a/xfa/fwl/theme/cfwl_scrollbartp.cpp
+++ b/xfa/fwl/theme/cfwl_scrollbartp.cpp
@@ -29,15 +29,6 @@
   return pWidget && pWidget->GetClassID() == FWL_Type::ScrollBar;
 }
 
-void* CFWL_ScrollBarTP::GetCapacity(CFWL_ThemePart* pThemePart,
-                                    CFWL_WidgetCapacity dwCapacity) {
-  if (dwCapacity == CFWL_WidgetCapacity::Size) {
-    m_fValue = 5;
-    return &m_fValue;
-  }
-  return CFWL_WidgetTP::GetCapacity(pThemePart, dwCapacity);
-}
-
 void CFWL_ScrollBarTP::DrawBackground(CFWL_ThemeBackground* pParams) {
   if (!pParams)
     return;
diff --git a/xfa/fwl/theme/cfwl_scrollbartp.h b/xfa/fwl/theme/cfwl_scrollbartp.h
index 10138d6..fe625fb 100644
--- a/xfa/fwl/theme/cfwl_scrollbartp.h
+++ b/xfa/fwl/theme/cfwl_scrollbartp.h
@@ -19,8 +19,6 @@
   // CFWL_WidgetTP
   bool IsValidWidget(CFWL_Widget* pWidget) override;
   void DrawBackground(CFWL_ThemeBackground* pParams) override;
-  void* GetCapacity(CFWL_ThemePart* pThemePart,
-                    CFWL_WidgetCapacity dwCapacity) override;
 
  protected:
   struct SBThemeData {
diff --git a/xfa/fwl/theme/cfwl_widgettp.cpp b/xfa/fwl/theme/cfwl_widgettp.cpp
index 3867257..2d61a41 100644
--- a/xfa/fwl/theme/cfwl_widgettp.cpp
+++ b/xfa/fwl/theme/cfwl_widgettp.cpp
@@ -24,20 +24,6 @@
 #include "xfa/fxgraphics/cfx_path.h"
 #include "xfa/fxgraphics/cfx_shading.h"
 
-namespace {
-
-const float kEdgeFlat = 2.0f;
-const float kEdgeRaised = 2.0f;
-const float kEdgeSunken = 2.0f;
-const float kLineHeight = 12.0f;
-const float kScrollBarWidth = 17.0f;
-const float kCXBorder = 1.0f;
-const float kCYBorder = 1.0f;
-
-#define FWLTHEME_CAPACITY_TextSelColor (ArgbEncode(255, 153, 193, 218))
-
-}  // namespace
-
 bool CFWL_WidgetTP::IsValidWidget(CFWL_Widget* pWidget) {
   return false;
 }
@@ -62,62 +48,6 @@
   m_pTextOut->DrawLogicText(pParams->m_wsText.c_str(), iLen, pParams->m_rtPart);
 }
 
-void* CFWL_WidgetTP::GetCapacity(CFWL_ThemePart* pThemePart,
-                                 CFWL_WidgetCapacity dwCapacity) {
-  switch (dwCapacity) {
-    case CFWL_WidgetCapacity::CXBorder: {
-      m_fValue = kCXBorder;
-      break;
-    }
-    case CFWL_WidgetCapacity::CYBorder: {
-      m_fValue = kCYBorder;
-      break;
-    }
-    case CFWL_WidgetCapacity::EdgeFlat: {
-      m_fValue = kEdgeFlat;
-      break;
-    }
-    case CFWL_WidgetCapacity::EdgeRaised: {
-      m_fValue = kEdgeRaised;
-      break;
-    }
-    case CFWL_WidgetCapacity::EdgeSunken: {
-      m_fValue = kEdgeSunken;
-      break;
-    }
-    case CFWL_WidgetCapacity::FontSize: {
-      m_fValue = FWLTHEME_CAPACITY_FontSize;
-      break;
-    }
-    case CFWL_WidgetCapacity::TextColor: {
-      m_dwValue = FWLTHEME_CAPACITY_TextColor;
-      return &m_dwValue;
-    }
-    case CFWL_WidgetCapacity::ScrollBarWidth: {
-      m_fValue = kScrollBarWidth;
-      break;
-    }
-    case CFWL_WidgetCapacity::Font: {
-      return m_pFDEFont;
-    }
-    case CFWL_WidgetCapacity::TextSelColor: {
-      m_dwValue = FWLTHEME_CAPACITY_TextSelColor;
-      return &m_dwValue;
-    }
-    case CFWL_WidgetCapacity::LineHeight: {
-      m_fValue = kLineHeight;
-      break;
-    }
-    case CFWL_WidgetCapacity::UIMargin: {
-      m_rtMargin.Set(0, 0, 0, 0);
-      return &m_rtMargin;
-    }
-    default:
-      return nullptr;
-  }
-  return &m_fValue;
-}
-
 void CFWL_WidgetTP::CalcTextRect(CFWL_ThemeText* pParams, CFX_RectF& rect) {
   if (!pParams || !m_pTextOut)
     return;
diff --git a/xfa/fwl/theme/cfwl_widgettp.h b/xfa/fwl/theme/cfwl_widgettp.h
index 1113512..50dd478 100644
--- a/xfa/fwl/theme/cfwl_widgettp.h
+++ b/xfa/fwl/theme/cfwl_widgettp.h
@@ -16,59 +16,6 @@
 #include "xfa/fwl/theme/cfwl_utils.h"
 #include "xfa/fxgraphics/cfx_graphics.h"
 
-enum class CFWL_WidgetCapacity {
-  None = 0,
-
-  BigIcon,
-  ComboFormHandler,
-  CXBorder,
-  CYBorder,
-  CYCaption,
-  CYNarrowCaption,
-  DatesCellHeight,
-  DatesCellWidth,
-  EdgeFlat,
-  EdgeRaised,
-  EdgeSunken,
-  Font,
-  FontSize,
-  HeaderBtnHeight,
-  HeaderBtnHMargin,
-  HeaderBtnVMargin,
-  HeaderBtnWidth,
-  HeaderHeight,
-  HeaderTextHeight,
-  HeaderTextHMargin,
-  HeaderTextVMargin,
-  HeaderTextWidth,
-  HeaderWidth,
-  Height,
-  HSepHeight,
-  HSepWidth,
-  LineHeight,
-  Margin,
-  ScrollBarWidth,
-  SepDOffset,
-  SepX,
-  SepY,
-  Size,
-  SmallIcon,
-  SpaceAboveBelow,
-  TextColor,
-  TextSelColor,
-  TodayFlagWidth,
-  TodayHeight,
-  TodayWidth,
-  UIMargin,
-  VSepHeight,
-  VSepWidth,
-  WeekHeight,
-  WeekNumHeight,
-  WeekNumWidth,
-  WeekWidth,
-  Width
-};
-
 class CFDE_TextOut;
 class CFGAS_GEFont;
 class CFWL_ThemeBackground;
@@ -92,10 +39,10 @@
 
   virtual void DrawBackground(CFWL_ThemeBackground* pParams);
   virtual void DrawText(CFWL_ThemeText* pParams);
-  virtual void* GetCapacity(CFWL_ThemePart* pThemePart,
-                            CFWL_WidgetCapacity dwCapacity);
   virtual void CalcTextRect(CFWL_ThemeText* pParams, CFX_RectF& rect);
 
+  CFGAS_GEFont* GetFont() const { return m_pFDEFont; }
+
   void SetFont(CFWL_Widget* pWidget,
                const FX_WCHAR* strFont,
                FX_FLOAT fFontSize,
@@ -186,9 +133,6 @@
   uint32_t m_dwRefCount;
   std::unique_ptr<CFDE_TextOut> m_pTextOut;
   CFGAS_GEFont* m_pFDEFont;
-  FX_FLOAT m_fValue;
-  uint32_t m_dwValue;
-  CFX_RectF m_rtMargin;
 };
 
 void FWLTHEME_Release();
diff --git a/xfa/fxfa/app/xfa_ffcheckbutton.cpp b/xfa/fxfa/app/xfa_ffcheckbutton.cpp
index 30ea09f..e8a422e 100644
--- a/xfa/fxfa/app/xfa_ffcheckbutton.cpp
+++ b/xfa/fxfa/app/xfa_ffcheckbutton.cpp
@@ -192,8 +192,7 @@
   }
 }
 void CXFA_FFCheckButton::AddUIMargin(int32_t iCapPlacement) {
-  CFX_RectF rtUIMargin;
-  m_pDataAcc->GetUIMargin(rtUIMargin);
+  CFX_RectF rtUIMargin = m_pDataAcc->GetUIMargin();
   m_rtUI.top -= rtUIMargin.top / 2 - rtUIMargin.height / 2;
   FX_FLOAT fLeftAddRight = rtUIMargin.left + rtUIMargin.width;
   FX_FLOAT fTopAddBottom = rtUIMargin.top + rtUIMargin.height;
diff --git a/xfa/fxfa/app/xfa_fffield.cpp b/xfa/fxfa/app/xfa_fffield.cpp
index 2e15696..0bd6160 100644
--- a/xfa/fxfa/app/xfa_fffield.cpp
+++ b/xfa/fxfa/app/xfa_fffield.cpp
@@ -135,8 +135,7 @@
     FX_FLOAT fScrollOffset = 0;
     CXFA_FFField* pPrev = static_cast<CXFA_FFField*>(GetPrev());
     if (pPrev) {
-      CFX_RectF rtMargin;
-      m_pDataAcc->GetUIMargin(rtMargin);
+      CFX_RectF rtMargin = m_pDataAcc->GetUIMargin();
       fScrollOffset = -rtMargin.top;
     }
     while (pPrev) {
@@ -265,8 +264,7 @@
 void CXFA_FFField::CapTopBottomPlacement(CXFA_Caption caption,
                                          const CFX_RectF& rtWidget,
                                          int32_t iCapPlacement) {
-  CFX_RectF rtUIMargin;
-  m_pDataAcc->GetUIMargin(rtUIMargin);
+  CFX_RectF rtUIMargin = m_pDataAcc->GetUIMargin();
   m_rtCaption.left += rtUIMargin.left;
   if (CXFA_Margin mgCap = caption.GetMargin()) {
     XFA_RectWidthoutMargin(m_rtCaption, mgCap);
@@ -292,8 +290,7 @@
 void CXFA_FFField::CapLeftRightPlacement(CXFA_Caption caption,
                                          const CFX_RectF& rtWidget,
                                          int32_t iCapPlacement) {
-  CFX_RectF rtUIMargin;
-  m_pDataAcc->GetUIMargin(rtUIMargin);
+  CFX_RectF rtUIMargin = m_pDataAcc->GetUIMargin();
   m_rtCaption.top += rtUIMargin.top;
   m_rtCaption.height -= rtUIMargin.top;
   if (CXFA_Margin mgCap = caption.GetMargin()) {
diff --git a/xfa/fxfa/app/xfa_ffimageedit.cpp b/xfa/fxfa/app/xfa_ffimageedit.cpp
index 04ad313..3b063d6 100644
--- a/xfa/fxfa/app/xfa_ffimageedit.cpp
+++ b/xfa/fxfa/app/xfa_ffimageedit.cpp
@@ -107,8 +107,7 @@
   if (!m_pNormalWidget) {
     return;
   }
-  CFX_RectF rtUIMargin;
-  m_pDataAcc->GetUIMargin(rtUIMargin);
+  CFX_RectF rtUIMargin = m_pDataAcc->GetUIMargin();
   CFX_RectF rtImage(m_rtUI);
   rtImage.Deflate(rtUIMargin.left, rtUIMargin.top, rtUIMargin.width,
                   rtUIMargin.height);
diff --git a/xfa/fxfa/app/xfa_ffwidgetacc.cpp b/xfa/fxfa/app/xfa_ffwidgetacc.cpp
index 3ff159a..13145e6 100644
--- a/xfa/fxfa/app/xfa_ffwidgetacc.cpp
+++ b/xfa/fxfa/app/xfa_ffwidgetacc.cpp
@@ -768,8 +768,7 @@
 bool CXFA_WidgetAcc::CalculateFieldAutoSize(CFX_SizeF& size) {
   CFX_SizeF szCap;
   CalcCaptionSize(szCap);
-  CFX_RectF rtUIMargin;
-  GetUIMargin(rtUIMargin);
+  CFX_RectF rtUIMargin = GetUIMargin();
   size.x += rtUIMargin.left + rtUIMargin.width;
   size.y += rtUIMargin.top + rtUIMargin.height;
   if (szCap.x > 0 && szCap.y > 0) {
@@ -883,8 +882,7 @@
           break;
       }
     }
-    CFX_RectF rtUIMargin;
-    GetUIMargin(rtUIMargin);
+    CFX_RectF rtUIMargin = GetUIMargin();
     size.x -= rtUIMargin.left + rtUIMargin.width;
     CXFA_Margin mgWidget = GetMargin();
     if (mgWidget) {
@@ -1168,8 +1166,7 @@
       mgWidget.GetTopInset(fTopInset);
       mgWidget.GetBottomInset(fBottomInset);
     }
-    CFX_RectF rtUIMargin;
-    GetUIMargin(rtUIMargin);
+    CFX_RectF rtUIMargin = GetUIMargin();
     fTopInset += rtUIMargin.top;
     fBottomInset += rtUIMargin.width;
   }
diff --git a/xfa/fxfa/app/xfa_fwltheme.cpp b/xfa/fxfa/app/xfa_fwltheme.cpp
index c08e51f..d12678e 100644
--- a/xfa/fxfa/app/xfa_fwltheme.cpp
+++ b/xfa/fxfa/app/xfa_fwltheme.cpp
@@ -32,6 +32,8 @@
     L"Arial", L"Courier New", L"DejaVu Sans",
 };
 
+const float kLineHeight = 12.0f;
+
 }  // namespace
 
 CXFA_FFWidget* XFA_ThemeGetOuterWidget(CFWL_Widget* pWidget) {
@@ -54,8 +56,6 @@
       m_pCaretTP(new CFWL_CaretTP),
       m_pBarcodeTP(new CFWL_BarcodeTP),
       m_pTextOut(new CFDE_TextOut),
-      m_fCapacity(0.0f),
-      m_dwCapacity(0),
       m_pCalendarFont(nullptr),
       m_pApp(pApp) {
   m_Rect.Reset();
@@ -151,84 +151,80 @@
                             pParams->m_wsText.GetLength(), pParams->m_rtPart);
 }
 
-void* CXFA_FWLTheme::GetCapacity(CFWL_ThemePart* pThemePart,
-                                 CFWL_WidgetCapacity dwCapacity) {
-  switch (dwCapacity) {
-    case CFWL_WidgetCapacity::Font: {
-      if (CXFA_FFWidget* pWidget =
-              XFA_ThemeGetOuterWidget(pThemePart->m_pWidget)) {
-        return pWidget->GetDataAcc()->GetFDEFont();
-      }
-      break;
-    }
-    case CFWL_WidgetCapacity::FontSize: {
-      if (CXFA_FFWidget* pWidget =
-              XFA_ThemeGetOuterWidget(pThemePart->m_pWidget)) {
-        m_fCapacity = pWidget->GetDataAcc()->GetFontSize();
-        return &m_fCapacity;
-      }
-      break;
-    }
-    case CFWL_WidgetCapacity::TextColor: {
-      if (CXFA_FFWidget* pWidget =
-              XFA_ThemeGetOuterWidget(pThemePart->m_pWidget)) {
-        m_dwCapacity = pWidget->GetDataAcc()->GetTextColor();
-        return &m_dwCapacity;
-      }
-      break;
-    }
-    case CFWL_WidgetCapacity::LineHeight: {
-      if (CXFA_FFWidget* pWidget =
-              XFA_ThemeGetOuterWidget(pThemePart->m_pWidget)) {
-        m_fCapacity = pWidget->GetDataAcc()->GetLineHeight();
-        return &m_fCapacity;
-      }
-      break;
-    }
-    case CFWL_WidgetCapacity::ScrollBarWidth: {
-      m_fCapacity = 9;
-      return &m_fCapacity;
-    }
-    case CFWL_WidgetCapacity::UIMargin: {
-      CXFA_FFWidget* pWidget = XFA_ThemeGetOuterWidget(pThemePart->m_pWidget);
-      if (pWidget) {
-        CXFA_LayoutItem* pItem = pWidget;
-        CXFA_WidgetAcc* pWidgetAcc = pWidget->GetDataAcc();
-        pWidgetAcc->GetUIMargin(m_Rect);
-        if (CXFA_Para para = pWidgetAcc->GetPara()) {
-          m_Rect.left += para.GetMarginLeft();
-          if (pWidgetAcc->IsMultiLine()) {
-            m_Rect.width += para.GetMarginRight();
-          }
-        }
-        if (!pItem->GetPrev()) {
-          if (pItem->GetNext()) {
-            m_Rect.height = 0;
-          }
-        } else if (!pItem->GetNext()) {
-          m_Rect.top = 0;
-        } else {
-          m_Rect.top = 0;
-          m_Rect.height = 0;
-        }
-      }
-      return &m_Rect;
-    }
-    case CFWL_WidgetCapacity::SpaceAboveBelow: {
-      CXFA_FFWidget* pWidget = XFA_ThemeGetOuterWidget(pThemePart->m_pWidget);
-      if (pWidget) {
-        CXFA_WidgetAcc* pWidgetAcc = pWidget->GetDataAcc();
-        if (CXFA_Para para = pWidgetAcc->GetPara()) {
-          m_SizeAboveBelow.x = para.GetSpaceAbove();
-          m_SizeAboveBelow.y = para.GetSpaceBelow();
-        }
-      }
-      return &m_SizeAboveBelow;
-    }
-    default:
-      break;
+CFX_RectF CXFA_FWLTheme::GetUIMargin(CFWL_ThemePart* pThemePart) const {
+  CFX_RectF rect;
+  rect.Reset();
+
+  CXFA_FFWidget* pWidget = XFA_ThemeGetOuterWidget(pThemePart->m_pWidget);
+  if (!pWidget)
+    return rect;
+
+  CXFA_LayoutItem* pItem = pWidget;
+  CXFA_WidgetAcc* pWidgetAcc = pWidget->GetDataAcc();
+  rect = pWidgetAcc->GetUIMargin();
+  if (CXFA_Para para = pWidgetAcc->GetPara()) {
+    rect.left += para.GetMarginLeft();
+    if (pWidgetAcc->IsMultiLine())
+      rect.width += para.GetMarginRight();
   }
-  return GetTheme(pThemePart->m_pWidget)->GetCapacity(pThemePart, dwCapacity);
+  if (!pItem->GetPrev()) {
+    if (pItem->GetNext())
+      rect.height = 0;
+  } else if (!pItem->GetNext()) {
+    rect.top = 0;
+  } else {
+    rect.top = 0;
+    rect.height = 0;
+  }
+  return rect;
+}
+
+float CXFA_FWLTheme::GetCXBorderSize() const {
+  return 1.0f;
+}
+
+float CXFA_FWLTheme::GetCYBorderSize() const {
+  return 1.0f;
+}
+
+float CXFA_FWLTheme::GetFontSize(CFWL_ThemePart* pThemePart) const {
+  if (CXFA_FFWidget* pWidget = XFA_ThemeGetOuterWidget(pThemePart->m_pWidget))
+    return pWidget->GetDataAcc()->GetFontSize();
+  return FWLTHEME_CAPACITY_FontSize;
+}
+
+CFGAS_GEFont* CXFA_FWLTheme::GetFont(CFWL_ThemePart* pThemePart) const {
+  if (CXFA_FFWidget* pWidget = XFA_ThemeGetOuterWidget(pThemePart->m_pWidget))
+    return pWidget->GetDataAcc()->GetFDEFont();
+  return GetTheme(pThemePart->m_pWidget)->GetFont();
+}
+
+float CXFA_FWLTheme::GetLineHeight(CFWL_ThemePart* pThemePart) const {
+  if (CXFA_FFWidget* pWidget = XFA_ThemeGetOuterWidget(pThemePart->m_pWidget))
+    return pWidget->GetDataAcc()->GetLineHeight();
+  return kLineHeight;
+}
+
+float CXFA_FWLTheme::GetScrollBarWidth() const {
+  return 9.0f;
+}
+
+FX_COLORREF CXFA_FWLTheme::GetTextColor(CFWL_ThemePart* pThemePart) const {
+  if (CXFA_FFWidget* pWidget = XFA_ThemeGetOuterWidget(pThemePart->m_pWidget))
+    return pWidget->GetDataAcc()->GetTextColor();
+  return FWLTHEME_CAPACITY_TextColor;
+}
+
+CFX_SizeF CXFA_FWLTheme::GetSpaceAboveBelow(CFWL_ThemePart* pThemePart) const {
+  CFX_SizeF sizeAboveBelow;
+  if (CXFA_FFWidget* pWidget = XFA_ThemeGetOuterWidget(pThemePart->m_pWidget)) {
+    CXFA_WidgetAcc* pWidgetAcc = pWidget->GetDataAcc();
+    if (CXFA_Para para = pWidgetAcc->GetPara()) {
+      sizeAboveBelow.x = para.GetSpaceAbove();
+      sizeAboveBelow.y = para.GetSpaceBelow();
+    }
+  }
+  return sizeAboveBelow;
 }
 
 void CXFA_FWLTheme::CalcTextRect(CFWL_ThemeText* pParams, CFX_RectF& rect) {
@@ -263,7 +259,7 @@
                             pParams->m_wsText.GetLength(), rect);
 }
 
-CFWL_WidgetTP* CXFA_FWLTheme::GetTheme(CFWL_Widget* pWidget) {
+CFWL_WidgetTP* CXFA_FWLTheme::GetTheme(CFWL_Widget* pWidget) const {
   switch (pWidget->GetClassID()) {
     case FWL_Type::CheckBox:
       return m_pCheckBoxTP.get();
diff --git a/xfa/fxfa/app/xfa_fwltheme.h b/xfa/fxfa/app/xfa_fwltheme.h
index 98fd74c..f8b8048 100644
--- a/xfa/fxfa/app/xfa_fwltheme.h
+++ b/xfa/fxfa/app/xfa_fwltheme.h
@@ -32,12 +32,20 @@
   // IFWL_ThemeProvider:
   void DrawBackground(CFWL_ThemeBackground* pParams) override;
   void DrawText(CFWL_ThemeText* pParams) override;
-  void* GetCapacity(CFWL_ThemePart* pThemePart,
-                    CFWL_WidgetCapacity dwCapacity) override;
   void CalcTextRect(CFWL_ThemeText* pParams, CFX_RectF& rect) override;
+  float GetCXBorderSize() const override;
+  float GetCYBorderSize() const override;
+  CFX_RectF GetUIMargin(CFWL_ThemePart* pThemePart) const override;
+  float GetFontSize(CFWL_ThemePart* pThemePart) const override;
+  CFGAS_GEFont* GetFont(CFWL_ThemePart* pThemePart) const override;
+  float GetLineHeight(CFWL_ThemePart* pThemePart) const override;
+  float GetScrollBarWidth() const override;
+  FX_COLORREF GetTextColor(CFWL_ThemePart* pThemePart) const override;
+  CFX_SizeF GetSpaceAboveBelow(CFWL_ThemePart* pThemePart) const override;
 
  private:
-  CFWL_WidgetTP* GetTheme(CFWL_Widget* pWidget);
+  CFWL_WidgetTP* GetTheme(CFWL_Widget* pWidget) const;
+
   std::unique_ptr<CFWL_CheckBoxTP> m_pCheckBoxTP;
   std::unique_ptr<CFWL_ListBoxTP> m_pListBoxTP;
   std::unique_ptr<CFWL_PictureBoxTP> m_pPictureBoxTP;
@@ -50,13 +58,10 @@
   std::unique_ptr<CFWL_CaretTP> m_pCaretTP;
   std::unique_ptr<CFWL_BarcodeTP> m_pBarcodeTP;
   std::unique_ptr<CFDE_TextOut> m_pTextOut;
-  FX_FLOAT m_fCapacity;
-  uint32_t m_dwCapacity;
   CFGAS_GEFont* m_pCalendarFont;
   CFX_WideString m_wsResource;
   CXFA_FFApp* const m_pApp;
   CFX_RectF m_Rect;
-  CFX_SizeF m_SizeAboveBelow;
 };
 
 CXFA_FFWidget* XFA_ThemeGetOuterWidget(CFWL_Widget* pWidget);
diff --git a/xfa/fxfa/parser/cxfa_widgetdata.cpp b/xfa/fxfa/parser/cxfa_widgetdata.cpp
index 48a26aa..80c50b7 100644
--- a/xfa/fxfa/parser/cxfa_widgetdata.cpp
+++ b/xfa/fxfa/parser/cxfa_widgetdata.cpp
@@ -399,29 +399,27 @@
   return TryMeasure(XFA_ATTRIBUTE_MaxH, fMaxHeight);
 }
 
-CXFA_Border CXFA_WidgetData::GetUIBorder(bool bModified) {
+CXFA_Border CXFA_WidgetData::GetUIBorder() {
   CXFA_Node* pUIChild = GetUIChild();
-  return CXFA_Border(
-      pUIChild ? pUIChild->GetProperty(0, XFA_Element::Border, bModified)
-               : nullptr);
+  return CXFA_Border(pUIChild
+                         ? pUIChild->GetProperty(0, XFA_Element::Border, false)
+                         : nullptr);
 }
 
-CXFA_Margin CXFA_WidgetData::GetUIMargin(bool bModified) {
-  CXFA_Node* pUIChild = GetUIChild();
-  return CXFA_Margin(
-      pUIChild ? pUIChild->GetProperty(0, XFA_Element::Margin, bModified)
-               : nullptr);
-}
-
-void CXFA_WidgetData::GetUIMargin(CFX_RectF& rtUIMargin) {
+CFX_RectF CXFA_WidgetData::GetUIMargin() {
+  CFX_RectF rtUIMargin;
   rtUIMargin.Reset();
-  CXFA_Margin mgUI = GetUIMargin();
+
+  CXFA_Node* pUIChild = GetUIChild();
+  CXFA_Margin mgUI = CXFA_Margin(
+      pUIChild ? pUIChild->GetProperty(0, XFA_Element::Margin, false)
+               : nullptr);
   if (!mgUI)
-    return;
+    return rtUIMargin;
 
   CXFA_Border border = GetUIBorder();
   if (border && border.GetPresence() != XFA_ATTRIBUTEENUM_Visible)
-    return;
+    return rtUIMargin;
 
   FX_FLOAT fLeftInset, fTopInset, fRightInset, fBottomInset;
   bool bLeft = mgUI.GetLeftInset(fLeftInset);
@@ -446,6 +444,7 @@
     }
   }
   rtUIMargin.Set(fLeftInset, fTopInset, fRightInset, fBottomInset);
+  return rtUIMargin;
 }
 
 int32_t CXFA_WidgetData::GetButtonHighlight() {
diff --git a/xfa/fxfa/parser/cxfa_widgetdata.h b/xfa/fxfa/parser/cxfa_widgetdata.h
index 0079996..7986fa9 100644
--- a/xfa/fxfa/parser/cxfa_widgetdata.h
+++ b/xfa/fxfa/parser/cxfa_widgetdata.h
@@ -69,9 +69,8 @@
   bool GetMinHeight(FX_FLOAT& fMinHeight);
   bool GetMaxWidth(FX_FLOAT& fMaxWidth);
   bool GetMaxHeight(FX_FLOAT& fMaxHeight);
-  CXFA_Border GetUIBorder(bool bModified = false);
-  CXFA_Margin GetUIMargin(bool bModified = false);
-  void GetUIMargin(CFX_RectF& rtUIMargin);
+  CXFA_Border GetUIBorder();
+  CFX_RectF GetUIMargin();
   int32_t GetButtonHighlight();
   bool GetButtonRollover(CFX_WideString& wsRollover, bool& bRichText);
   bool GetButtonDown(CFX_WideString& wsDown, bool& bRichText);
