Fix some -Wmaybe-uninitialized errors.

- Break up CPDF_DIBSource::DownSampleScanline() into smaller functions.

R=tsepez@chromium.org

Review URL: https://codereview.chromium.org/1287843004 .
diff --git a/core/src/fpdfapi/fpdf_edit/fpdf_edit_image.cpp b/core/src/fpdfapi/fpdf_edit/fpdf_edit_image.cpp
index 488d839..1dd0ae6 100644
--- a/core/src/fpdfapi/fpdf_edit/fpdf_edit_image.cpp
+++ b/core/src/fpdfapi/fpdf_edit/fpdf_edit_image.cpp
@@ -218,7 +218,7 @@
     int32_t maskWidth = pMaskBitmap->GetWidth();
     int32_t maskHeight = pMaskBitmap->GetHeight();
     uint8_t* mask_buf = NULL;
-    FX_STRSIZE mask_size;
+    FX_STRSIZE mask_size = 0;
     CPDF_Dictionary* pMaskDict = new CPDF_Dictionary;
     pMaskDict->SetAtName(FX_BSTRC("Type"), FX_BSTRC("XObject"));
     pMaskDict->SetAtName(FX_BSTRC("Subtype"), FX_BSTRC("Image"));
diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp
index 8a61481..977abe1 100644
--- a/core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp
+++ b/core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp
@@ -91,6 +91,8 @@
   void operator=(const JpxBitMapContext&);
 };
 
+const int kMaxImageDimension = 0x01FFFF;
+
 }  // namespace
 
 CFX_DIBSource* CPDF_Image::LoadDIBSource(CFX_DIBSource** ppMask,
@@ -225,8 +227,8 @@
   m_pStream = pStream;
   m_Width = m_pDict->GetInteger(FX_BSTRC("Width"));
   m_Height = m_pDict->GetInteger(FX_BSTRC("Height"));
-  if (m_Width <= 0 || m_Height <= 0 || m_Width > 0x01ffff ||
-      m_Height > 0x01ffff) {
+  if (m_Width <= 0 || m_Height <= 0 || m_Width > kMaxImageDimension ||
+      m_Height > kMaxImageDimension) {
     return FALSE;
   }
   m_GroupFamily = GroupFamily;
@@ -345,8 +347,8 @@
   m_bHasMask = bHasMask;
   m_Width = m_pDict->GetInteger(FX_BSTRC("Width"));
   m_Height = m_pDict->GetInteger(FX_BSTRC("Height"));
-  if (m_Width <= 0 || m_Height <= 0 || m_Width > 0x01ffff ||
-      m_Height > 0x01ffff) {
+  if (m_Width <= 0 || m_Height <= 0 || m_Width > kMaxImageDimension ||
+      m_Height > kMaxImageDimension) {
     return 0;
   }
   m_GroupFamily = GroupFamily;
@@ -782,7 +784,7 @@
   m_bpc = 8;
 }
 CPDF_DIBSource* CPDF_DIBSource::LoadMask(FX_DWORD& MatteColor) {
-  MatteColor = 0xffffffff;
+  MatteColor = 0xFFFFFFFF;
   CPDF_Stream* pSoftMask = m_pDict->GetStream(FX_BSTRC("SMask"));
   if (pSoftMask) {
     CPDF_Array* pMatte = pSoftMask->GetDict()->GetArray(FX_BSTRC("Matte"));
@@ -810,7 +812,7 @@
   return NULL;
 }
 int CPDF_DIBSource::StratLoadMask() {
-  m_MatteColor = 0xffffffff;
+  m_MatteColor = 0XFFFFFFFF;
   m_pMaskStream = m_pDict->GetStream(FX_BSTRC("SMask"));
   if (m_pMaskStream) {
     CPDF_Array* pMatte = m_pMaskStream->GetDict()->GetArray(FX_BSTRC("Matte"));
@@ -1043,10 +1045,8 @@
     }
     if (m_bpc == 8) {
       if (m_nComponents == m_pColorSpace->CountComponents())
-        m_pColorSpace->TranslateImageLine(
-            dest_scan, src_scan, m_Width, m_Width, m_Height,
-            m_bLoadMask && m_GroupFamily == PDFCS_DEVICECMYK &&
-                m_Family == PDFCS_DEVICECMYK);
+        m_pColorSpace->TranslateImageLine(dest_scan, src_scan, m_Width, m_Width,
+                                          m_Height, TransMask());
       return;
     }
   }
@@ -1062,8 +1062,7 @@
         color_values[color] = m_pCompData[color].m_DecodeMin +
                               m_pCompData[color].m_DecodeStep * data;
       }
-      if (m_bLoadMask && m_GroupFamily == PDFCS_DEVICECMYK &&
-          m_Family == PDFCS_DEVICECMYK) {
+      if (TransMask()) {
         FX_FLOAT k = 1.0f - color_values[3];
         R = (1.0f - color_values[0]) * k;
         G = (1.0f - color_values[1]) * k;
@@ -1089,8 +1088,7 @@
                               m_pCompData[color].m_DecodeStep * data;
         src_bit_pos += m_bpc;
       }
-      if (m_bLoadMask && m_GroupFamily == PDFCS_DEVICECMYK &&
-          m_Family == PDFCS_DEVICECMYK) {
+      if (TransMask()) {
         FX_FLOAT k = 1.0f - color_values[3];
         R = (1.0f - color_values[0]) * k;
         G = (1.0f - color_values[1]) * k;
@@ -1137,7 +1135,7 @@
   }
   if (pSrcLine == NULL) {
     uint8_t* pLineBuf = m_pMaskedLine ? m_pMaskedLine : m_pLineBuf;
-    FXSYS_memset(pLineBuf, 0xff, m_Pitch);
+    FXSYS_memset(pLineBuf, 0xFF, m_Pitch);
     return pLineBuf;
   }
   if (m_bpc * m_nComponents == 1) {
@@ -1147,8 +1145,8 @@
       }
     } else if (m_bColorKey) {
       FX_DWORD reset_argb, set_argb;
-      reset_argb = m_pPalette ? m_pPalette[0] : 0xff000000;
-      set_argb = m_pPalette ? m_pPalette[1] : 0xffffffff;
+      reset_argb = m_pPalette ? m_pPalette[0] : 0xFF000000;
+      set_argb = m_pPalette ? m_pPalette[1] : 0xFFFFFFFF;
       if (m_pCompData[0].m_ColorKeyMin == 0) {
         reset_argb = 0;
       }
@@ -1203,7 +1201,7 @@
         }
         *pDestPixel = (index < m_pCompData[0].m_ColorKeyMin ||
                        index > m_pCompData[0].m_ColorKeyMax)
-                          ? 0xff
+                          ? 0xFF
                           : 0;
         pDestPixel++;
       }
@@ -1222,11 +1220,11 @@
                                   pPixel[1] > m_pCompData[1].m_ColorKeyMax ||
                                   pPixel[2] < m_pCompData[2].m_ColorKeyMin ||
                                   pPixel[2] > m_pCompData[2].m_ColorKeyMax)
-                                     ? 0xff
+                                     ? 0xFF
                                      : 0;
       }
     } else {
-      FXSYS_memset(m_pMaskedLine, 0xff, m_Pitch);
+      FXSYS_memset(m_pMaskedLine, 0xFF, m_Pitch);
     }
   }
   if (m_pColorSpace) {
@@ -1246,12 +1244,11 @@
   }
   return pSrcLine;
 }
+
 FX_BOOL CPDF_DIBSource::SkipToScanline(int line, IFX_Pause* pPause) const {
-  if (m_pDecoder) {
-    return m_pDecoder->SkipToScanline(line, pPause);
-  }
-  return FALSE;
+  return m_pDecoder && m_pDecoder->SkipToScanline(line, pPause);
 }
+
 void CPDF_DIBSource::DownSampleScanline(int line,
                                         uint8_t* dest_scan,
                                         int dest_bpp,
@@ -1259,18 +1256,17 @@
                                         FX_BOOL bFlipX,
                                         int clip_left,
                                         int clip_width) const {
-  if (line < 0 || dest_scan == NULL || dest_bpp <= 0 || dest_width <= 0 ||
+  if (line < 0 || !dest_scan || dest_bpp <= 0 || dest_width <= 0 ||
       clip_left < 0 || clip_width <= 0) {
     return;
   }
 
   FX_DWORD src_width = m_Width;
   FX_SAFE_DWORD pitch = CalculatePitch8(m_bpc, m_nComponents, m_Width, 1);
-  if (!pitch.IsValid()) {
+  if (!pitch.IsValid())
     return;
-  }
 
-  const uint8_t* pSrcLine = NULL;
+  const uint8_t* pSrcLine = nullptr;
   if (m_pCachedBitmap) {
     pSrcLine = m_pCachedBitmap->GetScanline(line);
   } else if (m_pDecoder) {
@@ -1288,8 +1284,8 @@
   }
   int orig_Bpp = m_bpc * m_nComponents / 8;
   int dest_Bpp = dest_bpp / 8;
-  if (pSrcLine == NULL) {
-    FXSYS_memset(dest_scan, 0xff, dest_Bpp * clip_width);
+  if (!pSrcLine) {
+    FXSYS_memset(dest_scan, 0xFF, dest_Bpp * clip_width);
     return;
   }
 
@@ -1297,227 +1293,263 @@
   max_src_x += clip_width - 1;
   max_src_x *= src_width;
   max_src_x /= dest_width;
-  if (!max_src_x.IsValid()) {
+  if (!max_src_x.IsValid())
     return;
-  }
 
-  CFX_FixedBufGrow<uint8_t, 128> temp(orig_Bpp);
   if (m_bpc * m_nComponents == 1) {
-    FX_DWORD set_argb = (FX_DWORD)-1, reset_argb = 0;
-    if (m_bImageMask) {
-      if (m_bDefaultDecode) {
-        set_argb = 0;
-        reset_argb = (FX_DWORD)-1;
-      }
-    } else if (m_bColorKey) {
-      reset_argb = m_pPalette ? m_pPalette[0] : 0xff000000;
-      set_argb = m_pPalette ? m_pPalette[1] : 0xffffffff;
-      if (m_pCompData[0].m_ColorKeyMin == 0) {
-        reset_argb = 0;
-      }
-      if (m_pCompData[0].m_ColorKeyMax == 1) {
-        set_argb = 0;
-      }
-      set_argb = FXARGB_TODIB(set_argb);
-      reset_argb = FXARGB_TODIB(reset_argb);
-      for (int i = 0; i < clip_width; i++) {
-        FX_DWORD src_x = (clip_left + i) * src_width / dest_width;
-        if (bFlipX) {
-          src_x = src_width - src_x - 1;
-        }
-        src_x %= src_width;
-        if (pSrcLine[src_x / 8] & (1 << (7 - src_x % 8))) {
-          ((FX_DWORD*)dest_scan)[i] = set_argb;
-        } else {
-          ((FX_DWORD*)dest_scan)[i] = reset_argb;
-        }
-      }
-      return;
-    } else {
-      if (dest_Bpp == 1) {
-      } else if (m_pPalette) {
-        reset_argb = m_pPalette[0];
-        set_argb = m_pPalette[1];
-      }
-    }
-    for (int i = 0; i < clip_width; i++) {
-      FX_DWORD src_x = (clip_left + i) * src_width / dest_width;
-      if (bFlipX) {
-        src_x = src_width - src_x - 1;
-      }
-      src_x %= src_width;
-      int dest_pos = i * dest_Bpp;
-      if (pSrcLine[src_x / 8] & (1 << (7 - src_x % 8))) {
-        if (dest_Bpp == 1) {
-          dest_scan[dest_pos] = (uint8_t)set_argb;
-        } else if (dest_Bpp == 3) {
-          dest_scan[dest_pos] = FXARGB_B(set_argb);
-          dest_scan[dest_pos + 1] = FXARGB_G(set_argb);
-          dest_scan[dest_pos + 2] = FXARGB_R(set_argb);
-        } else {
-          *(FX_DWORD*)(dest_scan + dest_pos) = set_argb;
-        }
-      } else {
-        if (dest_Bpp == 1) {
-          dest_scan[dest_pos] = (uint8_t)reset_argb;
-        } else if (dest_Bpp == 3) {
-          dest_scan[dest_pos] = FXARGB_B(reset_argb);
-          dest_scan[dest_pos + 1] = FXARGB_G(reset_argb);
-          dest_scan[dest_pos + 2] = FXARGB_R(reset_argb);
-        } else {
-          *(FX_DWORD*)(dest_scan + dest_pos) = reset_argb;
-        }
-      }
-    }
-    return;
+    DownSampleScanline1Bit(orig_Bpp, dest_Bpp, src_width, pSrcLine, dest_scan,
+                           dest_width, bFlipX, clip_left, clip_width);
   } else if (m_bpc * m_nComponents <= 8) {
-    if (m_bpc < 8) {
-      int src_bit_pos = 0;
-      for (FX_DWORD col = 0; col < src_width; col++) {
-        int color_index = 0;
-        for (FX_DWORD color = 0; color < m_nComponents; color++) {
-          int data = _GetBits8(pSrcLine, src_bit_pos, m_bpc);
-          color_index |= data << (color * m_bpc);
-          src_bit_pos += m_bpc;
-        }
-        m_pLineBuf[col] = color_index;
-      }
-      pSrcLine = m_pLineBuf;
+    DownSampleScanline8Bit(orig_Bpp, dest_Bpp, src_width, pSrcLine, dest_scan,
+                           dest_width, bFlipX, clip_left, clip_width);
+  } else {
+    DownSampleScanline32Bit(orig_Bpp, dest_Bpp, src_width, pSrcLine, dest_scan,
+                            dest_width, bFlipX, clip_left, clip_width);
+  }
+}
+
+void CPDF_DIBSource::DownSampleScanline1Bit(int orig_Bpp,
+                                            int dest_Bpp,
+                                            FX_DWORD src_width,
+                                            const uint8_t* pSrcLine,
+                                            uint8_t* dest_scan,
+                                            int dest_width,
+                                            FX_BOOL bFlipX,
+                                            int clip_left,
+                                            int clip_width) const {
+  FX_DWORD set_argb = (FX_DWORD)-1;
+  FX_DWORD reset_argb = 0;
+  if (m_bImageMask) {
+    if (m_bDefaultDecode) {
+      set_argb = 0;
+      reset_argb = (FX_DWORD)-1;
     }
-    if (m_bColorKey) {
-      for (int i = 0; i < clip_width; i++) {
-        FX_DWORD src_x = (clip_left + i) * src_width / dest_width;
-        if (bFlipX) {
-          src_x = src_width - src_x - 1;
-        }
-        src_x %= src_width;
-        uint8_t* pDestPixel = dest_scan + i * 4;
-        uint8_t index = pSrcLine[src_x];
-        if (m_pPalette) {
-          *pDestPixel++ = FXARGB_B(m_pPalette[index]);
-          *pDestPixel++ = FXARGB_G(m_pPalette[index]);
-          *pDestPixel++ = FXARGB_R(m_pPalette[index]);
-        } else {
-          *pDestPixel++ = index;
-          *pDestPixel++ = index;
-          *pDestPixel++ = index;
-        }
-        *pDestPixel = (index < m_pCompData[0].m_ColorKeyMin ||
-                       index > m_pCompData[0].m_ColorKeyMax)
-                          ? 0xff
-                          : 0;
-      }
-      return;
+  } else if (m_bColorKey) {
+    reset_argb = m_pPalette ? m_pPalette[0] : 0xFF000000;
+    set_argb = m_pPalette ? m_pPalette[1] : 0xFFFFFFFF;
+    if (m_pCompData[0].m_ColorKeyMin == 0) {
+      reset_argb = 0;
     }
+    if (m_pCompData[0].m_ColorKeyMax == 1) {
+      set_argb = 0;
+    }
+    set_argb = FXARGB_TODIB(set_argb);
+    reset_argb = FXARGB_TODIB(reset_argb);
     for (int i = 0; i < clip_width; i++) {
       FX_DWORD src_x = (clip_left + i) * src_width / dest_width;
       if (bFlipX) {
         src_x = src_width - src_x - 1;
       }
       src_x %= src_width;
-      uint8_t index = pSrcLine[src_x];
-      if (dest_Bpp == 1) {
-        dest_scan[i] = index;
+      if (pSrcLine[src_x / 8] & (1 << (7 - src_x % 8))) {
+        ((FX_DWORD*)dest_scan)[i] = set_argb;
       } else {
-        int dest_pos = i * dest_Bpp;
-        FX_ARGB argb = m_pPalette[index];
-        dest_scan[dest_pos] = FXARGB_B(argb);
-        dest_scan[dest_pos + 1] = FXARGB_G(argb);
-        dest_scan[dest_pos + 2] = FXARGB_R(argb);
+        ((FX_DWORD*)dest_scan)[i] = reset_argb;
       }
     }
     return;
   } else {
-    int last_src_x = -1;
-    FX_ARGB last_argb;
-    FX_FLOAT orig_Not8Bpp = (FX_FLOAT)m_bpc * (FX_FLOAT)m_nComponents / 8.0f;
-    FX_FLOAT unit_To8Bpc = 255.0f / ((1 << m_bpc) - 1);
-    for (int i = 0; i < clip_width; i++) {
-      int dest_x = clip_left + i;
-      FX_DWORD src_x = (bFlipX ? (dest_width - dest_x - 1) : dest_x) *
-                       (int64_t)src_width / dest_width;
-      src_x %= src_width;
-      const uint8_t* pSrcPixel = NULL;
-      if (m_bpc % 8 == 0) {
-        pSrcPixel = pSrcLine + src_x * orig_Bpp;
+    if (dest_Bpp == 1) {
+    } else if (m_pPalette) {
+      reset_argb = m_pPalette[0];
+      set_argb = m_pPalette[1];
+    }
+  }
+  for (int i = 0; i < clip_width; i++) {
+    FX_DWORD src_x = (clip_left + i) * src_width / dest_width;
+    if (bFlipX) {
+      src_x = src_width - src_x - 1;
+    }
+    src_x %= src_width;
+    int dest_pos = i * dest_Bpp;
+    if (pSrcLine[src_x / 8] & (1 << (7 - src_x % 8))) {
+      if (dest_Bpp == 1) {
+        dest_scan[dest_pos] = (uint8_t)set_argb;
+      } else if (dest_Bpp == 3) {
+        dest_scan[dest_pos] = FXARGB_B(set_argb);
+        dest_scan[dest_pos + 1] = FXARGB_G(set_argb);
+        dest_scan[dest_pos + 2] = FXARGB_R(set_argb);
       } else {
-        pSrcPixel = pSrcLine + (int)(src_x * orig_Not8Bpp);
+        *(FX_DWORD*)(dest_scan + dest_pos) = set_argb;
       }
-      uint8_t* pDestPixel = dest_scan + i * dest_Bpp;
-      FX_ARGB argb;
-      if (src_x == last_src_x) {
-        argb = last_argb;
+    } else {
+      if (dest_Bpp == 1) {
+        dest_scan[dest_pos] = (uint8_t)reset_argb;
+      } else if (dest_Bpp == 3) {
+        dest_scan[dest_pos] = FXARGB_B(reset_argb);
+        dest_scan[dest_pos + 1] = FXARGB_G(reset_argb);
+        dest_scan[dest_pos + 2] = FXARGB_R(reset_argb);
       } else {
-        if (m_pColorSpace) {
-          uint8_t color[4];
-          if (!m_bDefaultDecode) {
-            for (int i = 0; i < m_nComponents; i++) {
-              int color_value =
-                  (int)((m_pCompData[i].m_DecodeMin +
-                         m_pCompData[i].m_DecodeStep * (FX_FLOAT)pSrcPixel[i]) *
-                            255.0f +
-                        0.5f);
-              temp[i] =
-                  color_value > 255 ? 255 : (color_value < 0 ? 0 : color_value);
-            }
-            m_pColorSpace->TranslateImageLine(
-                color, temp, 1, 0, 0, m_bLoadMask &&
-                                          m_GroupFamily == PDFCS_DEVICECMYK &&
-                                          m_Family == PDFCS_DEVICECMYK);
-          } else {
-            if (m_bpc < 8) {
-              int src_bit_pos = 0;
-              if (src_x % 2) {
-                src_bit_pos = 4;
-              }
-              for (FX_DWORD i = 0; i < m_nComponents; i++) {
-                temp[i] = (uint8_t)(_GetBits8(pSrcPixel, src_bit_pos, m_bpc) *
-                                    unit_To8Bpc);
-                src_bit_pos += m_bpc;
-              }
-              m_pColorSpace->TranslateImageLine(
-                  color, temp, 1, 0, 0, m_bLoadMask &&
-                                            m_GroupFamily == PDFCS_DEVICECMYK &&
-                                            m_Family == PDFCS_DEVICECMYK);
-            } else {
-              m_pColorSpace->TranslateImageLine(
-                  color, pSrcPixel, 1, 0, 0,
-                  m_bLoadMask && m_GroupFamily == PDFCS_DEVICECMYK &&
-                      m_Family == PDFCS_DEVICECMYK);
-            }
-          }
-          argb = FXARGB_MAKE(0xff, color[2], color[1], color[0]);
-        } else {
-          argb = FXARGB_MAKE(0xff, pSrcPixel[2], pSrcPixel[1], pSrcPixel[0]);
-        }
-        if (m_bColorKey) {
-          int alpha = 0xff;
-          if (m_nComponents == 3 && m_bpc == 8) {
-            alpha = (pSrcPixel[0] < m_pCompData[0].m_ColorKeyMin ||
-                     pSrcPixel[0] > m_pCompData[0].m_ColorKeyMax ||
-                     pSrcPixel[1] < m_pCompData[1].m_ColorKeyMin ||
-                     pSrcPixel[1] > m_pCompData[1].m_ColorKeyMax ||
-                     pSrcPixel[2] < m_pCompData[2].m_ColorKeyMin ||
-                     pSrcPixel[2] > m_pCompData[2].m_ColorKeyMax)
-                        ? 0xff
-                        : 0;
-          }
-          argb &= 0xffffff;
-          argb |= alpha << 24;
-        }
-        last_src_x = src_x;
-        last_argb = argb;
-      }
-      if (dest_Bpp == 4) {
-        *(FX_DWORD*)pDestPixel = FXARGB_TODIB(argb);
-      } else {
-        *pDestPixel++ = FXARGB_B(argb);
-        *pDestPixel++ = FXARGB_G(argb);
-        *pDestPixel = FXARGB_R(argb);
+        *(FX_DWORD*)(dest_scan + dest_pos) = reset_argb;
       }
     }
   }
 }
+
+void CPDF_DIBSource::DownSampleScanline8Bit(int orig_Bpp,
+                                            int dest_Bpp,
+                                            FX_DWORD src_width,
+                                            const uint8_t* pSrcLine,
+                                            uint8_t* dest_scan,
+                                            int dest_width,
+                                            FX_BOOL bFlipX,
+                                            int clip_left,
+                                            int clip_width) const {
+  if (m_bpc < 8) {
+    int src_bit_pos = 0;
+    for (FX_DWORD col = 0; col < src_width; col++) {
+      int color_index = 0;
+      for (FX_DWORD color = 0; color < m_nComponents; color++) {
+        int data = _GetBits8(pSrcLine, src_bit_pos, m_bpc);
+        color_index |= data << (color * m_bpc);
+        src_bit_pos += m_bpc;
+      }
+      m_pLineBuf[col] = color_index;
+    }
+    pSrcLine = m_pLineBuf;
+  }
+  if (m_bColorKey) {
+    for (int i = 0; i < clip_width; i++) {
+      FX_DWORD src_x = (clip_left + i) * src_width / dest_width;
+      if (bFlipX) {
+        src_x = src_width - src_x - 1;
+      }
+      src_x %= src_width;
+      uint8_t* pDestPixel = dest_scan + i * 4;
+      uint8_t index = pSrcLine[src_x];
+      if (m_pPalette) {
+        *pDestPixel++ = FXARGB_B(m_pPalette[index]);
+        *pDestPixel++ = FXARGB_G(m_pPalette[index]);
+        *pDestPixel++ = FXARGB_R(m_pPalette[index]);
+      } else {
+        *pDestPixel++ = index;
+        *pDestPixel++ = index;
+        *pDestPixel++ = index;
+      }
+      *pDestPixel = (index < m_pCompData[0].m_ColorKeyMin ||
+                     index > m_pCompData[0].m_ColorKeyMax)
+                        ? 0xFF
+                        : 0;
+    }
+    return;
+  }
+  for (int i = 0; i < clip_width; i++) {
+    FX_DWORD src_x = (clip_left + i) * src_width / dest_width;
+    if (bFlipX) {
+      src_x = src_width - src_x - 1;
+    }
+    src_x %= src_width;
+    uint8_t index = pSrcLine[src_x];
+    if (dest_Bpp == 1) {
+      dest_scan[i] = index;
+    } else {
+      int dest_pos = i * dest_Bpp;
+      FX_ARGB argb = m_pPalette[index];
+      dest_scan[dest_pos] = FXARGB_B(argb);
+      dest_scan[dest_pos + 1] = FXARGB_G(argb);
+      dest_scan[dest_pos + 2] = FXARGB_R(argb);
+    }
+  }
+}
+
+void CPDF_DIBSource::DownSampleScanline32Bit(int orig_Bpp,
+                                             int dest_Bpp,
+                                             FX_DWORD src_width,
+                                             const uint8_t* pSrcLine,
+                                             uint8_t* dest_scan,
+                                             int dest_width,
+                                             FX_BOOL bFlipX,
+                                             int clip_left,
+                                             int clip_width) const {
+  int last_src_x = -1;
+  FX_ARGB last_argb = FXARGB_MAKE(0xFF, 0xFF, 0xFF, 0xFF);
+  FX_FLOAT orig_Not8Bpp = (FX_FLOAT)m_bpc * (FX_FLOAT)m_nComponents / 8.0f;
+  FX_FLOAT unit_To8Bpc = 255.0f / ((1 << m_bpc) - 1);
+  for (int i = 0; i < clip_width; i++) {
+    int dest_x = clip_left + i;
+    FX_DWORD src_x = (bFlipX ? (dest_width - dest_x - 1) : dest_x) *
+                     (int64_t)src_width / dest_width;
+    src_x %= src_width;
+    const uint8_t* pSrcPixel = nullptr;
+    if (m_bpc % 8 == 0) {
+      pSrcPixel = pSrcLine + src_x * orig_Bpp;
+    } else {
+      pSrcPixel = pSrcLine + (int)(src_x * orig_Not8Bpp);
+    }
+    uint8_t* pDestPixel = dest_scan + i * dest_Bpp;
+    FX_ARGB argb;
+    if (src_x == last_src_x) {
+      argb = last_argb;
+    } else {
+      if (m_pColorSpace) {
+        CFX_FixedBufGrow<uint8_t, 128> temp(orig_Bpp);
+        uint8_t color[4];
+        const FX_BOOL bTransMask = TransMask();
+        if (m_bDefaultDecode) {
+          if (m_bpc < 8) {
+            int src_bit_pos = 0;
+            if (src_x % 2) {
+              src_bit_pos = 4;
+            }
+            for (FX_DWORD j = 0; j < m_nComponents; ++j) {
+              temp[j] = (uint8_t)(_GetBits8(pSrcPixel, src_bit_pos, m_bpc) *
+                                  unit_To8Bpc);
+              src_bit_pos += m_bpc;
+            }
+            m_pColorSpace->TranslateImageLine(color, temp, 1, 0, 0, bTransMask);
+          } else {
+            m_pColorSpace->TranslateImageLine(color, pSrcPixel, 1, 0, 0,
+                                              bTransMask);
+          }
+        } else {
+          for (int j = 0; j < m_nComponents; ++j) {
+            int color_value =
+                (int)((m_pCompData[j].m_DecodeMin +
+                       m_pCompData[j].m_DecodeStep * (FX_FLOAT)pSrcPixel[j]) *
+                          255.0f +
+                      0.5f);
+            temp[j] =
+                color_value > 255 ? 255 : (color_value < 0 ? 0 : color_value);
+          }
+          m_pColorSpace->TranslateImageLine(color, temp, 1, 0, 0, bTransMask);
+        }
+        argb = FXARGB_MAKE(0xFF, color[2], color[1], color[0]);
+      } else {
+        argb = FXARGB_MAKE(0xFf, pSrcPixel[2], pSrcPixel[1], pSrcPixel[0]);
+      }
+      if (m_bColorKey) {
+        int alpha = 0xFF;
+        if (m_nComponents == 3 && m_bpc == 8) {
+          alpha = (pSrcPixel[0] < m_pCompData[0].m_ColorKeyMin ||
+                   pSrcPixel[0] > m_pCompData[0].m_ColorKeyMax ||
+                   pSrcPixel[1] < m_pCompData[1].m_ColorKeyMin ||
+                   pSrcPixel[1] > m_pCompData[1].m_ColorKeyMax ||
+                   pSrcPixel[2] < m_pCompData[2].m_ColorKeyMin ||
+                   pSrcPixel[2] > m_pCompData[2].m_ColorKeyMax)
+                      ? 0xFF
+                      : 0;
+        }
+        argb &= 0xFFFFFF;
+        argb |= alpha << 24;
+      }
+      last_src_x = src_x;
+      last_argb = argb;
+    }
+    if (dest_Bpp == 4) {
+      *(FX_DWORD*)pDestPixel = FXARGB_TODIB(argb);
+    } else {
+      *pDestPixel++ = FXARGB_B(argb);
+      *pDestPixel++ = FXARGB_G(argb);
+      *pDestPixel = FXARGB_R(argb);
+    }
+  }
+}
+
+FX_BOOL CPDF_DIBSource::TransMask() const {
+  return m_bLoadMask && m_GroupFamily == PDFCS_DEVICECMYK &&
+         m_Family == PDFCS_DEVICECMYK;
+}
+
 void CPDF_DIBSource::SetDownSampleSize(int dest_width, int dest_height) const {
   if (m_pDecoder) {
     m_pDecoder->DownScale(dest_width, dest_height);
@@ -1525,11 +1557,13 @@
     ((CPDF_DIBSource*)this)->m_Height = m_pDecoder->GetHeight();
   }
 }
+
 void CPDF_DIBSource::ClearImageData() {
   if (m_pDecoder) {
     m_pDecoder->ClearImageData();
   }
 }
+
 CPDF_ProgressiveImageLoaderHandle::CPDF_ProgressiveImageLoaderHandle() {
   m_pImageLoader = NULL;
   m_pCache = NULL;
diff --git a/core/src/fpdfapi/fpdf_render/render_int.h b/core/src/fpdfapi/fpdf_render/render_int.h
index e195472..4f86996 100644
--- a/core/src/fpdfapi/fpdf_render/render_int.h
+++ b/core/src/fpdfapi/fpdf_render/render_int.h
@@ -527,7 +527,6 @@
   void ReleaseBitmap(CFX_DIBitmap*) const;
   void ClearImageData();
 
- public:
   int StartLoadDIBSource(CPDF_Document* pDoc,
                          const CPDF_Stream* pStream,
                          FX_BOOL bHasMask,
@@ -551,7 +550,7 @@
   CPDF_Object* m_pMaskStream;
   FX_BOOL m_bHasMask;
 
- protected:
+ private:
   FX_BOOL LoadColorInfo(CPDF_Dictionary* pFormResources,
                         CPDF_Dictionary* pPageResources);
   DIB_COMP_DATA* GetDecodeAndMaskArray(FX_BOOL& bDefaultDecode,
@@ -564,6 +563,35 @@
   void TranslateScanline24bpp(uint8_t* dest_scan,
                               const uint8_t* src_scan) const;
   void ValidateDictParam();
+  void DownSampleScanline1Bit(int orig_Bpp,
+                              int dest_Bpp,
+                              FX_DWORD src_width,
+                              const uint8_t* pSrcLine,
+                              uint8_t* dest_scan,
+                              int dest_width,
+                              FX_BOOL bFlipX,
+                              int clip_left,
+                              int clip_width) const;
+  void DownSampleScanline8Bit(int orig_Bpp,
+                              int dest_Bpp,
+                              FX_DWORD src_width,
+                              const uint8_t* pSrcLine,
+                              uint8_t* dest_scan,
+                              int dest_width,
+                              FX_BOOL bFlipX,
+                              int clip_left,
+                              int clip_width) const;
+  void DownSampleScanline32Bit(int orig_Bpp,
+                               int dest_Bpp,
+                               FX_DWORD src_width,
+                               const uint8_t* pSrcLine,
+                               uint8_t* dest_scan,
+                               int dest_width,
+                               FX_BOOL bFlipX,
+                               int clip_left,
+                               int clip_width) const;
+  FX_BOOL TransMask() const;
+
   CPDF_Document* m_pDocument;
   const CPDF_Stream* m_pStream;
   CPDF_StreamAcc* m_pStreamAcc;
diff --git a/core/src/fxge/ge/fx_ge_fontmap.cpp b/core/src/fxge/ge/fx_ge_fontmap.cpp
index 561b7d9..d8f2046 100644
--- a/core/src/fxge/ge/fx_ge_fontmap.cpp
+++ b/core/src/fxge/ge/fx_ge_fontmap.cpp
@@ -1435,13 +1435,11 @@
     }
   }
   FX_DWORD datasize = 0;
-  FX_DWORD offset;
+  FX_DWORD offset = 0;
   if (table == 0) {
     datasize = pFont->m_FontOffset ? 0 : pFont->m_FileSize;
-    offset = 0;
   } else if (table == 0x74746366) {
     datasize = pFont->m_FontOffset ? pFont->m_FileSize : 0;
-    offset = 0;
   } else {
     FX_DWORD nTables = pFont->m_FontTables.GetLength() / 16;
     for (FX_DWORD i = 0; i < nTables; i++) {