diff options
-rw-r--r-- | html/en/history.html | 3 | ||||
-rw-r--r-- | html/examples/animate_gif.wlua | 188 | ||||
-rw-r--r-- | src/im_convertcolor.cpp | 6 |
3 files changed, 137 insertions, 60 deletions
diff --git a/html/en/history.html b/html/en/history.html index 528f656..7d48c83 100644 --- a/html/en/history.html +++ b/html/en/history.html @@ -16,6 +16,9 @@ <ul> <li><span style="color: #0000FF">New:</span> function <strong> imImageGetOpenGLData</strong>.</li> + <li><span style="color: #0000FF">New:</span> functions <strong> + im.ConvertDataTypeNew</strong>, <strong>im.ConvertColorSpaceNew</strong> + and <strong>im.ConvertToBitmapNew</strong> in Lua.</li> <li><span style="color: #008000">Changed:</span> libPNG updated to version 1.2.37. Removed changes to the library that made it incompatible with other libPNG distributions.</li> 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() diff --git a/src/im_convertcolor.cpp b/src/im_convertcolor.cpp index 8e96ccc..e68730f 100644 --- a/src/im_convertcolor.cpp +++ b/src/im_convertcolor.cpp @@ -2,7 +2,7 @@ * \brief Image Conversion * * See Copyright Notice in im_lib.h - * $Id: im_convertcolor.cpp,v 1.2 2009/08/18 02:23:33 scuri Exp $ + * $Id: im_convertcolor.cpp,v 1.3 2009/08/18 05:13:18 scuri Exp $ */ #include "im.h" @@ -963,6 +963,8 @@ int imConvertColorSpace(const imImage* src_image, imImage* dst_image) imbyte* transp_color = (imbyte*)imImageGetAttribute(src_image, "TransparencyColor", NULL, NULL); if (transp_color) iConvertSetTranspColor((imbyte**)dst_image->data, dst_image->count, *(transp_color+0), *(transp_color+1), *(transp_color+2)); + else + memset(dst_image->data[3], 255, dst_image->count); } else { @@ -973,6 +975,8 @@ int imConvertColorSpace(const imImage* src_image, imImage* dst_image) iConvertSetTranspMap((imbyte*)src_image->data[0], (imbyte*)dst_image->data[3], dst_image->count, transp_map, transp_count); else if (transp_index) iConvertSetTranspIndex((imbyte*)src_image->data[0], (imbyte*)dst_image->data[3], dst_image->count, *transp_index); + else + memset(dst_image->data[3], 255, dst_image->count); } } |