Cleanup CPDF_DeviceCS and friends.

Review-Url: https://codereview.chromium.org/2482273002
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;
   }
 }