Streamed Loader

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

Silver_Knee

Betreff: Streamed Loader

BeitragDi, Jan 15, 2008 20:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo. Um den allgemeinen Beschwerden mal ein wenig Luft zu machen habe ich einen StreamedLoader Geschrieben. Natürlich habe ich mich ersteinmal mit dem einfachsen Format, der Bitmap, beschäftigt. Der Loader ist allerdings so geschrieben, dass er einfach erweitert werden kann. Im Moment unterstützt der Loader also nur .bmp/.dib files und (dank meiner Faulheit) nur welche, die von unten nach oben oder von oben nach unten aufgebaut werden. Ohne Komprimierung oder ähnliches. Die ganzen Ints die ich dabei "überlese" werden in den Debuglog geworfen.
Code: [AUSKLAPPEN]
vvvvv New Version vvvvv


Wer sich den code mal durchließt, sieht dass ich WritePixel anstatt WritePixelFast verwende habe. WritePixelFast lief bei meinem (ehemaligen) 100*100 FS-COM-Logo ohne Probleme. Doch die Grüne Idylle(die ich im Beispielcode auch genutzt habe) verursachte bei mir einen MAV sogar im Debugmodus. Ich hab also Buffer gelocked und WritePixel genommen. Ihr könnts ja mal bei euch mit WritePixelFast ausprobieren. Evtl Findet ihr eine Erklärung. Nun denn nur bmp nutzt relativ wenig. Ich probiere mich mal am PNG oder ihr könnt ja auch mal ein paar Formate Integrieren wenn ihr wollt, bzw das bmp Format etwas erweitern.

--

StreamedLoader v1.0 Stablished (hört sich an wie irgend so ne Linux abart)
Code: [AUSKLAPPEN]
vvvvv New Version vvvvv

Der testcode hampelt nun noch etwas mir dem Image rum damit man sieht dass es ein normales Image ist.... Ansonsten sind die Bilder größen nun Richtig und die Bildgrenzen werden eingehalten auch wenn mir immer noch nicht klar ist warum er bei 672 abgebrochen hat....ob der debugger das Ende (x wäre fälschlicherweise wirklich 800 geworden^^) kommen sah?

--

Nun denn. Ich habe nun die Versionsnummern unabhängig gemach sodass jeder der hier mitmachen will auch seine eigene Version hat. Das grundgerüst dass nun mit Banks und Konstanten arbeitet ist nun auf V2 wohingegen meine BMP-Lösung nun als v1.1 gilt. Also, siehe hier:
Code: [AUSKLAPPEN]
;Lizenz:
;Darf jeder frei kopieren, verändern und als Ganzes oder teilweise einbauen.
;Sollte man für andere Formate Wege finden, sie hier einzubauen, bitte ich, sie im Blitzforum-Codearchiv in folgendem Thread zu veröffentlichenn:
;http://www.blitzforum.de/forum/viewtopic.php?t=26812
;Ich werde immer wieder versuchen alle Versionen mit verschiedenen Formaten zu koppeln und so einen einhitliche Version zu erhalten.
;
;Grundgerüst(v2) & BMP(v1.1) von Silver_Knee(www.FS-COM.com).

;>>>>>FUNCTIONS
Const SMD_max_STREAMs=1;<<Anpassen. Gibt die Anzahl der maximal gleichzeitig verwendeten Streams an. Dient um den Speicher zu reservieren.
Dim SMD_BANK(0)
Const SMD_STREAM=0,SMD_IMAGE=4,SMD_STATUS=8;Die Format-Unabhängigen Adressen.

Const SMD_BMP_Y=12;<<Adresse beim BMP-FORMAT
Const SMD_BMP_BANKSIZE=16;<<Größe der Bank. Bei BMP-FORMAT fest.
Const SMD_BMP_STATUS1=1,SMD_BMP_STATUS2=2;<<Bei der Namenswahl war ich nun etwas faul...

Function InitStreams()
   Dim SMD_BANK(SMD_max_STREAMs-1)
   For count=0 To SMD_max_STREAMs-1
      SMD_BANK(count)=CreateBank(12)
   Next
End Function

Function UnInitStreams()
   For count=0 To SMD_max_STREAMs-1
      FreeBank SMD_BANK(count)
   Next
   Dim SMD_BANK(0)
End Function

Function StartImageStream(stream)
   For count=0 To SMD_max_STREAMs-1
      If PeekInt(SMD_BANK(count),SMD_STREAM)=0 Exit
   Next
   If count>SMD_max_STREAMs Return -1;-1=cache zu klein
   ResizeBank SMD_BANK(count),12
   PokeInt(SMD_BANK(count),SMD_STATUS,0)
   PokeInt(SMD_BANK(count),SMD_STREAM,stream)
End Function

Function StopImageStream(id)
   PokeInt(SMD_BANK(id),SMD_STREAM,0)
   Return PeekInt(SMD_BANK(id),SMD_IMAGE)
End Function

Function LoadImageStreamed(id)
   Select PeekInt(SMD_BANK(id),SMD_STATUS)
   Case 0;just loaded
      short=ReadShort(PeekInt(SMD_BANK(id),SMD_STREAM))
      Select short
      Case 19778
         DebugLog ReadInt(PeekInt(SMD_BANK(id),SMD_STREAM))
         DebugLog ReadInt(PeekInt(SMD_BANK(id),SMD_STREAM))
         DebugLog ReadInt(PeekInt(SMD_BANK(id),SMD_STREAM))
         DebugLog ReadInt(PeekInt(SMD_BANK(id),SMD_STREAM))
         tmp1=ReadInt(PeekInt(SMD_BANK(id),SMD_STREAM))
         tmp2=ReadInt(PeekInt(SMD_BANK(id),SMD_STREAM))
         PokeInt(SMD_BANK(id),SMD_IMAGE,CreateImage(tmp1,Abs(tmp2)))

         DebugLog PeekInt(SMD_BANK(id),SMD_STREAM)+" - Banksize"+BankSize(SMD_BANK(id))
         ResizeBank SMD_BANK(id),SMD_BMP_BANKSIZE
         If tmp2<0
            PokeInt(SMD_BANK(id),SMD_STATUS,SMD_BMP_STATUS2)
         Else
            PokeInt(SMD_BANK(id),SMD_STATUS,SMD_BMP_STATUS1)
            PokeInt(SMD_BANK(id),SMD_BMP_Y,tmp2-1)
         EndIf
         DebugLog PeekInt(SMD_BANK(id),SMD_STREAM)+" - Banksize"+BankSize(SMD_BANK(id))
         
         DebugLog ReadInt(PeekInt(SMD_BANK(id),SMD_STREAM))
         DebugLog ReadInt(PeekInt(SMD_BANK(id),SMD_STREAM))
         DebugLog ReadInt(PeekInt(SMD_BANK(id),SMD_STREAM))
         DebugLog ReadInt(PeekInt(SMD_BANK(id),SMD_STREAM))
         DebugLog ReadInt(PeekInt(SMD_BANK(id),SMD_STREAM))
         DebugLog ReadInt(PeekInt(SMD_BANK(id),SMD_STREAM))
         DebugLog ReadInt(PeekInt(SMD_BANK(id),SMD_STREAM))
         
      End Select
   Case SMD_BMP_STATUS1;bmp von unten nach oben (häufigste bmp)
      LockBuffer ImageBuffer(PeekInt(SMD_BANK(id),SMD_IMAGE))
      
      For count=1 To ImageWidth(PeekInt(SMD_BANK(id),SMD_IMAGE));zeilenweise in einem Frame geladen
         b=ReadByte(PeekInt(SMD_BANK(id),SMD_STREAM))
         g=ReadByte(PeekInt(SMD_BANK(id),SMD_STREAM))
         r=ReadByte(PeekInt(SMD_BANK(id),SMD_STREAM))
         WritePixelFast count-1,PeekInt(SMD_BANK(id),SMD_BMP_Y),r*$10000+g*$100+b,ImageBuffer(PeekInt(SMD_BANK(id),SMD_IMAGE))
      Next
      UnlockBuffer ImageBuffer(PeekInt(SMD_BANK(id),SMD_IMAGE))

         
      PokeInt(SMD_BANK(id),SMD_BMP_Y,PeekInt(SMD_BANK(id),SMD_BMP_Y)-1)
      If PeekInt(SMD_BANK(id),SMD_BMP_Y)<0
         PokeInt(SMD_BANK(id),SMD_STATUS,-1)
      EndIf
      Return Float(ImageHeight(PeekInt(SMD_BANK(id),SMD_IMAGE))-PeekInt(SMD_BANK(id),SMD_BMP_Y))/ImageHeight(PeekInt(SMD_BANK(id),SMD_IMAGE))*100
   Case SMD_BMP_STATUS2;bmp von oben nach unten. ungetestet.
      LockBuffer ImageBuffer(PeekInt(SMD_BANK(id),SMD_IMAGE))
      
      For count=1 To ImageWidth(PeekInt(SMD_BANK(id),SMD_IMAGE));zeilenweise in einem Frame geladen
         g=ReadByte(PeekInt(SMD_BANK(id),SMD_STREAM))
         r=ReadByte(PeekInt(SMD_BANK(id),SMD_STREAM))
         b=ReadByte(PeekInt(SMD_BANK(id),SMD_STREAM))
         WritePixelFast count-1,PeekInt(SMD_BANK(id),SMD_BMP_Y),$FF000000+r*$10000+g *$100+b,ImageBuffer(PeekInt(SMD_BANK(id),SMD_IMAGE))
      Next
      UnlockBuffer ImageBuffer(PeekInt(SMD_BANK(id),SMD_IMAGE))
      
      PokeInt(SMD_BANK(id),SMD_BMP_Y,PeekInt(SMD_BANK(id),SMD_BMP_Y)+1)
      If PeekInt(SMD_BANK(id),SMD_BMP_Y)>ImageHeight(PeekInt(SMD_BANK(id),SMD_IMAGE))
         PokeInt(SMD_BANK(id),SMD_STATUS,-1)
      EndIf
      Return Floor(Float(ImageHeight(PeekInt(SMD_BANK(id),SMD_IMAGE))-PeekInt(SMD_BANK(id),SMD_BMP_Y))/ImageHeight(PeekInt(SMD_BANK(id),SMD_IMAGE)))*100
   End Select
End Function

;<<<<<FUNCTIONS
;>>>>>TESTCODE

Graphics 800,600,0,2
SetBuffer BackBuffer()

WaitKey

stream=ReadFile("C:\WINDOWS\Web\Wallpaper\Grüne Idylle.bmp")

InitStreams()

id=StartImageStream(stream);Streamed-Loading Starten.
If id=-1 RuntimeError "zu wenig Speicher Vorreserviert"
Repeat
   pro=LoadImageStreamed(id)
   AppTitle pro+"%"   
   DrawImage PeekInt(SMD_BANK(id),SMD_IMAGE),0,0;PeekInt(SMD_BANK(id),SMD_IMAGE) kann man verwenden während die Image noch geladen wird.
Until PeekInt(SMD_BANK(id),SMD_STATUS)=-1;PeekInt(SMD_BANK(id),SMD_STATUS) wird auf -1 gesetzt wenn die Image fertig gelden wurde. Alternativ geht auch "pro=100"
image=StopImageStream(id);Hier wird der Cache Freigegeben und die ImageHandle zurück gegeben.

UnInitStreams()

MidHandle image
Repeat
   DrawImage image,MouseX(),MouseY()
   Flip
   Cls
Until KeyHit(1)
End

;<<<<<TESTCODE


Die bank ist wie folgt aufgebaut: 1Int für den Stream, 1Int für die Imagehandle, 1Int für den Status. mach nach Adam Riese 3*4=12 Bytes. Status kann folgende werte annehmen: -1=Fertig. 0=gerade gestartet(1. Frame) alle anderen Werte kann man für seine Formate definieren. "Fest" ist bis jetzt 1 und 2 für BMP. Baut am besten ne Konstante ein wie ich. nicht dass dann 2 die 3 haben wollen und denn muss man den halben code umschreiben.

Ansonsten habt ihr freie Wahl... Macht banks größer kleiner wie auch immer. nur behaltet halt die ersten 12 bytes im auge.

Bmp braucht zB noch eine Zusatzangabe: der Y-Wert. Er wird auch in der Bank gespeichert. dazu hab ich sie mal eben um 4 Bytes vergrößert...
  • Zuletzt bearbeitet von Silver_Knee am Do, Jan 17, 2008 15:35, insgesamt 4-mal bearbeitet
 

ChristianK

BeitragMi, Jan 16, 2008 15:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Nicht schlecht! Smile
Bei mir kommt aber auch ein MAV wenn ich WritePixelFast verwende, aber es ist ja auch mit WritePixel schnell genug, denke ich.

Zitat:
Ich probiere mich mal am PNG

Hehe, viel Glück. Du wirst es brauchen. Das hier ist die kleinstmögliche Implementierung von PNG -> http://members.gamedev.net/lode/projects/LodePNG/ Shocked
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT

Noobody

BeitragMi, Jan 16, 2008 17:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Man muss bei Writepixelfast einfach nur schauen, dass der X - Wert (bei diesem Bild) kleiner als 799 und der Y - Wert kleiner als 599 ist.
Ich hab das bei mir kurz ausprobiert und dann funktionierts auch mit WritePixelFast.
Das ganze ist wirklich sehr praktisch, aber wenn nur Bitmaps gehen, dann siehts düster aus für die Verwendung in späteren BB - Spielen Wink
Trotzdem *thumbs up*
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

Silver_Knee

BeitragMi, Jan 16, 2008 18:37
Antworten mit Zitat
Benutzer-Profile anzeigen
warte mal. du hast ne abfrage eingebaut und dann gings???? Ich hab mal den Debugger drüber laufen lassen und mir den X,Y-Arrays geben lassen:
Code: [AUSKLAPPEN]
672,599


Code: [AUSKLAPPEN]
zum Nachmachen vor die zeile mit Writepixel
DebugLog SMD_X(id)+","+SMD_Y(id)

schreiben und writepixelfast hin.

Noch etwas:
[quote=Wikipedia und andere Quelllen]24 bpp:
Die Daten jedes Pixels bestehen aus jeweils einem Byte für den Blau-, Grün- und Rot-Kanal (in dieser Reihenfolge!). [/quote]
aber:
Code: [AUSKLAPPEN]
g=ReadByte(SMD_STREAM(id))
r=ReadByte(SMD_STREAM(id))
b=ReadByte(SMD_STREAM(id))

Irgend etwas stinkt da. Das einschnuppern in PNG bei dieser seite verlief..... ernüchternd^^ ich mach deshalb erstmal eine Umdisponierung von den Arrays in einen Bank Array. Dadurch kann jedes Format seinen eigenen Speicher benutzen, denn mir fiel auf dass SMD_X im Laufe der entwicklung von StreamedImage völlig sinnlos wurde... PNG hingegen wird wahrscheinlich viel mehr Variablen Brauchen... eine Bank wird also her müssen.

@noobody
Ich schlage vor du tust etwas dafür dass es in späreren BB-Spielen verwendung findest und machst zB ne JPEG schnittstelle rein.... warte aber bis ich die Bank-version draußen hab dass du dir ne für umsonst Arbeit machst Wink

Noobody

BeitragMi, Jan 16, 2008 18:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, man darf nicht auf die Reihen Spalten rechts aussen bzw. unten zeichnen (bei dem Bild ist also Y = 599 das erste mal, dass der Error eintritt).
Daher muss da ne Abfrage hin, da man das Bild selbst nicht ein Pixel grösser machen sollte (ich habs getan und es wurde böse verzerrt Razz )
Ich les mich gerade in Grafikformate ein, aber es ist zu komplex, das mal so eben einzubauen.
Mal schauen.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

Silver_Knee

BeitragMi, Jan 16, 2008 19:21
Antworten mit Zitat
Benutzer-Profile anzeigen
moment
also
mein bild siehts so aus
Code: [AUSKLAPPEN]
ACDEO
FGTSO
DDRGO
TRDEO
OOOOO

Jeder Buchstabe soll ein pixel darstellen. Das bild fängt unten links an. Der error kommt bei x=672 und y=599. y=599 heißt diese wagerechte O-Reihe und 627ist irgendwo.... das ist kein besonderer wert villeicht das 2./3. O ... nichts.... der wert steht in keinem Zusammenhang mit 800, der Breite... ich kapiere nicht warum das nicht gehen soll -.- aber nun gut ich setzte mich an banks..... und ich weiß dass mal eben einbauen nich is^^ icch bin beim einlesen von PNG schon aufm stuhl umgekippt^^

EDIT BUGFIX
Der Code war an 3(!) Stellen Falsch. Die Fehler Haben sich so ausgeglichen das es einem So vorkam als würde er stimmen. Alle Fragen sind damit beantwortet: ich lese nun gbr Writepixelfast läuft und es gibt keine Bild-Verzerrung. Neuer Code im Ersten Post ... immernoch array based

EDIT
Nun denn da sind die Banks. Viel spaß beim rumbasteln ich mach mich vorerst an mein Giga Projekt zurück..... hmmmm ob das wirklich das kleinere übel ist..... äää ...*hust*

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group