Merge to XFA: Remove more cruft from fx_system.h
[pdfium.git] / core / src / fxcodec / lgif / fx_gif.h
1 // Copyright 2014 PDFium Authors. All rights reserved.\r
2 // Use of this source code is governed by a BSD-style license that can be\r
3 // found in the LICENSE file.\r
4 \r
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\r
6 \r
7 #include <setjmp.h>\r
8 \r
9 #include "../../../include/fxcrt/fx_basic.h"\r
10 \r
11 extern FX_WORD _GetWord_LSBFirst(FX_LPBYTE p);\r
12 extern void _SetWord_LSBFirst(FX_LPBYTE p, FX_WORD v);\r
13 extern void _BpcConvert(FX_LPCBYTE src_buf, FX_DWORD src_len, FX_INT32 src_bpc, FX_INT32 dst_bpc,\r
14                         FX_LPBYTE& dst_buf, FX_DWORD& dst_len);\r
15 #define GIF_SUPPORT_COMMENT_EXTENSION\r
16 #define GIF_SUPPORT_GRAPHIC_CONTROL_EXTENSION\r
17 #define GIF_SUPPORT_PLAIN_TEXT_EXTENSION\r
18 #define GIF_SIGNATURE           "GIF"\r
19 #define GIF_SIG_EXTENSION       0x21\r
20 #define GIF_SIG_IMAGE           0x2C\r
21 #define GIF_SIG_TRAILER         0x3B\r
22 #define GIF_BLOCK_GCE           0xF9\r
23 #define GIF_BLOCK_PTE           0x01\r
24 #define GIF_BLOCK_CE            0xFE\r
25 #define GIF_BLOCK_AE            0xFF\r
26 #define GIF_BLOCK_TERMINAL      0x00\r
27 #define GIF_MAX_LZW_CODE        4096\r
28 #define GIF_DATA_BLOCK          255\r
29 #define GIF_MAX_ERROR_SIZE      256\r
30 #define GIF_D_STATUS_SIG                0x01\r
31 #define GIF_D_STATUS_TAIL               0x02\r
32 #define GIF_D_STATUS_EXT                0x03\r
33 #define GIF_D_STATUS_EXT_AE             0x04\r
34 #define GIF_D_STATUS_EXT_CE             0x05\r
35 #define GIF_D_STATUS_EXT_GCE    0x06\r
36 #define GIF_D_STATUS_EXT_PTE    0x07\r
37 #define GIF_D_STATUS_EXT_UNE    0x08\r
38 #define GIF_D_STATUS_IMG_INFO   0x09\r
39 #define GIF_D_STATUS_IMG_DATA   0x0A\r
40 #pragma pack(1)\r
41 typedef struct tagGifGF {\r
42     FX_BYTE pal_bits : 3;\r
43     FX_BYTE sort_flag : 1;\r
44     FX_BYTE color_resolution : 3;\r
45     FX_BYTE global_pal : 1;\r
46 } GifGF;\r
47 typedef struct tagGifLF {\r
48     FX_BYTE pal_bits : 3;\r
49     FX_BYTE reserved : 2;\r
50     FX_BYTE sort_flag : 1;\r
51     FX_BYTE interlace : 1;\r
52     FX_BYTE local_pal : 1;\r
53 } GifLF;\r
54 typedef struct tagGifHeader {\r
55     char signature[3];\r
56     char version[3];\r
57 } GifHeader;\r
58 typedef struct tagGifLSD {\r
59     FX_WORD     width;\r
60     FX_WORD height;\r
61     FX_BYTE     global_flag;\r
62     FX_BYTE bc_index;\r
63     FX_BYTE     pixel_aspect;\r
64 } GifLSD;\r
65 typedef struct tagGifImageInfo {\r
66     FX_WORD left;\r
67     FX_WORD top;\r
68     FX_WORD width;\r
69     FX_WORD height;\r
70 \r
71     FX_BYTE     local_flag;\r
72 } GifImageInfo;\r
73 typedef struct tagGifCEF {\r
74     FX_BYTE transparency : 1;\r
75     FX_BYTE user_input : 1;\r
76     FX_BYTE disposal_method : 3;\r
77     FX_BYTE reserved : 3;\r
78 } GifCEF;\r
79 typedef struct tagGifGCE {\r
80     FX_BYTE block_size;\r
81     FX_BYTE     gce_flag;\r
82     FX_WORD delay_time;\r
83     FX_BYTE     trans_index;\r
84 } GifGCE;\r
85 typedef struct tagGifPTE {\r
86     FX_BYTE block_size;\r
87     FX_WORD     grid_left;\r
88     FX_WORD     grid_top;\r
89     FX_WORD grid_width;\r
90     FX_WORD     grid_height;\r
91 \r
92     FX_BYTE char_width;\r
93     FX_BYTE char_height;\r
94 \r
95     FX_BYTE fc_index;\r
96     FX_BYTE bc_index;\r
97 } GifPTE;\r
98 typedef struct tagGifAE {\r
99     FX_BYTE block_size;\r
100     FX_BYTE app_identify[8];\r
101     FX_BYTE     app_authentication[3];\r
102 } GifAE;\r
103 typedef struct tagGifPalette {\r
104     FX_BYTE r, g, b;\r
105 } GifPalette;\r
106 #pragma pack()\r
107 typedef struct tagGifImage {\r
108     GifGCE*                     image_gce_ptr;\r
109     GifPalette*         local_pal_ptr;\r
110     GifImageInfo*       image_info_ptr;\r
111     FX_BYTE                     image_code_size;\r
112     FX_DWORD            image_data_pos;\r
113     FX_LPBYTE           image_row_buf;\r
114     FX_INT32            image_row_num;\r
115 } GifImage;\r
116 typedef struct tagGifPlainText {\r
117     GifGCE*                     gce_ptr;\r
118     GifPTE*                     pte_ptr;\r
119     CFX_ByteString* string_ptr;\r
120 } GifPlainText;\r
121 class CGifLZWDecoder\r
122 {\r
123 public:\r
124     struct tag_Table {\r
125         FX_WORD prefix;\r
126         FX_BYTE suffix;\r
127     };\r
128     CGifLZWDecoder(FX_LPSTR error_ptr = NULL)\r
129     {\r
130         err_msg_ptr = error_ptr;\r
131     }\r
132     void                InitTable(FX_BYTE code_len);\r
133 \r
134     FX_INT32    Decode(FX_LPBYTE des_buf, FX_DWORD& des_size);\r
135 \r
136     void                Input(FX_LPBYTE src_buf, FX_DWORD src_size);\r
137     FX_DWORD    GetAvailInput();\r
138 \r
139 private:\r
140     void                ClearTable();\r
141     void                AddCode(FX_WORD prefix_code, FX_BYTE append_char);\r
142     void                DecodeString(FX_WORD code);\r
143     FX_BYTE             code_size;\r
144     FX_BYTE             code_size_cur;\r
145     FX_WORD             code_clear;\r
146     FX_WORD             code_end;\r
147     FX_WORD             code_next;\r
148     FX_BYTE             code_first;\r
149     FX_BYTE             stack[GIF_MAX_LZW_CODE];\r
150     FX_WORD             stack_size;\r
151     tag_Table   code_table[GIF_MAX_LZW_CODE];\r
152     FX_WORD             code_old;\r
153 \r
154     FX_LPBYTE   next_in;\r
155     FX_DWORD    avail_in;\r
156 \r
157     FX_BYTE             bits_left;\r
158     FX_DWORD    code_store;\r
159 \r
160     FX_LPSTR    err_msg_ptr;\r
161 };\r
162 class CGifLZWEncoder\r
163 {\r
164 public:\r
165     struct tag_Table {\r
166         FX_WORD         prefix;\r
167         FX_BYTE         suffix;\r
168     };\r
169     CGifLZWEncoder();\r
170     ~CGifLZWEncoder();\r
171     void                Start(FX_BYTE code_len, FX_LPCBYTE src_buf, FX_LPBYTE& dst_buf, FX_DWORD& offset);\r
172     FX_BOOL             Encode(FX_LPCBYTE src_buf, FX_DWORD src_len, FX_LPBYTE& dst_buf, FX_DWORD& dst_len, FX_DWORD& offset);\r
173     void                Finish(FX_LPBYTE& dst_buf, FX_DWORD& dst_len, FX_DWORD& offset);\r
174 private:\r
175     void                ClearTable();\r
176     FX_BOOL             LookUpInTable(FX_LPCBYTE buf, FX_DWORD& offset, FX_BYTE& bit_offset);\r
177     void                EncodeString(FX_DWORD index, FX_LPBYTE& dst_buf, FX_DWORD& dst_len, FX_DWORD& offset);\r
178     void                WriteBlock(FX_LPBYTE& dst_buf, FX_DWORD& dst_len, FX_DWORD& offset);\r
179     jmp_buf             jmp;\r
180     FX_DWORD    src_offset;\r
181     FX_BYTE             src_bit_offset;\r
182     FX_BYTE             src_bit_cut;\r
183     FX_DWORD    src_bit_num;\r
184     FX_BYTE             code_size;\r
185     FX_WORD             code_clear;\r
186     FX_WORD             code_end;\r
187     FX_WORD             index_num;\r
188     FX_BYTE             bit_offset;\r
189     FX_BYTE             index_bit_cur;\r
190     FX_BYTE             index_buf[GIF_DATA_BLOCK];\r
191     FX_BYTE             index_buf_len;\r
192     tag_Table   code_table[GIF_MAX_LZW_CODE];\r
193     FX_WORD             table_cur;\r
194 };\r
195 typedef struct tag_gif_decompress_struct gif_decompress_struct;\r
196 typedef gif_decompress_struct *gif_decompress_struct_p;\r
197 typedef gif_decompress_struct_p *gif_decompress_struct_pp;\r
198 static FX_INT32 s_gif_interlace_step[4] = {8, 8, 4, 2};\r
199 struct tag_gif_decompress_struct {\r
200     jmp_buf                     jmpbuf;\r
201     FX_LPSTR            err_ptr;\r
202     void                        (*_gif_error_fn)(gif_decompress_struct_p gif_ptr, FX_LPCSTR err_msg);\r
203     void*                       context_ptr;\r
204     int                         width;\r
205     int                         height;\r
206     GifPalette*         global_pal_ptr;\r
207     FX_INT32            global_pal_num;\r
208     FX_BYTE                     global_sort_flag;\r
209     FX_BYTE                     global_color_resolution;\r
210 \r
211     FX_BYTE                     bc_index;\r
212     FX_BYTE                     pixel_aspect;\r
213     CGifLZWDecoder*     img_decoder_ptr;\r
214     FX_DWORD            img_row_offset;\r
215     FX_DWORD            img_row_avail_size;\r
216     FX_BYTE                     img_pass_num;\r
217     CFX_ArrayTemplate<GifImage*>* img_ptr_arr_ptr;\r
218     FX_LPBYTE           (*_gif_ask_buf_for_pal_fn)(gif_decompress_struct_p gif_ptr, FX_INT32 pal_size);\r
219     FX_LPBYTE           next_in;\r
220     FX_DWORD            avail_in;\r
221     FX_INT32            decode_status;\r
222     FX_DWORD            skip_size;\r
223     void                        (*_gif_record_current_position_fn)(gif_decompress_struct_p gif_ptr, FX_DWORD* cur_pos_ptr);\r
224     void                        (*_gif_get_row_fn)(gif_decompress_struct_p gif_ptr, FX_INT32 row_num, FX_LPBYTE row_buf);\r
225     FX_BOOL                     (*_gif_get_record_position_fn)(gif_decompress_struct_p gif_ptr, FX_DWORD cur_pos,\r
226             FX_INT32 left, FX_INT32 top, FX_INT32 width, FX_INT32 height,\r
227             FX_INT32 pal_num, void* pal_ptr,\r
228             FX_INT32 delay_time, FX_BOOL user_input,\r
229             FX_INT32 trans_index, FX_INT32 disposal_method, FX_BOOL interlace);\r
230 #ifdef GIF_SUPPORT_APPLICATION_EXTENSION\r
231     FX_BYTE                     app_identify[8];\r
232     FX_BYTE                     app_authentication[3];\r
233     FX_DWORD            app_data_size;\r
234     FX_LPBYTE           app_data;\r
235 #endif\r
236 #ifdef GIF_SUPPORT_COMMENT_EXTENSION\r
237     CFX_ByteString*     cmt_data_ptr;\r
238 #endif\r
239 #ifdef GIF_SUPPORT_GRAPHIC_CONTROL_EXTENSION\r
240     GifGCE*                     gce_ptr;\r
241 #endif\r
242 #ifdef GIF_SUPPORT_PLAIN_TEXT_EXTENSION\r
243     CFX_ArrayTemplate<GifPlainText*>* pt_ptr_arr_ptr;\r
244 #endif\r
245 };\r
246 typedef struct tag_gif_compress_struct gif_compress_struct;\r
247 typedef gif_compress_struct *gif_compress_struct_p;\r
248 typedef gif_compress_struct_p *gif_compress_struct_pp;\r
249 struct tag_gif_compress_struct {\r
250     FX_LPCBYTE          src_buf;\r
251     FX_DWORD            src_pitch;\r
252     FX_DWORD            src_width;\r
253     FX_DWORD            src_row;\r
254     FX_DWORD            cur_offset;\r
255     FX_DWORD            frames;\r
256     GifHeader*          header_ptr;\r
257     GifLSD*                     lsd_ptr;\r
258     GifPalette*         global_pal;\r
259     FX_WORD                     gpal_num;\r
260     GifPalette*         local_pal;\r
261     FX_WORD                     lpal_num;\r
262     GifImageInfo*       image_info_ptr;\r
263     CGifLZWEncoder* img_encoder_ptr;\r
264 #ifdef GIF_SUPPORT_APPLICATION_EXTENSION\r
265     FX_BYTE                     app_identify[8];\r
266     FX_BYTE                     app_authentication[3];\r
267     FX_DWORD            app_data_size;\r
268     FX_LPBYTE           app_data;\r
269 #endif\r
270 \r
271 #ifdef GIF_SUPPORT_COMMENT_EXTENSION\r
272     FX_LPBYTE           cmt_data_ptr;\r
273     FX_DWORD            cmt_data_len;\r
274 #endif\r
275 \r
276 #ifdef GIF_SUPPORT_GRAPHIC_CONTROL_EXTENSION\r
277     GifGCE*                     gce_ptr;\r
278 #endif\r
279 \r
280 #ifdef GIF_SUPPORT_PLAIN_TEXT_EXTENSION\r
281     GifPTE*                     pte_ptr;\r
282     FX_LPCBYTE          pte_data_ptr;\r
283     FX_DWORD            pte_data_len;\r
284 #endif\r
285 };\r
286 void _gif_error(gif_decompress_struct_p gif_ptr, FX_LPCSTR err_msg);\r
287 void _gif_warn(gif_decompress_struct_p gif_ptr, FX_LPCSTR err_msg);\r
288 gif_decompress_struct_p _gif_create_decompress();\r
289 void _gif_destroy_decompress(gif_decompress_struct_pp gif_ptr_ptr);\r
290 gif_compress_struct_p _gif_create_compress();\r
291 void _gif_destroy_compress(gif_compress_struct_pp gif_ptr_ptr);\r
292 FX_INT32 _gif_read_header(gif_decompress_struct_p gif_ptr);\r
293 FX_INT32 _gif_get_frame(gif_decompress_struct_p gif_ptr);\r
294 FX_INT32 _gif_get_frame_num(gif_decompress_struct_p gif_ptr);\r
295 FX_INT32 _gif_decode_extension(gif_decompress_struct_p gif_ptr);\r
296 FX_INT32 _gif_decode_image_info(gif_decompress_struct_p gif_ptr);\r
297 void _gif_takeover_gce_ptr(gif_decompress_struct_p gif_ptr, GifGCE** gce_ptr_ptr);\r
298 FX_INT32 _gif_load_frame(gif_decompress_struct_p gif_ptr, FX_INT32 frame_num);\r
299 FX_LPBYTE _gif_read_data(gif_decompress_struct_p gif_ptr, FX_LPBYTE* des_buf_pp, FX_DWORD data_size);\r
300 void _gif_save_decoding_status(gif_decompress_struct_p gif_ptr, FX_INT32 status);\r
301 void _gif_input_buffer(gif_decompress_struct_p gif_ptr, FX_LPBYTE src_buf, FX_DWORD src_size);\r
302 FX_DWORD _gif_get_avail_input(gif_decompress_struct_p gif_ptr, FX_LPBYTE* avial_buf_ptr);\r
303 void interlace_buf(FX_LPCBYTE buf, FX_DWORD width, FX_DWORD height);\r
304 FX_BOOL _gif_encode( gif_compress_struct_p gif_ptr, FX_LPBYTE& dst_buf, FX_DWORD& dst_len );\r
305 #define GIF_PTR_NOT_NULL(ptr,gif_ptr)   if(ptr == NULL){                                                \\r
306         _gif_error(gif_ptr,"Out Of Memory");\\r
307         return 0;                                                       \\r
308     }\r