diff --git a/core/fpdfapi/render/cpdf_rendershading.cpp b/core/fpdfapi/render/cpdf_rendershading.cpp
index a3cdcdd..3886312 100644
--- a/core/fpdfapi/render/cpdf_rendershading.cpp
+++ b/core/fpdfapi/render/cpdf_rendershading.cpp
@@ -947,7 +947,7 @@
     }
   }
   if (bAlphaMode)
-    pBitmap->LoadChannelFromAlpha(CFX_DIBitmap::Channel::kRed, pBitmap);
+    pBitmap->SetRedFromBitmap(pBitmap);
 
   if (options.ColorModeIs(CPDF_RenderOptions::kGray))
     pBitmap->ConvertColorScale(0, 0xffffff);
diff --git a/core/fxge/dib/cfx_dibbase.cpp b/core/fxge/dib/cfx_dibbase.cpp
index e63f67e..0b53c47 100644
--- a/core/fxge/dib/cfx_dibbase.cpp
+++ b/core/fxge/dib/cfx_dibbase.cpp
@@ -982,8 +982,7 @@
   if (GetIsAlphaFromFormat(dest_format)) {
     bool ret;
     if (dest_format == FXDIB_Format::kArgb) {
-      ret = pSrcAlpha ? pClone->LoadChannelFromAlpha(
-                            CFX_DIBitmap::Channel::kAlpha, pSrcAlpha)
+      ret = pSrcAlpha ? pClone->SetAlphaFromBitmap(pSrcAlpha)
                       : pClone->SetUniformOpaqueAlpha();
     } else {
       ret = pClone->SetAlphaMask(pSrcAlpha, nullptr);
diff --git a/core/fxge/dib/cfx_dibitmap.cpp b/core/fxge/dib/cfx_dibitmap.cpp
index e2d49bf..37b4887 100644
--- a/core/fxge/dib/cfx_dibitmap.cpp
+++ b/core/fxge/dib/cfx_dibitmap.cpp
@@ -15,14 +15,9 @@
 #include "core/fxge/cfx_cliprgn.h"
 #include "core/fxge/dib/cfx_cmyk_to_srgb.h"
 #include "core/fxge/dib/cfx_scanlinecompositor.h"
+#include "third_party/base/check_op.h"
 #include "third_party/base/notreached.h"
 
-namespace {
-
-constexpr int8_t kChannelOffset[] = {0, 2, 1, 0, 0, 1, 2, 3, 3};
-
-}  // namespace
-
 CFX_DIBitmap::CFX_DIBitmap() = default;
 
 bool CFX_DIBitmap::Create(int width, int height, FXDIB_Format format) {
@@ -269,7 +264,7 @@
   }
 }
 
-bool CFX_DIBitmap::LoadChannelFromAlpha(
+bool CFX_DIBitmap::SetChannelFromBitmap(
     Channel destChannel,
     const RetainPtr<CFX_DIBBase>& pSrcBitmap) {
   if (!m_pBuffer)
@@ -286,7 +281,7 @@
   }
   int srcOffset = pSrcBitmap->GetFormat() == FXDIB_Format::kArgb ? 3 : 0;
   int destOffset = 0;
-  if (destChannel == CFX_DIBitmap::Channel::kAlpha) {
+  if (destChannel == Channel::kAlpha) {
     if (IsMask()) {
       if (!ConvertFormat(FXDIB_Format::k8bppMask))
         return false;
@@ -294,10 +289,10 @@
       if (!ConvertFormat(FXDIB_Format::kArgb))
         return false;
 
-      if (GetFormat() == FXDIB_Format::kArgb)
-        destOffset = 3;
+      destOffset = 3;
     }
   } else {
+    DCHECK_EQ(destChannel, Channel::kRed);
     if (IsMask())
       return false;
 
@@ -315,7 +310,7 @@
           return false;
       }
     }
-    destOffset = kChannelOffset[static_cast<size_t>(destChannel)];
+    destOffset = 2;
   }
   if (pSrcClone->m_pAlphaMask) {
     RetainPtr<CFX_DIBBase> pAlphaMask = pSrcClone->m_pAlphaMask;
@@ -340,7 +335,7 @@
     pSrcClone = pSrcMatched;
   }
   RetainPtr<CFX_DIBitmap> pDst(this);
-  if (destChannel == CFX_DIBitmap::Channel::kAlpha && m_pAlphaMask) {
+  if (destChannel == Channel::kAlpha && m_pAlphaMask) {
     pDst = m_pAlphaMask;
     destOffset = 0;
   }
@@ -358,6 +353,15 @@
   return true;
 }
 
+bool CFX_DIBitmap::SetAlphaFromBitmap(
+    const RetainPtr<CFX_DIBBase>& pSrcBitmap) {
+  return SetChannelFromBitmap(Channel::kAlpha, pSrcBitmap);
+}
+
+bool CFX_DIBitmap::SetRedFromBitmap(const RetainPtr<CFX_DIBBase>& pSrcBitmap) {
+  return SetChannelFromBitmap(Channel::kRed, pSrcBitmap);
+}
+
 bool CFX_DIBitmap::SetUniformOpaqueAlpha() {
   if (!m_pBuffer)
     return false;
@@ -400,7 +404,7 @@
   }
 
   if (IsOpaqueImage())
-    return LoadChannelFromAlpha(CFX_DIBitmap::Channel::kAlpha, pSrcBitmap);
+    return SetAlphaFromBitmap(pSrcBitmap);
 
   RetainPtr<CFX_DIBitmap> pSrcClone = pSrcBitmap.As<CFX_DIBitmap>();
   if (pSrcBitmap->GetWidth() != m_Width ||
diff --git a/core/fxge/dib/cfx_dibitmap.h b/core/fxge/dib/cfx_dibitmap.h
index 0397a8b..15f2c78 100644
--- a/core/fxge/dib/cfx_dibitmap.h
+++ b/core/fxge/dib/cfx_dibitmap.h
@@ -17,17 +17,6 @@
 
 class CFX_DIBitmap : public CFX_DIBBase {
  public:
-  enum class Channel : uint8_t {
-    kRed = 1,
-    kGreen,
-    kBlue,
-    kCyan,
-    kMagenta,
-    kYellow,
-    kBlack,
-    kAlpha
-  };
-
   struct PitchAndSize {
     uint32_t pitch;
     uint32_t size;
@@ -66,8 +55,8 @@
   void SetPixel(int x, int y, uint32_t color);
 #endif
 
-  bool LoadChannelFromAlpha(Channel destChannel,
-                            const RetainPtr<CFX_DIBBase>& pSrcBitmap);
+  bool SetRedFromBitmap(const RetainPtr<CFX_DIBBase>& pSrcBitmap);
+  bool SetAlphaFromBitmap(const RetainPtr<CFX_DIBBase>& pSrcBitmap);
   bool SetUniformOpaqueAlpha();
 
   bool MultiplyAlpha(int alpha);
@@ -146,6 +135,10 @@
 #endif
 
  private:
+  enum class Channel : uint8_t { kRed, kAlpha };
+
+  bool SetChannelFromBitmap(Channel destChannel,
+                            const RetainPtr<CFX_DIBBase>& pSrcBitmap);
   void ConvertBGRColorScale(uint32_t forecolor, uint32_t backcolor);
   bool TransferWithUnequalFormats(FXDIB_Format dest_format,
                                   int dest_left,
