Code: |
module GifLibrary @@loadlib=Win32API.new("Kernel32.dll","LoadLibrary",'p','') if FileTest.exist?("gif.dll") PngDll=@@loadlib.call("gif.dll") GifToPngFiles=Win32API.new("gif.dll","GifToPngFiles",'pp','l') GifToPngFilesInMemory=Win32API.new("gif.dll","GifToPngFilesInMemory",'plp','l') CopyDataString=Win32API.new("gif.dll","CopyDataString",'lpl','l') FreeDataString=Win32API.new("gif.dll","FreeDataString",'l','') else PngDll=nil end def self.getDataFromResult(result) datasize=CopyDataString.call(result,"",0) ret=nil if datasize!=0 data="0"*datasize CopyDataString.call(result,data,datasize) ret=data.unpack("V*") end FreeDataString.call(result) return ret end end class GifSprite # Creates a sprite from a GIF file with the specified # optional viewport. Can also load non-animated bitmaps. def initialize(file,viewport=nil) @gifbitmaps=[] @gifdelays=[] @totalframes=0 @framecount=0 @sprite=Sprite.new(viewport) bitmap=nil filestring=pbGetFileString(file) filestring=pbGetFileString(file+".gif") if !filestring filestring=pbGetFileString(file+".png") if !filestring filestring=pbGetFileString(file+".jpg") if !filestring filestring=pbGetFileString(file+".bmp") if !filestring if filestring && filestring[0]!=0x47 begin bitmap=BitmapCache.load_bitmap(file) rescue bitmap=nil end end if bitmap # Have a regular non-animated bitmap @totalframes=1 @framecount=0 @gifbitmaps=[bitmap] @gifdelays=[1] @sprite.bitmap=@gifbitmaps[0] else if filestring && GifLibrary::PngDll result=GifLibrary::GifToPngFilesInMemory.call(filestring,filestring.length,File.basename(file)) else result=0 end if result>0 @gifdelays=GifLibrary.getDataFromResult(result) @totalframes=@gifdelays.pop for i in 0... @gifdelays.length @gifdelays[i]=[@gifdelays[i],1].max bmfile=sprintf("%s%d.png",File.basename(file),i); if FileTest.exist?(bmfile) @gifbitmaps.push(Bitmap.new(bmfile)) File.delete(bmfile) else @gifbitmaps.push(Bitmap.new(1,1)) end @sprite.bitmap=@gifbitmaps[0] end end end end def bitmap @totalframes<=0 ? nil : @gifbitmaps[0] end def totalframes @totalframes end def currentframe @totalframes<=0 ? 0 : @framecount%@totalframes end def disposed? @sprite.disposed? end def viewport @sprite.viewport end def width @gifbitmaps.length==0 ? 0 : @gifbitmaps[0].width end def height @gifbitmaps.length==0 ? 0 : @gifbitmaps[0].height end # This function must be called in order to animate # the GIF image. def update @sprite.update if @gifbitmaps.length>0 @framecount+=2 frame=@totalframes<=0 ? 0 : @framecount%@totalframes frametoshow=0 for i in 0... @gifdelays.length frametoshow=i if @gifdelays[i]<=frame end @sprite.bitmap=@gifbitmaps[frametoshow] end end def dispose @sprite.dispose for i in @gifbitmaps i.dispose end end def flash(*arg); sprite.flash(*arg); end %w[ x y z ox oy visible zoom_x zoom_y angle mirror bush_depth opacity blend_type color tone ].each do |s| eval <<-__END__ def #{s}; @sprite.#{s}; end def #{s}=(value); @sprite.#{s}=value; end __END__ end end |