diff --git a/core/include/fpdfapi/fpdf_pageobj.h b/core/include/fpdfapi/fpdf_pageobj.h
index 7ea51cc..a3695f7 100644
--- a/core/include/fpdfapi/fpdf_pageobj.h
+++ b/core/include/fpdfapi/fpdf_pageobj.h
@@ -10,25 +10,27 @@
 #include "../fxge/fx_ge.h"
 #include "fpdf_resource.h"
 
-class CPDF_Path;
-class CPDF_ClipPathData;
 class CPDF_ClipPath;
-class CPDF_ColorStateData;
+class CPDF_ClipPathData;
 class CPDF_ColorState;
-class CPDF_GraphState;
-class CPDF_TextStateData;
-class CPDF_TextState;
-class CPDF_GeneralStateData;
-class CPDF_GeneralState;
-class CPDF_ContentMarkItem;
+class CPDF_ColorStateData;
 class CPDF_ContentMark;
-class CPDF_GraphicStates;
-class CPDF_PageObject;
-class CPDF_TextObject;
-class CPDF_PathObject;
-class CPDF_ImageObject;
-class CPDF_ShadingObject;
+class CPDF_ContentMarkItem;
 class CPDF_FormObject;
+class CPDF_GeneralState;
+class CPDF_GeneralStateData;
+class CPDF_GraphicStates;
+class CPDF_GraphState;
+class CPDF_ImageObject;
+class CPDF_PageObject;
+class CPDF_Path;
+class CPDF_PathObject;
+class CPDF_ShadingObject;
+class CPDF_TextObject;
+class CPDF_TextState;
+class CPDF_TextStateData;
+class CPDF_TransferFunc;
+
 typedef CFX_PathData CPDF_PathData;
 
 class CPDF_Path : public CFX_CountRef<CFX_PathData> {
@@ -196,7 +198,7 @@
 
   FX_FLOAT GetShearAngle() const;
 };
-class CPDF_TransferFunc;
+
 class CPDF_GeneralStateData {
  public:
   CPDF_GeneralStateData();
diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render.cpp
index e5b4b66..78fb349 100644
--- a/core/src/fpdfapi/fpdf_render/fpdf_render.cpp
+++ b/core/src/fpdfapi/fpdf_render/fpdf_render.cpp
@@ -156,30 +156,27 @@
 // static
 int CPDF_RenderStatus::s_CurrentRecursionDepth = 0;
 
-CPDF_RenderStatus::CPDF_RenderStatus() {
-  m_pContext = NULL;
-  m_bStopped = FALSE;
-  m_pDevice = NULL;
-  m_pCurObj = NULL;
-  m_pStopObj = NULL;
-  m_HalftoneLimit = 0;
-  m_pObjectRenderer = NULL;
-  m_bPrint = FALSE;
-  m_Transparency = 0;
-  m_DitherBits = 0;
-  m_bDropObjects = FALSE;
-  m_bStdCS = FALSE;
-  m_GroupFamily = 0;
-  m_bLoadMask = FALSE;
-  m_pType3Char = NULL;
-  m_T3FillColor = 0;
-  m_pFormResource = NULL;
-  m_pPageResource = NULL;
-  m_curBlend = FXDIB_BLEND_NORMAL;
-}
+CPDF_RenderStatus::CPDF_RenderStatus()
+    : m_pFormResource(nullptr),
+      m_pPageResource(nullptr),
+      m_pContext(nullptr),
+      m_bStopped(FALSE),
+      m_pDevice(nullptr),
+      m_pCurObj(nullptr),
+      m_pStopObj(nullptr),
+      m_HalftoneLimit(0),
+      m_bPrint(FALSE),
+      m_Transparency(0),
+      m_DitherBits(0),
+      m_bDropObjects(FALSE),
+      m_bStdCS(FALSE),
+      m_GroupFamily(0),
+      m_bLoadMask(FALSE),
+      m_pType3Char(nullptr),
+      m_T3FillColor(0),
+      m_curBlend(FXDIB_BLEND_NORMAL) {}
 
 CPDF_RenderStatus::~CPDF_RenderStatus() {
-  delete m_pObjectRenderer;
 }
 
 FX_BOOL CPDF_RenderStatus::Initialize(CPDF_RenderContext* pContext,
@@ -239,7 +236,7 @@
   } else {
     m_InitialStates.DefaultStates();
   }
-  m_pObjectRenderer = NULL;
+  m_pObjectRenderer.reset();
   m_Transparency = transparency;
   return TRUE;
 }
@@ -292,45 +289,46 @@
   }
   ProcessObjectNoClip(pObj, pObj2Device);
 }
+
 FX_BOOL CPDF_RenderStatus::ContinueSingleObject(
     const CPDF_PageObject* pObj,
     const CFX_AffineMatrix* pObj2Device,
     IFX_Pause* pPause) {
   if (m_pObjectRenderer) {
-    if (m_pObjectRenderer->Continue(pPause)) {
+    if (m_pObjectRenderer->Continue(pPause))
       return TRUE;
-    }
-    if (!m_pObjectRenderer->m_Result) {
+
+    if (!m_pObjectRenderer->m_Result)
       DrawObjWithBackground(pObj, pObj2Device);
-    }
-    delete m_pObjectRenderer;
-    m_pObjectRenderer = NULL;
+    m_pObjectRenderer.reset();
     return FALSE;
   }
+
   m_pCurObj = pObj;
-  if (m_Options.m_pOCContext && pObj->m_ContentMark.NotNull())
-    if (!m_Options.m_pOCContext->CheckObjectVisible(pObj)) {
-      return FALSE;
-    }
-  ProcessClipPath(pObj->m_ClipPath, pObj2Device);
-  if (ProcessTransparency(pObj, pObj2Device)) {
+  if (m_Options.m_pOCContext && pObj->m_ContentMark.NotNull() &&
+      !m_Options.m_pOCContext->CheckObjectVisible(pObj)) {
     return FALSE;
   }
+
+  ProcessClipPath(pObj->m_ClipPath, pObj2Device);
+  if (ProcessTransparency(pObj, pObj2Device))
+    return FALSE;
+
   if (pObj->m_Type == PDFPAGE_IMAGE) {
-    m_pObjectRenderer = IPDF_ObjectRenderer::Create(pObj->m_Type);
+    m_pObjectRenderer.reset(IPDF_ObjectRenderer::Create(pObj->m_Type));
     if (!m_pObjectRenderer->Start(this, pObj, pObj2Device, FALSE)) {
-      if (!m_pObjectRenderer->m_Result) {
+      if (!m_pObjectRenderer->m_Result)
         DrawObjWithBackground(pObj, pObj2Device);
-      }
-      delete m_pObjectRenderer;
-      m_pObjectRenderer = NULL;
+      m_pObjectRenderer.reset();
       return FALSE;
     }
     return ContinueSingleObject(pObj, pObj2Device, pPause);
   }
+
   ProcessObjectNoClip(pObj, pObj2Device);
   return FALSE;
 }
+
 IPDF_ObjectRenderer* IPDF_ObjectRenderer::Create(int type) {
   if (type != PDFPAGE_IMAGE) {
     return NULL;
@@ -627,65 +625,63 @@
 void CPDF_RenderStatus::ProcessClipPath(CPDF_ClipPath ClipPath,
                                         const CFX_AffineMatrix* pObj2Device) {
   if (ClipPath.IsNull()) {
-    if (m_LastClipPath.IsNull()) {
-      return;
+    if (!m_LastClipPath.IsNull()) {
+      m_pDevice->RestoreState(TRUE);
+      m_LastClipPath.SetNull();
     }
-    m_pDevice->RestoreState(TRUE);
-    m_LastClipPath.SetNull();
     return;
   }
-  if (m_LastClipPath == ClipPath) {
+  if (m_LastClipPath == ClipPath)
     return;
-  }
+
   m_LastClipPath = ClipPath;
   m_pDevice->RestoreState(TRUE);
   int nClipPath = ClipPath.GetPathCount();
-  int i;
-  for (i = 0; i < nClipPath; i++) {
+  for (int i = 0; i < nClipPath; ++i) {
     const CFX_PathData* pPathData = ClipPath.GetPath(i);
-    if (pPathData == NULL) {
+    if (!pPathData)
       continue;
-    }
+
     if (pPathData->GetPointCount() == 0) {
       CFX_PathData EmptyPath;
       EmptyPath.AppendRect(-1, -1, 0, 0);
       int fill_mode = FXFILL_WINDING;
-      m_pDevice->SetClip_PathFill(&EmptyPath, NULL, fill_mode);
+      m_pDevice->SetClip_PathFill(&EmptyPath, nullptr, fill_mode);
     } else {
       int ClipType = ClipPath.GetClipType(i);
       m_pDevice->SetClip_PathFill(pPathData, pObj2Device, ClipType);
     }
   }
   int textcount = ClipPath.GetTextCount();
-  if (textcount == 0) {
+  if (textcount == 0)
     return;
-  }
+
   if (m_pDevice->GetDeviceClass() == FXDC_DISPLAY &&
       !(m_pDevice->GetDeviceCaps(FXDC_RENDER_CAPS) & FXRC_SOFT_CLIP)) {
     return;
   }
-  CFX_PathData* pTextClippingPath = NULL;
-  for (i = 0; i < textcount; i++) {
+
+  nonstd::unique_ptr<CFX_PathData> pTextClippingPath;
+  for (int i = 0; i < textcount; ++i) {
     CPDF_TextObject* pText = ClipPath.GetText(i);
-    if (pText == NULL) {
-      if (pTextClippingPath) {
-        int fill_mode = FXFILL_WINDING;
-        if (m_Options.m_Flags & RENDER_NOTEXTSMOOTH) {
-          fill_mode |= FXFILL_NOPATHSMOOTH;
-        }
-        m_pDevice->SetClip_PathFill(pTextClippingPath, NULL, fill_mode);
-        delete pTextClippingPath;
-        pTextClippingPath = NULL;
-      }
-    } else {
-      if (pTextClippingPath == NULL) {
-        pTextClippingPath = new CFX_PathData;
-      }
-      ProcessText(pText, pObj2Device, pTextClippingPath);
+    if (pText) {
+      if (!pTextClippingPath)
+        pTextClippingPath.reset(new CFX_PathData);
+      ProcessText(pText, pObj2Device, pTextClippingPath.get());
+      continue;
     }
+
+    if (!pTextClippingPath)
+      continue;
+
+    int fill_mode = FXFILL_WINDING;
+    if (m_Options.m_Flags & RENDER_NOTEXTSMOOTH)
+      fill_mode |= FXFILL_NOPATHSMOOTH;
+    m_pDevice->SetClip_PathFill(pTextClippingPath.get(), nullptr, fill_mode);
+    pTextClippingPath.reset();
   }
-  delete pTextClippingPath;
 }
+
 void CPDF_RenderStatus::DrawClipPath(CPDF_ClipPath ClipPath,
                                      const CFX_AffineMatrix* pObj2Device) {
   if (ClipPath.IsNull()) {
@@ -829,32 +825,31 @@
   int width = FXSYS_round((FX_FLOAT)rect.Width() * scaleX);
   int height = FXSYS_round((FX_FLOAT)rect.Height() * scaleY);
   CFX_FxgeDevice bitmap_device;
-  CFX_DIBitmap* oriDevice = NULL;
+  nonstd::unique_ptr<CFX_DIBitmap> oriDevice;
   if (!isolated && (m_pDevice->GetRenderCaps() & FXRC_GET_BITS)) {
-    oriDevice = new CFX_DIBitmap;
-    if (!m_pDevice->CreateCompatibleBitmap(oriDevice, width, height)) {
+    oriDevice.reset(new CFX_DIBitmap);
+    if (!m_pDevice->CreateCompatibleBitmap(oriDevice.get(), width, height))
       return TRUE;
-    }
-    m_pDevice->GetDIBits(oriDevice, rect.left, rect.top);
+
+    m_pDevice->GetDIBits(oriDevice.get(), rect.left, rect.top);
   }
-  if (!bitmap_device.Create(width, height, FXDIB_Argb, 0, oriDevice)) {
+  if (!bitmap_device.Create(width, height, FXDIB_Argb, 0, oriDevice.get()))
     return TRUE;
-  }
+
   CFX_DIBitmap* bitmap = bitmap_device.GetBitmap();
   bitmap->Clear(0);
   CFX_AffineMatrix new_matrix = *pObj2Device;
   new_matrix.TranslateI(-rect.left, -rect.top);
   new_matrix.Scale(scaleX, scaleY);
-  CFX_DIBitmap* pTextMask = NULL;
+  nonstd::unique_ptr<CFX_DIBitmap> pTextMask;
   if (bTextClip) {
-    pTextMask = new CFX_DIBitmap;
-    if (!pTextMask->Create(width, height, FXDIB_8bppMask)) {
-      delete pTextMask;
+    pTextMask.reset(new CFX_DIBitmap);
+    if (!pTextMask->Create(width, height, FXDIB_8bppMask))
       return TRUE;
-    }
+
     pTextMask->Clear(0);
     CFX_FxgeDevice text_device;
-    text_device.Attach(pTextMask);
+    text_device.Attach(pTextMask.get());
     for (FX_DWORD i = 0; i < pPageObj->m_ClipPath.GetTextCount(); i++) {
       CPDF_TextObject* textobj = pPageObj->m_ClipPath.GetText(i);
       if (textobj == NULL) {
@@ -880,16 +875,14 @@
     FXSYS_memcpy(&smask_matrix, pGeneralState->m_SMaskMatrix,
                  sizeof smask_matrix);
     smask_matrix.Concat(*pObj2Device);
-    CFX_DIBSource* pSMaskSource = LoadSMask(pSMaskDict, &rect, &smask_matrix);
-    if (pSMaskSource) {
-      bitmap->MultiplyAlpha(pSMaskSource);
-      delete pSMaskSource;
-    }
+    nonstd::unique_ptr<CFX_DIBSource> pSMaskSource(
+        LoadSMask(pSMaskDict, &rect, &smask_matrix));
+    if (pSMaskSource)
+      bitmap->MultiplyAlpha(pSMaskSource.get());
   }
   if (pTextMask) {
-    bitmap->MultiplyAlpha(pTextMask);
-    delete pTextMask;
-    pTextMask = NULL;
+    bitmap->MultiplyAlpha(pTextMask.get());
+    pTextMask.reset();
   }
   if (Transparency & PDFTRANS_GROUP && group_alpha != 1.0f) {
     bitmap->MultiplyAlpha((int32_t)(group_alpha * 255));
@@ -900,9 +893,9 @@
   }
   CompositeDIBitmap(bitmap, rect.left, rect.top, 0, 255, blend_type,
                     Transparency);
-  delete oriDevice;
   return TRUE;
 }
+
 CFX_DIBitmap* CPDF_RenderStatus::GetBackdrop(const CPDF_PageObject* pObj,
                                              const FX_RECT& rect,
                                              int& left,
@@ -917,35 +910,36 @@
   FX_FLOAT scaleY = FXSYS_fabs(deviceCTM.d);
   int width = FXSYS_round(bbox.Width() * scaleX);
   int height = FXSYS_round(bbox.Height() * scaleY);
-  CFX_DIBitmap* pBackdrop = new CFX_DIBitmap;
-  if (bBackAlphaRequired && !m_bDropObjects) {
+  nonstd::unique_ptr<CFX_DIBitmap> pBackdrop(new CFX_DIBitmap);
+  if (bBackAlphaRequired && !m_bDropObjects)
     pBackdrop->Create(width, height, FXDIB_Argb);
-  } else {
-    m_pDevice->CreateCompatibleBitmap(pBackdrop, width, height);
-  }
-  if (pBackdrop->GetBuffer() == NULL) {
-    delete pBackdrop;
-    return NULL;
-  }
+  else
+    m_pDevice->CreateCompatibleBitmap(pBackdrop.get(), width, height);
+
+  if (!pBackdrop->GetBuffer())
+    return nullptr;
+
   FX_BOOL bNeedDraw;
-  if (pBackdrop->HasAlpha()) {
+  if (pBackdrop->HasAlpha())
     bNeedDraw = !(m_pDevice->GetRenderCaps() & FXRC_ALPHA_OUTPUT);
-  } else {
+  else
     bNeedDraw = !(m_pDevice->GetRenderCaps() & FXRC_GET_BITS);
-  }
+
   if (!bNeedDraw) {
-    m_pDevice->GetDIBits(pBackdrop, left, top);
-    return pBackdrop;
+    m_pDevice->GetDIBits(pBackdrop.get(), left, top);
+    return pBackdrop.release();
   }
+
   CFX_AffineMatrix FinalMatrix = m_DeviceMatrix;
   FinalMatrix.TranslateI(-left, -top);
   FinalMatrix.Scale(scaleX, scaleY);
   pBackdrop->Clear(pBackdrop->HasAlpha() ? 0 : 0xffffffff);
   CFX_FxgeDevice device;
-  device.Attach(pBackdrop);
+  device.Attach(pBackdrop.get());
   m_pContext->Render(&device, pObj, &m_Options, &FinalMatrix);
-  return pBackdrop;
+  return pBackdrop.release();
 }
+
 void CPDF_RenderContext::GetBackground(CFX_DIBitmap* pBuffer,
                                        const CPDF_PageObject* pObj,
                                        const CPDF_RenderOptions* pOptions,
@@ -1223,7 +1217,7 @@
     return pTransferCounter->AddRef();
   }
 
-  CPDF_Function* pFuncs[3] = {nullptr, nullptr, nullptr};
+  nonstd::unique_ptr<CPDF_Function> pFuncs[3];
   FX_BOOL bUniTransfer = TRUE;
   FX_BOOL bIdentity = TRUE;
   if (CPDF_Array* pArray = pObj->AsArray()) {
@@ -1232,19 +1226,16 @@
       return nullptr;
 
     for (FX_DWORD i = 0; i < 3; ++i) {
-      pFuncs[2 - i] = CPDF_Function::Load(pArray->GetElementValue(i));
-      if (!pFuncs[2 - i]) {
+      pFuncs[2 - i].reset(CPDF_Function::Load(pArray->GetElementValue(i)));
+      if (!pFuncs[2 - i])
         return nullptr;
-      }
     }
   } else {
-    pFuncs[0] = CPDF_Function::Load(pObj);
-    if (!pFuncs[0]) {
+    pFuncs[0].reset(CPDF_Function::Load(pObj));
+    if (!pFuncs[0])
       return nullptr;
-    }
   }
-  CPDF_TransferFunc* pTransfer = new CPDF_TransferFunc;
-  pTransfer->m_pPDFDoc = m_pPDFDoc;
+  CPDF_TransferFunc* pTransfer = new CPDF_TransferFunc(m_pPDFDoc);
   CPDF_CountedObject<CPDF_TransferFunc>* pTransferCounter =
       new CPDF_CountedObject<CPDF_TransferFunc>(pTransfer);
   m_TransferFuncMap[pObj] = pTransferCounter;
@@ -1278,8 +1269,6 @@
       }
     }
   }
-  for (int i = 0; i < 3; ++i)
-    delete pFuncs[i];
 
   pTransfer->m_bIdentity = bIdentity;
   return pTransferCounter->AddRef();
@@ -1295,15 +1284,13 @@
   m_RenderStepLimit = 100;
 }
 CPDF_RenderConfig::~CPDF_RenderConfig() {}
-CPDF_DeviceBuffer::CPDF_DeviceBuffer() {
-  m_pBitmap = NULL;
-  m_pDevice = NULL;
-  m_pContext = NULL;
-  m_pObject = NULL;
-}
+
+CPDF_DeviceBuffer::CPDF_DeviceBuffer()
+    : m_pDevice(nullptr), m_pContext(nullptr), m_pObject(nullptr) {}
+
 CPDF_DeviceBuffer::~CPDF_DeviceBuffer() {
-  delete m_pBitmap;
 }
+
 FX_BOOL CPDF_DeviceBuffer::Initialize(CPDF_RenderContext* pContext,
                                       CFX_RenderDevice* pDevice,
                                       FX_RECT* pRect,
@@ -1337,16 +1324,16 @@
   CFX_FloatRect rect(*pRect);
   m_Matrix.TransformRect(rect);
   FX_RECT bitmap_rect = rect.GetOutterRect();
-  m_pBitmap = new CFX_DIBitmap;
+  m_pBitmap.reset(new CFX_DIBitmap);
   m_pBitmap->Create(bitmap_rect.Width(), bitmap_rect.Height(), FXDIB_Argb);
   return TRUE;
 }
 void CPDF_DeviceBuffer::OutputToDevice() {
   if (m_pDevice->GetDeviceCaps(FXDC_RENDER_CAPS) & FXRC_GET_BITS) {
     if (m_Matrix.a == 1.0f && m_Matrix.d == 1.0f) {
-      m_pDevice->SetDIBits(m_pBitmap, m_Rect.left, m_Rect.top);
+      m_pDevice->SetDIBits(m_pBitmap.get(), m_Rect.left, m_Rect.top);
     } else {
-      m_pDevice->StretchDIBits(m_pBitmap, m_Rect.left, m_Rect.top,
+      m_pDevice->StretchDIBits(m_pBitmap.get(), m_Rect.left, m_Rect.top,
                                m_Rect.Width(), m_Rect.Height());
     }
   } else {
@@ -1355,17 +1342,16 @@
                                       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_pBitmap.get(), 0, 0);
     m_pDevice->StretchDIBits(&buffer, m_Rect.left, m_Rect.top, m_Rect.Width(),
                              m_Rect.Height());
   }
 }
-CPDF_ScaledRenderBuffer::CPDF_ScaledRenderBuffer() {
-  m_pBitmapDevice = NULL;
-}
-CPDF_ScaledRenderBuffer::~CPDF_ScaledRenderBuffer() {
-  delete m_pBitmapDevice;
-}
+
+CPDF_ScaledRenderBuffer::CPDF_ScaledRenderBuffer() {}
+
+CPDF_ScaledRenderBuffer::~CPDF_ScaledRenderBuffer() {}
+
 #define _FPDFAPI_IMAGESIZE_LIMIT_ (30 * 1024 * 1024)
 FX_BOOL CPDF_ScaledRenderBuffer::Initialize(CPDF_RenderContext* pContext,
                                             CFX_RenderDevice* pDevice,
@@ -1396,7 +1382,7 @@
       m_Matrix.Scale(1.0f, (FX_FLOAT)(max_dpi) / (FX_FLOAT)dpiv);
     }
   }
-  m_pBitmapDevice = new CFX_FxgeDevice;
+  m_pBitmapDevice.reset(new CFX_FxgeDevice);
   FXDIB_Format dibFormat = FXDIB_Rgb;
   int32_t bpp = 24;
   if (m_pDevice->GetDeviceCaps(FXDC_RENDER_CAPS) & FXRC_ALPHA_OUTPUT) {
diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render_image.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render_image.cpp
index b51520a..0a45167 100644
--- a/core/src/fpdfapi/fpdf_render/fpdf_render_image.cpp
+++ b/core/src/fpdfapi/fpdf_render/fpdf_render_image.cpp
@@ -104,36 +104,40 @@
   int back_left, back_top;
   FX_RECT rect(left, top, left + pDIBitmap->GetWidth(),
                top + pDIBitmap->GetHeight());
-  CFX_DIBitmap* pBackdrop =
+  nonstd::unique_ptr<CFX_DIBitmap> pBackdrop(
       GetBackdrop(m_pCurObj, rect, back_left, back_top,
-                  blend_mode > FXDIB_BLEND_NORMAL && bIsolated);
-  if (!pBackdrop) {
+                  blend_mode > FXDIB_BLEND_NORMAL && bIsolated));
+  if (!pBackdrop)
     return;
-  }
-  if (!pDIBitmap->IsAlphaMask())
+
+  if (!pDIBitmap->IsAlphaMask()) {
     pBackdrop->CompositeBitmap(left - back_left, top - back_top,
                                pDIBitmap->GetWidth(), pDIBitmap->GetHeight(),
                                pDIBitmap, 0, 0, blend_mode);
-  else
+  } else {
     pBackdrop->CompositeMask(left - back_left, top - back_top,
                              pDIBitmap->GetWidth(), pDIBitmap->GetHeight(),
                              pDIBitmap, mask_argb, 0, 0, blend_mode);
-  CFX_DIBitmap* pBackdrop1 = new CFX_DIBitmap;
+  }
+
+  nonstd::unique_ptr<CFX_DIBitmap> pBackdrop1(new CFX_DIBitmap);
   pBackdrop1->Create(pBackdrop->GetWidth(), pBackdrop->GetHeight(),
                      FXDIB_Rgb32);
   pBackdrop1->Clear((FX_DWORD)-1);
   pBackdrop1->CompositeBitmap(0, 0, pBackdrop->GetWidth(),
-                              pBackdrop->GetHeight(), pBackdrop, 0, 0);
-  delete pBackdrop;
-  pBackdrop = pBackdrop1;
-  m_pDevice->SetDIBits(pBackdrop, back_left, back_top);
-  delete pBackdrop;
+                              pBackdrop->GetHeight(), pBackdrop.get(), 0, 0);
+  pBackdrop = nonstd::move(pBackdrop1);
+  m_pDevice->SetDIBits(pBackdrop.get(), back_left, back_top);
 }
-FX_COLORREF CPDF_TransferFunc::TranslateColor(FX_COLORREF rgb) {
+
+CPDF_TransferFunc::CPDF_TransferFunc(CPDF_Document* pDoc) : m_pPDFDoc(pDoc) {}
+
+FX_COLORREF CPDF_TransferFunc::TranslateColor(FX_COLORREF rgb) const {
   return FXSYS_RGB(m_Samples[FXSYS_GetRValue(rgb)],
                    m_Samples[256 + FXSYS_GetGValue(rgb)],
                    m_Samples[512 + FXSYS_GetBValue(rgb)]);
 }
+
 CFX_DIBSource* CPDF_TransferFunc::TranslateImage(const CFX_DIBSource* pSrc,
                                                  FX_BOOL bAutoDropSrc) {
   CPDF_DIBTransferFunc* pDest = new CPDF_DIBTransferFunc(this);
@@ -770,14 +774,12 @@
   FX_RECT dest_clip(
       dest_rect.left - image_rect.left, dest_rect.top - image_rect.top,
       dest_rect.right - image_rect.left, dest_rect.bottom - image_rect.top);
-  CFX_DIBitmap* pStretched =
-      m_pDIBSource->StretchTo(dest_width, dest_height, m_Flags, &dest_clip);
+  nonstd::unique_ptr<CFX_DIBitmap> pStretched(
+      m_pDIBSource->StretchTo(dest_width, dest_height, m_Flags, &dest_clip));
   if (pStretched) {
-    m_pRenderStatus->CompositeDIBitmap(pStretched, dest_rect.left,
+    m_pRenderStatus->CompositeDIBitmap(pStretched.get(), dest_rect.left,
                                        dest_rect.top, m_FillArgb, m_BitmapAlpha,
                                        m_BlendType, FALSE);
-    delete pStretched;
-    pStretched = NULL;
   }
   return FALSE;
 }
@@ -797,15 +799,14 @@
     if (FXSYS_fabs(m_ImageMatrix.b) >= 0.5f ||
         FXSYS_fabs(m_ImageMatrix.c) >= 0.5f) {
       int left, top;
-      CFX_DIBitmap* pTransformed =
-          pAlphaMask->TransformTo(&m_ImageMatrix, left, top);
-      if (pTransformed == NULL) {
+      nonstd::unique_ptr<CFX_DIBitmap> pTransformed(
+          pAlphaMask->TransformTo(&m_ImageMatrix, left, top));
+      if (!pTransformed)
         return TRUE;
-      }
+
       m_pRenderStatus->m_pDevice->SetBitMask(
-          pTransformed, left, top,
+          pTransformed.get(), left, top,
           ArgbEncode(0xff, m_BitmapAlpha, m_BitmapAlpha, m_BitmapAlpha));
-      delete pTransformed;
     } else {
       CFX_FloatRect image_rect_f = m_ImageMatrix.GetUnitRect();
       FX_RECT image_rect = image_rect_f.GetOutterRect();
@@ -1045,7 +1046,6 @@
   if (pSMaskDict == NULL) {
     return NULL;
   }
-  CFX_DIBitmap* pMask = NULL;
   int width = pClipRect->right - pClipRect->left;
   int height = pClipRect->bottom - pClipRect->top;
   FX_BOOL bLuminosity = FALSE;
@@ -1054,10 +1054,10 @@
   if (pGroup == NULL) {
     return NULL;
   }
-  CPDF_Function* pFunc = NULL;
+  nonstd::unique_ptr<CPDF_Function> pFunc;
   CPDF_Object* pFuncObj = pSMaskDict->GetElementValue(FX_BSTRC("TR"));
   if (pFuncObj && (pFuncObj->IsDictionary() || pFuncObj->IsStream()))
-    pFunc = CPDF_Function::Load(pFuncObj);
+    pFunc.reset(CPDF_Function::Load(pFuncObj));
 
   CFX_AffineMatrix matrix = *pMatrix;
   matrix.TranslateI(-pClipRect->left, -pClipRect->top);
@@ -1128,27 +1128,26 @@
                     &options, 0, m_bDropObjects, pFormResource, TRUE, NULL, 0,
                     pCS ? pCS->GetFamily() : 0, bLuminosity);
   status.RenderObjectList(&form, &matrix);
-  pMask = new CFX_DIBitmap;
-  if (!pMask->Create(width, height, FXDIB_8bppMask)) {
-    delete pMask;
-    return NULL;
-  }
+  nonstd::unique_ptr<CFX_DIBitmap> pMask(new CFX_DIBitmap);
+  if (!pMask->Create(width, height, FXDIB_8bppMask))
+    return nullptr;
+
   uint8_t* dest_buf = pMask->GetBuffer();
   int dest_pitch = pMask->GetPitch();
   uint8_t* src_buf = bitmap.GetBuffer();
   int src_pitch = bitmap.GetPitch();
-  uint8_t* pTransfer = FX_Alloc(uint8_t, 256);
+  std::vector<uint8_t> transfers(256);
   if (pFunc) {
     CFX_FixedBufGrow<FX_FLOAT, 16> results(pFunc->CountOutputs());
     for (int i = 0; i < 256; i++) {
       FX_FLOAT input = (FX_FLOAT)i / 255.0f;
       int nresult;
       pFunc->Call(&input, 1, results, nresult);
-      pTransfer[i] = FXSYS_round(results[0] * 255);
+      transfers[i] = FXSYS_round(results[0] * 255);
     }
   } else {
     for (int i = 0; i < 256; i++) {
-      pTransfer[i] = i;
+      transfers[i] = i;
     }
   }
   if (bLuminosity) {
@@ -1157,19 +1156,17 @@
       uint8_t* dest_pos = dest_buf + row * dest_pitch;
       uint8_t* src_pos = src_buf + row * src_pitch;
       for (int col = 0; col < width; col++) {
-        *dest_pos++ = pTransfer[FXRGB2GRAY(src_pos[2], src_pos[1], *src_pos)];
+        *dest_pos++ = transfers[FXRGB2GRAY(src_pos[2], src_pos[1], *src_pos)];
         src_pos += Bpp;
       }
     }
   } else if (pFunc) {
     int size = dest_pitch * height;
     for (int i = 0; i < size; i++) {
-      dest_buf[i] = pTransfer[src_buf[i]];
+      dest_buf[i] = transfers[src_buf[i]];
     }
   } else {
     FXSYS_memcpy(dest_buf, src_buf, dest_pitch * height);
   }
-  delete pFunc;
-  FX_Free(pTransfer);
-  return pMask;
+  return pMask.release();
 }
diff --git a/core/src/fpdfapi/fpdf_render/render_int.h b/core/src/fpdfapi/fpdf_render/render_int.h
index ed44c26..dbc9f11 100644
--- a/core/src/fpdfapi/fpdf_render/render_int.h
+++ b/core/src/fpdfapi/fpdf_render/render_int.h
@@ -54,15 +54,18 @@
   CPDF_Type3Font* const m_pFont;
   std::map<CFX_ByteString, CPDF_Type3Glyphs*> m_SizeMap;
 };
+
 class CPDF_TransferFunc {
  public:
-  CPDF_Document* m_pPDFDoc;
-  uint8_t m_Samples[256 * 3];
-  FX_BOOL m_bIdentity;
+  explicit CPDF_TransferFunc(CPDF_Document* pDoc);
 
+  FX_COLORREF TranslateColor(FX_COLORREF src) const;
   CFX_DIBSource* TranslateImage(const CFX_DIBSource* pSrc,
                                 FX_BOOL bAutoDropSrc);
-  FX_COLORREF TranslateColor(FX_COLORREF src);
+
+  CPDF_Document* const m_pPDFDoc;
+  FX_BOOL m_bIdentity;
+  uint8_t m_Samples[256 * 3];
 };
 
 class CPDF_DocRenderData {
@@ -253,7 +256,7 @@
   const CPDF_PageObject* m_pStopObj;
   CPDF_GraphicStates m_InitialStates;
   int m_HalftoneLimit;
-  IPDF_ObjectRenderer* m_pObjectRenderer;
+  nonstd::unique_ptr<IPDF_ObjectRenderer> m_pObjectRenderer;
   FX_BOOL m_bPrint;
   int m_Transparency;
   int m_DitherBits;
@@ -382,6 +385,7 @@
  public:
   CPDF_ScaledRenderBuffer();
   ~CPDF_ScaledRenderBuffer();
+
   FX_BOOL Initialize(CPDF_RenderContext* pContext,
                      CFX_RenderDevice* pDevice,
                      FX_RECT* pRect,
@@ -389,7 +393,7 @@
                      const CPDF_RenderOptions* pOptions = NULL,
                      int max_dpi = 0);
   CFX_RenderDevice* GetDevice() {
-    return m_pBitmapDevice ? m_pBitmapDevice : m_pDevice;
+    return m_pBitmapDevice ? m_pBitmapDevice.get() : m_pDevice;
   }
   CFX_AffineMatrix* GetMatrix() { return &m_Matrix; }
   void OutputToDevice();
@@ -399,9 +403,10 @@
   CPDF_RenderContext* m_pContext;
   FX_RECT m_Rect;
   const CPDF_PageObject* m_pObject;
-  CFX_FxgeDevice* m_pBitmapDevice;
+  nonstd::unique_ptr<CFX_FxgeDevice> m_pBitmapDevice;
   CFX_AffineMatrix m_Matrix;
 };
+
 class ICodec_ScanlineDecoder;
 class CPDF_QuickStretcher {
  public:
@@ -421,6 +426,7 @@
   CPDF_StreamAcc m_StreamAcc;
   int m_LineIndex;
 };
+
 class CPDF_DeviceBuffer {
  public:
   CPDF_DeviceBuffer();
@@ -431,7 +437,7 @@
                      const CPDF_PageObject* pObj,
                      int max_dpi = 0);
   void OutputToDevice();
-  CFX_DIBitmap* GetBitmap() const { return m_pBitmap; }
+  CFX_DIBitmap* GetBitmap() const { return m_pBitmap.get(); }
   const CFX_AffineMatrix* GetMatrix() const { return &m_Matrix; }
 
  private:
@@ -439,9 +445,10 @@
   CPDF_RenderContext* m_pContext;
   FX_RECT m_Rect;
   const CPDF_PageObject* m_pObject;
-  CFX_DIBitmap* m_pBitmap;
+  nonstd::unique_ptr<CFX_DIBitmap> m_pBitmap;
   CFX_AffineMatrix m_Matrix;
 };
+
 class CPDF_ImageCache {
  public:
   CPDF_ImageCache(CPDF_Document* pDoc, CPDF_Stream* pStream);
