14d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Copyright 2014 PDFium Authors. All rights reserved. 24d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be 34d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// found in the LICENSE file. 44d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 54d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 64d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 75ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann#include "core/fxcodec/codec/ccodec_gifmodule.h" 85ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxcodec/codec/codec_int.h" 104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxcodec/fx_codec.h" 114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxcodec/lgif/fx_gif.h" 124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxge/fx_dib.h" 135ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannstruct FXGIF_Context { 154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann gif_decompress_struct_p gif_ptr; 164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann void* parent_ptr; 174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann void* (*m_AllocFunc)(unsigned int); 194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann void (*m_FreeFunc)(void*); 204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}; 215ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannextern "C" { 234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannstatic void* gif_alloc_func(unsigned int size) { 244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return FX_Alloc(char, size); 254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannstatic void gif_free_func(void* p) { 274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_Free(p); 284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}; 305ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannstatic void gif_error_data(gif_decompress_struct_p gif_ptr, 324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const FX_CHAR* err_msg) { 334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FXSYS_strncpy((char*)gif_ptr->err_ptr, err_msg, GIF_MAX_ERROR_SIZE - 1); 344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann longjmp(gif_ptr->jmpbuf, 1); 354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 365ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannstatic uint8_t* gif_ask_buf_for_pal(gif_decompress_struct_p gif_ptr, 384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t pal_size) { 394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FXGIF_Context* p = (FXGIF_Context*)gif_ptr->context_ptr; 404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CCodec_GifModule* pModule = (CCodec_GifModule*)p->parent_ptr; 415ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann return pModule->GetDelegate()->GifAskLocalPaletteBuf( 425ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann gif_get_frame_num(gif_ptr), pal_size); 434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 445ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannstatic void gif_record_current_position(gif_decompress_struct_p gif_ptr, 464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t* cur_pos_ptr) { 474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FXGIF_Context* p = (FXGIF_Context*)gif_ptr->context_ptr; 484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CCodec_GifModule* pModule = (CCodec_GifModule*)p->parent_ptr; 495ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann pModule->GetDelegate()->GifRecordCurrentPosition(*cur_pos_ptr); 504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 515ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannstatic void gif_read_scanline(gif_decompress_struct_p gif_ptr, 534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t row_num, 544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t* row_buf) { 554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FXGIF_Context* p = (FXGIF_Context*)gif_ptr->context_ptr; 564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CCodec_GifModule* pModule = (CCodec_GifModule*)p->parent_ptr; 575ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann pModule->GetDelegate()->GifReadScanline(row_num, row_buf); 584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 595ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannstatic bool gif_get_record_position(gif_decompress_struct_p gif_ptr, 614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t cur_pos, 624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t left, 634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t top, 644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t width, 654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t height, 664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t pal_num, 674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann void* pal_ptr, 684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t delay_time, 694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool user_input, 704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t trans_index, 714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t disposal_method, 724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool interlace) { 734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FXGIF_Context* p = (FXGIF_Context*)gif_ptr->context_ptr; 744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CCodec_GifModule* pModule = (CCodec_GifModule*)p->parent_ptr; 755ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann return pModule->GetDelegate()->GifInputRecordPositionBuf( 765ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann cur_pos, FX_RECT(left, top, left + width, top + height), pal_num, pal_ptr, 775ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann delay_time, user_input, trans_index, disposal_method, interlace); 784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 805ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. MoltmannCCodec_GifModule::CCodec_GifModule() { 815ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann memset(m_szLastError, 0, sizeof(m_szLastError)); 825ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann} 835ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 845ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. MoltmannCCodec_GifModule::~CCodec_GifModule() {} 855ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 865ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. MoltmannFXGIF_Context* CCodec_GifModule::Start() { 874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FXGIF_Context* p = FX_Alloc(FXGIF_Context, 1); 884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!p) 894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nullptr; 904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FXSYS_memset(p, 0, sizeof(FXGIF_Context)); 924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann p->m_AllocFunc = gif_alloc_func; 934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann p->m_FreeFunc = gif_free_func; 944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann p->gif_ptr = nullptr; 954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann p->parent_ptr = (void*)this; 964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann p->gif_ptr = gif_create_decompress(); 974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!p->gif_ptr) { 984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_Free(p); 994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nullptr; 1004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann p->gif_ptr->context_ptr = (void*)p; 1024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann p->gif_ptr->err_ptr = m_szLastError; 1034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann p->gif_ptr->gif_error_fn = gif_error_data; 1044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann p->gif_ptr->gif_ask_buf_for_pal_fn = gif_ask_buf_for_pal; 1054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann p->gif_ptr->gif_record_current_position_fn = gif_record_current_position; 1064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann p->gif_ptr->gif_get_row_fn = gif_read_scanline; 1074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann p->gif_ptr->gif_get_record_position_fn = gif_get_record_position; 1084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return p; 1094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CCodec_GifModule::Finish(FXGIF_Context* ctx) { 1124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ctx) { 1134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann gif_destroy_decompress(&ctx->gif_ptr); 1144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ctx->m_FreeFunc(ctx); 1154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint32_t CCodec_GifModule::ReadHeader(FXGIF_Context* ctx, 1194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int* width, 1204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int* height, 1214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int* pal_num, 1224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann void** pal_pp, 1234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int* bg_index, 1244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_DIBAttribute* pAttribute) { 1254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (setjmp(ctx->gif_ptr->jmpbuf)) 1264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 0; 1274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t ret = gif_read_header(ctx->gif_ptr); 1294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ret != 1) 1304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return ret; 1314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *width = ctx->gif_ptr->width; 1334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *height = ctx->gif_ptr->height; 1344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *pal_num = ctx->gif_ptr->global_pal_num; 1354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *pal_pp = ctx->gif_ptr->global_pal_ptr; 1364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *bg_index = ctx->gif_ptr->bc_index; 1374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 1; 1384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint32_t CCodec_GifModule::LoadFrameInfo(FXGIF_Context* ctx, int* frame_num) { 1414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (setjmp(ctx->gif_ptr->jmpbuf)) 1424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 0; 1434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t ret = gif_get_frame(ctx->gif_ptr); 1454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ret != 1) 1464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return ret; 1474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *frame_num = gif_get_frame_num(ctx->gif_ptr); 1494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 1; 1504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint32_t CCodec_GifModule::LoadFrame(FXGIF_Context* ctx, 1534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int frame_num, 1544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_DIBAttribute* pAttribute) { 1554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (setjmp(ctx->gif_ptr->jmpbuf)) 1564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 0; 1574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t ret = gif_load_frame(ctx->gif_ptr, frame_num); 1594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ret == 1) { 1604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pAttribute) { 1614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pAttribute->m_nGifLeft = 1624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (*ctx->gif_ptr->img_ptr_arr_ptr)[frame_num]->image_info_ptr->left; 1634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pAttribute->m_nGifTop = 1644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (*ctx->gif_ptr->img_ptr_arr_ptr)[frame_num]->image_info_ptr->top; 1654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pAttribute->m_fAspectRatio = ctx->gif_ptr->pixel_aspect; 1664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ctx->gif_ptr->cmt_data_ptr) { 1674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const uint8_t* buf = 1684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (const uint8_t*)ctx->gif_ptr->cmt_data_ptr->GetBuffer(0); 1694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t len = ctx->gif_ptr->cmt_data_ptr->GetLength(); 1704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (len > 21) { 1714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t size = *buf++; 1724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (size) { 1734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pAttribute->m_strAuthor = CFX_ByteString(buf, size); 1744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 1754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pAttribute->m_strAuthor.clear(); 1764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann buf += size; 1784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann size = *buf++; 1794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (size == 20) { 1804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FXSYS_memcpy(pAttribute->m_strTime, buf, size); 1814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return ret; 1874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannuint32_t CCodec_GifModule::GetAvailInput(FXGIF_Context* ctx, 1904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t** avail_buf_ptr) { 1914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return gif_get_avail_input(ctx->gif_ptr, avail_buf_ptr); 1924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CCodec_GifModule::Input(FXGIF_Context* ctx, 1954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const uint8_t* src_buf, 1964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t src_size) { 1974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann gif_input_buffer(ctx->gif_ptr, (uint8_t*)src_buf, src_size); 1984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 199