goto error;
}
- for (i = 0; i < GifFile->SWidth; i++) /* Set its color to BackGround. */
+ for (i = 0; i < (int)(GifFile->SWidth); i++) /* Set its color to BackGround. */
screen_buffer[0][i] = GifFile->SBackGroundColor;
- for (i = 1; i < GifFile->SHeight; i++) {
+ for (i = 1; i < (int)(GifFile->SHeight); i++) {
/* Allocate the other rows, and set their color to background too: */
if ((screen_buffer[i] = (GifRowType) calloc(1, Size)) == NULL) {
mm_util_error("Failed to allocate memory required, aborted.");
if (screen_buffer) {
if (screen_buffer[0])
(void)free(screen_buffer[0]);
- for (i = 1; i < GifFile->SHeight; i++) {
+ for (i = 1; i < (int)(GifFile->SHeight); i++) {
if (screen_buffer[i])
(void)free(screen_buffer[i]);
}
return MM_UTIL_ERROR_NONE;
}
+#define RGB_FREE(r, g, b) { free(r); free(g); free(b); }
+
static int __write_gif(mm_util_gif_data *encoded)
{
int ColorMapSize;
}
for (i = encoded->current_count; i < encoded->image_count; i++) {
+ /* allocate output buffer */
if ((OutputBuffer = (GifByteType *) malloc(encoded->frames[i]->width * encoded->frames[i]->height * sizeof(GifByteType))) == NULL) {
mm_util_error("Failed to allocate memory required, aborted.");
mm_util_encode_close_gif(encoded);
return MM_UTIL_ERROR_INVALID_OPERATION;
}
+ /* make colormap and quantization for the color table of gif */
ColorMapSize = 1 << 8;
__load_rgb_from_buffer((GifByteType *) encoded->frames[i]->data, &red, &green, &blue, encoded->frames[i]->width, encoded->frames[i]->height);
if ((OutputColorMap = GifMakeMapObject(ColorMapSize, NULL)) == NULL) {
mm_util_error("could not map object");
- free((char *)red);
- free((char *)green);
- free((char *)blue);
+ RGB_FREE((char *)red, (char *)green, (char *)blue);
free(OutputBuffer);
mm_util_encode_close_gif(encoded);
return MM_UTIL_ERROR_INVALID_OPERATION;
}
if (GifQuantizeBuffer(encoded->frames[i]->width, encoded->frames[i]->height, &ColorMapSize, red, green, blue, OutputBuffer, OutputColorMap->Colors) == GIF_ERROR) {
mm_util_error("could not quantize buffer");
- free((char *)red);
- free((char *)green);
- free((char *)blue);
+ RGB_FREE((char *)red, (char *)green, (char *)blue);
free(OutputBuffer);
+ GifFreeMapObject(OutputColorMap);
mm_util_encode_close_gif(encoded);
return MM_UTIL_ERROR_INVALID_OPERATION;
}
- free((char *)red);
- free((char *)green);
- free((char *)blue);
+ RGB_FREE((char *)red, (char *)green, (char *)blue);
encoded->frames[i]->transparent_color.Red = 0xff;
encoded->frames[i]->transparent_color.Green = 0xff;
encoded->frames[i]->disposal_mode = MM_UTIL_GIF_DISPOSAL_UNSPECIFIED;
encoded->frames[i]->is_transparent = false;
+ /* encode OutputBuffer to GifFile */
if (__save_buffer_to_gif(encoded->GifFile, OutputBuffer, OutputColorMap, encoded->frames[i]) != MM_UTIL_ERROR_NONE) {
mm_util_error("save_buffer_to_gif is failed");
free(OutputBuffer);
+ GifFreeMapObject(OutputColorMap);
mm_util_encode_close_gif(encoded);
return MM_UTIL_ERROR_INVALID_OPERATION;
}
free(OutputBuffer);
+ GifFreeMapObject(OutputColorMap);
encoded->current_count++;
}
encoded->size = encoded->write_data_ptr.size;