diff options
| author | scuri <scuri> | 2009-08-18 05:13:18 +0000 | 
|---|---|---|
| committer | scuri <scuri> | 2009-08-18 05:13:18 +0000 | 
| commit | 2b9539c1ff80299b076dae102fc430786a86bae9 (patch) | |
| tree | 749e9afb05b9087f68f7d9a9d764b14542cc65bf /html/examples | |
| parent | 77a4608ee1f828ed70ec58588f0229cd57758148 (diff) | |
*** empty log message ***
Diffstat (limited to 'html/examples')
| -rw-r--r-- | html/examples/animate_gif.wlua | 188 | 
1 files changed, 129 insertions, 59 deletions
| diff --git a/html/examples/animate_gif.wlua b/html/examples/animate_gif.wlua index de96d48..4334f37 100644 --- a/html/examples/animate_gif.wlua +++ b/html/examples/animate_gif.wlua @@ -1,90 +1,160 @@ +-- Based on a code from Stuart P. Bentley +  require"imlua"  require"cdlua"  require"cdluaim"  require"iuplua"  require"iupluacd" +require"iupluaimglib" -gimgs={} -gimgs.delays={} - -ggif=im.FileOpen(iup.GetFile("*.*")) +images={} +frame=1 -for i=1, select(3,ggif:GetInfo()) do -  gimgs[i]=ggif:LoadImage(i-1) -  err, gimgs[i] = im.ConvertColorSpaceNew(gimgs[i], im.RGB, true) -  local delay=gimgs[i]:GetAttribute "Delay" -  if delay then -    gimgs.delays[i]=delay[1]*10 +function print_error(err) +  local msg = {} +  msg[im.ERR_OPEN] = "Error Opening File." +  msg[im.ERR_MEM] = "Insuficient memory." +  msg[im.ERR_ACCESS] = "Error Accessing File." +  msg[im.ERR_DATA] = "Image type not Suported." +  msg[im.ERR_FORMAT] = "Invalid Format." +  msg[im.ERR_COMPRESS] = "Invalid or unsupported compression." +   +  if msg[err] then +    print(msg[err])    else -    gimgs.delays[i]=10 +    print("Unknown Error.")    end  end -ggif:Close() - -function gifanimator(gimgs, behavior, start, final, runyn, initial) - -  start=start or 1 -  final=final or #gimgs -  local increment=1 -  local frame=initial or start - -  --hack to get data to canvas action -  anii=frame -  return iup.timer{ -    time=gimgs.delays[frame], -    run=runyn or "YES", -    action_cb=function(self) -      self.run="NO" -      if frame==final then -        if behavior=="LOOP" then -          frame=start -        elseif behavior=="BOUNCE" then -          increment=-1 -          frame=frame+increment -        else -          return nil -        end -      elseif frame==start and behavior=="BOUNCE" then -        increment=1 -        frame=frame+increment +function load_frames(file_name) + +  ifile, err=im.FileOpen(file_name) +  if not ifile then +      print_error(err) +      return +  end + +  images={} +  images.delays={} +  images.disposal={} +  frame=1 + +  for i=1, select(3,ifile:GetInfo()) do +    images[i]=ifile:LoadBitmap(i-1) +    err, images[i] = im.ConvertColorSpaceNew(images[i], im.RGB, true) +    local delay=images[i]:GetAttribute("Delay") -- time to wait betweed frames in 1/100 of a second] +    if delay then +      images.delays[i]=delay[1]*10 -- timer in miliseconds +    else +      if (i == 1) then  +        images.delays[i]=100         else -        frame=frame+increment +        images.delays[i]=images.delays[i-1]        end -      self.time=gimgs.delays[frame] -      self.run="YES" - -      --for the canvas redrawing function -      anii=frame -      --redraw the canvas. yeah, it's a bit of a hack. -      cnv.action() -    end} +    end +    images.disposal[i]=images[i]:GetAttribute("Disposal", true) --  [UNDEF, LEAVE, RBACK, RPREV] +  end + +  ifile:Close() +   +  cnv.rastersize = images[1]:Width().."x"..images[1]:Height() +  dlg.size=nil +  iup.Refresh(cnv)  end -anit=gifanimator(gimgs,"LOOP")--,"BOUNCE",3,20) +t = iup.timer{} + +function start_timer() +  dlg.title = "Animated Gif" +  dlg.play_bt.image="IUP_MediaPause" dlg.play_bt.title="Pause" +  t.run = "NO" +  t.time = images.delays[frame] +  t.run = "YES" +  iup.Update(cnv) +end -cnv = iup.canvas{rastersize = gimgs[1]:Width().."x"..gimgs[1]:Height(), - border = "NO", - expand = "YES"} +function stop_timer() +  dlg.title = "Animated Gif "..frame.."/"..#images +  dlg.play_bt.image="IUP_MediaPlay" dlg.play_bt.title="Play"  +  t.run="NO" +  iup.Update(cnv) +end + +function set_frame(f) +  frame = f +  if frame > #images then +    frame = #images +  end +  if frame < 1 then +    frame = 1 +  end +  stop_timer() +end + +function t:action_cb() +  frame = frame + 1 +  if frame == #images+1 then +    frame = 1 +  end +   +  start_timer() +end +     +cnv = iup.canvas{border = "NO"}  function cnv:map_cb()-- the CD canvas can only be created when the IUP canvas is mapped -  cdanvas = cd.CreateCanvas(cd.IUP, self) +  canvas = cd.CreateCanvas(cd.IUP, self) +  canvas:Activate() +   +  start_timer()  end  function cnv:action()-- called everytime the IUP canvas needs to be repainted -  cdanvas:Activate() -  gimgs[anii]:cdCanvasPutImageRect(cdanvas, 0, 0, 0, 0, 0, 0, 0, 0) -- use default values +  canvas:Activate() +  if (images.disposal[frame] == "RBACK") then +    canvas:Clear() +  end +  images[frame]:cdCanvasPutImageRect(canvas, 0, 0, 0, 0, 0, 0, 0, 0) -- use default values  end -dlg = iup.dialog{cnv,title="Animated Gif Player"} +function cnv:resize_cb() +  canvas:Activate() +  canvas:Clear() +end + +function cnv:button_cb(but, pressed) +  if (but == iup.BUTTON1 and pressed==1) then +    local file_name, error = iup.GetFile("*.*") +    if error ~= 0 then +      return +    end +     +    load_frames(file_name)   +    canvas:Activate() +    canvas:Clear() +    start_timer() +  end +end + +buts = iup.hbox{ +  iup.button{title="First", image="IUP_MediaGotoBegin", action=function(self) set_frame(1) end},  +  iup.button{title="Previous", image="IUP_MediaRewind", action=function(self) set_frame(frame-1) end},  +  iup.button{title="Pause", image="IUP_MediaPause", action=function(self) if (t.run=="YES") then stop_timer() else start_timer() end end},  +  iup.button{title="Next", image="IUP_MediaForward", action=function(self) set_frame(frame+1) end},  +  iup.button{title="Last", image="IUP_MediaGoToEnd", action=function(self) set_frame(#images) end},  +  } +dlg = iup.dialog{iup.vbox{cnv, buts},title="Animated Gif", margin="5x5", gap=10} +dlg.play_bt = dlg[1][2][3]  function dlg:close_cb() -  iup.Destroy(anit) -  gimgs=nil --Destroys will be called by the garbage collector -  cdanvas:Kill() +  iup.Destroy(t) +  images=nil --Destroys will be called by the garbage collector +  canvas:Kill()    self:destroy()    return iup.IGNORE -- because we destroy the dialog  end +load_frames(iup.GetFile("*.*")) +  dlg:show()  iup.MainLoop() | 
