| Index: core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp
|
| diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp
|
| index c522dcdc840b6f2210dcd1dd29dc03abb22f804d..5266c1a05245757026fafa44c0e664c8da321569 100644
|
| --- a/core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp
|
| +++ b/core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp
|
| @@ -760,6 +760,7 @@ public:
|
| }
|
| virtual void EnableStdConversion(FX_BOOL bEnabled);
|
| CPDF_ColorSpace* m_pBaseCS;
|
| + CPDF_CountedColorSpace* m_pCountedBaseCS;
|
| int m_nBaseComponents;
|
| int m_MaxIndex;
|
| CFX_ByteString m_Table;
|
| @@ -768,6 +769,7 @@ public:
|
| CPDF_IndexedCS::CPDF_IndexedCS()
|
| {
|
| m_pBaseCS = NULL;
|
| + m_pCountedBaseCS = NULL;
|
| m_Family = PDFCS_INDEXED;
|
| m_nComponents = 1;
|
| m_pCompMinMax = NULL;
|
| @@ -777,6 +779,10 @@ CPDF_IndexedCS::~CPDF_IndexedCS()
|
| if (m_pCompMinMax) {
|
| FX_Free(m_pCompMinMax);
|
| }
|
| + CPDF_ColorSpace* pCS = m_pCountedBaseCS ? m_pCountedBaseCS->m_Obj : NULL;
|
| + if (pCS && m_pDocument) {
|
| + m_pDocument->GetPageData()->ReleaseColorSpace(pCS->GetArray());
|
| + }
|
| }
|
| FX_BOOL CPDF_IndexedCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)
|
| {
|
| @@ -792,6 +798,7 @@ FX_BOOL CPDF_IndexedCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)
|
| if (m_pBaseCS == NULL) {
|
| return FALSE;
|
| }
|
| + m_pCountedBaseCS = pDocPageData->FindColorSpacePtr(m_pBaseCS->GetArray());
|
| m_nBaseComponents = m_pBaseCS->CountComponents();
|
| m_pCompMinMax = FX_Alloc(FX_FLOAT, m_nBaseComponents * 2);
|
| FX_FLOAT defvalue;
|
| @@ -845,6 +852,7 @@ void CPDF_IndexedCS::EnableStdConversion(FX_BOOL bEnabled)
|
| #define MAX_PATTERN_COLORCOMPS 16
|
| typedef struct _PatternValue {
|
| CPDF_Pattern* m_pPattern;
|
| + CPDF_CountedPattern* m_pCountedPattern;
|
| int m_nComps;
|
| FX_FLOAT m_Comps[MAX_PATTERN_COLORCOMPS];
|
| } PatternValue;
|
| @@ -853,9 +861,14 @@ CPDF_PatternCS::CPDF_PatternCS()
|
| m_Family = PDFCS_PATTERN;
|
| m_pBaseCS = NULL;
|
| m_nComponents = 1;
|
| + m_pCountedBaseCS = NULL;
|
| }
|
| CPDF_PatternCS::~CPDF_PatternCS()
|
| {
|
| + CPDF_ColorSpace* pCS = m_pCountedBaseCS ? m_pCountedBaseCS->m_Obj : NULL;
|
| + if (pCS && m_pDocument) {
|
| + m_pDocument->GetPageData()->ReleaseColorSpace(pCS->GetArray());
|
| + }
|
| }
|
| FX_BOOL CPDF_PatternCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)
|
| {
|
| @@ -869,6 +882,7 @@ FX_BOOL CPDF_PatternCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)
|
| if (m_pBaseCS->GetFamily() == PDFCS_PATTERN) {
|
| return FALSE;
|
| }
|
| + m_pCountedBaseCS = pDocPageData->FindColorSpacePtr(m_pBaseCS->GetArray());
|
| m_nComponents = m_pBaseCS->CountComponents() + 1;
|
| if (m_pBaseCS->CountComponents() > MAX_PATTERN_COLORCOMPS) {
|
| return FALSE;
|
| @@ -1291,10 +1305,10 @@ void CPDF_Color::ReleaseBuffer()
|
| }
|
| if (m_pCS->GetFamily() == PDFCS_PATTERN) {
|
| PatternValue* pvalue = (PatternValue*)m_pBuffer;
|
| - CPDF_Pattern* pPattern = pvalue->m_pPattern;
|
| + CPDF_Pattern* pPattern = pvalue->m_pCountedPattern ? pvalue->m_pCountedPattern->m_Obj : NULL;
|
| if (pPattern && pPattern->m_pDocument) {
|
| CPDF_DocPageData *pPageData = pPattern->m_pDocument->GetPageData();
|
| - if (pPageData && !pPageData->IsForceClear()) {
|
| + if (pPageData) {
|
| pPageData->ReleasePattern(pPattern->m_pPatternObj);
|
| }
|
| }
|
| @@ -1348,10 +1362,11 @@ void CPDF_Color::SetValue(CPDF_Pattern* pPattern, FX_FLOAT* comps, int ncomps)
|
| m_pCS = CPDF_ColorSpace::GetStockCS(PDFCS_PATTERN);
|
| m_pBuffer = m_pCS->CreateBuf();
|
| }
|
| + CPDF_DocPageData *pDocPageData = NULL;
|
| PatternValue* pvalue = (PatternValue*)m_pBuffer;
|
| if (pvalue->m_pPattern && pvalue->m_pPattern->m_pDocument) {
|
| - CPDF_DocPageData *pDocPageData = pvalue->m_pPattern->m_pDocument->GetPageData();
|
| - if (pDocPageData && !pDocPageData->IsForceClear()) {
|
| + pDocPageData = pvalue->m_pPattern->m_pDocument->GetPageData();
|
| + if (pDocPageData) {
|
| pDocPageData->ReleasePattern(pvalue->m_pPattern->m_pPatternObj);
|
| }
|
| }
|
| @@ -1360,6 +1375,14 @@ void CPDF_Color::SetValue(CPDF_Pattern* pPattern, FX_FLOAT* comps, int ncomps)
|
| if (ncomps) {
|
| FXSYS_memcpy32(pvalue->m_Comps, comps, ncomps * sizeof(FX_FLOAT));
|
| }
|
| + pvalue->m_pCountedPattern = NULL;
|
| + if (pPattern && pPattern->m_pDocument)
|
| + {
|
| + if (!pDocPageData) {
|
| + pDocPageData = pPattern->m_pDocument->GetPageData();
|
| + }
|
| + pvalue->m_pCountedPattern = pDocPageData->FindPatternPtr(pPattern->m_pPatternObj);
|
| + }
|
| }
|
| void CPDF_Color::Copy(const CPDF_Color* pSrc)
|
| {
|
|
|