diff --git a/BUILD.gn b/BUILD.gn
index 9c23428..93196a4 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -1457,8 +1457,6 @@
 
   static_library("xfa") {
     sources = [
-      "xfa/fde/cfde_rendercontext.cpp",
-      "xfa/fde/cfde_rendercontext.h",
       "xfa/fde/cfde_renderdevice.cpp",
       "xfa/fde/cfde_textout.cpp",
       "xfa/fde/cfde_textout.h",
diff --git a/xfa/fde/cfde_rendercontext.cpp b/xfa/fde/cfde_rendercontext.cpp
deleted file mode 100644
index 0b44cb4..0000000
--- a/xfa/fde/cfde_rendercontext.cpp
+++ /dev/null
@@ -1,61 +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
-
-#include "xfa/fde/cfde_rendercontext.h"
-
-#include <vector>
-
-#include "third_party/base/logging.h"
-#include "third_party/base/ptr_util.h"
-#include "xfa/fde/cfde_renderdevice.h"
-#include "xfa/fde/cfde_txtedtpage.h"
-#include "xfa/fde/cfde_txtedttextset.h"
-
-CFDE_RenderContext::CFDE_RenderContext(CFDE_RenderDevice* pRenderDevice)
-    : m_pRenderDevice(pRenderDevice) {}
-
-CFDE_RenderContext::~CFDE_RenderContext() {}
-
-void CFDE_RenderContext::Render(CFDE_TxtEdtPage* pCanvasSet,
-                                const CFX_Matrix& tmDoc2Device) {
-  if (!m_pRenderDevice || !pCanvasSet)
-    return;
-
-  CFDE_TxtEdtTextSet* pVisualSet = pCanvasSet->GetTextSet();
-  if (!pVisualSet)
-    return;
-
-  CFX_RetainPtr<CFGAS_GEFont> pFont = pVisualSet->GetFont();
-  if (!pFont)
-    return;
-
-  CFX_RectF rtDocClip = m_pRenderDevice->GetClipRect();
-  if (rtDocClip.IsEmpty()) {
-    rtDocClip.left = rtDocClip.top = 0;
-    rtDocClip.width = static_cast<float>(m_pRenderDevice->GetWidth());
-    rtDocClip.height = static_cast<float>(m_pRenderDevice->GetHeight());
-  }
-  tmDoc2Device.GetInverse().TransformRect(rtDocClip);
-
-  std::vector<FXTEXT_CHARPOS> char_pos;
-
-  for (size_t i = 0; i < pCanvasSet->GetTextPieceCount(); ++i) {
-    const FDE_TEXTEDITPIECE& pText = pCanvasSet->GetTextPiece(i);
-    if (!rtDocClip.IntersectWith(pVisualSet->GetRect(pText)))
-      continue;
-
-    int32_t iCount = pVisualSet->GetDisplayPos(pText, nullptr, false);
-    if (iCount < 1)
-      continue;
-    if (char_pos.size() < static_cast<size_t>(iCount))
-      char_pos.resize(iCount, FXTEXT_CHARPOS());
-
-    iCount = pVisualSet->GetDisplayPos(pText, char_pos.data(), false);
-    m_pRenderDevice->DrawString(pVisualSet->GetFontColor(), pFont,
-                                char_pos.data(), iCount,
-                                pVisualSet->GetFontSize(), &tmDoc2Device);
-  }
-}
diff --git a/xfa/fde/cfde_rendercontext.h b/xfa/fde/cfde_rendercontext.h
deleted file mode 100644
index 6be77c6..0000000
--- a/xfa/fde/cfde_rendercontext.h
+++ /dev/null
@@ -1,27 +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_CFDE_RENDERCONTEXT_H_
-#define XFA_FDE_CFDE_RENDERCONTEXT_H_
-
-#include "core/fxcrt/fx_coordinates.h"
-
-class CFDE_RenderDevice;
-class CFDE_TxtEdtPage;
-class CFDE_TxtEdtTextSet;
-
-class CFDE_RenderContext {
- public:
-  explicit CFDE_RenderContext(CFDE_RenderDevice* pRenderDevice);
-  ~CFDE_RenderContext();
-
-  void Render(CFDE_TxtEdtPage* pCanvasSet, const CFX_Matrix& tmDoc2Device);
-
- private:
-  CFDE_RenderDevice* m_pRenderDevice;
-};
-
-#endif  // XFA_FDE_CFDE_RENDERCONTEXT_H_
diff --git a/xfa/fwl/cfwl_edit.cpp b/xfa/fwl/cfwl_edit.cpp
index fe4b9da..042e076 100644
--- a/xfa/fwl/cfwl_edit.cpp
+++ b/xfa/fwl/cfwl_edit.cpp
@@ -13,10 +13,10 @@
 
 #include "third_party/base/ptr_util.h"
 #include "third_party/base/stl_util.h"
-#include "xfa/fde/cfde_rendercontext.h"
 #include "xfa/fde/cfde_renderdevice.h"
 #include "xfa/fde/cfde_txtedtengine.h"
 #include "xfa/fde/cfde_txtedtpage.h"
+#include "xfa/fde/cfde_txtedttextset.h"
 #include "xfa/fgas/font/cfgas_gefont.h"
 #include "xfa/fwl/cfwl_app.h"
 #include "xfa/fwl/cfwl_caret.h"
@@ -567,11 +567,7 @@
   if (!pRenderDev)
     return;
 
-  CFDE_RenderDevice renderDevice(pRenderDev);
-  renderDevice.SetClipRect(rtClip);
-
-  CFDE_RenderContext renderContext(&renderDevice);
-  renderContext.Render(pPage, mt);
+  RenderText(pRenderDev, rtClip, *pPage, mt);
 
   if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_CombText) {
     pGraphics->RestoreGraphState();
@@ -596,6 +592,50 @@
   pGraphics->RestoreGraphState();
 }
 
+void CFWL_Edit::RenderText(CFX_RenderDevice* pRenderDev,
+                           const CFX_RectF& clipRect,
+                           const CFDE_TxtEdtPage& pPage,
+                           const CFX_Matrix& mt) {
+  ASSERT(pRenderDev);
+
+  CFDE_TxtEdtTextSet* pTextSet = pPage.GetTextSet();
+  if (!pTextSet)
+    return;
+
+  CFX_RetainPtr<CFGAS_GEFont> pFont = pTextSet->GetFont();
+  if (!pFont)
+    return;
+
+  CFDE_RenderDevice renderDevice(pRenderDev);
+  renderDevice.SetClipRect(clipRect);
+
+  CFX_RectF rtDocClip = renderDevice.GetClipRect();
+  if (rtDocClip.IsEmpty()) {
+    rtDocClip.left = rtDocClip.top = 0;
+    rtDocClip.width = static_cast<float>(renderDevice.GetWidth());
+    rtDocClip.height = static_cast<float>(renderDevice.GetHeight());
+  }
+  mt.GetInverse().TransformRect(rtDocClip);
+
+  std::vector<FXTEXT_CHARPOS> char_pos;
+
+  for (size_t i = 0; i < pPage.GetTextPieceCount(); ++i) {
+    const FDE_TEXTEDITPIECE& pText = pPage.GetTextPiece(i);
+    if (!rtDocClip.IntersectWith(pTextSet->GetRect(pText)))
+      continue;
+
+    int32_t iCount = pTextSet->GetDisplayPos(pText, nullptr, false);
+    if (iCount < 1)
+      continue;
+    if (char_pos.size() < static_cast<size_t>(iCount))
+      char_pos.resize(iCount, FXTEXT_CHARPOS());
+
+    iCount = pTextSet->GetDisplayPos(pText, char_pos.data(), false);
+    renderDevice.DrawString(pTextSet->GetFontColor(), pFont, char_pos.data(),
+                            iCount, pTextSet->GetFontSize(), &mt);
+  }
+}
+
 void CFWL_Edit::UpdateEditEngine() {
   UpdateEditParams();
   UpdateEditLayout();
diff --git a/xfa/fwl/cfwl_edit.h b/xfa/fwl/cfwl_edit.h
index 15d20bf..dd16503 100644
--- a/xfa/fwl/cfwl_edit.h
+++ b/xfa/fwl/cfwl_edit.h
@@ -109,6 +109,10 @@
   CFDE_TxtEdtEngine* GetTxtEdtEngine() { return &m_EdtEngine; }
 
  private:
+  void RenderText(CFX_RenderDevice* pRenderDev,
+                  const CFX_RectF& clipRect,
+                  const CFDE_TxtEdtPage& pPage,
+                  const CFX_Matrix& mt);
   void DrawTextBk(CXFA_Graphics* pGraphics,
                   IFWL_ThemeProvider* pTheme,
                   const CFX_Matrix* pMatrix);
diff --git a/xfa/fxfa/cxfa_ffpageview.cpp b/xfa/fxfa/cxfa_ffpageview.cpp
index 9ba4432..594d71d 100644
--- a/xfa/fxfa/cxfa_ffpageview.cpp
+++ b/xfa/fxfa/cxfa_ffpageview.cpp
@@ -12,7 +12,6 @@
 
 #include "third_party/base/ptr_util.h"
 #include "third_party/base/stl_util.h"
-#include "xfa/fde/cfde_rendercontext.h"
 #include "xfa/fxfa/cxfa_ffcheckbutton.h"
 #include "xfa/fxfa/cxfa_ffdoc.h"
 #include "xfa/fxfa/cxfa_ffdocview.h"
