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
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
|
// 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_BASIC_H_
#include "../../../include/fxcrt/fx_basic.h"
#endif
extern FX_WORD _GetWord_LSBFirst(FX_LPBYTE p);
extern void _SetWord_LSBFirst(FX_LPBYTE p, FX_WORD v);
extern void _BpcConvert(FX_LPCBYTE src_buf, FX_DWORD src_len, FX_INT32 src_bpc, FX_INT32 dst_bpc,
FX_LPBYTE& dst_buf, FX_DWORD& dst_len);
#define GIF_SUPPORT_COMMENT_EXTENSION
#define GIF_SUPPORT_GRAPHIC_CONTROL_EXTENSION
#define GIF_SUPPORT_PLAIN_TEXT_EXTENSION
#define GIF_SIGNATURE "GIF"
#define GIF_SIG_EXTENSION 0x21
#define GIF_SIG_IMAGE 0x2C
#define GIF_SIG_TRAILER 0x3B
#define GIF_BLOCK_GCE 0xF9
#define GIF_BLOCK_PTE 0x01
#define GIF_BLOCK_CE 0xFE
#define GIF_BLOCK_AE 0xFF
#define GIF_BLOCK_TERMINAL 0x00
#define GIF_MAX_LZW_CODE 4096
#define GIF_DATA_BLOCK 255
#define GIF_MAX_ERROR_SIZE 256
#define GIF_D_STATUS_SIG 0x01
#define GIF_D_STATUS_TAIL 0x02
#define GIF_D_STATUS_EXT 0x03
#define GIF_D_STATUS_EXT_AE 0x04
#define GIF_D_STATUS_EXT_CE 0x05
#define GIF_D_STATUS_EXT_GCE 0x06
#define GIF_D_STATUS_EXT_PTE 0x07
#define GIF_D_STATUS_EXT_UNE 0x08
#define GIF_D_STATUS_IMG_INFO 0x09
#define GIF_D_STATUS_IMG_DATA 0x0A
#pragma pack(1)
typedef struct tagGifGF {
FX_BYTE pal_bits : 3;
FX_BYTE sort_flag : 1;
FX_BYTE color_resolution : 3;
FX_BYTE global_pal : 1;
} GifGF;
typedef struct tagGifLF {
FX_BYTE pal_bits : 3;
FX_BYTE reserved : 2;
FX_BYTE sort_flag : 1;
FX_BYTE interlace : 1;
FX_BYTE local_pal : 1;
} GifLF;
typedef struct tagGifHeader {
char signature[3];
char version[3];
} GifHeader;
typedef struct tagGifLSD {
FX_WORD width;
FX_WORD height;
FX_BYTE global_flag;
FX_BYTE bc_index;
FX_BYTE pixel_aspect;
} GifLSD;
typedef struct tagGifImageInfo {
FX_WORD left;
FX_WORD top;
FX_WORD width;
FX_WORD height;
FX_BYTE local_flag;
} GifImageInfo;
typedef struct tagGifCEF {
FX_BYTE transparency : 1;
FX_BYTE user_input : 1;
FX_BYTE disposal_method : 3;
FX_BYTE reserved : 3;
} GifCEF;
typedef struct tagGifGCE {
FX_BYTE block_size;
FX_BYTE gce_flag;
FX_WORD delay_time;
FX_BYTE trans_index;
} GifGCE;
typedef struct tagGifPTE {
FX_BYTE block_size;
FX_WORD grid_left;
FX_WORD grid_top;
FX_WORD grid_width;
FX_WORD grid_height;
FX_BYTE char_width;
FX_BYTE char_height;
FX_BYTE fc_index;
FX_BYTE bc_index;
} GifPTE;
typedef struct tagGifAE {
FX_BYTE block_size;
FX_BYTE app_identify[8];
FX_BYTE app_authentication[3];
} GifAE;
typedef struct tagGifPalette {
FX_BYTE r, g, b;
} GifPalette;
#pragma pack()
typedef struct tagGifImage {
GifGCE* image_gce_ptr;
GifPalette* local_pal_ptr;
GifImageInfo* image_info_ptr;
FX_BYTE image_code_size;
FX_DWORD image_data_pos;
FX_LPBYTE image_row_buf;
FX_INT32 image_row_num;
} GifImage;
typedef struct tagGifPlainText {
GifGCE* gce_ptr;
GifPTE* pte_ptr;
CFX_ByteString* string_ptr;
} GifPlainText;
class CGifLZWDecoder
{
public:
struct tag_Table {
FX_WORD prefix;
FX_BYTE suffix;
};
CGifLZWDecoder(FX_LPSTR error_ptr = NULL)
{
err_msg_ptr = error_ptr;
}
void InitTable(FX_BYTE code_len);
FX_INT32 Decode(FX_LPBYTE des_buf, FX_DWORD& des_size);
void Input(FX_LPBYTE src_buf, FX_DWORD src_size);
FX_DWORD GetAvailInput();
private:
void ClearTable();
void AddCode(FX_WORD prefix_code, FX_BYTE append_char);
void DecodeString(FX_WORD code);
FX_BYTE code_size;
FX_BYTE code_size_cur;
FX_WORD code_clear;
FX_WORD code_end;
FX_WORD code_next;
FX_BYTE code_first;
FX_BYTE stack[GIF_MAX_LZW_CODE];
FX_WORD stack_size;
tag_Table code_table[GIF_MAX_LZW_CODE];
FX_WORD code_old;
FX_LPBYTE next_in;
FX_DWORD avail_in;
FX_BYTE bits_left;
FX_DWORD code_store;
FX_LPSTR err_msg_ptr;
};
class CGifLZWEncoder
{
public:
struct tag_Table {
FX_WORD prefix;
FX_BYTE suffix;
};
CGifLZWEncoder();
~CGifLZWEncoder();
void Start(FX_BYTE code_len, FX_LPCBYTE src_buf, FX_LPBYTE& dst_buf, FX_DWORD& offset);
FX_BOOL Encode(FX_LPCBYTE src_buf, FX_DWORD src_len, FX_LPBYTE& dst_buf, FX_DWORD& dst_len, FX_DWORD& offset);
void Finish(FX_LPBYTE& dst_buf, FX_DWORD& dst_len, FX_DWORD& offset);
private:
void ClearTable();
FX_BOOL LookUpInTable(FX_LPCBYTE buf, FX_DWORD& offset, FX_BYTE& bit_offset);
void EncodeString(FX_DWORD index, FX_LPBYTE& dst_buf, FX_DWORD& dst_len, FX_DWORD& offset);
void WriteBlock(FX_LPBYTE& dst_buf, FX_DWORD& dst_len, FX_DWORD& offset);
jmp_buf jmp;
FX_DWORD src_offset;
FX_BYTE src_bit_offset;
FX_BYTE src_bit_cut;
FX_DWORD src_bit_num;
FX_BYTE code_size;
FX_WORD code_clear;
FX_WORD code_end;
FX_WORD index_num;
FX_BYTE bit_offset;
FX_BYTE index_bit_cur;
FX_BYTE index_buf[GIF_DATA_BLOCK];
FX_BYTE index_buf_len;
tag_Table code_table[GIF_MAX_LZW_CODE];
FX_WORD table_cur;
};
typedef struct tag_gif_decompress_struct gif_decompress_struct;
typedef gif_decompress_struct *gif_decompress_struct_p;
typedef gif_decompress_struct_p *gif_decompress_struct_pp;
static FX_INT32 s_gif_interlace_step[4] = {8, 8, 4, 2};
struct tag_gif_decompress_struct {
jmp_buf jmpbuf;
FX_LPSTR err_ptr;
void (*_gif_error_fn)(gif_decompress_struct_p gif_ptr, FX_LPCSTR err_msg);
void* context_ptr;
int width;
int height;
GifPalette* global_pal_ptr;
FX_INT32 global_pal_num;
FX_BYTE global_sort_flag;
FX_BYTE global_color_resolution;
FX_BYTE bc_index;
FX_BYTE pixel_aspect;
CGifLZWDecoder* img_decoder_ptr;
FX_DWORD img_row_offset;
FX_DWORD img_row_avail_size;
FX_BYTE img_pass_num;
CFX_ArrayTemplate<GifImage*>* img_ptr_arr_ptr;
FX_LPBYTE (*_gif_ask_buf_for_pal_fn)(gif_decompress_struct_p gif_ptr, FX_INT32 pal_size);
FX_LPBYTE next_in;
FX_DWORD avail_in;
FX_INT32 decode_status;
FX_DWORD skip_size;
void (*_gif_record_current_position_fn)(gif_decompress_struct_p gif_ptr, FX_DWORD* cur_pos_ptr);
void (*_gif_get_row_fn)(gif_decompress_struct_p gif_ptr, FX_INT32 row_num, FX_LPBYTE row_buf);
FX_BOOL (*_gif_get_record_position_fn)(gif_decompress_struct_p gif_ptr, FX_DWORD cur_pos,
FX_INT32 left, FX_INT32 top, FX_INT32 width, FX_INT32 height,
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);
#ifdef GIF_SUPPORT_APPLICATION_EXTENSION
FX_BYTE app_identify[8];
FX_BYTE app_authentication[3];
FX_DWORD app_data_size;
FX_LPBYTE app_data;
#endif
#ifdef GIF_SUPPORT_COMMENT_EXTENSION
CFX_ByteString* cmt_data_ptr;
#endif
#ifdef GIF_SUPPORT_GRAPHIC_CONTROL_EXTENSION
GifGCE* gce_ptr;
#endif
#ifdef GIF_SUPPORT_PLAIN_TEXT_EXTENSION
CFX_ArrayTemplate<GifPlainText*>* pt_ptr_arr_ptr;
#endif
};
typedef struct tag_gif_compress_struct gif_compress_struct;
typedef gif_compress_struct *gif_compress_struct_p;
typedef gif_compress_struct_p *gif_compress_struct_pp;
struct tag_gif_compress_struct {
FX_LPCBYTE src_buf;
FX_DWORD src_pitch;
FX_DWORD src_width;
FX_DWORD src_row;
FX_DWORD cur_offset;
FX_DWORD frames;
GifHeader* header_ptr;
GifLSD* lsd_ptr;
GifPalette* global_pal;
FX_WORD gpal_num;
GifPalette* local_pal;
FX_WORD lpal_num;
GifImageInfo* image_info_ptr;
CGifLZWEncoder* img_encoder_ptr;
#ifdef GIF_SUPPORT_APPLICATION_EXTENSION
FX_BYTE app_identify[8];
FX_BYTE app_authentication[3];
FX_DWORD app_data_size;
FX_LPBYTE app_data;
#endif
#ifdef GIF_SUPPORT_COMMENT_EXTENSION
FX_LPBYTE cmt_data_ptr;
FX_DWORD cmt_data_len;
#endif
#ifdef GIF_SUPPORT_GRAPHIC_CONTROL_EXTENSION
GifGCE* gce_ptr;
#endif
#ifdef GIF_SUPPORT_PLAIN_TEXT_EXTENSION
GifPTE* pte_ptr;
FX_LPCBYTE pte_data_ptr;
FX_DWORD pte_data_len;
#endif
};
void _gif_error(gif_decompress_struct_p gif_ptr, FX_LPCSTR err_msg);
void _gif_warn(gif_decompress_struct_p gif_ptr, FX_LPCSTR err_msg);
gif_decompress_struct_p _gif_create_decompress();
void _gif_destroy_decompress(gif_decompress_struct_pp gif_ptr_ptr);
gif_compress_struct_p _gif_create_compress();
void _gif_destroy_compress(gif_compress_struct_pp gif_ptr_ptr);
FX_INT32 _gif_read_header(gif_decompress_struct_p gif_ptr);
FX_INT32 _gif_get_frame(gif_decompress_struct_p gif_ptr);
FX_INT32 _gif_get_frame_num(gif_decompress_struct_p gif_ptr);
FX_INT32 _gif_decode_extension(gif_decompress_struct_p gif_ptr);
FX_INT32 _gif_decode_image_info(gif_decompress_struct_p gif_ptr);
void _gif_takeover_gce_ptr(gif_decompress_struct_p gif_ptr, GifGCE** gce_ptr_ptr);
FX_INT32 _gif_load_frame(gif_decompress_struct_p gif_ptr, FX_INT32 frame_num);
FX_LPBYTE _gif_read_data(gif_decompress_struct_p gif_ptr, FX_LPBYTE* des_buf_pp, FX_DWORD data_size);
void _gif_save_decoding_status(gif_decompress_struct_p gif_ptr, FX_INT32 status);
void _gif_input_buffer(gif_decompress_struct_p gif_ptr, FX_LPBYTE src_buf, FX_DWORD src_size);
FX_DWORD _gif_get_avail_input(gif_decompress_struct_p gif_ptr, FX_LPBYTE* avial_buf_ptr);
void interlace_buf(FX_LPCBYTE buf, FX_DWORD width, FX_DWORD height);
FX_BOOL _gif_encode( gif_compress_struct_p gif_ptr, FX_LPBYTE& dst_buf, FX_DWORD& dst_len );
#define GIF_PTR_NOT_NULL(ptr,gif_ptr) if(ptr == NULL){ \
_gif_error(gif_ptr,"Out Of Memory");\
return 0; \
}
|