1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved. 2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Use of this source code is governed by a BSD-style license that can be 3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// found in the LICENSE file. 4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../../include/fxge/fx_ge.h" 8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../../include/fxcodec/fx_codec.h" 9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../../include/fpdfapi/fpdf_module.h" 10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../../include/fpdfapi/fpdf_render.h" 11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../../include/fpdfapi/fpdf_pageobj.h" 12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../fpdf_page/pageint.h" 13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "render_int.h" 14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include <limits.h> 15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic unsigned int _GetBits8(FX_LPCBYTE pData, int bitpos, int nbits) 16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov unsigned int byte = pData[bitpos / 8]; 18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nbits == 8) { 19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return byte; 20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (nbits == 4) { 21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (bitpos % 8) ? (byte & 0x0f) : (byte >> 4); 22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (nbits == 2) { 23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (byte >> (6 - bitpos % 8)) & 0x03; 24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (nbits == 1) { 25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (byte >> (7 - bitpos % 8)) & 0x01; 26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (nbits == 16) { 27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return byte * 256 + pData[bitpos / 8 + 1]; 28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 31ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_DIBSource* CPDF_Image::LoadDIBSource(CFX_DIBSource** ppMask, FX_DWORD* pMatteColor, FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask) const 32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_DIBSource* pSource = FX_NEW CPDF_DIBSource; 34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pSource->Load(m_pDocument, m_pStream, (CPDF_DIBSource**)ppMask, pMatteColor, NULL, NULL, bStdCS, GroupFamily, bLoadMask)) { 35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pSource; 36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete pSource; 38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 40ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_DIBSource* CPDF_Image::DetachBitmap() 41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_DIBSource* pBitmap = m_pDIBSource; 43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pDIBSource = NULL; 44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pBitmap; 45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 46ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_DIBSource* CPDF_Image::DetachMask() 47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_DIBSource* pBitmap = m_pMask; 49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pMask = NULL; 50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pBitmap; 51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 52ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_Image::StartLoadDIBSource(CPDF_Dictionary* pFormResource, CPDF_Dictionary* pPageResource, FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask) 53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pDIBSource = FX_NEW CPDF_DIBSource; 55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int ret = ((CPDF_DIBSource*)m_pDIBSource)->StartLoadDIBSource(m_pDocument, m_pStream, TRUE, pFormResource, pPageResource, bStdCS, GroupFamily, bLoadMask); 56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ret == 2) { 57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!ret) { 60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete m_pDIBSource; 61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pDIBSource = NULL; 62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pMask = ((CPDF_DIBSource*)m_pDIBSource)->DetachMask(); 65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_MatteColor = ((CPDF_DIBSource*)m_pDIBSource)->m_MatteColor; 66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 68ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_Image::Continue(IFX_Pause* pPause) 69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int ret = ((CPDF_DIBSource*)m_pDIBSource)->ContinueLoadDIBSource(pPause); 71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ret == 2) { 72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!ret) { 75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete m_pDIBSource; 76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pDIBSource = NULL; 77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pMask = ((CPDF_DIBSource*)m_pDIBSource)->DetachMask(); 80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_MatteColor = ((CPDF_DIBSource*)m_pDIBSource)->m_MatteColor; 81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 83ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_DIBSource::CPDF_DIBSource() 84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pDocument = NULL; 86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pStreamAcc = NULL; 87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pDict = NULL; 88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bpp = 0; 89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Width = m_Height = 0; 90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pColorSpace = NULL; 91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bDefaultDecode = TRUE; 92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bImageMask = FALSE; 93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pPalette = NULL; 94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pCompData = NULL; 95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bColorKey = FALSE; 96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pMaskedLine = m_pLineBuf = NULL; 97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pCachedBitmap = NULL; 98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pDecoder = NULL; 99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_nComponents = 0; 100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bpc = 0; 101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bLoadMask = FALSE; 102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Family = 0; 103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pMask = NULL; 104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_MatteColor = 0; 105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pJbig2Context = NULL; 106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pGlobalStream = NULL; 107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bStdCS = FALSE; 108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pMaskStream = NULL; 109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Status = 0; 110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bHasMask = FALSE; 111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 112ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_DIBSource::~CPDF_DIBSource() 113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pStreamAcc) { 115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete m_pStreamAcc; 116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pMaskedLine) { 118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_Free(m_pMaskedLine); 119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pLineBuf) { 121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_Free(m_pLineBuf); 122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pCachedBitmap) { 124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete m_pCachedBitmap; 125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pDecoder) { 127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete m_pDecoder; 128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pCompData) { 130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_Free(m_pCompData); 131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_ColorSpace* pCS = m_pColorSpace; 133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pCS && m_pDocument) { 134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pDocument->GetPageData()->ReleaseColorSpace(pCS->GetArray()); 135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pJbig2Context) { 137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ICodec_Jbig2Module* pJbig2Moudle = CPDF_ModuleMgr::Get()->GetJbig2Module(); 138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pJbig2Moudle->DestroyJbig2Context(m_pJbig2Context); 139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pJbig2Context = NULL; 140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pGlobalStream) { 142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete m_pGlobalStream; 143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pGlobalStream = NULL; 145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 146ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_DIBitmap* CPDF_DIBSource::GetBitmap() const 147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pCachedBitmap) { 149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_pCachedBitmap; 150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return Clone(); 152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_DIBSource::ReleaseBitmap(CFX_DIBitmap* pBitmap) const 154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pBitmap && pBitmap != m_pCachedBitmap) { 156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete pBitmap; 157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 159ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DIBSource::Load(CPDF_Document* pDoc, const CPDF_Stream* pStream, CPDF_DIBSource** ppMask, 160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD* pMatteColor, CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources, FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask) 161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pStream == NULL) { 163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pDocument = pDoc; 166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pDict = pStream->GetDict(); 167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pStream = pStream; 168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Width = m_pDict->GetInteger(FX_BSTRC("Width")); 169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Height = m_pDict->GetInteger(FX_BSTRC("Height")); 170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_Width <= 0 || m_Height <= 0 || m_Width > 0x01ffff || m_Height > 0x01ffff) { 171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_GroupFamily = GroupFamily; 174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bLoadMask = bLoadMask; 175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!LoadColorInfo(m_pStream->GetObjNum() != 0 ? NULL : pFormResources, pPageResources)) { 176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD src_pitch = m_bpc; 179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bpc != 0 && m_nComponents != 0) { 180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (src_pitch > 0 && m_nComponents > (unsigned)INT_MAX / src_pitch) { 181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov src_pitch *= m_nComponents; 184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (src_pitch > 0 && (FX_DWORD)m_Width > (unsigned)INT_MAX / src_pitch) { 185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov src_pitch *= m_Width; 188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (src_pitch + 7 < src_pitch) { 189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov src_pitch += 7; 192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov src_pitch /= 8; 193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (src_pitch > 0 && (FX_DWORD)m_Height > (unsigned)INT_MAX / src_pitch) { 194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pStreamAcc = FX_NEW CPDF_StreamAcc; 198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pStreamAcc->LoadAllData(pStream, FALSE, m_Height * src_pitch, TRUE); 199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pStreamAcc->GetSize() == 0 || m_pStreamAcc->GetData() == NULL) { 200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const CFX_ByteString& decoder = m_pStreamAcc->GetImageDecoder(); 203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!decoder.IsEmpty() && decoder == FX_BSTRC("CCITTFaxDecode")) { 204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bpc = 1; 205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!CreateDecoder()) { 207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bImageMask) { 210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bpp = 1; 211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bpc = 1; 212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_nComponents = 1; 213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_AlphaFlag = 1; 214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (m_bpc * m_nComponents == 1) { 215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bpp = 1; 216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (m_bpc * m_nComponents <= 8) { 217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bpp = 8; 218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bpp = 24; 220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_bpc || !m_nComponents) { 222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pitch = m_Width; 225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((FX_DWORD)m_bpp > (unsigned)INT_MAX / m_Pitch) { 226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pitch *= m_bpp; 229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_Pitch + 31 < m_Pitch) { 230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pitch += 31; 233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pitch = m_Pitch / 32 * 4; 234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pLineBuf = FX_Alloc(FX_BYTE, m_Pitch); 235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pColorSpace && bStdCS) { 236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pColorSpace->EnableStdConversion(TRUE); 237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov LoadPalette(); 239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bColorKey) { 240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bpp = 32; 241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_AlphaFlag = 2; 242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pitch = m_Width; 243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((FX_DWORD)m_bpp > (unsigned)INT_MAX / m_Pitch) { 244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pitch *= m_bpp; 247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_Pitch + 31 < m_Pitch) { 248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pitch += 31; 251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pitch = m_Pitch / 32 * 4; 252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pMaskedLine = FX_Alloc(FX_BYTE, m_Pitch); 253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ppMask) { 255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *ppMask = LoadMask(*pMatteColor); 256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pColorSpace && bStdCS) { 258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pColorSpace->EnableStdConversion(FALSE); 259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CPDF_DIBSource::ContinueToLoadMask() 263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bImageMask) { 265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bpp = 1; 266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bpc = 1; 267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_nComponents = 1; 268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_AlphaFlag = 1; 269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (m_bpc * m_nComponents == 1) { 270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bpp = 1; 271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (m_bpc * m_nComponents <= 8) { 272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bpp = 8; 273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bpp = 24; 275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_bpc || !m_nComponents) { 277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pitch = m_Width; 280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((FX_DWORD)m_bpp > (unsigned)INT_MAX / m_Pitch) { 281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pitch *= m_bpp; 284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_Pitch + 31 < m_Pitch) { 285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pitch += 31; 288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pitch = m_Pitch / 32 * 4; 289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pLineBuf = FX_Alloc(FX_BYTE, m_Pitch); 290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pColorSpace && m_bStdCS) { 291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pColorSpace->EnableStdConversion(TRUE); 292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov LoadPalette(); 294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bColorKey) { 295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bpp = 32; 296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_AlphaFlag = 2; 297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pitch = m_Width; 298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((FX_DWORD)m_bpp > (unsigned)INT_MAX / m_Pitch) { 299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pitch *= m_bpp; 302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_Pitch + 31 < m_Pitch) { 303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pitch += 31; 306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pitch = m_Pitch / 32 * 4; 307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pMaskedLine = FX_Alloc(FX_BYTE, m_Pitch); 308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 1; 310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CPDF_DIBSource::StartLoadDIBSource(CPDF_Document* pDoc, const CPDF_Stream* pStream, FX_BOOL bHasMask, 312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources, 313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask) 314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pStream == NULL) { 316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pDocument = pDoc; 319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pDict = pStream->GetDict(); 320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pStream = pStream; 321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bStdCS = bStdCS; 322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bHasMask = bHasMask; 323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Width = m_pDict->GetInteger(FX_BSTRC("Width")); 324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Height = m_pDict->GetInteger(FX_BSTRC("Height")); 325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_Width <= 0 || m_Height <= 0 || m_Width > 0x01ffff || m_Height > 0x01ffff) { 326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_GroupFamily = GroupFamily; 329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bLoadMask = bLoadMask; 330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!LoadColorInfo(m_pStream->GetObjNum() != 0 ? NULL : pFormResources, pPageResources)) { 331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD src_pitch = m_bpc; 334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bpc != 0 && m_nComponents != 0) { 335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (src_pitch > 0 && m_nComponents > (unsigned)INT_MAX / src_pitch) { 336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov src_pitch *= m_nComponents; 339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (src_pitch > 0 && (FX_DWORD)m_Width > (unsigned)INT_MAX / src_pitch) { 340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov src_pitch *= m_Width; 343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (src_pitch + 7 < src_pitch) { 344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov src_pitch += 7; 347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov src_pitch /= 8; 348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (src_pitch > 0 && (FX_DWORD)m_Height > (unsigned)INT_MAX / src_pitch) { 349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pStreamAcc = FX_NEW CPDF_StreamAcc; 353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pStreamAcc->LoadAllData(pStream, FALSE, m_Height * src_pitch, TRUE); 354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pStreamAcc->GetSize() == 0 || m_pStreamAcc->GetData() == NULL) { 355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const CFX_ByteString& decoder = m_pStreamAcc->GetImageDecoder(); 358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!decoder.IsEmpty() && decoder == FX_BSTRC("CCITTFaxDecode")) { 359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bpc = 1; 360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int ret = CreateDecoder(); 362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ret != 1) { 363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!ret) { 364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return ret; 365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!ContinueToLoadMask()) { 367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bHasMask) { 370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov StratLoadMask(); 371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return ret; 373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!ContinueToLoadMask()) { 375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bHasMask) { 378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ret = StratLoadMask(); 379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ret == 2) { 381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return ret; 382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pColorSpace && m_bStdCS) { 384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pColorSpace->EnableStdConversion(FALSE); 385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return ret; 387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CPDF_DIBSource::ContinueLoadDIBSource(IFX_Pause* pPause) 389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXCODEC_STATUS ret; 391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_Status == 1) { 392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const CFX_ByteString& decoder = m_pStreamAcc->GetImageDecoder(); 393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (decoder == FX_BSTRC("JPXDecode")) { 394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ICodec_Jbig2Module* pJbig2Moudle = CPDF_ModuleMgr::Get()->GetJbig2Module(); 397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pJbig2Context == NULL) { 398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pJbig2Context = pJbig2Moudle->CreateJbig2Context(); 399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pStreamAcc->GetImageParam()) { 400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Stream* pGlobals = m_pStreamAcc->GetImageParam()->GetStream(FX_BSTRC("JBIG2Globals")); 401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pGlobals) { 402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pGlobalStream = FX_NEW CPDF_StreamAcc; 403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pGlobalStream->LoadAllData(pGlobals, FALSE); 404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ret = pJbig2Moudle->StartDecode(m_pJbig2Context, m_Width, m_Height, m_pStreamAcc->GetData(), m_pStreamAcc->GetSize(), 407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pGlobalStream ? m_pGlobalStream->GetData() : NULL, m_pGlobalStream ? m_pGlobalStream->GetSize() : 0, m_pCachedBitmap->GetBuffer(), 408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pCachedBitmap->GetPitch(), pPause); 409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ret < 0) { 410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete m_pCachedBitmap; 411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pCachedBitmap = NULL; 412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pGlobalStream) { 413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete m_pGlobalStream; 414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pGlobalStream = NULL; 416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pJbig2Moudle->DestroyJbig2Context(m_pJbig2Context); 417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pJbig2Context = NULL; 418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ret == FXCODEC_STATUS_DECODE_TOBECONTINUE) { 421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 2; 422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int ret1 = 1; 424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bHasMask) { 425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ret1 = ContinueLoadMaskDIB(pPause); 426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Status = 2; 427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ret1 == 2) { 429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return ret1; 430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pColorSpace && m_bStdCS) { 432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pColorSpace->EnableStdConversion(FALSE); 433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return ret1; 435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXCODEC_STATUS ret = pJbig2Moudle->ContinueDecode(m_pJbig2Context, pPause); 437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ret < 0) { 438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete m_pCachedBitmap; 439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pCachedBitmap = NULL; 440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pGlobalStream) { 441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete m_pGlobalStream; 442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pGlobalStream = NULL; 444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pJbig2Moudle->DestroyJbig2Context(m_pJbig2Context); 445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pJbig2Context = NULL; 446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ret == FXCODEC_STATUS_DECODE_TOBECONTINUE) { 449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 2; 450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int ret1 = 1; 452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bHasMask) { 453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ret1 = ContinueLoadMaskDIB(pPause); 454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Status = 2; 455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ret1 == 2) { 457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return ret1; 458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pColorSpace && m_bStdCS) { 460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pColorSpace->EnableStdConversion(FALSE); 461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return ret1; 463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (m_Status == 2) { 464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return ContinueLoadMaskDIB(pPause); 465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 468ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DIBSource::LoadColorInfo(CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources) 469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pDict->GetInteger("ImageMask")) { 471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bImageMask = TRUE; 472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bImageMask || !m_pDict->KeyExist(FX_BSTRC("ColorSpace"))) { 474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_bImageMask) { 475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object* pFilter = m_pDict->GetElementValue(FX_BSTRC("Filter")); 476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pFilter) { 477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString filter; 478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pFilter->GetType() == PDFOBJ_NAME) { 479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov filter = pFilter->GetString(); 480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (filter == FX_BSTRC("JPXDecode")) { 481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (pFilter->GetType() == PDFOBJ_ARRAY) { 484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Array* pArray = (CPDF_Array*)pFilter; 485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pArray->GetString(pArray->GetCount() - 1) == FX_BSTRC("JPXDecode")) { 486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bImageMask = TRUE; 492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bpc = m_nComponents = 1; 493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Array* pDecode = m_pDict->GetArray(FX_BSTRC("Decode")); 494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bDefaultDecode = pDecode == NULL || pDecode->GetInteger(0) == 0; 495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object* pCSObj = m_pDict->GetElementValue(FX_BSTRC("ColorSpace")); 498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pCSObj == NULL) { 499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_DocPageData* pDocPageData = m_pDocument->GetPageData(); 502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pFormResources) { 503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pColorSpace = pDocPageData->GetColorSpace(pCSObj, pFormResources); 504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pColorSpace == NULL) { 506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pColorSpace = pDocPageData->GetColorSpace(pCSObj, pPageResources); 507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pColorSpace == NULL) { 509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bpc = m_pDict->GetInteger(FX_BSTRC("BitsPerComponent")); 512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Family = m_pColorSpace->GetFamily(); 513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_nComponents = m_pColorSpace->CountComponents(); 514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_Family == PDFCS_ICCBASED && pCSObj->GetType() == PDFOBJ_NAME) { 515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString cs = pCSObj->GetString(); 516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (cs == FX_BSTRC("DeviceGray")) { 517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_nComponents = 1; 518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (cs == FX_BSTRC("DeviceRGB")) { 519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_nComponents = 3; 520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (cs == FX_BSTRC("DeviceCMYK")) { 521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_nComponents = 4; 522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pCompData = FX_Alloc(DIB_COMP_DATA, m_nComponents); 525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bpc == 0) { 526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int max_data = (1 << m_bpc) - 1; 529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Array* pDecode = m_pDict->GetArray(FX_BSTRC("Decode")); 530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pDecode) { 531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_DWORD i = 0; i < m_nComponents; i ++) { 532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pCompData[i].m_DecodeMin = pDecode->GetNumber(i * 2); 533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT max = pDecode->GetNumber(i * 2 + 1); 534ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pCompData[i].m_DecodeStep = (max - m_pCompData[i].m_DecodeMin) / max_data; 535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT def_value, def_min, def_max; 536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pColorSpace->GetDefaultValue(i, def_value, def_min, def_max); 537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_Family == PDFCS_INDEXED) { 538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov def_max = (FX_FLOAT)max_data; 539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (def_min != m_pCompData[i].m_DecodeMin || def_max != max) { 541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bDefaultDecode = FALSE; 542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_DWORD i = 0; i < m_nComponents; i ++) { 546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT def_value; 547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pColorSpace->GetDefaultValue(i, def_value, m_pCompData[i].m_DecodeMin, m_pCompData[i].m_DecodeStep); 548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_Family == PDFCS_INDEXED) { 549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pCompData[i].m_DecodeStep = (FX_FLOAT)max_data; 550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pCompData[i].m_DecodeStep = (m_pCompData[i].m_DecodeStep - m_pCompData[i].m_DecodeMin) / max_data; 552ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_pDict->KeyExist(FX_BSTRC("SMask"))) { 555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object* pMask = m_pDict->GetElementValue(FX_BSTRC("Mask")); 556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pMask == NULL) { 557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pMask->GetType() == PDFOBJ_ARRAY) { 560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Array* pArray = (CPDF_Array*)pMask; 561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pArray->GetCount() >= m_nComponents * 2) 562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_DWORD i = 0; i < m_nComponents * 2; i ++) { 563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (i % 2) { 564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pCompData[i / 2].m_ColorKeyMax = pArray->GetInteger(i); 565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 566ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pCompData[i / 2].m_ColorKeyMin = pArray->GetInteger(i); 567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bColorKey = TRUE; 570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 571ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 574ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovICodec_ScanlineDecoder* FPDFAPI_CreateFaxDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height, 575ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const CPDF_Dictionary* pParams); 576ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovICodec_ScanlineDecoder* FPDFAPI_CreateFlateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height, 577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int nComps, int bpc, const CPDF_Dictionary* pParams); 578ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CPDF_DIBSource::CreateDecoder() 579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 580ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const CFX_ByteString& decoder = m_pStreamAcc->GetImageDecoder(); 581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (decoder.IsEmpty()) { 582ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 1; 583ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 584ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPCBYTE src_data = m_pStreamAcc->GetData(); 585ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD src_size = m_pStreamAcc->GetSize(); 586ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const CPDF_Dictionary* pParams = m_pStreamAcc->GetImageParam(); 587ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (decoder == FX_BSTRC("CCITTFaxDecode")) { 588ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pDecoder = FPDFAPI_CreateFaxDecoder(src_data, src_size, m_Width, m_Height, pParams); 589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (decoder == FX_BSTRC("DCTDecode")) { 590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pDecoder = CPDF_ModuleMgr::Get()->GetJpegModule()->CreateDecoder(src_data, src_size, m_Width, m_Height, 591ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_nComponents, pParams ? pParams->GetInteger(FX_BSTR("ColorTransform"), 1) : 1); 592ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (NULL == m_pDecoder) { 593ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bTransform = FALSE; 594ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int comps, bpc; 595ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ICodec_JpegModule* pJpegModule = CPDF_ModuleMgr::Get()->GetJpegModule(); 596ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pJpegModule->LoadInfo(src_data, src_size, m_Width, m_Height, comps, bpc, bTransform)) { 597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_nComponents = comps; 598ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bpc = bpc; 599ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pDecoder = CPDF_ModuleMgr::Get()->GetJpegModule()->CreateDecoder(src_data, src_size, m_Width, m_Height, 600ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_nComponents, bTransform); 601ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 602ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 603ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (decoder == FX_BSTRC("FlateDecode")) { 604ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pDecoder = FPDFAPI_CreateFlateDecoder(src_data, src_size, m_Width, m_Height, m_nComponents, m_bpc, pParams); 605ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (decoder == FX_BSTRC("JPXDecode")) { 606ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov LoadJpxBitmap(); 607ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_pCachedBitmap != NULL ? 1 : 0; 608ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (decoder == FX_BSTRC("JBIG2Decode")) { 609ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pCachedBitmap = FX_NEW CFX_DIBitmap; 610ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_pCachedBitmap->Create(m_Width, m_Height, m_bImageMask ? FXDIB_1bppMask : FXDIB_1bppRgb)) { 611ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete m_pCachedBitmap; 612ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pCachedBitmap = NULL; 613ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 614ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 615ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Status = 1; 616ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 2; 617ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (decoder == FX_BSTRC("RunLengthDecode")) { 618ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pDecoder = CPDF_ModuleMgr::Get()->GetCodecModule()->GetBasicModule()->CreateRunLengthDecoder(src_data, src_size, m_Width, m_Height, m_nComponents, m_bpc); 619ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 620ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pDecoder) { 621ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int requested_pitch = (m_Width * m_nComponents * m_bpc + 7) / 8; 622ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int provided_pitch = (m_pDecoder->GetWidth() * m_pDecoder->CountComps() * m_pDecoder->GetBPC() + 7) / 8; 623ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (provided_pitch < requested_pitch) { 624ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 625ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 626ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 1; 627ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 628ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 629ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 630ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_DIBSource::LoadJpxBitmap() 631ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 632ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ICodec_JpxModule* pJpxModule = CPDF_ModuleMgr::Get()->GetJpxModule(); 633ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pJpxModule == NULL) { 634ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 635ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 636ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPVOID ctx = pJpxModule->CreateDecoder(m_pStreamAcc->GetData(), m_pStreamAcc->GetSize(), m_pColorSpace != NULL); 637ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ctx == NULL) { 638ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 639ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 640ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD width = 0, height = 0, codestream_nComps = 0, image_nComps = 0; 641ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pJpxModule->GetImageInfo(ctx, width, height, codestream_nComps, image_nComps); 642ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((int)width < m_Width || (int)height < m_Height) { 643ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pJpxModule->DestroyDecoder(ctx); 644ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 645ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 646ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int output_nComps; 647ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bTranslateColor, bSwapRGB = FALSE; 648ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pColorSpace) { 649ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (codestream_nComps != (FX_DWORD)m_pColorSpace->CountComponents()) { 650ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 651ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 652ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov output_nComps = codestream_nComps; 653ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bTranslateColor = FALSE; 654ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pColorSpace == CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB)) { 655ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bSwapRGB = TRUE; 656ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pColorSpace = NULL; 657ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 658ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 659ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bTranslateColor = TRUE; 660ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (image_nComps) { 661ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov output_nComps = image_nComps; 662ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 663ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov output_nComps = codestream_nComps; 664ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 665ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (output_nComps == 3) { 666ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bSwapRGB = TRUE; 667ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (output_nComps == 4) { 668ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pColorSpace = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICECMYK); 669ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bTranslateColor = FALSE; 670ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 671ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_nComponents = output_nComps; 672ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 673ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXDIB_Format format; 674ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (output_nComps == 1) { 675ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov format = FXDIB_8bppRgb; 676ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (output_nComps <= 3) { 677ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov format = FXDIB_Rgb; 678ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (output_nComps == 4) { 679ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov format = FXDIB_Rgb32; 680ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 681ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov width = (width * output_nComps + 2) / 3; 682ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov format = FXDIB_Rgb; 683ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 684ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pCachedBitmap = FX_NEW CFX_DIBitmap; 685ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_pCachedBitmap->Create(width, height, format)) { 686ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete m_pCachedBitmap; 687ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pCachedBitmap = NULL; 688ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 689ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 690ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pCachedBitmap->Clear(0xFFFFFFFF); 691ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPBYTE output_offsets = FX_Alloc(FX_BYTE, output_nComps); 692ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int i = 0; i < output_nComps; i ++) { 693ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov output_offsets[i] = i; 694ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 695ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bSwapRGB) { 696ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov output_offsets[0] = 2; 697ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov output_offsets[2] = 0; 698ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 699ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pJpxModule->Decode(ctx, m_pCachedBitmap->GetBuffer(), m_pCachedBitmap->GetPitch(), bTranslateColor, output_offsets)) { 700ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete m_pCachedBitmap; 701ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pCachedBitmap = NULL; 702ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 703ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 704ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_Free(output_offsets); 705ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pJpxModule->DestroyDecoder(ctx); 706ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pColorSpace && m_pColorSpace->GetFamily() == PDFCS_INDEXED && m_bpc < 8) { 707ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int scale = 8 - m_bpc; 708ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_DWORD row = 0; row < height; row ++) { 709ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPBYTE scanline = (FX_LPBYTE)m_pCachedBitmap->GetScanline(row); 710ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_DWORD col = 0; col < width; col ++) { 711ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *scanline = (*scanline) >> scale; 712ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov scanline++; 713ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 714ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 715ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 716ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bpc = 8; 717ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 718ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_DIBSource::LoadJbig2Bitmap() 719ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 720ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ICodec_Jbig2Module* pJbig2Module = CPDF_ModuleMgr::Get()->GetJbig2Module(); 721ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pJbig2Module == NULL) { 722ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 723ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 724ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_StreamAcc* pGlobalStream = NULL; 725ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pStreamAcc->GetImageParam()) { 726ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Stream* pGlobals = m_pStreamAcc->GetImageParam()->GetStream(FX_BSTRC("JBIG2Globals")); 727ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pGlobals) { 728ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pGlobalStream = FX_NEW CPDF_StreamAcc; 729ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pGlobalStream->LoadAllData(pGlobals, FALSE); 730ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 731ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 732ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pCachedBitmap = FX_NEW CFX_DIBitmap; 733ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_pCachedBitmap->Create(m_Width, m_Height, m_bImageMask ? FXDIB_1bppMask : FXDIB_1bppRgb)) { 734ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 735ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 736ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int ret = pJbig2Module->Decode(m_Width, m_Height, m_pStreamAcc->GetData(), m_pStreamAcc->GetSize(), 737ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pGlobalStream ? pGlobalStream->GetData() : NULL, pGlobalStream ? pGlobalStream->GetSize() : 0, 738ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pCachedBitmap->GetBuffer(), m_pCachedBitmap->GetPitch()); 739ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ret < 0) { 740ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete m_pCachedBitmap; 741ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pCachedBitmap = NULL; 742ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 743ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pGlobalStream) { 744ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete pGlobalStream; 745ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 746ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bpc = 1; 747ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_nComponents = 1; 748ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 749ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_DIBSource* CPDF_DIBSource::LoadMask(FX_DWORD& MatteColor) 750ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 751ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov MatteColor = 0xffffffff; 752ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Stream* pSoftMask = m_pDict->GetStream(FX_BSTRC("SMask")); 753ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pSoftMask) { 754ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Array* pMatte = pSoftMask->GetDict()->GetArray(FX_BSTRC("Matte")); 755ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pMatte != NULL && m_pColorSpace && (FX_DWORD)m_pColorSpace->CountComponents() <= m_nComponents) { 756ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT* pColor = FX_Alloc(FX_FLOAT, m_nComponents); 757ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_DWORD i = 0; i < m_nComponents; i ++) { 758ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pColor[i] = pMatte->GetFloat(i); 759ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 760ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT R, G, B; 761ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pColorSpace->GetRGB(pColor, R, G, B); 762ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_Free(pColor); 763ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov MatteColor = FXARGB_MAKE(0, FXSYS_round(R * 255), FXSYS_round(G * 255), FXSYS_round(B * 255)); 764ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 765ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return LoadMaskDIB(pSoftMask); 766ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 767ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object* pMask = m_pDict->GetElementValue(FX_BSTRC("Mask")); 768ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pMask == NULL) { 769ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 770ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 771ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pMask->GetType() == PDFOBJ_STREAM) { 772ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return LoadMaskDIB((CPDF_Stream*)pMask); 773ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 774ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 775ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 776ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CPDF_DIBSource::StratLoadMask() 777ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 778ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_MatteColor = 0xffffffff; 779ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pMaskStream = m_pDict->GetStream(FX_BSTRC("SMask")); 780ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pMaskStream) { 781ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Array* pMatte = m_pMaskStream->GetDict()->GetArray(FX_BSTRC("Matte")); 782ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pMatte != NULL && m_pColorSpace && (FX_DWORD)m_pColorSpace->CountComponents() <= m_nComponents) { 783ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT R, G, B; 784ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT* pColor = FX_Alloc(FX_FLOAT, m_nComponents); 785ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_DWORD i = 0; i < m_nComponents; i ++) { 786ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pColor[i] = pMatte->GetFloat(i); 787ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 788ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pColorSpace->GetRGB(pColor, R, G, B); 789ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_Free(pColor); 790ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_MatteColor = FXARGB_MAKE(0, FXSYS_round(R * 255), FXSYS_round(G * 255), FXSYS_round(B * 255)); 791ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 792ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return StartLoadMaskDIB(); 793ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 794ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pMaskStream = m_pDict->GetElementValue(FX_BSTRC("Mask")); 795ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pMaskStream == NULL) { 796ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 1; 797ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 798ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pMaskStream->GetType() == PDFOBJ_STREAM) { 799ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return StartLoadMaskDIB(); 800ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 801ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 1; 802ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 803ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CPDF_DIBSource::ContinueLoadMaskDIB(IFX_Pause* pPause) 804ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 805ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pMask == NULL) { 806ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 1; 807ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 808ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int ret = m_pMask->ContinueLoadDIBSource(pPause); 809ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ret == 2) { 810ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return ret; 811ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 812ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pColorSpace && m_bStdCS) { 813ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pColorSpace->EnableStdConversion(FALSE); 814ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 815ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!ret) { 816ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete m_pMask; 817ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pMask = NULL; 818ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return ret; 819ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 820ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 1; 821ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 822ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_DIBSource* CPDF_DIBSource::DetachMask() 823ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 824ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_DIBSource* pDIBSource = m_pMask; 825ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pMask = NULL; 826ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pDIBSource; 827ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 828ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_DIBSource* CPDF_DIBSource::LoadMaskDIB(CPDF_Stream* pMask) 829ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 830ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_DIBSource* pMaskSource = FX_NEW CPDF_DIBSource; 831ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pMaskSource->Load(m_pDocument, pMask, NULL, NULL, NULL, NULL, TRUE)) { 832ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete pMaskSource; 833ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 834ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 835ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pMaskSource; 836ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 837ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CPDF_DIBSource::StartLoadMaskDIB() 838ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 839ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pMask = FX_NEW CPDF_DIBSource; 840ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int ret = m_pMask->StartLoadDIBSource(m_pDocument, (CPDF_Stream*)m_pMaskStream, FALSE, NULL, NULL, TRUE); 841ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ret == 2) { 842ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_Status == 0) { 843ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Status = 2; 844ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 845ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 2; 846ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 847ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!ret) { 848ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete m_pMask; 849ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pMask = NULL; 850ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 1; 851ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 852ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 1; 853ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 854ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_DIBSource::LoadPalette() 855ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 856ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bpc * m_nComponents > 8) { 857ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 858ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 859ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pColorSpace == NULL) { 860ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 861ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 862ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bpc * m_nComponents == 1) { 863ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bDefaultDecode && (m_Family == PDFCS_DEVICEGRAY || m_Family == PDFCS_DEVICERGB)) { 864ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 865ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 866ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pColorSpace->CountComponents() > 3) { 867ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 868ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 869ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT color_values[3]; 870ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov color_values[0] = m_pCompData[0].m_DecodeMin; 871ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov color_values[1] = color_values[2] = color_values[0]; 872ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT R, G, B; 873ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pColorSpace->GetRGB(color_values, R, G, B); 874ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_ARGB argb0 = ArgbEncode(255, FXSYS_round(R * 255), FXSYS_round(G * 255), FXSYS_round(B * 255)); 875ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov color_values[0] += m_pCompData[0].m_DecodeStep; 876ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov color_values[1] += m_pCompData[0].m_DecodeStep; 877ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov color_values[2] += m_pCompData[0].m_DecodeStep; 878ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pColorSpace->GetRGB(color_values, R, G, B); 879ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_ARGB argb1 = ArgbEncode(255, FXSYS_round(R * 255), FXSYS_round(G * 255), FXSYS_round(B * 255)); 880ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (argb0 != 0xFF000000 || argb1 != 0xFFFFFFFF) { 881ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov SetPaletteArgb(0, argb0); 882ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov SetPaletteArgb(1, argb1); 883ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 884ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 885ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 886ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pColorSpace == CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY) && m_bpc == 8 && m_bDefaultDecode) { 887ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 888ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int palette_count = 1 << (m_bpc * m_nComponents); 889ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_FixedBufGrow<FX_FLOAT, 16> color_values(m_nComponents); 890ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT* color_value = color_values; 891ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int i = 0; i < palette_count; i ++) { 892ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int color_data = i; 893ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_DWORD j = 0; j < m_nComponents; j ++) { 894ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int encoded_component = color_data % (1 << m_bpc); 895ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov color_data /= 1 << m_bpc; 896ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov color_value[j] = m_pCompData[j].m_DecodeMin + m_pCompData[j].m_DecodeStep * encoded_component; 897ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 898ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT R = 0, G = 0, B = 0; 899ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_nComponents == 1 && m_Family == PDFCS_ICCBASED && m_pColorSpace->CountComponents() > 1) { 900ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int nComponents = m_pColorSpace->CountComponents(); 901ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT* temp_buf = FX_Alloc(FX_FLOAT, nComponents); 902ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int i = 0; i < nComponents; i++) { 903ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov temp_buf[i] = *color_value; 904ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 905ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pColorSpace->GetRGB(temp_buf, R, G, B); 906ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_Free(temp_buf); 907ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 908ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pColorSpace->GetRGB(color_value, R, G, B); 909ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 910ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov SetPaletteArgb(i, ArgbEncode(255, FXSYS_round(R * 255), FXSYS_round(G * 255), FXSYS_round(B * 255))); 911ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 912ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 913ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 914ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 915ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_DWORD CPDF_DIBSource::GetValidBpp() const 916ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 917ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD bpc = m_bpc; 918ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object * pFilter = m_pDict->GetElementValue(FX_BSTRC("Filter")); 919ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(pFilter) 920ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 921ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(pFilter->GetType() == PDFOBJ_NAME) 922ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 923ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString filter = pFilter->GetString(); 924ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(filter == FX_BSTRC("CCITTFaxDecode") || filter == FX_BSTRC("JBIG2Decode") ) 925ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bpc = 1; 926ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(filter == FX_BSTRC("RunLengthDecode") || filter == FX_BSTRC("DCTDecode") ) 927ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bpc = 8; 928ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 929ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else if (pFilter->GetType() == PDFOBJ_ARRAY) 930ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 931ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Array *pArray = (CPDF_Array *) pFilter; 932ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if( pArray->GetString(pArray->GetCount() -1) == FX_BSTRC("CCITTFacDecode") || 933ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pArray->GetString(pArray->GetCount() -1) == FX_BSTRC("JBIG2Decode") ) 934ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bpc = 1; 935ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 936ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if( pArray->GetString(pArray->GetCount() -1) == FX_BSTRC("RunLengthDecode") || 937ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pArray->GetString(pArray->GetCount() -1) == FX_BSTRC("DCTDecode") ) 938ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bpc = 8; 939ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 940ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 941ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 942ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return bpc; 943ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 944ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 945ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define NORMALCOLOR_MAX(color, max) (color) > (max) ? (max) : (color) < 0 ? 0 : (color); 946ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_DIBSource::TranslateScanline24bpp(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan) const 947ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 948ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int max_data = (1 << m_bpc) - 1; 949ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bDefaultDecode) { 950ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_Family == PDFCS_DEVICERGB || m_Family == PDFCS_CALRGB) { 951ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bpc == 16) { 952ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPBYTE dest_pos = dest_scan; 953ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPCBYTE src_pos = src_scan; 954ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int col = 0; col < m_Width; col ++) { 955ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *dest_scan++ = src_pos[4]; 956ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *dest_scan++ = src_pos[2]; 957ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *dest_scan++ = *src_pos; 958ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov src_pos += 6; 959ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 960ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (m_bpc == 8) { 961ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPBYTE dest_pos = dest_scan; 962ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPCBYTE src_pos = src_scan; 963ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int column = 0; column < m_Width; column ++) { 964ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *dest_scan++ = src_pos[2]; 965ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *dest_scan++ = src_pos[1]; 966ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *dest_scan++ = *src_pos; 967ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov src_pos += 3; 968ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 969ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 970ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int src_bit_pos = 0; 971ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int dest_byte_pos = 0; 972ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 973ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD bpc = GetValidBpp(); 974ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 975ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int column = 0; column < m_Width; column ++) { 976ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int R = _GetBits8(src_scan, src_bit_pos, bpc); 977ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov src_bit_pos += bpc; 978ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int G = _GetBits8(src_scan, src_bit_pos, bpc); 979ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov src_bit_pos += bpc; 980ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int B = _GetBits8(src_scan, src_bit_pos, bpc); 981ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov src_bit_pos += bpc; 982ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov R = NORMALCOLOR_MAX(R, max_data); 983ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov G = NORMALCOLOR_MAX(G, max_data); 984ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov B = NORMALCOLOR_MAX(B, max_data); 985ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dest_scan[dest_byte_pos] = B * 255 / max_data; 986ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dest_scan[dest_byte_pos + 1] = G * 255 / max_data; 987ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dest_scan[dest_byte_pos + 2] = R * 255 / max_data; 988ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dest_byte_pos += 3; 989ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 990ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 991ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 992ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (m_bpc == 8) { 993ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_nComponents == m_pColorSpace->CountComponents()) 994ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pColorSpace->TranslateImageLine(dest_scan, src_scan, m_Width, m_Width, m_Height, 995ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bLoadMask && m_GroupFamily == PDFCS_DEVICECMYK && m_Family == PDFCS_DEVICECMYK); 996ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 997ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 998ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 999ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_FixedBufGrow<FX_FLOAT, 16> color_values1(m_nComponents); 1000ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT* color_values = color_values1; 1001ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT R, G, B; 1002ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bpc == 8) { 1003ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int src_byte_pos = 0; 1004ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int dest_byte_pos = 0; 1005ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int column = 0; column < m_Width; column ++) { 1006ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_DWORD color = 0; color < m_nComponents; color ++) { 1007ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int data = src_scan[src_byte_pos ++]; 1008ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov color_values[color] = m_pCompData[color].m_DecodeMin + 1009ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pCompData[color].m_DecodeStep * data; 1010ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1011ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bLoadMask && m_GroupFamily == PDFCS_DEVICECMYK && m_Family == PDFCS_DEVICECMYK) { 1012ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT k = 1.0f - color_values[3]; 1013ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov R = (1.0f - color_values[0]) * k; 1014ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov G = (1.0f - color_values[1]) * k; 1015ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov B = (1.0f - color_values[2]) * k; 1016ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1017ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pColorSpace->GetRGB(color_values, R, G, B); 1018ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1019ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov R = NORMALCOLOR_MAX(R, 1); 1020ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov G = NORMALCOLOR_MAX(G, 1); 1021ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov B = NORMALCOLOR_MAX(B, 1); 1022ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dest_scan[dest_byte_pos] = (FX_INT32)(B * 255); 1023ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dest_scan[dest_byte_pos + 1] = (FX_INT32)(G * 255); 1024ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dest_scan[dest_byte_pos + 2] = (FX_INT32)(R * 255); 1025ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dest_byte_pos += 3; 1026ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1027ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1028ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int src_bit_pos = 0; 1029ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int dest_byte_pos = 0; 1030ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1031ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD bpc = GetValidBpp(); 1032ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1033ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int column = 0; column < m_Width; column ++) { 1034ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_DWORD color = 0; color < m_nComponents; color ++) { 1035ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int data = _GetBits8(src_scan, src_bit_pos, bpc); 1036ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov color_values[color] = m_pCompData[color].m_DecodeMin + 1037ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pCompData[color].m_DecodeStep * data; 1038ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov src_bit_pos += bpc; 1039ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1040ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bLoadMask && m_GroupFamily == PDFCS_DEVICECMYK && m_Family == PDFCS_DEVICECMYK) { 1041ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT k = 1.0f - color_values[3]; 1042ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov R = (1.0f - color_values[0]) * k; 1043ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov G = (1.0f - color_values[1]) * k; 1044ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov B = (1.0f - color_values[2]) * k; 1045ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1046ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pColorSpace->GetRGB(color_values, R, G, B); 1047ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1048ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov R = NORMALCOLOR_MAX(R, 1); 1049ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov G = NORMALCOLOR_MAX(G, 1); 1050ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov B = NORMALCOLOR_MAX(B, 1); 1051ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dest_scan[dest_byte_pos] = (FX_INT32)(B * 255); 1052ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dest_scan[dest_byte_pos + 1] = (FX_INT32)(G * 255); 1053ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dest_scan[dest_byte_pos + 2] = (FX_INT32)(R * 255); 1054ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dest_byte_pos += 3; 1055ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1056ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1057ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1058ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_LPBYTE CPDF_DIBSource::GetBuffer() const 1059ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1060ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pCachedBitmap) { 1061ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_pCachedBitmap->GetBuffer(); 1062ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1063ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 1064ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1065ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_LPCBYTE CPDF_DIBSource::GetScanline(int line) const 1066ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1067ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD src_pitch = (m_Width * m_bpc * m_nComponents + 7) / 8; 1068ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPCBYTE pSrcLine = NULL; 1069ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pCachedBitmap) { 1070ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (line >= m_pCachedBitmap->GetHeight()) { 1071ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov line = m_pCachedBitmap->GetHeight() - 1; 1072ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1073ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pSrcLine = m_pCachedBitmap->GetScanline(line); 1074ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (m_pDecoder) { 1075ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pSrcLine = m_pDecoder->GetScanline(line); 1076ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1077ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pStreamAcc->GetSize() >= (line + 1) * src_pitch) { 1078ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pSrcLine = m_pStreamAcc->GetData() + line * src_pitch; 1079ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1080ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1081ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pSrcLine == NULL) { 1082ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPBYTE pLineBuf = m_pMaskedLine ? m_pMaskedLine : m_pLineBuf; 1083ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_memset8(pLineBuf, 0xff, m_Pitch); 1084ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pLineBuf; 1085ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1086ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bpc * m_nComponents == 1) { 1087ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bImageMask && m_bDefaultDecode) { 1088ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_DWORD i = 0; i < src_pitch; i ++) { 1089ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pLineBuf[i] = ~pSrcLine[i]; 1090ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1091ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (m_bColorKey) { 1092ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD reset_argb, set_argb; 1093ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov reset_argb = m_pPalette ? m_pPalette[0] : 0xff000000; 1094ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov set_argb = m_pPalette ? m_pPalette[1] : 0xffffffff; 1095ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pCompData[0].m_ColorKeyMin == 0) { 1096ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov reset_argb = 0; 1097ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1098ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pCompData[0].m_ColorKeyMax == 1) { 1099ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov set_argb = 0; 1100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov set_argb = FXARGB_TODIB(set_argb); 1102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov reset_argb = FXARGB_TODIB(reset_argb); 1103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD* dest_scan = (FX_DWORD*)m_pMaskedLine; 1104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int col = 0; col < m_Width; col ++) { 1105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pSrcLine[col / 8] & (1 << (7 - col % 8))) { 1106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *dest_scan = set_argb; 1107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *dest_scan = reset_argb; 1109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dest_scan ++; 1111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_pMaskedLine; 1113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_memcpy32(m_pLineBuf, pSrcLine, src_pitch); 1115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_pLineBuf; 1117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bpc * m_nComponents <= 8) { 1119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bpc == 8) { 1120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_memcpy32(m_pLineBuf, pSrcLine, src_pitch); 1121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int src_bit_pos = 0; 1123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int col = 0; col < m_Width; col ++) { 1124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int color_index = 0; 1125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_DWORD color = 0; color < m_nComponents; color ++) { 1126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int data = _GetBits8(pSrcLine, src_bit_pos, m_bpc); 1127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov color_index |= data << (color * m_bpc); 1128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov src_bit_pos += m_bpc; 1129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pLineBuf[col] = color_index; 1131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bColorKey) { 1134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPBYTE pDestPixel = m_pMaskedLine; 1135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPCBYTE pSrcPixel = m_pLineBuf; 1136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int col = 0; col < m_Width; col ++) { 1137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BYTE index = *pSrcPixel++; 1138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pPalette) { 1139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *pDestPixel++ = FXARGB_B(m_pPalette[index]); 1140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *pDestPixel++ = FXARGB_G(m_pPalette[index]); 1141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *pDestPixel++ = FXARGB_R(m_pPalette[index]); 1142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *pDestPixel++ = index; 1144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *pDestPixel++ = index; 1145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *pDestPixel++ = index; 1146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *pDestPixel = (index < m_pCompData[0].m_ColorKeyMin || index > m_pCompData[0].m_ColorKeyMax) ? 0xff : 0; 1148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pDestPixel ++ ; 1149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_pMaskedLine; 1151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_pLineBuf; 1153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bColorKey) { 1155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_nComponents == 3 && m_bpc == 8) { 1156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPBYTE alpha_channel = m_pMaskedLine + 3; 1157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int col = 0; col < m_Width; col ++) { 1158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPCBYTE pPixel = pSrcLine + col * 3; 1159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov alpha_channel[col * 4] = (pPixel[0] < m_pCompData[0].m_ColorKeyMin || 1160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pPixel[0] > m_pCompData[0].m_ColorKeyMax || 1161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pPixel[1] < m_pCompData[1].m_ColorKeyMin || pPixel[1] > m_pCompData[1].m_ColorKeyMax || 1162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pPixel[2] < m_pCompData[2].m_ColorKeyMin || pPixel[2] > m_pCompData[2].m_ColorKeyMax) ? 0xff : 0; 1163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_memset8(m_pMaskedLine, 0xff, m_Pitch); 1166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pColorSpace) { 1169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov TranslateScanline24bpp(m_pLineBuf, pSrcLine); 1170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pSrcLine = m_pLineBuf; 1171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bColorKey) { 1173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPCBYTE pSrcPixel = pSrcLine; 1174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPBYTE pDestPixel = m_pMaskedLine; 1175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int col = 0; col < m_Width; col ++) { 1176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *pDestPixel++ = *pSrcPixel++; 1177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *pDestPixel++ = *pSrcPixel++; 1178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *pDestPixel++ = *pSrcPixel++; 1179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pDestPixel ++; 1180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_pMaskedLine; 1182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pSrcLine; 1184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1185ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DIBSource::SkipToScanline(int line, IFX_Pause* pPause) const 1186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pDecoder) { 1188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_pDecoder->SkipToScanline(line, pPause); 1189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 1191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_DIBSource::DownSampleScanline(int line, FX_LPBYTE dest_scan, int dest_bpp, 1193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int dest_width, FX_BOOL bFlipX, int clip_left, int clip_width) const 1194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD src_width = m_Width; 1196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD src_pitch = (src_width * m_bpc * m_nComponents + 7) / 8; 1197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPCBYTE pSrcLine = NULL; 1198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pCachedBitmap) { 1199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pSrcLine = m_pCachedBitmap->GetScanline(line); 1200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (m_pDecoder) { 1201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pSrcLine = m_pDecoder->GetScanline(line); 1202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pStreamAcc->GetSize() >= (line + 1) * src_pitch) { 1204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pSrcLine = m_pStreamAcc->GetData() + line * src_pitch; 1205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int orig_Bpp = m_bpc * m_nComponents / 8; 1208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int dest_Bpp = dest_bpp / 8; 1209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pSrcLine == NULL) { 1210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_memset32(dest_scan, 0xff, dest_Bpp * clip_width); 1211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_FixedBufGrow<FX_BYTE, 128> temp(orig_Bpp); 1214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bpc * m_nComponents == 1) { 1215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD set_argb = (FX_DWORD) - 1, reset_argb = 0; 1216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bImageMask) { 1217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bDefaultDecode) { 1218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov set_argb = 0; 1219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov reset_argb = (FX_DWORD) - 1; 1220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (m_bColorKey) { 1222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov reset_argb = m_pPalette ? m_pPalette[0] : 0xff000000; 1223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov set_argb = m_pPalette ? m_pPalette[1] : 0xffffffff; 1224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pCompData[0].m_ColorKeyMin == 0) { 1225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov reset_argb = 0; 1226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pCompData[0].m_ColorKeyMax == 1) { 1228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov set_argb = 0; 1229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov set_argb = FXARGB_TODIB(set_argb); 1231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov reset_argb = FXARGB_TODIB(reset_argb); 1232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int i = 0; i < clip_width; i ++) { 1233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD src_x = (clip_left + i) * src_width / dest_width; 1234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bFlipX) { 1235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov src_x = src_width - src_x - 1; 1236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov src_x %= src_width; 1238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pSrcLine[src_x / 8] & (1 << (7 - src_x % 8))) { 1239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ((FX_DWORD*)dest_scan)[i] = set_argb; 1240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ((FX_DWORD*)dest_scan)[i] = reset_argb; 1242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (dest_Bpp == 1) { 1247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (m_pPalette) { 1248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov reset_argb = m_pPalette[0]; 1249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov set_argb = m_pPalette[1]; 1250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int i = 0; i < clip_width; i ++) { 1253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD src_x = (clip_left + i) * src_width / dest_width; 1254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bFlipX) { 1255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov src_x = src_width - src_x - 1; 1256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov src_x %= src_width; 1258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int dest_pos = i * dest_Bpp; 1259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pSrcLine[src_x / 8] & (1 << (7 - src_x % 8))) { 1260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (dest_Bpp == 1) { 1261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dest_scan[dest_pos] = (FX_BYTE)set_argb; 1262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (dest_Bpp == 3) { 1263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dest_scan[dest_pos] = FXARGB_B(set_argb); 1264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dest_scan[dest_pos + 1] = FXARGB_G(set_argb); 1265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dest_scan[dest_pos + 2] = FXARGB_R(set_argb); 1266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *(FX_DWORD*)(dest_scan + dest_pos) = set_argb; 1268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (dest_Bpp == 1) { 1271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dest_scan[dest_pos] = (FX_BYTE)reset_argb; 1272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (dest_Bpp == 3) { 1273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dest_scan[dest_pos] = FXARGB_B(reset_argb); 1274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dest_scan[dest_pos + 1] = FXARGB_G(reset_argb); 1275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dest_scan[dest_pos + 2] = FXARGB_R(reset_argb); 1276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *(FX_DWORD*)(dest_scan + dest_pos) = reset_argb; 1278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (m_bpc * m_nComponents <= 8) { 1283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bpc < 8) { 1284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int src_bit_pos = 0; 1285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_DWORD col = 0; col < src_width; col ++) { 1286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int color_index = 0; 1287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_DWORD color = 0; color < m_nComponents; color ++) { 1288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int data = _GetBits8(pSrcLine, src_bit_pos, m_bpc); 1289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov color_index |= data << (color * m_bpc); 1290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov src_bit_pos += m_bpc; 1291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pLineBuf[col] = color_index; 1293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pSrcLine = m_pLineBuf; 1295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bColorKey) { 1297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int i = 0; i < clip_width; i ++) { 1298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD src_x = (clip_left + i) * src_width / dest_width; 1299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bFlipX) { 1300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov src_x = src_width - src_x - 1; 1301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov src_x %= src_width; 1303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPBYTE pDestPixel = dest_scan + i * 4; 1304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BYTE index = pSrcLine[src_x]; 1305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pPalette) { 1306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *pDestPixel++ = FXARGB_B(m_pPalette[index]); 1307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *pDestPixel++ = FXARGB_G(m_pPalette[index]); 1308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *pDestPixel++ = FXARGB_R(m_pPalette[index]); 1309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *pDestPixel++ = index; 1311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *pDestPixel++ = index; 1312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *pDestPixel++ = index; 1313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *pDestPixel = (index < m_pCompData[0].m_ColorKeyMin || index > m_pCompData[0].m_ColorKeyMax) ? 0xff : 0; 1315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int i = 0; i < clip_width; i ++) { 1319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD src_x = (clip_left + i) * src_width / dest_width; 1320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bFlipX) { 1321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov src_x = src_width - src_x - 1; 1322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov src_x %= src_width; 1324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BYTE index = pSrcLine[src_x]; 1325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (dest_Bpp == 1) { 1326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dest_scan[i] = index; 1327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int dest_pos = i * dest_Bpp; 1329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_ARGB argb = m_pPalette[index]; 1330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dest_scan[dest_pos] = FXARGB_B(argb); 1331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dest_scan[dest_pos + 1] = FXARGB_G(argb); 1332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dest_scan[dest_pos + 2] = FXARGB_R(argb); 1333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int last_src_x = -1; 1338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_ARGB last_argb; 1339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT orig_Not8Bpp = (FX_FLOAT)m_bpc * (FX_FLOAT)m_nComponents / 8.0f; 1340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT unit_To8Bpc = 255.0f / ((1 << m_bpc) - 1); 1341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int i = 0; i < clip_width; i ++) { 1342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int dest_x = clip_left + i; 1343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD src_x = (bFlipX ? (dest_width - dest_x - 1) : dest_x) * (FX_INT64)src_width / dest_width; 1344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov src_x %= src_width; 1345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPCBYTE pSrcPixel = NULL; 1346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bpc % 8 == 0) { 1347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pSrcPixel = pSrcLine + src_x * orig_Bpp; 1348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pSrcPixel = pSrcLine + (int)(src_x * orig_Not8Bpp); 1350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPBYTE pDestPixel = dest_scan + i * dest_Bpp; 1352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_ARGB argb; 1353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (src_x == last_src_x) { 1354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov argb = last_argb; 1355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pColorSpace) { 1357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BYTE color[4]; 1358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_bDefaultDecode) { 1359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int i = 0; i < orig_Bpp; i ++) { 1360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int color_value = (int)((m_pCompData[i].m_DecodeMin + m_pCompData[i].m_DecodeStep * (FX_FLOAT)pSrcPixel[i]) * 255.0f + 0.5f); 1361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov temp[i] = color_value > 255 ? 255 : (color_value < 0 ? 0 : color_value); 1362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pColorSpace->TranslateImageLine(color, temp, 1, 0, 0, m_bLoadMask && m_GroupFamily == PDFCS_DEVICECMYK && m_Family == PDFCS_DEVICECMYK); 1364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bpc < 8) { 1366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int src_bit_pos = 0; 1367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (src_x % 2) { 1368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov src_bit_pos = 4; 1369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int value = (1 << m_bpc) - 1; 1371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_DWORD i = 0; i < m_nComponents; i ++) { 1372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov temp[i] = (FX_BYTE)(_GetBits8(pSrcPixel, src_bit_pos, m_bpc) * unit_To8Bpc); 1373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov src_bit_pos += m_bpc; 1374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pColorSpace->TranslateImageLine(color, temp, 1, 0, 0, m_bLoadMask && m_GroupFamily == PDFCS_DEVICECMYK && m_Family == PDFCS_DEVICECMYK); 1376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pColorSpace->TranslateImageLine(color, pSrcPixel, 1, 0, 0, m_bLoadMask && m_GroupFamily == PDFCS_DEVICECMYK && m_Family == PDFCS_DEVICECMYK); 1378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov argb = FXARGB_MAKE(0xff, color[2], color[1], color[0]); 1381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov argb = FXARGB_MAKE(0xff, pSrcPixel[2], pSrcPixel[1], pSrcPixel[0]); 1383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bColorKey) { 1385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int alpha = 0xff; 1386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_nComponents == 3 && m_bpc == 8) { 1387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov alpha = (pSrcPixel[0] < m_pCompData[0].m_ColorKeyMin || 1388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pSrcPixel[0] > m_pCompData[0].m_ColorKeyMax || 1389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pSrcPixel[1] < m_pCompData[1].m_ColorKeyMin || 1390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pSrcPixel[1] > m_pCompData[1].m_ColorKeyMax || 1391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pSrcPixel[2] < m_pCompData[2].m_ColorKeyMin || 1392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pSrcPixel[2] > m_pCompData[2].m_ColorKeyMax) ? 0xff : 0; 1393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov argb &= 0xffffff; 1395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov argb |= alpha << 24; 1396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov last_src_x = src_x; 1398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov last_argb = argb; 1399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (dest_Bpp == 4) { 1401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *(FX_DWORD*)pDestPixel = FXARGB_TODIB(argb); 1402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *pDestPixel++ = FXARGB_B(argb); 1404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *pDestPixel++ = FXARGB_G(argb); 1405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *pDestPixel = FXARGB_R(argb); 1406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_DIBSource::SetDownSampleSize(int dest_width, int dest_height) const 1411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pDecoder) { 1413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pDecoder->DownScale(dest_width, dest_height); 1414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ((CPDF_DIBSource*)this)->m_Width = m_pDecoder->GetWidth(); 1415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ((CPDF_DIBSource*)this)->m_Height = m_pDecoder->GetHeight(); 1416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_DIBSource::ClearImageData() 1419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pDecoder) { 1421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pDecoder->ClearImageData(); 1422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1424ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_ProgressiveImageLoaderHandle::CPDF_ProgressiveImageLoaderHandle() 1425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pImageLoader = NULL; 1427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pCache = NULL; 1428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pImage = NULL; 1429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1430ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_ProgressiveImageLoaderHandle::~CPDF_ProgressiveImageLoaderHandle() 1431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pImageLoader = NULL; 1433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pCache = NULL; 1434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pImage = NULL; 1435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1436ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_ProgressiveImageLoaderHandle::Start(CPDF_ImageLoader* pImageLoader, const CPDF_ImageObject* pImage, CPDF_PageRenderCache* pCache, FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask, CPDF_RenderStatus* pRenderStatus, FX_INT32 nDownsampleWidth, FX_INT32 nDownsampleHeight) 1437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pImageLoader = pImageLoader; 1439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pCache = pCache; 1440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pImage = (CPDF_ImageObject*)pImage; 1441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_nDownsampleWidth = nDownsampleWidth; 1442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_nDownsampleHeight = nDownsampleHeight; 1443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL ret; 1444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pCache) { 1445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ret = pCache->StartGetCachedBitmap(pImage->m_pImage->GetStream(), bStdCS, GroupFamily, bLoadMask, pRenderStatus, m_nDownsampleWidth, m_nDownsampleHeight); 1446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ret == FALSE) { 1447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pImageLoader->m_bCached = TRUE; 1448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pImageLoader->m_pBitmap = pCache->m_pCurImageCache->DetachBitmap(); 1449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pImageLoader->m_pMask = pCache->m_pCurImageCache->DetachMask(); 1450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pImageLoader->m_MatteColor = pCache->m_pCurImageCache->m_MatteColor; 1451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ret = pImage->m_pImage->StartLoadDIBSource(pRenderStatus->m_pFormResource, pRenderStatus->m_pPageResource, bStdCS, GroupFamily, bLoadMask); 1454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ret == FALSE) { 1455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pImageLoader->m_bCached = FALSE; 1456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pImageLoader->m_pBitmap = m_pImage->m_pImage->DetachBitmap(); 1457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pImageLoader->m_pMask = m_pImage->m_pImage->DetachMask(); 1458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pImageLoader->m_MatteColor = m_pImage->m_pImage->m_MatteColor; 1459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return ret; 1462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1463ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_ProgressiveImageLoaderHandle::Continue(IFX_Pause* pPause) 1464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL ret; 1466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pCache) { 1467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ret = m_pCache->Continue(pPause); 1468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ret == FALSE) { 1469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pImageLoader->m_bCached = TRUE; 1470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pImageLoader->m_pBitmap = m_pCache->m_pCurImageCache->DetachBitmap(); 1471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pImageLoader->m_pMask = m_pCache->m_pCurImageCache->DetachMask(); 1472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pImageLoader->m_MatteColor = m_pCache->m_pCurImageCache->m_MatteColor; 1473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ret = m_pImage->m_pImage->Continue(pPause); 1476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ret == FALSE) { 1477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pImageLoader->m_bCached = FALSE; 1478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pImageLoader->m_pBitmap = m_pImage->m_pImage->DetachBitmap(); 1479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pImageLoader->m_pMask = m_pImage->m_pImage->DetachMask(); 1480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pImageLoader->m_MatteColor = m_pImage->m_pImage->m_MatteColor; 1481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return ret; 1484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1485ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_ImageLoader::Load(const CPDF_ImageObject* pImage, CPDF_PageRenderCache* pCache, FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask, CPDF_RenderStatus* pRenderStatus) 1486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pImage == NULL) { 1488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 1489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pCache) { 1491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pCache->GetCachedBitmap(pImage->m_pImage->GetStream(), m_pBitmap, m_pMask, m_MatteColor, bStdCS, GroupFamily, bLoadMask, pRenderStatus, m_nDownsampleWidth, m_nDownsampleHeight); 1492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bCached = TRUE; 1493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pBitmap = pImage->m_pImage->LoadDIBSource(&m_pMask, &m_MatteColor, bStdCS, GroupFamily, bLoadMask); 1495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bCached = FALSE; 1496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 1498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1499ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_ImageLoader::StartLoadImage(const CPDF_ImageObject* pImage, CPDF_PageRenderCache* pCache, FX_LPVOID& LoadHandle, FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask, CPDF_RenderStatus* pRenderStatus, FX_INT32 nDownsampleWidth, FX_INT32 nDownsampleHeight) 1500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_nDownsampleWidth = nDownsampleWidth; 1502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_nDownsampleHeight = nDownsampleHeight; 1503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_ProgressiveImageLoaderHandle* pLoaderHandle = NULL; 1504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pLoaderHandle = FX_NEW CPDF_ProgressiveImageLoaderHandle; 1505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL ret = pLoaderHandle->Start(this, pImage, pCache, bStdCS, GroupFamily, bLoadMask, pRenderStatus, m_nDownsampleWidth, m_nDownsampleHeight); 1506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov LoadHandle = pLoaderHandle; 1507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return ret; 1508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1509ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_ImageLoader::Continue(FX_LPVOID LoadHandle, IFX_Pause* pPause) 1510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return ((CPDF_ProgressiveImageLoaderHandle*)LoadHandle)->Continue(pPause); 1512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1513ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_ImageLoader::~CPDF_ImageLoader() 1514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_bCached) { 1516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pBitmap) { 1517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete m_pBitmap; 1518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pBitmap = NULL; 1519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pMask) { 1521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete m_pMask; 1522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1525