Get rid of CCodec_ModuleMgr::GetJpxModule().

The CCodec_JpxModule class consists of a set of methods that can all be
static. Make the methods static, and make sure CCodec_JpxModule cannot
be instantiated. Then CCodec_ModuleMgr::GetJpxModule() becomes pointless
and all the callers can just call CCodec_JpxModule directly.

Along the way, get rid of CCodec_JpxModule methods that just forward to
CJPX_Decoder methods. Then JpxBitMapContext can also go away.

Change-Id: Icd424171159dc52b89565dc817e2e4b97e756470
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/55050
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/cpdf_modulemgr.cpp b/core/fpdfapi/cpdf_modulemgr.cpp
index fb2194e..83d097a 100644
--- a/core/fpdfapi/cpdf_modulemgr.cpp
+++ b/core/fpdfapi/cpdf_modulemgr.cpp
@@ -64,10 +64,6 @@
   return m_pCodecModule->GetJpegModule();
 }
 
-CCodec_JpxModule* CPDF_ModuleMgr::GetJpxModule() {
-  return m_pCodecModule->GetJpxModule();
-}
-
 CCodec_Jbig2Module* CPDF_ModuleMgr::GetJbig2Module() {
   return m_pCodecModule->GetJbig2Module();
 }
diff --git a/core/fpdfapi/cpdf_modulemgr.h b/core/fpdfapi/cpdf_modulemgr.h
index d94bce5..6694f82 100644
--- a/core/fpdfapi/cpdf_modulemgr.h
+++ b/core/fpdfapi/cpdf_modulemgr.h
@@ -14,7 +14,6 @@
 class CCodec_IccModule;
 class CCodec_Jbig2Module;
 class CCodec_JpegModule;
-class CCodec_JpxModule;
 class CCodec_ModuleMgr;
 class CPDF_PageModule;
 
@@ -52,7 +51,6 @@
   CPDF_PageModule* GetPageModule() const { return m_pPageModule.get(); }
 
   CCodec_JpegModule* GetJpegModule();
-  CCodec_JpxModule* GetJpxModule();
   CCodec_Jbig2Module* GetJbig2Module();
   CCodec_IccModule* GetIccModule();
   CCodec_FlateModule* GetFlateModule();
diff --git a/core/fpdfapi/render/cpdf_dibbase.cpp b/core/fpdfapi/render/cpdf_dibbase.cpp
index 6fc101d..696cad5 100644
--- a/core/fpdfapi/render/cpdf_dibbase.cpp
+++ b/core/fpdfapi/render/cpdf_dibbase.cpp
@@ -84,29 +84,6 @@
   return false;
 }
 
-// Wrapper class to use with std::unique_ptr for CJPX_Decoder.
-class JpxBitMapContext {
- public:
-  explicit JpxBitMapContext(CCodec_JpxModule* jpx_module)
-      : jpx_module_(jpx_module), decoder_(nullptr) {}
-
-  ~JpxBitMapContext() {}
-
-  void set_decoder(std::unique_ptr<CJPX_Decoder> decoder) {
-    decoder_ = std::move(decoder);
-  }
-
-  CJPX_Decoder* decoder() { return decoder_.get(); }
-
- private:
-  CCodec_JpxModule* const jpx_module_;  // Weak pointer.
-  std::unique_ptr<CJPX_Decoder> decoder_;
-
-  // Disallow evil constructors
-  JpxBitMapContext(const JpxBitMapContext&);
-  void operator=(const JpxBitMapContext&);
-};
-
 }  // namespace
 
 CPDF_DIBBase::CPDF_DIBBase() = default;
@@ -584,20 +561,18 @@
 }
 
 RetainPtr<CFX_DIBitmap> CPDF_DIBBase::LoadJpxBitmap() {
-  CCodec_JpxModule* pJpxModule = CPDF_ModuleMgr::Get()->GetJpxModule();
-  auto context = pdfium::MakeUnique<JpxBitMapContext>(pJpxModule);
-  context->set_decoder(
-      pJpxModule->CreateDecoder(m_pStreamAcc->GetSpan(), m_pColorSpace));
-  if (!context->decoder())
+  std::unique_ptr<CJPX_Decoder> decoder =
+      CCodec_JpxModule::CreateDecoder(m_pStreamAcc->GetSpan(), m_pColorSpace);
+  if (!decoder)
     return nullptr;
 
-  if (!context->decoder()->StartDecode())
+  if (!decoder->StartDecode())
     return nullptr;
 
   uint32_t width = 0;
   uint32_t height = 0;
   uint32_t components = 0;
-  pJpxModule->GetImageInfo(context->decoder(), &width, &height, &components);
+  decoder->GetInfo(&width, &height, &components);
   if (static_cast<int>(width) < m_Width || static_cast<int>(height) < m_Height)
     return nullptr;
 
@@ -643,8 +618,8 @@
     output_offsets[0] = 2;
     output_offsets[2] = 0;
   }
-  if (!pJpxModule->Decode(context->decoder(), pCachedBitmap->GetBuffer(),
-                          pCachedBitmap->GetPitch(), output_offsets)) {
+  if (!decoder->Decode(pCachedBitmap->GetBuffer(), pCachedBitmap->GetPitch(),
+                       output_offsets)) {
     return nullptr;
   }
 
diff --git a/core/fxcodec/codec/ccodec_jpxmodule.cpp b/core/fxcodec/codec/ccodec_jpxmodule.cpp
index 896754c..004e298 100644
--- a/core/fxcodec/codec/ccodec_jpxmodule.cpp
+++ b/core/fxcodec/codec/ccodec_jpxmodule.cpp
@@ -650,10 +650,7 @@
   return true;
 }
 
-CCodec_JpxModule::CCodec_JpxModule() {}
-
-CCodec_JpxModule::~CCodec_JpxModule() {}
-
+// static
 std::unique_ptr<CJPX_Decoder> CCodec_JpxModule::CreateDecoder(
     pdfium::span<const uint8_t> src_span,
     const RetainPtr<CPDF_ColorSpace>& cs) {
@@ -663,17 +660,3 @@
 
   return decoder;
 }
-
-void CCodec_JpxModule::GetImageInfo(CJPX_Decoder* pDecoder,
-                                    uint32_t* width,
-                                    uint32_t* height,
-                                    uint32_t* components) {
-  pDecoder->GetInfo(width, height, components);
-}
-
-bool CCodec_JpxModule::Decode(CJPX_Decoder* pDecoder,
-                              uint8_t* dest_data,
-                              uint32_t pitch,
-                              const std::vector<uint8_t>& offsets) {
-  return pDecoder->Decode(dest_data, pitch, offsets);
-}
diff --git a/core/fxcodec/codec/ccodec_jpxmodule.h b/core/fxcodec/codec/ccodec_jpxmodule.h
index fd4bd64..7d02c69 100644
--- a/core/fxcodec/codec/ccodec_jpxmodule.h
+++ b/core/fxcodec/codec/ccodec_jpxmodule.h
@@ -19,21 +19,13 @@
 
 class CCodec_JpxModule {
  public:
-  CCodec_JpxModule();
-  ~CCodec_JpxModule();
-
-  std::unique_ptr<CJPX_Decoder> CreateDecoder(
+  static std::unique_ptr<CJPX_Decoder> CreateDecoder(
       pdfium::span<const uint8_t> src_span,
       const RetainPtr<CPDF_ColorSpace>& cs);
 
-  void GetImageInfo(CJPX_Decoder* pDecoder,
-                    uint32_t* width,
-                    uint32_t* height,
-                    uint32_t* components);
-  bool Decode(CJPX_Decoder* pDecoder,
-              uint8_t* dest_data,
-              uint32_t pitch,
-              const std::vector<uint8_t>& offsets);
+  CCodec_JpxModule() = delete;
+  CCodec_JpxModule(const CCodec_JpxModule&) = delete;
+  CCodec_JpxModule& operator=(const CCodec_JpxModule&) = delete;
 };
 
 #endif  // CORE_FXCODEC_CODEC_CCODEC_JPXMODULE_H_
diff --git a/core/fxcodec/codec/fx_codec.cpp b/core/fxcodec/codec/fx_codec.cpp
index 37f7a7d..f008ce1 100644
--- a/core/fxcodec/codec/fx_codec.cpp
+++ b/core/fxcodec/codec/fx_codec.cpp
@@ -14,7 +14,6 @@
 #include "core/fxcodec/codec/ccodec_iccmodule.h"
 #include "core/fxcodec/codec/ccodec_jbig2module.h"
 #include "core/fxcodec/codec/ccodec_jpegmodule.h"
-#include "core/fxcodec/codec/ccodec_jpxmodule.h"
 #include "core/fxcodec/codec/codec_int.h"
 #include "core/fxcrt/fx_extension.h"
 #include "core/fxcrt/fx_safe_types.h"
@@ -23,7 +22,6 @@
 
 CCodec_ModuleMgr::CCodec_ModuleMgr()
     : m_pJpegModule(pdfium::MakeUnique<CCodec_JpegModule>()),
-      m_pJpxModule(pdfium::MakeUnique<CCodec_JpxModule>()),
       m_pJbig2Module(pdfium::MakeUnique<CCodec_Jbig2Module>()),
       m_pIccModule(pdfium::MakeUnique<CCodec_IccModule>()) {}
 
diff --git a/core/fxcodec/fx_codec.h b/core/fxcodec/fx_codec.h
index e72ac19..6b95258 100644
--- a/core/fxcodec/fx_codec.h
+++ b/core/fxcodec/fx_codec.h
@@ -37,7 +37,6 @@
 class CCodec_IccModule;
 class CCodec_Jbig2Module;
 class CCodec_JpegModule;
-class CCodec_JpxModule;
 
 #ifdef PDF_ENABLE_XFA
 class CCodec_ProgressiveDecoder;
@@ -60,7 +59,6 @@
   ~CCodec_ModuleMgr();
 
   CCodec_JpegModule* GetJpegModule() const { return m_pJpegModule.get(); }
-  CCodec_JpxModule* GetJpxModule() const { return m_pJpxModule.get(); }
   CCodec_Jbig2Module* GetJbig2Module() const { return m_pJbig2Module.get(); }
   CCodec_IccModule* GetIccModule() const { return m_pIccModule.get(); }
 
@@ -98,7 +96,6 @@
 
  protected:
   std::unique_ptr<CCodec_JpegModule> m_pJpegModule;
-  std::unique_ptr<CCodec_JpxModule> m_pJpxModule;
   std::unique_ptr<CCodec_Jbig2Module> m_pJbig2Module;
   std::unique_ptr<CCodec_IccModule> m_pIccModule;
 
diff --git a/testing/fuzzers/pdf_jpx_fuzzer.cc b/testing/fuzzers/pdf_jpx_fuzzer.cc
index 8a9c63f..6cf3320 100644
--- a/testing/fuzzers/pdf_jpx_fuzzer.cc
+++ b/testing/fuzzers/pdf_jpx_fuzzer.cc
@@ -13,9 +13,8 @@
 #include "core/fxge/dib/cfx_dibitmap.h"
 #include "core/fxge/fx_dib.h"
 
-CCodec_JpxModule g_module;
-
 namespace {
+
 const uint32_t kMaxJPXFuzzSize = 100 * 1024 * 1024;  // 100 MB
 
 bool CheckImageSize(uint32_t width, uint32_t height, uint32_t components) {
@@ -25,11 +24,12 @@
   mem *= components;
   return mem.IsValid() && mem.ValueOrDie() <= kMemLimitBytes;
 }
+
 }  // namespace
 
 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
   std::unique_ptr<CJPX_Decoder> decoder =
-      g_module.CreateDecoder({data, size}, nullptr);
+      CCodec_JpxModule::CreateDecoder({data, size}, nullptr);
   if (!decoder)
     return 0;
 
@@ -38,7 +38,7 @@
   uint32_t width;
   uint32_t height;
   uint32_t components;
-  g_module.GetImageInfo(decoder.get(), &width, &height, &components);
+  decoder->GetInfo(&width, &height, &components);
   if (!CheckImageSize(width, height, components))
     return 0;
 
@@ -46,7 +46,7 @@
     return 0;
 
   // StartDecode() could change image size, so check again.
-  g_module.GetImageInfo(decoder.get(), &width, &height, &components);
+  decoder->GetInfo(&width, &height, &components);
   if (!CheckImageSize(width, height, components))
     return 0;
 
@@ -74,7 +74,6 @@
   for (uint32_t i = 0; i < components; ++i)
     output_offsets[i] = i;
 
-  g_module.Decode(decoder.get(), bitmap->GetBuffer(), bitmap->GetPitch(),
-                  output_offsets);
+  decoder->Decode(bitmap->GetBuffer(), bitmap->GetPitch(), output_offsets);
   return 0;
 }