diff --git a/core/fpdfapi/page/cpdf_dib.cpp b/core/fpdfapi/page/cpdf_dib.cpp
index 05fd50c..0e11d9b 100644
--- a/core/fpdfapi/page/cpdf_dib.cpp
+++ b/core/fpdfapi/page/cpdf_dib.cpp
@@ -274,7 +274,7 @@
     SetFormat(MakeRGBFormat(CalculateBitsPerPixel(m_bpc, m_nComponents)));
   }
 
-  std::optional<uint32_t> pitch = fxge::CalculatePitch32(GetBPP(), m_Width);
+  std::optional<uint32_t> pitch = fxge::CalculatePitch32(GetBPP(), GetWidth());
   if (!pitch.has_value())
     return false;
 
@@ -282,12 +282,12 @@
   LoadPalette();
   if (m_bColorKey) {
     SetFormat(FXDIB_Format::kArgb);
-    pitch = fxge::CalculatePitch32(GetBPP(), m_Width);
+    pitch = fxge::CalculatePitch32(GetBPP(), GetWidth());
     if (!pitch.has_value())
       return false;
     m_MaskBuf = DataVector<uint8_t>(pitch.value());
   }
-  m_Pitch = pitch.value();
+  SetPitch(pitch.value());
   return true;
 }
 
@@ -312,9 +312,9 @@
 
   uint8_t resolution_levels_to_skip = 0;
   if (max_size_required.width != 0 && max_size_required.height != 0) {
-    resolution_levels_to_skip = static_cast<uint8_t>(
-        std::log2(std::max(1, std::min(m_Width / max_size_required.width,
-                                       m_Height / max_size_required.height))));
+    resolution_levels_to_skip = static_cast<uint8_t>(std::log2(
+        std::max(1, std::min(GetWidth() / max_size_required.width,
+                             GetHeight() / max_size_required.height))));
   }
 
   LoadState iCreatedDecoder = CreateDecoder(resolution_levels_to_skip);
@@ -375,8 +375,8 @@
       nGlobalKey = m_pGlobalAcc->KeyForCache();
     }
     iDecodeStatus = Jbig2Decoder::StartDecode(
-        m_pJbig2Context.get(), m_pDocument->GetOrCreateCodecContext(), m_Width,
-        m_Height, pSrcSpan, nSrcKey, pGlobalSpan, nGlobalKey,
+        m_pJbig2Context.get(), m_pDocument->GetOrCreateCodecContext(),
+        GetWidth(), GetHeight(), pSrcSpan, nSrcKey, pGlobalSpan, nGlobalKey,
         m_pCachedBitmap->GetWritableBuffer(), m_pCachedBitmap->GetPitch(),
         pPause);
   } else {
@@ -542,7 +542,7 @@
   if (decoder == "JBIG2Decode") {
     m_pCachedBitmap = pdfium::MakeRetain<CFX_DIBitmap>();
     if (!m_pCachedBitmap->Create(
-            m_Width, m_Height,
+            GetWidth(), GetHeight(),
             m_bImageMask ? FXDIB_Format::k1bppMask : FXDIB_Format::k1bppRgb)) {
       m_pCachedBitmap.Reset();
       return LoadState::kFail;
@@ -554,13 +554,13 @@
   pdfium::span<const uint8_t> src_span = m_pStreamAcc->GetSpan();
   RetainPtr<const CPDF_Dictionary> pParams = m_pStreamAcc->GetImageParam();
   if (decoder == "CCITTFaxDecode") {
-    m_pDecoder = CreateFaxDecoder(src_span, m_Width, m_Height, pParams);
+    m_pDecoder = CreateFaxDecoder(src_span, GetWidth(), GetHeight(), pParams);
   } else if (decoder == "FlateDecode") {
-    m_pDecoder = CreateFlateDecoder(src_span, m_Width, m_Height, m_nComponents,
-                                    m_bpc, pParams);
+    m_pDecoder = CreateFlateDecoder(src_span, GetWidth(), GetHeight(),
+                                    m_nComponents, m_bpc, pParams);
   } else if (decoder == "RunLengthDecode") {
     m_pDecoder = BasicModule::CreateRunLengthDecoder(
-        src_span, m_Width, m_Height, m_nComponents, m_bpc);
+        src_span, GetWidth(), GetHeight(), m_nComponents, m_bpc);
   } else if (decoder == "DCTDecode") {
     if (!CreateDCTDecoder(src_span, pParams))
       return LoadState::kFail;
@@ -569,7 +569,7 @@
     return LoadState::kFail;
 
   const std::optional<uint32_t> requested_pitch =
-      fxge::CalculatePitch8(m_bpc, m_nComponents, m_Width);
+      fxge::CalculatePitch8(m_bpc, m_nComponents, GetWidth());
   if (!requested_pitch.has_value())
     return LoadState::kFail;
   const std::optional<uint32_t> provided_pitch = fxge::CalculatePitch8(
@@ -584,7 +584,7 @@
 bool CPDF_DIB::CreateDCTDecoder(pdfium::span<const uint8_t> src_span,
                                 const CPDF_Dictionary* pParams) {
   m_pDecoder = JpegModule::CreateDecoder(
-      src_span, m_Width, m_Height, m_nComponents,
+      src_span, GetWidth(), GetHeight(), m_nComponents,
       !pParams || pParams->GetIntegerFor("ColorTransform", 1));
   if (m_pDecoder)
     return true;
@@ -595,8 +595,8 @@
     return false;
 
   const JpegModule::ImageInfo& info = info_opt.value();
-  m_Width = info.width;
-  m_Height = info.height;
+  SetWidth(info.width);
+  SetHeight(info.height);
 
   if (!CPDF_Image::IsValidJpegComponent(info.num_components) ||
       !CPDF_Image::IsValidJpegBitsPerComponent(info.bits_per_components)) {
@@ -605,7 +605,7 @@
 
   if (m_nComponents == static_cast<uint32_t>(info.num_components)) {
     m_bpc = info.bits_per_components;
-    m_pDecoder = JpegModule::CreateDecoder(src_span, m_Width, m_Height,
+    m_pDecoder = JpegModule::CreateDecoder(src_span, GetWidth(), GetHeight(),
                                            m_nComponents, info.color_transform);
     return true;
   }
@@ -650,7 +650,7 @@
     return false;
 
   m_bpc = info.bits_per_components;
-  m_pDecoder = JpegModule::CreateDecoder(src_span, m_Width, m_Height,
+  m_pDecoder = JpegModule::CreateDecoder(src_span, GetWidth(), GetHeight(),
                                          m_nComponents, info.color_transform);
   return true;
 }
@@ -664,15 +664,15 @@
   if (!decoder)
     return nullptr;
 
-  m_Height >>= resolution_levels_to_skip;
-  m_Width >>= resolution_levels_to_skip;
+  SetWidth(GetWidth() >> resolution_levels_to_skip);
+  SetHeight(GetHeight() >> resolution_levels_to_skip);
 
   if (!decoder->StartDecode())
     return nullptr;
 
   CJPX_Decoder::JpxImageInfo image_info = decoder->GetInfo();
-  if (static_cast<int>(image_info.width) < m_Width ||
-      static_cast<int>(image_info.height) < m_Height) {
+  if (static_cast<int>(image_info.width) < GetWidth() ||
+      static_cast<int>(image_info.height) < GetHeight()) {
     return nullptr;
   }
 
@@ -816,10 +816,11 @@
     return false;
 
   m_pDict = m_pStream->GetDict();
-  m_Width = m_pDict->GetIntegerFor("Width");
-  m_Height = m_pDict->GetIntegerFor("Height");
-  if (!IsValidDimension(m_Width) || !IsValidDimension(m_Height))
+  SetWidth(m_pDict->GetIntegerFor("Width"));
+  SetHeight(m_pDict->GetIntegerFor("Height"));
+  if (!IsValidDimension(GetWidth()) || !IsValidDimension(GetHeight())) {
     return false;
+  }
 
   if (!LoadColorInfo(pFormResources, pPageResources))
     return false;
@@ -828,12 +829,12 @@
     return false;
 
   const std::optional<uint32_t> maybe_size =
-      fxge::CalculatePitch8(m_bpc, m_nComponents, m_Width);
+      fxge::CalculatePitch8(m_bpc, m_nComponents, GetWidth());
   if (!maybe_size.has_value())
     return false;
 
   FX_SAFE_UINT32 src_size = maybe_size.value();
-  src_size *= m_Height;
+  src_size *= GetHeight();
   if (!src_size.IsValid())
     return false;
 
@@ -1049,7 +1050,7 @@
   uint64_t src_byte_pos = 0;
   size_t dest_byte_pos = 0;
   const bool bpp8 = m_bpc == 8;
-  for (int column = 0; column < m_Width; column++) {
+  for (int column = 0; column < GetWidth(); column++) {
     for (uint32_t color = 0; color < m_nComponents; color++) {
       if (bpp8) {
         uint8_t data = src_scan[src_byte_pos++];
@@ -1092,8 +1093,8 @@
       return false;
 
     if (m_nComponents == m_pColorSpace->ComponentCount()) {
-      m_pColorSpace->TranslateImageLine(dest_scan, src_scan, m_Width, m_Width,
-                                        m_Height, TransMask());
+      m_pColorSpace->TranslateImageLine(dest_scan, src_scan, GetWidth(),
+                                        GetWidth(), GetHeight(), TransMask());
     }
     return true;
   }
@@ -1106,7 +1107,7 @@
   switch (m_bpc) {
     case 8:
       UNSAFE_TODO({
-        for (int column = 0; column < m_Width; column++) {
+        for (int column = 0; column < GetWidth(); column++) {
           *dest_pos++ = src_pos[2];
           *dest_pos++ = src_pos[1];
           *dest_pos++ = *src_pos;
@@ -1116,7 +1117,7 @@
       break;
     case 16:
       UNSAFE_TODO({
-        for (int col = 0; col < m_Width; col++) {
+        for (int col = 0; col < GetWidth(); col++) {
           *dest_pos++ = src_pos[4];
           *dest_pos++ = src_pos[2];
           *dest_pos++ = *src_pos;
@@ -1129,7 +1130,7 @@
       uint64_t src_bit_pos = 0;
       size_t dest_byte_pos = 0;
       UNSAFE_TODO({
-        for (int column = 0; column < m_Width; column++) {
+        for (int column = 0; column < GetWidth(); column++) {
           unsigned int R = GetBits8(src_scan.data(), src_bit_pos, m_bpc);
           src_bit_pos += m_bpc;
           unsigned int G = GetBits8(src_scan.data(), src_bit_pos, m_bpc);
@@ -1155,7 +1156,7 @@
     return pdfium::span<const uint8_t>();
 
   const std::optional<uint32_t> src_pitch =
-      fxge::CalculatePitch8(m_bpc, m_nComponents, m_Width);
+      fxge::CalculatePitch8(m_bpc, m_nComponents, GetWidth());
   if (!src_pitch.has_value())
     return pdfium::span<const uint8_t>();
 
@@ -1204,11 +1205,11 @@
     uint32_t set_argb = Get1BitSetValue();
     uint32_t* dest_scan = reinterpret_cast<uint32_t*>(m_MaskBuf.data());
     UNSAFE_TODO({
-      for (int col = 0; col < m_Width; col++, dest_scan++) {
+      for (int col = 0; col < GetWidth(); col++, dest_scan++) {
         *dest_scan = GetBitValue(pSrcLine.data(), col) ? set_argb : reset_argb;
       }
     });
-    return pdfium::make_span(m_MaskBuf).first(m_Width * sizeof(uint32_t));
+    return pdfium::make_span(m_MaskBuf).first(GetWidth() * sizeof(uint32_t));
   }
   if (m_bpc * m_nComponents <= 8) {
     pdfium::span<uint8_t> result = m_LineBuf;
@@ -1217,7 +1218,7 @@
       result = result.first(src_pitch_value);
     } else {
       uint64_t src_bit_pos = 0;
-      for (int col = 0; col < m_Width; col++) {
+      for (int col = 0; col < GetWidth(); col++) {
         unsigned int color_index = 0;
         for (uint32_t color = 0; color < m_nComponents; color++) {
           unsigned int data = GetBits8(pSrcLine.data(), src_bit_pos, m_bpc);
@@ -1226,7 +1227,7 @@
         }
         m_LineBuf[col] = color_index;
       }
-      result = result.first(m_Width);
+      result = result.first(GetWidth());
     }
     if (!m_bColorKey)
       return result;
@@ -1236,7 +1237,7 @@
     pdfium::span<const uint32_t> palette = GetPaletteSpan();
     UNSAFE_TODO({
       if (HasPalette()) {
-        for (int col = 0; col < m_Width; col++) {
+        for (int col = 0; col < GetWidth(); col++) {
           uint8_t index = *pSrcPixel++;
           *pDestPixel++ = FXARGB_B(palette[index]);
           *pDestPixel++ = FXARGB_G(palette[index]);
@@ -1245,7 +1246,7 @@
               IsColorIndexOutOfBounds(index, m_CompData[0]) ? 0xFF : 0;
         }
       } else {
-        for (int col = 0; col < m_Width; col++) {
+        for (int col = 0; col < GetWidth(); col++) {
           uint8_t index = *pSrcPixel++;
           *pDestPixel++ = index;
           *pDestPixel++ = index;
@@ -1255,13 +1256,13 @@
         }
       }
     });
-    return pdfium::make_span(m_MaskBuf).first(4 * m_Width);
+    return pdfium::make_span(m_MaskBuf).first(4 * GetWidth());
   }
   if (m_bColorKey) {
     if (m_nComponents == 3 && m_bpc == 8) {
       UNSAFE_TODO({
         uint8_t* alpha_channel = m_MaskBuf.data() + 3;
-        for (int col = 0; col < m_Width; col++) {
+        for (int col = 0; col < GetWidth(); col++) {
           const uint8_t* pPixel = pSrcLine.data() + col * 3;
           alpha_channel[col * 4] =
               AreColorIndicesOutOfBounds(pPixel, m_CompData.data(), 3) ? 0xFF
@@ -1274,7 +1275,7 @@
   }
   if (m_pColorSpace) {
     TranslateScanline24bpp(m_LineBuf, pSrcLine);
-    src_pitch_value = 3 * m_Width;
+    src_pitch_value = 3 * GetWidth();
     pSrcLine = pdfium::make_span(m_LineBuf).first(src_pitch_value);
   }
   if (!m_bColorKey)
@@ -1284,14 +1285,14 @@
   const uint8_t* pSrcPixel = pSrcLine.data();
   uint8_t* pDestPixel = m_MaskBuf.data();
   UNSAFE_TODO({
-    for (int col = 0; col < m_Width; col++) {
+    for (int col = 0; col < GetWidth(); col++) {
       *pDestPixel++ = *pSrcPixel++;
       *pDestPixel++ = *pSrcPixel++;
       *pDestPixel++ = *pSrcPixel++;
       pDestPixel++;
     }
   });
-  return pdfium::make_span(m_MaskBuf).first(4 * m_Width);
+  return pdfium::make_span(m_MaskBuf).first(4 * GetWidth());
 }
 
 bool CPDF_DIB::SkipToScanline(int line, PauseIndicatorIface* pPause) const {
diff --git a/core/fpdfapi/page/cpdf_pageimagecache.cpp b/core/fpdfapi/page/cpdf_pageimagecache.cpp
index 5cf2570..d1ac782 100644
--- a/core/fpdfapi/page/cpdf_pageimagecache.cpp
+++ b/core/fpdfapi/page/cpdf_pageimagecache.cpp
@@ -52,9 +52,9 @@
   explicit CachedImage(RetainPtr<CFX_DIBBase> image)
       : image_(std::move(image)) {
     SetFormat(image_->GetFormat());
-    m_Width = image_->GetWidth();
-    m_Height = image_->GetHeight();
-    m_Pitch = image_->GetPitch();
+    SetWidth(image_->GetWidth());
+    SetHeight(image_->GetHeight());
+    SetPitch(image_->GetPitch());
 
     if (image_->HasPalette()) {
       pdfium::span<const uint32_t> palette = image_->GetPaletteSpan();
diff --git a/core/fpdfapi/page/cpdf_transferfuncdib.cpp b/core/fpdfapi/page/cpdf_transferfuncdib.cpp
index d7fdfb4..503e8bf 100644
--- a/core/fpdfapi/page/cpdf_transferfuncdib.cpp
+++ b/core/fpdfapi/page/cpdf_transferfuncdib.cpp
@@ -29,11 +29,11 @@
       m_RampR(m_pTransferFunc->GetSamplesR()),
       m_RampG(m_pTransferFunc->GetSamplesG()),
       m_RampB(m_pTransferFunc->GetSamplesB()) {
-  m_Width = m_pSrc->GetWidth();
-  m_Height = m_pSrc->GetHeight();
+  SetWidth(m_pSrc->GetWidth());
+  SetHeight(m_pSrc->GetHeight());
   SetFormat(GetDestFormat());
-  m_Pitch = fxge::CalculatePitch32OrDie(GetBPP(), m_Width);
-  m_Scanline.resize(m_Pitch);
+  SetPitch(fxge::CalculatePitch32OrDie(GetBPP(), GetWidth()));
+  m_Scanline.resize(GetPitch());
   DCHECK(m_palette.empty());
 }
 
@@ -66,7 +66,7 @@
       int b1 = m_RampB[255];
       int index = 0;
       UNSAFE_TODO({
-        for (int i = 0; i < m_Width; i++) {
+        for (int i = 0; i < GetWidth(); i++) {
           if (src_buf[i / 8] & (1 << (7 - i % 8))) {
             m_Scanline[index++] = b1;
             m_Scanline[index++] = g1;
@@ -86,7 +86,7 @@
       int m1 = m_RampR[255];
       int index = 0;
       UNSAFE_TODO({
-        for (int i = 0; i < m_Width; i++) {
+        for (int i = 0; i < GetWidth(); i++) {
           if (src_buf[i / 8] & (1 << (7 - i % 8))) {
             m_Scanline[index++] = m1;
           } else {
@@ -100,7 +100,7 @@
       pdfium::span<const uint32_t> src_palette = m_pSrc->GetPaletteSpan();
       int index = 0;
       UNSAFE_TODO({
-        for (int i = 0; i < m_Width; i++) {
+        for (int i = 0; i < GetWidth(); i++) {
           if (m_pSrc->HasPalette()) {
             FX_ARGB src_argb = src_palette[*src_buf];
             m_Scanline[index++] = m_RampB[FXARGB_R(src_argb)];
@@ -121,7 +121,7 @@
     case FXDIB_Format::k8bppMask: {
       int index = 0;
       UNSAFE_TODO({
-        for (int i = 0; i < m_Width; i++) {
+        for (int i = 0; i < GetWidth(); i++) {
           m_Scanline[index++] = m_RampR[*(src_buf++)];
         }
       });
@@ -130,7 +130,7 @@
     case FXDIB_Format::kRgb: {
       int index = 0;
       UNSAFE_TODO({
-        for (int i = 0; i < m_Width; i++) {
+        for (int i = 0; i < GetWidth(); i++) {
           m_Scanline[index++] = m_RampB[*(src_buf++)];
           m_Scanline[index++] = m_RampG[*(src_buf++)];
           m_Scanline[index++] = m_RampR[*(src_buf++)];
@@ -145,7 +145,7 @@
     case FXDIB_Format::kArgb: {
       int index = 0;
       UNSAFE_TODO({
-        for (int i = 0; i < m_Width; i++) {
+        for (int i = 0; i < GetWidth(); i++) {
           m_Scanline[index++] = m_RampB[*(src_buf++)];
           m_Scanline[index++] = m_RampG[*(src_buf++)];
           m_Scanline[index++] = m_RampR[*(src_buf++)];
diff --git a/core/fxge/dib/cfx_dibbase.cpp b/core/fxge/dib/cfx_dibbase.cpp
index d35bc90..4df13bf 100644
--- a/core/fxge/dib/cfx_dibbase.cpp
+++ b/core/fxge/dib/cfx_dibbase.cpp
@@ -671,7 +671,7 @@
 
 RetainPtr<CFX_DIBitmap> CFX_DIBBase::ClipToInternal(
     const FX_RECT* pClip) const {
-  FX_RECT rect(0, 0, m_Width, m_Height);
+  FX_RECT rect(0, 0, GetWidth(), GetHeight());
   if (pClip) {
     rect.Intersect(*pClip);
     if (rect.IsEmpty())
@@ -685,7 +685,7 @@
   if (GetBPP() == 1 && rect.left % 8 != 0) {
     int left_shift = rect.left % 32;
     int right_shift = 32 - left_shift;
-    int dword_count = pNewBitmap->m_Pitch / 4;
+    int dword_count = pNewBitmap->GetPitch() / 4;
     for (int row = rect.top; row < rect.bottom; ++row) {
       auto src_span = GetScanlineAs<const uint32_t>(row);
       auto dst_span =
@@ -708,7 +708,7 @@
       return nullptr;
     }
 
-    copy_len = std::min<uint32_t>(m_Pitch, copy_len.value());
+    copy_len = std::min<uint32_t>(GetPitch(), copy_len.value());
 
     FX_SAFE_UINT32 offset = rect.left;
     offset *= GetBPP();
@@ -803,8 +803,9 @@
   DCHECK_GT(width, 0);
   DCHECK_GT(height, 0);
 
-  if (dest_left > m_Width || dest_top > m_Height)
+  if (dest_left > GetWidth() || dest_top > GetHeight()) {
     return false;
+  }
 
   FX_SAFE_INT32 safe_src_width = src_left;
   safe_src_width += width;
@@ -854,7 +855,7 @@
   FX_RECT dest_rect(safe_dest_left.ValueOrDie(), safe_dest_top.ValueOrDie(),
                     safe_dest_right.ValueOrDie(),
                     safe_dest_bottom.ValueOrDie());
-  FX_RECT dest_bound(0, 0, m_Width, m_Height);
+  FX_RECT dest_bound(0, 0, GetWidth(), GetHeight());
   dest_rect.Intersect(dest_bound);
 
   if (pClipRgn)
@@ -901,14 +902,15 @@
 RetainPtr<CFX_DIBitmap> CFX_DIBBase::CloneAlphaMask() const {
   DCHECK_EQ(GetFormat(), FXDIB_Format::kArgb);
   auto pMask = pdfium::MakeRetain<CFX_DIBitmap>();
-  if (!pMask->Create(m_Width, m_Height, FXDIB_Format::k8bppMask))
+  if (!pMask->Create(GetWidth(), GetHeight(), FXDIB_Format::k8bppMask)) {
     return nullptr;
+  }
 
-  for (int row = 0; row < m_Height; ++row) {
+  for (int row = 0; row < GetHeight(); ++row) {
     const uint8_t* src_scan = GetScanline(row).subspan(3).data();
     uint8_t* dest_scan = pMask->GetWritableScanline(row).data();
     UNSAFE_TODO({
-      for (int col = 0; col < m_Width; ++col) {
+      for (int col = 0; col < GetWidth(); ++col) {
         *dest_scan++ = *src_scan;
         src_scan += 4;
       }
@@ -919,48 +921,49 @@
 
 RetainPtr<CFX_DIBitmap> CFX_DIBBase::FlipImage(bool bXFlip, bool bYFlip) const {
   auto pFlipped = pdfium::MakeRetain<CFX_DIBitmap>();
-  if (!pFlipped->Create(m_Width, m_Height, GetFormat()))
+  if (!pFlipped->Create(GetWidth(), GetHeight(), GetFormat())) {
     return nullptr;
+  }
 
   pFlipped->SetPalette(GetPaletteSpan());
   const int Bpp = GetBPP() / 8;
   UNSAFE_TODO({
-    for (int row = 0; row < m_Height; ++row) {
+    for (int row = 0; row < GetHeight(); ++row) {
       const uint8_t* src_scan = GetScanline(row).data();
       uint8_t* dest_scan =
-          pFlipped->GetWritableScanline(bYFlip ? m_Height - row - 1 : row)
+          pFlipped->GetWritableScanline(bYFlip ? GetHeight() - row - 1 : row)
               .data();
       if (!bXFlip) {
-        FXSYS_memcpy(dest_scan, src_scan, m_Pitch);
+        FXSYS_memcpy(dest_scan, src_scan, GetPitch());
         continue;
       }
       if (GetBPP() == 1) {
-        FXSYS_memset(dest_scan, 0, m_Pitch);
-        for (int col = 0; col < m_Width; ++col) {
+        FXSYS_memset(dest_scan, 0, GetPitch());
+        for (int col = 0; col < GetWidth(); ++col) {
           if (src_scan[col / 8] & (1 << (7 - col % 8))) {
-            int dest_col = m_Width - col - 1;
+            int dest_col = GetWidth() - col - 1;
             dest_scan[dest_col / 8] |= (1 << (7 - dest_col % 8));
           }
         }
         continue;
       }
 
-      dest_scan += (m_Width - 1) * Bpp;
+      dest_scan += (GetWidth() - 1) * Bpp;
       if (Bpp == 1) {
-        for (int col = 0; col < m_Width; ++col) {
+        for (int col = 0; col < GetWidth(); ++col) {
           *dest_scan = *src_scan;
           --dest_scan;
           ++src_scan;
         }
       } else if (Bpp == 3) {
-        for (int col = 0; col < m_Width; ++col) {
+        for (int col = 0; col < GetWidth(); ++col) {
           FXSYS_memcpy(dest_scan, src_scan, 3);
           dest_scan -= 3;
           src_scan += 3;
         }
       } else {
         DCHECK_EQ(Bpp, 4);
-        for (int col = 0; col < m_Width; ++col) {
+        for (int col = 0; col < GetWidth(); ++col) {
           const auto* src_scan32 = reinterpret_cast<const uint32_t*>(src_scan);
           uint32_t* dest_scan32 = reinterpret_cast<uint32_t*>(dest_scan);
           *dest_scan32 = *src_scan32;
@@ -978,8 +981,9 @@
     return Realize();
 
   auto pClone = pdfium::MakeRetain<CFX_DIBitmap>();
-  if (!pClone->Create(m_Width, m_Height, dest_format))
+  if (!pClone->Create(GetWidth(), GetHeight(), dest_format)) {
     return nullptr;
+  }
 
   if (dest_format == FXDIB_Format::kArgb) {
     pClone->SetUniformOpaqueAlpha();
@@ -988,7 +992,7 @@
   RetainPtr<const CFX_DIBBase> holder(this);
   DataVector<uint32_t> pal_8bpp =
       ConvertBuffer(dest_format, pClone->GetWritableBuffer(),
-                    pClone->GetPitch(), m_Width, m_Height, holder, 0, 0);
+                    pClone->GetPitch(), GetWidth(), GetHeight(), holder, 0, 0);
   if (!pal_8bpp.empty()) {
     pClone->TakePalette(std::move(pal_8bpp));
   }
@@ -996,7 +1000,7 @@
 }
 
 RetainPtr<CFX_DIBitmap> CFX_DIBBase::SwapXY(bool bXFlip, bool bYFlip) const {
-  FX_RECT dest_clip(0, 0, m_Height, m_Width);
+  FX_RECT dest_clip(0, 0, GetHeight(), GetWidth());
   if (dest_clip.IsEmpty())
     return nullptr;
 
@@ -1012,10 +1016,10 @@
       Fx2DSizeOrDie(dest_pitch, result_height));
   const size_t dest_last_row_offset =
       Fx2DSizeOrDie(dest_pitch, result_height - 1);
-  const int row_start = bXFlip ? m_Height - dest_clip.right : dest_clip.left;
-  const int row_end = bXFlip ? m_Height - dest_clip.left : dest_clip.right;
-  const int col_start = bYFlip ? m_Width - dest_clip.bottom : dest_clip.top;
-  const int col_end = bYFlip ? m_Width - dest_clip.top : dest_clip.bottom;
+  const int row_start = bXFlip ? GetHeight() - dest_clip.right : dest_clip.left;
+  const int row_end = bXFlip ? GetHeight() - dest_clip.left : dest_clip.right;
+  const int col_start = bYFlip ? GetWidth() - dest_clip.bottom : dest_clip.top;
+  const int col_end = bYFlip ? GetWidth() - dest_clip.top : dest_clip.bottom;
   UNSAFE_TODO({
     if (GetBPP() == 1) {
       fxcrt::Fill(dest_span, 0xff);
@@ -1106,8 +1110,9 @@
   if (clip_rect.IsEmpty())
     return nullptr;
 
-  if (dest_width == m_Width && dest_height == m_Height)
+  if (dest_width == GetWidth() && dest_height == GetHeight()) {
     return ClipTo(clip_rect);
+  }
 
   CFX_BitmapStorer storer;
   CFX_ImageStretcher stretcher(&storer, holder, dest_width, dest_height,
diff --git a/core/fxge/dib/cfx_dibbase.h b/core/fxge/dib/cfx_dibbase.h
index 7c8eb75..1eb780b 100644
--- a/core/fxge/dib/cfx_dibbase.h
+++ b/core/fxge/dib/cfx_dibbase.h
@@ -134,14 +134,17 @@
   int FindPalette(uint32_t color) const;
 
   void SetFormat(FXDIB_Format format) { m_Format = format; }
+  void SetWidth(int width) { m_Width = width; }
+  void SetHeight(int height) { m_Height = height; }
+  void SetPitch(uint32_t pitch) { m_Pitch = pitch; }
 
-  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;
+  int m_Width = 0;
+  int m_Height = 0;
+  uint32_t m_Pitch = 0;
 };
 
 #endif  // CORE_FXGE_DIB_CFX_DIBBASE_H_
diff --git a/core/fxge/dib/cfx_dibitmap.cpp b/core/fxge/dib/cfx_dibitmap.cpp
index 22ff631..ae81e14 100644
--- a/core/fxge/dib/cfx_dibitmap.cpp
+++ b/core/fxge/dib/cfx_dibitmap.cpp
@@ -41,9 +41,9 @@
                           uint32_t pitch) {
   m_pBuffer = nullptr;
   SetFormat(format);
-  m_Width = 0;
-  m_Height = 0;
-  m_Pitch = 0;
+  SetWidth(0);
+  SetHeight(0);
+  SetPitch(0);
 
   std::optional<PitchAndSize> pitch_size =
       CalculatePitchAndSize(width, height, format, pitch);
@@ -63,9 +63,9 @@
     if (!m_pBuffer)
       return false;
   }
-  m_Width = width;
-  m_Height = height;
-  m_Pitch = pitch_size.value().pitch;
+  SetWidth(width);
+  SetHeight(height);
+  SetPitch(pitch_size.value().pitch);
   return true;
 }
 
@@ -79,8 +79,8 @@
 
   SetPalette(source->GetPaletteSpan());
   for (int row = 0; row < source->GetHeight(); row++) {
-    UNSAFE_TODO(FXSYS_memcpy(m_pBuffer.Get() + row * m_Pitch,
-                             source->GetScanline(row).data(), m_Pitch));
+    UNSAFE_TODO(FXSYS_memcpy(m_pBuffer.Get() + row * GetPitch(),
+                             source->GetScanline(row).data(), GetPitch()));
   }
   return true;
 }
@@ -91,7 +91,8 @@
   if (!m_pBuffer)
     return pdfium::span<const uint8_t>();
 
-  return UNSAFE_TODO(pdfium::make_span(m_pBuffer.Get(), m_Height * m_Pitch));
+  return UNSAFE_TODO(
+      pdfium::make_span(m_pBuffer.Get(), GetHeight() * GetPitch()));
 }
 
 pdfium::span<const uint8_t> CFX_DIBitmap::GetScanline(int line) const {
@@ -99,7 +100,7 @@
   if (buffer_span.empty())
     return pdfium::span<const uint8_t>();
 
-  return buffer_span.subspan(line * m_Pitch, m_Pitch);
+  return buffer_span.subspan(line * GetPitch(), GetPitch());
 }
 
 size_t CFX_DIBitmap::GetEstimatedImageMemoryBurden() const {
@@ -126,9 +127,9 @@
   m_palette = std::move(pSrcBitmap->m_palette);
   pSrcBitmap->m_pBuffer = nullptr;
   SetFormat(pSrcBitmap->GetFormat());
-  m_Width = pSrcBitmap->m_Width;
-  m_Height = pSrcBitmap->m_Height;
-  m_Pitch = pSrcBitmap->m_Pitch;
+  SetWidth(pSrcBitmap->GetWidth());
+  SetHeight(pSrcBitmap->GetHeight());
+  SetPitch(pSrcBitmap->GetPitch());
 }
 
 void CFX_DIBitmap::Clear(uint32_t color) {
@@ -157,7 +158,7 @@
       if (bgr.red == bgr.green && bgr.green == bgr.blue) {
         fxcrt::Fill(buffer, bgr.red);
       } else {
-        for (int row = 0; row < m_Height; row++) {
+        for (int row = 0; row < GetHeight(); row++) {
           fxcrt::Fill(GetWritableScanlineAs<FX_BGR_STRUCT<uint8_t>>(row), bgr);
         }
       }
@@ -171,7 +172,7 @@
       }
       [[fallthrough]];
     case FXDIB_Format::kArgb:
-      for (int row = 0; row < m_Height; row++) {
+      for (int row = 0; row < GetHeight(); row++) {
         fxcrt::Fill(GetWritableScanlineAs<uint32_t>(row), color);
       }
       break;
@@ -235,9 +236,10 @@
     return false;
 
   pdfium::span<uint8_t> dest_buf = GetWritableBuffer().subspan(
-      dest_top * m_Pitch + static_cast<uint32_t>(offset.ValueOrDie()));
-  DataVector<uint32_t> dest_palette = ConvertBuffer(
-      dest_format, dest_buf, m_Pitch, width, height, source, src_left, src_top);
+      dest_top * GetPitch() + static_cast<uint32_t>(offset.ValueOrDie()));
+  DataVector<uint32_t> dest_palette =
+      ConvertBuffer(dest_format, dest_buf, GetPitch(), width, height, source,
+                    src_left, src_top);
   CHECK(dest_palette.empty());
   return true;
 }
@@ -253,7 +255,7 @@
   UNSAFE_TODO({
     for (int row = 0; row < height; ++row) {
       uint8_t* dest_scan =
-          m_pBuffer.Get() + (dest_top + row) * m_Pitch + dest_left * Bpp;
+          m_pBuffer.Get() + (dest_top + row) * GetPitch() + dest_left * Bpp;
       const uint8_t* src_scan =
           source->GetScanline(src_top + row).subspan(src_left * Bpp).data();
       FXSYS_memcpy(dest_scan, src_scan, width * Bpp);
@@ -271,7 +273,7 @@
     int src_top) {
   UNSAFE_TODO({
     for (int row = 0; row < height; ++row) {
-      uint8_t* dest_scan = m_pBuffer.Get() + (dest_top + row) * m_Pitch;
+      uint8_t* dest_scan = m_pBuffer.Get() + (dest_top + row) * GetPitch();
       const uint8_t* src_scan = source->GetScanline(src_top + row).data();
       for (int col = 0; col < width; ++col) {
         int src_idx = src_left + col;
@@ -290,9 +292,9 @@
   CHECK_EQ(FXDIB_Format::kArgb, GetFormat());
   CHECK(m_pBuffer);
 
-  for (int row = 0; row < m_Height; row++) {
+  for (int row = 0; row < GetHeight(); row++) {
     auto scanline =
-        GetWritableScanlineAs<FX_BGRA_STRUCT<uint8_t>>(row).first(m_Width);
+        GetWritableScanlineAs<FX_BGRA_STRUCT<uint8_t>>(row).first(GetWidth());
     for (auto& pixel : scanline) {
       pixel.red = pixel.alpha;
     }
@@ -303,9 +305,9 @@
   CHECK_EQ(FXDIB_Format::kArgb, GetFormat());
   CHECK(m_pBuffer);
 
-  for (int row = 0; row < m_Height; row++) {
+  for (int row = 0; row < GetHeight(); row++) {
     auto scanline =
-        GetWritableScanlineAs<FX_BGRA_STRUCT<uint8_t>>(row).first(m_Width);
+        GetWritableScanlineAs<FX_BGRA_STRUCT<uint8_t>>(row).first(GetWidth());
     for (auto& pixel : scanline) {
       pixel.alpha = 0xff;
     }
@@ -313,8 +315,8 @@
 }
 
 bool CFX_DIBitmap::MultiplyAlphaMask(RetainPtr<const CFX_DIBitmap> mask) {
-  CHECK_EQ(m_Width, mask->GetWidth());
-  CHECK_EQ(m_Height, mask->GetHeight());
+  CHECK_EQ(GetWidth(), mask->GetWidth());
+  CHECK_EQ(GetHeight(), mask->GetHeight());
   CHECK_EQ(FXDIB_Format::k8bppMask, mask->GetFormat());
   CHECK(m_pBuffer);
 
@@ -323,11 +325,11 @@
       return false;
     }
 
-    for (int row = 0; row < m_Height; row++) {
+    for (int row = 0; row < GetHeight(); row++) {
       auto dest_scan =
-          GetWritableScanlineAs<FX_BGRA_STRUCT<uint8_t>>(row).first(m_Width);
-      auto mask_scan = mask->GetScanline(row).first(m_Width);
-      for (int col = 0; col < m_Width; col++) {
+          GetWritableScanlineAs<FX_BGRA_STRUCT<uint8_t>>(row).first(GetWidth());
+      auto mask_scan = mask->GetScanline(row).first(GetWidth());
+      for (int col = 0; col < GetWidth(); col++) {
         // Since the `dest_scan` value always starts out as 255 in this case,
         // simplify 255 * x / 255.
         dest_scan[col].alpha = mask_scan[col];
@@ -337,11 +339,11 @@
   }
 
   CHECK_EQ(GetFormat(), FXDIB_Format::kArgb);
-  for (int row = 0; row < m_Height; row++) {
+  for (int row = 0; row < GetHeight(); row++) {
     auto dest_scan =
-        GetWritableScanlineAs<FX_BGRA_STRUCT<uint8_t>>(row).first(m_Width);
-    auto mask_scan = mask->GetScanline(row).first(m_Width);
-    for (int col = 0; col < m_Width; col++) {
+        GetWritableScanlineAs<FX_BGRA_STRUCT<uint8_t>>(row).first(GetWidth());
+    auto mask_scan = mask->GetScanline(row).first(GetWidth());
+    for (int col = 0; col < GetWidth(); col++) {
       dest_scan[col].alpha = dest_scan[col].alpha * mask_scan[col] / 255;
     }
   }
@@ -366,9 +368,9 @@
   }
 
   const int bitmap_alpha = static_cast<int>(alpha * 255.0f);
-  for (int row = 0; row < m_Height; row++) {
+  for (int row = 0; row < GetHeight(); row++) {
     auto dest_scan =
-        GetWritableScanlineAs<FX_BGRA_STRUCT<uint8_t>>(row).first(m_Width);
+        GetWritableScanlineAs<FX_BGRA_STRUCT<uint8_t>>(row).first(GetWidth());
     for (auto& pixel : dest_scan) {
       pixel.alpha = pixel.alpha * bitmap_alpha / 255;
     }
@@ -388,7 +390,7 @@
     return 0;
 
   uint8_t* pos =
-      UNSAFE_TODO(m_pBuffer.Get() + y * m_Pitch + offset.ValueOrDie());
+      UNSAFE_TODO(m_pBuffer.Get() + y * GetPitch() + offset.ValueOrDie());
   switch (GetFormat()) {
     case FXDIB_Format::kInvalid:
       return 0;
@@ -443,10 +445,10 @@
   }
   UNSAFE_TODO({
     if (forecolor == 0 && backcolor == 0xffffff) {
-      for (int row = 0; row < m_Height; ++row) {
-        uint8_t* scanline = m_pBuffer.Get() + row * m_Pitch;
+      for (int row = 0; row < GetHeight(); ++row) {
+        uint8_t* scanline = m_pBuffer.Get() + row * GetPitch();
         int gap = GetBPP() / 8 - 2;
-        for (int col = 0; col < m_Width; ++col) {
+        for (int col = 0; col < GetWidth(); ++col) {
           int gray = FXRGB2GRAY(scanline[2], scanline[1], scanline[0]);
           *scanline++ = gray;
           *scanline++ = gray;
@@ -456,10 +458,10 @@
       }
       return;
     }
-    for (int row = 0; row < m_Height; ++row) {
-      uint8_t* scanline = m_pBuffer.Get() + row * m_Pitch;
+    for (int row = 0; row < GetHeight(); ++row) {
+      uint8_t* scanline = m_pBuffer.Get() + row * GetPitch();
       int gap = GetBPP() / 8 - 2;
-      for (int col = 0; col < m_Width; ++col) {
+      for (int col = 0; col < GetWidth(); ++col) {
         int gray = FXRGB2GRAY(scanline[2], scanline[1], scanline[0]);
         *scanline++ = bb + (fb - bb) * gray / 255;
         *scanline++ = bg + (fg - bg) * gray / 255;
@@ -655,7 +657,7 @@
   }
   UNSAFE_TODO({
     for (int row = 0; row < height; ++row) {
-      uint8_t* dest_scan = m_pBuffer.Get() + (dest_top + row) * m_Pitch;
+      uint8_t* dest_scan = m_pBuffer.Get() + (dest_top + row) * GetPitch();
       const uint8_t* src_scan = source->GetScanline(src_top + row).data();
       for (int col = 0; col < width; ++col) {
         int src_idx = src_left + col;
@@ -681,7 +683,7 @@
     return true;
 
   FX_RECT rect(left, top, left + width, top + height);
-  rect.Intersect(0, 0, m_Width, m_Height);
+  rect.Intersect(0, 0, GetWidth(), GetHeight());
   if (rect.IsEmpty())
     return true;
 
@@ -695,7 +697,7 @@
               ? 255
               : (uint8_t)FXRGB2GRAY((int)color_p[2], color_p[1], color_p[0]);
       for (int row = rect.top; row < rect.bottom; row++) {
-        uint8_t* dest_scan = m_pBuffer.Get() + row * m_Pitch + rect.left;
+        uint8_t* dest_scan = m_pBuffer.Get() + row * GetPitch() + rect.left;
         if (src_alpha == 255) {
           FXSYS_memset(dest_scan, gray, width);
         } else {
@@ -758,7 +760,8 @@
     }
     if (src_alpha == 255) {
       for (int row = rect.top; row < rect.bottom; row++) {
-        uint8_t* dest_scan = m_pBuffer.Get() + row * m_Pitch + rect.left * Bpp;
+        uint8_t* dest_scan =
+            m_pBuffer.Get() + row * GetPitch() + rect.left * Bpp;
         if (Bpp == 4) {
           uint32_t* scan = reinterpret_cast<uint32_t*>(dest_scan);
           for (int col = 0; col < width; col++) {
@@ -775,7 +778,7 @@
       return true;
     }
     for (int row = rect.top; row < rect.bottom; row++) {
-      uint8_t* dest_scan = m_pBuffer.Get() + row * m_Pitch + rect.left * Bpp;
+      uint8_t* dest_scan = m_pBuffer.Get() + row * GetPitch() + rect.left * Bpp;
       if (bAlpha) {
         for (int col = 0; col < width; col++) {
           uint8_t back_alpha = dest_scan[3];
@@ -833,9 +836,9 @@
       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;
-        for (int col = 0; col < m_Width; col++) {
+      for (int row = 0; row < GetHeight(); row++) {
+        uint8_t* scanline = m_pBuffer.Get() + row * GetPitch() + 3;
+        for (int col = 0; col < GetWidth(); col++) {
           *scanline = 0xff;
           scanline += 4;
         }
@@ -844,8 +847,8 @@
     return true;
   }
   int dest_bpp = GetBppFromFormat(dest_format);
-  int dest_pitch = fxge::CalculatePitch32OrDie(dest_bpp, m_Width);
-  const size_t dest_buf_size = dest_pitch * m_Height + 4;
+  int dest_pitch = fxge::CalculatePitch32OrDie(dest_bpp, GetWidth());
+  const size_t dest_buf_size = dest_pitch * GetHeight() + 4;
   std::unique_ptr<uint8_t, FxFreeDeleter> dest_buf(
       FX_TryAlloc(uint8_t, dest_buf_size));
   if (!dest_buf)
@@ -859,9 +862,10 @@
   m_palette = ConvertBuffer(
       dest_format,
       UNSAFE_BUFFERS(pdfium::make_span(dest_buf.get(), dest_buf_size)),
-      dest_pitch, m_Width, m_Height, holder, /*src_left=*/0, /*src_top=*/0);
+      dest_pitch, GetWidth(), GetHeight(), holder, /*src_left=*/0,
+      /*src_top=*/0);
   m_pBuffer = std::move(dest_buf);
   SetFormat(dest_format);
-  m_Pitch = dest_pitch;
+  SetPitch(dest_pitch);
   return true;
 }
