diff --git a/BUILD.gn b/BUILD.gn
index 3ecc9a9..bdc7570 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -897,6 +897,8 @@
 
   static_library("xfa") {
     sources = [
+      "xfa/fde/cfde_path.cpp",
+      "xfa/fde/cfde_path.h",
       "xfa/fde/css/fde_css.h",
       "xfa/fde/css/fde_csscache.cpp",
       "xfa/fde/css/fde_csscache.h",
@@ -911,16 +913,12 @@
       "xfa/fde/css/fde_csssyntax.cpp",
       "xfa/fde/css/fde_csssyntax.h",
       "xfa/fde/fde_gedevice.cpp",
-      "xfa/fde/fde_gedevice.h",
-      "xfa/fde/fde_geobject.cpp",
       "xfa/fde/fde_geobject.h",
       "xfa/fde/fde_iterator.cpp",
       "xfa/fde/fde_iterator.h",
       "xfa/fde/fde_object.h",
-      "xfa/fde/fde_path.h",
       "xfa/fde/fde_render.cpp",
       "xfa/fde/fde_render.h",
-      "xfa/fde/fde_renderdevice.h",
       "xfa/fde/tto/fde_textout.cpp",
       "xfa/fde/tto/fde_textout.h",
       "xfa/fde/xml/fde_xml.h",
diff --git a/xfa.gyp b/xfa.gyp
index 57152d8..ce7d720 100644
--- a/xfa.gyp
+++ b/xfa.gyp
@@ -61,15 +61,13 @@
         "xfa/fde/css/fde_cssstylesheet.h",
         "xfa/fde/css/fde_csssyntax.cpp",
         "xfa/fde/css/fde_csssyntax.h",
-        "xfa/fde/fde_renderdevice.h",
+        "xfa/fde/cfde_path.cpp",
+        "xfa/fde/cfde_path.h",
         "xfa/fde/fde_gedevice.cpp",
         "xfa/fde/fde_gedevice.h",
-        "xfa/fde/fde_geobject.cpp",
-        "xfa/fde/fde_geobject.h",
         "xfa/fde/fde_iterator.cpp",
         "xfa/fde/fde_iterator.h",
         "xfa/fde/fde_object.h",
-        "xfa/fde/fde_path.h",
         "xfa/fde/fde_render.cpp",
         "xfa/fde/fde_render.h",
         "xfa/fde/tto/fde_textout.cpp",
diff --git a/xfa/fde/fde_geobject.cpp b/xfa/fde/cfde_path.cpp
similarity index 89%
rename from xfa/fde/fde_geobject.cpp
rename to xfa/fde/cfde_path.cpp
index f4aede0..7ea458d 100644
--- a/xfa/fde/fde_geobject.cpp
+++ b/xfa/fde/cfde_path.cpp
@@ -4,57 +4,59 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#include "xfa/fde/fde_geobject.h"
+#include "xfa/fde/cfde_path.h"
 
 #include "xfa/fde/fde_object.h"
 
-IFDE_Path* IFDE_Path::Create() {
-  return new CFDE_Path;
-}
 FX_BOOL CFDE_Path::StartFigure() {
   return CloseFigure();
 }
+
 FX_BOOL CFDE_Path::CloseFigure() {
   FX_PATHPOINT* pPoint = GetLastPoint();
-  if (pPoint) {
+  if (pPoint)
     pPoint->m_Flag |= FXPT_CLOSEFIGURE;
-  }
   return TRUE;
 }
+
 FX_PATHPOINT* CFDE_Path::GetLastPoint(int32_t iCount) const {
-  if (iCount < 1) {
-    return NULL;
-  }
+  if (iCount < 1)
+    return nullptr;
+
   int32_t iPoints = m_Path.GetPointCount();
-  if (iCount > iPoints) {
-    return NULL;
-  }
+  if (iCount > iPoints)
+    return nullptr;
   return m_Path.GetPoints() + iPoints - iCount;
 }
+
 FX_BOOL CFDE_Path::FigureClosed() const {
   FX_PATHPOINT* pPoint = GetLastPoint();
   return pPoint ? (pPoint->m_Flag & FXPT_CLOSEFIGURE) : TRUE;
 }
+
 FX_PATHPOINT* CFDE_Path::AddPoints(int32_t iCount) {
-  if (iCount < 1) {
-    return NULL;
-  }
+  if (iCount < 1)
+    return nullptr;
+
   int32_t iPoints = m_Path.GetPointCount();
   m_Path.AddPointCount(iCount);
   return m_Path.GetPoints() + iPoints;
 }
+
 void CFDE_Path::MoveTo(FX_FLOAT fx, FX_FLOAT fy) {
   FX_PATHPOINT* pPoint = AddPoints(1);
   pPoint->m_PointX = fx;
   pPoint->m_PointY = fy;
   pPoint->m_Flag = FXPT_MOVETO;
 }
+
 void CFDE_Path::LineTo(FX_FLOAT fx, FX_FLOAT fy) {
   FX_PATHPOINT* pPoint = AddPoints(1);
   pPoint->m_PointX = fx;
   pPoint->m_PointY = fy;
   pPoint->m_Flag = FXPT_LINETO;
 }
+
 void CFDE_Path::BezierTo(const CFX_PointF& p1,
                          const CFX_PointF& p2,
                          const CFX_PointF& p3) {
@@ -69,6 +71,7 @@
   p[2].m_PointY = p3.y;
   p[2].m_Flag = FXPT_BEZIERTO;
 }
+
 void CFDE_Path::ArcTo(FX_BOOL bStart,
                       const CFX_RectF& rect,
                       FX_FLOAT startAngle,
@@ -82,11 +85,10 @@
   FX_FLOAT beta =
       FXSYS_atan2(rx * FXSYS_sin(endAngle), ry * FXSYS_cos(endAngle));
   if (FXSYS_fabs(beta - alpha) > FX_PI) {
-    if (beta > alpha) {
+    if (beta > alpha)
       beta -= 2 * FX_PI;
-    } else {
+    else
       alpha -= 2 * FX_PI;
-    }
   }
   FX_FLOAT half_delta = (beta - alpha) / 2;
   FX_FLOAT bcp = 4.0f / 3 * (1 - FXSYS_cos(half_delta)) / FXSYS_sin(half_delta);
@@ -105,57 +107,58 @@
 }
 
 void CFDE_Path::AddBezier(const CFX_PointsF& points) {
-  if (points.GetSize() != 4) {
+  if (points.GetSize() != 4)
     return;
-  }
+
   const CFX_PointF* p = points.GetData();
   MoveTo(p[0]);
   BezierTo(p[1], p[2], p[3]);
 }
+
 void CFDE_Path::AddBeziers(const CFX_PointsF& points) {
   int32_t iCount = points.GetSize();
-  if (iCount < 4) {
+  if (iCount < 4)
     return;
-  }
+
   const CFX_PointF* p = points.GetData();
   const CFX_PointF* pEnd = p + iCount;
   MoveTo(p[0]);
-  for (++p; p <= pEnd - 3; p += 3) {
+  for (++p; p <= pEnd - 3; p += 3)
     BezierTo(p[0], p[1], p[2]);
-  }
 }
+
 void CFDE_Path::GetCurveTangents(const CFX_PointsF& points,
                                  CFX_PointsF& tangents,
                                  FX_BOOL bClosed,
                                  FX_FLOAT fTension) const {
   int32_t iCount = points.GetSize();
   tangents.SetSize(iCount);
-  if (iCount < 3) {
+  if (iCount < 3)
     return;
-  }
+
   FX_FLOAT fCoefficient = fTension / 3.0f;
   const CFX_PointF* pPoints = points.GetData();
   CFX_PointF* pTangents = tangents.GetData();
   for (int32_t i = 0; i < iCount; ++i) {
     int32_t r = i + 1;
     int32_t s = i - 1;
-    if (r >= iCount) {
+    if (r >= iCount)
       r = bClosed ? (r - iCount) : (iCount - 1);
-    }
-    if (s < 0) {
+    if (s < 0)
       s = bClosed ? (s + iCount) : 0;
-    }
+
     pTangents[i].x += (fCoefficient * (pPoints[r].x - pPoints[s].x));
     pTangents[i].y += (fCoefficient * (pPoints[r].y - pPoints[s].y));
   }
 }
+
 void CFDE_Path::AddCurve(const CFX_PointsF& points,
                          FX_BOOL bClosed,
                          FX_FLOAT fTension) {
   int32_t iLast = points.GetUpperBound();
-  if (iLast < 1) {
+  if (iLast < 1)
     return;
-  }
+
   CFX_PointsF tangents;
   GetCurveTangents(points, tangents, bClosed, fTension);
   const CFX_PointF* pPoints = points.GetData();
@@ -177,6 +180,7 @@
     CloseFigure();
   }
 }
+
 void CFDE_Path::AddEllipse(const CFX_RectF& rect) {
   FX_FLOAT fStartAngle = 0;
   FX_FLOAT fEndAngle = FX_PI / 2;
@@ -187,33 +191,35 @@
   }
   CloseFigure();
 }
+
 void CFDE_Path::AddLine(const CFX_PointF& pt1, const CFX_PointF& pt2) {
   FX_PATHPOINT* pLast = GetLastPoint();
-  if (pLast == NULL || FXSYS_fabs(pLast->m_PointX - pt1.x) > 0.001 ||
+  if (!pLast || FXSYS_fabs(pLast->m_PointX - pt1.x) > 0.001 ||
       FXSYS_fabs(pLast->m_PointY - pt1.y) > 0.001) {
     MoveTo(pt1);
   }
   LineTo(pt2);
 }
-void CFDE_Path::AddPath(const IFDE_Path* pSrc, FX_BOOL bConnect) {
+
+void CFDE_Path::AddPath(const CFDE_Path* pSrc, FX_BOOL bConnect) {
   CFDE_Path* pPath = (CFDE_Path*)pSrc;
-  if (pPath == NULL) {
+  if (!pPath)
     return;
-  }
+
   int32_t iCount = pPath->m_Path.GetPointCount();
-  if (iCount < 1) {
+  if (iCount < 1)
     return;
-  }
-  if (bConnect) {
+  if (bConnect)
     LineTo(pPath->m_Path.GetPointX(0), pPath->m_Path.GetPointY(0));
-  }
-  m_Path.Append(&pPath->m_Path, NULL);
+
+  m_Path.Append(&pPath->m_Path, nullptr);
 }
+
 void CFDE_Path::AddPolygon(const CFX_PointsF& points) {
   int32_t iCount = points.GetSize();
-  if (iCount < 2) {
+  if (iCount < 2)
     return;
-  }
+
   AddLines(points);
   const CFX_PointF* p = points.GetData();
   if (FXSYS_fabs(p[0].x - p[iCount - 1].x) < 0.01f ||
@@ -222,18 +228,19 @@
   }
   CloseFigure();
 }
+
 void CFDE_Path::AddLines(const CFX_PointsF& points) {
   int32_t iCount = points.GetSize();
-  if (iCount < 2) {
+  if (iCount < 2)
     return;
-  }
+
   const CFX_PointF* p = points.GetData();
   const CFX_PointF* pEnd = p + iCount;
   MoveTo(p[0]);
-  for (++p; p < pEnd; ++p) {
+  for (++p; p < pEnd; ++p)
     LineTo(*p);
-  }
 }
+
 void CFDE_Path::AddRectangle(const CFX_RectF& rect) {
   MoveTo(rect.TopLeft());
   LineTo(rect.TopRight());
@@ -241,11 +248,13 @@
   LineTo(rect.BottomLeft());
   CloseFigure();
 }
+
 void CFDE_Path::GetBBox(CFX_RectF& bbox) const {
   CFX_FloatRect rect = m_Path.GetBoundingBox();
   bbox.Set(rect.left, rect.top, rect.Width(), rect.Height());
   bbox.Normalize();
 }
+
 void CFDE_Path::GetBBox(CFX_RectF& bbox,
                         FX_FLOAT fLineWidth,
                         FX_FLOAT fMiterLimit) const {
diff --git a/xfa/fde/cfde_path.h b/xfa/fde/cfde_path.h
new file mode 100644
index 0000000..c4b66f0
--- /dev/null
+++ b/xfa/fde/cfde_path.h
@@ -0,0 +1,56 @@
+// 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_CFDE_PATH_H_
+#define XFA_FDE_CFDE_PATH_H_
+
+#include "core/fxge/include/fx_ge.h"
+#include "xfa/fgas/crt/fgas_memory.h"
+
+class CFDE_Path : public CFX_Target {
+ public:
+  void Release() { delete this; }
+
+  FX_BOOL StartFigure();
+  FX_BOOL CloseFigure();
+
+  void AddBezier(const CFX_PointsF& points);
+  void AddBeziers(const CFX_PointsF& points);
+  void AddCurve(const CFX_PointsF& points,
+                FX_BOOL bClosed,
+                FX_FLOAT fTension = 0.5f);
+  void AddEllipse(const CFX_RectF& rect);
+  void AddLines(const CFX_PointsF& points);
+  void AddLine(const CFX_PointF& pt1, const CFX_PointF& pt2);
+  void AddPath(const CFDE_Path* pSrc, FX_BOOL bConnect);
+  void AddPolygon(const CFX_PointsF& points);
+  void AddRectangle(const CFX_RectF& rect);
+  void GetBBox(CFX_RectF& bbox) const;
+  void GetBBox(CFX_RectF& bbox,
+               FX_FLOAT fLineWidth,
+               FX_FLOAT fMiterLimit) const;
+  FX_PATHPOINT* AddPoints(int32_t iCount);
+  FX_PATHPOINT* GetLastPoint(int32_t iCount = 1) const;
+  FX_BOOL FigureClosed() const;
+  void MoveTo(FX_FLOAT fx, FX_FLOAT fy);
+  void LineTo(FX_FLOAT fx, FX_FLOAT fy);
+  void BezierTo(const CFX_PointF& p1,
+                const CFX_PointF& p2,
+                const CFX_PointF& p3);
+  void ArcTo(FX_BOOL bStart,
+             const CFX_RectF& rect,
+             FX_FLOAT startAngle,
+             FX_FLOAT endAngle);
+  void MoveTo(const CFX_PointF& p0) { MoveTo(p0.x, p0.y); }
+  void LineTo(const CFX_PointF& p1) { LineTo(p1.x, p1.y); }
+  void GetCurveTangents(const CFX_PointsF& points,
+                        CFX_PointsF& tangents,
+                        FX_BOOL bClosed,
+                        FX_FLOAT fTension) const;
+  CFX_PathData m_Path;
+};
+
+#endif  // XFA_FDE_CFDE_PATH_H_
diff --git a/xfa/fde/fde_gedevice.cpp b/xfa/fde/fde_gedevice.cpp
index 605c4f9..49345ff 100644
--- a/xfa/fde/fde_gedevice.cpp
+++ b/xfa/fde/fde_gedevice.cpp
@@ -8,80 +8,71 @@
 
 #include <algorithm>
 
-#include "xfa/fde/fde_geobject.h"
+#include "xfa/fde/cfde_path.h"
 #include "xfa/fde/fde_object.h"
+#include "xfa/fgas/font/fgas_font.h"
 
-IFDE_RenderDevice* IFDE_RenderDevice::Create(CFX_DIBitmap* pBitmap,
-                                             FX_BOOL bRgbByteOrder) {
-  if (pBitmap == NULL) {
-    return NULL;
-  }
-  CFX_FxgeDevice* pDevice = new CFX_FxgeDevice;
-  pDevice->Attach(pBitmap, 0, bRgbByteOrder);
-  return new CFDE_FxgeDevice(pDevice, TRUE);
-}
-IFDE_RenderDevice* IFDE_RenderDevice::Create(CFX_RenderDevice* pDevice) {
-  return pDevice ? new CFDE_FxgeDevice(pDevice, FALSE) : nullptr;
-}
-CFDE_FxgeDevice::CFDE_FxgeDevice(CFX_RenderDevice* pDevice,
-                                 FX_BOOL bOwnerDevice)
+CFDE_RenderDevice::CFDE_RenderDevice(CFX_RenderDevice* pDevice,
+                                     FX_BOOL bOwnerDevice)
     : m_pDevice(pDevice),
       m_bOwnerDevice(bOwnerDevice),
-      m_pCharPos(NULL),
+      m_pCharPos(nullptr),
       m_iCharCount(0) {
-  FXSYS_assert(pDevice != NULL);
+  FXSYS_assert(pDevice);
+
   FX_RECT rt = m_pDevice->GetClipBox();
   m_rtClip.Set((FX_FLOAT)rt.left, (FX_FLOAT)rt.top, (FX_FLOAT)rt.Width(),
                (FX_FLOAT)rt.Height());
 }
-CFDE_FxgeDevice::~CFDE_FxgeDevice() {
+
+CFDE_RenderDevice::~CFDE_RenderDevice() {
   FX_Free(m_pCharPos);
   if (m_bOwnerDevice)
     delete m_pDevice;
 }
-int32_t CFDE_FxgeDevice::GetWidth() const {
+int32_t CFDE_RenderDevice::GetWidth() const {
   return m_pDevice->GetWidth();
 }
-int32_t CFDE_FxgeDevice::GetHeight() const {
+int32_t CFDE_RenderDevice::GetHeight() const {
   return m_pDevice->GetHeight();
 }
-FDE_HDEVICESTATE CFDE_FxgeDevice::SaveState() {
+FDE_HDEVICESTATE CFDE_RenderDevice::SaveState() {
   m_pDevice->SaveState();
   return NULL;
 }
-void CFDE_FxgeDevice::RestoreState(FDE_HDEVICESTATE hState) {
+void CFDE_RenderDevice::RestoreState(FDE_HDEVICESTATE hState) {
   m_pDevice->RestoreState();
   const FX_RECT& rt = m_pDevice->GetClipBox();
   m_rtClip.Set((FX_FLOAT)rt.left, (FX_FLOAT)rt.top, (FX_FLOAT)rt.Width(),
                (FX_FLOAT)rt.Height());
 }
-FX_BOOL CFDE_FxgeDevice::SetClipRect(const CFX_RectF& rtClip) {
+FX_BOOL CFDE_RenderDevice::SetClipRect(const CFX_RectF& rtClip) {
   m_rtClip = rtClip;
   return m_pDevice->SetClip_Rect(FX_RECT((int32_t)FXSYS_floor(rtClip.left),
                                          (int32_t)FXSYS_floor(rtClip.top),
                                          (int32_t)FXSYS_ceil(rtClip.right()),
                                          (int32_t)FXSYS_ceil(rtClip.bottom())));
 }
-const CFX_RectF& CFDE_FxgeDevice::GetClipRect() {
+const CFX_RectF& CFDE_RenderDevice::GetClipRect() {
   return m_rtClip;
 }
-FX_BOOL CFDE_FxgeDevice::SetClipPath(const IFDE_Path* pClip) {
+FX_BOOL CFDE_RenderDevice::SetClipPath(const CFDE_Path* pClip) {
   return FALSE;
 }
-IFDE_Path* CFDE_FxgeDevice::GetClipPath() const {
+CFDE_Path* CFDE_RenderDevice::GetClipPath() const {
   return NULL;
 }
-FX_FLOAT CFDE_FxgeDevice::GetDpiX() const {
+FX_FLOAT CFDE_RenderDevice::GetDpiX() const {
   return 96;
 }
-FX_FLOAT CFDE_FxgeDevice::GetDpiY() const {
+FX_FLOAT CFDE_RenderDevice::GetDpiY() const {
   return 96;
 }
-FX_BOOL CFDE_FxgeDevice::DrawImage(CFX_DIBSource* pDib,
-                                   const CFX_RectF* pSrcRect,
-                                   const CFX_RectF& dstRect,
-                                   const CFX_Matrix* pImgMatrix,
-                                   const CFX_Matrix* pDevMatrix) {
+FX_BOOL CFDE_RenderDevice::DrawImage(CFX_DIBSource* pDib,
+                                     const CFX_RectF* pSrcRect,
+                                     const CFX_RectF& dstRect,
+                                     const CFX_Matrix* pImgMatrix,
+                                     const CFX_Matrix* pDevMatrix) {
   FXSYS_assert(pDib != NULL);
   CFX_RectF srcRect;
   if (pSrcRect) {
@@ -113,12 +104,12 @@
   m_pDevice->CancelDIBits(handle);
   return handle != NULL;
 }
-FX_BOOL CFDE_FxgeDevice::DrawString(CFDE_Brush* pBrush,
-                                    IFX_Font* pFont,
-                                    const FXTEXT_CHARPOS* pCharPos,
-                                    int32_t iCount,
-                                    FX_FLOAT fFontSize,
-                                    const CFX_Matrix* pMatrix) {
+FX_BOOL CFDE_RenderDevice::DrawString(CFDE_Brush* pBrush,
+                                      IFX_Font* pFont,
+                                      const FXTEXT_CHARPOS* pCharPos,
+                                      int32_t iCount,
+                                      FX_FLOAT fFontSize,
+                                      const CFX_Matrix* pMatrix) {
   FXSYS_assert(pBrush != NULL && pFont != NULL && pCharPos != NULL &&
                iCount > 0);
   CFX_FontCache* pCache = CFX_GEModule::Get()->GetFontCache();
@@ -207,13 +198,13 @@
   return TRUE;
 }
 
-FX_BOOL CFDE_FxgeDevice::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) {
+FX_BOOL CFDE_RenderDevice::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) {
   CFX_PointsF points;
   points.Add(pt1);
   points.Add(pt2);
@@ -223,45 +214,45 @@
   path.AddBezier(points);
   return DrawPath(pPen, fPenWidth, &path, pMatrix);
 }
-FX_BOOL CFDE_FxgeDevice::DrawCurve(CFDE_Pen* pPen,
-                                   FX_FLOAT fPenWidth,
-                                   const CFX_PointsF& points,
-                                   FX_BOOL bClosed,
-                                   FX_FLOAT fTension,
-                                   const CFX_Matrix* pMatrix) {
+FX_BOOL CFDE_RenderDevice::DrawCurve(CFDE_Pen* pPen,
+                                     FX_FLOAT fPenWidth,
+                                     const CFX_PointsF& points,
+                                     FX_BOOL bClosed,
+                                     FX_FLOAT fTension,
+                                     const CFX_Matrix* pMatrix) {
   CFDE_Path path;
   path.AddCurve(points, bClosed, fTension);
   return DrawPath(pPen, fPenWidth, &path, pMatrix);
 }
-FX_BOOL CFDE_FxgeDevice::DrawEllipse(CFDE_Pen* pPen,
-                                     FX_FLOAT fPenWidth,
-                                     const CFX_RectF& rect,
-                                     const CFX_Matrix* pMatrix) {
+FX_BOOL CFDE_RenderDevice::DrawEllipse(CFDE_Pen* pPen,
+                                       FX_FLOAT fPenWidth,
+                                       const CFX_RectF& rect,
+                                       const CFX_Matrix* pMatrix) {
   CFDE_Path path;
   path.AddEllipse(rect);
   return DrawPath(pPen, fPenWidth, &path, pMatrix);
 }
-FX_BOOL CFDE_FxgeDevice::DrawLines(CFDE_Pen* pPen,
-                                   FX_FLOAT fPenWidth,
-                                   const CFX_PointsF& points,
-                                   const CFX_Matrix* pMatrix) {
+FX_BOOL CFDE_RenderDevice::DrawLines(CFDE_Pen* pPen,
+                                     FX_FLOAT fPenWidth,
+                                     const CFX_PointsF& points,
+                                     const CFX_Matrix* pMatrix) {
   CFDE_Path path;
   path.AddLines(points);
   return DrawPath(pPen, fPenWidth, &path, pMatrix);
 }
-FX_BOOL CFDE_FxgeDevice::DrawLine(CFDE_Pen* pPen,
-                                  FX_FLOAT fPenWidth,
-                                  const CFX_PointF& pt1,
-                                  const CFX_PointF& pt2,
-                                  const CFX_Matrix* pMatrix) {
+FX_BOOL CFDE_RenderDevice::DrawLine(CFDE_Pen* pPen,
+                                    FX_FLOAT fPenWidth,
+                                    const CFX_PointF& pt1,
+                                    const CFX_PointF& pt2,
+                                    const CFX_Matrix* pMatrix) {
   CFDE_Path path;
   path.AddLine(pt1, pt2);
   return DrawPath(pPen, fPenWidth, &path, pMatrix);
 }
-FX_BOOL CFDE_FxgeDevice::DrawPath(CFDE_Pen* pPen,
-                                  FX_FLOAT fPenWidth,
-                                  const IFDE_Path* pPath,
-                                  const CFX_Matrix* pMatrix) {
+FX_BOOL CFDE_RenderDevice::DrawPath(CFDE_Pen* pPen,
+                                    FX_FLOAT fPenWidth,
+                                    const CFDE_Path* pPath,
+                                    const CFX_Matrix* pMatrix) {
   CFDE_Path* pGePath = (CFDE_Path*)pPath;
   if (pGePath == NULL) {
     return FALSE;
@@ -273,54 +264,54 @@
   return m_pDevice->DrawPath(&pGePath->m_Path, (const CFX_Matrix*)pMatrix,
                              &graphState, 0, pPen->GetColor(), 0);
 }
-FX_BOOL CFDE_FxgeDevice::DrawPolygon(CFDE_Pen* pPen,
-                                     FX_FLOAT fPenWidth,
-                                     const CFX_PointsF& points,
-                                     const CFX_Matrix* pMatrix) {
+FX_BOOL CFDE_RenderDevice::DrawPolygon(CFDE_Pen* pPen,
+                                       FX_FLOAT fPenWidth,
+                                       const CFX_PointsF& points,
+                                       const CFX_Matrix* pMatrix) {
   CFDE_Path path;
   path.AddPolygon(points);
   return DrawPath(pPen, fPenWidth, &path, pMatrix);
 }
-FX_BOOL CFDE_FxgeDevice::DrawRectangle(CFDE_Pen* pPen,
-                                       FX_FLOAT fPenWidth,
-                                       const CFX_RectF& rect,
-                                       const CFX_Matrix* pMatrix) {
+FX_BOOL CFDE_RenderDevice::DrawRectangle(CFDE_Pen* pPen,
+                                         FX_FLOAT fPenWidth,
+                                         const CFX_RectF& rect,
+                                         const CFX_Matrix* pMatrix) {
   CFDE_Path path;
   path.AddRectangle(rect);
   return DrawPath(pPen, fPenWidth, &path, pMatrix);
 }
-FX_BOOL CFDE_FxgeDevice::FillClosedCurve(CFDE_Brush* pBrush,
-                                         const CFX_PointsF& points,
-                                         FX_FLOAT fTension,
-                                         const CFX_Matrix* pMatrix) {
+FX_BOOL CFDE_RenderDevice::FillClosedCurve(CFDE_Brush* pBrush,
+                                           const CFX_PointsF& points,
+                                           FX_FLOAT fTension,
+                                           const CFX_Matrix* pMatrix) {
   CFDE_Path path;
   path.AddCurve(points, TRUE, fTension);
   return FillPath(pBrush, &path, pMatrix);
 }
-FX_BOOL CFDE_FxgeDevice::FillEllipse(CFDE_Brush* pBrush,
-                                     const CFX_RectF& rect,
-                                     const CFX_Matrix* pMatrix) {
+FX_BOOL CFDE_RenderDevice::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(CFDE_Brush* pBrush,
-                                     const CFX_PointsF& points,
-                                     const CFX_Matrix* pMatrix) {
+FX_BOOL CFDE_RenderDevice::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(CFDE_Brush* pBrush,
-                                       const CFX_RectF& rect,
-                                       const CFX_Matrix* pMatrix) {
+FX_BOOL CFDE_RenderDevice::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(CFDE_Pen* pPen,
-                                   FX_FLOAT fPenWidth,
-                                   CFX_GraphStateData& graphState) {
+FX_BOOL CFDE_RenderDevice::CreatePen(CFDE_Pen* pPen,
+                                     FX_FLOAT fPenWidth,
+                                     CFX_GraphStateData& graphState) {
   if (!pPen)
     return FALSE;
 
@@ -332,9 +323,9 @@
   return TRUE;
 }
 
-FX_BOOL CFDE_FxgeDevice::FillPath(CFDE_Brush* pBrush,
-                                  const IFDE_Path* pPath,
-                                  const CFX_Matrix* pMatrix) {
+FX_BOOL CFDE_RenderDevice::FillPath(CFDE_Brush* pBrush,
+                                    const CFDE_Path* pPath,
+                                    const CFX_Matrix* pMatrix) {
   CFDE_Path* pGePath = (CFDE_Path*)pPath;
   if (!pGePath)
     return FALSE;
diff --git a/xfa/fde/fde_gedevice.h b/xfa/fde/fde_gedevice.h
index 4d43ea0..3d14a0f 100644
--- a/xfa/fde/fde_gedevice.h
+++ b/xfa/fde/fde_gedevice.h
@@ -7,92 +7,101 @@
 #ifndef XFA_FDE_FDE_GEDEVICE_H_
 #define XFA_FDE_FDE_GEDEVICE_H_
 
-#include "xfa/fde/fde_renderdevice.h"
+#include "core/fxge/include/fx_ge.h"
 #include "xfa/fgas/crt/fgas_memory.h"
 
-class CFDE_FxgeDevice : public IFDE_RenderDevice, public CFX_Target {
+typedef struct FDE_HDEVICESTATE_ { void* pData; } * FDE_HDEVICESTATE;
+
+class CFDE_Brush;
+class CFDE_Path;
+class CFDE_Pen;
+class CFX_RenderDevice;
+class IFX_Font;
+
+class CFDE_RenderDevice : public CFX_Target {
  public:
-  CFDE_FxgeDevice(CFX_RenderDevice* pDevice, FX_BOOL bOwnerDevice);
-  ~CFDE_FxgeDevice();
-  virtual void Release() { delete this; }
+  CFDE_RenderDevice(CFX_RenderDevice* pDevice, FX_BOOL bOwnerDevice);
+  ~CFDE_RenderDevice();
 
-  virtual int32_t GetWidth() const;
-  virtual int32_t GetHeight() const;
-  virtual FDE_HDEVICESTATE SaveState();
-  virtual void RestoreState(FDE_HDEVICESTATE hState);
-  virtual FX_BOOL SetClipPath(const IFDE_Path* pClip);
-  virtual IFDE_Path* GetClipPath() const;
-  virtual FX_BOOL SetClipRect(const CFX_RectF& rtClip);
-  virtual const CFX_RectF& GetClipRect();
+  void Release() { delete this; }
 
-  virtual FX_FLOAT GetDpiX() const;
-  virtual FX_FLOAT GetDpiY() const;
+  int32_t GetWidth() const;
+  int32_t GetHeight() const;
+  FDE_HDEVICESTATE SaveState();
+  void RestoreState(FDE_HDEVICESTATE hState);
+  FX_BOOL SetClipPath(const CFDE_Path* pClip);
+  CFDE_Path* GetClipPath() const;
+  FX_BOOL SetClipRect(const CFX_RectF& rtClip);
+  const CFX_RectF& GetClipRect();
 
-  virtual FX_BOOL DrawImage(CFX_DIBSource* pDib,
-                            const CFX_RectF* pSrcRect,
-                            const CFX_RectF& dstRect,
-                            const CFX_Matrix* pImgMatrix = NULL,
-                            const CFX_Matrix* pDevMatrix = NULL);
-  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(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(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(CFDE_Pen* pPen,
-                              FX_FLOAT fPenWidth,
-                              const CFX_RectF& rect,
-                              const CFX_Matrix* pMatrix = NULL);
-  virtual FX_BOOL DrawLines(CFDE_Pen* pPen,
-                            FX_FLOAT fPenWidth,
-                            const CFX_PointsF& points,
-                            const CFX_Matrix* pMatrix = NULL);
-  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(CFDE_Pen* pPen,
-                           FX_FLOAT fPenWidth,
-                           const IFDE_Path* pPath,
-                           const CFX_Matrix* pMatrix = NULL);
-  virtual FX_BOOL DrawPolygon(CFDE_Pen* pPen,
-                              FX_FLOAT fPenWidth,
-                              const CFX_PointsF& points,
-                              const CFX_Matrix* pMatrix = NULL);
-  virtual FX_BOOL DrawRectangle(CFDE_Pen* pPen,
-                                FX_FLOAT fPenWidth,
-                                const CFX_RectF& rect,
-                                const CFX_Matrix* pMatrix = NULL);
-  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(CFDE_Brush* pBrush,
-                              const CFX_RectF& rect,
-                              const CFX_Matrix* pMatrix = NULL);
-  virtual FX_BOOL FillPath(CFDE_Brush* pBrush,
-                           const IFDE_Path* pPath,
-                           const CFX_Matrix* pMatrix = NULL);
-  virtual FX_BOOL FillPolygon(CFDE_Brush* pBrush,
-                              const CFX_PointsF& points,
-                              const CFX_Matrix* pMatrix = NULL);
-  virtual FX_BOOL FillRectangle(CFDE_Brush* pBrush,
-                                const CFX_RectF& rect,
-                                const CFX_Matrix* pMatrix = NULL);
+  FX_FLOAT GetDpiX() const;
+  FX_FLOAT GetDpiY() const;
+
+  FX_BOOL DrawImage(CFX_DIBSource* pDib,
+                    const CFX_RectF* pSrcRect,
+                    const CFX_RectF& dstRect,
+                    const CFX_Matrix* pImgMatrix = NULL,
+                    const CFX_Matrix* pDevMatrix = NULL);
+  FX_BOOL DrawString(CFDE_Brush* pBrush,
+                     IFX_Font* pFont,
+                     const FXTEXT_CHARPOS* pCharPos,
+                     int32_t iCount,
+                     FX_FLOAT fFontSize,
+                     const CFX_Matrix* pMatrix = NULL);
+  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);
+  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);
+  FX_BOOL DrawEllipse(CFDE_Pen* pPen,
+                      FX_FLOAT fPenWidth,
+                      const CFX_RectF& rect,
+                      const CFX_Matrix* pMatrix = NULL);
+  FX_BOOL DrawLines(CFDE_Pen* pPen,
+                    FX_FLOAT fPenWidth,
+                    const CFX_PointsF& points,
+                    const CFX_Matrix* pMatrix = NULL);
+  FX_BOOL DrawLine(CFDE_Pen* pPen,
+                   FX_FLOAT fPenWidth,
+                   const CFX_PointF& pt1,
+                   const CFX_PointF& pt2,
+                   const CFX_Matrix* pMatrix = NULL);
+  FX_BOOL DrawPath(CFDE_Pen* pPen,
+                   FX_FLOAT fPenWidth,
+                   const CFDE_Path* pPath,
+                   const CFX_Matrix* pMatrix = NULL);
+  FX_BOOL DrawPolygon(CFDE_Pen* pPen,
+                      FX_FLOAT fPenWidth,
+                      const CFX_PointsF& points,
+                      const CFX_Matrix* pMatrix = NULL);
+  FX_BOOL DrawRectangle(CFDE_Pen* pPen,
+                        FX_FLOAT fPenWidth,
+                        const CFX_RectF& rect,
+                        const CFX_Matrix* pMatrix = NULL);
+  FX_BOOL FillClosedCurve(CFDE_Brush* pBrush,
+                          const CFX_PointsF& points,
+                          FX_FLOAT fTension = 0.5f,
+                          const CFX_Matrix* pMatrix = NULL);
+  FX_BOOL FillEllipse(CFDE_Brush* pBrush,
+                      const CFX_RectF& rect,
+                      const CFX_Matrix* pMatrix = NULL);
+  FX_BOOL FillPath(CFDE_Brush* pBrush,
+                   const CFDE_Path* pPath,
+                   const CFX_Matrix* pMatrix = NULL);
+  FX_BOOL FillPolygon(CFDE_Brush* pBrush,
+                      const CFX_PointsF& points,
+                      const CFX_Matrix* pMatrix = NULL);
+  FX_BOOL FillRectangle(CFDE_Brush* pBrush,
+                        const CFX_RectF& rect,
+                        const CFX_Matrix* pMatrix = NULL);
 
   FX_BOOL DrawSolidString(CFDE_Brush* pBrush,
                           IFX_Font* pFont,
diff --git a/xfa/fde/fde_geobject.h b/xfa/fde/fde_geobject.h
deleted file mode 100644
index debec6a..0000000
--- a/xfa/fde/fde_geobject.h
+++ /dev/null
@@ -1,57 +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_GEOBJECT_H_
-#define XFA_FDE_FDE_GEOBJECT_H_
-
-#include "core/fxge/include/fx_ge.h"
-#include "xfa/fde/fde_path.h"
-#include "xfa/fgas/crt/fgas_memory.h"
-
-class CFDE_Path : public IFDE_Path, public CFX_Target {
- public:
-  virtual void Release() { delete this; }
-
-  virtual FX_BOOL StartFigure();
-  virtual FX_BOOL CloseFigure();
-
-  virtual void AddBezier(const CFX_PointsF& points);
-  virtual void AddBeziers(const CFX_PointsF& points);
-  virtual void AddCurve(const CFX_PointsF& points,
-                        FX_BOOL bClosed,
-                        FX_FLOAT fTension = 0.5f);
-  virtual void AddEllipse(const CFX_RectF& rect);
-  virtual void AddLines(const CFX_PointsF& points);
-  virtual void AddLine(const CFX_PointF& pt1, const CFX_PointF& pt2);
-  virtual void AddPath(const IFDE_Path* pSrc, FX_BOOL bConnect);
-  virtual void AddPolygon(const CFX_PointsF& points);
-  virtual void AddRectangle(const CFX_RectF& rect);
-  virtual void GetBBox(CFX_RectF& bbox) const;
-  virtual void GetBBox(CFX_RectF& bbox,
-                       FX_FLOAT fLineWidth,
-                       FX_FLOAT fMiterLimit) const;
-  FX_PATHPOINT* AddPoints(int32_t iCount);
-  FX_PATHPOINT* GetLastPoint(int32_t iCount = 1) const;
-  FX_BOOL FigureClosed() const;
-  void MoveTo(FX_FLOAT fx, FX_FLOAT fy);
-  void LineTo(FX_FLOAT fx, FX_FLOAT fy);
-  void BezierTo(const CFX_PointF& p1,
-                const CFX_PointF& p2,
-                const CFX_PointF& p3);
-  void ArcTo(FX_BOOL bStart,
-             const CFX_RectF& rect,
-             FX_FLOAT startAngle,
-             FX_FLOAT endAngle);
-  void MoveTo(const CFX_PointF& p0) { MoveTo(p0.x, p0.y); }
-  void LineTo(const CFX_PointF& p1) { LineTo(p1.x, p1.y); }
-  void GetCurveTangents(const CFX_PointsF& points,
-                        CFX_PointsF& tangents,
-                        FX_BOOL bClosed,
-                        FX_FLOAT fTension) const;
-  CFX_PathData m_Path;
-};
-
-#endif  // XFA_FDE_FDE_GEOBJECT_H_
diff --git a/xfa/fde/fde_iterator.cpp b/xfa/fde/fde_iterator.cpp
index 4356e22..755bff5 100644
--- a/xfa/fde/fde_iterator.cpp
+++ b/xfa/fde/fde_iterator.cpp
@@ -8,25 +8,26 @@
 
 #include "xfa/fgas/crt/fgas_utils.h"
 
-IFDE_VisualSetIterator* IFDE_VisualSetIterator::Create() {
-  return new CFDE_VisualSetIterator;
-}
 CFDE_VisualSetIterator::CFDE_VisualSetIterator() : m_dwFilter(0) {}
+
 CFDE_VisualSetIterator::~CFDE_VisualSetIterator() {
   m_CanvasStack.RemoveAll();
 }
+
 FX_BOOL CFDE_VisualSetIterator::AttachCanvas(IFDE_CanvasSet* pCanvas) {
-  FXSYS_assert(pCanvas != NULL);
+  FXSYS_assert(pCanvas);
+
   m_CanvasStack.RemoveAll();
   FDE_CANVASITEM canvas;
-  canvas.hCanvas = NULL;
+  canvas.hCanvas = nullptr;
   canvas.pCanvas = pCanvas;
-  canvas.hPos = pCanvas->GetFirstPosition(NULL);
-  if (canvas.hPos == NULL) {
+  canvas.hPos = pCanvas->GetFirstPosition(nullptr);
+  if (!canvas.hPos)
     return FALSE;
-  }
+
   return m_CanvasStack.Push(canvas) == 0;
 }
+
 FX_BOOL CFDE_VisualSetIterator::FilterObjects(uint32_t dwObjects) {
   if (m_CanvasStack.GetSize() == 0)
     return FALSE;
@@ -37,30 +38,35 @@
   m_dwFilter = dwObjects;
 
   FDE_CANVASITEM* pCanvas = m_CanvasStack.GetTopElement();
-  FXSYS_assert(pCanvas != NULL && pCanvas->pCanvas != NULL);
-  pCanvas->hPos = pCanvas->pCanvas->GetFirstPosition(NULL);
-  return pCanvas->hPos != NULL;
+  FXSYS_assert(pCanvas && pCanvas->pCanvas);
+
+  pCanvas->hPos = pCanvas->pCanvas->GetFirstPosition(nullptr);
+  return !!pCanvas->hPos;
 }
+
 void CFDE_VisualSetIterator::Reset() {
   FilterObjects(m_dwFilter);
 }
+
 FDE_HVISUALOBJ CFDE_VisualSetIterator::GetNext(IFDE_VisualSet*& pVisualSet,
                                                FDE_HVISUALOBJ* phCanvasObj,
                                                IFDE_CanvasSet** ppCanvasSet) {
   while (m_CanvasStack.GetSize() > 0) {
     FDE_CANVASITEM* pCanvas = m_CanvasStack.GetTopElement();
-    FXSYS_assert(pCanvas != NULL && pCanvas->pCanvas != NULL);
-    if (pCanvas->hPos == NULL) {
-      if (m_CanvasStack.GetSize() == 1) {
+    FXSYS_assert(pCanvas && pCanvas->pCanvas);
+
+    if (!pCanvas->hPos) {
+      if (m_CanvasStack.GetSize() == 1)
         break;
-      }
+
       m_CanvasStack.Pop();
       continue;
     }
     do {
       FDE_HVISUALOBJ hObj = pCanvas->pCanvas->GetNext(
           pCanvas->hCanvas, pCanvas->hPos, pVisualSet);
-      FXSYS_assert(hObj != NULL);
+      FXSYS_assert(hObj);
+
       FDE_VISUALOBJTYPE eType = pVisualSet->GetType();
       if (eType == FDE_VISUALOBJ_Canvas) {
         FDE_CANVASITEM canvas;
@@ -72,22 +78,19 @@
       }
       uint32_t dwObj = (uint32_t)eType;
       if ((m_dwFilter & dwObj) != 0) {
-        if (ppCanvasSet) {
+        if (ppCanvasSet)
           *ppCanvasSet = pCanvas->pCanvas;
-        }
-        if (phCanvasObj) {
+        if (phCanvasObj)
           *phCanvasObj = pCanvas->hCanvas;
-        }
         return hObj;
       }
-    } while (pCanvas->hPos != NULL);
+    } while (pCanvas->hPos);
   }
-  if (ppCanvasSet) {
-    *ppCanvasSet = NULL;
-  }
-  if (phCanvasObj) {
-    *phCanvasObj = NULL;
-  }
-  pVisualSet = NULL;
-  return NULL;
+  if (ppCanvasSet)
+    *ppCanvasSet = nullptr;
+  if (phCanvasObj)
+    *phCanvasObj = nullptr;
+
+  pVisualSet = nullptr;
+  return nullptr;
 }
diff --git a/xfa/fde/fde_iterator.h b/xfa/fde/fde_iterator.h
index 737fb89..4d08925 100644
--- a/xfa/fde/fde_iterator.h
+++ b/xfa/fde/fde_iterator.h
@@ -17,20 +17,20 @@
   FX_POSITION hPos;
 };
 
-class CFDE_VisualSetIterator : public IFDE_VisualSetIterator,
-                               public CFX_Target {
+class CFDE_VisualSetIterator : public CFX_Target {
  public:
   CFDE_VisualSetIterator();
   ~CFDE_VisualSetIterator();
-  virtual void Release() { delete this; }
 
-  virtual FX_BOOL AttachCanvas(IFDE_CanvasSet* pCanvas);
-  virtual FX_BOOL FilterObjects(uint32_t dwObjects = 0xFFFFFFFF);
+  void Release() { delete this; }
 
-  virtual void Reset();
-  virtual FDE_HVISUALOBJ GetNext(IFDE_VisualSet*& pVisualSet,
-                                 FDE_HVISUALOBJ* phCanvasObj = NULL,
-                                 IFDE_CanvasSet** ppCanvasSet = NULL);
+  FX_BOOL AttachCanvas(IFDE_CanvasSet* pCanvas);
+  FX_BOOL FilterObjects(uint32_t dwObjects = 0xFFFFFFFF);
+
+  void Reset();
+  FDE_HVISUALOBJ GetNext(IFDE_VisualSet*& pVisualSet,
+                         FDE_HVISUALOBJ* phCanvasObj = NULL,
+                         IFDE_CanvasSet** ppCanvasSet = NULL);
 
  protected:
   uint32_t m_dwFilter;
diff --git a/xfa/fde/fde_path.h b/xfa/fde/fde_path.h
deleted file mode 100644
index 41d2a66..0000000
--- a/xfa/fde/fde_path.h
+++ /dev/null
@@ -1,37 +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_PATH_H_
-#define XFA_FDE_FDE_PATH_H_
-
-#include "core/fxcrt/include/fx_coordinates.h"
-#include "core/fxcrt/include/fx_system.h"
-
-class IFDE_Path {
- public:
-  static IFDE_Path* Create();
-  virtual ~IFDE_Path() {}
-  virtual void Release() = 0;
-  virtual FX_BOOL StartFigure() = 0;
-  virtual FX_BOOL CloseFigure() = 0;
-  virtual void AddBezier(const CFX_PointsF& points) = 0;
-  virtual void AddBeziers(const CFX_PointsF& points) = 0;
-  virtual void AddCurve(const CFX_PointsF& points,
-                        FX_BOOL bClosed,
-                        FX_FLOAT fTension = 0.5f) = 0;
-  virtual void AddEllipse(const CFX_RectF& rect) = 0;
-  virtual void AddLines(const CFX_PointsF& points) = 0;
-  virtual void AddLine(const CFX_PointF& pt1, const CFX_PointF& pt2) = 0;
-  virtual void AddPath(const IFDE_Path* pSrc, FX_BOOL bConnect) = 0;
-  virtual void AddPolygon(const CFX_PointsF& points) = 0;
-  virtual void AddRectangle(const CFX_RectF& rect) = 0;
-  virtual void GetBBox(CFX_RectF& bbox) const = 0;
-  virtual void GetBBox(CFX_RectF& bbox,
-                       FX_FLOAT fLineWidth,
-                       FX_FLOAT fMiterLimit) const = 0;
-};
-
-#endif  // XFA_FDE_FDE_PATH_H_
diff --git a/xfa/fde/fde_render.cpp b/xfa/fde/fde_render.cpp
index b4259f7..74c19f6 100644
--- a/xfa/fde/fde_render.cpp
+++ b/xfa/fde/fde_render.cpp
@@ -6,97 +6,13 @@
 
 #include "xfa/fde/fde_render.h"
 
+#include "xfa/fde/fde_gedevice.h"
 #include "xfa/fde/fde_object.h"
-#include "xfa/fde/fde_renderdevice.h"
 #include "xfa/fgas/crt/fgas_memory.h"
 
 #define FDE_PATHRENDER_Stroke 1
 #define FDE_PATHRENDER_Fill 2
 
-namespace {
-
-class CFDE_RenderContext : public IFDE_RenderContext, public CFX_Target {
- public:
-  CFDE_RenderContext();
-  virtual ~CFDE_RenderContext();
-  virtual void Release() { delete this; }
-  virtual FX_BOOL StartRender(IFDE_RenderDevice* pRenderDevice,
-                              IFDE_CanvasSet* pCanvasSet,
-                              const CFX_Matrix& tmDoc2Device);
-  virtual FDE_RENDERSTATUS GetStatus() const { return m_eStatus; }
-  virtual FDE_RENDERSTATUS DoRender(IFX_Pause* pPause = nullptr);
-  virtual void StopRender();
-  void RenderText(IFDE_TextSet* pTextSet, FDE_HVISUALOBJ hText);
-  FX_BOOL ApplyClip(IFDE_VisualSet* pVisualSet,
-                    FDE_HVISUALOBJ hObj,
-                    FDE_HDEVICESTATE& hState);
-  void RestoreClip(FDE_HDEVICESTATE hState);
-
- protected:
-  FDE_RENDERSTATUS m_eStatus;
-  IFDE_RenderDevice* m_pRenderDevice;
-  CFDE_Brush* m_pBrush;
-  CFX_Matrix m_Transform;
-  FXTEXT_CHARPOS* m_pCharPos;
-  int32_t m_iCharPosCount;
-  IFDE_VisualSetIterator* m_pIterator;
-};
-
-}  // namespace
-
-void FDE_GetPageMatrix(CFX_Matrix& pageMatrix,
-                       const CFX_RectF& docPageRect,
-                       const CFX_Rect& devicePageRect,
-                       int32_t iRotate,
-                       uint32_t dwCoordinatesType) {
-  FXSYS_assert(iRotate >= 0 && iRotate <= 3);
-  FX_BOOL bFlipX = (dwCoordinatesType & 0x01) != 0;
-  FX_BOOL bFlipY = (dwCoordinatesType & 0x02) != 0;
-  CFX_Matrix m;
-  m.Set((bFlipX ? -1.0f : 1.0f), 0, 0, (bFlipY ? -1.0f : 1.0f), 0, 0);
-  if (iRotate == 0 || iRotate == 2) {
-    m.a *= (FX_FLOAT)devicePageRect.width / docPageRect.width;
-    m.d *= (FX_FLOAT)devicePageRect.height / docPageRect.height;
-  } else {
-    m.a *= (FX_FLOAT)devicePageRect.height / docPageRect.width;
-    m.d *= (FX_FLOAT)devicePageRect.width / docPageRect.height;
-  }
-  m.Rotate(iRotate * 1.57079632675f);
-  switch (iRotate) {
-    case 0:
-      m.e = bFlipX ? (FX_FLOAT)devicePageRect.right()
-                   : (FX_FLOAT)devicePageRect.left;
-      m.f = bFlipY ? (FX_FLOAT)devicePageRect.bottom()
-                   : (FX_FLOAT)devicePageRect.top;
-      break;
-    case 1:
-      m.e = bFlipY ? (FX_FLOAT)devicePageRect.left
-                   : (FX_FLOAT)devicePageRect.right();
-      m.f = bFlipX ? (FX_FLOAT)devicePageRect.bottom()
-                   : (FX_FLOAT)devicePageRect.top;
-      break;
-    case 2:
-      m.e = bFlipX ? (FX_FLOAT)devicePageRect.left
-                   : (FX_FLOAT)devicePageRect.right();
-      m.f = bFlipY ? (FX_FLOAT)devicePageRect.top
-                   : (FX_FLOAT)devicePageRect.bottom();
-      break;
-    case 3:
-      m.e = bFlipY ? (FX_FLOAT)devicePageRect.right()
-                   : (FX_FLOAT)devicePageRect.left;
-      m.f = bFlipX ? (FX_FLOAT)devicePageRect.top
-                   : (FX_FLOAT)devicePageRect.bottom();
-      break;
-    default:
-      break;
-  }
-  pageMatrix = m;
-}
-
-IFDE_RenderContext* IFDE_RenderContext::Create() {
-  return new CFDE_RenderContext;
-}
-
 CFDE_RenderContext::CFDE_RenderContext()
     : m_eStatus(FDE_RENDERSTATUS_Reset),
       m_pRenderDevice(nullptr),
@@ -112,7 +28,7 @@
   StopRender();
 }
 
-FX_BOOL CFDE_RenderContext::StartRender(IFDE_RenderDevice* pRenderDevice,
+FX_BOOL CFDE_RenderContext::StartRender(CFDE_RenderDevice* pRenderDevice,
                                         IFDE_CanvasSet* pCanvasSet,
                                         const CFX_Matrix& tmDoc2Device) {
   if (m_pRenderDevice)
@@ -125,10 +41,9 @@
   m_eStatus = FDE_RENDERSTATUS_Paused;
   m_pRenderDevice = pRenderDevice;
   m_Transform = tmDoc2Device;
-  if (!m_pIterator) {
-    m_pIterator = IFDE_VisualSetIterator::Create();
-    FXSYS_assert(m_pIterator);
-  }
+  if (!m_pIterator)
+    m_pIterator = new CFDE_VisualSetIterator;
+
   return m_pIterator->AttachCanvas(pCanvasSet) && m_pIterator->FilterObjects();
 }
 
diff --git a/xfa/fde/fde_render.h b/xfa/fde/fde_render.h
index 99e4bbe..c28b4ab 100644
--- a/xfa/fde/fde_render.h
+++ b/xfa/fde/fde_render.h
@@ -8,15 +8,12 @@
 #define XFA_FDE_FDE_RENDER_H_
 
 #include "core/fxcrt/include/fx_coordinates.h"
+#include "xfa/fde/fde_gedevice.h"
+#include "xfa/fde/fde_iterator.h"
 #include "xfa/fde/fde_visualset.h"
 
-class IFDE_RenderDevice;
+class CFDE_RenderDevice;
 
-void FDE_GetPageMatrix(CFX_Matrix& pageMatrix,
-                       const CFX_RectF& docPageRect,
-                       const CFX_Rect& devicePageRect,
-                       int32_t iRotate,
-                       uint32_t dwCoordinatesType = 0);
 enum FDE_RENDERSTATUS {
   FDE_RENDERSTATUS_Reset = 0,
   FDE_RENDERSTATUS_Paused,
@@ -24,17 +21,32 @@
   FDE_RENDERSTATUS_Failed,
 };
 
-class IFDE_RenderContext {
+class CFDE_RenderContext : public CFX_Target {
  public:
-  static IFDE_RenderContext* Create();
-  virtual ~IFDE_RenderContext() {}
-  virtual void Release() = 0;
-  virtual FX_BOOL StartRender(IFDE_RenderDevice* pRenderDevice,
-                              IFDE_CanvasSet* pCanvasSet,
-                              const CFX_Matrix& tmDoc2Device) = 0;
-  virtual FDE_RENDERSTATUS GetStatus() const = 0;
-  virtual FDE_RENDERSTATUS DoRender(IFX_Pause* pPause = NULL) = 0;
-  virtual void StopRender() = 0;
+  CFDE_RenderContext();
+  ~CFDE_RenderContext();
+
+  void Release() { delete this; }
+  FX_BOOL StartRender(CFDE_RenderDevice* pRenderDevice,
+                      IFDE_CanvasSet* pCanvasSet,
+                      const CFX_Matrix& tmDoc2Device);
+  FDE_RENDERSTATUS GetStatus() const { return m_eStatus; }
+  FDE_RENDERSTATUS DoRender(IFX_Pause* pPause = nullptr);
+  void StopRender();
+  void RenderText(IFDE_TextSet* pTextSet, FDE_HVISUALOBJ hText);
+  FX_BOOL ApplyClip(IFDE_VisualSet* pVisualSet,
+                    FDE_HVISUALOBJ hObj,
+                    FDE_HDEVICESTATE& hState);
+  void RestoreClip(FDE_HDEVICESTATE hState);
+
+ protected:
+  FDE_RENDERSTATUS m_eStatus;
+  CFDE_RenderDevice* m_pRenderDevice;
+  CFDE_Brush* m_pBrush;
+  CFX_Matrix m_Transform;
+  FXTEXT_CHARPOS* m_pCharPos;
+  int32_t m_iCharPosCount;
+  CFDE_VisualSetIterator* m_pIterator;
 };
 
 #endif  // XFA_FDE_FDE_RENDER_H_
diff --git a/xfa/fde/fde_renderdevice.h b/xfa/fde/fde_renderdevice.h
deleted file mode 100644
index f068659..0000000
--- a/xfa/fde/fde_renderdevice.h
+++ /dev/null
@@ -1,110 +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_RENDERDEVICE_H_
-#define XFA_FDE_FDE_RENDERDEVICE_H_
-
-#include "core/fxcrt/include/fx_coordinates.h"
-#include "core/fxge/include/fx_font.h"
-#include "core/fxge/include/fx_ge.h"
-#include "xfa/fde/fde_path.h"
-#include "xfa/fgas/font/fgas_font.h"
-
-class CFDE_Pen;
-class CFDE_Brush;
-class CFX_DIBitmap;
-class CFX_DIBSource;
-
-typedef struct FDE_HDEVICESTATE_ { void* pData; } * FDE_HDEVICESTATE;
-
-class IFDE_RenderDevice {
- public:
-  static IFDE_RenderDevice* Create(CFX_DIBitmap* pBitmap,
-                                   FX_BOOL bRgbByteOrder = FALSE);
-  static IFDE_RenderDevice* Create(CFX_RenderDevice* pDevice);
-  virtual ~IFDE_RenderDevice() {}
-  virtual void Release() = 0;
-
-  virtual int32_t GetWidth() const = 0;
-  virtual int32_t GetHeight() const = 0;
-  virtual FDE_HDEVICESTATE SaveState() = 0;
-  virtual void RestoreState(FDE_HDEVICESTATE hState) = 0;
-  virtual FX_BOOL SetClipPath(const IFDE_Path* pClip) = 0;
-  virtual IFDE_Path* GetClipPath() const = 0;
-  virtual FX_BOOL SetClipRect(const CFX_RectF& rtClip) = 0;
-  virtual const CFX_RectF& GetClipRect() = 0;
-
-  virtual FX_FLOAT GetDpiX() const = 0;
-  virtual FX_FLOAT GetDpiY() const = 0;
-
-  virtual FX_BOOL DrawImage(CFX_DIBSource* pDib,
-                            const CFX_RectF* pSrcRect,
-                            const CFX_RectF& dstRect,
-                            const CFX_Matrix* pImgMatrix = NULL,
-                            const CFX_Matrix* pDevMatrix = NULL) = 0;
-  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(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(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(CFDE_Pen* pPen,
-                              FX_FLOAT fPenWidth,
-                              const CFX_RectF& rect,
-                              const CFX_Matrix* pMatrix = NULL) = 0;
-  virtual FX_BOOL DrawLines(CFDE_Pen* pPen,
-                            FX_FLOAT fPenWidth,
-                            const CFX_PointsF& points,
-                            const CFX_Matrix* pMatrix = NULL) = 0;
-  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(CFDE_Pen* pPen,
-                           FX_FLOAT fPenWidth,
-                           const IFDE_Path* pPath,
-                           const CFX_Matrix* pMatrix = NULL) = 0;
-  virtual FX_BOOL DrawPolygon(CFDE_Pen* pPen,
-                              FX_FLOAT fPenWidth,
-                              const CFX_PointsF& points,
-                              const CFX_Matrix* pMatrix = NULL) = 0;
-  virtual FX_BOOL DrawRectangle(CFDE_Pen* pPen,
-                                FX_FLOAT fPenWidth,
-                                const CFX_RectF& rect,
-                                const CFX_Matrix* pMatrix = NULL) = 0;
-  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(CFDE_Brush* pBrush,
-                              const CFX_RectF& rect,
-                              const CFX_Matrix* pMatrix = NULL) = 0;
-  virtual FX_BOOL FillPath(CFDE_Brush* pBrush,
-                           const IFDE_Path* pPath,
-                           const CFX_Matrix* pMatrix = NULL) = 0;
-  virtual FX_BOOL FillPolygon(CFDE_Brush* pBrush,
-                              const CFX_PointsF& points,
-                              const CFX_Matrix* pMatrix = NULL) = 0;
-  virtual FX_BOOL FillRectangle(CFDE_Brush* pBrush,
-                                const CFX_RectF& rect,
-                                const CFX_Matrix* pMatrix = NULL) = 0;
-};
-
-#endif  // XFA_FDE_FDE_RENDERDEVICE_H_
diff --git a/xfa/fde/fde_visualset.h b/xfa/fde/fde_visualset.h
index 778d2dc..64f98b9 100644
--- a/xfa/fde/fde_visualset.h
+++ b/xfa/fde/fde_visualset.h
@@ -11,8 +11,8 @@
 #include "core/fxcrt/include/fx_system.h"
 #include "core/fxge/include/fx_dib.h"
 #include "core/fxge/include/fx_ge.h"
+#include "xfa/fde/cfde_path.h"
 #include "xfa/fde/fde_object.h"
-#include "xfa/fde/fde_path.h"
 #include "xfa/fgas/crt/fgas_memory.h"
 #include "xfa/fgas/font/fgas_font.h"
 
@@ -57,17 +57,4 @@
                                CFX_RectFArray& rtArray) = 0;
 };
 
-class IFDE_VisualSetIterator {
- public:
-  static IFDE_VisualSetIterator* Create();
-  virtual ~IFDE_VisualSetIterator() {}
-  virtual void Release() = 0;
-  virtual FX_BOOL AttachCanvas(IFDE_CanvasSet* pCanvas) = 0;
-  virtual FX_BOOL FilterObjects(uint32_t dwObjects = 0xFFFFFFFF) = 0;
-  virtual void Reset() = 0;
-  virtual FDE_HVISUALOBJ GetNext(IFDE_VisualSet*& pVisualSet,
-                                 FDE_HVISUALOBJ* phCanvasObj = NULL,
-                                 IFDE_CanvasSet** ppCanvasSet = NULL) = 0;
-};
-
 #endif  // XFA_FDE_FDE_VISUALSET_H_
diff --git a/xfa/fde/tto/fde_textout.cpp b/xfa/fde/tto/fde_textout.cpp
index 7895b78..a18fbbd 100644
--- a/xfa/fde/tto/fde_textout.cpp
+++ b/xfa/fde/tto/fde_textout.cpp
@@ -10,180 +10,13 @@
 
 #include "core/fxcrt/include/fx_coordinates.h"
 #include "core/fxcrt/include/fx_system.h"
+#include "xfa/fde/cfde_path.h"
+#include "xfa/fde/fde_gedevice.h"
 #include "xfa/fde/fde_object.h"
-#include "xfa/fde/fde_renderdevice.h"
 #include "xfa/fgas/crt/fgas_memory.h"
 #include "xfa/fgas/crt/fgas_utils.h"
 #include "xfa/fgas/layout/fgas_textbreak.h"
 
-namespace {
-
-struct FDE_TTOPIECE {
- public:
-  int32_t iStartChar;
-  int32_t iChars;
-  uint32_t dwCharStyles;
-  CFX_RectF rtPiece;
-};
-typedef FDE_TTOPIECE* FDE_LPTTOPIECE;
-typedef CFX_MassArrayTemplate<FDE_TTOPIECE> CFDE_TTOPieceArray;
-
-class CFDE_TTOLine : public CFX_Target {
- public:
-  CFDE_TTOLine();
-  CFDE_TTOLine(const CFDE_TTOLine& ttoLine);
-  ~CFDE_TTOLine();
-  int32_t AddPiece(int32_t index, const FDE_TTOPIECE& ttoPiece);
-  int32_t GetSize() const;
-  FDE_LPTTOPIECE GetPtrAt(int32_t index);
-  void RemoveLast(int32_t iCount);
-  void RemoveAll(FX_BOOL bLeaveMemory);
-  FX_BOOL m_bNewReload;
-  CFDE_TTOPieceArray m_pieces;
-
- protected:
-  int32_t m_iPieceCount;
-};
-typedef CFX_ObjectMassArrayTemplate<CFDE_TTOLine> CFDE_TTOLineArray;
-
-class CFDE_TextOut : public IFDE_TextOut, public CFX_Target {
- public:
-  CFDE_TextOut();
-  ~CFDE_TextOut();
-  virtual void Release() { delete this; }
-  virtual void SetFont(IFX_Font* pFont);
-  virtual void SetFontSize(FX_FLOAT fFontSize);
-  virtual void SetTextColor(FX_ARGB color);
-  virtual void SetStyles(uint32_t dwStyles);
-  virtual void SetTabWidth(FX_FLOAT fTabWidth);
-  virtual void SetEllipsisString(const CFX_WideString& wsEllipsis);
-  virtual void SetParagraphBreakChar(FX_WCHAR wch);
-  virtual void SetAlignment(int32_t iAlignment);
-  virtual void SetLineSpace(FX_FLOAT fLineSpace);
-  virtual void SetDIBitmap(CFX_DIBitmap* pDIB);
-  virtual void SetRenderDevice(CFX_RenderDevice* pDevice);
-  virtual void SetClipRect(const CFX_Rect& rtClip);
-  virtual void SetClipRect(const CFX_RectF& rtClip);
-  virtual void SetMatrix(const CFX_Matrix& matrix);
-  virtual void SetLineBreakTolerance(FX_FLOAT fTolerance);
-  virtual void CalcSize(const FX_WCHAR* pwsStr,
-                        int32_t iLength,
-                        CFX_Size& size);
-  virtual void CalcSize(const FX_WCHAR* pwsStr,
-                        int32_t iLength,
-                        CFX_SizeF& size);
-  virtual void CalcSize(const FX_WCHAR* pwsStr,
-                        int32_t iLength,
-                        CFX_Rect& rect);
-  virtual void CalcSize(const FX_WCHAR* pwsStr,
-                        int32_t iLength,
-                        CFX_RectF& rect);
-
-  virtual void DrawText(const FX_WCHAR* pwsStr,
-                        int32_t iLength,
-                        int32_t x,
-                        int32_t y);
-  virtual void DrawText(const FX_WCHAR* pwsStr,
-                        int32_t iLength,
-                        FX_FLOAT x,
-                        FX_FLOAT y);
-  virtual void DrawText(const FX_WCHAR* pwsStr,
-                        int32_t iLength,
-                        const CFX_Rect& rect);
-  virtual void DrawText(const FX_WCHAR* pwsStr,
-                        int32_t iLength,
-                        const CFX_RectF& rect);
-
-  virtual void SetLogicClipRect(const CFX_RectF& rtClip);
-  virtual void CalcLogicSize(const FX_WCHAR* pwsStr,
-                             int32_t iLength,
-                             CFX_SizeF& size);
-  virtual void CalcLogicSize(const FX_WCHAR* pwsStr,
-                             int32_t iLength,
-                             CFX_RectF& rect);
-  virtual void DrawLogicText(const FX_WCHAR* pwsStr,
-                             int32_t iLength,
-                             FX_FLOAT x,
-                             FX_FLOAT y);
-  virtual void DrawLogicText(const FX_WCHAR* pwsStr,
-                             int32_t iLength,
-                             const CFX_RectF& rect);
-  virtual int32_t GetTotalLines();
-
- protected:
-  void CalcTextSize(const FX_WCHAR* pwsStr, int32_t iLength, CFX_RectF& rect);
-  FX_BOOL RetrieveLineWidth(uint32_t dwBreakStatus,
-                            FX_FLOAT& fStartPos,
-                            FX_FLOAT& fWidth,
-                            FX_FLOAT& fHeight);
-  void SetLineWidth(CFX_RectF& rect);
-  void DrawText(const FX_WCHAR* pwsStr,
-                int32_t iLength,
-                const CFX_RectF& rect,
-                const CFX_RectF& rtClip);
-  void LoadText(const FX_WCHAR* pwsStr, int32_t iLength, const CFX_RectF& rect);
-  void LoadEllipsis();
-  void ExpandBuffer(int32_t iSize, int32_t iType);
-  void RetrieveEllPieces(int32_t*& pCharWidths);
-
-  void Reload(const CFX_RectF& rect);
-  void ReloadLinePiece(CFDE_TTOLine* pLine, const CFX_RectF& rect);
-  FX_BOOL RetriecePieces(uint32_t dwBreakStatus,
-                         int32_t& iStartChar,
-                         int32_t& iPieceWidths,
-                         FX_BOOL bReload,
-                         const CFX_RectF& rect);
-  void AppendPiece(const FDE_TTOPIECE& ttoPiece,
-                   FX_BOOL bNeedReload,
-                   FX_BOOL bEnd);
-  void ReplaceWidthEllipsis();
-  void DoAlignment(const CFX_RectF& rect);
-  void OnDraw(const CFX_RectF& rtClip);
-  int32_t GetDisplayPos(FDE_LPTTOPIECE pPiece);
-  int32_t GetCharRects(FDE_LPTTOPIECE pPiece);
-
-  FX_TXTRUN ToTextRun(const FDE_LPTTOPIECE pPiece);
-  void DrawLine(const FDE_LPTTOPIECE pPiece, CFDE_Pen*& pPen);
-
-  CFX_TxtBreak* m_pTxtBreak;
-  IFX_Font* m_pFont;
-  FX_FLOAT m_fFontSize;
-  FX_FLOAT m_fLineSpace;
-  FX_FLOAT m_fLinePos;
-  FX_FLOAT m_fTolerance;
-  int32_t m_iAlignment;
-  int32_t m_iTxtBkAlignment;
-  int32_t* m_pCharWidths;
-  int32_t m_iChars;
-  int32_t* m_pEllCharWidths;
-  int32_t m_iEllChars;
-  FX_WCHAR m_wParagraphBkChar;
-  FX_ARGB m_TxtColor;
-  uint32_t m_dwStyles;
-  uint32_t m_dwTxtBkStyles;
-  CFX_WideString m_wsEllipsis;
-  FX_BOOL m_bElliChanged;
-  int32_t m_iEllipsisWidth;
-  CFX_WideString m_wsText;
-  CFX_RectF m_rtClip;
-  CFX_RectF m_rtLogicClip;
-  CFX_Matrix m_Matrix;
-  CFDE_TTOLineArray m_ttoLines;
-  int32_t m_iCurLine;
-  int32_t m_iCurPiece;
-  int32_t m_iTotalLines;
-  FXTEXT_CHARPOS* m_pCharPos;
-  int32_t m_iCharPosSize;
-  IFDE_RenderDevice* m_pRenderDevice;
-  CFX_Int32Array m_hotKeys;
-  CFX_RectFArray m_rectArray;
-};
-
-}  // namespace
-
-IFDE_TextOut* IFDE_TextOut::Create() {
-  return new CFDE_TextOut;
-}
 CFDE_TextOut::CFDE_TextOut()
     : m_pFont(NULL),
       m_fFontSize(12.0f),
@@ -299,19 +132,25 @@
   m_fLineSpace = fLineSpace;
 }
 void CFDE_TextOut::SetDIBitmap(CFX_DIBitmap* pDIB) {
-  FXSYS_assert(pDIB != NULL);
-  if (m_pRenderDevice != NULL) {
+  FXSYS_assert(pDIB);
+
+  if (m_pRenderDevice)
     m_pRenderDevice->Release();
-  }
-  m_pRenderDevice = IFDE_RenderDevice::Create(pDIB);
+
+  CFX_FxgeDevice* device = new CFX_FxgeDevice;
+  device->Attach(pDIB, 0, FALSE);
+  m_pRenderDevice = new CFDE_RenderDevice(device, FALSE);
 }
+
 void CFDE_TextOut::SetRenderDevice(CFX_RenderDevice* pDevice) {
-  FXSYS_assert(pDevice != NULL);
-  if (m_pRenderDevice != NULL) {
+  FXSYS_assert(pDevice);
+
+  if (m_pRenderDevice)
     m_pRenderDevice->Release();
-  }
-  m_pRenderDevice = IFDE_RenderDevice::Create(pDevice);
+
+  m_pRenderDevice = new CFDE_RenderDevice(pDevice, FALSE);
 }
+
 void CFDE_TextOut::SetClipRect(const CFX_Rect& rtClip) {
   m_rtClip.Set((FX_FLOAT)rtClip.left, (FX_FLOAT)rtClip.top,
                (FX_FLOAT)rtClip.Width(), (FX_FLOAT)rtClip.Height());
@@ -834,7 +673,7 @@
     int32_t iCharCount = 0;
     int32_t iPiece = pLine->GetSize();
     while (iPiece-- > 0) {
-      FDE_LPTTOPIECE pPiece = pLine->GetPtrAt(iPiece);
+      FDE_TTOPIECE* pPiece = pLine->GetPtrAt(iPiece);
       if (pPiece == NULL) {
         break;
       }
@@ -876,7 +715,7 @@
   const FX_WCHAR* pwsStr = m_wsText.c_str();
   FX_BOOL bVertical = !!(m_dwStyles & FDE_TTOSTYLE_VerticalLayout);
   int32_t iPieceWidths = 0;
-  FDE_LPTTOPIECE pPiece = pLine->GetPtrAt(0);
+  FDE_TTOPIECE* pPiece = pLine->GetPtrAt(0);
   int32_t iStartChar = pPiece->iStartChar;
   m_fLinePos = bVertical ? pPiece->rtPiece.left : pPiece->rtPiece.top;
   int32_t iPieceCount = pLine->GetSize();
@@ -911,7 +750,7 @@
     return;
   }
   CFDE_TTOLine* pLine = m_ttoLines.GetPtrAt(iLines - 1);
-  FDE_LPTTOPIECE pPiece = pLine->GetPtrAt(0);
+  FDE_TTOPIECE* pPiece = pLine->GetPtrAt(0);
   if (pPiece == NULL) {
     return;
   }
@@ -931,7 +770,7 @@
     CFDE_TTOLine* pLine = m_ttoLines.GetPtrAt(i);
     int32_t iPieces = pLine->GetSize();
     for (int32_t j = 0; j < iPieces; j++) {
-      FDE_LPTTOPIECE pPiece = pLine->GetPtrAt(j);
+      FDE_TTOPIECE* pPiece = pLine->GetPtrAt(j);
       if (bVertical) {
         pPiece->rtPiece.left += fInc;
       } else {
@@ -959,7 +798,7 @@
     CFDE_TTOLine* pLine = m_ttoLines.GetPtrAt(i);
     int32_t iPieces = pLine->GetSize();
     for (int32_t j = 0; j < iPieces; j++) {
-      FDE_LPTTOPIECE pPiece = pLine->GetPtrAt(j);
+      FDE_TTOPIECE* pPiece = pLine->GetPtrAt(j);
       if (pPiece == NULL) {
         continue;
       }
@@ -976,19 +815,19 @@
   delete pPen;
 }
 
-int32_t CFDE_TextOut::GetDisplayPos(FDE_LPTTOPIECE pPiece) {
+int32_t CFDE_TextOut::GetDisplayPos(FDE_TTOPIECE* pPiece) {
   FX_TXTRUN tr = ToTextRun(pPiece);
   ExpandBuffer(tr.iLength, 2);
   return m_pTxtBreak->GetDisplayPos(&tr, m_pCharPos);
 }
 
-int32_t CFDE_TextOut::GetCharRects(FDE_LPTTOPIECE pPiece) {
+int32_t CFDE_TextOut::GetCharRects(const FDE_TTOPIECE* pPiece) {
   FX_TXTRUN tr = ToTextRun(pPiece);
   m_rectArray.RemoveAll();
   return m_pTxtBreak->GetCharRects(&tr, m_rectArray);
 }
 
-FX_TXTRUN CFDE_TextOut::ToTextRun(const FDE_LPTTOPIECE pPiece) {
+FX_TXTRUN CFDE_TextOut::ToTextRun(const FDE_TTOPIECE* pPiece) {
   FX_TXTRUN tr;
   tr.wsStr = m_wsText + pPiece->iStartChar;
   tr.pWidths = m_pCharWidths + pPiece->iStartChar;
@@ -1002,7 +841,7 @@
   return tr;
 }
 
-void CFDE_TextOut::DrawLine(const FDE_LPTTOPIECE pPiece, CFDE_Pen*& pPen) {
+void CFDE_TextOut::DrawLine(const FDE_TTOPIECE* 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);
@@ -1014,7 +853,7 @@
     pPen = new CFDE_Pen;
     pPen->SetColor(m_TxtColor);
   }
-  IFDE_Path* pPath = IFDE_Path::Create();
+  CFDE_Path* pPath = new CFDE_Path;
   int32_t iLineCount = 0;
   CFX_RectF rtText = pPiece->rtPiece;
   CFX_PointF pt1, pt2;
@@ -1100,7 +939,7 @@
 int32_t CFDE_TTOLine::GetSize() const {
   return m_iPieceCount;
 }
-FDE_LPTTOPIECE CFDE_TTOLine::GetPtrAt(int32_t index) {
+FDE_TTOPIECE* CFDE_TTOLine::GetPtrAt(int32_t index) {
   if (index >= m_iPieceCount) {
     return NULL;
   }
diff --git a/xfa/fde/tto/fde_textout.h b/xfa/fde/tto/fde_textout.h
index e20c00a..e3e87a7 100644
--- a/xfa/fde/tto/fde_textout.h
+++ b/xfa/fde/tto/fde_textout.h
@@ -9,7 +9,10 @@
 
 #include "core/fxge/include/fx_dib.h"
 #include "core/fxge/include/fx_ge.h"
+#include "xfa/fde/fde_object.h"
+#include "xfa/fgas/crt/fgas_utils.h"
 #include "xfa/fgas/font/fgas_font.h"
+#include "xfa/fgas/layout/fgas_textbreak.h"
 
 #define FDE_TTOSTYLE_Underline 0x0001
 #define FDE_TTOSTYLE_Strikeout 0x0002
@@ -36,67 +39,149 @@
 #define FDE_TTOALIGNMENT_BottomRight 10
 #define FDE_TTOALIGNMENT_BottomAuto 11
 
-class IFDE_TextOut {
+class CFDE_RenderDevice;
+class CFX_TxtBreak;
+
+struct FDE_TTOPIECE {
+  int32_t iStartChar;
+  int32_t iChars;
+  uint32_t dwCharStyles;
+  CFX_RectF rtPiece;
+};
+typedef CFX_MassArrayTemplate<FDE_TTOPIECE> CFDE_TTOPieceArray;
+
+class CFDE_TTOLine : public CFX_Target {
  public:
-  static IFDE_TextOut* Create();
-  virtual ~IFDE_TextOut() {}
-  virtual void Release() = 0;
-  virtual void SetFont(IFX_Font* pFont) = 0;
-  virtual void SetFontSize(FX_FLOAT fFontSize) = 0;
-  virtual void SetTextColor(FX_ARGB color) = 0;
-  virtual void SetStyles(uint32_t dwStyles) = 0;
-  virtual void SetTabWidth(FX_FLOAT fTabWidth) = 0;
-  virtual void SetEllipsisString(const CFX_WideString& wsEllipsis) = 0;
-  virtual void SetParagraphBreakChar(FX_WCHAR wch) = 0;
-  virtual void SetAlignment(int32_t iAlignment) = 0;
-  virtual void SetLineSpace(FX_FLOAT fLineSpace) = 0;
-  virtual void SetDIBitmap(CFX_DIBitmap* pDIB) = 0;
-  virtual void SetRenderDevice(CFX_RenderDevice* pDevice) = 0;
-  virtual void SetClipRect(const CFX_Rect& rtClip) = 0;
-  virtual void SetClipRect(const CFX_RectF& rtClip) = 0;
-  virtual void SetMatrix(const CFX_Matrix& matrix) = 0;
-  virtual void SetLineBreakTolerance(FX_FLOAT fTolerance) = 0;
-  virtual void CalcSize(const FX_WCHAR* pwsStr,
-                        int32_t iLength,
-                        CFX_Size& size) = 0;
-  virtual void CalcSize(const FX_WCHAR* pwsStr,
-                        int32_t iLength,
-                        CFX_SizeF& size) = 0;
-  virtual void CalcSize(const FX_WCHAR* pwsStr,
-                        int32_t iLength,
-                        CFX_Rect& rect) = 0;
-  virtual void CalcSize(const FX_WCHAR* pwsStr,
-                        int32_t iLength,
-                        CFX_RectF& rect) = 0;
-  virtual void DrawText(const FX_WCHAR* pwsStr,
-                        int32_t iLength,
-                        int32_t x,
-                        int32_t y) = 0;
-  virtual void DrawText(const FX_WCHAR* pwsStr,
-                        int32_t iLength,
-                        FX_FLOAT x,
-                        FX_FLOAT y) = 0;
-  virtual void DrawText(const FX_WCHAR* pwsStr,
-                        int32_t iLength,
-                        const CFX_Rect& rect) = 0;
-  virtual void DrawText(const FX_WCHAR* pwsStr,
-                        int32_t iLength,
-                        const CFX_RectF& rect) = 0;
-  virtual void SetLogicClipRect(const CFX_RectF& rtClip) = 0;
-  virtual void CalcLogicSize(const FX_WCHAR* pwsStr,
-                             int32_t iLength,
-                             CFX_SizeF& size) = 0;
-  virtual void CalcLogicSize(const FX_WCHAR* pwsStr,
-                             int32_t iLength,
-                             CFX_RectF& rect) = 0;
-  virtual void DrawLogicText(const FX_WCHAR* pwsStr,
-                             int32_t iLength,
-                             FX_FLOAT x,
-                             FX_FLOAT y) = 0;
-  virtual void DrawLogicText(const FX_WCHAR* pwsStr,
-                             int32_t iLength,
-                             const CFX_RectF& rect) = 0;
-  virtual int32_t GetTotalLines() = 0;
+  CFDE_TTOLine();
+  CFDE_TTOLine(const CFDE_TTOLine& ttoLine);
+  ~CFDE_TTOLine();
+  int32_t AddPiece(int32_t index, const FDE_TTOPIECE& ttoPiece);
+  int32_t GetSize() const;
+  FDE_TTOPIECE* GetPtrAt(int32_t index);
+  void RemoveLast(int32_t iCount);
+  void RemoveAll(FX_BOOL bLeaveMemory);
+
+  FX_BOOL m_bNewReload;
+  CFDE_TTOPieceArray m_pieces;
+
+ protected:
+  int32_t m_iPieceCount;
+};
+typedef CFX_ObjectMassArrayTemplate<CFDE_TTOLine> CFDE_TTOLineArray;
+
+class CFDE_TextOut : public CFX_Target {
+ public:
+  CFDE_TextOut();
+  ~CFDE_TextOut();
+
+  void Release() { delete this; }
+  void SetFont(IFX_Font* pFont);
+  void SetFontSize(FX_FLOAT fFontSize);
+  void SetTextColor(FX_ARGB color);
+  void SetStyles(uint32_t dwStyles);
+  void SetTabWidth(FX_FLOAT fTabWidth);
+  void SetEllipsisString(const CFX_WideString& wsEllipsis);
+  void SetParagraphBreakChar(FX_WCHAR wch);
+  void SetAlignment(int32_t iAlignment);
+  void SetLineSpace(FX_FLOAT fLineSpace);
+  void SetDIBitmap(CFX_DIBitmap* pDIB);
+  void SetRenderDevice(CFX_RenderDevice* pDevice);
+  void SetClipRect(const CFX_Rect& rtClip);
+  void SetClipRect(const CFX_RectF& rtClip);
+  void SetMatrix(const CFX_Matrix& matrix);
+  void SetLineBreakTolerance(FX_FLOAT fTolerance);
+  void CalcSize(const FX_WCHAR* pwsStr, int32_t iLength, CFX_Size& size);
+  void CalcSize(const FX_WCHAR* pwsStr, int32_t iLength, CFX_SizeF& size);
+  void CalcSize(const FX_WCHAR* pwsStr, int32_t iLength, CFX_Rect& rect);
+  void CalcSize(const FX_WCHAR* pwsStr, int32_t iLength, CFX_RectF& rect);
+
+  void DrawText(const FX_WCHAR* pwsStr, int32_t iLength, int32_t x, int32_t y);
+  void DrawText(const FX_WCHAR* pwsStr,
+                int32_t iLength,
+                FX_FLOAT x,
+                FX_FLOAT y);
+  void DrawText(const FX_WCHAR* pwsStr, int32_t iLength, const CFX_Rect& rect);
+  void DrawText(const FX_WCHAR* pwsStr, int32_t iLength, const CFX_RectF& rect);
+
+  void SetLogicClipRect(const CFX_RectF& rtClip);
+  void CalcLogicSize(const FX_WCHAR* pwsStr, int32_t iLength, CFX_SizeF& size);
+  void CalcLogicSize(const FX_WCHAR* pwsStr, int32_t iLength, CFX_RectF& rect);
+  void DrawLogicText(const FX_WCHAR* pwsStr,
+                     int32_t iLength,
+                     FX_FLOAT x,
+                     FX_FLOAT y);
+  void DrawLogicText(const FX_WCHAR* pwsStr,
+                     int32_t iLength,
+                     const CFX_RectF& rect);
+  int32_t GetTotalLines();
+
+ protected:
+  void CalcTextSize(const FX_WCHAR* pwsStr, int32_t iLength, CFX_RectF& rect);
+  FX_BOOL RetrieveLineWidth(uint32_t dwBreakStatus,
+                            FX_FLOAT& fStartPos,
+                            FX_FLOAT& fWidth,
+                            FX_FLOAT& fHeight);
+  void SetLineWidth(CFX_RectF& rect);
+  void DrawText(const FX_WCHAR* pwsStr,
+                int32_t iLength,
+                const CFX_RectF& rect,
+                const CFX_RectF& rtClip);
+  void LoadText(const FX_WCHAR* pwsStr, int32_t iLength, const CFX_RectF& rect);
+  void LoadEllipsis();
+  void ExpandBuffer(int32_t iSize, int32_t iType);
+  void RetrieveEllPieces(int32_t*& pCharWidths);
+
+  void Reload(const CFX_RectF& rect);
+  void ReloadLinePiece(CFDE_TTOLine* pLine, const CFX_RectF& rect);
+  FX_BOOL RetriecePieces(uint32_t dwBreakStatus,
+                         int32_t& iStartChar,
+                         int32_t& iPieceWidths,
+                         FX_BOOL bReload,
+                         const CFX_RectF& rect);
+  void AppendPiece(const FDE_TTOPIECE& ttoPiece,
+                   FX_BOOL bNeedReload,
+                   FX_BOOL bEnd);
+  void ReplaceWidthEllipsis();
+  void DoAlignment(const CFX_RectF& rect);
+  void OnDraw(const CFX_RectF& rtClip);
+  int32_t GetDisplayPos(FDE_TTOPIECE* pPiece);
+  int32_t GetCharRects(const FDE_TTOPIECE* pPiece);
+
+  FX_TXTRUN ToTextRun(const FDE_TTOPIECE* pPiece);
+  void DrawLine(const FDE_TTOPIECE* pPiece, CFDE_Pen*& pPen);
+
+  CFX_TxtBreak* m_pTxtBreak;
+  IFX_Font* m_pFont;
+  FX_FLOAT m_fFontSize;
+  FX_FLOAT m_fLineSpace;
+  FX_FLOAT m_fLinePos;
+  FX_FLOAT m_fTolerance;
+  int32_t m_iAlignment;
+  int32_t m_iTxtBkAlignment;
+  int32_t* m_pCharWidths;
+  int32_t m_iChars;
+  int32_t* m_pEllCharWidths;
+  int32_t m_iEllChars;
+  FX_WCHAR m_wParagraphBkChar;
+  FX_ARGB m_TxtColor;
+  uint32_t m_dwStyles;
+  uint32_t m_dwTxtBkStyles;
+  CFX_WideString m_wsEllipsis;
+  FX_BOOL m_bElliChanged;
+  int32_t m_iEllipsisWidth;
+  CFX_WideString m_wsText;
+  CFX_RectF m_rtClip;
+  CFX_RectF m_rtLogicClip;
+  CFX_Matrix m_Matrix;
+  CFDE_TTOLineArray m_ttoLines;
+  int32_t m_iCurLine;
+  int32_t m_iCurPiece;
+  int32_t m_iTotalLines;
+  FXTEXT_CHARPOS* m_pCharPos;
+  int32_t m_iCharPosSize;
+  CFDE_RenderDevice* m_pRenderDevice;
+  CFX_Int32Array m_hotKeys;
+  CFX_RectFArray m_rectArray;
 };
 
 #endif  // XFA_FDE_TTO_FDE_TEXTOUT_H_
diff --git a/xfa/fee/fde_txtedtengine.cpp b/xfa/fee/fde_txtedtengine.cpp
index ac3c74f..adb28ea 100644
--- a/xfa/fee/fde_txtedtengine.cpp
+++ b/xfa/fee/fde_txtedtengine.cpp
@@ -1509,7 +1509,7 @@
 }
 
 FX_BOOL CFDE_TxtEdtEngine::IsFitArea(CFX_WideString& wsText) {
-  IFDE_TextOut* pTextOut = IFDE_TextOut::Create();
+  CFDE_TextOut* pTextOut = new CFDE_TextOut;
   pTextOut->SetLineSpace(m_Param.fLineSpace);
   pTextOut->SetFont(m_Param.pFont);
   pTextOut->SetFontSize(m_Param.fFontSize);
diff --git a/xfa/fwl/basewidget/fwl_editimp.cpp b/xfa/fwl/basewidget/fwl_editimp.cpp
index d25fd09..54e8abc 100644
--- a/xfa/fwl/basewidget/fwl_editimp.cpp
+++ b/xfa/fwl/basewidget/fwl_editimp.cpp
@@ -9,8 +9,8 @@
 #include <algorithm>
 #include <vector>
 
+#include "xfa/fde/fde_gedevice.h"
 #include "xfa/fde/fde_render.h"
-#include "xfa/fde/fde_renderdevice.h"
 #include "xfa/fee/ifde_txtedtpage.h"
 #include "xfa/fwl/basewidget/fwl_caretimp.h"
 #include "xfa/fwl/basewidget/fwl_comboboximp.h"
@@ -1039,12 +1039,8 @@
   CFX_RenderDevice* pRenderDev = pGraphics->GetRenderDevice();
   if (!pRenderDev)
     return;
-  IFDE_RenderDevice* pRenderDevice = IFDE_RenderDevice::Create(pRenderDev);
-  if (!pRenderDevice)
-    return;
-  IFDE_RenderContext* pRenderContext = IFDE_RenderContext::Create();
-  if (!pRenderContext)
-    return;
+  CFDE_RenderDevice* pRenderDevice = new CFDE_RenderDevice(pRenderDev, FALSE);
+  CFDE_RenderContext* pRenderContext = new CFDE_RenderContext;
   pRenderDevice->SetClipRect(rtClip);
   pRenderContext->StartRender(pRenderDevice, pPage, mt);
   pRenderContext->DoRender(NULL);
diff --git a/xfa/fwl/theme/cfwl_widgettp.cpp b/xfa/fwl/theme/cfwl_widgettp.cpp
index 1ce5d46..2fc8036 100644
--- a/xfa/fwl/theme/cfwl_widgettp.cpp
+++ b/xfa/fwl/theme/cfwl_widgettp.cpp
@@ -206,7 +206,7 @@
   }
   m_pFDEFont =
       CFWL_FontManager::GetInstance()->FindFont(FX_WSTRC(L"Helvetica"), 0, 0);
-  m_pTextOut = IFDE_TextOut::Create();
+  m_pTextOut = new CFDE_TextOut;
   m_pTextOut->SetFont(m_pFDEFont);
   m_pTextOut->SetFontSize(FWLTHEME_CAPACITY_FontSize);
   m_pTextOut->SetTextColor(FWLTHEME_CAPACITY_TextColor);
diff --git a/xfa/fwl/theme/cfwl_widgettp.h b/xfa/fwl/theme/cfwl_widgettp.h
index bbb3fd7..4e64037 100644
--- a/xfa/fwl/theme/cfwl_widgettp.h
+++ b/xfa/fwl/theme/cfwl_widgettp.h
@@ -20,13 +20,13 @@
   None = 0,
 
   Today,
+  Sun,
   Mon,
   Tue,
   Wed,
   Thu,
   Fri,
   Sat,
-  Sun,
 
   January,
   February,
@@ -92,7 +92,7 @@
 };
 
 class IFWL_Widget;
-class IFDE_TextOut;
+class CFDE_TextOut;
 class IFX_Font;
 class IFX_FontMgr;
 class CFWL_ArrowData;
@@ -217,7 +217,7 @@
                     FWLTHEME_STATE eState,
                     CFX_Matrix* pMatrix = NULL);
   uint32_t m_dwRefCount;
-  IFDE_TextOut* m_pTextOut;
+  CFDE_TextOut* m_pTextOut;
   IFX_Font* m_pFDEFont;
   FX_FLOAT m_fValue;
   uint32_t m_dwValue;
diff --git a/xfa/fxfa/app/xfa_ffpageview.cpp b/xfa/fxfa/app/xfa_ffpageview.cpp
index fe2e3ab..a5217ab 100644
--- a/xfa/fxfa/app/xfa_ffpageview.cpp
+++ b/xfa/fxfa/app/xfa_ffpageview.cpp
@@ -18,6 +18,58 @@
 #include "xfa/fxfa/include/xfa_ffdocview.h"
 #include "xfa/fxfa/include/xfa_ffwidget.h"
 
+namespace {
+
+void GetPageMatrix(CFX_Matrix& pageMatrix,
+                   const CFX_RectF& docPageRect,
+                   const CFX_Rect& devicePageRect,
+                   int32_t iRotate,
+                   uint32_t dwCoordinatesType) {
+  FXSYS_assert(iRotate >= 0 && iRotate <= 3);
+  FX_BOOL bFlipX = (dwCoordinatesType & 0x01) != 0;
+  FX_BOOL bFlipY = (dwCoordinatesType & 0x02) != 0;
+  CFX_Matrix m;
+  m.Set((bFlipX ? -1.0f : 1.0f), 0, 0, (bFlipY ? -1.0f : 1.0f), 0, 0);
+  if (iRotate == 0 || iRotate == 2) {
+    m.a *= (FX_FLOAT)devicePageRect.width / docPageRect.width;
+    m.d *= (FX_FLOAT)devicePageRect.height / docPageRect.height;
+  } else {
+    m.a *= (FX_FLOAT)devicePageRect.height / docPageRect.width;
+    m.d *= (FX_FLOAT)devicePageRect.width / docPageRect.height;
+  }
+  m.Rotate(iRotate * 1.57079632675f);
+  switch (iRotate) {
+    case 0:
+      m.e = bFlipX ? (FX_FLOAT)devicePageRect.right()
+                   : (FX_FLOAT)devicePageRect.left;
+      m.f = bFlipY ? (FX_FLOAT)devicePageRect.bottom()
+                   : (FX_FLOAT)devicePageRect.top;
+      break;
+    case 1:
+      m.e = bFlipY ? (FX_FLOAT)devicePageRect.left
+                   : (FX_FLOAT)devicePageRect.right();
+      m.f = bFlipX ? (FX_FLOAT)devicePageRect.bottom()
+                   : (FX_FLOAT)devicePageRect.top;
+      break;
+    case 2:
+      m.e = bFlipX ? (FX_FLOAT)devicePageRect.left
+                   : (FX_FLOAT)devicePageRect.right();
+      m.f = bFlipY ? (FX_FLOAT)devicePageRect.top
+                   : (FX_FLOAT)devicePageRect.bottom();
+      break;
+    case 3:
+      m.e = bFlipY ? (FX_FLOAT)devicePageRect.right()
+                   : (FX_FLOAT)devicePageRect.left;
+      m.f = bFlipX ? (FX_FLOAT)devicePageRect.top
+                   : (FX_FLOAT)devicePageRect.bottom();
+      break;
+    default:
+      break;
+  }
+  pageMatrix = m;
+}
+
+}  // namespace
 CXFA_FFPageView::CXFA_FFPageView(CXFA_FFDocView* pDocView, CXFA_Node* pPageArea)
     : CXFA_ContainerLayoutItem(pPageArea), m_pDocView(pDocView) {}
 
@@ -43,7 +95,7 @@
   GetPageSize(sz);
   CFX_RectF fdePage;
   fdePage.Set(0, 0, sz.x, sz.y);
-  FDE_GetPageMatrix(mt, fdePage, rtDisp, iRotate, 0);
+  GetPageMatrix(mt, fdePage, rtDisp, iRotate, 0);
 }
 
 IXFA_WidgetIterator* CXFA_FFPageView::CreateWidgetIterator(
diff --git a/xfa/fxfa/app/xfa_ffwidgetacc.cpp b/xfa/fxfa/app/xfa_ffwidgetacc.cpp
index b1214dd..561db25 100644
--- a/xfa/fxfa/app/xfa_ffwidgetacc.cpp
+++ b/xfa/fxfa/app/xfa_ffwidgetacc.cpp
@@ -142,7 +142,7 @@
   }
   CXFA_TextLayout* m_pCapTextLayout;
   CXFA_TextProvider* m_pCapTextProvider;
-  IFDE_TextOut* m_pTextOut;
+  CFDE_TextOut* m_pTextOut;
   CFX_FloatArray* m_pFieldSplitArray;
 };
 class CXFA_TextEditData : public CXFA_FieldLayoutData {
@@ -882,9 +882,12 @@
   if (wsLast == wcEnter) {
     wsText = wsText + wcEnter;
   }
-  if (!((CXFA_FieldLayoutData*)m_pLayoutData)->m_pTextOut) {
-    ((CXFA_FieldLayoutData*)m_pLayoutData)->m_pTextOut = IFDE_TextOut::Create();
-    IFDE_TextOut* pTextOut = ((CXFA_FieldLayoutData*)m_pLayoutData)->m_pTextOut;
+
+  CXFA_FieldLayoutData* layoutData =
+      static_cast<CXFA_FieldLayoutData*>(m_pLayoutData);
+  if (!layoutData->m_pTextOut) {
+    layoutData->m_pTextOut = new CFDE_TextOut;
+    CFDE_TextOut* pTextOut = layoutData->m_pTextOut;
     pTextOut->SetFont(GetFDEFont());
     pTextOut->SetFontSize(fFontSize);
     pTextOut->SetLineBreakTolerance(fFontSize * 0.2f);
@@ -895,8 +898,8 @@
     }
     pTextOut->SetStyles(dwStyles);
   }
-  ((CXFA_FieldLayoutData*)m_pLayoutData)
-      ->m_pTextOut->CalcLogicSize(wsText.c_str(), wsText.GetLength(), size);
+  layoutData->m_pTextOut->CalcLogicSize(wsText.c_str(), wsText.GetLength(),
+                                        size);
 }
 FX_BOOL CXFA_WidgetAcc::CalculateTextEditAutoSize(CFX_SizeF& size) {
   if (size.x > 0) {
diff --git a/xfa/fxfa/app/xfa_fwltheme.cpp b/xfa/fxfa/app/xfa_fwltheme.cpp
index 82cabcc..462c7cb 100644
--- a/xfa/fxfa/app/xfa_fwltheme.cpp
+++ b/xfa/fxfa/app/xfa_fwltheme.cpp
@@ -77,7 +77,7 @@
   delete m_pBarcodeTP;
 }
 FWL_ERR CXFA_FWLTheme::Initialize() {
-  m_pTextOut = IFDE_TextOut::Create();
+  m_pTextOut = new CFDE_TextOut;
   for (size_t i = 0; !m_pCalendarFont && i < FX_ArraySize(g_FWLTheme_CalFonts);
        ++i) {
     m_pCalendarFont = IFX_Font::LoadFont(g_FWLTheme_CalFonts[i], 0, 0,
diff --git a/xfa/fxfa/app/xfa_fwltheme.h b/xfa/fxfa/app/xfa_fwltheme.h
index 5fda005..75885a5 100644
--- a/xfa/fxfa/app/xfa_fwltheme.h
+++ b/xfa/fxfa/app/xfa_fwltheme.h
@@ -78,7 +78,7 @@
   CFWL_PushButtonTP* m_pPushButtonTP;
   CFWL_CaretTP* m_pCaretTP;
   CFWL_BarcodeTP* m_pBarcodeTP;
-  IFDE_TextOut* m_pTextOut;
+  CFDE_TextOut* m_pTextOut;
   FX_FLOAT m_fCapacity;
   uint32_t m_dwCapacity;
   IFX_Font* m_pCalendarFont;
diff --git a/xfa/fxfa/app/xfa_textlayout.cpp b/xfa/fxfa/app/xfa_textlayout.cpp
index 532d6f5..c0a8895 100644
--- a/xfa/fxfa/app/xfa_textlayout.cpp
+++ b/xfa/fxfa/app/xfa_textlayout.cpp
@@ -9,7 +9,9 @@
 #include <algorithm>
 
 #include "core/fxcrt/include/fx_ext.h"
+#include "xfa/fde/cfde_path.h"
 #include "xfa/fde/css/fde_csscache.h"
+#include "xfa/fde/fde_gedevice.h"
 #include "xfa/fde/fde_object.h"
 #include "xfa/fde/xml/fde_xml_imp.h"
 #include "xfa/fgas/crt/fgas_algorithm.h"
@@ -1216,10 +1218,10 @@
                                     const CFX_Matrix& tmDoc2Device,
                                     const CFX_RectF& rtClip,
                                     int32_t iBlock) {
-  IFDE_RenderDevice* pDevice = IFDE_RenderDevice::Create(pFxDevice);
-  if (pDevice == NULL) {
+  if (!pFxDevice)
     return FALSE;
-  }
+
+  CFDE_RenderDevice* pDevice = new CFDE_RenderDevice(pFxDevice, FALSE);
   FDE_HDEVICESTATE state = pDevice->SaveState();
   pDevice->SetClipRect(rtClip);
   CFDE_Brush* pSolidBrush = new CFDE_Brush;
@@ -1838,7 +1840,7 @@
   }
   m_iLines++;
 }
-void CXFA_TextLayout::RenderString(IFDE_RenderDevice* pDevice,
+void CXFA_TextLayout::RenderString(CFDE_RenderDevice* pDevice,
                                    CFDE_Brush* pBrush,
                                    CXFA_PieceLine* pPieceLine,
                                    int32_t iPiece,
@@ -1853,7 +1855,7 @@
   }
   pPieceLine->m_charCounts.Add(iCount);
 }
-void CXFA_TextLayout::RenderPath(IFDE_RenderDevice* pDevice,
+void CXFA_TextLayout::RenderPath(CFDE_RenderDevice* pDevice,
                                  CFDE_Pen* pPen,
                                  CXFA_PieceLine* pPieceLine,
                                  int32_t iPiece,
@@ -1866,7 +1868,7 @@
     return;
   }
   pPen->SetColor(pPiece->dwColor);
-  IFDE_Path* pPath = IFDE_Path::Create();
+  CFDE_Path* pPath = new CFDE_Path;
   int32_t iChars = GetDisplayPos(pPiece, pCharPos);
   if (iChars > 0) {
     CFX_PointF pt1, pt2;
diff --git a/xfa/fxfa/app/xfa_textlayout.h b/xfa/fxfa/app/xfa_textlayout.h
index 88b29e2..9c3184b 100644
--- a/xfa/fxfa/app/xfa_textlayout.h
+++ b/xfa/fxfa/app/xfa_textlayout.h
@@ -8,7 +8,7 @@
 #define XFA_FXFA_APP_XFA_TEXTLAYOUT_H_
 
 #include "xfa/fde/css/fde_css.h"
-#include "xfa/fde/fde_renderdevice.h"
+#include "xfa/fde/fde_gedevice.h"
 #include "xfa/fgas/layout/fgas_rtfbreak.h"
 #include "xfa/fxfa/include/xfa_ffdoc.h"
 #include "xfa/fxfa/parser/xfa_object.h"
@@ -375,13 +375,13 @@
   FX_BOOL IsEnd(FX_BOOL bSavePieces);
   void ProcessText(CFX_WideString& wsText);
   void UpdateAlign(FX_FLOAT fHeight, FX_FLOAT fBottom);
-  void RenderString(IFDE_RenderDevice* pDevice,
+  void RenderString(CFDE_RenderDevice* pDevice,
                     CFDE_Brush* pBrush,
                     CXFA_PieceLine* pPieceLine,
                     int32_t iPiece,
                     FXTEXT_CHARPOS* pCharPos,
                     const CFX_Matrix& tmDoc2Device);
-  void RenderPath(IFDE_RenderDevice* pDevice,
+  void RenderPath(CFDE_RenderDevice* pDevice,
                   CFDE_Pen* pPen,
                   CXFA_PieceLine* pPieceLine,
                   int32_t iPiece,
