diff --git a/core/fxge/dib/cfx_bitmapcomposer.cpp b/core/fxge/dib/cfx_bitmapcomposer.cpp
index bd634ad..604c0c2 100644
--- a/core/fxge/dib/cfx_bitmapcomposer.cpp
+++ b/core/fxge/dib/cfx_bitmapcomposer.cpp
@@ -45,6 +45,7 @@
   m_bRgbByteOrder = bRgbByteOrder;
   m_BlendType = blend_type;
 }
+
 bool CFX_BitmapComposer::SetInfo(int width,
                                  int height,
                                  FXDIB_Format src_format,
@@ -107,11 +108,12 @@
     return;
   }
   const uint8_t* clip_scan = nullptr;
-  if (m_pClipMask)
+  if (m_pClipMask) {
     clip_scan = m_pClipMask->GetBuffer() +
                 (m_DestTop + line - m_pClipRgn->GetBox().top) *
                     m_pClipMask->GetPitch() +
                 (m_DestLeft - m_pClipRgn->GetBox().left);
+  }
   uint8_t* dest_scan =
       const_cast<uint8_t*>(m_pBitmap->GetScanline(line + m_DestTop)) +
       m_DestLeft * m_pBitmap->GetBPP() / 8;
diff --git a/core/fxge/dib/cstretchengine.cpp b/core/fxge/dib/cstretchengine.cpp
index 9fdaa02..b5cf4a7 100644
--- a/core/fxge/dib/cstretchengine.cpp
+++ b/core/fxge/dib/cstretchengine.cpp
@@ -6,20 +6,26 @@
 
 #include "core/fxge/dib/cstretchengine.h"
 
+#include <algorithm>
+#include <utility>
+
 #include "core/fxge/dib/cfx_dibitmap.h"
 #include "core/fxge/dib/cfx_dibsource.h"
 #include "core/fxge/dib/ifx_scanlinecomposer.h"
 #include "core/fxge/fx_dib.h"
 
+namespace {
+
+const int kMaxDestValue = 16711680;
+
+}  // namespace
+
 CStretchEngine::CWeightTable::CWeightTable()
     : m_DestMin(0),
       m_ItemSize(0),
-      m_pWeightTables(nullptr),
       m_dwWeightTablesSize(0) {}
 
-CStretchEngine::CWeightTable::~CWeightTable() {
-  FX_Free(m_pWeightTables);
-}
+CStretchEngine::CWeightTable::~CWeightTable() {}
 
 size_t CStretchEngine::CWeightTable::GetPixelWeightSize() const {
   return m_ItemSize / sizeof(int) - 2;
@@ -32,64 +38,59 @@
                                         int src_min,
                                         int src_max,
                                         int flags) {
-  FX_Free(m_pWeightTables);
-  m_pWeightTables = nullptr;
+  m_WeightTables.clear();
   m_dwWeightTablesSize = 0;
-  const double scale = (float)src_len / (float)dest_len;
-  const double base = dest_len < 0 ? (float)(src_len) : 0;
+  const double scale = static_cast<float>(src_len) / dest_len;
+  const double base = dest_len < 0 ? src_len : 0;
   const int ext_size = flags & FXDIB_BICUBIC_INTERPOL ? 3 : 1;
-  m_ItemSize = sizeof(int) * 2 +
-               (int)(sizeof(int) * (ceil(fabs((float)scale)) + ext_size));
+  m_ItemSize =
+      sizeof(int) * 2 +
+      static_cast<int>(sizeof(int) *
+                       (ceil(fabs(static_cast<float>(scale))) + ext_size));
+
   m_DestMin = dest_min;
-  if ((dest_max - dest_min) > (int)((1U << 30) - 4) / m_ItemSize)
+  if (dest_max - dest_min > static_cast<int>((1U << 30) - 4) / m_ItemSize)
     return false;
 
   m_dwWeightTablesSize = (dest_max - dest_min) * m_ItemSize + 4;
-  m_pWeightTables = FX_TryAlloc(uint8_t, m_dwWeightTablesSize);
-  if (!m_pWeightTables)
-    return false;
-
-  if ((flags & FXDIB_NOSMOOTH) != 0 || fabs((float)scale) < 1.0f) {
-    for (int dest_pixel = dest_min; dest_pixel < dest_max; dest_pixel++) {
+  m_WeightTables.resize(m_dwWeightTablesSize);
+  if ((flags & FXDIB_NOSMOOTH) != 0 || fabs(static_cast<float>(scale)) < 1.0f) {
+    for (int dest_pixel = dest_min; dest_pixel < dest_max; ++dest_pixel) {
       PixelWeight& pixel_weights = *GetPixelWeight(dest_pixel);
       double src_pos = dest_pixel * scale + scale / 2 + base;
       if (flags & FXDIB_INTERPOL) {
-        pixel_weights.m_SrcStart = (int)floor((float)src_pos - 1.0f / 2);
-        pixel_weights.m_SrcEnd = (int)floor((float)src_pos + 1.0f / 2);
-        if (pixel_weights.m_SrcStart < src_min) {
-          pixel_weights.m_SrcStart = src_min;
-        }
-        if (pixel_weights.m_SrcEnd >= src_max) {
-          pixel_weights.m_SrcEnd = src_max - 1;
-        }
+        pixel_weights.m_SrcStart =
+            static_cast<int>(floor(static_cast<float>(src_pos) - 1.0f / 2));
+        pixel_weights.m_SrcEnd =
+            static_cast<int>(floor(static_cast<float>(src_pos) + 1.0f / 2));
+        pixel_weights.m_SrcStart = std::max(pixel_weights.m_SrcStart, src_min);
+        pixel_weights.m_SrcEnd = std::min(pixel_weights.m_SrcEnd, src_max - 1);
         if (pixel_weights.m_SrcStart == pixel_weights.m_SrcEnd) {
           pixel_weights.m_Weights[0] = 65536;
         } else {
-          pixel_weights.m_Weights[1] = FXSYS_round(
-              (float)(src_pos - pixel_weights.m_SrcStart - 1.0f / 2) * 65536);
+          pixel_weights.m_Weights[1] =
+              FXSYS_round(static_cast<float>(
+                              src_pos - pixel_weights.m_SrcStart - 1.0f / 2) *
+                          65536);
           pixel_weights.m_Weights[0] = 65536 - pixel_weights.m_Weights[1];
         }
       } else if (flags & FXDIB_BICUBIC_INTERPOL) {
-        pixel_weights.m_SrcStart = (int)floor((float)src_pos - 1.0f / 2);
-        pixel_weights.m_SrcEnd = (int)floor((float)src_pos + 1.0f / 2);
+        pixel_weights.m_SrcStart =
+            static_cast<int>(floor(static_cast<float>(src_pos) - 1.0f / 2));
+        pixel_weights.m_SrcEnd =
+            static_cast<int>(floor(static_cast<float>(src_pos) + 1.0f / 2));
         int start = pixel_weights.m_SrcStart - 1;
         int end = pixel_weights.m_SrcEnd + 1;
-        if (start < src_min) {
-          start = src_min;
-        }
-        if (end >= src_max) {
-          end = src_max - 1;
-        }
+        start = std::max(start, src_min);
+        end = std::min(end, src_max - 1);
         if (pixel_weights.m_SrcStart < src_min) {
           src_pos += src_min - pixel_weights.m_SrcStart;
           pixel_weights.m_SrcStart = src_min;
         }
-        if (pixel_weights.m_SrcEnd >= src_max) {
-          pixel_weights.m_SrcEnd = src_max - 1;
-        }
-        int weight;
-        weight = FXSYS_round(
-            (float)(src_pos - pixel_weights.m_SrcStart - 1.0f / 2) * 256);
+        pixel_weights.m_SrcEnd = std::min(pixel_weights.m_SrcEnd, src_max - 1);
+        int weight = FXSYS_round(
+            static_cast<float>(src_pos - pixel_weights.m_SrcStart - 1.0f / 2) *
+            256);
         if (start == end) {
           pixel_weights.m_Weights[0] =
               (SDP_Table[256 + weight] + SDP_Table[weight] +
@@ -153,70 +154,48 @@
           pixel_weights.m_SrcEnd = end;
         }
       } else {
-        pixel_weights.m_SrcStart = pixel_weights.m_SrcEnd =
-            (int)floor((float)src_pos);
-        if (pixel_weights.m_SrcStart < src_min) {
-          pixel_weights.m_SrcStart = src_min;
-        }
-        if (pixel_weights.m_SrcEnd >= src_max) {
-          pixel_weights.m_SrcEnd = src_max - 1;
-        }
+        int pixel_pos = static_cast<int>(floor(static_cast<float>(src_pos)));
+        pixel_weights.m_SrcStart = std::max(pixel_pos, src_min);
+        pixel_weights.m_SrcEnd = std::min(pixel_pos, src_max - 1);
         pixel_weights.m_Weights[0] = 65536;
       }
     }
     return true;
   }
 
-  for (int dest_pixel = dest_min; dest_pixel < dest_max; dest_pixel++) {
+  for (int dest_pixel = dest_min; dest_pixel < dest_max; ++dest_pixel) {
     PixelWeight& pixel_weights = *GetPixelWeight(dest_pixel);
     double src_start = dest_pixel * scale + base;
     double src_end = src_start + scale;
-    int start_i, end_i;
-    if (src_start < src_end) {
-      start_i = (int)floor((float)src_start);
-      end_i = (int)ceil((float)src_end);
-    } else {
-      start_i = (int)floor((float)src_end);
-      end_i = (int)ceil((float)src_start);
-    }
-    if (start_i < src_min) {
-      start_i = src_min;
-    }
-    if (end_i >= src_max) {
-      end_i = src_max - 1;
-    }
+    int start_i = floor(std::min(src_start, src_end));
+    int end_i = floor(std::max(src_start, src_end));
+    start_i = std::max(start_i, src_min);
+    end_i = std::min(end_i, src_max - 1);
     if (start_i > end_i) {
-      if (start_i >= src_max) {
-        start_i = src_max - 1;
-      }
+      start_i = std::min(start_i, src_max - 1);
       pixel_weights.m_SrcStart = start_i;
       pixel_weights.m_SrcEnd = start_i;
       continue;
     }
     pixel_weights.m_SrcStart = start_i;
     pixel_weights.m_SrcEnd = end_i;
-    for (int j = start_i; j <= end_i; j++) {
-      double dest_start = ((float)j - base) / scale;
-      double dest_end = ((float)(j + 1) - base) / scale;
-      if (dest_start > dest_end) {
-        double temp = dest_start;
-        dest_start = dest_end;
-        dest_end = temp;
-      }
-      double area_start =
-          dest_start > (float)(dest_pixel) ? dest_start : (float)(dest_pixel);
-      double area_end = dest_end > (float)(dest_pixel + 1)
-                            ? (float)(dest_pixel + 1)
-                            : dest_end;
-      double weight = area_start >= area_end ? 0.0f : area_end - area_start;
+    for (int j = start_i; j <= end_i; ++j) {
+      double dest_start = (j - base) / scale;
+      double dest_end = (j + 1 - base) / scale;
+      if (dest_start > dest_end)
+        std::swap(dest_start, dest_end);
+      double area_start = std::max(dest_start, static_cast<double>(dest_pixel));
+      double area_end = std::min(dest_end, static_cast<double>(dest_pixel + 1));
+      double weight = std::max(0.0, area_end - area_start);
       if (weight == 0 && j == end_i) {
-        pixel_weights.m_SrcEnd--;
+        --pixel_weights.m_SrcEnd;
         break;
       }
       size_t idx = j - start_i;
       if (idx >= GetPixelWeightSize())
         return false;
-      pixel_weights.m_Weights[idx] = FXSYS_round((float)(weight * 65536));
+
+      pixel_weights.m_Weights[idx] = FXSYS_round(weight * 65536);
     }
   }
   return true;
@@ -224,8 +203,8 @@
 
 PixelWeight* CStretchEngine::CWeightTable::GetPixelWeight(int pixel) const {
   ASSERT(pixel >= m_DestMin);
-  return reinterpret_cast<PixelWeight*>(m_pWeightTables +
-                                        (pixel - m_DestMin) * m_ItemSize);
+  return reinterpret_cast<PixelWeight*>(const_cast<uint8_t*>(
+      m_WeightTables.data() + (pixel - m_DestMin) * m_ItemSize));
 }
 
 int* CStretchEngine::CWeightTable::GetValueFromPixelWeight(PixelWeight* pWeight,
@@ -253,30 +232,22 @@
   m_pDestBitmap = pDestBitmap;
   m_DestWidth = dest_width;
   m_DestHeight = dest_height;
-  m_pInterBuf = nullptr;
-  m_pExtraAlphaBuf = nullptr;
-  m_pDestMaskScanline = nullptr;
   m_DestClip = clip_rect;
   uint32_t size = clip_rect.Width();
-  if (size && m_DestBpp > (int)(INT_MAX / size)) {
+  if (size && m_DestBpp > static_cast<int>(INT_MAX / size))
     return;
-  }
+
   size *= m_DestBpp;
-  if (size > INT_MAX - 31) {
+  if (size > INT_MAX - 31)
     return;
-  }
+
   size += 31;
   size = size / 32 * 4;
-  m_pDestScanline = FX_TryAlloc(uint8_t, size);
-  if (!m_pDestScanline) {
-    return;
-  }
-  if (dest_format == FXDIB_Rgb32) {
-    memset(m_pDestScanline, 255, size);
-  }
+  m_DestScanline.resize(size);
+  if (dest_format == FXDIB_Rgb32)
+    std::fill(m_DestScanline.begin(), m_DestScanline.end(), 255);
   m_InterPitch = (m_DestClip.Width() * m_DestBpp + 31) / 32 * 4;
   m_ExtraMaskPitch = (m_DestClip.Width() * 8 + 31) / 32 * 4;
-  m_pInterBuf = nullptr;
   m_pSource = pSrcBitmap;
   m_SrcWidth = pSrcBitmap->GetWidth();
   m_SrcHeight = pSrcBitmap->GetHeight();
@@ -291,69 +262,53 @@
     m_Flags = flags;
   } else {
     m_Flags = FXDIB_NOSMOOTH;
-    if (flags & FXDIB_DOWNSAMPLE) {
+    if (flags & FXDIB_DOWNSAMPLE)
       m_Flags |= FXDIB_DOWNSAMPLE;
-    }
   }
-  double scale_x = (float)m_SrcWidth / (float)m_DestWidth;
-  double scale_y = (float)m_SrcHeight / (float)m_DestHeight;
-  double base_x = m_DestWidth > 0 ? 0.0f : (float)(m_DestWidth);
-  double base_y = m_DestHeight > 0 ? 0.0f : (float)(m_DestHeight);
-  double src_left = scale_x * ((float)(clip_rect.left) + base_x);
-  double src_right = scale_x * ((float)(clip_rect.right) + base_x);
-  double src_top = scale_y * ((float)(clip_rect.top) + base_y);
-  double src_bottom = scale_y * ((float)(clip_rect.bottom) + base_y);
-  if (src_left > src_right) {
-    double temp = src_left;
-    src_left = src_right;
-    src_right = temp;
-  }
-  if (src_top > src_bottom) {
-    double temp = src_top;
-    src_top = src_bottom;
-    src_bottom = temp;
-  }
-  m_SrcClip.left = (int)floor((float)src_left);
-  m_SrcClip.right = (int)ceil((float)src_right);
-  m_SrcClip.top = (int)floor((float)src_top);
-  m_SrcClip.bottom = (int)ceil((float)src_bottom);
+  double scale_x = static_cast<float>(m_SrcWidth) / m_DestWidth;
+  double scale_y = static_cast<float>(m_SrcHeight) / m_DestHeight;
+  double base_x = m_DestWidth > 0 ? 0.0f : m_DestWidth;
+  double base_y = m_DestHeight > 0 ? 0.0f : m_DestHeight;
+  double src_left = scale_x * (clip_rect.left + base_x);
+  double src_right = scale_x * (clip_rect.right + base_x);
+  double src_top = scale_y * (clip_rect.top + base_y);
+  double src_bottom = scale_y * (clip_rect.bottom + base_y);
+  if (src_left > src_right)
+    std::swap(src_left, src_right);
+  if (src_top > src_bottom)
+    std::swap(src_top, src_bottom);
+  m_SrcClip.left = static_cast<int>(floor(src_left));
+  m_SrcClip.right = static_cast<int>(ceil(src_right));
+  m_SrcClip.top = static_cast<int>(floor(src_top));
+  m_SrcClip.bottom = static_cast<int>(ceil(src_bottom));
   FX_RECT src_rect(0, 0, m_SrcWidth, m_SrcHeight);
   m_SrcClip.Intersect(src_rect);
   if (m_SrcBpp == 1) {
-    if (m_DestBpp == 8) {
+    if (m_DestBpp == 8)
       m_TransMethod = 1;
-    } else {
+    else
       m_TransMethod = 2;
-    }
   } else if (m_SrcBpp == 8) {
     if (m_DestBpp == 8) {
-      if (!m_bHasAlpha) {
+      if (!m_bHasAlpha)
         m_TransMethod = 3;
-      } else {
+      else
         m_TransMethod = 4;
-      }
     } else {
-      if (!m_bHasAlpha) {
+      if (!m_bHasAlpha)
         m_TransMethod = 5;
-      } else {
+      else
         m_TransMethod = 6;
-      }
     }
   } else {
-    if (!m_bHasAlpha) {
+    if (!m_bHasAlpha)
       m_TransMethod = 7;
-    } else {
+    else
       m_TransMethod = 8;
-    }
   }
 }
 
-CStretchEngine::~CStretchEngine() {
-  FX_Free(m_pDestScanline);
-  FX_Free(m_pInterBuf);
-  FX_Free(m_pExtraAlphaBuf);
-  FX_Free(m_pDestMaskScanline);
-}
+CStretchEngine::~CStretchEngine() {}
 
 bool CStretchEngine::Continue(IFX_Pause* pPause) {
   while (m_State == 1) {
@@ -367,7 +322,7 @@
 }
 
 bool CStretchEngine::StartStretchHorz() {
-  if (m_DestWidth == 0 || m_InterPitch == 0 || !m_pDestScanline)
+  if (m_DestWidth == 0 || m_InterPitch == 0 || m_DestScanline.empty())
     return false;
 
   if (m_SrcClip.Height() == 0 ||
@@ -375,17 +330,11 @@
     return false;
   }
 
-  m_pInterBuf = FX_TryAlloc(unsigned char, m_SrcClip.Height() * m_InterPitch);
-  if (!m_pInterBuf)
-    return false;
-
+  m_InterBuf.resize(m_SrcClip.Height() * m_InterPitch);
   if (m_pSource && m_bHasAlpha && m_pSource->m_pAlphaMask) {
-    m_pExtraAlphaBuf =
-        FX_Alloc2D(unsigned char, m_SrcClip.Height(), m_ExtraMaskPitch);
+    m_ExtraAlphaBuf.resize(m_SrcClip.Height(), m_ExtraMaskPitch);
     uint32_t size = (m_DestClip.Width() * 8 + 31) / 32 * 4;
-    m_pDestMaskScanline = FX_TryAlloc(unsigned char, size);
-    if (!m_pDestMaskScanline)
-      return false;
+    m_DestMaskScanline.resize(size);
   }
   bool ret =
       m_WeightTable.Calc(m_DestWidth, m_DestClip.left, m_DestClip.right,
@@ -407,7 +356,7 @@
   int Bpp = m_DestBpp / 8;
   static const int kStrechPauseRows = 10;
   int rows_to_go = kStrechPauseRows;
-  for (; m_CurRow < m_SrcClip.bottom; m_CurRow++) {
+  for (; m_CurRow < m_SrcClip.bottom; ++m_CurRow) {
     if (rows_to_go == 0) {
       if (pPause && pPause->NeedToPauseNow())
         return true;
@@ -417,68 +366,61 @@
 
     const uint8_t* src_scan = m_pSource->GetScanline(m_CurRow);
     uint8_t* dest_scan =
-        m_pInterBuf + (m_CurRow - m_SrcClip.top) * m_InterPitch;
+        m_InterBuf.data() + (m_CurRow - m_SrcClip.top) * m_InterPitch;
     const uint8_t* src_scan_mask = nullptr;
     uint8_t* dest_scan_mask = nullptr;
-    if (m_pExtraAlphaBuf) {
+    if (!m_ExtraAlphaBuf.empty()) {
       src_scan_mask = m_pSource->m_pAlphaMask->GetScanline(m_CurRow);
-      dest_scan_mask =
-          m_pExtraAlphaBuf + (m_CurRow - m_SrcClip.top) * m_ExtraMaskPitch;
+      dest_scan_mask = m_ExtraAlphaBuf.data() +
+                       (m_CurRow - m_SrcClip.top) * m_ExtraMaskPitch;
     }
+    // TODO(npm): reduce duplicated code here
     switch (m_TransMethod) {
       case 1:
       case 2: {
-        for (int col = m_DestClip.left; col < m_DestClip.right; col++) {
-          PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);
+        for (int col = m_DestClip.left; col < m_DestClip.right; ++col) {
+          PixelWeight* pWeights = m_WeightTable.GetPixelWeight(col);
           int dest_a = 0;
-          for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd;
-               j++) {
-            int* pWeight =
-                m_WeightTable.GetValueFromPixelWeight(pPixelWeights, j);
+          for (int j = pWeights->m_SrcStart; j <= pWeights->m_SrcEnd; ++j) {
+            int* pWeight = m_WeightTable.GetValueFromPixelWeight(pWeights, j);
             if (!pWeight)
               return false;
 
             int pixel_weight = *pWeight;
-            if (src_scan[j / 8] & (1 << (7 - j % 8))) {
+            if (src_scan[j / 8] & (1 << (7 - j % 8)))
               dest_a += pixel_weight * 255;
-            }
           }
-          if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
-            dest_a = dest_a < 0 ? 0 : dest_a > 16711680 ? 16711680 : dest_a;
-          }
-          *dest_scan++ = (uint8_t)(dest_a >> 16);
+          if (m_Flags & FXDIB_BICUBIC_INTERPOL)
+            dest_a = pdfium::clamp(dest_a, 0, kMaxDestValue);
+          *dest_scan++ = static_cast<uint8_t>(dest_a >> 16);
         }
         break;
       }
       case 3: {
-        for (int col = m_DestClip.left; col < m_DestClip.right; col++) {
-          PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);
+        for (int col = m_DestClip.left; col < m_DestClip.right; ++col) {
+          PixelWeight* pWeights = m_WeightTable.GetPixelWeight(col);
           int dest_a = 0;
-          for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd;
-               j++) {
-            int* pWeight =
-                m_WeightTable.GetValueFromPixelWeight(pPixelWeights, j);
+          for (int j = pWeights->m_SrcStart; j <= pWeights->m_SrcEnd; ++j) {
+            int* pWeight = m_WeightTable.GetValueFromPixelWeight(pWeights, j);
             if (!pWeight)
               return false;
 
             int pixel_weight = *pWeight;
             dest_a += pixel_weight * src_scan[j];
           }
-          if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
-            dest_a = dest_a < 0 ? 0 : dest_a > 16711680 ? 16711680 : dest_a;
-          }
-          *dest_scan++ = (uint8_t)(dest_a >> 16);
+          if (m_Flags & FXDIB_BICUBIC_INTERPOL)
+            dest_a = pdfium::clamp(dest_a, 0, kMaxDestValue);
+          *dest_scan++ = static_cast<uint8_t>(dest_a >> 16);
         }
         break;
       }
       case 4: {
-        for (int col = m_DestClip.left; col < m_DestClip.right; col++) {
-          PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);
-          int dest_a = 0, dest_r = 0;
-          for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd;
-               j++) {
-            int* pWeight =
-                m_WeightTable.GetValueFromPixelWeight(pPixelWeights, j);
+        for (int col = m_DestClip.left; col < m_DestClip.right; ++col) {
+          PixelWeight* pWeights = m_WeightTable.GetPixelWeight(col);
+          int dest_a = 0;
+          int dest_r = 0;
+          for (int j = pWeights->m_SrcStart; j <= pWeights->m_SrcEnd; ++j) {
+            int* pWeight = m_WeightTable.GetValueFromPixelWeight(pWeights, j);
             if (!pWeight)
               return false;
 
@@ -488,59 +430,57 @@
             dest_a += pixel_weight;
           }
           if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
-            dest_r = dest_r < 0 ? 0 : dest_r > 16711680 ? 16711680 : dest_r;
-            dest_a = dest_a < 0 ? 0 : dest_a > 65536 ? 65536 : dest_a;
+            dest_r = pdfium::clamp(dest_r, 0, kMaxDestValue);
+            dest_a = pdfium::clamp(dest_a, 0, 65536);
           }
-          *dest_scan++ = (uint8_t)(dest_r >> 16);
-          *dest_scan_mask++ = (uint8_t)((dest_a * 255) >> 16);
+          *dest_scan++ = static_cast<uint8_t>(dest_r >> 16);
+          *dest_scan_mask++ = static_cast<uint8_t>((dest_a * 255) >> 16);
         }
         break;
       }
       case 5: {
-        for (int col = m_DestClip.left; col < m_DestClip.right; col++) {
-          PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);
-          int dest_r_y = 0, dest_g_m = 0, dest_b_c = 0;
-          for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd;
-               j++) {
-            int* pWeight =
-                m_WeightTable.GetValueFromPixelWeight(pPixelWeights, j);
+        for (int col = m_DestClip.left; col < m_DestClip.right; ++col) {
+          PixelWeight* pWeights = m_WeightTable.GetPixelWeight(col);
+          int dest_r_y = 0;
+          int dest_g_m = 0;
+          int dest_b_c = 0;
+          for (int j = pWeights->m_SrcStart; j <= pWeights->m_SrcEnd; ++j) {
+            int* pWeight = m_WeightTable.GetValueFromPixelWeight(pWeights, j);
             if (!pWeight)
               return false;
 
             int pixel_weight = *pWeight;
             unsigned long argb_cmyk = m_pSrcPalette[src_scan[j]];
             if (m_DestFormat == FXDIB_Rgb) {
-              dest_r_y += pixel_weight * (uint8_t)(argb_cmyk >> 16);
-              dest_g_m += pixel_weight * (uint8_t)(argb_cmyk >> 8);
-              dest_b_c += pixel_weight * (uint8_t)argb_cmyk;
+              dest_r_y += pixel_weight * static_cast<uint8_t>(argb_cmyk >> 16);
+              dest_g_m += pixel_weight * static_cast<uint8_t>(argb_cmyk >> 8);
+              dest_b_c += pixel_weight * static_cast<uint8_t>(argb_cmyk);
             } else {
-              dest_b_c += pixel_weight * (uint8_t)(argb_cmyk >> 24);
-              dest_g_m += pixel_weight * (uint8_t)(argb_cmyk >> 16);
-              dest_r_y += pixel_weight * (uint8_t)(argb_cmyk >> 8);
+              dest_b_c += pixel_weight * static_cast<uint8_t>(argb_cmyk >> 24);
+              dest_g_m += pixel_weight * static_cast<uint8_t>(argb_cmyk >> 16);
+              dest_r_y += pixel_weight * static_cast<uint8_t>(argb_cmyk >> 8);
             }
           }
           if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
-            dest_r_y =
-                dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y;
-            dest_g_m =
-                dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m;
-            dest_b_c =
-                dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c;
+            dest_r_y = pdfium::clamp(dest_r_y, 0, kMaxDestValue);
+            dest_g_m = pdfium::clamp(dest_g_m, 0, kMaxDestValue);
+            dest_b_c = pdfium::clamp(dest_b_c, 0, kMaxDestValue);
           }
-          *dest_scan++ = (uint8_t)(dest_b_c >> 16);
-          *dest_scan++ = (uint8_t)(dest_g_m >> 16);
-          *dest_scan++ = (uint8_t)(dest_r_y >> 16);
+          *dest_scan++ = static_cast<uint8_t>(dest_b_c >> 16);
+          *dest_scan++ = static_cast<uint8_t>(dest_g_m >> 16);
+          *dest_scan++ = static_cast<uint8_t>(dest_r_y >> 16);
         }
         break;
       }
       case 6: {
-        for (int col = m_DestClip.left; col < m_DestClip.right; col++) {
-          PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);
-          int dest_a = 0, dest_r_y = 0, dest_g_m = 0, dest_b_c = 0;
-          for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd;
-               j++) {
-            int* pWeight =
-                m_WeightTable.GetValueFromPixelWeight(pPixelWeights, j);
+        for (int col = m_DestClip.left; col < m_DestClip.right; ++col) {
+          PixelWeight* pWeights = m_WeightTable.GetPixelWeight(col);
+          int dest_a = 0;
+          int dest_r_y = 0;
+          int dest_g_m = 0;
+          int dest_b_c = 0;
+          for (int j = pWeights->m_SrcStart; j <= pWeights->m_SrcEnd; ++j) {
+            int* pWeight = m_WeightTable.GetValueFromPixelWeight(pWeights, j);
             if (!pWeight)
               return false;
 
@@ -548,40 +488,37 @@
             pixel_weight = pixel_weight * src_scan_mask[j] / 255;
             unsigned long argb_cmyk = m_pSrcPalette[src_scan[j]];
             if (m_DestFormat == FXDIB_Rgba) {
-              dest_r_y += pixel_weight * (uint8_t)(argb_cmyk >> 16);
-              dest_g_m += pixel_weight * (uint8_t)(argb_cmyk >> 8);
-              dest_b_c += pixel_weight * (uint8_t)argb_cmyk;
+              dest_r_y += pixel_weight * static_cast<uint8_t>(argb_cmyk >> 16);
+              dest_g_m += pixel_weight * static_cast<uint8_t>(argb_cmyk >> 8);
+              dest_b_c += pixel_weight * static_cast<uint8_t>(argb_cmyk);
             } else {
-              dest_b_c += pixel_weight * (uint8_t)(argb_cmyk >> 24);
-              dest_g_m += pixel_weight * (uint8_t)(argb_cmyk >> 16);
-              dest_r_y += pixel_weight * (uint8_t)(argb_cmyk >> 8);
+              dest_b_c += pixel_weight * static_cast<uint8_t>(argb_cmyk >> 24);
+              dest_g_m += pixel_weight * static_cast<uint8_t>(argb_cmyk >> 16);
+              dest_r_y += pixel_weight * static_cast<uint8_t>(argb_cmyk >> 8);
             }
             dest_a += pixel_weight;
           }
           if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
-            dest_b_c =
-                dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c;
-            dest_g_m =
-                dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m;
-            dest_r_y =
-                dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y;
-            dest_a = dest_a < 0 ? 0 : dest_a > 65536 ? 65536 : dest_a;
+            dest_b_c = pdfium::clamp(dest_b_c, 0, kMaxDestValue);
+            dest_g_m = pdfium::clamp(dest_g_m, 0, kMaxDestValue);
+            dest_r_y = pdfium::clamp(dest_r_y, 0, kMaxDestValue);
+            dest_a = pdfium::clamp(dest_a, 0, 65536);
           }
-          *dest_scan++ = (uint8_t)(dest_b_c >> 16);
-          *dest_scan++ = (uint8_t)(dest_g_m >> 16);
-          *dest_scan++ = (uint8_t)(dest_r_y >> 16);
-          *dest_scan_mask++ = (uint8_t)((dest_a * 255) >> 16);
+          *dest_scan++ = static_cast<uint8_t>(dest_b_c >> 16);
+          *dest_scan++ = static_cast<uint8_t>(dest_g_m >> 16);
+          *dest_scan++ = static_cast<uint8_t>(dest_r_y >> 16);
+          *dest_scan_mask++ = static_cast<uint8_t>((dest_a * 255) >> 16);
         }
         break;
       }
       case 7: {
-        for (int col = m_DestClip.left; col < m_DestClip.right; col++) {
-          PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);
-          int dest_r_y = 0, dest_g_m = 0, dest_b_c = 0;
-          for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd;
-               j++) {
-            int* pWeight =
-                m_WeightTable.GetValueFromPixelWeight(pPixelWeights, j);
+        for (int col = m_DestClip.left; col < m_DestClip.right; ++col) {
+          PixelWeight* pWeights = m_WeightTable.GetPixelWeight(col);
+          int dest_r_y = 0;
+          int dest_g_m = 0;
+          int dest_b_c = 0;
+          for (int j = pWeights->m_SrcStart; j <= pWeights->m_SrcEnd; ++j) {
+            int* pWeight = m_WeightTable.GetValueFromPixelWeight(pWeights, j);
             if (!pWeight)
               return false;
 
@@ -592,28 +529,26 @@
             dest_r_y += pixel_weight * (*src_pixel);
           }
           if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
-            dest_b_c =
-                dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c;
-            dest_g_m =
-                dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m;
-            dest_r_y =
-                dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y;
+            dest_b_c = pdfium::clamp(dest_b_c, 0, kMaxDestValue);
+            dest_g_m = pdfium::clamp(dest_g_m, 0, kMaxDestValue);
+            dest_r_y = pdfium::clamp(dest_r_y, 0, kMaxDestValue);
           }
-          *dest_scan++ = (uint8_t)((dest_b_c) >> 16);
-          *dest_scan++ = (uint8_t)((dest_g_m) >> 16);
-          *dest_scan++ = (uint8_t)((dest_r_y) >> 16);
+          *dest_scan++ = static_cast<uint8_t>((dest_b_c) >> 16);
+          *dest_scan++ = static_cast<uint8_t>((dest_g_m) >> 16);
+          *dest_scan++ = static_cast<uint8_t>((dest_r_y) >> 16);
           dest_scan += Bpp - 3;
         }
         break;
       }
       case 8: {
-        for (int col = m_DestClip.left; col < m_DestClip.right; col++) {
-          PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);
-          int dest_a = 0, dest_r_y = 0, dest_g_m = 0, dest_b_c = 0;
-          for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd;
-               j++) {
-            int* pWeight =
-                m_WeightTable.GetValueFromPixelWeight(pPixelWeights, j);
+        for (int col = m_DestClip.left; col < m_DestClip.right; ++col) {
+          PixelWeight* pWeights = m_WeightTable.GetPixelWeight(col);
+          int dest_a = 0;
+          int dest_r_y = 0;
+          int dest_g_m = 0;
+          int dest_b_c = 0;
+          for (int j = pWeights->m_SrcStart; j <= pWeights->m_SrcEnd; ++j) {
+            int* pWeight = m_WeightTable.GetValueFromPixelWeight(pWeights, j);
             if (!pWeight)
               return false;
 
@@ -630,23 +565,18 @@
             dest_a += pixel_weight;
           }
           if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
-            dest_r_y =
-                dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y;
-            dest_g_m =
-                dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m;
-            dest_b_c =
-                dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c;
-            dest_a = dest_a < 0 ? 0 : dest_a > 65536 ? 65536 : dest_a;
+            dest_r_y = pdfium::clamp(dest_r_y, 0, kMaxDestValue);
+            dest_g_m = pdfium::clamp(dest_g_m, 0, kMaxDestValue);
+            dest_b_c = pdfium::clamp(dest_b_c, 0, kMaxDestValue);
+            dest_a = pdfium::clamp(dest_a, 0, 65536);
           }
-          *dest_scan++ = (uint8_t)((dest_b_c) >> 16);
-          *dest_scan++ = (uint8_t)((dest_g_m) >> 16);
-          *dest_scan++ = (uint8_t)((dest_r_y) >> 16);
-          if (m_DestFormat == FXDIB_Argb) {
-            *dest_scan = (uint8_t)((dest_a * 255) >> 16);
-          }
-          if (dest_scan_mask) {
-            *dest_scan_mask++ = (uint8_t)((dest_a * 255) >> 16);
-          }
+          *dest_scan++ = static_cast<uint8_t>((dest_b_c) >> 16);
+          *dest_scan++ = static_cast<uint8_t>((dest_g_m) >> 16);
+          *dest_scan++ = static_cast<uint8_t>((dest_r_y) >> 16);
+          if (m_DestFormat == FXDIB_Argb)
+            *dest_scan = static_cast<uint8_t>((dest_a * 255) >> 16);
+          if (dest_scan_mask)
+            *dest_scan_mask++ = static_cast<uint8_t>((dest_a * 255) >> 16);
           dest_scan += Bpp - 3;
         }
         break;
@@ -668,21 +598,20 @@
     return;
 
   const int DestBpp = m_DestBpp / 8;
-  for (int row = m_DestClip.top; row < m_DestClip.bottom; row++) {
-    unsigned char* dest_scan = m_pDestScanline;
-    unsigned char* dest_scan_mask = m_pDestMaskScanline;
-    PixelWeight* pPixelWeights = table.GetPixelWeight(row);
+  for (int row = m_DestClip.top; row < m_DestClip.bottom; ++row) {
+    unsigned char* dest_scan = m_DestScanline.data();
+    unsigned char* dest_scan_mask = m_DestMaskScanline.data();
+    PixelWeight* pWeights = table.GetPixelWeight(row);
     switch (m_TransMethod) {
       case 1:
       case 2:
       case 3: {
-        for (int col = m_DestClip.left; col < m_DestClip.right; col++) {
+        for (int col = m_DestClip.left; col < m_DestClip.right; ++col) {
           unsigned char* src_scan =
-              m_pInterBuf + (col - m_DestClip.left) * DestBpp;
+              m_InterBuf.data() + (col - m_DestClip.left) * DestBpp;
           int dest_a = 0;
-          for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd;
-               j++) {
-            int* pWeight = table.GetValueFromPixelWeight(pPixelWeights, j);
+          for (int j = pWeights->m_SrcStart; j <= pWeights->m_SrcEnd; ++j) {
+            int* pWeight = table.GetValueFromPixelWeight(pWeights, j);
             if (!pWeight)
               return;
 
@@ -690,24 +619,23 @@
             dest_a +=
                 pixel_weight * src_scan[(j - m_SrcClip.top) * m_InterPitch];
           }
-          if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
-            dest_a = dest_a < 0 ? 0 : dest_a > 16711680 ? 16711680 : dest_a;
-          }
-          *dest_scan = (uint8_t)(dest_a >> 16);
+          if (m_Flags & FXDIB_BICUBIC_INTERPOL)
+            dest_a = pdfium::clamp(dest_a, 0, kMaxDestValue);
+          *dest_scan = static_cast<uint8_t>(dest_a >> 16);
           dest_scan += DestBpp;
         }
         break;
       }
       case 4: {
-        for (int col = m_DestClip.left; col < m_DestClip.right; col++) {
+        for (int col = m_DestClip.left; col < m_DestClip.right; ++col) {
           unsigned char* src_scan =
-              m_pInterBuf + (col - m_DestClip.left) * DestBpp;
+              m_InterBuf.data() + (col - m_DestClip.left) * DestBpp;
           unsigned char* src_scan_mask =
-              m_pExtraAlphaBuf + (col - m_DestClip.left);
-          int dest_a = 0, dest_k = 0;
-          for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd;
-               j++) {
-            int* pWeight = table.GetValueFromPixelWeight(pPixelWeights, j);
+              m_ExtraAlphaBuf.data() + (col - m_DestClip.left);
+          int dest_a = 0;
+          int dest_k = 0;
+          for (int j = pWeights->m_SrcStart; j <= pWeights->m_SrcEnd; ++j) {
+            int* pWeight = table.GetValueFromPixelWeight(pWeights, j);
             if (!pWeight)
               return;
 
@@ -718,24 +646,25 @@
                       src_scan_mask[(j - m_SrcClip.top) * m_ExtraMaskPitch];
           }
           if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
-            dest_k = dest_k < 0 ? 0 : dest_k > 16711680 ? 16711680 : dest_k;
-            dest_a = dest_a < 0 ? 0 : dest_a > 16711680 ? 16711680 : dest_a;
+            dest_k = pdfium::clamp(dest_k, 0, kMaxDestValue);
+            dest_a = pdfium::clamp(dest_a, 0, kMaxDestValue);
           }
-          *dest_scan = (uint8_t)(dest_k >> 16);
+          *dest_scan = static_cast<uint8_t>(dest_k >> 16);
           dest_scan += DestBpp;
-          *dest_scan_mask++ = (uint8_t)(dest_a >> 16);
+          *dest_scan_mask++ = static_cast<uint8_t>(dest_a >> 16);
         }
         break;
       }
       case 5:
       case 7: {
-        for (int col = m_DestClip.left; col < m_DestClip.right; col++) {
+        for (int col = m_DestClip.left; col < m_DestClip.right; ++col) {
           unsigned char* src_scan =
-              m_pInterBuf + (col - m_DestClip.left) * DestBpp;
-          int dest_r_y = 0, dest_g_m = 0, dest_b_c = 0;
-          for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd;
-               j++) {
-            int* pWeight = table.GetValueFromPixelWeight(pPixelWeights, j);
+              m_InterBuf.data() + (col - m_DestClip.left) * DestBpp;
+          int dest_r_y = 0;
+          int dest_g_m = 0;
+          int dest_b_c = 0;
+          for (int j = pWeights->m_SrcStart; j <= pWeights->m_SrcEnd; ++j) {
+            int* pWeight = table.GetValueFromPixelWeight(pWeights, j);
             if (!pWeight)
               return;
 
@@ -747,33 +676,31 @@
             dest_r_y += pixel_weight * (*src_pixel);
           }
           if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
-            dest_r_y =
-                dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y;
-            dest_g_m =
-                dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m;
-            dest_b_c =
-                dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c;
+            dest_r_y = pdfium::clamp(dest_r_y, 0, kMaxDestValue);
+            dest_g_m = pdfium::clamp(dest_g_m, 0, kMaxDestValue);
+            dest_b_c = pdfium::clamp(dest_b_c, 0, kMaxDestValue);
           }
-          dest_scan[0] = (uint8_t)((dest_b_c) >> 16);
-          dest_scan[1] = (uint8_t)((dest_g_m) >> 16);
-          dest_scan[2] = (uint8_t)((dest_r_y) >> 16);
+          dest_scan[0] = static_cast<uint8_t>((dest_b_c) >> 16);
+          dest_scan[1] = static_cast<uint8_t>((dest_g_m) >> 16);
+          dest_scan[2] = static_cast<uint8_t>((dest_r_y) >> 16);
           dest_scan += DestBpp;
         }
         break;
       }
       case 6:
       case 8: {
-        for (int col = m_DestClip.left; col < m_DestClip.right; col++) {
+        for (int col = m_DestClip.left; col < m_DestClip.right; ++col) {
           unsigned char* src_scan =
-              m_pInterBuf + (col - m_DestClip.left) * DestBpp;
+              m_InterBuf.data() + (col - m_DestClip.left) * DestBpp;
           unsigned char* src_scan_mask = nullptr;
-          if (m_DestFormat != FXDIB_Argb) {
-            src_scan_mask = m_pExtraAlphaBuf + (col - m_DestClip.left);
-          }
-          int dest_a = 0, dest_r_y = 0, dest_g_m = 0, dest_b_c = 0;
-          for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd;
-               j++) {
-            int* pWeight = table.GetValueFromPixelWeight(pPixelWeights, j);
+          if (m_DestFormat != FXDIB_Argb)
+            src_scan_mask = m_ExtraAlphaBuf.data() + (col - m_DestClip.left);
+          int dest_a = 0;
+          int dest_r_y = 0;
+          int dest_g_m = 0;
+          int dest_b_c = 0;
+          for (int j = pWeights->m_SrcStart; j <= pWeights->m_SrcEnd; ++j) {
+            int* pWeight = table.GetValueFromPixelWeight(pWeights, j);
             if (!pWeight)
               return;
 
@@ -781,49 +708,42 @@
             const uint8_t* src_pixel =
                 src_scan + (j - m_SrcClip.top) * m_InterPitch;
             int mask_v = 255;
-            if (src_scan_mask) {
+            if (src_scan_mask)
               mask_v = src_scan_mask[(j - m_SrcClip.top) * m_ExtraMaskPitch];
-            }
             dest_b_c += pixel_weight * (*src_pixel++);
             dest_g_m += pixel_weight * (*src_pixel++);
             dest_r_y += pixel_weight * (*src_pixel);
-            if (m_DestFormat == FXDIB_Argb) {
+            if (m_DestFormat == FXDIB_Argb)
               dest_a += pixel_weight * (*(src_pixel + 1));
-            } else {
+            else
               dest_a += pixel_weight * mask_v;
-            }
           }
           if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
-            dest_r_y =
-                dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y;
-            dest_g_m =
-                dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m;
-            dest_b_c =
-                dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c;
-            dest_a = dest_a < 0 ? 0 : dest_a > 16711680 ? 16711680 : dest_a;
+            dest_r_y = pdfium::clamp(dest_r_y, 0, kMaxDestValue);
+            dest_g_m = pdfium::clamp(dest_g_m, 0, kMaxDestValue);
+            dest_b_c = pdfium::clamp(dest_b_c, 0, kMaxDestValue);
+            dest_a = pdfium::clamp(dest_a, 0, kMaxDestValue);
           }
           if (dest_a) {
-            int r = ((uint32_t)dest_r_y) * 255 / dest_a;
-            int g = ((uint32_t)dest_g_m) * 255 / dest_a;
-            int b = ((uint32_t)dest_b_c) * 255 / dest_a;
-            dest_scan[0] = b > 255 ? 255 : b < 0 ? 0 : b;
-            dest_scan[1] = g > 255 ? 255 : g < 0 ? 0 : g;
-            dest_scan[2] = r > 255 ? 255 : r < 0 ? 0 : r;
+            int r = static_cast<uint32_t>(dest_r_y) * 255 / dest_a;
+            int g = static_cast<uint32_t>(dest_g_m) * 255 / dest_a;
+            int b = static_cast<uint32_t>(dest_b_c) * 255 / dest_a;
+            dest_scan[0] = pdfium::clamp(b, 0, 255);
+            dest_scan[1] = pdfium::clamp(g, 0, 255);
+            dest_scan[2] = pdfium::clamp(r, 0, 255);
           }
-          if (m_DestFormat == FXDIB_Argb) {
-            dest_scan[3] = (uint8_t)((dest_a) >> 16);
-          } else {
-            *dest_scan_mask = (uint8_t)((dest_a) >> 16);
-          }
+          if (m_DestFormat == FXDIB_Argb)
+            dest_scan[3] = static_cast<uint8_t>((dest_a) >> 16);
+          else
+            *dest_scan_mask = static_cast<uint8_t>((dest_a) >> 16);
           dest_scan += DestBpp;
-          if (dest_scan_mask) {
+          if (dest_scan_mask)
             dest_scan_mask++;
-          }
         }
         break;
       }
     }
-    m_pDestBitmap->ComposeScanline(row - m_DestClip.top, m_pDestScanline,
-                                   m_pDestMaskScanline);
+    m_pDestBitmap->ComposeScanline(row - m_DestClip.top, m_DestScanline.data(),
+                                   m_DestMaskScanline.data());
   }
 }
diff --git a/core/fxge/dib/cstretchengine.h b/core/fxge/dib/cstretchengine.h
index 0d9457f..280641c 100644
--- a/core/fxge/dib/cstretchengine.h
+++ b/core/fxge/dib/cstretchengine.h
@@ -7,6 +7,8 @@
 #ifndef CORE_FXGE_DIB_CSTRETCHENGINE_H_
 #define CORE_FXGE_DIB_CSTRETCHENGINE_H_
 
+#include <vector>
+
 #include "core/fxcrt/fx_coordinates.h"
 #include "core/fxge/fx_dib.h"
 
@@ -48,7 +50,7 @@
    private:
     int m_DestMin;
     int m_ItemSize;
-    uint8_t* m_pWeightTables;
+    std::vector<uint8_t> m_WeightTables;
     size_t m_dwWeightTablesSize;
   };
 
@@ -57,10 +59,11 @@
   int m_SrcBpp;
   int m_bHasAlpha;
   IFX_ScanlineComposer* m_pDestBitmap;
-  int m_DestWidth, m_DestHeight;
+  int m_DestWidth;
+  int m_DestHeight;
   FX_RECT m_DestClip;
-  uint8_t* m_pDestScanline;
-  uint8_t* m_pDestMaskScanline;
+  std::vector<uint8_t> m_DestScanline;
+  std::vector<uint8_t> m_DestMaskScanline;
   FX_RECT m_SrcClip;
   CFX_RetainPtr<CFX_DIBSource> m_pSource;
   uint32_t* m_pSrcPalette;
@@ -69,8 +72,8 @@
   int m_SrcPitch;
   int m_InterPitch;
   int m_ExtraMaskPitch;
-  uint8_t* m_pInterBuf;
-  uint8_t* m_pExtraAlphaBuf;
+  std::vector<uint8_t> m_InterBuf;
+  std::vector<uint8_t> m_ExtraAlphaBuf;
   int m_TransMethod;
   int m_Flags;
   CWeightTable m_WeightTable;
