diff --git a/core/fxcrt/cfx_memorystream.cpp b/core/fxcrt/cfx_memorystream.cpp
index 0115e37..8073d37 100644
--- a/core/fxcrt/cfx_memorystream.cpp
+++ b/core/fxcrt/cfx_memorystream.cpp
@@ -12,30 +12,28 @@
 
 namespace {
 
-const int32_t kBlockSize = 64 * 1024;
+constexpr size_t kBlockSize = 64 * 1024;
 
 }  // namespace
 
 CFX_MemoryStream::CFX_MemoryStream(bool bConsecutive)
     : m_nTotalSize(0),
       m_nCurSize(0),
-      m_nCurPos(0),
-      m_nGrowSize(kBlockSize),
-      m_dwFlags(Type::kTakeOver | (bConsecutive ? Type::kConsecutive : 0)) {}
+      m_bConsecutive(bConsecutive),
+      m_bTakeOver(true) {}
 
 CFX_MemoryStream::CFX_MemoryStream(uint8_t* pBuffer,
                                    size_t nSize,
                                    bool bTakeOver)
     : m_nTotalSize(nSize),
       m_nCurSize(nSize),
-      m_nCurPos(0),
-      m_nGrowSize(kBlockSize),
-      m_dwFlags(Type::kConsecutive | (bTakeOver ? Type::kTakeOver : 0)) {
+      m_bConsecutive(true),
+      m_bTakeOver(bTakeOver) {
   m_Blocks.push_back(pBuffer);
 }
 
 CFX_MemoryStream::~CFX_MemoryStream() {
-  if (m_dwFlags & Type::kTakeOver) {
+  if (m_bTakeOver) {
     for (uint8_t* pBlock : m_Blocks)
       FX_Free(pBlock);
   }
@@ -71,15 +69,15 @@
   }
 
   m_nCurPos = newPos.ValueOrDie();
-  if (m_dwFlags & Type::kConsecutive) {
+  if (m_bConsecutive) {
     memcpy(buffer, m_Blocks[0] + static_cast<size_t>(offset), size);
     return true;
   }
 
-  size_t nStartBlock = static_cast<size_t>(offset) / m_nGrowSize;
-  offset -= static_cast<FX_FILESIZE>(nStartBlock * m_nGrowSize);
+  size_t nStartBlock = static_cast<size_t>(offset) / kBlockSize;
+  offset -= static_cast<FX_FILESIZE>(nStartBlock * kBlockSize);
   while (size) {
-    size_t nRead = std::min(size, m_nGrowSize - static_cast<size_t>(offset));
+    size_t nRead = std::min(size, kBlockSize - static_cast<size_t>(offset));
     memcpy(buffer, m_Blocks[nStartBlock] + offset, nRead);
     buffer = static_cast<uint8_t*>(buffer) + nRead;
     size -= nRead;
@@ -106,7 +104,7 @@
   if (!buffer || !size)
     return false;
 
-  if (m_dwFlags & Type::kConsecutive) {
+  if (m_bConsecutive) {
     FX_SAFE_SIZE_T newPos = size;
     newPos += offset;
     if (!newPos.IsValid())
@@ -114,7 +112,7 @@
 
     m_nCurPos = newPos.ValueOrDie();
     if (m_nCurPos > m_nTotalSize) {
-      m_nTotalSize = (m_nCurPos + m_nGrowSize - 1) / m_nGrowSize * m_nGrowSize;
+      m_nTotalSize = (m_nCurPos + kBlockSize - 1) / kBlockSize * kBlockSize;
       if (m_Blocks.empty())
         m_Blocks.push_back(FX_Alloc(uint8_t, m_nTotalSize));
       else
@@ -135,10 +133,10 @@
     return false;
 
   m_nCurPos = newPos.ValueOrDie();
-  size_t nStartBlock = static_cast<size_t>(offset) / m_nGrowSize;
-  offset -= static_cast<FX_FILESIZE>(nStartBlock * m_nGrowSize);
+  size_t nStartBlock = static_cast<size_t>(offset) / kBlockSize;
+  offset -= static_cast<FX_FILESIZE>(nStartBlock * kBlockSize);
   while (size) {
-    size_t nWrite = std::min(size, m_nGrowSize - static_cast<size_t>(offset));
+    size_t nWrite = std::min(size, kBlockSize - static_cast<size_t>(offset));
     memcpy(m_Blocks[nStartBlock] + offset, buffer, nWrite);
     buffer = static_cast<const uint8_t*>(buffer) + nWrite;
     size -= nWrite;
@@ -161,12 +159,12 @@
   if (size <= m_nTotalSize)
     return true;
 
-  size = (size - m_nTotalSize + m_nGrowSize - 1) / m_nGrowSize;
+  size = (size - m_nTotalSize + kBlockSize - 1) / kBlockSize;
   size_t iCount = m_Blocks.size();
   m_Blocks.resize(iCount + size);
   while (size--) {
-    m_Blocks[iCount++] = FX_Alloc(uint8_t, m_nGrowSize);
-    m_nTotalSize += m_nGrowSize;
+    m_Blocks[iCount++] = FX_Alloc(uint8_t, kBlockSize);
+    m_nTotalSize += kBlockSize;
   }
   return true;
 }
diff --git a/core/fxcrt/cfx_memorystream.h b/core/fxcrt/cfx_memorystream.h
index 64ea2cd..3726b89 100644
--- a/core/fxcrt/cfx_memorystream.h
+++ b/core/fxcrt/cfx_memorystream.h
@@ -14,8 +14,6 @@
 
 class CFX_MemoryStream : public IFX_SeekableStream {
  public:
-  enum Type { kConsecutive = 1 << 0, kTakeOver = 1 << 1 };
-
   template <typename T, typename... Args>
   friend RetainPtr<T> pdfium::MakeRetain(Args&&... args);
 
@@ -31,9 +29,7 @@
   // Sets the cursor position to |pos| if possible
   bool Seek(size_t pos);
 
-  bool IsConsecutive() const { return !!(m_dwFlags & Type::kConsecutive); }
-
-  uint8_t* GetBuffer() const {
+  uint8_t* GetBuffer() {
     return !m_Blocks.empty() ? m_Blocks.front() : nullptr;
   }
 
@@ -47,9 +43,9 @@
   std::vector<uint8_t*> m_Blocks;
   size_t m_nTotalSize;
   size_t m_nCurSize;
-  size_t m_nCurPos;
-  size_t m_nGrowSize;
-  uint32_t m_dwFlags;
+  size_t m_nCurPos = 0;
+  const bool m_bConsecutive;
+  const bool m_bTakeOver;  // Owns the data in |m_Blocks|.
 };
 
 #endif  // CORE_FXCRT_CFX_MEMORYSTREAM_H_
