Make CFX_Color::Type an enum class

Avoid some stray int usage.

-- Also remove Reset(), uncalled.
-- Add copy-assign declaration.

Change-Id: I4595f7b8615a911b7d4d54efc4b2de5058afb1d1
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/80531
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfdoc/cpdf_apsettings.cpp b/core/fpdfdoc/cpdf_apsettings.cpp
index f709ecd..0374e93 100644
--- a/core/fpdfdoc/cpdf_apsettings.cpp
+++ b/core/fpdfdoc/cpdf_apsettings.cpp
@@ -29,22 +29,22 @@
 std::pair<CFX_Color::Type, FX_ARGB> CPDF_ApSettings::GetColorARGB(
     const ByteString& csEntry) const {
   if (!m_pDict)
-    return {CFX_Color::kTransparent, 0};
+    return {CFX_Color::Type::kTransparent, 0};
 
   CPDF_Array* pEntry = m_pDict->GetArrayFor(csEntry);
   if (!pEntry)
-    return {CFX_Color::kTransparent, 0};
+    return {CFX_Color::Type::kTransparent, 0};
 
   const size_t dwCount = pEntry->size();
   if (dwCount == 1) {
     const float g = pEntry->GetNumberAt(0) * 255;
-    return {CFX_Color::kGray, ArgbEncode(255, (int)g, (int)g, (int)g)};
+    return {CFX_Color::Type::kGray, ArgbEncode(255, (int)g, (int)g, (int)g)};
   }
   if (dwCount == 3) {
     float r = pEntry->GetNumberAt(0) * 255;
     float g = pEntry->GetNumberAt(1) * 255;
     float b = pEntry->GetNumberAt(2) * 255;
-    return {CFX_Color::kRGB, ArgbEncode(255, (int)r, (int)g, (int)b)};
+    return {CFX_Color::Type::kRGB, ArgbEncode(255, (int)r, (int)g, (int)b)};
   }
   if (dwCount == 4) {
     float c = pEntry->GetNumberAt(0);
@@ -54,9 +54,9 @@
     float r = (1.0f - std::min(1.0f, c + k)) * 255;
     float g = (1.0f - std::min(1.0f, m + k)) * 255;
     float b = (1.0f - std::min(1.0f, y + k)) * 255;
-    return {CFX_Color::kCMYK, ArgbEncode(255, (int)r, (int)g, (int)b)};
+    return {CFX_Color::Type::kCMYK, ArgbEncode(255, (int)r, (int)g, (int)b)};
   }
-  return {CFX_Color::kTransparent, 0};
+  return {CFX_Color::Type::kTransparent, 0};
 }
 
 float CPDF_ApSettings::GetOriginalColorComponent(
@@ -79,14 +79,14 @@
 
   size_t dwCount = pEntry->size();
   if (dwCount == 1) {
-    return CFX_Color(CFX_Color::kGray, pEntry->GetNumberAt(0));
+    return CFX_Color(CFX_Color::Type::kGray, pEntry->GetNumberAt(0));
   }
   if (dwCount == 3) {
-    return CFX_Color(CFX_Color::kRGB, pEntry->GetNumberAt(0),
+    return CFX_Color(CFX_Color::Type::kRGB, pEntry->GetNumberAt(0),
                      pEntry->GetNumberAt(1), pEntry->GetNumberAt(2));
   }
   if (dwCount == 4) {
-    return CFX_Color(CFX_Color::kCMYK, pEntry->GetNumberAt(0),
+    return CFX_Color(CFX_Color::Type::kCMYK, pEntry->GetNumberAt(0),
                      pEntry->GetNumberAt(1), pEntry->GetNumberAt(2),
                      pEntry->GetNumberAt(3));
   }
diff --git a/core/fpdfdoc/cpdf_color_utils.cpp b/core/fpdfdoc/cpdf_color_utils.cpp
index 6a7802c..6b79715 100644
--- a/core/fpdfdoc/cpdf_color_utils.cpp
+++ b/core/fpdfdoc/cpdf_color_utils.cpp
@@ -17,14 +17,14 @@
   CFX_Color rt;
   switch (array.size()) {
     case 1:
-      rt = CFX_Color(CFX_Color::kGray, array.GetNumberAt(0));
+      rt = CFX_Color(CFX_Color::Type::kGray, array.GetNumberAt(0));
       break;
     case 3:
-      rt = CFX_Color(CFX_Color::kRGB, array.GetNumberAt(0),
+      rt = CFX_Color(CFX_Color::Type::kRGB, array.GetNumberAt(0),
                      array.GetNumberAt(1), array.GetNumberAt(2));
       break;
     case 4:
-      rt = CFX_Color(CFX_Color::kCMYK, array.GetNumberAt(0),
+      rt = CFX_Color(CFX_Color::Type::kCMYK, array.GetNumberAt(0),
                      array.GetNumberAt(1), array.GetNumberAt(2),
                      array.GetNumberAt(3));
       break;
diff --git a/core/fpdfdoc/cpdf_defaultappearance.cpp b/core/fpdfdoc/cpdf_defaultappearance.cpp
index 1b83d13..b61758d 100644
--- a/core/fpdfdoc/cpdf_defaultappearance.cpp
+++ b/core/fpdfdoc/cpdf_defaultappearance.cpp
@@ -87,20 +87,20 @@
   CPDF_SimpleParser syntax(m_csDA.AsStringView().raw_span());
   if (FindTagParamFromStart(&syntax, "g", 1)) {
     fc[0] = StringToFloat(syntax.GetWord());
-    return CFX_Color(CFX_Color::kGray, fc[0]);
+    return CFX_Color(CFX_Color::Type::kGray, fc[0]);
   }
   if (FindTagParamFromStart(&syntax, "rg", 3)) {
     fc[0] = StringToFloat(syntax.GetWord());
     fc[1] = StringToFloat(syntax.GetWord());
     fc[2] = StringToFloat(syntax.GetWord());
-    return CFX_Color(CFX_Color::kRGB, fc[0], fc[1], fc[2]);
+    return CFX_Color(CFX_Color::Type::kRGB, fc[0], fc[1], fc[2]);
   }
   if (FindTagParamFromStart(&syntax, "k", 4)) {
     fc[0] = StringToFloat(syntax.GetWord());
     fc[1] = StringToFloat(syntax.GetWord());
     fc[2] = StringToFloat(syntax.GetWord());
     fc[3] = StringToFloat(syntax.GetWord());
-    return CFX_Color(CFX_Color::kCMYK, fc[0], fc[1], fc[2], fc[3]);
+    return CFX_Color(CFX_Color::Type::kCMYK, fc[0], fc[1], fc[2], fc[3]);
   }
   return {};
 }
@@ -112,26 +112,27 @@
     return pdfium::nullopt;
 
   const CFX_Color& color = maybe_color.value();
-  if (color.nColorType == CFX_Color::kGray) {
+  if (color.nColorType == CFX_Color::Type::kGray) {
     int g = static_cast<int>(color.fColor1 * 255 + 0.5f);
-    return std::pair<CFX_Color::Type, FX_ARGB>(CFX_Color::kGray,
+    return std::pair<CFX_Color::Type, FX_ARGB>(CFX_Color::Type::kGray,
                                                ArgbEncode(255, g, g, g));
   }
-  if (color.nColorType == CFX_Color::kRGB) {
+  if (color.nColorType == CFX_Color::Type::kRGB) {
     int r = static_cast<int>(color.fColor1 * 255 + 0.5f);
     int g = static_cast<int>(color.fColor2 * 255 + 0.5f);
     int b = static_cast<int>(color.fColor3 * 255 + 0.5f);
-    return std::pair<CFX_Color::Type, FX_ARGB>(CFX_Color::kRGB,
+    return std::pair<CFX_Color::Type, FX_ARGB>(CFX_Color::Type::kRGB,
                                                ArgbEncode(255, r, g, b));
   }
-  if (color.nColorType == CFX_Color::kCMYK) {
+  if (color.nColorType == CFX_Color::Type::kCMYK) {
     float r = 1.0f - std::min(1.0f, color.fColor1 + color.fColor4);
     float g = 1.0f - std::min(1.0f, color.fColor2 + color.fColor4);
     float b = 1.0f - std::min(1.0f, color.fColor3 + color.fColor4);
     return std::pair<CFX_Color::Type, FX_ARGB>(
-        CFX_Color::kCMYK, ArgbEncode(255, static_cast<int>(r * 255 + 0.5f),
-                                     static_cast<int>(g * 255 + 0.5f),
-                                     static_cast<int>(b * 255 + 0.5f)));
+        CFX_Color::Type::kCMYK,
+        ArgbEncode(255, static_cast<int>(r * 255 + 0.5f),
+                   static_cast<int>(g * 255 + 0.5f),
+                   static_cast<int>(b * 255 + 0.5f)));
   }
   NOTREACHED();
   return pdfium::nullopt;
diff --git a/core/fpdfdoc/cpdf_generateap.cpp b/core/fpdfdoc/cpdf_generateap.cpp
index b26b121..b8b941f 100644
--- a/core/fpdfdoc/cpdf_generateap.cpp
+++ b/core/fpdfdoc/cpdf_generateap.cpp
@@ -178,24 +178,24 @@
 ByteString GenerateColorAP(const CFX_Color& color, PaintOperation nOperation) {
   std::ostringstream sColorStream;
   switch (color.nColorType) {
-    case CFX_Color::kRGB:
+    case CFX_Color::Type::kRGB:
       sColorStream << color.fColor1 << " " << color.fColor2 << " "
                    << color.fColor3 << " "
                    << (nOperation == PaintOperation::kStroke ? "RG" : "rg")
                    << "\n";
       break;
-    case CFX_Color::kGray:
+    case CFX_Color::Type::kGray:
       sColorStream << color.fColor1 << " "
                    << (nOperation == PaintOperation::kStroke ? "G" : "g")
                    << "\n";
       break;
-    case CFX_Color::kCMYK:
+    case CFX_Color::Type::kCMYK:
       sColorStream << color.fColor1 << " " << color.fColor2 << " "
                    << color.fColor3 << " " << color.fColor4 << " "
                    << (nOperation == PaintOperation::kStroke ? "K" : "k")
                    << "\n";
       break;
-    case CFX_Color::kTransparent:
+    case CFX_Color::Type::kTransparent:
       break;
   }
   return ByteString(sColorStream);
@@ -394,7 +394,7 @@
 
   std::ostringstream sAppStream;
   sAppStream << "BT\n"
-             << GenerateColorAP(CFX_Color(CFX_Color::kRGB, 0, 0, 0),
+             << GenerateColorAP(CFX_Color(CFX_Color::Type::kRGB, 0, 0, 0),
                                 PaintOperation::kFill)
              << sContent << "ET\n"
              << "Q\n";
@@ -424,9 +424,9 @@
 
 ByteString GenerateTextSymbolAP(const CFX_FloatRect& rect) {
   std::ostringstream sAppStream;
-  sAppStream << GenerateColorAP(CFX_Color(CFX_Color::kRGB, 1, 1, 0),
+  sAppStream << GenerateColorAP(CFX_Color(CFX_Color::Type::kRGB, 1, 1, 0),
                                 PaintOperation::kFill);
-  sAppStream << GenerateColorAP(CFX_Color(CFX_Color::kRGB, 0, 0, 0),
+  sAppStream << GenerateColorAP(CFX_Color(CFX_Color::Type::kRGB, 0, 0, 0),
                                 PaintOperation::kStroke);
 
   const float fBorderWidth = 1;
@@ -538,13 +538,13 @@
   sAppStream << "/" << sExtGSDictName << " gs ";
 
   CPDF_Array* pInteriorColor = pAnnotDict->GetArrayFor("IC");
-  sAppStream << GetColorStringWithDefault(pInteriorColor,
-                                          CFX_Color(CFX_Color::kTransparent),
-                                          PaintOperation::kFill);
+  sAppStream << GetColorStringWithDefault(
+      pInteriorColor, CFX_Color(CFX_Color::Type::kTransparent),
+      PaintOperation::kFill);
 
   sAppStream << GetColorStringWithDefault(
       pAnnotDict->GetArrayFor(pdfium::annotation::kC),
-      CFX_Color(CFX_Color::kRGB, 0, 0, 0), PaintOperation::kStroke);
+      CFX_Color(CFX_Color::Type::kRGB, 0, 0, 0), PaintOperation::kStroke);
 
   float fBorderWidth = GetBorderWidth(*pAnnotDict);
   bool bIsStrokeRect = fBorderWidth > 0;
@@ -612,7 +612,7 @@
 
   sAppStream << GetColorStringWithDefault(
       pAnnotDict->GetArrayFor(pdfium::annotation::kC),
-      CFX_Color(CFX_Color::kRGB, 1, 1, 0), PaintOperation::kFill);
+      CFX_Color(CFX_Color::Type::kRGB, 1, 1, 0), PaintOperation::kFill);
 
   CPDF_Array* pArray = pAnnotDict->GetArrayFor("QuadPoints");
   if (pArray) {
@@ -654,7 +654,7 @@
 
   sAppStream << GetColorStringWithDefault(
       pAnnotDict->GetArrayFor(pdfium::annotation::kC),
-      CFX_Color(CFX_Color::kRGB, 0, 0, 0), PaintOperation::kStroke);
+      CFX_Color(CFX_Color::Type::kRGB, 0, 0, 0), PaintOperation::kStroke);
 
   sAppStream << fBorderWidth << " w ";
   sAppStream << GetDashPatternString(*pAnnotDict);
@@ -719,7 +719,7 @@
 
   sAppStream << GetColorStringWithDefault(
       pAnnotDict->GetArrayFor(pdfium::annotation::kC),
-      CFX_Color(CFX_Color::kRGB, 0, 0, 0), PaintOperation::kStroke);
+      CFX_Color(CFX_Color::Type::kRGB, 0, 0, 0), PaintOperation::kStroke);
 
   CPDF_Array* pArray = pAnnotDict->GetArrayFor("QuadPoints");
   if (pArray) {
@@ -748,9 +748,9 @@
   ByteString sExtGSDictName = "GS";
   sAppStream << "/" << sExtGSDictName << " gs\n";
 
-  sAppStream << GenerateColorAP(CFX_Color(CFX_Color::kRGB, 1, 1, 0),
+  sAppStream << GenerateColorAP(CFX_Color(CFX_Color::Type::kRGB, 1, 1, 0),
                                 PaintOperation::kFill);
-  sAppStream << GenerateColorAP(CFX_Color(CFX_Color::kRGB, 0, 0, 0),
+  sAppStream << GenerateColorAP(CFX_Color(CFX_Color::Type::kRGB, 0, 0, 0),
                                 PaintOperation::kStroke);
 
   const float fBorderWidth = 1;
@@ -789,13 +789,13 @@
   sAppStream << "/" << sExtGSDictName << " gs ";
 
   CPDF_Array* pInteriorColor = pAnnotDict->GetArrayFor("IC");
-  sAppStream << GetColorStringWithDefault(pInteriorColor,
-                                          CFX_Color(CFX_Color::kTransparent),
-                                          PaintOperation::kFill);
+  sAppStream << GetColorStringWithDefault(
+      pInteriorColor, CFX_Color(CFX_Color::Type::kTransparent),
+      PaintOperation::kFill);
 
   sAppStream << GetColorStringWithDefault(
       pAnnotDict->GetArrayFor(pdfium::annotation::kC),
-      CFX_Color(CFX_Color::kRGB, 0, 0, 0), PaintOperation::kStroke);
+      CFX_Color(CFX_Color::Type::kRGB, 0, 0, 0), PaintOperation::kStroke);
 
   float fBorderWidth = GetBorderWidth(*pAnnotDict);
   bool bIsStrokeRect = fBorderWidth > 0;
@@ -837,7 +837,7 @@
 
   sAppStream << GetColorStringWithDefault(
       pAnnotDict->GetArrayFor(pdfium::annotation::kC),
-      CFX_Color(CFX_Color::kRGB, 0, 0, 0), PaintOperation::kStroke);
+      CFX_Color(CFX_Color::Type::kRGB, 0, 0, 0), PaintOperation::kStroke);
 
   CPDF_Array* pArray = pAnnotDict->GetArrayFor("QuadPoints");
   if (pArray) {
@@ -887,7 +887,7 @@
 
   sAppStream << GetColorStringWithDefault(
       pAnnotDict->GetArrayFor(pdfium::annotation::kC),
-      CFX_Color(CFX_Color::kRGB, 0, 0, 0), PaintOperation::kStroke);
+      CFX_Color(CFX_Color::Type::kRGB, 0, 0, 0), PaintOperation::kStroke);
 
   CPDF_Array* pArray = pAnnotDict->GetArrayFor("QuadPoints");
   if (pArray) {
@@ -1019,14 +1019,14 @@
         case 'B':
           nBorderStyle = BorderStyle::kBeveled;
           fBorderWidth *= 2;
-          crLeftTop = CFX_Color(CFX_Color::kGray, 1);
-          crRightBottom = CFX_Color(CFX_Color::kGray, 0.5);
+          crLeftTop = CFX_Color(CFX_Color::Type::kGray, 1);
+          crRightBottom = CFX_Color(CFX_Color::Type::kGray, 0.5);
           break;
         case 'I':
           nBorderStyle = BorderStyle::kInset;
           fBorderWidth *= 2;
-          crLeftTop = CFX_Color(CFX_Color::kGray, 0.5);
-          crRightBottom = CFX_Color(CFX_Color::kGray, 0.75);
+          crLeftTop = CFX_Color(CFX_Color::Type::kGray, 0.5);
+          crRightBottom = CFX_Color(CFX_Color::Type::kGray, 0.75);
           break;
         case 'U':
           nBorderStyle = BorderStyle::kUnderline;
@@ -1201,7 +1201,7 @@
                    << "Q\nEMC\n";
       }
       ByteString sButton =
-          GenerateColorAP(CFX_Color(CFX_Color::kRGB, 220.0f / 255.0f,
+          GenerateColorAP(CFX_Color(CFX_Color::Type::kRGB, 220.0f / 255.0f,
                                     220.0f / 255.0f, 220.0f / 255.0f),
                           PaintOperation::kFill);
       if (sButton.GetLength() > 0 && !rcButton.IsEmpty()) {
@@ -1209,10 +1209,11 @@
         sAppStream << rcButton.left << " " << rcButton.bottom << " "
                    << rcButton.Width() << " " << rcButton.Height() << " re f\n";
         sAppStream << "Q\n";
-        ByteString sButtonBorder = GenerateBorderAP(
-            rcButton, 2, CFX_Color(CFX_Color::kGray, 0),
-            CFX_Color(CFX_Color::kGray, 1), CFX_Color(CFX_Color::kGray, 0.5),
-            BorderStyle::kBeveled, CPVT_Dash(3, 0, 0));
+        ByteString sButtonBorder =
+            GenerateBorderAP(rcButton, 2, CFX_Color(CFX_Color::Type::kGray, 0),
+                             CFX_Color(CFX_Color::Type::kGray, 1),
+                             CFX_Color(CFX_Color::Type::kGray, 0.5),
+                             BorderStyle::kBeveled, CPVT_Dash(3, 0, 0));
         if (sButtonBorder.GetLength() > 0)
           sAppStream << "q\n" << sButtonBorder << "Q\n";
 
@@ -1283,14 +1284,14 @@
                   rcBody.left, fy - fItemHeight, rcBody.right, fy);
               sBody << "q\n"
                     << GenerateColorAP(
-                           CFX_Color(CFX_Color::kRGB, 0, 51.0f / 255.0f,
+                           CFX_Color(CFX_Color::Type::kRGB, 0, 51.0f / 255.0f,
                                      113.0f / 255.0f),
                            PaintOperation::kFill)
                     << rcItem.left << " " << rcItem.bottom << " "
                     << rcItem.Width() << " " << rcItem.Height() << " re f\n"
                     << "Q\n";
               sBody << "BT\n"
-                    << GenerateColorAP(CFX_Color(CFX_Color::kGray, 1),
+                    << GenerateColorAP(CFX_Color(CFX_Color::Type::kGray, 1),
                                        PaintOperation::kFill)
                     << GenerateEditAP(&map, vt.GetIterator(),
                                       CFX_PointF(0.0f, fy), true, 0)
diff --git a/core/fxge/cfx_color.cpp b/core/fxge/cfx_color.cpp
index 99330bc..d5fa473 100644
--- a/core/fxge/cfx_color.cpp
+++ b/core/fxge/cfx_color.cpp
@@ -10,11 +10,11 @@
 
 // Color types are orded by increasing number of components so we can
 // choose a best color type during some conversions.
-static_assert(CFX_Color::kTransparent < CFX_Color::kGray,
+static_assert(CFX_Color::Type::kTransparent < CFX_Color::Type::kGray,
               "color type values must be ordered");
-static_assert(CFX_Color::kGray < CFX_Color::kRGB,
+static_assert(CFX_Color::Type::kGray < CFX_Color::Type::kRGB,
               "color type values must be ordered");
-static_assert(CFX_Color::kRGB < CFX_Color::kCMYK,
+static_assert(CFX_Color::Type::kRGB < CFX_Color::Type::kCMYK,
               "color type values must be ordered");
 
 namespace {
@@ -25,86 +25,87 @@
 
 CFX_Color ConvertCMYK2GRAY(float dC, float dM, float dY, float dK) {
   if (!InRange(dC) || !InRange(dM) || !InRange(dY) || !InRange(dK))
-    return CFX_Color(CFX_Color::kGray);
+    return CFX_Color(CFX_Color::Type::kGray);
   return CFX_Color(
-      CFX_Color::kGray,
+      CFX_Color::Type::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(CFX_Color::kCMYK);
-  return CFX_Color(CFX_Color::kCMYK, 0.0f, 0.0f, 0.0f, 1.0f - dGray);
+    return CFX_Color(CFX_Color::Type::kCMYK);
+  return CFX_Color(CFX_Color::Type::kCMYK, 0.0f, 0.0f, 0.0f, 1.0f - dGray);
 }
 
 CFX_Color ConvertGRAY2RGB(float dGray) {
   if (!InRange(dGray))
-    return CFX_Color(CFX_Color::kRGB);
-  return CFX_Color(CFX_Color::kRGB, dGray, dGray, dGray);
+    return CFX_Color(CFX_Color::Type::kRGB);
+  return CFX_Color(CFX_Color::Type::kRGB, dGray, dGray, dGray);
 }
 
 CFX_Color ConvertRGB2GRAY(float dR, float dG, float dB) {
   if (!InRange(dR) || !InRange(dG) || !InRange(dB))
-    return CFX_Color(CFX_Color::kGray);
-  return CFX_Color(CFX_Color::kGray, 0.3f * dR + 0.59f * dG + 0.11f * dB);
+    return CFX_Color(CFX_Color::Type::kGray);
+  return CFX_Color(CFX_Color::Type::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(CFX_Color::kRGB);
-  return CFX_Color(CFX_Color::kRGB, 1.0f - std::min(1.0f, dC + dK),
+    return CFX_Color(CFX_Color::Type::kRGB);
+  return CFX_Color(CFX_Color::Type::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(CFX_Color::kCMYK);
+    return CFX_Color(CFX_Color::Type::kCMYK);
 
   float c = 1.0f - dR;
   float m = 1.0f - dG;
   float y = 1.0f - dB;
-  return CFX_Color(CFX_Color::kCMYK, c, m, y, std::min(c, std::min(m, y)));
+  return CFX_Color(CFX_Color::Type::kCMYK, c, m, y,
+                   std::min(c, std::min(m, y)));
 }
 
 }  // namespace
 
-CFX_Color CFX_Color::ConvertColorType(int32_t nConvertColorType) const {
+CFX_Color CFX_Color::ConvertColorType(Type nConvertColorType) const {
   if (nColorType == nConvertColorType)
     return *this;
 
   CFX_Color ret;
   switch (nColorType) {
-    case CFX_Color::kTransparent:
+    case CFX_Color::Type::kTransparent:
       ret = *this;
-      ret.nColorType = CFX_Color::kTransparent;
+      ret.nColorType = CFX_Color::Type::kTransparent;
       break;
-    case CFX_Color::kGray:
+    case CFX_Color::Type::kGray:
       switch (nConvertColorType) {
-        case CFX_Color::kRGB:
+        case CFX_Color::Type::kRGB:
           ret = ConvertGRAY2RGB(fColor1);
           break;
-        case CFX_Color::kCMYK:
+        case CFX_Color::Type::kCMYK:
           ret = ConvertGRAY2CMYK(fColor1);
           break;
       }
       break;
-    case CFX_Color::kRGB:
+    case CFX_Color::Type::kRGB:
       switch (nConvertColorType) {
-        case CFX_Color::kGray:
+        case CFX_Color::Type::kGray:
           ret = ConvertRGB2GRAY(fColor1, fColor2, fColor3);
           break;
-        case CFX_Color::kCMYK:
+        case CFX_Color::Type::kCMYK:
           ret = ConvertRGB2CMYK(fColor1, fColor2, fColor3);
           break;
       }
       break;
-    case CFX_Color::kCMYK:
+    case CFX_Color::Type::kCMYK:
       switch (nConvertColorType) {
-        case CFX_Color::kGray:
+        case CFX_Color::Type::kGray:
           ret = ConvertCMYK2GRAY(fColor1, fColor2, fColor3, fColor4);
           break;
-        case CFX_Color::kRGB:
+        case CFX_Color::Type::kRGB:
           ret = ConvertCMYK2RGB(fColor1, fColor2, fColor3, fColor4);
           break;
       }
@@ -116,21 +117,21 @@
 FX_COLORREF CFX_Color::ToFXColor(int32_t nTransparency) const {
   CFX_Color ret;
   switch (nColorType) {
-    case CFX_Color::kTransparent: {
-      ret = CFX_Color(CFX_Color::kTransparent, 0, 0, 0, 0);
+    case CFX_Color::Type::kTransparent: {
+      ret = CFX_Color(CFX_Color::Type::kTransparent, 0, 0, 0, 0);
       break;
     }
-    case CFX_Color::kGray: {
+    case CFX_Color::Type::kGray: {
       ret = ConvertGRAY2RGB(fColor1);
       ret.fColor4 = nTransparency;
       break;
     }
-    case CFX_Color::kRGB: {
-      ret = CFX_Color(CFX_Color::kRGB, fColor1, fColor2, fColor3);
+    case CFX_Color::Type::kRGB: {
+      ret = CFX_Color(CFX_Color::Type::kRGB, fColor1, fColor2, fColor3);
       ret.fColor4 = nTransparency;
       break;
     }
-    case CFX_Color::kCMYK: {
+    case CFX_Color::Type::kCMYK: {
       ret = ConvertCMYK2RGB(fColor1, fColor2, fColor3, fColor4);
       ret.fColor4 = nTransparency;
       break;
@@ -144,15 +145,15 @@
 CFX_Color CFX_Color::operator-(float fColorSub) const {
   CFX_Color sRet(nColorType);
   switch (nColorType) {
-    case CFX_Color::kTransparent:
-      sRet.nColorType = CFX_Color::kRGB;
+    case CFX_Color::Type::kTransparent:
+      sRet.nColorType = CFX_Color::Type::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 CFX_Color::kRGB:
-    case CFX_Color::kGray:
-    case CFX_Color::kCMYK:
+    case CFX_Color::Type::kRGB:
+    case CFX_Color::Type::kGray:
+    case CFX_Color::Type::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);
@@ -165,15 +166,15 @@
 CFX_Color CFX_Color::operator/(float fColorDivide) const {
   CFX_Color sRet(nColorType);
   switch (nColorType) {
-    case CFX_Color::kTransparent:
-      sRet.nColorType = CFX_Color::kRGB;
+    case CFX_Color::Type::kTransparent:
+      sRet.nColorType = CFX_Color::Type::kRGB;
       sRet.fColor1 = 1.0f / fColorDivide;
       sRet.fColor2 = 1.0f / fColorDivide;
       sRet.fColor3 = 1.0f / fColorDivide;
       break;
-    case CFX_Color::kRGB:
-    case CFX_Color::kGray:
-    case CFX_Color::kCMYK:
+    case CFX_Color::Type::kRGB:
+    case CFX_Color::Type::kGray:
+    case CFX_Color::Type::kCMYK:
       sRet = *this;
       sRet.fColor1 /= fColorDivide;
       sRet.fColor2 /= fColorDivide;
diff --git a/core/fxge/cfx_color.h b/core/fxge/cfx_color.h
index c3db8a7..a386d2b 100644
--- a/core/fxge/cfx_color.h
+++ b/core/fxge/cfx_color.h
@@ -11,12 +11,12 @@
 
 struct CFX_Color {
   // Ordered by increasing number of components.
-  enum Type { kTransparent = 0, kGray, kRGB, kCMYK };
+  enum class 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(Type type = CFX_Color::kTransparent,
+  CFX_Color(Type type = CFX_Color::Type::kTransparent,
             float color1 = 0.0f,
             float color2 = 0.0f,
             float color3 = 0.0f,
@@ -28,29 +28,21 @@
         fColor4(color4) {}
 
   CFX_Color(int32_t r, int32_t g, int32_t b)
-      : nColorType(CFX_Color::kRGB),
+      : nColorType(CFX_Color::Type::kRGB),
         fColor1(r / 255.0f),
         fColor2(g / 255.0f),
         fColor3(b / 255.0f),
         fColor4(0) {}
 
-  CFX_Color(const CFX_Color&) = default;
+  CFX_Color(const CFX_Color& that) = default;
+  CFX_Color& operator=(const CFX_Color& that) = default;
 
   CFX_Color operator/(float fColorDivide) const;
   CFX_Color operator-(float fColorSub) const;
 
-  CFX_Color ConvertColorType(int32_t nConvertColorType) const;
-
+  CFX_Color ConvertColorType(Type nConvertColorType) const;
   FX_COLORREF ToFXColor(int32_t nTransparency) const;
 
-  void Reset() {
-    nColorType = CFX_Color::kTransparent;
-    fColor1 = 0.0f;
-    fColor2 = 0.0f;
-    fColor3 = 0.0f;
-    fColor4 = 0.0f;
-  }
-
   Type nColorType;
   float fColor1;
   float fColor2;
diff --git a/fpdfsdk/cpdfsdk_appstream.cpp b/fpdfsdk/cpdfsdk_appstream.cpp
index 25e0ad6..ad88253 100644
--- a/fpdfsdk/cpdfsdk_appstream.cpp
+++ b/fpdfsdk/cpdfsdk_appstream.cpp
@@ -109,21 +109,21 @@
   std::ostringstream sColorStream;
 
   switch (color.nColorType) {
-    case CFX_Color::kTransparent:
+    case CFX_Color::Type::kTransparent:
       break;
-    case CFX_Color::kGray:
+    case CFX_Color::Type::kGray:
       sColorStream << color.fColor1 << " "
                    << (bFillOrStroke ? kSetGrayOperator
                                      : kSetGrayStrokedOperator)
                    << "\n";
       break;
-    case CFX_Color::kRGB:
+    case CFX_Color::Type::kRGB:
       sColorStream << color.fColor1 << " " << color.fColor2 << " "
                    << color.fColor3 << " "
                    << (bFillOrStroke ? kSetRGBOperator : kSetRGBStrokedOperator)
                    << "\n";
       break;
-    case CFX_Color::kCMYK:
+    case CFX_Color::Type::kCMYK:
       sColorStream << color.fColor1 << " " << color.fColor2 << " "
                    << color.fColor3 << " " << color.fColor4 << " "
                    << (bFillOrStroke ? kSetCMYKOperator
@@ -1048,9 +1048,10 @@
   std::ostringstream sAppStream;
   {
     AutoClosedQCommand q(&sAppStream);
-    sAppStream << GetColorAppStream(CFX_Color(CFX_Color::kRGB, 220.0f / 255.0f,
-                                              220.0f / 255.0f, 220.0f / 255.0f),
-                                    true)
+    sAppStream << GetColorAppStream(
+                      CFX_Color(CFX_Color::Type::kRGB, 220.0f / 255.0f,
+                                220.0f / 255.0f, 220.0f / 255.0f),
+                      true)
                << rcBBox.left << " " << rcBBox.bottom << " "
                << rcBBox.right - rcBBox.left << " "
                << rcBBox.top - rcBBox.bottom << " " << kAppendRectOperator
@@ -1060,9 +1061,10 @@
   {
     AutoClosedQCommand q(&sAppStream);
     sAppStream << GetBorderAppStreamInternal(
-        rcBBox, 2, CFX_Color(CFX_Color::kGray, 0),
-        CFX_Color(CFX_Color::kGray, 1), CFX_Color(CFX_Color::kGray, 0.5),
-        BorderStyle::kBeveled, CPWL_Dash(3, 0, 0));
+        rcBBox, 2, CFX_Color(CFX_Color::Type::kGray, 0),
+        CFX_Color(CFX_Color::Type::kGray, 1),
+        CFX_Color(CFX_Color::Type::kGray, 0.5), BorderStyle::kBeveled,
+        CPWL_Dash(3, 0, 0));
   }
 
   CFX_PointF ptCenter = CFX_PointF((rcBBox.left + rcBBox.right) / 2,
@@ -1186,13 +1188,13 @@
       break;
     case BorderStyle::kBeveled:
       fBorderWidth *= 2;
-      crLeftTop = CFX_Color(CFX_Color::kGray, 1);
+      crLeftTop = CFX_Color(CFX_Color::Type::kGray, 1);
       crRightBottom = crBackground / 2.0f;
       break;
     case BorderStyle::kInset:
       fBorderWidth *= 2;
-      crLeftTop = CFX_Color(CFX_Color::kGray, 0.5);
-      crRightBottom = CFX_Color(CFX_Color::kGray, 0.75);
+      crLeftTop = CFX_Color(CFX_Color::Type::kGray, 0.5);
+      crRightBottom = CFX_Color(CFX_Color::Type::kGray, 0.75);
       break;
     default:
       break;
@@ -1201,7 +1203,7 @@
   CFX_FloatRect rcClient = rcWindow.GetDeflated(fBorderWidth, fBorderWidth);
   CPDF_DefaultAppearance da = pControl->GetDefaultAppearance();
   Optional<CFX_Color> color = da.GetColor();
-  CFX_Color crText = color.value_or(CFX_Color(CFX_Color::kGray, 0));
+  CFX_Color crText = color.value_or(CFX_Color(CFX_Color::Type::kGray, 0));
 
   float fFontSize;
   ByteString csNameTag;
@@ -1296,8 +1298,8 @@
         break;
       }
       case BorderStyle::kInset: {
-        crLeftTop = CFX_Color(CFX_Color::kGray, 0);
-        crRightBottom = CFX_Color(CFX_Color::kGray, 1);
+        crLeftTop = CFX_Color(CFX_Color::Type::kGray, 0);
+        crRightBottom = CFX_Color(CFX_Color::Type::kGray, 1);
         break;
       }
       default:
@@ -1337,13 +1339,13 @@
       break;
     case BorderStyle::kBeveled:
       fBorderWidth *= 2;
-      crLeftTop = CFX_Color(CFX_Color::kGray, 1);
+      crLeftTop = CFX_Color(CFX_Color::Type::kGray, 1);
       crRightBottom = crBackground / 2.0f;
       break;
     case BorderStyle::kInset:
       fBorderWidth *= 2;
-      crLeftTop = CFX_Color(CFX_Color::kGray, 0.5);
-      crRightBottom = CFX_Color(CFX_Color::kGray, 0.75);
+      crLeftTop = CFX_Color(CFX_Color::Type::kGray, 0.5);
+      crRightBottom = CFX_Color(CFX_Color::Type::kGray, 0.75);
       break;
     default:
       break;
@@ -1371,8 +1373,8 @@
       break;
     }
     case BorderStyle::kInset: {
-      crLeftTop = CFX_Color(CFX_Color::kGray, 0);
-      crRightBottom = CFX_Color(CFX_Color::kGray, 1);
+      crLeftTop = CFX_Color(CFX_Color::Type::kGray, 0);
+      crRightBottom = CFX_Color(CFX_Color::Type::kGray, 1);
       break;
     }
     default:
@@ -1416,13 +1418,13 @@
       break;
     case BorderStyle::kBeveled:
       fBorderWidth *= 2;
-      crLeftTop = CFX_Color(CFX_Color::kGray, 1);
+      crLeftTop = CFX_Color(CFX_Color::Type::kGray, 1);
       crRightBottom = crBackground / 2.0f;
       break;
     case BorderStyle::kInset:
       fBorderWidth *= 2;
-      crLeftTop = CFX_Color(CFX_Color::kGray, 0.5);
-      crRightBottom = CFX_Color(CFX_Color::kGray, 0.75);
+      crLeftTop = CFX_Color(CFX_Color::Type::kGray, 0.5);
+      crRightBottom = CFX_Color(CFX_Color::Type::kGray, 0.75);
       break;
     default:
       break;
@@ -1439,11 +1441,11 @@
   CFX_FloatRect rcCenter = rcWindow.GetCenterSquare().GetDeflated(1.0f, 1.0f);
   if (nStyle == CheckStyle::kCircle) {
     if (nBorderStyle == BorderStyle::kBeveled) {
-      crLeftTop = CFX_Color(CFX_Color::kGray, 1);
+      crLeftTop = CFX_Color(CFX_Color::Type::kGray, 1);
       crRightBottom = crBackground - 0.25f;
     } else if (nBorderStyle == BorderStyle::kInset) {
-      crLeftTop = CFX_Color(CFX_Color::kGray, 0.5f);
-      crRightBottom = CFX_Color(CFX_Color::kGray, 0.75f);
+      crLeftTop = CFX_Color(CFX_Color::Type::kGray, 0.5f);
+      crRightBottom = CFX_Color(CFX_Color::Type::kGray, 0.75f);
     }
 
     csAP_N_ON =
@@ -1467,8 +1469,8 @@
       break;
     }
     case BorderStyle::kInset: {
-      crLeftTop = CFX_Color(CFX_Color::kGray, 0);
-      crRightBottom = CFX_Color(CFX_Color::kGray, 1);
+      crLeftTop = CFX_Color(CFX_Color::Type::kGray, 0);
+      crRightBottom = CFX_Color(CFX_Color::Type::kGray, 1);
       break;
     }
     default:
@@ -1481,11 +1483,11 @@
     CFX_Color crBK = crBackground - 0.25f;
     if (nBorderStyle == BorderStyle::kBeveled) {
       crLeftTop = crBackground - 0.25f;
-      crRightBottom = CFX_Color(CFX_Color::kGray, 1);
+      crRightBottom = CFX_Color(CFX_Color::Type::kGray, 1);
       crBK = crBackground;
     } else if (nBorderStyle == BorderStyle::kInset) {
-      crLeftTop = CFX_Color(CFX_Color::kGray, 0);
-      crRightBottom = CFX_Color(CFX_Color::kGray, 1);
+      crLeftTop = CFX_Color(CFX_Color::Type::kGray, 0);
+      crRightBottom = CFX_Color(CFX_Color::Type::kGray, 1);
     }
 
     csAP_D_ON =
@@ -1631,8 +1633,8 @@
           CFX_FloatRect(rcClient.left, fy - fItemHeight, rcClient.right, fy);
       {
         AutoClosedQCommand q(&sList);
-        sList << GetColorAppStream(CFX_Color(CFX_Color::kRGB, 0, 51.0f / 255.0f,
-                                             113.0f / 255.0f),
+        sList << GetColorAppStream(CFX_Color(CFX_Color::Type::kRGB, 0,
+                                             51.0f / 255.0f, 113.0f / 255.0f),
                                    true)
               << rcItem.left << " " << rcItem.bottom << " " << rcItem.Width()
               << " " << rcItem.Height() << " " << kAppendRectOperator << " "
@@ -1640,7 +1642,7 @@
       }
 
       AutoClosedCommand bt(&sList, kTextBeginOperator, kTextEndOperator);
-      sList << GetColorAppStream(CFX_Color(CFX_Color::kGray, 1), true)
+      sList << GetColorAppStream(CFX_Color(CFX_Color::Type::kGray, 1), true)
             << GetEditAppStream(pEdit.get(), CFX_PointF(0.0f, fy), true, 0);
     } else {
       CFX_Color crText = widget_->GetTextPWLColor();
@@ -1885,7 +1887,7 @@
 
 ByteString CPDFSDK_AppStream::GetBackgroundAppStream() const {
   CFX_Color crBackground = widget_->GetFillPWLColor();
-  if (crBackground.nColorType != CFX_Color::kTransparent)
+  if (crBackground.nColorType != CFX_Color::Type::kTransparent)
     return GetRectFillAppStream(widget_->GetRotatedRect(), crBackground);
 
   return ByteString();
@@ -1908,13 +1910,13 @@
       break;
     case BorderStyle::kBeveled:
       fBorderWidth *= 2;
-      crLeftTop = CFX_Color(CFX_Color::kGray, 1);
+      crLeftTop = CFX_Color(CFX_Color::Type::kGray, 1);
       crRightBottom = crBackground / 2.0f;
       break;
     case BorderStyle::kInset:
       fBorderWidth *= 2;
-      crLeftTop = CFX_Color(CFX_Color::kGray, 0.5);
-      crRightBottom = CFX_Color(CFX_Color::kGray, 0.75);
+      crLeftTop = CFX_Color(CFX_Color::Type::kGray, 0.5);
+      crRightBottom = CFX_Color(CFX_Color::Type::kGray, 0.75);
       break;
     default:
       break;
diff --git a/fpdfsdk/cpdfsdk_widget.cpp b/fpdfsdk/cpdfsdk_widget.cpp
index 0021c2f..4dae85f 100644
--- a/fpdfsdk/cpdfsdk_widget.cpp
+++ b/fpdfsdk/cpdfsdk_widget.cpp
@@ -430,7 +430,7 @@
   std::pair<CFX_Color::Type, FX_ARGB> type_argb_pair =
       GetFormControl()->GetBackgroundColor();
 
-  if (type_argb_pair.first == CFX_Color::kTransparent)
+  if (type_argb_pair.first == CFX_Color::Type::kTransparent)
     return pdfium::nullopt;
 
   return ArgbToColorRef(type_argb_pair.second);
@@ -439,7 +439,7 @@
 Optional<FX_COLORREF> CPDFSDK_Widget::GetBorderColor() const {
   std::pair<CFX_Color::Type, FX_ARGB> type_argb_pair =
       GetFormControl()->GetBorderColorARGB();
-  if (type_argb_pair.first == CFX_Color::kTransparent)
+  if (type_argb_pair.first == CFX_Color::Type::kTransparent)
     return pdfium::nullopt;
 
   return ArgbToColorRef(type_argb_pair.second);
@@ -453,7 +453,7 @@
   if (!maybe_type_argb_pair.has_value())
     return pdfium::nullopt;
 
-  if (maybe_type_argb_pair.value().first == CFX_Color::kTransparent)
+  if (maybe_type_argb_pair.value().first == CFX_Color::Type::kTransparent)
     return pdfium::nullopt;
 
   return ArgbToColorRef(maybe_type_argb_pair.value().second);
@@ -780,7 +780,7 @@
 CFX_Color CPDFSDK_Widget::GetTextPWLColor() const {
   CPDF_FormControl* pFormCtrl = GetFormControl();
   Optional<CFX_Color> crText = pFormCtrl->GetDefaultAppearance().GetColor();
-  return crText.value_or(CFX_Color(CFX_Color::kGray, 0));
+  return crText.value_or(CFX_Color(CFX_Color::Type::kGray, 0));
 }
 
 CFX_Color CPDFSDK_Widget::GetBorderPWLColor() const {
diff --git a/fpdfsdk/formfiller/cffl_formfiller.cpp b/fpdfsdk/formfiller/cffl_formfiller.cpp
index 343ff03..fbd3901 100644
--- a/fpdfsdk/formfiller/cffl_formfiller.cpp
+++ b/fpdfsdk/formfiller/cffl_formfiller.cpp
@@ -312,7 +312,7 @@
   if (color.has_value())
     cp.sBorderColor = CFX_Color(color.value());
 
-  cp.sTextColor = CFX_Color(CFX_Color::kGray, 0);
+  cp.sTextColor = CFX_Color(CFX_Color::Type::kGray, 0);
 
   color = m_pWidget->GetTextColor();
   if (color.has_value())
diff --git a/fpdfsdk/fpdf_annot.cpp b/fpdfsdk/fpdf_annot.cpp
index 7d9e819..da569c4 100644
--- a/fpdfsdk/fpdf_annot.cpp
+++ b/fpdfsdk/fpdf_annot.cpp
@@ -697,22 +697,22 @@
 
   CFX_Color color = fpdfdoc::CFXColorFromArray(*pColor);
   switch (color.nColorType) {
-    case CFX_Color::kRGB:
+    case CFX_Color::Type::kRGB:
       *R = color.fColor1 * 255.f;
       *G = color.fColor2 * 255.f;
       *B = color.fColor3 * 255.f;
       break;
-    case CFX_Color::kGray:
+    case CFX_Color::Type::kGray:
       *R = 255.f * color.fColor1;
       *G = 255.f * color.fColor1;
       *B = 255.f * color.fColor1;
       break;
-    case CFX_Color::kCMYK:
+    case CFX_Color::Type::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 CFX_Color::kTransparent:
+    case CFX_Color::Type::kTransparent:
       *R = 0;
       *G = 0;
       *B = 0;
diff --git a/fpdfsdk/pwl/cpwl_combo_box.cpp b/fpdfsdk/pwl/cpwl_combo_box.cpp
index 9b83705..1ddb1ef 100644
--- a/fpdfsdk/pwl/cpwl_combo_box.cpp
+++ b/fpdfsdk/pwl/cpwl_combo_box.cpp
@@ -165,7 +165,7 @@
 
   CreateParams bcp = cp;
   bcp.dwFlags = PWS_VISIBLE | PWS_BORDER | PWS_BACKGROUND;
-  bcp.sBackgroundColor = CFX_Color(CFX_Color::kRGB, 220.0f / 255.0f,
+  bcp.sBackgroundColor = CFX_Color(CFX_Color::Type::kRGB, 220.0f / 255.0f,
                                    220.0f / 255.0f, 220.0f / 255.0f);
   bcp.sBorderColor = PWL_DEFAULT_BLACKCOLOR;
   bcp.dwBorderWidth = 2;
@@ -192,10 +192,10 @@
   lcp.fFontSize =
       (cp.dwFlags & PWS_AUTOFONTSIZE) ? kComboBoxDefaultFontSize : cp.fFontSize;
 
-  if (cp.sBorderColor.nColorType == CFX_Color::kTransparent)
+  if (cp.sBorderColor.nColorType == CFX_Color::Type::kTransparent)
     lcp.sBorderColor = PWL_DEFAULT_BLACKCOLOR;
 
-  if (cp.sBackgroundColor.nColorType == CFX_Color::kTransparent)
+  if (cp.sBackgroundColor.nColorType == CFX_Color::Type::kTransparent)
     lcp.sBackgroundColor = PWL_DEFAULT_WHITECOLOR;
 
   auto pList = std::make_unique<CPWL_CBListBox>(lcp, CloneAttachedData());
diff --git a/fpdfsdk/pwl/cpwl_wnd.cpp b/fpdfsdk/pwl/cpwl_wnd.cpp
index 6affdae..f2628f2 100644
--- a/fpdfsdk/pwl/cpwl_wnd.cpp
+++ b/fpdfsdk/pwl/cpwl_wnd.cpp
@@ -664,9 +664,9 @@
 CFX_Color CPWL_Wnd::GetBorderLeftTopColor(BorderStyle nBorderStyle) const {
   switch (nBorderStyle) {
     case BorderStyle::kBeveled:
-      return CFX_Color(CFX_Color::kGray, 1);
+      return CFX_Color(CFX_Color::Type::kGray, 1);
     case BorderStyle::kInset:
-      return CFX_Color(CFX_Color::kGray, 0.5f);
+      return CFX_Color(CFX_Color::Type::kGray, 0.5f);
     default:
       return CFX_Color();
   }
@@ -677,7 +677,7 @@
     case BorderStyle::kBeveled:
       return GetBackgroundColor() / 2.0f;
     case BorderStyle::kInset:
-      return CFX_Color(CFX_Color::kGray, 0.75f);
+      return CFX_Color(CFX_Color::Type::kGray, 0.75f);
     default:
       return CFX_Color();
   }
diff --git a/fpdfsdk/pwl/cpwl_wnd.h b/fpdfsdk/pwl/cpwl_wnd.h
index 77271e6..c51fd12 100644
--- a/fpdfsdk/pwl/cpwl_wnd.h
+++ b/fpdfsdk/pwl/cpwl_wnd.h
@@ -82,8 +82,8 @@
 
 #define PWL_SCROLLBAR_WIDTH 12.0f
 #define PWL_SCROLLBAR_TRANSPARENCY 150
-#define PWL_DEFAULT_BLACKCOLOR CFX_Color(CFX_Color::kGray, 0)
-#define PWL_DEFAULT_WHITECOLOR CFX_Color(CFX_Color::kGray, 1)
+#define PWL_DEFAULT_BLACKCOLOR CFX_Color(CFX_Color::Type::kGray, 0)
+#define PWL_DEFAULT_WHITECOLOR CFX_Color(CFX_Color::Type::kGray, 1)
 
 class CPWL_Wnd : public Observable {
  public:
diff --git a/fxjs/cjs_color.cpp b/fxjs/cjs_color.cpp
index 43fc1d0..b6ea5fe 100644
--- a/fxjs/cjs_color.cpp
+++ b/fxjs/cjs_color.cpp
@@ -55,23 +55,23 @@
                                                        const CFX_Color& color) {
   v8::Local<v8::Array> array;
   switch (color.nColorType) {
-    case CFX_Color::kTransparent:
+    case CFX_Color::Type::kTransparent:
       array = pRuntime->NewArray();
       pRuntime->PutArrayElement(array, 0, pRuntime->NewString("T"));
       break;
-    case CFX_Color::kGray:
+    case CFX_Color::Type::kGray:
       array = pRuntime->NewArray();
       pRuntime->PutArrayElement(array, 0, pRuntime->NewString("G"));
       pRuntime->PutArrayElement(array, 1, pRuntime->NewNumber(color.fColor1));
       break;
-    case CFX_Color::kRGB:
+    case CFX_Color::Type::kRGB:
       array = pRuntime->NewArray();
       pRuntime->PutArrayElement(array, 0, pRuntime->NewString("RGB"));
       pRuntime->PutArrayElement(array, 1, pRuntime->NewNumber(color.fColor1));
       pRuntime->PutArrayElement(array, 2, pRuntime->NewNumber(color.fColor2));
       pRuntime->PutArrayElement(array, 3, pRuntime->NewNumber(color.fColor3));
       break;
-    case CFX_Color::kCMYK:
+    case CFX_Color::Type::kCMYK:
       array = pRuntime->NewArray();
       pRuntime->PutArrayElement(array, 0, pRuntime->NewString("CMYK"));
       pRuntime->PutArrayElement(array, 1, pRuntime->NewNumber(color.fColor1));
@@ -93,7 +93,7 @@
   WideString sSpace =
       pRuntime->ToWideString(pRuntime->GetArrayElement(array, 0));
   if (sSpace.EqualsASCII("T"))
-    return CFX_Color(CFX_Color::kTransparent);
+    return CFX_Color(CFX_Color::Type::kTransparent);
 
   float d1 = 0;
   if (nArrayLen > 1) {
@@ -101,7 +101,7 @@
         pRuntime->ToDouble(pRuntime->GetArrayElement(array, 1)));
   }
   if (sSpace.EqualsASCII("G"))
-    return CFX_Color(CFX_Color::kGray, d1);
+    return CFX_Color(CFX_Color::Type::kGray, d1);
 
   float d2 = 0;
   float d3 = 0;
@@ -114,7 +114,7 @@
         pRuntime->ToDouble(pRuntime->GetArrayElement(array, 3)));
   }
   if (sSpace.EqualsASCII("RGB"))
-    return CFX_Color(CFX_Color::kRGB, d1, d2, d3);
+    return CFX_Color(CFX_Color::Type::kRGB, d1, d2, d3);
 
   float d4 = 0;
   if (nArrayLen > 4) {
@@ -122,25 +122,25 @@
         pRuntime->ToDouble(pRuntime->GetArrayElement(array, 4)));
   }
   if (sSpace.EqualsASCII("CMYK"))
-    return CFX_Color(CFX_Color::kCMYK, d1, d2, d3, d4);
+    return CFX_Color(CFX_Color::Type::kCMYK, d1, d2, d3, d4);
 
   return CFX_Color();
 }
 
 CJS_Color::CJS_Color(v8::Local<v8::Object> pObject, CJS_Runtime* pRuntime)
     : CJS_Object(pObject, pRuntime),
-      m_crTransparent(CFX_Color::kTransparent),
-      m_crBlack(CFX_Color::kGray, 0),
-      m_crWhite(CFX_Color::kGray, 1),
-      m_crRed(CFX_Color::kRGB, 1, 0, 0),
-      m_crGreen(CFX_Color::kRGB, 0, 1, 0),
-      m_crBlue(CFX_Color::kRGB, 0, 0, 1),
-      m_crCyan(CFX_Color::kCMYK, 1, 0, 0, 0),
-      m_crMagenta(CFX_Color::kCMYK, 0, 1, 0, 0),
-      m_crYellow(CFX_Color::kCMYK, 0, 0, 1, 0),
-      m_crDKGray(CFX_Color::kGray, 0.25),
-      m_crGray(CFX_Color::kGray, 0.5),
-      m_crLTGray(CFX_Color::kGray, 0.75) {}
+      m_crTransparent(CFX_Color::Type::kTransparent),
+      m_crBlack(CFX_Color::Type::kGray, 0),
+      m_crWhite(CFX_Color::Type::kGray, 1),
+      m_crRed(CFX_Color::Type::kRGB, 1, 0, 0),
+      m_crGreen(CFX_Color::Type::kRGB, 0, 1, 0),
+      m_crBlue(CFX_Color::Type::kRGB, 0, 0, 1),
+      m_crCyan(CFX_Color::Type::kCMYK, 1, 0, 0, 0),
+      m_crMagenta(CFX_Color::Type::kCMYK, 0, 1, 0, 0),
+      m_crYellow(CFX_Color::Type::kCMYK, 0, 0, 1, 0),
+      m_crDKGray(CFX_Color::Type::kGray, 0.25),
+      m_crGray(CFX_Color::Type::kGray, 0.5),
+      m_crLTGray(CFX_Color::Type::kGray, 0.75) {}
 
 CJS_Color::~CJS_Color() = default;
 
@@ -278,15 +278,15 @@
     return CJS_Result::Failure(JSMessage::kTypeError);
 
   WideString sDestSpace = pRuntime->ToWideString(params[1]);
-  int nColorType = CFX_Color::kTransparent;
+  CFX_Color::Type nColorType = CFX_Color::Type::kTransparent;
   if (sDestSpace.EqualsASCII("T"))
-    nColorType = CFX_Color::kTransparent;
+    nColorType = CFX_Color::Type::kTransparent;
   else if (sDestSpace.EqualsASCII("G"))
-    nColorType = CFX_Color::kGray;
+    nColorType = CFX_Color::Type::kGray;
   else if (sDestSpace.EqualsASCII("RGB"))
-    nColorType = CFX_Color::kRGB;
+    nColorType = CFX_Color::Type::kRGB;
   else if (sDestSpace.EqualsASCII("CMYK"))
-    nColorType = CFX_Color::kCMYK;
+    nColorType = CFX_Color::Type::kCMYK;
 
   CFX_Color color =
       ConvertArrayToPWLColor(pRuntime, pRuntime->ToArray(params[0]));
@@ -312,7 +312,7 @@
       ConvertArrayToPWLColor(pRuntime, pRuntime->ToArray(params[1]));
 
   // Relies on higher values having more components.
-  int32_t best = std::max(color1.nColorType, color2.nColorType);
+  CFX_Color::Type best = std::max(color1.nColorType, color2.nColorType);
   return CJS_Result::Success(pRuntime->NewBoolean(
       color1.ConvertColorType(best) == color2.ConvertColorType(best)));
 }
diff --git a/fxjs/cjs_field.cpp b/fxjs/cjs_field.cpp
index 460c2f8..37411d4 100644
--- a/fxjs/cjs_field.cpp
+++ b/fxjs/cjs_field.cpp
@@ -1298,18 +1298,18 @@
 
   CFX_Color color;
   CFX_Color::Type iColorType = pFormControl->GetBackgroundColor().first;
-  if (iColorType == CFX_Color::kTransparent) {
-    color = CFX_Color(CFX_Color::kTransparent);
-  } else if (iColorType == CFX_Color::kGray) {
-    color = CFX_Color(CFX_Color::kGray,
+  if (iColorType == CFX_Color::Type::kTransparent) {
+    color = CFX_Color(CFX_Color::Type::kTransparent);
+  } else if (iColorType == CFX_Color::Type::kGray) {
+    color = CFX_Color(CFX_Color::Type::kGray,
                       pFormControl->GetOriginalBackgroundColorComponent(0));
-  } else if (iColorType == CFX_Color::kRGB) {
-    color = CFX_Color(CFX_Color::kRGB,
+  } else if (iColorType == CFX_Color::Type::kRGB) {
+    color = CFX_Color(CFX_Color::Type::kRGB,
                       pFormControl->GetOriginalBackgroundColorComponent(0),
                       pFormControl->GetOriginalBackgroundColorComponent(1),
                       pFormControl->GetOriginalBackgroundColorComponent(2));
-  } else if (iColorType == CFX_Color::kCMYK) {
-    color = CFX_Color(CFX_Color::kCMYK,
+  } else if (iColorType == CFX_Color::Type::kCMYK) {
+    color = CFX_Color(CFX_Color::Type::kCMYK,
                       pFormControl->GetOriginalBackgroundColorComponent(0),
                       pFormControl->GetOriginalBackgroundColorComponent(1),
                       pFormControl->GetOriginalBackgroundColorComponent(2),
@@ -1825,18 +1825,18 @@
 
   CFX_Color color;
   CFX_Color::Type iColorType = pFormControl->GetBorderColorARGB().first;
-  if (iColorType == CFX_Color::kTransparent) {
-    color = CFX_Color(CFX_Color::kTransparent);
-  } else if (iColorType == CFX_Color::kGray) {
-    color = CFX_Color(CFX_Color::kGray,
+  if (iColorType == CFX_Color::Type::kTransparent) {
+    color = CFX_Color(CFX_Color::Type::kTransparent);
+  } else if (iColorType == CFX_Color::Type::kGray) {
+    color = CFX_Color(CFX_Color::Type::kGray,
                       pFormControl->GetOriginalBorderColorComponent(0));
-  } else if (iColorType == CFX_Color::kRGB) {
-    color = CFX_Color(CFX_Color::kRGB,
+  } else if (iColorType == CFX_Color::Type::kRGB) {
+    color = CFX_Color(CFX_Color::Type::kRGB,
                       pFormControl->GetOriginalBorderColorComponent(0),
                       pFormControl->GetOriginalBorderColorComponent(1),
                       pFormControl->GetOriginalBorderColorComponent(2));
-  } else if (iColorType == CFX_Color::kCMYK) {
-    color = CFX_Color(CFX_Color::kCMYK,
+  } else if (iColorType == CFX_Color::Type::kCMYK) {
+    color = CFX_Color(CFX_Color::Type::kCMYK,
                       pFormControl->GetOriginalBorderColorComponent(0),
                       pFormControl->GetOriginalBorderColorComponent(1),
                       pFormControl->GetOriginalBorderColorComponent(2),
@@ -1935,13 +1935,14 @@
 
   CFX_Color crRet;
   if (maybe_type_argb_pair.has_value() &&
-      maybe_type_argb_pair.value().first != CFX_Color::kTransparent) {
+      maybe_type_argb_pair.value().first != CFX_Color::Type::kTransparent) {
     int32_t a;
     int32_t r;
     int32_t g;
     int32_t b;
     std::tie(a, r, g, b) = ArgbDecode(maybe_type_argb_pair.value().second);
-    crRet = CFX_Color(CFX_Color::kRGB, r / 255.0f, g / 255.0f, b / 255.0f);
+    crRet =
+        CFX_Color(CFX_Color::Type::kRGB, r / 255.0f, g / 255.0f, b / 255.0f);
   }
 
   v8::Local<v8::Value> array =