Break circular dependency between fxge and fpdfdoc.

Move some functions from core/fxge/cfx_color.h to
core/fpdfdoc/cpdf_color_utils.h, and move an enum from
core/fpdfdoc/cpdf_defaultappearance.h to core/fxge/cfx_renderdevice.h.

Change-Id: I9a58f486abaa2c1a1506388bd9a2951876c1207a
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/54910
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfdoc/BUILD.gn b/core/fpdfdoc/BUILD.gn
index d586e11..5e8d257 100644
--- a/core/fpdfdoc/BUILD.gn
+++ b/core/fpdfdoc/BUILD.gn
@@ -26,6 +26,8 @@
     "cpdf_bookmark.h",
     "cpdf_bookmarktree.cpp",
     "cpdf_bookmarktree.h",
+    "cpdf_color_utils.cpp",
+    "cpdf_color_utils.h",
     "cpdf_defaultappearance.cpp",
     "cpdf_defaultappearance.h",
     "cpdf_dest.cpp",
@@ -94,7 +96,6 @@
     "../fxge",
   ]
   allow_circular_includes_from = [
-    "../fxge",
     "../fpdfapi/parser",
     "../fpdfapi/page",
     "../fpdfapi/render",
diff --git a/core/fpdfdoc/cpdf_color_utils.cpp b/core/fpdfdoc/cpdf_color_utils.cpp
new file mode 100644
index 0000000..198b1ca
--- /dev/null
+++ b/core/fpdfdoc/cpdf_color_utils.cpp
@@ -0,0 +1,53 @@
+// Copyright 2019 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/cpdf_color_utils.h"
+
+#include "core/fpdfapi/parser/cpdf_array.h"
+#include "core/fpdfdoc/cpdf_defaultappearance.h"
+#include "core/fxcrt/bytestring.h"
+
+namespace fpdfdoc {
+
+CFX_Color CFXColorFromArray(const CPDF_Array& array) {
+  CFX_Color rt;
+  switch (array.size()) {
+    case 1:
+      rt = CFX_Color(CFX_Color::kGray, array.GetNumberAt(0));
+      break;
+    case 3:
+      rt = CFX_Color(CFX_Color::kRGB, array.GetNumberAt(0),
+                     array.GetNumberAt(1), array.GetNumberAt(2));
+      break;
+    case 4:
+      rt = CFX_Color(CFX_Color::kCMYK, array.GetNumberAt(0),
+                     array.GetNumberAt(1), array.GetNumberAt(2),
+                     array.GetNumberAt(3));
+      break;
+  }
+  return rt;
+}
+
+CFX_Color CFXColorFromString(const ByteString& str) {
+  CPDF_DefaultAppearance appearance(str);
+  float values[4];
+  Optional<CFX_Color::Type> color_type = appearance.GetColor(values);
+  if (!color_type || *color_type == CFX_Color::kTransparent)
+    return CFX_Color(CFX_Color::kTransparent);
+  if (*color_type == CFX_Color::kGray)
+    return CFX_Color(CFX_Color::kGray, values[0]);
+  if (*color_type == CFX_Color::kRGB)
+    return CFX_Color(CFX_Color::kRGB, values[0], values[1], values[2]);
+  if (*color_type == CFX_Color::kCMYK) {
+    return CFX_Color(CFX_Color::kCMYK, values[0], values[1], values[2],
+                     values[3]);
+  }
+
+  NOTREACHED();
+  return CFX_Color(CFX_Color::kTransparent);
+}
+
+}  // namespace fpdfdoc
diff --git a/core/fpdfdoc/cpdf_color_utils.h b/core/fpdfdoc/cpdf_color_utils.h
new file mode 100644
index 0000000..993a7d7
--- /dev/null
+++ b/core/fpdfdoc/cpdf_color_utils.h
@@ -0,0 +1,25 @@
+// Copyright 2019 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_CPDF_COLOR_UTILS_H_
+#define CORE_FPDFDOC_CPDF_COLOR_UTILS_H_
+
+#include "core/fxge/cfx_color.h"
+
+class CPDF_Array;
+
+namespace fxcrt {
+class ByteString;
+}
+
+namespace fpdfdoc {
+
+CFX_Color CFXColorFromArray(const CPDF_Array& array);
+CFX_Color CFXColorFromString(const fxcrt::ByteString& str);
+
+}  // namespace fpdfdoc
+
+#endif  // CORE_FPDFDOC_CPDF_COLOR_UTILS_H_
diff --git a/core/fpdfdoc/cpdf_defaultappearance.h b/core/fpdfdoc/cpdf_defaultappearance.h
index c39842c..97762f8 100644
--- a/core/fpdfdoc/cpdf_defaultappearance.h
+++ b/core/fpdfdoc/cpdf_defaultappearance.h
@@ -15,8 +15,6 @@
 #include "core/fxge/cfx_color.h"
 #include "core/fxge/fx_dib.h"
 
-enum class BorderStyle { SOLID, DASH, BEVELED, INSET, UNDERLINE };
-
 class CPDF_DefaultAppearance {
  public:
   CPDF_DefaultAppearance() {}
diff --git a/core/fpdfdoc/cpvt_generateap.cpp b/core/fpdfdoc/cpvt_generateap.cpp
index adaff5d..ade105f 100644
--- a/core/fpdfdoc/cpvt_generateap.cpp
+++ b/core/fpdfdoc/cpvt_generateap.cpp
@@ -26,11 +26,13 @@
 #include "core/fpdfapi/parser/fpdf_parser_decode.h"
 #include "core/fpdfapi/parser/fpdf_parser_utility.h"
 #include "core/fpdfdoc/cpdf_annot.h"
+#include "core/fpdfdoc/cpdf_color_utils.h"
 #include "core/fpdfdoc/cpdf_defaultappearance.h"
 #include "core/fpdfdoc/cpdf_formfield.h"
 #include "core/fpdfdoc/cpdf_variabletext.h"
 #include "core/fpdfdoc/cpvt_fontmap.h"
 #include "core/fpdfdoc/cpvt_word.h"
+#include "core/fxge/cfx_renderdevice.h"
 #include "third_party/base/ptr_util.h"
 
 namespace {
@@ -308,7 +310,7 @@
                                      const CFX_Color& crDefaultColor,
                                      PaintOperation nOperation) {
   if (pColor) {
-    CFX_Color color = CFX_Color::ParseColor(*pColor);
+    CFX_Color color = fpdfdoc::CFXColorFromArray(*pColor);
     return GenerateColorAP(color, nOperation);
   }
 
@@ -934,7 +936,7 @@
     return;
 
   ByteString font_name = *font;
-  CFX_Color crText = CFX_Color::ParseColor(DA);
+  CFX_Color crText = fpdfdoc::CFXColorFromString(DA);
   CPDF_Dictionary* pDRDict = pFormDict->GetDictFor("DR");
   if (!pDRDict)
     return;
@@ -1030,9 +1032,9 @@
   CFX_Color crBG;
   if (CPDF_Dictionary* pMKDict = pAnnotDict->GetDictFor("MK")) {
     if (CPDF_Array* pArray = pMKDict->GetArrayFor("BC"))
-      crBorder = CFX_Color::ParseColor(*pArray);
+      crBorder = fpdfdoc::CFXColorFromArray(*pArray);
     if (CPDF_Array* pArray = pMKDict->GetArrayFor("BG"))
-      crBG = CFX_Color::ParseColor(*pArray);
+      crBG = fpdfdoc::CFXColorFromArray(*pArray);
   }
   std::ostringstream sAppStream;
   ByteString sBG = GenerateColorAP(crBG, PaintOperation::FILL);
diff --git a/core/fxge/cfx_color.cpp b/core/fxge/cfx_color.cpp
index da60e67..99330bc 100644
--- a/core/fxge/cfx_color.cpp
+++ b/core/fxge/cfx_color.cpp
@@ -8,9 +8,6 @@
 
 #include <algorithm>
 
-#include "core/fpdfapi/parser/cpdf_array.h"
-#include "core/fpdfdoc/cpdf_defaultappearance.h"
-
 // 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,
@@ -72,46 +69,6 @@
 
 }  // namespace
 
-// Static.
-CFX_Color CFX_Color::ParseColor(const CPDF_Array& array) {
-  CFX_Color rt;
-  switch (array.size()) {
-    case 1:
-      rt = CFX_Color(CFX_Color::kGray, array.GetNumberAt(0));
-      break;
-    case 3:
-      rt = CFX_Color(CFX_Color::kRGB, array.GetNumberAt(0),
-                     array.GetNumberAt(1), array.GetNumberAt(2));
-      break;
-    case 4:
-      rt = CFX_Color(CFX_Color::kCMYK, array.GetNumberAt(0),
-                     array.GetNumberAt(1), array.GetNumberAt(2),
-                     array.GetNumberAt(3));
-      break;
-  }
-  return rt;
-}
-
-// Static.
-CFX_Color CFX_Color::ParseColor(const ByteString& str) {
-  CPDF_DefaultAppearance appearance(str);
-  float values[4];
-  Optional<CFX_Color::Type> color_type = appearance.GetColor(values);
-  if (!color_type || *color_type == CFX_Color::kTransparent)
-    return CFX_Color(CFX_Color::kTransparent);
-  if (*color_type == CFX_Color::kGray)
-    return CFX_Color(CFX_Color::kGray, values[0]);
-  if (*color_type == CFX_Color::kRGB)
-    return CFX_Color(CFX_Color::kRGB, values[0], values[1], values[2]);
-  if (*color_type == CFX_Color::kCMYK) {
-    return CFX_Color(CFX_Color::kCMYK, values[0], values[1], values[2],
-                     values[3]);
-  }
-
-  NOTREACHED();
-  return CFX_Color(CFX_Color::kTransparent);
-}
-
 CFX_Color CFX_Color::ConvertColorType(int32_t nConvertColorType) const {
   if (nColorType == nConvertColorType)
     return *this;
diff --git a/core/fxge/cfx_color.h b/core/fxge/cfx_color.h
index 251962a..46893b9 100644
--- a/core/fxge/cfx_color.h
+++ b/core/fxge/cfx_color.h
@@ -7,15 +7,9 @@
 #ifndef CORE_FXGE_CFX_COLOR_H_
 #define CORE_FXGE_CFX_COLOR_H_
 
-#include "core/fxcrt/fx_string.h"
 #include "core/fxge/fx_dib.h"
 
-class CPDF_Array;
-
 struct CFX_Color {
-  static CFX_Color ParseColor(const CPDF_Array& array);
-  static CFX_Color ParseColor(const ByteString& str);
-
   // Ordered by increasing number of components.
   enum Type { kTransparent = 0, kGray, kRGB, kCMYK };
 
diff --git a/core/fxge/cfx_renderdevice.cpp b/core/fxge/cfx_renderdevice.cpp
index 4cc9028..f529068 100644
--- a/core/fxge/cfx_renderdevice.cpp
+++ b/core/fxge/cfx_renderdevice.cpp
@@ -12,6 +12,7 @@
 
 #include "build/build_config.h"
 #include "core/fxcrt/fx_safe_types.h"
+#include "core/fxge/cfx_color.h"
 #include "core/fxge/cfx_defaultrenderdevice.h"
 #include "core/fxge/cfx_font.h"
 #include "core/fxge/cfx_fontmgr.h"
diff --git a/core/fxge/cfx_renderdevice.h b/core/fxge/cfx_renderdevice.h
index b4c53ef..11d8337 100644
--- a/core/fxge/cfx_renderdevice.h
+++ b/core/fxge/cfx_renderdevice.h
@@ -11,7 +11,6 @@
 #include <vector>
 
 #include "build/build_config.h"
-#include "core/fpdfdoc/cpdf_defaultappearance.h"
 #include "core/fxcrt/fx_coordinates.h"
 #include "core/fxcrt/unowned_ptr.h"
 #include "core/fxge/fx_dib.h"
@@ -68,6 +67,8 @@
 class RenderDeviceDriverIface;
 struct CFX_Color;
 
+enum class BorderStyle { SOLID, DASH, BEVELED, INSET, UNDERLINE };
+
 enum class FXPT_TYPE : uint8_t { LineTo, BezierTo, MoveTo };
 
 class TextCharPos {
diff --git a/fpdfsdk/cpdfsdk_baannot.h b/fpdfsdk/cpdfsdk_baannot.h
index 5f79096..9430c2d 100644
--- a/fpdfsdk/cpdfsdk_baannot.h
+++ b/fpdfsdk/cpdfsdk_baannot.h
@@ -10,14 +10,13 @@
 #include "core/fpdfdoc/cpdf_aaction.h"
 #include "core/fpdfdoc/cpdf_action.h"
 #include "core/fpdfdoc/cpdf_annot.h"
-#include "core/fpdfdoc/cpdf_defaultappearance.h"
 #include "core/fxcrt/fx_coordinates.h"
 #include "core/fxcrt/fx_string.h"
+#include "core/fxge/cfx_renderdevice.h"
 #include "fpdfsdk/cfx_systemhandler.h"
 #include "fpdfsdk/cpdfsdk_annot.h"
 
 class CFX_Matrix;
-class CFX_RenderDevice;
 class CPDF_Dictionary;
 class CPDF_RenderOptions;
 class CPDFSDK_PageView;
diff --git a/fpdfsdk/fpdf_annot.cpp b/fpdfsdk/fpdf_annot.cpp
index 0028119..f8bb967 100644
--- a/fpdfsdk/fpdf_annot.cpp
+++ b/fpdfsdk/fpdf_annot.cpp
@@ -20,6 +20,7 @@
 #include "core/fpdfapi/parser/cpdf_stream.h"
 #include "core/fpdfapi/parser/cpdf_string.h"
 #include "core/fpdfdoc/cpdf_annot.h"
+#include "core/fpdfdoc/cpdf_color_utils.h"
 #include "core/fpdfdoc/cpdf_formfield.h"
 #include "core/fpdfdoc/cpdf_interactiveform.h"
 #include "core/fpdfdoc/cpvt_generateap.h"
@@ -550,7 +551,7 @@
     return true;
   }
 
-  CFX_Color color = CFX_Color::ParseColor(*pColor);
+  CFX_Color color = fpdfdoc::CFXColorFromArray(*pColor);
   switch (color.nColorType) {
     case CFX_Color::kRGB:
       *R = color.fColor1 * 255.f;
diff --git a/fpdfsdk/pwl/cpwl_wnd.h b/fpdfsdk/pwl/cpwl_wnd.h
index 5b1c7cc..2fe605e 100644
--- a/fpdfsdk/pwl/cpwl_wnd.h
+++ b/fpdfsdk/pwl/cpwl_wnd.h
@@ -14,6 +14,7 @@
 #include "core/fxcrt/observable.h"
 #include "core/fxcrt/unowned_ptr.h"
 #include "core/fxge/cfx_color.h"
+#include "core/fxge/cfx_renderdevice.h"
 #include "fpdfsdk/cpdfsdk_formfillenvironment.h"
 #include "fpdfsdk/cpdfsdk_widget.h"
 #include "fpdfsdk/pwl/cpwl_timer.h"