Index: 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 88a74f01899ac239a3503669bc178e37c67b7323..87607648b697925660876a30d827aca75509384f 100644 |
--- a/core/fpdfapi/fpdf_page/cpdf_colorspace.cpp |
+++ b/core/fpdfapi/fpdf_page/cpdf_colorspace.cpp |
@@ -221,7 +221,7 @@ class CPDF_SeparationCS : public CPDF_ColorSpace { |
FX_FLOAT& B) const override; |
void EnableStdConversion(FX_BOOL bEnabled) override; |
- CPDF_ColorSpace* m_pAltCS; |
+ std::unique_ptr<CPDF_ColorSpace> m_pAltCS; |
std::unique_ptr<CPDF_Function> m_pFunc; |
enum { None, All, Colorant } m_Type; |
}; |
@@ -243,7 +243,7 @@ class CPDF_DeviceNCS : public CPDF_ColorSpace { |
FX_FLOAT& B) const override; |
void EnableStdConversion(FX_BOOL bEnabled) override; |
- CPDF_ColorSpace* m_pAltCS; |
+ std::unique_ptr<CPDF_ColorSpace> m_pAltCS; |
std::unique_ptr<CPDF_Function> m_pFunc; |
}; |
@@ -313,18 +313,14 @@ void XYZ_to_sRGB_WhitePoint(FX_FLOAT X, |
CPDF_ColorSpace* CPDF_ColorSpace::ColorspaceFromName( |
const CFX_ByteString& name) { |
- if (name == "DeviceRGB" || name == "RGB") { |
+ if (name == "DeviceRGB" || name == "RGB") |
return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB); |
- } |
- if (name == "DeviceGray" || name == "G") { |
+ if (name == "DeviceGray" || name == "G") |
return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY); |
- } |
- if (name == "DeviceCMYK" || name == "CMYK") { |
+ if (name == "DeviceCMYK" || name == "CMYK") |
return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICECMYK); |
- } |
- if (name == "Pattern") { |
+ if (name == "Pattern") |
return CPDF_ColorSpace::GetStockCS(PDFCS_PATTERN); |
- } |
return nullptr; |
} |
@@ -332,81 +328,77 @@ CPDF_ColorSpace* CPDF_ColorSpace::GetStockCS(int family) { |
return CPDF_ModuleMgr::Get()->GetPageModule()->GetStockCS(family); |
} |
-CPDF_ColorSpace* CPDF_ColorSpace::Load(CPDF_Document* pDoc, CPDF_Object* pObj) { |
+std::unique_ptr<CPDF_ColorSpace> CPDF_ColorSpace::Load(CPDF_Document* pDoc, |
+ CPDF_Object* pObj) { |
if (!pObj) |
- return nullptr; |
- if (pObj->IsName()) |
- return ColorspaceFromName(pObj->GetString()); |
+ return std::unique_ptr<CPDF_ColorSpace>(); |
+ if (pObj->IsName()) { |
+ return std::unique_ptr<CPDF_ColorSpace>( |
+ ColorspaceFromName(pObj->GetString())); |
+ } |
if (CPDF_Stream* pStream = pObj->AsStream()) { |
CPDF_Dictionary* pDict = pStream->GetDict(); |
if (!pDict) |
- return nullptr; |
+ return std::unique_ptr<CPDF_ColorSpace>(); |
for (const auto& it : *pDict) { |
- CPDF_ColorSpace* pRet = nullptr; |
+ std::unique_ptr<CPDF_ColorSpace> pRet; |
CPDF_Object* pValue = it.second; |
if (ToName(pValue)) |
- pRet = ColorspaceFromName(pValue->GetString()); |
+ pRet.reset(ColorspaceFromName(pValue->GetString())); |
if (pRet) |
return pRet; |
} |
- return nullptr; |
+ return std::unique_ptr<CPDF_ColorSpace>(); |
} |
CPDF_Array* pArray = pObj->AsArray(); |
if (!pArray || pArray->IsEmpty()) |
- return nullptr; |
+ return std::unique_ptr<CPDF_ColorSpace>(); |
CPDF_Object* pFamilyObj = pArray->GetDirectObjectAt(0); |
if (!pFamilyObj) |
- return nullptr; |
+ return std::unique_ptr<CPDF_ColorSpace>(); |
CFX_ByteString familyname = pFamilyObj->GetString(); |
if (pArray->GetCount() == 1) |
- return ColorspaceFromName(familyname); |
+ return std::unique_ptr<CPDF_ColorSpace>(ColorspaceFromName(familyname)); |
- CPDF_ColorSpace* pCS = nullptr; |
+ std::unique_ptr<CPDF_ColorSpace> pCS; |
uint32_t id = familyname.GetID(); |
if (id == FXBSTR_ID('C', 'a', 'l', 'G')) { |
- pCS = new CPDF_CalGray(pDoc); |
+ pCS.reset(new CPDF_CalGray(pDoc)); |
} else if (id == FXBSTR_ID('C', 'a', 'l', 'R')) { |
- pCS = new CPDF_CalRGB(pDoc); |
+ pCS.reset(new CPDF_CalRGB(pDoc)); |
} else if (id == FXBSTR_ID('L', 'a', 'b', 0)) { |
- pCS = new CPDF_LabCS(pDoc); |
+ pCS.reset(new CPDF_LabCS(pDoc)); |
} else if (id == FXBSTR_ID('I', 'C', 'C', 'B')) { |
- pCS = new CPDF_ICCBasedCS(pDoc); |
+ pCS.reset(new CPDF_ICCBasedCS(pDoc)); |
} else if (id == FXBSTR_ID('I', 'n', 'd', 'e') || |
id == FXBSTR_ID('I', 0, 0, 0)) { |
- pCS = new CPDF_IndexedCS(pDoc); |
+ pCS.reset(new CPDF_IndexedCS(pDoc)); |
} else if (id == FXBSTR_ID('S', 'e', 'p', 'a')) { |
- pCS = new CPDF_SeparationCS(pDoc); |
+ pCS.reset(new CPDF_SeparationCS(pDoc)); |
} else if (id == FXBSTR_ID('D', 'e', 'v', 'i')) { |
- pCS = new CPDF_DeviceNCS(pDoc); |
+ pCS.reset(new CPDF_DeviceNCS(pDoc)); |
} else if (id == FXBSTR_ID('P', 'a', 't', 't')) { |
- pCS = new CPDF_PatternCS(pDoc); |
+ pCS.reset(new CPDF_PatternCS(pDoc)); |
} else { |
- return nullptr; |
+ return std::unique_ptr<CPDF_ColorSpace>(); |
} |
pCS->m_pArray = pArray; |
- if (!pCS->v_Load(pDoc, pArray)) { |
- pCS->ReleaseCS(); |
- return nullptr; |
- } |
+ if (!pCS->v_Load(pDoc, pArray)) |
+ return std::unique_ptr<CPDF_ColorSpace>(); |
+ |
return pCS; |
} |
-void CPDF_ColorSpace::ReleaseCS() { |
- if (this == GetStockCS(PDFCS_DEVICERGB)) { |
- return; |
- } |
- if (this == GetStockCS(PDFCS_DEVICEGRAY)) { |
- return; |
- } |
- if (this == GetStockCS(PDFCS_DEVICECMYK)) { |
- return; |
- } |
- if (this == GetStockCS(PDFCS_PATTERN)) { |
+void CPDF_ColorSpace::Release() { |
+ if (this == GetStockCS(PDFCS_DEVICERGB) || |
+ this == GetStockCS(PDFCS_DEVICEGRAY) || |
+ this == GetStockCS(PDFCS_DEVICECMYK) || |
+ this == GetStockCS(PDFCS_PATTERN)) { |
return; |
} |
delete this; |
@@ -832,7 +824,7 @@ CPDF_ICCBasedCS::~CPDF_ICCBasedCS() { |
FX_Free(m_pCache); |
FX_Free(m_pRanges); |
if (m_pAlterCS && m_bOwn) |
- m_pAlterCS->ReleaseCS(); |
+ m_pAlterCS->Release(); |
if (m_pProfile && m_pDocument) |
m_pDocument->GetPageData()->ReleaseIccProfile(m_pProfile); |
} |
@@ -854,15 +846,15 @@ FX_BOOL CPDF_ICCBasedCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) { |
CPDF_Object* pAlterCSObj = |
pDict ? pDict->GetDirectObjectFor("Alternate") : nullptr; |
if (pAlterCSObj) { |
- CPDF_ColorSpace* pAlterCS = CPDF_ColorSpace::Load(pDoc, pAlterCSObj); |
+ std::unique_ptr<CPDF_ColorSpace> pAlterCS = |
+ CPDF_ColorSpace::Load(pDoc, pAlterCSObj); |
if (pAlterCS) { |
if (m_nComponents == 0) { // NO valid ICC profile |
if (pAlterCS->CountComponents() > 0) { // Use Alternative colorspace |
m_nComponents = pAlterCS->CountComponents(); |
- m_pAlterCS = pAlterCS; |
+ m_pAlterCS = pAlterCS.release(); |
m_bOwn = TRUE; |
} else { // No valid alternative colorspace |
- pAlterCS->ReleaseCS(); |
int32_t nDictComponents = pDict ? pDict->GetIntegerFor("N") : 0; |
if (nDictComponents != 1 && nDictComponents != 3 && |
nDictComponents != 4) { |
@@ -870,12 +862,9 @@ FX_BOOL CPDF_ICCBasedCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) { |
} |
m_nComponents = nDictComponents; |
} |
- |
} else { // Using sRGB |
- if (pAlterCS->CountComponents() != m_nComponents) { |
- pAlterCS->ReleaseCS(); |
- } else { |
- m_pAlterCS = pAlterCS; |
+ if (pAlterCS->CountComponents() == m_nComponents) { |
+ m_pAlterCS = pAlterCS.release(); |
m_bOwn = TRUE; |
} |
} |
@@ -1155,12 +1144,9 @@ CPDF_ColorSpace* CPDF_PatternCS::GetBaseCS() const { |
} |
CPDF_SeparationCS::CPDF_SeparationCS(CPDF_Document* pDoc) |
- : CPDF_ColorSpace(pDoc, PDFCS_SEPARATION, 1), m_pAltCS(nullptr) {} |
+ : CPDF_ColorSpace(pDoc, PDFCS_SEPARATION, 1) {} |
-CPDF_SeparationCS::~CPDF_SeparationCS() { |
- if (m_pAltCS) |
- m_pAltCS->ReleaseCS(); |
-} |
+CPDF_SeparationCS::~CPDF_SeparationCS() {} |
void CPDF_SeparationCS::GetDefaultValue(int iComponent, |
FX_FLOAT& value, |
@@ -1236,12 +1222,9 @@ void CPDF_SeparationCS::EnableStdConversion(FX_BOOL bEnabled) { |
} |
CPDF_DeviceNCS::CPDF_DeviceNCS(CPDF_Document* pDoc) |
- : CPDF_ColorSpace(pDoc, PDFCS_DEVICEN, 0), m_pAltCS(nullptr) {} |
+ : CPDF_ColorSpace(pDoc, PDFCS_DEVICEN, 0) {} |
-CPDF_DeviceNCS::~CPDF_DeviceNCS() { |
- if (m_pAltCS) |
- m_pAltCS->ReleaseCS(); |
-} |
+CPDF_DeviceNCS::~CPDF_DeviceNCS() {} |
void CPDF_DeviceNCS::GetDefaultValue(int iComponent, |
FX_FLOAT& value, |