return MM_UTIL_ERROR_NONE;
}
-int _gif_image_alloc_ext_block(gif_image_s *gif_image, int function, int byte_count, ExtensionBlock **ext_block)
+int _gif_image_create_ext_block(gif_image_s *gif_image, int function, int byte_count, ExtensionBlock **ext_block)
{
- int i = 0;
ExtensionBlock *_ext_block = NULL;
mm_util_retvm_if(gif_image == NULL, MM_UTIL_ERROR_INVALID_PARAMETER, "Invalid parameter");
mm_util_retvm_if(byte_count == 0, MM_UTIL_ERROR_INVALID_PARAMETER, "Invalid parameter");
mm_util_retvm_if(ext_block == NULL, MM_UTIL_ERROR_INVALID_PARAMETER, "Invalid parameter");
- if (gif_image->ext_blocks == NULL) {
- gif_image->ext_blocks = (ExtensionBlock *)calloc(1, sizeof(ExtensionBlock));
- if (gif_image->ext_blocks == NULL) {
- mm_util_error("Memory allocation failed");
- *ext_block = NULL;
- return MM_UTIL_ERROR_OUT_OF_MEMORY;
- }
- } else {
- /* check exist function block */
- for (i = 0; i < gif_image->ext_block_count; i++) {
- _ext_block = &gif_image->ext_blocks[i];
- if (_ext_block != NULL && _ext_block->Function == function) {
- mm_util_error("[Not Error] Ext block has already exist");
- *ext_block = _ext_block;
- return MM_UTIL_ERROR_NONE;
- }
- }
- ExtensionBlock *realloc_ptr = (ExtensionBlock *)realloc(gif_image->ext_blocks, (sizeof(ExtensionBlock) * (gif_image->ext_block_count + 1)));
- if (realloc_ptr == NULL) {
- mm_util_error("Memory reallocation failed");
- *ext_block = NULL;
- return MM_UTIL_ERROR_OUT_OF_MEMORY;
- }
- gif_image->ext_blocks = realloc_ptr;
- }
-
/* get allocated extention block */
- _ext_block = &gif_image->ext_blocks[gif_image->ext_block_count];
+ _ext_block = (ExtensionBlock *)calloc(1, sizeof(ExtensionBlock));
+ if (_ext_block == NULL) {
+ mm_util_error("Memory allocation failed");
+ *ext_block = NULL;
+ return MM_UTIL_ERROR_OUT_OF_MEMORY;
+ }
_ext_block->Function = function;
_ext_block->ByteCount = byte_count;
_ext_block->Bytes = (GifByteType *)calloc(1, (sizeof(GifByteType) * byte_count));
if (_ext_block->Bytes == NULL) {
mm_util_error("Memory allocation failed");
- /* free all ext_blocks, TODO: free current ext_blocks */
- for (i = 0; i < gif_image->ext_block_count; i++) {
- _ext_block = &gif_image->ext_blocks[i];
- MMUTIL_SAFE_FREE(_ext_block->Bytes);
- }
- MMUTIL_SAFE_FREE(gif_image->ext_blocks);
- gif_image->ext_block_count = 0;
+ MMUTIL_SAFE_FREE(_ext_block);
return MM_UTIL_ERROR_OUT_OF_MEMORY;
}
- gif_image->ext_block_count++;
-
*ext_block = _ext_block;
return MM_UTIL_ERROR_NONE;
}
-int _gif_image_write_ext_blocks(gif_file_s *gif_file, gif_image_s *gif_image)
+int _gif_image_write_ext_block(gif_file_s *gif_file, gif_image_s *gif_image)
{
int ret = MM_UTIL_ERROR_NONE;
- int i = 0;
ExtensionBlock *_ext_block = NULL;
GraphicsControlBlock graphic_control_block;
mm_util_retvm_if(gif_file == NULL, MM_UTIL_ERROR_INVALID_PARAMETER, "Invalid parameter");
mm_util_retvm_if(gif_image == NULL, MM_UTIL_ERROR_INVALID_PARAMETER, "Invalid parameter");
- ret = _gif_image_alloc_ext_block(gif_image, GRAPHICS_EXT_FUNC_CODE, GRAPHIC_EXT_BLOCK_SIZE, &_ext_block);
+ ret = _gif_image_create_ext_block(gif_image, GRAPHICS_EXT_FUNC_CODE, GRAPHIC_EXT_BLOCK_SIZE, &_ext_block);
mm_util_retvm_if(ret != MM_UTIL_ERROR_NONE, ret, "_gif_image_alloc_ext_block failed");
mm_util_retvm_if(_ext_block->Bytes == NULL, MM_UTIL_ERROR_OUT_OF_MEMORY, "_gif_image_alloc_ext_block failed");
EGifGCBToExtension(&graphic_control_block, _ext_block->Bytes);
- for (i = 0; i < gif_image->ext_block_count; i++) {
- _ext_block = &gif_image->ext_blocks[i];
- mm_util_retvm_if(_ext_block == NULL, MM_UTIL_ERROR_INVALID_OPERATION, "extension block is empty");
+ if (EGifPutExtension(gif_file->GifFile, _ext_block->Function, _ext_block->ByteCount, _ext_block->Bytes) == GIF_ERROR) {
+ mm_util_error("EGifPutExtension failed due to %s", GifErrorString(gif_file->GifFile->Error));
+ ret = MM_UTIL_ERROR_INVALID_OPERATION;
+ }
- if (EGifPutExtension(gif_file->GifFile, _ext_block->Function, _ext_block->ByteCount, _ext_block->Bytes) == GIF_ERROR) {
- mm_util_error("EGifPutExtension failed due to %s", GifErrorString(gif_file->GifFile->Error));
- return MM_UTIL_ERROR_INVALID_OPERATION;
- }
+ /* release extension blocks */
+ if (_ext_block != NULL) {
+ MMUTIL_SAFE_FREE(_ext_block->Bytes);
+ MMUTIL_SAFE_FREE(_ext_block);
}
return MM_UTIL_ERROR_NONE;
/* set default width & height */
pImage->width = gif_file->width;
pImage->height = gif_file->height;
- pImage->ext_block_count = 0;
- pImage->ext_blocks = NULL;
*gif_image_h = (mm_gif_image_h)pImage;
void mm_util_gif_image_destory(mm_gif_image_h gif_image_h)
{
- int i = 0;
- ExtensionBlock *_ext_block = NULL;
gif_image_s *gif_image = (gif_image_s *)gif_image_h;
mm_util_retm_if(gif_image == NULL, "Invalid parameter");
- /* release extension blocks */
- if (gif_image->ext_blocks != NULL) {
- for (i = 0; i < gif_image->ext_block_count; i++) {
- _ext_block = &gif_image->ext_blocks[i];
- MMUTIL_SAFE_FREE(_ext_block->Bytes);
- }
- MMUTIL_SAFE_FREE(gif_image->ext_blocks);
- }
-
MMUTIL_SAFE_FREE(gif_image);
}
mm_util_retvm_if(ret != MM_UTIL_ERROR_NONE, ret, "mm_util_gif_encode_start failed");
}
- /* Write extension blocks */
- ret = _gif_image_write_ext_blocks(gif_file, gif_image);
- mm_util_retvm_if(ret != MM_UTIL_ERROR_NONE, ret, "_gif_image_write_ext_blocks failed");
+ /* Write graphic control block */
+ ret = _gif_image_write_ext_block(gif_file, gif_image);
+ mm_util_retvm_if(ret != MM_UTIL_ERROR_NONE, ret, "_gif_image_write_ext_block failed");
/* Write image description & data */
ret = _gif_image_write_image(gif_file, gif_image);
- mm_util_retvm_if(ret != MM_UTIL_ERROR_NONE, ret, "_gif_image_write_image_desc failed");
+ mm_util_retvm_if(ret != MM_UTIL_ERROR_NONE, ret, "_gif_image_write_image failed");
gif_file->GifFile->ImageCount++;