diff options
Diffstat (limited to 'core/fpdfapi')
-rw-r--r-- | core/fpdfapi/render/cpdf_dibsource.cpp | 150 | ||||
-rw-r--r-- | core/fpdfapi/render/cpdf_dibsource.h | 2 |
2 files changed, 76 insertions, 76 deletions
diff --git a/core/fpdfapi/render/cpdf_dibsource.cpp b/core/fpdfapi/render/cpdf_dibsource.cpp index 341327b5e9..899a783c47 100644 --- a/core/fpdfapi/render/cpdf_dibsource.cpp +++ b/core/fpdfapi/render/cpdf_dibsource.cpp @@ -428,25 +428,24 @@ bool CPDF_DIBSource::LoadColorInfo(const CPDF_Dictionary* pFormResources, m_nComponents = m_pColorSpace->CountComponents(); if (m_Family == PDFCS_ICCBASED && pCSObj->IsName()) { CFX_ByteString cs = pCSObj->GetString(); - if (cs == "DeviceGray") { + if (cs == "DeviceGray") m_nComponents = 1; - } else if (cs == "DeviceRGB") { + else if (cs == "DeviceRGB") m_nComponents = 3; - } else if (cs == "DeviceCMYK") { + else if (cs == "DeviceCMYK") m_nComponents = 4; - } } ValidateDictParam(); - m_pCompData = GetDecodeAndMaskArray(m_bDefaultDecode, m_bColorKey); + m_pCompData = GetDecodeAndMaskArray(&m_bDefaultDecode, &m_bColorKey); return !!m_pCompData; } -DIB_COMP_DATA* CPDF_DIBSource::GetDecodeAndMaskArray(bool& bDefaultDecode, - bool& bColorKey) { - if (!m_pColorSpace) { +DIB_COMP_DATA* CPDF_DIBSource::GetDecodeAndMaskArray(bool* bDefaultDecode, + bool* bColorKey) { + if (!m_pColorSpace) return nullptr; - } - DIB_COMP_DATA* pCompData = FX_Alloc(DIB_COMP_DATA, m_nComponents); + + DIB_COMP_DATA* const pCompData = FX_Alloc(DIB_COMP_DATA, m_nComponents); int max_data = (1 << m_bpc) - 1; CPDF_Array* pDecode = m_pDict->GetArrayFor("Decode"); if (pDecode) { @@ -458,41 +457,39 @@ DIB_COMP_DATA* CPDF_DIBSource::GetDecodeAndMaskArray(bool& bDefaultDecode, float def_min; float def_max; m_pColorSpace->GetDefaultValue(i, &def_value, &def_min, &def_max); - if (m_Family == PDFCS_INDEXED) { + if (m_Family == PDFCS_INDEXED) def_max = max_data; - } - if (def_min != pCompData[i].m_DecodeMin || def_max != max) { - bDefaultDecode = false; - } + if (def_min != pCompData[i].m_DecodeMin || def_max != max) + *bDefaultDecode = false; } } else { for (uint32_t i = 0; i < m_nComponents; i++) { float def_value; m_pColorSpace->GetDefaultValue(i, &def_value, &pCompData[i].m_DecodeMin, &pCompData[i].m_DecodeStep); - if (m_Family == PDFCS_INDEXED) { + if (m_Family == PDFCS_INDEXED) pCompData[i].m_DecodeStep = max_data; - } pCompData[i].m_DecodeStep = (pCompData[i].m_DecodeStep - pCompData[i].m_DecodeMin) / max_data; } } - if (!m_pDict->KeyExist("SMask")) { - CPDF_Object* pMask = m_pDict->GetDirectObjectFor("Mask"); - if (!pMask) { - return pCompData; - } - if (CPDF_Array* pArray = pMask->AsArray()) { - if (pArray->GetCount() >= m_nComponents * 2) { - for (uint32_t i = 0; i < m_nComponents; i++) { - int min_num = pArray->GetIntegerAt(i * 2); - int max_num = pArray->GetIntegerAt(i * 2 + 1); - pCompData[i].m_ColorKeyMin = std::max(min_num, 0); - pCompData[i].m_ColorKeyMax = std::min(max_num, max_data); - } + if (m_pDict->KeyExist("SMask")) + return pCompData; + + CPDF_Object* pMask = m_pDict->GetDirectObjectFor("Mask"); + if (!pMask) + return pCompData; + + if (CPDF_Array* pArray = pMask->AsArray()) { + if (pArray->GetCount() >= m_nComponents * 2) { + for (uint32_t i = 0; i < m_nComponents; i++) { + int min_num = pArray->GetIntegerAt(i * 2); + int max_num = pArray->GetIntegerAt(i * 2 + 1); + pCompData[i].m_ColorKeyMin = std::max(min_num, 0); + pCompData[i].m_ColorKeyMax = std::min(max_num, max_data); } - bColorKey = true; } + *bColorKey = true; } return pCompData; } @@ -585,7 +582,7 @@ int CPDF_DIBSource::CreateDecoder() { if (m_Family == PDFCS_LAB && m_nComponents != 3) return 0; } - m_pCompData = GetDecodeAndMaskArray(m_bDefaultDecode, m_bColorKey); + m_pCompData = GetDecodeAndMaskArray(&m_bDefaultDecode, &m_bColorKey); if (!m_pCompData) return 0; } @@ -861,9 +858,9 @@ void CPDF_DIBSource::ValidateDictParam() { void CPDF_DIBSource::TranslateScanline24bpp(uint8_t* dest_scan, const uint8_t* src_scan) const { - if (m_bpc == 0) { + if (m_bpc == 0) return; - } + unsigned int max_data = (1 << m_bpc) - 1; if (m_bDefaultDecode) { if (m_Family == PDFCS_DEVICERGB || m_Family == PDFCS_CALRGB) { @@ -872,14 +869,6 @@ void CPDF_DIBSource::TranslateScanline24bpp(uint8_t* dest_scan, const uint8_t* src_pos = src_scan; switch (m_bpc) { - case 16: - for (int col = 0; col < m_Width; col++) { - *dest_scan++ = src_pos[4]; - *dest_scan++ = src_pos[2]; - *dest_scan++ = *src_pos; - src_pos += 6; - } - break; case 8: for (int column = 0; column < m_Width; column++) { *dest_scan++ = src_pos[2]; @@ -888,6 +877,14 @@ void CPDF_DIBSource::TranslateScanline24bpp(uint8_t* dest_scan, src_pos += 3; } break; + case 16: + for (int col = 0; col < m_Width; col++) { + *dest_scan++ = src_pos[4]; + *dest_scan++ = src_pos[2]; + *dest_scan++ = *src_pos; + src_pos += 6; + } + break; default: uint64_t src_bit_pos = 0; size_t dest_byte_pos = 0; @@ -917,9 +914,12 @@ void CPDF_DIBSource::TranslateScanline24bpp(uint8_t* dest_scan, return; } } + CFX_FixedBufGrow<float, 16> color_values1(m_nComponents); float* color_values = color_values1; - float R = 0.0f, G = 0.0f, B = 0.0f; + float R = 0.0f; + float G = 0.0f; + float B = 0.0f; if (m_bpc == 8) { uint64_t src_byte_pos = 0; size_t dest_byte_pos = 0; @@ -1051,29 +1051,29 @@ const uint8_t* CPDF_DIBSource::GetScanline(int line) const { m_pLineBuf[col] = color_index; } } - if (m_bColorKey) { - uint8_t* pDestPixel = m_pMaskedLine; - const uint8_t* pSrcPixel = m_pLineBuf; - for (int col = 0; col < m_Width; col++) { - uint8_t index = *pSrcPixel++; - if (m_pPalette) { - *pDestPixel++ = FXARGB_B(m_pPalette.get()[index]); - *pDestPixel++ = FXARGB_G(m_pPalette.get()[index]); - *pDestPixel++ = FXARGB_R(m_pPalette.get()[index]); - } else { - *pDestPixel++ = index; - *pDestPixel++ = index; - *pDestPixel++ = index; - } - *pDestPixel = (index < m_pCompData[0].m_ColorKeyMin || - index > m_pCompData[0].m_ColorKeyMax) - ? 0xFF - : 0; - pDestPixel++; + if (!m_bColorKey) + return m_pLineBuf; + + uint8_t* pDestPixel = m_pMaskedLine; + const uint8_t* pSrcPixel = m_pLineBuf; + for (int col = 0; col < m_Width; col++) { + uint8_t index = *pSrcPixel++; + if (m_pPalette) { + *pDestPixel++ = FXARGB_B(m_pPalette.get()[index]); + *pDestPixel++ = FXARGB_G(m_pPalette.get()[index]); + *pDestPixel++ = FXARGB_R(m_pPalette.get()[index]); + } else { + *pDestPixel++ = index; + *pDestPixel++ = index; + *pDestPixel++ = index; } - return m_pMaskedLine; + *pDestPixel = (index < m_pCompData[0].m_ColorKeyMin || + index > m_pCompData[0].m_ColorKeyMax) + ? 0xFF + : 0; + pDestPixel++; } - return m_pLineBuf; + return m_pMaskedLine; } if (m_bColorKey) { if (m_nComponents == 3 && m_bpc == 8) { @@ -1097,18 +1097,18 @@ const uint8_t* CPDF_DIBSource::GetScanline(int line) const { TranslateScanline24bpp(m_pLineBuf, pSrcLine); pSrcLine = m_pLineBuf; } - if (m_bColorKey) { - const uint8_t* pSrcPixel = pSrcLine; - uint8_t* pDestPixel = m_pMaskedLine; - for (int col = 0; col < m_Width; col++) { - *pDestPixel++ = *pSrcPixel++; - *pDestPixel++ = *pSrcPixel++; - *pDestPixel++ = *pSrcPixel++; - pDestPixel++; - } - return m_pMaskedLine; + if (!m_bColorKey) + return pSrcLine; + + const uint8_t* pSrcPixel = pSrcLine; + uint8_t* pDestPixel = m_pMaskedLine; + for (int col = 0; col < m_Width; col++) { + *pDestPixel++ = *pSrcPixel++; + *pDestPixel++ = *pSrcPixel++; + *pDestPixel++ = *pSrcPixel++; + pDestPixel++; } - return pSrcLine; + return m_pMaskedLine; } bool CPDF_DIBSource::SkipToScanline(int line, IFX_Pause* pPause) const { diff --git a/core/fpdfapi/render/cpdf_dibsource.h b/core/fpdfapi/render/cpdf_dibsource.h index 766025db7a..b0f8dedaf7 100644 --- a/core/fpdfapi/render/cpdf_dibsource.h +++ b/core/fpdfapi/render/cpdf_dibsource.h @@ -76,7 +76,7 @@ class CPDF_DIBSource : public CFX_DIBSource { private: bool LoadColorInfo(const CPDF_Dictionary* pFormResources, const CPDF_Dictionary* pPageResources); - DIB_COMP_DATA* GetDecodeAndMaskArray(bool& bDefaultDecode, bool& bColorKey); + DIB_COMP_DATA* GetDecodeAndMaskArray(bool* bDefaultDecode, bool* bColorKey); void LoadJpxBitmap(); void LoadPalette(); int CreateDecoder(); |