diff --git a/BUILD.gn b/BUILD.gn
index ba00055..3a62b70 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -1903,16 +1903,16 @@
       "xfa/fxfa/parser/xfa_resolvenode_rs.h",
       "xfa/fxfa/parser/xfa_utils.cpp",
       "xfa/fxfa/parser/xfa_utils.h",
-      "xfa/fxgraphics/cxfa_color.cpp",
-      "xfa/fxgraphics/cxfa_color.h",
+      "xfa/fxgraphics/cxfa_gecolor.cpp",
+      "xfa/fxgraphics/cxfa_gecolor.h",
+      "xfa/fxgraphics/cxfa_gepath.cpp",
+      "xfa/fxgraphics/cxfa_gepath.h",
+      "xfa/fxgraphics/cxfa_gepattern.cpp",
+      "xfa/fxgraphics/cxfa_gepattern.h",
+      "xfa/fxgraphics/cxfa_geshading.cpp",
+      "xfa/fxgraphics/cxfa_geshading.h",
       "xfa/fxgraphics/cxfa_graphics.cpp",
       "xfa/fxgraphics/cxfa_graphics.h",
-      "xfa/fxgraphics/cxfa_path.cpp",
-      "xfa/fxgraphics/cxfa_path.h",
-      "xfa/fxgraphics/cxfa_pattern.cpp",
-      "xfa/fxgraphics/cxfa_pattern.h",
-      "xfa/fxgraphics/cxfa_shading.cpp",
-      "xfa/fxgraphics/cxfa_shading.h",
     ]
     include_dirs = [ "." ]
     deps = [
diff --git a/xfa/fwl/cfwl_caret.h b/xfa/fwl/cfwl_caret.h
index 6388236..90d62d6 100644
--- a/xfa/fwl/cfwl_caret.h
+++ b/xfa/fwl/cfwl_caret.h
@@ -11,7 +11,7 @@
 
 #include "xfa/fwl/cfwl_timer.h"
 #include "xfa/fwl/cfwl_widget.h"
-#include "xfa/fxgraphics/cxfa_color.h"
+#include "xfa/fxgraphics/cxfa_gecolor.h"
 
 class CFWL_WidgetProperties;
 class CFWL_Widget;
diff --git a/xfa/fwl/cfwl_edit.cpp b/xfa/fwl/cfwl_edit.cpp
index 45e69ab..cdbca2c 100644
--- a/xfa/fwl/cfwl_edit.cpp
+++ b/xfa/fwl/cfwl_edit.cpp
@@ -31,7 +31,7 @@
 #include "xfa/fwl/theme/cfwl_utils.h"
 #include "xfa/fxfa/cxfa_ffdoc.h"
 #include "xfa/fxfa/cxfa_ffwidget.h"
-#include "xfa/fxgraphics/cxfa_path.h"
+#include "xfa/fxgraphics/cxfa_gepath.h"
 
 namespace {
 
@@ -49,7 +49,7 @@
          c == 0x0027;
 }
 
-void AddSquigglyPath(CXFA_Path* pPathData,
+void AddSquigglyPath(CXFA_GEPath* pPathData,
                      float fStartX,
                      float fEndX,
                      float fY,
@@ -163,7 +163,7 @@
   return FWL_WidgetHit::Unknown;
 }
 
-void CFWL_Edit::AddSpellCheckObj(CXFA_Path& PathData,
+void CFWL_Edit::AddSpellCheckObj(CXFA_GEPath& PathData,
                                  int32_t nStart,
                                  int32_t nCount,
                                  float fOffSetX,
@@ -190,7 +190,7 @@
 
   CFWL_EventCheckWord checkWordEvent(this);
   ByteString sLatinWord;
-  CXFA_Path pathSpell;
+  CXFA_GEPath pathSpell;
   int32_t nStart = 0;
   float fOffSetX = m_rtEngine.left - m_fScrollOffsetX;
   float fOffSetY = m_rtEngine.top - m_fScrollOffsetY + m_fVAlignOffset;
@@ -230,7 +230,7 @@
       mt.Concat(*pMatrix);
     }
     pGraphics->SetClipRect(rtClip);
-    pGraphics->SetStrokeColor(CXFA_Color(0xFFFF0000));
+    pGraphics->SetStrokeColor(CXFA_GEColor(0xFFFF0000));
     pGraphics->SetLineWidth(0);
     pGraphics->StrokePath(&pathSpell, nullptr);
   }
@@ -486,7 +486,7 @@
     std::vector<CFX_RectF> rects =
         m_EdtEngine.GetCharacterRectsInRange(sel_start, count);
 
-    CXFA_Path path;
+    CXFA_GEPath path;
     for (auto& rect : rects) {
       rect.left += fOffSetX;
       rect.top += fOffSetY;
@@ -512,7 +512,7 @@
   if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_CombText) {
     pGraphics->RestoreGraphState();
 
-    CXFA_Path path;
+    CXFA_GEPath path;
     int32_t iLimit = m_nLimit > 0 ? m_nLimit : 1;
     float fStep = m_rtEngine.width / iLimit;
     float fLeft = m_rtEngine.left + 1;
diff --git a/xfa/fwl/cfwl_edit.h b/xfa/fwl/cfwl_edit.h
index b7c2526..6aedca8 100644
--- a/xfa/fwl/cfwl_edit.h
+++ b/xfa/fwl/cfwl_edit.h
@@ -15,7 +15,7 @@
 #include "xfa/fwl/cfwl_event.h"
 #include "xfa/fwl/cfwl_scrollbar.h"
 #include "xfa/fwl/cfwl_widget.h"
-#include "xfa/fxgraphics/cxfa_path.h"
+#include "xfa/fxgraphics/cxfa_gepath.h"
 
 #define FWL_STYLEEXT_EDT_ReadOnly (1L << 0)
 #define FWL_STYLEEXT_EDT_MultiLine (1L << 1)
@@ -134,7 +134,7 @@
   bool ValidateNumberChar(wchar_t cNum);
   bool IsShowScrollBar(bool bVert);
   bool IsContentHeightOverflow();
-  void AddSpellCheckObj(CXFA_Path& PathData,
+  void AddSpellCheckObj(CXFA_GEPath& PathData,
                         int32_t nStart,
                         int32_t nCount,
                         float fOffSetX,
diff --git a/xfa/fwl/cfwl_themebackground.h b/xfa/fwl/cfwl_themebackground.h
index 65c29eb..81fa0a2 100644
--- a/xfa/fwl/cfwl_themebackground.h
+++ b/xfa/fwl/cfwl_themebackground.h
@@ -12,7 +12,7 @@
 
 class CFX_DIBitmpa;
 class CXFA_Graphics;
-class CXFA_Path;
+class CXFA_GEPath;
 
 class CFWL_ThemeBackground : public CFWL_ThemePart {
  public:
@@ -20,7 +20,7 @@
   ~CFWL_ThemeBackground();
 
   CXFA_Graphics* m_pGraphics;
-  CXFA_Path* m_pPath;
+  CXFA_GEPath* m_pPath;
   RetainPtr<CFX_DIBitmap> m_pImage;
 };
 
diff --git a/xfa/fwl/theme/cfwl_carettp.cpp b/xfa/fwl/theme/cfwl_carettp.cpp
index 37dfad5..9735319 100644
--- a/xfa/fwl/theme/cfwl_carettp.cpp
+++ b/xfa/fwl/theme/cfwl_carettp.cpp
@@ -9,8 +9,8 @@
 #include "xfa/fwl/cfwl_caret.h"
 #include "xfa/fwl/cfwl_themebackground.h"
 #include "xfa/fwl/cfwl_widget.h"
-#include "xfa/fxgraphics/cxfa_color.h"
-#include "xfa/fxgraphics/cxfa_path.h"
+#include "xfa/fxgraphics/cxfa_gecolor.h"
+#include "xfa/fxgraphics/cxfa_gepath.h"
 
 CFWL_CaretTP::CFWL_CaretTP() {}
 CFWL_CaretTP::~CFWL_CaretTP() {}
@@ -25,7 +25,7 @@
         return;
 
       DrawCaretBK(pParams->m_pGraphics, pParams->m_dwStates,
-                  &(pParams->m_rtPart), (CXFA_Color*)pParams->m_pData,
+                  &(pParams->m_rtPart), (CXFA_GEColor*)pParams->m_pData,
                   &(pParams->m_matrix));
       break;
     }
@@ -37,15 +37,15 @@
 void CFWL_CaretTP::DrawCaretBK(CXFA_Graphics* pGraphics,
                                uint32_t dwStates,
                                const CFX_RectF* pRect,
-                               CXFA_Color* crFill,
+                               CXFA_GEColor* crFill,
                                CFX_Matrix* pMatrix) {
-  CXFA_Path path;
+  CXFA_GEPath path;
   CFX_RectF rect = *pRect;
   path.AddRectangle(rect.left, rect.top, rect.width, rect.height);
   if (crFill) {
     pGraphics->SetFillColor(*crFill);
   } else {
-    pGraphics->SetFillColor(CXFA_Color(ArgbEncode(255, 0, 0, 0)));
+    pGraphics->SetFillColor(CXFA_GEColor(ArgbEncode(255, 0, 0, 0)));
   }
   pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
 }
diff --git a/xfa/fwl/theme/cfwl_carettp.h b/xfa/fwl/theme/cfwl_carettp.h
index fdf330b..8b88fee 100644
--- a/xfa/fwl/theme/cfwl_carettp.h
+++ b/xfa/fwl/theme/cfwl_carettp.h
@@ -21,7 +21,7 @@
   void DrawCaretBK(CXFA_Graphics* pGraphics,
                    uint32_t dwStates,
                    const CFX_RectF* pRect,
-                   CXFA_Color* crFill,
+                   CXFA_GEColor* crFill,
                    CFX_Matrix* pMatrix = nullptr);
 };
 
diff --git a/xfa/fwl/theme/cfwl_checkboxtp.cpp b/xfa/fwl/theme/cfwl_checkboxtp.cpp
index 8d73738..82fdc1a 100644
--- a/xfa/fwl/theme/cfwl_checkboxtp.cpp
+++ b/xfa/fwl/theme/cfwl_checkboxtp.cpp
@@ -13,8 +13,8 @@
 #include "xfa/fwl/cfwl_themebackground.h"
 #include "xfa/fwl/cfwl_themetext.h"
 #include "xfa/fwl/cfwl_widget.h"
-#include "xfa/fxgraphics/cxfa_color.h"
-#include "xfa/fxgraphics/cxfa_path.h"
+#include "xfa/fxgraphics/cxfa_gecolor.h"
+#include "xfa/fxgraphics/cxfa_gepath.h"
 
 namespace {
 
@@ -74,7 +74,7 @@
   mt.Translate(pRtSign->left, pRtSign->top);
   mt.Concat(*pMatrix);
   pGraphics->SaveGraphState();
-  pGraphics->SetFillColor(CXFA_Color(argbFill));
+  pGraphics->SetFillColor(CXFA_GEColor(argbFill));
   pGraphics->FillPath(m_pCheckPath.get(), FXFILL_WINDING, &mt);
   pGraphics->RestoreGraphState();
 }
@@ -83,10 +83,10 @@
                                      const CFX_RectF* pRtSign,
                                      FX_ARGB argbFill,
                                      CFX_Matrix* pMatrix) {
-  CXFA_Path path;
+  CXFA_GEPath path;
   path.AddEllipse(*pRtSign);
   pGraphics->SaveGraphState();
-  pGraphics->SetFillColor(CXFA_Color(argbFill));
+  pGraphics->SetFillColor(CXFA_GEColor(argbFill));
   pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
   pGraphics->RestoreGraphState();
 }
@@ -95,7 +95,7 @@
                                     const CFX_RectF* pRtSign,
                                     FX_ARGB argbFill,
                                     CFX_Matrix* pMatrix) {
-  CXFA_Path path;
+  CXFA_GEPath path;
   float fRight = pRtSign->right();
   float fBottom = pRtSign->bottom();
   path.AddLine(pRtSign->TopLeft(), CFX_PointF(fRight, fBottom));
@@ -103,7 +103,7 @@
                CFX_PointF(fRight, pRtSign->top));
 
   pGraphics->SaveGraphState();
-  pGraphics->SetStrokeColor(CXFA_Color(argbFill));
+  pGraphics->SetStrokeColor(CXFA_GEColor(argbFill));
   pGraphics->SetLineWidth(1.0f);
   pGraphics->StrokePath(&path, pMatrix);
   pGraphics->RestoreGraphState();
@@ -113,7 +113,7 @@
                                       const CFX_RectF* pRtSign,
                                       FX_ARGB argbFill,
                                       CFX_Matrix* pMatrix) {
-  CXFA_Path path;
+  CXFA_GEPath path;
   float fWidth = pRtSign->width;
   float fHeight = pRtSign->height;
   float fBottom = pRtSign->bottom();
@@ -124,7 +124,7 @@
   path.LineTo(CFX_PointF(pRtSign->left + fWidth / 2, pRtSign->top));
 
   pGraphics->SaveGraphState();
-  pGraphics->SetFillColor(CXFA_Color(argbFill));
+  pGraphics->SetFillColor(CXFA_GEColor(argbFill));
   pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
   pGraphics->RestoreGraphState();
 }
@@ -133,11 +133,11 @@
                                      const CFX_RectF* pRtSign,
                                      FX_ARGB argbFill,
                                      CFX_Matrix* pMatrix) {
-  CXFA_Path path;
+  CXFA_GEPath path;
   path.AddRectangle(pRtSign->left, pRtSign->top, pRtSign->width,
                     pRtSign->height);
   pGraphics->SaveGraphState();
-  pGraphics->SetFillColor(CXFA_Color(argbFill));
+  pGraphics->SetFillColor(CXFA_GEColor(argbFill));
   pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
   pGraphics->RestoreGraphState();
 }
@@ -146,7 +146,7 @@
                                    const CFX_RectF* pRtSign,
                                    FX_ARGB argbFill,
                                    CFX_Matrix* pMatrix) {
-  CXFA_Path path;
+  CXFA_GEPath path;
   float fBottom = pRtSign->bottom();
   float fRadius =
       (pRtSign->top - fBottom) / (1 + static_cast<float>(cos(FX_PI / 5.0f)));
@@ -172,7 +172,7 @@
     path.LineTo(points[nNext]);
   }
   pGraphics->SaveGraphState();
-  pGraphics->SetFillColor(CXFA_Color(argbFill));
+  pGraphics->SetFillColor(CXFA_GEColor(argbFill));
   pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
   pGraphics->RestoreGraphState();
 }
@@ -217,7 +217,7 @@
 
 void CFWL_CheckBoxTP::InitCheckPath(float fCheckLen) {
   if (!m_pCheckPath) {
-    m_pCheckPath = pdfium::MakeUnique<CXFA_Path>();
+    m_pCheckPath = pdfium::MakeUnique<CXFA_GEPath>();
 
     float fWidth = kSignPath;
     float fHeight = -kSignPath;
diff --git a/xfa/fwl/theme/cfwl_checkboxtp.h b/xfa/fwl/theme/cfwl_checkboxtp.h
index 97ef5cf..e373b38 100644
--- a/xfa/fwl/theme/cfwl_checkboxtp.h
+++ b/xfa/fwl/theme/cfwl_checkboxtp.h
@@ -68,7 +68,7 @@
   void InitCheckPath(float fCheckLen);
 
   std::unique_ptr<CKBThemeData> m_pThemeData;
-  std::unique_ptr<CXFA_Path> m_pCheckPath;
+  std::unique_ptr<CXFA_GEPath> m_pCheckPath;
 
  private:
   void SetThemeData();
diff --git a/xfa/fwl/theme/cfwl_comboboxtp.cpp b/xfa/fwl/theme/cfwl_comboboxtp.cpp
index 86888c0..7695342 100644
--- a/xfa/fwl/theme/cfwl_comboboxtp.cpp
+++ b/xfa/fwl/theme/cfwl_comboboxtp.cpp
@@ -10,8 +10,8 @@
 #include "xfa/fwl/cfwl_themebackground.h"
 #include "xfa/fwl/cfwl_widget.h"
 #include "xfa/fwl/ifwl_themeprovider.h"
-#include "xfa/fxgraphics/cxfa_color.h"
-#include "xfa/fxgraphics/cxfa_path.h"
+#include "xfa/fxgraphics/cxfa_gecolor.h"
+#include "xfa/fxgraphics/cxfa_gepath.h"
 
 CFWL_ComboBoxTP::CFWL_ComboBoxTP() {}
 
@@ -27,7 +27,7 @@
       break;
     }
     case CFWL_Part::Background: {
-      CXFA_Path path;
+      CXFA_GEPath path;
       CFX_RectF& rect = pParams->m_rtPart;
       path.AddRectangle(rect.left, rect.top, rect.width, rect.height);
       FX_ARGB argb_color;
@@ -42,7 +42,7 @@
           argb_color = 0xFFFFFFFF;
       }
       pParams->m_pGraphics->SaveGraphState();
-      pParams->m_pGraphics->SetFillColor(CXFA_Color(argb_color));
+      pParams->m_pGraphics->SetFillColor(CXFA_GEColor(argb_color));
       pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, &pParams->m_matrix);
       pParams->m_pGraphics->RestoreGraphState();
       break;
@@ -63,10 +63,11 @@
 void CFWL_ComboBoxTP::DrawStrethHandler(CFWL_ThemeBackground* pParams,
                                         uint32_t dwStates,
                                         CFX_Matrix* pMatrix) {
-  CXFA_Path path;
+  CXFA_GEPath path;
   path.AddRectangle(pParams->m_rtPart.left, pParams->m_rtPart.top,
                     pParams->m_rtPart.width - 1, pParams->m_rtPart.height);
-  pParams->m_pGraphics->SetFillColor(CXFA_Color(ArgbEncode(0xff, 0xff, 0, 0)));
+  pParams->m_pGraphics->SetFillColor(
+      CXFA_GEColor(ArgbEncode(0xff, 0xff, 0, 0)));
   pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, &pParams->m_matrix);
 }
 
diff --git a/xfa/fwl/theme/cfwl_edittp.cpp b/xfa/fwl/theme/cfwl_edittp.cpp
index 9b8497a..4f8c4d5 100644
--- a/xfa/fwl/theme/cfwl_edittp.cpp
+++ b/xfa/fwl/theme/cfwl_edittp.cpp
@@ -11,8 +11,8 @@
 #include "xfa/fwl/cfwl_widget.h"
 #include "xfa/fxfa/cxfa_ffwidget.h"
 #include "xfa/fxfa/cxfa_fwltheme.h"
-#include "xfa/fxgraphics/cxfa_color.h"
-#include "xfa/fxgraphics/cxfa_path.h"
+#include "xfa/fxgraphics/cxfa_gecolor.h"
+#include "xfa/fxgraphics/cxfa_gepath.h"
 
 CFWL_EditTP::CFWL_EditTP() {}
 
@@ -31,7 +31,7 @@
         fWidth = edgeData.GetThickness();
       }
     }
-    pParams->m_pGraphics->SetStrokeColor(CXFA_Color(cr));
+    pParams->m_pGraphics->SetStrokeColor(CXFA_GEColor(cr));
     pParams->m_pGraphics->SetLineWidth(fWidth);
     pParams->m_pGraphics->StrokePath(pParams->m_pPath, &pParams->m_matrix);
     return;
@@ -46,22 +46,22 @@
       if (pParams->m_pPath) {
         CXFA_Graphics* pGraphics = pParams->m_pGraphics;
         pGraphics->SaveGraphState();
-        pGraphics->SetFillColor(CXFA_Color(FWLTHEME_COLOR_BKSelected));
+        pGraphics->SetFillColor(CXFA_GEColor(FWLTHEME_COLOR_BKSelected));
         pGraphics->FillPath(pParams->m_pPath, FXFILL_WINDING,
                             &pParams->m_matrix);
         pGraphics->RestoreGraphState();
       } else {
-        CXFA_Path path;
+        CXFA_GEPath path;
         path.AddRectangle(pParams->m_rtPart.left, pParams->m_rtPart.top,
                           pParams->m_rtPart.width, pParams->m_rtPart.height);
-        CXFA_Color cr(FWLTHEME_COLOR_Background);
+        CXFA_GEColor cr(FWLTHEME_COLOR_Background);
         if (!pParams->m_bStaticBackground) {
           if (pParams->m_dwStates & CFWL_PartState_Disabled)
-            cr = CXFA_Color(FWLTHEME_COLOR_EDGERB1);
+            cr = CXFA_GEColor(FWLTHEME_COLOR_EDGERB1);
           else if (pParams->m_dwStates & CFWL_PartState_ReadOnly)
-            cr = CXFA_Color(ArgbEncode(255, 236, 233, 216));
+            cr = CXFA_GEColor(ArgbEncode(255, 236, 233, 216));
           else
-            cr = CXFA_Color(0xFFFFFFFF);
+            cr = CXFA_GEColor(0xFFFFFFFF);
         }
         pParams->m_pGraphics->SaveGraphState();
         pParams->m_pGraphics->SetFillColor(cr);
@@ -72,7 +72,7 @@
       break;
     }
     case CFWL_Part::CombTextLine: {
-      pParams->m_pGraphics->SetStrokeColor(CXFA_Color(0xFF000000));
+      pParams->m_pGraphics->SetStrokeColor(CXFA_GEColor(0xFF000000));
       pParams->m_pGraphics->SetLineWidth(1.0f);
       pParams->m_pGraphics->StrokePath(pParams->m_pPath, &pParams->m_matrix);
       break;
diff --git a/xfa/fwl/theme/cfwl_listboxtp.cpp b/xfa/fwl/theme/cfwl_listboxtp.cpp
index 432be21..c977b21 100644
--- a/xfa/fwl/theme/cfwl_listboxtp.cpp
+++ b/xfa/fwl/theme/cfwl_listboxtp.cpp
@@ -9,8 +9,8 @@
 #include "xfa/fwl/cfwl_listbox.h"
 #include "xfa/fwl/cfwl_themebackground.h"
 #include "xfa/fwl/cfwl_widget.h"
-#include "xfa/fxgraphics/cxfa_color.h"
-#include "xfa/fxgraphics/cxfa_path.h"
+#include "xfa/fxgraphics/cxfa_gecolor.h"
+#include "xfa/fxgraphics/cxfa_gepath.h"
 
 CFWL_ListBoxTP::CFWL_ListBoxTP() {}
 
@@ -66,9 +66,9 @@
                                      CFX_Matrix* pMatrix) {
   if (dwStates & CFWL_PartState_Selected) {
     pGraphics->SaveGraphState();
-    pGraphics->SetFillColor(CXFA_Color(FWLTHEME_COLOR_BKSelected));
+    pGraphics->SetFillColor(CXFA_GEColor(FWLTHEME_COLOR_BKSelected));
     CFX_RectF rt(*prtItem);
-    CXFA_Path path;
+    CXFA_GEPath path;
 #if (_FX_OS_ == _FX_OS_MACOSX_)
     path.AddRectangle(rt.left, rt.top, rt.width - 1, rt.height - 1);
 #else
diff --git a/xfa/fwl/theme/cfwl_monthcalendartp.cpp b/xfa/fwl/theme/cfwl_monthcalendartp.cpp
index 975ca01..6bb3f18 100644
--- a/xfa/fwl/theme/cfwl_monthcalendartp.cpp
+++ b/xfa/fwl/theme/cfwl_monthcalendartp.cpp
@@ -12,8 +12,8 @@
 #include "xfa/fwl/cfwl_themetext.h"
 #include "xfa/fwl/cfwl_widget.h"
 #include "xfa/fwl/ifwl_themeprovider.h"
-#include "xfa/fxgraphics/cxfa_color.h"
-#include "xfa/fxgraphics/cxfa_path.h"
+#include "xfa/fxgraphics/cxfa_gecolor.h"
+#include "xfa/fxgraphics/cxfa_gepath.h"
 
 CFWL_MonthCalendarTP::CFWL_MonthCalendarTP() : m_pThemeData(new MCThemeData) {
   SetThemeData();
@@ -104,42 +104,42 @@
 
 void CFWL_MonthCalendarTP::DrawTotalBK(CFWL_ThemeBackground* pParams,
                                        CFX_Matrix* pMatrix) {
-  CXFA_Path path;
+  CXFA_GEPath path;
   CFX_RectF rtTotal(pParams->m_rtPart);
   path.AddRectangle(rtTotal.left, rtTotal.top, rtTotal.width, rtTotal.height);
   pParams->m_pGraphics->SaveGraphState();
-  pParams->m_pGraphics->SetFillColor(CXFA_Color(m_pThemeData->clrBK));
+  pParams->m_pGraphics->SetFillColor(CXFA_GEColor(m_pThemeData->clrBK));
   pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
   pParams->m_pGraphics->RestoreGraphState();
 }
 
 void CFWL_MonthCalendarTP::DrawHeadBk(CFWL_ThemeBackground* pParams,
                                       CFX_Matrix* pMatrix) {
-  CXFA_Path path;
+  CXFA_GEPath path;
   CFX_RectF rtHead = pParams->m_rtPart;
   path.AddRectangle(rtHead.left, rtHead.top, rtHead.width, rtHead.height);
   pParams->m_pGraphics->SaveGraphState();
-  pParams->m_pGraphics->SetFillColor(CXFA_Color(m_pThemeData->clrBK));
+  pParams->m_pGraphics->SetFillColor(CXFA_GEColor(m_pThemeData->clrBK));
   pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
   pParams->m_pGraphics->RestoreGraphState();
 }
 
 void CFWL_MonthCalendarTP::DrawLButton(CFWL_ThemeBackground* pParams,
                                        CFX_Matrix* pMatrix) {
-  CXFA_Path path;
+  CXFA_GEPath path;
   CFX_RectF rtLBtn = pParams->m_rtPart;
   path.AddRectangle(rtLBtn.left, rtLBtn.top, rtLBtn.width, rtLBtn.height);
   pParams->m_pGraphics->SaveGraphState();
   pParams->m_pGraphics->SetStrokeColor(
-      CXFA_Color(ArgbEncode(0xff, 205, 219, 243)));
+      CXFA_GEColor(ArgbEncode(0xff, 205, 219, 243)));
   pParams->m_pGraphics->StrokePath(&path, pMatrix);
   if (pParams->m_dwStates & CFWL_PartState_Pressed) {
     pParams->m_pGraphics->SetFillColor(
-        CXFA_Color(ArgbEncode(0xff, 174, 198, 242)));
+        CXFA_GEColor(ArgbEncode(0xff, 174, 198, 242)));
     pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
   } else {
     pParams->m_pGraphics->SetFillColor(
-        CXFA_Color(ArgbEncode(0xff, 227, 235, 249)));
+        CXFA_GEColor(ArgbEncode(0xff, 227, 235, 249)));
     pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
   }
 
@@ -152,27 +152,27 @@
                          rtLBtn.bottom() - rtLBtn.height / 4));
 
   pParams->m_pGraphics->SetStrokeColor(
-      CXFA_Color(ArgbEncode(0xff, 50, 104, 205)));
+      CXFA_GEColor(ArgbEncode(0xff, 50, 104, 205)));
   pParams->m_pGraphics->StrokePath(&path, pMatrix);
   pParams->m_pGraphics->RestoreGraphState();
 }
 
 void CFWL_MonthCalendarTP::DrawRButton(CFWL_ThemeBackground* pParams,
                                        CFX_Matrix* pMatrix) {
-  CXFA_Path path;
+  CXFA_GEPath path;
   CFX_RectF rtRBtn = pParams->m_rtPart;
   path.AddRectangle(rtRBtn.left, rtRBtn.top, rtRBtn.width, rtRBtn.height);
   pParams->m_pGraphics->SaveGraphState();
   pParams->m_pGraphics->SetStrokeColor(
-      CXFA_Color(ArgbEncode(0xff, 205, 219, 243)));
+      CXFA_GEColor(ArgbEncode(0xff, 205, 219, 243)));
   pParams->m_pGraphics->StrokePath(&path, pMatrix);
   if (pParams->m_dwStates & CFWL_PartState_Pressed) {
     pParams->m_pGraphics->SetFillColor(
-        CXFA_Color(ArgbEncode(0xff, 174, 198, 242)));
+        CXFA_GEColor(ArgbEncode(0xff, 174, 198, 242)));
     pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
   } else {
     pParams->m_pGraphics->SetFillColor(
-        CXFA_Color(ArgbEncode(0xff, 227, 235, 249)));
+        CXFA_GEColor(ArgbEncode(0xff, 227, 235, 249)));
     pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
   }
 
@@ -185,31 +185,33 @@
                          rtRBtn.bottom() - rtRBtn.height / 4));
 
   pParams->m_pGraphics->SetStrokeColor(
-      CXFA_Color(ArgbEncode(0xff, 50, 104, 205)));
+      CXFA_GEColor(ArgbEncode(0xff, 50, 104, 205)));
   pParams->m_pGraphics->StrokePath(&path, pMatrix);
   pParams->m_pGraphics->RestoreGraphState();
 }
 
 void CFWL_MonthCalendarTP::DrawHSeperator(CFWL_ThemeBackground* pParams,
                                           CFX_Matrix* pMatrix) {
-  CXFA_Path path;
+  CXFA_GEPath path;
   CFX_RectF rtHSep = pParams->m_rtPart;
   path.MoveTo(CFX_PointF(rtHSep.left, rtHSep.top + rtHSep.height / 2));
   path.LineTo(CFX_PointF(rtHSep.right(), rtHSep.top + rtHSep.height / 2));
   pParams->m_pGraphics->SaveGraphState();
-  pParams->m_pGraphics->SetStrokeColor(CXFA_Color(m_pThemeData->clrSeperator));
+  pParams->m_pGraphics->SetStrokeColor(
+      CXFA_GEColor(m_pThemeData->clrSeperator));
   pParams->m_pGraphics->StrokePath(&path, pMatrix);
   pParams->m_pGraphics->RestoreGraphState();
 }
 
 void CFWL_MonthCalendarTP::DrawWeekNumSep(CFWL_ThemeBackground* pParams,
                                           CFX_Matrix* pMatrix) {
-  CXFA_Path path;
+  CXFA_GEPath path;
   CFX_RectF rtWeekSep = pParams->m_rtPart;
   path.MoveTo(rtWeekSep.TopLeft());
   path.LineTo(rtWeekSep.BottomLeft());
   pParams->m_pGraphics->SaveGraphState();
-  pParams->m_pGraphics->SetStrokeColor(CXFA_Color(m_pThemeData->clrSeperator));
+  pParams->m_pGraphics->SetStrokeColor(
+      CXFA_GEColor(m_pThemeData->clrSeperator));
   pParams->m_pGraphics->StrokePath(&path, pMatrix);
   pParams->m_pGraphics->RestoreGraphState();
 }
@@ -218,20 +220,20 @@
                                          CFX_Matrix* pMatrix) {
   pParams->m_pGraphics->SaveGraphState();
   if (pParams->m_dwStates & CFWL_PartState_Selected) {
-    CXFA_Path path;
+    CXFA_GEPath path;
     CFX_RectF rtSelDay = pParams->m_rtPart;
     path.AddRectangle(rtSelDay.left, rtSelDay.top, rtSelDay.width,
                       rtSelDay.height);
     pParams->m_pGraphics->SetFillColor(
-        CXFA_Color(m_pThemeData->clrDatesSelectedBK));
+        CXFA_GEColor(m_pThemeData->clrDatesSelectedBK));
     pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
   } else if (pParams->m_dwStates & CFWL_PartState_Hovered) {
-    CXFA_Path path;
+    CXFA_GEPath path;
     CFX_RectF rtSelDay = pParams->m_rtPart;
     path.AddRectangle(rtSelDay.left, rtSelDay.top, rtSelDay.width,
                       rtSelDay.height);
     pParams->m_pGraphics->SetFillColor(
-        CXFA_Color(m_pThemeData->clrDatesHoverBK));
+        CXFA_GEColor(m_pThemeData->clrDatesHoverBK));
     pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
   }
   pParams->m_pGraphics->RestoreGraphState();
@@ -239,26 +241,26 @@
 
 void CFWL_MonthCalendarTP::DrawDatesInCircle(CFWL_ThemeBackground* pParams,
                                              CFX_Matrix* pMatrix) {
-  CXFA_Path path;
+  CXFA_GEPath path;
   CFX_RectF rtSelDay = pParams->m_rtPart;
   path.AddRectangle(rtSelDay.left, rtSelDay.top, rtSelDay.width,
                     rtSelDay.height);
   pParams->m_pGraphics->SaveGraphState();
   pParams->m_pGraphics->SetStrokeColor(
-      CXFA_Color(m_pThemeData->clrDatesCircle));
+      CXFA_GEColor(m_pThemeData->clrDatesCircle));
   pParams->m_pGraphics->StrokePath(&path, pMatrix);
   pParams->m_pGraphics->RestoreGraphState();
 }
 
 void CFWL_MonthCalendarTP::DrawTodayCircle(CFWL_ThemeBackground* pParams,
                                            CFX_Matrix* pMatrix) {
-  CXFA_Path path;
+  CXFA_GEPath path;
   CFX_RectF rtTodayCircle = pParams->m_rtPart;
   path.AddRectangle(rtTodayCircle.left, rtTodayCircle.top, rtTodayCircle.width,
                     rtTodayCircle.height);
   pParams->m_pGraphics->SaveGraphState();
   pParams->m_pGraphics->SetStrokeColor(
-      CXFA_Color(m_pThemeData->clrDatesCircle));
+      CXFA_GEColor(m_pThemeData->clrDatesCircle));
   pParams->m_pGraphics->StrokePath(&path, pMatrix);
   pParams->m_pGraphics->RestoreGraphState();
 }
diff --git a/xfa/fwl/theme/cfwl_pushbuttontp.cpp b/xfa/fwl/theme/cfwl_pushbuttontp.cpp
index c8152f8..3d3b1aa 100644
--- a/xfa/fwl/theme/cfwl_pushbuttontp.cpp
+++ b/xfa/fwl/theme/cfwl_pushbuttontp.cpp
@@ -10,8 +10,8 @@
 #include "xfa/fwl/cfwl_themebackground.h"
 #include "xfa/fwl/cfwl_widget.h"
 #include "xfa/fwl/ifwl_themeprovider.h"
-#include "xfa/fxgraphics/cxfa_color.h"
-#include "xfa/fxgraphics/cxfa_path.h"
+#include "xfa/fxgraphics/cxfa_gecolor.h"
+#include "xfa/fxgraphics/cxfa_gepath.h"
 
 #define PUSHBUTTON_SIZE_Corner 2
 
@@ -32,7 +32,7 @@
       float fRight = rect.right();
       float fBottom = rect.bottom();
 
-      CXFA_Path strokePath;
+      CXFA_GEPath strokePath;
       strokePath.MoveTo(
           CFX_PointF(rect.left + PUSHBUTTON_SIZE_Corner, rect.top));
       strokePath.LineTo(CFX_PointF(fRight - PUSHBUTTON_SIZE_Corner, rect.top));
@@ -48,7 +48,7 @@
       strokePath.LineTo(
           CFX_PointF(rect.left + PUSHBUTTON_SIZE_Corner, rect.top));
 
-      CXFA_Path fillPath;
+      CXFA_GEPath fillPath;
       fillPath.AddSubpath(&strokePath);
 
       CXFA_Graphics* pGraphics = pParams->m_pGraphics;
@@ -67,14 +67,14 @@
                        m_pThemeData->clrEnd[iColor], &fillPath,
                        FXFILL_ALTERNATE, &pParams->m_matrix);
 
-      pGraphics->SetStrokeColor(CXFA_Color(m_pThemeData->clrBorder[iColor]));
+      pGraphics->SetStrokeColor(CXFA_GEColor(m_pThemeData->clrBorder[iColor]));
       pGraphics->StrokePath(&strokePath, &pParams->m_matrix);
 
       fillPath.Clear();
       fillPath.AddRectangle(rtInner.left, rtInner.top, rtInner.width,
                             rtInner.height);
 
-      pGraphics->SetFillColor(CXFA_Color(m_pThemeData->clrFill[iColor]));
+      pGraphics->SetFillColor(CXFA_GEColor(m_pThemeData->clrFill[iColor]));
       pGraphics->FillPath(&fillPath, FXFILL_WINDING, &pParams->m_matrix);
       if (pParams->m_dwStates & CFWL_PartState_Focused) {
         rtInner.Inflate(1, 1, 0, 0);
diff --git a/xfa/fwl/theme/cfwl_scrollbartp.cpp b/xfa/fwl/theme/cfwl_scrollbartp.cpp
index 6b998a9..d94eed0 100644
--- a/xfa/fwl/theme/cfwl_scrollbartp.cpp
+++ b/xfa/fwl/theme/cfwl_scrollbartp.cpp
@@ -10,8 +10,8 @@
 #include "xfa/fwl/cfwl_themebackground.h"
 #include "xfa/fwl/cfwl_widget.h"
 #include "xfa/fwl/ifwl_themeprovider.h"
-#include "xfa/fxgraphics/cxfa_color.h"
-#include "xfa/fxgraphics/cxfa_path.h"
+#include "xfa/fxgraphics/cxfa_gecolor.h"
+#include "xfa/fxgraphics/cxfa_gepath.h"
 
 namespace {
 
@@ -80,7 +80,7 @@
   if (eState < FWLTHEME_STATE_Normal || eState > FWLTHEME_STATE_Disable)
     return;
 
-  CXFA_Path path;
+  CXFA_GEPath path;
   CFX_RectF rect(*pRect);
   if (bVert) {
     rect.Deflate(1, 0);
@@ -94,7 +94,7 @@
                      FXFILL_WINDING, pMatrix);
     pGraphics->SaveGraphState();
     pGraphics->SetStrokeColor(
-        CXFA_Color(m_pThemeData->clrBtnBorder[eState - 1]));
+        CXFA_GEColor(m_pThemeData->clrBtnBorder[eState - 1]));
     pGraphics->StrokePath(&path, pMatrix);
     pGraphics->RestoreGraphState();
   } else {
@@ -109,7 +109,7 @@
                      FXFILL_WINDING, pMatrix);
     pGraphics->SaveGraphState();
     pGraphics->SetStrokeColor(
-        CXFA_Color(m_pThemeData->clrBtnBorder[eState - 1]));
+        CXFA_GEColor(m_pThemeData->clrBtnBorder[eState - 1]));
     pGraphics->StrokePath(&path, pMatrix);
     pGraphics->RestoreGraphState();
   }
@@ -120,7 +120,7 @@
                                bool bVert,
                                FWLTHEME_STATE eState,
                                CFX_Matrix* pMatrix) {
-  CXFA_Path path;
+  CXFA_GEPath path;
   if (bVert) {
     float fPawLen = kPawLength;
     if (pRect->width / 2 <= fPawLen) {
@@ -140,7 +140,7 @@
 
     pGraphics->SetLineWidth(1);
     pGraphics->SetStrokeColor(
-        CXFA_Color(m_pThemeData->clrPawColorLight[eState - 1]));
+        CXFA_GEColor(m_pThemeData->clrPawColorLight[eState - 1]));
     pGraphics->StrokePath(&path, nullptr);
     fX++;
 
@@ -156,7 +156,7 @@
 
     pGraphics->SetLineWidth(1);
     pGraphics->SetStrokeColor(
-        CXFA_Color(m_pThemeData->clrPawColorDark[eState - 1]));
+        CXFA_GEColor(m_pThemeData->clrPawColorDark[eState - 1]));
     pGraphics->StrokePath(&path, pMatrix);
   } else {
     float fPawLen = kPawLength;
@@ -177,7 +177,7 @@
 
     pGraphics->SetLineWidth(1);
     pGraphics->SetStrokeColor(
-        CXFA_Color(m_pThemeData->clrPawColorLight[eState - 1]));
+        CXFA_GEColor(m_pThemeData->clrPawColorLight[eState - 1]));
     pGraphics->StrokePath(&path, pMatrix);
     fY++;
 
@@ -193,7 +193,7 @@
 
     pGraphics->SetLineWidth(1);
     pGraphics->SetStrokeColor(
-        CXFA_Color(m_pThemeData->clrPawColorDark[eState - 1]));
+        CXFA_GEColor(m_pThemeData->clrPawColorDark[eState - 1]));
     pGraphics->StrokePath(&path, pMatrix);
   }
 }
@@ -208,7 +208,7 @@
     return;
 
   pGraphics->SaveGraphState();
-  CXFA_Path path;
+  CXFA_GEPath path;
   float fRight = pRect->right();
   float fBottom = pRect->bottom();
   if (bVert) {
@@ -218,7 +218,7 @@
     path.AddRectangle(pRect->left, pRect->top, pRect->width, 1);
     path.AddRectangle(pRect->left, fBottom - 1, pRect->width, 1);
   }
-  pGraphics->SetFillColor(CXFA_Color(ArgbEncode(255, 238, 237, 229)));
+  pGraphics->SetFillColor(CXFA_GEColor(ArgbEncode(255, 238, 237, 229)));
   pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
   path.Clear();
   path.AddRectangle(pRect->left + 1, pRect->top, pRect->width - 2,
diff --git a/xfa/fwl/theme/cfwl_widgettp.cpp b/xfa/fwl/theme/cfwl_widgettp.cpp
index b2c1c9aa7..8a2754b 100644
--- a/xfa/fwl/theme/cfwl_widgettp.cpp
+++ b/xfa/fwl/theme/cfwl_widgettp.cpp
@@ -19,9 +19,9 @@
 #include "xfa/fwl/cfwl_widget.h"
 #include "xfa/fwl/cfwl_widgetmgr.h"
 #include "xfa/fwl/ifwl_themeprovider.h"
-#include "xfa/fxgraphics/cxfa_color.h"
-#include "xfa/fxgraphics/cxfa_path.h"
-#include "xfa/fxgraphics/cxfa_shading.h"
+#include "xfa/fxgraphics/cxfa_gecolor.h"
+#include "xfa/fxgraphics/cxfa_gepath.h"
+#include "xfa/fxgraphics/cxfa_geshading.h"
 
 CFWL_WidgetTP::CFWL_WidgetTP()
     : m_dwRefCount(1), m_pFDEFont(nullptr), m_pColorData(nullptr) {}
@@ -102,12 +102,12 @@
   if (!pGraphics || !pRect)
     return;
 
-  CXFA_Path path;
+  CXFA_GEPath path;
   path.AddRectangle(pRect->left, pRect->top, pRect->width, pRect->height);
   path.AddRectangle(pRect->left + 1, pRect->top + 1, pRect->width - 2,
                     pRect->height - 2);
   pGraphics->SaveGraphState();
-  pGraphics->SetFillColor(CXFA_Color(ArgbEncode(255, 0, 0, 0)));
+  pGraphics->SetFillColor(CXFA_GEColor(ArgbEncode(255, 0, 0, 0)));
   pGraphics->FillPath(&path, FXFILL_ALTERNATE, pMatrix);
   pGraphics->RestoreGraphState();
 }
@@ -125,10 +125,10 @@
   if (!pGraphics || !pRect)
     return;
 
-  CXFA_Path path;
+  CXFA_GEPath path;
   path.AddRectangle(pRect->left, pRect->top, pRect->width, pRect->height);
   pGraphics->SaveGraphState();
-  pGraphics->SetFillColor(CXFA_Color(fillColor));
+  pGraphics->SetFillColor(CXFA_GEColor(fillColor));
   pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
   pGraphics->RestoreGraphState();
 }
@@ -140,7 +140,7 @@
                                      float fy2,
                                      FX_ARGB beginColor,
                                      FX_ARGB endColor,
-                                     CXFA_Path* path,
+                                     CXFA_GEPath* path,
                                      int32_t fillMode,
                                      CFX_Matrix* pMatrix) {
   if (!pGraphics || !path)
@@ -148,9 +148,10 @@
 
   CFX_PointF begPoint(fx1, fy1);
   CFX_PointF endPoint(fx2, fy2);
-  CXFA_Shading shading(begPoint, endPoint, false, false, beginColor, endColor);
+  CXFA_GEShading shading(begPoint, endPoint, false, false, beginColor,
+                         endColor);
   pGraphics->SaveGraphState();
-  pGraphics->SetFillColor(CXFA_Color(&shading));
+  pGraphics->SetFillColor(CXFA_GEColor(&shading));
   pGraphics->FillPath(path, fillMode, pMatrix);
   pGraphics->RestoreGraphState();
 }
@@ -162,10 +163,10 @@
     return;
 
   float DashPattern[2] = {1, 1};
-  CXFA_Path path;
+  CXFA_GEPath path;
   path.AddRectangle(pRect->left, pRect->top, pRect->width, pRect->height);
   pGraphics->SaveGraphState();
-  pGraphics->SetStrokeColor(CXFA_Color(0xFF000000));
+  pGraphics->SetStrokeColor(CXFA_GEColor(0xFF000000));
   pGraphics->SetLineDash(0.0f, DashPattern, 2);
   pGraphics->StrokePath(&path, pMatrix);
   pGraphics->RestoreGraphState();
@@ -182,7 +183,7 @@
       (float)(((pRect->width - (bVert ? 9 : 6)) / 2 + pRect->left) + 0.5);
   float fTop =
       (float)(((pRect->height - (bVert ? 6 : 9)) / 2 + pRect->top) + 0.5);
-  CXFA_Path path;
+  CXFA_GEPath path;
   switch (eDict) {
     case FWLTHEME_DIRECTION_Down: {
       path.MoveTo(CFX_PointF(fLeft, fTop + 1));
@@ -221,7 +222,7 @@
       break;
     }
   }
-  pGraphics->SetFillColor(CXFA_Color(argSign));
+  pGraphics->SetFillColor(CXFA_GEColor(argSign));
   pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
 }
 
@@ -231,7 +232,7 @@
                             CFX_Matrix* pMatrix) {
   InitializeArrowColorData();
 
-  CXFA_Path path;
+  CXFA_GEPath path;
   float fRight = pRect->right();
   float fBottom = pRect->bottom();
   path.AddRectangle(pRect->left, pRect->top, pRect->width, pRect->height);
@@ -240,7 +241,7 @@
                    m_pColorData->clrEnd[eState - 1], &path, FXFILL_WINDING,
                    pMatrix);
 
-  pGraphics->SetStrokeColor(CXFA_Color(m_pColorData->clrBorder[eState - 1]));
+  pGraphics->SetStrokeColor(CXFA_GEColor(m_pColorData->clrBorder[eState - 1]));
   pGraphics->StrokePath(&path, pMatrix);
 }
 
diff --git a/xfa/fwl/theme/cfwl_widgettp.h b/xfa/fwl/theme/cfwl_widgettp.h
index a7a217f..5f143fe 100644
--- a/xfa/fwl/theme/cfwl_widgettp.h
+++ b/xfa/fwl/theme/cfwl_widgettp.h
@@ -72,7 +72,7 @@
                         float fy2,
                         FX_ARGB beginColor,
                         FX_ARGB endColor,
-                        CXFA_Path* path,
+                        CXFA_GEPath* path,
                         int32_t fillMode = FXFILL_WINDING,
                         CFX_Matrix* pMatrix = nullptr);
   void DrawFocus(CXFA_Graphics* pGraphics,
diff --git a/xfa/fxfa/cxfa_fffield.cpp b/xfa/fxfa/cxfa_fffield.cpp
index 0ef6722..9758eb7 100644
--- a/xfa/fxfa/cxfa_fffield.cpp
+++ b/xfa/fxfa/cxfa_fffield.cpp
@@ -23,8 +23,8 @@
 #include "xfa/fxfa/cxfa_fwltheme.h"
 #include "xfa/fxfa/cxfa_textlayout.h"
 #include "xfa/fxfa/parser/cxfa_node.h"
-#include "xfa/fxgraphics/cxfa_color.h"
-#include "xfa/fxgraphics/cxfa_path.h"
+#include "xfa/fxgraphics/cxfa_gecolor.h"
+#include "xfa/fxgraphics/cxfa_gepath.h"
 
 namespace {
 
@@ -89,8 +89,8 @@
 
   CXFA_FFDoc* pDoc = GetDoc();
   pGS->SetFillColor(
-      CXFA_Color(pDoc->GetDocEnvironment()->GetHighlightColor(pDoc)));
-  CXFA_Path path;
+      CXFA_GEColor(pDoc->GetDocEnvironment()->GetHighlightColor(pDoc)));
+  CXFA_GEPath path;
   if (bEllipse)
     path.AddEllipse(m_rtUI);
   else
@@ -103,13 +103,13 @@
   if (!(m_dwStatus & XFA_WidgetStatus_Focused))
     return;
 
-  pGS->SetStrokeColor(CXFA_Color(0xFF000000));
+  pGS->SetStrokeColor(CXFA_GEColor(0xFF000000));
 
   float DashPattern[2] = {1, 1};
   pGS->SetLineDash(0.0f, DashPattern, 2);
   pGS->SetLineWidth(0);
 
-  CXFA_Path path;
+  CXFA_GEPath path;
   path.AddRectangle(m_rtUI.left, m_rtUI.top, m_rtUI.width, m_rtUI.height);
   pGS->StrokePath(&path, pMatrix);
 }
diff --git a/xfa/fxfa/cxfa_ffline.cpp b/xfa/fxfa/cxfa_ffline.cpp
index de37e50..d24444c 100644
--- a/xfa/fxfa/cxfa_ffline.cpp
+++ b/xfa/fxfa/cxfa_ffline.cpp
@@ -6,9 +6,9 @@
 
 #include "xfa/fxfa/cxfa_ffline.h"
 
-#include "xfa/fxgraphics/cxfa_color.h"
+#include "xfa/fxgraphics/cxfa_gecolor.h"
+#include "xfa/fxgraphics/cxfa_gepath.h"
 #include "xfa/fxgraphics/cxfa_graphics.h"
-#include "xfa/fxgraphics/cxfa_path.h"
 
 CXFA_FFLine::CXFA_FFLine(CXFA_WidgetAcc* pDataAcc) : CXFA_FFDraw(pDataAcc) {}
 
@@ -81,7 +81,7 @@
     XFA_RectWidthoutMargin(rtLine, marginData);
 
   GetRectFromHand(rtLine, lineData.GetHand(), fLineWidth);
-  CXFA_Path linePath;
+  CXFA_GEPath linePath;
   if (lineData.GetSlope() && rtLine.right() > 0.0f && rtLine.bottom() > 0.0f)
     linePath.AddLine(rtLine.TopRight(), rtLine.BottomLeft());
   else
@@ -91,7 +91,7 @@
   pGS->SetLineWidth(fLineWidth);
   pGS->EnableActOnDash();
   XFA_StrokeTypeSetLineDash(pGS, iStrokeType, iCap);
-  pGS->SetStrokeColor(CXFA_Color(lineColor));
+  pGS->SetStrokeColor(CXFA_GEColor(lineColor));
   pGS->SetLineCap(XFA_LineCapToFXGE(iCap));
   pGS->StrokePath(&linePath, &mtRotate);
   pGS->RestoreGraphState();
diff --git a/xfa/fxfa/cxfa_ffpushbutton.cpp b/xfa/fxfa/cxfa_ffpushbutton.cpp
index c966cda..1f5d902 100644
--- a/xfa/fxfa/cxfa_ffpushbutton.cpp
+++ b/xfa/fxfa/cxfa_ffpushbutton.cpp
@@ -18,8 +18,8 @@
 #include "xfa/fxfa/cxfa_ffwidget.h"
 #include "xfa/fxfa/cxfa_textlayout.h"
 #include "xfa/fxfa/cxfa_textprovider.h"
-#include "xfa/fxgraphics/cxfa_color.h"
-#include "xfa/fxgraphics/cxfa_path.h"
+#include "xfa/fxgraphics/cxfa_gecolor.h"
+#include "xfa/fxgraphics/cxfa_gepath.h"
 
 CXFA_FFPushButton::CXFA_FFPushButton(CXFA_WidgetAcc* pDataAcc)
     : CXFA_FFField(pDataAcc), m_pOldDelegate(nullptr) {}
@@ -210,9 +210,9 @@
       CFX_RectF rtFill(0, 0, m_pNormalWidget->GetWidgetRect().Size());
       float fLineWith = GetLineWidth();
       rtFill.Deflate(fLineWith, fLineWith);
-      CXFA_Path path;
+      CXFA_GEPath path;
       path.AddRectangle(rtFill.left, rtFill.top, rtFill.width, rtFill.height);
-      pGraphics->SetFillColor(CXFA_Color(FXARGB_MAKE(128, 128, 255, 255)));
+      pGraphics->SetFillColor(CXFA_GEColor(FXARGB_MAKE(128, 128, 255, 255)));
       pGraphics->FillPath(&path, FXFILL_WINDING, &matrix);
     }
     return;
@@ -222,10 +222,10 @@
     if ((m_pNormalWidget->GetStates() & FWL_STATE_PSB_Pressed) &&
         (m_pNormalWidget->GetStates() & FWL_STATE_PSB_Hovered)) {
       float fLineWidth = GetLineWidth();
-      pGraphics->SetStrokeColor(CXFA_Color(FXARGB_MAKE(255, 128, 255, 255)));
+      pGraphics->SetStrokeColor(CXFA_GEColor(FXARGB_MAKE(255, 128, 255, 255)));
       pGraphics->SetLineWidth(fLineWidth);
 
-      CXFA_Path path;
+      CXFA_GEPath path;
       CFX_RectF rect = m_pNormalWidget->GetWidgetRect();
       path.AddRectangle(0, 0, rect.width, rect.height);
       pGraphics->StrokePath(&path, &matrix);
diff --git a/xfa/fxfa/cxfa_ffwidget.cpp b/xfa/fxfa/cxfa_ffwidget.cpp
index d3a6498..6bcf524 100644
--- a/xfa/fxfa/cxfa_ffwidget.cpp
+++ b/xfa/fxfa/cxfa_ffwidget.cpp
@@ -31,17 +31,17 @@
 #include "xfa/fxfa/cxfa_widgetacc.h"
 #include "xfa/fxfa/parser/cxfa_cornerdata.h"
 #include "xfa/fxfa/parser/cxfa_node.h"
-#include "xfa/fxgraphics/cxfa_color.h"
+#include "xfa/fxgraphics/cxfa_gecolor.h"
+#include "xfa/fxgraphics/cxfa_gepath.h"
+#include "xfa/fxgraphics/cxfa_gepattern.h"
+#include "xfa/fxgraphics/cxfa_geshading.h"
 #include "xfa/fxgraphics/cxfa_graphics.h"
-#include "xfa/fxgraphics/cxfa_path.h"
-#include "xfa/fxgraphics/cxfa_pattern.h"
-#include "xfa/fxgraphics/cxfa_shading.h"
 
 namespace {
 
 void XFA_BOX_GetPath_Arc(const CXFA_BoxData& boxData,
                          CFX_RectF rtDraw,
-                         CXFA_Path& fillPath,
+                         CXFA_GEPath& fillPath,
                          uint32_t dwFlags) {
   float a, b;
   a = rtDraw.width / 2.0f;
@@ -68,7 +68,7 @@
 
 void XFA_BOX_GetPath(const std::vector<CXFA_StrokeData>& strokes,
                      CFX_RectF rtWidget,
-                     CXFA_Path& path,
+                     CXFA_GEPath& path,
                      int32_t nIndex,
                      bool bStart,
                      bool bCorner) {
@@ -237,7 +237,7 @@
 void XFA_BOX_GetFillPath(const CXFA_BoxData& boxData,
                          const std::vector<CXFA_StrokeData>& strokes,
                          CFX_RectF rtWidget,
-                         CXFA_Path& fillPath,
+                         CXFA_GEPath& fillPath,
                          uint16_t dwFlags) {
   if (boxData.IsArc() || (dwFlags & XFA_DRAWBOX_ForceRound) != 0) {
     float fThickness = std::fmax(0.0, boxData.GetEdgeData(0).GetThickness());
@@ -386,7 +386,7 @@
 
 void XFA_BOX_Fill_Radial(const CXFA_BoxData& boxData,
                          CXFA_Graphics* pGS,
-                         CXFA_Path& fillPath,
+                         CXFA_GEPath& fillPath,
                          CFX_RectF rtFill,
                          const CFX_Matrix& matrix) {
   CXFA_FillData fillData = boxData.GetFillData(false);
@@ -398,18 +398,18 @@
     crEnd = crStart;
     crStart = temp;
   }
-  CXFA_Shading shading(rtFill.Center(), rtFill.Center(), 0,
-                       sqrt(rtFill.Width() * rtFill.Width() +
-                            rtFill.Height() * rtFill.Height()) /
-                           2,
-                       true, true, crStart, crEnd);
-  pGS->SetFillColor(CXFA_Color(&shading));
+  CXFA_GEShading shading(rtFill.Center(), rtFill.Center(), 0,
+                         sqrt(rtFill.Width() * rtFill.Width() +
+                              rtFill.Height() * rtFill.Height()) /
+                             2,
+                         true, true, crStart, crEnd);
+  pGS->SetFillColor(CXFA_GEColor(&shading));
   pGS->FillPath(&fillPath, FXFILL_WINDING, &matrix);
 }
 
 void XFA_BOX_Fill_Pattern(const CXFA_BoxData& boxData,
                           CXFA_Graphics* pGS,
-                          CXFA_Path& fillPath,
+                          CXFA_GEPath& fillPath,
                           CFX_RectF rtFill,
                           const CFX_Matrix& matrix) {
   CXFA_FillData fillData = boxData.GetFillData(false);
@@ -437,14 +437,14 @@
       break;
   }
 
-  CXFA_Pattern pattern(iHatch, crEnd, crStart);
-  pGS->SetFillColor(CXFA_Color(&pattern, 0x0));
+  CXFA_GEPattern pattern(iHatch, crEnd, crStart);
+  pGS->SetFillColor(CXFA_GEColor(&pattern, 0x0));
   pGS->FillPath(&fillPath, FXFILL_WINDING, &matrix);
 }
 
 void XFA_BOX_Fill_Linear(const CXFA_BoxData& boxData,
                          CXFA_Graphics* pGS,
-                         CXFA_Path& fillPath,
+                         CXFA_GEPath& fillPath,
                          CFX_RectF rtFill,
                          const CFX_Matrix& matrix) {
   CXFA_FillData fillData = boxData.GetFillData(false);
@@ -473,8 +473,8 @@
     default:
       break;
   }
-  CXFA_Shading shading(ptStart, ptEnd, false, false, crStart, crEnd);
-  pGS->SetFillColor(CXFA_Color(&shading));
+  CXFA_GEShading shading(ptStart, ptEnd, false, false, crStart, crEnd);
+  pGS->SetFillColor(CXFA_GEColor(&shading));
   pGS->FillPath(&fillPath, FXFILL_WINDING, &matrix);
 }
 
@@ -489,7 +489,7 @@
     return;
 
   pGS->SaveGraphState();
-  CXFA_Path fillPath;
+  CXFA_GEPath fillPath;
   XFA_BOX_GetFillPath(boxData, strokes, rtWidget, fillPath,
                       (dwFlags & XFA_DRAWBOX_ForceRound) != 0);
   fillPath.Close();
@@ -517,7 +517,7 @@
       } else {
         cr = fillData.GetColor();
       }
-      pGS->SetFillColor(CXFA_Color(cr));
+      pGS->SetFillColor(CXFA_GEColor(cr));
       pGS->FillPath(&fillPath, FXFILL_WINDING, &matrix);
     } break;
   }
@@ -525,7 +525,7 @@
 }
 
 void XFA_BOX_StrokePath(const CXFA_StrokeData& strokeData,
-                        CXFA_Path* pPath,
+                        CXFA_GEPath* pPath,
                         CXFA_Graphics* pGS,
                         const CFX_Matrix& matrix) {
   if (!strokeData || !strokeData.IsVisible())
@@ -544,7 +544,7 @@
   pGS->SetLineCap(CFX_GraphStateData::LineCapButt);
   XFA_StrokeTypeSetLineDash(pGS, strokeData.GetStrokeType(),
                             XFA_ATTRIBUTEENUM_Butt);
-  pGS->SetStrokeColor(CXFA_Color(strokeData.GetColor()));
+  pGS->SetStrokeColor(CXFA_GEColor(strokeData.GetColor()));
   pGS->StrokePath(pPath, &matrix);
   pGS->RestoreGraphState();
 }
@@ -581,7 +581,7 @@
     if (fHalf < 0.001f)
       return;
 
-    CXFA_Path arcPath;
+    CXFA_GEPath arcPath;
     XFA_BOX_GetPath_Arc(boxData, rtWidget, arcPath, dwFlags);
     XFA_BOX_StrokePath(edgeData, &arcPath, pGS, matrix);
     return;
@@ -607,30 +607,30 @@
   startAngle = startAngle * FX_PI / 180.0f;
   sweepAngle = -sweepAngle * FX_PI / 180.0f;
 
-  CXFA_Path arcPath;
+  CXFA_GEPath arcPath;
   arcPath.AddArc(rtWidget.TopLeft(), rtWidget.Size(), 3.0f * FX_PI / 4.0f,
                  FX_PI);
 
-  pGS->SetStrokeColor(CXFA_Color(0xFF808080));
+  pGS->SetStrokeColor(CXFA_GEColor(0xFF808080));
   pGS->StrokePath(&arcPath, &matrix);
   arcPath.Clear();
   arcPath.AddArc(rtWidget.TopLeft(), rtWidget.Size(), -1.0f * FX_PI / 4.0f,
                  FX_PI);
 
-  pGS->SetStrokeColor(CXFA_Color(0xFFFFFFFF));
+  pGS->SetStrokeColor(CXFA_GEColor(0xFFFFFFFF));
   pGS->StrokePath(&arcPath, &matrix);
   rtWidget.Deflate(fHalf, fHalf);
   arcPath.Clear();
   arcPath.AddArc(rtWidget.TopLeft(), rtWidget.Size(), 3.0f * FX_PI / 4.0f,
                  FX_PI);
 
-  pGS->SetStrokeColor(CXFA_Color(0xFF404040));
+  pGS->SetStrokeColor(CXFA_GEColor(0xFF404040));
   pGS->StrokePath(&arcPath, &matrix);
   arcPath.Clear();
   arcPath.AddArc(rtWidget.TopLeft(), rtWidget.Size(), -1.0f * FX_PI / 4.0f,
                  FX_PI);
 
-  pGS->SetStrokeColor(CXFA_Color(0xFFC0C0C0));
+  pGS->SetStrokeColor(CXFA_GEColor(0xFFC0C0C0));
   pGS->StrokePath(&arcPath, &matrix);
   pGS->RestoreGraphState();
 }
@@ -643,7 +643,7 @@
                     FX_ARGB argbBottomRight) {
   float fBottom = rt.bottom();
   float fRight = rt.right();
-  CXFA_Path pathLT;
+  CXFA_GEPath pathLT;
   pathLT.MoveTo(CFX_PointF(rt.left, fBottom));
   pathLT.LineTo(CFX_PointF(rt.left, rt.top));
   pathLT.LineTo(CFX_PointF(fRight, rt.top));
@@ -651,10 +651,10 @@
   pathLT.LineTo(CFX_PointF(rt.left + fLineWidth, rt.top + fLineWidth));
   pathLT.LineTo(CFX_PointF(rt.left + fLineWidth, fBottom - fLineWidth));
   pathLT.LineTo(CFX_PointF(rt.left, fBottom));
-  pGraphic->SetFillColor(CXFA_Color(argbTopLeft));
+  pGraphic->SetFillColor(CXFA_GEColor(argbTopLeft));
   pGraphic->FillPath(&pathLT, FXFILL_WINDING, &matrix);
 
-  CXFA_Path pathRB;
+  CXFA_GEPath pathRB;
   pathRB.MoveTo(CFX_PointF(fRight, rt.top));
   pathRB.LineTo(CFX_PointF(fRight, fBottom));
   pathRB.LineTo(CFX_PointF(rt.left, fBottom));
@@ -662,7 +662,7 @@
   pathRB.LineTo(CFX_PointF(fRight - fLineWidth, fBottom - fLineWidth));
   pathRB.LineTo(CFX_PointF(fRight - fLineWidth, rt.top + fLineWidth));
   pathRB.LineTo(CFX_PointF(fRight, rt.top));
-  pGraphic->SetFillColor(CXFA_Color(argbBottomRight));
+  pGraphic->SetFillColor(CXFA_GEColor(argbBottomRight));
   pGraphic->FillPath(&pathRB, FXFILL_WINDING, &matrix);
 }
 
@@ -674,10 +674,10 @@
   CFX_RectF rtInner(rt);
   rtInner.Deflate(fHalfWidth, fHalfWidth);
 
-  CXFA_Path path;
+  CXFA_GEPath path;
   path.AddRectangle(rt.left, rt.top, rt.width, rt.height);
   path.AddRectangle(rtInner.left, rtInner.top, rtInner.width, rtInner.height);
-  pGS->SetFillColor(CXFA_Color(0xFF000000));
+  pGS->SetFillColor(CXFA_GEColor(0xFF000000));
   pGS->FillPath(&path, FXFILL_ALTERNATE, &matrix);
   XFA_Draw3DRect(pGS, rtInner, fHalfWidth, matrix, 0xFF808080, 0xFFC0C0C0);
 }
@@ -690,10 +690,10 @@
   CFX_RectF rtInner(rt);
   rtInner.Deflate(fHalfWidth, fHalfWidth);
 
-  CXFA_Path path;
+  CXFA_GEPath path;
   path.AddRectangle(rt.left, rt.top, rt.width, rt.height);
   path.AddRectangle(rtInner.left, rtInner.top, rtInner.width, rtInner.height);
-  pGS->SetFillColor(CXFA_Color(0xFF000000));
+  pGS->SetFillColor(CXFA_GEColor(0xFF000000));
   pGS->FillPath(&path, FXFILL_ALTERNATE, &matrix);
   XFA_Draw3DRect(pGS, rtInner, fHalfWidth, matrix, 0xFFFFFFFF, 0xFF808080);
 }
@@ -781,7 +781,7 @@
     }
   }
   bool bStart = true;
-  CXFA_Path path;
+  CXFA_GEPath path;
   for (int32_t i = 0; i < 8; i++) {
     CXFA_StrokeData strokeData = strokes[i];
     if ((i % 1) == 0 && strokeData.GetRadius() < 0) {
diff --git a/xfa/fxfa/cxfa_fwltheme.cpp b/xfa/fxfa/cxfa_fwltheme.cpp
index 61c4e25..440c41d 100644
--- a/xfa/fxfa/cxfa_fwltheme.cpp
+++ b/xfa/fxfa/cxfa_fwltheme.cpp
@@ -24,7 +24,7 @@
 #include "xfa/fwl/cfwl_themetext.h"
 #include "xfa/fxfa/cxfa_ffapp.h"
 #include "xfa/fxfa/cxfa_ffwidget.h"
-#include "xfa/fxgraphics/cxfa_color.h"
+#include "xfa/fxgraphics/cxfa_gecolor.h"
 
 namespace {
 
diff --git a/xfa/fxgraphics/cxfa_color.h b/xfa/fxgraphics/cxfa_color.h
deleted file mode 100644
index 4ae7905..0000000
--- a/xfa/fxgraphics/cxfa_color.h
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2016 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_FXGRAPHICS_CXFA_COLOR_H_
-#define XFA_FXGRAPHICS_CXFA_COLOR_H_
-
-#include "core/fxge/fx_dib.h"
-
-class CXFA_Pattern;
-class CXFA_Shading;
-
-class CXFA_Color {
- public:
-  enum Type { Invalid, Solid, Pattern, Shading };
-
-  CXFA_Color();
-  explicit CXFA_Color(const FX_ARGB argb);
-  explicit CXFA_Color(CXFA_Shading* shading);
-  CXFA_Color(CXFA_Pattern* pattern, const FX_ARGB argb);
-  ~CXFA_Color();
-
-  Type GetType() const { return m_type; }
-  FX_ARGB GetArgb() const {
-    ASSERT(m_type == Solid || m_type == Pattern);
-    return m_argb;
-  }
-  CXFA_Pattern* GetPattern() const {
-    ASSERT(m_type == Pattern);
-    return m_pointer.pattern;
-  }
-  CXFA_Shading* GetShading() const {
-    ASSERT(m_type == Shading);
-    return m_pointer.shading;
-  }
-
-  CXFA_Color& operator=(const CXFA_Color& that);
-
- private:
-  Type m_type;
-  FX_ARGB m_argb;
-  union {
-    CXFA_Pattern* pattern;
-    CXFA_Shading* shading;
-  } m_pointer;
-};
-
-#endif  // XFA_FXGRAPHICS_CXFA_COLOR_H_
diff --git a/xfa/fxgraphics/cxfa_color.cpp b/xfa/fxgraphics/cxfa_gecolor.cpp
similarity index 65%
rename from xfa/fxgraphics/cxfa_color.cpp
rename to xfa/fxgraphics/cxfa_gecolor.cpp
index 731d144..3dca4a7 100644
--- a/xfa/fxgraphics/cxfa_color.cpp
+++ b/xfa/fxgraphics/cxfa_gecolor.cpp
@@ -4,26 +4,27 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#include "xfa/fxgraphics/cxfa_color.h"
+#include "xfa/fxgraphics/cxfa_gecolor.h"
 
-CXFA_Color::CXFA_Color() : m_type(Invalid) {}
+CXFA_GEColor::CXFA_GEColor() : m_type(Invalid) {}
 
-CXFA_Color::CXFA_Color(const FX_ARGB argb) : m_type(Solid), m_argb(argb) {
+CXFA_GEColor::CXFA_GEColor(const FX_ARGB argb) : m_type(Solid), m_argb(argb) {
   m_pointer.pattern = nullptr;
 }
 
-CXFA_Color::CXFA_Color(CXFA_Pattern* pattern, const FX_ARGB argb)
+CXFA_GEColor::CXFA_GEColor(CXFA_GEPattern* pattern, const FX_ARGB argb)
     : m_type(Pattern), m_argb(argb) {
   m_pointer.pattern = pattern;
 }
 
-CXFA_Color::CXFA_Color(CXFA_Shading* shading) : m_type(Shading), m_argb(0) {
+CXFA_GEColor::CXFA_GEColor(CXFA_GEShading* shading)
+    : m_type(Shading), m_argb(0) {
   m_pointer.shading = shading;
 }
 
-CXFA_Color::~CXFA_Color() {}
+CXFA_GEColor::~CXFA_GEColor() {}
 
-CXFA_Color& CXFA_Color::operator=(const CXFA_Color& that) {
+CXFA_GEColor& CXFA_GEColor::operator=(const CXFA_GEColor& that) {
   if (this != &that) {
     m_type = that.m_type;
     switch (m_type) {
diff --git a/xfa/fxgraphics/cxfa_gecolor.h b/xfa/fxgraphics/cxfa_gecolor.h
new file mode 100644
index 0000000..b60585b
--- /dev/null
+++ b/xfa/fxgraphics/cxfa_gecolor.h
@@ -0,0 +1,50 @@
+// Copyright 2016 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_FXGRAPHICS_CXFA_GECOLOR_H_
+#define XFA_FXGRAPHICS_CXFA_GECOLOR_H_
+
+#include "core/fxge/fx_dib.h"
+
+class CXFA_GEPattern;
+class CXFA_GEShading;
+
+class CXFA_GEColor {
+ public:
+  enum Type { Invalid, Solid, Pattern, Shading };
+
+  CXFA_GEColor();
+  explicit CXFA_GEColor(const FX_ARGB argb);
+  explicit CXFA_GEColor(CXFA_GEShading* shading);
+  CXFA_GEColor(CXFA_GEPattern* pattern, const FX_ARGB argb);
+  ~CXFA_GEColor();
+
+  Type GetType() const { return m_type; }
+  FX_ARGB GetArgb() const {
+    ASSERT(m_type == Solid || m_type == Pattern);
+    return m_argb;
+  }
+  CXFA_GEPattern* GetPattern() const {
+    ASSERT(m_type == Pattern);
+    return m_pointer.pattern;
+  }
+  CXFA_GEShading* GetShading() const {
+    ASSERT(m_type == Shading);
+    return m_pointer.shading;
+  }
+
+  CXFA_GEColor& operator=(const CXFA_GEColor& that);
+
+ private:
+  Type m_type;
+  FX_ARGB m_argb;
+  union {
+    CXFA_GEPattern* pattern;
+    CXFA_GEShading* shading;
+  } m_pointer;
+};
+
+#endif  // XFA_FXGRAPHICS_CXFA_GECOLOR_H_
diff --git a/xfa/fxgraphics/cxfa_path.cpp b/xfa/fxgraphics/cxfa_gepath.cpp
similarity index 71%
rename from xfa/fxgraphics/cxfa_path.cpp
rename to xfa/fxgraphics/cxfa_gepath.cpp
index 6d7ed0b..88372f7 100644
--- a/xfa/fxgraphics/cxfa_path.cpp
+++ b/xfa/fxgraphics/cxfa_gepath.cpp
@@ -4,52 +4,52 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#include "xfa/fxgraphics/cxfa_path.h"
+#include "xfa/fxgraphics/cxfa_gepath.h"
 
 #include "core/fxge/cfx_pathdata.h"
 #include "third_party/base/ptr_util.h"
 
-CXFA_Path::CXFA_Path() {}
+CXFA_GEPath::CXFA_GEPath() {}
 
-CXFA_Path::~CXFA_Path() {}
+CXFA_GEPath::~CXFA_GEPath() {}
 
-void CXFA_Path::Clear() {
+void CXFA_GEPath::Clear() {
   data_.Clear();
 }
 
-void CXFA_Path::Close() {
+void CXFA_GEPath::Close() {
   data_.ClosePath();
 }
 
-void CXFA_Path::MoveTo(const CFX_PointF& point) {
+void CXFA_GEPath::MoveTo(const CFX_PointF& point) {
   data_.AppendPoint(point, FXPT_TYPE::MoveTo, false);
 }
 
-void CXFA_Path::LineTo(const CFX_PointF& point) {
+void CXFA_GEPath::LineTo(const CFX_PointF& point) {
   data_.AppendPoint(point, FXPT_TYPE::LineTo, false);
 }
 
-void CXFA_Path::BezierTo(const CFX_PointF& c1,
-                         const CFX_PointF& c2,
-                         const CFX_PointF& to) {
+void CXFA_GEPath::BezierTo(const CFX_PointF& c1,
+                           const CFX_PointF& c2,
+                           const CFX_PointF& to) {
   data_.AppendPoint(c1, FXPT_TYPE::BezierTo, false);
   data_.AppendPoint(c2, FXPT_TYPE::BezierTo, false);
   data_.AppendPoint(to, FXPT_TYPE::BezierTo, false);
 }
 
-void CXFA_Path::ArcTo(const CFX_PointF& pos,
-                      const CFX_SizeF& size,
-                      float start_angle,
-                      float sweep_angle) {
+void CXFA_GEPath::ArcTo(const CFX_PointF& pos,
+                        const CFX_SizeF& size,
+                        float start_angle,
+                        float sweep_angle) {
   CFX_SizeF new_size = size / 2.0f;
   ArcToInternal(CFX_PointF(pos.x + new_size.width, pos.y + new_size.height),
                 new_size, start_angle, sweep_angle);
 }
 
-void CXFA_Path::ArcToInternal(const CFX_PointF& pos,
-                              const CFX_SizeF& size,
-                              float start_angle,
-                              float sweep_angle) {
+void CXFA_GEPath::ArcToInternal(const CFX_PointF& pos,
+                                const CFX_SizeF& size,
+                                float start_angle,
+                                float sweep_angle) {
   float x0 = cos(sweep_angle / 2);
   float y0 = sin(sweep_angle / 2);
   float tx = ((1.0f - x0) * 4) / (3 * 1.0f);
@@ -73,23 +73,26 @@
   data_.AppendPoint(bezier, FXPT_TYPE::BezierTo, false);
 }
 
-void CXFA_Path::AddLine(const CFX_PointF& p1, const CFX_PointF& p2) {
+void CXFA_GEPath::AddLine(const CFX_PointF& p1, const CFX_PointF& p2) {
   data_.AppendPoint(p1, FXPT_TYPE::MoveTo, false);
   data_.AppendPoint(p2, FXPT_TYPE::LineTo, false);
 }
 
-void CXFA_Path::AddRectangle(float left, float top, float width, float height) {
+void CXFA_GEPath::AddRectangle(float left,
+                               float top,
+                               float width,
+                               float height) {
   data_.AppendRect(left, top, left + width, top + height);
 }
 
-void CXFA_Path::AddEllipse(const CFX_RectF& rect) {
+void CXFA_GEPath::AddEllipse(const CFX_RectF& rect) {
   AddArc(rect.TopLeft(), rect.Size(), 0, FX_PI * 2);
 }
 
-void CXFA_Path::AddArc(const CFX_PointF& original_pos,
-                       const CFX_SizeF& original_size,
-                       float start_angle,
-                       float sweep_angle) {
+void CXFA_GEPath::AddArc(const CFX_PointF& original_pos,
+                         const CFX_SizeF& original_size,
+                         float start_angle,
+                         float sweep_angle) {
   if (sweep_angle == 0)
     return;
 
@@ -137,12 +140,12 @@
   } while (!done);
 }
 
-void CXFA_Path::AddSubpath(CXFA_Path* path) {
+void CXFA_GEPath::AddSubpath(CXFA_GEPath* path) {
   if (!path)
     return;
   data_.Append(&path->data_, nullptr);
 }
 
-void CXFA_Path::TransformBy(const CFX_Matrix& mt) {
+void CXFA_GEPath::TransformBy(const CFX_Matrix& mt) {
   data_.Transform(&mt);
 }
diff --git a/xfa/fxgraphics/cxfa_path.h b/xfa/fxgraphics/cxfa_gepath.h
similarity index 86%
rename from xfa/fxgraphics/cxfa_path.h
rename to xfa/fxgraphics/cxfa_gepath.h
index 9c71a4d..0c3afc4 100644
--- a/xfa/fxgraphics/cxfa_path.h
+++ b/xfa/fxgraphics/cxfa_gepath.h
@@ -4,17 +4,17 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#ifndef XFA_FXGRAPHICS_CXFA_PATH_H_
-#define XFA_FXGRAPHICS_CXFA_PATH_H_
+#ifndef XFA_FXGRAPHICS_CXFA_GEPATH_H_
+#define XFA_FXGRAPHICS_CXFA_GEPATH_H_
 
 #include "core/fxcrt/fx_system.h"
 #include "core/fxge/cfx_pathdata.h"
 #include "xfa/fxgraphics/cxfa_graphics.h"
 
-class CXFA_Path final {
+class CXFA_GEPath final {
  public:
-  CXFA_Path();
-  ~CXFA_Path();
+  CXFA_GEPath();
+  ~CXFA_GEPath();
 
   const CFX_PathData* GetPathData() const { return &data_; }
 
@@ -41,7 +41,7 @@
               float startAngle,
               float sweepAngle);
 
-  void AddSubpath(CXFA_Path* path);
+  void AddSubpath(CXFA_GEPath* path);
 
  private:
   void ArcToInternal(const CFX_PointF& pos,
@@ -52,4 +52,4 @@
   CFX_PathData data_;
 };
 
-#endif  // XFA_FXGRAPHICS_CXFA_PATH_H_
+#endif  // XFA_FXGRAPHICS_CXFA_GEPATH_H_
diff --git a/xfa/fxgraphics/cxfa_gepattern.cpp b/xfa/fxgraphics/cxfa_gepattern.cpp
new file mode 100644
index 0000000..2a6a0e4
--- /dev/null
+++ b/xfa/fxgraphics/cxfa_gepattern.cpp
@@ -0,0 +1,20 @@
+// Copyright 2016 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/fxgraphics/cxfa_gepattern.h"
+
+CXFA_GEPattern::CXFA_GEPattern(FX_HatchStyle hatchStyle,
+                               const FX_ARGB foreArgb,
+                               const FX_ARGB backArgb,
+                               CFX_Matrix* matrix)
+    : m_hatchStyle(hatchStyle), m_foreArgb(foreArgb), m_backArgb(backArgb) {
+  if (matrix)
+    m_matrix = *matrix;
+  else
+    m_matrix.SetIdentity();
+}
+
+CXFA_GEPattern::~CXFA_GEPattern() {}
diff --git a/xfa/fxgraphics/cxfa_pattern.h b/xfa/fxgraphics/cxfa_gepattern.h
similarity index 62%
rename from xfa/fxgraphics/cxfa_pattern.h
rename to xfa/fxgraphics/cxfa_gepattern.h
index 838ec98..0f4ced2 100644
--- a/xfa/fxgraphics/cxfa_pattern.h
+++ b/xfa/fxgraphics/cxfa_gepattern.h
@@ -4,8 +4,8 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#ifndef XFA_FXGRAPHICS_CXFA_PATTERN_H_
-#define XFA_FXGRAPHICS_CXFA_PATTERN_H_
+#ifndef XFA_FXGRAPHICS_CXFA_GEPATTERN_H_
+#define XFA_FXGRAPHICS_CXFA_GEPATTERN_H_
 
 #include "core/fxcrt/fx_coordinates.h"
 #include "core/fxcrt/fx_system.h"
@@ -14,14 +14,14 @@
 class CFX_DIBitmap;
 class CFX_Matrix;
 
-class CXFA_Pattern {
+class CXFA_GEPattern {
  public:
-  CXFA_Pattern(FX_HatchStyle hatchStyle,
-               const FX_ARGB foreArgb,
-               const FX_ARGB backArgb,
-               CFX_Matrix* matrix = nullptr);
+  CXFA_GEPattern(FX_HatchStyle hatchStyle,
+                 const FX_ARGB foreArgb,
+                 const FX_ARGB backArgb,
+                 CFX_Matrix* matrix = nullptr);
 
-  virtual ~CXFA_Pattern();
+  virtual ~CXFA_GEPattern();
 
  private:
   friend class CXFA_Graphics;
@@ -33,4 +33,4 @@
   const FX_ARGB m_backArgb;
 };
 
-#endif  // XFA_FXGRAPHICS_CXFA_PATTERN_H_
+#endif  // XFA_FXGRAPHICS_CXFA_GEPATTERN_H_
diff --git a/xfa/fxgraphics/cxfa_shading.cpp b/xfa/fxgraphics/cxfa_geshading.cpp
similarity index 65%
rename from xfa/fxgraphics/cxfa_shading.cpp
rename to xfa/fxgraphics/cxfa_geshading.cpp
index 599a3f9..f691169 100644
--- a/xfa/fxgraphics/cxfa_shading.cpp
+++ b/xfa/fxgraphics/cxfa_geshading.cpp
@@ -4,14 +4,14 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#include "xfa/fxgraphics/cxfa_shading.h"
+#include "xfa/fxgraphics/cxfa_geshading.h"
 
-CXFA_Shading::CXFA_Shading(const CFX_PointF& beginPoint,
-                           const CFX_PointF& endPoint,
-                           bool isExtendedBegin,
-                           bool isExtendedEnd,
-                           const FX_ARGB beginArgb,
-                           const FX_ARGB endArgb)
+CXFA_GEShading::CXFA_GEShading(const CFX_PointF& beginPoint,
+                               const CFX_PointF& endPoint,
+                               bool isExtendedBegin,
+                               bool isExtendedEnd,
+                               const FX_ARGB beginArgb,
+                               const FX_ARGB endArgb)
     : m_type(FX_SHADING_Axial),
       m_beginPoint(beginPoint),
       m_endPoint(endPoint),
@@ -24,14 +24,14 @@
   InitArgbArray();
 }
 
-CXFA_Shading::CXFA_Shading(const CFX_PointF& beginPoint,
-                           const CFX_PointF& endPoint,
-                           const float beginRadius,
-                           const float endRadius,
-                           bool isExtendedBegin,
-                           bool isExtendedEnd,
-                           const FX_ARGB beginArgb,
-                           const FX_ARGB endArgb)
+CXFA_GEShading::CXFA_GEShading(const CFX_PointF& beginPoint,
+                               const CFX_PointF& endPoint,
+                               const float beginRadius,
+                               const float endRadius,
+                               bool isExtendedBegin,
+                               bool isExtendedEnd,
+                               const FX_ARGB beginArgb,
+                               const FX_ARGB endArgb)
     : m_type(FX_SHADING_Radial),
       m_beginPoint(beginPoint),
       m_endPoint(endPoint),
@@ -44,9 +44,9 @@
   InitArgbArray();
 }
 
-CXFA_Shading::~CXFA_Shading() {}
+CXFA_GEShading::~CXFA_GEShading() {}
 
-void CXFA_Shading::InitArgbArray() {
+void CXFA_GEShading::InitArgbArray() {
   int32_t a1;
   int32_t r1;
   int32_t g1;
diff --git a/xfa/fxgraphics/cxfa_geshading.h b/xfa/fxgraphics/cxfa_geshading.h
new file mode 100644
index 0000000..fc7a13e
--- /dev/null
+++ b/xfa/fxgraphics/cxfa_geshading.h
@@ -0,0 +1,56 @@
+// Copyright 2016 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_FXGRAPHICS_CXFA_GESHADING_H_
+#define XFA_FXGRAPHICS_CXFA_GESHADING_H_
+
+#include "core/fxcrt/fx_coordinates.h"
+#include "core/fxcrt/fx_system.h"
+#include "core/fxge/fx_dib.h"
+
+#define FX_SHADING_Steps 256
+
+enum CXFA_GEShading_Type { FX_SHADING_Axial = 1, FX_SHADING_Radial };
+
+class CXFA_GEShading {
+ public:
+  // Axial shading.
+  CXFA_GEShading(const CFX_PointF& beginPoint,
+                 const CFX_PointF& endPoint,
+                 bool isExtendedBegin,
+                 bool isExtendedEnd,
+                 const FX_ARGB beginArgb,
+                 const FX_ARGB endArgb);
+
+  // Radial shading.
+  CXFA_GEShading(const CFX_PointF& beginPoint,
+                 const CFX_PointF& endPoint,
+                 const float beginRadius,
+                 const float endRadius,
+                 bool isExtendedBegin,
+                 bool isExtendedEnd,
+                 const FX_ARGB beginArgb,
+                 const FX_ARGB endArgb);
+  virtual ~CXFA_GEShading();
+
+ private:
+  friend class CXFA_Graphics;
+
+  void InitArgbArray();
+
+  const CXFA_GEShading_Type m_type;
+  const CFX_PointF m_beginPoint;
+  const CFX_PointF m_endPoint;
+  const float m_beginRadius;
+  const float m_endRadius;
+  const bool m_isExtendedBegin;
+  const bool m_isExtendedEnd;
+  const FX_ARGB m_beginArgb;
+  const FX_ARGB m_endArgb;
+  FX_ARGB m_argbArray[FX_SHADING_Steps];
+};
+
+#endif  // XFA_FXGRAPHICS_CXFA_GESHADING_H_
diff --git a/xfa/fxgraphics/cxfa_graphics.cpp b/xfa/fxgraphics/cxfa_graphics.cpp
index 7cb83e1..66a109d 100644
--- a/xfa/fxgraphics/cxfa_graphics.cpp
+++ b/xfa/fxgraphics/cxfa_graphics.cpp
@@ -12,10 +12,10 @@
 #include "core/fxge/cfx_renderdevice.h"
 #include "core/fxge/cfx_unicodeencoding.h"
 #include "third_party/base/ptr_util.h"
-#include "xfa/fxgraphics/cxfa_color.h"
-#include "xfa/fxgraphics/cxfa_path.h"
-#include "xfa/fxgraphics/cxfa_pattern.h"
-#include "xfa/fxgraphics/cxfa_shading.h"
+#include "xfa/fxgraphics/cxfa_gecolor.h"
+#include "xfa/fxgraphics/cxfa_gepath.h"
+#include "xfa/fxgraphics/cxfa_gepattern.h"
+#include "xfa/fxgraphics/cxfa_geshading.h"
 
 namespace {
 
@@ -168,24 +168,24 @@
     m_info.isActOnDash = true;
 }
 
-void CXFA_Graphics::SetStrokeColor(const CXFA_Color& color) {
+void CXFA_Graphics::SetStrokeColor(const CXFA_GEColor& color) {
   if (m_type == FX_CONTEXT_Device && m_renderDevice)
     m_info.strokeColor = color;
 }
 
-void CXFA_Graphics::SetFillColor(const CXFA_Color& color) {
+void CXFA_Graphics::SetFillColor(const CXFA_GEColor& color) {
   if (m_type == FX_CONTEXT_Device && m_renderDevice)
     m_info.fillColor = color;
 }
 
-void CXFA_Graphics::StrokePath(CXFA_Path* path, const CFX_Matrix* matrix) {
+void CXFA_Graphics::StrokePath(CXFA_GEPath* path, const CFX_Matrix* matrix) {
   if (!path)
     return;
   if (m_type == FX_CONTEXT_Device && m_renderDevice)
     RenderDeviceStrokePath(path, matrix);
 }
 
-void CXFA_Graphics::FillPath(CXFA_Path* path,
+void CXFA_Graphics::FillPath(CXFA_GEPath* path,
                              FX_FillMode fillMode,
                              const CFX_Matrix* matrix) {
   if (!path)
@@ -268,9 +268,9 @@
   }
 }
 
-void CXFA_Graphics::RenderDeviceStrokePath(const CXFA_Path* path,
+void CXFA_Graphics::RenderDeviceStrokePath(const CXFA_GEPath* path,
                                            const CFX_Matrix* matrix) {
-  if (m_info.strokeColor.GetType() != CXFA_Color::Solid)
+  if (m_info.strokeColor.GetType() != CXFA_GEColor::Solid)
     return;
 
   CFX_Matrix m = m_info.CTM;
@@ -281,7 +281,7 @@
                            m_info.strokeColor.GetArgb(), 0);
 }
 
-void CXFA_Graphics::RenderDeviceFillPath(const CXFA_Path* path,
+void CXFA_Graphics::RenderDeviceFillPath(const CXFA_GEPath* path,
                                          FX_FillMode fillMode,
                                          const CFX_Matrix* matrix) {
   CFX_Matrix m = m_info.CTM;
@@ -289,14 +289,14 @@
     m.Concat(*matrix);
 
   switch (m_info.fillColor.GetType()) {
-    case CXFA_Color::Solid:
+    case CXFA_GEColor::Solid:
       m_renderDevice->DrawPath(path->GetPathData(), &m, &m_info.graphState,
                                m_info.fillColor.GetArgb(), 0x0, fillMode);
       return;
-    case CXFA_Color::Pattern:
+    case CXFA_GEColor::Pattern:
       FillPathWithPattern(path, fillMode, m);
       return;
-    case CXFA_Color::Shading:
+    case CXFA_GEColor::Shading:
       FillPathWithShading(path, fillMode, m);
       return;
     default:
@@ -329,10 +329,10 @@
                           FXSYS_round(r.left - left), FXSYS_round(r.top - top));
 }
 
-void CXFA_Graphics::FillPathWithPattern(const CXFA_Path* path,
+void CXFA_Graphics::FillPathWithPattern(const CXFA_GEPath* path,
                                         FX_FillMode fillMode,
                                         const CFX_Matrix& matrix) {
-  CXFA_Pattern* pattern = m_info.fillColor.GetPattern();
+  CXFA_GEPattern* pattern = m_info.fillColor.GetPattern();
   RetainPtr<CFX_DIBitmap> bitmap = m_renderDevice->GetBitmap();
   int32_t width = bitmap->GetWidth();
   int32_t height = bitmap->GetHeight();
@@ -363,7 +363,7 @@
   SetDIBitsWithMatrix(bmp, pattern->m_matrix);
 }
 
-void CXFA_Graphics::FillPathWithShading(const CXFA_Path* path,
+void CXFA_Graphics::FillPathWithShading(const CXFA_GEPath* path,
                                         FX_FillMode fillMode,
                                         const CFX_Matrix& matrix) {
   RetainPtr<CFX_DIBitmap> bitmap = m_renderDevice->GetBitmap();
diff --git a/xfa/fxgraphics/cxfa_graphics.h b/xfa/fxgraphics/cxfa_graphics.h
index 6b9dcb9..16cd123 100644
--- a/xfa/fxgraphics/cxfa_graphics.h
+++ b/xfa/fxgraphics/cxfa_graphics.h
@@ -16,9 +16,9 @@
 #include "core/fxge/cfx_renderdevice.h"
 #include "core/fxge/fx_dib.h"
 #include "core/fxge/fx_font.h"
-#include "xfa/fxgraphics/cxfa_color.h"
+#include "xfa/fxgraphics/cxfa_gecolor.h"
 
-class CXFA_Path;
+class CXFA_GEPath;
 
 using FX_FillMode = int32_t;
 
@@ -58,11 +58,11 @@
   void SetLineDash(FX_DashStyle dashStyle);
   void SetLineWidth(float lineWidth);
   void EnableActOnDash();
-  void SetStrokeColor(const CXFA_Color& color);
-  void SetFillColor(const CXFA_Color& color);
+  void SetStrokeColor(const CXFA_GEColor& color);
+  void SetFillColor(const CXFA_GEColor& color);
   void SetClipRect(const CFX_RectF& rect);
-  void StrokePath(CXFA_Path* path, const CFX_Matrix* matrix);
-  void FillPath(CXFA_Path* path,
+  void StrokePath(CXFA_GEPath* path, const CFX_Matrix* matrix);
+  void FillPath(CXFA_GEPath* path,
                 FX_FillMode fillMode,
                 const CFX_Matrix* matrix);
   void StretchImage(const RetainPtr<CFX_DIBSource>& source,
@@ -82,23 +82,24 @@
     CFX_GraphStateData graphState;
     CFX_Matrix CTM;
     bool isActOnDash;
-    CXFA_Color strokeColor;
-    CXFA_Color fillColor;
+    CXFA_GEColor strokeColor;
+    CXFA_GEColor fillColor;
   } m_info;
 
   void RenderDeviceSetLineDash(FX_DashStyle dashStyle);
-  void RenderDeviceStrokePath(const CXFA_Path* path, const CFX_Matrix* matrix);
-  void RenderDeviceFillPath(const CXFA_Path* path,
+  void RenderDeviceStrokePath(const CXFA_GEPath* path,
+                              const CFX_Matrix* matrix);
+  void RenderDeviceFillPath(const CXFA_GEPath* path,
                             FX_FillMode fillMode,
                             const CFX_Matrix* matrix);
   void RenderDeviceStretchImage(const RetainPtr<CFX_DIBSource>& source,
                                 const CFX_RectF& rect,
                                 const CFX_Matrix& matrix);
 
-  void FillPathWithPattern(const CXFA_Path* path,
+  void FillPathWithPattern(const CXFA_GEPath* path,
                            FX_FillMode fillMode,
                            const CFX_Matrix& matrix);
-  void FillPathWithShading(const CXFA_Path* path,
+  void FillPathWithShading(const CXFA_GEPath* path,
                            FX_FillMode fillMode,
                            const CFX_Matrix& matrix);
 
diff --git a/xfa/fxgraphics/cxfa_pattern.cpp b/xfa/fxgraphics/cxfa_pattern.cpp
deleted file mode 100644
index ea6cea8..0000000
--- a/xfa/fxgraphics/cxfa_pattern.cpp
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2016 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/fxgraphics/cxfa_pattern.h"
-
-CXFA_Pattern::CXFA_Pattern(FX_HatchStyle hatchStyle,
-                           const FX_ARGB foreArgb,
-                           const FX_ARGB backArgb,
-                           CFX_Matrix* matrix)
-    : m_hatchStyle(hatchStyle), m_foreArgb(foreArgb), m_backArgb(backArgb) {
-  if (matrix)
-    m_matrix = *matrix;
-  else
-    m_matrix.SetIdentity();
-}
-
-CXFA_Pattern::~CXFA_Pattern() {}
diff --git a/xfa/fxgraphics/cxfa_shading.h b/xfa/fxgraphics/cxfa_shading.h
deleted file mode 100644
index 22ef941..0000000
--- a/xfa/fxgraphics/cxfa_shading.h
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2016 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_FXGRAPHICS_CXFA_SHADING_H_
-#define XFA_FXGRAPHICS_CXFA_SHADING_H_
-
-#include "core/fxcrt/fx_coordinates.h"
-#include "core/fxcrt/fx_system.h"
-#include "core/fxge/fx_dib.h"
-
-#define FX_SHADING_Steps 256
-
-enum CXFA_Shading_Type { FX_SHADING_Axial = 1, FX_SHADING_Radial };
-
-class CXFA_Shading {
- public:
-  // Axial shading.
-  CXFA_Shading(const CFX_PointF& beginPoint,
-               const CFX_PointF& endPoint,
-               bool isExtendedBegin,
-               bool isExtendedEnd,
-               const FX_ARGB beginArgb,
-               const FX_ARGB endArgb);
-
-  // Radial shading.
-  CXFA_Shading(const CFX_PointF& beginPoint,
-               const CFX_PointF& endPoint,
-               const float beginRadius,
-               const float endRadius,
-               bool isExtendedBegin,
-               bool isExtendedEnd,
-               const FX_ARGB beginArgb,
-               const FX_ARGB endArgb);
-  virtual ~CXFA_Shading();
-
- private:
-  friend class CXFA_Graphics;
-
-  void InitArgbArray();
-
-  const CXFA_Shading_Type m_type;
-  const CFX_PointF m_beginPoint;
-  const CFX_PointF m_endPoint;
-  const float m_beginRadius;
-  const float m_endRadius;
-  const bool m_isExtendedBegin;
-  const bool m_isExtendedEnd;
-  const FX_ARGB m_beginArgb;
-  const FX_ARGB m_endArgb;
-  FX_ARGB m_argbArray[FX_SHADING_Steps];
-};
-
-#endif  // XFA_FXGRAPHICS_CXFA_SHADING_H_
