aboutsummaryrefslogtreecommitdiff
path: root/main.c
diff options
context:
space:
mode:
authorHarry Jeffery <harry@exec64.co.uk>2015-11-09 23:15:42 +0000
committerHarry Jeffery <harry@exec64.co.uk>2015-11-09 23:15:42 +0000
commitb35dbbadc79a093320a5245053d8a698e11336b9 (patch)
tree4f3fcdb6abd9aaa9ae5ceb8e4dcf4483ac9668c9 /main.c
parentcddbed50548cebf9c7d12bcf961202b4058159d2 (diff)
downloadimv-b35dbbadc79a093320a5245053d8a698e11336b9.tar.gz
Improve handling of animated gifs
Diffstat (limited to 'main.c')
-rw-r--r--main.c34
1 files changed, 28 insertions, 6 deletions
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);