diff --git a/core/fpdfapi/page/cpdf_dib.cpp b/core/fpdfapi/page/cpdf_dib.cpp
index b2f7e73..05fd50c 100644
--- a/core/fpdfapi/page/cpdf_dib.cpp
+++ b/core/fpdfapi/page/cpdf_dib.cpp
@@ -271,7 +271,7 @@
     if (!m_bpc || !m_nComponents)
       return false;
 
-    m_Format = MakeRGBFormat(CalculateBitsPerPixel(m_bpc, m_nComponents));
+    SetFormat(MakeRGBFormat(CalculateBitsPerPixel(m_bpc, m_nComponents)));
   }
 
   std::optional<uint32_t> pitch = fxge::CalculatePitch32(GetBPP(), m_Width);
@@ -281,7 +281,7 @@
   m_LineBuf = DataVector<uint8_t>(pitch.value());
   LoadPalette();
   if (m_bColorKey) {
-    m_Format = FXDIB_Format::kArgb;
+    SetFormat(FXDIB_Format::kArgb);
     pitch = fxge::CalculatePitch32(GetBPP(), m_Width);
     if (!pitch.has_value())
       return false;
@@ -1310,7 +1310,7 @@
 void CPDF_DIB::SetMaskProperties() {
   m_bpc = 1;
   m_nComponents = 1;
-  m_Format = FXDIB_Format::k1bppMask;
+  SetFormat(FXDIB_Format::k1bppMask);
 }
 
 uint32_t CPDF_DIB::Get1BitSetValue() const {
diff --git a/core/fpdfapi/page/cpdf_pageimagecache.cpp b/core/fpdfapi/page/cpdf_pageimagecache.cpp
index c47b4b5..5cf2570 100644
--- a/core/fpdfapi/page/cpdf_pageimagecache.cpp
+++ b/core/fpdfapi/page/cpdf_pageimagecache.cpp
@@ -51,7 +51,7 @@
  public:
   explicit CachedImage(RetainPtr<CFX_DIBBase> image)
       : image_(std::move(image)) {
-    m_Format = image_->GetFormat();
+    SetFormat(image_->GetFormat());
     m_Width = image_->GetWidth();
     m_Height = image_->GetHeight();
     m_Pitch = image_->GetPitch();
diff --git a/core/fpdfapi/page/cpdf_transferfuncdib.cpp b/core/fpdfapi/page/cpdf_transferfuncdib.cpp
index 6c396b3..d7fdfb4 100644
--- a/core/fpdfapi/page/cpdf_transferfuncdib.cpp
+++ b/core/fpdfapi/page/cpdf_transferfuncdib.cpp
@@ -31,7 +31,7 @@
       m_RampB(m_pTransferFunc->GetSamplesB()) {
   m_Width = m_pSrc->GetWidth();
   m_Height = m_pSrc->GetHeight();
-  m_Format = GetDestFormat();
+  SetFormat(GetDestFormat());
   m_Pitch = fxge::CalculatePitch32OrDie(GetBPP(), m_Width);
   m_Scanline.resize(m_Pitch);
   DCHECK(m_palette.empty());
diff --git a/core/fxge/dib/cfx_dibbase.h b/core/fxge/dib/cfx_dibbase.h
index 5a3b7c1..7c8eb75 100644
--- a/core/fxge/dib/cfx_dibbase.h
+++ b/core/fxge/dib/cfx_dibbase.h
@@ -61,9 +61,9 @@
   uint32_t GetPitch() const { return m_Pitch; }
 
   FXDIB_Format GetFormat() const { return m_Format; }
-  int GetBPP() const { return GetBppFromFormat(m_Format); }
-  bool IsMaskFormat() const { return GetIsMaskFromFormat(m_Format); }
-  bool IsAlphaFormat() const { return m_Format == FXDIB_Format::kArgb; }
+  int GetBPP() const { return GetBppFromFormat(GetFormat()); }
+  bool IsMaskFormat() const { return GetIsMaskFromFormat(GetFormat()); }
+  bool IsAlphaFormat() const { return GetFormat() == FXDIB_Format::kArgb; }
   bool IsOpaqueImage() const { return !IsMaskFormat() && !IsAlphaFormat(); }
 
   bool HasPalette() const { return !m_palette.empty(); }
@@ -133,11 +133,15 @@
   void BuildPalette();
   int FindPalette(uint32_t color) const;
 
-  FXDIB_Format m_Format = FXDIB_Format::kInvalid;
+  void SetFormat(FXDIB_Format format) { m_Format = format; }
+
   int m_Width = 0;
   int m_Height = 0;
   uint32_t m_Pitch = 0;
   DataVector<uint32_t> m_palette;
+
+ private:
+  FXDIB_Format m_Format = FXDIB_Format::kInvalid;
 };
 
 #endif  // CORE_FXGE_DIB_CFX_DIBBASE_H_
diff --git a/core/fxge/dib/cfx_dibitmap.cpp b/core/fxge/dib/cfx_dibitmap.cpp
index 2d8f5e4..22ff631 100644
--- a/core/fxge/dib/cfx_dibitmap.cpp
+++ b/core/fxge/dib/cfx_dibitmap.cpp
@@ -40,7 +40,7 @@
                           uint8_t* pBuffer,
                           uint32_t pitch) {
   m_pBuffer = nullptr;
-  m_Format = format;
+  SetFormat(format);
   m_Width = 0;
   m_Height = 0;
   m_Pitch = 0;
@@ -125,7 +125,7 @@
   m_pBuffer = std::move(pSrcBitmap->m_pBuffer);
   m_palette = std::move(pSrcBitmap->m_palette);
   pSrcBitmap->m_pBuffer = nullptr;
-  m_Format = pSrcBitmap->m_Format;
+  SetFormat(pSrcBitmap->GetFormat());
   m_Width = pSrcBitmap->m_Width;
   m_Height = pSrcBitmap->m_Height;
   m_Pitch = pSrcBitmap->m_Pitch;
@@ -820,16 +820,18 @@
          dest_format == FXDIB_Format::kRgb32 ||
          dest_format == FXDIB_Format::kRgb);
 
-  if (dest_format == m_Format)
-    return true;
-
-  if (dest_format == FXDIB_Format::k8bppMask &&
-      m_Format == FXDIB_Format::k8bppRgb && !HasPalette()) {
-    m_Format = FXDIB_Format::k8bppMask;
+  if (dest_format == GetFormat()) {
     return true;
   }
-  if (dest_format == FXDIB_Format::kArgb && m_Format == FXDIB_Format::kRgb32) {
-    m_Format = FXDIB_Format::kArgb;
+
+  if (dest_format == FXDIB_Format::k8bppMask &&
+      GetFormat() == FXDIB_Format::k8bppRgb && !HasPalette()) {
+    SetFormat(FXDIB_Format::k8bppMask);
+    return true;
+  }
+  if (dest_format == FXDIB_Format::kArgb &&
+      GetFormat() == FXDIB_Format::kRgb32) {
+    SetFormat(FXDIB_Format::kArgb);
     UNSAFE_TODO({
       for (int row = 0; row < m_Height; row++) {
         uint8_t* scanline = m_pBuffer.Get() + row * m_Pitch + 3;
@@ -859,7 +861,7 @@
       UNSAFE_BUFFERS(pdfium::make_span(dest_buf.get(), dest_buf_size)),
       dest_pitch, m_Width, m_Height, holder, /*src_left=*/0, /*src_top=*/0);
   m_pBuffer = std::move(dest_buf);
-  m_Format = dest_format;
+  SetFormat(dest_format);
   m_Pitch = dest_pitch;
   return true;
 }
