Move stock colorspace management out of CPDF_PageModule

Instead of having CPDF_PageModule be the holder for the stock
colorspaces, move them within cpdf_colorspace.cpp.

Change-Id: Ic7f19ebe0eac3037f224b76a6334c97a83dc95ab
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/112432
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfapi/page/cpdf_colorspace.cpp b/core/fpdfapi/page/cpdf_colorspace.cpp
index c52cbe2..1b3e987 100644
--- a/core/fpdfapi/page/cpdf_colorspace.cpp
+++ b/core/fpdfapi/page/cpdf_colorspace.cpp
@@ -21,7 +21,6 @@
 #include "core/fpdfapi/page/cpdf_function.h"
 #include "core/fpdfapi/page/cpdf_iccprofile.h"
 #include "core/fpdfapi/page/cpdf_indexedcs.h"
-#include "core/fpdfapi/page/cpdf_pagemodule.h"
 #include "core/fpdfapi/page/cpdf_pattern.h"
 #include "core/fpdfapi/page/cpdf_patterncs.h"
 #include "core/fpdfapi/parser/cpdf_array.h"
@@ -424,6 +423,47 @@
   *B = RGB_Conversion(RGB.c);
 }
 
+class StockColorSpaces {
+ public:
+  StockColorSpaces()
+      : gray_(pdfium::MakeRetain<CPDF_DeviceCS>(
+            CPDF_ColorSpace::Family::kDeviceGray)),
+        rgb_(pdfium::MakeRetain<CPDF_DeviceCS>(
+            CPDF_ColorSpace::Family::kDeviceRGB)),
+        cmyk_(pdfium::MakeRetain<CPDF_DeviceCS>(
+            CPDF_ColorSpace::Family::kDeviceCMYK)),
+        pattern_(pdfium::MakeRetain<CPDF_PatternCS>()) {
+    pattern_->InitializeStockPattern();
+  }
+  StockColorSpaces(const StockColorSpaces&) = delete;
+  StockColorSpaces& operator=(const StockColorSpaces&) = delete;
+  ~StockColorSpaces() = default;
+
+  RetainPtr<CPDF_ColorSpace> GetStockCS(CPDF_ColorSpace::Family family) {
+    if (family == CPDF_ColorSpace::Family::kDeviceGray) {
+      return gray_;
+    }
+    if (family == CPDF_ColorSpace::Family::kDeviceRGB) {
+      return rgb_;
+    }
+    if (family == CPDF_ColorSpace::Family::kDeviceCMYK) {
+      return cmyk_;
+    }
+    if (family == CPDF_ColorSpace::Family::kPattern) {
+      return pattern_;
+    }
+    NOTREACHED_NORETURN();
+  }
+
+ private:
+  RetainPtr<CPDF_DeviceCS> gray_;
+  RetainPtr<CPDF_DeviceCS> rgb_;
+  RetainPtr<CPDF_DeviceCS> cmyk_;
+  RetainPtr<CPDF_PatternCS> pattern_;
+};
+
+StockColorSpaces* g_stock_colorspaces = nullptr;
+
 }  // namespace
 
 PatternValue::PatternValue() = default;
@@ -437,6 +477,23 @@
 }
 
 // static
+void CPDF_ColorSpace::InitializeGlobals() {
+  CHECK(!g_stock_colorspaces);
+  g_stock_colorspaces = new StockColorSpaces();
+}
+
+// static
+void CPDF_ColorSpace::DestroyGlobals() {
+  delete g_stock_colorspaces;
+  g_stock_colorspaces = nullptr;
+}
+
+// static
+RetainPtr<CPDF_ColorSpace> CPDF_ColorSpace::GetStockCS(Family family) {
+  return g_stock_colorspaces->GetStockCS(family);
+}
+
+// static
 RetainPtr<CPDF_ColorSpace> CPDF_ColorSpace::GetStockCSForName(
     const ByteString& name) {
   if (name == "DeviceRGB" || name == "RGB")
@@ -451,11 +508,6 @@
 }
 
 // static
-RetainPtr<CPDF_ColorSpace> CPDF_ColorSpace::GetStockCS(Family family) {
-  return CPDF_PageModule::GetInstance()->GetStockCS(family);
-}
-
-// static
 RetainPtr<CPDF_ColorSpace> CPDF_ColorSpace::Load(
     CPDF_Document* pDoc,
     const CPDF_Object* pObj,
diff --git a/core/fpdfapi/page/cpdf_colorspace.h b/core/fpdfapi/page/cpdf_colorspace.h
index 127b9f6..36b356d 100644
--- a/core/fpdfapi/page/cpdf_colorspace.h
+++ b/core/fpdfapi/page/cpdf_colorspace.h
@@ -69,6 +69,14 @@
     kPattern = 11,
   };
 
+  static void InitializeGlobals();
+  static void DestroyGlobals();
+
+  // `family` must be one of the following:
+  // - `kDeviceGray`
+  // - `kDeviceRGB`
+  // - `kDeviceCMYK`
+  // - `kPattern`
   static RetainPtr<CPDF_ColorSpace> GetStockCS(Family family);
   static RetainPtr<CPDF_ColorSpace> GetStockCSForName(const ByteString& name);
   static RetainPtr<CPDF_ColorSpace> Load(
diff --git a/core/fpdfapi/page/cpdf_pagemodule.cpp b/core/fpdfapi/page/cpdf_pagemodule.cpp
index 6cda676..09cf812e 100644
--- a/core/fpdfapi/page/cpdf_pagemodule.cpp
+++ b/core/fpdfapi/page/cpdf_pagemodule.cpp
@@ -8,8 +8,6 @@
 
 #include "core/fpdfapi/font/cpdf_fontglobals.h"
 #include "core/fpdfapi/page/cpdf_colorspace.h"
-#include "core/fpdfapi/page/cpdf_devicecs.h"
-#include "core/fpdfapi/page/cpdf_patterncs.h"
 #include "third_party/base/check.h"
 
 namespace {
@@ -37,34 +35,15 @@
   return g_PageModule;
 }
 
-CPDF_PageModule::CPDF_PageModule()
-    : m_StockGrayCS(pdfium::MakeRetain<CPDF_DeviceCS>(
-          CPDF_ColorSpace::Family::kDeviceGray)),
-      m_StockRGBCS(pdfium::MakeRetain<CPDF_DeviceCS>(
-          CPDF_ColorSpace::Family::kDeviceRGB)),
-      m_StockCMYKCS(pdfium::MakeRetain<CPDF_DeviceCS>(
-          CPDF_ColorSpace::Family::kDeviceCMYK)),
-      m_StockPatternCS(pdfium::MakeRetain<CPDF_PatternCS>()) {
-  m_StockPatternCS->InitializeStockPattern();
+CPDF_PageModule::CPDF_PageModule() {
+  CPDF_ColorSpace::InitializeGlobals();
   CPDF_FontGlobals::Create();
   CPDF_FontGlobals::GetInstance()->LoadEmbeddedMaps();
 }
 
 CPDF_PageModule::~CPDF_PageModule() {
   CPDF_FontGlobals::Destroy();
-}
-
-RetainPtr<CPDF_ColorSpace> CPDF_PageModule::GetStockCS(
-    CPDF_ColorSpace::Family family) {
-  if (family == CPDF_ColorSpace::Family::kDeviceGray)
-    return m_StockGrayCS;
-  if (family == CPDF_ColorSpace::Family::kDeviceRGB)
-    return m_StockRGBCS;
-  if (family == CPDF_ColorSpace::Family::kDeviceCMYK)
-    return m_StockCMYKCS;
-  if (family == CPDF_ColorSpace::Family::kPattern)
-    return m_StockPatternCS;
-  return nullptr;
+  CPDF_ColorSpace::DestroyGlobals();
 }
 
 void CPDF_PageModule::ClearStockFont(CPDF_Document* pDoc) {
diff --git a/core/fpdfapi/page/cpdf_pagemodule.h b/core/fpdfapi/page/cpdf_pagemodule.h
index dfd1308..a040413 100644
--- a/core/fpdfapi/page/cpdf_pagemodule.h
+++ b/core/fpdfapi/page/cpdf_pagemodule.h
@@ -7,12 +7,7 @@
 #ifndef CORE_FPDFAPI_PAGE_CPDF_PAGEMODULE_H_
 #define CORE_FPDFAPI_PAGE_CPDF_PAGEMODULE_H_
 
-#include "core/fpdfapi/page/cpdf_colorspace.h"
-#include "core/fxcrt/retain_ptr.h"
-
 class CPDF_Document;
-class CPDF_DeviceCS;
-class CPDF_PatternCS;
 
 class CPDF_PageModule {
  public:
@@ -21,17 +16,11 @@
   static void Destroy();
   static CPDF_PageModule* GetInstance();
 
-  RetainPtr<CPDF_ColorSpace> GetStockCS(CPDF_ColorSpace::Family family);
   void ClearStockFont(CPDF_Document* pDoc);
 
  private:
   CPDF_PageModule();
   ~CPDF_PageModule();
-
-  RetainPtr<CPDF_DeviceCS> m_StockGrayCS;
-  RetainPtr<CPDF_DeviceCS> m_StockRGBCS;
-  RetainPtr<CPDF_DeviceCS> m_StockCMYKCS;
-  RetainPtr<CPDF_PatternCS> m_StockPatternCS;
 };
 
 #endif  // CORE_FPDFAPI_PAGE_CPDF_PAGEMODULE_H_