Cleanup the fx_extension code.

This CL cleans up the fx_extension file. The stream code was moved to
fx_stream. IFX_FileAccess was removed and CFX_CRTFileAccess split to its
own file. Code shuffled from header to cpp file.

Change-Id: I700fdfcc9797cf4e8050cd9ba010ad8854feefbf
Reviewed-on: https://pdfium-review.googlesource.com/4371
Reviewed-by: Nicolás Peña <npm@chromium.org>
Commit-Queue: dsinclair <dsinclair@chromium.org>
diff --git a/BUILD.gn b/BUILD.gn
index 9824658..2f81237 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -762,7 +762,6 @@
     "core/fxcrt/cfx_weak_ptr.h",
     "core/fxcrt/cfx_widestring.cpp",
     "core/fxcrt/cfx_widestring.h",
-    "core/fxcrt/extension.h",
     "core/fxcrt/fx_basic.h",
     "core/fxcrt/fx_basic_buffer.cpp",
     "core/fxcrt/fx_basic_coords.cpp",
@@ -774,10 +773,11 @@
     "core/fxcrt/fx_bidi.h",
     "core/fxcrt/fx_codepage.h",
     "core/fxcrt/fx_coordinates.h",
-    "core/fxcrt/fx_ext.h",
     "core/fxcrt/fx_extension.cpp",
+    "core/fxcrt/fx_extension.h",
     "core/fxcrt/fx_memory.h",
     "core/fxcrt/fx_safe_types.h",
+    "core/fxcrt/fx_stream.cpp",
     "core/fxcrt/fx_stream.h",
     "core/fxcrt/fx_string.h",
     "core/fxcrt/fx_system.h",
@@ -789,6 +789,7 @@
     "core/fxcrt/fxcrt_stream.cpp",
     "core/fxcrt/fxcrt_windows.cpp",
     "core/fxcrt/fxcrt_windows.h",
+    "core/fxcrt/ifxcrt_fileaccess.h",
     "core/fxcrt/xml/cxml_attritem.cpp",
     "core/fxcrt/xml/cxml_attritem.h",
     "core/fxcrt/xml/cxml_attrmap.cpp",
@@ -821,6 +822,8 @@
       "core/fxcrt/cfx_chariter.h",
       "core/fxcrt/cfx_checksumcontext.cpp",
       "core/fxcrt/cfx_checksumcontext.h",
+      "core/fxcrt/cfx_crtfileaccess.cpp",
+      "core/fxcrt/cfx_crtfileaccess.h",
       "core/fxcrt/cfx_datetime.cpp",
       "core/fxcrt/cfx_datetime.h",
       "core/fxcrt/cfx_decimal.cpp",
diff --git a/core/fpdfapi/edit/fpdf_edit_create.cpp b/core/fpdfapi/edit/fpdf_edit_create.cpp
index 38b7565..24ec0d7 100644
--- a/core/fpdfapi/edit/fpdf_edit_create.cpp
+++ b/core/fpdfapi/edit/fpdf_edit_create.cpp
@@ -25,7 +25,7 @@
 #include "core/fpdfapi/parser/fpdf_parser_decode.h"
 #include "core/fpdfapi/parser/fpdf_parser_utility.h"
 #include "core/fxcrt/cfx_maybe_owned.h"
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 #include "third_party/base/ptr_util.h"
 #include "third_party/base/stl_util.h"
 
diff --git a/core/fpdfapi/font/fpdf_font.cpp b/core/fpdfapi/font/fpdf_font.cpp
index a5616ea..6c48098 100644
--- a/core/fpdfapi/font/fpdf_font.cpp
+++ b/core/fpdfapi/font/fpdf_font.cpp
@@ -20,7 +20,7 @@
 #include "core/fpdfapi/parser/cpdf_number.h"
 #include "core/fpdfapi/parser/cpdf_simple_parser.h"
 #include "core/fpdfapi/parser/cpdf_stream_acc.h"
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 #include "core/fxcrt/fx_safe_types.h"
 #include "core/fxge/fx_freetype.h"
 #include "third_party/base/numerics/safe_conversions.h"
diff --git a/core/fpdfapi/font/fpdf_font_cid.cpp b/core/fpdfapi/font/fpdf_font_cid.cpp
index 434fe62..51e7957 100644
--- a/core/fpdfapi/font/fpdf_font_cid.cpp
+++ b/core/fpdfapi/font/fpdf_font_cid.cpp
@@ -16,7 +16,7 @@
 #include "core/fpdfapi/parser/cpdf_array.h"
 #include "core/fpdfapi/parser/cpdf_dictionary.h"
 #include "core/fpdfapi/parser/cpdf_simple_parser.h"
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 #include "core/fxge/fx_freetype.h"
 #include "third_party/base/logging.h"
 #include "third_party/base/stl_util.h"
diff --git a/core/fpdfapi/page/cpdf_streamparser.cpp b/core/fpdfapi/page/cpdf_streamparser.cpp
index e0c6e25..76b58c9 100644
--- a/core/fpdfapi/page/cpdf_streamparser.cpp
+++ b/core/fpdfapi/page/cpdf_streamparser.cpp
@@ -25,7 +25,7 @@
 #include "core/fpdfapi/parser/fpdf_parser_decode.h"
 #include "core/fpdfapi/parser/fpdf_parser_utility.h"
 #include "core/fxcodec/fx_codec.h"
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 
 namespace {
 
diff --git a/core/fpdfapi/parser/cpdf_data_avail.cpp b/core/fpdfapi/parser/cpdf_data_avail.cpp
index 0d6154a..f99cb46 100644
--- a/core/fpdfapi/parser/cpdf_data_avail.cpp
+++ b/core/fpdfapi/parser/cpdf_data_avail.cpp
@@ -21,7 +21,7 @@
 #include "core/fpdfapi/parser/cpdf_reference.h"
 #include "core/fpdfapi/parser/cpdf_stream.h"
 #include "core/fpdfapi/parser/fpdf_parser_utility.h"
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 #include "core/fxcrt/fx_safe_types.h"
 #include "third_party/base/numerics/safe_conversions.h"
 #include "third_party/base/ptr_util.h"
diff --git a/core/fpdfapi/parser/cpdf_parser.cpp b/core/fpdfapi/parser/cpdf_parser.cpp
index f009798..c18a183 100644
--- a/core/fpdfapi/parser/cpdf_parser.cpp
+++ b/core/fpdfapi/parser/cpdf_parser.cpp
@@ -22,7 +22,7 @@
 #include "core/fpdfapi/parser/cpdf_stream_acc.h"
 #include "core/fpdfapi/parser/cpdf_syntax_parser.h"
 #include "core/fpdfapi/parser/fpdf_parser_utility.h"
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 #include "core/fxcrt/fx_safe_types.h"
 #include "third_party/base/ptr_util.h"
 #include "third_party/base/stl_util.h"
diff --git a/core/fpdfapi/parser/cpdf_parser_unittest.cpp b/core/fpdfapi/parser/cpdf_parser_unittest.cpp
index a90477f..bbf707a 100644
--- a/core/fpdfapi/parser/cpdf_parser_unittest.cpp
+++ b/core/fpdfapi/parser/cpdf_parser_unittest.cpp
@@ -8,7 +8,7 @@
 #include "core/fpdfapi/parser/cpdf_parser.h"
 #include "core/fpdfapi/parser/cpdf_syntax_parser.h"
 #include "core/fxcrt/cfx_retain_ptr.h"
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 #include "core/fxcrt/fx_stream.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "testing/utils/path_service.h"
diff --git a/core/fpdfapi/parser/cpdf_syntax_parser.cpp b/core/fpdfapi/parser/cpdf_syntax_parser.cpp
index ecf2cf6..45a5a8a 100644
--- a/core/fpdfapi/parser/cpdf_syntax_parser.cpp
+++ b/core/fpdfapi/parser/cpdf_syntax_parser.cpp
@@ -23,7 +23,7 @@
 #include "core/fpdfapi/parser/cpdf_string.h"
 #include "core/fpdfapi/parser/fpdf_parser_decode.h"
 #include "core/fpdfapi/parser/fpdf_parser_utility.h"
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 #include "third_party/base/numerics/safe_math.h"
 #include "third_party/base/ptr_util.h"
 
diff --git a/core/fpdfapi/parser/cpdf_syntax_parser_unittest.cpp b/core/fpdfapi/parser/cpdf_syntax_parser_unittest.cpp
index 64c33ba..5c7aa60 100644
--- a/core/fpdfapi/parser/cpdf_syntax_parser_unittest.cpp
+++ b/core/fpdfapi/parser/cpdf_syntax_parser_unittest.cpp
@@ -8,7 +8,7 @@
 #include "core/fpdfapi/parser/cpdf_object.h"
 #include "core/fpdfapi/parser/cpdf_parser.h"
 #include "core/fpdfapi/parser/cpdf_syntax_parser.h"
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 #include "core/fxcrt/fx_stream.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "testing/utils/path_service.h"
diff --git a/core/fpdfapi/parser/fpdf_parser_decode.cpp b/core/fpdfapi/parser/fpdf_parser_decode.cpp
index cc8b507..306e6fe 100644
--- a/core/fpdfapi/parser/fpdf_parser_decode.cpp
+++ b/core/fpdfapi/parser/fpdf_parser_decode.cpp
@@ -17,7 +17,7 @@
 #include "core/fpdfapi/parser/cpdf_dictionary.h"
 #include "core/fpdfapi/parser/fpdf_parser_utility.h"
 #include "core/fxcodec/fx_codec.h"
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 #include "third_party/base/stl_util.h"
 
 namespace {
diff --git a/core/fpdfapi/parser/fpdf_parser_utility.cpp b/core/fpdfapi/parser/fpdf_parser_utility.cpp
index d6ea1a2..d953d4c 100644
--- a/core/fpdfapi/parser/fpdf_parser_utility.cpp
+++ b/core/fpdfapi/parser/fpdf_parser_utility.cpp
@@ -15,7 +15,7 @@
 #include "core/fpdfapi/parser/cpdf_stream_acc.h"
 #include "core/fpdfapi/parser/cpdf_string.h"
 #include "core/fpdfapi/parser/fpdf_parser_decode.h"
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 
 // Indexed by 8-bit character code, contains either:
 //   'W' - for whitespace: NUL, TAB, CR, LF, FF, SPACE, 0x80, 0xff
diff --git a/core/fpdftext/cpdf_linkextract.cpp b/core/fpdftext/cpdf_linkextract.cpp
index 47d0754..56a3ab4 100644
--- a/core/fpdftext/cpdf_linkextract.cpp
+++ b/core/fpdftext/cpdf_linkextract.cpp
@@ -9,7 +9,7 @@
 #include <vector>
 
 #include "core/fpdftext/cpdf_textpage.h"
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 #include "core/fxcrt/fx_string.h"
 #include "core/fxcrt/fx_system.h"
 
diff --git a/core/fpdftext/cpdf_textpage.cpp b/core/fpdftext/cpdf_textpage.cpp
index c81d4fa..a1f056c 100644
--- a/core/fpdftext/cpdf_textpage.cpp
+++ b/core/fpdftext/cpdf_textpage.cpp
@@ -20,7 +20,7 @@
 #include "core/fpdfapi/parser/cpdf_string.h"
 #include "core/fpdftext/unicodenormalizationdata.h"
 #include "core/fxcrt/fx_bidi.h"
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 #include "core/fxcrt/fx_ucd.h"
 #include "third_party/base/stl_util.h"
 
diff --git a/core/fxcodec/codec/fx_codec.cpp b/core/fxcodec/codec/fx_codec.cpp
index 900fed2..c47231c 100644
--- a/core/fxcodec/codec/fx_codec.cpp
+++ b/core/fxcodec/codec/fx_codec.cpp
@@ -12,7 +12,7 @@
 #include <utility>
 
 #include "core/fxcodec/codec/codec_int.h"
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 #include "core/fxcrt/fx_safe_types.h"
 #include "third_party/base/logging.h"
 #include "third_party/base/ptr_util.h"
diff --git a/core/fxcodec/codec/fx_codec_flate.cpp b/core/fxcodec/codec/fx_codec_flate.cpp
index 3747b20..5af3e99 100644
--- a/core/fxcodec/codec/fx_codec_flate.cpp
+++ b/core/fxcodec/codec/fx_codec_flate.cpp
@@ -12,7 +12,7 @@
 #include <vector>
 
 #include "core/fxcodec/fx_codec.h"
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 #include "third_party/base/numerics/safe_conversions.h"
 #include "third_party/base/ptr_util.h"
 
diff --git a/core/fxcrt/cfx_crtfileaccess.cpp b/core/fxcrt/cfx_crtfileaccess.cpp
new file mode 100644
index 0000000..ddca68e
--- /dev/null
+++ b/core/fxcrt/cfx_crtfileaccess.cpp
@@ -0,0 +1,17 @@
+// Copyright 2017 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "core/fxcrt/cfx_crtfileaccess.h"
+
+CFX_CRTFileAccess::CFX_CRTFileAccess(const CFX_WideStringC& wsPath)
+    : m_path(wsPath) {}
+
+CFX_CRTFileAccess::~CFX_CRTFileAccess() {}
+
+CFX_RetainPtr<IFX_SeekableStream> CFX_CRTFileAccess::CreateFileStream(
+    uint32_t dwModes) {
+  return IFX_SeekableStream::CreateFromFilename(m_path.c_str(), dwModes);
+}
diff --git a/core/fxcrt/cfx_crtfileaccess.h b/core/fxcrt/cfx_crtfileaccess.h
new file mode 100644
index 0000000..cb2a034
--- /dev/null
+++ b/core/fxcrt/cfx_crtfileaccess.h
@@ -0,0 +1,28 @@
+// Copyright 2017 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef CORE_FXCRT_CFX_CRTFILEACCESS_H_
+#define CORE_FXCRT_CFX_CRTFILEACCESS_H_
+
+#include "core/fxcrt/cfx_retain_ptr.h"
+#include "core/fxcrt/fx_stream.h"
+#include "core/fxcrt/fx_string.h"
+
+class CFX_CRTFileAccess : public CFX_Retainable {
+ public:
+  template <typename T, typename... Args>
+  friend CFX_RetainPtr<T> pdfium::MakeRetain(Args&&... args);
+
+  CFX_RetainPtr<IFX_SeekableStream> CreateFileStream(uint32_t dwModes);
+
+ private:
+  explicit CFX_CRTFileAccess(const CFX_WideStringC& wsPath);
+  ~CFX_CRTFileAccess() override;
+
+  CFX_WideString m_path;
+};
+
+#endif  // CORE_FXCRT_CFX_CRTFILEACCESS_H_
diff --git a/core/fxcrt/cfx_seekablestreamproxy.cpp b/core/fxcrt/cfx_seekablestreamproxy.cpp
index fe6b8dd..8be2e08 100644
--- a/core/fxcrt/cfx_seekablestreamproxy.cpp
+++ b/core/fxcrt/cfx_seekablestreamproxy.cpp
@@ -18,7 +18,7 @@
 #include <vector>
 
 #include "core/fxcrt/fx_codepage.h"
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 #include "third_party/base/ptr_util.h"
 #include "third_party/base/stl_util.h"
 
diff --git a/core/fxcrt/cfx_widestring.cpp b/core/fxcrt/cfx_widestring.cpp
index c9a89fe..2b98ce5 100644
--- a/core/fxcrt/cfx_widestring.cpp
+++ b/core/fxcrt/cfx_widestring.cpp
@@ -13,7 +13,7 @@
 
 #include "core/fxcrt/cfx_string_pool_template.h"
 #include "core/fxcrt/fx_basic.h"
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 #include "core/fxcrt/fx_safe_types.h"
 #include "third_party/base/numerics/safe_math.h"
 #include "third_party/base/stl_util.h"
diff --git a/core/fxcrt/fx_basic_coords.cpp b/core/fxcrt/fx_basic_coords.cpp
index 71a15c0..f4f369a 100644
--- a/core/fxcrt/fx_basic_coords.cpp
+++ b/core/fxcrt/fx_basic_coords.cpp
@@ -8,7 +8,7 @@
 #include <limits>
 
 #include "core/fxcrt/fx_coordinates.h"
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 
 namespace {
 
diff --git a/core/fxcrt/fx_basic_gcc.cpp b/core/fxcrt/fx_basic_gcc.cpp
index 2033265..c42b762 100644
--- a/core/fxcrt/fx_basic_gcc.cpp
+++ b/core/fxcrt/fx_basic_gcc.cpp
@@ -8,7 +8,7 @@
 #include <cwctype>
 #include <limits>
 
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 #include "core/fxcrt/fx_string.h"
 
 template <typename IntType, typename CharType>
diff --git a/core/fxcrt/fx_basic_util.cpp b/core/fxcrt/fx_basic_util.cpp
index 58d54a3..ee3e9e7 100644
--- a/core/fxcrt/fx_basic_util.cpp
+++ b/core/fxcrt/fx_basic_util.cpp
@@ -10,7 +10,7 @@
 #include <memory>
 
 #include "core/fxcrt/fx_basic.h"
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 #include "third_party/base/ptr_util.h"
 
 bool FX_atonum(const CFX_ByteStringC& strc, void* pData) {
diff --git a/core/fxcrt/fx_extension.cpp b/core/fxcrt/fx_extension.cpp
index f3e72fd..47bd937 100644
--- a/core/fxcrt/fx_extension.cpp
+++ b/core/fxcrt/fx_extension.cpp
@@ -4,16 +4,7 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#include "core/fxcrt/extension.h"
-
-#include <algorithm>
-#include <memory>
-#include <utility>
-#include <vector>
-
-#include "core/fxcrt/fx_basic.h"
-#include "core/fxcrt/fx_ext.h"
-#include "third_party/base/stl_util.h"
+#include "core/fxcrt/fx_extension.h"
 
 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
 #include <wincrypt.h>
@@ -21,422 +12,48 @@
 #include <ctime>
 #endif
 
+#define MT_N 848
+#define MT_M 456
+#define MT_Matrix_A 0x9908b0df
+#define MT_Upper_Mask 0x80000000
+#define MT_Lower_Mask 0x7fffffff
+
 namespace {
 
-#ifdef PDF_ENABLE_XFA
+struct FX_MTRANDOMCONTEXT {
+  FX_MTRANDOMCONTEXT() {
+    mti = MT_N + 1;
+    bHaveSeed = false;
+  }
 
-class CFX_CRTFileAccess : public IFX_FileAccess {
- public:
-  template <typename T, typename... Args>
-  friend CFX_RetainPtr<T> pdfium::MakeRetain(Args&&... args);
-
-  // IFX_FileAccess
-  void GetPath(CFX_WideString& wsPath) override;
-  CFX_RetainPtr<IFX_SeekableStream> CreateFileStream(uint32_t dwModes) override;
-
-  bool Init(const CFX_WideStringC& wsPath);
-
- private:
-  CFX_CRTFileAccess();
-  ~CFX_CRTFileAccess() override;
-
-  CFX_WideString m_path;
+  uint32_t mti;
+  bool bHaveSeed;
+  uint32_t mt[MT_N];
 };
 
-CFX_CRTFileAccess::CFX_CRTFileAccess() {}
-
-CFX_CRTFileAccess::~CFX_CRTFileAccess() {}
-
-void CFX_CRTFileAccess::GetPath(CFX_WideString& wsPath) {
-  wsPath = m_path;
-}
-
-CFX_RetainPtr<IFX_SeekableStream> CFX_CRTFileAccess::CreateFileStream(
-    uint32_t dwModes) {
-  return IFX_SeekableStream::CreateFromFilename(m_path.c_str(), dwModes);
-}
-
-bool CFX_CRTFileAccess::Init(const CFX_WideStringC& wsPath) {
-  m_path = wsPath;
-  return true;
-}
-
-#endif  // PDF_ENABLE_XFA
-
-class CFX_CRTFileStream final : public IFX_SeekableStream {
- public:
-  template <typename T, typename... Args>
-  friend CFX_RetainPtr<T> pdfium::MakeRetain(Args&&... args);
-
-  // IFX_SeekableStream:
-  FX_FILESIZE GetSize() override;
-  bool IsEOF() override;
-  FX_FILESIZE GetPosition() override;
-  bool ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) override;
-  size_t ReadBlock(void* buffer, size_t size) override;
-  bool WriteBlock(const void* buffer, FX_FILESIZE offset, size_t size) override;
-  bool Flush() override;
-
- private:
-  explicit CFX_CRTFileStream(std::unique_ptr<IFXCRT_FileAccess> pFA);
-  ~CFX_CRTFileStream() override;
-
-  std::unique_ptr<IFXCRT_FileAccess> m_pFile;
-};
-
-CFX_CRTFileStream::CFX_CRTFileStream(std::unique_ptr<IFXCRT_FileAccess> pFA)
-    : m_pFile(std::move(pFA)) {}
-
-CFX_CRTFileStream::~CFX_CRTFileStream() {}
-
-FX_FILESIZE CFX_CRTFileStream::GetSize() {
-  return m_pFile->GetSize();
-}
-
-bool CFX_CRTFileStream::IsEOF() {
-  return GetPosition() >= GetSize();
-}
-
-FX_FILESIZE CFX_CRTFileStream::GetPosition() {
-  return m_pFile->GetPosition();
-}
-
-bool CFX_CRTFileStream::ReadBlock(void* buffer,
-                                  FX_FILESIZE offset,
-                                  size_t size) {
-  return m_pFile->ReadPos(buffer, size, offset) > 0;
-}
-
-size_t CFX_CRTFileStream::ReadBlock(void* buffer, size_t size) {
-  return m_pFile->Read(buffer, size);
-}
-
-bool CFX_CRTFileStream::WriteBlock(const void* buffer,
-                                   FX_FILESIZE offset,
-                                   size_t size) {
-  return !!m_pFile->WritePos(buffer, size, offset);
-}
-
-bool CFX_CRTFileStream::Flush() {
-  return m_pFile->Flush();
-}
-
-#define FX_MEMSTREAM_BlockSize (64 * 1024)
-#define FX_MEMSTREAM_Consecutive 0x01
-#define FX_MEMSTREAM_TakeOver 0x02
-
-class CFX_MemoryStream final : public IFX_MemoryStream {
- public:
-  template <typename T, typename... Args>
-  friend CFX_RetainPtr<T> pdfium::MakeRetain(Args&&... args);
-
-  // IFX_MemoryStream
-  FX_FILESIZE GetSize() override;
-  bool IsEOF() override;
-  FX_FILESIZE GetPosition() override;
-  bool ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) override;
-  size_t ReadBlock(void* buffer, size_t size) override;
-  bool WriteBlock(const void* buffer, FX_FILESIZE offset, size_t size) override;
-  bool Flush() override;
-  bool IsConsecutive() const override;
-  void EstimateSize(size_t nInitSize, size_t nGrowSize) override;
-  uint8_t* GetBuffer() const override;
-  void AttachBuffer(uint8_t* pBuffer,
-                    size_t nSize,
-                    bool bTakeOver = false) override;
-  void DetachBuffer() override;
-
- private:
-  explicit CFX_MemoryStream(bool bConsecutive);
-  CFX_MemoryStream(uint8_t* pBuffer, size_t nSize, bool bTakeOver);
-  ~CFX_MemoryStream() override;
-
-  bool ExpandBlocks(size_t size);
-
-  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;
-};
-
-CFX_MemoryStream::CFX_MemoryStream(bool bConsecutive)
-    : m_nTotalSize(0),
-      m_nCurSize(0),
-      m_nCurPos(0),
-      m_nGrowSize(FX_MEMSTREAM_BlockSize) {
-  m_dwFlags =
-      FX_MEMSTREAM_TakeOver | (bConsecutive ? FX_MEMSTREAM_Consecutive : 0);
-}
-
-CFX_MemoryStream::CFX_MemoryStream(uint8_t* pBuffer,
-                                   size_t nSize,
-                                   bool bTakeOver)
-    : m_nTotalSize(nSize),
-      m_nCurSize(nSize),
-      m_nCurPos(0),
-      m_nGrowSize(FX_MEMSTREAM_BlockSize) {
-  m_Blocks.push_back(pBuffer);
-  m_dwFlags =
-      FX_MEMSTREAM_Consecutive | (bTakeOver ? FX_MEMSTREAM_TakeOver : 0);
-}
-
-CFX_MemoryStream::~CFX_MemoryStream() {
-  if (m_dwFlags & FX_MEMSTREAM_TakeOver) {
-    for (uint8_t* pBlock : m_Blocks)
-      FX_Free(pBlock);
-  }
-}
-
-FX_FILESIZE CFX_MemoryStream::GetSize() {
-  return (FX_FILESIZE)m_nCurSize;
-}
-
-bool CFX_MemoryStream::IsEOF() {
-  return m_nCurPos >= (size_t)GetSize();
-}
-
-FX_FILESIZE CFX_MemoryStream::GetPosition() {
-  return (FX_FILESIZE)m_nCurPos;
-}
-
-bool CFX_MemoryStream::ReadBlock(void* buffer,
-                                 FX_FILESIZE offset,
-                                 size_t size) {
-  if (!buffer || !size || offset < 0)
-    return false;
-
-  FX_SAFE_SIZE_T newPos = size;
-  newPos += offset;
-  if (!newPos.IsValid() || newPos.ValueOrDefault(0) == 0 ||
-      newPos.ValueOrDie() > m_nCurSize) {
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+bool GenerateCryptoRandom(uint32_t* pBuffer, int32_t iCount) {
+  HCRYPTPROV hCP = 0;
+  if (!::CryptAcquireContext(&hCP, nullptr, nullptr, PROV_RSA_FULL, 0) ||
+      !hCP) {
     return false;
   }
-
-  m_nCurPos = newPos.ValueOrDie();
-  if (m_dwFlags & FX_MEMSTREAM_Consecutive) {
-    memcpy(buffer, m_Blocks[0] + (size_t)offset, size);
-    return true;
-  }
-  size_t nStartBlock = (size_t)offset / m_nGrowSize;
-  offset -= (FX_FILESIZE)(nStartBlock * m_nGrowSize);
-  while (size) {
-    size_t nRead = m_nGrowSize - (size_t)offset;
-    if (nRead > size) {
-      nRead = size;
-    }
-    memcpy(buffer, m_Blocks[(int)nStartBlock] + (size_t)offset, nRead);
-    buffer = ((uint8_t*)buffer) + nRead;
-    size -= nRead;
-    nStartBlock++;
-    offset = 0;
-  }
+  ::CryptGenRandom(hCP, iCount * sizeof(uint32_t),
+                   reinterpret_cast<uint8_t*>(pBuffer));
+  ::CryptReleaseContext(hCP, 0);
   return true;
 }
-
-size_t CFX_MemoryStream::ReadBlock(void* buffer, size_t size) {
-  if (m_nCurPos >= m_nCurSize) {
-    return 0;
-  }
-  size_t nRead = std::min(size, m_nCurSize - m_nCurPos);
-  if (!ReadBlock(buffer, (int32_t)m_nCurPos, nRead)) {
-    return 0;
-  }
-  return nRead;
-}
-
-bool CFX_MemoryStream::WriteBlock(const void* buffer,
-                                  FX_FILESIZE offset,
-                                  size_t size) {
-  if (!buffer || !size)
-    return false;
-
-  if (m_dwFlags & FX_MEMSTREAM_Consecutive) {
-    FX_SAFE_SIZE_T newPos = size;
-    newPos += offset;
-    if (!newPos.IsValid())
-      return false;
-
-    m_nCurPos = newPos.ValueOrDie();
-    if (m_nCurPos > m_nTotalSize) {
-      m_nTotalSize = (m_nCurPos + m_nGrowSize - 1) / m_nGrowSize * m_nGrowSize;
-      if (m_Blocks.empty()) {
-        m_Blocks.push_back(FX_Alloc(uint8_t, m_nTotalSize));
-      } else {
-        m_Blocks[0] = FX_Realloc(uint8_t, m_Blocks[0], m_nTotalSize);
-      }
-    }
-    memcpy(m_Blocks[0] + (size_t)offset, buffer, size);
-    if (m_nCurSize < m_nCurPos) {
-      m_nCurSize = m_nCurPos;
-    }
-    return true;
-  }
-
-  FX_SAFE_SIZE_T newPos = size;
-  newPos += offset;
-  if (!newPos.IsValid()) {
-    return false;
-  }
-
-  if (!ExpandBlocks(newPos.ValueOrDie())) {
-    return false;
-  }
-  m_nCurPos = newPos.ValueOrDie();
-  size_t nStartBlock = (size_t)offset / m_nGrowSize;
-  offset -= (FX_FILESIZE)(nStartBlock * m_nGrowSize);
-  while (size) {
-    size_t nWrite = m_nGrowSize - (size_t)offset;
-    if (nWrite > size) {
-      nWrite = size;
-    }
-    memcpy(m_Blocks[(int)nStartBlock] + (size_t)offset, buffer, nWrite);
-    buffer = ((uint8_t*)buffer) + nWrite;
-    size -= nWrite;
-    nStartBlock++;
-    offset = 0;
-  }
-  return true;
-}
-
-bool CFX_MemoryStream::Flush() {
-  return true;
-}
-
-bool CFX_MemoryStream::IsConsecutive() const {
-  return !!(m_dwFlags & FX_MEMSTREAM_Consecutive);
-}
-
-void CFX_MemoryStream::EstimateSize(size_t nInitSize, size_t nGrowSize) {
-  if (m_dwFlags & FX_MEMSTREAM_Consecutive) {
-    if (m_Blocks.empty()) {
-      m_Blocks.push_back(
-          FX_Alloc(uint8_t, std::max(nInitSize, static_cast<size_t>(4096))));
-    }
-    m_nGrowSize = std::max(nGrowSize, static_cast<size_t>(4096));
-  } else if (m_Blocks.empty()) {
-    m_nGrowSize = std::max(nGrowSize, static_cast<size_t>(4096));
-  }
-}
-
-uint8_t* CFX_MemoryStream::GetBuffer() const {
-  return !m_Blocks.empty() ? m_Blocks.front() : nullptr;
-}
-
-void CFX_MemoryStream::AttachBuffer(uint8_t* pBuffer,
-                                    size_t nSize,
-                                    bool bTakeOver) {
-  if (!(m_dwFlags & FX_MEMSTREAM_Consecutive))
-    return;
-
-  m_Blocks.clear();
-  m_Blocks.push_back(pBuffer);
-  m_nTotalSize = nSize;
-  m_nCurSize = nSize;
-  m_nCurPos = 0;
-  m_dwFlags =
-      FX_MEMSTREAM_Consecutive | (bTakeOver ? FX_MEMSTREAM_TakeOver : 0);
-}
-
-void CFX_MemoryStream::DetachBuffer() {
-  if (!(m_dwFlags & FX_MEMSTREAM_Consecutive))
-    return;
-
-  m_Blocks.clear();
-  m_nTotalSize = 0;
-  m_nCurSize = 0;
-  m_nCurPos = 0;
-  m_dwFlags = FX_MEMSTREAM_TakeOver;
-}
-
-bool CFX_MemoryStream::ExpandBlocks(size_t size) {
-  if (m_nCurSize < size)
-    m_nCurSize = size;
-
-  if (size <= m_nTotalSize)
-    return true;
-
-  size = (size - m_nTotalSize + m_nGrowSize - 1) / m_nGrowSize;
-  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;
-  }
-  return true;
-}
+#endif
 
 }  // namespace
 
-#ifdef PDF_ENABLE_XFA
-CFX_RetainPtr<IFX_FileAccess> IFX_FileAccess::CreateDefault(
-    const CFX_WideStringC& wsPath) {
-  if (wsPath.GetLength() == 0)
-    return nullptr;
-
-  auto pFA = pdfium::MakeRetain<CFX_CRTFileAccess>();
-  pFA->Init(wsPath);
-  return pFA;
-}
-#endif  // PDF_ENABLE_XFA
-
-// static
-CFX_RetainPtr<IFX_SeekableStream> IFX_SeekableStream::CreateFromFilename(
-    const char* filename,
-    uint32_t dwModes) {
-  std::unique_ptr<IFXCRT_FileAccess> pFA(IFXCRT_FileAccess::Create());
-  if (!pFA->Open(filename, dwModes))
-    return nullptr;
-  return pdfium::MakeRetain<CFX_CRTFileStream>(std::move(pFA));
-}
-
-// static
-CFX_RetainPtr<IFX_SeekableStream> IFX_SeekableStream::CreateFromFilename(
-    const wchar_t* filename,
-    uint32_t dwModes) {
-  std::unique_ptr<IFXCRT_FileAccess> pFA(IFXCRT_FileAccess::Create());
-  if (!pFA->Open(filename, dwModes))
-    return nullptr;
-  return pdfium::MakeRetain<CFX_CRTFileStream>(std::move(pFA));
-}
-
-// static
-CFX_RetainPtr<IFX_SeekableReadStream>
-IFX_SeekableReadStream::CreateFromFilename(const char* filename) {
-  return IFX_SeekableStream::CreateFromFilename(filename, FX_FILEMODE_ReadOnly);
-}
-
-// static
-CFX_RetainPtr<IFX_MemoryStream> IFX_MemoryStream::Create(uint8_t* pBuffer,
-                                                         size_t dwSize,
-                                                         bool bTakeOver) {
-  return pdfium::MakeRetain<CFX_MemoryStream>(pBuffer, dwSize, bTakeOver);
-}
-
-// static
-CFX_RetainPtr<IFX_MemoryStream> IFX_MemoryStream::Create(bool bConsecutive) {
-  return pdfium::MakeRetain<CFX_MemoryStream>(bConsecutive);
-}
-
-float FXSYS_strtof(const char* pcsStr, int32_t iLength, int32_t* pUsedLen) {
-  ASSERT(pcsStr);
-  if (iLength < 0) {
-    iLength = (int32_t)FXSYS_strlen(pcsStr);
-  }
-  CFX_WideString ws =
-      CFX_WideString::FromLocal(CFX_ByteStringC(pcsStr, iLength));
-  return FXSYS_wcstof(ws.c_str(), iLength, pUsedLen);
-}
-
 float FXSYS_wcstof(const wchar_t* pwsStr, int32_t iLength, int32_t* pUsedLen) {
   ASSERT(pwsStr);
-  if (iLength < 0) {
-    iLength = (int32_t)FXSYS_wcslen(pwsStr);
-  }
-  if (iLength == 0) {
+  if (iLength < 0)
+    iLength = static_cast<int32_t>(FXSYS_wcslen(pwsStr));
+  if (iLength == 0)
     return 0.0f;
-  }
+
   int32_t iUsedLen = 0;
   bool bNegtive = false;
   switch (pwsStr[iUsedLen]) {
@@ -446,16 +63,18 @@
       iUsedLen++;
       break;
   }
+
   float fValue = 0.0f;
   while (iUsedLen < iLength) {
     wchar_t wch = pwsStr[iUsedLen];
-    if (wch >= L'0' && wch <= L'9') {
+    if (wch >= L'0' && wch <= L'9')
       fValue = fValue * 10.0f + (wch - L'0');
-    } else {
+    else
       break;
-    }
+
     iUsedLen++;
   }
+
   if (iUsedLen < iLength && pwsStr[iUsedLen] == L'.') {
     float fPrecise = 0.1f;
     while (++iUsedLen < iLength) {
@@ -468,43 +87,31 @@
       }
     }
   }
-  if (pUsedLen) {
+  if (pUsedLen)
     *pUsedLen = iUsedLen;
-  }
+
   return bNegtive ? -fValue : fValue;
 }
+
 wchar_t* FXSYS_wcsncpy(wchar_t* dstStr, const wchar_t* srcStr, size_t count) {
   ASSERT(dstStr && srcStr && count > 0);
   for (size_t i = 0; i < count; ++i)
-    if ((dstStr[i] = srcStr[i]) == L'\0') {
+    if ((dstStr[i] = srcStr[i]) == L'\0')
       break;
-    }
   return dstStr;
 }
+
 int32_t FXSYS_wcsnicmp(const wchar_t* s1, const wchar_t* s2, size_t count) {
   ASSERT(s1 && s2 && count > 0);
   wchar_t wch1 = 0, wch2 = 0;
   while (count-- > 0) {
-    wch1 = (wchar_t)FXSYS_tolower(*s1++);
-    wch2 = (wchar_t)FXSYS_tolower(*s2++);
-    if (wch1 != wch2) {
+    wch1 = static_cast<wchar_t>(FXSYS_tolower(*s1++));
+    wch2 = static_cast<wchar_t>(FXSYS_tolower(*s2++));
+    if (wch1 != wch2)
       break;
-    }
   }
   return wch1 - wch2;
 }
-int32_t FXSYS_strnicmp(const char* s1, const char* s2, size_t count) {
-  ASSERT(s1 && s2 && count > 0);
-  char ch1 = 0, ch2 = 0;
-  while (count-- > 0) {
-    ch1 = (char)FXSYS_tolower(*s1++);
-    ch2 = (char)FXSYS_tolower(*s2++);
-    if (ch1 != ch2) {
-      break;
-    }
-  }
-  return ch1 - ch2;
-}
 
 uint32_t FX_HashCode_GetA(const CFX_ByteStringC& str, bool bIgnoreCase) {
   uint32_t dwHashCode = 0;
@@ -535,12 +142,13 @@
   pContext->mt[0] = dwSeed;
   uint32_t& i = pContext->mti;
   uint32_t* pBuf = pContext->mt;
-  for (i = 1; i < MT_N; i++) {
+  for (i = 1; i < MT_N; i++)
     pBuf[i] = (1812433253UL * (pBuf[i - 1] ^ (pBuf[i - 1] >> 30)) + i);
-  }
+
   pContext->bHaveSeed = true;
   return pContext;
 }
+
 uint32_t FX_Random_MT_Generate(void* pContext) {
   ASSERT(pContext);
   FX_MTRANDOMCONTEXT* pMTC = static_cast<FX_MTRANDOMCONTEXT*>(pContext);
@@ -549,9 +157,9 @@
   uint32_t& mti = pMTC->mti;
   uint32_t* pBuf = pMTC->mt;
   if ((int)mti < 0 || mti >= MT_N) {
-    if (mti > MT_N && !pMTC->bHaveSeed) {
+    if (mti > MT_N && !pMTC->bHaveSeed)
       return 0;
-    }
+
     uint32_t kk;
     for (kk = 0; kk < MT_N - MT_M; kk++) {
       v = (pBuf[kk] & MT_Upper_Mask) | (pBuf[kk + 1] & MT_Lower_Mask);
@@ -572,25 +180,27 @@
   v ^= (v >> 18);
   return v;
 }
+
 void FX_Random_MT_Close(void* pContext) {
   ASSERT(pContext);
   FX_Free(pContext);
 }
+
 void FX_Random_GenerateMT(uint32_t* pBuffer, int32_t iCount) {
   uint32_t dwSeed;
 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
-  if (!FX_GenerateCryptoRandom(&dwSeed, 1)) {
+  if (!GenerateCryptoRandom(&dwSeed, 1))
     FX_Random_GenerateBase(&dwSeed, 1);
-  }
 #else
   FX_Random_GenerateBase(&dwSeed, 1);
 #endif
   void* pContext = FX_Random_MT_Start(dwSeed);
-  while (iCount-- > 0) {
+  while (iCount-- > 0)
     *pBuffer++ = FX_Random_MT_Generate(pContext);
-  }
+
   FX_Random_MT_Close(pContext);
 }
+
 void FX_Random_GenerateBase(uint32_t* pBuffer, int32_t iCount) {
 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
   SYSTEMTIME st1, st2;
@@ -606,34 +216,13 @@
 #else
   time_t tmLast = time(nullptr);
   time_t tmCur;
-  while ((tmCur = time(nullptr)) == tmLast) {
+  while ((tmCur = time(nullptr)) == tmLast)
     continue;
-  }
 
   ::srand((tmCur << 16) | (tmLast & 0xFFFF));
 #endif
-  while (iCount-- > 0) {
-    *pBuffer++ = (uint32_t)((::rand() << 16) | (::rand() & 0xFFFF));
-  }
-}
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
-bool FX_GenerateCryptoRandom(uint32_t* pBuffer, int32_t iCount) {
-  HCRYPTPROV hCP = 0;
-  if (!::CryptAcquireContext(&hCP, nullptr, nullptr, PROV_RSA_FULL, 0) ||
-      !hCP) {
-    return false;
-  }
-  ::CryptGenRandom(hCP, iCount * sizeof(uint32_t), (uint8_t*)pBuffer);
-  ::CryptReleaseContext(hCP, 0);
-  return true;
-}
-#endif
-void FX_Random_GenerateCrypto(uint32_t* pBuffer, int32_t iCount) {
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
-  FX_GenerateCryptoRandom(pBuffer, iCount);
-#else
-  FX_Random_GenerateBase(pBuffer, iCount);
-#endif
+  while (iCount-- > 0)
+    *pBuffer++ = static_cast<uint32_t>((::rand() << 16) | (::rand() & 0xFFFF));
 }
 
 #ifdef PDF_ENABLE_XFA
@@ -654,7 +243,7 @@
     *pBuf++ = gs_FX_pHexChars[b & 0x0F];
     if (bSeparator && (i == 3 || i == 5 || i == 7 || i == 9))
       *pBuf++ = L'-';
-    }
+  }
   bsStr.ReleaseBuffer(bSeparator ? 36 : 32);
   return bsStr;
 }
diff --git a/core/fxcrt/fx_ext.h b/core/fxcrt/fx_extension.h
similarity index 88%
rename from core/fxcrt/fx_ext.h
rename to core/fxcrt/fx_extension.h
index 8224087..e9d1678 100644
--- a/core/fxcrt/fx_ext.h
+++ b/core/fxcrt/fx_extension.h
@@ -4,8 +4,8 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#ifndef CORE_FXCRT_FX_EXT_H_
-#define CORE_FXCRT_FX_EXT_H_
+#ifndef CORE_FXCRT_FX_EXTENSION_H_
+#define CORE_FXCRT_FX_EXTENSION_H_
 
 #include <cctype>
 #include <cwctype>
@@ -15,15 +15,11 @@
 
 #define FX_INVALID_OFFSET static_cast<uint32_t>(-1)
 
-float FXSYS_strtof(const char* pcsStr,
-                   int32_t iLength = -1,
-                   int32_t* pUsedLen = nullptr);
 float FXSYS_wcstof(const wchar_t* pwsStr,
                    int32_t iLength = -1,
                    int32_t* pUsedLen = nullptr);
 wchar_t* FXSYS_wcsncpy(wchar_t* dstStr, const wchar_t* srcStr, size_t count);
 int32_t FXSYS_wcsnicmp(const wchar_t* s1, const wchar_t* s2, size_t count);
-int32_t FXSYS_strnicmp(const char* s1, const char* s2, size_t count);
 
 inline bool FXSYS_islower(int32_t ch) {
   return ch >= 'a' && ch <= 'z';
@@ -92,7 +88,6 @@
 uint32_t FX_Random_MT_Generate(void* pContext);
 void FX_Random_GenerateBase(uint32_t* pBuffer, int32_t iCount);
 void FX_Random_GenerateMT(uint32_t* pBuffer, int32_t iCount);
-void FX_Random_GenerateCrypto(uint32_t* pBuffer, int32_t iCount);
 
 #ifdef PDF_ENABLE_XFA
 struct FX_GUID {
@@ -105,4 +100,4 @@
 CFX_ByteString FX_GUID_ToString(const FX_GUID* pGUID, bool bSeparator = true);
 #endif  // PDF_ENABLE_XFA
 
-#endif  // CORE_FXCRT_FX_EXT_H_
+#endif  // CORE_FXCRT_FX_EXTENSION_H_
diff --git a/core/fxcrt/fx_extension_unittest.cpp b/core/fxcrt/fx_extension_unittest.cpp
index 3739a3d..4e4294c 100644
--- a/core/fxcrt/fx_extension_unittest.cpp
+++ b/core/fxcrt/fx_extension_unittest.cpp
@@ -2,10 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "core/fxcrt/fx_extension.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-#include "core/fxcrt/fx_ext.h"
-
 TEST(fxcrt, FXSYS_toHexDigit) {
   EXPECT_EQ(10, FXSYS_toHexDigit('a'));
   EXPECT_EQ(10, FXSYS_toHexDigit('A'));
diff --git a/core/fxcrt/fx_stream.cpp b/core/fxcrt/fx_stream.cpp
new file mode 100644
index 0000000..c60a546
--- /dev/null
+++ b/core/fxcrt/fx_stream.cpp
@@ -0,0 +1,307 @@
+// Copyright 2017 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "core/fxcrt/fx_stream.h"
+
+#include <algorithm>
+#include <memory>
+#include <utility>
+#include <vector>
+
+#include "core/fxcrt/fx_safe_types.h"
+#include "core/fxcrt/ifxcrt_fileaccess.h"
+
+#define FX_MEMSTREAM_BlockSize (64 * 1024)
+#define FX_MEMSTREAM_Consecutive 0x01
+#define FX_MEMSTREAM_TakeOver 0x02
+
+namespace {
+
+class CFX_CRTFileStream final : public IFX_SeekableStream {
+ public:
+  template <typename T, typename... Args>
+  friend CFX_RetainPtr<T> pdfium::MakeRetain(Args&&... args);
+
+  // IFX_SeekableStream:
+  FX_FILESIZE GetSize() override { return m_pFile->GetSize(); }
+  bool IsEOF() override { return GetPosition() >= GetSize(); }
+  FX_FILESIZE GetPosition() override { return m_pFile->GetPosition(); }
+  bool ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) override {
+    return m_pFile->ReadPos(buffer, size, offset) > 0;
+  }
+  size_t ReadBlock(void* buffer, size_t size) override {
+    return m_pFile->Read(buffer, size);
+  }
+  bool WriteBlock(const void* buffer,
+                  FX_FILESIZE offset,
+                  size_t size) override {
+    return !!m_pFile->WritePos(buffer, size, offset);
+  }
+  bool Flush() override { return m_pFile->Flush(); }
+
+ private:
+  explicit CFX_CRTFileStream(std::unique_ptr<IFXCRT_FileAccess> pFA)
+      : m_pFile(std::move(pFA)) {}
+  ~CFX_CRTFileStream() override {}
+
+  std::unique_ptr<IFXCRT_FileAccess> m_pFile;
+};
+
+class CFX_MemoryStream final : public IFX_MemoryStream {
+ public:
+  template <typename T, typename... Args>
+  friend CFX_RetainPtr<T> pdfium::MakeRetain(Args&&... args);
+
+  // IFX_MemoryStream
+  FX_FILESIZE GetSize() override {
+    return static_cast<FX_FILESIZE>(m_nCurSize);
+  }
+  bool IsEOF() override { return m_nCurPos >= static_cast<size_t>(GetSize()); }
+  FX_FILESIZE GetPosition() override {
+    return static_cast<FX_FILESIZE>(m_nCurPos);
+  }
+  bool ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) override;
+  size_t ReadBlock(void* buffer, size_t size) override;
+  bool WriteBlock(const void* buffer, FX_FILESIZE offset, size_t size) override;
+  bool Flush() override { return true; }
+  bool IsConsecutive() const override {
+    return !!(m_dwFlags & FX_MEMSTREAM_Consecutive);
+  }
+  void EstimateSize(size_t nInitSize, size_t nGrowSize) override;
+  uint8_t* GetBuffer() const override {
+    return !m_Blocks.empty() ? m_Blocks.front() : nullptr;
+  }
+  void AttachBuffer(uint8_t* pBuffer,
+                    size_t nSize,
+                    bool bTakeOver = false) override;
+  void DetachBuffer() override;
+
+ private:
+  explicit CFX_MemoryStream(bool bConsecutive);
+  CFX_MemoryStream(uint8_t* pBuffer, size_t nSize, bool bTakeOver);
+  ~CFX_MemoryStream() override;
+
+  bool ExpandBlocks(size_t size);
+
+  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;
+};
+
+CFX_MemoryStream::CFX_MemoryStream(bool bConsecutive)
+    : m_nTotalSize(0),
+      m_nCurSize(0),
+      m_nCurPos(0),
+      m_nGrowSize(FX_MEMSTREAM_BlockSize) {
+  m_dwFlags =
+      FX_MEMSTREAM_TakeOver | (bConsecutive ? FX_MEMSTREAM_Consecutive : 0);
+}
+
+CFX_MemoryStream::CFX_MemoryStream(uint8_t* pBuffer,
+                                   size_t nSize,
+                                   bool bTakeOver)
+    : m_nTotalSize(nSize),
+      m_nCurSize(nSize),
+      m_nCurPos(0),
+      m_nGrowSize(FX_MEMSTREAM_BlockSize) {
+  m_Blocks.push_back(pBuffer);
+  m_dwFlags =
+      FX_MEMSTREAM_Consecutive | (bTakeOver ? FX_MEMSTREAM_TakeOver : 0);
+}
+
+CFX_MemoryStream::~CFX_MemoryStream() {
+  if (m_dwFlags & FX_MEMSTREAM_TakeOver) {
+    for (uint8_t* pBlock : m_Blocks)
+      FX_Free(pBlock);
+  }
+}
+
+bool CFX_MemoryStream::ReadBlock(void* buffer,
+                                 FX_FILESIZE offset,
+                                 size_t size) {
+  if (!buffer || !size || offset < 0)
+    return false;
+
+  FX_SAFE_SIZE_T newPos = size;
+  newPos += offset;
+  if (!newPos.IsValid() || newPos.ValueOrDefault(0) == 0 ||
+      newPos.ValueOrDie() > m_nCurSize) {
+    return false;
+  }
+
+  m_nCurPos = newPos.ValueOrDie();
+  if (m_dwFlags & FX_MEMSTREAM_Consecutive) {
+    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);
+  while (size) {
+    size_t nRead = std::min(size, m_nGrowSize - static_cast<size_t>(offset));
+    memcpy(buffer, m_Blocks[nStartBlock] + offset, nRead);
+    buffer = static_cast<uint8_t*>(buffer) + nRead;
+    size -= nRead;
+    ++nStartBlock;
+    offset = 0;
+  }
+  return true;
+}
+
+size_t CFX_MemoryStream::ReadBlock(void* buffer, size_t size) {
+  if (m_nCurPos >= m_nCurSize)
+    return 0;
+
+  size_t nRead = std::min(size, m_nCurSize - m_nCurPos);
+  if (!ReadBlock(buffer, static_cast<int32_t>(m_nCurPos), nRead))
+    return 0;
+
+  return nRead;
+}
+
+bool CFX_MemoryStream::WriteBlock(const void* buffer,
+                                  FX_FILESIZE offset,
+                                  size_t size) {
+  if (!buffer || !size)
+    return false;
+
+  if (m_dwFlags & FX_MEMSTREAM_Consecutive) {
+    FX_SAFE_SIZE_T newPos = size;
+    newPos += offset;
+    if (!newPos.IsValid())
+      return false;
+
+    m_nCurPos = newPos.ValueOrDie();
+    if (m_nCurPos > m_nTotalSize) {
+      m_nTotalSize = (m_nCurPos + m_nGrowSize - 1) / m_nGrowSize * m_nGrowSize;
+      if (m_Blocks.empty())
+        m_Blocks.push_back(FX_Alloc(uint8_t, m_nTotalSize));
+      else
+        m_Blocks[0] = FX_Realloc(uint8_t, m_Blocks[0], m_nTotalSize);
+    }
+
+    memcpy(m_Blocks[0] + offset, buffer, size);
+    m_nCurSize = std::max(m_nCurSize, m_nCurPos);
+
+    return true;
+  }
+
+  FX_SAFE_SIZE_T newPos = size;
+  newPos += offset;
+  if (!newPos.IsValid())
+    return false;
+  if (!ExpandBlocks(newPos.ValueOrDie()))
+    return false;
+
+  m_nCurPos = newPos.ValueOrDie();
+  size_t nStartBlock = static_cast<size_t>(offset) / m_nGrowSize;
+  offset -= static_cast<FX_FILESIZE>(nStartBlock * m_nGrowSize);
+  while (size) {
+    size_t nWrite = std::min(size, m_nGrowSize - static_cast<size_t>(offset));
+    memcpy(m_Blocks[nStartBlock] + offset, buffer, nWrite);
+    buffer = static_cast<const uint8_t*>(buffer) + nWrite;
+    size -= nWrite;
+    ++nStartBlock;
+    offset = 0;
+  }
+  return true;
+}
+
+void CFX_MemoryStream::EstimateSize(size_t nInitSize, size_t nGrowSize) {
+  if (m_dwFlags & FX_MEMSTREAM_Consecutive) {
+    if (m_Blocks.empty()) {
+      m_Blocks.push_back(
+          FX_Alloc(uint8_t, std::max(nInitSize, static_cast<size_t>(4096))));
+    }
+    m_nGrowSize = std::max(nGrowSize, static_cast<size_t>(4096));
+  } else if (m_Blocks.empty()) {
+    m_nGrowSize = std::max(nGrowSize, static_cast<size_t>(4096));
+  }
+}
+
+void CFX_MemoryStream::AttachBuffer(uint8_t* pBuffer,
+                                    size_t nSize,
+                                    bool bTakeOver) {
+  if (!(m_dwFlags & FX_MEMSTREAM_Consecutive))
+    return;
+
+  m_Blocks.clear();
+  m_Blocks.push_back(pBuffer);
+  m_nTotalSize = nSize;
+  m_nCurSize = nSize;
+  m_nCurPos = 0;
+  m_dwFlags =
+      FX_MEMSTREAM_Consecutive | (bTakeOver ? FX_MEMSTREAM_TakeOver : 0);
+}
+
+void CFX_MemoryStream::DetachBuffer() {
+  if (!(m_dwFlags & FX_MEMSTREAM_Consecutive))
+    return;
+
+  m_Blocks.clear();
+  m_nTotalSize = 0;
+  m_nCurSize = 0;
+  m_nCurPos = 0;
+  m_dwFlags = FX_MEMSTREAM_TakeOver;
+}
+
+bool CFX_MemoryStream::ExpandBlocks(size_t size) {
+  m_nCurSize = std::max(m_nCurSize, size);
+  if (size <= m_nTotalSize)
+    return true;
+
+  size = (size - m_nTotalSize + m_nGrowSize - 1) / m_nGrowSize;
+  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;
+  }
+  return true;
+}
+
+}  // namespace
+
+// static
+CFX_RetainPtr<IFX_SeekableStream> IFX_SeekableStream::CreateFromFilename(
+    const char* filename,
+    uint32_t dwModes) {
+  std::unique_ptr<IFXCRT_FileAccess> pFA(IFXCRT_FileAccess::Create());
+  if (!pFA->Open(filename, dwModes))
+    return nullptr;
+  return pdfium::MakeRetain<CFX_CRTFileStream>(std::move(pFA));
+}
+
+// static
+CFX_RetainPtr<IFX_SeekableStream> IFX_SeekableStream::CreateFromFilename(
+    const wchar_t* filename,
+    uint32_t dwModes) {
+  std::unique_ptr<IFXCRT_FileAccess> pFA(IFXCRT_FileAccess::Create());
+  if (!pFA->Open(filename, dwModes))
+    return nullptr;
+  return pdfium::MakeRetain<CFX_CRTFileStream>(std::move(pFA));
+}
+
+// static
+CFX_RetainPtr<IFX_SeekableReadStream>
+IFX_SeekableReadStream::CreateFromFilename(const char* filename) {
+  return IFX_SeekableStream::CreateFromFilename(filename, FX_FILEMODE_ReadOnly);
+}
+
+// static
+CFX_RetainPtr<IFX_MemoryStream> IFX_MemoryStream::Create(uint8_t* pBuffer,
+                                                         size_t dwSize,
+                                                         bool bTakeOver) {
+  return pdfium::MakeRetain<CFX_MemoryStream>(pBuffer, dwSize, bTakeOver);
+}
+
+// static
+CFX_RetainPtr<IFX_MemoryStream> IFX_MemoryStream::Create(bool bConsecutive) {
+  return pdfium::MakeRetain<CFX_MemoryStream>(bConsecutive);
+}
diff --git a/core/fxcrt/fx_stream.h b/core/fxcrt/fx_stream.h
index c9306c9..1aa9fea 100644
--- a/core/fxcrt/fx_stream.h
+++ b/core/fxcrt/fx_stream.h
@@ -127,18 +127,6 @@
   virtual void DetachBuffer() = 0;
 };
 
-#ifdef PDF_ENABLE_XFA
-class IFX_FileAccess : public CFX_Retainable {
- public:
-  static CFX_RetainPtr<IFX_FileAccess> CreateDefault(
-      const CFX_WideStringC& wsPath);
-
-  virtual void GetPath(CFX_WideString& wsPath) = 0;
-  virtual CFX_RetainPtr<IFX_SeekableStream> CreateFileStream(
-      uint32_t dwModes) = 0;
-};
-#endif  // PDF_ENABLE_XFA
-
 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
 class CFindFileData {
  public:
diff --git a/core/fxcrt/fxcrt_posix.h b/core/fxcrt/fxcrt_posix.h
index 20faa5c..109cf34 100644
--- a/core/fxcrt/fxcrt_posix.h
+++ b/core/fxcrt/fxcrt_posix.h
@@ -7,7 +7,7 @@
 #ifndef CORE_FXCRT_FXCRT_POSIX_H_
 #define CORE_FXCRT_FXCRT_POSIX_H_
 
-#include "core/fxcrt/extension.h"
+#include "core/fxcrt/ifxcrt_fileaccess.h"
 
 #if _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_ || \
     _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ || \
diff --git a/core/fxcrt/fxcrt_windows.h b/core/fxcrt/fxcrt_windows.h
index f8f9483..8e800ce 100644
--- a/core/fxcrt/fxcrt_windows.h
+++ b/core/fxcrt/fxcrt_windows.h
@@ -7,7 +7,7 @@
 #ifndef CORE_FXCRT_FXCRT_WINDOWS_H_
 #define CORE_FXCRT_FXCRT_WINDOWS_H_
 
-#include "core/fxcrt/extension.h"
+#include "core/fxcrt/ifxcrt_fileaccess.h"
 
 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
 class CFXCRT_FileAccess_Win64 : public IFXCRT_FileAccess {
diff --git a/core/fxcrt/extension.h b/core/fxcrt/ifxcrt_fileaccess.h
similarity index 67%
rename from core/fxcrt/extension.h
rename to core/fxcrt/ifxcrt_fileaccess.h
index b62f677..9528b3b 100644
--- a/core/fxcrt/extension.h
+++ b/core/fxcrt/ifxcrt_fileaccess.h
@@ -4,8 +4,8 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#ifndef CORE_FXCRT_EXTENSION_H_
-#define CORE_FXCRT_EXTENSION_H_
+#ifndef CORE_FXCRT_IFXCRT_FILEACCESS_H_
+#define CORE_FXCRT_IFXCRT_FILEACCESS_H_
 
 #include <algorithm>
 #include <memory>
@@ -34,28 +34,4 @@
   virtual bool Truncate(FX_FILESIZE szFile) = 0;
 };
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-#define MT_N 848
-#define MT_M 456
-#define MT_Matrix_A 0x9908b0df
-#define MT_Upper_Mask 0x80000000
-#define MT_Lower_Mask 0x7fffffff
-struct FX_MTRANDOMCONTEXT {
-  FX_MTRANDOMCONTEXT() {
-    mti = MT_N + 1;
-    bHaveSeed = false;
-  }
-  uint32_t mti;
-  bool bHaveSeed;
-  uint32_t mt[MT_N];
-};
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
-bool FX_GenerateCryptoRandom(uint32_t* pBuffer, int32_t iCount);
-#endif
-#ifdef __cplusplus
-}
-#endif
-
-#endif  // CORE_FXCRT_EXTENSION_H_
+#endif  // CORE_FXCRT_IFXCRT_FILEACCESS_H_
diff --git a/core/fxcrt/xml/cfx_xmlattributenode.cpp b/core/fxcrt/xml/cfx_xmlattributenode.cpp
index 9c81efc..9ea6756 100644
--- a/core/fxcrt/xml/cfx_xmlattributenode.cpp
+++ b/core/fxcrt/xml/cfx_xmlattributenode.cpp
@@ -6,7 +6,7 @@
 
 #include "core/fxcrt/xml/cfx_xmlattributenode.h"
 
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 
 CFX_XMLAttributeNode::CFX_XMLAttributeNode(const CFX_WideString& name)
     : CFX_XMLNode(), name_(name) {
diff --git a/core/fxcrt/xml/cfx_xmlelement.cpp b/core/fxcrt/xml/cfx_xmlelement.cpp
index c6b70e1..8c2442e 100644
--- a/core/fxcrt/xml/cfx_xmlelement.cpp
+++ b/core/fxcrt/xml/cfx_xmlelement.cpp
@@ -6,7 +6,7 @@
 
 #include "core/fxcrt/xml/cfx_xmlelement.h"
 
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 #include "core/fxcrt/xml/cfx_xmlchardata.h"
 #include "core/fxcrt/xml/cfx_xmltext.h"
 #include "third_party/base/ptr_util.h"
diff --git a/core/fxcrt/xml/cfx_xmlinstruction.cpp b/core/fxcrt/xml/cfx_xmlinstruction.cpp
index d07b92e..6886172 100644
--- a/core/fxcrt/xml/cfx_xmlinstruction.cpp
+++ b/core/fxcrt/xml/cfx_xmlinstruction.cpp
@@ -6,7 +6,7 @@
 
 #include "core/fxcrt/xml/cfx_xmlinstruction.h"
 
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 #include "third_party/base/ptr_util.h"
 #include "third_party/base/stl_util.h"
 
diff --git a/core/fxcrt/xml/cfx_xmlsyntaxparser.cpp b/core/fxcrt/xml/cfx_xmlsyntaxparser.cpp
index e7bef71..aa455d5 100644
--- a/core/fxcrt/xml/cfx_xmlsyntaxparser.cpp
+++ b/core/fxcrt/xml/cfx_xmlsyntaxparser.cpp
@@ -8,7 +8,7 @@
 
 #include <algorithm>
 
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 #include "core/fxcrt/fx_safe_types.h"
 
 namespace {
diff --git a/core/fxcrt/xml/cxml_parser.cpp b/core/fxcrt/xml/cxml_parser.cpp
index 09c61d1..691a86e 100644
--- a/core/fxcrt/xml/cxml_parser.cpp
+++ b/core/fxcrt/xml/cxml_parser.cpp
@@ -8,7 +8,7 @@
 #include <memory>
 #include <vector>
 
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 #include "core/fxcrt/xml/cxml_content.h"
 #include "core/fxcrt/xml/cxml_element.h"
 #include "core/fxcrt/xml/cxml_parser.h"
diff --git a/core/fxge/android/cfpf_skiafontmgr.cpp b/core/fxge/android/cfpf_skiafontmgr.cpp
index 46aa76e..ec5c610 100644
--- a/core/fxge/android/cfpf_skiafontmgr.cpp
+++ b/core/fxge/android/cfpf_skiafontmgr.cpp
@@ -14,7 +14,7 @@
 #include <algorithm>
 
 #include "core/fxcrt/fx_codepage.h"
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 #include "core/fxcrt/fx_memory.h"
 #include "core/fxcrt/fx_system.h"
 #include "core/fxge/android/cfpf_skiafont.h"
diff --git a/core/fxge/apple/fx_quartz_device.cpp b/core/fxge/apple/fx_quartz_device.cpp
index eef0e0c..15d05b0 100644
--- a/core/fxge/apple/fx_quartz_device.cpp
+++ b/core/fxge/apple/fx_quartz_device.cpp
@@ -4,7 +4,7 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 
 #if !defined _SKIA_SUPPORT_ && !defined _SKIA_SUPPORT_PATHS_
 #include "core/fxge/agg/fx_agg_driver.h"
diff --git a/fpdfsdk/cpdfsdk_datetime.cpp b/fpdfsdk/cpdfsdk_datetime.cpp
index e10a223..47c764c 100644
--- a/fpdfsdk/cpdfsdk_datetime.cpp
+++ b/fpdfsdk/cpdfsdk_datetime.cpp
@@ -6,7 +6,7 @@
 
 #include "fpdfsdk/cpdfsdk_datetime.h"
 
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 
 namespace {
 
diff --git a/fpdfsdk/fpdfsave.cpp b/fpdfsdk/fpdfsave.cpp
index 004c921..a8b0d05 100644
--- a/fpdfsdk/fpdfsave.cpp
+++ b/fpdfsdk/fpdfsave.cpp
@@ -16,7 +16,7 @@
 #include "core/fpdfapi/parser/cpdf_reference.h"
 #include "core/fpdfapi/parser/cpdf_stream_acc.h"
 #include "core/fpdfapi/parser/cpdf_string.h"
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 #include "fpdfsdk/fsdk_define.h"
 #include "public/fpdf_edit.h"
 
diff --git a/fpdfsdk/javascript/PublicMethods.cpp b/fpdfsdk/javascript/PublicMethods.cpp
index b5d4f7b..b349537 100644
--- a/fpdfsdk/javascript/PublicMethods.cpp
+++ b/fpdfsdk/javascript/PublicMethods.cpp
@@ -14,7 +14,7 @@
 #include <vector>
 
 #include "core/fpdfdoc/cpdf_interform.h"
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 #include "fpdfsdk/cpdfsdk_formfillenvironment.h"
 #include "fpdfsdk/cpdfsdk_interform.h"
 #include "fpdfsdk/javascript/Field.h"
diff --git a/fpdfsdk/javascript/global.cpp b/fpdfsdk/javascript/global.cpp
index 91c82e6..d7f17fa 100644
--- a/fpdfsdk/javascript/global.cpp
+++ b/fpdfsdk/javascript/global.cpp
@@ -9,7 +9,7 @@
 #include <utility>
 #include <vector>
 
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 #include "fpdfsdk/javascript/JS_Define.h"
 #include "fpdfsdk/javascript/JS_EventHandler.h"
 #include "fpdfsdk/javascript/JS_GlobalData.h"
diff --git a/fpdfsdk/javascript/util.cpp b/fpdfsdk/javascript/util.cpp
index f88cdc6..4303342 100644
--- a/fpdfsdk/javascript/util.cpp
+++ b/fpdfsdk/javascript/util.cpp
@@ -12,7 +12,7 @@
 #include <string>
 #include <vector>
 
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 #include "fpdfsdk/javascript/JS_Define.h"
 #include "fpdfsdk/javascript/JS_EventHandler.h"
 #include "fpdfsdk/javascript/JS_Object.h"
diff --git a/xfa/fde/css/cfde_cssdeclaration.cpp b/xfa/fde/css/cfde_cssdeclaration.cpp
index 8983059..4de8cb7 100644
--- a/xfa/fde/css/cfde_cssdeclaration.cpp
+++ b/xfa/fde/css/cfde_cssdeclaration.cpp
@@ -6,7 +6,7 @@
 
 #include "xfa/fde/css/cfde_cssdeclaration.h"
 
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 #include "third_party/base/ptr_util.h"
 #include "xfa/fde/css/cfde_csscolorvalue.h"
 #include "xfa/fde/css/cfde_csscustomproperty.h"
diff --git a/xfa/fde/css/fde_cssdatatable.cpp b/xfa/fde/css/fde_cssdatatable.cpp
index 5fa9cf0..79170bc 100644
--- a/xfa/fde/css/fde_cssdatatable.cpp
+++ b/xfa/fde/css/fde_cssdatatable.cpp
@@ -9,7 +9,7 @@
 #include <utility>
 
 #include "core/fxcrt/fx_codepage.h"
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 #include "xfa/fde/css/cfde_cssstyleselector.h"
 #include "xfa/fde/css/cfde_cssvaluelistparser.h"
 
diff --git a/xfa/fgas/crt/cfgas_formatstring.cpp b/xfa/fgas/crt/cfgas_formatstring.cpp
index 6cb8281..6d940d6 100644
--- a/xfa/fgas/crt/cfgas_formatstring.cpp
+++ b/xfa/fgas/crt/cfgas_formatstring.cpp
@@ -10,7 +10,7 @@
 #include <vector>
 
 #include "core/fxcrt/cfx_decimal.h"
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 #include "core/fxcrt/xml/cxml_element.h"
 
 #define FX_LOCALECATEGORY_DateHash 0xbde9abde
diff --git a/xfa/fgas/font/cfgas_fontmgr.cpp b/xfa/fgas/font/cfgas_fontmgr.cpp
index e0b7111..74c2840 100644
--- a/xfa/fgas/font/cfgas_fontmgr.cpp
+++ b/xfa/fgas/font/cfgas_fontmgr.cpp
@@ -678,12 +678,11 @@
   return m_wsNext.GetLength() != 0;
 }
 
-CFX_RetainPtr<IFX_FileAccess> CFX_FontSourceEnum_File::GetNext() {
+CFX_RetainPtr<CFX_CRTFileAccess> CFX_FontSourceEnum_File::GetNext() {
   if (m_wsNext.GetLength() == 0)
     return nullptr;
 
-  CFX_RetainPtr<IFX_FileAccess> pAccess =
-      IFX_FileAccess::CreateDefault(m_wsNext.AsStringC());
+  auto pAccess = pdfium::MakeRetain<CFX_CRTFileAccess>(m_wsNext.AsStringC());
   m_wsNext = GetNextFile().UTF8Decode();
   return pAccess;
 }
@@ -733,7 +732,8 @@
   if (!m_pFontSource->HasStartPosition())
     return !m_InstalledFonts.empty();
 
-  while (CFX_RetainPtr<IFX_FileAccess> pFontSource = m_pFontSource->GetNext()) {
+  while (CFX_RetainPtr<CFX_CRTFileAccess> pFontSource =
+             m_pFontSource->GetNext()) {
     CFX_RetainPtr<IFX_SeekableReadStream> pFontStream =
         pFontSource->CreateFileStream(FX_FILEMODE_ReadOnly);
     if (pFontStream)
diff --git a/xfa/fgas/font/cfgas_fontmgr.h b/xfa/fgas/font/cfgas_fontmgr.h
index cca999a..1ef78a7 100644
--- a/xfa/fgas/font/cfgas_fontmgr.h
+++ b/xfa/fgas/font/cfgas_fontmgr.h
@@ -13,9 +13,10 @@
 #include <set>
 #include <vector>
 
+#include "core/fxcrt/cfx_crtfileaccess.h"
 #include "core/fxcrt/cfx_retain_ptr.h"
 #include "core/fxcrt/cfx_seekablestreamproxy.h"
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 #include "core/fxge/cfx_fontmapper.h"
 #include "core/fxge/fx_freetype.h"
 #include "core/fxge/ifx_systemfontinfo.h"
@@ -169,7 +170,7 @@
   ~CFX_FontSourceEnum_File();
 
   bool HasStartPosition();
-  CFX_RetainPtr<IFX_FileAccess> GetNext();
+  CFX_RetainPtr<CFX_CRTFileAccess> GetNext();
 
  private:
   CFX_ByteString GetNextFile();
diff --git a/xfa/fgas/font/fgas_fontutils.cpp b/xfa/fgas/font/fgas_fontutils.cpp
index 8293009..44f9423 100644
--- a/xfa/fgas/font/fgas_fontutils.cpp
+++ b/xfa/fgas/font/fgas_fontutils.cpp
@@ -7,7 +7,7 @@
 #include "xfa/fgas/font/fgas_fontutils.h"
 
 #include "core/fxcrt/fx_codepage.h"
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 #include "xfa/fgas/font/cfgas_fontmgr.h"
 
 namespace {
diff --git a/xfa/fwl/cfwl_notedriver.cpp b/xfa/fwl/cfwl_notedriver.cpp
index 9012100..364ef19 100644
--- a/xfa/fwl/cfwl_notedriver.cpp
+++ b/xfa/fwl/cfwl_notedriver.cpp
@@ -9,7 +9,7 @@
 #include <algorithm>
 #include <utility>
 
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 #include "third_party/base/ptr_util.h"
 #include "third_party/base/stl_util.h"
 #include "xfa/fwl/cfwl_app.h"
diff --git a/xfa/fxfa/app/xfa_ffbarcode.cpp b/xfa/fxfa/app/xfa_ffbarcode.cpp
index 92d6877..4e5e1f0 100644
--- a/xfa/fxfa/app/xfa_ffbarcode.cpp
+++ b/xfa/fxfa/app/xfa_ffbarcode.cpp
@@ -8,7 +8,7 @@
 
 #include <utility>
 
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 #include "third_party/base/ptr_util.h"
 #include "xfa/fwl/cfwl_app.h"
 #include "xfa/fwl/cfwl_barcode.h"
diff --git a/xfa/fxfa/cxfa_ffdoc.cpp b/xfa/fxfa/cxfa_ffdoc.cpp
index 04741f9..5e36c08 100644
--- a/xfa/fxfa/cxfa_ffdoc.cpp
+++ b/xfa/fxfa/cxfa_ffdoc.cpp
@@ -15,7 +15,7 @@
 #include "core/fpdfapi/parser/fpdf_parser_decode.h"
 #include "core/fpdfdoc/cpdf_nametree.h"
 #include "core/fxcrt/cfx_checksumcontext.h"
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 #include "core/fxcrt/fx_memory.h"
 #include "core/fxcrt/xml/cfx_xmlelement.h"
 #include "core/fxcrt/xml/cfx_xmlnode.h"
diff --git a/xfa/fxfa/cxfa_ffdocview.cpp b/xfa/fxfa/cxfa_ffdocview.cpp
index 488a31f..00f759a 100644
--- a/xfa/fxfa/cxfa_ffdocview.cpp
+++ b/xfa/fxfa/cxfa_ffdocview.cpp
@@ -6,7 +6,7 @@
 
 #include "xfa/fxfa/cxfa_ffdocview.h"
 
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 #include "third_party/base/ptr_util.h"
 #include "third_party/base/stl_util.h"
 #include "xfa/fxfa/app/xfa_ffbarcode.h"
diff --git a/xfa/fxfa/cxfa_fontmgr.h b/xfa/fxfa/cxfa_fontmgr.h
index 8652a34..f66ca8f 100644
--- a/xfa/fxfa/cxfa_fontmgr.h
+++ b/xfa/fxfa/cxfa_fontmgr.h
@@ -12,7 +12,7 @@
 #include <vector>
 
 #include "core/fxcrt/cfx_retain_ptr.h"
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 #include "core/fxcrt/fx_system.h"
 #include "xfa/fgas/font/cfgas_fontmgr.h"
 #include "xfa/fxfa/cxfa_deffontmgr.h"
diff --git a/xfa/fxfa/fm2js/xfa_fm2jscontext.cpp b/xfa/fxfa/fm2js/xfa_fm2jscontext.cpp
index 4621dfe..bf44ffb 100644
--- a/xfa/fxfa/fm2js/xfa_fm2jscontext.cpp
+++ b/xfa/fxfa/fm2js/xfa_fm2jscontext.cpp
@@ -11,7 +11,7 @@
 #include <algorithm>
 
 #include "core/fxcrt/cfx_decimal.h"
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 #include "fxjs/cfxjse_arguments.h"
 #include "fxjs/cfxjse_class.h"
 #include "fxjs/cfxjse_value.h"
diff --git a/xfa/fxfa/fm2js/xfa_lexer.cpp b/xfa/fxfa/fm2js/xfa_lexer.cpp
index 7ccd477..b646743 100644
--- a/xfa/fxfa/fm2js/xfa_lexer.cpp
+++ b/xfa/fxfa/fm2js/xfa_lexer.cpp
@@ -6,7 +6,7 @@
 
 #include "xfa/fxfa/fm2js/xfa_lexer.h"
 
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 
 namespace {
 
diff --git a/xfa/fxfa/fm2js/xfa_simpleexpression.cpp b/xfa/fxfa/fm2js/xfa_simpleexpression.cpp
index 7bc703b..872fe7e 100644
--- a/xfa/fxfa/fm2js/xfa_simpleexpression.cpp
+++ b/xfa/fxfa/fm2js/xfa_simpleexpression.cpp
@@ -8,7 +8,7 @@
 
 #include <utility>
 
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 
 namespace {
 
diff --git a/xfa/fxfa/parser/cxfa_data.cpp b/xfa/fxfa/parser/cxfa_data.cpp
index 9f265b4..bdfc25c 100644
--- a/xfa/fxfa/parser/cxfa_data.cpp
+++ b/xfa/fxfa/parser/cxfa_data.cpp
@@ -6,7 +6,7 @@
 
 #include "xfa/fxfa/parser/cxfa_data.h"
 
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 #include "xfa/fxfa/parser/cxfa_measurement.h"
 #include "xfa/fxfa/parser/cxfa_node.h"
 
diff --git a/xfa/fxfa/parser/cxfa_document.cpp b/xfa/fxfa/parser/cxfa_document.cpp
index 8e39daf..4b0a398 100644
--- a/xfa/fxfa/parser/cxfa_document.cpp
+++ b/xfa/fxfa/parser/cxfa_document.cpp
@@ -4,7 +4,9 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#include "core/fxcrt/fx_ext.h"
+#include "xfa/fxfa/parser/cxfa_document.h"
+
+#include "core/fxcrt/fx_extension.h"
 #include "xfa/fxfa/app/xfa_ffnotify.h"
 #include "xfa/fxfa/parser/cscript_datawindow.h"
 #include "xfa/fxfa/parser/cscript_eventpseudomodel.h"
@@ -12,7 +14,6 @@
 #include "xfa/fxfa/parser/cscript_layoutpseudomodel.h"
 #include "xfa/fxfa/parser/cscript_logpseudomodel.h"
 #include "xfa/fxfa/parser/cscript_signaturepseudomodel.h"
-#include "xfa/fxfa/parser/cxfa_document.h"
 #include "xfa/fxfa/parser/cxfa_document_parser.h"
 #include "xfa/fxfa/parser/cxfa_layoutprocessor.h"
 #include "xfa/fxfa/parser/cxfa_localemgr.h"
diff --git a/xfa/fxfa/parser/cxfa_localevalue.cpp b/xfa/fxfa/parser/cxfa_localevalue.cpp
index 6778092..d2e526e 100644
--- a/xfa/fxfa/parser/cxfa_localevalue.cpp
+++ b/xfa/fxfa/parser/cxfa_localevalue.cpp
@@ -8,7 +8,7 @@
 
 #include <vector>
 
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 #include "third_party/base/ptr_util.h"
 #include "third_party/base/stl_util.h"
 #include "xfa/fgas/crt/cfgas_formatstring.h"
diff --git a/xfa/fxfa/parser/cxfa_measurement.cpp b/xfa/fxfa/parser/cxfa_measurement.cpp
index fd00c42..9173223 100644
--- a/xfa/fxfa/parser/cxfa_measurement.cpp
+++ b/xfa/fxfa/parser/cxfa_measurement.cpp
@@ -6,7 +6,7 @@
 
 #include "xfa/fxfa/parser/cxfa_measurement.h"
 
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 
 CXFA_Measurement::CXFA_Measurement(const CFX_WideStringC& wsMeasure) {
   Set(wsMeasure);
diff --git a/xfa/fxfa/parser/cxfa_node.cpp b/xfa/fxfa/parser/cxfa_node.cpp
index ce45ae1..a3c9ee4 100644
--- a/xfa/fxfa/parser/cxfa_node.cpp
+++ b/xfa/fxfa/parser/cxfa_node.cpp
@@ -14,7 +14,7 @@
 
 #include "core/fxcrt/cfx_decimal.h"
 #include "core/fxcrt/fx_codepage.h"
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 #include "core/fxcrt/xml/cfx_xmlelement.h"
 #include "core/fxcrt/xml/cfx_xmlnode.h"
 #include "core/fxcrt/xml/cfx_xmltext.h"
diff --git a/xfa/fxfa/parser/cxfa_nodehelper.cpp b/xfa/fxfa/parser/cxfa_nodehelper.cpp
index abfca84..547831c 100644
--- a/xfa/fxfa/parser/cxfa_nodehelper.cpp
+++ b/xfa/fxfa/parser/cxfa_nodehelper.cpp
@@ -6,7 +6,7 @@
 
 #include "xfa/fxfa/parser/cxfa_nodehelper.h"
 
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 #include "xfa/fxfa/parser/cxfa_document.h"
 #include "xfa/fxfa/parser/cxfa_localemgr.h"
 #include "xfa/fxfa/parser/cxfa_node.h"
diff --git a/xfa/fxfa/parser/cxfa_nodelist.cpp b/xfa/fxfa/parser/cxfa_nodelist.cpp
index 86efb29..f47a1b1 100644
--- a/xfa/fxfa/parser/cxfa_nodelist.cpp
+++ b/xfa/fxfa/parser/cxfa_nodelist.cpp
@@ -8,7 +8,7 @@
 
 #include <memory>
 
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 #include "xfa/fxfa/parser/cxfa_document.h"
 #include "xfa/fxfa/parser/cxfa_node.h"
 #include "xfa/fxfa/parser/cxfa_scriptcontext.h"
diff --git a/xfa/fxfa/parser/cxfa_object.cpp b/xfa/fxfa/parser/cxfa_object.cpp
index 9bbee4e..30aae88 100644
--- a/xfa/fxfa/parser/cxfa_object.cpp
+++ b/xfa/fxfa/parser/cxfa_object.cpp
@@ -6,7 +6,7 @@
 
 #include "xfa/fxfa/parser/cxfa_object.h"
 
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 #include "fxjs/cfxjse_value.h"
 #include "xfa/fxfa/app/xfa_ffnotify.h"
 #include "xfa/fxfa/parser/cxfa_document.h"
diff --git a/xfa/fxfa/parser/cxfa_resolveprocessor.cpp b/xfa/fxfa/parser/cxfa_resolveprocessor.cpp
index 51487a1..14adc77 100644
--- a/xfa/fxfa/parser/cxfa_resolveprocessor.cpp
+++ b/xfa/fxfa/parser/cxfa_resolveprocessor.cpp
@@ -10,7 +10,7 @@
 #include <utility>
 #include <vector>
 
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 #include "third_party/base/ptr_util.h"
 #include "third_party/base/stl_util.h"
 #include "xfa/fxfa/parser/cxfa_document.h"
diff --git a/xfa/fxfa/parser/cxfa_scriptcontext.cpp b/xfa/fxfa/parser/cxfa_scriptcontext.cpp
index f539c39..b0b5229 100644
--- a/xfa/fxfa/parser/cxfa_scriptcontext.cpp
+++ b/xfa/fxfa/parser/cxfa_scriptcontext.cpp
@@ -8,7 +8,7 @@
 
 #include <utility>
 
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 #include "fxjs/cfxjse_arguments.h"
 #include "fxjs/cfxjse_class.h"
 #include "fxjs/cfxjse_value.h"
diff --git a/xfa/fxfa/parser/cxfa_simple_parser.cpp b/xfa/fxfa/parser/cxfa_simple_parser.cpp
index 9fd684c..db15a80 100644
--- a/xfa/fxfa/parser/cxfa_simple_parser.cpp
+++ b/xfa/fxfa/parser/cxfa_simple_parser.cpp
@@ -12,7 +12,7 @@
 #include "core/fxcrt/cfx_checksumcontext.h"
 #include "core/fxcrt/cfx_seekablestreamproxy.h"
 #include "core/fxcrt/fx_codepage.h"
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 #include "core/fxcrt/xml/cfx_xmlchardata.h"
 #include "core/fxcrt/xml/cfx_xmldoc.h"
 #include "core/fxcrt/xml/cfx_xmlelement.h"
diff --git a/xfa/fxfa/parser/cxfa_widgetdata.cpp b/xfa/fxfa/parser/cxfa_widgetdata.cpp
index 8784b6e..2f90f59 100644
--- a/xfa/fxfa/parser/cxfa_widgetdata.cpp
+++ b/xfa/fxfa/parser/cxfa_widgetdata.cpp
@@ -7,7 +7,7 @@
 #include "xfa/fxfa/parser/cxfa_widgetdata.h"
 
 #include "core/fxcrt/cfx_decimal.h"
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 #include "fxbarcode/BC_Library.h"
 #include "third_party/base/stl_util.h"
 #include "xfa/fxfa/app/xfa_ffnotify.h"
diff --git a/xfa/fxfa/parser/xfa_document_datamerger_imp.cpp b/xfa/fxfa/parser/xfa_document_datamerger_imp.cpp
index f338595..46a2af4 100644
--- a/xfa/fxfa/parser/xfa_document_datamerger_imp.cpp
+++ b/xfa/fxfa/parser/xfa_document_datamerger_imp.cpp
@@ -9,7 +9,7 @@
 #include <map>
 #include <vector>
 
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 #include "core/fxcrt/xml/cfx_xmlelement.h"
 #include "core/fxcrt/xml/cfx_xmlnode.h"
 #include "third_party/base/stl_util.h"
diff --git a/xfa/fxfa/parser/xfa_utils.cpp b/xfa/fxfa/parser/xfa_utils.cpp
index 1c5adc7..fa75f18 100644
--- a/xfa/fxfa/parser/xfa_utils.cpp
+++ b/xfa/fxfa/parser/xfa_utils.cpp
@@ -8,7 +8,7 @@
 
 #include <algorithm>
 
-#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/fx_extension.h"
 #include "core/fxcrt/xml/cfx_xmlchardata.h"
 #include "core/fxcrt/xml/cfx_xmlelement.h"
 #include "core/fxcrt/xml/cfx_xmlnode.h"