Add pdfium::clamp() as a placeholder for std::clamp().

Ue it to fix a typo as well.

BUG=pdfium:634

Change-Id: I2d686242ffb841aedc2fae6a3cf7a00bea667404
Reviewed-on: https://pdfium-review.googlesource.com/3113
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfapi/font/cpdf_cidfont.cpp b/core/fpdfapi/font/cpdf_cidfont.cpp
index 4c378f7..217a6ea 100644
--- a/core/fpdfapi/font/cpdf_cidfont.cpp
+++ b/core/fpdfapi/font/cpdf_cidfont.cpp
@@ -21,6 +21,7 @@
 #include "core/fpdfapi/parser/cpdf_stream_acc.h"
 #include "third_party/base/numerics/safe_math.h"
 #include "third_party/base/ptr_util.h"
+#include "third_party/base/stl_util.h"
 
 namespace {
 
@@ -450,10 +451,10 @@
         if (!err) {
           FXFT_BBox cbox;
           FXFT_Glyph_Get_CBox(glyph, FXFT_GLYPH_BBOX_PIXELS, &cbox);
-          cbox.xMin = std::min(std::max(cbox.xMin, kMinCBox), kMaxCBox);
-          cbox.xMax = std::min(std::max(cbox.xMax, kMinCBox), kMaxCBox);
-          cbox.yMin = std::min(std::max(cbox.yMin, kMinCBox), kMaxCBox);
-          cbox.yMax = std::min(std::max(cbox.yMax, kMinCBox), kMaxCBox);
+          cbox.xMin = pdfium::clamp(cbox.xMin, kMinCBox, kMaxCBox);
+          cbox.xMax = pdfium::clamp(cbox.xMax, kMinCBox, kMaxCBox);
+          cbox.yMin = pdfium::clamp(cbox.yMin, kMinCBox, kMaxCBox);
+          cbox.yMax = pdfium::clamp(cbox.yMax, kMinCBox, kMaxCBox);
           int pixel_size_x = ((FXFT_Face)face)->size->metrics.x_ppem;
           int pixel_size_y = ((FXFT_Face)face)->size->metrics.y_ppem;
           if (pixel_size_x == 0 || pixel_size_y == 0) {
diff --git a/core/fpdfapi/page/cpdf_allstates.cpp b/core/fpdfapi/page/cpdf_allstates.cpp
index a30696e..c67d315 100644
--- a/core/fpdfapi/page/cpdf_allstates.cpp
+++ b/core/fpdfapi/page/cpdf_allstates.cpp
@@ -14,14 +14,7 @@
 #include "core/fpdfapi/parser/cpdf_array.h"
 #include "core/fpdfapi/parser/cpdf_dictionary.h"
 #include "core/fxge/cfx_graphstatedata.h"
-
-namespace {
-
-float ClipFloat(float f) {
-  return std::max(0.0f, std::min(1.0f, f));
-}
-
-}  // namespace
+#include "third_party/base/stl_util.h"
 
 CPDF_AllStates::CPDF_AllStates()
     : m_TextLeading(0), m_TextRise(0), m_TextHorzScale(1.0f) {}
@@ -117,10 +110,12 @@
         }
         break;
       case FXBSTR_ID('C', 'A', 0, 0):
-        m_GeneralState.SetStrokeAlpha(ClipFloat(pObject->GetNumber()));
+        m_GeneralState.SetStrokeAlpha(
+            pdfium::clamp(pObject->GetNumber(), 0.0f, 1.0f));
         break;
       case FXBSTR_ID('c', 'a', 0, 0):
-        m_GeneralState.SetFillAlpha(ClipFloat(pObject->GetNumber()));
+        m_GeneralState.SetFillAlpha(
+            pdfium::clamp(pObject->GetNumber(), 0.0f, 1.0f));
         break;
       case FXBSTR_ID('O', 'P', 0, 0):
         m_GeneralState.SetStrokeOP(!!pObject->GetInteger());
diff --git a/core/fpdfapi/page/cpdf_colorspace.cpp b/core/fpdfapi/page/cpdf_colorspace.cpp
index 1aaa144..cc4afa5 100644
--- a/core/fpdfapi/page/cpdf_colorspace.cpp
+++ b/core/fpdfapi/page/cpdf_colorspace.cpp
@@ -24,6 +24,7 @@
 #include "core/fxcodec/fx_codec.h"
 #include "core/fxcrt/cfx_maybe_owned.h"
 #include "core/fxcrt/fx_memory.h"
+#include "third_party/base/stl_util.h"
 
 namespace {
 
@@ -227,7 +228,7 @@
 };
 
 float RGB_Conversion(float colorComponent) {
-  colorComponent = std::min(std::max(colorComponent, 0.0f), 1.0f);
+  colorComponent = pdfium::clamp(colorComponent, 0.0f, 1.0f);
   int scale = std::max(static_cast<int>(colorComponent * 1023), 0);
   if (scale < 192)
     return g_sRGBSamples1[scale] / 255.0f;
@@ -686,11 +687,12 @@
     *min = 0.0f;
     *max = 100 * 1.0f;
     *value = 0.0f;
-  } else {
-    *min = m_Ranges[iComponent * 2 - 2];
-    *max = m_Ranges[iComponent * 2 - 1];
-    *value = std::min(std::max(0.0f, *min), *max);
+    return;
   }
+
+  *min = m_Ranges[iComponent * 2 - 2];
+  *max = m_Ranges[iComponent * 2 - 1];
+  *value = pdfium::clamp(0.0f, *min, *max);
 }
 
 bool CPDF_LabCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) {
diff --git a/core/fpdfapi/page/fpdf_page_colors.cpp b/core/fpdfapi/page/fpdf_page_colors.cpp
index e69620e..adee5ff 100644
--- a/core/fpdfapi/page/fpdf_page_colors.cpp
+++ b/core/fpdfapi/page/fpdf_page_colors.cpp
@@ -18,11 +18,12 @@
 #include "core/fpdfapi/parser/cpdf_stream_acc.h"
 #include "core/fpdfapi/parser/cpdf_string.h"
 #include "core/fxcodec/fx_codec.h"
+#include "third_party/base/stl_util.h"
 
 namespace {
 
 float NormalizeChannel(float fVal) {
-  return std::min(std::max(fVal, 0.0f), 1.0f);
+  return pdfium::clamp(fVal, 0.0f, 1.0f);
 }
 
 bool DetectSRGB(const uint8_t* pData, uint32_t dwSize) {
diff --git a/core/fpdfapi/page/fpdf_page_func.cpp b/core/fpdfapi/page/fpdf_page_func.cpp
index 94695da..30f3b89 100644
--- a/core/fpdfapi/page/fpdf_page_func.cpp
+++ b/core/fpdfapi/page/fpdf_page_func.cpp
@@ -21,6 +21,7 @@
 #include "core/fpdfapi/parser/cpdf_stream_acc.h"
 #include "core/fxcrt/fx_safe_types.h"
 #include "third_party/base/ptr_util.h"
+#include "third_party/base/stl_util.h"
 
 namespace {
 
@@ -541,8 +542,8 @@
     encoded_input[i] =
         PDF_Interpolate(inputs[i], m_pDomains[i * 2], m_pDomains[i * 2 + 1],
                         m_EncodeInfo[i].encode_min, m_EncodeInfo[i].encode_max);
-    index[i] = std::min((uint32_t)std::max(0.f, encoded_input[i]),
-                        m_EncodeInfo[i].sizes - 1);
+    index[i] = pdfium::clamp(static_cast<uint32_t>(encoded_input[i]), 0U,
+                             m_EncodeInfo[i].sizes - 1);
     pos += index[i] * blocksize[i];
   }
   FX_SAFE_INT32 bits_to_output = m_nOutputs;
@@ -816,19 +817,16 @@
 
   *nresults = m_nOutputs;
   for (uint32_t i = 0; i < m_nInputs; i++) {
-    if (inputs[i] < m_pDomains[i * 2])
-      inputs[i] = m_pDomains[i * 2];
-    else if (inputs[i] > m_pDomains[i * 2 + 1])
-      inputs[i] = m_pDomains[i * 2] + 1;
+    inputs[i] =
+        pdfium::clamp(inputs[i], m_pDomains[i * 2], m_pDomains[i * 2 + 1]);
   }
   v_Call(inputs, results);
-  if (m_pRanges) {
-    for (uint32_t i = 0; i < m_nOutputs; i++) {
-      if (results[i] < m_pRanges[i * 2])
-        results[i] = m_pRanges[i * 2];
-      else if (results[i] > m_pRanges[i * 2 + 1])
-        results[i] = m_pRanges[i * 2 + 1];
-    }
+  if (!m_pRanges)
+    return true;
+
+  for (uint32_t i = 0; i < m_nOutputs; i++) {
+    results[i] =
+        pdfium::clamp(results[i], m_pRanges[i * 2], m_pRanges[i * 2 + 1]);
   }
   return true;
 }
diff --git a/core/fpdfapi/render/cpdf_imagerenderer.cpp b/core/fpdfapi/render/cpdf_imagerenderer.cpp
index 7903ad4..d377845 100644
--- a/core/fpdfapi/render/cpdf_imagerenderer.cpp
+++ b/core/fpdfapi/render/cpdf_imagerenderer.cpp
@@ -30,6 +30,7 @@
 #include "core/fxge/cfx_fxgedevice.h"
 #include "core/fxge/cfx_pathdata.h"
 #include "third_party/base/ptr_util.h"
+#include "third_party/base/stl_util.h"
 
 #ifdef _SKIA_SUPPORT_
 #include "core/fxge/skia/fx_skia_device.h"
@@ -273,11 +274,11 @@
         continue;
       }
       int orig = (*dest_scan - matte_b) * 255 / alpha + matte_b;
-      *dest_scan++ = std::min(std::max(orig, 0), 255);
+      *dest_scan++ = pdfium::clamp(orig, 0, 255);
       orig = (*dest_scan - matte_g) * 255 / alpha + matte_g;
-      *dest_scan++ = std::min(std::max(orig, 0), 255);
+      *dest_scan++ = pdfium::clamp(orig, 0, 255);
       orig = (*dest_scan - matte_r) * 255 / alpha + matte_r;
-      *dest_scan++ = std::min(std::max(orig, 0), 255);
+      *dest_scan++ = pdfium::clamp(orig, 0, 255);
       dest_scan++;
     }
   }
diff --git a/core/fpdfdoc/cpdf_variabletext.cpp b/core/fpdfdoc/cpdf_variabletext.cpp
index d533319..dcd3a07 100644
--- a/core/fpdfdoc/cpdf_variabletext.cpp
+++ b/core/fpdfdoc/cpdf_variabletext.cpp
@@ -699,7 +699,7 @@
     return place;
 
   int32_t nSecIndex =
-      std::max(std::min(place.nSecIndex, m_SectionArray.GetSize()), 0);
+      pdfium::clamp(place.nSecIndex, 0, m_SectionArray.GetSize());
   CSection* pSection = new CSection(this);
   pSection->m_SecInfo = secinfo;
   pSection->SecPlace.nSecIndex = nSecIndex;
@@ -727,7 +727,7 @@
   }
   CPVT_WordPlace newplace = place;
   newplace.nSecIndex =
-      std::max(std::min(newplace.nSecIndex, m_SectionArray.GetSize() - 1), 0);
+      pdfium::clamp(newplace.nSecIndex, 0, m_SectionArray.GetSize() - 1);
   if (CSection* pSection = m_SectionArray.GetAt(newplace.nSecIndex))
     return pSection->AddWord(newplace, wordinfo);
   return place;
diff --git a/core/fpdfdoc/csection.cpp b/core/fpdfdoc/csection.cpp
index 981f6d0..0c78255 100644
--- a/core/fpdfdoc/csection.cpp
+++ b/core/fpdfdoc/csection.cpp
@@ -29,9 +29,8 @@
 }
 
 void CSection::ResetWordArray() {
-  for (int32_t i = 0, sz = m_WordArray.GetSize(); i < sz; i++) {
+  for (int32_t i = 0, sz = m_WordArray.GetSize(); i < sz; i++)
     delete m_WordArray.GetAt(i);
-  }
   m_WordArray.RemoveAll();
 }
 
@@ -47,12 +46,11 @@
                                  const CPVT_WordInfo& wordinfo) {
   CPVT_WordInfo* pWord = new CPVT_WordInfo(wordinfo);
   int32_t nWordIndex =
-      std::max(std::min(place.nWordIndex, m_WordArray.GetSize()), 0);
-  if (nWordIndex == m_WordArray.GetSize()) {
+      pdfium::clamp(place.nWordIndex, 0, m_WordArray.GetSize());
+  if (nWordIndex == m_WordArray.GetSize())
     m_WordArray.Add(pWord);
-  } else {
+  else
     m_WordArray.InsertAt(nWordIndex, pWord);
-  }
   return place;
 }
 
@@ -62,9 +60,8 @@
 }
 
 CPVT_FloatRect CSection::Rearrange() {
-  if (m_pVT->m_nCharArray > 0) {
+  if (m_pVT->m_nCharArray > 0)
     return CTypeset(this).CharArray();
-  }
   return CTypeset(this).Typeset();
 }
 
diff --git a/core/fxcodec/codec/fx_codec_fax.cpp b/core/fxcodec/codec/fx_codec_fax.cpp
index 46792a6..7865da9 100644
--- a/core/fxcodec/codec/fx_codec_fax.cpp
+++ b/core/fxcodec/codec/fx_codec_fax.cpp
@@ -12,6 +12,7 @@
 #include "core/fxcodec/fx_codec.h"
 #include "core/fxcrt/fx_memory.h"
 #include "third_party/base/ptr_util.h"
+#include "third_party/base/stl_util.h"
 
 namespace {
 
@@ -104,7 +105,7 @@
 
 void FaxFillBits(uint8_t* dest_buf, int columns, int startpos, int endpos) {
   startpos = std::max(startpos, 0);
-  endpos = std::min(std::max(endpos, 0), columns);
+  endpos = pdfium::clamp(endpos, 0, columns);
   if (startpos >= endpos)
     return;
 
diff --git a/core/fxcrt/fx_basic_bstring.cpp b/core/fxcrt/fx_basic_bstring.cpp
index b4eb4a7..f049b14 100644
--- a/core/fxcrt/fx_basic_bstring.cpp
+++ b/core/fxcrt/fx_basic_bstring.cpp
@@ -12,6 +12,7 @@
 #include "core/fxcrt/cfx_string_pool_template.h"
 #include "core/fxcrt/fx_basic.h"
 #include "third_party/base/numerics/safe_math.h"
+#include "third_party/base/stl_util.h"
 
 template class CFX_StringDataTemplate<char>;
 template class CFX_StringCTemplate<char>;
@@ -405,8 +406,8 @@
   if (!m_pData)
     return CFX_ByteString();
 
-  nFirst = std::min(std::max(nFirst, 0), m_pData->m_nDataLength);
-  nCount = std::min(std::max(nCount, 0), m_pData->m_nDataLength - nFirst);
+  nFirst = pdfium::clamp(nFirst, 0, m_pData->m_nDataLength);
+  nCount = pdfium::clamp(nCount, 0, m_pData->m_nDataLength - nFirst);
   if (nCount == 0)
     return CFX_ByteString();
 
diff --git a/core/fxcrt/fx_basic_wstring.cpp b/core/fxcrt/fx_basic_wstring.cpp
index 8522d42..384b0b0 100644
--- a/core/fxcrt/fx_basic_wstring.cpp
+++ b/core/fxcrt/fx_basic_wstring.cpp
@@ -13,6 +13,7 @@
 #include "core/fxcrt/fx_basic.h"
 #include "core/fxcrt/fx_ext.h"
 #include "third_party/base/numerics/safe_math.h"
+#include "third_party/base/stl_util.h"
 
 template class CFX_StringDataTemplate<wchar_t>;
 template class CFX_StringCTemplate<wchar_t>;
@@ -375,8 +376,8 @@
   if (!m_pData)
     return CFX_WideString();
 
-  nFirst = std::min(std::max(nFirst, 0), m_pData->m_nDataLength);
-  nCount = std::min(std::max(nCount, 0), m_pData->m_nDataLength - nFirst);
+  nFirst = pdfium::clamp(nFirst, 0, m_pData->m_nDataLength);
+  nCount = pdfium::clamp(nCount, 0, m_pData->m_nDataLength - nFirst);
   if (nCount == 0)
     return CFX_WideString();
 
diff --git a/core/fxge/agg/fx_agg_driver.cpp b/core/fxge/agg/fx_agg_driver.cpp
index 4534ee1..b435c03 100644
--- a/core/fxge/agg/fx_agg_driver.cpp
+++ b/core/fxge/agg/fx_agg_driver.cpp
@@ -24,14 +24,15 @@
 #include "third_party/agg23/agg_renderer_scanline.h"
 #include "third_party/agg23/agg_scanline_u.h"
 #include "third_party/base/ptr_util.h"
+#include "third_party/base/stl_util.h"
 
 namespace {
 
 const float kMaxPos = 32000.0f;
 
 CFX_PointF HardClip(const CFX_PointF& pos) {
-  return CFX_PointF(std::max(std::min(pos.x, kMaxPos), -kMaxPos),
-                    std::max(std::min(pos.y, kMaxPos), -kMaxPos));
+  return CFX_PointF(pdfium::clamp(pos.x, -kMaxPos, kMaxPos),
+                    pdfium::clamp(pos.y, -kMaxPos, kMaxPos));
 }
 
 void RgbByteOrderSetPixel(CFX_DIBitmap* pBitmap, int x, int y, uint32_t argb) {
diff --git a/core/fxge/dib/fx_dib_engine.cpp b/core/fxge/dib/fx_dib_engine.cpp
index 8d90a72..5975a5e 100644
--- a/core/fxge/dib/fx_dib_engine.cpp
+++ b/core/fxge/dib/fx_dib_engine.cpp
@@ -11,6 +11,7 @@
 #include "core/fxge/dib/dib_int.h"
 #include "core/fxge/fx_dib.h"
 #include "third_party/base/ptr_util.h"
+#include "third_party/base/stl_util.h"
 
 namespace {
 
@@ -984,7 +985,7 @@
       dest_y = m_LineIndex;
       src_y = (dest_y + m_ClipRect.top) * src_height / m_DestHeight;
     }
-    src_y = std::max(std::min(src_y, src_height - 1), 0);
+    src_y = pdfium::clamp(src_y, 0, src_height - 1);
 
     if (m_pSource->SkipToScanline(src_y, pPause))
       return true;
diff --git a/fpdfsdk/fpdfeditpage.cpp b/fpdfsdk/fpdfeditpage.cpp
index cff339c..7b55e4d 100644
--- a/fpdfsdk/fpdfeditpage.cpp
+++ b/fpdfsdk/fpdfeditpage.cpp
@@ -104,7 +104,7 @@
   if (!pDoc)
     return nullptr;
 
-  page_index = std::min(std::max(page_index, 0), pDoc->GetPageCount());
+  page_index = pdfium::clamp(page_index, 0, pDoc->GetPageCount());
   CPDF_Dictionary* pPageDict = pDoc->CreateNewPage(page_index);
   if (!pPageDict)
     return nullptr;
diff --git a/third_party/base/stl_util.h b/third_party/base/stl_util.h
index 96947f5..9c71530 100644
--- a/third_party/base/stl_util.h
+++ b/third_party/base/stl_util.h
@@ -10,6 +10,7 @@
 #include <set>
 
 #include "third_party/base/numerics/safe_conversions.h"
+#include "third_party/base/stl_util.h"
 
 namespace pdfium {
 
@@ -67,6 +68,12 @@
   const T m_Entry;
 };
 
+// std::clamp(), some day.
+template <class T>
+constexpr const T& clamp(const T& v, const T& lo, const T& hi) {
+  return std::min(std::max(v, lo), hi);
+}
+
 }  // namespace pdfium
 
 #endif  // PDFIUM_THIRD_PARTY_BASE_STL_UTIL_H_
diff --git a/xfa/fde/css/cfde_csstextbuf.cpp b/xfa/fde/css/cfde_csstextbuf.cpp
index 5df09f09..6f74db2 100644
--- a/xfa/fde/css/cfde_csstextbuf.cpp
+++ b/xfa/fde/css/cfde_csstextbuf.cpp
@@ -6,7 +6,7 @@
 
 #include "xfa/fde/css/cfde_csstextbuf.h"
 
-#include <algorithm>
+#include "third_party/base/stl_util.h"
 
 CFDE_CSSTextBuf::CFDE_CSSTextBuf()
     : m_bExtBuf(false),
@@ -80,7 +80,7 @@
 void CFDE_CSSTextBuf::Subtract(int32_t iStart, int32_t iLength) {
   ASSERT(iStart >= 0 && iLength >= 0);
 
-  iLength = std::max(std::min(iLength, m_iDatLen - iStart), 0);
+  iLength = pdfium::clamp(iLength, 0, m_iDatLen - iStart);
   FXSYS_memmove(m_pBuffer, m_pBuffer + iStart, iLength * sizeof(wchar_t));
   m_iDatLen = iLength;
 }
diff --git a/xfa/fwl/cfwl_edit.cpp b/xfa/fwl/cfwl_edit.cpp
index a17d5fe..58f8aff 100644
--- a/xfa/fwl/cfwl_edit.cpp
+++ b/xfa/fwl/cfwl_edit.cpp
@@ -840,7 +840,7 @@
       float fRange = rtFDE.width - rtScroll.width;
       m_pHorzScrollBar->SetRange(0.0f, fRange);
 
-      float fPos = std::min(std::max(m_fScrollOffsetX, 0.0f), fRange);
+      float fPos = pdfium::clamp(m_fScrollOffsetX, 0.0f, fRange);
       m_pHorzScrollBar->SetPos(fPos);
       m_pHorzScrollBar->SetTrackPos(fPos);
       m_pHorzScrollBar->SetPageSize(rtScroll.width);
@@ -867,7 +867,7 @@
       float fRange = std::max(rtFDE.height - m_rtEngine.height, fStep);
 
       m_pVertScrollBar->SetRange(0.0f, fRange);
-      float fPos = std::min(std::max(m_fScrollOffsetY, 0.0f), fRange);
+      float fPos = pdfium::clamp(m_fScrollOffsetY, 0.0f, fRange);
       m_pVertScrollBar->SetPos(fPos);
       m_pVertScrollBar->SetTrackPos(fPos);
       m_pVertScrollBar->SetPageSize(rtScroll.height);
@@ -889,17 +889,16 @@
 }
 
 bool CFWL_Edit::IsShowScrollBar(bool bVert) {
+  if (!bVert)
+    return false;
   bool bShow =
       (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_ShowScrollbarFocus)
           ? (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) ==
                 FWL_WGTSTATE_Focused
           : true;
-  if (bVert) {
-    return bShow && (m_pProperties->m_dwStyles & FWL_WGTSTYLE_VScroll) &&
-           (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_MultiLine) &&
-           IsContentHeightOverflow();
-  }
-  return false;
+  return bShow && (m_pProperties->m_dwStyles & FWL_WGTSTYLE_VScroll) &&
+         (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_MultiLine) &&
+         IsContentHeightOverflow();
 }
 
 bool CFWL_Edit::IsContentHeightOverflow() {
diff --git a/xfa/fwl/cfwl_listbox.cpp b/xfa/fwl/cfwl_listbox.cpp
index 925c6f1..c858063 100644
--- a/xfa/fwl/cfwl_listbox.cpp
+++ b/xfa/fwl/cfwl_listbox.cpp
@@ -527,7 +527,7 @@
     m_pVertScrollBar->SetStepSize(m_fItemHeight);
 
     float fPos =
-        std::min(std::max(m_pVertScrollBar->GetPos(), 0.f), szRange.height);
+        pdfium::clamp(m_pVertScrollBar->GetPos(), 0.0f, szRange.height);
     m_pVertScrollBar->SetPos(fPos);
     m_pVertScrollBar->SetTrackPos(fPos);
     if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_ShowScrollBarFocus) ==
@@ -559,7 +559,7 @@
     m_pHorzScrollBar->SetStepSize(fWidth / 10);
 
     float fPos =
-        std::min(std::max(m_pHorzScrollBar->GetPos(), 0.f), szRange.height);
+        pdfium::clamp(m_pHorzScrollBar->GetPos(), 0.0f, szRange.height);
     m_pHorzScrollBar->SetPos(fPos);
     m_pHorzScrollBar->SetTrackPos(fPos);
     if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_ShowScrollBarFocus) ==
diff --git a/xfa/fwl/cfwl_scrollbar.cpp b/xfa/fwl/cfwl_scrollbar.cpp
index abe99da..72797ed 100644
--- a/xfa/fwl/cfwl_scrollbar.cpp
+++ b/xfa/fwl/cfwl_scrollbar.cpp
@@ -11,6 +11,7 @@
 #include <utility>
 
 #include "third_party/base/ptr_util.h"
+#include "third_party/base/stl_util.h"
 #include "xfa/fwl/cfwl_messagemouse.h"
 #include "xfa/fwl/cfwl_messagemousewheel.h"
 #include "xfa/fwl/cfwl_notedriver.h"
@@ -219,7 +220,7 @@
   fThumbSize = std::max(fThumbSize, kMinThumbSize);
 
   float fDiff = std::max(fLength - fThumbSize, 0.0f);
-  float fTrackPos = std::max(std::min(m_fTrackPos, m_fRangeMax), m_fRangeMin);
+  float fTrackPos = pdfium::clamp(m_fTrackPos, m_fRangeMin, m_fRangeMax);
   if (!fRange)
     return rect;
 
@@ -287,7 +288,7 @@
   }
 
   fPos += m_fLastTrackPos;
-  return std::min(std::max(fPos, m_fRangeMin), m_fRangeMax);
+  return pdfium::clamp(fPos, m_fRangeMin, m_fRangeMax);
 }
 
 bool CFWL_ScrollBar::SendEvent() {
diff --git a/xfa/fxfa/fm2js/xfa_fm2jscontext.cpp b/xfa/fxfa/fm2js/xfa_fm2jscontext.cpp
index 21d9139..e951716 100644
--- a/xfa/fxfa/fm2js/xfa_fm2jscontext.cpp
+++ b/xfa/fxfa/fm2js/xfa_fm2jscontext.cpp
@@ -15,6 +15,7 @@
 #include "fxjs/cfxjse_class.h"
 #include "fxjs/cfxjse_value.h"
 #include "third_party/base/ptr_util.h"
+#include "third_party/base/stl_util.h"
 #include "xfa/fgas/localization/fgas_locale.h"
 #include "xfa/fxfa/app/xfa_ffnotify.h"
 #include "xfa/fxfa/fm2js/xfa_program.h"
@@ -910,8 +911,7 @@
       return;
     }
 
-    uPrecision =
-        static_cast<uint8_t>(std::min(std::max(dPrecision, 0.0), 12.0));
+    uPrecision = static_cast<uint8_t>(pdfium::clamp(dPrecision, 0.0, 12.0));
   }
 
   CFX_Decimal decimalValue((float)dValue, uPrecision);
@@ -4494,8 +4494,9 @@
       !deleteValue->IsNull()) {
     ValueToUTF8String(sourceValue.get(), sourceString);
     iLength = sourceString.GetLength();
-    iStart = std::min(iLength, std::max(1, static_cast<int32_t>(ValueToFloat(
-                                               pThis, startValue.get()))));
+    iStart = pdfium::clamp(
+        static_cast<int32_t>(ValueToFloat(pThis, startValue.get())), 1,
+        iLength);
     iDelete = std::max(
         0, static_cast<int32_t>(ValueToFloat(pThis, deleteValue.get())));
   }
@@ -4551,9 +4552,8 @@
     return;
   }
 
-  iStart = std::min(
-      iLength,
-      std::max(1, static_cast<int32_t>(ValueToFloat(pThis, startValue.get()))));
+  iStart = pdfium::clamp(
+      iLength, 1, static_cast<int32_t>(ValueToFloat(pThis, startValue.get())));
   iCount =
       std::max(0, static_cast<int32_t>(ValueToFloat(pThis, endValue.get())));
 
diff --git a/xfa/fxfa/parser/cxfa_widetextread.cpp b/xfa/fxfa/parser/cxfa_widetextread.cpp
index bba7cbd..73da5c6 100644
--- a/xfa/fxfa/parser/cxfa_widetextread.cpp
+++ b/xfa/fxfa/parser/cxfa_widetextread.cpp
@@ -9,6 +9,7 @@
 #include <algorithm>
 
 #include "core/fxcrt/fx_ext.h"
+#include "third_party/base/stl_util.h"
 #include "xfa/fgas/crt/fgas_codepage.h"
 
 CXFA_WideTextRead::CXFA_WideTextRead(const CFX_WideString& wsBuffer)
@@ -36,7 +37,7 @@
       m_iPosition = m_wsBuffer.GetLength() + iOffset;
       break;
   }
-  m_iPosition = std::min(std::max(0, m_iPosition), m_wsBuffer.GetLength());
+  m_iPosition = pdfium::clamp(0, m_iPosition, m_wsBuffer.GetLength());
   return GetPosition();
 }