diff options
author | Dan Sinclair <dsinclair@chromium.org> | 2016-03-14 13:35:12 -0400 |
---|---|---|
committer | Dan Sinclair <dsinclair@chromium.org> | 2016-03-14 13:35:12 -0400 |
commit | 764ec513eecbebd12781bcc96ce81ed5e736ee92 (patch) | |
tree | 12763fde4be1f10ea1183d92185917b2b587e00b /core/src/fxcodec/lgif | |
parent | 97da97662417085774f75c26e535c6fbe70266ae (diff) | |
download | pdfium-764ec513eecbebd12781bcc96ce81ed5e736ee92.tar.xz |
Move core/src/ up to core/.
This CL moves the core/src/ files up to core/ and fixes up the include guards,
includes and build files.
R=tsepez@chromium.org
Review URL: https://codereview.chromium.org/1800523005 .
Diffstat (limited to 'core/src/fxcodec/lgif')
-rw-r--r-- | core/src/fxcodec/lgif/fx_gif.cpp | 1229 | ||||
-rw-r--r-- | core/src/fxcodec/lgif/fx_gif.h | 296 |
2 files changed, 0 insertions, 1525 deletions
diff --git a/core/src/fxcodec/lgif/fx_gif.cpp b/core/src/fxcodec/lgif/fx_gif.cpp deleted file mode 100644 index a4de72978a..0000000000 --- a/core/src/fxcodec/lgif/fx_gif.cpp +++ /dev/null @@ -1,1229 +0,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 "core/src/fxcodec/lgif/fx_gif.h" - -#include "core/src/fxcodec/lbmp/fx_bmp.h" - -void CGifLZWDecoder::Input(uint8_t* src_buf, FX_DWORD src_size) { - next_in = src_buf; - avail_in = src_size; -} -FX_DWORD CGifLZWDecoder::GetAvailInput() { - return avail_in; -} -void CGifLZWDecoder::InitTable(uint8_t code_len) { - code_size = code_len; - code_clear = 1 << code_size; - code_end = code_clear + 1; - bits_left = 0; - code_store = 0; - next_in = NULL; - avail_in = 0; - stack_size = 0; - code_first = 0; - ClearTable(); -} -void CGifLZWDecoder::ClearTable() { - code_size_cur = code_size + 1; - code_next = code_end + 1; - code_old = (FX_WORD)-1; - FXSYS_memset(code_table, 0, sizeof(tag_Table) * GIF_MAX_LZW_CODE); - FXSYS_memset(stack, 0, GIF_MAX_LZW_CODE); - for (FX_WORD i = 0; i < code_clear; i++) { - code_table[i].suffix = (uint8_t)i; - } -} -void CGifLZWDecoder::DecodeString(FX_WORD code) { - stack_size = 0; - while (TRUE) { - ASSERT(code <= code_next); - if (code < code_clear || code > code_next) { - break; - } - stack[GIF_MAX_LZW_CODE - 1 - stack_size++] = code_table[code].suffix; - code = code_table[code].prefix; - } - stack[GIF_MAX_LZW_CODE - 1 - stack_size++] = (uint8_t)code; - code_first = (uint8_t)code; -} -void CGifLZWDecoder::AddCode(FX_WORD prefix_code, uint8_t append_char) { - if (code_next == GIF_MAX_LZW_CODE) { - return; - } - code_table[code_next].prefix = prefix_code; - code_table[code_next].suffix = append_char; - if (++code_next < GIF_MAX_LZW_CODE) { - if (code_next >> code_size_cur) { - code_size_cur++; - } - } -} -int32_t CGifLZWDecoder::Decode(uint8_t* des_buf, FX_DWORD& des_size) { - if (des_size == 0) { - return 3; - } - FX_DWORD i = 0; - if (stack_size != 0) { - if (des_size < stack_size) { - FXSYS_memcpy(des_buf, &stack[GIF_MAX_LZW_CODE - stack_size], des_size); - stack_size -= (FX_WORD)des_size; - return 3; - } - FXSYS_memcpy(des_buf, &stack[GIF_MAX_LZW_CODE - stack_size], stack_size); - des_buf += stack_size; - i += stack_size; - stack_size = 0; - } - FX_WORD code = 0; - while (i <= des_size && (avail_in > 0 || bits_left >= code_size_cur)) { - if (code_size_cur > 12) { - if (err_msg_ptr) { - FXSYS_strncpy(err_msg_ptr, "Code Length Out Of Range", - GIF_MAX_ERROR_SIZE - 1); - } - return 0; - } - if (avail_in > 0) { - code_store |= (*next_in++) << bits_left; - avail_in--; - bits_left += 8; - } - while (bits_left >= code_size_cur) { - code = (FX_WORD)code_store & ((1 << code_size_cur) - 1); - code_store >>= code_size_cur; - bits_left -= code_size_cur; - if (code == code_clear) { - ClearTable(); - continue; - } else if (code == code_end) { - des_size = i; - return 1; - } else { - if (code_old != (FX_WORD)-1) { - if (code_next < GIF_MAX_LZW_CODE) { - if (code == code_next) { - AddCode(code_old, code_first); - DecodeString(code); - } else if (code > code_next) { - if (err_msg_ptr) { - FXSYS_strncpy(err_msg_ptr, "Decode Error, Out Of Range", - GIF_MAX_ERROR_SIZE - 1); - } - return 0; - } else { - DecodeString(code); - uint8_t append_char = stack[GIF_MAX_LZW_CODE - stack_size]; - AddCode(code_old, append_char); - } - } - } else { - DecodeString(code); - } - code_old = code; - if (i + stack_size > des_size) { - FXSYS_memcpy(des_buf, &stack[GIF_MAX_LZW_CODE - stack_size], - des_size - i); - stack_size -= (FX_WORD)(des_size - i); - return 3; - } - FXSYS_memcpy(des_buf, &stack[GIF_MAX_LZW_CODE - stack_size], - stack_size); - des_buf += stack_size; - i += stack_size; - stack_size = 0; - } - } - } - if (avail_in == 0) { - des_size = i; - return 2; - } - return 0; -} -static FX_BOOL gif_grow_buf(uint8_t*& dst_buf, - FX_DWORD& dst_len, - FX_DWORD size) { - if (dst_len < size) { - FX_DWORD len_org = dst_len; - while (dst_buf && dst_len < size) { - dst_len <<= 1; - dst_buf = FX_Realloc(uint8_t, dst_buf, dst_len); - } - if (dst_buf == NULL) { - dst_len = size; - dst_buf = FX_Realloc(uint8_t, dst_buf, dst_len); - if (dst_buf == NULL) { - return FALSE; - } - } - FXSYS_memset(dst_buf + len_org, 0, dst_len - len_org); - return dst_buf != NULL; - } - return TRUE; -} -static inline void gif_cut_index(uint8_t& val, - FX_DWORD index, - uint8_t index_bit, - uint8_t index_bit_use, - uint8_t bit_use) { - FX_DWORD cut = ((1 << (index_bit - index_bit_use)) - 1) << index_bit_use; - val |= ((index & cut) >> index_bit_use) << bit_use; -} -static inline uint8_t gif_cut_buf(const uint8_t* buf, - FX_DWORD& offset, - uint8_t bit_cut, - uint8_t& bit_offset, - FX_DWORD& bit_num) { - if (bit_cut != 8) { - FX_WORD index = 0; - index |= ((1 << bit_cut) - 1) << (7 - bit_offset); - uint8_t ret = ((index & buf[offset]) >> (7 - bit_offset)); - bit_offset += bit_cut; - if (bit_offset >= 8) { - if (bit_offset > 8) { - ret |= ((index & (buf[offset + 1] << 8)) >> 8); - } - bit_offset -= 8; - offset++; - } - bit_num += bit_cut; - return ret; - } - bit_num += bit_cut; - return buf[offset++]; -} -CGifLZWEncoder::CGifLZWEncoder() { - FXSYS_memset(this, 0, sizeof(CGifLZWEncoder)); -} -CGifLZWEncoder::~CGifLZWEncoder() {} -void CGifLZWEncoder::ClearTable() { - index_bit_cur = code_size + 1; - index_num = code_end + 1; - table_cur = code_end + 1; - for (FX_WORD i = 0; i < GIF_MAX_LZW_CODE; i++) { - code_table[i].prefix = 0; - code_table[i].suffix = 0; - } -} -void CGifLZWEncoder::Start(uint8_t code_len, - const uint8_t* src_buf, - uint8_t*& dst_buf, - FX_DWORD& offset) { - code_size = code_len + 1; - src_bit_cut = code_size; - if (code_len == 0) { - src_bit_cut = 1; - code_size = 2; - } - code_clear = 1 << code_size; - code_end = code_clear + 1; - dst_buf[offset++] = code_size; - bit_offset = 0; - ClearTable(); - src_offset = 0; - src_bit_offset = 0; - src_bit_num = 0; - code_table[index_num].prefix = gif_cut_buf(src_buf, src_offset, src_bit_cut, - src_bit_offset, src_bit_num); - code_table[index_num].suffix = gif_cut_buf(src_buf, src_offset, src_bit_cut, - src_bit_offset, src_bit_num); -} -void CGifLZWEncoder::WriteBlock(uint8_t*& dst_buf, - FX_DWORD& dst_len, - FX_DWORD& offset) { - if (!gif_grow_buf(dst_buf, dst_len, offset + GIF_DATA_BLOCK + 1)) { - longjmp(jmp, 1); - } - dst_buf[offset++] = index_buf_len; - FXSYS_memcpy(&dst_buf[offset], index_buf, index_buf_len); - offset += index_buf_len; - FXSYS_memset(index_buf, 0, GIF_DATA_BLOCK); - index_buf_len = 0; -} -void CGifLZWEncoder::EncodeString(FX_DWORD index, - uint8_t*& dst_buf, - FX_DWORD& dst_len, - FX_DWORD& offset) { - uint8_t index_bit_use; - index_bit_use = 0; - if (index_buf_len == GIF_DATA_BLOCK) { - WriteBlock(dst_buf, dst_len, offset); - } - gif_cut_index(index_buf[index_buf_len], index, index_bit_cur, index_bit_use, - bit_offset); - if (index_bit_cur <= (8 - bit_offset)) { - bit_offset += index_bit_cur; - } else if (index_bit_cur <= (16 - bit_offset)) { - index_bit_use += (8 - bit_offset); - bit_offset = 0; - index_buf_len++; - if (index_buf_len == GIF_DATA_BLOCK) { - WriteBlock(dst_buf, dst_len, offset); - } - gif_cut_index(index_buf[index_buf_len], index, index_bit_cur, index_bit_use, - bit_offset); - bit_offset = index_bit_cur - index_bit_use; - } else { - index_bit_use += (8 - bit_offset); - bit_offset = 0; - index_buf_len++; - if (index_buf_len == GIF_DATA_BLOCK) { - WriteBlock(dst_buf, dst_len, offset); - } - gif_cut_index(index_buf[index_buf_len], index, index_bit_cur, index_bit_use, - bit_offset); - index_bit_use += 8; - bit_offset = 0; - index_buf_len++; - if (index_buf_len == GIF_DATA_BLOCK) { - WriteBlock(dst_buf, dst_len, offset); - } - gif_cut_index(index_buf[index_buf_len], index, index_bit_cur, index_bit_use, - bit_offset); - bit_offset = index_bit_cur - index_bit_use; - } - if (bit_offset == 8) { - bit_offset = 0; - index_buf_len++; - if (index_buf_len == GIF_DATA_BLOCK) { - WriteBlock(dst_buf, dst_len, offset); - } - } - if (index == code_end) { - index_buf_len++; - WriteBlock(dst_buf, dst_len, offset); - } - if (index_num++ >> index_bit_cur) { - index_bit_cur++; - } -} -FX_BOOL CGifLZWEncoder::Encode(const uint8_t* src_buf, - FX_DWORD src_len, - uint8_t*& dst_buf, - FX_DWORD& dst_len, - FX_DWORD& offset) { - uint8_t suffix; - if (setjmp(jmp)) { - return FALSE; - } - while (src_bit_num < src_len) { - if (!LookUpInTable(src_buf, src_offset, src_bit_offset)) { - EncodeString(code_table[index_num].prefix, dst_buf, dst_len, offset); - if (index_num == GIF_MAX_LZW_CODE) { - suffix = code_table[index_num - 1].suffix; - EncodeString(code_clear, dst_buf, dst_len, offset); - ClearTable(); - code_table[index_num].prefix = suffix; - code_table[index_num].suffix = gif_cut_buf( - src_buf, src_offset, src_bit_cut, src_bit_offset, src_bit_num); - } else { - code_table[index_num].prefix = code_table[index_num - 1].suffix; - code_table[index_num].suffix = gif_cut_buf( - src_buf, src_offset, src_bit_cut, src_bit_offset, src_bit_num); - } - } - } - src_offset = 0; - src_bit_offset = 0; - src_bit_num = 0; - return TRUE; -} -FX_BOOL CGifLZWEncoder::LookUpInTable(const uint8_t* buf, - FX_DWORD& offset, - uint8_t& bit_offset) { - for (FX_WORD i = table_cur; i < index_num; i++) { - if (code_table[i].prefix == code_table[index_num].prefix && - code_table[i].suffix == code_table[index_num].suffix) { - code_table[index_num].prefix = i; - code_table[index_num].suffix = - gif_cut_buf(buf, offset, src_bit_cut, bit_offset, src_bit_num); - table_cur = i; - return TRUE; - } - } - table_cur = code_end + 1; - return FALSE; -} -void CGifLZWEncoder::Finish(uint8_t*& dst_buf, - FX_DWORD& dst_len, - FX_DWORD& offset) { - EncodeString(code_table[index_num].prefix, dst_buf, dst_len, offset); - EncodeString(code_end, dst_buf, dst_len, offset); - bit_offset = 0; - ClearTable(); -} -gif_decompress_struct_p gif_create_decompress() { - gif_decompress_struct_p gif_ptr = - (gif_decompress_struct*)FX_Alloc(uint8_t, sizeof(gif_decompress_struct)); - if (gif_ptr == NULL) { - return NULL; - } - FXSYS_memset(gif_ptr, 0, sizeof(gif_decompress_struct)); - gif_ptr->decode_status = GIF_D_STATUS_SIG; - gif_ptr->img_ptr_arr_ptr = new CFX_ArrayTemplate<GifImage*>; - gif_ptr->cmt_data_ptr = new CFX_ByteString; - gif_ptr->pt_ptr_arr_ptr = new CFX_ArrayTemplate<GifPlainText*>; - return gif_ptr; -} -void gif_destroy_decompress(gif_decompress_struct_pp gif_ptr_ptr) { - if (gif_ptr_ptr == NULL || *gif_ptr_ptr == NULL) { - return; - } - gif_decompress_struct_p gif_ptr = *gif_ptr_ptr; - *gif_ptr_ptr = NULL; - FX_Free(gif_ptr->global_pal_ptr); - delete gif_ptr->img_decoder_ptr; - if (gif_ptr->img_ptr_arr_ptr) { - int32_t size_img_arr = gif_ptr->img_ptr_arr_ptr->GetSize(); - for (int32_t i = 0; i < size_img_arr; i++) { - GifImage* p = gif_ptr->img_ptr_arr_ptr->GetAt(i); - FX_Free(p->image_info_ptr); - FX_Free(p->image_gce_ptr); - FX_Free(p->image_row_buf); - if (p->local_pal_ptr && p->local_pal_ptr != gif_ptr->global_pal_ptr) { - FX_Free(p->local_pal_ptr); - } - FX_Free(p); - } - gif_ptr->img_ptr_arr_ptr->RemoveAll(); - delete gif_ptr->img_ptr_arr_ptr; - } - delete gif_ptr->cmt_data_ptr; - FX_Free(gif_ptr->gce_ptr); - if (gif_ptr->pt_ptr_arr_ptr) { - int32_t size_pt_arr = gif_ptr->pt_ptr_arr_ptr->GetSize(); - for (int32_t i = 0; i < size_pt_arr; i++) { - GifPlainText* p = gif_ptr->pt_ptr_arr_ptr->GetAt(i); - FX_Free(p->gce_ptr); - FX_Free(p->pte_ptr); - delete p->string_ptr; - } - gif_ptr->pt_ptr_arr_ptr->RemoveAll(); - delete gif_ptr->pt_ptr_arr_ptr; - } - FX_Free(gif_ptr); -} -gif_compress_struct_p gif_create_compress() { - gif_compress_struct_p gif_ptr = - (gif_compress_struct*)FX_Alloc(uint8_t, sizeof(gif_compress_struct)); - if (gif_ptr == NULL) { - return NULL; - } - FXSYS_memset(gif_ptr, 0, sizeof(gif_compress_struct)); - gif_ptr->img_encoder_ptr = new CGifLZWEncoder; - gif_ptr->header_ptr = (GifHeader*)FX_Alloc(uint8_t, sizeof(GifHeader)); - if (gif_ptr->header_ptr == NULL) { - delete (gif_ptr->img_encoder_ptr); - FX_Free(gif_ptr); - return NULL; - } - FXSYS_memcpy(gif_ptr->header_ptr->signature, GIF_SIGNATURE, 3); - FXSYS_memcpy(gif_ptr->header_ptr->version, "89a", 3); - gif_ptr->lsd_ptr = (GifLSD*)FX_Alloc(uint8_t, sizeof(GifLSD)); - if (gif_ptr->lsd_ptr == NULL) { - FX_Free(gif_ptr->header_ptr); - delete (gif_ptr->img_encoder_ptr); - FX_Free(gif_ptr); - return NULL; - } - FXSYS_memset(gif_ptr->lsd_ptr, 0, sizeof(GifLSD)); - gif_ptr->image_info_ptr = - (GifImageInfo*)FX_Alloc(uint8_t, sizeof(GifImageInfo)); - if (gif_ptr->image_info_ptr == NULL) { - FX_Free(gif_ptr->lsd_ptr); - FX_Free(gif_ptr->header_ptr); - delete (gif_ptr->img_encoder_ptr); - FX_Free(gif_ptr); - return NULL; - } - FXSYS_memset(gif_ptr->image_info_ptr, 0, sizeof(GifImageInfo)); - gif_ptr->gce_ptr = (GifGCE*)FX_Alloc(uint8_t, sizeof(GifGCE)); - if (gif_ptr->gce_ptr == NULL) { - FX_Free(gif_ptr->image_info_ptr); - FX_Free(gif_ptr->lsd_ptr); - FX_Free(gif_ptr->header_ptr); - delete (gif_ptr->img_encoder_ptr); - FX_Free(gif_ptr); - return NULL; - } - gif_ptr->pte_ptr = (GifPTE*)FX_Alloc(uint8_t, sizeof(GifPTE)); - if (gif_ptr->pte_ptr == NULL) { - FX_Free(gif_ptr->gce_ptr); - FX_Free(gif_ptr->image_info_ptr); - FX_Free(gif_ptr->lsd_ptr); - FX_Free(gif_ptr->header_ptr); - delete (gif_ptr->img_encoder_ptr); - FX_Free(gif_ptr); - return NULL; - } - FXSYS_memset(gif_ptr->pte_ptr, 0, sizeof(GifPTE)); - gif_ptr->pte_ptr->block_size = 12; - return gif_ptr; -} -void gif_destroy_compress(gif_compress_struct_pp gif_ptr_ptr) { - if (gif_ptr_ptr == NULL || *gif_ptr_ptr == NULL) { - return; - } - gif_compress_struct_p gif_ptr = *gif_ptr_ptr; - *gif_ptr_ptr = NULL; - FX_Free(gif_ptr->header_ptr); - FX_Free(gif_ptr->lsd_ptr); - FX_Free(gif_ptr->global_pal); - FX_Free(gif_ptr->image_info_ptr); - FX_Free(gif_ptr->local_pal); - delete gif_ptr->img_encoder_ptr; - FX_Free(gif_ptr->gce_ptr); - FX_Free(gif_ptr->cmt_data_ptr); - FX_Free(gif_ptr->pte_ptr); - FX_Free(gif_ptr); -} -void gif_error(gif_decompress_struct_p gif_ptr, const FX_CHAR* err_msg) { - if (gif_ptr && gif_ptr->gif_error_fn) { - gif_ptr->gif_error_fn(gif_ptr, err_msg); - } -} -void gif_warn(gif_decompress_struct_p gif_ptr, const FX_CHAR* err_msg) {} -int32_t gif_read_header(gif_decompress_struct_p gif_ptr) { - if (gif_ptr == NULL) { - return 0; - } - FX_DWORD skip_size_org = gif_ptr->skip_size; - ASSERT(sizeof(GifHeader) == 6); - GifHeader* gif_header_ptr = NULL; - if (gif_read_data(gif_ptr, (uint8_t**)&gif_header_ptr, 6) == NULL) { - return 2; - } - if (FXSYS_strncmp(gif_header_ptr->signature, GIF_SIGNATURE, 3) != 0 || - gif_header_ptr->version[0] != '8' || gif_header_ptr->version[2] != 'a') { - gif_error(gif_ptr, "Not A Gif Image"); - return 0; - } - ASSERT(sizeof(GifLSD) == 7); - GifLSD* gif_lsd_ptr = NULL; - if (gif_read_data(gif_ptr, (uint8_t**)&gif_lsd_ptr, 7) == NULL) { - gif_ptr->skip_size = skip_size_org; - return 2; - } - if (((GifGF*)&gif_lsd_ptr->global_flag)->global_pal) { - gif_ptr->global_pal_num = 2 - << ((GifGF*)&gif_lsd_ptr->global_flag)->pal_bits; - ASSERT(sizeof(GifPalette) == 3); - int32_t global_pal_size = gif_ptr->global_pal_num * 3; - uint8_t* global_pal_ptr = NULL; - if (gif_read_data(gif_ptr, &global_pal_ptr, global_pal_size) == NULL) { - gif_ptr->skip_size = skip_size_org; - return 2; - } - gif_ptr->global_sort_flag = ((GifGF*)&gif_lsd_ptr->global_flag)->sort_flag; - gif_ptr->global_color_resolution = - ((GifGF*)&gif_lsd_ptr->global_flag)->color_resolution; - FX_Free(gif_ptr->global_pal_ptr); - gif_ptr->global_pal_ptr = (GifPalette*)FX_Alloc(uint8_t, global_pal_size); - FXSYS_memcpy(gif_ptr->global_pal_ptr, global_pal_ptr, global_pal_size); - } - gif_ptr->width = (int)GetWord_LSBFirst((uint8_t*)&gif_lsd_ptr->width); - gif_ptr->height = (int)GetWord_LSBFirst((uint8_t*)&gif_lsd_ptr->height); - gif_ptr->bc_index = gif_lsd_ptr->bc_index; - gif_ptr->pixel_aspect = gif_lsd_ptr->pixel_aspect; - return 1; -} -int32_t gif_get_frame(gif_decompress_struct_p gif_ptr) { - if (gif_ptr == NULL) { - return 0; - } - int32_t ret = 1; - while (TRUE) { - switch (gif_ptr->decode_status) { - case GIF_D_STATUS_TAIL: - return 1; - case GIF_D_STATUS_SIG: { - uint8_t* sig_ptr = NULL; - if (gif_read_data(gif_ptr, &sig_ptr, 1) == NULL) { - return 2; - } - switch (*sig_ptr) { - case GIF_SIG_EXTENSION: - gif_save_decoding_status(gif_ptr, GIF_D_STATUS_EXT); - continue; - case GIF_SIG_IMAGE: - gif_save_decoding_status(gif_ptr, GIF_D_STATUS_IMG_INFO); - continue; - case GIF_SIG_TRAILER: - gif_save_decoding_status(gif_ptr, GIF_D_STATUS_TAIL); - return 1; - default: - if (gif_ptr->avail_in) { - gif_warn(gif_ptr, "The Gif File has non_standard Tag!"); - gif_save_decoding_status(gif_ptr, GIF_D_STATUS_SIG); - continue; - } - gif_warn(gif_ptr, "The Gif File Doesn't have Trailer Tag!"); - return 1; - } - } - case GIF_D_STATUS_EXT: { - uint8_t* ext_ptr = NULL; - if (gif_read_data(gif_ptr, &ext_ptr, 1) == NULL) { - return 2; - } - switch (*ext_ptr) { - case GIF_BLOCK_CE: - gif_save_decoding_status(gif_ptr, GIF_D_STATUS_EXT_CE); - continue; - case GIF_BLOCK_GCE: - gif_save_decoding_status(gif_ptr, GIF_D_STATUS_EXT_GCE); - continue; - case GIF_BLOCK_PTE: - gif_save_decoding_status(gif_ptr, GIF_D_STATUS_EXT_PTE); - continue; - default: { - int32_t status = GIF_D_STATUS_EXT_UNE; - if (*ext_ptr == GIF_BLOCK_PTE) { - status = GIF_D_STATUS_EXT_PTE; - } - gif_save_decoding_status(gif_ptr, status); - continue; - } - } - } - case GIF_D_STATUS_IMG_INFO: { - ret = gif_decode_image_info(gif_ptr); - if (ret != 1) { - return ret; - } - continue; - } - case GIF_D_STATUS_IMG_DATA: { - uint8_t* data_size_ptr = NULL; - uint8_t* data_ptr = NULL; - FX_DWORD skip_size_org = gif_ptr->skip_size; - if (gif_read_data(gif_ptr, &data_size_ptr, 1) == NULL) { - return 2; - } - while (*data_size_ptr != GIF_BLOCK_TERMINAL) { - if (gif_read_data(gif_ptr, &data_ptr, *data_size_ptr) == NULL) { - gif_ptr->skip_size = skip_size_org; - return 2; - } - gif_save_decoding_status(gif_ptr, GIF_D_STATUS_IMG_DATA); - skip_size_org = gif_ptr->skip_size; - if (gif_read_data(gif_ptr, &data_size_ptr, 1) == NULL) { - return 2; - } - } - gif_save_decoding_status(gif_ptr, GIF_D_STATUS_SIG); - continue; - } - default: { - ret = gif_decode_extension(gif_ptr); - if (ret != 1) { - return ret; - } - continue; - } - } - } - return 1; -} -void gif_takeover_gce_ptr(gif_decompress_struct_p gif_ptr, - GifGCE** gce_ptr_ptr) { - *gce_ptr_ptr = NULL; - if (gif_ptr->gce_ptr && gce_ptr_ptr) { - *gce_ptr_ptr = gif_ptr->gce_ptr; - gif_ptr->gce_ptr = NULL; - } -} -int32_t gif_decode_extension(gif_decompress_struct_p gif_ptr) { - uint8_t* data_size_ptr = NULL; - uint8_t* data_ptr = NULL; - FX_DWORD skip_size_org = gif_ptr->skip_size; - switch (gif_ptr->decode_status) { - case GIF_D_STATUS_EXT_CE: { - if (gif_read_data(gif_ptr, &data_size_ptr, 1) == NULL) { - gif_ptr->skip_size = skip_size_org; - return 2; - } - gif_ptr->cmt_data_ptr->Empty(); - while (*data_size_ptr != GIF_BLOCK_TERMINAL) { - uint8_t data_size = *data_size_ptr; - if (gif_read_data(gif_ptr, &data_ptr, *data_size_ptr) == NULL || - gif_read_data(gif_ptr, &data_size_ptr, 1) == NULL) { - gif_ptr->skip_size = skip_size_org; - return 2; - } - *(gif_ptr->cmt_data_ptr) += - CFX_ByteString((const FX_CHAR*)data_ptr, data_size); - } - } break; - case GIF_D_STATUS_EXT_PTE: { - ASSERT(sizeof(GifPTE) == 13); - GifPTE* gif_pte_ptr = NULL; - if (gif_read_data(gif_ptr, (uint8_t**)&gif_pte_ptr, 13) == NULL) { - return 2; - } - GifPlainText* gif_pt_ptr = FX_Alloc(GifPlainText, 1); - FXSYS_memset(gif_pt_ptr, 0, sizeof(GifPlainText)); - gif_takeover_gce_ptr(gif_ptr, &gif_pt_ptr->gce_ptr); - gif_pt_ptr->pte_ptr = (GifPTE*)FX_Alloc(uint8_t, sizeof(GifPTE)); - gif_pt_ptr->string_ptr = new CFX_ByteString; - gif_pt_ptr->pte_ptr->block_size = gif_pte_ptr->block_size; - gif_pt_ptr->pte_ptr->grid_left = - GetWord_LSBFirst((uint8_t*)&gif_pte_ptr->grid_left); - gif_pt_ptr->pte_ptr->grid_top = - GetWord_LSBFirst((uint8_t*)&gif_pte_ptr->grid_top); - gif_pt_ptr->pte_ptr->grid_width = - GetWord_LSBFirst((uint8_t*)&gif_pte_ptr->grid_width); - gif_pt_ptr->pte_ptr->grid_height = - GetWord_LSBFirst((uint8_t*)&gif_pte_ptr->grid_height); - gif_pt_ptr->pte_ptr->char_width = gif_pte_ptr->char_width; - gif_pt_ptr->pte_ptr->char_height = gif_pte_ptr->char_height; - gif_pt_ptr->pte_ptr->fc_index = gif_pte_ptr->fc_index; - gif_pt_ptr->pte_ptr->bc_index = gif_pte_ptr->bc_index; - if (gif_read_data(gif_ptr, &data_size_ptr, 1) == NULL) { - gif_ptr->skip_size = skip_size_org; - if (gif_pt_ptr) { - FX_Free(gif_pt_ptr->gce_ptr); - FX_Free(gif_pt_ptr->pte_ptr); - delete gif_pt_ptr->string_ptr; - FX_Free(gif_pt_ptr); - } - return 2; - } - while (*data_size_ptr != GIF_BLOCK_TERMINAL) { - uint8_t data_size = *data_size_ptr; - if (gif_read_data(gif_ptr, &data_ptr, *data_size_ptr) == NULL || - gif_read_data(gif_ptr, &data_size_ptr, 1) == NULL) { - gif_ptr->skip_size = skip_size_org; - if (gif_pt_ptr) { - FX_Free(gif_pt_ptr->gce_ptr); - FX_Free(gif_pt_ptr->pte_ptr); - delete gif_pt_ptr->string_ptr; - FX_Free(gif_pt_ptr); - } - return 2; - } - *(gif_pt_ptr->string_ptr) += - CFX_ByteString((const FX_CHAR*)data_ptr, data_size); - } - gif_ptr->pt_ptr_arr_ptr->Add(gif_pt_ptr); - } break; - case GIF_D_STATUS_EXT_GCE: { - ASSERT(sizeof(GifGCE) == 5); - GifGCE* gif_gce_ptr = NULL; - if (gif_read_data(gif_ptr, (uint8_t**)&gif_gce_ptr, 6) == NULL) { - return 2; - } - if (gif_ptr->gce_ptr == NULL) { - gif_ptr->gce_ptr = (GifGCE*)FX_Alloc(uint8_t, sizeof(GifGCE)); - } - gif_ptr->gce_ptr->block_size = gif_gce_ptr->block_size; - gif_ptr->gce_ptr->gce_flag = gif_gce_ptr->gce_flag; - gif_ptr->gce_ptr->delay_time = - GetWord_LSBFirst((uint8_t*)&gif_gce_ptr->delay_time); - gif_ptr->gce_ptr->trans_index = gif_gce_ptr->trans_index; - } break; - default: { - if (gif_ptr->decode_status == GIF_D_STATUS_EXT_PTE) { - FX_Free(gif_ptr->gce_ptr); - gif_ptr->gce_ptr = NULL; - } - if (gif_read_data(gif_ptr, &data_size_ptr, 1) == NULL) { - return 2; - } - while (*data_size_ptr != GIF_BLOCK_TERMINAL) { - if (gif_read_data(gif_ptr, &data_ptr, *data_size_ptr) == NULL || - gif_read_data(gif_ptr, &data_size_ptr, 1) == NULL) { - gif_ptr->skip_size = skip_size_org; - return 2; - } - } - } - } - gif_save_decoding_status(gif_ptr, GIF_D_STATUS_SIG); - return 1; -} -int32_t gif_decode_image_info(gif_decompress_struct_p gif_ptr) { - if (gif_ptr->width == 0 || gif_ptr->height == 0) { - gif_error(gif_ptr, "No Image Header Info"); - return 0; - } - FX_DWORD skip_size_org = gif_ptr->skip_size; - ASSERT(sizeof(GifImageInfo) == 9); - GifImageInfo* gif_img_info_ptr = NULL; - if (gif_read_data(gif_ptr, (uint8_t**)&gif_img_info_ptr, 9) == NULL) { - return 2; - } - GifImage* gif_image_ptr = (GifImage*)FX_Alloc(uint8_t, sizeof(GifImage)); - FXSYS_memset(gif_image_ptr, 0, sizeof(GifImage)); - gif_image_ptr->image_info_ptr = - (GifImageInfo*)FX_Alloc(uint8_t, sizeof(GifImageInfo)); - gif_image_ptr->image_info_ptr->left = - GetWord_LSBFirst((uint8_t*)&gif_img_info_ptr->left); - gif_image_ptr->image_info_ptr->top = - GetWord_LSBFirst((uint8_t*)&gif_img_info_ptr->top); - gif_image_ptr->image_info_ptr->width = - GetWord_LSBFirst((uint8_t*)&gif_img_info_ptr->width); - gif_image_ptr->image_info_ptr->height = - GetWord_LSBFirst((uint8_t*)&gif_img_info_ptr->height); - gif_image_ptr->image_info_ptr->local_flag = gif_img_info_ptr->local_flag; - if (gif_image_ptr->image_info_ptr->left + - gif_image_ptr->image_info_ptr->width > - gif_ptr->width || - gif_image_ptr->image_info_ptr->top + - gif_image_ptr->image_info_ptr->height > - gif_ptr->height) { - FX_Free(gif_image_ptr->image_info_ptr); - FX_Free(gif_image_ptr->image_row_buf); - FX_Free(gif_image_ptr); - gif_error(gif_ptr, "Image Data Out Of LSD, The File May Be Corrupt"); - return 0; - } - GifLF* gif_img_info_lf_ptr = (GifLF*)&gif_img_info_ptr->local_flag; - if (gif_img_info_lf_ptr->local_pal) { - ASSERT(sizeof(GifPalette) == 3); - int32_t loc_pal_size = (2 << gif_img_info_lf_ptr->pal_bits) * 3; - uint8_t* loc_pal_ptr = NULL; - if (gif_read_data(gif_ptr, &loc_pal_ptr, loc_pal_size) == NULL) { - gif_ptr->skip_size = skip_size_org; - FX_Free(gif_image_ptr->image_info_ptr); - FX_Free(gif_image_ptr->image_row_buf); - FX_Free(gif_image_ptr); - return 2; - } - gif_image_ptr->local_pal_ptr = - (GifPalette*)gif_ptr->gif_ask_buf_for_pal_fn(gif_ptr, loc_pal_size); - if (gif_image_ptr->local_pal_ptr) { - FXSYS_memcpy((uint8_t*)gif_image_ptr->local_pal_ptr, loc_pal_ptr, - loc_pal_size); - } - } - uint8_t* code_size_ptr = NULL; - if (gif_read_data(gif_ptr, &code_size_ptr, 1) == NULL) { - gif_ptr->skip_size = skip_size_org; - FX_Free(gif_image_ptr->image_info_ptr); - FX_Free(gif_image_ptr->local_pal_ptr); - FX_Free(gif_image_ptr->image_row_buf); - FX_Free(gif_image_ptr); - return 2; - } - gif_image_ptr->image_code_size = *code_size_ptr; - gif_ptr->gif_record_current_position_fn(gif_ptr, - &gif_image_ptr->image_data_pos); - gif_image_ptr->image_data_pos += gif_ptr->skip_size; - gif_takeover_gce_ptr(gif_ptr, &gif_image_ptr->image_gce_ptr); - gif_ptr->img_ptr_arr_ptr->Add(gif_image_ptr); - gif_save_decoding_status(gif_ptr, GIF_D_STATUS_IMG_DATA); - return 1; -} -int32_t gif_load_frame(gif_decompress_struct_p gif_ptr, int32_t frame_num) { - if (gif_ptr == NULL || frame_num < 0 || - frame_num >= gif_ptr->img_ptr_arr_ptr->GetSize()) { - return 0; - } - uint8_t* data_size_ptr = NULL; - uint8_t* data_ptr = NULL; - FX_DWORD skip_size_org = gif_ptr->skip_size; - GifImage* gif_image_ptr = gif_ptr->img_ptr_arr_ptr->GetAt(frame_num); - FX_DWORD gif_img_row_bytes = gif_image_ptr->image_info_ptr->width; - if (gif_ptr->decode_status == GIF_D_STATUS_TAIL) { - if (gif_image_ptr->image_row_buf) { - FX_Free(gif_image_ptr->image_row_buf); - gif_image_ptr->image_row_buf = NULL; - } - gif_image_ptr->image_row_buf = FX_Alloc(uint8_t, gif_img_row_bytes); - GifGCE* gif_img_gce_ptr = gif_image_ptr->image_gce_ptr; - int32_t loc_pal_num = - ((GifLF*)&gif_image_ptr->image_info_ptr->local_flag)->local_pal - ? (2 << ((GifLF*)&gif_image_ptr->image_info_ptr->local_flag) - ->pal_bits) - : 0; - gif_ptr->avail_in = 0; - if (gif_img_gce_ptr == NULL) { - FX_BOOL bRes = gif_ptr->gif_get_record_position_fn( - gif_ptr, gif_image_ptr->image_data_pos, - gif_image_ptr->image_info_ptr->left, - gif_image_ptr->image_info_ptr->top, - gif_image_ptr->image_info_ptr->width, - gif_image_ptr->image_info_ptr->height, loc_pal_num, - gif_image_ptr->local_pal_ptr, 0, 0, -1, 0, - (FX_BOOL)((GifLF*)&gif_image_ptr->image_info_ptr->local_flag) - ->interlace); - if (!bRes) { - FX_Free(gif_image_ptr->image_row_buf); - gif_image_ptr->image_row_buf = NULL; - gif_error(gif_ptr, "Error Read Record Position Data"); - return 0; - } - } else { - FX_BOOL bRes = gif_ptr->gif_get_record_position_fn( - gif_ptr, gif_image_ptr->image_data_pos, - gif_image_ptr->image_info_ptr->left, - gif_image_ptr->image_info_ptr->top, - gif_image_ptr->image_info_ptr->width, - gif_image_ptr->image_info_ptr->height, loc_pal_num, - gif_image_ptr->local_pal_ptr, - (int32_t)gif_image_ptr->image_gce_ptr->delay_time, - (FX_BOOL)((GifCEF*)&gif_image_ptr->image_gce_ptr->gce_flag) - ->user_input, - ((GifCEF*)&gif_image_ptr->image_gce_ptr->gce_flag)->transparency - ? (int32_t)gif_image_ptr->image_gce_ptr->trans_index - : -1, - (int32_t)((GifCEF*)&gif_image_ptr->image_gce_ptr->gce_flag) - ->disposal_method, - (FX_BOOL)((GifLF*)&gif_image_ptr->image_info_ptr->local_flag) - ->interlace); - if (!bRes) { - FX_Free(gif_image_ptr->image_row_buf); - gif_image_ptr->image_row_buf = NULL; - gif_error(gif_ptr, "Error Read Record Position Data"); - return 0; - } - } - if (gif_ptr->img_decoder_ptr == NULL) { - gif_ptr->img_decoder_ptr = new CGifLZWDecoder(gif_ptr->err_ptr); - } - gif_ptr->img_decoder_ptr->InitTable(gif_image_ptr->image_code_size); - gif_ptr->img_row_offset = 0; - gif_ptr->img_row_avail_size = 0; - gif_ptr->img_pass_num = 0; - gif_image_ptr->image_row_num = 0; - gif_save_decoding_status(gif_ptr, GIF_D_STATUS_IMG_DATA); - } - CGifLZWDecoder* img_decoder_ptr = gif_ptr->img_decoder_ptr; - if (gif_ptr->decode_status == GIF_D_STATUS_IMG_DATA) { - if (gif_read_data(gif_ptr, &data_size_ptr, 1) == NULL) { - return 2; - } - if (*data_size_ptr != GIF_BLOCK_TERMINAL) { - if (gif_read_data(gif_ptr, &data_ptr, *data_size_ptr) == NULL) { - gif_ptr->skip_size = skip_size_org; - return 2; - } - img_decoder_ptr->Input(data_ptr, *data_size_ptr); - gif_save_decoding_status(gif_ptr, GIF_D_STATUS_IMG_DATA); - gif_ptr->img_row_offset += gif_ptr->img_row_avail_size; - gif_ptr->img_row_avail_size = gif_img_row_bytes - gif_ptr->img_row_offset; - int32_t ret = img_decoder_ptr->Decode( - gif_image_ptr->image_row_buf + gif_ptr->img_row_offset, - gif_ptr->img_row_avail_size); - if (ret == 0) { - FX_Free(gif_image_ptr->image_row_buf); - gif_image_ptr->image_row_buf = NULL; - gif_save_decoding_status(gif_ptr, GIF_D_STATUS_TAIL); - gif_error(gif_ptr, "Decode Image Data Error"); - return 0; - } - while (ret != 0) { - if (ret == 1) { - gif_ptr->gif_get_row_fn(gif_ptr, gif_image_ptr->image_row_num, - gif_image_ptr->image_row_buf); - FX_Free(gif_image_ptr->image_row_buf); - gif_image_ptr->image_row_buf = NULL; - gif_save_decoding_status(gif_ptr, GIF_D_STATUS_TAIL); - return 1; - } - if (ret == 2) { - ASSERT(img_decoder_ptr->GetAvailInput() == 0); - skip_size_org = gif_ptr->skip_size; - if (gif_read_data(gif_ptr, &data_size_ptr, 1) == NULL) { - return 2; - } - if (*data_size_ptr != GIF_BLOCK_TERMINAL) { - if (gif_read_data(gif_ptr, &data_ptr, *data_size_ptr) == NULL) { - gif_ptr->skip_size = skip_size_org; - return 2; - } - img_decoder_ptr->Input(data_ptr, *data_size_ptr); - gif_save_decoding_status(gif_ptr, GIF_D_STATUS_IMG_DATA); - gif_ptr->img_row_offset += gif_ptr->img_row_avail_size; - gif_ptr->img_row_avail_size = - gif_img_row_bytes - gif_ptr->img_row_offset; - ret = img_decoder_ptr->Decode( - gif_image_ptr->image_row_buf + gif_ptr->img_row_offset, - gif_ptr->img_row_avail_size); - } - } - if (ret == 3) { - if (((GifLF*)&gif_image_ptr->image_info_ptr->local_flag)->interlace) { - gif_ptr->gif_get_row_fn(gif_ptr, gif_image_ptr->image_row_num, - gif_image_ptr->image_row_buf); - gif_image_ptr->image_row_num += - s_gif_interlace_step[gif_ptr->img_pass_num]; - if (gif_image_ptr->image_row_num >= - (int32_t)gif_image_ptr->image_info_ptr->height) { - gif_ptr->img_pass_num++; - gif_image_ptr->image_row_num = - s_gif_interlace_step[gif_ptr->img_pass_num] / 2; - } - } else { - gif_ptr->gif_get_row_fn(gif_ptr, gif_image_ptr->image_row_num++, - gif_image_ptr->image_row_buf); - } - gif_ptr->img_row_offset = 0; - gif_ptr->img_row_avail_size = gif_img_row_bytes; - ret = img_decoder_ptr->Decode( - gif_image_ptr->image_row_buf + gif_ptr->img_row_offset, - gif_ptr->img_row_avail_size); - } - if (ret == 0) { - FX_Free(gif_image_ptr->image_row_buf); - gif_image_ptr->image_row_buf = NULL; - gif_save_decoding_status(gif_ptr, GIF_D_STATUS_TAIL); - gif_error(gif_ptr, "Decode Image Data Error"); - return 0; - } - } - } - gif_save_decoding_status(gif_ptr, GIF_D_STATUS_TAIL); - } - gif_error(gif_ptr, "Decode Image Data Error"); - return 0; -} -void gif_save_decoding_status(gif_decompress_struct_p gif_ptr, int32_t status) { - gif_ptr->decode_status = status; - gif_ptr->next_in += gif_ptr->skip_size; - gif_ptr->avail_in -= gif_ptr->skip_size; - gif_ptr->skip_size = 0; -} -uint8_t* gif_read_data(gif_decompress_struct_p gif_ptr, - uint8_t** des_buf_pp, - FX_DWORD data_size) { - if (gif_ptr == NULL || gif_ptr->avail_in < gif_ptr->skip_size + data_size) { - return NULL; - } - *des_buf_pp = gif_ptr->next_in + gif_ptr->skip_size; - gif_ptr->skip_size += data_size; - return *des_buf_pp; -} -void gif_input_buffer(gif_decompress_struct_p gif_ptr, - uint8_t* src_buf, - FX_DWORD src_size) { - gif_ptr->next_in = src_buf; - gif_ptr->avail_in = src_size; - gif_ptr->skip_size = 0; -} -FX_DWORD gif_get_avail_input(gif_decompress_struct_p gif_ptr, - uint8_t** avial_buf_ptr) { - if (avial_buf_ptr) { - *avial_buf_ptr = NULL; - if (gif_ptr->avail_in > 0) { - *avial_buf_ptr = gif_ptr->next_in; - } - } - return gif_ptr->avail_in; -} -int32_t gif_get_frame_num(gif_decompress_struct_p gif_ptr) { - return gif_ptr->img_ptr_arr_ptr->GetSize(); -} -static FX_BOOL gif_write_header(gif_compress_struct_p gif_ptr, - uint8_t*& dst_buf, - FX_DWORD& dst_len) { - if (gif_ptr->cur_offset) { - return TRUE; - } - dst_len = sizeof(GifHeader) + sizeof(GifLSD) + sizeof(GifGF); - dst_buf = FX_TryAlloc(uint8_t, dst_len); - if (dst_buf == NULL) { - return FALSE; - } - FXSYS_memset(dst_buf, 0, dst_len); - FXSYS_memcpy(dst_buf, gif_ptr->header_ptr, sizeof(GifHeader)); - gif_ptr->cur_offset += sizeof(GifHeader); - SetWord_LSBFirst(dst_buf + gif_ptr->cur_offset, gif_ptr->lsd_ptr->width); - gif_ptr->cur_offset += 2; - SetWord_LSBFirst(dst_buf + gif_ptr->cur_offset, gif_ptr->lsd_ptr->height); - gif_ptr->cur_offset += 2; - dst_buf[gif_ptr->cur_offset++] = gif_ptr->lsd_ptr->global_flag; - dst_buf[gif_ptr->cur_offset++] = gif_ptr->lsd_ptr->bc_index; - dst_buf[gif_ptr->cur_offset++] = gif_ptr->lsd_ptr->pixel_aspect; - if (gif_ptr->global_pal) { - FX_WORD size = sizeof(GifPalette) * gif_ptr->gpal_num; - if (!gif_grow_buf(dst_buf, dst_len, gif_ptr->cur_offset + size)) { - return FALSE; - } - FXSYS_memcpy(&dst_buf[gif_ptr->cur_offset], gif_ptr->global_pal, size); - gif_ptr->cur_offset += size; - } - return TRUE; -} -void interlace_buf(const uint8_t* buf, FX_DWORD pitch, FX_DWORD height) { - CFX_ArrayTemplate<uint8_t*> pass[4]; - int i, j; - FX_DWORD row; - row = 0; - uint8_t* temp; - while (row < height) { - if (row % 8 == 0) { - j = 0; - } else if (row % 4 == 0) { - j = 1; - } else if (row % 2 == 0) { - j = 2; - } else { - j = 3; - } - temp = FX_Alloc(uint8_t, pitch); - if (temp == NULL) { - return; - } - FXSYS_memcpy(temp, &buf[pitch * row], pitch); - pass[j].Add(temp); - row++; - } - for (i = 0, row = 0; i < 4; i++) { - for (j = 0; j < pass[i].GetSize(); j++, row++) { - FXSYS_memcpy((uint8_t*)&buf[pitch * row], pass[i].GetAt(j), pitch); - FX_Free(pass[i].GetAt(j)); - } - } -} -static void gif_write_block_data(const uint8_t* src_buf, - FX_DWORD src_len, - uint8_t*& dst_buf, - FX_DWORD& dst_len, - FX_DWORD& dst_offset) { - FX_DWORD src_offset = 0; - while (src_len > GIF_DATA_BLOCK) { - dst_buf[dst_offset++] = GIF_DATA_BLOCK; - FXSYS_memcpy(&dst_buf[dst_offset], &src_buf[src_offset], GIF_DATA_BLOCK); - dst_offset += GIF_DATA_BLOCK; - src_offset += GIF_DATA_BLOCK; - src_len -= GIF_DATA_BLOCK; - } - dst_buf[dst_offset++] = (uint8_t)src_len; - FXSYS_memcpy(&dst_buf[dst_offset], &src_buf[src_offset], src_len); - dst_offset += src_len; -} -static FX_BOOL gif_write_data(gif_compress_struct_p gif_ptr, - uint8_t*& dst_buf, - FX_DWORD& dst_len) { - if (!gif_grow_buf(dst_buf, dst_len, gif_ptr->cur_offset + GIF_DATA_BLOCK)) { - return FALSE; - } - if (FXSYS_memcmp(gif_ptr->header_ptr->version, "89a", 3) == 0) { - dst_buf[gif_ptr->cur_offset++] = GIF_SIG_EXTENSION; - dst_buf[gif_ptr->cur_offset++] = GIF_BLOCK_GCE; - gif_ptr->gce_ptr->block_size = 4; - dst_buf[gif_ptr->cur_offset++] = gif_ptr->gce_ptr->block_size; - gif_ptr->gce_ptr->gce_flag = 0; - dst_buf[gif_ptr->cur_offset++] = gif_ptr->gce_ptr->gce_flag; - gif_ptr->gce_ptr->delay_time = 10; - SetWord_LSBFirst(dst_buf + gif_ptr->cur_offset, - gif_ptr->gce_ptr->delay_time); - gif_ptr->cur_offset += 2; - gif_ptr->gce_ptr->trans_index = 0; - dst_buf[gif_ptr->cur_offset++] = gif_ptr->gce_ptr->trans_index; - dst_buf[gif_ptr->cur_offset++] = 0; - } - dst_buf[gif_ptr->cur_offset++] = GIF_SIG_IMAGE; - SetWord_LSBFirst(dst_buf + gif_ptr->cur_offset, - gif_ptr->image_info_ptr->left); - gif_ptr->cur_offset += 2; - SetWord_LSBFirst(dst_buf + gif_ptr->cur_offset, gif_ptr->image_info_ptr->top); - gif_ptr->cur_offset += 2; - SetWord_LSBFirst(dst_buf + gif_ptr->cur_offset, - gif_ptr->image_info_ptr->width); - gif_ptr->cur_offset += 2; - SetWord_LSBFirst(dst_buf + gif_ptr->cur_offset, - gif_ptr->image_info_ptr->height); - gif_ptr->cur_offset += 2; - GifLF& lf = (GifLF&)gif_ptr->image_info_ptr->local_flag; - dst_buf[gif_ptr->cur_offset++] = gif_ptr->image_info_ptr->local_flag; - if (gif_ptr->local_pal) { - FX_DWORD pal_size = sizeof(GifPalette) * gif_ptr->lpal_num; - if (!gif_grow_buf(dst_buf, dst_len, pal_size + gif_ptr->cur_offset)) { - return FALSE; - } - FXSYS_memcpy(&dst_buf[gif_ptr->cur_offset], gif_ptr->local_pal, pal_size); - gif_ptr->cur_offset += pal_size; - } - if (lf.interlace) { - interlace_buf(gif_ptr->src_buf, gif_ptr->src_pitch, - gif_ptr->image_info_ptr->height); - } - uint8_t code_bit = lf.pal_bits; - if (lf.local_pal == 0) { - GifGF& gf = (GifGF&)gif_ptr->lsd_ptr->global_flag; - code_bit = gf.pal_bits; - } - gif_ptr->img_encoder_ptr->Start(code_bit, gif_ptr->src_buf, dst_buf, - gif_ptr->cur_offset); - FX_DWORD i; - for (i = 0; i < gif_ptr->src_row; i++) { - if (!gif_ptr->img_encoder_ptr->Encode( - &gif_ptr->src_buf[i * gif_ptr->src_pitch], - gif_ptr->src_width * (code_bit + 1), dst_buf, dst_len, - gif_ptr->cur_offset)) { - return FALSE; - } - } - gif_ptr->img_encoder_ptr->Finish(dst_buf, dst_len, gif_ptr->cur_offset); - dst_buf[gif_ptr->cur_offset++] = 0; - if (FXSYS_memcmp(gif_ptr->header_ptr->version, "89a", 3) == 0 && - gif_ptr->cmt_data_ptr) { - dst_buf[gif_ptr->cur_offset++] = GIF_SIG_EXTENSION; - dst_buf[gif_ptr->cur_offset++] = GIF_BLOCK_CE; - gif_write_block_data(gif_ptr->cmt_data_ptr, gif_ptr->cmt_data_len, dst_buf, - dst_len, gif_ptr->cur_offset); - dst_buf[gif_ptr->cur_offset++] = 0; - } - if (FXSYS_memcmp(gif_ptr->header_ptr->version, "89a", 3) == 0 && - gif_ptr->pte_data_ptr) { - dst_buf[gif_ptr->cur_offset++] = GIF_SIG_EXTENSION; - dst_buf[gif_ptr->cur_offset++] = GIF_BLOCK_PTE; - dst_buf[gif_ptr->cur_offset++] = gif_ptr->pte_ptr->block_size; - SetWord_LSBFirst(dst_buf + gif_ptr->cur_offset, - gif_ptr->pte_ptr->grid_left); - gif_ptr->cur_offset += 2; - SetWord_LSBFirst(dst_buf + gif_ptr->cur_offset, gif_ptr->pte_ptr->grid_top); - gif_ptr->cur_offset += 2; - SetWord_LSBFirst(dst_buf + gif_ptr->cur_offset, - gif_ptr->pte_ptr->grid_width); - gif_ptr->cur_offset += 2; - SetWord_LSBFirst(dst_buf + gif_ptr->cur_offset, - gif_ptr->pte_ptr->grid_height); - gif_ptr->cur_offset += 2; - SetWord_LSBFirst(dst_buf + gif_ptr->cur_offset, - gif_ptr->pte_ptr->char_width); - gif_ptr->cur_offset += 2; - SetWord_LSBFirst(dst_buf + gif_ptr->cur_offset, - gif_ptr->pte_ptr->char_height); - gif_ptr->cur_offset += 2; - SetWord_LSBFirst(dst_buf + gif_ptr->cur_offset, gif_ptr->pte_ptr->fc_index); - gif_ptr->cur_offset += 2; - SetWord_LSBFirst(dst_buf + gif_ptr->cur_offset, gif_ptr->pte_ptr->bc_index); - gif_ptr->cur_offset += 2; - gif_write_block_data(gif_ptr->pte_data_ptr, gif_ptr->pte_data_len, dst_buf, - dst_len, gif_ptr->cur_offset); - gif_ptr->cur_offset += gif_ptr->pte_data_len; - dst_buf[gif_ptr->cur_offset++] = 0; - } - dst_buf[gif_ptr->cur_offset++] = GIF_SIG_TRAILER; - return TRUE; -} -FX_BOOL gif_encode(gif_compress_struct_p gif_ptr, - uint8_t*& dst_buf, - FX_DWORD& dst_len) { - if (!gif_write_header(gif_ptr, dst_buf, dst_len)) { - return FALSE; - } - FX_DWORD cur_offset = gif_ptr->cur_offset; - FX_BOOL res = TRUE; - if (gif_ptr->frames) { - gif_ptr->cur_offset--; - } - if (!gif_write_data(gif_ptr, dst_buf, dst_len)) { - gif_ptr->cur_offset = cur_offset; - res = FALSE; - } - dst_len = gif_ptr->cur_offset; - dst_buf[dst_len - 1] = GIF_SIG_TRAILER; - if (res) { - gif_ptr->frames++; - } - return res; -} diff --git a/core/src/fxcodec/lgif/fx_gif.h b/core/src/fxcodec/lgif/fx_gif.h deleted file mode 100644 index 32300a50e5..0000000000 --- a/core/src/fxcodec/lgif/fx_gif.h +++ /dev/null @@ -1,296 +0,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 - -#ifndef CORE_SRC_FXCODEC_LGIF_FX_GIF_H_ -#define CORE_SRC_FXCODEC_LGIF_FX_GIF_H_ - -#include <setjmp.h> - -#include "core/include/fxcrt/fx_basic.h" - -#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 const 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); - CFX_ByteString* cmt_data_ptr; - GifGCE* gce_ptr; - CFX_ArrayTemplate<GifPlainText*>* pt_ptr_arr_ptr; -}; -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; - - uint8_t* cmt_data_ptr; - FX_DWORD cmt_data_len; - GifGCE* gce_ptr; - GifPTE* pte_ptr; - const uint8_t* pte_data_ptr; - FX_DWORD pte_data_len; -}; - -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); - -#endif // CORE_SRC_FXCODEC_LGIF_FX_GIF_H_ |