summaryrefslogtreecommitdiff
path: root/html/examples/animate_gif.wlua
diff options
context:
space:
mode:
Diffstat (limited to 'html/examples/animate_gif.wlua')
-rw-r--r--html/examples/animate_gif.wlua90
1 files changed, 90 insertions, 0 deletions
diff --git a/html/examples/animate_gif.wlua b/html/examples/animate_gif.wlua
new file mode 100644
index 0000000..de96d48
--- /dev/null
+++ b/html/examples/animate_gif.wlua
@@ -0,0 +1,90 @@
+require"imlua"
+require"cdlua"
+require"cdluaim"
+require"iuplua"
+require"iupluacd"
+
+gimgs={}
+gimgs.delays={}
+
+ggif=im.FileOpen(iup.GetFile("*.*"))
+
+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
+ else
+ gimgs.delays[i]=10
+ 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
+ else
+ frame=frame+increment
+ 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
+
+anit=gifanimator(gimgs,"LOOP")--,"BOUNCE",3,20)
+
+cnv = iup.canvas{rastersize = gimgs[1]:Width().."x"..gimgs[1]:Height(),
+ border = "NO",
+ expand = "YES"}
+
+function cnv:map_cb()-- the CD canvas can only be created when the IUP canvas is mapped
+ cdanvas = cd.CreateCanvas(cd.IUP, self)
+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
+end
+
+dlg = iup.dialog{cnv,title="Animated Gif Player"}
+
+function dlg:close_cb()
+ iup.Destroy(anit)
+ gimgs=nil --Destroys will be called by the garbage collector
+ cdanvas:Kill()
+ self:destroy()
+ return iup.IGNORE -- because we destroy the dialog
+end
+
+dlg:show()
+iup.MainLoop()