diff --git a/BUILD.gn b/BUILD.gn
index 81e43a1..49adca5 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -917,7 +917,6 @@
       "xfa/fde/css/fde_cssstylesheet.h",
       "xfa/fde/css/fde_csssyntax.cpp",
       "xfa/fde/css/fde_csssyntax.h",
-      "xfa/fde/fde_brush.h",
       "xfa/fde/fde_gedevice.cpp",
       "xfa/fde/fde_gedevice.h",
       "xfa/fde/fde_geobject.cpp",
@@ -927,7 +926,6 @@
       "xfa/fde/fde_iterator.h",
       "xfa/fde/fde_object.h",
       "xfa/fde/fde_path.h",
-      "xfa/fde/fde_pen.h",
       "xfa/fde/fde_render.cpp",
       "xfa/fde/fde_render.h",
       "xfa/fde/fde_renderdevice.h",
diff --git a/core/fxge/include/fx_ge.h b/core/fxge/include/fx_ge.h
index 2a3a025..9818d18 100644
--- a/core/fxge/include/fx_ge.h
+++ b/core/fxge/include/fx_ge.h
@@ -170,13 +170,10 @@
 class CFX_GraphStateData {
  public:
   CFX_GraphStateData();
-
   CFX_GraphStateData(const CFX_GraphStateData& src);
-
   ~CFX_GraphStateData();
 
   void Copy(const CFX_GraphStateData& src);
-
   void SetDashCount(int count);
 
   typedef enum { LineCapButt = 0, LineCapRound = 1, LineCapSquare = 2 } LineCap;
diff --git a/xfa.gyp b/xfa.gyp
index cb3893a..b15f41c 100644
--- a/xfa.gyp
+++ b/xfa.gyp
@@ -61,7 +61,6 @@
         "xfa/fde/css/fde_cssstylesheet.h",
         "xfa/fde/css/fde_csssyntax.cpp",
         "xfa/fde/css/fde_csssyntax.h",
-        "xfa/fde/fde_brush.h",
         "xfa/fde/fde_renderdevice.h",
         "xfa/fde/fde_gedevice.cpp",
         "xfa/fde/fde_gedevice.h",
@@ -72,7 +71,6 @@
         "xfa/fde/fde_iterator.h",
         "xfa/fde/fde_object.h",
         "xfa/fde/fde_path.h",
-        "xfa/fde/fde_pen.h",
         "xfa/fde/fde_render.cpp",
         "xfa/fde/fde_render.h",
         "xfa/fde/tto/fde_textout.cpp",
diff --git a/xfa/fde/fde_brush.h b/xfa/fde/fde_brush.h
deleted file mode 100644
index a9e99b0..0000000
--- a/xfa/fde/fde_brush.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_FDE_FDE_BRUSH_H_
-#define XFA_FDE_FDE_BRUSH_H_
-
-#include "core/fxcrt/include/fx_system.h"
-#include "core/fxge/include/fx_dib.h"
-
-#define FDE_BRUSHTYPE_Unknown -1
-#define FDE_BRUSHTYPE_Solid 0
-#define FDE_BRUSHTYPE_MAX 0
-
-class IFDE_Brush {
- public:
-  static IFDE_Brush* Create(int32_t iType);
-  virtual ~IFDE_Brush() {}
-  virtual void Release() = 0;
-  virtual int32_t GetType() const = 0;
-};
-
-class IFDE_SolidBrush : public IFDE_Brush {
- public:
-  virtual FX_ARGB GetColor() const = 0;
-  virtual void SetColor(FX_ARGB color) = 0;
-  virtual const CFX_Matrix& GetMatrix() const = 0;
-  virtual void ResetMatrix() = 0;
-  virtual void TranslateMatrix(FX_FLOAT dx, FX_FLOAT dy) = 0;
-  virtual void RotateMatrix(FX_FLOAT fRadian) = 0;
-  virtual void ScaleMatrix(FX_FLOAT sx, FX_FLOAT sy) = 0;
-  virtual void ConcatMatrix(const CFX_Matrix& matrix) = 0;
-  virtual void SetMatrix(const CFX_Matrix& matrix) = 0;
-};
-
-#endif  // XFA_FDE_FDE_BRUSH_H_
diff --git a/xfa/fde/fde_gedevice.cpp b/xfa/fde/fde_gedevice.cpp
index 28bf889..e289ef9 100644
--- a/xfa/fde/fde_gedevice.cpp
+++ b/xfa/fde/fde_gedevice.cpp
@@ -8,11 +8,9 @@
 
 #include <algorithm>
 
-#include "xfa/fde/fde_brush.h"
 #include "xfa/fde/fde_geobject.h"
 #include "xfa/fde/fde_image.h"
 #include "xfa/fde/fde_object.h"
-#include "xfa/fde/fde_pen.h"
 
 IFDE_RenderDevice* IFDE_RenderDevice::Create(CFX_DIBitmap* pBitmap,
                                              FX_BOOL bRgbByteOrder) {
@@ -116,7 +114,7 @@
   m_pDevice->CancelDIBits(handle);
   return handle != NULL;
 }
-FX_BOOL CFDE_FxgeDevice::DrawString(IFDE_Brush* pBrush,
+FX_BOOL CFDE_FxgeDevice::DrawString(CFDE_Brush* pBrush,
                                     IFX_Font* pFont,
                                     const FXTEXT_CHARPOS* pCharPos,
                                     int32_t iCount,
@@ -126,89 +124,91 @@
                iCount > 0);
   CFX_FontCache* pCache = CFX_GEModule::Get()->GetFontCache();
   CFX_Font* pFxFont = (CFX_Font*)pFont->GetDevFont();
-  switch (pBrush->GetType()) {
-    case FDE_BRUSHTYPE_Solid: {
-      FX_ARGB argb = ((IFDE_SolidBrush*)pBrush)->GetColor();
-      if ((pFont->GetFontStyles() & FX_FONTSTYLE_Italic) != 0 &&
-          !pFxFont->IsItalic()) {
-        FXTEXT_CHARPOS* pCP = (FXTEXT_CHARPOS*)pCharPos;
-        FX_FLOAT* pAM;
-        for (int32_t i = 0; i < iCount; ++i) {
-          static const FX_FLOAT mc = 0.267949f;
-          pAM = pCP->m_AdjustMatrix;
-          pAM[2] = mc * pAM[0] + pAM[2];
-          pAM[3] = mc * pAM[1] + pAM[3];
-          pCP++;
-        }
-      }
-      FXTEXT_CHARPOS* pCP = (FXTEXT_CHARPOS*)pCharPos;
-      IFX_Font* pCurFont = NULL;
-      IFX_Font* pSTFont = NULL;
-      FXTEXT_CHARPOS* pCurCP = NULL;
-      int32_t iCurCount = 0;
+
+  FX_ARGB argb = pBrush->GetColor();
+  if ((pFont->GetFontStyles() & FX_FONTSTYLE_Italic) != 0 &&
+      !pFxFont->IsItalic()) {
+    FXTEXT_CHARPOS* pCP = (FXTEXT_CHARPOS*)pCharPos;
+    FX_FLOAT* pAM;
+    for (int32_t i = 0; i < iCount; ++i) {
+      static const FX_FLOAT mc = 0.267949f;
+      pAM = pCP->m_AdjustMatrix;
+      pAM[2] = mc * pAM[0] + pAM[2];
+      pAM[3] = mc * pAM[1] + pAM[3];
+      pCP++;
+    }
+  }
+  FXTEXT_CHARPOS* pCP = (FXTEXT_CHARPOS*)pCharPos;
+  IFX_Font* pCurFont = NULL;
+  IFX_Font* pSTFont = NULL;
+  FXTEXT_CHARPOS* pCurCP = NULL;
+  int32_t iCurCount = 0;
+
 #if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
-      uint32_t dwFontStyle = pFont->GetFontStyles();
-      CFX_Font FxFont;
-      CFX_SubstFont SubstFxFont;
-      FxFont.SetSubstFont(&SubstFxFont);
-      SubstFxFont.m_Weight = dwFontStyle & FX_FONTSTYLE_Bold ? 700 : 400;
-      SubstFxFont.m_WeightCJK = SubstFxFont.m_Weight;
-      SubstFxFont.m_ItalicAngle = dwFontStyle & FX_FONTSTYLE_Italic ? -12 : 0;
-      SubstFxFont.m_bItlicCJK = !!(dwFontStyle & FX_FONTSTYLE_Italic);
+  uint32_t dwFontStyle = pFont->GetFontStyles();
+  CFX_Font FxFont;
+  CFX_SubstFont SubstFxFont;
+  FxFont.SetSubstFont(&SubstFxFont);
+  SubstFxFont.m_Weight = dwFontStyle & FX_FONTSTYLE_Bold ? 700 : 400;
+  SubstFxFont.m_WeightCJK = SubstFxFont.m_Weight;
+  SubstFxFont.m_ItalicAngle = dwFontStyle & FX_FONTSTYLE_Italic ? -12 : 0;
+  SubstFxFont.m_bItlicCJK = !!(dwFontStyle & FX_FONTSTYLE_Italic);
 #endif  // _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
-      for (int32_t i = 0; i < iCount; ++i) {
-        pSTFont = pFont->GetSubstFont((int32_t)pCP->m_GlyphIndex);
-        pCP->m_GlyphIndex &= 0x00FFFFFF;
-        pCP->m_bFontStyle = FALSE;
-        if (pCurFont != pSTFont) {
-          if (pCurFont != NULL) {
-            pFxFont = (CFX_Font*)pCurFont->GetDevFont();
-#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
-            FxFont.SetFace(pFxFont->GetFace());
-            m_pDevice->DrawNormalText(iCurCount, pCurCP, &FxFont, pCache,
-                                      -fFontSize, (const CFX_Matrix*)pMatrix,
-                                      argb, FXTEXT_CLEARTYPE);
-#else
-            m_pDevice->DrawNormalText(iCurCount, pCurCP, pFxFont, pCache,
-                                      -fFontSize, (const CFX_Matrix*)pMatrix,
-                                      argb, FXTEXT_CLEARTYPE);
-#endif  // _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
-          }
-          pCurFont = pSTFont;
-          pCurCP = pCP;
-          iCurCount = 1;
-        } else {
-          iCurCount++;
-        }
-        pCP++;
-      }
-      if (pCurFont != NULL && iCurCount) {
+
+  for (int32_t i = 0; i < iCount; ++i) {
+    pSTFont = pFont->GetSubstFont((int32_t)pCP->m_GlyphIndex);
+    pCP->m_GlyphIndex &= 0x00FFFFFF;
+    pCP->m_bFontStyle = FALSE;
+    if (pCurFont != pSTFont) {
+      if (pCurFont != NULL) {
         pFxFont = (CFX_Font*)pCurFont->GetDevFont();
+
 #if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
         FxFont.SetFace(pFxFont->GetFace());
-        FX_BOOL bRet = m_pDevice->DrawNormalText(
-            iCurCount, pCurCP, &FxFont, pCache, -fFontSize,
-            (const CFX_Matrix*)pMatrix, argb, FXTEXT_CLEARTYPE);
-        FxFont.SetSubstFont(nullptr);
-        FxFont.SetFace(nullptr);
-        return bRet;
+        m_pDevice->DrawNormalText(iCurCount, pCurCP, &FxFont, pCache,
+                                  -fFontSize, (const CFX_Matrix*)pMatrix, argb,
+                                  FXTEXT_CLEARTYPE);
 #else
-        return m_pDevice->DrawNormalText(iCurCount, pCurCP, pFxFont, pCache,
-                                         -fFontSize, (const CFX_Matrix*)pMatrix,
-                                         argb, FXTEXT_CLEARTYPE);
+        m_pDevice->DrawNormalText(iCurCount, pCurCP, pFxFont, pCache,
+                                  -fFontSize, (const CFX_Matrix*)pMatrix, argb,
+                                  FXTEXT_CLEARTYPE);
 #endif  // _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
       }
-#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
-      FxFont.SetSubstFont(nullptr);
-      FxFont.SetFace(nullptr);
-#endif  // _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
-      return TRUE;
-    } break;
-    default:
-      return FALSE;
+      pCurFont = pSTFont;
+      pCurCP = pCP;
+      iCurCount = 1;
+    } else {
+      iCurCount++;
+    }
+    pCP++;
   }
+  if (pCurFont != NULL && iCurCount) {
+    pFxFont = (CFX_Font*)pCurFont->GetDevFont();
+
+#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
+    FxFont.SetFace(pFxFont->GetFace());
+    FX_BOOL bRet = m_pDevice->DrawNormalText(
+        iCurCount, pCurCP, &FxFont, pCache, -fFontSize,
+        (const CFX_Matrix*)pMatrix, argb, FXTEXT_CLEARTYPE);
+    FxFont.SetSubstFont(nullptr);
+    FxFont.SetFace(nullptr);
+    return bRet;
+#else
+    return m_pDevice->DrawNormalText(iCurCount, pCurCP, pFxFont, pCache,
+                                     -fFontSize, (const CFX_Matrix*)pMatrix,
+                                     argb, FXTEXT_CLEARTYPE);
+#endif  // _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
+  }
+
+#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
+  FxFont.SetSubstFont(nullptr);
+  FxFont.SetFace(nullptr);
+#endif  // _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
+
+  return TRUE;
 }
-FX_BOOL CFDE_FxgeDevice::DrawBezier(IFDE_Pen* pPen,
+
+FX_BOOL CFDE_FxgeDevice::DrawBezier(CFDE_Pen* pPen,
                                     FX_FLOAT fPenWidth,
                                     const CFX_PointF& pt1,
                                     const CFX_PointF& pt2,
@@ -224,7 +224,7 @@
   path.AddBezier(points);
   return DrawPath(pPen, fPenWidth, &path, pMatrix);
 }
-FX_BOOL CFDE_FxgeDevice::DrawCurve(IFDE_Pen* pPen,
+FX_BOOL CFDE_FxgeDevice::DrawCurve(CFDE_Pen* pPen,
                                    FX_FLOAT fPenWidth,
                                    const CFX_PointsF& points,
                                    FX_BOOL bClosed,
@@ -234,7 +234,7 @@
   path.AddCurve(points, bClosed, fTension);
   return DrawPath(pPen, fPenWidth, &path, pMatrix);
 }
-FX_BOOL CFDE_FxgeDevice::DrawEllipse(IFDE_Pen* pPen,
+FX_BOOL CFDE_FxgeDevice::DrawEllipse(CFDE_Pen* pPen,
                                      FX_FLOAT fPenWidth,
                                      const CFX_RectF& rect,
                                      const CFX_Matrix* pMatrix) {
@@ -242,7 +242,7 @@
   path.AddEllipse(rect);
   return DrawPath(pPen, fPenWidth, &path, pMatrix);
 }
-FX_BOOL CFDE_FxgeDevice::DrawLines(IFDE_Pen* pPen,
+FX_BOOL CFDE_FxgeDevice::DrawLines(CFDE_Pen* pPen,
                                    FX_FLOAT fPenWidth,
                                    const CFX_PointsF& points,
                                    const CFX_Matrix* pMatrix) {
@@ -250,7 +250,7 @@
   path.AddLines(points);
   return DrawPath(pPen, fPenWidth, &path, pMatrix);
 }
-FX_BOOL CFDE_FxgeDevice::DrawLine(IFDE_Pen* pPen,
+FX_BOOL CFDE_FxgeDevice::DrawLine(CFDE_Pen* pPen,
                                   FX_FLOAT fPenWidth,
                                   const CFX_PointF& pt1,
                                   const CFX_PointF& pt2,
@@ -259,7 +259,7 @@
   path.AddLine(pt1, pt2);
   return DrawPath(pPen, fPenWidth, &path, pMatrix);
 }
-FX_BOOL CFDE_FxgeDevice::DrawPath(IFDE_Pen* pPen,
+FX_BOOL CFDE_FxgeDevice::DrawPath(CFDE_Pen* pPen,
                                   FX_FLOAT fPenWidth,
                                   const IFDE_Path* pPath,
                                   const CFX_Matrix* pMatrix) {
@@ -274,7 +274,7 @@
   return m_pDevice->DrawPath(&pGePath->m_Path, (const CFX_Matrix*)pMatrix,
                              &graphState, 0, pPen->GetColor(), 0);
 }
-FX_BOOL CFDE_FxgeDevice::DrawPolygon(IFDE_Pen* pPen,
+FX_BOOL CFDE_FxgeDevice::DrawPolygon(CFDE_Pen* pPen,
                                      FX_FLOAT fPenWidth,
                                      const CFX_PointsF& points,
                                      const CFX_Matrix* pMatrix) {
@@ -282,7 +282,7 @@
   path.AddPolygon(points);
   return DrawPath(pPen, fPenWidth, &path, pMatrix);
 }
-FX_BOOL CFDE_FxgeDevice::DrawRectangle(IFDE_Pen* pPen,
+FX_BOOL CFDE_FxgeDevice::DrawRectangle(CFDE_Pen* pPen,
                                        FX_FLOAT fPenWidth,
                                        const CFX_RectF& rect,
                                        const CFX_Matrix* pMatrix) {
@@ -290,7 +290,7 @@
   path.AddRectangle(rect);
   return DrawPath(pPen, fPenWidth, &path, pMatrix);
 }
-FX_BOOL CFDE_FxgeDevice::FillClosedCurve(IFDE_Brush* pBrush,
+FX_BOOL CFDE_FxgeDevice::FillClosedCurve(CFDE_Brush* pBrush,
                                          const CFX_PointsF& points,
                                          FX_FLOAT fTension,
                                          const CFX_Matrix* pMatrix) {
@@ -298,95 +298,50 @@
   path.AddCurve(points, TRUE, fTension);
   return FillPath(pBrush, &path, pMatrix);
 }
-FX_BOOL CFDE_FxgeDevice::FillEllipse(IFDE_Brush* pBrush,
+FX_BOOL CFDE_FxgeDevice::FillEllipse(CFDE_Brush* pBrush,
                                      const CFX_RectF& rect,
                                      const CFX_Matrix* pMatrix) {
   CFDE_Path path;
   path.AddEllipse(rect);
   return FillPath(pBrush, &path, pMatrix);
 }
-FX_BOOL CFDE_FxgeDevice::FillPolygon(IFDE_Brush* pBrush,
+FX_BOOL CFDE_FxgeDevice::FillPolygon(CFDE_Brush* pBrush,
                                      const CFX_PointsF& points,
                                      const CFX_Matrix* pMatrix) {
   CFDE_Path path;
   path.AddPolygon(points);
   return FillPath(pBrush, &path, pMatrix);
 }
-FX_BOOL CFDE_FxgeDevice::FillRectangle(IFDE_Brush* pBrush,
+FX_BOOL CFDE_FxgeDevice::FillRectangle(CFDE_Brush* pBrush,
                                        const CFX_RectF& rect,
                                        const CFX_Matrix* pMatrix) {
   CFDE_Path path;
   path.AddRectangle(rect);
   return FillPath(pBrush, &path, pMatrix);
 }
-FX_BOOL CFDE_FxgeDevice::CreatePen(IFDE_Pen* pPen,
+FX_BOOL CFDE_FxgeDevice::CreatePen(CFDE_Pen* pPen,
                                    FX_FLOAT fPenWidth,
                                    CFX_GraphStateData& graphState) {
-  if (pPen == NULL) {
+  if (!pPen)
     return FALSE;
-  }
-  graphState.m_LineCap = (CFX_GraphStateData::LineCap)pPen->GetLineCap();
-  graphState.m_LineJoin = (CFX_GraphStateData::LineJoin)pPen->GetLineJoin();
+
+  graphState.m_LineCap = CFX_GraphStateData::LineCapButt;
+  graphState.m_LineJoin = CFX_GraphStateData::LineJoinMiter;
   graphState.m_LineWidth = fPenWidth;
-  graphState.m_MiterLimit = pPen->GetMiterLimit();
-  graphState.m_DashPhase = pPen->GetDashPhase();
-  CFX_FloatArray dashArray;
-  switch (pPen->GetDashStyle()) {
-    case FDE_DASHSTYLE_Dash:
-      dashArray.Add(3);
-      dashArray.Add(1);
-      break;
-    case FDE_DASHSTYLE_Dot:
-      dashArray.Add(1);
-      dashArray.Add(1);
-      break;
-    case FDE_DASHSTYLE_DashDot:
-      dashArray.Add(3);
-      dashArray.Add(1);
-      dashArray.Add(1);
-      dashArray.Add(1);
-      break;
-    case FDE_DASHSTYLE_DashDotDot:
-      dashArray.Add(3);
-      dashArray.Add(1);
-      dashArray.Add(1);
-      dashArray.Add(1);
-      dashArray.Add(1);
-      dashArray.Add(1);
-      break;
-    case FDE_DASHSTYLE_Customized:
-      pPen->GetDashArray(dashArray);
-      break;
-  }
-  int32_t iDashCount = dashArray.GetSize();
-  if (iDashCount > 0) {
-    graphState.SetDashCount(iDashCount);
-    for (int32_t i = 0; i < iDashCount; ++i) {
-      graphState.m_DashArray[i] = dashArray[i] * fPenWidth;
-    }
-  }
+  graphState.m_MiterLimit = 10;
+  graphState.m_DashPhase = 0;
   return TRUE;
 }
 
-FX_BOOL CFDE_FxgeDevice::FillPath(IFDE_Brush* pBrush,
+FX_BOOL CFDE_FxgeDevice::FillPath(CFDE_Brush* pBrush,
                                   const IFDE_Path* pPath,
                                   const CFX_Matrix* pMatrix) {
   CFDE_Path* pGePath = (CFDE_Path*)pPath;
   if (!pGePath)
     return FALSE;
-
   if (!pBrush)
     return FALSE;
-
-  return FillSolidPath(pBrush, &pGePath->m_Path, pMatrix);
+  return m_pDevice->DrawPath(&pGePath->m_Path, pMatrix, nullptr,
+                             pBrush->GetColor(), 0, FXFILL_WINDING);
 }
 
-FX_BOOL CFDE_FxgeDevice::FillSolidPath(IFDE_Brush* pBrush,
-                                       const CFX_PathData* pPath,
-                                       const CFX_Matrix* pMatrix) {
-  FXSYS_assert(pPath && pBrush && pBrush->GetType() == FDE_BRUSHTYPE_Solid);
-
-  IFDE_SolidBrush* pSolidBrush = static_cast<IFDE_SolidBrush*>(pBrush);
-  return m_pDevice->DrawPath(pPath, (const CFX_Matrix*)pMatrix, NULL,
-                             pSolidBrush->GetColor(), 0, FXFILL_WINDING);
-}
diff --git a/xfa/fde/fde_gedevice.h b/xfa/fde/fde_gedevice.h
index c497b1c..4d43ea0 100644
--- a/xfa/fde/fde_gedevice.h
+++ b/xfa/fde/fde_gedevice.h
@@ -33,77 +33,74 @@
                             const CFX_RectF& dstRect,
                             const CFX_Matrix* pImgMatrix = NULL,
                             const CFX_Matrix* pDevMatrix = NULL);
-  virtual FX_BOOL DrawString(IFDE_Brush* pBrush,
+  virtual FX_BOOL DrawString(CFDE_Brush* pBrush,
                              IFX_Font* pFont,
                              const FXTEXT_CHARPOS* pCharPos,
                              int32_t iCount,
                              FX_FLOAT fFontSize,
                              const CFX_Matrix* pMatrix = NULL);
-  virtual FX_BOOL DrawBezier(IFDE_Pen* pPen,
+  virtual FX_BOOL DrawBezier(CFDE_Pen* pPen,
                              FX_FLOAT fPenWidth,
                              const CFX_PointF& pt1,
                              const CFX_PointF& pt2,
                              const CFX_PointF& pt3,
                              const CFX_PointF& pt4,
                              const CFX_Matrix* pMatrix = NULL);
-  virtual FX_BOOL DrawCurve(IFDE_Pen* pPen,
+  virtual FX_BOOL DrawCurve(CFDE_Pen* pPen,
                             FX_FLOAT fPenWidth,
                             const CFX_PointsF& points,
                             FX_BOOL bClosed,
                             FX_FLOAT fTension = 0.5f,
                             const CFX_Matrix* pMatrix = NULL);
-  virtual FX_BOOL DrawEllipse(IFDE_Pen* pPen,
+  virtual FX_BOOL DrawEllipse(CFDE_Pen* pPen,
                               FX_FLOAT fPenWidth,
                               const CFX_RectF& rect,
                               const CFX_Matrix* pMatrix = NULL);
-  virtual FX_BOOL DrawLines(IFDE_Pen* pPen,
+  virtual FX_BOOL DrawLines(CFDE_Pen* pPen,
                             FX_FLOAT fPenWidth,
                             const CFX_PointsF& points,
                             const CFX_Matrix* pMatrix = NULL);
-  virtual FX_BOOL DrawLine(IFDE_Pen* pPen,
+  virtual FX_BOOL DrawLine(CFDE_Pen* pPen,
                            FX_FLOAT fPenWidth,
                            const CFX_PointF& pt1,
                            const CFX_PointF& pt2,
                            const CFX_Matrix* pMatrix = NULL);
-  virtual FX_BOOL DrawPath(IFDE_Pen* pPen,
+  virtual FX_BOOL DrawPath(CFDE_Pen* pPen,
                            FX_FLOAT fPenWidth,
                            const IFDE_Path* pPath,
                            const CFX_Matrix* pMatrix = NULL);
-  virtual FX_BOOL DrawPolygon(IFDE_Pen* pPen,
+  virtual FX_BOOL DrawPolygon(CFDE_Pen* pPen,
                               FX_FLOAT fPenWidth,
                               const CFX_PointsF& points,
                               const CFX_Matrix* pMatrix = NULL);
-  virtual FX_BOOL DrawRectangle(IFDE_Pen* pPen,
+  virtual FX_BOOL DrawRectangle(CFDE_Pen* pPen,
                                 FX_FLOAT fPenWidth,
                                 const CFX_RectF& rect,
                                 const CFX_Matrix* pMatrix = NULL);
-  virtual FX_BOOL FillClosedCurve(IFDE_Brush* pBrush,
+  virtual FX_BOOL FillClosedCurve(CFDE_Brush* pBrush,
                                   const CFX_PointsF& points,
                                   FX_FLOAT fTension = 0.5f,
                                   const CFX_Matrix* pMatrix = NULL);
-  virtual FX_BOOL FillEllipse(IFDE_Brush* pBrush,
+  virtual FX_BOOL FillEllipse(CFDE_Brush* pBrush,
                               const CFX_RectF& rect,
                               const CFX_Matrix* pMatrix = NULL);
-  virtual FX_BOOL FillPath(IFDE_Brush* pBrush,
+  virtual FX_BOOL FillPath(CFDE_Brush* pBrush,
                            const IFDE_Path* pPath,
                            const CFX_Matrix* pMatrix = NULL);
-  virtual FX_BOOL FillPolygon(IFDE_Brush* pBrush,
+  virtual FX_BOOL FillPolygon(CFDE_Brush* pBrush,
                               const CFX_PointsF& points,
                               const CFX_Matrix* pMatrix = NULL);
-  virtual FX_BOOL FillRectangle(IFDE_Brush* pBrush,
+  virtual FX_BOOL FillRectangle(CFDE_Brush* pBrush,
                                 const CFX_RectF& rect,
                                 const CFX_Matrix* pMatrix = NULL);
-  FX_BOOL FillSolidPath(IFDE_Brush* pBrush,
-                        const CFX_PathData* pPath,
-                        const CFX_Matrix* pMatrix);
 
-  FX_BOOL DrawSolidString(IFDE_Brush* pBrush,
+  FX_BOOL DrawSolidString(CFDE_Brush* pBrush,
                           IFX_Font* pFont,
                           const FXTEXT_CHARPOS* pCharPos,
                           int32_t iCount,
                           FX_FLOAT fFontSize,
                           const CFX_Matrix* pMatrix);
-  FX_BOOL DrawStringPath(IFDE_Brush* pBrush,
+  FX_BOOL DrawStringPath(CFDE_Brush* pBrush,
                          IFX_Font* pFont,
                          const FXTEXT_CHARPOS* pCharPos,
                          int32_t iCount,
@@ -111,7 +108,7 @@
                          const CFX_Matrix* pMatrix);
 
  protected:
-  FX_BOOL CreatePen(IFDE_Pen* pPen,
+  FX_BOOL CreatePen(CFDE_Pen* pPen,
                     FX_FLOAT fPenWidth,
                     CFX_GraphStateData& graphState);
 
diff --git a/xfa/fde/fde_object.h b/xfa/fde/fde_object.h
index e749778..7df5de2 100644
--- a/xfa/fde/fde_object.h
+++ b/xfa/fde/fde_object.h
@@ -10,109 +10,29 @@
 #include <cstdint>
 
 #include "core/fxge/include/fx_dib.h"
-#include "xfa/fde/fde_brush.h"
-#include "xfa/fde/fde_pen.h"
 #include "xfa/fgas/crt/fgas_memory.h"
 
-class CFDE_Pen : public IFDE_Pen, public CFX_Target {
+class CFDE_Brush : public CFX_Target {
  public:
-  CFDE_Pen()
-      : m_Color(0),
-        m_iLineCap(0),
-        m_iLineJoin(0),
-        m_iDashStyle(0),
-        m_fDashPhase(0),
-        m_fMiterLimit(10),
-        m_bAutoRelease(FALSE),
-        m_pBrush(NULL) {}
+  CFDE_Brush() : m_Color(0xFF000000) {}
 
-  ~CFDE_Pen() {
-    if (m_pBrush && m_bAutoRelease) {
-      m_pBrush->Release();
-    }
-  }
-  virtual void Release() { delete this; }
+  FX_ARGB GetColor() const { return m_Color; }
+  void SetColor(FX_ARGB color) { m_Color = color; }
 
-  virtual int32_t GetType() const {
-    return m_pBrush ? m_pBrush->GetType() : FDE_PENTYPE_SolidColor;
-  }
-
-  virtual FX_ARGB GetColor() const { return m_Color; }
-  virtual void SetColor(FX_ARGB color) { m_Color = color; }
-  virtual IFDE_Brush* GetBrush() const { return m_pBrush; }
-  virtual void SetBrush(IFDE_Brush* pBrush, FX_BOOL bAutoRelease) {
-    m_bAutoRelease = bAutoRelease;
-    m_pBrush = pBrush;
-    if (m_pBrush && m_pBrush->GetType() == FDE_BRUSHTYPE_Solid) {
-      m_Color = ((IFDE_SolidBrush*)m_pBrush)->GetColor();
-    }
-  }
-  virtual int32_t GetLineCap() const { return m_iLineCap; }
-  virtual void SetLineCap(int32_t iLineCap) { m_iLineCap = iLineCap; }
-  virtual int32_t GetDashStyle() const { return m_iDashStyle; }
-  virtual void SetDashStyle(int32_t iDashStyle) { m_iDashStyle = iDashStyle; }
-  virtual FX_FLOAT GetDashPhase() const { return m_fDashPhase; }
-  virtual void SetDashPhase(FX_FLOAT fPhase) { m_fDashPhase = fPhase; }
-  virtual int32_t CountDashArray() const { return m_DashArray.GetSize(); }
-  virtual int32_t GetDashArray(CFX_FloatArray& dashArray) const {
-    dashArray.Copy(m_DashArray);
-    return dashArray.GetSize();
-  }
-  virtual void SetDashArray(const CFX_FloatArray& dashArray) {
-    m_DashArray.Copy(dashArray);
-  }
-  virtual int32_t GetLineJoin() const { return m_iLineJoin; }
-  virtual void SetLineJoin(int32_t iLineJoin) { m_iLineJoin = iLineJoin; }
-  virtual FX_FLOAT GetMiterLimit() const { return m_fMiterLimit; }
-  virtual void SetMiterLimit(FX_FLOAT fMiterLimit) {
-    m_fMiterLimit = fMiterLimit;
-  }
-  virtual int32_t CountCompoundPatterns() const {
-    return m_CompoundPatterns.GetSize();
-  }
-  virtual FX_BOOL GetCompoundPatterns(
-      CFDE_CompoundPatterns& compoundPatterns) const {
-    return compoundPatterns.Copy(m_CompoundPatterns), TRUE;
-  }
-  virtual FX_BOOL SetCompoundPatterns(
-      const CFDE_CompoundPatterns& compoundPatterns) {
-    return m_CompoundPatterns.Copy(compoundPatterns), TRUE;
-  }
-
+ private:
   FX_ARGB m_Color;
-  int32_t m_iLineCap;
-  int32_t m_iLineJoin;
-  int32_t m_iDashStyle;
-  FX_FLOAT m_fDashPhase;
-  FX_FLOAT m_fMiterLimit;
-  FX_BOOL m_bAutoRelease;
-  IFDE_Brush* m_pBrush;
-  CFX_FloatArray m_DashArray;
-  CFDE_CompoundPatterns m_CompoundPatterns;
 };
 
-class CFDE_SolidBrush : public IFDE_SolidBrush, public CFX_Target {
+class CFDE_Pen : public CFX_Target {
  public:
-  CFDE_SolidBrush() : m_Color(0xFF000000) { m_Matrix.SetIdentity(); }
+  CFDE_Pen() : m_Color(0) {}
+  ~CFDE_Pen() {}
 
-  virtual void Release() { delete this; }
-  virtual int32_t GetType() const { return FDE_BRUSHTYPE_Solid; }
-  virtual const CFX_Matrix& GetMatrix() const { return m_Matrix; }
-  virtual void ResetMatrix() { m_Matrix.SetIdentity(); }
-  virtual void TranslateMatrix(FX_FLOAT dx, FX_FLOAT dy) {
-    m_Matrix.Translate(dx, dy);
-  }
-  virtual void RotateMatrix(FX_FLOAT fRadian) { m_Matrix.Rotate(fRadian); }
-  virtual void ScaleMatrix(FX_FLOAT sx, FX_FLOAT sy) { m_Matrix.Scale(sx, sy); }
-  virtual void ConcatMatrix(const CFX_Matrix& matrix) {
-    m_Matrix.Concat(matrix);
-  }
-  virtual void SetMatrix(const CFX_Matrix& matrix) { m_Matrix = matrix; }
-  virtual FX_ARGB GetColor() const { return m_Color; }
-  virtual void SetColor(FX_ARGB color) { m_Color = color; }
+  FX_ARGB GetColor() const { return m_Color; }
+  void SetColor(FX_ARGB color) { m_Color = color; }
 
+ private:
   FX_ARGB m_Color;
-  CFX_Matrix m_Matrix;
 };
 
 #endif  // XFA_FDE_FDE_OBJECT_H_
diff --git a/xfa/fde/fde_pen.h b/xfa/fde/fde_pen.h
deleted file mode 100644
index 9253726..0000000
--- a/xfa/fde/fde_pen.h
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_FDE_FDE_PEN_H_
-#define XFA_FDE_FDE_PEN_H_
-
-class IFDE_Pen;
-
-#define FDE_PENTYPE_SolidColor FDE_BRUSHTYPE_Solid
-
-#define FDE_DASHSTYLE_Solid 0
-#define FDE_DASHSTYLE_Dash 1
-#define FDE_DASHSTYLE_Dot 2
-#define FDE_DASHSTYLE_DashDot 3
-#define FDE_DASHSTYLE_DashDotDot 4
-#define FDE_DASHSTYLE_Customized 5
-
-#define FDE_LINEJOIN_Miter 0
-#define FDE_LINEJOIN_Round 1
-#define FDE_LINEJOIN_Bevel 2
-
-#define FDE_LINECAP_Flat 0
-#define FDE_LINECAP_Round 1
-#define FDE_LINECAP_Square 2
-
-struct FDE_COMPOUNDPATTERN {
-  FX_FLOAT pos;
-  FX_FLOAT width;
-};
-typedef CFX_ArrayTemplate<FDE_COMPOUNDPATTERN> CFDE_CompoundPatterns;
-
-class IFDE_Pen {
- public:
-  virtual ~IFDE_Pen() {}
-
-  virtual void Release() = 0;
-  virtual int32_t GetType() const = 0;
-  virtual FX_ARGB GetColor() const = 0;
-  virtual void SetColor(FX_ARGB color) = 0;
-  virtual IFDE_Brush* GetBrush() const = 0;
-  virtual void SetBrush(IFDE_Brush* pBrush, FX_BOOL bAutoRelease) = 0;
-  virtual int32_t GetLineCap() const = 0;
-  virtual void SetLineCap(int32_t iLineCap) = 0;
-  virtual int32_t GetDashStyle() const = 0;
-  virtual void SetDashStyle(int32_t iDashStyle) = 0;
-  virtual FX_FLOAT GetDashPhase() const = 0;
-  virtual void SetDashPhase(FX_FLOAT fPhase) = 0;
-  virtual int32_t CountDashArray() const = 0;
-  virtual int32_t GetDashArray(CFX_FloatArray& dashArray) const = 0;
-  virtual void SetDashArray(const CFX_FloatArray& dashArray) = 0;
-  virtual int32_t GetLineJoin() const = 0;
-  virtual void SetLineJoin(int32_t iLineJoin) = 0;
-  virtual FX_FLOAT GetMiterLimit() const = 0;
-  virtual void SetMiterLimit(FX_FLOAT fMiterLimit) = 0;
-  virtual int32_t CountCompoundPatterns() const = 0;
-  virtual FX_BOOL GetCompoundPatterns(
-      CFDE_CompoundPatterns& compoundPatterns) const = 0;
-  virtual FX_BOOL SetCompoundPatterns(
-      const CFDE_CompoundPatterns& compoundPatterns) = 0;
-};
-
-#endif  // XFA_FDE_FDE_PEN_H_
diff --git a/xfa/fde/fde_render.cpp b/xfa/fde/fde_render.cpp
index fed8313..59bb5f1 100644
--- a/xfa/fde/fde_render.cpp
+++ b/xfa/fde/fde_render.cpp
@@ -24,7 +24,7 @@
                               IFDE_CanvasSet* pCanvasSet,
                               const CFX_Matrix& tmDoc2Device);
   virtual FDE_RENDERSTATUS GetStatus() const { return m_eStatus; }
-  virtual FDE_RENDERSTATUS DoRender(IFX_Pause* pPause = NULL);
+  virtual FDE_RENDERSTATUS DoRender(IFX_Pause* pPause = nullptr);
   virtual void StopRender();
   void RenderPath(IFDE_PathSet* pPathSet, FDE_HVISUALOBJ hPath);
   void RenderText(IFDE_TextSet* pTextSet, FDE_HVISUALOBJ hText);
@@ -36,7 +36,7 @@
  protected:
   FDE_RENDERSTATUS m_eStatus;
   IFDE_RenderDevice* m_pRenderDevice;
-  IFDE_SolidBrush* m_pSolidBrush;
+  CFDE_Brush* m_pBrush;
   CFX_Matrix m_Transform;
   FXTEXT_CHARPOS* m_pCharPos;
   int32_t m_iCharPosCount;
@@ -93,51 +93,52 @@
   }
   pageMatrix = m;
 }
+
 IFDE_RenderContext* IFDE_RenderContext::Create() {
   return new CFDE_RenderContext;
 }
+
 CFDE_RenderContext::CFDE_RenderContext()
     : m_eStatus(FDE_RENDERSTATUS_Reset),
-      m_pRenderDevice(NULL),
-      m_pSolidBrush(NULL),
+      m_pRenderDevice(nullptr),
+      m_pBrush(nullptr),
       m_Transform(),
-      m_pCharPos(NULL),
+      m_pCharPos(nullptr),
       m_iCharPosCount(0),
-      m_pIterator(NULL) {
+      m_pIterator(nullptr) {
   m_Transform.SetIdentity();
 }
+
 CFDE_RenderContext::~CFDE_RenderContext() {
   StopRender();
 }
+
 FX_BOOL CFDE_RenderContext::StartRender(IFDE_RenderDevice* pRenderDevice,
                                         IFDE_CanvasSet* pCanvasSet,
                                         const CFX_Matrix& tmDoc2Device) {
-  if (m_pRenderDevice != NULL) {
+  if (m_pRenderDevice)
     return FALSE;
-  }
-  if (pRenderDevice == NULL) {
+  if (!pRenderDevice)
     return FALSE;
-  }
-  if (pCanvasSet == NULL) {
+  if (!pCanvasSet)
     return FALSE;
-  }
 
   m_eStatus = FDE_RENDERSTATUS_Paused;
   m_pRenderDevice = pRenderDevice;
   m_Transform = tmDoc2Device;
-  if (m_pIterator == NULL) {
+  if (!m_pIterator) {
     m_pIterator = IFDE_VisualSetIterator::Create();
-    FXSYS_assert(m_pIterator != NULL);
+    FXSYS_assert(m_pIterator);
   }
   return m_pIterator->AttachCanvas(pCanvasSet) && m_pIterator->FilterObjects();
 }
+
 FDE_RENDERSTATUS CFDE_RenderContext::DoRender(IFX_Pause* pPause) {
-  if (m_pRenderDevice == NULL) {
+  if (!m_pRenderDevice)
     return FDE_RENDERSTATUS_Failed;
-  }
-  if (m_pIterator == NULL) {
+  if (!m_pIterator)
     return FDE_RENDERSTATUS_Failed;
-  }
+
   FDE_RENDERSTATUS eStatus = FDE_RENDERSTATUS_Paused;
   CFX_Matrix rm;
   rm.SetReverse(m_Transform);
@@ -154,15 +155,15 @@
   int32_t iCount = 0;
   while (TRUE) {
     hVisualObj = m_pIterator->GetNext(pVisualSet);
-    if (hVisualObj == NULL || pVisualSet == NULL) {
+    if (!hVisualObj || !pVisualSet) {
       eStatus = FDE_RENDERSTATUS_Done;
       break;
     }
     rtObj.Empty();
     pVisualSet->GetRect(hVisualObj, rtObj);
-    if (!rtDocClip.IntersectWith(rtObj)) {
+    if (!rtDocClip.IntersectWith(rtObj))
       continue;
-    }
+
     switch (pVisualSet->GetType()) {
       case FDE_VISUALOBJ_Text:
         RenderText((IFDE_TextSet*)pVisualSet, hVisualObj);
@@ -181,13 +182,14 @@
       default:
         break;
     }
-    if (iCount >= 100 && pPause != NULL && pPause->NeedToPauseNow()) {
+    if (iCount >= 100 && pPause && pPause->NeedToPauseNow()) {
       eStatus = FDE_RENDERSTATUS_Paused;
       break;
     }
   }
   return m_eStatus = eStatus;
 }
+
 void CFDE_RenderContext::StopRender() {
   m_eStatus = FDE_RENDERSTATUS_Reset;
   m_pRenderDevice = nullptr;
@@ -196,87 +198,85 @@
     m_pIterator->Release();
     m_pIterator = nullptr;
   }
-  if (m_pSolidBrush) {
-    m_pSolidBrush->Release();
-    m_pSolidBrush = nullptr;
+  if (m_pBrush) {
+    delete m_pBrush;
+    m_pBrush = nullptr;
   }
   FX_Free(m_pCharPos);
   m_pCharPos = nullptr;
   m_iCharPosCount = 0;
 }
+
 void CFDE_RenderContext::RenderText(IFDE_TextSet* pTextSet,
                                     FDE_HVISUALOBJ hText) {
-  FXSYS_assert(m_pRenderDevice != NULL);
-  FXSYS_assert(pTextSet != NULL && hText != NULL);
+  FXSYS_assert(m_pRenderDevice);
+  FXSYS_assert(pTextSet && hText);
+
   IFX_Font* pFont = pTextSet->GetFont(hText);
-  if (pFont == NULL) {
+  if (!pFont)
     return;
-  }
-  int32_t iCount = pTextSet->GetDisplayPos(hText, NULL, FALSE);
-  if (iCount < 1) {
+
+  int32_t iCount = pTextSet->GetDisplayPos(hText, nullptr, FALSE);
+  if (iCount < 1)
     return;
-  }
-  if (m_pSolidBrush == NULL) {
-    m_pSolidBrush = new CFDE_SolidBrush;
-    if (m_pSolidBrush == NULL) {
-      return;
-    }
-  }
-  if (m_pCharPos == NULL) {
+
+  if (!m_pBrush)
+    m_pBrush = new CFDE_Brush;
+
+  if (!m_pCharPos)
     m_pCharPos = FX_Alloc(FXTEXT_CHARPOS, iCount);
-  } else if (m_iCharPosCount < iCount) {
+  else if (m_iCharPosCount < iCount)
     m_pCharPos = FX_Realloc(FXTEXT_CHARPOS, m_pCharPos, iCount);
-  }
-  if (m_iCharPosCount < iCount) {
+
+  if (m_iCharPosCount < iCount)
     m_iCharPosCount = iCount;
-  }
+
   iCount = pTextSet->GetDisplayPos(hText, m_pCharPos, FALSE);
   FX_FLOAT fFontSize = pTextSet->GetFontSize(hText);
   FX_ARGB dwColor = pTextSet->GetFontColor(hText);
-  m_pSolidBrush->SetColor(dwColor);
+  m_pBrush->SetColor(dwColor);
   FDE_HDEVICESTATE hState;
   FX_BOOL bClip = ApplyClip(pTextSet, hText, hState);
-  m_pRenderDevice->DrawString(m_pSolidBrush, pFont, m_pCharPos, iCount,
-                              fFontSize, &m_Transform);
-  if (bClip) {
+  m_pRenderDevice->DrawString(m_pBrush, pFont, m_pCharPos, iCount, fFontSize,
+                              &m_Transform);
+  if (bClip)
     RestoreClip(hState);
-  }
 }
+
 void CFDE_RenderContext::RenderPath(IFDE_PathSet* pPathSet,
                                     FDE_HVISUALOBJ hPath) {
-  FXSYS_assert(m_pRenderDevice != NULL);
-  FXSYS_assert(pPathSet != NULL && hPath != NULL);
+  FXSYS_assert(m_pRenderDevice);
+  FXSYS_assert(pPathSet && hPath);
+
   IFDE_Path* pPath = pPathSet->GetPath(hPath);
-  if (pPath == NULL) {
+  if (!pPath)
     return;
-  }
+
   FDE_HDEVICESTATE hState;
   FX_BOOL bClip = ApplyClip(pPathSet, hPath, hState);
   int32_t iRenderMode = pPathSet->GetRenderMode(hPath);
   if (iRenderMode & FDE_PATHRENDER_Stroke) {
-    IFDE_Pen* pPen = pPathSet->GetPen(hPath);
+    CFDE_Pen* pPen = pPathSet->GetPen(hPath);
     FX_FLOAT fWidth = pPathSet->GetPenWidth(hPath);
-    if (pPen != NULL && fWidth > 0) {
+    if (pPen && fWidth > 0)
       m_pRenderDevice->DrawPath(pPen, fWidth, pPath, &m_Transform);
-    }
   }
   if (iRenderMode & FDE_PATHRENDER_Fill) {
-    IFDE_Brush* pBrush = pPathSet->GetBrush(hPath);
-    if (pBrush != NULL) {
+    CFDE_Brush* pBrush = pPathSet->GetBrush(hPath);
+    if (pBrush)
       m_pRenderDevice->FillPath(pBrush, pPath, &m_Transform);
-    }
   }
-  if (bClip) {
+  if (bClip)
     RestoreClip(hState);
-  }
 }
+
 FX_BOOL CFDE_RenderContext::ApplyClip(IFDE_VisualSet* pVisualSet,
                                       FDE_HVISUALOBJ hObj,
                                       FDE_HDEVICESTATE& hState) {
   CFX_RectF rtClip;
-  if (!pVisualSet->GetClip(hObj, rtClip)) {
+  if (!pVisualSet->GetClip(hObj, rtClip))
     return FALSE;
-  }
+
   CFX_RectF rtObj;
   pVisualSet->GetRect(hObj, rtObj);
   rtClip.Offset(rtObj.left, rtObj.top);
@@ -286,6 +286,7 @@
   hState = m_pRenderDevice->SaveState();
   return m_pRenderDevice->SetClipRect(rtClip);
 }
+
 void CFDE_RenderContext::RestoreClip(FDE_HDEVICESTATE hState) {
   m_pRenderDevice->RestoreState(hState);
 }
diff --git a/xfa/fde/fde_renderdevice.h b/xfa/fde/fde_renderdevice.h
index 55f6524..f068659 100644
--- a/xfa/fde/fde_renderdevice.h
+++ b/xfa/fde/fde_renderdevice.h
@@ -13,8 +13,8 @@
 #include "xfa/fde/fde_path.h"
 #include "xfa/fgas/font/fgas_font.h"
 
-class IFDE_Pen;
-class IFDE_Brush;
+class CFDE_Pen;
+class CFDE_Brush;
 class CFX_DIBitmap;
 class CFX_DIBSource;
 
@@ -45,64 +45,64 @@
                             const CFX_RectF& dstRect,
                             const CFX_Matrix* pImgMatrix = NULL,
                             const CFX_Matrix* pDevMatrix = NULL) = 0;
-  virtual FX_BOOL DrawString(IFDE_Brush* pBrush,
+  virtual FX_BOOL DrawString(CFDE_Brush* pBrush,
                              IFX_Font* pFont,
                              const FXTEXT_CHARPOS* pCharPos,
                              int32_t iCount,
                              FX_FLOAT fFontSize,
                              const CFX_Matrix* pMatrix = NULL) = 0;
-  virtual FX_BOOL DrawBezier(IFDE_Pen* pPen,
+  virtual FX_BOOL DrawBezier(CFDE_Pen* pPen,
                              FX_FLOAT fPenWidth,
                              const CFX_PointF& pt1,
                              const CFX_PointF& pt2,
                              const CFX_PointF& pt3,
                              const CFX_PointF& pt4,
                              const CFX_Matrix* pMatrix = NULL) = 0;
-  virtual FX_BOOL DrawCurve(IFDE_Pen* pPen,
+  virtual FX_BOOL DrawCurve(CFDE_Pen* pPen,
                             FX_FLOAT fPenWidth,
                             const CFX_PointsF& points,
                             FX_BOOL bClosed,
                             FX_FLOAT fTension = 0.5f,
                             const CFX_Matrix* pMatrix = NULL) = 0;
-  virtual FX_BOOL DrawEllipse(IFDE_Pen* pPen,
+  virtual FX_BOOL DrawEllipse(CFDE_Pen* pPen,
                               FX_FLOAT fPenWidth,
                               const CFX_RectF& rect,
                               const CFX_Matrix* pMatrix = NULL) = 0;
-  virtual FX_BOOL DrawLines(IFDE_Pen* pPen,
+  virtual FX_BOOL DrawLines(CFDE_Pen* pPen,
                             FX_FLOAT fPenWidth,
                             const CFX_PointsF& points,
                             const CFX_Matrix* pMatrix = NULL) = 0;
-  virtual FX_BOOL DrawLine(IFDE_Pen* pPen,
+  virtual FX_BOOL DrawLine(CFDE_Pen* pPen,
                            FX_FLOAT fPenWidth,
                            const CFX_PointF& pt1,
                            const CFX_PointF& pt2,
                            const CFX_Matrix* pMatrix = NULL) = 0;
-  virtual FX_BOOL DrawPath(IFDE_Pen* pPen,
+  virtual FX_BOOL DrawPath(CFDE_Pen* pPen,
                            FX_FLOAT fPenWidth,
                            const IFDE_Path* pPath,
                            const CFX_Matrix* pMatrix = NULL) = 0;
-  virtual FX_BOOL DrawPolygon(IFDE_Pen* pPen,
+  virtual FX_BOOL DrawPolygon(CFDE_Pen* pPen,
                               FX_FLOAT fPenWidth,
                               const CFX_PointsF& points,
                               const CFX_Matrix* pMatrix = NULL) = 0;
-  virtual FX_BOOL DrawRectangle(IFDE_Pen* pPen,
+  virtual FX_BOOL DrawRectangle(CFDE_Pen* pPen,
                                 FX_FLOAT fPenWidth,
                                 const CFX_RectF& rect,
                                 const CFX_Matrix* pMatrix = NULL) = 0;
-  virtual FX_BOOL FillClosedCurve(IFDE_Brush* pBrush,
+  virtual FX_BOOL FillClosedCurve(CFDE_Brush* pBrush,
                                   const CFX_PointsF& points,
                                   FX_FLOAT fTension = 0.5f,
                                   const CFX_Matrix* pMatrix = NULL) = 0;
-  virtual FX_BOOL FillEllipse(IFDE_Brush* pBrush,
+  virtual FX_BOOL FillEllipse(CFDE_Brush* pBrush,
                               const CFX_RectF& rect,
                               const CFX_Matrix* pMatrix = NULL) = 0;
-  virtual FX_BOOL FillPath(IFDE_Brush* pBrush,
+  virtual FX_BOOL FillPath(CFDE_Brush* pBrush,
                            const IFDE_Path* pPath,
                            const CFX_Matrix* pMatrix = NULL) = 0;
-  virtual FX_BOOL FillPolygon(IFDE_Brush* pBrush,
+  virtual FX_BOOL FillPolygon(CFDE_Brush* pBrush,
                               const CFX_PointsF& points,
                               const CFX_Matrix* pMatrix = NULL) = 0;
-  virtual FX_BOOL FillRectangle(IFDE_Brush* pBrush,
+  virtual FX_BOOL FillRectangle(CFDE_Brush* pBrush,
                                 const CFX_RectF& rect,
                                 const CFX_Matrix* pMatrix = NULL) = 0;
 };
diff --git a/xfa/fde/fde_visualset.h b/xfa/fde/fde_visualset.h
index 6dcb42c..2c95253 100644
--- a/xfa/fde/fde_visualset.h
+++ b/xfa/fde/fde_visualset.h
@@ -11,10 +11,9 @@
 #include "core/fxcrt/include/fx_system.h"
 #include "core/fxge/include/fx_dib.h"
 #include "core/fxge/include/fx_ge.h"
-#include "xfa/fde/fde_brush.h"
 #include "xfa/fde/fde_image.h"
+#include "xfa/fde/fde_object.h"
 #include "xfa/fde/fde_path.h"
-#include "xfa/fde/fde_pen.h"
 #include "xfa/fgas/font/fgas_font.h"
 
 enum FDE_VISUALOBJTYPE {
@@ -78,9 +77,9 @@
   virtual IFDE_Path* GetPath(FDE_HVISUALOBJ hPath) = 0;
   virtual int32_t GetFillMode(FDE_HVISUALOBJ hPath) = 0;
   virtual int32_t GetRenderMode(FDE_HVISUALOBJ hPath) = 0;
-  virtual IFDE_Pen* GetPen(FDE_HVISUALOBJ hPath) = 0;
+  virtual CFDE_Pen* GetPen(FDE_HVISUALOBJ hPath) = 0;
   virtual FX_FLOAT GetPenWidth(FDE_HVISUALOBJ hPath) = 0;
-  virtual IFDE_Brush* GetBrush(FDE_HVISUALOBJ hPath) = 0;
+  virtual CFDE_Brush* GetBrush(FDE_HVISUALOBJ hPath) = 0;
 };
 
 enum FDE_WIDGETOBJ {
diff --git a/xfa/fde/tto/fde_textout.cpp b/xfa/fde/tto/fde_textout.cpp
index 49d3abb..265db25 100644
--- a/xfa/fde/tto/fde_textout.cpp
+++ b/xfa/fde/tto/fde_textout.cpp
@@ -10,9 +10,7 @@
 
 #include "core/fxcrt/include/fx_coordinates.h"
 #include "core/fxcrt/include/fx_system.h"
-#include "xfa/fde/fde_brush.h"
 #include "xfa/fde/fde_object.h"
-#include "xfa/fde/fde_pen.h"
 #include "xfa/fde/fde_renderdevice.h"
 #include "xfa/fgas/crt/fgas_memory.h"
 #include "xfa/fgas/crt/fgas_utils.h"
@@ -145,7 +143,7 @@
   int32_t GetCharRects(FDE_LPTTOPIECE pPiece);
 
   void ToTextRun(const FDE_LPTTOPIECE pPiece, FX_TXTRUN& tr);
-  void DrawLine(const FDE_LPTTOPIECE pPiece, IFDE_Pen*& pPen);
+  void DrawLine(const FDE_LPTTOPIECE pPiece, CFDE_Pen*& pPen);
 
   IFX_TxtBreak* m_pTxtBreak;
   IFX_Font* m_pFont;
@@ -951,9 +949,9 @@
   if (iLines < 1) {
     return;
   }
-  IFDE_SolidBrush* pBrush = new CFDE_SolidBrush;
+  CFDE_Brush* pBrush = new CFDE_Brush;
   pBrush->SetColor(m_TxtColor);
-  IFDE_Pen* pPen = NULL;
+  CFDE_Pen* pPen = NULL;
   FDE_HDEVICESTATE hDev = m_pRenderDevice->SaveState();
   if (rtClip.Width() > 0.0f && rtClip.Height() > 0.0f) {
     m_pRenderDevice->SetClipRect(rtClip);
@@ -975,12 +973,8 @@
     }
   }
   m_pRenderDevice->RestoreState(hDev);
-  if (pBrush) {
-    pBrush->Release();
-  }
-  if (pPen) {
-    pPen->Release();
-  }
+  delete pBrush;
+  delete pPen;
 }
 int32_t CFDE_TextOut::GetDisplayPos(FDE_LPTTOPIECE pPiece) {
   FX_TXTRUN tr;
@@ -1008,7 +1002,7 @@
   tr.wLineBreakChar = m_wParagraphBkChar;
   tr.pRect = &pPiece->rtPiece;
 }
-void CFDE_TextOut::DrawLine(const FDE_LPTTOPIECE pPiece, IFDE_Pen*& pPen) {
+void CFDE_TextOut::DrawLine(const FDE_LPTTOPIECE pPiece, CFDE_Pen*& pPen) {
   FX_BOOL bUnderLine = !!(m_dwStyles & FDE_TTOSTYLE_Underline);
   FX_BOOL bStrikeOut = !!(m_dwStyles & FDE_TTOSTYLE_Strikeout);
   FX_BOOL bHotKey = !!(m_dwStyles & FDE_TTOSTYLE_HotKey);
diff --git a/xfa/fxfa/app/xfa_textlayout.cpp b/xfa/fxfa/app/xfa_textlayout.cpp
index a15fb95..4a20cbb 100644
--- a/xfa/fxfa/app/xfa_textlayout.cpp
+++ b/xfa/fxfa/app/xfa_textlayout.cpp
@@ -11,7 +11,6 @@
 #include "core/fxcrt/include/fx_ext.h"
 #include "xfa/fde/css/fde_csscache.h"
 #include "xfa/fde/fde_object.h"
-#include "xfa/fde/fde_pen.h"
 #include "xfa/fde/xml/fde_xml_imp.h"
 #include "xfa/fgas/crt/fgas_algorithm.h"
 #include "xfa/fgas/crt/fgas_codepage.h"
@@ -1223,8 +1222,8 @@
   }
   FDE_HDEVICESTATE state = pDevice->SaveState();
   pDevice->SetClipRect(rtClip);
-  IFDE_SolidBrush* pSolidBrush = new CFDE_SolidBrush;
-  IFDE_Pen* pPen = new CFDE_Pen;
+  CFDE_Brush* pSolidBrush = new CFDE_Brush;
+  CFDE_Pen* pPen = new CFDE_Pen;
   FXSYS_assert(pDevice);
 
   if (m_pieceLines.GetSize() == 0) {
@@ -1271,8 +1270,8 @@
   }
   pDevice->RestoreState(state);
   FX_Free(pCharPos);
-  pSolidBrush->Release();
-  pPen->Release();
+  delete pSolidBrush;
+  delete pPen;
   pDevice->Release();
   return iPieceLines;
 }
@@ -1840,7 +1839,7 @@
   m_iLines++;
 }
 void CXFA_TextLayout::RenderString(IFDE_RenderDevice* pDevice,
-                                   IFDE_SolidBrush* pBrush,
+                                   CFDE_Brush* pBrush,
                                    CXFA_PieceLine* pPieceLine,
                                    int32_t iPiece,
                                    FXTEXT_CHARPOS* pCharPos,
@@ -1855,7 +1854,7 @@
   pPieceLine->m_charCounts.Add(iCount);
 }
 void CXFA_TextLayout::RenderPath(IFDE_RenderDevice* pDevice,
-                                 IFDE_Pen* pPen,
+                                 CFDE_Pen* pPen,
                                  CXFA_PieceLine* pPieceLine,
                                  int32_t iPiece,
                                  FXTEXT_CHARPOS* pCharPos,
diff --git a/xfa/fxfa/app/xfa_textlayout.h b/xfa/fxfa/app/xfa_textlayout.h
index 5d3ce16..a96c537 100644
--- a/xfa/fxfa/app/xfa_textlayout.h
+++ b/xfa/fxfa/app/xfa_textlayout.h
@@ -8,7 +8,6 @@
 #define XFA_FXFA_APP_XFA_TEXTLAYOUT_H_
 
 #include "xfa/fde/css/fde_css.h"
-#include "xfa/fde/fde_brush.h"
 #include "xfa/fde/fde_renderdevice.h"
 #include "xfa/fgas/layout/fgas_rtfbreak.h"
 #include "xfa/fxfa/include/xfa_ffdoc.h"
@@ -378,13 +377,13 @@
   void ProcessText(CFX_WideString& wsText);
   void UpdateAlign(FX_FLOAT fHeight, FX_FLOAT fBottom);
   void RenderString(IFDE_RenderDevice* pDevice,
-                    IFDE_SolidBrush* pBrush,
+                    CFDE_Brush* pBrush,
                     CXFA_PieceLine* pPieceLine,
                     int32_t iPiece,
                     FXTEXT_CHARPOS* pCharPos,
                     const CFX_Matrix& tmDoc2Device);
   void RenderPath(IFDE_RenderDevice* pDevice,
-                  IFDE_Pen* pPen,
+                  CFDE_Pen* pPen,
                   CXFA_PieceLine* pPieceLine,
                   int32_t iPiece,
                   FXTEXT_CHARPOS* pCharPos,
