Index: core/src/fpdfapi/fpdf_render/fpdf_render.cpp |
diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render.cpp |
index e5b4b6672101251fadd17fbf35f096b8aea0e492..78fb3492dcc48772e5571f647cb27d4c33105696 100644 |
--- a/core/src/fpdfapi/fpdf_render/fpdf_render.cpp |
+++ b/core/src/fpdfapi/fpdf_render/fpdf_render.cpp |
@@ -156,30 +156,27 @@ FX_ARGB CPDF_RenderOptions::TranslateColor(FX_ARGB argb) const { |
// 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 @@ FX_BOOL CPDF_RenderStatus::Initialize(CPDF_RenderContext* pContext, |
} else { |
m_InitialStates.DefaultStates(); |
} |
- m_pObjectRenderer = NULL; |
+ m_pObjectRenderer.reset(); |
m_Transparency = transparency; |
return TRUE; |
} |
@@ -292,45 +289,46 @@ void CPDF_RenderStatus::RenderSingleObject( |
} |
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 @@ FX_ARGB CPDF_RenderStatus::GetStrokeArgb(const CPDF_PageObject* pObj) const { |
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 @@ FX_BOOL CPDF_RenderStatus::ProcessTransparency( |
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 @@ FX_BOOL CPDF_RenderStatus::ProcessTransparency( |
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 @@ FX_BOOL CPDF_RenderStatus::ProcessTransparency( |
} |
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 @@ CFX_DIBitmap* CPDF_RenderStatus::GetBackdrop(const CPDF_PageObject* pObj, |
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 @@ CPDF_TransferFunc* CPDF_DocRenderData::GetTransferFunc(CPDF_Object* pObj) { |
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 @@ CPDF_TransferFunc* CPDF_DocRenderData::GetTransferFunc(CPDF_Object* pObj) { |
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 @@ CPDF_TransferFunc* CPDF_DocRenderData::GetTransferFunc(CPDF_Object* pObj) { |
} |
} |
} |
- for (int i = 0; i < 3; ++i) |
- delete pFuncs[i]; |
pTransfer->m_bIdentity = bIdentity; |
return pTransferCounter->AddRef(); |
@@ -1295,15 +1284,13 @@ CPDF_RenderConfig::CPDF_RenderConfig() { |
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 @@ FX_BOOL CPDF_DeviceBuffer::Initialize(CPDF_RenderContext* pContext, |
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 @@ void CPDF_DeviceBuffer::OutputToDevice() { |
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 @@ FX_BOOL CPDF_ScaledRenderBuffer::Initialize(CPDF_RenderContext* pContext, |
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) { |