From 490d6128e6faef423fa6f965f792513e138bc04a Mon Sep 17 00:00:00 2001 From: thestig Date: Mon, 23 May 2016 14:56:02 -0700 Subject: Make CPDF_Function::Load() return an unique_ptr. Review-Url: https://codereview.chromium.org/2000973002 --- core/fpdfapi/fpdf_page/cpdf_colorspace.cpp | 105 +++++++++++++---------------- 1 file changed, 48 insertions(+), 57 deletions(-) (limited to 'core/fpdfapi/fpdf_page/cpdf_colorspace.cpp') diff --git a/core/fpdfapi/fpdf_page/cpdf_colorspace.cpp b/core/fpdfapi/fpdf_page/cpdf_colorspace.cpp index 77e8c00d20..d66b920f07 100644 --- a/core/fpdfapi/fpdf_page/cpdf_colorspace.cpp +++ b/core/fpdfapi/fpdf_page/cpdf_colorspace.cpp @@ -6,6 +6,8 @@ #include "core/fpdfapi/fpdf_page/include/cpdf_colorspace.h" +#include + #include "core/fpdfapi/fpdf_page/cpdf_pagemodule.h" #include "core/fpdfapi/fpdf_page/pageint.h" #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h" @@ -220,7 +222,7 @@ class CPDF_SeparationCS : public CPDF_ColorSpace { void EnableStdConversion(FX_BOOL bEnabled) override; CPDF_ColorSpace* m_pAltCS; - CPDF_Function* m_pFunc; + std::unique_ptr m_pFunc; enum { None, All, Colorant } m_Type; }; @@ -242,7 +244,7 @@ class CPDF_DeviceNCS : public CPDF_ColorSpace { void EnableStdConversion(FX_BOOL bEnabled) override; CPDF_ColorSpace* m_pAltCS; - CPDF_Function* m_pFunc; + std::unique_ptr m_pFunc; }; FX_FLOAT RGB_Conversion(FX_FLOAT colorComponent) { @@ -1098,15 +1100,11 @@ CPDF_ColorSpace* CPDF_PatternCS::GetBaseCS() const { } CPDF_SeparationCS::CPDF_SeparationCS(CPDF_Document* pDoc) - : CPDF_ColorSpace(pDoc, PDFCS_SEPARATION, 1), - m_pAltCS(nullptr), - m_pFunc(nullptr) {} + : CPDF_ColorSpace(pDoc, PDFCS_SEPARATION, 1), m_pAltCS(nullptr) {} CPDF_SeparationCS::~CPDF_SeparationCS() { - if (m_pAltCS) { + if (m_pAltCS) m_pAltCS->ReleaseCS(); - } - delete m_pFunc; } void CPDF_SeparationCS::GetDefaultValue(int iComponent, @@ -1122,25 +1120,24 @@ FX_BOOL CPDF_SeparationCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) { CFX_ByteString name = pArray->GetStringAt(1); if (name == "None") { m_Type = None; - } else { - m_Type = Colorant; - CPDF_Object* pAltCS = pArray->GetDirectObjectAt(2); - if (pAltCS == m_pArray) { - return FALSE; - } - m_pAltCS = Load(pDoc, pAltCS); - if (!m_pAltCS) { - return FALSE; - } - CPDF_Object* pFuncObj = pArray->GetDirectObjectAt(3); - if (pFuncObj && !pFuncObj->IsName()) - m_pFunc = CPDF_Function::Load(pFuncObj); - - if (m_pFunc && m_pFunc->CountOutputs() < m_pAltCS->CountComponents()) { - delete m_pFunc; - m_pFunc = NULL; - } + return TRUE; } + + m_Type = Colorant; + CPDF_Object* pAltCS = pArray->GetDirectObjectAt(2); + if (pAltCS == m_pArray) + return FALSE; + + m_pAltCS = Load(pDoc, pAltCS); + if (!m_pAltCS) + return FALSE; + + CPDF_Object* pFuncObj = pArray->GetDirectObjectAt(3); + if (pFuncObj && !pFuncObj->IsName()) + m_pFunc = CPDF_Function::Load(pFuncObj); + + if (m_pFunc && m_pFunc->CountOutputs() < m_pAltCS->CountComponents()) + m_pFunc.reset(); return TRUE; } @@ -1148,50 +1145,47 @@ FX_BOOL CPDF_SeparationCS::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const { - if (m_Type == None) { + if (m_Type == None) return FALSE; - } + if (!m_pFunc) { - if (!m_pAltCS) { + if (!m_pAltCS) return FALSE; - } + int nComps = m_pAltCS->CountComponents(); CFX_FixedBufGrow results(nComps); - for (int i = 0; i < nComps; i++) { + for (int i = 0; i < nComps; i++) results[i] = *pBuf; - } return m_pAltCS->GetRGB(results, R, G, B); } + CFX_FixedBufGrow results(m_pFunc->CountOutputs()); int nresults = 0; m_pFunc->Call(pBuf, 1, results, nresults); - if (nresults == 0) { + if (nresults == 0) return FALSE; - } - if (m_pAltCS) { + + if (m_pAltCS) return m_pAltCS->GetRGB(results, R, G, B); - } - R = G = B = 0; + + R = 0; + G = 0; + B = 0; return FALSE; } void CPDF_SeparationCS::EnableStdConversion(FX_BOOL bEnabled) { CPDF_ColorSpace::EnableStdConversion(bEnabled); - if (m_pAltCS) { + if (m_pAltCS) m_pAltCS->EnableStdConversion(bEnabled); - } } CPDF_DeviceNCS::CPDF_DeviceNCS(CPDF_Document* pDoc) - : CPDF_ColorSpace(pDoc, PDFCS_DEVICEN, 0), - m_pAltCS(nullptr), - m_pFunc(nullptr) {} + : CPDF_ColorSpace(pDoc, PDFCS_DEVICEN, 0), m_pAltCS(nullptr) {} CPDF_DeviceNCS::~CPDF_DeviceNCS() { - delete m_pFunc; - if (m_pAltCS) { + if (m_pAltCS) m_pAltCS->ReleaseCS(); - } } void CPDF_DeviceNCS::GetDefaultValue(int iComponent, @@ -1210,33 +1204,30 @@ FX_BOOL CPDF_DeviceNCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) { m_nComponents = pObj->GetCount(); CPDF_Object* pAltCS = pArray->GetDirectObjectAt(2); - if (!pAltCS || pAltCS == m_pArray) { + if (!pAltCS || pAltCS == m_pArray) return FALSE; - } + m_pAltCS = Load(pDoc, pAltCS); m_pFunc = CPDF_Function::Load(pArray->GetDirectObjectAt(3)); - if (!m_pAltCS || !m_pFunc) { - return FALSE; - } - if (m_pFunc->CountOutputs() < m_pAltCS->CountComponents()) { + if (!m_pAltCS || !m_pFunc) return FALSE; - } - return TRUE; + + return m_pFunc->CountOutputs() >= m_pAltCS->CountComponents(); } FX_BOOL CPDF_DeviceNCS::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const { - if (!m_pFunc) { + if (!m_pFunc) return FALSE; - } + CFX_FixedBufGrow results(m_pFunc->CountOutputs()); int nresults = 0; m_pFunc->Call(pBuf, m_nComponents, results, nresults); - if (nresults == 0) { + if (nresults == 0) return FALSE; - } + return m_pAltCS->GetRGB(results, R, G, B); } -- cgit v1.2.3