Remove out parameter from CPDF_ApSettings::GetColorARGB().

Same for methods in CPDF_FormControl. Change return result from
CPDF_DefaultAppearance method for similariy.

-- use CFX_Color::Type enum consistently in place of int.
-- put some constructors into .cpp file while at it.

Change-Id: I0543b85dc72b17ae6da1bbcd8cb82928bc7045ec
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/80510
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 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);
   }