Break direct dependence between fpdfsdk and fxcodec.

Introduce a CPDF_WindowsRenderDevice at the fpdfapi/render layer to
tie together CFX_WindowsRenderDevice and the various fxcodec classes
that it needs.

Change-Id: I80e61d7baecb9031df60f298e89f0a0390869e43
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/58570
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfapi/render/BUILD.gn b/core/fpdfapi/render/BUILD.gn
index 713abca..bba7cb9 100644
--- a/core/fpdfapi/render/BUILD.gn
+++ b/core/fpdfapi/render/BUILD.gn
@@ -51,6 +51,12 @@
     "../page",
     "../parser",
   ]
+  if (is_win) {
+    sources += [
+      "cpdf_windowsrenderdevice.cpp",
+      "cpdf_windowsrenderdevice.h",
+    ]
+  }
   visibility = [ "../../../*" ]
 }
 
diff --git a/core/fpdfapi/render/cpdf_windowsrenderdevice.cpp b/core/fpdfapi/render/cpdf_windowsrenderdevice.cpp
new file mode 100644
index 0000000..8e1f212
--- /dev/null
+++ b/core/fpdfapi/render/cpdf_windowsrenderdevice.cpp
@@ -0,0 +1,26 @@
+// Copyright 2019 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "core/fpdfapi/render/cpdf_windowsrenderdevice.h"
+
+#include "core/fxcodec/basic/basicmodule.h"
+#include "core/fxcodec/fax/faxmodule.h"
+#include "core/fxcodec/flate/flatemodule.h"
+#include "core/fxcodec/jpeg/jpegmodule.h"
+#include "core/fxge/win32/cfx_psrenderer.h"
+
+namespace {
+
+constexpr EncoderIface kEncoderIface = {
+    BasicModule::A85Encode, FaxModule::FaxEncode, FlateModule::Encode,
+    JpegModule::JpegEncode, BasicModule::RunLengthEncode};
+
+}  // namespace
+
+CPDF_WindowsRenderDevice::CPDF_WindowsRenderDevice(HDC hDC)
+    : CFX_WindowsRenderDevice(hDC, &kEncoderIface) {}
+
+CPDF_WindowsRenderDevice::~CPDF_WindowsRenderDevice() = default;
diff --git a/core/fpdfapi/render/cpdf_windowsrenderdevice.h b/core/fpdfapi/render/cpdf_windowsrenderdevice.h
new file mode 100644
index 0000000..51d150e
--- /dev/null
+++ b/core/fpdfapi/render/cpdf_windowsrenderdevice.h
@@ -0,0 +1,18 @@
+// Copyright 2019 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef CORE_FPDFAPI_RENDER_CPDF_WINDOWSRENDERDEVICE_H_
+#define CORE_FPDFAPI_RENDER_CPDF_WINDOWSRENDERDEVICE_H_
+
+#include "core/fxge/cfx_windowsrenderdevice.h"
+
+class CPDF_WindowsRenderDevice final : public CFX_WindowsRenderDevice {
+ public:
+  explicit CPDF_WindowsRenderDevice(HDC hDC);
+  ~CPDF_WindowsRenderDevice() override;
+};
+
+#endif  // CORE_FPDFAPI_RENDER_CPDF_WINDOWSRENDERDEVICE_H_
diff --git a/core/fxge/cfx_windowsrenderdevice.h b/core/fxge/cfx_windowsrenderdevice.h
index d2ca8a0..3d96207 100644
--- a/core/fxge/cfx_windowsrenderdevice.h
+++ b/core/fxge/cfx_windowsrenderdevice.h
@@ -34,7 +34,7 @@
 #endif
 extern WindowsPrintMode g_pdfium_print_mode;
 
-class CFX_WindowsRenderDevice final : public CFX_RenderDevice {
+class CFX_WindowsRenderDevice : public CFX_RenderDevice {
  public:
   CFX_WindowsRenderDevice(HDC hDC, const EncoderIface* pEncoderIface);
   ~CFX_WindowsRenderDevice() override;
diff --git a/fpdfsdk/BUILD.gn b/fpdfsdk/BUILD.gn
index 0badb3c..9d9993b 100644
--- a/fpdfsdk/BUILD.gn
+++ b/fpdfsdk/BUILD.gn
@@ -84,7 +84,6 @@
     "../core/fpdfapi/render",
     "../core/fpdfdoc",
     "../core/fpdftext",
-    "../core/fxcodec",
     "../core/fxcrt",
     "../core/fxge",
     "../fxjs",
diff --git a/fpdfsdk/fpdf_view.cpp b/fpdfsdk/fpdf_view.cpp
index c215a93..5539fbc 100644
--- a/fpdfsdk/fpdf_view.cpp
+++ b/fpdfsdk/fpdf_view.cpp
@@ -54,12 +54,7 @@
 #endif  // PDF_ENABLE_XFA
 
 #if defined(OS_WIN)
-#include "core/fxcodec/basic/basicmodule.h"
-#include "core/fxcodec/fax/faxmodule.h"
-#include "core/fxcodec/flate/flatemodule.h"
-#include "core/fxcodec/jpeg/jpegmodule.h"
-#include "core/fxge/cfx_windowsrenderdevice.h"
-#include "core/fxge/win32/cfx_psrenderer.h"
+#include "core/fpdfapi/render/cpdf_windowsrenderdevice.h"
 #include "public/fpdf_edit.h"
 
 // These checks are here because core/ and public/ cannot depend on each other.
@@ -83,12 +78,6 @@
 
 bool g_bLibraryInitialized = false;
 
-#if defined(OS_WIN)
-constexpr EncoderIface kEncoderIface = {
-    BasicModule::A85Encode, FaxModule::FaxEncode, FlateModule::Encode,
-    JpegModule::JpegEncode, BasicModule::RunLengthEncode};
-#endif  // defined(OS_WIN)
-
 void RenderPageImpl(CPDF_PageRenderContext* pContext,
                     CPDF_Page* pPage,
                     const CFX_Matrix& matrix,
@@ -563,8 +552,7 @@
       pContext->m_pOptions->GetOptions().bBreakForMasks = true;
     }
   } else {
-    pContext->m_pDevice =
-        pdfium::MakeUnique<CFX_WindowsRenderDevice>(dc, &kEncoderIface);
+    pContext->m_pDevice = pdfium::MakeUnique<CPDF_WindowsRenderDevice>(dc);
   }
 
   RenderPageWithContext(pContext, page, start_x, start_y, size_x, size_y,
@@ -592,8 +580,7 @@
     pOwnedContext = pdfium::MakeUnique<CPDF_PageRenderContext>();
     pContext = pOwnedContext.get();
     pPage->SetRenderContext(std::move(pOwnedContext));
-    pContext->m_pDevice =
-        pdfium::MakeUnique<CFX_WindowsRenderDevice>(dc, &kEncoderIface);
+    pContext->m_pDevice = pdfium::MakeUnique<CPDF_WindowsRenderDevice>(dc);
     pContext->m_pOptions = pdfium::MakeUnique<CPDF_RenderOptions>();
     pContext->m_pOptions->GetOptions().bBreakForMasks = true;
 
@@ -610,7 +597,7 @@
       pContext->m_pRenderer->Continue(nullptr);
     }
   } else if (bNewBitmap) {
-    CFX_WindowsRenderDevice WinDC(dc, &kEncoderIface);
+    CPDF_WindowsRenderDevice WinDC(dc);
     bool bitsStretched = false;
     if (WinDC.GetDeviceType() == DeviceType::kPrinter) {
       auto pDst = pdfium::MakeRetain<CFX_DIBitmap>();