diff --git a/core/include/fpdfapi/fpdf_render.h b/core/include/fpdfapi/fpdf_render.h
index c0792cf..f359009 100644
--- a/core/include/fpdfapi/fpdf_render.h
+++ b/core/include/fpdfapi/fpdf_render.h
@@ -7,22 +7,26 @@
 #ifndef CORE_INCLUDE_FPDFAPI_FPDF_RENDER_H_
 #define CORE_INCLUDE_FPDFAPI_FPDF_RENDER_H_
 
+#include "../../../third_party/base/nonstd_unique_ptr.h"
+#include "../../../public/fpdf_progressive.h"
 #include "../fxge/fx_ge.h"
 #include "fpdf_page.h"
 
+class CFX_GraphStateData;
+class CFX_PathData;
+class CFX_RenderDevice;
+class CPDF_FormObject;
+class CPDF_ImageCache;
+class CPDF_ImageObject;
+class CPDF_PathObject;
+class CPDF_QuickStretcher;
 class CPDF_RenderContext;
 class CPDF_RenderOptions;
-class CPDF_ImageCache;
-class IPDF_OCContext;
-class CPDF_QuickStretcher;
-class CFX_PathData;
-class CFX_GraphStateData;
-class CFX_RenderDevice;
-class CPDF_TextObject;
-class CPDF_PathObject;
-class CPDF_ImageObject;
+class CPDF_RenderStatus;
 class CPDF_ShadingObject;
-class CPDF_FormObject;
+class CPDF_TextObject;
+class IFX_Pause;
+
 class IPDF_OCContext
 {
 public:
@@ -129,63 +133,44 @@
     friend class CPDF_RenderStatus;
     friend class CPDF_ProgressiveRenderer;
 };
+
 class CPDF_ProgressiveRenderer
 {
 public:
+    // Must match FDF_RENDER_* definitions in fpdf_progressive.h.
+    enum Status {
+        Ready = FPDF_RENDER_READER,
+        ToBeContinued = FPDF_RENDER_TOBECOUNTINUED,
+        Done = FPDF_RENDER_DONE,
+        Failed = FPDF_RENDER_FAILED
+    };
+    static int ToFPDFStatus(Status status) { return static_cast<int>(status); }
 
-    CPDF_ProgressiveRenderer();
-
+    CPDF_ProgressiveRenderer(CPDF_RenderContext* pContext,
+                             CFX_RenderDevice* pDevice,
+                             const CPDF_RenderOptions* pOptions);
     ~CPDF_ProgressiveRenderer();
 
-    typedef enum {
-        Ready,
-        ToBeContinued,
-        Done,
-        Failed
-    } RenderStatus;
+    Status GetStatus() const { return m_Status; }
+    void Start(IFX_Pause* pPause);
+    void Continue(IFX_Pause* pPause);
+    int EstimateProgress();
 
-    RenderStatus		GetStatus()
-    {
-        return m_Status;
-    }
+private:
+    void RenderStep();
 
-
-
-    void				Start(CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice,
-                              const CPDF_RenderOptions* pOptions, class IFX_Pause* pPause, FX_BOOL bDropObjects = FALSE);
-
-    void				Continue(class IFX_Pause* pPause);
-
-
-    int					EstimateProgress();
-
-    void				Clear();
-protected:
-
-    RenderStatus		m_Status;
-
-    CPDF_RenderContext*	m_pContext;
-
-    CFX_RenderDevice*	m_pDevice;
-
-    const CPDF_RenderOptions*	m_pOptions;
-
-    FX_BOOL				m_bDropObjects;
-
-    class CPDF_RenderStatus*	m_pRenderer;
-
-    CFX_FloatRect		m_ClipRect;
-
-    FX_DWORD			m_LayerIndex;
-
-    FX_DWORD			m_ObjectIndex;
-
-    FX_POSITION			m_ObjectPos;
-
-    FX_POSITION			m_PrevLastPos;
-
-    void				RenderStep();
+    Status m_Status;
+    CPDF_RenderContext* const m_pContext;
+    CFX_RenderDevice* const m_pDevice;
+    const CPDF_RenderOptions* const m_pOptions;
+    nonstd::unique_ptr<CPDF_RenderStatus> m_pRenderStatus;
+    CFX_FloatRect m_ClipRect;
+    FX_DWORD m_LayerIndex;
+    FX_DWORD m_ObjectIndex;
+    FX_POSITION m_ObjectPos;
+    FX_POSITION m_PrevLastPos;
 };
+
 class CPDF_TextRenderer
 {
 public:
diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render.cpp
index a894e84..12f6063 100644
--- a/core/src/fpdfapi/fpdf_render/fpdf_render.cpp
+++ b/core/src/fpdfapi/fpdf_render/fpdf_render.cpp
@@ -1013,48 +1013,38 @@
     AppendObjectList(pObjs, pObject2Device);
     Render(pDevice, pOptions);
 }
-CPDF_ProgressiveRenderer::CPDF_ProgressiveRenderer()
+
+CPDF_ProgressiveRenderer::CPDF_ProgressiveRenderer(
+    CPDF_RenderContext* pContext,
+    CFX_RenderDevice* pDevice,
+    const CPDF_RenderOptions* pOptions) :
+        m_Status(Ready),
+        m_pContext(pContext),
+        m_pDevice(pDevice),
+        m_pOptions(pOptions),
+        m_LayerIndex(0),
+        m_ObjectIndex(0),
+        m_ObjectPos(nullptr),
+        m_PrevLastPos(nullptr)
 {
-    m_pRenderer = NULL;
-    m_pContext = NULL;
-    m_pDevice = NULL;
-    m_Status = Ready;
 }
+
 CPDF_ProgressiveRenderer::~CPDF_ProgressiveRenderer()
 {
-    Clear();
-}
-void CPDF_ProgressiveRenderer::Clear()
-{
-    if (m_pRenderer) {
-        delete m_pRenderer;
+    if (m_pRenderStatus)
         m_pDevice->RestoreState();
-        m_pRenderer = NULL;
-    }
-    m_Status = Ready;
 }
-void CPDF_ProgressiveRenderer::Start(CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice,
-                                     const CPDF_RenderOptions* pOptions, IFX_Pause* pPause, FX_BOOL bDropObjects)
+
+void CPDF_ProgressiveRenderer::Start(IFX_Pause* pPause)
 {
-    if (m_Status != Ready) {
-        m_Status = Failed;
-        return;
-    }
-    m_pContext = pContext;
-    m_pDevice = pDevice;
-    m_pOptions = pOptions;
-    m_bDropObjects = bDropObjects;
-    if (pContext == NULL || pDevice == NULL) {
+    if (!m_pContext || !m_pDevice || m_Status != Ready) {
         m_Status = Failed;
         return;
     }
     m_Status = ToBeContinued;
-    m_ObjectPos = NULL;
-    m_LayerIndex = 0;
-    m_ObjectIndex = 0;
-    m_PrevLastPos = NULL;
     Continue(pPause);
 }
+
 #define RENDER_STEP_LIMIT 100
 void CPDF_ProgressiveRenderer::Continue(IFX_Pause* pPause)
 {
@@ -1076,9 +1066,8 @@
                 }
             }
             if (LastPos == m_PrevLastPos) {
-                if (m_pRenderer) {
-                    delete m_pRenderer;
-                    m_pRenderer = NULL;
+                if (m_pRenderStatus) {
+                    m_pRenderStatus.reset();
                     m_pDevice->RestoreState();
                     m_ObjectPos = NULL;
                     m_PrevLastPos = NULL;
@@ -1093,12 +1082,13 @@
             }
             m_PrevLastPos = LastPos;
         }
-        if (m_pRenderer == NULL) {
+        if (!m_pRenderStatus) {
             m_ObjectPos = pItem->m_pObjectList->GetFirstObjectPosition();
             m_ObjectIndex = 0;
-            m_pRenderer = new CPDF_RenderStatus();
-            m_pRenderer->Initialize(m_pContext, m_pDevice, NULL, NULL, NULL, NULL,
-                                    m_pOptions, pItem->m_pObjectList->m_Transparency, m_bDropObjects, NULL);
+            m_pRenderStatus.reset(new CPDF_RenderStatus());
+            m_pRenderStatus->Initialize(
+                m_pContext, m_pDevice, NULL, NULL, NULL, NULL, m_pOptions,
+                pItem->m_pObjectList->m_Transparency, FALSE, NULL);
             m_pDevice->SaveState();
             m_ClipRect = m_pDevice->GetClipBox();
             CFX_AffineMatrix device2object;
@@ -1110,11 +1100,11 @@
             CPDF_PageObject* pCurObj = pItem->m_pObjectList->GetObjectAt(m_ObjectPos);
             if (pCurObj && pCurObj->m_Left <= m_ClipRect.right && pCurObj->m_Right >= m_ClipRect.left &&
                     pCurObj->m_Bottom <= m_ClipRect.top && pCurObj->m_Top >= m_ClipRect.bottom) {
-                if (m_pRenderer->ContinueSingleObject(pCurObj, &pItem->m_Matrix, pPause)) {
+                if (m_pRenderStatus->ContinueSingleObject(pCurObj, &pItem->m_Matrix, pPause)) {
                     return;
                 }
-                if (pCurObj->m_Type == PDFPAGE_IMAGE && m_pRenderer->m_Options.m_Flags & RENDER_LIMITEDIMAGECACHE) {
-                    m_pContext->GetPageCache()->CacheOptimization(m_pRenderer->m_Options.m_dwLimitCacheSize);
+                if (pCurObj->m_Type == PDFPAGE_IMAGE && m_pRenderStatus->m_Options.m_Flags & RENDER_LIMITEDIMAGECACHE) {
+                    m_pContext->GetPageCache()->CacheOptimization(m_pRenderStatus->m_Options.m_dwLimitCacheSize);
                 }
                 if (pCurObj->m_Type == PDFPAGE_FORM || pCurObj->m_Type == PDFPAGE_SHADING) {
                     objs_to_go = 0;
@@ -1134,8 +1124,7 @@
         if (!pItem->m_pObjectList->IsParsed()) {
             return;
         }
-        delete m_pRenderer;
-        m_pRenderer = NULL;
+        m_pRenderStatus.reset();
         m_pDevice->RestoreState();
         m_ObjectPos = NULL;
         m_PrevLastPos = NULL;
diff --git a/fpdfsdk/src/fpdf_progressive.cpp b/fpdfsdk/src/fpdf_progressive.cpp
index aab1cb6..4ec73ac 100644
--- a/fpdfsdk/src/fpdf_progressive.cpp
+++ b/fpdfsdk/src/fpdf_progressive.cpp
@@ -10,91 +10,81 @@
 #include "../include/fsdk_rendercontext.h"
 
 DLLEXPORT int STDCALL FPDF_RenderPageBitmap_Start( FPDF_BITMAP bitmap, FPDF_PAGE page,
-													int start_x, int start_y, int size_x,
-												    int size_y, int rotate, int flags,
-													IFSDK_PAUSE * pause )
+                                                    int start_x, int start_y, int size_x,
+                                                    int size_y, int rotate, int flags,
+                                                    IFSDK_PAUSE * pause )
 {
-	if (bitmap == NULL || page == NULL)
-		return FPDF_RENDER_FAILED;
+    if (bitmap == NULL || page == NULL)
+        return FPDF_RENDER_FAILED;
 
- 	if (!pause)
- 		return FPDF_RENDER_FAILED;
+    if (!pause)
+        return FPDF_RENDER_FAILED;
 
-	if (pause->version !=1)
-		return FPDF_RENDER_FAILED;
+    if (pause->version !=1)
+        return FPDF_RENDER_FAILED;
 
-	CPDF_Page* pPage = (CPDF_Page*)page;
-	CRenderContext* pContext = new CRenderContext;
-	pPage->SetPrivateData((void*)1, pContext, DropContext);
+    CPDF_Page* pPage = (CPDF_Page*)page;
+    CRenderContext* pContext = new CRenderContext;
+    pPage->SetPrivateData((void*)1, pContext, DropContext);
 #ifdef _SKIA_SUPPORT_
-	pContext->m_pDevice = new CFX_SkiaDevice;
-	if (flags & FPDF_REVERSE_BYTE_ORDER)
-		((CFX_SkiaDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap,0,TRUE);
-	else
-		((CFX_SkiaDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap);
+    pContext->m_pDevice = new CFX_SkiaDevice;
+    if (flags & FPDF_REVERSE_BYTE_ORDER)
+        ((CFX_SkiaDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap,0,TRUE);
+    else
+        ((CFX_SkiaDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap);
 #else
-	pContext->m_pDevice = new CFX_FxgeDevice;
-	if (flags & FPDF_REVERSE_BYTE_ORDER)
-		((CFX_FxgeDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap,0,TRUE);
-	else
-		((CFX_FxgeDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap);
+    pContext->m_pDevice = new CFX_FxgeDevice;
+    if (flags & FPDF_REVERSE_BYTE_ORDER)
+        ((CFX_FxgeDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap,0,TRUE);
+    else
+        ((CFX_FxgeDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap);
 #endif
-	IFSDK_PAUSE_Adapter IPauseAdapter(pause);
+    IFSDK_PAUSE_Adapter IPauseAdapter(pause);
 
     FPDF_RenderPage_Retail(pContext, page, start_x, start_y, size_x, size_y,
                            rotate, flags,FALSE, &IPauseAdapter);
 
-	if ( pContext->m_pRenderer )
-	{
-		CPDF_ProgressiveRenderer::RenderStatus status = CPDF_ProgressiveRenderer::Failed;
-		status = pContext->m_pRenderer->GetStatus();
-		return status;
-	}
-	return FPDF_RENDER_FAILED;
+    if (pContext->m_pRenderer)
+        return CPDF_ProgressiveRenderer::ToFPDFStatus(pContext->m_pRenderer->GetStatus());
+
+    return FPDF_RENDER_FAILED;
 }
 
 DLLEXPORT int STDCALL FPDF_RenderPage_Continue(FPDF_PAGE page,IFSDK_PAUSE * pause)
 {
-	if (page == NULL)
-		return FPDF_RENDER_FAILED;
+    if (page == NULL)
+        return FPDF_RENDER_FAILED;
 
- 	if (!pause)
-		return FPDF_RENDER_FAILED;
+    if (!pause)
+        return FPDF_RENDER_FAILED;
 
-	if (pause->version !=1)
-		return FPDF_RENDER_FAILED;
+    if (pause->version !=1)
+        return FPDF_RENDER_FAILED;
 
-	CPDF_Page* pPage = (CPDF_Page*)page;
-
-//	FXMT_CSLOCK_OBJ(&pPage->m_PageLock);
-
-	CRenderContext * pContext = (CRenderContext*)pPage->GetPrivateData((void*)1);
-	if (pContext && pContext->m_pRenderer)
-	{
-		IFSDK_PAUSE_Adapter IPauseAdapter(pause);
-		pContext->m_pRenderer->Continue(&IPauseAdapter);
-
-		CPDF_ProgressiveRenderer::RenderStatus status = CPDF_ProgressiveRenderer::Failed;
-		status = pContext->m_pRenderer->GetStatus();
-		return status;
-	}
-	return FPDF_RENDER_FAILED;
+    CPDF_Page* pPage = (CPDF_Page*)page;
+    CRenderContext * pContext = (CRenderContext*)pPage->GetPrivateData((void*)1);
+    if (pContext && pContext->m_pRenderer)
+    {
+        IFSDK_PAUSE_Adapter IPauseAdapter(pause);
+        pContext->m_pRenderer->Continue(&IPauseAdapter);
+        return CPDF_ProgressiveRenderer::ToFPDFStatus(pContext->m_pRenderer->GetStatus());
+    }
+    return FPDF_RENDER_FAILED;
 }
 
 
 DLLEXPORT void STDCALL FPDF_RenderPage_Close(FPDF_PAGE page)
 {
-	if (page == NULL) return;
-	CPDF_Page* pPage = (CPDF_Page*)page;
+    if (!page)
+        return;
 
-//	FXMT_CSLOCK_OBJ(&pPage->m_PageLock);
+    CPDF_Page* pPage = (CPDF_Page*)page;
+    CRenderContext * pContext = (CRenderContext*)pPage->GetPrivateData((void*)1);
+    if (!pContext)
+        return;
 
-	CRenderContext * pContext = (CRenderContext*)pPage->GetPrivateData((void*)1);
-	if (pContext)
-	{
-		pContext->m_pDevice->RestoreState();
-		delete pContext;
-		pPage->RemovePrivateData((void*)1);
-	}
+    pContext->m_pDevice->RestoreState();
+    delete pContext;
+    pPage->RemovePrivateData((void*)1);
 }
 
diff --git a/fpdfsdk/src/fpdfview.cpp b/fpdfsdk/src/fpdfview.cpp
index 7dc5947..9edd5d9 100644
--- a/fpdfsdk/src/fpdfview.cpp
+++ b/fpdfsdk/src/fpdfview.cpp
@@ -17,8 +17,8 @@
 
 CPDF_CustomAccess::CPDF_CustomAccess(FPDF_FILEACCESS* pFileAccess)
 {
-	if (pFileAccess)
-		m_FileAccess = *pFileAccess;
+    if (pFileAccess)
+        m_FileAccess = *pFileAccess;
 }
 
 FX_BOOL CPDF_CustomAccess::ReadBlock(void* buffer, FX_FILESIZE offset, size_t size)
@@ -39,40 +39,32 @@
 
 void FSDK_SetSandBoxPolicy(FPDF_DWORD policy, FPDF_BOOL enable)
 {
-	switch(policy)
-	{
-	case FPDF_POLICY_MACHINETIME_ACCESS:
-		{
-			if(enable)
-				foxit_sandbox_policy |= 0x01;
-			else
-				foxit_sandbox_policy &= 0xFFFFFFFE;
-		}
-		break;
-	default:
-		break;
-	}
+    switch(policy)
+    {
+    case FPDF_POLICY_MACHINETIME_ACCESS:
+        {
+            if(enable)
+                foxit_sandbox_policy |= 0x01;
+            else
+                foxit_sandbox_policy &= 0xFFFFFFFE;
+        }
+        break;
+    default:
+        break;
+    }
 }
 
 FPDF_BOOL FSDK_IsSandBoxPolicyEnabled(FPDF_DWORD policy)
 {
-	switch(policy)
-	{
-	case FPDF_POLICY_MACHINETIME_ACCESS:
-		{
-			if(foxit_sandbox_policy&0x01)
-				return TRUE;
-			else
-				return FALSE;
-		}
-		break;
-	default:
-		break;
-	}
-	return FALSE;
+    switch(policy)
+    {
+    case FPDF_POLICY_MACHINETIME_ACCESS:
+        return (foxit_sandbox_policy & 0x01) ? TRUE : FALSE;
+    default:
+        return FALSE;
+    }
 }
 
-
 #ifndef _T
 #define _T(x) x
 #endif
@@ -83,45 +75,45 @@
 class CFontMapper : public IPDF_FontMapper
 {
 public:
-	CFontMapper();
-	virtual ~CFontMapper();
+    CFontMapper();
+    virtual ~CFontMapper();
 
-	virtual FT_Face FindSubstFont(
-							CPDF_Document* pDoc,				// [IN] The PDF document
-							const CFX_ByteString& face_name,	// [IN] Original name
-							FX_BOOL bTrueType,					// [IN] TrueType or Type1
-							FX_DWORD flags,						// [IN] PDF font flags (see PDF Reference section 5.7.1)
-							int font_weight,					// [IN] original font weight. 0 for not specified
-							int CharsetCP,						// [IN] code page for charset (see Win32 GetACP())
-							FX_BOOL bVertical,
-							CPDF_SubstFont* pSubstFont			// [OUT] Subst font data
-						);
+    virtual FT_Face FindSubstFont(
+                            CPDF_Document* pDoc,                // [IN] The PDF document
+                            const CFX_ByteString& face_name,    // [IN] Original name
+                            FX_BOOL bTrueType,                  // [IN] TrueType or Type1
+                            FX_DWORD flags,                     // [IN] PDF font flags (see PDF Reference section 5.7.1)
+                            int font_weight,                    // [IN] original font weight. 0 for not specified
+                            int CharsetCP,                      // [IN] code page for charset (see Win32 GetACP())
+                            FX_BOOL bVertical,
+                            CPDF_SubstFont* pSubstFont          // [OUT] Subst font data
+                        );
 
-	FT_Face m_SysFace;
+    FT_Face m_SysFace;
 };
 
 CFontMapper* g_pFontMapper = NULL;
-#endif		// #if _FX_OS_ == _FX_LINUX_EMBEDDED_
+#endif      // #if _FX_OS_ == _FX_LINUX_EMBEDDED_
 
 DLLEXPORT void STDCALL FPDF_InitLibrary()
 {
-	g_pCodecModule = new CCodec_ModuleMgr();
+    g_pCodecModule = new CCodec_ModuleMgr();
 
-	CFX_GEModule::Create();
-	CFX_GEModule::Get()->SetCodecModule(g_pCodecModule);
+    CFX_GEModule::Create();
+    CFX_GEModule::Get()->SetCodecModule(g_pCodecModule);
 
-	CPDF_ModuleMgr::Create();
-	CPDF_ModuleMgr::Get()->SetCodecModule(g_pCodecModule);
-	CPDF_ModuleMgr::Get()->InitPageModule();
-	CPDF_ModuleMgr::Get()->InitRenderModule();
-	CPDF_ModuleMgr * pModuleMgr = CPDF_ModuleMgr::Get();
-	if ( pModuleMgr )
-	{
-		pModuleMgr->LoadEmbeddedGB1CMaps();
-		pModuleMgr->LoadEmbeddedJapan1CMaps();
-		pModuleMgr->LoadEmbeddedCNS1CMaps();
-		pModuleMgr->LoadEmbeddedKorea1CMaps();
-	}
+    CPDF_ModuleMgr::Create();
+    CPDF_ModuleMgr::Get()->SetCodecModule(g_pCodecModule);
+    CPDF_ModuleMgr::Get()->InitPageModule();
+    CPDF_ModuleMgr::Get()->InitRenderModule();
+    CPDF_ModuleMgr * pModuleMgr = CPDF_ModuleMgr::Get();
+    if ( pModuleMgr )
+    {
+        pModuleMgr->LoadEmbeddedGB1CMaps();
+        pModuleMgr->LoadEmbeddedJapan1CMaps();
+        pModuleMgr->LoadEmbeddedCNS1CMaps();
+        pModuleMgr->LoadEmbeddedKorea1CMaps();
+    }
 }
 
 
@@ -129,65 +121,65 @@
 {
 
 #if _FX_OS_ == _FX_LINUX_EMBEDDED_
-	delete g_pFontMapper;
-	g_pFontMapper = nullptr;
+    delete g_pFontMapper;
+    g_pFontMapper = nullptr;
 #endif
-	CPDF_ModuleMgr::Destroy();
-	CFX_GEModule::Destroy();
-	delete g_pCodecModule;
-	g_pCodecModule = nullptr;
+    CPDF_ModuleMgr::Destroy();
+    CFX_GEModule::Destroy();
+    delete g_pCodecModule;
+    g_pCodecModule = nullptr;
 }
 
 #ifndef _WIN32
 int g_LastError;
 void SetLastError(int err)
 {
-	g_LastError = err;
+    g_LastError = err;
 }
 
 int GetLastError()
 {
-	return g_LastError;
+    return g_LastError;
 }
 #endif
 
 void ProcessParseError(FX_DWORD err_code)
 {
-	// Translate FPDFAPI error code to FPDFVIEW error code
-	switch (err_code) {
-		case PDFPARSE_ERROR_FILE:
-			err_code = FPDF_ERR_FILE;
-			break;
-		case PDFPARSE_ERROR_FORMAT:
-			err_code = FPDF_ERR_FORMAT;
-			break;
-		case PDFPARSE_ERROR_PASSWORD:
-			err_code = FPDF_ERR_PASSWORD;
-			break;
-		case PDFPARSE_ERROR_HANDLER:
-			err_code = FPDF_ERR_SECURITY;
-			break;
-	}
-	SetLastError(err_code);
+    // Translate FPDFAPI error code to FPDFVIEW error code
+    switch (err_code) {
+        case PDFPARSE_ERROR_FILE:
+            err_code = FPDF_ERR_FILE;
+            break;
+        case PDFPARSE_ERROR_FORMAT:
+            err_code = FPDF_ERR_FORMAT;
+            break;
+        case PDFPARSE_ERROR_PASSWORD:
+            err_code = FPDF_ERR_PASSWORD;
+            break;
+        case PDFPARSE_ERROR_HANDLER:
+            err_code = FPDF_ERR_SECURITY;
+            break;
+    }
+    SetLastError(err_code);
 }
 
-DLLEXPORT void	STDCALL FPDF_SetSandBoxPolicy(FPDF_DWORD policy, FPDF_BOOL enable)
+DLLEXPORT void  STDCALL FPDF_SetSandBoxPolicy(FPDF_DWORD policy, FPDF_BOOL enable)
 {
-	return FSDK_SetSandBoxPolicy(policy, enable);
+    return FSDK_SetSandBoxPolicy(policy, enable);
 }
 
 DLLEXPORT FPDF_DOCUMENT STDCALL FPDF_LoadDocument(FPDF_STRING file_path, FPDF_BYTESTRING password)
 {
-	CPDF_Parser* pParser = new CPDF_Parser;
-	pParser->SetPassword(password);
+    CPDF_Parser* pParser = new CPDF_Parser;
+    pParser->SetPassword(password);
 
-	FX_DWORD err_code = pParser->StartParse((const FX_CHAR*)file_path);
-	if (err_code) {
-		delete pParser;
-		ProcessParseError(err_code);
-		return NULL;
-	}
-	return pParser->GetDocument();
+    FX_DWORD err_code = pParser->StartParse((const FX_CHAR*)file_path);
+    if (err_code) {
+        delete pParser;
+        ProcessParseError(err_code);
+        return NULL;
+    }
+    return pParser->GetDocument();
 }
 
 extern void CheckUnSupportError(CPDF_Document * pDoc, FX_DWORD err_code);
@@ -195,12 +187,12 @@
 class CMemFile final: public IFX_FileRead
 {
 public:
-	CMemFile(uint8_t* pBuf, FX_FILESIZE size):m_pBuf(pBuf),m_size(size) {}
+    CMemFile(uint8_t* pBuf, FX_FILESIZE size):m_pBuf(pBuf),m_size(size) {}
 
-	virtual void			Release() {delete this;}
-	virtual FX_FILESIZE		GetSize() {return m_size;}
-	virtual FX_BOOL			ReadBlock(void* buffer, FX_FILESIZE offset, size_t size)
-	{
+    virtual void            Release() {delete this;}
+    virtual FX_FILESIZE     GetSize() {return m_size;}
+    virtual FX_BOOL         ReadBlock(void* buffer, FX_FILESIZE offset, size_t size)
+    {
             if (offset < 0) {
                 return FALSE;
             }
@@ -209,69 +201,69 @@
             if (!newPos.IsValid() || newPos.ValueOrDie() > (FX_DWORD)m_size) {
                 return FALSE;
             }
-	    FXSYS_memcpy(buffer, m_pBuf+offset, size);
-	    return TRUE;
-	}
+        FXSYS_memcpy(buffer, m_pBuf+offset, size);
+        return TRUE;
+    }
 private:
-	uint8_t* m_pBuf;
-	FX_FILESIZE m_size;
+    uint8_t* m_pBuf;
+    FX_FILESIZE m_size;
 };
 DLLEXPORT FPDF_DOCUMENT STDCALL FPDF_LoadMemDocument(const void* data_buf, int size, FPDF_BYTESTRING password)
 {
-	CPDF_Parser* pParser = new CPDF_Parser;
-	pParser->SetPassword(password);
-	CMemFile* pMemFile = new CMemFile((uint8_t*)data_buf, size);
-	FX_DWORD err_code = pParser->StartParse(pMemFile);
-	if (err_code) {
-		delete pParser;
-		ProcessParseError(err_code);
-		return NULL;
-	}
-	CPDF_Document * pDoc = NULL;
-	pDoc = pParser?pParser->GetDocument():NULL;
-	CheckUnSupportError(pDoc, err_code);
-	return pParser->GetDocument();
+    CPDF_Parser* pParser = new CPDF_Parser;
+    pParser->SetPassword(password);
+    CMemFile* pMemFile = new CMemFile((uint8_t*)data_buf, size);
+    FX_DWORD err_code = pParser->StartParse(pMemFile);
+    if (err_code) {
+        delete pParser;
+        ProcessParseError(err_code);
+        return NULL;
+    }
+    CPDF_Document * pDoc = NULL;
+    pDoc = pParser?pParser->GetDocument():NULL;
+    CheckUnSupportError(pDoc, err_code);
+    return pParser->GetDocument();
 }
 
 DLLEXPORT FPDF_DOCUMENT STDCALL FPDF_LoadCustomDocument(FPDF_FILEACCESS* pFileAccess, FPDF_BYTESTRING password)
 {
-	CPDF_Parser* pParser = new CPDF_Parser;
-	pParser->SetPassword(password);
-	CPDF_CustomAccess* pFile = new CPDF_CustomAccess(pFileAccess);
-	FX_DWORD err_code = pParser->StartParse(pFile);
-	if (err_code) {
-		delete pParser;
-		ProcessParseError(err_code);
-		return NULL;
-	}
-	CPDF_Document * pDoc = NULL;
-	pDoc = pParser?pParser->GetDocument():NULL;
-	CheckUnSupportError(pDoc, err_code);
-	return pParser->GetDocument();
+    CPDF_Parser* pParser = new CPDF_Parser;
+    pParser->SetPassword(password);
+    CPDF_CustomAccess* pFile = new CPDF_CustomAccess(pFileAccess);
+    FX_DWORD err_code = pParser->StartParse(pFile);
+    if (err_code) {
+        delete pParser;
+        ProcessParseError(err_code);
+        return NULL;
+    }
+    CPDF_Document * pDoc = NULL;
+    pDoc = pParser?pParser->GetDocument():NULL;
+    CheckUnSupportError(pDoc, err_code);
+    return pParser->GetDocument();
 }
 
 DLLEXPORT FPDF_BOOL STDCALL FPDF_GetFileVersion(FPDF_DOCUMENT doc, int* fileVersion)
 {
-	if(!doc||!fileVersion) return FALSE;
-	*fileVersion = 0;
-	CPDF_Document* pDoc = (CPDF_Document*)doc;
-	CPDF_Parser* pParser = (CPDF_Parser*)pDoc->GetParser();
-	if(!pParser)
-		return FALSE;
-	*fileVersion = pParser->GetFileVersion();
-	return TRUE;
+    if(!doc||!fileVersion) return FALSE;
+    *fileVersion = 0;
+    CPDF_Document* pDoc = (CPDF_Document*)doc;
+    CPDF_Parser* pParser = (CPDF_Parser*)pDoc->GetParser();
+    if(!pParser)
+        return FALSE;
+    *fileVersion = pParser->GetFileVersion();
+    return TRUE;
 }
 
 // jabdelmalek: changed return type from FX_DWORD to build on Linux (and match header).
 DLLEXPORT unsigned long STDCALL FPDF_GetDocPermissions(FPDF_DOCUMENT document)
 {
-	if (document == NULL) return 0;
-	CPDF_Document*pDoc = (CPDF_Document*)document;
-	CPDF_Parser* pParser = 	(CPDF_Parser*)pDoc->GetParser();
-	CPDF_Dictionary* pDict = pParser->GetEncryptDict();
-	if (pDict == NULL) return (FX_DWORD)-1;
+    if (document == NULL) return 0;
+    CPDF_Document*pDoc = (CPDF_Document*)document;
+    CPDF_Parser* pParser =  (CPDF_Parser*)pDoc->GetParser();
+    CPDF_Dictionary* pDict = pParser->GetEncryptDict();
+    if (pDict == NULL) return (FX_DWORD)-1;
 
-	return pDict->GetInteger("P");
+    return pDict->GetInteger("P");
 }
 
 DLLEXPORT int STDCALL FPDF_GetSecurityHandlerRevision(FPDF_DOCUMENT document)
@@ -287,41 +279,41 @@
 
 DLLEXPORT int STDCALL FPDF_GetPageCount(FPDF_DOCUMENT document)
 {
-	if (document == NULL) return 0;
-	return ((CPDF_Document*)document)->GetPageCount();
+    if (document == NULL) return 0;
+    return ((CPDF_Document*)document)->GetPageCount();
 }
 
 DLLEXPORT FPDF_PAGE STDCALL FPDF_LoadPage(FPDF_DOCUMENT document, int page_index)
 {
-	if (document == NULL) return NULL;
-	if (page_index < 0 || page_index >= FPDF_GetPageCount(document)) return NULL;
+    if (document == NULL) return NULL;
+    if (page_index < 0 || page_index >= FPDF_GetPageCount(document)) return NULL;
 
-	CPDF_Document* pDoc = (CPDF_Document*)document;
-	if (pDoc == NULL) return NULL;
-	CPDF_Dictionary* pDict = pDoc->GetPage(page_index);
-	if (pDict == NULL) return NULL;
-	CPDF_Page* pPage = new CPDF_Page;
-	pPage->Load(pDoc, pDict);
-	pPage->ParseContent();
-	return pPage;
+    CPDF_Document* pDoc = (CPDF_Document*)document;
+    if (pDoc == NULL) return NULL;
+    CPDF_Dictionary* pDict = pDoc->GetPage(page_index);
+    if (pDict == NULL) return NULL;
+    CPDF_Page* pPage = new CPDF_Page;
+    pPage->Load(pDoc, pDict);
+    pPage->ParseContent();
+    return pPage;
 }
 
 DLLEXPORT double STDCALL FPDF_GetPageWidth(FPDF_PAGE page)
 {
-	if (!page)
-		return 0.0;
-	return ((CPDF_Page*)page)->GetPageWidth();
+    if (!page)
+        return 0.0;
+    return ((CPDF_Page*)page)->GetPageWidth();
 }
 
 DLLEXPORT double STDCALL FPDF_GetPageHeight(FPDF_PAGE page)
 {
-	if (!page) return 0.0;
-	return ((CPDF_Page*)page)->GetPageHeight();
+    if (!page) return 0.0;
+    return ((CPDF_Page*)page)->GetPageHeight();
 }
 
 void DropContext(void* data)
 {
-	delete (CRenderContext*)data;
+    delete (CRenderContext*)data;
 }
 
 #if defined(_DEBUG) || defined(DEBUG)
@@ -330,151 +322,151 @@
 
 #if defined(_WIN32)
 DLLEXPORT void STDCALL FPDF_RenderPage(HDC dc, FPDF_PAGE page, int start_x, int start_y, int size_x, int size_y,
-						int rotate, int flags)
+                        int rotate, int flags)
 {
-	if (page==NULL) return;
-	CPDF_Page* pPage = (CPDF_Page*)page;
+    if (page==NULL) return;
+    CPDF_Page* pPage = (CPDF_Page*)page;
 
-	CRenderContext* pContext = new CRenderContext;
-	pPage->SetPrivateData((void*)1, pContext, DropContext);
+    CRenderContext* pContext = new CRenderContext;
+    pPage->SetPrivateData((void*)1, pContext, DropContext);
 
 #ifndef _WIN32_WCE
-	CFX_DIBitmap* pBitmap = NULL;
-	FX_BOOL bBackgroundAlphaNeeded=FALSE;
-	bBackgroundAlphaNeeded = pPage->BackgroundAlphaNeeded();
-	if (bBackgroundAlphaNeeded)
-	{
+    CFX_DIBitmap* pBitmap = NULL;
+    FX_BOOL bBackgroundAlphaNeeded=FALSE;
+    bBackgroundAlphaNeeded = pPage->BackgroundAlphaNeeded();
+    if (bBackgroundAlphaNeeded)
+    {
 
-		pBitmap = new CFX_DIBitmap;
-		pBitmap->Create(size_x, size_y, FXDIB_Argb);
-		pBitmap->Clear(0x00ffffff);
+        pBitmap = new CFX_DIBitmap;
+        pBitmap->Create(size_x, size_y, FXDIB_Argb);
+        pBitmap->Clear(0x00ffffff);
 #ifdef _SKIA_SUPPORT_
-		pContext->m_pDevice = new CFX_SkiaDevice;
-		((CFX_SkiaDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)pBitmap);
+        pContext->m_pDevice = new CFX_SkiaDevice;
+        ((CFX_SkiaDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)pBitmap);
 #else
-		pContext->m_pDevice = new CFX_FxgeDevice;
-		((CFX_FxgeDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)pBitmap);
+        pContext->m_pDevice = new CFX_FxgeDevice;
+        ((CFX_FxgeDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)pBitmap);
 #endif
-	}
-	else
-	    pContext->m_pDevice = new CFX_WindowsDevice(dc);
+    }
+    else
+        pContext->m_pDevice = new CFX_WindowsDevice(dc);
 
-	FPDF_RenderPage_Retail(pContext, page, start_x, start_y, size_x, size_y,
+    FPDF_RenderPage_Retail(pContext, page, start_x, start_y, size_x, size_y,
                            rotate, flags, TRUE, NULL);
 
-	if (bBackgroundAlphaNeeded)
-	{
-		if (pBitmap)
-		{
-			CFX_WindowsDevice WinDC(dc);
+    if (bBackgroundAlphaNeeded)
+    {
+        if (pBitmap)
+        {
+            CFX_WindowsDevice WinDC(dc);
 
- 			if (WinDC.GetDeviceCaps(FXDC_DEVICE_CLASS) == FXDC_PRINTER)
- 			{
-				CFX_DIBitmap* pDst = new CFX_DIBitmap;
-				int pitch = pBitmap->GetPitch();
-				pDst->Create(size_x, size_y, FXDIB_Rgb32);
-				FXSYS_memset(pDst->GetBuffer(), -1, pitch*size_y);
-				pDst->CompositeBitmap(0, 0, size_x, size_y, pBitmap, 0, 0, FXDIB_BLEND_NORMAL, NULL, FALSE, NULL);
-				WinDC.StretchDIBits(pDst,0,0,size_x,size_y);
-				delete pDst;
- 			}
- 			else
- 				WinDC.SetDIBits(pBitmap,0,0);
+            if (WinDC.GetDeviceCaps(FXDC_DEVICE_CLASS) == FXDC_PRINTER)
+            {
+                CFX_DIBitmap* pDst = new CFX_DIBitmap;
+                int pitch = pBitmap->GetPitch();
+                pDst->Create(size_x, size_y, FXDIB_Rgb32);
+                FXSYS_memset(pDst->GetBuffer(), -1, pitch*size_y);
+                pDst->CompositeBitmap(0, 0, size_x, size_y, pBitmap, 0, 0, FXDIB_BLEND_NORMAL, NULL, FALSE, NULL);
+                WinDC.StretchDIBits(pDst,0,0,size_x,size_y);
+                delete pDst;
+            }
+            else
+                WinDC.SetDIBits(pBitmap,0,0);
 
-		}
-	}
+        }
+    }
 #else
-	// get clip region
-	RECT rect, cliprect;
-	rect.left = start_x;
-	rect.top = start_y;
-	rect.right = start_x + size_x;
-	rect.bottom = start_y + size_y;
-	GetClipBox(dc, &cliprect);
-	IntersectRect(&rect, &rect, &cliprect);
-	int width = rect.right - rect.left;
-	int height = rect.bottom - rect.top;
+    // get clip region
+    RECT rect, cliprect;
+    rect.left = start_x;
+    rect.top = start_y;
+    rect.right = start_x + size_x;
+    rect.bottom = start_y + size_y;
+    GetClipBox(dc, &cliprect);
+    IntersectRect(&rect, &rect, &cliprect);
+    int width = rect.right - rect.left;
+    int height = rect.bottom - rect.top;
 
 #ifdef DEBUG_TRACE
-	{
-		char str[128];
-		memset(str, 0, sizeof(str));
-		FXSYS_snprintf(str, sizeof(str) - 1, "Rendering DIB %d x %d", width, height);
-		CPDF_ModuleMgr::Get()->ReportError(999, str);
-	}
+    {
+        char str[128];
+        memset(str, 0, sizeof(str));
+        FXSYS_snprintf(str, sizeof(str) - 1, "Rendering DIB %d x %d", width, height);
+        CPDF_ModuleMgr::Get()->ReportError(999, str);
+    }
 #endif
 
-	// Create a DIB section
-	LPVOID pBuffer;
-	BITMAPINFOHEADER bmih;
-	FXSYS_memset(&bmih, 0, sizeof bmih);
-	bmih.biSize = sizeof bmih;
-	bmih.biBitCount = 24;
-	bmih.biHeight = -height;
-	bmih.biPlanes = 1;
-	bmih.biWidth = width;
-	pContext->m_hBitmap = CreateDIBSection(dc, (BITMAPINFO*)&bmih, DIB_RGB_COLORS, &pBuffer, NULL, 0);
-	if (pContext->m_hBitmap == NULL) {
+    // Create a DIB section
+    LPVOID pBuffer;
+    BITMAPINFOHEADER bmih;
+    FXSYS_memset(&bmih, 0, sizeof bmih);
+    bmih.biSize = sizeof bmih;
+    bmih.biBitCount = 24;
+    bmih.biHeight = -height;
+    bmih.biPlanes = 1;
+    bmih.biWidth = width;
+    pContext->m_hBitmap = CreateDIBSection(dc, (BITMAPINFO*)&bmih, DIB_RGB_COLORS, &pBuffer, NULL, 0);
+    if (pContext->m_hBitmap == NULL) {
 #if defined(DEBUG) || defined(_DEBUG)
-		char str[128];
-		memset(str, 0, sizeof(str));
-		FXSYS_snprintf(str, sizeof(str) - 1, "Error CreateDIBSection: %d x %d, error code = %d", width, height, GetLastError());
-		CPDF_ModuleMgr::Get()->ReportError(FPDFERR_OUT_OF_MEMORY, str);
+        char str[128];
+        memset(str, 0, sizeof(str));
+        FXSYS_snprintf(str, sizeof(str) - 1, "Error CreateDIBSection: %d x %d, error code = %d", width, height, GetLastError());
+        CPDF_ModuleMgr::Get()->ReportError(FPDFERR_OUT_OF_MEMORY, str);
 #else
-		CPDF_ModuleMgr::Get()->ReportError(FPDFERR_OUT_OF_MEMORY, NULL);
+        CPDF_ModuleMgr::Get()->ReportError(FPDFERR_OUT_OF_MEMORY, NULL);
 #endif
-	}
-	FXSYS_memset(pBuffer, 0xff, height*((width*3+3)/4*4));
+    }
+    FXSYS_memset(pBuffer, 0xff, height*((width*3+3)/4*4));
 
 #ifdef DEBUG_TRACE
-	{
-		CPDF_ModuleMgr::Get()->ReportError(999, "DIBSection created");
-	}
+    {
+        CPDF_ModuleMgr::Get()->ReportError(999, "DIBSection created");
+    }
 #endif
 
-	// Create a device with this external buffer
-	pContext->m_pBitmap = new CFX_DIBitmap;
-	pContext->m_pBitmap->Create(width, height, FXDIB_Rgb, (uint8_t*)pBuffer);
-	pContext->m_pDevice = new CPDF_FxgeDevice;
-	((CPDF_FxgeDevice*)pContext->m_pDevice)->Attach(pContext->m_pBitmap);
+    // Create a device with this external buffer
+    pContext->m_pBitmap = new CFX_DIBitmap;
+    pContext->m_pBitmap->Create(width, height, FXDIB_Rgb, (uint8_t*)pBuffer);
+    pContext->m_pDevice = new CPDF_FxgeDevice;
+    ((CPDF_FxgeDevice*)pContext->m_pDevice)->Attach(pContext->m_pBitmap);
 
 #ifdef DEBUG_TRACE
-	CPDF_ModuleMgr::Get()->ReportError(999, "Ready for PDF rendering");
+    CPDF_ModuleMgr::Get()->ReportError(999, "Ready for PDF rendering");
 #endif
 
-	// output to bitmap device
-	FPDF_RenderPage_Retail(pContext, page, start_x - rect.left,
+    // output to bitmap device
+    FPDF_RenderPage_Retail(pContext, page, start_x - rect.left,
                            start_y - rect.top, size_x, size_y, rotate, flags);
 
 #ifdef DEBUG_TRACE
-	CPDF_ModuleMgr::Get()->ReportError(999, "Finished PDF rendering");
+    CPDF_ModuleMgr::Get()->ReportError(999, "Finished PDF rendering");
 #endif
 
-	// Now output to real device
-	HDC hMemDC = CreateCompatibleDC(dc);
-	if (hMemDC == NULL) {
+    // Now output to real device
+    HDC hMemDC = CreateCompatibleDC(dc);
+    if (hMemDC == NULL) {
 #if defined(DEBUG) || defined(_DEBUG)
-		char str[128];
-		memset(str, 0, sizeof(str));
-		FXSYS_snprintf(str, sizeof(str) - 1, "Error CreateCompatibleDC. Error code = %d", GetLastError());
-		CPDF_ModuleMgr::Get()->ReportError(FPDFERR_OUT_OF_MEMORY, str);
+        char str[128];
+        memset(str, 0, sizeof(str));
+        FXSYS_snprintf(str, sizeof(str) - 1, "Error CreateCompatibleDC. Error code = %d", GetLastError());
+        CPDF_ModuleMgr::Get()->ReportError(FPDFERR_OUT_OF_MEMORY, str);
 #else
-		CPDF_ModuleMgr::Get()->ReportError(FPDFERR_OUT_OF_MEMORY, NULL);
+        CPDF_ModuleMgr::Get()->ReportError(FPDFERR_OUT_OF_MEMORY, NULL);
 #endif
-	}
+    }
 
-	HGDIOBJ hOldBitmap = SelectObject(hMemDC, pContext->m_hBitmap);
+    HGDIOBJ hOldBitmap = SelectObject(hMemDC, pContext->m_hBitmap);
 
 #ifdef DEBUG_TRACE
-	CPDF_ModuleMgr::Get()->ReportError(999, "Ready for screen rendering");
+    CPDF_ModuleMgr::Get()->ReportError(999, "Ready for screen rendering");
 #endif
 
-	BitBlt(dc, rect.left, rect.top, width, height, hMemDC, 0, 0, SRCCOPY);
-	SelectObject(hMemDC, hOldBitmap);
-	DeleteDC(hMemDC);
+    BitBlt(dc, rect.left, rect.top, width, height, hMemDC, 0, 0, SRCCOPY);
+    SelectObject(hMemDC, hOldBitmap);
+    DeleteDC(hMemDC);
 
 #ifdef DEBUG_TRACE
-	CPDF_ModuleMgr::Get()->ReportError(999, "Finished screen rendering");
+    CPDF_ModuleMgr::Get()->ReportError(999, "Finished screen rendering");
 #endif
 
 #endif
@@ -488,100 +480,100 @@
 #endif
 
 DLLEXPORT void STDCALL FPDF_RenderPageBitmap(FPDF_BITMAP bitmap, FPDF_PAGE page, int start_x, int start_y,
-						int size_x, int size_y, int rotate, int flags)
+                        int size_x, int size_y, int rotate, int flags)
 {
-	if (bitmap == NULL || page == NULL) return;
-	CPDF_Page* pPage = (CPDF_Page*)page;
+    if (bitmap == NULL || page == NULL) return;
+    CPDF_Page* pPage = (CPDF_Page*)page;
 
 
-	CRenderContext* pContext = new CRenderContext;
-	pPage->SetPrivateData((void*)1, pContext, DropContext);
+    CRenderContext* pContext = new CRenderContext;
+    pPage->SetPrivateData((void*)1, pContext, DropContext);
 #ifdef _SKIA_SUPPORT_
-	pContext->m_pDevice = new CFX_SkiaDevice;
+    pContext->m_pDevice = new CFX_SkiaDevice;
 
-	if (flags & FPDF_REVERSE_BYTE_ORDER)
-		((CFX_SkiaDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap,0,TRUE);
-	else
-		((CFX_SkiaDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap);
+    if (flags & FPDF_REVERSE_BYTE_ORDER)
+        ((CFX_SkiaDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap,0,TRUE);
+    else
+        ((CFX_SkiaDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap);
 #else
-	pContext->m_pDevice = new CFX_FxgeDevice;
+    pContext->m_pDevice = new CFX_FxgeDevice;
 
-	if (flags & FPDF_REVERSE_BYTE_ORDER)
-		((CFX_FxgeDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap,0,TRUE);
-	else
-		((CFX_FxgeDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap);
+    if (flags & FPDF_REVERSE_BYTE_ORDER)
+        ((CFX_FxgeDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap,0,TRUE);
+    else
+        ((CFX_FxgeDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap);
 #endif
 
-	FPDF_RenderPage_Retail(pContext, page, start_x, start_y, size_x, size_y,
+    FPDF_RenderPage_Retail(pContext, page, start_x, start_y, size_x, size_y,
                            rotate, flags, TRUE, NULL);
 
-	delete pContext;
-	pPage->RemovePrivateData((void*)1);
+    delete pContext;
+    pPage->RemovePrivateData((void*)1);
 }
 
 DLLEXPORT void STDCALL FPDF_ClosePage(FPDF_PAGE page)
 {
-	if (!page) return;
+    if (!page) return;
         CPDFSDK_PageView* pPageView = (CPDFSDK_PageView*)(((CPDF_Page*)page))->GetPrivateData((void*)page);
         if (pPageView && pPageView->IsLocked()) {
             pPageView->TakeOverPage();
             return;
         }
-	delete (CPDF_Page*)page;
+    delete (CPDF_Page*)page;
 
 }
 
 DLLEXPORT void STDCALL FPDF_CloseDocument(FPDF_DOCUMENT document)
 {
-	if (!document)
-		return;
-	CPDF_Document* pDoc = (CPDF_Document*)document;
-	CPDF_Parser* pParser = (CPDF_Parser*)pDoc->GetParser();
-	if (pParser == NULL)
-	{
-		delete pDoc;
-		return;
-	}
-	delete pParser;
+    if (!document)
+        return;
+    CPDF_Document* pDoc = (CPDF_Document*)document;
+    CPDF_Parser* pParser = (CPDF_Parser*)pDoc->GetParser();
+    if (pParser == NULL)
+    {
+        delete pDoc;
+        return;
+    }
+    delete pParser;
 }
 
 DLLEXPORT unsigned long STDCALL FPDF_GetLastError()
 {
-	return GetLastError();
+    return GetLastError();
 }
 
 DLLEXPORT void STDCALL FPDF_DeviceToPage(FPDF_PAGE page, int start_x, int start_y, int size_x, int size_y,
-						int rotate, int device_x, int device_y, double* page_x, double* page_y)
+                        int rotate, int device_x, int device_y, double* page_x, double* page_y)
 {
-	if (page == NULL || page_x == NULL || page_y == NULL) return;
-	CPDF_Page* pPage = (CPDF_Page*)page;
+    if (page == NULL || page_x == NULL || page_y == NULL) return;
+    CPDF_Page* pPage = (CPDF_Page*)page;
 
-	CPDF_Matrix page2device;
-	pPage->GetDisplayMatrix(page2device, start_x, start_y, size_x, size_y, rotate);
-	CPDF_Matrix device2page;
-	device2page.SetReverse(page2device);
+    CPDF_Matrix page2device;
+    pPage->GetDisplayMatrix(page2device, start_x, start_y, size_x, size_y, rotate);
+    CPDF_Matrix device2page;
+    device2page.SetReverse(page2device);
 
-	FX_FLOAT page_x_f, page_y_f;
-	device2page.Transform((FX_FLOAT)(device_x), (FX_FLOAT)(device_y), page_x_f, page_y_f);
+    FX_FLOAT page_x_f, page_y_f;
+    device2page.Transform((FX_FLOAT)(device_x), (FX_FLOAT)(device_y), page_x_f, page_y_f);
 
-	*page_x = (page_x_f);
-	*page_y = (page_y_f);
+    *page_x = (page_x_f);
+    *page_y = (page_y_f);
 }
 
 DLLEXPORT void STDCALL FPDF_PageToDevice(FPDF_PAGE page, int start_x, int start_y, int size_x, int size_y,
-						int rotate, double page_x, double page_y, int* device_x, int* device_y)
+                        int rotate, double page_x, double page_y, int* device_x, int* device_y)
 {
-	if (page == NULL || device_x == NULL || device_y == NULL) return;
-	CPDF_Page* pPage = (CPDF_Page*)page;
+    if (page == NULL || device_x == NULL || device_y == NULL) return;
+    CPDF_Page* pPage = (CPDF_Page*)page;
 
-	CPDF_Matrix page2device;
-	pPage->GetDisplayMatrix(page2device, start_x, start_y, size_x, size_y, rotate);
+    CPDF_Matrix page2device;
+    pPage->GetDisplayMatrix(page2device, start_x, start_y, size_x, size_y, rotate);
 
-	FX_FLOAT device_x_f, device_y_f;
-	page2device.Transform(((FX_FLOAT)page_x), ((FX_FLOAT)page_y), device_x_f, device_y_f);
+    FX_FLOAT device_x_f, device_y_f;
+    page2device.Transform(((FX_FLOAT)page_x), ((FX_FLOAT)page_y), device_x_f, device_y_f);
 
-	*device_x = FXSYS_round(device_x_f);
-	*device_y = FXSYS_round(device_y_f);
+    *device_x = FXSYS_round(device_x_f);
+    *device_y = FXSYS_round(device_y_f);
 }
 
 DLLEXPORT FPDF_BITMAP STDCALL FPDFBitmap_Create(int width, int height, int alpha)
@@ -595,64 +587,64 @@
 
 DLLEXPORT FPDF_BITMAP STDCALL FPDFBitmap_CreateEx(int width, int height, int format, void* first_scan, int stride)
 {
-	FXDIB_Format fx_format;
-	switch (format) {
-		case FPDFBitmap_Gray:
-			fx_format = FXDIB_8bppRgb;
-			break;
-		case FPDFBitmap_BGR:
-			fx_format = FXDIB_Rgb;
-			break;
-		case FPDFBitmap_BGRx:
-			fx_format = FXDIB_Rgb32;
-			break;
-		case FPDFBitmap_BGRA:
-			fx_format = FXDIB_Argb;
-			break;
-		default:
-			return NULL;
-	}
-	CFX_DIBitmap* pBitmap = new CFX_DIBitmap;
-	pBitmap->Create(width, height, fx_format, (uint8_t*)first_scan, stride);
-	return pBitmap;
+    FXDIB_Format fx_format;
+    switch (format) {
+        case FPDFBitmap_Gray:
+            fx_format = FXDIB_8bppRgb;
+            break;
+        case FPDFBitmap_BGR:
+            fx_format = FXDIB_Rgb;
+            break;
+        case FPDFBitmap_BGRx:
+            fx_format = FXDIB_Rgb32;
+            break;
+        case FPDFBitmap_BGRA:
+            fx_format = FXDIB_Argb;
+            break;
+        default:
+            return NULL;
+    }
+    CFX_DIBitmap* pBitmap = new CFX_DIBitmap;
+    pBitmap->Create(width, height, fx_format, (uint8_t*)first_scan, stride);
+    return pBitmap;
 }
 
 DLLEXPORT void STDCALL FPDFBitmap_FillRect(FPDF_BITMAP bitmap, int left, int top, int width, int height, FPDF_DWORD color)
 {
-	if (bitmap == NULL) return;
+    if (bitmap == NULL) return;
 #ifdef _SKIA_SUPPORT_
-	CFX_SkiaDevice device;
+    CFX_SkiaDevice device;
 #else
-	CFX_FxgeDevice device;
+    CFX_FxgeDevice device;
 #endif
-	device.Attach((CFX_DIBitmap*)bitmap);
-	if (!((CFX_DIBitmap*)bitmap)->HasAlpha()) color |= 0xFF000000;
-	FX_RECT rect(left, top, left+width, top+height);
-	device.FillRect(&rect, color);
+    device.Attach((CFX_DIBitmap*)bitmap);
+    if (!((CFX_DIBitmap*)bitmap)->HasAlpha()) color |= 0xFF000000;
+    FX_RECT rect(left, top, left+width, top+height);
+    device.FillRect(&rect, color);
 }
 
 DLLEXPORT void* STDCALL FPDFBitmap_GetBuffer(FPDF_BITMAP bitmap)
 {
-	if (bitmap == NULL) return NULL;
-	return ((CFX_DIBitmap*)bitmap)->GetBuffer();
+    if (bitmap == NULL) return NULL;
+    return ((CFX_DIBitmap*)bitmap)->GetBuffer();
 }
 
 DLLEXPORT int STDCALL FPDFBitmap_GetWidth(FPDF_BITMAP bitmap)
 {
-	if (bitmap == NULL) return 0;
-	return ((CFX_DIBitmap*)bitmap)->GetWidth();
+    if (bitmap == NULL) return 0;
+    return ((CFX_DIBitmap*)bitmap)->GetWidth();
 }
 
 DLLEXPORT int STDCALL FPDFBitmap_GetHeight(FPDF_BITMAP bitmap)
 {
-	if (bitmap == NULL) return 0;
-	return ((CFX_DIBitmap*)bitmap)->GetHeight();
+    if (bitmap == NULL) return 0;
+    return ((CFX_DIBitmap*)bitmap)->GetHeight();
 }
 
 DLLEXPORT int STDCALL FPDFBitmap_GetStride(FPDF_BITMAP bitmap)
 {
-	if (bitmap == NULL) return 0;
-	return ((CFX_DIBitmap*)bitmap)->GetPitch();
+    if (bitmap == NULL) return 0;
+    return ((CFX_DIBitmap*)bitmap)->GetPitch();
 }
 
 DLLEXPORT void STDCALL FPDFBitmap_Destroy(FPDF_BITMAP bitmap)
@@ -663,91 +655,90 @@
 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 )
 {
-	CPDF_Page* pPage = (CPDF_Page*)page;
-	if (pPage == NULL) return;
+    CPDF_Page* pPage = (CPDF_Page*)page;
+    if (pPage == NULL) return;
 
-	if (!pContext->m_pOptions)
-		pContext->m_pOptions = new CPDF_RenderOptions;
+    if (!pContext->m_pOptions)
+        pContext->m_pOptions = new CPDF_RenderOptions;
 
-	if (flags & FPDF_LCD_TEXT)
-		pContext->m_pOptions->m_Flags |= RENDER_CLEARTYPE;
-	else
-		pContext->m_pOptions->m_Flags &= ~RENDER_CLEARTYPE;
-	if (flags & FPDF_NO_NATIVETEXT)
-		pContext->m_pOptions->m_Flags |= RENDER_NO_NATIVETEXT;
-	if (flags & FPDF_RENDER_LIMITEDIMAGECACHE)
-		pContext->m_pOptions->m_Flags |= RENDER_LIMITEDIMAGECACHE;
-	if (flags & FPDF_RENDER_FORCEHALFTONE)
-		pContext->m_pOptions->m_Flags |= RENDER_FORCE_HALFTONE;
-	if (flags & FPDF_RENDER_NO_SMOOTHTEXT)
-		pContext->m_pOptions->m_Flags |= RENDER_NOTEXTSMOOTH;
-	if (flags & FPDF_RENDER_NO_SMOOTHIMAGE)
-		pContext->m_pOptions->m_Flags |= RENDER_NOIMAGESMOOTH;
-	if (flags & FPDF_RENDER_NO_SMOOTHPATH)
-		pContext->m_pOptions->m_Flags |= RENDER_NOPATHSMOOTH;
-	//Grayscale output
-	if (flags & FPDF_GRAYSCALE)
-	{
-		pContext->m_pOptions->m_ColorMode = RENDER_COLOR_GRAY;
-		pContext->m_pOptions->m_ForeColor = 0;
-		pContext->m_pOptions->m_BackColor = 0xffffff;
-	}
-	const CPDF_OCContext::UsageType usage = (flags & FPDF_PRINTING) ? CPDF_OCContext::Print : CPDF_OCContext::View;
-	pContext->m_pOptions->m_AddFlags = flags >> 8;
-	pContext->m_pOptions->m_pOCContext = new CPDF_OCContext(pPage->m_pDocument, usage);
+    if (flags & FPDF_LCD_TEXT)
+        pContext->m_pOptions->m_Flags |= RENDER_CLEARTYPE;
+    else
+        pContext->m_pOptions->m_Flags &= ~RENDER_CLEARTYPE;
+    if (flags & FPDF_NO_NATIVETEXT)
+        pContext->m_pOptions->m_Flags |= RENDER_NO_NATIVETEXT;
+    if (flags & FPDF_RENDER_LIMITEDIMAGECACHE)
+        pContext->m_pOptions->m_Flags |= RENDER_LIMITEDIMAGECACHE;
+    if (flags & FPDF_RENDER_FORCEHALFTONE)
+        pContext->m_pOptions->m_Flags |= RENDER_FORCE_HALFTONE;
+    if (flags & FPDF_RENDER_NO_SMOOTHTEXT)
+        pContext->m_pOptions->m_Flags |= RENDER_NOTEXTSMOOTH;
+    if (flags & FPDF_RENDER_NO_SMOOTHIMAGE)
+        pContext->m_pOptions->m_Flags |= RENDER_NOIMAGESMOOTH;
+    if (flags & FPDF_RENDER_NO_SMOOTHPATH)
+        pContext->m_pOptions->m_Flags |= RENDER_NOPATHSMOOTH;
+    //Grayscale output
+    if (flags & FPDF_GRAYSCALE)
+    {
+        pContext->m_pOptions->m_ColorMode = RENDER_COLOR_GRAY;
+        pContext->m_pOptions->m_ForeColor = 0;
+        pContext->m_pOptions->m_BackColor = 0xffffff;
+    }
+    const CPDF_OCContext::UsageType usage = (flags & FPDF_PRINTING) ? CPDF_OCContext::Print : CPDF_OCContext::View;
+    pContext->m_pOptions->m_AddFlags = flags >> 8;
+    pContext->m_pOptions->m_pOCContext = new CPDF_OCContext(pPage->m_pDocument, usage);
 
-	CFX_AffineMatrix matrix;
-	pPage->GetDisplayMatrix(matrix, start_x, start_y, size_x, size_y, rotate);
+    CFX_AffineMatrix matrix;
+    pPage->GetDisplayMatrix(matrix, start_x, start_y, size_x, size_y, rotate);
 
-	FX_RECT clip;
-	clip.left = start_x;
-	clip.right = start_x + size_x;
-	clip.top = start_y;
-	clip.bottom = start_y + size_y;
-	pContext->m_pDevice->SaveState();
-	pContext->m_pDevice->SetClip_Rect(&clip);
+    FX_RECT clip;
+    clip.left = start_x;
+    clip.right = start_x + size_x;
+    clip.top = start_y;
+    clip.bottom = start_y + size_y;
+    pContext->m_pDevice->SaveState();
+    pContext->m_pDevice->SetClip_Rect(&clip);
 
-	pContext->m_pContext = new CPDF_RenderContext;
-	pContext->m_pContext->Create(pPage);
-	pContext->m_pContext->AppendObjectList(pPage, &matrix);
+    pContext->m_pContext = new CPDF_RenderContext;
+    pContext->m_pContext->Create(pPage);
+    pContext->m_pContext->AppendObjectList(pPage, &matrix);
 
-	if (flags & FPDF_ANNOT) {
-		pContext->m_pAnnots = new CPDF_AnnotList(pPage);
-		FX_BOOL bPrinting = pContext->m_pDevice->GetDeviceClass() != FXDC_DISPLAY;
-		pContext->m_pAnnots->DisplayAnnots(pPage, pContext->m_pContext, bPrinting, &matrix, TRUE, NULL);
-	}
+    if (flags & FPDF_ANNOT) {
+        pContext->m_pAnnots = new CPDF_AnnotList(pPage);
+        FX_BOOL bPrinting = pContext->m_pDevice->GetDeviceClass() != FXDC_DISPLAY;
+        pContext->m_pAnnots->DisplayAnnots(pPage, pContext->m_pContext, bPrinting, &matrix, TRUE, NULL);
+    }
 
-	pContext->m_pRenderer = new CPDF_ProgressiveRenderer;
-	pContext->m_pRenderer->Start(pContext->m_pContext, pContext->m_pDevice, pContext->m_pOptions, pause);
-	if (bNeedToRestore)
-	{
-		pContext->m_pDevice->RestoreState();
-	}
+    pContext->m_pRenderer = new CPDF_ProgressiveRenderer(
+        pContext->m_pContext, pContext->m_pDevice, pContext->m_pOptions);
+    pContext->m_pRenderer->Start(pause);
+    if (bNeedToRestore)
+        pContext->m_pDevice->RestoreState();
 }
 
 DLLEXPORT int STDCALL FPDF_GetPageSizeByIndex(FPDF_DOCUMENT document, int page_index, double* width, double* height)
 {
-	CPDF_Document* pDoc = (CPDF_Document*)document;
-	if(pDoc == NULL)
-		return FALSE;
+    CPDF_Document* pDoc = (CPDF_Document*)document;
+    if(pDoc == NULL)
+        return FALSE;
 
-	CPDF_Dictionary* pDict = pDoc->GetPage(page_index);
-	if (pDict == NULL) return FALSE;
+    CPDF_Dictionary* pDict = pDoc->GetPage(page_index);
+    if (pDict == NULL) return FALSE;
 
-	CPDF_Page page;
-	page.Load(pDoc, pDict);
-	*width = page.GetPageWidth();
-	*height = page.GetPageHeight();
+    CPDF_Page page;
+    page.Load(pDoc, pDict);
+    *width = page.GetPageWidth();
+    *height = page.GetPageHeight();
 
-	return TRUE;
+    return TRUE;
 }
 
 DLLEXPORT FPDF_BOOL STDCALL FPDF_VIEWERREF_GetPrintScaling(FPDF_DOCUMENT document)
 {
-	CPDF_Document* pDoc = (CPDF_Document*)document;
-	if (!pDoc) return TRUE;
-	CPDF_ViewerPreferences viewRef(pDoc);
-	return viewRef.PrintScaling();
+    CPDF_Document* pDoc = (CPDF_Document*)document;
+    if (!pDoc) return TRUE;
+    CPDF_ViewerPreferences viewRef(pDoc);
+    return viewRef.PrintScaling();
 }
 
 DLLEXPORT int STDCALL FPDF_VIEWERREF_GetNumCopies(FPDF_DOCUMENT document)
@@ -799,14 +790,14 @@
 
 DLLEXPORT FPDF_DEST STDCALL FPDF_GetNamedDestByName(FPDF_DOCUMENT document,FPDF_BYTESTRING name)
 {
-	if (!document)
-		return NULL;
-	if (!name || name[0] == 0)
-		return NULL;
+    if (!document)
+        return NULL;
+    if (!name || name[0] == 0)
+        return NULL;
 
-	CPDF_Document* pDoc = (CPDF_Document*)document;
-	CPDF_NameTree name_tree(pDoc, FX_BSTRC("Dests"));
-	return name_tree.LookupNamedDest(pDoc, name);
+    CPDF_Document* pDoc = (CPDF_Document*)document;
+    CPDF_NameTree name_tree(pDoc, FX_BSTRC("Dests"));
+    return name_tree.LookupNamedDest(pDoc, name);
 }
 
 DLLEXPORT FPDF_DEST STDCALL FPDF_GetNamedDest(FPDF_DOCUMENT document, int index, void* buffer, long* buflen)
