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_