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