mng_retcode mng_render_proportional(mng_handle mngh, int progress) { mng_anim *mng = mng_get_userdata(mngh); mng_retcode ret = MNG_NOERROR; int frame_num, current_frame; frame_num = ((progress * mng->num_frames) / FBSPL_PROGRESS_MAX) + 1; if (!mng->displayed_first) { ret = mng_display(mngh); mng->displayed_first = 1; } if (mng->num_frames == 0 && mng->displayed_first) return MNG_NOERROR; if (frame_num > mng->num_frames) frame_num = mng->num_frames; current_frame = mng_get_currentframe(mngh); if (current_frame == frame_num) return ret; /* Don't bother freezing if the next frame is just n+1. mng_display_resume * will do this case by default, and it saves us from the horrid hack * below. */ if (frame_num != current_frame + 1) { mng_display_freeze(mngh); /* XXX: hack! workaround what seems to be a bug in libmng - it won't * actually repaint the canvas if you wind an animation "forwards" * using goframe, only backwards, so go to the end of the animation first. */ mng_display_goframe(mngh, mng->num_frames); if (frame_num != mng->num_frames) mng_display_goframe(mngh, frame_num); } ret = mng_display_resume(mngh); if (ret == MNG_NEEDTIMERWAIT || ret == MNG_NOERROR) return ret; print_mng_error(mngh, "mng_display failed"); return ret; }
static void ContextMenu(PluginInstance *This, HWND hwnd) { int cmd; HMENU menu; POINT pt; unsigned char buf[MAX_PATH], buf2[200]; pt.x=0; pt.y=0; GetCursorPos(&pt); // create context menu dynamically menu=CreatePopupMenu(); if(This->errorflag) { AppendMenu(menu,MF_ENABLED,ID_SHOWERROR,"SHOW ERROR MESSAGE"); AppendMenu(menu,MF_SEPARATOR,0,NULL); } AppendMenu(menu,(This->loadstate>=STATE_LOADED?MF_ENABLED:MF_GRAYED),ID_SAVEAS,"Save Image &As..."); AppendMenu(menu,(This->lpdib?MF_ENABLED:MF_GRAYED),ID_COPYIMAGE,"&Copy Image"); AppendMenu(menu,MF_ENABLED,ID_COPYURL,"Cop&y Image Location"); if(This->islink) { AppendMenu(menu,MF_ENABLED,ID_COPYLINKLOC,"Copy Link Location"); } url2filename(buf,This->url); escapeformenu(buf); if(lstrlen(buf)) { wsprintf(buf2,"View Image (%s)",buf); } else { wsprintf(buf2,"View Image"); } AppendMenu(menu,MF_ENABLED,ID_VIEWIMAGE,buf2); AppendMenu(menu,MF_SEPARATOR,0,NULL); // AppendMenu(menu,(This->mng?MF_ENABLED:MF_GRAYED),ID_STOPANIM,"Stop Animation"); AppendMenu(menu,(This->mng?MF_ENABLED:MF_GRAYED)| (This->frozen?MF_CHECKED:MF_UNCHECKED),ID_FREEZE,"&Freeze Animation"); // AppendMenu(menu,(This->mng?MF_ENABLED:MF_GRAYED),ID_RESTARTANIM,"Restart Animation"); AppendMenu(menu,MF_SEPARATOR,0,NULL); AppendMenu(menu,MF_ENABLED,ID_PROPERTIES,"Properties..."); AppendMenu(menu,MF_ENABLED,ID_ABOUT,"About MNG Plug-in..."); cmd=TrackPopupMenuEx(menu, TPM_LEFTALIGN|TPM_TOPALIGN|TPM_NONOTIFY|TPM_RETURNCMD| TPM_RIGHTBUTTON,pt.x,pt.y,hwnd,NULL); DestroyMenu(menu); switch(cmd) { case ID_STOPANIM: if(This->mng) { KillTimer(This->fhWnd,1); This->timer_set=0; mng_display_freeze(This->mng); } break; case ID_FREEZE: This->frozen = !This->frozen; if(This->frozen) { KillTimer(This->fhWnd,1); This->timer_set=0; mng_display_freeze(This->mng); } else { handle_read_error(This, mng_display_resume(This->mng) ); } break; case ID_RESTARTANIM: if(!This->frozen) { KillTimer(This->fhWnd,1); This->timer_set=0; mng_display_freeze(This->mng); } This->frozen=1; mng_display_reset(This->mng); This->frozen=0; handle_read_error(This, mng_display_resume(This->mng) ); break; case ID_SAVEAS: SaveImage(This); break; case ID_COPYIMAGE: if(This->lpdib) { CopyToClipboard(This,(unsigned char*)This->lpdib,This->dibsize,CF_DIB); } else { warn(This,"No image to copy"); } break; case ID_COPYURL: CopyToClipboard(This,This->url,lstrlen(This->url)+1,CF_TEXT); break; case ID_COPYLINKLOC: if(This->islink) { CopyToClipboard(This,This->linkurl,lstrlen(This->linkurl)+1,CF_TEXT); } break; case ID_VIEWIMAGE: if(lstrlen(This->url)) NPN_GetURL(This->instance,This->url,"_self"); break; case ID_PROPERTIES: PropDialog(This); break; case ID_ABOUT: AboutDialog(This); break; case ID_SHOWERROR: display_last_error(This); break; } }