From b35dbbadc79a093320a5245053d8a698e11336b9 Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Mon, 9 Nov 2015 23:15:42 +0000 Subject: Improve handling of animated gifs --- main.c | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) (limited to 'main.c') diff --git a/main.c b/main.c index 9d46e95..fe4a2a9 100644 --- a/main.c +++ b/main.c @@ -271,6 +271,8 @@ void next_frame() FITAG *tag = NULL; char disposal_method = 0; int frame_time = 0; + short top = 0; + short left = 0; g_img.cur_frame = g_img.next_frame; g_img.next_frame = (g_img.cur_frame + 1) % g_img.num_frames; @@ -286,6 +288,16 @@ void next_frame() } } + FreeImage_GetMetadata(FIMD_ANIMATION, frame, "FrameLeft", &tag); + if(FreeImage_GetTagValue(tag)) { + left = *(short*)FreeImage_GetTagValue(tag); + } + + FreeImage_GetMetadata(FIMD_ANIMATION, frame, "FrameTop", &tag); + if(FreeImage_GetTagValue(tag)) { + top = *(short*)FreeImage_GetTagValue(tag); + } + FreeImage_GetMetadata(FIMD_ANIMATION, frame, "FrameTime", &tag); if(FreeImage_GetTagValue(tag)) { frame_time = *(int*)FreeImage_GetTagValue(tag); @@ -295,11 +307,23 @@ void next_frame() FreeImage_UnlockPage(g_img.mbmp, frame, 0); + //If this frame is inset, we need to expand it for compositing + if(left != 0 || top != 0) { + RGBQUAD color = {0,0,0,0}; + FIBITMAP *expanded = FreeImage_EnlargeCanvas(frame32, left, top, + g_img.width - FreeImage_GetWidth(frame32) - left, + g_img.height - FreeImage_GetHeight(frame32) - top, + &color, + 0); + FreeImage_Unload(frame32); + frame32 = expanded; + } + switch(disposal_method) { - case 0: /*nothing specified, just use the raw frame*/ + case 0: //nothing specified, just use the raw frame push_img_to_gpu(frame32); break; - case 1: /*composite over previous frame*/ + case 1: //composite over previous frame if(g_img.frame && g_img.cur_frame > 0) { FIBITMAP *bg_frame = FreeImage_ConvertTo24Bits(g_img.frame); FIBITMAP *comp = FreeImage_Composite(frame32, 1, NULL, bg_frame); @@ -311,11 +335,9 @@ void next_frame() push_img_to_gpu(frame32); } break; - case 2: /*set to background, composite over that*/ - fprintf(stdout, "tried to set to bg\n"); + case 2: //TODO - set to background, composite over that break; - case 3: /*restore to previous content*/ - fprintf(stdout, "restore to content\n"); + case 3: //TODO - restore to previous content break; } FreeImage_Unload(frame32); -- cgit v1.2.3