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>();