Remove final Windows fxge dependence on fpdfapi.

Part of the circurlar includes problem.

- Pass CCodec_ModuleMgr down from above.
- Initialize in header while we're at it.

Change-Id: Ic504acb51ff911bfb0fd865d9b6e4807475ce947
Reviewed-on: https://pdfium-review.googlesource.com/c/49630
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfapi/BUILD.gn b/core/fpdfapi/BUILD.gn
index e59ae17..020c07d 100644
--- a/core/fpdfapi/BUILD.gn
+++ b/core/fpdfapi/BUILD.gn
@@ -33,7 +33,4 @@
     "render",
   ]
   visibility = [ "../../*" ]
-  if (is_win) {
-    allow_circular_includes_from += [ "../fxge" ]
-  }
 }
diff --git a/core/fxge/cfx_windowsrenderdevice.h b/core/fxge/cfx_windowsrenderdevice.h
index 4470a74..a52f4ee 100644
--- a/core/fxge/cfx_windowsrenderdevice.h
+++ b/core/fxge/cfx_windowsrenderdevice.h
@@ -23,6 +23,7 @@
   kModePostScript3PassThrough = 5,
 };
 
+class CCodec_ModuleMgr;
 class RenderDeviceDriverIface;
 
 #if defined(PDFIUM_PRINT_TEXT_WITH_GDI)
@@ -38,9 +39,10 @@
 
 class CFX_WindowsRenderDevice final : public CFX_RenderDevice {
  public:
-  static RenderDeviceDriverIface* CreateDriver(HDC hDC);
+  static RenderDeviceDriverIface* CreateDriver(CCodec_ModuleMgr* pModuleMgr,
+                                               HDC hDC);
 
-  explicit CFX_WindowsRenderDevice(HDC hDC);
+  CFX_WindowsRenderDevice(CCodec_ModuleMgr* pModuleMgr, HDC hDC);
   ~CFX_WindowsRenderDevice() override;
 };
 
diff --git a/core/fxge/win32/cfx_psrenderer.cpp b/core/fxge/win32/cfx_psrenderer.cpp
index c8bbfeb..fbf4ebe 100644
--- a/core/fxge/win32/cfx_psrenderer.cpp
+++ b/core/fxge/win32/cfx_psrenderer.cpp
@@ -11,7 +11,6 @@
 #include <sstream>
 #include <utility>
 
-#include "core/fpdfapi/cpdf_modulemgr.h"
 #include "core/fxcodec/codec/ccodec_basicmodule.h"
 #include "core/fxcodec/codec/ccodec_faxmodule.h"
 #include "core/fxcodec/codec/ccodec_flatemodule.h"
@@ -47,7 +46,8 @@
   return true;
 }
 
-void PSCompressData(int PSLevel,
+void PSCompressData(CCodec_ModuleMgr* pEncoders,
+                    int PSLevel,
                     uint8_t* src_buf,
                     uint32_t src_size,
                     uint8_t** output_buf,
@@ -59,7 +59,6 @@
   if (src_size < 1024)
     return;
 
-  CCodec_ModuleMgr* pEncoders = CPDF_ModuleMgr::Get()->GetCodecModule();
   uint8_t* dest_buf = nullptr;
   uint32_t dest_size = src_size;
   if (PSLevel >= 3) {
@@ -101,13 +100,10 @@
   PSGlyph m_Glyphs[256];
 };
 
-CFX_PSRenderer::CFX_PSRenderer()
-    : m_pStream(nullptr),
-      m_bGraphStateSet(false),
-      m_bColorSet(false),
-      m_bInited(false) {}
+CFX_PSRenderer::CFX_PSRenderer(CCodec_ModuleMgr* pModuleMgr)
+    : m_pModuleMgr(pModuleMgr) {}
 
-CFX_PSRenderer::~CFX_PSRenderer() {}
+CFX_PSRenderer::~CFX_PSRenderer() = default;
 
 void CFX_PSRenderer::Init(const RetainPtr<IFX_RetainableWriteStream>& pStream,
                           int pslevel,
@@ -484,8 +480,8 @@
       }
       uint8_t* compressed_buf;
       uint32_t compressed_size;
-      PSCompressData(m_PSLevel, output_buf, output_size, &compressed_buf,
-                     &compressed_size, &filter);
+      PSCompressData(m_pModuleMgr.Get(), m_PSLevel, output_buf, output_size,
+                     &compressed_buf, &compressed_size, &filter);
       if (output_buf != compressed_buf)
         FX_Free(output_buf);
 
@@ -691,9 +687,8 @@
 void CFX_PSRenderer::WritePSBinary(const uint8_t* data, int len) {
   std::unique_ptr<uint8_t, FxFreeDeleter> dest_buf;
   uint32_t dest_size;
-  CCodec_ModuleMgr* pEncoders = CPDF_ModuleMgr::Get()->GetCodecModule();
-  if (pEncoders->GetBasicModule()->A85Encode({data, static_cast<size_t>(len)},
-                                             &dest_buf, &dest_size)) {
+  if (m_pModuleMgr->GetBasicModule()->A85Encode(
+          {data, static_cast<size_t>(len)}, &dest_buf, &dest_size)) {
     m_pStream->WriteBlock(dest_buf.get(), dest_size);
   } else {
     m_pStream->WriteBlock(data, len);
diff --git a/core/fxge/win32/cfx_psrenderer.h b/core/fxge/win32/cfx_psrenderer.h
index 70f72a5..7ddbd41 100644
--- a/core/fxge/win32/cfx_psrenderer.h
+++ b/core/fxge/win32/cfx_psrenderer.h
@@ -14,8 +14,10 @@
 #include "core/fxcrt/fx_stream.h"
 #include "core/fxcrt/fx_system.h"
 #include "core/fxcrt/retain_ptr.h"
+#include "core/fxcrt/unowned_ptr.h"
 #include "core/fxge/cfx_graphstatedata.h"
 
+class CCodec_ModuleMgr;
 class CFX_DIBBase;
 class CFX_FaceCache;
 class CFX_Font;
@@ -28,7 +30,7 @@
 
 class CFX_PSRenderer {
  public:
-  CFX_PSRenderer();
+  explicit CFX_PSRenderer(CCodec_ModuleMgr* pModuleMgr);
   ~CFX_PSRenderer();
 
   void Init(const RetainPtr<IFX_RetainableWriteStream>& stream,
@@ -88,17 +90,18 @@
   void WritePSBinary(const uint8_t* data, int len);
   void WriteToStream(std::ostringstream* stringStream);
 
-  RetainPtr<IFX_RetainableWriteStream> m_pStream;
-  int m_PSLevel;
-  CFX_GraphStateData m_CurGraphState;
-  bool m_bGraphStateSet;
+  bool m_bInited = false;
+  bool m_bGraphStateSet = false;
   bool m_bCmykOutput;
-  bool m_bColorSet;
-  uint32_t m_LastColor;
+  bool m_bColorSet = false;
+  int m_PSLevel = 0;
+  uint32_t m_LastColor = 0;
   FX_RECT m_ClipBox;
+  CFX_GraphStateData m_CurGraphState;
+  UnownedPtr<CCodec_ModuleMgr> m_pModuleMgr;
+  RetainPtr<IFX_RetainableWriteStream> m_pStream;
   std::vector<std::unique_ptr<CPSFont>> m_PSFontList;
   std::vector<FX_RECT> m_ClipBoxStack;
-  bool m_bInited;
 };
 
 #endif  // CORE_FXGE_WIN32_CFX_PSRENDERER_H_
diff --git a/core/fxge/win32/fx_win32_device.cpp b/core/fxge/win32/fx_win32_device.cpp
index 4b77cdc..e0df353 100644
--- a/core/fxge/win32/fx_win32_device.cpp
+++ b/core/fxge/win32/fx_win32_device.cpp
@@ -1341,14 +1341,17 @@
   return false;
 }
 
-CFX_WindowsRenderDevice::CFX_WindowsRenderDevice(HDC hDC) {
-  SetDeviceDriver(pdfium::WrapUnique(CreateDriver(hDC)));
+CFX_WindowsRenderDevice::CFX_WindowsRenderDevice(CCodec_ModuleMgr* pModuleMgr,
+                                                 HDC hDC) {
+  SetDeviceDriver(pdfium::WrapUnique(CreateDriver(pModuleMgr, hDC)));
 }
 
 CFX_WindowsRenderDevice::~CFX_WindowsRenderDevice() {}
 
 // static
-RenderDeviceDriverIface* CFX_WindowsRenderDevice::CreateDriver(HDC hDC) {
+RenderDeviceDriverIface* CFX_WindowsRenderDevice::CreateDriver(
+    CCodec_ModuleMgr* pModuleMgr,
+    HDC hDC) {
   int device_type = ::GetDeviceCaps(hDC, TECHNOLOGY);
   int obj_type = ::GetObjectType(hDC);
   bool use_printer = device_type == DT_RASPRINTER ||
@@ -1364,5 +1367,5 @@
   if (g_pdfium_print_mode == WindowsPrintMode::kModeTextOnly)
     return new CTextOnlyPrinterDriver(hDC);
 
-  return new CPSPrinterDriver(hDC, g_pdfium_print_mode, false);
+  return new CPSPrinterDriver(pModuleMgr, hDC, g_pdfium_print_mode, false);
 }
diff --git a/core/fxge/win32/fx_win32_print.cpp b/core/fxge/win32/fx_win32_print.cpp
index 00b4cba..ab4a850 100644
--- a/core/fxge/win32/fx_win32_print.cpp
+++ b/core/fxge/win32/fx_win32_print.cpp
@@ -330,10 +330,11 @@
 #endif
 }
 
-CPSPrinterDriver::CPSPrinterDriver(HDC hDC,
+CPSPrinterDriver::CPSPrinterDriver(CCodec_ModuleMgr* pModuleMgr,
+                                   HDC hDC,
                                    WindowsPrintMode mode,
                                    bool bCmykOutput)
-    : m_hDC(hDC), m_bCmykOutput(bCmykOutput) {
+    : m_hDC(hDC), m_bCmykOutput(bCmykOutput), m_PSRenderer(pModuleMgr) {
   // |mode| should be PostScript.
   ASSERT(mode == WindowsPrintMode::kModePostScript2 ||
          mode == WindowsPrintMode::kModePostScript3 ||
diff --git a/core/fxge/win32/win32_int.h b/core/fxge/win32/win32_int.h
index 44c3c8b..5184bbd 100644
--- a/core/fxge/win32/win32_int.h
+++ b/core/fxge/win32/win32_int.h
@@ -19,6 +19,7 @@
 #include "core/fxge/win32/cfx_psrenderer.h"
 #include "core/fxge/win32/cpsoutput.h"
 
+class CCodec_ModuleMgr;
 class CFX_ImageRenderer;
 class FXTEXT_CHARPOS;
 struct WINDIB_Open_Args_;
@@ -206,7 +207,10 @@
 
 class CPSPrinterDriver final : public RenderDeviceDriverIface {
  public:
-  CPSPrinterDriver(HDC hDC, WindowsPrintMode mode, bool bCmykOutput);
+  CPSPrinterDriver(CCodec_ModuleMgr* pModuleMgr,
+                   HDC hDC,
+                   WindowsPrintMode mode,
+                   bool bCmykOutput);
   ~CPSPrinterDriver() override;
 
  private:
diff --git a/fpdfsdk/fpdf_view.cpp b/fpdfsdk/fpdf_view.cpp
index e46c3db..d078600 100644
--- a/fpdfsdk/fpdf_view.cpp
+++ b/fpdfsdk/fpdf_view.cpp
@@ -544,7 +544,8 @@
       pContext->m_pOptions->GetOptions().bBreakForMasks = true;
     }
   } else {
-    pContext->m_pDevice = pdfium::MakeUnique<CFX_WindowsRenderDevice>(dc);
+    pContext->m_pDevice = pdfium::MakeUnique<CFX_WindowsRenderDevice>(
+        CPDF_ModuleMgr::Get()->GetCodecModule(), dc);
   }
 
   RenderPageWithContext(pContext, page, start_x, start_y, size_x, size_y,
@@ -571,7 +572,8 @@
     // pause after each image mask.
     pPage->SetRenderContext(pdfium::MakeUnique<CPDF_PageRenderContext>());
     pContext = pPage->GetRenderContext();
-    pContext->m_pDevice = pdfium::MakeUnique<CFX_WindowsRenderDevice>(dc);
+    pContext->m_pDevice = pdfium::MakeUnique<CFX_WindowsRenderDevice>(
+        CPDF_ModuleMgr::Get()->GetCodecModule(), dc);
     pContext->m_pOptions = pdfium::MakeUnique<CPDF_RenderOptions>();
     pContext->m_pOptions->GetOptions().bBreakForMasks = true;
 
@@ -588,7 +590,7 @@
       pContext->m_pRenderer->Continue(nullptr);
     }
   } else if (bNewBitmap) {
-    CFX_WindowsRenderDevice WinDC(dc);
+    CFX_WindowsRenderDevice WinDC(CPDF_ModuleMgr::Get()->GetCodecModule(), dc);
     bool bitsStretched = false;
     if (WinDC.GetDeviceCaps(FXDC_DEVICE_CLASS) == FXDC_PRINTER) {
       auto pDst = pdfium::MakeRetain<CFX_DIBitmap>();