| Index: core/src/fpdfapi/fpdf_render/fpdf_render_image.cpp | 
| diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render_image.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render_image.cpp | 
| index b51520aa8486cbea21ec39c738fec3f0cef91826..0a451676323a9c665cca344a533a99796d8f9e34 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 @@ void CPDF_RenderStatus::CompositeDIBitmap(CFX_DIBitmap* pDIBitmap, | 
| 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_BOOL CPDF_ImageRenderer::StartDIBSource() { | 
| 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 @@ FX_BOOL CPDF_ImageRenderer::StartBitmapAlpha() { | 
| 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 @@ CFX_DIBitmap* CPDF_RenderStatus::LoadSMask(CPDF_Dictionary* pSMaskDict, | 
| 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 @@ CFX_DIBitmap* CPDF_RenderStatus::LoadSMask(CPDF_Dictionary* pSMaskDict, | 
| 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 @@ CFX_DIBitmap* CPDF_RenderStatus::LoadSMask(CPDF_Dictionary* pSMaskDict, | 
| &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 @@ CFX_DIBitmap* CPDF_RenderStatus::LoadSMask(CPDF_Dictionary* pSMaskDict, | 
| 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(); | 
| } | 
|  |