diff --git a/core/fxge/win32/cfx_windowsdib.cpp b/core/fxge/win32/cfx_windowsdib.cpp
index 03e7b82..464c763 100644
--- a/core/fxge/win32/cfx_windowsdib.cpp
+++ b/core/fxge/win32/cfx_windowsdib.cpp
@@ -8,27 +8,7 @@
 
 #include <windows.h>
 
-#include <vector>
-
-#include "core/fxcrt/fx_memory_wrappers.h"
 #include "core/fxcrt/fx_system.h"
-#include "core/fxge/cfx_gemodule.h"
-#include "core/fxge/win32/cwin32_platform.h"
-
-namespace {
-
-void GetBitmapSize(HBITMAP hBitmap, int& w, int& h) {
-  BITMAP bmp;
-  GetObject(hBitmap, sizeof bmp, &bmp);
-  w = bmp.bmWidth;
-  h = bmp.bmHeight;
-}
-
-FXDIB_Format GetBitmapFormat(int bpp) {
-  return bpp == 32 ? FXDIB_Format::kArgb : MakeRGBFormat(bpp);
-}
-
-}  // namespace
 
 // static
 ByteString CFX_WindowsDIB::GetBitmapInfo(
@@ -76,155 +56,3 @@
   result.ReleaseBuffer(len);
   return result;
 }
-
-// static
-RetainPtr<CFX_DIBitmap> CFX_WindowsDIB::LoadFromBuf(BITMAPINFO* pbmi,
-                                                    void* pData) {
-  int width = pbmi->bmiHeader.biWidth;
-  int height = pbmi->bmiHeader.biHeight;
-  BOOL bBottomUp = true;
-  if (height < 0) {
-    height = -height;
-    bBottomUp = false;
-  }
-  int pitch = (width * pbmi->bmiHeader.biBitCount + 31) / 32 * 4;
-  auto pBitmap = pdfium::MakeRetain<CFX_DIBitmap>();
-  FXDIB_Format format = GetBitmapFormat(pbmi->bmiHeader.biBitCount);
-  if (!pBitmap->Create(width, height, format))
-    return nullptr;
-
-  memcpy(pBitmap->GetBuffer(), pData, pitch * height);
-  if (bBottomUp) {
-    std::vector<uint8_t, FxAllocAllocator<uint8_t>> temp_buf(pitch);
-    int top = 0;
-    int bottom = height - 1;
-    while (top < bottom) {
-      uint8_t* top_ptr = pBitmap->GetBuffer() + top * pitch;
-      uint8_t* bottom_ptr = pBitmap->GetBuffer() + bottom * pitch;
-      memcpy(temp_buf.data(), top_ptr, pitch);
-      memcpy(top_ptr, bottom_ptr, pitch);
-      memcpy(bottom_ptr, temp_buf.data(), pitch);
-      top++;
-      bottom--;
-    }
-  }
-  if (pbmi->bmiHeader.biBitCount == 1) {
-    for (int i = 0; i < 2; i++)
-      pBitmap->SetPaletteArgb(i, ((uint32_t*)pbmi->bmiColors)[i] | 0xff000000);
-  } else if (pbmi->bmiHeader.biBitCount == 8) {
-    for (int i = 0; i < 256; i++)
-      pBitmap->SetPaletteArgb(i, ((uint32_t*)pbmi->bmiColors)[i] | 0xff000000);
-  }
-  return pBitmap;
-}
-
-// static
-HBITMAP CFX_WindowsDIB::GetDDBitmap(const RetainPtr<CFX_DIBitmap>& pBitmap,
-                                    HDC hDC) {
-  ByteString info = GetBitmapInfo(pBitmap);
-  return CreateDIBitmap(hDC, (BITMAPINFOHEADER*)info.c_str(), CBM_INIT,
-                        pBitmap->GetBuffer(), (BITMAPINFO*)info.c_str(),
-                        DIB_RGB_COLORS);
-}
-
-// static
-RetainPtr<CFX_DIBitmap> CFX_WindowsDIB::LoadFromFile(const wchar_t* filename) {
-  auto* pPlatform =
-      static_cast<CWin32Platform*>(CFX_GEModule::Get()->GetPlatform());
-  if (pPlatform->m_GdiplusExt.IsAvailable()) {
-    WINDIB_Open_Args_ args;
-    args.flags = WINDIB_OPEN_PATHNAME;
-    args.path_name = filename;
-    return pPlatform->m_GdiplusExt.LoadDIBitmap(args);
-  }
-  HBITMAP hBitmap = (HBITMAP)LoadImageW(nullptr, (wchar_t*)filename,
-                                        IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
-  if (!hBitmap) {
-    return nullptr;
-  }
-  HDC hDC = CreateCompatibleDC(nullptr);
-  int width;
-  int height;
-  GetBitmapSize(hBitmap, width, height);
-  auto pDIBitmap = pdfium::MakeRetain<CFX_DIBitmap>();
-  if (!pDIBitmap->Create(width, height, FXDIB_Format::kRgb)) {
-    DeleteDC(hDC);
-    return nullptr;
-  }
-  ByteString info = GetBitmapInfo(pDIBitmap);
-  int ret = GetDIBits(hDC, hBitmap, 0, height, pDIBitmap->GetBuffer(),
-                      (BITMAPINFO*)info.c_str(), DIB_RGB_COLORS);
-  DeleteDC(hDC);
-  if (!ret)
-    return nullptr;
-  return pDIBitmap;
-}
-
-// static
-RetainPtr<CFX_DIBitmap> CFX_WindowsDIB::LoadFromFile(const char* filename) {
-  return LoadFromFile(WideString::FromDefANSI(filename).c_str());
-}
-
-// static
-RetainPtr<CFX_DIBitmap> CFX_WindowsDIB::LoadDIBitmap(WINDIB_Open_Args_ args) {
-  auto* pPlatform =
-      static_cast<CWin32Platform*>(CFX_GEModule::Get()->GetPlatform());
-  if (pPlatform->m_GdiplusExt.IsAvailable()) {
-    return pPlatform->m_GdiplusExt.LoadDIBitmap(args);
-  }
-  if (args.flags == WINDIB_OPEN_MEMORY) {
-    return nullptr;
-  }
-  HBITMAP hBitmap = (HBITMAP)LoadImageW(nullptr, (wchar_t*)args.path_name,
-                                        IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
-  if (!hBitmap) {
-    return nullptr;
-  }
-  HDC hDC = CreateCompatibleDC(nullptr);
-  int width, height;
-  GetBitmapSize(hBitmap, width, height);
-  auto pDIBitmap = pdfium::MakeRetain<CFX_DIBitmap>();
-  if (!pDIBitmap->Create(width, height, FXDIB_Format::kRgb)) {
-    DeleteDC(hDC);
-    return nullptr;
-  }
-  ByteString info = GetBitmapInfo(pDIBitmap);
-  int ret = GetDIBits(hDC, hBitmap, 0, height, pDIBitmap->GetBuffer(),
-                      (BITMAPINFO*)info.c_str(), DIB_RGB_COLORS);
-  DeleteDC(hDC);
-  if (!ret)
-    return nullptr;
-  return pDIBitmap;
-}
-
-CFX_WindowsDIB::CFX_WindowsDIB(HDC hDC, int width, int height) {
-  Create(width, height, FXDIB_Format::kRgb, (uint8_t*)1, 0);
-  BITMAPINFOHEADER bmih;
-  memset(&bmih, 0, sizeof bmih);
-  bmih.biSize = sizeof bmih;
-  bmih.biBitCount = 24;
-  bmih.biHeight = -height;
-  bmih.biPlanes = 1;
-  bmih.biWidth = width;
-  LPVOID pData = nullptr;
-  m_hBitmap = CreateDIBSection(hDC, (BITMAPINFO*)&bmih, DIB_RGB_COLORS, &pData,
-                               nullptr, 0);
-  m_pBuffer.Reset(static_cast<uint8_t*>(pData));
-  m_hMemDC = CreateCompatibleDC(hDC);
-  m_hOldBitmap = (HBITMAP)SelectObject(m_hMemDC, m_hBitmap);
-}
-
-CFX_WindowsDIB::~CFX_WindowsDIB() {
-  SelectObject(m_hMemDC, m_hOldBitmap);
-  DeleteDC(m_hMemDC);
-  DeleteObject(m_hBitmap);
-}
-
-// static
-void CFX_WindowsDIB::LoadFromDevice(HDC hDC, int left, int top) {
-  ::BitBlt(m_hMemDC, 0, 0, m_Width, m_Height, hDC, left, top, SRCCOPY);
-}
-
-void CFX_WindowsDIB::SetToDevice(HDC hDC, int left, int top) {
-  ::BitBlt(hDC, left, top, m_Width, m_Height, m_hMemDC, 0, 0, SRCCOPY);
-}
diff --git a/core/fxge/win32/cfx_windowsdib.h b/core/fxge/win32/cfx_windowsdib.h
index 184b197..61e0843 100644
--- a/core/fxge/win32/cfx_windowsdib.h
+++ b/core/fxge/win32/cfx_windowsdib.h
@@ -7,45 +7,16 @@
 #ifndef CORE_FXGE_WIN32_CFX_WINDOWSDIB_H_
 #define CORE_FXGE_WIN32_CFX_WINDOWSDIB_H_
 
-#include <windows.h>
-
 #include "core/fxcrt/bytestring.h"
 #include "core/fxge/dib/cfx_dibitmap.h"
 
-#define WINDIB_OPEN_MEMORY 0x1
-#define WINDIB_OPEN_PATHNAME 0x2
-
-struct WINDIB_Open_Args_ {
-  int flags;
-  const uint8_t* memory_base;
-  size_t memory_size;
-  const wchar_t* path_name;
-};
-
-class CFX_WindowsDIB final : public CFX_DIBitmap {
+class CFX_WindowsDIB {
  public:
-  CONSTRUCT_VIA_MAKE_RETAIN;
-
   static ByteString GetBitmapInfo(const RetainPtr<CFX_DIBitmap>& pBitmap);
-  static HBITMAP GetDDBitmap(const RetainPtr<CFX_DIBitmap>& pBitmap, HDC hDC);
 
-  static RetainPtr<CFX_DIBitmap> LoadFromBuf(BITMAPINFO* pbmi, void* pData);
-  static RetainPtr<CFX_DIBitmap> LoadFromFile(const wchar_t* filename);
-  static RetainPtr<CFX_DIBitmap> LoadFromFile(const char* filename);
-  static RetainPtr<CFX_DIBitmap> LoadDIBitmap(WINDIB_Open_Args_ args);
-
-  HBITMAP GetWindowsBitmap() const { return m_hBitmap; }
-
-  void LoadFromDevice(HDC hDC, int left, int top);
-  void SetToDevice(HDC hDC, int left, int top);
-
- private:
-  CFX_WindowsDIB(HDC hDC, int width, int height);
-  ~CFX_WindowsDIB() override;
-
-  HDC m_hMemDC;
-  HBITMAP m_hBitmap;
-  HBITMAP m_hOldBitmap;
+  CFX_WindowsDIB() = delete;
+  CFX_WindowsDIB(const CFX_WindowsDIB&) = delete;
+  CFX_WindowsDIB& operator=(const CFX_WindowsDIB&) = delete;
 };
 
 #endif  // CORE_FXGE_WIN32_CFX_WINDOWSDIB_H_
diff --git a/core/fxge/win32/cgdi_plus_ext.cpp b/core/fxge/win32/cgdi_plus_ext.cpp
index 4e915a5..344a5d7 100644
--- a/core/fxge/win32/cgdi_plus_ext.cpp
+++ b/core/fxge/win32/cgdi_plus_ext.cpp
@@ -17,12 +17,13 @@
 #include <vector>
 
 #include "core/fxcrt/fx_memory.h"
+#include "core/fxcrt/fx_string.h"
 #include "core/fxcrt/fx_system.h"
 #include "core/fxge/cfx_fillrenderoptions.h"
 #include "core/fxge/cfx_gemodule.h"
 #include "core/fxge/cfx_graphstatedata.h"
 #include "core/fxge/cfx_pathdata.h"
-#include "core/fxge/win32/cfx_windowsdib.h"
+#include "core/fxge/dib/cfx_dibitmap.h"
 #include "core/fxge/win32/cwin32_platform.h"
 #include "third_party/base/span.h"
 #include "third_party/base/stl_util.h"
@@ -650,110 +651,6 @@
   std::ostringstream m_InterStream;
 };
 
-struct PREVIEW3_DIBITMAP {
-  BITMAPINFO* pbmi;
-  int Stride;
-  LPBYTE pScan0;
-  Gdiplus::GpBitmap* pBitmap;
-  Gdiplus::BitmapData* pBitmapData;
-  GpStream* pStream;
-};
-
-struct DIBitmapDeleter {
-  void operator()(PREVIEW3_DIBITMAP* bitmap) const {
-    const CGdiplusExt& GdiplusExt = GetGdiplusExt();
-    CallFunc(GdipBitmapUnlockBits)(bitmap->pBitmap, bitmap->pBitmapData);
-    CallFunc(GdipDisposeImage)(bitmap->pBitmap);
-    FX_Free(bitmap->pBitmapData);
-    FX_Free((LPBYTE)bitmap->pbmi);
-    if (bitmap->pStream)
-      bitmap->pStream->Release();
-    FX_Free(bitmap);
-  }
-};
-
-using ScopedDIBitmap = std::unique_ptr<PREVIEW3_DIBITMAP, DIBitmapDeleter>;
-
-ScopedDIBitmap LoadDIBitmapImpl(WINDIB_Open_Args_ args) {
-  Gdiplus::GpBitmap* pBitmap;
-  GpStream* pStream = nullptr;
-  const CGdiplusExt& GdiplusExt = GetGdiplusExt();
-  if (args.flags == WINDIB_OPEN_PATHNAME) {
-    if (CallFunc(GdipCreateBitmapFromFileICM)(args.path_name, &pBitmap) !=
-        Gdiplus::Ok) {
-      return nullptr;
-    }
-  } else {
-    if (args.memory_size == 0 || !args.memory_base)
-      return nullptr;
-
-    pStream = new GpStream;
-    pStream->Write(args.memory_base, (ULONG)args.memory_size, nullptr);
-    if (CallFunc(GdipCreateBitmapFromStreamICM)(pStream, &pBitmap) !=
-        Gdiplus::Ok) {
-      pStream->Release();
-      return nullptr;
-    }
-  }
-
-  UINT height;
-  UINT width;
-  CallFunc(GdipGetImageHeight)(pBitmap, &height);
-  CallFunc(GdipGetImageWidth)(pBitmap, &width);
-  Gdiplus::PixelFormat pixel_format;
-  CallFunc(GdipGetImagePixelFormat)(pBitmap, &pixel_format);
-  int info_size = sizeof(BITMAPINFOHEADER);
-  int bpp = 24;
-  int dest_pixel_format = PixelFormat24bppRGB;
-  if (pixel_format == PixelFormat1bppIndexed) {
-    info_size += 8;
-    bpp = 1;
-    dest_pixel_format = PixelFormat1bppIndexed;
-  } else if (pixel_format == PixelFormat8bppIndexed) {
-    info_size += 1024;
-    bpp = 8;
-    dest_pixel_format = PixelFormat8bppIndexed;
-  } else if (pixel_format == PixelFormat32bppARGB) {
-    bpp = 32;
-    dest_pixel_format = PixelFormat32bppARGB;
-  }
-  LPBYTE buf = FX_Alloc(BYTE, info_size);
-  BITMAPINFOHEADER* pbmih = (BITMAPINFOHEADER*)buf;
-  pbmih->biBitCount = bpp;
-  pbmih->biCompression = BI_RGB;
-  pbmih->biHeight = -(int)height;
-  pbmih->biPlanes = 1;
-  pbmih->biWidth = width;
-  Gdiplus::Rect rect(0, 0, width, height);
-  Gdiplus::BitmapData* pBitmapData = FX_Alloc(Gdiplus::BitmapData, 1);
-  CallFunc(GdipBitmapLockBits)(pBitmap, &rect, Gdiplus::ImageLockModeRead,
-                               dest_pixel_format, pBitmapData);
-  if (pixel_format == PixelFormat1bppIndexed ||
-      pixel_format == PixelFormat8bppIndexed) {
-    DWORD* ppal = (DWORD*)(buf + sizeof(BITMAPINFOHEADER));
-    struct {
-      UINT flags;
-      UINT Count;
-      DWORD Entries[256];
-    } pal;
-    int size = 0;
-    CallFunc(GdipGetImagePaletteSize)(pBitmap, &size);
-    CallFunc(GdipGetImagePalette)(pBitmap, (Gdiplus::ColorPalette*)&pal, size);
-    int entries = pixel_format == PixelFormat1bppIndexed ? 2 : 256;
-    for (int i = 0; i < entries; i++) {
-      ppal[i] = pal.Entries[i] & 0x00ffffff;
-    }
-  }
-  ScopedDIBitmap pInfo(FX_Alloc(PREVIEW3_DIBITMAP, 1));
-  pInfo->pbmi = (BITMAPINFO*)buf;
-  pInfo->pScan0 = (LPBYTE)pBitmapData->Scan0;
-  pInfo->Stride = pBitmapData->Stride;
-  pInfo->pBitmap = pBitmap;
-  pInfo->pBitmapData = pBitmapData;
-  pInfo->pStream = pStream;
-  return pInfo;
-}
-
 }  // namespace
 
 CGdiplusExt::CGdiplusExt() = default;
@@ -979,26 +876,3 @@
   CallFunc(GdipDeleteGraphics)(pGraphics);
   return true;
 }
-
-RetainPtr<CFX_DIBitmap> CGdiplusExt::LoadDIBitmap(WINDIB_Open_Args_ args) {
-  ScopedDIBitmap pInfo = LoadDIBitmapImpl(args);
-  if (!pInfo)
-    return nullptr;
-
-  int height = abs(pInfo->pbmi->bmiHeader.biHeight);
-  int width = pInfo->pbmi->bmiHeader.biWidth;
-  int dest_pitch = (width * pInfo->pbmi->bmiHeader.biBitCount + 31) / 32 * 4;
-  std::vector<uint8_t, FxAllocAllocator<uint8_t>> data =
-      pdfium::Vector2D<uint8_t, FxAllocAllocator<uint8_t>>(dest_pitch, height);
-  if (dest_pitch == pInfo->Stride) {
-    memcpy(data.data(), pInfo->pScan0, dest_pitch * height);
-  } else {
-    for (int i = 0; i < height; i++) {
-      memcpy(data.data() + dest_pitch * i, pInfo->pScan0 + pInfo->Stride * i,
-             dest_pitch);
-    }
-  }
-  RetainPtr<CFX_DIBitmap> pDIBitmap =
-      CFX_WindowsDIB::LoadFromBuf(pInfo->pbmi, data.data());
-  return pDIBitmap;
-}
diff --git a/core/fxge/win32/cgdi_plus_ext.h b/core/fxge/win32/cgdi_plus_ext.h
index fe6a6a8..9a495a9 100644
--- a/core/fxge/win32/cgdi_plus_ext.h
+++ b/core/fxge/win32/cgdi_plus_ext.h
@@ -21,7 +21,6 @@
 struct CFX_FillRenderOptions;
 struct FXDIB_ResampleOptions;
 struct FX_RECT;
-struct WINDIB_Open_Args_;
 
 class CGdiplusExt {
  public:
@@ -46,8 +45,6 @@
                 uint32_t stroke_argb,
                 const CFX_FillRenderOptions& fill_options);
 
-  RetainPtr<CFX_DIBitmap> LoadDIBitmap(WINDIB_Open_Args_ args);
-
   std::vector<FARPROC> m_Functions;
 
  private:
