diff --git a/BUILD.gn b/BUILD.gn
index 3e3f22f..57d07fc 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -353,8 +353,6 @@
     "core/fpdfdoc/cpdf_variabletext.h",
     "core/fpdfdoc/cpdf_viewerpreferences.cpp",
     "core/fpdfdoc/cpdf_viewerpreferences.h",
-    "core/fpdfdoc/cpvt_color.cpp",
-    "core/fpdfdoc/cpvt_color.h",
     "core/fpdfdoc/cpvt_dash.h",
     "core/fpdfdoc/cpvt_floatrect.h",
     "core/fpdfdoc/cpvt_fontmap.cpp",
diff --git a/core/fpdfdoc/cpdf_annotlist.cpp b/core/fpdfdoc/cpdf_annotlist.cpp
index 9224943..c0f7ae2 100644
--- a/core/fpdfdoc/cpdf_annotlist.cpp
+++ b/core/fpdfdoc/cpdf_annotlist.cpp
@@ -11,6 +11,7 @@
 #include <utility>
 
 #include "core/fpdfapi/page/cpdf_page.h"
+#include "core/fpdfapi/parser/cpdf_array.h"
 #include "core/fpdfapi/parser/cpdf_document.h"
 #include "core/fpdfapi/parser/cpdf_name.h"
 #include "core/fpdfapi/parser/cpdf_number.h"
diff --git a/core/fpdfdoc/cpdf_apsettings.cpp b/core/fpdfdoc/cpdf_apsettings.cpp
index 0fc9c20..076cdd9 100644
--- a/core/fpdfdoc/cpdf_apsettings.cpp
+++ b/core/fpdfdoc/cpdf_apsettings.cpp
@@ -10,7 +10,7 @@
 
 #include "core/fpdfapi/parser/cpdf_array.h"
 #include "core/fpdfapi/parser/cpdf_dictionary.h"
-#include "core/fpdfdoc/cpdf_formcontrol.h"
+#include "core/fxge/cfx_color.h"
 
 CPDF_ApSettings::CPDF_ApSettings(CPDF_Dictionary* pDict) : m_pDict(pDict) {}
 
@@ -28,7 +28,7 @@
 
 FX_ARGB CPDF_ApSettings::GetColor(int& iColorType,
                                   const ByteString& csEntry) const {
-  iColorType = COLORTYPE_TRANSPARENT;
+  iColorType = CFX_Color::kTransparent;
   if (!m_pDict)
     return 0;
 
@@ -39,19 +39,19 @@
   FX_ARGB color = 0;
   size_t dwCount = pEntry->GetCount();
   if (dwCount == 1) {
-    iColorType = COLORTYPE_GRAY;
+    iColorType = CFX_Color::kGray;
     float g = pEntry->GetNumberAt(0) * 255;
     return ArgbEncode(255, (int)g, (int)g, (int)g);
   }
   if (dwCount == 3) {
-    iColorType = COLORTYPE_RGB;
+    iColorType = CFX_Color::kRGB;
     float r = pEntry->GetNumberAt(0) * 255;
     float g = pEntry->GetNumberAt(1) * 255;
     float b = pEntry->GetNumberAt(2) * 255;
     return ArgbEncode(255, (int)r, (int)g, (int)b);
   }
   if (dwCount == 4) {
-    iColorType = COLORTYPE_CMYK;
+    iColorType = CFX_Color::kCMYK;
     float c = pEntry->GetNumberAt(0);
     float m = pEntry->GetNumberAt(1);
     float y = pEntry->GetNumberAt(2);
@@ -76,7 +76,7 @@
 void CPDF_ApSettings::GetOriginalColor(int& iColorType,
                                        float fc[4],
                                        const ByteString& csEntry) const {
-  iColorType = COLORTYPE_TRANSPARENT;
+  iColorType = CFX_Color::kTransparent;
   for (int i = 0; i < 4; i++)
     fc[i] = 0;
 
@@ -89,15 +89,15 @@
 
   size_t dwCount = pEntry->GetCount();
   if (dwCount == 1) {
-    iColorType = COLORTYPE_GRAY;
+    iColorType = CFX_Color::kGray;
     fc[0] = pEntry->GetNumberAt(0);
   } else if (dwCount == 3) {
-    iColorType = COLORTYPE_RGB;
+    iColorType = CFX_Color::kRGB;
     fc[0] = pEntry->GetNumberAt(0);
     fc[1] = pEntry->GetNumberAt(1);
     fc[2] = pEntry->GetNumberAt(2);
   } else if (dwCount == 4) {
-    iColorType = COLORTYPE_CMYK;
+    iColorType = CFX_Color::kCMYK;
     fc[0] = pEntry->GetNumberAt(0);
     fc[1] = pEntry->GetNumberAt(1);
     fc[2] = pEntry->GetNumberAt(2);
diff --git a/core/fpdfdoc/cpdf_defaultappearance.cpp b/core/fpdfdoc/cpdf_defaultappearance.cpp
index bd7ea1b..02d6eea 100644
--- a/core/fpdfdoc/cpdf_defaultappearance.cpp
+++ b/core/fpdfdoc/cpdf_defaultappearance.cpp
@@ -10,7 +10,7 @@
 
 #include "core/fpdfapi/parser/cpdf_simple_parser.h"
 #include "core/fpdfapi/parser/fpdf_parser_decode.h"
-#include "core/fpdfdoc/cpdf_formcontrol.h"
+#include "core/fxge/cfx_color.h"
 
 bool CPDF_DefaultAppearance::HasFont() {
   if (m_csDA.IsEmpty())
@@ -110,7 +110,7 @@
 void CPDF_DefaultAppearance::GetColor(int& iColorType,
                                       float fc[4],
                                       PaintOperation nOperation) {
-  iColorType = COLORTYPE_TRANSPARENT;
+  iColorType = CFX_Color::kTransparent;
   for (int c = 0; c < 4; c++)
     fc[c] = 0;
 
@@ -120,13 +120,13 @@
   CPDF_SimpleParser syntax(m_csDA.AsStringView());
   if (syntax.FindTagParamFromStart(
           (nOperation == PaintOperation::STROKE ? "G" : "g"), 1)) {
-    iColorType = COLORTYPE_GRAY;
+    iColorType = CFX_Color::kGray;
     fc[0] = FX_atof(syntax.GetWord());
     return;
   }
   if (syntax.FindTagParamFromStart(
           (nOperation == PaintOperation::STROKE ? "RG" : "rg"), 3)) {
-    iColorType = COLORTYPE_RGB;
+    iColorType = CFX_Color::kRGB;
     fc[0] = FX_atof(syntax.GetWord());
     fc[1] = FX_atof(syntax.GetWord());
     fc[2] = FX_atof(syntax.GetWord());
@@ -134,7 +134,7 @@
   }
   if (syntax.FindTagParamFromStart(
           (nOperation == PaintOperation::STROKE ? "K" : "k"), 4)) {
-    iColorType = COLORTYPE_CMYK;
+    iColorType = CFX_Color::kCMYK;
     fc[0] = FX_atof(syntax.GetWord());
     fc[1] = FX_atof(syntax.GetWord());
     fc[2] = FX_atof(syntax.GetWord());
@@ -146,21 +146,21 @@
                                       int& iColorType,
                                       PaintOperation nOperation) {
   color = 0;
-  iColorType = COLORTYPE_TRANSPARENT;
+  iColorType = CFX_Color::kTransparent;
   if (m_csDA.IsEmpty())
     return;
 
   CPDF_SimpleParser syntax(m_csDA.AsStringView());
   if (syntax.FindTagParamFromStart(
           (nOperation == PaintOperation::STROKE ? "G" : "g"), 1)) {
-    iColorType = COLORTYPE_GRAY;
+    iColorType = CFX_Color::kGray;
     float g = FX_atof(syntax.GetWord()) * 255 + 0.5f;
     color = ArgbEncode(255, (int)g, (int)g, (int)g);
     return;
   }
   if (syntax.FindTagParamFromStart(
           (nOperation == PaintOperation::STROKE ? "RG" : "rg"), 3)) {
-    iColorType = COLORTYPE_RGB;
+    iColorType = CFX_Color::kRGB;
     float r = FX_atof(syntax.GetWord()) * 255 + 0.5f;
     float g = FX_atof(syntax.GetWord()) * 255 + 0.5f;
     float b = FX_atof(syntax.GetWord()) * 255 + 0.5f;
@@ -169,7 +169,7 @@
   }
   if (syntax.FindTagParamFromStart(
           (nOperation == PaintOperation::STROKE ? "K" : "k"), 4)) {
-    iColorType = COLORTYPE_CMYK;
+    iColorType = CFX_Color::kCMYK;
     float c = FX_atof(syntax.GetWord());
     float m = FX_atof(syntax.GetWord());
     float y = FX_atof(syntax.GetWord());
diff --git a/core/fpdfdoc/cpdf_formcontrol.h b/core/fpdfdoc/cpdf_formcontrol.h
index b22b074..6485af0 100644
--- a/core/fpdfdoc/cpdf_formcontrol.h
+++ b/core/fpdfdoc/cpdf_formcontrol.h
@@ -28,11 +28,6 @@
 #define TEXTPOS_LEFT 5
 #define TEXTPOS_OVERLAID 6
 
-#define COLORTYPE_TRANSPARENT 0
-#define COLORTYPE_GRAY 1
-#define COLORTYPE_RGB 2
-#define COLORTYPE_CMYK 3
-
 class CFX_RenderDevice;
 class CPDF_Dictionary;
 class CPDF_Font;
diff --git a/core/fpdfdoc/cpvt_color.cpp b/core/fpdfdoc/cpvt_color.cpp
deleted file mode 100644
index 914e416..0000000
--- a/core/fpdfdoc/cpvt_color.cpp
+++ /dev/null
@@ -1,51 +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 "core/fpdfdoc/cpvt_color.h"
-
-#include "core/fpdfapi/parser/cpdf_simple_parser.h"
-
-// Static.
-CPVT_Color CPVT_Color::ParseColor(const ByteString& str) {
-  CPDF_SimpleParser syntax(str.AsStringView());
-  if (syntax.FindTagParamFromStart("g", 1))
-    return CPVT_Color(CPVT_Color::kGray, FX_atof(syntax.GetWord()));
-
-  if (syntax.FindTagParamFromStart("rg", 3)) {
-    float f1 = FX_atof(syntax.GetWord());
-    float f2 = FX_atof(syntax.GetWord());
-    float f3 = FX_atof(syntax.GetWord());
-    return CPVT_Color(CPVT_Color::kRGB, f1, f2, f3);
-  }
-  if (syntax.FindTagParamFromStart("k", 4)) {
-    float f1 = FX_atof(syntax.GetWord());
-    float f2 = FX_atof(syntax.GetWord());
-    float f3 = FX_atof(syntax.GetWord());
-    float f4 = FX_atof(syntax.GetWord());
-    return CPVT_Color(CPVT_Color::kCMYK, f1, f2, f3, f4);
-  }
-  return CPVT_Color(CPVT_Color::kTransparent);
-}
-
-// Static.
-CPVT_Color CPVT_Color::ParseColor(const CPDF_Array& array) {
-  CPVT_Color rt;
-  switch (array.GetCount()) {
-    case 1:
-      rt = CPVT_Color(CPVT_Color::kGray, array.GetFloatAt(0));
-      break;
-    case 3:
-      rt = CPVT_Color(CPVT_Color::kRGB, array.GetFloatAt(0),
-                      array.GetFloatAt(1), array.GetFloatAt(2));
-      break;
-    case 4:
-      rt = CPVT_Color(CPVT_Color::kCMYK, array.GetFloatAt(0),
-                      array.GetFloatAt(1), array.GetFloatAt(2),
-                      array.GetFloatAt(3));
-      break;
-  }
-  return rt;
-}
diff --git a/core/fpdfdoc/cpvt_color.h b/core/fpdfdoc/cpvt_color.h
deleted file mode 100644
index a7e925b..0000000
--- a/core/fpdfdoc/cpvt_color.h
+++ /dev/null
@@ -1,38 +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 CORE_FPDFDOC_CPVT_COLOR_H_
-#define CORE_FPDFDOC_CPVT_COLOR_H_
-
-#include "core/fpdfapi/parser/cpdf_array.h"
-#include "core/fxcrt/fx_string.h"
-#include "core/fxcrt/fx_system.h"
-
-struct CPVT_Color {
-  enum Type { kTransparent = 0, kGray, kRGB, kCMYK };
-
-  CPVT_Color(Type type = kTransparent,
-             float color1 = 0.0f,
-             float color2 = 0.0f,
-             float color3 = 0.0f,
-             float color4 = 0.0f)
-      : nColorType(type),
-        fColor1(color1),
-        fColor2(color2),
-        fColor3(color3),
-        fColor4(color4) {}
-
-  Type nColorType;
-  float fColor1;
-  float fColor2;
-  float fColor3;
-  float fColor4;
-
-  static CPVT_Color ParseColor(const ByteString& str);
-  static CPVT_Color ParseColor(const CPDF_Array& array);
-};
-
-#endif  // CORE_FPDFDOC_CPVT_COLOR_H_
diff --git a/core/fpdfdoc/cpvt_generateap.cpp b/core/fpdfdoc/cpvt_generateap.cpp
index 634864c..ac3e7a5 100644
--- a/core/fpdfdoc/cpvt_generateap.cpp
+++ b/core/fpdfdoc/cpvt_generateap.cpp
@@ -12,6 +12,7 @@
 #include <utility>
 
 #include "core/fpdfapi/font/cpdf_font.h"
+#include "core/fpdfapi/parser/cpdf_array.h"
 #include "core/fpdfapi/parser/cpdf_boolean.h"
 #include "core/fpdfapi/parser/cpdf_dictionary.h"
 #include "core/fpdfapi/parser/cpdf_document.h"
@@ -24,7 +25,6 @@
 #include "core/fpdfapi/parser/fpdf_parser_decode.h"
 #include "core/fpdfdoc/cpdf_annot.h"
 #include "core/fpdfdoc/cpdf_formfield.h"
-#include "core/fpdfdoc/cpvt_color.h"
 #include "core/fpdfdoc/cpvt_fontmap.h"
 #include "core/fpdfdoc/cpvt_word.h"
 #include "third_party/base/ptr_util.h"
@@ -58,7 +58,7 @@
     return false;
 
   float fFontSize = FX_atof(syntax.GetWord());
-  CPVT_Color crText = CPVT_Color::ParseColor(DA);
+  CFX_Color crText = CFX_Color::ParseColor(DA);
   CPDF_Dictionary* pDRDict = pFormDict->GetDictFor("DR");
   if (!pDRDict)
     return false;
@@ -116,8 +116,8 @@
   BorderStyle nBorderStyle = BorderStyle::SOLID;
   float fBorderWidth = 1;
   CPVT_Dash dsBorder(3, 0, 0);
-  CPVT_Color crLeftTop;
-  CPVT_Color crRightBottom;
+  CFX_Color crLeftTop;
+  CFX_Color crRightBottom;
   if (CPDF_Dictionary* pBSDict = pAnnotDict->GetDictFor("BS")) {
     if (pBSDict->KeyExist("W"))
       fBorderWidth = pBSDict->GetNumberFor("W");
@@ -137,14 +137,14 @@
         case 'B':
           nBorderStyle = BorderStyle::BEVELED;
           fBorderWidth *= 2;
-          crLeftTop = CPVT_Color(CPVT_Color::kGray, 1);
-          crRightBottom = CPVT_Color(CPVT_Color::kGray, 0.5);
+          crLeftTop = CFX_Color(CFX_Color::kGray, 1);
+          crRightBottom = CFX_Color(CFX_Color::kGray, 0.5);
           break;
         case 'I':
           nBorderStyle = BorderStyle::INSET;
           fBorderWidth *= 2;
-          crLeftTop = CPVT_Color(CPVT_Color::kGray, 0.5);
-          crRightBottom = CPVT_Color(CPVT_Color::kGray, 0.75);
+          crLeftTop = CFX_Color(CFX_Color::kGray, 0.5);
+          crRightBottom = CFX_Color(CFX_Color::kGray, 0.75);
           break;
         case 'U':
           nBorderStyle = BorderStyle::UNDERLINE;
@@ -152,13 +152,13 @@
       }
     }
   }
-  CPVT_Color crBorder;
-  CPVT_Color crBG;
+  CFX_Color crBorder;
+  CFX_Color crBG;
   if (CPDF_Dictionary* pMKDict = pAnnotDict->GetDictFor("MK")) {
     if (CPDF_Array* pArray = pMKDict->GetArrayFor("BC"))
-      crBorder = CPVT_Color::ParseColor(*pArray);
+      crBorder = CFX_Color::ParseColor(*pArray);
     if (CPDF_Array* pArray = pMKDict->GetArrayFor("BG"))
-      crBG = CPVT_Color::ParseColor(*pArray);
+      crBG = CFX_Color::ParseColor(*pArray);
   }
   std::ostringstream sAppStream;
   ByteString sBG = CPVT_GenerateAP::GenerateColorAP(crBG, PaintOperation::FILL);
@@ -320,8 +320,8 @@
                    << "Q\nEMC\n";
       }
       ByteString sButton = CPVT_GenerateAP::GenerateColorAP(
-          CPVT_Color(CPVT_Color::kRGB, 220.0f / 255.0f, 220.0f / 255.0f,
-                     220.0f / 255.0f),
+          CFX_Color(CFX_Color::kRGB, 220.0f / 255.0f, 220.0f / 255.0f,
+                    220.0f / 255.0f),
           PaintOperation::FILL);
       if (sButton.GetLength() > 0 && !rcButton.IsEmpty()) {
         sAppStream << "q\n" << sButton;
@@ -329,10 +329,9 @@
                    << rcButton.Width() << " " << rcButton.Height() << " re f\n";
         sAppStream << "Q\n";
         ByteString sButtonBorder = CPVT_GenerateAP::GenerateBorderAP(
-            rcButton, 2, CPVT_Color(CPVT_Color::kGray, 0),
-            CPVT_Color(CPVT_Color::kGray, 1),
-            CPVT_Color(CPVT_Color::kGray, 0.5), BorderStyle::BEVELED,
-            CPVT_Dash(3, 0, 0));
+            rcButton, 2, CFX_Color(CFX_Color::kGray, 0),
+            CFX_Color(CFX_Color::kGray, 1), CFX_Color(CFX_Color::kGray, 0.5),
+            BorderStyle::BEVELED, CPVT_Dash(3, 0, 0));
         if (sButtonBorder.GetLength() > 0)
           sAppStream << "q\n" << sButtonBorder << "Q\n";
 
@@ -398,16 +397,15 @@
                   rcBody.left, fy - fItemHeight, rcBody.right, fy);
               sBody << "q\n"
                     << CPVT_GenerateAP::GenerateColorAP(
-                           CPVT_Color(CPVT_Color::kRGB, 0, 51.0f / 255.0f,
-                                      113.0f / 255.0f),
+                           CFX_Color(CFX_Color::kRGB, 0, 51.0f / 255.0f,
+                                     113.0f / 255.0f),
                            PaintOperation::FILL)
                     << rcItem.left << " " << rcItem.bottom << " "
                     << rcItem.Width() << " " << rcItem.Height() << " re f\n"
                     << "Q\n";
               sBody << "BT\n"
                     << CPVT_GenerateAP::GenerateColorAP(
-                           CPVT_Color(CPVT_Color::kGray, 1),
-                           PaintOperation::FILL)
+                           CFX_Color(CFX_Color::kGray, 1), PaintOperation::FILL)
                     << CPVT_GenerateAP::GenerateEditAP(&map, vt.GetIterator(),
                                                        CFX_PointF(0.0f, fy),
                                                        true, 0)
@@ -461,10 +459,10 @@
 }
 
 ByteString GetColorStringWithDefault(CPDF_Array* pColor,
-                                     const CPVT_Color& crDefaultColor,
+                                     const CFX_Color& crDefaultColor,
                                      PaintOperation nOperation) {
   if (pColor) {
-    CPVT_Color color = CPVT_Color::ParseColor(*pColor);
+    CFX_Color color = CFX_Color::ParseColor(*pColor);
     return CPVT_GenerateAP::GenerateColorAP(color, nOperation);
   }
 
@@ -546,7 +544,7 @@
   std::ostringstream sAppStream;
   sAppStream << "BT\n"
              << CPVT_GenerateAP::GenerateColorAP(
-                    CPVT_Color(CPVT_Color::kRGB, 0, 0, 0), PaintOperation::FILL)
+                    CFX_Color(CFX_Color::kRGB, 0, 0, 0), PaintOperation::FILL)
              << sContent << "ET\n"
              << "Q\n";
   return ByteString(sAppStream);
@@ -577,9 +575,9 @@
 ByteString GenerateTextSymbolAP(const CFX_FloatRect& rect) {
   std::ostringstream sAppStream;
   sAppStream << CPVT_GenerateAP::GenerateColorAP(
-      CPVT_Color(CPVT_Color::kRGB, 1, 1, 0), PaintOperation::FILL);
+      CFX_Color(CFX_Color::kRGB, 1, 1, 0), PaintOperation::FILL);
   sAppStream << CPVT_GenerateAP::GenerateColorAP(
-      CPVT_Color(CPVT_Color::kRGB, 0, 0, 0), PaintOperation::STROKE);
+      CFX_Color(CFX_Color::kRGB, 0, 0, 0), PaintOperation::STROKE);
 
   const float fBorderWidth = 1;
   sAppStream << fBorderWidth << " w\n";
@@ -687,12 +685,11 @@
   sAppStream << "/" << sExtGSDictName << " gs ";
 
   CPDF_Array* pInteriorColor = pAnnotDict->GetArrayFor("IC");
-  sAppStream << GetColorStringWithDefault(pInteriorColor,
-                                          CPVT_Color(CPVT_Color::kTransparent),
-                                          PaintOperation::FILL);
+  sAppStream << GetColorStringWithDefault(
+      pInteriorColor, CFX_Color(CFX_Color::kTransparent), PaintOperation::FILL);
 
   sAppStream << GetColorStringWithDefault(pAnnotDict->GetArrayFor("C"),
-                                          CPVT_Color(CPVT_Color::kRGB, 0, 0, 0),
+                                          CFX_Color(CFX_Color::kRGB, 0, 0, 0),
                                           PaintOperation::STROKE);
 
   float fBorderWidth = GetBorderWidth(*pAnnotDict);
@@ -761,7 +758,7 @@
   sAppStream << "/" << sExtGSDictName << " gs ";
 
   sAppStream << GetColorStringWithDefault(pAnnotDict->GetArrayFor("C"),
-                                          CPVT_Color(CPVT_Color::kRGB, 1, 1, 0),
+                                          CFX_Color(CFX_Color::kRGB, 1, 1, 0),
                                           PaintOperation::FILL);
 
   CFX_FloatRect rect = CPDF_Annot::RectFromQuadPoints(pAnnotDict);
@@ -799,7 +796,7 @@
   sAppStream << "/" << sExtGSDictName << " gs ";
 
   sAppStream << GetColorStringWithDefault(pAnnotDict->GetArrayFor("C"),
-                                          CPVT_Color(CPVT_Color::kRGB, 0, 0, 0),
+                                          CFX_Color(CFX_Color::kRGB, 0, 0, 0),
                                           PaintOperation::STROKE);
 
   sAppStream << fBorderWidth << " w ";
@@ -866,7 +863,7 @@
   sAppStream << "/" << sExtGSDictName << " gs ";
 
   sAppStream << GetColorStringWithDefault(pAnnotDict->GetArrayFor("C"),
-                                          CPVT_Color(CPVT_Color::kRGB, 0, 0, 0),
+                                          CFX_Color(CFX_Color::kRGB, 0, 0, 0),
                                           PaintOperation::STROKE);
 
   CFX_FloatRect rect = CPDF_Annot::RectFromQuadPoints(pAnnotDict);
@@ -892,9 +889,9 @@
   ByteString sExtGSDictName = "GS";
   sAppStream << "/" << sExtGSDictName << " gs\n";
 
-  sAppStream << GenerateColorAP(CPVT_Color(CPVT_Color::kRGB, 1, 1, 0),
+  sAppStream << GenerateColorAP(CFX_Color(CFX_Color::kRGB, 1, 1, 0),
                                 PaintOperation::FILL);
-  sAppStream << GenerateColorAP(CPVT_Color(CPVT_Color::kRGB, 0, 0, 0),
+  sAppStream << GenerateColorAP(CFX_Color(CFX_Color::kRGB, 0, 0, 0),
                                 PaintOperation::STROKE);
 
   const float fBorderWidth = 1;
@@ -931,12 +928,11 @@
   sAppStream << "/" << sExtGSDictName << " gs ";
 
   CPDF_Array* pInteriorColor = pAnnotDict->GetArrayFor("IC");
-  sAppStream << GetColorStringWithDefault(pInteriorColor,
-                                          CPVT_Color(CPVT_Color::kTransparent),
-                                          PaintOperation::FILL);
+  sAppStream << GetColorStringWithDefault(
+      pInteriorColor, CFX_Color(CFX_Color::kTransparent), PaintOperation::FILL);
 
   sAppStream << GetColorStringWithDefault(pAnnotDict->GetArrayFor("C"),
-                                          CPVT_Color(CPVT_Color::kRGB, 0, 0, 0),
+                                          CFX_Color(CFX_Color::kRGB, 0, 0, 0),
                                           PaintOperation::STROKE);
 
   float fBorderWidth = GetBorderWidth(*pAnnotDict);
@@ -979,7 +975,7 @@
   sAppStream << "/" << sExtGSDictName << " gs ";
 
   sAppStream << GetColorStringWithDefault(pAnnotDict->GetArrayFor("C"),
-                                          CPVT_Color(CPVT_Color::kRGB, 0, 0, 0),
+                                          CFX_Color(CFX_Color::kRGB, 0, 0, 0),
                                           PaintOperation::STROKE);
 
   CFX_FloatRect rect = CPDF_Annot::RectFromQuadPoints(pAnnotDict);
@@ -1028,7 +1024,7 @@
   sAppStream << "/" << sExtGSDictName << " gs ";
 
   sAppStream << GetColorStringWithDefault(pAnnotDict->GetArrayFor("C"),
-                                          CPVT_Color(CPVT_Color::kRGB, 0, 0, 0),
+                                          CFX_Color(CFX_Color::kRGB, 0, 0, 0),
                                           PaintOperation::STROKE);
 
   CFX_FloatRect rect = CPDF_Annot::RectFromQuadPoints(pAnnotDict);
@@ -1135,9 +1131,9 @@
 // Static.
 ByteString CPVT_GenerateAP::GenerateBorderAP(const CFX_FloatRect& rect,
                                              float fWidth,
-                                             const CPVT_Color& color,
-                                             const CPVT_Color& crLeftTop,
-                                             const CPVT_Color& crRightBottom,
+                                             const CFX_Color& color,
+                                             const CFX_Color& crLeftTop,
+                                             const CFX_Color& crRightBottom,
                                              BorderStyle nStyle,
                                              const CPVT_Dash& dash) {
   std::ostringstream sAppStream;
@@ -1240,28 +1236,28 @@
 }
 
 // Static.
-ByteString CPVT_GenerateAP::GenerateColorAP(const CPVT_Color& color,
+ByteString CPVT_GenerateAP::GenerateColorAP(const CFX_Color& color,
                                             PaintOperation nOperation) {
   std::ostringstream sColorStream;
   switch (color.nColorType) {
-    case CPVT_Color::kRGB:
+    case CFX_Color::kRGB:
       sColorStream << color.fColor1 << " " << color.fColor2 << " "
                    << color.fColor3 << " "
                    << (nOperation == PaintOperation::STROKE ? "RG" : "rg")
                    << "\n";
       break;
-    case CPVT_Color::kGray:
+    case CFX_Color::kGray:
       sColorStream << color.fColor1 << " "
                    << (nOperation == PaintOperation::STROKE ? "G" : "g")
                    << "\n";
       break;
-    case CPVT_Color::kCMYK:
+    case CFX_Color::kCMYK:
       sColorStream << color.fColor1 << " " << color.fColor2 << " "
                    << color.fColor3 << " " << color.fColor4 << " "
                    << (nOperation == PaintOperation::STROKE ? "K" : "k")
                    << "\n";
       break;
-    case CPVT_Color::kTransparent:
+    case CFX_Color::kTransparent:
       break;
   }
   return ByteString(sColorStream);
diff --git a/core/fpdfdoc/cpvt_generateap.h b/core/fpdfdoc/cpvt_generateap.h
index 2812b29..31962e2 100644
--- a/core/fpdfdoc/cpvt_generateap.h
+++ b/core/fpdfdoc/cpvt_generateap.h
@@ -11,11 +11,11 @@
 
 #include "core/fpdfdoc/cpdf_defaultappearance.h"
 #include "core/fpdfdoc/cpdf_variabletext.h"
-#include "core/fpdfdoc/cpvt_color.h"
 #include "core/fpdfdoc/cpvt_dash.h"
 #include "core/fxcrt/fx_coordinates.h"
 #include "core/fxcrt/fx_string.h"
 #include "core/fxcrt/fx_system.h"
+#include "core/fxge/cfx_color.h"
 
 class CPDF_Dictionary;
 class CPDF_Document;
@@ -55,12 +55,12 @@
                                    uint16_t SubWord);
   static ByteString GenerateBorderAP(const CFX_FloatRect& rect,
                                      float fWidth,
-                                     const CPVT_Color& color,
-                                     const CPVT_Color& crLeftTop,
-                                     const CPVT_Color& crRightBottom,
+                                     const CFX_Color& color,
+                                     const CFX_Color& crLeftTop,
+                                     const CFX_Color& crRightBottom,
                                      BorderStyle nStyle,
                                      const CPVT_Dash& dash);
-  static ByteString GenerateColorAP(const CPVT_Color& color,
+  static ByteString GenerateColorAP(const CFX_Color& color,
                                     PaintOperation nOperation);
   static std::unique_ptr<CPDF_Dictionary> GenerateExtGStateDict(
       const CPDF_Dictionary& pAnnotDict,
diff --git a/core/fxge/cfx_color.cpp b/core/fxge/cfx_color.cpp
index eebdd2c..42ab39d 100644
--- a/core/fxge/cfx_color.cpp
+++ b/core/fxge/cfx_color.cpp
@@ -8,6 +8,9 @@
 
 #include <algorithm>
 
+#include "core/fpdfapi/parser/cpdf_array.h"
+#include "core/fpdfapi/parser/cpdf_simple_parser.h"
+
 namespace {
 
 bool InRange(float comp) {
@@ -16,86 +19,127 @@
 
 CFX_Color ConvertCMYK2GRAY(float dC, float dM, float dY, float dK) {
   if (!InRange(dC) || !InRange(dM) || !InRange(dY) || !InRange(dK))
-    return CFX_Color(COLORTYPE_GRAY);
+    return CFX_Color(CFX_Color::kGray);
   return CFX_Color(
-      COLORTYPE_GRAY,
+      CFX_Color::kGray,
       1.0f - std::min(1.0f, 0.3f * dC + 0.59f * dM + 0.11f * dY + dK));
 }
 
 CFX_Color ConvertGRAY2CMYK(float dGray) {
   if (!InRange(dGray))
-    return CFX_Color(COLORTYPE_CMYK);
-  return CFX_Color(COLORTYPE_CMYK, 0.0f, 0.0f, 0.0f, 1.0f - dGray);
+    return CFX_Color(CFX_Color::kCMYK);
+  return CFX_Color(CFX_Color::kCMYK, 0.0f, 0.0f, 0.0f, 1.0f - dGray);
 }
 
 CFX_Color ConvertGRAY2RGB(float dGray) {
   if (!InRange(dGray))
-    return CFX_Color(COLORTYPE_RGB);
-  return CFX_Color(COLORTYPE_RGB, dGray, dGray, dGray);
+    return CFX_Color(CFX_Color::kRGB);
+  return CFX_Color(CFX_Color::kRGB, dGray, dGray, dGray);
 }
 
 CFX_Color ConvertRGB2GRAY(float dR, float dG, float dB) {
   if (!InRange(dR) || !InRange(dG) || !InRange(dB))
-    return CFX_Color(COLORTYPE_GRAY);
-  return CFX_Color(COLORTYPE_GRAY, 0.3f * dR + 0.59f * dG + 0.11f * dB);
+    return CFX_Color(CFX_Color::kGray);
+  return CFX_Color(CFX_Color::kGray, 0.3f * dR + 0.59f * dG + 0.11f * dB);
 }
 
 CFX_Color ConvertCMYK2RGB(float dC, float dM, float dY, float dK) {
   if (!InRange(dC) || !InRange(dM) || !InRange(dY) || !InRange(dK))
-    return CFX_Color(COLORTYPE_RGB);
-  return CFX_Color(COLORTYPE_RGB, 1.0f - std::min(1.0f, dC + dK),
+    return CFX_Color(CFX_Color::kRGB);
+  return CFX_Color(CFX_Color::kRGB, 1.0f - std::min(1.0f, dC + dK),
                    1.0f - std::min(1.0f, dM + dK),
                    1.0f - std::min(1.0f, dY + dK));
 }
 
 CFX_Color ConvertRGB2CMYK(float dR, float dG, float dB) {
   if (!InRange(dR) || !InRange(dG) || !InRange(dB))
-    return CFX_Color(COLORTYPE_CMYK);
+    return CFX_Color(CFX_Color::kCMYK);
 
   float c = 1.0f - dR;
   float m = 1.0f - dG;
   float y = 1.0f - dB;
-  return CFX_Color(COLORTYPE_CMYK, c, m, y, std::min(c, std::min(m, y)));
+  return CFX_Color(CFX_Color::kCMYK, c, m, y, std::min(c, std::min(m, y)));
 }
 
 }  // namespace
 
+// Static.
+CFX_Color CFX_Color::ParseColor(const CPDF_Array& array) {
+  CFX_Color rt;
+  switch (array.GetCount()) {
+    case 1:
+      rt = CFX_Color(CFX_Color::kGray, array.GetFloatAt(0));
+      break;
+    case 3:
+      rt = CFX_Color(CFX_Color::kRGB, array.GetFloatAt(0), array.GetFloatAt(1),
+                     array.GetFloatAt(2));
+      break;
+    case 4:
+      rt = CFX_Color(CFX_Color::kCMYK, array.GetFloatAt(0), array.GetFloatAt(1),
+                     array.GetFloatAt(2), array.GetFloatAt(3));
+      break;
+  }
+  return rt;
+}
+
+// Static.
+CFX_Color CFX_Color::ParseColor(const ByteString& str) {
+  CPDF_SimpleParser syntax(str.AsStringView());
+  if (syntax.FindTagParamFromStart("g", 1))
+    return CFX_Color(CFX_Color::kGray, FX_atof(syntax.GetWord()));
+
+  if (syntax.FindTagParamFromStart("rg", 3)) {
+    float f1 = FX_atof(syntax.GetWord());
+    float f2 = FX_atof(syntax.GetWord());
+    float f3 = FX_atof(syntax.GetWord());
+    return CFX_Color(CFX_Color::kRGB, f1, f2, f3);
+  }
+  if (syntax.FindTagParamFromStart("k", 4)) {
+    float f1 = FX_atof(syntax.GetWord());
+    float f2 = FX_atof(syntax.GetWord());
+    float f3 = FX_atof(syntax.GetWord());
+    float f4 = FX_atof(syntax.GetWord());
+    return CFX_Color(CFX_Color::kCMYK, f1, f2, f3, f4);
+  }
+  return CFX_Color(CFX_Color::kTransparent);
+}
+
 CFX_Color CFX_Color::ConvertColorType(int32_t nConvertColorType) const {
   if (nColorType == nConvertColorType)
     return *this;
 
   CFX_Color ret;
   switch (nColorType) {
-    case COLORTYPE_TRANSPARENT:
+    case CFX_Color::kTransparent:
       ret = *this;
-      ret.nColorType = COLORTYPE_TRANSPARENT;
+      ret.nColorType = CFX_Color::kTransparent;
       break;
-    case COLORTYPE_GRAY:
+    case CFX_Color::kGray:
       switch (nConvertColorType) {
-        case COLORTYPE_RGB:
+        case CFX_Color::kRGB:
           ret = ConvertGRAY2RGB(fColor1);
           break;
-        case COLORTYPE_CMYK:
+        case CFX_Color::kCMYK:
           ret = ConvertGRAY2CMYK(fColor1);
           break;
       }
       break;
-    case COLORTYPE_RGB:
+    case CFX_Color::kRGB:
       switch (nConvertColorType) {
-        case COLORTYPE_GRAY:
+        case CFX_Color::kGray:
           ret = ConvertRGB2GRAY(fColor1, fColor2, fColor3);
           break;
-        case COLORTYPE_CMYK:
+        case CFX_Color::kCMYK:
           ret = ConvertRGB2CMYK(fColor1, fColor2, fColor3);
           break;
       }
       break;
-    case COLORTYPE_CMYK:
+    case CFX_Color::kCMYK:
       switch (nConvertColorType) {
-        case COLORTYPE_GRAY:
+        case CFX_Color::kGray:
           ret = ConvertCMYK2GRAY(fColor1, fColor2, fColor3, fColor4);
           break;
-        case COLORTYPE_RGB:
+        case CFX_Color::kRGB:
           ret = ConvertCMYK2RGB(fColor1, fColor2, fColor3, fColor4);
           break;
       }
@@ -107,21 +151,21 @@
 FX_COLORREF CFX_Color::ToFXColor(int32_t nTransparency) const {
   CFX_Color ret;
   switch (nColorType) {
-    case COLORTYPE_TRANSPARENT: {
-      ret = CFX_Color(COLORTYPE_TRANSPARENT, 0, 0, 0, 0);
+    case CFX_Color::kTransparent: {
+      ret = CFX_Color(CFX_Color::kTransparent, 0, 0, 0, 0);
       break;
     }
-    case COLORTYPE_GRAY: {
+    case CFX_Color::kGray: {
       ret = ConvertGRAY2RGB(fColor1);
       ret.fColor4 = nTransparency;
       break;
     }
-    case COLORTYPE_RGB: {
-      ret = CFX_Color(COLORTYPE_RGB, fColor1, fColor2, fColor3);
+    case CFX_Color::kRGB: {
+      ret = CFX_Color(CFX_Color::kRGB, fColor1, fColor2, fColor3);
       ret.fColor4 = nTransparency;
       break;
     }
-    case COLORTYPE_CMYK: {
+    case CFX_Color::kCMYK: {
       ret = ConvertCMYK2RGB(fColor1, fColor2, fColor3, fColor4);
       ret.fColor4 = nTransparency;
       break;
@@ -135,15 +179,15 @@
 CFX_Color CFX_Color::operator-(float fColorSub) const {
   CFX_Color sRet(nColorType);
   switch (nColorType) {
-    case COLORTYPE_TRANSPARENT:
-      sRet.nColorType = COLORTYPE_RGB;
+    case CFX_Color::kTransparent:
+      sRet.nColorType = CFX_Color::kRGB;
       sRet.fColor1 = std::max(1.0f - fColorSub, 0.0f);
       sRet.fColor2 = std::max(1.0f - fColorSub, 0.0f);
       sRet.fColor3 = std::max(1.0f - fColorSub, 0.0f);
       break;
-    case COLORTYPE_RGB:
-    case COLORTYPE_GRAY:
-    case COLORTYPE_CMYK:
+    case CFX_Color::kRGB:
+    case CFX_Color::kGray:
+    case CFX_Color::kCMYK:
       sRet.fColor1 = std::max(fColor1 - fColorSub, 0.0f);
       sRet.fColor2 = std::max(fColor2 - fColorSub, 0.0f);
       sRet.fColor3 = std::max(fColor3 - fColorSub, 0.0f);
@@ -156,15 +200,15 @@
 CFX_Color CFX_Color::operator/(float fColorDivide) const {
   CFX_Color sRet(nColorType);
   switch (nColorType) {
-    case COLORTYPE_TRANSPARENT:
-      sRet.nColorType = COLORTYPE_RGB;
+    case CFX_Color::kTransparent:
+      sRet.nColorType = CFX_Color::kRGB;
       sRet.fColor1 = 1.0f / fColorDivide;
       sRet.fColor2 = 1.0f / fColorDivide;
       sRet.fColor3 = 1.0f / fColorDivide;
       break;
-    case COLORTYPE_RGB:
-    case COLORTYPE_GRAY:
-    case COLORTYPE_CMYK:
+    case CFX_Color::kRGB:
+    case CFX_Color::kGray:
+    case CFX_Color::kCMYK:
       sRet = *this;
       sRet.fColor1 /= fColorDivide;
       sRet.fColor2 /= fColorDivide;
diff --git a/core/fxge/cfx_color.h b/core/fxge/cfx_color.h
index b92c0bc..413c0a4 100644
--- a/core/fxge/cfx_color.h
+++ b/core/fxge/cfx_color.h
@@ -11,10 +11,15 @@
 #include "core/fxge/fx_dib.h"
 
 struct CFX_Color {
+  static CFX_Color ParseColor(const CPDF_Array& array);
+  static CFX_Color ParseColor(const ByteString& str);
+
+  enum Type { kTransparent = 0, kGray, kRGB, kCMYK };
+
   explicit CFX_Color(FX_COLORREF ref)
       : CFX_Color(FXARGB_R(ref), FXARGB_G(ref), FXARGB_B(ref)) {}
 
-  CFX_Color(int32_t type = COLORTYPE_TRANSPARENT,
+  CFX_Color(int32_t type = CFX_Color::kTransparent,
             float color1 = 0.0f,
             float color2 = 0.0f,
             float color3 = 0.0f,
@@ -26,7 +31,7 @@
         fColor4(color4) {}
 
   CFX_Color(int32_t r, int32_t g, int32_t b)
-      : nColorType(COLORTYPE_RGB),
+      : nColorType(CFX_Color::kRGB),
         fColor1(r / 255.0f),
         fColor2(g / 255.0f),
         fColor3(b / 255.0f),
@@ -40,7 +45,7 @@
   FX_COLORREF ToFXColor(int32_t nTransparency) const;
 
   void Reset() {
-    nColorType = COLORTYPE_TRANSPARENT;
+    nColorType = CFX_Color::kTransparent;
     fColor1 = 0.0f;
     fColor2 = 0.0f;
     fColor3 = 0.0f;
diff --git a/fpdfsdk/cpdfsdk_widget.cpp b/fpdfsdk/cpdfsdk_widget.cpp
index a859dcd..c8bd4ea 100644
--- a/fpdfsdk/cpdfsdk_widget.cpp
+++ b/fpdfsdk/cpdfsdk_widget.cpp
@@ -562,14 +562,14 @@
   CPDF_FormControl* pFormCtrl = GetFormControl();
   int iColorType = 0;
   color = ARGBToColorRef(pFormCtrl->GetBackgroundColor(iColorType));
-  return iColorType != COLORTYPE_TRANSPARENT;
+  return iColorType != CFX_Color::kTransparent;
 }
 
 bool CPDFSDK_Widget::GetBorderColor(FX_COLORREF& color) const {
   CPDF_FormControl* pFormCtrl = GetFormControl();
   int iColorType = 0;
   color = ARGBToColorRef(pFormCtrl->GetBorderColor(iColorType));
-  return iColorType != COLORTYPE_TRANSPARENT;
+  return iColorType != CFX_Color::kTransparent;
 }
 
 bool CPDFSDK_Widget::GetTextColor(FX_COLORREF& color) const {
@@ -579,10 +579,10 @@
     return false;
 
   FX_ARGB argb;
-  int iColorType = COLORTYPE_TRANSPARENT;
+  int iColorType = CFX_Color::kTransparent;
   da.GetColor(argb, iColorType);
   color = ARGBToColorRef(argb);
-  return iColorType != COLORTYPE_TRANSPARENT;
+  return iColorType != CFX_Color::kTransparent;
 }
 
 float CPDFSDK_Widget::GetFontSize() const {
@@ -919,7 +919,7 @@
 }
 
 CFX_Color CPDFSDK_Widget::GetTextPWLColor() const {
-  CFX_Color crText = CFX_Color(COLORTYPE_GRAY, 0);
+  CFX_Color crText = CFX_Color(CFX_Color::kGray, 0);
 
   CPDF_FormControl* pFormCtrl = GetFormControl();
   CPDF_DefaultAppearance da = pFormCtrl->GetDefaultAppearance();
diff --git a/fpdfsdk/formfiller/cffl_formfiller.cpp b/fpdfsdk/formfiller/cffl_formfiller.cpp
index 8f48c02..f86cb68 100644
--- a/fpdfsdk/formfiller/cffl_formfiller.cpp
+++ b/fpdfsdk/formfiller/cffl_formfiller.cpp
@@ -301,7 +301,7 @@
   if (m_pWidget->GetBorderColor(color))
     cp.sBorderColor = CFX_Color(color);
 
-  cp.sTextColor = CFX_Color(COLORTYPE_GRAY, 0);
+  cp.sTextColor = CFX_Color(CFX_Color::kGray, 0);
 
   if (m_pWidget->GetTextColor(color))
     cp.sTextColor = CFX_Color(color);
diff --git a/fpdfsdk/fpdfannot.cpp b/fpdfsdk/fpdfannot.cpp
index 3125ad1..a671032 100644
--- a/fpdfsdk/fpdfannot.cpp
+++ b/fpdfsdk/fpdfannot.cpp
@@ -20,8 +20,8 @@
 #include "core/fpdfdoc/cpdf_annot.h"
 #include "core/fpdfdoc/cpdf_formfield.h"
 #include "core/fpdfdoc/cpdf_interform.h"
-#include "core/fpdfdoc/cpvt_color.h"
 #include "core/fpdfdoc/cpvt_generateap.h"
+#include "core/fxge/cfx_color.h"
 #include "fpdfsdk/fsdk_define.h"
 
 namespace {
@@ -536,24 +536,25 @@
     }
     return true;
   }
-  CPVT_Color color = CPVT_Color::ParseColor(*pColor);
+
+  CFX_Color color = CFX_Color::ParseColor(*pColor);
   switch (color.nColorType) {
-    case CPVT_Color::kRGB:
+    case CFX_Color::kRGB:
       *R = color.fColor1 * 255.f;
       *G = color.fColor2 * 255.f;
       *B = color.fColor3 * 255.f;
       break;
-    case CPVT_Color::kGray:
+    case CFX_Color::kGray:
       *R = 255.f * color.fColor1;
       *G = 255.f * color.fColor1;
       *B = 255.f * color.fColor1;
       break;
-    case CPVT_Color::kCMYK:
+    case CFX_Color::kCMYK:
       *R = 255.f * (1 - color.fColor1) * (1 - color.fColor4);
       *G = 255.f * (1 - color.fColor2) * (1 - color.fColor4);
       *B = 255.f * (1 - color.fColor3) * (1 - color.fColor4);
       break;
-    case CPVT_Color::kTransparent:
+    case CFX_Color::kTransparent:
       *R = 0;
       *G = 0;
       *B = 0;
diff --git a/fpdfsdk/javascript/Field.cpp b/fpdfsdk/javascript/Field.cpp
index da0e60c..4e40e6f 100644
--- a/fpdfsdk/javascript/Field.cpp
+++ b/fpdfsdk/javascript/Field.cpp
@@ -1453,19 +1453,19 @@
   pFormControl->GetBackgroundColor(iColorType);
 
   CFX_Color color;
-  if (iColorType == COLORTYPE_TRANSPARENT) {
-    color = CFX_Color(COLORTYPE_TRANSPARENT);
-  } else if (iColorType == COLORTYPE_GRAY) {
+  if (iColorType == CFX_Color::kTransparent) {
+    color = CFX_Color(CFX_Color::kTransparent);
+  } else if (iColorType == CFX_Color::kGray) {
+    color = CFX_Color(CFX_Color::kGray,
+                      pFormControl->GetOriginalBackgroundColor(0));
+  } else if (iColorType == CFX_Color::kRGB) {
     color =
-        CFX_Color(COLORTYPE_GRAY, pFormControl->GetOriginalBackgroundColor(0));
-  } else if (iColorType == COLORTYPE_RGB) {
-    color =
-        CFX_Color(COLORTYPE_RGB, pFormControl->GetOriginalBackgroundColor(0),
+        CFX_Color(CFX_Color::kRGB, pFormControl->GetOriginalBackgroundColor(0),
                   pFormControl->GetOriginalBackgroundColor(1),
                   pFormControl->GetOriginalBackgroundColor(2));
-  } else if (iColorType == COLORTYPE_CMYK) {
+  } else if (iColorType == CFX_Color::kCMYK) {
     color =
-        CFX_Color(COLORTYPE_CMYK, pFormControl->GetOriginalBackgroundColor(0),
+        CFX_Color(CFX_Color::kCMYK, pFormControl->GetOriginalBackgroundColor(0),
                   pFormControl->GetOriginalBackgroundColor(1),
                   pFormControl->GetOriginalBackgroundColor(2),
                   pFormControl->GetOriginalBackgroundColor(3));
@@ -2227,16 +2227,17 @@
   pFormControl->GetBorderColor(iColorType);
 
   CFX_Color color;
-  if (iColorType == COLORTYPE_TRANSPARENT) {
-    color = CFX_Color(COLORTYPE_TRANSPARENT);
-  } else if (iColorType == COLORTYPE_GRAY) {
-    color = CFX_Color(COLORTYPE_GRAY, pFormControl->GetOriginalBorderColor(0));
-  } else if (iColorType == COLORTYPE_RGB) {
-    color = CFX_Color(COLORTYPE_RGB, pFormControl->GetOriginalBorderColor(0),
+  if (iColorType == CFX_Color::kTransparent) {
+    color = CFX_Color(CFX_Color::kTransparent);
+  } else if (iColorType == CFX_Color::kGray) {
+    color =
+        CFX_Color(CFX_Color::kGray, pFormControl->GetOriginalBorderColor(0));
+  } else if (iColorType == CFX_Color::kRGB) {
+    color = CFX_Color(CFX_Color::kRGB, pFormControl->GetOriginalBorderColor(0),
                       pFormControl->GetOriginalBorderColor(1),
                       pFormControl->GetOriginalBorderColor(2));
-  } else if (iColorType == COLORTYPE_CMYK) {
-    color = CFX_Color(COLORTYPE_CMYK, pFormControl->GetOriginalBorderColor(0),
+  } else if (iColorType == CFX_Color::kCMYK) {
+    color = CFX_Color(CFX_Color::kCMYK, pFormControl->GetOriginalBorderColor(0),
                       pFormControl->GetOriginalBorderColor(1),
                       pFormControl->GetOriginalBorderColor(2),
                       pFormControl->GetOriginalBorderColor(3));
@@ -2375,10 +2376,10 @@
   std::tie(a, r, g, b) = ArgbDecode(color);
 
   CFX_Color crRet =
-      CFX_Color(COLORTYPE_RGB, r / 255.0f, g / 255.0f, b / 255.0f);
+      CFX_Color(CFX_Color::kRGB, r / 255.0f, g / 255.0f, b / 255.0f);
 
-  if (iColorType == COLORTYPE_TRANSPARENT)
-    crRet = CFX_Color(COLORTYPE_TRANSPARENT);
+  if (iColorType == CFX_Color::kTransparent)
+    crRet = CFX_Color(CFX_Color::kTransparent);
 
   color::ConvertPWLColorToArray(pRuntime, crRet, &crArray);
   vp << crArray;
diff --git a/fpdfsdk/javascript/color.cpp b/fpdfsdk/javascript/color.cpp
index 574c81a..db860d3 100644
--- a/fpdfsdk/javascript/color.cpp
+++ b/fpdfsdk/javascript/color.cpp
@@ -39,18 +39,18 @@
 IMPLEMENT_JS_CLASS(CJS_Color, color)
 
 color::color(CJS_Object* pJSObject) : CJS_EmbedObj(pJSObject) {
-  m_crTransparent = CFX_Color(COLORTYPE_TRANSPARENT);
-  m_crBlack = CFX_Color(COLORTYPE_GRAY, 0);
-  m_crWhite = CFX_Color(COLORTYPE_GRAY, 1);
-  m_crRed = CFX_Color(COLORTYPE_RGB, 1, 0, 0);
-  m_crGreen = CFX_Color(COLORTYPE_RGB, 0, 1, 0);
-  m_crBlue = CFX_Color(COLORTYPE_RGB, 0, 0, 1);
-  m_crCyan = CFX_Color(COLORTYPE_CMYK, 1, 0, 0, 0);
-  m_crMagenta = CFX_Color(COLORTYPE_CMYK, 0, 1, 0, 0);
-  m_crYellow = CFX_Color(COLORTYPE_CMYK, 0, 0, 1, 0);
-  m_crDKGray = CFX_Color(COLORTYPE_GRAY, 0.25);
-  m_crGray = CFX_Color(COLORTYPE_GRAY, 0.5);
-  m_crLTGray = CFX_Color(COLORTYPE_GRAY, 0.75);
+  m_crTransparent = CFX_Color(CFX_Color::kTransparent);
+  m_crBlack = CFX_Color(CFX_Color::kGray, 0);
+  m_crWhite = CFX_Color(CFX_Color::kGray, 1);
+  m_crRed = CFX_Color(CFX_Color::kRGB, 1, 0, 0);
+  m_crGreen = CFX_Color(CFX_Color::kRGB, 0, 1, 0);
+  m_crBlue = CFX_Color(CFX_Color::kRGB, 0, 0, 1);
+  m_crCyan = CFX_Color(CFX_Color::kCMYK, 1, 0, 0, 0);
+  m_crMagenta = CFX_Color(CFX_Color::kCMYK, 0, 1, 0, 0);
+  m_crYellow = CFX_Color(CFX_Color::kCMYK, 0, 0, 1, 0);
+  m_crDKGray = CFX_Color(CFX_Color::kGray, 0.25);
+  m_crGray = CFX_Color(CFX_Color::kGray, 0.5);
+  m_crLTGray = CFX_Color(CFX_Color::kGray, 0.75);
 }
 
 color::~color() {}
@@ -59,20 +59,20 @@
                                    const CFX_Color& color,
                                    CJS_Array* array) {
   switch (color.nColorType) {
-    case COLORTYPE_TRANSPARENT:
+    case CFX_Color::kTransparent:
       array->SetElement(pRuntime, 0, CJS_Value(pRuntime, "T"));
       break;
-    case COLORTYPE_GRAY:
+    case CFX_Color::kGray:
       array->SetElement(pRuntime, 0, CJS_Value(pRuntime, "G"));
       array->SetElement(pRuntime, 1, CJS_Value(pRuntime, color.fColor1));
       break;
-    case COLORTYPE_RGB:
+    case CFX_Color::kRGB:
       array->SetElement(pRuntime, 0, CJS_Value(pRuntime, "RGB"));
       array->SetElement(pRuntime, 1, CJS_Value(pRuntime, color.fColor1));
       array->SetElement(pRuntime, 2, CJS_Value(pRuntime, color.fColor2));
       array->SetElement(pRuntime, 3, CJS_Value(pRuntime, color.fColor3));
       break;
-    case COLORTYPE_CMYK:
+    case CFX_Color::kCMYK:
       array->SetElement(pRuntime, 0, CJS_Value(pRuntime, "CMYK"));
       array->SetElement(pRuntime, 1, CJS_Value(pRuntime, color.fColor1));
       array->SetElement(pRuntime, 2, CJS_Value(pRuntime, color.fColor2));
@@ -119,14 +119,14 @@
   }
 
   if (sSpace == "T") {
-    *color = CFX_Color(COLORTYPE_TRANSPARENT);
+    *color = CFX_Color(CFX_Color::kTransparent);
   } else if (sSpace == "G") {
-    *color = CFX_Color(COLORTYPE_GRAY, (float)d1);
+    *color = CFX_Color(CFX_Color::kGray, (float)d1);
   } else if (sSpace == "RGB") {
-    *color = CFX_Color(COLORTYPE_RGB, (float)d1, (float)d2, (float)d3);
+    *color = CFX_Color(CFX_Color::kRGB, (float)d1, (float)d2, (float)d3);
   } else if (sSpace == "CMYK") {
     *color =
-        CFX_Color(COLORTYPE_CMYK, (float)d1, (float)d2, (float)d3, (float)d4);
+        CFX_Color(CFX_Color::kCMYK, (float)d1, (float)d2, (float)d3, (float)d4);
   }
 }
 
@@ -226,16 +226,16 @@
   ConvertArrayToPWLColor(pRuntime, aSource, &crSource);
 
   ByteString sDestSpace = params[1].ToCFXByteString(pRuntime);
-  int nColorType = COLORTYPE_TRANSPARENT;
+  int nColorType = CFX_Color::kTransparent;
 
   if (sDestSpace == "T") {
-    nColorType = COLORTYPE_TRANSPARENT;
+    nColorType = CFX_Color::kTransparent;
   } else if (sDestSpace == "G") {
-    nColorType = COLORTYPE_GRAY;
+    nColorType = CFX_Color::kGray;
   } else if (sDestSpace == "RGB") {
-    nColorType = COLORTYPE_RGB;
+    nColorType = CFX_Color::kRGB;
   } else if (sDestSpace == "CMYK") {
-    nColorType = COLORTYPE_CMYK;
+    nColorType = CFX_Color::kCMYK;
   }
 
   CJS_Array aDest;
diff --git a/fpdfsdk/pwl/cpwl_appstream.cpp b/fpdfsdk/pwl/cpwl_appstream.cpp
index 7d7f172..27fa09b 100644
--- a/fpdfsdk/pwl/cpwl_appstream.cpp
+++ b/fpdfsdk/pwl/cpwl_appstream.cpp
@@ -104,19 +104,19 @@
   std::ostringstream sColorStream;
 
   switch (color.nColorType) {
-    case COLORTYPE_RGB:
+    case CFX_Color::kRGB:
       sColorStream << color.fColor1 << " " << color.fColor2 << " "
                    << color.fColor3 << " "
                    << (bFillOrStroke ? kSetRGBOperator : kSetRGBStrokedOperator)
                    << "\n";
       break;
-    case COLORTYPE_GRAY:
+    case CFX_Color::kGray:
       sColorStream << color.fColor1 << " "
                    << (bFillOrStroke ? kSetGrayOperator
                                      : kSetGrayStrokedOperator)
                    << "\n";
       break;
-    case COLORTYPE_CMYK:
+    case CFX_Color::kCMYK:
       sColorStream << color.fColor1 << " " << color.fColor2 << " "
                    << color.fColor3 << " " << color.fColor4 << " "
                    << (bFillOrStroke ? kSetCMYKOperator
@@ -1055,7 +1055,7 @@
   std::ostringstream sAppStream;
   {
     AutoClosedQCommand q(&sAppStream);
-    sAppStream << GetColorAppStream(CFX_Color(COLORTYPE_RGB, 220.0f / 255.0f,
+    sAppStream << GetColorAppStream(CFX_Color(CFX_Color::kRGB, 220.0f / 255.0f,
                                               220.0f / 255.0f, 220.0f / 255.0f),
                                     true)
                << rcBBox.left << " " << rcBBox.bottom << " "
@@ -1067,9 +1067,9 @@
   {
     AutoClosedQCommand q(&sAppStream);
     sAppStream << GetBorderAppStreamInternal(
-        rcBBox, 2, CFX_Color(COLORTYPE_GRAY, 0), CFX_Color(COLORTYPE_GRAY, 1),
-        CFX_Color(COLORTYPE_GRAY, 0.5), BorderStyle::BEVELED,
-        CPWL_Dash(3, 0, 0));
+        rcBBox, 2, CFX_Color(CFX_Color::kGray, 0),
+        CFX_Color(CFX_Color::kGray, 1), CFX_Color(CFX_Color::kGray, 0.5),
+        BorderStyle::BEVELED, CPWL_Dash(3, 0, 0));
   }
 
   CFX_PointF ptCenter = CFX_PointF((rcBBox.left + rcBBox.right) / 2,
@@ -1164,20 +1164,20 @@
       break;
     case BorderStyle::BEVELED:
       fBorderWidth *= 2;
-      crLeftTop = CFX_Color(COLORTYPE_GRAY, 1);
+      crLeftTop = CFX_Color(CFX_Color::kGray, 1);
       crRightBottom = crBackground / 2.0f;
       break;
     case BorderStyle::INSET:
       fBorderWidth *= 2;
-      crLeftTop = CFX_Color(COLORTYPE_GRAY, 0.5);
-      crRightBottom = CFX_Color(COLORTYPE_GRAY, 0.75);
+      crLeftTop = CFX_Color(CFX_Color::kGray, 0.5);
+      crRightBottom = CFX_Color(CFX_Color::kGray, 0.75);
       break;
     default:
       break;
   }
 
   CFX_FloatRect rcClient = rcWindow.GetDeflated(fBorderWidth, fBorderWidth);
-  CFX_Color crText(COLORTYPE_GRAY, 0);
+  CFX_Color crText(CFX_Color::kGray, 0);
   ByteString csNameTag;
   CPDF_DefaultAppearance da = pControl->GetDefaultAppearance();
   if (da.HasColor()) {
@@ -1287,8 +1287,8 @@
         break;
       }
       case BorderStyle::INSET: {
-        crLeftTop = CFX_Color(COLORTYPE_GRAY, 0);
-        crRightBottom = CFX_Color(COLORTYPE_GRAY, 1);
+        crLeftTop = CFX_Color(CFX_Color::kGray, 0);
+        crRightBottom = CFX_Color(CFX_Color::kGray, 1);
         break;
       }
       default:
@@ -1339,13 +1339,13 @@
       break;
     case BorderStyle::BEVELED:
       fBorderWidth *= 2;
-      crLeftTop = CFX_Color(COLORTYPE_GRAY, 1);
+      crLeftTop = CFX_Color(CFX_Color::kGray, 1);
       crRightBottom = crBackground / 2.0f;
       break;
     case BorderStyle::INSET:
       fBorderWidth *= 2;
-      crLeftTop = CFX_Color(COLORTYPE_GRAY, 0.5);
-      crRightBottom = CFX_Color(COLORTYPE_GRAY, 0.75);
+      crLeftTop = CFX_Color(CFX_Color::kGray, 0.5);
+      crRightBottom = CFX_Color(CFX_Color::kGray, 0.75);
       break;
     default:
       break;
@@ -1399,8 +1399,8 @@
       break;
     }
     case BorderStyle::INSET: {
-      crLeftTop = CFX_Color(COLORTYPE_GRAY, 0);
-      crRightBottom = CFX_Color(COLORTYPE_GRAY, 1);
+      crLeftTop = CFX_Color(CFX_Color::kGray, 0);
+      crRightBottom = CFX_Color(CFX_Color::kGray, 1);
       break;
     }
     default:
@@ -1455,13 +1455,13 @@
       break;
     case BorderStyle::BEVELED:
       fBorderWidth *= 2;
-      crLeftTop = CFX_Color(COLORTYPE_GRAY, 1);
+      crLeftTop = CFX_Color(CFX_Color::kGray, 1);
       crRightBottom = crBackground / 2.0f;
       break;
     case BorderStyle::INSET:
       fBorderWidth *= 2;
-      crLeftTop = CFX_Color(COLORTYPE_GRAY, 0.5);
-      crRightBottom = CFX_Color(COLORTYPE_GRAY, 0.75);
+      crLeftTop = CFX_Color(CFX_Color::kGray, 0.5);
+      crRightBottom = CFX_Color(CFX_Color::kGray, 0.75);
       break;
     default:
       break;
@@ -1504,11 +1504,11 @@
   CFX_FloatRect rcCenter = rcWindow.GetCenterSquare().GetDeflated(1.0f, 1.0f);
   if (nStyle == CheckStyle::kCircle) {
     if (nBorderStyle == BorderStyle::BEVELED) {
-      crLeftTop = CFX_Color(COLORTYPE_GRAY, 1);
+      crLeftTop = CFX_Color(CFX_Color::kGray, 1);
       crRightBottom = crBackground - 0.25f;
     } else if (nBorderStyle == BorderStyle::INSET) {
-      crLeftTop = CFX_Color(COLORTYPE_GRAY, 0.5f);
-      crRightBottom = CFX_Color(COLORTYPE_GRAY, 0.75f);
+      crLeftTop = CFX_Color(CFX_Color::kGray, 0.5f);
+      crRightBottom = CFX_Color(CFX_Color::kGray, 0.75f);
     }
 
     csAP_N_ON =
@@ -1532,8 +1532,8 @@
       break;
     }
     case BorderStyle::INSET: {
-      crLeftTop = CFX_Color(COLORTYPE_GRAY, 0);
-      crRightBottom = CFX_Color(COLORTYPE_GRAY, 1);
+      crLeftTop = CFX_Color(CFX_Color::kGray, 0);
+      crRightBottom = CFX_Color(CFX_Color::kGray, 1);
       break;
     }
     default:
@@ -1546,11 +1546,11 @@
     CFX_Color crBK = crBackground - 0.25f;
     if (nBorderStyle == BorderStyle::BEVELED) {
       crLeftTop = crBackground - 0.25f;
-      crRightBottom = CFX_Color(COLORTYPE_GRAY, 1);
+      crRightBottom = CFX_Color(CFX_Color::kGray, 1);
       crBK = crBackground;
     } else if (nBorderStyle == BorderStyle::INSET) {
-      crLeftTop = CFX_Color(COLORTYPE_GRAY, 0);
-      crRightBottom = CFX_Color(COLORTYPE_GRAY, 1);
+      crLeftTop = CFX_Color(CFX_Color::kGray, 0);
+      crRightBottom = CFX_Color(CFX_Color::kGray, 1);
     }
 
     csAP_D_ON =
@@ -1695,7 +1695,7 @@
           CFX_FloatRect(rcClient.left, fy - fItemHeight, rcClient.right, fy);
       {
         AutoClosedQCommand q(&sList);
-        sList << GetColorAppStream(CFX_Color(COLORTYPE_RGB, 0, 51.0f / 255.0f,
+        sList << GetColorAppStream(CFX_Color(CFX_Color::kRGB, 0, 51.0f / 255.0f,
                                              113.0f / 255.0f),
                                    true)
               << rcItem.left << " " << rcItem.bottom << " " << rcItem.Width()
@@ -1704,7 +1704,7 @@
       }
 
       AutoClosedCommand bt(&sList, kTextBeginOperator, kTextEndOperator);
-      sList << GetColorAppStream(CFX_Color(COLORTYPE_GRAY, 1), true)
+      sList << GetColorAppStream(CFX_Color(CFX_Color::kGray, 1), true)
             << GetEditAppStream(pEdit.get(), CFX_PointF(0.0f, fy), true, 0);
     } else {
       CFX_Color crText = widget_->GetTextPWLColor();
@@ -1953,7 +1953,7 @@
 
 ByteString CPWL_AppStream::GetBackgroundAppStream() const {
   CFX_Color crBackground = widget_->GetFillPWLColor();
-  if (crBackground.nColorType != COLORTYPE_TRANSPARENT)
+  if (crBackground.nColorType != CFX_Color::kTransparent)
     return GetRectFillAppStream(widget_->GetRotatedRect(), crBackground);
 
   return ByteString();
@@ -1976,13 +1976,13 @@
       break;
     case BorderStyle::BEVELED:
       fBorderWidth *= 2;
-      crLeftTop = CFX_Color(COLORTYPE_GRAY, 1);
+      crLeftTop = CFX_Color(CFX_Color::kGray, 1);
       crRightBottom = crBackground / 2.0f;
       break;
     case BorderStyle::INSET:
       fBorderWidth *= 2;
-      crLeftTop = CFX_Color(COLORTYPE_GRAY, 0.5);
-      crRightBottom = CFX_Color(COLORTYPE_GRAY, 0.75);
+      crLeftTop = CFX_Color(CFX_Color::kGray, 0.5);
+      crRightBottom = CFX_Color(CFX_Color::kGray, 0.75);
       break;
     default:
       break;
diff --git a/fpdfsdk/pwl/cpwl_combo_box.cpp b/fpdfsdk/pwl/cpwl_combo_box.cpp
index 92b0165..67d2d88 100644
--- a/fpdfsdk/pwl/cpwl_combo_box.cpp
+++ b/fpdfsdk/pwl/cpwl_combo_box.cpp
@@ -279,7 +279,7 @@
   CreateParams bcp = cp;
   bcp.pParentWnd = this;
   bcp.dwFlags = PWS_VISIBLE | PWS_CHILD | PWS_BORDER | PWS_BACKGROUND;
-  bcp.sBackgroundColor = CFX_Color(COLORTYPE_RGB, 220.0f / 255.0f,
+  bcp.sBackgroundColor = CFX_Color(CFX_Color::kRGB, 220.0f / 255.0f,
                                    220.0f / 255.0f, 220.0f / 255.0f);
   bcp.sBorderColor = PWL_DEFAULT_BLACKCOLOR;
   bcp.dwBorderWidth = 2;
@@ -309,10 +309,10 @@
   else
     lcp.fFontSize = cp.fFontSize;
 
-  if (cp.sBorderColor.nColorType == COLORTYPE_TRANSPARENT)
+  if (cp.sBorderColor.nColorType == CFX_Color::kTransparent)
     lcp.sBorderColor = PWL_DEFAULT_BLACKCOLOR;
 
-  if (cp.sBackgroundColor.nColorType == COLORTYPE_TRANSPARENT)
+  if (cp.sBackgroundColor.nColorType == CFX_Color::kTransparent)
     lcp.sBackgroundColor = PWL_DEFAULT_WHITECOLOR;
 
   m_pList->Create(lcp);
diff --git a/fpdfsdk/pwl/cpwl_scroll_bar.cpp b/fpdfsdk/pwl/cpwl_scroll_bar.cpp
index 58a8745..3ec9367 100644
--- a/fpdfsdk/pwl/cpwl_scroll_bar.cpp
+++ b/fpdfsdk/pwl/cpwl_scroll_bar.cpp
@@ -22,7 +22,7 @@
 
 }  // namespace
 
-#define PWL_DEFAULT_HEAVYGRAYCOLOR CFX_Color(COLORTYPE_GRAY, 0.50)
+#define PWL_DEFAULT_HEAVYGRAYCOLOR CFX_Color(CFX_Color::kGray, 0.50)
 
 PWL_FLOATRANGE::PWL_FLOATRANGE() {
   Default();
diff --git a/fpdfsdk/pwl/cpwl_wnd.cpp b/fpdfsdk/pwl/cpwl_wnd.cpp
index 124065c..ec605a3 100644
--- a/fpdfsdk/pwl/cpwl_wnd.cpp
+++ b/fpdfsdk/pwl/cpwl_wnd.cpp
@@ -716,9 +716,9 @@
 CFX_Color CPWL_Wnd::GetBorderLeftTopColor(BorderStyle nBorderStyle) const {
   switch (nBorderStyle) {
     case BorderStyle::BEVELED:
-      return CFX_Color(COLORTYPE_GRAY, 1);
+      return CFX_Color(CFX_Color::kGray, 1);
     case BorderStyle::INSET:
-      return CFX_Color(COLORTYPE_GRAY, 0.5f);
+      return CFX_Color(CFX_Color::kGray, 0.5f);
     default:
       return CFX_Color();
   }
@@ -729,7 +729,7 @@
     case BorderStyle::BEVELED:
       return GetBackgroundColor() / 2.0f;
     case BorderStyle::INSET:
-      return CFX_Color(COLORTYPE_GRAY, 0.75f);
+      return CFX_Color(CFX_Color::kGray, 0.75f);
     default:
       return CFX_Color();
   }
diff --git a/fpdfsdk/pwl/cpwl_wnd.h b/fpdfsdk/pwl/cpwl_wnd.h
index 38d4ce0..a9a434d 100644
--- a/fpdfsdk/pwl/cpwl_wnd.h
+++ b/fpdfsdk/pwl/cpwl_wnd.h
@@ -95,8 +95,8 @@
 
 #define PWL_SCROLLBAR_WIDTH 12.0f
 #define PWL_SCROLLBAR_TRANSPARENCY 150
-#define PWL_DEFAULT_BLACKCOLOR CFX_Color(COLORTYPE_GRAY, 0)
-#define PWL_DEFAULT_WHITECOLOR CFX_Color(COLORTYPE_GRAY, 1)
+#define PWL_DEFAULT_BLACKCOLOR CFX_Color(CFX_Color::kGray, 0)
+#define PWL_DEFAULT_WHITECOLOR CFX_Color(CFX_Color::kGray, 1)
 
 class CPWL_Wnd : public CPWL_TimerHandler, public Observable<CPWL_Wnd> {
  public:
