| Index: xfa/fxfa/app/xfa_ffwidget.cpp
|
| diff --git a/xfa/fxfa/app/xfa_ffwidget.cpp b/xfa/fxfa/app/xfa_ffwidget.cpp
|
| index bc1854eb4262c2b7e6aa2ac0c88dd066bc48a20e..dfe418b76be026c7c5739515c3b726e2a340bb56 100644
|
| --- a/xfa/fxfa/app/xfa_ffwidget.cpp
|
| +++ b/xfa/fxfa/app/xfa_ffwidget.cpp
|
| @@ -13,6 +13,7 @@
|
| #include "core/fpdfapi/page/cpdf_pageobjectholder.h"
|
| #include "core/fxcodec/codec/ccodec_progressivedecoder.h"
|
| #include "core/fxcodec/fx_codec.h"
|
| +#include "core/fxcrt/cfx_maybe_owned.h"
|
| #include "core/fxge/cfx_gemodule.h"
|
| #include "core/fxge/cfx_pathdata.h"
|
| #include "core/fxge/cfx_renderdevice.h"
|
| @@ -647,7 +648,7 @@ bool CXFA_ImageRenderer::StartDIBSource() {
|
| if (m_pDIBSource->HasAlpha() &&
|
| !(m_pDevice->GetRenderCaps() & FXRC_ALPHA_IMAGE) &&
|
| !(m_pDevice->GetRenderCaps() & FXRC_GET_BITS)) {
|
| - m_pCloneConvert.reset(m_pDIBSource->CloneConvert(FXDIB_Rgb));
|
| + m_pCloneConvert = m_pDIBSource->CloneConvert(FXDIB_Rgb);
|
| if (!m_pCloneConvert) {
|
| m_Result = false;
|
| return false;
|
| @@ -783,10 +784,8 @@ void CXFA_ImageRenderer::CompositeDIBitmap(CFX_DIBitmap* pDIBitmap,
|
| FX_RECT rect(left, top, left + pDIBitmap->GetWidth(),
|
| top + pDIBitmap->GetHeight());
|
| rect.Intersect(m_pDevice->GetClipBox());
|
| - CFX_DIBitmap* pClone = nullptr;
|
| - bool bClone = false;
|
| + CFX_MaybeOwned<CFX_DIBitmap> pClone;
|
| if (m_pDevice->GetBackDrop() && m_pDevice->GetBitmap()) {
|
| - bClone = true;
|
| pClone = m_pDevice->GetBackDrop()->Clone(&rect);
|
| CFX_DIBitmap* pForeBitmap = m_pDevice->GetBitmap();
|
| pClone->CompositeBitmap(0, 0, pClone->GetWidth(), pClone->GetHeight(),
|
| @@ -803,35 +802,34 @@ void CXFA_ImageRenderer::CompositeDIBitmap(CFX_DIBitmap* pDIBitmap,
|
| pClone = pDIBitmap;
|
| }
|
| if (m_pDevice->GetBackDrop()) {
|
| - m_pDevice->SetDIBits(pClone, rect.left, rect.top);
|
| + m_pDevice->SetDIBits(pClone.Get(), rect.left, rect.top);
|
| } else {
|
| if (pDIBitmap->IsAlphaMask())
|
| return;
|
| m_pDevice->SetDIBitsWithBlend(pDIBitmap, rect.left, rect.top,
|
| blend_mode);
|
| }
|
| - if (bClone) {
|
| - delete pClone;
|
| - }
|
| }
|
| return;
|
| }
|
| - if (pDIBitmap->HasAlpha() &&
|
| - !(m_pDevice->GetRenderCaps() & FXRC_ALPHA_IMAGE)) {
|
| - CFX_DIBitmap* pCloneConvert = pDIBitmap->CloneConvert(FXDIB_Rgb);
|
| - if (!pCloneConvert) {
|
| - return;
|
| - }
|
| - CXFA_ImageRenderer imageRender;
|
| - bool bRet = imageRender.Start(m_pDevice, pCloneConvert, m_FillArgb,
|
| - m_BitmapAlpha, &m_ImageMatrix, m_Flags);
|
| - while (bRet) {
|
| - bRet = imageRender.Continue(nullptr);
|
| - }
|
| - delete pCloneConvert;
|
| + if (!pDIBitmap->HasAlpha() ||
|
| + (m_pDevice->GetRenderCaps() & FXRC_ALPHA_IMAGE)) {
|
| + return;
|
| + }
|
| + std::unique_ptr<CFX_DIBitmap> pCloneConvert =
|
| + pDIBitmap->CloneConvert(FXDIB_Rgb);
|
| + if (!pCloneConvert)
|
| + return;
|
| +
|
| + CXFA_ImageRenderer imageRender;
|
| + if (!imageRender.Start(m_pDevice, pCloneConvert.get(), m_FillArgb,
|
| + m_BitmapAlpha, &m_ImageMatrix, m_Flags)) {
|
| return;
|
| }
|
| + while (imageRender.Continue(nullptr))
|
| + continue;
|
| }
|
| +
|
| void XFA_DrawImage(CFX_Graphics* pGS,
|
| const CFX_RectF& rtImage,
|
| CFX_Matrix* pMatrix,
|
|
|