SyntaxBomb - Indie Coders

Languages & Coding => Blitz Code Archives => File Utilities => Topic started by: BlitzBot on June 29, 2017, 00:28:38

Title: [bmx] Media file 'Nibbler' [bmax] by Beaker [ 1+ years ago ]
Post by: BlitzBot on June 29, 2017, 00:28:38
Title : Media file 'Nibbler' [bmax]
Author : Beaker
Posted : 1+ years ago

Description : Lets you give the user feedback about a file loading progress (thru progress-bar or other) by nibbling small chunks of the file (image, sound etc).  This should work well with both local and remote (HTTP) files. The parameters for local and remote files are slightly different: the Nibble Create method requires a URL/filename, and optionally one extra parameter for a local file, or two for remote file.  The second extra parameter for a remote file is so that you can guess/estimate the file size (not essential).

Code :
Code (blitzmax) Select
SuperStrict

Type Nibble
Field FileStream :TStream
Field Bank :TBank
Field BankStream :TBankStream
Field chunkSize :Int
Field ready :Int
Field estimatedFileSize :Int

Function Create:Nibble(file$,chunkSize:Int=20,estimatedFileSize:Int=4000)
Local nib:Nibble = New Nibble
nib.FileStream = OpenStream(file, True,False)
If nib.FileStream = Null Then Return Null
nib.chunksize = chunkSize
nib.estimatedFileSize = estimatedFileSize
Return nib
End Function

Method New()
Bank = CreateBank()
BankStream = CreateBankStream(Bank)
End Method

Method Delete()
CloseStream(BankStream)
CloseStream(FileStream)
Bank=Null
End Method

Method result:TBankStream()
SeekStream(BankStream, 0)
Return BankStream
End Method

Method Nibble:Float()
If Eof(FileStream) Return 1.0

Local nibbleSize:Int = StreamSize(FileStream)*(Float(chunkSize)/100.0)
If StreamPos(FileStream) = -1 Then nibbleSize = chunkSize
For Local f:Int = 0 To nibbleSize
If Eof(FileStream)
ready = True
Exit
EndIf
WriteByte BankStream,ReadByte(FileStream)
Next
If StreamPos(FileStream) = -1 Then
Return Float(BankSize(Bank) Mod estimatedFileSize) / Float(estimatedFileSize)
EndIf
Return Float(StreamPos(FileStream))/Float(StreamSize(FileStream))
End Method

Method Progress:Float()
Return Float(StreamPos(FileStream))/Float(StreamSize(FileStream))
End Method

Method Status:Int()
Return ready
End Method
End Type


Graphics 800,600,0

'Local mynibble:Nibble = Nibble.Create("zombie.jpg",5)
Local mynibble:Nibble = Nibble.Create("http::www.blitzbasic.com/img/brllogo-thin.png",50,4000)


Local progress:Float = 0
While mynibble.ready = False
Cls
DrawRect 50,50,progress*200.0,20
DrawText Int(progress*100.0),5,5
progress = mynibble.Nibble()
Flip
Wend

Global myImage:TImage = LoadImage(myNibble.result())

myNibble = Null

While Not KeyDown(KEY_ESCAPE)
DrawImage myImage, MouseX(), MouseY()
Flip
Cls
Wend
End


Comments :


amonite(Posted 1+ years ago)

 thanks for sharing :)


jtfrench(Posted 1+ years ago)

 does anyone know how well this performs with remote streams? That is using the default chunk size of say 20 and assuming the server you're reading from is reasonably responsive, does the call to nibble() halt execution noticeably?I'm considering using this to load an image file from an HTTP server while upwards of 10 animated sprites are moving around the screen. I wanted to check if anyone had experience with this and if this would be a suitable appication of Nibble.Thanks!