| OLD | NEW |
| 1 // Copyright 2016 PDFium Authors. All rights reserved. | 1 // Copyright 2016 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 | 6 |
| 7 #include "core/fpdfapi/fpdf_page/include/cpdf_color.h" | 7 #include "core/fpdfapi/fpdf_page/include/cpdf_color.h" |
| 8 | 8 |
| 9 #include "core/fpdfapi/fpdf_page/pageint.h" | 9 #include "core/fpdfapi/fpdf_page/pageint.h" |
| 10 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h" | 10 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h" |
| 11 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h" | 11 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h" |
| 12 #include "core/fxcrt/include/fx_system.h" | 12 #include "core/fxcrt/include/fx_system.h" |
| 13 | 13 |
| 14 CPDF_Color::CPDF_Color(int family) { | 14 CPDF_Color::CPDF_Color() : m_pCS(nullptr), m_pBuffer(nullptr) {} |
| 15 m_pCS = CPDF_ColorSpace::GetStockCS(family); | |
| 16 int nComps = 3; | |
| 17 if (family == PDFCS_DEVICEGRAY) | |
| 18 nComps = 1; | |
| 19 else if (family == PDFCS_DEVICECMYK) | |
| 20 nComps = 4; | |
| 21 | |
| 22 m_pBuffer = FX_Alloc(FX_FLOAT, nComps); | |
| 23 for (int i = 0; i < nComps; i++) | |
| 24 m_pBuffer[i] = 0; | |
| 25 } | |
| 26 | 15 |
| 27 CPDF_Color::~CPDF_Color() { | 16 CPDF_Color::~CPDF_Color() { |
| 28 ReleaseBuffer(); | 17 ReleaseBuffer(); |
| 29 ReleaseColorSpace(); | 18 ReleaseColorSpace(); |
| 30 } | 19 } |
| 31 | 20 |
| 21 bool CPDF_Color::IsPattern() const { |
| 22 return m_pCS && m_pCS->GetFamily() == PDFCS_PATTERN; |
| 23 } |
| 24 |
| 32 void CPDF_Color::ReleaseBuffer() { | 25 void CPDF_Color::ReleaseBuffer() { |
| 33 if (!m_pBuffer) | 26 if (!m_pBuffer) |
| 34 return; | 27 return; |
| 35 | 28 |
| 36 if (m_pCS->GetFamily() == PDFCS_PATTERN) { | 29 if (m_pCS->GetFamily() == PDFCS_PATTERN) { |
| 37 PatternValue* pvalue = (PatternValue*)m_pBuffer; | 30 PatternValue* pvalue = (PatternValue*)m_pBuffer; |
| 38 CPDF_Pattern* pPattern = | 31 CPDF_Pattern* pPattern = |
| 39 pvalue->m_pCountedPattern ? pvalue->m_pCountedPattern->get() : nullptr; | 32 pvalue->m_pCountedPattern ? pvalue->m_pCountedPattern->get() : nullptr; |
| 40 if (pPattern && pPattern->document()) { | 33 if (pPattern && pPattern->document()) { |
| 41 CPDF_DocPageData* pPageData = pPattern->document()->GetPageData(); | 34 CPDF_DocPageData* pPageData = pPattern->document()->GetPageData(); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 77 if (!m_pBuffer) | 70 if (!m_pBuffer) |
| 78 return; | 71 return; |
| 79 if (m_pCS->GetFamily() != PDFCS_PATTERN) | 72 if (m_pCS->GetFamily() != PDFCS_PATTERN) |
| 80 FXSYS_memcpy(m_pBuffer, comps, m_pCS->CountComponents() * sizeof(FX_FLOAT)); | 73 FXSYS_memcpy(m_pBuffer, comps, m_pCS->CountComponents() * sizeof(FX_FLOAT)); |
| 81 } | 74 } |
| 82 | 75 |
| 83 void CPDF_Color::SetValue(CPDF_Pattern* pPattern, FX_FLOAT* comps, int ncomps) { | 76 void CPDF_Color::SetValue(CPDF_Pattern* pPattern, FX_FLOAT* comps, int ncomps) { |
| 84 if (ncomps > MAX_PATTERN_COLORCOMPS) | 77 if (ncomps > MAX_PATTERN_COLORCOMPS) |
| 85 return; | 78 return; |
| 86 | 79 |
| 87 if (!m_pCS || m_pCS->GetFamily() != PDFCS_PATTERN) { | 80 if (!IsPattern()) { |
| 88 FX_Free(m_pBuffer); | 81 FX_Free(m_pBuffer); |
| 89 m_pCS = CPDF_ColorSpace::GetStockCS(PDFCS_PATTERN); | 82 m_pCS = CPDF_ColorSpace::GetStockCS(PDFCS_PATTERN); |
| 90 m_pBuffer = m_pCS->CreateBuf(); | 83 m_pBuffer = m_pCS->CreateBuf(); |
| 91 } | 84 } |
| 92 | 85 |
| 93 CPDF_DocPageData* pDocPageData = nullptr; | 86 CPDF_DocPageData* pDocPageData = nullptr; |
| 94 PatternValue* pvalue = (PatternValue*)m_pBuffer; | 87 PatternValue* pvalue = (PatternValue*)m_pBuffer; |
| 95 if (pvalue->m_pPattern && pvalue->m_pPattern->document()) { | 88 if (pvalue->m_pPattern && pvalue->m_pPattern->document()) { |
| 96 pDocPageData = pvalue->m_pPattern->document()->GetPageData(); | 89 pDocPageData = pvalue->m_pPattern->document()->GetPageData(); |
| 97 if (pDocPageData) | 90 if (pDocPageData) |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 152 return TRUE; | 145 return TRUE; |
| 153 } | 146 } |
| 154 | 147 |
| 155 CPDF_Pattern* CPDF_Color::GetPattern() const { | 148 CPDF_Pattern* CPDF_Color::GetPattern() const { |
| 156 if (!m_pBuffer || m_pCS->GetFamily() != PDFCS_PATTERN) | 149 if (!m_pBuffer || m_pCS->GetFamily() != PDFCS_PATTERN) |
| 157 return nullptr; | 150 return nullptr; |
| 158 | 151 |
| 159 PatternValue* pvalue = (PatternValue*)m_pBuffer; | 152 PatternValue* pvalue = (PatternValue*)m_pBuffer; |
| 160 return pvalue->m_pPattern; | 153 return pvalue->m_pPattern; |
| 161 } | 154 } |
| 162 | |
| 163 CPDF_ColorSpace* CPDF_Color::GetPatternCS() const { | |
| 164 if (!m_pBuffer || m_pCS->GetFamily() != PDFCS_PATTERN) | |
| 165 return nullptr; | |
| 166 return m_pCS->GetBaseCS(); | |
| 167 } | |
| 168 | |
| 169 FX_FLOAT* CPDF_Color::GetPatternColor() const { | |
| 170 if (!m_pBuffer || m_pCS->GetFamily() != PDFCS_PATTERN) | |
| 171 return nullptr; | |
| 172 | |
| 173 PatternValue* pvalue = (PatternValue*)m_pBuffer; | |
| 174 return pvalue->m_nComps ? pvalue->m_Comps : nullptr; | |
| 175 } | |
| 176 | |
| 177 FX_BOOL CPDF_Color::IsEqual(const CPDF_Color& other) const { | |
| 178 return m_pCS && m_pCS == other.m_pCS && | |
| 179 FXSYS_memcmp(m_pBuffer, other.m_pBuffer, m_pCS->GetBufSize()) == 0; | |
| 180 } | |
| OLD | NEW |