diff --git a/BUILD.gn b/BUILD.gn
index 2e47163..9b8fdf7 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -7,7 +7,6 @@
 config("pdfium_config") {
   cflags = []
   defines = [
-    "FOXIT_CHROME_BUILD",
     "_FXFT_VERSION_=2501",
     "_FPDFSDK_LIB",
     "_NO_GDIPLUS_",  # workaround text rendering issues on Windows
@@ -43,7 +42,6 @@
     "fpdfsdk/include/fpdfdoc.h",
     "fpdfsdk/include/fpdfedit.h",
     "fpdfsdk/include/fpdfformfill.h",
-    "fpdfsdk/include/fpdfoom.h",
     "fpdfsdk/include/fpdftext.h",
     "fpdfsdk/include/fpdfview.h",
     "fpdfsdk/include/fpdf_dataavail.h",
@@ -61,7 +59,6 @@
     "fpdfsdk/src/fpdfeditimg.cpp",
     "fpdfsdk/src/fpdfeditpage.cpp",
     "fpdfsdk/src/fpdfformfill.cpp",
-    "fpdfsdk/src/fpdfoom.cpp",
     "fpdfsdk/src/fpdfppo.cpp",
     "fpdfsdk/src/fpdfsave.cpp",
     "fpdfsdk/src/fpdftext.cpp",
@@ -282,7 +279,6 @@
     "core/src/fpdfapi/fpdf_page/fpdf_page_graph_state.cpp",
     "core/src/fpdfapi/fpdf_page/fpdf_page_image.cpp",
     "core/src/fpdfapi/fpdf_page/fpdf_page_parser.cpp",
-    "core/src/fpdfapi/fpdf_page/fpdf_page_parser_new.cpp",
     "core/src/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp",
     "core/src/fpdfapi/fpdf_page/fpdf_page_path.cpp",
     "core/src/fpdfapi/fpdf_page/fpdf_page_pattern.cpp",
@@ -634,7 +630,6 @@
     "core/src/fxge/ge/fx_ge_device.cpp",
     "core/src/fxge/ge/fx_ge_font.cpp",
     "core/src/fxge/ge/fx_ge_fontmap.cpp",
-    "core/src/fxge/ge/fx_ge_linux.cpp",
     "core/src/fxge/ge/fx_ge_path.cpp",
     "core/src/fxge/ge/fx_ge_ps.cpp",
     "core/src/fxge/ge/fx_ge_text.cpp",
diff --git a/core/include/fpdfapi/fpdf_module.h b/core/include/fpdfapi/fpdf_module.h
index 8f0621a..cec8155 100644
--- a/core/include/fpdfapi/fpdf_module.h
+++ b/core/include/fpdfapi/fpdf_module.h
@@ -48,11 +48,6 @@
 
     void		InitRenderModule();
 
-
-    void		SetModulePath(FX_LPCSTR module_name, FX_LPCSTR path);
-
-    CFX_ByteString GetModuleFilePath(FX_LPCSTR module_name, FX_LPCSTR name);
-
     void		SetDownloadCallback(FX_BOOL (*callback)(FX_LPCSTR module_name));
 
     FX_BOOL		DownloadModule(FX_LPCSTR module_name);
@@ -118,10 +113,6 @@
 
     FX_BOOL (*m_pDownloadCallback)(FX_LPCSTR module_name);
 
-    CFX_ByteString			m_DefaultModulePath;
-
-    CFX_CMapByteStringToPtr	m_ModulePathList;
-
     CFX_MapByteStringToPtr	m_SecurityHandlerMap;
 
     CFX_PrivateData			m_privateData;
diff --git a/core/src/fpdfapi/fpdf_basic_module.cpp b/core/src/fpdfapi/fpdf_basic_module.cpp
index a446aa5..edccda5 100644
--- a/core/src/fpdfapi/fpdf_basic_module.cpp
+++ b/core/src/fpdfapi/fpdf_basic_module.cpp
@@ -78,40 +78,6 @@
     }
 #endif
 }
-void CPDF_ModuleMgr::SetModulePath(FX_LPCSTR module_name, FX_LPCSTR path)
-{
-    if (module_name == NULL || module_name[0] == 0) {
-        m_DefaultModulePath = path;
-    } else {
-        m_ModulePathList.SetAt(module_name, FX_NEW CFX_ByteString(path, -1));
-    }
-}
-CFX_ByteString CPDF_ModuleMgr::GetModuleFilePath(FX_LPCSTR module_name, FX_LPCSTR name)
-{
-    CFX_ByteString* pPath = NULL;
-    if (m_ModulePathList.Lookup(module_name, (FX_LPVOID&)pPath)) {
-        return _GetPath(*pPath, name);
-    }
-    if (!m_DefaultModulePath.IsEmpty()) {
-        return _GetPath(m_DefaultModulePath, name);
-    }
-#if _FXM_PLATFORM_  == _FXM_PLATFORM_WINDOWS_
-    FX_WCHAR app_path[260];
-    ::GetModuleFileNameW(NULL, (LPWSTR)app_path, 260);
-    FX_INTPTR len = FXSYS_wcslen(app_path);
-    for (FX_INTPTR i = len; i >= 0; i --)
-        if (app_path[i] == '\\') {
-            app_path[i] = 0;
-            break;
-        }
-    CFX_ByteString path = CFX_ByteString::FromUnicode(app_path);
-    path += '\\';
-    path += name;
-    return path;
-#else
-    return name;
-#endif
-}
 void CPDF_ModuleMgr::NotifyModuleAvailable(FX_LPCSTR module_name)
 {
     if (FXSYS_strcmp(module_name, ADDIN_NAME_CJK) == 0) {
diff --git a/core/src/fpdfapi/fpdf_font/font_int.h b/core/src/fpdfapi/fpdf_font/font_int.h
index 3ce9664..2922ed2 100644
--- a/core/src/fpdfapi/fpdf_font/font_int.h
+++ b/core/src/fpdfapi/fpdf_font/font_int.h
@@ -18,10 +18,8 @@
     CPDF_CMap*				LoadPredefinedCMap(const CFX_ByteString& name,  FX_BOOL bPrompt);
     CPDF_CID2UnicodeMap*	LoadCID2UnicodeMap(int charset, FX_BOOL bPrompt);
     void					DropAll(FX_BOOL bReload);
-#ifndef _FPDFAPI_MINI_
     FX_BOOL					m_bPrompted;
     FX_LPVOID				m_pPackage;
-#endif
     CFX_MapByteStringToPtr	m_CMaps;
     CPDF_CID2UnicodeMap*	m_CID2UnicodeMaps[6];
 };
@@ -178,9 +176,7 @@
     int			m_Charset;
     const FX_WORD*	m_pEmbeddedMap;
     FX_DWORD	m_EmbeddedCount;
-#ifndef _FPDFAPI_MINI_
     CPDF_FXMP*	m_pExternalMap;
-#endif
 };
 class CPDF_ToUnicodeMap : public CFX_Object
 {
diff --git a/core/src/fpdfapi/fpdf_font/fpdf_font_cid.cpp b/core/src/fpdfapi/fpdf_font/fpdf_font_cid.cpp
index e5dabc3..766fd35 100644
--- a/core/src/fpdfapi/fpdf_font/fpdf_font_cid.cpp
+++ b/core/src/fpdfapi/fpdf_font/fpdf_font_cid.cpp
@@ -19,40 +19,21 @@
 extern FX_LPCSTR GetAdobeCharName(int iBaseEncoding, const CFX_ByteString* pCharNames, int charcode);
 CPDF_CMapManager::CPDF_CMapManager()
 {
-#ifndef _FPDFAPI_MINI_
     m_bPrompted = FALSE;
     m_pPackage = NULL;
-#endif
     FXSYS_memset32(m_CID2UnicodeMaps, 0, sizeof m_CID2UnicodeMaps);
 }
 CPDF_CMapManager::~CPDF_CMapManager()
 {
     DropAll(FALSE);
-#ifndef _FPDFAPI_MINI_
     if (m_pPackage) {
         FXFC_ClosePackage(m_pPackage);
     }
-#endif
 }
-#ifndef _FPDFAPI_MINI_
 FX_LPVOID CPDF_CMapManager::GetPackage(FX_BOOL bPrompt)
 {
-#ifndef FOXIT_CHROME_BUILD
-    if (m_pPackage == NULL) {
-        CFX_ByteString filename = CPDF_ModuleMgr::Get()->GetModuleFilePath(ADDIN_NAME_CJK, "FPDFCJK.BIN");
-        m_pPackage = FXFC_LoadPackage(filename);
-        if (bPrompt && m_pPackage == NULL && !m_bPrompted) {
-            m_bPrompted = TRUE;
-            if (!CPDF_ModuleMgr::Get()->DownloadModule(ADDIN_NAME_CJK)) {
-                return NULL;
-            }
-            m_pPackage = FXFC_LoadPackage(filename);
-        }
-    }
-#endif
     return m_pPackage;
 }
-#endif
 CPDF_CMap* CPDF_CMapManager::GetPredefinedCMap(const CFX_ByteString& name, FX_BOOL bPromptCJK)
 {
     CPDF_CMap* pCMap;
@@ -418,7 +399,6 @@
         m_bLoaded = TRUE;
         return TRUE;
     }
-#ifndef _FPDFAPI_MINI_
     FX_LPVOID pPackage = pMgr->GetPackage(bPromptCJK);
     FX_LPBYTE pBuffer;
     FX_DWORD size;
@@ -462,7 +442,6 @@
     }
     FX_Free(pBuffer);
     m_bLoaded = TRUE;
-#endif
     return TRUE;
 }
 extern "C" {
@@ -739,32 +718,22 @@
 CPDF_CID2UnicodeMap::CPDF_CID2UnicodeMap()
 {
     m_EmbeddedCount = 0;
-#ifndef _FPDFAPI_MINI_
     m_pExternalMap = NULL;
-#endif
 }
 CPDF_CID2UnicodeMap::~CPDF_CID2UnicodeMap()
 {
-#ifndef _FPDFAPI_MINI_
     if (m_pExternalMap) {
         delete m_pExternalMap;
     }
-#endif
 }
 FX_BOOL CPDF_CID2UnicodeMap::Initialize()
 {
-#ifndef _FPDFAPI_MINI_
     m_pExternalMap = FX_NEW CPDF_FXMP;
-#endif
     return TRUE;
 }
 FX_BOOL CPDF_CID2UnicodeMap::IsLoaded()
 {
-#ifdef _FPDFAPI_MINI_
-    return m_EmbeddedCount != 0;
-#else
     return m_EmbeddedCount != 0 || (m_pExternalMap != NULL && m_pExternalMap->IsLoaded());
-#endif
 }
 FX_WCHAR CPDF_CID2UnicodeMap::UnicodeFromCID(FX_WORD CID)
 {
@@ -774,15 +743,11 @@
     if (CID < m_EmbeddedCount) {
         return m_pEmbeddedMap[CID];
     }
-#ifdef _FPDFAPI_MINI_
-    return 0;
-#else
     FX_LPCBYTE record = m_pExternalMap->GetRecord(CID);
     if (record == NULL) {
         return 0;
     }
     return *(FX_WORD*)record;
-#endif
 }
 void FPDFAPI_LoadCID2UnicodeMap(int charset, const FX_WORD*& pMap, FX_DWORD& count);
 void CPDF_CID2UnicodeMap::Load(CPDF_CMapManager* pMgr, int charset, FX_BOOL bPromptCJK)
@@ -792,13 +757,11 @@
     if (m_EmbeddedCount) {
         return;
     }
-#ifndef _FPDFAPI_MINI_
     FX_LPVOID pPackage = pMgr->GetPackage(bPromptCJK);
     if (pPackage == NULL) {
         return;
     }
     m_pExternalMap->LoadFile(pPackage, FX_BSTRC("CIDInfo_") + g_CharsetNames[charset]);
-#endif
 }
 #include "ttgsubtable.h"
 CPDF_CIDFont::CPDF_CIDFont()
@@ -1356,7 +1319,7 @@
             if (unicode == '\\') {
                 unicode = '/';
             }
-#if !defined(_FPDFAPI_MINI_) && _FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_
+#if _FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_
             else if (unicode == 0xa5) {
                 unicode = 0x5c;
             }
diff --git a/core/src/fpdfapi/fpdf_font/fpdf_font_utility.cpp b/core/src/fpdfapi/fpdf_font/fpdf_font_utility.cpp
index d7c725c..5c4852d 100644
--- a/core/src/fpdfapi/fpdf_font/fpdf_font_utility.cpp
+++ b/core/src/fpdfapi/fpdf_font/fpdf_font_utility.cpp
@@ -8,7 +8,6 @@
 #include "../../../include/fpdfapi/fpdf_resource.h"
 #include "../../../include/fxcodec/fx_codec.h"
 #include "font_int.h"
-#ifndef _FPDFAPI_MINI_
 typedef struct {
     FXSYS_FILE*	m_pFile;
     int		m_nFiles;
@@ -93,4 +92,3 @@
     }
     return m_pTable + (index - m_pHeader->dwStartIndex) * m_pHeader->dwRecordSize;
 }
-#endif
diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_image.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_image.cpp
index b1fbe01..5d24ab7 100644
--- a/core/src/fpdfapi/fpdf_page/fpdf_page_image.cpp
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page_image.cpp
@@ -77,15 +77,6 @@
 {
     if (m_bInline) {
         if (m_pStream) {
-#ifndef FOXIT_CHROME_BUILD
-            CPDF_Dictionary* pDict = m_pStream->GetDict();
-            if (pDict) {
-                CPDF_Object* pCSObj = pDict->GetElementValue(FX_BSTRC("ColorSpace"));
-                if (pCSObj && m_pDocument) {
-                    m_pDocument->RemoveColorSpaceFromPageData(pCSObj);
-                }
-            }
-#endif
             m_pStream->Release();
         }
         if (m_pInlineDict) {
@@ -107,9 +98,7 @@
     }
     m_pOC = pDict->GetDict(FX_BSTRC("OC"));
     m_bIsMask = !pDict->KeyExist(FX_BSTRC("ColorSpace")) || pDict->GetInteger(FX_BSTRC("ImageMask"));
-#ifndef _FPDFAPI_MINI_
     m_bInterpolate = pDict->GetInteger(FX_BSTRC("Interpolate"));
-#endif
     m_Height = pDict->GetInteger(FX_BSTRC("Height"));
     m_Width = pDict->GetInteger(FX_BSTRC("Width"));
     return TRUE;
diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_parser.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_parser.cpp
index 7d8bd48..879c2f3 100644
--- a/core/src/fpdfapi/fpdf_page/fpdf_page_parser.cpp
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page_parser.cpp
@@ -29,33 +29,9 @@
     m_pLastImage = NULL;
     m_bReleaseLastDict = TRUE;
     m_pParentResources = NULL;
-#ifdef _FPDFAPI_MINI_
-    m_pObjectState = NULL;
-    m_pObjectStack = NULL;
-    m_pWordBuf = NULL;
-    m_pDictName = NULL;
-    m_pStreamBuf = NULL;
-    m_WordState = 0;
-    m_ObjectSize = 0;
-#endif
 }
 FX_BOOL CPDF_StreamContentParser::Initialize()
 {
-#ifdef _FPDFAPI_MINI_
-    m_pObjectState = FX_Alloc(FX_BOOL, _FPDF_MAX_OBJECT_STACK_SIZE_);
-    FXSYS_memset32(m_pObjectState, 0, _FPDF_MAX_OBJECT_STACK_SIZE_ * sizeof(FX_BOOL));
-    m_pObjectStack = FX_Alloc(CPDF_Object*, _FPDF_MAX_OBJECT_STACK_SIZE_);
-    FXSYS_memset32(m_pObjectStack, 0, _FPDF_MAX_OBJECT_STACK_SIZE_ * sizeof(CPDF_Object*));
-    m_pWordBuf = FX_Alloc(FX_BYTE, 256);
-    FXSYS_memset32(m_pWordBuf, 0, 256 * sizeof(FX_BYTE));
-    m_pDictName = FX_Alloc(FX_BYTE, 256);
-    FXSYS_memset32(m_pDictName, 0, 256 * sizeof(FX_BYTE));
-    m_pStreamBuf = FX_Alloc(FX_BYTE, STREAM_PARSE_BUFSIZE);
-    FXSYS_memset32(m_pStreamBuf, 0, STREAM_PARSE_BUFSIZE * sizeof(FX_BYTE));
-    m_StringBuf.EstimateSize(1024);
-    m_ObjectSize = 0;
-    m_ImageSrcBuf.EstimateSize(STREAM_PARSE_BUFSIZE);
-#endif
     return TRUE;
 }
 CPDF_StreamContentParser::~CPDF_StreamContentParser()
@@ -77,18 +53,6 @@
     if (m_pLastCloneImageDict) {
         m_pLastCloneImageDict->Release();
     }
-#ifdef _FPDFAPI_MINI_
-    for (i = 0; i < (int)m_ObjectSize; ++i) {
-        if (!m_pObjectState[i]) {
-            m_pObjectStack[i]->Release();
-        }
-    }
-    FX_Free(m_pObjectStack);
-    FX_Free(m_pObjectState);
-    FX_Free(m_pStreamBuf);
-    FX_Free(m_pWordBuf);
-    FX_Free(m_pDictName);
-#endif
 }
 void CPDF_StreamContentParser::PrepareParse(CPDF_Document* pDocument,
         CPDF_Dictionary* pPageResources, CPDF_Dictionary* pParentResources, CFX_AffineMatrix* pmtContentToUser, CPDF_PageObjects* pObjList,
@@ -128,9 +92,6 @@
         m_pCurStates->m_TextState.New();
         m_pCurStates->m_ColorState.New();
     }
-#ifdef _FPDFAPI_MINI_
-    FXSYS_memset32(m_pObjectState, 0, _FPDF_MAX_OBJECT_STACK_SIZE_ * sizeof(FX_BOOL));
-#endif
 }
 int CPDF_StreamContentParser::GetNextParamPos()
 {
@@ -676,11 +637,7 @@
 {
     CFX_ByteString name = GetString(0);
     if (name == m_LastImageName && m_pLastImage && m_pLastImage->GetStream() && m_pLastImage->GetStream()->GetObjNum()) {
-#if defined(_FPDFAPI_MINI_) && !defined(_FXCORE_FEATURE_ALL_)
-        AddDuplicateImage();
-#else
         AddImage(NULL, m_pLastImage, FALSE);
-#endif
         return;
     }
     if (m_Options.m_bTextOnly) {
@@ -744,7 +701,6 @@
 }
 void CPDF_StreamContentParser::AddForm(CPDF_Stream* pStream)
 {
-#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
     if (!m_Options.m_bSeparateForm) {
         CPDF_Dictionary* pResources = pStream->GetDict()->GetDict(FX_BSTRC("Resources"));
         CFX_AffineMatrix form_matrix = pStream->GetDict()->GetMatrix(FX_BSTRC("Matrix"));
@@ -772,15 +728,9 @@
         if (stream.GetSize() == 0) {
             return;
         }
-#ifdef _FPDFAPI_MINI_
-        parser.InputData(stream.GetData(), stream.GetSize());
-        parser.Finish();
-#else
         parser.Parse(stream.GetData(), stream.GetSize(), 0);
-#endif
         return;
     }
-#endif
     CPDF_FormObject* pFormObj = FX_NEW CPDF_FormObject;
     pFormObj->m_pForm = FX_NEW CPDF_Form(m_pDocument, m_pPageResources, pStream, m_pResources);
     pFormObj->m_FormMatrix = m_pCurStates->m_CTM;
@@ -798,44 +748,6 @@
     SetGraphicStates(pFormObj, TRUE, TRUE, TRUE);
     m_pObjectList->m_ObjectList.AddTail(pFormObj);
 }
-#if defined(_FPDFAPI_MINI_) && !defined(_FXCORE_FEATURE_ALL_)
-void CPDF_StreamContentParser::AddDuplicateImage()
-{
-    FX_POSITION tailpos = m_pObjectList->m_ObjectList.GetTailPosition();
-    CPDF_PageObject* pLastObj = (CPDF_PageObject*)m_pObjectList->m_ObjectList.GetAt(tailpos);
-    if (pLastObj == NULL || (pLastObj->m_Type != PDFPAGE_INLINES && pLastObj->m_Type != PDFPAGE_IMAGE)) {
-        AddImage(NULL, m_pLastImage, FALSE);
-        return;
-    }
-    if (pLastObj->m_GeneralState != m_pCurStates->m_GeneralState ||
-            pLastObj->m_ClipPath != m_pCurStates->m_ClipPath ||
-            pLastObj->m_ColorState != m_pCurStates->m_ColorState) {
-        AddImage(NULL, m_pLastImage, FALSE);
-        return;
-    }
-    CFX_AffineMatrix ImageMatrix;
-    ImageMatrix.Copy(m_pCurStates->m_CTM);
-    ImageMatrix.Concat(m_mtContentToUser);
-    if (pLastObj->m_Type == PDFPAGE_INLINES) {
-        CPDF_InlineImages* pInlines = (CPDF_InlineImages*)pLastObj;
-        if (pInlines->m_pStream != m_pLastImage->GetStream()) {
-            AddImage(NULL, m_pLastImage, FALSE);
-            return;
-        }
-        pInlines->AddMatrix(ImageMatrix);
-    } else {
-        CPDF_ImageObject* pImageObj = (CPDF_ImageObject*)pLastObj;
-        CPDF_InlineImages* pInlines = FX_NEW CPDF_InlineImages;
-        pInlines->m_pStream = m_pLastImage->GetStream();
-        SetGraphicStates(pInlines, !pInlines->m_pStream->GetDict()->KeyExist(FX_BSTRC("ColorSpace")), FALSE, FALSE);
-        pInlines->AddMatrix(pImageObj->m_Matrix);
-        pInlines->AddMatrix(ImageMatrix);
-        m_pObjectList->m_ObjectList.RemoveAt(tailpos);
-        m_pObjectList->m_ObjectList.AddTail(pInlines);
-        pLastObj->Release();
-    }
-}
-#endif
 CPDF_ImageObject* CPDF_StreamContentParser::AddImage(CPDF_Stream* pStream, CPDF_Image* pImage, FX_BOOL bInline)
 {
     if (pStream == NULL && pImage == NULL) {
@@ -963,9 +875,7 @@
 }
 void CPDF_StreamContentParser::Handle_SetFlat()
 {
-#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
     m_pCurStates->m_GeneralState.GetModify()->m_Flatness = GetNumber(0);
-#endif
 }
 void CPDF_StreamContentParser::Handle_BeginImageData()
 {
@@ -1010,15 +920,11 @@
 {
     REQUIRE_PARAMS(2);
     if (m_Options.m_bTextOnly) {
-#ifndef _FPDFAPI_MINI_
         m_pSyntax->SkipPathObject();
-#endif
         return;
     }
     AddPathPoint(GetNumber(1), GetNumber(0), FXPT_MOVETO);
-#ifndef _FPDFAPI_MINI_
     ParsePathObject();
-#endif
 }
 void CPDF_StreamContentParser::Handle_SetMiterLimit()
 {
diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_parser_new.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_parser_new.cpp
deleted file mode 100644
index 24ec743..0000000
--- a/core/src/fpdfapi/fpdf_page/fpdf_page_parser_new.cpp
+++ /dev/null
@@ -1,822 +0,0 @@
-// Copyright 2014 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 "../../../include/fpdfapi/fpdf_page.h"
-#include "../../../include/fpdfapi/fpdf_module.h"
-#include "pageint.h"
-#if defined(_FPDFAPI_MINI_)
-extern const FX_LPCSTR _PDF_CharType;
-void CPDF_StreamContentParser::InputData(FX_LPCBYTE src_buf, FX_DWORD src_size)
-{
-    if (m_Level > _FPDF_MAX_FORM_LEVEL_) {
-        return;
-    }
-    for (FX_DWORD i = 0; i < src_size; i ++) {
-        int ch = src_buf[i];
-        int type = _PDF_CharType[ch];
-start:
-        switch (m_WordState) {
-            case 0:
-                if (type == 'W') {
-                } else if (type == 'N') {
-                    m_WordState = 5;
-                    m_pWordBuf[0] = ch;
-                    m_WordSize = 1;
-                } else if (type == 'R') {
-                    m_WordState = 4;
-                    m_pWordBuf[0] = ch;
-                    m_WordSize = 1;
-                } else switch (ch) {
-                        case '/':
-                            m_WordState = 2;
-                            m_WordSize = 0;
-                            break;
-                        case '[':
-                            StartArray();
-                            break;
-                        case ']':
-                            EndArray();
-                            break;
-                        case '(':
-                            m_WordState = 7;
-                            m_StringLevel = 1;
-                            m_StringState = 0;
-                            m_StringBuf.Clear();
-                            break;
-                        case '<':
-                            m_WordState = 3;
-                            break;
-                        case '>':
-                            m_WordState = 8;
-                            break;
-                        case '%':
-                            m_WordState = 1;
-                            break;
-                    }
-                break;
-            case 1:
-                if (ch == '\n' || ch == '\r') {
-                    m_WordState = 0;
-                }
-                break;
-            case 2:
-                if (type != 'R' && type != 'N') {
-                    EndName();
-                    m_WordState = 0;
-                    goto start;
-                }
-                if (m_WordSize < 256) {
-                    m_pWordBuf[m_WordSize++] = ch;
-                }
-                break;
-            case 3:
-                if (ch == '<') {
-                    StartDict();
-                    m_WordState = 0;
-                } else {
-                    m_StringBuf.Clear();
-                    m_WordState = 6;
-                    goto start;
-                }
-                break;
-            case 4:
-                if (type != 'R' && type != 'N') {
-                    m_WordState = 0;
-                    EndKeyword();
-                    if (m_bAbort) {
-                        return;
-                    }
-                    goto start;
-                }
-                if (m_WordSize < 256) {
-                    m_pWordBuf[m_WordSize++] = ch;
-                }
-                break;
-            case 5:
-                if (type != 'N') {
-                    EndNumber();
-                    m_WordState = 0;
-                    goto start;
-                }
-                if (m_WordSize < 256) {
-                    m_pWordBuf[m_WordSize++] = ch;
-                }
-                break;
-            case 6:
-                if (ch == '>') {
-                    EndHexString();
-                    m_WordState = 0;
-                } else {
-                    m_StringBuf.AppendByte(ch);
-                }
-                break;
-            case 7:
-                switch (m_StringState) {
-                    case 0:
-                        if (ch == ')') {
-                            m_StringLevel --;
-                            if (m_StringLevel == 0) {
-                                EndString();
-                                m_WordState = 0;
-                                break;
-                            }
-                            m_StringBuf.AppendByte(')');
-                        } else if (ch == '(') {
-                            m_StringLevel ++;
-                            m_StringBuf.AppendByte('(');
-                        } else if (ch == '\\') {
-                            m_StringState = 1;
-                        } else {
-                            m_StringBuf.AppendByte((char)ch);
-                        }
-                        break;
-                    case 1:
-                        if (ch >= '0' && ch <= '7') {
-                            m_EscCode = ch - '0';
-                            m_StringState = 2;
-                            break;
-                        }
-                        if (ch == 'n') {
-                            m_StringBuf.AppendByte('\n');
-                        } else if (ch == 'r') {
-                            m_StringBuf.AppendByte('\r');
-                        } else if (ch == 't') {
-                            m_StringBuf.AppendByte('\t');
-                        } else if (ch == 'b') {
-                            m_StringBuf.AppendByte('\b');
-                        } else if (ch == 'f') {
-                            m_StringBuf.AppendByte('\f');
-                        } else if (ch == '\\') {
-                            m_StringBuf.AppendByte('\\');
-                        } else if (ch == '(') {
-                            m_StringBuf.AppendByte('(');
-                        } else if (ch == ')') {
-                            m_StringBuf.AppendByte(')');
-                        } else if (ch == '\r') {
-                            m_StringState = 4;
-                            break;
-                        } else if (ch == '\n') {
-                        } else {
-                            m_StringBuf.AppendByte(ch);
-                        }
-                        m_StringState = 0;
-                        break;
-                    case 2:
-                        if (ch >= '0' && ch <= '7') {
-                            m_EscCode = m_EscCode * 8 + ch - '0';
-                            m_StringState = 3;
-                        } else {
-                            m_StringBuf.AppendByte(m_EscCode);
-                            m_StringState = 0;
-                            goto start;
-                        }
-                        break;
-                    case 3:
-                        if (ch >= '0' && ch <= '7') {
-                            m_EscCode = m_EscCode * 8 + ch - '0';
-                            m_StringBuf.AppendByte(m_EscCode);
-                            m_StringState = 0;
-                        } else {
-                            m_StringBuf.AppendByte(m_EscCode);
-                            m_StringState = 0;
-                            goto start;
-                        }
-                        break;
-                    case 4:
-                        m_StringState = 0;
-                        if (ch != '\n') {
-                            goto start;
-                        }
-                        break;
-                }
-                break;
-            case 8:
-                m_WordState = 0;
-                if (ch == '>') {
-                    EndDict();
-                } else {
-                    goto start;
-                }
-                break;
-            case 9:
-                switch (m_InlineImageState) {
-                    case 0:
-                        if (type == 'W' || type == 'D') {
-                            m_InlineImageState = 1;
-                            m_InlineWhiteChar = ch;
-                        } else {
-                            m_StringBuf.AppendByte(ch);
-                        }
-                        break;
-                    case 1:
-                        m_StringBuf.AppendByte(m_InlineWhiteChar);
-                        if (ch == 'I') {
-                            m_InlineImageState = 2;
-                        } else {
-                            m_InlineImageState = 0;
-                            goto start;
-                        }
-                        break;
-                    case 2:
-                        if (ch == 'D') {
-                            m_InlineImageState = 3;
-                        } else {
-                            m_StringBuf.AppendByte('I');
-                            m_InlineImageState = 0;
-                            goto start;
-                        }
-                        break;
-                    case 3:
-                        EndImageDict();
-                        break;
-                }
-                break;
-            case 10:
-                switch (m_InlineImageState) {
-                    case 0:
-                        if (type == 'W') {
-                            m_InlineImageState = 1;
-                            m_InlineWhiteChar = ch;
-                        } else {
-                            m_ImageSrcBuf.AppendByte(ch);
-                        }
-                        break;
-                    case 1:
-                        if (ch == 'E') {
-                            m_InlineImageState = 2;
-                        } else {
-                            m_ImageSrcBuf.AppendByte(m_InlineWhiteChar);
-                            m_InlineImageState = 0;
-                            goto start;
-                        }
-                        break;
-                    case 2:
-                        if (ch == 'I') {
-                            m_InlineImageState = 3;
-                        } else {
-                            m_ImageSrcBuf.AppendByte(m_InlineWhiteChar);
-                            m_ImageSrcBuf.AppendByte('E');
-                            m_InlineImageState = 0;
-                            goto start;
-                        }
-                        break;
-                    case 3:
-                        if (type == 'W') {
-                            EndInlineImage();
-                        } else {
-                            m_ImageSrcBuf.AppendByte(m_InlineWhiteChar);
-                            m_ImageSrcBuf.AppendByte('E');
-                            m_ImageSrcBuf.AppendByte('I');
-                            m_InlineImageState = 0;
-                            goto start;
-                        }
-                        break;
-                }
-                break;
-            case 11:
-                if (m_InlineImageState < m_ImageSrcBuf.GetSize()) {
-                    m_ImageSrcBuf.GetBuffer()[m_InlineImageState ++] = ch;
-                } else {
-                    if (ch == 'I') {
-                        EndInlineImage();
-                    }
-                }
-                break;
-        }
-    }
-}
-void CPDF_StreamContentParser::Finish()
-{
-    switch (m_WordState) {
-        case 0:
-            break;
-        case 1:
-            break;
-        case 2:
-            EndName();
-            break;
-        case 3:
-            break;
-        case 4:
-            EndKeyword();
-            break;
-        case 5:
-            EndNumber();
-            break;
-        case 6:
-            EndHexString();
-            break;
-        case 7:
-            EndString();
-            break;
-        case 8:
-            break;
-        case 9:
-            break;
-        case 10:
-            EndInlineImage();
-            break;
-    }
-    m_WordState = 0;
-}
-void CPDF_StreamContentParser::AddContainer(CPDF_Object* pObject)
-{
-    if (m_ObjectSize) {
-        m_pObjectState[m_ObjectSize] = SetToCurObj(pObject);
-    }
-    FXSYS_assert(m_ObjectSize < _FPDF_MAX_OBJECT_STACK_SIZE_);
-    m_pObjectStack[m_ObjectSize++] = pObject;
-}
-FX_BOOL CPDF_StreamContentParser::SetToCurObj(CPDF_Object* pObject)
-{
-    if (m_ObjectSize == 0) {
-        AddObjectParam(pObject);
-        return TRUE;
-    }
-    FX_BOOL bInArrayOrDict = TRUE;
-    CPDF_Object* pCurObj = m_pObjectStack[m_ObjectSize - 1];
-    if (pCurObj->GetType() == PDFOBJ_ARRAY) {
-        ((CPDF_Array*)pCurObj)->Add(pObject, m_pDocument);
-    } else {
-        if (!m_bDictName && m_pDictName[0]) {
-            ((CPDF_Dictionary*)pCurObj)->SetAt((FX_LPCSTR)m_pDictName, pObject, m_pDocument);
-        } else {
-            bInArrayOrDict = FALSE;
-        }
-        m_bDictName = TRUE;
-    }
-    return bInArrayOrDict;
-}
-void CPDF_StreamContentParser::StartArray()
-{
-    if (m_ObjectSize)
-        if (m_pObjectStack[0]->GetType() != PDFOBJ_DICTIONARY && m_pObjectStack[m_ObjectSize - 1]->GetType() == PDFOBJ_ARRAY) {
-            return;
-        }
-    CPDF_Array* pArray = FX_NEW CPDF_Array;
-    AddContainer(pArray);
-}
-void CPDF_StreamContentParser::EndArray()
-{
-    if (m_ObjectSize == 0) {
-        return;
-    }
-    CPDF_Object* pCurObj = m_pObjectStack[m_ObjectSize - 1];
-    if (pCurObj->GetType() != PDFOBJ_ARRAY) {
-        return;
-    }
-    m_ObjectSize --;
-    if (m_ObjectSize == 0) {
-        AddObjectParam(pCurObj);
-    } else {
-        if (!m_pObjectState[m_ObjectSize]) {
-            pCurObj->Release();
-        }
-    }
-    m_pObjectState[m_ObjectSize] = FALSE;
-}
-void CPDF_StreamContentParser::StartDict()
-{
-    CPDF_Dictionary* pDict = FX_NEW CPDF_Dictionary;
-    AddContainer(pDict);
-    m_bDictName = TRUE;
-}
-void CPDF_StreamContentParser::EndDict()
-{
-    if (m_ObjectSize == 0) {
-        return;
-    }
-    CPDF_Object* pCurObj = m_pObjectStack[m_ObjectSize - 1];
-    if (pCurObj->GetType() != PDFOBJ_DICTIONARY) {
-        return;
-    }
-    m_ObjectSize --;
-    if (m_ObjectSize == 0) {
-        AddObjectParam(pCurObj);
-    } else {
-        if (!m_pObjectState[m_ObjectSize]) {
-            pCurObj->Release();
-        }
-    }
-    m_pObjectState[m_ObjectSize] = FALSE;
-}
-void CPDF_StreamContentParser::EndName()
-{
-    if (m_ObjectSize == 0) {
-        AddNameParam((FX_LPCSTR)m_pWordBuf, m_WordSize);
-        return;
-    }
-    CPDF_Object* pCurObj = m_pObjectStack[m_ObjectSize - 1];
-    if (pCurObj->GetType() == PDFOBJ_ARRAY) {
-        ((CPDF_Array*)pCurObj)->AddName(CFX_ByteString(m_pWordBuf, m_WordSize));
-    } else {
-        if (m_bDictName) {
-            FXSYS_memcpy32(m_pDictName, m_pWordBuf, m_WordSize);
-            m_pDictName[m_WordSize] = 0;
-        } else {
-            if (m_pDictName[0] != 0) {
-                ((CPDF_Dictionary*)pCurObj)->SetAtName((FX_LPCSTR)m_pDictName, CFX_ByteString(m_pWordBuf, m_WordSize));
-            }
-        }
-        m_bDictName = !m_bDictName;
-    }
-}
-void CPDF_StreamContentParser::EndNumber()
-{
-    if (m_ObjectSize == 0) {
-        AddNumberParam((FX_LPCSTR)m_pWordBuf, m_WordSize);
-        return;
-    }
-    CPDF_Number *pObj = FX_NEW CPDF_Number(CFX_ByteStringC(m_pWordBuf, m_WordSize));
-    if (!SetToCurObj(pObj)) {
-        pObj->Release();
-    }
-}
-extern CFX_ByteString _FPDF_ByteStringFromHex(CFX_BinaryBuf& src_buf);
-void CPDF_StreamContentParser::EndHexString()
-{
-    CPDF_String *pObj = FX_NEW CPDF_String(_FPDF_ByteStringFromHex(m_StringBuf), TRUE);
-    if (!SetToCurObj(pObj)) {
-        pObj->Release();
-    }
-}
-void CPDF_StreamContentParser::EndString()
-{
-    CPDF_String *pObj = FX_NEW CPDF_String(m_StringBuf.GetByteString());
-    if (!SetToCurObj(pObj)) {
-        pObj->Release();
-    }
-}
-void CPDF_StreamContentParser::Handle_BeginImage(void)
-{
-    m_WordState = 9;
-    m_InlineImageState = 0;
-    m_StringBuf.Clear();
-}
-void _PDF_ReplaceAbbr(CPDF_Object* pObj);
-void CPDF_StreamContentParser::EndImageDict()
-{
-    if (m_StringBuf.GetSize() != m_LastImageDict.GetSize() ||
-            FXSYS_memcmp32(m_StringBuf.GetBuffer(), m_LastImageDict.GetBuffer(), m_StringBuf.GetSize())) {
-        m_WordState = 0;
-        StartDict();
-        InputData(m_StringBuf.GetBuffer(), m_StringBuf.GetSize());
-        Finish();
-        m_bSameLastDict = FALSE;
-        if (m_pLastImageDict && m_bReleaseLastDict) {
-            m_pLastImageDict->Release();
-            m_pLastImageDict = NULL;
-        }
-        if (!m_ObjectSize) {
-            m_InlineImageState = 0;
-            return;
-        }
-        m_pLastImageDict = (CPDF_Dictionary*)m_pObjectStack[--m_ObjectSize];
-        m_bReleaseLastDict = !m_pObjectState[m_ObjectSize];
-        m_pObjectState[m_ObjectSize] = FALSE;
-        _PDF_ReplaceAbbr(m_pLastImageDict);
-        m_LastImageDict.TakeOver(m_StringBuf);
-        if (m_pLastImageDict->KeyExist(FX_BSTRC("ColorSpace"))) {
-            CPDF_Object* pCSObj = m_pLastImageDict->GetElementValue(FX_BSTRC("ColorSpace"));
-            if (pCSObj->GetType() == PDFOBJ_NAME) {
-                CFX_ByteString name = pCSObj->GetString();
-                if (name != FX_BSTRC("DeviceRGB") && name != FX_BSTRC("DeviceGray") && name != FX_BSTRC("DeviceCMYK")) {
-                    pCSObj = FindResourceObj(FX_BSTRC("ColorSpace"), name);
-                    if (pCSObj) {
-                        if (!pCSObj->GetObjNum()) {
-                            pCSObj = pCSObj->Clone();
-                        }
-                        m_pLastImageDict->SetAt(FX_BSTRC("ColorSpace"), pCSObj, m_pDocument);
-                    }
-                }
-            }
-        }
-    } else {
-        m_bSameLastDict = TRUE;
-    }
-    m_ImageSrcBuf.Clear();
-    if (m_pLastCloneImageDict)
-        m_pLastCloneImageDict->Release();
-
-    m_pLastCloneImageDict = (CPDF_Dictionary*)m_pLastImageDict->Clone();
-    if (m_pLastCloneImageDict->KeyExist(FX_BSTRC("Filter"))) {
-        m_WordState = 10;
-        m_InlineImageState = 0;
-    } else {
-        int width = m_pLastCloneImageDict->GetInteger(FX_BSTRC("Width"));
-        int height = m_pLastCloneImageDict->GetInteger(FX_BSTRC("Height"));
-        int OrigSize = 0;
-        CPDF_Object* pCSObj = m_pLastCloneImageDict->GetElementValue(FX_BSTRC("ColorSpace"));
-        if (pCSObj != NULL) {
-            int bpc = m_pLastCloneImageDict->GetInteger(FX_BSTRC("BitsPerComponent"));
-            int nComponents = 1;
-            CPDF_ColorSpace* pCS = m_pDocument->LoadColorSpace(pCSObj);
-            if (pCS == NULL) {
-                nComponents = 3;
-            } else {
-                nComponents = pCS->CountComponents();
-                m_pDocument->GetPageData()->ReleaseColorSpace(pCSObj);
-            }
-            int pitch = (width * bpc * nComponents + 7) / 8;
-            OrigSize = pitch * height;
-        } else {
-            OrigSize = ((width + 7) / 8) * height;
-        }
-        m_ImageSrcBuf.AppendBlock(NULL, OrigSize);
-        m_WordState = 11;
-        m_InlineImageState = 0;
-    }
-}
-void CPDF_StreamContentParser::EndInlineImage()
-{
-    CFX_AffineMatrix ImageMatrix;
-    ImageMatrix.Copy(m_pCurStates->m_CTM);
-    ImageMatrix.Concat(m_mtContentToUser);
-    m_LastImageData.CopyData(m_ImageSrcBuf.GetBuffer(), m_ImageSrcBuf.GetSize());
-    CPDF_Stream* pStream = CPDF_Stream::Create(m_ImageSrcBuf.GetBuffer(), m_ImageSrcBuf.GetSize(),
-                           m_pLastCloneImageDict);
-    m_ImageSrcBuf.DetachBuffer();
-    m_pLastCloneImageDict = NULL;
-    CPDF_InlineImages* pImages = FX_NEW CPDF_InlineImages;
-    pImages->m_pStream = pStream;
-    SetGraphicStates(pImages, !m_pLastCloneImageDict->KeyExist(FX_BSTRC("ColorSpace")), FALSE, FALSE);
-    pImages->AddMatrix(ImageMatrix);
-    m_pObjectList->m_ObjectList.AddTail(pImages);
-    m_WordState = 0;
-}
-#define FXDWORD_TRUE FXDWORD_FROM_LSBFIRST(0x65757274)
-#define FXDWORD_NULL FXDWORD_FROM_LSBFIRST(0x6c6c756e)
-#define FXDWORD_FALS FXDWORD_FROM_LSBFIRST(0x736c6166)
-void CPDF_StreamContentParser::EndKeyword()
-{
-    CPDF_Object *pObj = NULL;
-    if (m_WordSize == 4) {
-        if (*(FX_DWORD*)m_pWordBuf == FXDWORD_TRUE) {
-            pObj = CPDF_Boolean::Create(TRUE);
-            if (!SetToCurObj(pObj)) {
-                pObj->Release();
-            }
-            return;
-        } else if (*(FX_DWORD*)m_pWordBuf == FXDWORD_NULL) {
-            pObj = CPDF_Null::Create();
-            if (!SetToCurObj(pObj)) {
-                pObj->Release();
-            }
-            return;
-        }
-    } else if (m_WordSize == 5) {
-        if (*(FX_DWORD*)m_pWordBuf == FXDWORD_FALS && m_pWordBuf[4] == 'e') {
-            pObj = CPDF_Boolean::Create(FALSE);
-            if (!SetToCurObj(pObj)) {
-                pObj->Release();
-            }
-            return;
-        }
-    }
-    m_pWordBuf[m_WordSize] = 0;
-    OnOperator((char*)m_pWordBuf);
-    ClearAllParams();
-}
-#define PAGEPARSE_STAGE_PARSE			2
-#define PAGEPARSE_STAGE_CHECKCLIP		3
-CPDF_ContentParser::CPDF_ContentParser()
-{
-    m_pParser = NULL;
-    m_Status = Ready;
-    m_pStreamFilter = NULL;
-    m_pType3Char = NULL;
-}
-CPDF_ContentParser::~CPDF_ContentParser()
-{
-    Clear();
-}
-void CPDF_ContentParser::Clear()
-{
-    if (m_pParser) {
-        delete m_pParser;
-    }
-    if (m_pStreamFilter) {
-        delete m_pStreamFilter;
-    }
-    m_pParser = NULL;
-    m_Status = Ready;
-}
-void CPDF_ContentParser::Start(CPDF_Page* pPage, CPDF_ParseOptions* pOptions)
-{
-    if (m_Status != Ready || pPage == NULL || pPage->m_pDocument == NULL || pPage->m_pFormDict == NULL) {
-        m_Status = Done;
-        return;
-    }
-    m_pObjects = pPage;
-    m_bForm = FALSE;
-    if (pOptions) {
-        m_Options = *pOptions;
-    }
-    CPDF_Object* pContent = pPage->m_pFormDict->GetElementValue(FX_BSTRC("Contents"));
-    if (pContent == NULL) {
-        m_Status = Done;
-        return;
-    }
-    if (pContent->GetType() == PDFOBJ_STREAM) {
-        m_nStreams = 1;
-    } else if (pContent->GetType() == PDFOBJ_ARRAY) {
-        m_nStreams = ((CPDF_Array*)pContent)->GetCount();
-    } else {
-        m_Status = Done;
-        return;
-    }
-    m_Status = ToBeContinued;
-    m_InternalStage = PAGEPARSE_STAGE_PARSE;
-    m_CurrentOffset = 0;
-    m_pParser = FX_NEW CPDF_StreamContentParser;
-    m_pParser->Initialize();
-    m_pParser->PrepareParse(pPage->m_pDocument, pPage->m_pResources, NULL, NULL, pPage,
-                            pPage->m_pResources, &pPage->m_BBox, &m_Options, NULL, 0);
-    m_pParser->m_pCurStates->m_ColorState.GetModify()->Default();
-}
-void CPDF_ContentParser::Start(CPDF_Form* pForm, CPDF_AllStates* pGraphicStates, CFX_AffineMatrix* pParentMatrix,
-                               CPDF_Type3Char* pType3Char, CPDF_ParseOptions* pOptions, int level)
-{
-    m_pType3Char = pType3Char;
-    m_pObjects = pForm;
-    m_bForm = TRUE;
-    CFX_AffineMatrix form_matrix = pForm->m_pFormDict->GetMatrix(FX_BSTRC("Matrix"));
-    if (pGraphicStates) {
-        form_matrix.Concat(pGraphicStates->m_CTM);
-    }
-    CPDF_Array* pBBox = pForm->m_pFormDict->GetArray(FX_BSTRC("BBox"));
-    CFX_FloatRect form_bbox;
-    CPDF_Path ClipPath;
-    if (pBBox) {
-        form_bbox = pBBox->GetRect();
-        ClipPath.New();
-        ClipPath.AppendRect(form_bbox.left, form_bbox.bottom, form_bbox.right, form_bbox.top);
-        ClipPath.Transform(&form_matrix);
-        if (pParentMatrix) {
-            ClipPath.Transform(pParentMatrix);
-        }
-        form_bbox.Transform(&form_matrix);
-    }
-    CPDF_Dictionary* pResources = pForm->m_pFormDict->GetDict(FX_BSTRC("Resources"));
-    m_pParser = FX_NEW CPDF_StreamContentParser;
-    m_pParser->Initialize();
-    m_pParser->PrepareParse(pForm->m_pDocument, pForm->m_pPageResources, pForm->m_pResources, pParentMatrix, pForm,
-                            pResources, &form_bbox, pOptions, pGraphicStates, level);
-    m_pParser->m_pCurStates->m_CTM = form_matrix;
-    if (ClipPath.NotNull()) {
-        m_pParser->m_pCurStates->m_ClipPath.AppendPath(ClipPath, FXFILL_WINDING, TRUE);
-    }
-    if (pForm->m_Transparency & PDFTRANS_GROUP) {
-        CPDF_GeneralStateData* pData = m_pParser->m_pCurStates->m_GeneralState.GetModify();
-        pData->m_BlendType = FXDIB_BLEND_NORMAL;
-        pData->m_StrokeAlpha = 1.0f;
-        pData->m_FillAlpha = 1.0f;
-        pData->m_pSoftMask = NULL;
-    }
-    m_pStreamFilter = pForm->m_pFormStream->GetStreamFilter();
-    m_nStreams = 1;
-    m_Status = ToBeContinued;
-    m_InternalStage = PAGEPARSE_STAGE_PARSE;
-    m_CurrentOffset = 0;
-}
-void CPDF_ContentParser::Continue(IFX_Pause* pPause)
-{
-    while (m_Status == ToBeContinued) {
-        if (m_InternalStage == PAGEPARSE_STAGE_PARSE) {
-            if (m_pStreamFilter == NULL) {
-                if (m_CurrentOffset == m_nStreams) {
-                    m_InternalStage = PAGEPARSE_STAGE_CHECKCLIP;
-                    if (m_pType3Char) {
-                        m_pType3Char->m_bColored = m_pParser->m_bColored;
-                        m_pType3Char->m_Width = FXSYS_round(m_pParser->m_Type3Data[0] * 1000);
-                        m_pType3Char->m_BBox.left = FXSYS_round(m_pParser->m_Type3Data[2] * 1000);
-                        m_pType3Char->m_BBox.bottom = FXSYS_round(m_pParser->m_Type3Data[3] * 1000);
-                        m_pType3Char->m_BBox.right = FXSYS_round(m_pParser->m_Type3Data[4] * 1000);
-                        m_pType3Char->m_BBox.top = FXSYS_round(m_pParser->m_Type3Data[5] * 1000);
-                        m_pType3Char->m_bPageRequired = m_pParser->m_bResourceMissing;
-                    }
-                    delete m_pParser;
-                    m_pParser = NULL;
-                    continue;
-                }
-                CPDF_Object* pContent = m_pObjects->m_pFormDict->GetElementValue(FX_BSTRC("Contents"));
-                if (pContent->GetType() == PDFOBJ_STREAM) {
-                    m_pStreamFilter = ((CPDF_Stream*)pContent)->GetStreamFilter();
-                } else {
-                    CPDF_Stream* pStream = ((CPDF_Array*)pContent)->GetStream(m_CurrentOffset);
-                    if (pStream == NULL) {
-                        m_CurrentOffset ++;
-                        continue;
-                    }
-                    m_pStreamFilter = pStream->GetStreamFilter();
-                }
-            }
-            FX_DWORD len = m_pStreamFilter->ReadBlock(m_pParser->m_pStreamBuf, STREAM_PARSE_BUFSIZE);
-            m_pParser->InputData(m_pParser->m_pStreamBuf, len);
-            if (m_pParser->m_bAbort) {
-                delete m_pStreamFilter;
-                m_pStreamFilter = NULL;
-                m_Status = Done;
-                delete m_pParser;
-                m_pParser = NULL;
-                return;
-            }
-            if (len < STREAM_PARSE_BUFSIZE) {
-                m_pParser->Finish();
-                m_CurrentOffset ++;
-                delete m_pStreamFilter;
-                m_pStreamFilter = NULL;
-            }
-            if (pPause && pPause->NeedToPauseNow()) {
-                return;
-            }
-        }
-        if (m_InternalStage == PAGEPARSE_STAGE_CHECKCLIP) {
-            FX_POSITION pos = m_pObjects->m_ObjectList.GetHeadPosition();
-            while (pos) {
-                CPDF_PageObject* pObj = (CPDF_PageObject*)m_pObjects->m_ObjectList.GetNext(pos);
-                if (pObj == NULL) {
-                    continue;
-                }
-                if (pObj->m_ClipPath.IsNull()) {
-                    continue;
-                }
-                if (pObj->m_ClipPath.GetPathCount() != 1) {
-                    continue;
-                }
-                if (pObj->m_ClipPath.GetTextCount()) {
-                    continue;
-                }
-                CPDF_Path ClipPath = pObj->m_ClipPath.GetPath(0);
-                if (!ClipPath.IsRect() || pObj->m_Type == PDFPAGE_SHADING) {
-                    continue;
-                }
-                CFX_FloatRect old_rect(ClipPath.GetPointX(0), ClipPath.GetPointY(0),
-                                       ClipPath.GetPointX(2), ClipPath.GetPointY(2));
-                CFX_FloatRect obj_rect(pObj->m_Left, pObj->m_Bottom, pObj->m_Right, pObj->m_Top);
-                if (old_rect.Contains(obj_rect)) {
-                    pObj->m_ClipPath.SetNull();
-                }
-            }
-            if (m_pObjects->m_ObjectList.GetCount() == 1) {
-                CPDF_PageObject* pObj = (CPDF_PageObject*)m_pObjects->m_ObjectList.GetAt(m_pObjects->m_ObjectList.GetHeadPosition());
-                if (pObj && pObj->m_Type == PDFPAGE_TEXT) {
-                    CPDF_TextObject* pText = (CPDF_TextObject*)pObj;
-                }
-            }
-            m_Status = Done;
-            return;
-        }
-    }
-}
-int CPDF_ContentParser::EstimateProgress()
-{
-    if (m_Status == Ready) {
-        return 0;
-    }
-    if (m_Status == Done) {
-        return 100;
-    }
-    if (m_InternalStage == PAGEPARSE_STAGE_CHECKCLIP) {
-        return 90;
-    }
-    if (m_pStreamFilter == NULL) {
-        return 90 * m_CurrentOffset / m_nStreams;
-    }
-    int total_raw_size = m_pStreamFilter->GetStream()->GetRawSize() * m_nStreams;
-    int parsed_raw_size = m_pStreamFilter->GetStream()->GetRawSize() * m_CurrentOffset +
-                          m_pStreamFilter->GetSrcPos();
-    return 90 * parsed_raw_size / total_raw_size;
-}
-CPDF_InlineImages::CPDF_InlineImages()
-{
-    m_Type = PDFPAGE_INLINES;
-    m_pStream = NULL;
-    m_pBitmap = NULL;
-}
-CPDF_InlineImages::~CPDF_InlineImages()
-{
-    if (m_pStream) {
-        m_pStream->Release();
-    }
-    if (m_pBitmap) {
-        delete m_pBitmap;
-    }
-}
-void CPDF_InlineImages::AddMatrix(CFX_AffineMatrix& matrix)
-{
-    m_Matrices.Add(matrix);
-    CFX_FloatRect rect = matrix.GetUnitRect();
-    if (m_Matrices.GetSize() > 1) {
-        CFX_FloatRect rect1(m_Left, m_Bottom, m_Right, m_Top);
-        rect.Union(rect1);
-    }
-    m_Left = rect.left;
-    m_Right = rect.right;
-    m_Top = rect.top;
-    m_Bottom = rect.bottom;
-}
-#endif
diff --git a/core/src/fpdfapi/fpdf_page/pageint.h b/core/src/fpdfapi/fpdf_page/pageint.h
index cc35dbe..f6b6bea 100644
--- a/core/src/fpdfapi/fpdf_page/pageint.h
+++ b/core/src/fpdfapi/fpdf_page/pageint.h
@@ -11,7 +11,6 @@
 #define PARSE_STEP_LIMIT		100
 #define STREAM_PARSE_BUFSIZE	20480
 class CPDF_QuickFontCache;
-#ifndef _FPDFAPI_MINI_
 class CPDF_StreamParser : public CFX_Object
 {
 public:
@@ -59,7 +58,6 @@
     FX_DWORD			m_WordSize;
     CPDF_Object*		m_pLastObj;
 };
-#endif
 typedef enum {
     PDFOP_CloseFillStrokePath = 0, PDFOP_FillStrokePath,
     PDFOP_CloseEOFillStrokePath, PDFOP_EOFillStrokePath,
@@ -117,11 +115,7 @@
         } m_Name;
     };
 } _ContentParam;
-#if defined(_FPDFAPI_MINI_)
-#define _FPDF_MAX_FORM_LEVEL_		17
-#else
 #define _FPDF_MAX_FORM_LEVEL_		30
-#endif
 #define _FPDF_MAX_TYPE3_FORM_LEVEL_	4
 #define _FPDF_MAX_OBJECT_STACK_SIZE_ 512
 class CPDF_StreamContentParser : public CFX_Object
@@ -163,43 +157,11 @@
     FX_BOOL				OnOperator(FX_LPCSTR op);
     void				BigCaseCaller(int index);
     FX_BOOL				m_bAbort;
-#ifndef _FPDFAPI_MINI_
     CPDF_StreamParser*	m_pSyntax;
     FX_DWORD			GetParsePos()
     {
         return m_pSyntax->GetPos();
     }
-#else
-    int					m_WordState;
-    void				InputData(FX_LPCBYTE src_buf, FX_DWORD src_size);
-    void				Finish();
-    void				StartArray();
-    void				EndArray();
-    void				StartDict();
-    void				EndDict();
-    void				EndName();
-    void				EndNumber();
-    void				EndKeyword();
-    void				EndHexString();
-    void				EndString();
-    void				EndImageDict();
-    void				EndInlineImage();
-    FX_LPBYTE			m_pWordBuf;
-    FX_DWORD			m_WordSize;
-    CFX_BinaryBuf		m_StringBuf;
-    int					m_StringLevel, m_StringState, m_EscCode;
-    void				AddContainer(CPDF_Object* pObject);
-    FX_BOOL				SetToCurObj(CPDF_Object* pObject);
-    FX_LPBYTE			m_pDictName;
-    FX_BOOL				m_bDictName;
-    CPDF_Object**		m_pObjectStack;
-    FX_BOOL*			m_pObjectState;
-    FX_DWORD			m_ObjectSize;
-    int					m_InlineImageState;
-    FX_BYTE				m_InlineWhiteChar;
-    CFX_BinaryBuf		m_ImageSrcBuf;
-    FX_LPBYTE			m_pStreamBuf;
-#endif
     CPDF_AllStates*		m_pCurStates;
     CPDF_ContentMark	m_CurContentMark;
     CFX_PtrArray		m_ClipTextList;
@@ -210,10 +172,8 @@
     void				ConvertUserSpace(FX_FLOAT& x, FX_FLOAT& y);
     void				ConvertTextSpace(FX_FLOAT& x, FX_FLOAT& y);
     void				OnChangeTextMatrix();
-#ifndef _FPDFAPI_MINI_
     FX_DWORD			Parse(FX_LPCBYTE pData, FX_DWORD dwSize, FX_DWORD max_cost);
     void				ParsePathObject();
-#endif
     int					m_CompatCount;
     FX_PATHPOINT*		m_pPathPoints;
     int					m_PathPointCount;
@@ -419,8 +379,8 @@
     void                        ReleaseIccProfile(CPDF_Stream* pIccProfileStream, CPDF_IccProfile* pIccProfile);
     CPDF_StreamAcc*             GetFontFileStreamAcc(CPDF_Stream* pFontStream);
     void                        ReleaseFontFileStreamAcc(CPDF_Stream* pFontStream, FX_BOOL bForce = FALSE);
-    FX_BOOL                     IsForceClear() const {return m_bForceClear;}
-    CPDF_CountedColorSpace*     FindColorSpacePtr(CPDF_Object* pCSObj) const;
+    FX_BOOL                     IsForceClear() const {return m_bForceClear;}
+    CPDF_CountedColorSpace*     FindColorSpacePtr(CPDF_Object* pCSObj) const;
     CPDF_CountedPattern*        FindPatternPtr(CPDF_Object* pPatternObj) const;
 
     CPDF_Document*              m_pPDFDoc;
diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
index 66231aa5..2f834ea 100644
--- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
@@ -1677,11 +1677,7 @@
     m_pFileBuf = NULL;
     m_MetadataObjnum = 0;
     m_dwWordPos = 0;
-#if defined(_FPDFAPI_MINI_)
-    m_bFileStream = TRUE;
-#else
     m_bFileStream = FALSE;
-#endif
 }
 CPDF_SyntaxParser::~CPDF_SyntaxParser()
 {
@@ -2469,10 +2465,6 @@
         m_Pos = StreamStartPos;
     }
     CPDF_Stream* pStream;
-#if defined(_FPDFAPI_MINI_) && !defined(_FXCORE_FEATURE_ALL_)
-    pStream = FX_NEW CPDF_Stream(m_pFileAccess, pCryptoHandler, m_HeaderOffset + m_Pos, len, pDict, gennum);
-    m_Pos += len;
-#else
     FX_LPBYTE pData = FX_Alloc(FX_BYTE, len);
     if (!pData) {
         return NULL;
@@ -2490,7 +2482,6 @@
         dest_buf.DetachBuffer();
     }
     pStream = FX_NEW CPDF_Stream(pData, len, pDict);
-#endif
     if (pContext) {
         pContext->m_DataEnd = pContext->m_DataStart + len;
     }
diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render.cpp
index 611804b..ab1ddb6 100644
--- a/core/src/fpdfapi/fpdf_render/fpdf_render.cpp
+++ b/core/src/fpdfapi/fpdf_render/fpdf_render.cpp
@@ -35,7 +35,6 @@
             }
         }
     }
-#ifndef _FPDFAPI_MINI_
     {
         pos = m_TransferFuncMap.GetStartPosition();
         while (pos) {
@@ -49,7 +48,6 @@
             }
         }
     }
-#endif
     if (m_pFontCache) {
         if (bRelease) {
             delete m_pFontCache;
@@ -149,9 +147,6 @@
     , m_dwLimitCacheSize(1024 * 1024 * 100)
     , m_HalftoneLimit(-1)
 {
-#if defined(_FPDFAPI_MINI_)
-    m_Flags |= RENDER_LIMITEDIMAGECACHE;
-#endif
 }
 FX_ARGB CPDF_RenderOptions::TranslateColor(FX_ARGB argb) const
 {
@@ -261,12 +256,6 @@
     } else {
         m_InitialStates.DefaultStates();
     }
-#if defined(_FPDFAPI_MINI_)||defined(_FXCORE_LIMITED_CPU_)
-    m_HalftoneLimit = CPDF_ModuleMgr::Get()->GetRenderModule()->GetConfig()->m_HalftoneLimit;
-    if (pOptions && pOptions->m_HalftoneLimit >= 0) {
-        m_HalftoneLimit = pOptions->m_HalftoneLimit;
-    }
-#endif
     m_pObjectRenderer = NULL;
     m_Transparency = transparency;
     return TRUE;
@@ -327,11 +316,6 @@
         if (!m_pObjectRenderer->m_Result) {
             DrawObjWithBackground(pObj, pObj2Device);
         }
-#ifdef _FPDFAPI_MINI_
-        if (m_DitherBits) {
-            DitherObjectArea(pObj, pObj2Device);
-        }
-#endif
         delete m_pObjectRenderer;
         m_pObjectRenderer = NULL;
         return FALSE;
@@ -351,11 +335,6 @@
             if (!m_pObjectRenderer->m_Result) {
                 DrawObjWithBackground(pObj, pObj2Device);
             }
-#ifdef _FPDFAPI_MINI_
-            if (m_DitherBits) {
-                DitherObjectArea(pObj, pObj2Device);
-            }
-#endif
             delete m_pObjectRenderer;
             m_pObjectRenderer = NULL;
             return FALSE;
@@ -431,11 +410,6 @@
         case PDFPAGE_FORM:
             bRet = ProcessForm((CPDF_FormObject*)pObj, pObj2Device);
             break;
-#if defined(_FPDFAPI_MINI_)
-        case PDFPAGE_INLINES:
-            bRet = ProcessInlines((CPDF_InlineImages*)pObj, pObj2Device);
-            break;
-#endif
     }
     if (!bRet) {
         DrawObjWithBackground(pObj, pObj2Device);
@@ -465,7 +439,6 @@
 }
 void CPDF_RenderStatus::DrawObjWithBackground(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device)
 {
-#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
     FX_RECT rect;
     if (GetObjectClippedRect(pObj, pObj2Device, FALSE, rect)) {
         return;
@@ -492,7 +465,6 @@
     status.Initialize(m_Level + 1, m_pContext, buffer.GetDevice(), buffer.GetMatrix(), NULL, NULL, NULL, &m_Options, m_Transparency, m_bDropObjects, pFormResource);
     status.RenderSingleObject(pObj, &matrix);
     buffer.OutputToDevice();
-#endif
 }
 FX_BOOL CPDF_RenderStatus::ProcessForm(CPDF_FormObject* pFormObj, const CFX_AffineMatrix* pObj2Device)
 {
@@ -559,12 +531,10 @@
     if (bStroke) {
         FillType |= FX_FILL_STROKE;
     }
-#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
     const CPDF_GeneralStateData* pGeneralData = ((CPDF_PageObject*)pPathObj)->m_GeneralState;
     if (pGeneralData && pGeneralData->m_StrokeAdjust) {
         FillType |= FX_STROKE_ADJUST;
     }
-#endif
     if (m_pType3Char) {
         FillType |= FX_FILL_TEXT_MODE;
     }
@@ -599,7 +569,6 @@
     int alpha;
     if (pGeneralData) {
         alpha = (FX_INT32)(pGeneralData->m_FillAlpha * 255);
-#ifndef _FPDFAPI_MINI_
         if (pGeneralData->m_pTR) {
             if (!pGeneralData->m_pTransferFunc) {
                 ((CPDF_GeneralStateData*)pGeneralData)->m_pTransferFunc = GetTransferFunc(pGeneralData->m_pTR);
@@ -608,7 +577,6 @@
                 rgb = pGeneralData->m_pTransferFunc->TranslateColor(rgb);
             }
         }
-#endif
     } else {
         alpha = 255;
     }
@@ -630,7 +598,6 @@
     int alpha;
     if (pGeneralData) {
         alpha = (FX_INT32)(pGeneralData->m_StrokeAlpha * 255);
-#ifndef _FPDFAPI_MINI_
         if (pGeneralData->m_pTR) {
             if (!pGeneralData->m_pTransferFunc) {
                 ((CPDF_GeneralStateData*)pGeneralData)->m_pTransferFunc = GetTransferFunc(pGeneralData->m_pTR);
@@ -639,7 +606,6 @@
                 rgb = pGeneralData->m_pTransferFunc->TranslateColor(rgb);
             }
         }
-#endif
     } else {
         alpha = 255;
     }
@@ -1038,11 +1004,9 @@
             status.Initialize(0, this, pDevice, pLastMatrix, pStopObj, NULL, NULL, pOptions,
                               pItem->m_pObjectList->m_Transparency, FALSE, NULL);
             status.RenderObjectList(pItem->m_pObjectList, &FinalMatrix);
-#if !defined(_FPDFAPI_MINI_)
             if (status.m_Options.m_Flags & RENDER_LIMITEDIMAGECACHE) {
                 m_pPageCache->CacheOptimization(status.m_Options.m_dwLimitCacheSize);
             }
-#endif
             if (status.m_bStopped) {
                 pDevice->RestoreState();
                 break;
@@ -1052,11 +1016,9 @@
             status.Initialize(0, this, pDevice, NULL, pStopObj, NULL, NULL, pOptions,
                               pItem->m_pObjectList->m_Transparency, FALSE, NULL);
             status.RenderObjectList(pItem->m_pObjectList, &pItem->m_Matrix);
-#if !defined(_FPDFAPI_MINI_)
             if (status.m_Options.m_Flags & RENDER_LIMITEDIMAGECACHE) {
                 m_pPageCache->CacheOptimization(status.m_Options.m_dwLimitCacheSize);
             }
-#endif
             if (status.m_bStopped) {
                 pDevice->RestoreState();
                 break;
@@ -1113,11 +1075,7 @@
     m_PrevLastPos = NULL;
     Continue(pPause);
 }
-#ifdef _FPDFAPI_MINI_
-#define RENDER_STEP_LIMIT 20
-#else
 #define RENDER_STEP_LIMIT 100
-#endif
 void CPDF_ProgressiveRenderer::Continue(IFX_Pause* pPause)
 {
     if (m_Status != ToBeContinued) {
@@ -1175,11 +1133,9 @@
                 if (m_pRenderer->ContinueSingleObject(pCurObj, &pItem->m_Matrix, pPause)) {
                     return;
                 }
-#if !defined(_FPDFAPI_MINI_)
                 if (pCurObj->m_Type == PDFPAGE_IMAGE && m_pRenderer->m_Options.m_Flags & RENDER_LIMITEDIMAGECACHE) {
                     m_pContext->GetPageCache()->CacheOptimization(m_pRenderer->m_Options.m_dwLimitCacheSize);
                 }
-#endif
                 if (pCurObj->m_Type == PDFPAGE_FORM || pCurObj->m_Type == PDFPAGE_SHADING) {
                     objs_to_go = 0;
                 } else {
@@ -1320,11 +1276,7 @@
 CPDF_RenderConfig::CPDF_RenderConfig()
 {
     m_HalftoneLimit = 0;
-#ifdef _FPDFAPI_MINI_
-    m_RenderStepLimit = 20;
-#else
     m_RenderStepLimit = 100;
-#endif
 }
 CPDF_RenderConfig::~CPDF_RenderConfig()
 {
@@ -1363,9 +1315,6 @@
             m_Matrix.Scale(1.0f, (FX_FLOAT)(max_dpi) / (FX_FLOAT)dpiv);
         }
     }
-#ifdef _FPDFAPI_MINI_
-    m_Matrix.Scale(0.5f, 0.5f);
-#endif
 #endif
     CFX_Matrix ctm = m_pDevice->GetCTM();
     FX_FLOAT fScaleX = FXSYS_fabs(ctm.a);
@@ -1387,13 +1336,11 @@
             m_pDevice->StretchDIBits(m_pBitmap, m_Rect.left, m_Rect.top, m_Rect.Width(), m_Rect.Height());
         }
     } else {
-#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
         CFX_DIBitmap buffer;
         m_pDevice->CreateCompatibleBitmap(&buffer, m_pBitmap->GetWidth(), m_pBitmap->GetHeight());
         m_pContext->GetBackground(&buffer, m_pObject, NULL, &m_Matrix);
         buffer.CompositeBitmap(0, 0, buffer.GetWidth(), buffer.GetHeight(), m_pBitmap, 0, 0);
         m_pDevice->StretchDIBits(&buffer, m_Rect.left, m_Rect.top, m_Rect.Width(), m_Rect.Height());
-#endif
     }
 }
 CPDF_ScaledRenderBuffer::CPDF_ScaledRenderBuffer()
@@ -1406,11 +1353,7 @@
         delete m_pBitmapDevice;
     }
 }
-#ifndef _FPDFAPI_MINI_
 #define _FPDFAPI_IMAGESIZE_LIMIT_	(30 * 1024 * 1024)
-#else
-#define _FPDFAPI_IMAGESIZE_LIMIT_	(10 * 1024 * 1024)
-#endif
 FX_BOOL CPDF_ScaledRenderBuffer::Initialize(CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice, FX_RECT* pRect,
         const CPDF_PageObject* pObj, const CPDF_RenderOptions *pOptions, int max_dpi)
 {
@@ -1460,9 +1403,7 @@
         }
         m_Matrix.Scale(0.5f, 0.5f);
     }
-#if  !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
     m_pContext->GetBackground(m_pBitmapDevice->GetBitmap(), m_pObject, pOptions, &m_Matrix);
-#endif
     return TRUE;
 }
 void CPDF_ScaledRenderBuffer::OutputToDevice()
diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render_cache.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render_cache.cpp
index 45b6970..de2a409 100644
--- a/core/src/fpdfapi/fpdf_render/fpdf_render_cache.cpp
+++ b/core/src/fpdfapi/fpdf_render/fpdf_render_cache.cpp
@@ -248,7 +248,6 @@
         return FALSE;
     }
     m_MatteColor = MatteColor;
-#if !defined(_FPDFAPI_MINI_)
     if (pSrc->GetPitch() * pSrc->GetHeight() < FPDF_HUGE_IMAGE_SIZE) {
         m_pCachedBitmap = pSrc->Clone();
         delete pSrc;
@@ -259,23 +258,7 @@
         m_pCachedMask = pMaskSrc->Clone();
         delete pMaskSrc;
     }
-#else
-    if (pSrc->GetFormat() == FXDIB_8bppRgb && pSrc->GetPalette() &&
-            pSrc->GetHeight() * pSrc->GetWidth() * 3 < 1024) {
-#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_
-        m_pCachedBitmap = pSrc->CloneConvert(FXDIB_Rgb32);
-#else
-        m_pCachedBitmap = pSrc->CloneConvert(FXDIB_Rgb);
-#endif
-        delete pSrc;
-    } else if (pSrc->GetPitch() * pSrc->GetHeight() < 102400) {
-        m_pCachedBitmap = pSrc->Clone();
-        delete pSrc;
-    } else {
-        m_pCachedBitmap = pSrc;
-    }
-    m_pCachedMask = pMaskSrc;
-#endif
+
     pBitmap = m_pCachedBitmap;
     pMask = m_pCachedMask;
     CalcSize();
@@ -326,7 +309,6 @@
     CPDF_RenderContext*pContext = m_pRenderStatus->GetContext();
     CPDF_PageRenderCache* pPageRenderCache = pContext->m_pPageCache;
     m_dwTimeCount = pPageRenderCache->GetTimeCount();
-#if !defined(_FPDFAPI_MINI_)
     if (m_pCurBitmap->GetPitch() * m_pCurBitmap->GetHeight() < FPDF_HUGE_IMAGE_SIZE) {
         m_pCachedBitmap = m_pCurBitmap->Clone();
         delete m_pCurBitmap;
@@ -339,22 +321,6 @@
         delete m_pCurMask;
         m_pCurMask = NULL;
     }
-#else
-    if (m_pCurBitmap->GetFormat() == FXDIB_8bppRgb && m_pCurBitmap->GetPalette() &&
-            m_pCurBitmap->GetHeight() * m_pCurBitmap->GetWidth() * 3 < 1024) {
-        m_pCachedBitmap = m_pCurBitmap->CloneConvert(FXDIB_Rgb32);
-        m_pCachedBitmap = m_pCurBitmap->CloneConvert(FXDIB_Rgb);
-        delete m_pCurBitmap;
-        m_pCurBitmap = NULL;
-    } else if (m_pCurBitmap->GetPitch() * m_pCurBitmap->GetHeight() < 102400) {
-        m_pCachedBitmap = m_pCurBitmap->Clone();
-        delete m_pCurBitmap;
-        m_pCurBitmap = NULL;
-    } else {
-        m_pCachedBitmap = m_pCurBitmap;
-    }
-    m_pCachedMask = m_pCurMask;
-#endif
     m_pCurBitmap = m_pCachedBitmap;
     m_pCurMask = m_pCachedMask;
     CalcSize();
diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render_image.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render_image.cpp
index 1452b9d..ffe559a 100644
--- a/core/src/fpdfapi/fpdf_render/fpdf_render_image.cpp
+++ b/core/src/fpdfapi/fpdf_render/fpdf_render_image.cpp
@@ -17,53 +17,8 @@
     if (render.Start(this, pImageObj, pObj2Device, m_bStdCS, m_curBlend)) {
         render.Continue(NULL);
     }
-#ifdef _FPDFAPI_MINI_
-    if (m_DitherBits) {
-        DitherObjectArea(pImageObj, pObj2Device);
-    }
-#endif
     return render.m_Result;
 }
-#if defined(_FPDFAPI_MINI_)
-FX_BOOL CPDF_RenderStatus::ProcessInlines(CPDF_InlineImages* pInlines, const CFX_AffineMatrix* pObj2Device)
-{
-    int bitmap_alpha = 255;
-    if (!pInlines->m_GeneralState.IsNull()) {
-        bitmap_alpha = FXSYS_round(pInlines->m_GeneralState.GetObject()->m_FillAlpha * 255);
-    }
-    if (pInlines->m_pStream) {
-        CPDF_DIBSource dibsrc;
-        if (!dibsrc.Load(m_pContext->m_pDocument, pInlines->m_pStream, NULL, NULL, NULL, NULL)) {
-            return TRUE;
-        }
-        pInlines->m_pBitmap = dibsrc.Clone();
-        pInlines->m_pStream->Release();
-        pInlines->m_pStream = NULL;
-    }
-    if (pInlines->m_pBitmap == NULL) {
-        return TRUE;
-    }
-    FX_ARGB fill_argb = 0;
-    if (pInlines->m_pBitmap->IsAlphaMask()) {
-        fill_argb = GetFillArgb(pInlines);
-    }
-    int flags = 0;
-    if (m_Options.m_Flags & RENDER_FORCE_DOWNSAMPLE) {
-        flags |= RENDER_FORCE_DOWNSAMPLE;
-    } else if (m_Options.m_Flags & RENDER_FORCE_HALFTONE) {
-        flags = 0;
-    }
-    for (int i = 0; i < pInlines->m_Matrices.GetSize(); i ++) {
-        CFX_AffineMatrix image_matrix = pInlines->m_Matrices.GetAt(i);
-        image_matrix.Concat(*pObj2Device);
-        CPDF_ImageRenderer renderer;
-        if (renderer.Start(this, pInlines->m_pBitmap, fill_argb, bitmap_alpha, &image_matrix, flags, FALSE, m_curBlend)) {
-            renderer.Continue(NULL);
-        }
-    }
-    return TRUE;
-}
-#endif
 void CPDF_RenderStatus::CompositeDIBitmap(CFX_DIBitmap* pDIBitmap, int left, int top, FX_ARGB mask_argb,
         int bitmap_alpha, int blend_mode, int Transparency)
 {
@@ -392,7 +347,6 @@
     if (m_pRenderStatus->m_Options.m_ColorMode == RENDER_COLOR_ALPHA && m_Loader.m_pMask == NULL) {
         return StartBitmapAlpha();
     }
-#ifndef _FPDFAPI_MINI_
     if (pGeneralState && pGeneralState->m_pTR) {
         if (!pGeneralState->m_pTransferFunc) {
             ((CPDF_GeneralStateData*)pGeneralState)->m_pTransferFunc = m_pRenderStatus->GetTransferFunc(pGeneralState->m_pTR);
@@ -405,7 +359,6 @@
             m_Loader.m_bCached = FALSE;
         }
     }
-#endif
     m_FillArgb = 0;
     m_bPatternColor = FALSE;
     m_pPattern = NULL;
@@ -424,32 +377,11 @@
         m_pDIBSource = m_pClone;
     }
     m_Flags = 0;
-#if !defined(_FPDFAPI_MINI_)
     if (m_pRenderStatus->m_Options.m_Flags & RENDER_FORCE_DOWNSAMPLE) {
         m_Flags |= RENDER_FORCE_DOWNSAMPLE;
     } else if (m_pRenderStatus->m_Options.m_Flags & RENDER_FORCE_HALFTONE) {
         m_Flags |= RENDER_FORCE_HALFTONE;
     }
-#else
-    if (!(m_pRenderStatus->m_Options.m_Flags & RENDER_FORCE_HALFTONE)) {
-        if (m_pRenderStatus->m_HalftoneLimit) {
-            CFX_FloatRect image_rect_f = m_ImageMatrix.GetUnitRect();
-            FX_RECT image_rect = image_rect_f.GetOutterRect();
-            FX_RECT image_clip = image_rect;
-            image_rect.Intersect(m_pRenderStatus->m_pDevice->GetClipBox());
-            if (image_rect.Width() && image_rect.Height()) {
-                if ((image_clip.Width() * m_pDIBSource->GetWidth() / image_rect.Width()) *
-                        (image_clip.Height() * m_pDIBSource->GetHeight() / image_rect.Height()) >
-                        m_pRenderStatus->m_HalftoneLimit) {
-                    m_Flags |= RENDER_FORCE_DOWNSAMPLE;
-                }
-            }
-        } else {
-            m_Flags |= RENDER_FORCE_DOWNSAMPLE;
-        }
-    }
-#endif
-#ifndef _FPDFAPI_MINI_
     if (m_pRenderStatus->m_pDevice->GetDeviceClass() != FXDC_DISPLAY) {
         CPDF_Object* pFilters = m_pImageObject->m_pImage->GetStream()->GetDict()->GetElementValue(FX_BSTRC("Filter"));
         if (pFilters) {
@@ -475,14 +407,12 @@
     } else if (m_pImageObject->m_pImage->IsInterpol()) {
         m_Flags |= FXDIB_INTERPOL;
     }
-#endif
     if (m_Loader.m_pMask) {
         return DrawMaskedImage();
     }
     if (m_bPatternColor) {
         return DrawPatternImage(m_pObj2Device);
     }
-#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
     if (m_BitmapAlpha == 255 && pGeneralState && pGeneralState->m_FillOP &&
             pGeneralState->m_OPMode == 0 && pGeneralState->m_BlendType == FXDIB_BLEND_NORMAL && pGeneralState->m_StrokeAlpha == 1 && pGeneralState->m_FillAlpha == 1) {
         CPDF_Document* pDocument = NULL;
@@ -504,7 +434,6 @@
             pDocument->GetPageData()->ReleaseColorSpace(pCSObj);
         }
     }
-#endif
     return StartDIBSource();
 }
 FX_BOOL CPDF_ImageRenderer::Start(CPDF_RenderStatus* pStatus, const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStdCS, int blendType)
@@ -514,12 +443,10 @@
     m_pImageObject = (CPDF_ImageObject*)pObj;
     m_BlendType = blendType;
     m_pObj2Device = pObj2Device;
-#ifndef _FPDFAPI_MINI_
     CPDF_Dictionary* pOC = m_pImageObject->m_pImage->GetOC();
     if (pOC && m_pRenderStatus->m_Options.m_pOCContext && !m_pRenderStatus->m_Options.m_pOCContext->CheckOCGVisible(pOC)) {
         return FALSE;
     }
-#endif
     m_ImageMatrix = m_pImageObject->m_Matrix;
     m_ImageMatrix.Concat(*pObj2Device);
     if (StartLoadDIBSource()) {
@@ -721,14 +648,12 @@
 }
 FX_BOOL CPDF_ImageRenderer::StartDIBSource()
 {
-#if !defined(_FPDFAPI_MINI_)
     if (!(m_Flags & RENDER_FORCE_DOWNSAMPLE) && m_pDIBSource->GetBPP() > 1) {
         int image_size = m_pDIBSource->GetBPP() / 8 * m_pDIBSource->GetWidth() * m_pDIBSource->GetHeight();
         if (image_size > FPDF_HUGE_IMAGE_SIZE && !(m_Flags & RENDER_FORCE_HALFTONE)) {
             m_Flags |= RENDER_FORCE_DOWNSAMPLE;
         }
     }
-#endif
     if (m_pRenderStatus->m_pDevice->StartDIBits(m_pDIBSource, m_BitmapAlpha, m_FillArgb,
             &m_ImageMatrix, m_Flags, m_DeviceHandle, 0, NULL, m_BlendType)) {
         if (m_DeviceHandle != NULL) {
@@ -737,7 +662,6 @@
         }
         return FALSE;
     }
-#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
     CFX_FloatRect image_rect_f = m_ImageMatrix.GetUnitRect();
     FX_RECT image_rect = image_rect_f.GetOutterRect();
     int dest_width = image_rect.Width();
@@ -794,12 +718,10 @@
         delete pStretched;
         pStretched = NULL;
     }
-#endif
     return FALSE;
 }
 FX_BOOL CPDF_ImageRenderer::StartBitmapAlpha()
 {
-#ifndef _FPDFAPI_MINI_
     if (m_pDIBSource->IsOpaqueImage()) {
         CFX_PathData path;
         path.AppendRect(0, 0, 1, 1);
@@ -830,13 +752,11 @@
             delete pAlphaMask;
         }
     }
-#endif
     return FALSE;
 }
 FX_BOOL CPDF_ImageRenderer::Continue(IFX_Pause* pPause)
 {
     if (m_Status == 1) {
-#ifndef _FPDFAPI_MINI_
         if (m_pQuickStretcher->Continue(pPause)) {
             return TRUE;
         }
@@ -847,9 +767,7 @@
             m_pRenderStatus->m_pDevice->SetDIBits(m_pQuickStretcher->m_pBitmap, m_pQuickStretcher->m_ResultLeft,
                                                   m_pQuickStretcher->m_ResultTop, m_BlendType);
         return FALSE;
-#endif
     } else if (m_Status == 2) {
-#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
         if (m_pTransformer->Continue(pPause)) {
             return TRUE;
         }
@@ -872,7 +790,6 @@
         }
         delete pBitmap;
         return FALSE;
-#endif
     } else if (m_Status == 3) {
         return m_pRenderStatus->m_pDevice->ContinueDIBits(m_DeviceHandle, pPause);
     } else if (m_Status == 4) {
diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render_pattern.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render_pattern.cpp
index 9d9d9ec..6b895b5 100644
--- a/core/src/fpdfapi/fpdf_render/fpdf_render_pattern.cpp
+++ b/core/src/fpdfapi/fpdf_render/fpdf_render_pattern.cpp
@@ -881,11 +881,6 @@
     matrix.Concat(*pObj2Device);
     DrawShading(pShadingObj->m_pShading, &matrix, rect, pShadingObj->m_GeneralState.GetAlpha(FALSE),
                 m_Options.m_ColorMode == RENDER_COLOR_ALPHA);
-#ifdef _FPDFAPI_MINI_
-    if (m_DitherBits) {
-        DitherObjectArea(pShadingObj, pObj2Device);
-    }
-#endif
     return TRUE;
 }
 static CFX_DIBitmap* DrawPatternBitmap(CPDF_Document* pDoc, CPDF_PageRenderCache* pCache,
@@ -1117,9 +1112,4 @@
             bPattern = TRUE;
         }
     }
-#ifdef _FPDFAPI_MINI_
-    if (bPattern && m_DitherBits) {
-        DitherObjectArea(pPathObj, pObj2Device);
-    }
-#endif
 }
diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render_text.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render_text.cpp
index fcb422b..449b003 100644
--- a/core/src/fpdfapi/fpdf_render/fpdf_render_text.cpp
+++ b/core/src/fpdfapi/fpdf_render/fpdf_render_text.cpp
@@ -256,16 +256,6 @@
         DrawTextPathWithPattern(textobj, pObj2Device, pFont, font_size, &text_matrix, bFill, bStroke);
         return TRUE;
     }
-#if defined(_FPDFAPI_MINI_)
-    if (bFill) {
-        bStroke = FALSE;
-    }
-    if (bStroke) {
-        if (font_size * text_matrix.GetXUnit() * pObj2Device->GetXUnit() < 6) {
-            bStroke = FALSE;
-        }
-    }
-#endif
     if (bClip || bStroke) {
         const CFX_AffineMatrix* pDeviceMatrix = pObj2Device;
         CFX_AffineMatrix device_matrix;
@@ -284,12 +274,10 @@
             flag |= FX_FILL_STROKE;
             flag |= FX_STROKE_TEXT_MODE;
         }
-#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
         const CPDF_GeneralStateData* pGeneralData = ((CPDF_PageObject*)textobj)->m_GeneralState;
         if (pGeneralData && pGeneralData->m_StrokeAdjust) {
             flag |= FX_STROKE_ADJUST;
         }
-#endif
         if (m_Options.m_Flags & RENDER_NOTEXTSMOOTH) {
             flag |= FXFILL_NOPATHSMOOTH;
         }
diff --git a/core/src/fpdfapi/fpdf_render/render_int.h b/core/src/fpdfapi/fpdf_render/render_int.h
index f9a04a9..81feb5e 100644
--- a/core/src/fpdfapi/fpdf_render/render_int.h
+++ b/core/src/fpdfapi/fpdf_render/render_int.h
@@ -435,11 +435,7 @@
     CFX_DIBitmap*		m_pCachedBitmap;
     ICodec_ScanlineDecoder*	m_pDecoder;
 };
-#ifdef _FPDFAPI_MINI_
-#define FPDF_HUGE_IMAGE_SIZE	3000000
-#else
 #define FPDF_HUGE_IMAGE_SIZE	60000000
-#endif
 class CPDF_DIBTransferFunc : public CFX_FilteredDIB
 {
 public:
diff --git a/core/src/fpdftext/fpdf_text.cpp b/core/src/fpdftext/fpdf_text.cpp
index f633e19..a4a124d 100644
--- a/core/src/fpdftext/fpdf_text.cpp
+++ b/core/src/fpdftext/fpdf_text.cpp
@@ -9,7 +9,6 @@
 #include "../../include/fpdftext/fpdf_text.h"
 #include "txtproc.h"
 #include "text_int.h"
-#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
 extern FX_LPCSTR FCS_GetAltStr(FX_WCHAR);
 CFX_ByteString CharFromUnicodeAlt(FX_WCHAR unicode, int destcp, FX_LPCSTR defchar)
 {
@@ -776,7 +775,6 @@
         lines.Add(str);
     }
 }
-#endif
 extern void _PDF_GetTextStream_Unicode(CFX_WideTextBuf& buffer, CPDF_PageObjects* pPage, FX_BOOL bUseLF,
                                        CFX_PtrArray* pObjArray);
 void PDF_GetTextStream_Unicode(CFX_WideTextBuf& buffer, CPDF_Document* pDoc, CPDF_Dictionary* pPage, FX_DWORD flags)
diff --git a/core/src/fpdftext/fpdf_text_int.cpp b/core/src/fpdftext/fpdf_text_int.cpp
index 42bbffa..7526abc 100644
--- a/core/src/fpdftext/fpdf_text_int.cpp
+++ b/core/src/fpdftext/fpdf_text_int.cpp
@@ -160,11 +160,7 @@
             if(charinfo.m_Flag == FPDFTEXT_CHAR_GENERATED) {
                 bNormal = TRUE;
             }
-#ifdef FOXIT_CHROME_BUILD
             else if(charinfo.m_Unicode == 0 || IsControlChar(&charinfo))
-#else
-            else if(charinfo.m_Unicode == 0)
-#endif
                 bNormal = FALSE;
             else {
                 bNormal = TRUE;
@@ -1118,11 +1114,7 @@
 {
     PAGECHAR_INFO Info = *(PAGECHAR_INFO*)m_TempCharList.GetAt(i);
     FX_WCHAR wChar = str.GetAt(i);
-#ifdef FOXIT_CHROME_BUILD
     if(!IsControlChar(&Info)) {
-#else
-    if(wChar != 0xfffe) {
-#endif
         Info.m_Index = m_TextBuf.GetLength();
         if (wChar >= 0xFB00 && wChar <= 0xFB06) {
             FX_LPWSTR pDst = NULL;
@@ -1157,11 +1149,7 @@
 void CPDF_TextPage::AddCharInfoByRLDirection(CFX_WideString& str, int i)
 {
     PAGECHAR_INFO Info = *(PAGECHAR_INFO*)m_TempCharList.GetAt(i);
-#ifdef FOXIT_CHROME_BUILD
     if(!IsControlChar(&Info)) {
-#else
-    if(str.GetAt(i) != 0xfffe) {
-#endif
         Info.m_Index = m_TextBuf.GetLength();
         FX_WCHAR wChar = FX_GetMirrorChar(str.GetAt(i), TRUE, FALSE);
         FX_LPWSTR pDst = NULL;
@@ -1638,14 +1626,9 @@
             }
             PAGECHAR_INFO* cha = (PAGECHAR_INFO*)m_TempCharList.GetAt(m_TempCharList.GetSize() - 1);
             m_TempTextBuf.Delete(m_TempTextBuf.GetLength() - 1, 1);
-#ifdef FOXIT_CHROME_BUILD
             cha->m_Unicode = 0x2;
             cha->m_Flag = FPDFTEXT_CHAR_HYPHEN;
             m_TempTextBuf.AppendChar(0xfffe);
-#else
-            cha->m_Unicode = 0;
-            m_TempTextBuf.AppendChar(0xfffe);
-#endif
         }
     } else {
         m_CurlineRect = CFX_FloatRect(Obj.m_pTextObj->m_Left, Obj.m_pTextObj->m_Bottom, Obj.m_pTextObj->m_Right, Obj.m_pTextObj->m_Top);
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jerror.c b/core/src/fxcodec/libjpeg/fpdfapi_jerror.c
index 42e4066..943ced7 100644
--- a/core/src/fxcodec/libjpeg/fpdfapi_jerror.c
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jerror.c
@@ -11,11 +11,6 @@
  * stderr is the right thing to do.  Many applications will want to replace
  * some or all of these routines.
  *
- * If you define USE_WINDOWS_MESSAGEBOX in jconfig.h or in the makefile,
- * you get a Windows-specific hack to display error messages in a dialog box.
- * It ain't much, but it beats dropping error messages into the bit bucket,
- * which is what happens to output to stderr under most Windows C compilers.
- *
  * These routines are used by both the compression and decompression code.
  */
 
@@ -99,16 +94,8 @@
   /* Create the message */
   (*cinfo->err->format_message) (cinfo, buffer);
 
-#ifdef USE_WINDOWS_MESSAGEBOX
-  /* Display it in a message dialog box */
-  MessageBox(GetActiveWindow(), buffer, "JPEG Library Error",
-	     MB_OK | MB_ICONERROR);
-#else
   /* Send it to stderr, adding a newline */
-#ifndef _FPDFAPI_MINI_
   FXSYS_fprintf(stderr, "%s\n", buffer);
-#endif
-#endif
 }
 
 
diff --git a/core/src/fxcodec/libjpeg/jmemsys.h b/core/src/fxcodec/libjpeg/jmemsys.h
index ef14815..8966881 100644
--- a/core/src/fxcodec/libjpeg/jmemsys.h
+++ b/core/src/fxcodec/libjpeg/jmemsys.h
@@ -12,10 +12,7 @@
  *
  * This file works as-is for the system-dependent memory managers supplied
  * in the IJG distribution.  You may need to modify it if you write a
- * custom memory manager.  If system-dependent changes are needed in
- * this file, the best method is to #ifdef them based on a configuration
- * symbol supplied in jconfig.h, as we have done with USE_MSDOS_MEMMGR
- * and USE_MAC_MEMMGR.
+ * custom memory manager.
  */
 
 
@@ -115,25 +112,6 @@
 
 #define TEMP_NAME_LENGTH   64	/* max length of a temporary file's name */
 
-
-#ifdef USE_MSDOS_MEMMGR		/* DOS-specific junk */
-
-typedef unsigned short XMSH;	/* type of extended-memory handles */
-typedef unsigned short EMSH;	/* type of expanded-memory handles */
-
-typedef union {
-  short file_handle;		/* DOS file handle if it's a temp file */
-  XMSH xms_handle;		/* handle if it's a chunk of XMS */
-  EMSH ems_handle;		/* handle if it's a chunk of EMS */
-} handle_union;
-
-#endif /* USE_MSDOS_MEMMGR */
-
-#ifdef USE_MAC_MEMMGR		/* Mac-specific junk */
-#include <Files.h>
-#endif /* USE_MAC_MEMMGR */
-
-
 typedef struct backing_store_struct * backing_store_ptr;
 
 typedef struct backing_store_struct {
@@ -150,24 +128,9 @@
 				      backing_store_ptr info));
 
   /* Private fields for system-dependent backing-store management */
-#ifdef USE_MSDOS_MEMMGR
-  /* For the MS-DOS manager (jmemdos.c), we need: */
-  handle_union handle;		/* reference to backing-store storage object */
-  char temp_name[TEMP_NAME_LENGTH]; /* name if it's a file */
-#else
-#ifdef USE_MAC_MEMMGR
-  /* For the Mac manager (jmemmac.c), we need: */
-  short temp_file;		/* file reference number to temp file */
-  FSSpec tempSpec;		/* the FSSpec for the temp file */
-  char temp_name[TEMP_NAME_LENGTH]; /* name if it's a file */
-#else
   /* For a typical implementation with temp files, we need: */
-#ifndef _FPDFAPI_MINI_
   FXSYS_FILE * temp_file;		/* stdio reference to temp file */
   char temp_name[TEMP_NAME_LENGTH]; /* name of temp file */
-#endif
-#endif
-#endif
 } backing_store_info;
 
 
diff --git a/core/src/fxge/agg/agg23/fx_agg_driver.cpp b/core/src/fxge/agg/agg23/fx_agg_driver.cpp
index f0f6e5e..8cea42d 100644
--- a/core/src/fxge/agg/agg23/fx_agg_driver.cpp
+++ b/core/src/fxge/agg/agg23/fx_agg_driver.cpp
@@ -214,7 +214,7 @@
         }
     DestroyPlatform();
 }
-#if ((_FXM_PLATFORM_  != _FXM_PLATFORM_APPLE_)|| defined(_FPDFAPI_MINI_))
+#if _FXM_PLATFORM_  != _FXM_PLATFORM_APPLE_
 void CFX_AggDeviceDriver::InitPlatform()
 {
 }
diff --git a/core/src/fxge/apple/fx_apple_platform.cpp b/core/src/fxge/apple/fx_apple_platform.cpp
index 7bc1232..a13323d 100644
--- a/core/src/fxge/apple/fx_apple_platform.cpp
+++ b/core/src/fxge/apple/fx_apple_platform.cpp
@@ -14,7 +14,7 @@
 #include "../dib/dib_int.h"
 #include "../agg/include/fx_agg_driver.h"
 #include "../../../include/fxge/fx_freetype.h"
-#if (_FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_ && (!defined(_FPDFAPI_MINI_)))
+#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_
 void CFX_AggDeviceDriver::InitPlatform()
 {
     CQuartz2D & quartz2d = ((CApplePlatform *) CFX_GEModule::Get()->GetPlatformData())->_quartz2d;
diff --git a/core/src/fxge/apple/fx_mac_imp.cpp b/core/src/fxge/apple/fx_mac_imp.cpp
index a21aa5d..5acedc0 100644
--- a/core/src/fxge/apple/fx_mac_imp.cpp
+++ b/core/src/fxge/apple/fx_mac_imp.cpp
@@ -25,7 +25,6 @@
     {"Times-BoldItalic", "Times New Roman Bold Italic"},
     {"Times-Italic", "Times New Roman Italic"},
 };
-#if !defined(_FPDFAPI_MINI_)
 class CFX_MacFontInfo : public CFX_FolderFontInfo
 {
 public:
@@ -86,10 +85,8 @@
     }
     return NULL;
 }
-#endif
 IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault()
 {
-#if !defined(_FPDFAPI_MINI_)
     CFX_MacFontInfo* pInfo = FX_NEW CFX_MacFontInfo;
     if (!pInfo) {
         return NULL;
@@ -98,9 +95,6 @@
     pInfo->AddPath("/Library/Fonts");
     pInfo->AddPath("/System/Library/Fonts");
     return pInfo;
-#else
-    return NULL;
-#endif
 }
 void CFX_GEModule::InitPlatform()
 {
diff --git a/core/src/fxge/dib/fx_dib_engine.cpp b/core/src/fxge/dib/fx_dib_engine.cpp
index b436f88..f4c0ef1 100644
--- a/core/src/fxge/dib/fx_dib_engine.cpp
+++ b/core/src/fxge/dib/fx_dib_engine.cpp
@@ -311,11 +311,7 @@
     if (m_DestWidth == 0 || m_pDestScanline == NULL || m_SrcClip.Height() > (int)((1U << 29) / m_InterPitch) || m_SrcClip.Height() == 0) {
         return FALSE;
     }
-#ifndef _FPDFAPI_MINI_
     m_pInterBuf = FX_AllocNL(unsigned char, m_SrcClip.Height() * m_InterPitch);
-#else
-    m_pInterBuf = FX_Alloc(unsigned char, m_SrcClip.Height() * m_InterPitch);
-#endif
     if (m_pInterBuf == NULL) {
         return FALSE;
     }
@@ -766,11 +762,7 @@
         return ContinueStretch(pPause);
     }
 }
-#ifndef _FPDFAPI_MINI_
 #define MAX_PROGRESSIVE_STRETCH_PIXELS	1000000
-#else
-#define MAX_PROGRESSIVE_STRETCH_PIXELS	100000
-#endif
 FX_BOOL CFX_ImageStretcher::StartStretch()
 {
     m_pStretchEngine = FX_NEW CStretchEngine(m_pDest, m_DestFormat, m_DestWidth, m_DestHeight, m_ClipRect, m_pSource, m_Flags);
@@ -793,9 +785,6 @@
 }
 FX_BOOL CFX_ImageStretcher::StartQuickStretch()
 {
-#ifdef _FPDFAPI_MINI_
-    m_pSource->SetDownSampleSize(m_DestWidth, m_DestHeight);
-#endif
     m_bFlipX = FALSE;
     m_bFlipY = FALSE;
     if (m_DestWidth < 0) {
diff --git a/core/src/fxge/dib/fx_dib_main.cpp b/core/src/fxge/dib/fx_dib_main.cpp
index 7e8cb0c..2cb41f6 100644
--- a/core/src/fxge/dib/fx_dib_main.cpp
+++ b/core/src/fxge/dib/fx_dib_main.cpp
@@ -431,7 +431,6 @@
     }
     return TRUE;
 }
-#ifndef _FPDFAPI_MINI_
 FX_BOOL CFX_DIBitmap::TransferMask(int dest_left, int dest_top, int width, int height,
                                    const CFX_DIBSource* pMask, FX_DWORD color, int src_left, int src_top, int alpha_flag, void* pIccTransform)
 {
@@ -526,7 +525,6 @@
     }
     return TRUE;
 }
-#endif
 void CFX_DIBSource::CopyPalette(const FX_DWORD* pSrc, FX_DWORD size)
 {
     if (pSrc == NULL || GetBPP() > 8) {
@@ -1053,7 +1051,6 @@
     }
     return TRUE;
 }
-#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
 FX_DWORD CFX_DIBitmap::GetPixel(int x, int y) const
 {
     if (m_pBuffer == NULL) {
@@ -1090,7 +1087,6 @@
     }
     return 0;
 }
-#endif
 void CFX_DIBitmap::SetPixel(int x, int y, FX_DWORD color)
 {
     if (m_pBuffer == NULL) {
@@ -1176,9 +1172,7 @@
             if (bFlipX) {
                 src_x = m_Width - src_x - 1;
             }
-#ifdef FOXIT_CHROME_BUILD
             src_x %= m_Width;
-#endif
             dest_scan[i] = (scanline[src_x / 8] & (1 << (7 - src_x % 8))) ? 255 : 0;
         }
     } else if (src_Bpp == 1) {
@@ -1188,9 +1182,7 @@
             if (bFlipX) {
                 src_x = m_Width - src_x - 1;
             }
-#ifdef FOXIT_CHROME_BUILD
             src_x %= m_Width;
-#endif
             int dest_pos = i;
             if (m_pPalette) {
                 if (!IsCmykImage()) {
@@ -1215,9 +1207,7 @@
         for (int i = 0; i < clip_width; i ++) {
             FX_DWORD dest_x = clip_left + i;
             FX_DWORD src_x = bFlipX ? (m_Width - dest_x * m_Width / dest_width - 1) * src_Bpp : (dest_x * m_Width / dest_width) * src_Bpp;
-#ifdef FOXIT_CHROME_BUILD
             src_x %= m_Width * src_Bpp;
-#endif
             int dest_pos = i * src_Bpp;
             for (int b = 0; b < src_Bpp; b ++) {
                 dest_scan[dest_pos + b] = scanline[src_x + b];
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/fxft_psmodule.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/fxft_psmodule.c
index 595aa87..3380e39 100644
--- a/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/fxft_psmodule.c
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/fxft_psmodule.c
@@ -168,7 +168,6 @@
 }
 #endif
 
-#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
 static int xyq_search_node(char* glyph_name, int name_offset, int table_offset, FT_UInt32 unicode)
 {
 	int i, count;
@@ -221,7 +220,6 @@
 	// failed, clear the buffer
 	glyph_name[0] = 0;
 }
-#endif
 
   /* ft_qsort callback to sort the unicode map */
   FT_CALLBACK_DEF( int )
diff --git a/core/src/fxge/ge/fx_ge_font.cpp b/core/src/fxge/ge/fx_ge_font.cpp
index 817f371..f9e1fe6 100644
--- a/core/src/fxge/ge/fx_ge_font.cpp
+++ b/core/src/fxge/ge/fx_ge_font.cpp
@@ -32,18 +32,14 @@
         delete m_pSubstFont;
         m_pSubstFont = NULL;
     }
-#ifdef FOXIT_CHROME_BUILD
     if (m_pFontDataAllocation) {
         FX_Free(m_pFontDataAllocation);
         m_pFontDataAllocation = NULL;
     }
-#endif
     if (m_Face) {
-#ifdef FOXIT_CHROME_BUILD
         if (FXFT_Get_Face_External_Stream(m_Face)) {
             FXFT_Clear_Face_External_Stream(m_Face);
         }
-#endif
         if(m_bEmbedded) {
             DeleteFace();
         } else {
@@ -58,7 +54,7 @@
         FX_Free(m_pGsubData);
         m_pGsubData = NULL;
     }
-#if (_FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_ && (!defined(_FPDFAPI_MINI_)))
+#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_
     ReleasePlatformResource();
 #endif
 }
@@ -183,7 +179,6 @@
 }
 FX_BOOL CFX_Font::LoadEmbedded(FX_LPCBYTE data, FX_DWORD size)
 {
-#ifdef FOXIT_CHROME_BUILD
     m_pFontDataAllocation = FX_Alloc(FX_BYTE, size);
     if (!m_pFontDataAllocation) {
         return FALSE;
@@ -191,10 +186,6 @@
     FXSYS_memcpy32(m_pFontDataAllocation, data, size);
     m_Face = FT_LoadFont((FX_LPBYTE)m_pFontDataAllocation, size);
     m_pFontData = (FX_LPBYTE)m_pFontDataAllocation;
-#else
-    m_Face = FT_LoadFont((FX_LPBYTE)data, size);
-    m_pFontData = (FX_LPBYTE)data;
-#endif
     m_bEmbedded = TRUE;
     m_dwSize = size;
     return m_Face != NULL;
diff --git a/core/src/fxge/ge/fx_ge_fontmap.cpp b/core/src/fxge/ge/fx_ge_fontmap.cpp
index a5fa644..36f28f3 100644
--- a/core/src/fxge/ge/fx_ge_fontmap.cpp
+++ b/core/src/fxge/ge/fx_ge_fontmap.cpp
@@ -1308,13 +1308,12 @@
     m_Face = NULL;
 }
 extern FX_BOOL _LoadFile(FXFT_Library library, FXFT_Face* Face, IFX_FileRead* pFile, FXFT_Stream* stream);
-#if defined(_FPDFAPI_MINI_) || _FX_OS_ == _FX_ANDROID_
+#if _FX_OS_ == _FX_ANDROID_
 IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault()
 {
     return NULL;
 }
 #endif
-#if !defined(_FPDFAPI_MINI_)
 CFX_FolderFontInfo::CFX_FolderFontInfo()
 {
 }
@@ -1547,4 +1546,3 @@
 {
     return FALSE;
 }
-#endif
diff --git a/core/src/fxge/ge/fx_ge_linux.cpp b/core/src/fxge/ge/fx_ge_linux.cpp
deleted file mode 100644
index 735ecac..0000000
--- a/core/src/fxge/ge/fx_ge_linux.cpp
+++ /dev/null
@@ -1,259 +0,0 @@
-// Copyright 2014 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 "../../../include/fxge/fx_ge.h"
-#include "../agg/include/fx_agg_driver.h"
-#include "text_int.h"
-#if !defined(_FPDFAPI_MINI_) &&  _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_
-#if (_FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_ && (!defined(_FPDFAPI_MINI_)))
-void CFX_AggDeviceDriver::InitPlatform()
-{
-}
-void CFX_AggDeviceDriver::DestroyPlatform()
-{
-}
-void CFX_FaceCache::InitPlatform()
-{
-}
-FX_BOOL CFX_AggDeviceDriver::DrawDeviceText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont,
-        CFX_FontCache* pCache, const CFX_AffineMatrix* pObject2Device,
-        FX_FLOAT font_size, FX_DWORD argb)
-{
-    return FALSE;
-}
-CFX_GlyphBitmap* CFX_FaceCache::RenderGlyph_Nativetext(CFX_Font* pFont, FX_DWORD glyph_index, const CFX_AffineMatrix* pMatrix,
-        int dest_width, int anti_alias)
-{
-    return NULL;
-}
-void CFX_Font::ReleasePlatformResource()
-{
-}
-#endif
-static const struct {
-    FX_LPCSTR	m_pName;
-    FX_LPCSTR	m_pSubstName;
-}
-Base14Substs[] = {
-    {"Courier", "Courier New"},
-    {"Courier-Bold", "Courier New Bold"},
-    {"Courier-BoldOblique", "Courier New Bold Italic"},
-    {"Courier-Oblique", "Courier New Italic"},
-    {"Helvetica", "Arial"},
-    {"Helvetica-Bold", "Arial Bold"},
-    {"Helvetica-BoldOblique", "Arial Bold Italic"},
-    {"Helvetica-Oblique", "Arial Italic"},
-    {"Times-Roman", "Times New Roman"},
-    {"Times-Bold", "Times New Roman Bold"},
-    {"Times-BoldItalic", "Times New Roman Bold Italic"},
-    {"Times-Italic", "Times New Roman Italic"},
-};
-class CFX_LinuxFontInfo : public CFX_FolderFontInfo
-{
-public:
-    virtual void*		MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR family, FX_BOOL& bExact);
-    FX_BOOL				ParseFontCfg();
-    void*				FindFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR family, FX_BOOL bMatchName);
-};
-#define LINUX_GPNAMESIZE	6
-static const struct {
-    FX_LPCSTR NameArr[LINUX_GPNAMESIZE];
-}
-LinuxGpFontList[] = {
-    {{"TakaoPGothic", "VL PGothic", "IPAPGothic", "VL Gothic", "Kochi Gothic", "VL Gothic regular"}},
-    {{"TakaoGothic", "VL Gothic", "IPAGothic", "Kochi Gothic", NULL, "VL Gothic regular"}},
-    {{"TakaoPMincho", "IPAPMincho", "VL Gothic", "Kochi Mincho", NULL, "VL Gothic regular"}},
-    {{"TakaoMincho", "IPAMincho", "VL Gothic", "Kochi Mincho", NULL, "VL Gothic regular"}},
-};
-static const FX_LPCSTR g_LinuxGbFontList[] = {
-    "AR PL UMing CN Light",
-    "WenQuanYi Micro Hei",
-    "AR PL UKai CN",
-};
-static const FX_LPCSTR g_LinuxB5FontList[] = {
-    "AR PL UMing TW Light",
-    "WenQuanYi Micro Hei",
-    "AR PL UKai TW",
-};
-static const FX_LPCSTR g_LinuxHGFontList[] = {
-    "UnDotum",
-};
-static FX_INT32 GetJapanesePreference(FX_LPCSTR facearr, int weight, int picth_family)
-{
-    CFX_ByteString face = facearr;
-    if (face.Find("Gothic") >= 0 || face.Find("\x83\x53\x83\x56\x83\x62\x83\x4e") >= 0) {
-        if (face.Find("PGothic") >= 0 || face.Find("\x82\x6f\x83\x53\x83\x56\x83\x62\x83\x4e") >= 0) {
-            return 0;
-        } else {
-            return 1;
-        }
-    } else if (face.Find("Mincho") >= 0 || face.Find("\x96\xbe\x92\xa9") >= 0) {
-        if (face.Find("PMincho") >= 0 || face.Find("\x82\x6f\x96\xbe\x92\xa9") >= 0) {
-            return 2;
-        } else {
-            return 3;
-        }
-    }
-    if (!(picth_family & FXFONT_FF_ROMAN) && weight > 400) {
-        return 0;
-    }
-    return 2;
-}
-void* CFX_LinuxFontInfo::MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR cstr_face, FX_BOOL& bExact)
-{
-    CFX_ByteString face = cstr_face;
-    int iBaseFont;
-    for (iBaseFont = 0; iBaseFont < 12; iBaseFont ++)
-        if (face == CFX_ByteStringC(Base14Substs[iBaseFont].m_pName)) {
-            face = Base14Substs[iBaseFont].m_pSubstName;
-            bExact = TRUE;
-            break;
-        }
-    if (iBaseFont < 12) {
-        return GetFont(face);
-    }
-    FX_LPVOID p = NULL;
-    FX_BOOL bCJK = TRUE;
-    switch (charset) {
-        case FXFONT_SHIFTJIS_CHARSET: {
-                FX_INT32 index = GetJapanesePreference(cstr_face, weight, pitch_family);
-                if (index < 0) {
-                    break;
-                }
-                for (FX_INT32 i = 0; i < LINUX_GPNAMESIZE; i++)
-                    if (m_FontList.Lookup(LinuxGpFontList[index].NameArr[i], p)) {
-                        return p;
-                    }
-            }
-            break;
-        case FXFONT_GB2312_CHARSET: {
-                static FX_INT32 s_gbCount = sizeof(g_LinuxGbFontList) / sizeof(FX_LPCSTR);
-                for (FX_INT32 i = 0; i < s_gbCount; i++)
-                    if (m_FontList.Lookup(g_LinuxGbFontList[i], p)) {
-                        return p;
-                    }
-            }
-            break;
-        case FXFONT_CHINESEBIG5_CHARSET: {
-                static FX_INT32 s_b5Count = sizeof(g_LinuxB5FontList) / sizeof(FX_LPCSTR);
-                for (FX_INT32 i = 0; i < s_b5Count; i++)
-                    if (m_FontList.Lookup(g_LinuxB5FontList[i], p)) {
-                        return p;
-                    }
-            }
-            break;
-        case FXFONT_HANGEUL_CHARSET: {
-                static FX_INT32 s_hgCount = sizeof(g_LinuxHGFontList) / sizeof(FX_LPCSTR);
-                for (FX_INT32 i = 0; i < s_hgCount; i++)
-                    if (m_FontList.Lookup(g_LinuxHGFontList[i], p)) {
-                        return p;
-                    }
-            }
-            break;
-        default:
-            bCJK = FALSE;
-            break;
-    }
-    if (charset == FXFONT_ANSI_CHARSET && (pitch_family & FXFONT_FF_FIXEDPITCH)) {
-        return GetFont("Courier New");
-    }
-    return FindFont(weight, bItalic, charset, pitch_family, cstr_face, !bCJK);
-}
-static FX_DWORD _LinuxGetCharset(int charset)
-{
-    switch(charset) {
-        case FXFONT_SHIFTJIS_CHARSET:
-            return CHARSET_FLAG_SHIFTJIS;
-        case FXFONT_GB2312_CHARSET:
-            return CHARSET_FLAG_GB;
-        case FXFONT_CHINESEBIG5_CHARSET:
-            return CHARSET_FLAG_BIG5;
-        case FXFONT_HANGEUL_CHARSET:
-            return CHARSET_FLAG_KOREAN;
-        case FXFONT_SYMBOL_CHARSET:
-            return CHARSET_FLAG_SYMBOL;
-        case FXFONT_ANSI_CHARSET:
-            return CHARSET_FLAG_ANSI;
-        default:
-            break;
-    }
-    return 0;
-}
-static FX_INT32 _LinuxGetSimilarValue(int weight, FX_BOOL bItalic, int pitch_family, FX_DWORD style)
-{
-    FX_INT32 iSimilarValue = 0;
-    if ((style & FXFONT_BOLD) == (weight > 400)) {
-        iSimilarValue += 16;
-    }
-    if ((style & FXFONT_ITALIC) == bItalic) {
-        iSimilarValue += 16;
-    }
-    if ((style & FXFONT_SERIF) == (pitch_family & FXFONT_FF_ROMAN)) {
-        iSimilarValue += 16;
-    }
-    if ((style & FXFONT_SCRIPT) == (pitch_family & FXFONT_FF_SCRIPT)) {
-        iSimilarValue += 8;
-    }
-    if ((style & FXFONT_FIXED_PITCH) == (pitch_family & FXFONT_FF_FIXEDPITCH)) {
-        iSimilarValue += 8;
-    }
-    return iSimilarValue;
-}
-void* CFX_LinuxFontInfo::FindFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR family, FX_BOOL bMatchName)
-{
-    CFontFaceInfo* pFind = NULL;
-    FX_DWORD charset_flag = _LinuxGetCharset(charset);
-    FX_INT32 iBestSimilar = 0;
-    FX_POSITION pos = m_FontList.GetStartPosition();
-    while (pos) {
-        CFX_ByteString bsName;
-        CFontFaceInfo* pFont = NULL;
-        m_FontList.GetNextAssoc(pos, bsName, (FX_LPVOID&)pFont);
-        if (!(pFont->m_Charsets & charset_flag) && charset != FXFONT_DEFAULT_CHARSET) {
-            continue;
-        }
-        FX_INT32 iSimilarValue = 0;
-        FX_INT32 index = bsName.Find(family);
-        if (bMatchName && index < 0) {
-            continue;
-        }
-        if (!bMatchName && index > 0) {
-            iSimilarValue += 64;
-        }
-        iSimilarValue = _LinuxGetSimilarValue(weight, bItalic, pitch_family, pFont->m_Styles);
-        if (iSimilarValue > iBestSimilar) {
-            iBestSimilar = iSimilarValue;
-            pFind = pFont;
-        }
-    }
-    return pFind;
-}
-IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault()
-{
-    CFX_LinuxFontInfo* pInfo = FX_NEW CFX_LinuxFontInfo;
-    if (!pInfo) {
-        return NULL;
-    }
-    if (!pInfo->ParseFontCfg()) {
-        pInfo->AddPath("/usr/share/fonts");
-        pInfo->AddPath("/usr/share/X11/fonts/Type1");
-        pInfo->AddPath("/usr/share/X11/fonts/TTF");
-        pInfo->AddPath("/usr/local/share/fonts");
-    }
-    return pInfo;
-}
-FX_BOOL CFX_LinuxFontInfo::ParseFontCfg()
-{
-    return FALSE;
-}
-void CFX_GEModule::InitPlatform()
-{
-    m_pFontMgr->SetSystemFontInfo(IFX_SystemFontInfo::CreateDefault());
-}
-void CFX_GEModule::DestroyPlatform()
-{
-}
-#endif
diff --git a/core/src/fxge/ge/fx_ge_text.cpp b/core/src/fxge/ge/fx_ge_text.cpp
index 440ecdd..eb9b7d0 100644
--- a/core/src/fxge/ge/fx_ge_text.cpp
+++ b/core/src/fxge/ge/fx_ge_text.cpp
@@ -1070,7 +1070,7 @@
     }
     m_PathMap.RemoveAll();
 }
-#if ((_FXM_PLATFORM_  != _FXM_PLATFORM_APPLE_)|| defined(_FPDFAPI_MINI_))
+#if _FXM_PLATFORM_  != _FXM_PLATFORM_APPLE_
 void CFX_FaceCache::InitPlatform()
 {
 }
@@ -1105,7 +1105,7 @@
         return NULL;
     }
     _CFX_UniqueKeyGen keygen;
-#if ((_FXM_PLATFORM_  != _FXM_PLATFORM_APPLE_)|| defined(_FPDFAPI_MINI_))
+#if _FXM_PLATFORM_  != _FXM_PLATFORM_APPLE_
     if (pFont->GetSubstFont())
         keygen.Generate(9, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),
                         (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias,
@@ -1133,7 +1133,7 @@
     }
 #endif
     CFX_ByteStringC FaceGlyphsKey(keygen.m_Key, keygen.m_KeyLen);
-#if ((_FXM_PLATFORM_  != _FXM_PLATFORM_APPLE_)|| defined(_FPDFAPI_MINI_))
+#if _FXM_PLATFORM_  != _FXM_PLATFORM_APPLE_
     return LookUpGlyphBitmap(pFont, pMatrix, FaceGlyphsKey, glyph_index, bFontStyle, dest_width, anti_alias);
 #else
     if (text_flags & FXTEXT_NO_NATIVETEXT) {
@@ -1186,11 +1186,7 @@
     }
     m_GlyphMap.RemoveAll();
 }
-#if defined(_FPDFAPI_MINI_)
-#define CONTRAST_RAMP_STEP	16
-#else
 #define CONTRAST_RAMP_STEP	1
-#endif
 void CFX_Font::AdjustMMParams(int glyph_index, int dest_width, int weight)
 {
     FXFT_MM_Var pMasters = NULL;
diff --git a/core/src/fxge/win32/fx_win32_device.cpp b/core/src/fxge/win32/fx_win32_device.cpp
index d821024..06e9777 100644
--- a/core/src/fxge/win32/fx_win32_device.cpp
+++ b/core/src/fxge/win32/fx_win32_device.cpp
@@ -391,12 +391,10 @@
     charset = tm.tmCharSet;
     return TRUE;
 }
-#ifndef _FPDFAPI_MINI_
 IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault()
 {
     return FX_NEW CWin32FontInfo;
 }
-#endif
 void CFX_GEModule::InitPlatform()
 {
     CWin32Platform* pPlatformData = FX_NEW CWin32Platform;
@@ -571,29 +569,29 @@
     bmi.bmiColors[0] = 0xffffff;
     bmi.bmiColors[1] = 0;
 
-    HBRUSH hPattern = CreateSolidBrush(bitmap_color & 0xffffff);
-    HBRUSH hOld = (HBRUSH)SelectObject(m_hDC, hPattern);
-
-    
-    // In PDF, when image mask is 1, use device bitmap; when mask is 0, use brush bitmap.
-    // A complete list of the boolen operations is as follows:
-
-    /* P(bitmap_color)    S(ImageMask)    D(DeviceBitmap)    Result
-     *        0                 0                0              0
-     *        0                 0                1              0
-     *        0                 1                0              0
-     *        0                 1                1              1
-     *        1                 0                0              1
-     *        1                 0                1              1
-     *        1                 1                0              0
-     *        1                 1                1              1
-     */
-    // The boolen codes is B8. Based on http://msdn.microsoft.com/en-us/library/aa932106.aspx, the ROP3 code is 0xB8074A
-
-    ::StretchDIBits(m_hDC, dest_left, dest_top, dest_width, dest_height,
-                    0, 0, width, height, pBitmap->GetBuffer(), (BITMAPINFO*)&bmi, DIB_RGB_COLORS, 0xB8074A);
-
-    SelectObject(m_hDC, hOld);
+    HBRUSH hPattern = CreateSolidBrush(bitmap_color & 0xffffff);
+    HBRUSH hOld = (HBRUSH)SelectObject(m_hDC, hPattern);
+
+    
+    // In PDF, when image mask is 1, use device bitmap; when mask is 0, use brush bitmap.
+    // A complete list of the boolen operations is as follows:
+
+    /* P(bitmap_color)    S(ImageMask)    D(DeviceBitmap)    Result
+     *        0                 0                0              0
+     *        0                 0                1              0
+     *        0                 1                0              0
+     *        0                 1                1              1
+     *        1                 0                0              1
+     *        1                 0                1              1
+     *        1                 1                0              0
+     *        1                 1                1              1
+     */
+    // The boolen codes is B8. Based on http://msdn.microsoft.com/en-us/library/aa932106.aspx, the ROP3 code is 0xB8074A
+
+    ::StretchDIBits(m_hDC, dest_left, dest_top, dest_width, dest_height,
+                    0, 0, width, height, pBitmap->GetBuffer(), (BITMAPINFO*)&bmi, DIB_RGB_COLORS, 0xB8074A);
+
+    SelectObject(m_hDC, hOld);
     DeleteObject(hPattern);
 
     return TRUE;
@@ -979,11 +977,9 @@
             ret = FALSE;
         }
     }
-#ifndef _FPDFAPI_MINI_
     if (pBitmap->HasAlpha() && ret) {
         pBitmap->LoadChannel(FXDIB_Alpha, 0xff);
     }
-#endif
     DeleteObject(hbmp);
     DeleteObject(hDCMemory);
     return ret;
@@ -1175,11 +1171,9 @@
     } else {
         device_class = FXDC_DISPLAY;
     }
-#ifndef _FPDFAPI_MINI_
     if (device_class == FXDC_PRINTER) {
         return FX_NEW CGdiPrinterDriver(hDC);
     }
-#endif
     return FX_NEW CGdiDisplayDriver(hDC);
 }
 CFX_WinBitmapDevice::CFX_WinBitmapDevice(int width, int height, FXDIB_Format format)
diff --git a/fpdfsdk/include/fpdfoom.h b/fpdfsdk/include/fpdfoom.h
deleted file mode 100644
index dd14b74..0000000
--- a/fpdfsdk/include/fpdfoom.h
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2014 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 _FPDFOOM_H_
-#define _FPDFOOM_H_
-
-#ifndef _FPDFVIEW_H_
-#include "fpdfview.h"
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-typedef	struct _OOM_INFO
-{
-	/**
-	* Version number of the interface. Currently must be 1.
-	**/
-	int version;
-	
-	/** 
-	* Method: FSDK_OOM_Handler
-	*			 Out-Of-Memory handling function.
-	* Interface Version:
-	*			1
-	* Implementation Required:
-	*			Yes
-	* Parameters:
-	*		pThis		-	Pointer to the interface structure itself.
-	* 	Return value:
-	* 		None.
-	* */
-
-	void(*FSDK_OOM_Handler)(_OOM_INFO* pThis);
-}OOM_INFO;
-
-
-/**
- * Function: FSDK_SetOOMHandler
- *			 Setup A Out-Of-Memory handler for foxit sdk. 
- * Parameters:
- *			oomInfo		-	Pointer to a OOM_INFO structure.
- * Return Value:
- *			TRUE means successful. FALSE means fails. 
- **/
-
-DLLEXPORT FPDF_BOOL STDCALL FSDK_SetOOMHandler(OOM_INFO* oomInfo);
-
-
-#ifdef __cplusplus
-};
-#endif
-
-
-
-
-#endif
diff --git a/fpdfsdk/include/fpdfview.h b/fpdfsdk/include/fpdfview.h
index 4dcdcf6..ddf359c 100644
--- a/fpdfsdk/include/fpdfview.h
+++ b/fpdfsdk/include/fpdfview.h
@@ -126,13 +126,13 @@
 // Function: FPDF_InitLibrary
 //			Initialize the FPDFSDK library 
 // Parameters:
-//			hInstance	-	For WIN32 system only: the instance of the executable or DLL module.
+//			None
 // Return value:
 //			None.
 // Comments:
 //			You have to call this function before you can call any PDF processing functions.
 
-DLLEXPORT void STDCALL FPDF_InitLibrary(void* hInstance);
+DLLEXPORT void STDCALL FPDF_InitLibrary();
 
 
 // Function: FPDF_DestroyLibary
diff --git a/fpdfsdk/include/fsdk_define.h b/fpdfsdk/include/fsdk_define.h
index d249f08..7a4067e 100644
--- a/fpdfsdk/include/fsdk_define.h
+++ b/fpdfsdk/include/fsdk_define.h
@@ -12,59 +12,25 @@
 #include <math.h>
 #endif
 
-//#define API5
-#define API6
-#define  _FPDFAPI_ASYNC_PARSING_
-#define _FXSDK_OPENSOURCE_
+#include "../../core/include/fpdfapi/fpdf_parser.h" 
+#include "../../core/include/fpdfapi/fpdfapi.h" 
+#include "../../core/include/fpdfapi/fpdf_parser.h" 
+#include "../../core/include/fpdfapi/fpdf_module.h" 
+#include "../../core/include/fpdfapi/fpdf_render.h" 
+#include "../../core/include/fpdfapi/fpdf_pageobj.h" 
+#include "../../core/include/fpdfapi/fpdf_serial.h" 
 
-#ifdef _FPDFEMB_WCE_
-	#include "../../core/include/fpdfapi/fpdfapi.h" 
-	#include "../../core/include/fpdfapi/fpdf_parser.h" 
-	#include "../../core/include/fpdfapi/fpdf_module.h" 
-	#include "../../core/include/fpdfapi/fpdf_render.h" 
-	#include "../../core/include/fpdfapi/fpdf_pageobj.h" 
-	#include "../../core/include/fpdfapi/fpdf_serial.h" 
+#include "../../core/include/fpdftext/fpdf_text.h"
 
-	#include "../../core/include/fpdftext/fpdf_text.h"
+#include "../../core/include/fxge/fx_ge_win32.h"
+#include "../../core/include/fxge/fx_ge.h"
 
-	#include "../../core/include/fxge/fx_ge_win32.h"
-	#include "../../core/include/fxge/fx_ge.h"
+#include "../../core/include/fxcodec/fx_codec.h"
 
-	#include "../../core/include/fxcodec/fx_codec.h"
+#include "../../core/include/fpdfdoc/fpdf_doc.h" 
+#include "../../core/include/fpdfdoc/fpdf_vt.h" 
 
-	#include "../../core/include/fpdfdoc/fpdf_doc.h" 
-	#include "../../core/include/fpdfdoc/fpdf_vt.h" 
-
-	#include "../../core/include/fxcrt/fx_xml.h" 
-	#include "../../core/include/fxcrt/fx_crypt.h"
-
-#else
-	#ifdef API6
-		#include "../../core/include/fpdfapi/fpdf_parser.h" 
-		#include "../../core/include/fpdfapi/fpdfapi.h" 
-		#include "../../core/include/fpdfapi/fpdf_parser.h" 
-		#include "../../core/include/fpdfapi/fpdf_module.h" 
-		#include "../../core/include/fpdfapi/fpdf_render.h" 
-		#include "../../core/include/fpdfapi/fpdf_pageobj.h" 
-		#include "../../core/include/fpdfapi/fpdf_serial.h" 
-
-		#include "../../core/include/fpdftext/fpdf_text.h"
-
-		#include "../../core/include/fxge/fx_ge_win32.h"
-		#include "../../core/include/fxge/fx_ge.h"
-
-		#include "../../core/include/fxcodec/fx_codec.h"
-
-		#include "../../core/include/fpdfdoc/fpdf_doc.h" 
-		#include "../../core/include/fpdfdoc/fpdf_vt.h" 
-
-		#include "../../core/include/fxcrt/fx_xml.h" 
-	//	#include "../../core/include/fdrm/fx_crypt.h"
-		#ifdef _LICENSED_BUILD_
-			#include "../../cryptopp/Cryptlib.h"
-		#endif
-	#endif
-#endif
+#include "../../core/include/fxcrt/fx_xml.h" 
 
 
 #ifndef FX_GetAValue
diff --git a/fpdfsdk/src/fpdfeditpage.cpp b/fpdfsdk/src/fpdfeditpage.cpp
index 5c43d4d..831a85a 100644
--- a/fpdfsdk/src/fpdfeditpage.cpp
+++ b/fpdfsdk/src/fpdfeditpage.cpp
@@ -4,7 +4,6 @@
  
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-// #include "x:/pdf/fpdfapi5/include/fpdfapi.h"
 #include "../include/fsdk_define.h"
 #include "../include/fpdfedit.h"
 
@@ -44,11 +43,7 @@
 	{
 		if(FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS))
 			pInfoDict->SetAt("CreationDate", new CPDF_String(DateStr));
-#ifdef FOXIT_CHROME_BUILD
-		pInfoDict->SetAt("Creator",FX_NEW CPDF_String(L"Google"));
-#else
-		pInfoDict->SetAt("Creator",FX_NEW CPDF_String(L"Foxit PDF SDK DLL 2.0 - Foxit Software"));
-#endif
+		pInfoDict->SetAt("Creator",FX_NEW CPDF_String(L"PDFium"));
 	}
 
 	return pDoc;
diff --git a/fpdfsdk/src/fpdfoom.cpp b/fpdfsdk/src/fpdfoom.cpp
deleted file mode 100644
index 2b202ba..0000000
--- a/fpdfsdk/src/fpdfoom.cpp
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2014 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 "../include/fsdk_define.h"
-#include "../include/fpdfoom.h"
-
-void OOM_Handler(void* param)
-{
-	if (!param) return;
-	((OOM_INFO*)param)->FSDK_OOM_Handler((OOM_INFO*)param);
-}
-
-
-DLLEXPORT FX_BOOL STDCALL FSDK_SetOOMHandler(OOM_INFO* oomInfo)
-{
-#ifndef _FXSDK_OPENSOURCE_
-	if (!oomInfo || oomInfo->version!=1)
-		return FALSE;
-	FXMEM_SetOOMHandler(FXMEM_GetDefaultMgr(),OOM_Handler,oomInfo);
-	return TRUE;
-#else
-	return TRUE;
-#endif
-}
diff --git a/fpdfsdk/src/fpdfppo.cpp b/fpdfsdk/src/fpdfppo.cpp
index a5c4275..c68ae68 100644
--- a/fpdfsdk/src/fpdfppo.cpp
+++ b/fpdfsdk/src/fpdfppo.cpp
@@ -49,12 +49,7 @@
 		return FALSE;
 	
 	CFX_ByteString producerstr;
-	
-#ifdef FOXIT_CHROME_BUILD
-	producerstr.Format("Google");
-#else
-	 producerstr.Format("Foxit PDF SDK %s - Foxit Corporation", "2.0");
-#endif
+	producerstr.Format("PDFium");
 	DInfoDict->SetAt("Producer", new CPDF_String(producerstr));
 
 	//Set type////////////////////////////////////////////////////////////////
diff --git a/fpdfsdk/src/fpdfview.cpp b/fpdfsdk/src/fpdfview.cpp
index bd49862..d8ec8c6 100644
--- a/fpdfsdk/src/fpdfview.cpp
+++ b/fpdfsdk/src/fpdfview.cpp
@@ -106,40 +106,8 @@
 CFontMapper* g_pFontMapper = NULL;
 #endif		// #if _FX_OS_ == _FX_LINUX_EMBEDDED_
 
-DLLEXPORT void STDCALL FPDF_InitLibrary(FX_LPVOID hInstance)
+DLLEXPORT void STDCALL FPDF_InitLibrary()
 {
-#ifdef API5
-	CPDF_ModuleMgr::Create();
-	g_pModuleMgr = CPDF_ModuleMgr::Get();
-	 #if _FX_OS_ == _FX_WIN32_MOBILE_ || _FX_OS_ == _FX_LINUX_EMBEDDED_
-	 	g_pModuleMgr->InitEmbedded();
-	 #ifdef _GB1_CMAPS_
-	 	g_pModuleMgr->LoadEmbeddedGB1CMaps();
-	 #endif
-	 #ifdef _GB1_CMAPS_4_
-	 	g_pModuleMgr->LoadEmbeddedGB1CMaps_4();
-	 #endif
-	 #ifdef _CNS1_CMAPS_
-	 	g_pModuleMgr->LoadEmbeddedCNS1CMaps();
-	 #endif
-	 #ifdef _JAPAN1_CMAPS_
-	 	g_pModuleMgr->LoadEmbeddedJapan1CMaps();
-	 #endif
-	 #ifdef _JAPAN1_CMAPS_6_
-	 	g_pModuleMgr->LoadEmbeddedJapan1CMaps_6();
-	 #endif
-	 #ifdef _KOREA1_CMAPS_
-	 	g_pModuleMgr->LoadEmbeddedKorea1CMaps();
-	 #endif
-	 #ifdef _JPX_DECODER_
-	 	g_pModuleMgr->InitJpxModule();
-	 	g_pModuleMgr->InitJbig2Module();
-	 //	g_pModuleMgr->InitIccModule();
-	 #endif
-	 #else
-	 	g_pModuleMgr->InitDesktop();
-	 #endif
-#else
 	g_pCodecModule = CCodec_ModuleMgr::Create();
 	
 	CFX_GEModule::Create();
@@ -149,7 +117,6 @@
 	CPDF_ModuleMgr::Get()->SetCodecModule(g_pCodecModule);
 	CPDF_ModuleMgr::Get()->InitPageModule();
 	CPDF_ModuleMgr::Get()->InitRenderModule();
-#ifdef FOXIT_CHROME_BUILD
 	CPDF_ModuleMgr * pModuleMgr = CPDF_ModuleMgr::Get();
 	if ( pModuleMgr )
 	{
@@ -158,30 +125,6 @@
 		pModuleMgr->LoadEmbeddedCNS1CMaps();
 		pModuleMgr->LoadEmbeddedKorea1CMaps();
 	}
-#endif 
-#endif
-
-#ifdef _WIN32
-	// Get module path
-	TCHAR app_path[MAX_PATH];
-	::GetModuleFileName((HINSTANCE)hInstance, app_path, MAX_PATH);
-	size_t len = _tcslen(app_path);
-	for (size_t i = len; i >= 0; i --)
-		if (app_path[i] == '\\') {
-			app_path[i] = 0;
-			break;
-		}
-		
-#ifdef _UNICODE
-		#ifndef _FXSDK_OPENSOURCE_
-		CPDF_ModuleMgr::Get()->SetModulePath(NULL, CFX_ByteString::FromUnicode(app_path));
-		#endif
-#else
-#ifndef _FXSDK_OPENSOURCE_
-		CPDF_ModuleMgr::Get()->SetModulePath(NULL, app_path);
-#endif
-#endif
-#endif
 }
 
 
@@ -198,11 +141,6 @@
 	CFX_GEModule::Destroy();
 	g_pCodecModule->Destroy();
 #endif
-#ifndef _FXSDK_OPENSOURCE_
-	FXMEM_CollectAll(FXMEM_GetDefaultMgr());
-#else
-
-#endif
 }
 
 #ifndef _WIN32
@@ -733,7 +671,6 @@
 void FPDF_RenderPage_Retail(CRenderContext* pContext, FPDF_PAGE page, int start_x, int start_y, int size_x, int size_y,
 						int rotate, int flags,FX_BOOL bNeedToRestore, IFSDK_PAUSE_Adapter * pause )
 {
-//#ifdef _LICENSED_BUILD_
 	CPDF_Page* pPage = (CPDF_Page*)page;
 	if (pPage == NULL) return;
 
diff --git a/fpdfsdk/src/javascript/Document.cpp b/fpdfsdk/src/javascript/Document.cpp
index c10f937..96cec47 100644
--- a/fpdfsdk/src/javascript/Document.cpp
+++ b/fpdfsdk/src/javascript/Document.cpp
@@ -1763,9 +1763,6 @@
 	if(!m_pIconTree)
 		return FALSE;
 	CFX_WideString swIconName = params[0].operator CFX_WideString();
-#ifndef FOXIT_CHROME_BUILD
-	m_pIconTree->DeleteIconElement(swIconName);
-#endif
 	return TRUE;
 }
 
@@ -2155,11 +2152,7 @@
 
 	
 
-#ifndef FOXIT_CHROME_BUILD
-	return m_pDocument->DeletePages(nStart, nEnd - nStart + 1);
-#else
 	return TRUE;
-#endif
 }
 
 FX_BOOL Document::extractPages(OBJ_METHOD_PARAMS)
diff --git a/fpdfsdk/src/javascript/app.cpp b/fpdfsdk/src/javascript/app.cpp
index ebd6895..cac129d 100644
--- a/fpdfsdk/src/javascript/app.cpp
+++ b/fpdfsdk/src/javascript/app.cpp
@@ -480,23 +480,7 @@
 
 FX_BOOL app::fs(OBJ_PROP_PARAMS)
 {
-#ifdef FOXIT_CHROME_BUILD
 	return FALSE;
-#else
-	CJS_Context* pContext = (CJS_Context*)cc;
-	ASSERT(pContext != NULL);
-	CJS_Runtime* pRuntime = pContext->GetJSRuntime();
-	ASSERT(pRuntime != NULL);
-
-	if (vp.IsGetting())
-	{
-		return TRUE;
-	}
-	else
-	{
-		return TRUE;
-	}
-#endif
 }
 
 FX_BOOL app::setInterval(OBJ_METHOD_PARAMS)
@@ -1030,11 +1014,7 @@
 {
 	CFX_WideString swQuestion = L"";
 	CFX_WideString swLabel = L"";
-#ifndef FOXIT_CHROME_BUILD
-	CFX_WideString swTitle = L"Foxit";
-#else
 	CFX_WideString swTitle = L"PDF";
-#endif
 	CFX_WideString swDefault = L"";
 	bool bPassWord = false;
 
diff --git a/fpdfsdk/src/jsapi/fxjs_v8.cpp b/fpdfsdk/src/jsapi/fxjs_v8.cpp
index 7d1226e..1f47864 100644
--- a/fpdfsdk/src/jsapi/fxjs_v8.cpp
+++ b/fpdfsdk/src/jsapi/fxjs_v8.cpp
@@ -309,9 +309,6 @@
 
 void JS_Initial() 
 {
-#ifndef FOXIT_CHROME_BUILD
-	v8::V8::InitializeICU();
-#endif
 }
 void JS_Release()
 {
diff --git a/fpdfsdk/src/pdfwindow/PWL_FontMap.cpp b/fpdfsdk/src/pdfwindow/PWL_FontMap.cpp
index b5f5002..10549d5 100644
--- a/fpdfsdk/src/pdfwindow/PWL_FontMap.cpp
+++ b/fpdfsdk/src/pdfwindow/PWL_FontMap.cpp
@@ -312,11 +312,7 @@
 	}
 	*/
 
-#ifdef FOXIT_CHROME_BUILD
-  CFX_ByteString sAlias = EncodeFontAlias("Arial_Chrome", nCharset);
-#else
-	CFX_ByteString sAlias = EncodeFontAlias("Arial_Foxit", nCharset);
-#endif
+	CFX_ByteString sAlias = EncodeFontAlias("Arial_Chrome", nCharset);
 	AddedFont(pNewFont, sAlias);
 
 	return AddFontData(pNewFont, sAlias, nCharset);
diff --git a/pdfium.gyp b/pdfium.gyp
index 7e7dba9..6b4b8bc 100644
--- a/pdfium.gyp
+++ b/pdfium.gyp
@@ -4,7 +4,6 @@
   },
   'target_defaults': {
     'defines' : [
-      'FOXIT_CHROME_BUILD',
       '_FXFT_VERSION_=2501',
       '_FPDFSDK_LIB',
       '_NO_GDIPLUS_',  # workaround text rendering issues on Windows
@@ -55,7 +54,6 @@
         'fpdfsdk/include/fpdfdoc.h',
         'fpdfsdk/include/fpdfedit.h',
         'fpdfsdk/include/fpdfformfill.h',
-        'fpdfsdk/include/fpdfoom.h',
         'fpdfsdk/include/fpdftext.h',
         'fpdfsdk/include/fpdfview.h',
         'fpdfsdk/include/fpdf_dataavail.h',
@@ -73,7 +71,6 @@
         'fpdfsdk/src/fpdfeditimg.cpp',
         'fpdfsdk/src/fpdfeditpage.cpp',
         'fpdfsdk/src/fpdfformfill.cpp',
-        'fpdfsdk/src/fpdfoom.cpp',
         'fpdfsdk/src/fpdfppo.cpp',
         'fpdfsdk/src/fpdfsave.cpp',
         'fpdfsdk/src/fpdftext.cpp',
@@ -293,7 +290,6 @@
         'core/src/fpdfapi/fpdf_page/fpdf_page_graph_state.cpp',
         'core/src/fpdfapi/fpdf_page/fpdf_page_image.cpp',
         'core/src/fpdfapi/fpdf_page/fpdf_page_parser.cpp',
-        'core/src/fpdfapi/fpdf_page/fpdf_page_parser_new.cpp',
         'core/src/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp',
         'core/src/fpdfapi/fpdf_page/fpdf_page_path.cpp',
         'core/src/fpdfapi/fpdf_page/fpdf_page_pattern.cpp',
@@ -648,7 +644,6 @@
         'core/src/fxge/ge/fx_ge_device.cpp',
         'core/src/fxge/ge/fx_ge_font.cpp',
         'core/src/fxge/ge/fx_ge_fontmap.cpp',
-        'core/src/fxge/ge/fx_ge_linux.cpp',
         'core/src/fxge/ge/fx_ge_path.cpp',
         'core/src/fxge/ge/fx_ge_ps.cpp',
         'core/src/fxge/ge/fx_ge_text.cpp',
diff --git a/samples/pdfium_test.cc b/samples/pdfium_test.cc
index 3a6cdfa..9cdc4a7 100644
--- a/samples/pdfium_test.cc
+++ b/samples/pdfium_test.cc
@@ -378,7 +378,7 @@
     return 1;
   }
 
-  FPDF_InitLibrary(NULL);
+  FPDF_InitLibrary();
 
   UNSUPPORT_INFO unsuppored_info;
   memset(&unsuppored_info, '\0', sizeof(unsuppored_info));
