summaryrefslogtreecommitdiff
path: root/core/src/fxcodec/codec/fx_codec_progress.h
blob: ea53c8f01090e591d3c409d221f0d9eeb67d1552 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#ifndef _FX_CODEC_PROGRESS_H_
#define _FX_CODEC_PROGRESS_H_
#define FXCODEC_BLOCK_SIZE 4096
#define FXCODEC_PNG_GAMMA	2.2
#if _FX_OS_ == _FX_MACOSX_ || _FX_OS_ == _FX_IOS_
#	undef FXCODEC_PNG_GAMMA
#	define FXCODEC_PNG_GAMMA	1.7
#endif
struct PixelWeight {
    int		m_SrcStart;
    int		m_SrcEnd;
    int		m_Weights[1];
};
class CFXCODEC_WeightTable
{
public:
    CFXCODEC_WeightTable()
    {
        m_pWeightTables = NULL;
    }
    ~CFXCODEC_WeightTable()
    {
        if(m_pWeightTables != NULL) {
            FX_Free(m_pWeightTables);
        }
    }

    void			Calc(int dest_len, int dest_min, int dest_max, int src_len, int src_min, int src_max, FX_BOOL bInterpol);
    PixelWeight*	GetPixelWeight(int pixel)
    {
        return (PixelWeight*)(m_pWeightTables + (pixel - m_DestMin) * m_ItemSize);
    }

    int				m_DestMin, m_ItemSize;
    FX_LPBYTE		m_pWeightTables;
};
class CFXCODEC_HorzTable
{
public:
    CFXCODEC_HorzTable()
    {
        m_pWeightTables = NULL;
    }
    ~CFXCODEC_HorzTable()
    {
        if(m_pWeightTables != NULL) {
            FX_Free(m_pWeightTables);
        }
    }

    void			Calc(int dest_len, int src_len, FX_BOOL bInterpol);
    PixelWeight*	GetPixelWeight(int pixel)
    {
        return (PixelWeight*)(m_pWeightTables + pixel * m_ItemSize);
    }

    int				m_ItemSize;
    FX_LPBYTE		m_pWeightTables;
};
class CFXCODEC_VertTable
{
public:
    CFXCODEC_VertTable()
    {
        m_pWeightTables = NULL;
    }
    ~CFXCODEC_VertTable()
    {
        if(m_pWeightTables != NULL) {
            FX_Free(m_pWeightTables);
        }
    }
    void			Calc(int dest_len, int src_len);
    PixelWeight*	GetPixelWeight(int pixel)
    {
        return (PixelWeight*)(m_pWeightTables + pixel * m_ItemSize);
    }
    int				m_ItemSize;
    FX_LPBYTE		m_pWeightTables;
};
enum FXCodec_Format {
    FXCodec_Invalid = 0,
    FXCodec_1bppGray = 0x101,
    FXCodec_1bppRgb = 0x001,
    FXCodec_8bppGray = 0x108,
    FXCodec_8bppRgb = 0x008,
    FXCodec_Rgb = 0x018,
    FXCodec_Rgb32 = 0x020,
    FXCodec_Argb = 0x220,
    FXCodec_Cmyk = 0x120
};
class CCodec_ProgressiveDecoder : public ICodec_ProgressiveDecoder
{
public:
    CCodec_ProgressiveDecoder(CCodec_ModuleMgr* pCodecMgr);
    virtual ~CCodec_ProgressiveDecoder();

public:
    virtual FXCODEC_STATUS		LoadImageInfo(IFX_FileRead* pFile, FXCODEC_IMAGE_TYPE imageType, CFX_DIBAttribute* pAttribute);

    virtual FXCODEC_IMAGE_TYPE	GetType()
    {
        return m_imagType;
    }
    virtual FX_INT32			GetWidth()
    {
        return m_SrcWidth;
    }
    virtual FX_INT32			GetHeight()
    {
        return m_SrcHeight;
    }
    virtual FX_INT32			GetNumComponents()
    {
        return m_SrcComponents;
    }
    virtual FX_INT32			GetBPC()
    {
        return m_SrcBPC;
    }
    virtual void				SetClipBox(FX_RECT* clip);
    virtual FXCODEC_STATUS		GetFrames(FX_INT32& frames, IFX_Pause* pPause);

    virtual FXCODEC_STATUS		StartDecode(CFX_DIBitmap* pDIBitmap,
                                            int start_x, int start_y, int size_x, int size_y,
                                            FX_INT32 frames, FX_BOOL bInterpol);

    virtual FXCODEC_STATUS		ContinueDecode(IFX_Pause* pPause);

protected:
    FX_BOOL						DetectImageType(FXCODEC_IMAGE_TYPE imageType, CFX_DIBAttribute* pAttribute = NULL);
    void						GetDownScale(int& down_scale);
    void						GetTransMethod(FXDIB_Format des_format, FXCodec_Format src_format);
    void						ReSampleScanline(CFX_DIBitmap* pDeviceBitmap, FX_INT32 des_line, FX_LPBYTE src_scan, FXCodec_Format src_format);
    void						Resample(CFX_DIBitmap* pDeviceBitmap, FX_INT32 src_line, FX_LPBYTE src_scan, FXCodec_Format src_format);
    void						ResampleVert(CFX_DIBitmap* pDeviceBitmap, double scale_y, int des_row);
    FX_BOOL						JpegReadMoreData(ICodec_JpegModule* pJpegModule, FXCODEC_STATUS& err_status);
    static FX_BOOL				PngReadHeaderFunc(void* pModule, int width, int height, int bpc, int pass, int* color_type, double* gamma);
    static FX_BOOL				PngAskScanlineBufFunc(void* pModule, int line, FX_LPBYTE& src_buf);
    static void					PngFillScanlineBufCompletedFunc(void* pModule, int pass, int line);
    void						PngOneOneMapResampleHorz(CFX_DIBitmap* pDeviceBitmap, FX_INT32 des_line, FX_LPBYTE src_scan, FXCodec_Format src_format);

    FX_BOOL						GifReadMoreData(ICodec_GifModule* pGifModule, FXCODEC_STATUS& err_status);
    static void					GifRecordCurrentPositionCallback(void* pModule, FX_DWORD& cur_pos);
    static FX_LPBYTE			GifAskLocalPaletteBufCallback(void* pModule, FX_INT32 frame_num, FX_INT32 pal_size);
    static FX_BOOL				GifInputRecordPositionBufCallback(void* pModule, FX_DWORD rcd_pos, const FX_RECT& img_rc,
            FX_INT32 pal_num, void* pal_ptr,
            FX_INT32 delay_time, FX_BOOL user_input,
            FX_INT32 trans_index, FX_INT32 disposal_method, FX_BOOL interlace);
    static void					GifReadScanlineCallback(void* pModule, FX_INT32 row_num, FX_LPBYTE row_buf);
    void						GifDoubleLineResampleVert(CFX_DIBitmap* pDeviceBitmap, double scale_y, int des_row);
    FX_BOOL						BmpReadMoreData(ICodec_BmpModule* pBmpModule, FXCODEC_STATUS& err_status);
    static FX_BOOL				BmpInputImagePositionBufCallback(void* pModule, FX_DWORD rcd_pos);
    static void					BmpReadScanlineCallback(void* pModule, FX_INT32 row_num, FX_LPBYTE row_buf);
    void						ResampleVertBT(CFX_DIBitmap* pDeviceBitmap, double scale_y, int des_row);
public:
    IFX_FileRead*				m_pFile;
    CCodec_ModuleMgr*			m_pCodecMgr;
    FX_LPVOID					m_pJpegContext;
    FX_LPVOID					m_pPngContext;
    FX_LPVOID					m_pGifContext;
    FX_LPVOID					m_pBmpContext;
    FX_LPVOID					m_pTiffContext;
    FXCODEC_IMAGE_TYPE			m_imagType;
    FX_DWORD					m_offSet;
    FX_LPBYTE					m_pSrcBuf;
    FX_DWORD					m_SrcSize;
    FX_LPBYTE					m_pDecodeBuf;
    int							m_ScanlineSize;
    CFX_DIBitmap*				m_pDeviceBitmap;
    FX_BOOL						m_bInterpol;
    CFXCODEC_WeightTable		m_WeightHorz;
    CFXCODEC_VertTable			m_WeightVert;
    CFXCODEC_HorzTable			m_WeightHorzOO;
    int			m_SrcWidth;
    int			m_SrcHeight;
    int			m_SrcComponents;
    int			m_SrcBPC;
    FX_RECT		m_clipBox;
    int			m_startX;
    int			m_startY;
    int			m_sizeX;
    int			m_sizeY;
    int			m_TransMethod;
    FX_ARGB*	m_pSrcPalette;
    int			m_SrcPaletteNumber;
    int			m_SrcRow;
    FXCodec_Format m_SrcFormat;
    int			m_SrcPassNumber;
    int			m_FrameNumber;
    int			m_FrameCur;
    int				m_GifBgIndex;
    FX_LPBYTE		m_pGifPalette;
    FX_INT32		m_GifPltNumber;
    int				m_GifTransIndex;
    FX_RECT			m_GifFrameRect;
    FX_BOOL			m_BmpIsTopBottom;
    FXCODEC_STATUS m_status;
};
#endif