diff --git a/core/fpdfapi/page/cpdf_dib.cpp b/core/fpdfapi/page/cpdf_dib.cpp
index b46cac6..b2f7e73 100644
--- a/core/fpdfapi/page/cpdf_dib.cpp
+++ b/core/fpdfapi/page/cpdf_dib.cpp
@@ -274,8 +274,7 @@
     m_Format = MakeRGBFormat(CalculateBitsPerPixel(m_bpc, m_nComponents));
   }
 
-  std::optional<uint32_t> pitch =
-      fxge::CalculatePitch32(GetBppFromFormat(m_Format), m_Width);
+  std::optional<uint32_t> pitch = fxge::CalculatePitch32(GetBPP(), m_Width);
   if (!pitch.has_value())
     return false;
 
@@ -283,7 +282,7 @@
   LoadPalette();
   if (m_bColorKey) {
     m_Format = FXDIB_Format::kArgb;
-    pitch = fxge::CalculatePitch32(GetBppFromFormat(m_Format), m_Width);
+    pitch = fxge::CalculatePitch32(GetBPP(), m_Width);
     if (!pitch.has_value())
       return false;
     m_MaskBuf = DataVector<uint8_t>(pitch.value());
diff --git a/core/fpdfapi/page/cpdf_transferfuncdib.cpp b/core/fpdfapi/page/cpdf_transferfuncdib.cpp
index 7e53a10..6c396b3 100644
--- a/core/fpdfapi/page/cpdf_transferfuncdib.cpp
+++ b/core/fpdfapi/page/cpdf_transferfuncdib.cpp
@@ -32,7 +32,7 @@
   m_Width = m_pSrc->GetWidth();
   m_Height = m_pSrc->GetHeight();
   m_Format = GetDestFormat();
-  m_Pitch = fxge::CalculatePitch32OrDie(GetBppFromFormat(m_Format), m_Width);
+  m_Pitch = fxge::CalculatePitch32OrDie(GetBPP(), m_Width);
   m_Scanline.resize(m_Pitch);
   DCHECK(m_palette.empty());
 }
diff --git a/core/fxge/dib/cfx_dibbase.cpp b/core/fxge/dib/cfx_dibbase.cpp
index 7bd6c2d..d35bc90 100644
--- a/core/fxge/dib/cfx_dibbase.cpp
+++ b/core/fxge/dib/cfx_dibbase.cpp
@@ -711,7 +711,7 @@
     copy_len = std::min<uint32_t>(m_Pitch, copy_len.value());
 
     FX_SAFE_UINT32 offset = rect.left;
-    offset *= GetBppFromFormat(m_Format);
+    offset *= GetBPP();
     offset /= 8;
     if (!offset.IsValid())
       return nullptr;
@@ -744,7 +744,7 @@
   if (IsMaskFormat())
     return 0;
 
-  switch (GetBppFromFormat(m_Format)) {
+  switch (GetBPP()) {
     case 1:
       return 2;
     case 8:
@@ -923,7 +923,7 @@
     return nullptr;
 
   pFlipped->SetPalette(GetPaletteSpan());
-  int Bpp = GetBppFromFormat(m_Format) / 8;
+  const int Bpp = GetBPP() / 8;
   UNSAFE_TODO({
     for (int row = 0; row < m_Height; ++row) {
       const uint8_t* src_scan = GetScanline(row).data();
@@ -934,7 +934,7 @@
         FXSYS_memcpy(dest_scan, src_scan, m_Pitch);
         continue;
       }
-      if (GetBppFromFormat(m_Format) == 1) {
+      if (GetBPP() == 1) {
         FXSYS_memset(dest_scan, 0, m_Pitch);
         for (int col = 0; col < m_Width; ++col) {
           if (src_scan[col / 8] & (1 << (7 - col % 8))) {
@@ -1128,8 +1128,7 @@
     const RetainPtr<const CFX_DIBBase>& pSrcBitmap,
     int src_left,
     int src_top) {
-  FXDIB_Format src_format = pSrcBitmap->GetFormat();
-  const int src_bpp = GetBppFromFormat(src_format);
+  const int src_bpp = pSrcBitmap->GetBPP();
   switch (dest_format) {
     case FXDIB_Format::kInvalid:
     case FXDIB_Format::k1bppRgb:
diff --git a/core/fxge/dib/cfx_dibitmap.cpp b/core/fxge/dib/cfx_dibitmap.cpp
index 563bb36..2d8f5e4 100644
--- a/core/fxge/dib/cfx_dibitmap.cpp
+++ b/core/fxge/dib/cfx_dibitmap.cpp
@@ -224,8 +224,9 @@
   if (HasPalette())
     return false;
 
-  if (GetBppFromFormat(m_Format) == 8)
+  if (GetBPP() == 8) {
     dest_format = FXDIB_Format::k8bppMask;
+  }
 
   FX_SAFE_UINT32 offset = dest_left;
   offset *= GetBPP();
@@ -425,12 +426,12 @@
   int br = FXSYS_GetRValue(backcolor);
   int bg = FXSYS_GetGValue(backcolor);
   int bb = FXSYS_GetBValue(backcolor);
-  if (GetBppFromFormat(m_Format) <= 8) {
+  if (GetBPP() <= 8) {
     if (forecolor == 0 && backcolor == 0xffffff && !HasPalette())
       return;
 
     BuildPalette();
-    int size = 1 << GetBppFromFormat(m_Format);
+    int size = 1 << GetBPP();
     for (int i = 0; i < size; ++i) {
       int gray = FXRGB2GRAY(FXARGB_R(m_palette[i]), FXARGB_G(m_palette[i]),
                             FXARGB_B(m_palette[i]));
@@ -444,7 +445,7 @@
     if (forecolor == 0 && backcolor == 0xffffff) {
       for (int row = 0; row < m_Height; ++row) {
         uint8_t* scanline = m_pBuffer.Get() + row * m_Pitch;
-        int gap = GetBppFromFormat(m_Format) / 8 - 2;
+        int gap = GetBPP() / 8 - 2;
         for (int col = 0; col < m_Width; ++col) {
           int gray = FXRGB2GRAY(scanline[2], scanline[1], scanline[0]);
           *scanline++ = gray;
@@ -457,7 +458,7 @@
     }
     for (int row = 0; row < m_Height; ++row) {
       uint8_t* scanline = m_pBuffer.Get() + row * m_Pitch;
-      int gap = GetBppFromFormat(m_Format) / 8 - 2;
+      int gap = GetBPP() / 8 - 2;
       for (int col = 0; col < m_Width; ++col) {
         int gray = FXRGB2GRAY(scanline[2], scanline[1], scanline[0]);
         *scanline++ = bb + (fb - bb) * gray / 255;
@@ -527,8 +528,9 @@
   if (!m_pBuffer)
     return false;
 
-  if (GetBppFromFormat(m_Format) < 8)
+  if (GetBPP() < 8) {
     return false;
+  }
 
   if (!GetOverlapRect(dest_left, dest_top, width, height, source->GetWidth(),
                       source->GetHeight(), src_left, src_top, pClipRgn)) {
@@ -547,7 +549,7 @@
                        pClipMask != nullptr, bRgbByteOrder)) {
     return false;
   }
-  const int dest_Bpp = GetBppFromFormat(m_Format) / 8;
+  const int dest_Bpp = GetBPP() / 8;
   const int src_Bpp = source->GetBPP() / 8;
   const bool bRgb = src_Bpp > 1;
   if (!bRgb && !source->HasPalette()) {
@@ -591,8 +593,9 @@
   if (!m_pBuffer)
     return false;
 
-  if (GetBppFromFormat(m_Format) < 8)
+  if (GetBPP() < 8) {
     return false;
+  }
 
   if (!GetOverlapRect(dest_left, dest_top, width, height, pMask->GetWidth(),
                       pMask->GetHeight(), src_left, src_top, pClipRgn)) {
@@ -686,7 +689,7 @@
   uint32_t dst_color = color;
   uint8_t* color_p = reinterpret_cast<uint8_t*>(&dst_color);
   UNSAFE_TODO({
-    if (GetBppFromFormat(m_Format) == 8) {
+    if (GetBPP() == 8) {
       uint8_t gray =
           IsMaskFormat()
               ? 255
@@ -704,7 +707,7 @@
       }
       return true;
     }
-    if (GetBppFromFormat(m_Format) == 1) {
+    if (GetBPP() == 1) {
       int left_shift = rect.left % 8;
       int right_shift = rect.right % 8;
       int new_width = rect.right / 8 - rect.left / 8;
@@ -745,9 +748,9 @@
       return true;
     }
 
-    CHECK_GE(GetBppFromFormat(m_Format), 24);
+    CHECK_GE(GetBPP(), 24);
     color_p[3] = static_cast<uint8_t>(src_alpha);
-    int Bpp = GetBppFromFormat(m_Format) / 8;
+    int Bpp = GetBPP() / 8;
     const bool bAlpha = IsAlphaFormat();
     if (bAlpha) {
       // Other formats with alpha have already been handled above.
