diff --git a/core/fpdfdoc/cpdf_apsettings.cpp b/core/fpdfdoc/cpdf_apsettings.cpp
index cc19e7b..f709ecd 100644
--- a/core/fpdfdoc/cpdf_apsettings.cpp
+++ b/core/fpdfdoc/cpdf_apsettings.cpp
@@ -26,42 +26,37 @@
   return m_pDict ? m_pDict->GetIntegerFor("R") : 0;
 }
 
-FX_ARGB CPDF_ApSettings::GetColorARGB(int& iColorType,
-                                      const ByteString& csEntry) const {
-  iColorType = CFX_Color::kTransparent;
+std::pair<CFX_Color::Type, FX_ARGB> CPDF_ApSettings::GetColorARGB(
+    const ByteString& csEntry) const {
   if (!m_pDict)
-    return 0;
+    return {CFX_Color::kTransparent, 0};
 
   CPDF_Array* pEntry = m_pDict->GetArrayFor(csEntry);
   if (!pEntry)
-    return 0;
+    return {CFX_Color::kTransparent, 0};
 
-  FX_ARGB color = 0;
-  size_t dwCount = pEntry->size();
+  const size_t dwCount = pEntry->size();
   if (dwCount == 1) {
-    iColorType = CFX_Color::kGray;
-    float g = pEntry->GetNumberAt(0) * 255;
-    return ArgbEncode(255, (int)g, (int)g, (int)g);
+    const float g = pEntry->GetNumberAt(0) * 255;
+    return {CFX_Color::kGray, ArgbEncode(255, (int)g, (int)g, (int)g)};
   }
   if (dwCount == 3) {
-    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);
+    return {CFX_Color::kRGB, ArgbEncode(255, (int)r, (int)g, (int)b)};
   }
   if (dwCount == 4) {
-    iColorType = CFX_Color::kCMYK;
     float c = pEntry->GetNumberAt(0);
     float m = pEntry->GetNumberAt(1);
     float y = pEntry->GetNumberAt(2);
     float k = pEntry->GetNumberAt(3);
-    float r = 1.0f - std::min(1.0f, c + k);
-    float g = 1.0f - std::min(1.0f, m + k);
-    float b = 1.0f - std::min(1.0f, y + k);
-    return ArgbEncode(255, (int)(r * 255), (int)(g * 255), (int)(b * 255));
+    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 color;
+  return {CFX_Color::kTransparent, 0};
 }
 
 float CPDF_ApSettings::GetOriginalColorComponent(
diff --git a/core/fpdfdoc/cpdf_apsettings.h b/core/fpdfdoc/cpdf_apsettings.h
index a1d9ecd..b96ffe6 100644
--- a/core/fpdfdoc/cpdf_apsettings.h
+++ b/core/fpdfdoc/cpdf_apsettings.h
@@ -7,6 +7,8 @@
 #ifndef CORE_FPDFDOC_CPDF_APSETTINGS_H_
 #define CORE_FPDFDOC_CPDF_APSETTINGS_H_
 
+#include <utility>
+
 #include "core/fpdfdoc/cpdf_iconfit.h"
 #include "core/fxcrt/fx_string.h"
 #include "core/fxcrt/fx_system.h"
@@ -41,7 +43,9 @@
   // Returns one of the TEXTPOS_* values above.
   int GetTextPosition() const;
 
-  FX_ARGB GetColorARGB(int& iColorType, const ByteString& csEntry) const;
+  std::pair<CFX_Color::Type, FX_ARGB> GetColorARGB(
+      const ByteString& csEntry) const;
+
   float GetOriginalColorComponent(int index, const ByteString& csEntry) const;
   CFX_Color GetOriginalColor(const ByteString& csEntry) const;
 
diff --git a/core/fpdfdoc/cpdf_defaultappearance.cpp b/core/fpdfdoc/cpdf_defaultappearance.cpp
index 012c255..1b83d13 100644
--- a/core/fpdfdoc/cpdf_defaultappearance.cpp
+++ b/core/fpdfdoc/cpdf_defaultappearance.cpp
@@ -54,6 +54,16 @@
 
 }  // namespace
 
+CPDF_DefaultAppearance::CPDF_DefaultAppearance() = default;
+
+CPDF_DefaultAppearance::CPDF_DefaultAppearance(const ByteString& csDA)
+    : m_csDA(csDA) {}
+
+CPDF_DefaultAppearance::CPDF_DefaultAppearance(
+    const CPDF_DefaultAppearance& cDA) = default;
+
+CPDF_DefaultAppearance::~CPDF_DefaultAppearance() = default;
+
 Optional<ByteString> CPDF_DefaultAppearance::GetFont(float* fFontSize) {
   *fFontSize = 0.0f;
   if (m_csDA.IsEmpty())
@@ -95,33 +105,36 @@
   return {};
 }
 
-std::pair<Optional<CFX_Color::Type>, FX_ARGB>
+Optional<std::pair<CFX_Color::Type, FX_ARGB>>
 CPDF_DefaultAppearance::GetColorARGB() const {
   Optional<CFX_Color> maybe_color = GetColor();
   if (!maybe_color.has_value())
-    return {{}, 0};
+    return pdfium::nullopt;
 
   const CFX_Color& color = maybe_color.value();
   if (color.nColorType == CFX_Color::kGray) {
     int g = static_cast<int>(color.fColor1 * 255 + 0.5f);
-    return {CFX_Color::kGray, ArgbEncode(255, g, g, g)};
+    return std::pair<CFX_Color::Type, FX_ARGB>(CFX_Color::kGray,
+                                               ArgbEncode(255, g, g, g));
   }
   if (color.nColorType == CFX_Color::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 {CFX_Color::kRGB, ArgbEncode(255, r, g, b)};
+    return std::pair<CFX_Color::Type, FX_ARGB>(CFX_Color::kRGB,
+                                               ArgbEncode(255, r, g, b));
   }
   if (color.nColorType == CFX_Color::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 {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))};
+    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)));
   }
   NOTREACHED();
-  return {{}, 0};
+  return pdfium::nullopt;
 }
 
 bool CPDF_DefaultAppearance::FindTagParamFromStartForTesting(
diff --git a/core/fpdfdoc/cpdf_defaultappearance.h b/core/fpdfdoc/cpdf_defaultappearance.h
index 0319899..319da71 100644
--- a/core/fpdfdoc/cpdf_defaultappearance.h
+++ b/core/fpdfdoc/cpdf_defaultappearance.h
@@ -17,15 +17,15 @@
 
 class CPDF_DefaultAppearance {
  public:
-  CPDF_DefaultAppearance() = default;
-  explicit CPDF_DefaultAppearance(const ByteString& csDA) : m_csDA(csDA) {}
-  CPDF_DefaultAppearance(const CPDF_DefaultAppearance& cDA)
-      : m_csDA(cDA.m_csDA) {}
+  CPDF_DefaultAppearance();
+  explicit CPDF_DefaultAppearance(const ByteString& csDA);
+  CPDF_DefaultAppearance(const CPDF_DefaultAppearance& cDA);
+  ~CPDF_DefaultAppearance();
 
   Optional<ByteString> GetFont(float* fFontSize);
 
   Optional<CFX_Color> GetColor() const;
-  std::pair<Optional<CFX_Color::Type>, FX_ARGB> GetColorARGB() const;
+  Optional<std::pair<CFX_Color::Type, FX_ARGB>> GetColorARGB() const;
 
   bool FindTagParamFromStartForTesting(CPDF_SimpleParser* parser,
                                        ByteStringView token,
diff --git a/core/fpdfdoc/cpdf_formcontrol.cpp b/core/fpdfdoc/cpdf_formcontrol.cpp
index dc59ad0..50dcc17 100644
--- a/core/fpdfdoc/cpdf_formcontrol.cpp
+++ b/core/fpdfdoc/cpdf_formcontrol.cpp
@@ -147,9 +147,9 @@
   return GetMK().GetRotation();
 }
 
-FX_ARGB CPDF_FormControl::GetColorARGB(int& iColorType,
-                                       const ByteString& csEntry) {
-  return GetMK().GetColorARGB(iColorType, csEntry);
+std::pair<CFX_Color::Type, FX_ARGB> CPDF_FormControl::GetColorARGB(
+    const ByteString& csEntry) {
+  return GetMK().GetColorARGB(csEntry);
 }
 
 float CPDF_FormControl::GetOriginalColorComponent(int index,
diff --git a/core/fpdfdoc/cpdf_formcontrol.h b/core/fpdfdoc/cpdf_formcontrol.h
index 4ae8949..1e82e36 100644
--- a/core/fpdfdoc/cpdf_formcontrol.h
+++ b/core/fpdfdoc/cpdf_formcontrol.h
@@ -7,6 +7,8 @@
 #ifndef CORE_FPDFDOC_CPDF_FORMCONTROL_H_
 #define CORE_FPDFDOC_CPDF_FORMCONTROL_H_
 
+#include <utility>
+
 #include "core/fpdfdoc/cpdf_aaction.h"
 #include "core/fpdfdoc/cpdf_action.h"
 #include "core/fpdfdoc/cpdf_annot.h"
@@ -19,6 +21,7 @@
 #include "core/fxcrt/fx_string.h"
 #include "core/fxcrt/retain_ptr.h"
 #include "core/fxcrt/unowned_ptr.h"
+#include "core/fxge/cfx_color.h"
 #include "core/fxge/dib/fx_dib.h"
 #include "third_party/base/optional.h"
 
@@ -53,8 +56,8 @@
   bool HasMKEntry(const ByteString& csEntry) const;
   int GetRotation() const;
 
-  FX_ARGB GetBorderColorARGB(int& iColorType) {
-    return GetColorARGB(iColorType, "BC");
+  std::pair<CFX_Color::Type, FX_ARGB> GetBorderColorARGB() {
+    return GetColorARGB("BC");
   }
 
   float GetOriginalBorderColorComponent(int index) {
@@ -63,8 +66,8 @@
 
   CFX_Color GetOriginalBorderColor() { return GetOriginalColor("BC"); }
 
-  FX_ARGB GetBackgroundColor(int& iColorType) {
-    return GetColorARGB(iColorType, "BG");
+  std::pair<CFX_Color::Type, FX_ARGB> GetBackgroundColor() {
+    return GetColorARGB("BG");
   }
 
   float GetOriginalBackgroundColorComponent(int index) {
@@ -93,7 +96,7 @@
 
  private:
   RetainPtr<CPDF_Font> GetDefaultControlFont() const;
-  FX_ARGB GetColorARGB(int& iColorType, const ByteString& csEntry);
+  std::pair<CFX_Color::Type, FX_ARGB> GetColorARGB(const ByteString& csEntry);
   float GetOriginalColorComponent(int index, const ByteString& csEntry);
   CFX_Color GetOriginalColor(const ByteString& csEntry);
 
diff --git a/fpdfsdk/cpdfsdk_widget.cpp b/fpdfsdk/cpdfsdk_widget.cpp
index a9cdd13..0021c2f 100644
--- a/fpdfsdk/cpdfsdk_widget.cpp
+++ b/fpdfsdk/cpdfsdk_widget.cpp
@@ -427,36 +427,36 @@
 #endif  // PDF_ENABLE_XFA
 
 Optional<FX_COLORREF> CPDFSDK_Widget::GetFillColor() const {
-  CPDF_FormControl* pFormCtrl = GetFormControl();
-  int iColorType = 0;
-  FX_COLORREF color = ArgbToColorRef(pFormCtrl->GetBackgroundColor(iColorType));
-  if (iColorType == CFX_Color::kTransparent)
-    return {};
-  return color;
+  std::pair<CFX_Color::Type, FX_ARGB> type_argb_pair =
+      GetFormControl()->GetBackgroundColor();
+
+  if (type_argb_pair.first == CFX_Color::kTransparent)
+    return pdfium::nullopt;
+
+  return ArgbToColorRef(type_argb_pair.second);
 }
 
 Optional<FX_COLORREF> CPDFSDK_Widget::GetBorderColor() const {
-  CPDF_FormControl* pFormCtrl = GetFormControl();
-  int iColorType = 0;
-  FX_COLORREF color = ArgbToColorRef(pFormCtrl->GetBorderColorARGB(iColorType));
-  if (iColorType == CFX_Color::kTransparent)
-    return {};
-  return color;
+  std::pair<CFX_Color::Type, FX_ARGB> type_argb_pair =
+      GetFormControl()->GetBorderColorARGB();
+  if (type_argb_pair.first == CFX_Color::kTransparent)
+    return pdfium::nullopt;
+
+  return ArgbToColorRef(type_argb_pair.second);
 }
 
 Optional<FX_COLORREF> CPDFSDK_Widget::GetTextColor() const {
-  CPDF_FormControl* pFormCtrl = GetFormControl();
-  CPDF_DefaultAppearance da = pFormCtrl->GetDefaultAppearance();
-  FX_ARGB argb;
-  Optional<CFX_Color::Type> iColorType;
-  std::tie(iColorType, argb) = da.GetColorARGB();
-  if (!iColorType.has_value())
-    return {};
+  CPDF_DefaultAppearance da = GetFormControl()->GetDefaultAppearance();
+  Optional<std::pair<CFX_Color::Type, FX_ARGB>> maybe_type_argb_pair =
+      da.GetColorARGB();
 
-  FX_COLORREF color = ArgbToColorRef(argb);
-  if (iColorType.value() == CFX_Color::kTransparent)
-    return {};
-  return color;
+  if (!maybe_type_argb_pair.has_value())
+    return pdfium::nullopt;
+
+  if (maybe_type_argb_pair.value().first == CFX_Color::kTransparent)
+    return pdfium::nullopt;
+
+  return ArgbToColorRef(maybe_type_argb_pair.value().second);
 }
 
 float CPDFSDK_Widget::GetFontSize() const {
diff --git a/fxjs/cjs_field.cpp b/fxjs/cjs_field.cpp
index 2af7b92..460c2f8 100644
--- a/fxjs/cjs_field.cpp
+++ b/fxjs/cjs_field.cpp
@@ -1296,10 +1296,8 @@
   if (!pFormControl)
     return CJS_Result::Failure(JSMessage::kBadObjectError);
 
-  int iColorType;
-  pFormControl->GetBackgroundColor(iColorType);
-
   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) {
@@ -1825,10 +1823,8 @@
   if (!pFormControl)
     return CJS_Result::Failure(JSMessage::kBadObjectError);
 
-  int iColorType;
-  (void)pFormControl->GetBorderColorARGB(iColorType);
-
   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) {
@@ -1933,20 +1929,18 @@
   if (!pFormControl)
     return CJS_Result::Failure(JSMessage::kBadObjectError);
 
-  Optional<CFX_Color::Type> iColorType;
-  FX_ARGB color;
   CPDF_DefaultAppearance FieldAppearance = pFormControl->GetDefaultAppearance();
-  std::tie(iColorType, color) = FieldAppearance.GetColorARGB();
+  Optional<std::pair<CFX_Color::Type, FX_ARGB>> maybe_type_argb_pair =
+      FieldAppearance.GetColorARGB();
 
   CFX_Color crRet;
-  if (!iColorType || *iColorType == CFX_Color::kTransparent) {
-    crRet = CFX_Color(CFX_Color::kTransparent);
-  } else {
+  if (maybe_type_argb_pair.has_value() &&
+      maybe_type_argb_pair.value().first != CFX_Color::kTransparent) {
     int32_t a;
     int32_t r;
     int32_t g;
     int32_t b;
-    std::tie(a, r, g, b) = ArgbDecode(color);
+    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);
   }
 
