diff --git a/core/fpdfapi/page/cpdf_colorspace.cpp b/core/fpdfapi/page/cpdf_colorspace.cpp
index 2740169..0c023d1 100644
--- a/core/fpdfapi/page/cpdf_colorspace.cpp
+++ b/core/fpdfapi/page/cpdf_colorspace.cpp
@@ -839,9 +839,8 @@
   if (!m_pProfile)
     return false;
 
-  m_nComponents =
-      m_pProfile
-          ->GetComponents();  // Try using the nComponents from ICC profile
+  // Try using the |nComponents| from ICC profile
+  m_nComponents = m_pProfile->GetComponents();
   CPDF_Dictionary* pDict = pStream->GetDict();
   if (!m_pProfile->m_pTransform) {  // No valid ICC profile or using sRGB
     CPDF_Object* pAlterCSObj =
diff --git a/core/fpdfapi/page/fpdf_page_colors.cpp b/core/fpdfapi/page/fpdf_page_colors.cpp
index 3ee5328..455233a 100644
--- a/core/fpdfapi/page/fpdf_page_colors.cpp
+++ b/core/fpdfapi/page/fpdf_page_colors.cpp
@@ -26,9 +26,14 @@
     return 3;
   if (family == PDFCS_DEVICEGRAY)
     return 1;
+  ASSERT(family == PDFCS_DEVICECMYK);
   return 4;
 }
 
+FX_FLOAT NormalizeChannel(FX_FLOAT fVal) {
+  return std::min(std::max(fVal, 0.0f), 1.0f);
+}
+
 }  // namespace
 
 void sRGB_to_AdobeCMYK(FX_FLOAT R,
@@ -69,109 +74,103 @@
 }
 
 CPDF_DeviceCS::CPDF_DeviceCS(CPDF_Document* pDoc, int family)
-    : CPDF_ColorSpace(pDoc, family, ComponentsForFamily(family)) {}
+    : CPDF_ColorSpace(pDoc, family, ComponentsForFamily(family)) {
+  ASSERT(family == PDFCS_DEVICEGRAY || family == PDFCS_DEVICERGB ||
+         family == PDFCS_DEVICECMYK);
+}
 
 bool CPDF_DeviceCS::GetRGB(FX_FLOAT* pBuf,
                            FX_FLOAT& R,
                            FX_FLOAT& G,
                            FX_FLOAT& B) const {
-  if (m_Family == PDFCS_DEVICERGB) {
-    R = pBuf[0];
-    if (R < 0) {
-      R = 0;
-    } else if (R > 1) {
-      R = 1;
-    }
-    G = pBuf[1];
-    if (G < 0) {
-      G = 0;
-    } else if (G > 1) {
-      G = 1;
-    }
-    B = pBuf[2];
-    if (B < 0) {
-      B = 0;
-    } else if (B > 1) {
-      B = 1;
-    }
-  } else if (m_Family == PDFCS_DEVICEGRAY) {
-    R = *pBuf;
-    if (R < 0) {
-      R = 0;
-    } else if (R > 1) {
-      R = 1;
-    }
-    G = B = R;
-  } else if (m_Family == PDFCS_DEVICECMYK) {
-    if (!m_dwStdConversion) {
-      AdobeCMYK_to_sRGB(pBuf[0], pBuf[1], pBuf[2], pBuf[3], R, G, B);
-    } else {
-      FX_FLOAT k = pBuf[3];
-      R = 1.0f - std::min(1.0f, pBuf[0] + k);
-      G = 1.0f - std::min(1.0f, pBuf[1] + k);
-      B = 1.0f - std::min(1.0f, pBuf[2] + k);
-    }
-  } else {
-    ASSERT(m_Family == PDFCS_PATTERN);
-    R = G = B = 0;
-    return false;
+  switch (m_Family) {
+    case PDFCS_DEVICEGRAY:
+      R = NormalizeChannel(*pBuf);
+      G = R;
+      B = R;
+      break;
+    case PDFCS_DEVICERGB:
+      R = NormalizeChannel(pBuf[0]);
+      G = NormalizeChannel(pBuf[1]);
+      B = NormalizeChannel(pBuf[2]);
+      break;
+    case PDFCS_DEVICECMYK:
+      if (m_dwStdConversion) {
+        FX_FLOAT k = pBuf[3];
+        R = 1.0f - std::min(1.0f, pBuf[0] + k);
+        G = 1.0f - std::min(1.0f, pBuf[1] + k);
+        B = 1.0f - std::min(1.0f, pBuf[2] + k);
+      } else {
+        AdobeCMYK_to_sRGB(pBuf[0], pBuf[1], pBuf[2], pBuf[3], R, G, B);
+      }
+      break;
+    default:
+      ASSERT(false);
+      return false;
   }
   return true;
 }
+
 bool CPDF_DeviceCS::v_GetCMYK(FX_FLOAT* pBuf,
                               FX_FLOAT& c,
                               FX_FLOAT& m,
                               FX_FLOAT& y,
                               FX_FLOAT& k) const {
-  if (m_Family != PDFCS_DEVICECMYK) {
+  if (m_Family != PDFCS_DEVICECMYK)
     return false;
-  }
+
   c = pBuf[0];
   m = pBuf[1];
   y = pBuf[2];
   k = pBuf[3];
   return true;
 }
+
 bool CPDF_DeviceCS::SetRGB(FX_FLOAT* pBuf,
                            FX_FLOAT R,
                            FX_FLOAT G,
                            FX_FLOAT B) const {
-  if (m_Family == PDFCS_DEVICERGB) {
-    pBuf[0] = R;
-    pBuf[1] = G;
-    pBuf[2] = B;
-    return true;
-  }
-  if (m_Family == PDFCS_DEVICEGRAY) {
-    if (R == G && R == B) {
+  switch (m_Family) {
+    case PDFCS_DEVICEGRAY:
+      if (R != G || R != B)
+        return false;
       *pBuf = R;
       return true;
-    }
-    return false;
+    case PDFCS_DEVICERGB:
+      pBuf[0] = R;
+      pBuf[1] = G;
+      pBuf[2] = B;
+      return true;
+    case PDFCS_DEVICECMYK:
+      sRGB_to_AdobeCMYK(R, G, B, pBuf[0], pBuf[1], pBuf[2], pBuf[3]);
+      return true;
+    default:
+      ASSERT(false);
+      return false;
   }
-  if (m_Family == PDFCS_DEVICECMYK) {
-    sRGB_to_AdobeCMYK(R, G, B, pBuf[0], pBuf[1], pBuf[2], pBuf[3]);
-    return true;
-  }
-  return false;
 }
+
 bool CPDF_DeviceCS::v_SetCMYK(FX_FLOAT* pBuf,
                               FX_FLOAT c,
                               FX_FLOAT m,
                               FX_FLOAT y,
                               FX_FLOAT k) const {
-  if (m_Family == PDFCS_DEVICERGB) {
-    AdobeCMYK_to_sRGB(c, m, y, k, pBuf[0], pBuf[1], pBuf[2]);
-    return true;
+  switch (m_Family) {
+    case PDFCS_DEVICEGRAY:
+      return false;
+    case PDFCS_DEVICERGB:
+      AdobeCMYK_to_sRGB(c, m, y, k, pBuf[0], pBuf[1], pBuf[2]);
+      return true;
+    case PDFCS_DEVICECMYK:
+      pBuf[0] = c;
+      pBuf[1] = m;
+      pBuf[2] = y;
+      pBuf[3] = k;
+      return true;
+    default:
+      ASSERT(false);
+      return false;
   }
-  if (m_Family == PDFCS_DEVICECMYK) {
-    pBuf[0] = c;
-    pBuf[1] = m;
-    pBuf[2] = y;
-    pBuf[3] = k;
-    return true;
-  }
-  return false;
 }
 
 void CPDF_DeviceCS::TranslateImageLine(uint8_t* pDestBuf,
@@ -180,39 +179,46 @@
                                        int image_width,
                                        int image_height,
                                        bool bTransMask) const {
-  if (bTransMask && m_Family == PDFCS_DEVICECMYK) {
-    for (int i = 0; i < pixels; i++) {
-      int k = 255 - pSrcBuf[3];
-      pDestBuf[0] = ((255 - pSrcBuf[0]) * k) / 255;
-      pDestBuf[1] = ((255 - pSrcBuf[1]) * k) / 255;
-      pDestBuf[2] = ((255 - pSrcBuf[2]) * k) / 255;
-      pDestBuf += 3;
-      pSrcBuf += 4;
-    }
-    return;
-  }
-  if (m_Family == PDFCS_DEVICERGB) {
-    ReverseRGB(pDestBuf, pSrcBuf, pixels);
-  } else if (m_Family == PDFCS_DEVICEGRAY) {
-    for (int i = 0; i < pixels; i++) {
-      *pDestBuf++ = pSrcBuf[i];
-      *pDestBuf++ = pSrcBuf[i];
-      *pDestBuf++ = pSrcBuf[i];
-    }
-  } else {
-    for (int i = 0; i < pixels; i++) {
-      if (!m_dwStdConversion) {
-        AdobeCMYK_to_sRGB1(pSrcBuf[0], pSrcBuf[1], pSrcBuf[2], pSrcBuf[3],
-                           pDestBuf[2], pDestBuf[1], pDestBuf[0]);
-      } else {
-        uint8_t k = pSrcBuf[3];
-        pDestBuf[2] = 255 - std::min(255, pSrcBuf[0] + k);
-        pDestBuf[1] = 255 - std::min(255, pSrcBuf[1] + k);
-        pDestBuf[0] = 255 - std::min(255, pSrcBuf[2] + k);
+  switch (m_Family) {
+    case PDFCS_DEVICEGRAY:
+      for (int i = 0; i < pixels; i++) {
+        *pDestBuf++ = pSrcBuf[i];
+        *pDestBuf++ = pSrcBuf[i];
+        *pDestBuf++ = pSrcBuf[i];
       }
-      pSrcBuf += 4;
-      pDestBuf += 3;
-    }
+      break;
+    case PDFCS_DEVICERGB:
+      ReverseRGB(pDestBuf, pSrcBuf, pixels);
+      break;
+    case PDFCS_DEVICECMYK:
+      if (bTransMask) {
+        for (int i = 0; i < pixels; i++) {
+          int k = 255 - pSrcBuf[3];
+          pDestBuf[0] = ((255 - pSrcBuf[0]) * k) / 255;
+          pDestBuf[1] = ((255 - pSrcBuf[1]) * k) / 255;
+          pDestBuf[2] = ((255 - pSrcBuf[2]) * k) / 255;
+          pDestBuf += 3;
+          pSrcBuf += 4;
+        }
+      } else {
+        for (int i = 0; i < pixels; i++) {
+          if (m_dwStdConversion) {
+            uint8_t k = pSrcBuf[3];
+            pDestBuf[2] = 255 - std::min(255, pSrcBuf[0] + k);
+            pDestBuf[1] = 255 - std::min(255, pSrcBuf[1] + k);
+            pDestBuf[0] = 255 - std::min(255, pSrcBuf[2] + k);
+          } else {
+            AdobeCMYK_to_sRGB1(pSrcBuf[0], pSrcBuf[1], pSrcBuf[2], pSrcBuf[3],
+                               pDestBuf[2], pDestBuf[1], pDestBuf[0]);
+          }
+          pSrcBuf += 4;
+          pDestBuf += 3;
+        }
+      }
+      break;
+    default:
+      ASSERT(false);
+      break;
   }
 }
 
