| Index: core/src/fxcodec/lgif/fx_gif.h | 
| diff --git a/core/src/fxcodec/lgif/fx_gif.h b/core/src/fxcodec/lgif/fx_gif.h | 
| index 8b2acc86aec99cdb28ae35d54f2294000e4e70da..3b4ec0f0e6c52ad478cf745930cb6cc46829e2e3 100644 | 
| --- a/core/src/fxcodec/lgif/fx_gif.h | 
| +++ b/core/src/fxcodec/lgif/fx_gif.h | 
| @@ -1,332 +1,332 @@ | 
| -// 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 | 
| - | 
| -#include <setjmp.h> | 
| - | 
| -#include "core/include/fxcrt/fx_basic.h" | 
| - | 
| -extern FX_WORD _GetWord_LSBFirst(uint8_t* p); | 
| -extern void _SetWord_LSBFirst(uint8_t* p, FX_WORD v); | 
| -extern void _BpcConvert(const uint8_t* src_buf, | 
| -                        FX_DWORD src_len, | 
| -                        int32_t src_bpc, | 
| -                        int32_t dst_bpc, | 
| -                        uint8_t*& 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 { | 
| -  uint8_t pal_bits : 3; | 
| -  uint8_t sort_flag : 1; | 
| -  uint8_t color_resolution : 3; | 
| -  uint8_t global_pal : 1; | 
| -} GifGF; | 
| -typedef struct tagGifLF { | 
| -  uint8_t pal_bits : 3; | 
| -  uint8_t reserved : 2; | 
| -  uint8_t sort_flag : 1; | 
| -  uint8_t interlace : 1; | 
| -  uint8_t local_pal : 1; | 
| -} GifLF; | 
| -typedef struct tagGifHeader { | 
| -  char signature[3]; | 
| -  char version[3]; | 
| -} GifHeader; | 
| -typedef struct tagGifLSD { | 
| -  FX_WORD width; | 
| -  FX_WORD height; | 
| -  uint8_t global_flag; | 
| -  uint8_t bc_index; | 
| -  uint8_t pixel_aspect; | 
| -} GifLSD; | 
| -typedef struct tagGifImageInfo { | 
| -  FX_WORD left; | 
| -  FX_WORD top; | 
| -  FX_WORD width; | 
| -  FX_WORD height; | 
| - | 
| -  uint8_t local_flag; | 
| -} GifImageInfo; | 
| -typedef struct tagGifCEF { | 
| -  uint8_t transparency : 1; | 
| -  uint8_t user_input : 1; | 
| -  uint8_t disposal_method : 3; | 
| -  uint8_t reserved : 3; | 
| -} GifCEF; | 
| -typedef struct tagGifGCE { | 
| -  uint8_t block_size; | 
| -  uint8_t gce_flag; | 
| -  FX_WORD delay_time; | 
| -  uint8_t trans_index; | 
| -} GifGCE; | 
| -typedef struct tagGifPTE { | 
| -  uint8_t block_size; | 
| -  FX_WORD grid_left; | 
| -  FX_WORD grid_top; | 
| -  FX_WORD grid_width; | 
| -  FX_WORD grid_height; | 
| - | 
| -  uint8_t char_width; | 
| -  uint8_t char_height; | 
| - | 
| -  uint8_t fc_index; | 
| -  uint8_t bc_index; | 
| -} GifPTE; | 
| -typedef struct tagGifAE { | 
| -  uint8_t block_size; | 
| -  uint8_t app_identify[8]; | 
| -  uint8_t app_authentication[3]; | 
| -} GifAE; | 
| -typedef struct tagGifPalette { uint8_t r, g, b; } GifPalette; | 
| -#pragma pack() | 
| -typedef struct tagGifImage { | 
| -  GifGCE* image_gce_ptr; | 
| -  GifPalette* local_pal_ptr; | 
| -  GifImageInfo* image_info_ptr; | 
| -  uint8_t image_code_size; | 
| -  FX_DWORD image_data_pos; | 
| -  uint8_t* image_row_buf; | 
| -  int32_t 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; | 
| -    uint8_t suffix; | 
| -  }; | 
| -  CGifLZWDecoder(FX_CHAR* error_ptr = NULL) { err_msg_ptr = error_ptr; } | 
| -  void InitTable(uint8_t code_len); | 
| - | 
| -  int32_t Decode(uint8_t* des_buf, FX_DWORD& des_size); | 
| - | 
| -  void Input(uint8_t* src_buf, FX_DWORD src_size); | 
| -  FX_DWORD GetAvailInput(); | 
| - | 
| - private: | 
| -  void ClearTable(); | 
| -  void AddCode(FX_WORD prefix_code, uint8_t append_char); | 
| -  void DecodeString(FX_WORD code); | 
| -  uint8_t code_size; | 
| -  uint8_t code_size_cur; | 
| -  FX_WORD code_clear; | 
| -  FX_WORD code_end; | 
| -  FX_WORD code_next; | 
| -  uint8_t code_first; | 
| -  uint8_t stack[GIF_MAX_LZW_CODE]; | 
| -  FX_WORD stack_size; | 
| -  tag_Table code_table[GIF_MAX_LZW_CODE]; | 
| -  FX_WORD code_old; | 
| - | 
| -  uint8_t* next_in; | 
| -  FX_DWORD avail_in; | 
| - | 
| -  uint8_t bits_left; | 
| -  FX_DWORD code_store; | 
| - | 
| -  FX_CHAR* err_msg_ptr; | 
| -}; | 
| -class CGifLZWEncoder { | 
| - public: | 
| -  struct tag_Table { | 
| -    FX_WORD prefix; | 
| -    uint8_t suffix; | 
| -  }; | 
| -  CGifLZWEncoder(); | 
| -  ~CGifLZWEncoder(); | 
| -  void Start(uint8_t code_len, | 
| -             const uint8_t* src_buf, | 
| -             uint8_t*& dst_buf, | 
| -             FX_DWORD& offset); | 
| -  FX_BOOL Encode(const uint8_t* src_buf, | 
| -                 FX_DWORD src_len, | 
| -                 uint8_t*& dst_buf, | 
| -                 FX_DWORD& dst_len, | 
| -                 FX_DWORD& offset); | 
| -  void Finish(uint8_t*& dst_buf, FX_DWORD& dst_len, FX_DWORD& offset); | 
| - | 
| - private: | 
| -  void ClearTable(); | 
| -  FX_BOOL LookUpInTable(const uint8_t* buf, | 
| -                        FX_DWORD& offset, | 
| -                        uint8_t& bit_offset); | 
| -  void EncodeString(FX_DWORD index, | 
| -                    uint8_t*& dst_buf, | 
| -                    FX_DWORD& dst_len, | 
| -                    FX_DWORD& offset); | 
| -  void WriteBlock(uint8_t*& dst_buf, FX_DWORD& dst_len, FX_DWORD& offset); | 
| -  jmp_buf jmp; | 
| -  FX_DWORD src_offset; | 
| -  uint8_t src_bit_offset; | 
| -  uint8_t src_bit_cut; | 
| -  FX_DWORD src_bit_num; | 
| -  uint8_t code_size; | 
| -  FX_WORD code_clear; | 
| -  FX_WORD code_end; | 
| -  FX_WORD index_num; | 
| -  uint8_t bit_offset; | 
| -  uint8_t index_bit_cur; | 
| -  uint8_t index_buf[GIF_DATA_BLOCK]; | 
| -  uint8_t 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 int32_t s_gif_interlace_step[4] = {8, 8, 4, 2}; | 
| -struct tag_gif_decompress_struct { | 
| -  jmp_buf jmpbuf; | 
| -  FX_CHAR* err_ptr; | 
| -  void (*_gif_error_fn)(gif_decompress_struct_p gif_ptr, | 
| -                        const FX_CHAR* err_msg); | 
| -  void* context_ptr; | 
| -  int width; | 
| -  int height; | 
| -  GifPalette* global_pal_ptr; | 
| -  int32_t global_pal_num; | 
| -  uint8_t global_sort_flag; | 
| -  uint8_t global_color_resolution; | 
| - | 
| -  uint8_t bc_index; | 
| -  uint8_t pixel_aspect; | 
| -  CGifLZWDecoder* img_decoder_ptr; | 
| -  FX_DWORD img_row_offset; | 
| -  FX_DWORD img_row_avail_size; | 
| -  uint8_t img_pass_num; | 
| -  CFX_ArrayTemplate<GifImage*>* img_ptr_arr_ptr; | 
| -  uint8_t* (*_gif_ask_buf_for_pal_fn)(gif_decompress_struct_p gif_ptr, | 
| -                                      int32_t pal_size); | 
| -  uint8_t* next_in; | 
| -  FX_DWORD avail_in; | 
| -  int32_t 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, | 
| -                          int32_t row_num, | 
| -                          uint8_t* row_buf); | 
| -  FX_BOOL			(*_gif_get_record_position_fn)(gif_decompress_struct_p gif_ptr, FX_DWORD cur_pos, | 
| -            int32_t left, int32_t top, int32_t width, int32_t height, | 
| -            int32_t pal_num, void* pal_ptr, | 
| -            int32_t delay_time, FX_BOOL user_input, | 
| -            int32_t trans_index, int32_t disposal_method, FX_BOOL interlace); | 
| -#ifdef GIF_SUPPORT_APPLICATION_EXTENSION | 
| -  uint8_t app_identify[8]; | 
| -  uint8_t app_authentication[3]; | 
| -  FX_DWORD app_data_size; | 
| -  uint8_t* 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 { | 
| -  const uint8_t* 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 | 
| -  uint8_t app_identify[8]; | 
| -  uint8_t app_authentication[3]; | 
| -  FX_DWORD app_data_size; | 
| -  uint8_t* app_data; | 
| -#endif | 
| - | 
| -#ifdef GIF_SUPPORT_COMMENT_EXTENSION | 
| -  uint8_t* 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; | 
| -  const uint8_t* pte_data_ptr; | 
| -  FX_DWORD pte_data_len; | 
| -#endif | 
| -}; | 
| -void _gif_error(gif_decompress_struct_p gif_ptr, const FX_CHAR* err_msg); | 
| -void _gif_warn(gif_decompress_struct_p gif_ptr, const FX_CHAR* 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); | 
| -int32_t _gif_read_header(gif_decompress_struct_p gif_ptr); | 
| -int32_t _gif_get_frame(gif_decompress_struct_p gif_ptr); | 
| -int32_t _gif_get_frame_num(gif_decompress_struct_p gif_ptr); | 
| -int32_t _gif_decode_extension(gif_decompress_struct_p gif_ptr); | 
| -int32_t _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); | 
| -int32_t _gif_load_frame(gif_decompress_struct_p gif_ptr, int32_t frame_num); | 
| -uint8_t* _gif_read_data(gif_decompress_struct_p gif_ptr, | 
| -                        uint8_t** des_buf_pp, | 
| -                        FX_DWORD data_size); | 
| -void _gif_save_decoding_status(gif_decompress_struct_p gif_ptr, int32_t status); | 
| -void _gif_input_buffer(gif_decompress_struct_p gif_ptr, | 
| -                       uint8_t* src_buf, | 
| -                       FX_DWORD src_size); | 
| -FX_DWORD _gif_get_avail_input(gif_decompress_struct_p gif_ptr, | 
| -                              uint8_t** avial_buf_ptr); | 
| -void interlace_buf(const uint8_t* buf, FX_DWORD width, FX_DWORD height); | 
| -FX_BOOL _gif_encode(gif_compress_struct_p gif_ptr, | 
| -                    uint8_t*& 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;                             \ | 
| -  } | 
| +// 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 | 
| + | 
| +#include <setjmp.h> | 
| + | 
| +#include "core/include/fxcrt/fx_basic.h" | 
| + | 
| +extern FX_WORD _GetWord_LSBFirst(uint8_t* p); | 
| +extern void _SetWord_LSBFirst(uint8_t* p, FX_WORD v); | 
| +extern void _BpcConvert(const uint8_t* src_buf, | 
| +                        FX_DWORD src_len, | 
| +                        int32_t src_bpc, | 
| +                        int32_t dst_bpc, | 
| +                        uint8_t*& 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 { | 
| +  uint8_t pal_bits : 3; | 
| +  uint8_t sort_flag : 1; | 
| +  uint8_t color_resolution : 3; | 
| +  uint8_t global_pal : 1; | 
| +} GifGF; | 
| +typedef struct tagGifLF { | 
| +  uint8_t pal_bits : 3; | 
| +  uint8_t reserved : 2; | 
| +  uint8_t sort_flag : 1; | 
| +  uint8_t interlace : 1; | 
| +  uint8_t local_pal : 1; | 
| +} GifLF; | 
| +typedef struct tagGifHeader { | 
| +  char signature[3]; | 
| +  char version[3]; | 
| +} GifHeader; | 
| +typedef struct tagGifLSD { | 
| +  FX_WORD width; | 
| +  FX_WORD height; | 
| +  uint8_t global_flag; | 
| +  uint8_t bc_index; | 
| +  uint8_t pixel_aspect; | 
| +} GifLSD; | 
| +typedef struct tagGifImageInfo { | 
| +  FX_WORD left; | 
| +  FX_WORD top; | 
| +  FX_WORD width; | 
| +  FX_WORD height; | 
| + | 
| +  uint8_t local_flag; | 
| +} GifImageInfo; | 
| +typedef struct tagGifCEF { | 
| +  uint8_t transparency : 1; | 
| +  uint8_t user_input : 1; | 
| +  uint8_t disposal_method : 3; | 
| +  uint8_t reserved : 3; | 
| +} GifCEF; | 
| +typedef struct tagGifGCE { | 
| +  uint8_t block_size; | 
| +  uint8_t gce_flag; | 
| +  FX_WORD delay_time; | 
| +  uint8_t trans_index; | 
| +} GifGCE; | 
| +typedef struct tagGifPTE { | 
| +  uint8_t block_size; | 
| +  FX_WORD grid_left; | 
| +  FX_WORD grid_top; | 
| +  FX_WORD grid_width; | 
| +  FX_WORD grid_height; | 
| + | 
| +  uint8_t char_width; | 
| +  uint8_t char_height; | 
| + | 
| +  uint8_t fc_index; | 
| +  uint8_t bc_index; | 
| +} GifPTE; | 
| +typedef struct tagGifAE { | 
| +  uint8_t block_size; | 
| +  uint8_t app_identify[8]; | 
| +  uint8_t app_authentication[3]; | 
| +} GifAE; | 
| +typedef struct tagGifPalette { uint8_t r, g, b; } GifPalette; | 
| +#pragma pack() | 
| +typedef struct tagGifImage { | 
| +  GifGCE* image_gce_ptr; | 
| +  GifPalette* local_pal_ptr; | 
| +  GifImageInfo* image_info_ptr; | 
| +  uint8_t image_code_size; | 
| +  FX_DWORD image_data_pos; | 
| +  uint8_t* image_row_buf; | 
| +  int32_t 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; | 
| +    uint8_t suffix; | 
| +  }; | 
| +  CGifLZWDecoder(FX_CHAR* error_ptr = NULL) { err_msg_ptr = error_ptr; } | 
| +  void InitTable(uint8_t code_len); | 
| + | 
| +  int32_t Decode(uint8_t* des_buf, FX_DWORD& des_size); | 
| + | 
| +  void Input(uint8_t* src_buf, FX_DWORD src_size); | 
| +  FX_DWORD GetAvailInput(); | 
| + | 
| + private: | 
| +  void ClearTable(); | 
| +  void AddCode(FX_WORD prefix_code, uint8_t append_char); | 
| +  void DecodeString(FX_WORD code); | 
| +  uint8_t code_size; | 
| +  uint8_t code_size_cur; | 
| +  FX_WORD code_clear; | 
| +  FX_WORD code_end; | 
| +  FX_WORD code_next; | 
| +  uint8_t code_first; | 
| +  uint8_t stack[GIF_MAX_LZW_CODE]; | 
| +  FX_WORD stack_size; | 
| +  tag_Table code_table[GIF_MAX_LZW_CODE]; | 
| +  FX_WORD code_old; | 
| + | 
| +  uint8_t* next_in; | 
| +  FX_DWORD avail_in; | 
| + | 
| +  uint8_t bits_left; | 
| +  FX_DWORD code_store; | 
| + | 
| +  FX_CHAR* err_msg_ptr; | 
| +}; | 
| +class CGifLZWEncoder { | 
| + public: | 
| +  struct tag_Table { | 
| +    FX_WORD prefix; | 
| +    uint8_t suffix; | 
| +  }; | 
| +  CGifLZWEncoder(); | 
| +  ~CGifLZWEncoder(); | 
| +  void Start(uint8_t code_len, | 
| +             const uint8_t* src_buf, | 
| +             uint8_t*& dst_buf, | 
| +             FX_DWORD& offset); | 
| +  FX_BOOL Encode(const uint8_t* src_buf, | 
| +                 FX_DWORD src_len, | 
| +                 uint8_t*& dst_buf, | 
| +                 FX_DWORD& dst_len, | 
| +                 FX_DWORD& offset); | 
| +  void Finish(uint8_t*& dst_buf, FX_DWORD& dst_len, FX_DWORD& offset); | 
| + | 
| + private: | 
| +  void ClearTable(); | 
| +  FX_BOOL LookUpInTable(const uint8_t* buf, | 
| +                        FX_DWORD& offset, | 
| +                        uint8_t& bit_offset); | 
| +  void EncodeString(FX_DWORD index, | 
| +                    uint8_t*& dst_buf, | 
| +                    FX_DWORD& dst_len, | 
| +                    FX_DWORD& offset); | 
| +  void WriteBlock(uint8_t*& dst_buf, FX_DWORD& dst_len, FX_DWORD& offset); | 
| +  jmp_buf jmp; | 
| +  FX_DWORD src_offset; | 
| +  uint8_t src_bit_offset; | 
| +  uint8_t src_bit_cut; | 
| +  FX_DWORD src_bit_num; | 
| +  uint8_t code_size; | 
| +  FX_WORD code_clear; | 
| +  FX_WORD code_end; | 
| +  FX_WORD index_num; | 
| +  uint8_t bit_offset; | 
| +  uint8_t index_bit_cur; | 
| +  uint8_t index_buf[GIF_DATA_BLOCK]; | 
| +  uint8_t 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 int32_t s_gif_interlace_step[4] = {8, 8, 4, 2}; | 
| +struct tag_gif_decompress_struct { | 
| +  jmp_buf jmpbuf; | 
| +  FX_CHAR* err_ptr; | 
| +  void (*_gif_error_fn)(gif_decompress_struct_p gif_ptr, | 
| +                        const FX_CHAR* err_msg); | 
| +  void* context_ptr; | 
| +  int width; | 
| +  int height; | 
| +  GifPalette* global_pal_ptr; | 
| +  int32_t global_pal_num; | 
| +  uint8_t global_sort_flag; | 
| +  uint8_t global_color_resolution; | 
| + | 
| +  uint8_t bc_index; | 
| +  uint8_t pixel_aspect; | 
| +  CGifLZWDecoder* img_decoder_ptr; | 
| +  FX_DWORD img_row_offset; | 
| +  FX_DWORD img_row_avail_size; | 
| +  uint8_t img_pass_num; | 
| +  CFX_ArrayTemplate<GifImage*>* img_ptr_arr_ptr; | 
| +  uint8_t* (*_gif_ask_buf_for_pal_fn)(gif_decompress_struct_p gif_ptr, | 
| +                                      int32_t pal_size); | 
| +  uint8_t* next_in; | 
| +  FX_DWORD avail_in; | 
| +  int32_t 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, | 
| +                          int32_t row_num, | 
| +                          uint8_t* row_buf); | 
| +  FX_BOOL			(*_gif_get_record_position_fn)(gif_decompress_struct_p gif_ptr, FX_DWORD cur_pos, | 
| +            int32_t left, int32_t top, int32_t width, int32_t height, | 
| +            int32_t pal_num, void* pal_ptr, | 
| +            int32_t delay_time, FX_BOOL user_input, | 
| +            int32_t trans_index, int32_t disposal_method, FX_BOOL interlace); | 
| +#ifdef GIF_SUPPORT_APPLICATION_EXTENSION | 
| +  uint8_t app_identify[8]; | 
| +  uint8_t app_authentication[3]; | 
| +  FX_DWORD app_data_size; | 
| +  uint8_t* 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 { | 
| +  const uint8_t* 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 | 
| +  uint8_t app_identify[8]; | 
| +  uint8_t app_authentication[3]; | 
| +  FX_DWORD app_data_size; | 
| +  uint8_t* app_data; | 
| +#endif | 
| + | 
| +#ifdef GIF_SUPPORT_COMMENT_EXTENSION | 
| +  uint8_t* 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; | 
| +  const uint8_t* pte_data_ptr; | 
| +  FX_DWORD pte_data_len; | 
| +#endif | 
| +}; | 
| +void _gif_error(gif_decompress_struct_p gif_ptr, const FX_CHAR* err_msg); | 
| +void _gif_warn(gif_decompress_struct_p gif_ptr, const FX_CHAR* 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); | 
| +int32_t _gif_read_header(gif_decompress_struct_p gif_ptr); | 
| +int32_t _gif_get_frame(gif_decompress_struct_p gif_ptr); | 
| +int32_t _gif_get_frame_num(gif_decompress_struct_p gif_ptr); | 
| +int32_t _gif_decode_extension(gif_decompress_struct_p gif_ptr); | 
| +int32_t _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); | 
| +int32_t _gif_load_frame(gif_decompress_struct_p gif_ptr, int32_t frame_num); | 
| +uint8_t* _gif_read_data(gif_decompress_struct_p gif_ptr, | 
| +                        uint8_t** des_buf_pp, | 
| +                        FX_DWORD data_size); | 
| +void _gif_save_decoding_status(gif_decompress_struct_p gif_ptr, int32_t status); | 
| +void _gif_input_buffer(gif_decompress_struct_p gif_ptr, | 
| +                       uint8_t* src_buf, | 
| +                       FX_DWORD src_size); | 
| +FX_DWORD _gif_get_avail_input(gif_decompress_struct_p gif_ptr, | 
| +                              uint8_t** avial_buf_ptr); | 
| +void interlace_buf(const uint8_t* buf, FX_DWORD width, FX_DWORD height); | 
| +FX_BOOL _gif_encode(gif_compress_struct_p gif_ptr, | 
| +                    uint8_t*& 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;                             \ | 
| +  } | 
|  |