Moin Leute, gute Nachrichten. Die DLL ist jetzt im Code und wird wenn sie nicht vorhanden ist, einfach geschrieben. Zusätzlich noch eine mini Optimierung vorgenommen.
Ich hab jetzt mal mit VC++ kompiliert und schon hatte ich nurnoch 100 KB und mit UPX gepackt sind es jetzt nurnoch 60 KB Also von 420 auf 60 runter, das ist doch was
Jetzt könnt ihr euch von den Platzängsten befreien und sorgenlos Tests durchführen
Beiträge von TheShadowAE
-
-
Alles Gute zum Geburtstag
autoit.de/wcf/attachment/18892/EDIT: Oh.. Irgendwo hat das Bild einen Schaden gekriegt, das sah mal besser aus
EDIT: Wieder halbwegs repariert.. -
Ich würde ja gerne am Ende das Ergebnis erfahren Ansonsten ist es mal eine nette Idee, schön umgesetzt.
Schön zu sehen wie viel Unterschied Triple-Buffering in der Geschindigkeit machen kannAls Tipp für die weitere Programmierung:
Schau dir doch mal dringend Arrays an, ich glaube die hätten hier sehr geholfen -
Noch als Zusatz:
int array[10]; Wird als lokale Variable im Stack gespeichert.
Aber man kann auch dynamische Größen benutzen und diese zurückgeben. Dazu wird mit new Speicher im Heap alloziiert
int size=10;
int *array=new int[size];
Dann hat man die Größe selber.
std:vector ist zusätzlich noch dynamisch, man kann also noch ein Arrayelement hinzufügen, ohne das gesamte Array übertragen zu müssen (soweit ich weiß, bin mir nicht 100% sicher)EDIT:
Das ist jetzt schon fast ein richtig guter "Tutorial"-Thread fürs gute Verständnis von Datentypen geworden hier -
Die Arraygröße wird bei Java gespeichert, bei C++ speichert sie der Compiler und gibt ggf. eine Fehlermeldung. Zu Laufzeit wird aber nicht mehr die Größe gespeichert. Da sind alle Daten direkt hintereinander. ein Array ist eigentlich ein Pointer auf den Anfang der Daten (bei C++ und Assembler).
@night. HANDLE ist kein wirklicher Datentyp. Zugegeben, er hilft wieder Fehler zu vermeiden etc. aber den zu Grunde liegeden Datentyp DWORD erkennt man im Code (#define HANDLE DWORD o.ä. wird es geben)
EDIT: / PS:
Deswegen kannst du in C++ auch eine als Pointer deklarierte Variable mit arr[x] ansprechen (als Array) und ein Array-Element als Pointer benutzen (*arr). -
Nein, deswegen kannst du in Programmen wie CheatEngine o.ä. die Speicher durchsuchen auch immer auswählen, welcher Datentyp der gesuchte Wert denn haben soll
-
@night:
Der Assemblercode sagt dir im genausten welcher Datentyp das ist. Vom Pointer kannst du es nur nich ableiten.
Wenn 8 Byte mit fild geladen werden ist es ein 64-bittiger Int, bei 4 Byte fld ist es ein Float. bei mov eax,[0xabcdef] mov eax,[eax] weißt du, dass es ein Pointer war -
Die Datentypen gibt es nur, um Fehler zu vermeiden. Wenn du dich mit Assembler vertraut machst wirst du sehen, dass du im RAM nicht gerignsten erkennen kannst welchen Datentyp etwas hat oder ob es evtl. sogar ein ausführbarer Code ist.
Wenn du aber mit C++ etwas schreibst und kompilierst, dann wird das auch wieder zu einer Masse.
Damit es einfacher ist absturzfrei und fehlerfrei zu programmieren, wurden Datentypen eingeführt. Du kannst im CPU nicht einfach versuchen einen Float + 2 zu rechnen. Da würde ominöse Werte rauskommen. Ebenso gibt es Variablen mit 64 bit oder eben weniger, da können bei Verwechslungen auch komische Werte or bei Pech sogar Abstürze folgen. Damit zu Floats nur mit Floats verrechnest usw. werden Datentypen benutzt.
Autoit macht das dann einfach für Anfänger und lässt sogar offen ob Zahlen oder Strings gespeichert werden. Dem liegt ein komplexerer Handler zu Grunde, der automatisch die richtigen Funktionen nimmt. Im inneren wird aber immernoch mit Datentypen gehandelt.Als Beweis du kannst in C++ eine float zahl=3; deklarieren und mit float *ptr=&zahl; die Adresse des Floats im ptr speichern. Versuch doch mal int x=*((int*)ptr); danach auszuführen und gib x aus. Es wird nicht 3 sein.
-
Ist nun gefixt, dein Skript funktioniert mit der neuen Version Andy. Wenn ich die DLL als Binary in den Source packen will, laggt Scite aufs Übelste Das wird nichts mit der MemoryDLL Man kann es ja auch mit FileInstall ermöglichen, dann ist zumindest die EXE unabhängig.
-
Hmm, wenn du vor dem GUIdelete ein $struct=0 machst, dann funktioniert alles. Anscheinend mag Autoit nicht, wenn jemand den benutzten Speicher löschen will
Nach dem DLL-Binary guck ich mal, hab ich auch schon irgendwo gesehen.EDIT: Das war wohl nur beim ersten mal so.. Mist
EDIT: Das Beschreiben der Bitmapdaten dauert zu lange.. Beim GUI schließen ist das Bild weg und schon gibts ein Memoryerror.. Ich versuche das mal zu fixen.
-
Hi,
in der letzten Zeit hab ich an einem Projekt gearbeitet, das das ganze _createNewBmp32 Zeug ersetzen (vereinfachen) soll. Man kann mit 5 Zeilen eine GUI erstellen und den ASM Code aufrufe, der die GUI füllt und es anzeigen. Zusätzlich soll es auch ein Stück weit bei Spielen helfen. Es gibt Funktionen zum Bilder laden, speichern und einfache Mausabfragen für Clientkoordinaten.
Der ein oder andere hat mich sicher in der SB verzweifeln sehenGGEngine sollte ursprünglich GameGraphicsEngine heißen, es passt aber eigentlich eher GUI-Graphics oder ASM-Graphics-Engine
Das ganze hab ich in eine DLL verpackt und gleich noch eine Doku und ne UDF für geschrieben. Jetzt kann ich mit jeder Programmiersprachen ganz einfach einen Mustergenerator machen Und weil es so schön war, gibts eine Mustergeneratorversion als Beispiel dazu
CreateNewBMP32 ist jetzt in der Funktion IMGcreate drin. Ich hab es gehasst immer in meinen Dateien zu suchen, woher ich die kopieren kann
Die Doku ist in der Doku.txt (in der zip)
Hier 2 Beispiele (auch in der zip):Mustergenerator
[autoit]#include <GGEngine.au3>
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
#include <assembleit.au3>$w=500
[/autoit] [autoit][/autoit] [autoit]
$h=500
$bildwert=0.01_GGinit()
[/autoit] [autoit][/autoit] [autoit]
$gui=_GGGUIcreate("GGE ASM Test",$w,$h)
$ptr=_GGGUIgetIMGptr($gui)_assembleit("float","_ASM","int",$w,"int",$h,"ptr",$ptr,"float",$bildwert)
[/autoit] [autoit][/autoit] [autoit]
_GGGUIupdate($gui)While Not _GGGUIclosed($gui)
[/autoit] [autoit][/autoit] [autoit]
Sleep(10)
WEnd_GGGUIdelete($gui)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
_GGfree();Mein alter ASM-Code aus dem Mustergenerator (1:1)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Func _ASM()
_("use32")
_("org " & FasmGetBasePtr($Fasm))
_("finit") ;Co Prozessor starten
;
_("mov eax,[esp+4]") ;
_("mov [w],eax") ;w
_("mov eax,[esp+8]") ;
_("mov [h],eax") ;h
;startadresse in ebx, dann muss ebx immer nur um 4 erhöht werden, um das nächste pixel zu schreiben
_("mov ebx,[esp+12]") ;scan0
_("mov eax,[w]") ;an das ende setzen, weil die schleifen auch von hinten anfangen
_("imul eax,[h]") ;w*h
_("imul eax,4") ;je pixel 4 bytes: w*h*4
_("add ebx,eax") ;scan0 += size
_("sub ebx,4")
_("mov eax,[esp+16]") ;start / bildwert
_("mov [start],eax") ;;register im coprostack belegen,
[/autoit] [autoit][/autoit] [autoit]_("fld [start]") ;st0=start
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
_("mov edx,[h]") ;Schleifenzähler edx für y, For $edx=$h to 0 Step -1
_("for_y:") ;Schleifenlabel_("mov ecx,[w]") ;Schleifenzähler ecx für x
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
_("for_x:") ;Schleifenlabel
;Berechung
;st0=start
_("mov [ftemp],edx") ;st0=start
_("fild [ftemp]") ;st0=y st1=start
_("fmul st0,st1") ;st0=y*start st1=start
_("fptan") ;st0=1 st1=tangens !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!, (tan, in ASM umgekehrt, bgra)
_("fstp st0") ;stack sauber machen
_("mov [ftemp],ecx") ;
_("fild [ftemp]") ;st0=x st1=sin(y*start) st2=start
_("fmulp") ;st0=x*sin(y*start) st1=start
_("fistp dword[r]") ;st0=start ACHTUNG, entweder stack immer komplett leermachen oder einfach die werte weiterbenutzen!!
;ansonsten läuft der stack über...stackoverflow_("mov [ftemp],edx") ;das ganze mit g und cos
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
_("fild [ftemp]") ;st0=y st1=start
_("fmul st0,st1") ;st0=y*start st1=start
_("fcos") ;
_("mov [ftemp],ecx") ;
_("fild [ftemp]") ;st0=x st1=y*start st2=start
_("fmulp") ;st1=x*(y*start) st1=start
_("fistp dword[g]") ;st0=start_("mov [ftemp],edx") ;und b und tan
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
_("fild [ftemp]") ;
_("fmul st0,st1") ;
_("fsin") ;st0=sin(y*start) st1=start
_("mov [ftemp],ecx") ;st0=tangens
_("fild [ftemp]") ;
_("fmulp") ;
_("fistp dword[b]") ;st0=start, stack muss gecleant werden in der schleife!_("mov byte[code=c],255") ;alpha auf 255 setzen
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
_("mov eax,dword[r]") ;die 4 aufeinanderfolgenden bytes holen
_("mov DWORD[ebx],eax") ;color in [ebx] (bild) schreiben
_("sub ebx,4") ;ein pixel weiter bzw. zurück_("dec ecx") ;Zähler dekrementieren
[/autoit] [autoit][/autoit] [autoit]
_("jnz for_x") ;Wenn Zähler <> 0 dann wiederhole Schleife
_("dec edx") ;Zähler dekrementieren
_("jnz for_y") ;Wenn Zähler <> 0 dann wiederhole Schleife_("fstp st0") ;stack sauber machen
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
_("fld [start]") ;Rückgabewert=Start / Bildwert
_("ret") ;Ende, Rückgabewert ist der letzte Wert des ERSTEN! Pixels (Scheife geht Rückwärts)_("r db 0") ;
[/autoit] [autoit][/autoit] [autoit]
_("g db 0") ;
_("b db 0") ;
_("c dd 0") ;dummy, platz zum schreiben von dword nach [b]
_("ftemp dd 0.0") ;zum schreiben von edx/ecx auf floating stack_("start dd 0.0") ;für berechnung
[/autoit]
_("w dd 0") ;Speicher für Parameter reservieren
_("h dd 0") ;
EndFuncBSP mit fast allen Funktionen
[autoit]#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
[/autoit] [autoit][/autoit] [autoit]
#AutoIt3Wrapper_Res_requestedExecutionLevel=asInvoker
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <ScreenCapture.au3>
#include <GGEngine.au3>_GGinit()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$gui=_GGGUIcreate("Test",500,500)
$hwnd=_GGGUIgetHWND($gui)
$img=DllStructCreate("dword["&(500*500)&"]",_GGGUIgetIMGptr($gui))WinSetTitle($hwnd,"","Test - Neu")
[/autoit] [autoit][/autoit] [autoit]Local $screenbmp=_ScreenCapture_Capture("",0,0,249,249,True)
[/autoit] [autoit][/autoit] [autoit]
$screenimg=_GGIMGcreatefromBMP($screenbmp,250,250)
_WinAPI_DeleteObject($screenbmp)
$screenbmp=_GGIMGgetDC($screenimg)
_GGGUIdrawDC($gui,$screenbmp,0,0,250,250)
_GGIMGsave($screenimg,"screen.raw")For $y=0 To 249
[/autoit] [autoit][/autoit] [autoit]
For $x=250 To 500
DllStructSetData($img,1,0xFF00FF00,$y*500+$x)
Next
Next$buffer=_GGIMGcreate(250,250)
[/autoit] [autoit][/autoit] [autoit]
$bufptr=DllStructCreate("dword["&(250*250)&"]",_GGIMGgetPTR($buffer))
For $y=0 To 250
For $x=0 To 250
DllStructSetData($bufptr,1,0x7F00FF00,$y*250+$x)
Next
Next
_GGIMGdraw($screenimg,$buffer,0,0)
_GGGUIdraw($gui,$screenimg,0,250)
_GGIMGdelete($buffer)
_GGIMGdelete($screenimg)_GGGUIupdate($gui)
[/autoit] [autoit][/autoit] [autoit]_GGGUIsavescreen($gui,"test.raw")
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]$loaded=_GGIMGcreatefromRAW("screen.raw")
[/autoit] [autoit][/autoit] [autoit]Local $mx=0,$my=0,$me=0
[/autoit] [autoit][/autoit] [autoit]
While True
If _GGGUIclosed($gui) Then ExitLoop
If _GGIsPressed(0x1B) And WinActive($hwnd) Then ExitLoop
$me=_GGGUIgetMouseEvent($gui,$mx,$my)
If $me=$GGDOWN And $mx>250 And $mx<500 And $my>250 And $my<500 Then ;DOWN
_GGGUIdraw($gui,$loaded,250,250)
_GGGUIupdate($gui)
ElseIf $me=$GGUP And $mx>250 And $mx<500 And $my>250 And $my<500 Then ;UP
For $y=250 To 500
For $x=250 To 500
DllStructSetData($img,1,0xFF000000,$y*500+$x)
Next
Next
_GGGUIupdate($gui)
EndIf
Sleep(10)
WEnd_GGIMGdelete($loaded)
[/autoit] [autoit][/autoit] [autoit]_GGGUIdelete($gui)
[/autoit]
_GGfree()
Exit 0Beispiel mit GDI+ (only Autoit UDF) und neuen Funktionen.
Spoiler anzeigen
[autoit]#include <GGEngine.au3>
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]_GGinit()
[/autoit] [autoit][/autoit] [autoit]$img=_GGIMGcreatefromFILE("Farben.jpg")
[/autoit] [autoit][/autoit] [autoit]
$w=_GGIMGgetW($img)
$h=_GGIMGgetH($img)
_GGIMGsavetoFILE($img,"Farben.png")$gui=_GGGUIcreate("GGE GDI+ Image viewer",$w,$h)
[/autoit] [autoit][/autoit] [autoit]_GGGUIdraw($gui,$img,0,0)
[/autoit] [autoit][/autoit] [autoit]
_GGIMGdelete($img)
_GGGUIupdate($gui)While Not _GGGUIclosed($gui)
[/autoit] [autoit][/autoit] [autoit]
Sleep(10)
WEnd_GGGUIdelete($gui)
[/autoit]
_GGfree()Ich hatte keine Lust sämtliche Bildformate zu lernen zu entpacken und dann zu verwenden. Daher hab ich das einfachstmöglichste Format der Welt namens RAW erschaffen und gleich einen Converter dazu in die zip gepackt (mit AU3 Code)
Das UDF-include GGEngine.au3 und die DLL sind natürlich auch mit der zip
Mustergenerator-Beispiel Screenshot:
autoit.de/wcf/attachment/18632/Ich hoffe es gefällt und hilft euch. Ich freu mich auf euer Feedback.
Viel Spaß
mfg
TheShadowAEEDIT:
Ganz vergessen Andy zu danken, er hat mir mal wieder geholfen ein Problem zu lösenEDIT: UPDATE:
Ich hab Andys genannten Fehler mal gefixt. Und hab mal für die, die es noch nicht haben, die assembleit angehangen.UPDATE:
Ich habs geschafft, die DLL ist jetzt im include enthalten. Dh. man braucht nur die au3 und schon läuft alles Zusätzlich hab ich noch eine kleine Korrektur gemacht, wodurch beim Klicken ca. 100 Ticks weniger verbraucht werdenUPDATE:
Jetzt kann man jede Bildformate öffnen und speichern mit den neuen Funktionen (3. Beispiel) und Width und Height abfragen. -
Hier ist mal mein Fehler-screen von der Device-64:
autoit.de/wcf/attachment/18612/ -
Versuche es doch mal mit einer DllMain, die einfach TRUE zurückgibt. Bei LoadLibrary wird soweit ich weiß die DLLMain aufgerufen.
Vielleicht wird die DLL dadurch nicht richtig geladen
-
Bei mir kam das AE von einem sehr dähmlichen Clan (noch dähmlich als fast alle Clans, und dass ich überhaupt in einem so dähmlichen Clan war, macht mich auch dähmlich ^^), der nannte AE (soweit ich mich erinnern kann "Albanian Eagle", keine Ahnung woher das kommt.
Dann brauchte ich noch einen Nick, da hab ich mir irgendnen Randomshit ausgedacht und nach Englisch portiert. Damit es besser klingt noch ein The davor gepackt und fertig war mein Nick, der leider ziemlich oft überall vorkommt -
Ich habs auch bei denen gesehen
-
Hier hab ich dir mal etwas geschrieben:
Spoiler anzeigen
[autoit]#include <Array.au3>
[/autoit] [autoit][/autoit] [autoit]$str=" ' "&'"'&" ' as "
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$str=_Adv_StripWS($str)
$str=StringReplace($str," ","L")
MsgBox(0,"",$str)Func _Adv_StripWS($str)
[/autoit]
Local $chars=StringSplit($str,""),$x=1
Local $anf=""
While True
If $x>$chars[0] Then ExitLoop
If ($chars[$x]='"' Or $chars[$x]="'") And $chars[$x-1]<>"\" Then
If $chars[$x]=$anf Then
$anf=""
ElseIf $anf="" Then
$anf=$chars[$x]
EndIf
EndIf
If ($chars[$x]=" " Or $chars[$x]=@CR Or $chars[$x]=@LF) And $anf="" Then
$chars[0]-=1
_ArrayDelete($chars,$x)
$x-=1
EndIf
$x+=1
WEnd
$str=""
For $x=1 To $chars[0]
$str&=$chars[$x]
Next
Return $str
EndFunc -
Hallo liebe Freunde,
ich stell euch mal meinen Stream-Visualizer vor. Den Autoit Teil hab ich schon vor einiger Zeit, der ist nur da, um Musikdaten zu kriegen und das Bild anzuzeigen, nichts großes. Ich hoffe es stört nicht, dass der Autoitteil recht unordentlich ist. (Tut mir Leid :P)
Der Visualizer zeigt je nach Intensitätslevel die Farben von Blau über Grün nach Rot an. Die Farben laufen je nach Tieftonstärke schneller oder langsamer nach oben. Man kann recht gut erkennen, wie Intensiv und Bassstark die Musik ist.
Man könnte höchstens noch probieren ein bisschen Blur mitreinzubringen, aber ansonsten finde ich das Ganze schon ganz nett. (Wie schön das aussieht, könnt ihr selebr entscheiden.Das Bild wird komplett vom ASM-Teil berechnet. Ich habe diesmal möglichst viel optimiert, obwohl es recht einfacher Code ist und sowieso nicht allzu lange braucht Unter anderem wird Caching verwendet. der DLLCall mit der ASM-Funktion braucht bei mir 0.3 bis 0.5 ms.
Ich hoffe es gefällt euch und natürlich hoffe ich, dass Andy nichts großes mehr zum Optimieren findet
Da es mir mehr um den ASM-Code und ums visualizen geht, muss die Stream-URL und Streamvolume (Lautstärke) von Hand in der stream.txt einstellen. Voreingestellt hab ich HouseTime.FM mit vol=15
Ich habe den ASM Code ordentlich und mit vielen (englischen) Kommentaren versehen und geschrieben. Ich hoffe der Code ist verständlich und hilft ASM-Lernern ein bissen weiter
Datei im Anhang!
Viel Spaß, mfg
CreativeName
ehemals TheShadowAEEDIT:
Für die, die den Sourcecode schon hier sehen wollen:Spoiler anzeigen
[autoit]#NoTrayIcon
[/autoit] [autoit][/autoit] [autoit]
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=Visualizer.ico
#AutoIt3Wrapper_Res_requestedExecutionLevel=asInvoker
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include "Bass.au3"
#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <FASM.au3>;Author: TheShadowAE (new nick: CreativeName)
[/autoit] [autoit][/autoit] [autoit]Opt("GUIOnEventMode",1)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Local $txt="",$bmp=0,$hbmp=0,$gra=0,$backgra=0,$fasm=0,$stream=0 ;else may be error in _exit with error-exit$vol=Int(IniRead("stream.txt","Stream","Volume",100))
[/autoit] [autoit][/autoit] [autoit]
$URL=IniRead("stream.txt","Stream","URL","")
If $cmdline[0]>0 Then $URL=$cmdline[1]
If $URL="" Then $URL="http://listen.housetime.fm/tunein-mp3-pls" ;HouseTime.FM als Standard
If $cmdline[0]>1 Then $vol=Int($cmdline[2])
If $vol<=0 Then $vol=1
If $vol>100 Then $vol=100$w=800 ;must be dividable by 16
[/autoit] [autoit][/autoit] [autoit]
$h=600 ;at least 10
$Form1 = GUICreate("Visualizer by CreativeName", $w, $h)
GUISetOnEvent($GUI_EVENT_CLOSE,"_exit")$user32=DllOpen("user32.dll")
[/autoit] [autoit][/autoit] [autoit]_BASS_Startup(@ScriptDir & "\bass" & _Iif(@OSVersion = "X64", 64, "") & ".dll")
[/autoit] [autoit][/autoit] [autoit]
If @error Then _exit("Could start bass.dll")
_BASS_Init(0, -1, 44100, 0, "")
If @error Then _exit("Could initialize bass.dll")$stream = _BASS_StreamCreateURL($URL, 0, 0)
[/autoit] [autoit][/autoit] [autoit]
If @error Then
$stream = _BASS_StreamCreateURL($URL, 0, 0)
If @error Then _exit("Could not connect to stream")
EndIf
_BASS_ChannelSetVolume($stream,$vol)
If @error Then MsgBox(0,"Oops","Failed to set volume")
IniWrite("stream.txt","Stream","URL",$URL)
IniWrite("stream.txt","Stream","Volume",$vol)
_BASS_ChannelPlay($stream, 0)$fftstruct = DllStructCreate('float[128]')
[/autoit] [autoit][/autoit] [autoit]
$fasm=0
$code=""
$codestruct=_init($code)_GDIPlus_Startup()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$gra=_GDIPlus_GraphicsCreateFromHWND($Form1)
$hbmp=_GDIPlus_BitmapCreateFromGraphics($w,$h,$gra)
$backgra=_GDIPlus_ImageGetGraphicsContext($hbmp)
_GDIPlus_GraphicsClear($backgra)
$bmp=_GDIPlus_BitmapCreateFromGraphics($w,$h,$backgra)GUISetState(@SW_SHOW)
[/autoit] [autoit][/autoit] [autoit]While 1
[/autoit] [autoit][/autoit] [autoit]
_BASS_ChannelGetData($stream, DllStructGetPtr($fftstruct), $BASS_DATA_FFT256)
;~ _GDIPlus_GraphicsClear($backgra) ;;;;;;;
$lock=_GDIPlus_BitmapLockBits($bmp,0,0,$w,$h,$GDIP_ILMWRITE+$GDIP_ILMREAD,$GDIP_PXF32ARGB)
If @error Then _exit("could not lock $bmp bytes")
$ptr=DllStructGetData($lock,"Scan0")
_Visualize($ptr,$w,$h,$fftstruct)
_GDIPlus_BitmapUnlockBits($bmp,$lock)
_GDIPlus_GraphicsDrawImageRect($backgra,$bmp,0,0,$w,$h)
;menü?
_GDIPlus_GraphicsDrawImageRect($gra,$hbmp,0,0,$w,$h)
Sleep(10)
WEnd_exit() ;not used
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Func __process($ptr,$wh,$level,$speed)
[/autoit] [autoit][/autoit] [autoit]
Local $ret=DllCall($user32, "int", "CallWindowProcW", "ptr", $code,"ptr", $ptr,"int",$wh, "int", $level,"int",$speed)
If $ret[0]<>0 Then _exit("The ASM code returned this Errorcode: "&$ret[0])
EndFuncFunc _init(ByRef $code)
[/autoit] [autoit][/autoit] [autoit]
$fasm=FasmInit()
;Author: TheShadowAE (new nick: CreativeName)
FasmReset($fasm)
FasmAdd($fasm,"use32")
FasmAdd($fasm,"org "&FasmGetBasePtr($fasm));CPUID check for SSE4.1 (needed for movntdqa)
[/autoit] [autoit][/autoit] [autoit]
;//movntdqa is not needed. montdq is the only working instruction
;~ FasmAdd($fasm,"mov eax,1")
;~ FasmAdd($fasm,"cpuid")
;~ FasmAdd($fasm,"test ecx,10000000000000000000b")
;~ FasmAdd($fasm,"jnz @f")
;~ FasmAdd($fasm,"mov eax,123456");give special error return!
;~ FasmAdd($fasm,"ret") ;return with error code 123456
;~ FasmAdd($fasm,"@@:") ;you have SSE4.1;parameters
[/autoit] [autoit][/autoit] [autoit]
FasmAdd($fasm,"mov edi,[esp+4]") ;image ptr
FasmAdd($fasm,"mov edx,[esp+8]") ;WWWWHHHH
FasmAdd($fasm,"mov ebx,[esp+12]") ;level
FasmAdd($fasm,"mov ecx,[esp+16]") ;speed
FasmAdd($fasm,"mov esi,edi") ;;cache image data for faster process
[/autoit] [autoit][/autoit] [autoit]
FasmAdd($fasm,"prefetchnta [esi]") ;assuming (older) CPUs only cache 32 byte
FasmAdd($fasm,"prefetchnta [esi+32]")
FasmAdd($fasm,"prefetchnta [esi+64]")
FasmAdd($fasm,"prefetchnta [esi+96]");set up image pointers
[/autoit] [autoit][/autoit] [autoit]
FasmAdd($fasm,"push ebx") ;store level
FasmAdd($fasm,"movzx ebx,dx") ;ebx=height
FasmAdd($fasm,"shr edx,16") ;WH->0W ;not ror, height isnt needed anymore
FasmAdd($fasm,"movzx eax,dx") ;eax=width
FasmAdd($fasm,"shl eax,2") ;*4 bytes/pixel
FasmAdd($fasm,"push eax") ;store stride
FasmAdd($fasm,"imul eax,ecx") ;*speed
FasmAdd($fasm,"add esi,eax") ; source+=speed*stride;calculate end of image
[/autoit] [autoit][/autoit] [autoit]
FasmAdd($fasm,"mov eax,[esp]") ;eax=stride
FasmAdd($fasm,"imul ebx,eax") ;ebx=stride*height=bytes used by image
FasmAdd($fasm,"add ebx,edi") ;ebx+=start adress (image pointer), ebx=ptr to byte after image (end);calculate needed loopx cycles
[/autoit] [autoit][/autoit] [autoit]
FasmAdd($fasm,"pop edx") ;restore stride to edx
FasmAdd($fasm,"shr edx,6") ;stride/64 (64 bytes per cycle processed), edx=loopx cycles;scroll/copy downer pixel-lines speed times, in pixels, upside
[/autoit] [autoit][/autoit] [autoit]
FasmAdd($fasm,"pop eax") ; restore level to eax
FasmAdd($fasm,".loopy:") ;FasmAdd($fasm,"mov ecx,edx") ;copy loopx cycles for loop to ecx
[/autoit] [autoit][/autoit] [autoit]
FasmAdd($fasm,".loopx:")FasmAdd($fasm,"prefetchnta [esi+128]") ;more caching
[/autoit] [autoit][/autoit] [autoit]
FasmAdd($fasm,"prefetchnta [esi+160]")
FasmAdd($fasm,"movdqa xmm0,[esi]") ;get image data
FasmAdd($fasm,"movdqa xmm1,[esi+16]") ;parallel processing, less loop cycles, memory group, more registers used -> faster
FasmAdd($fasm,"movdqa xmm2,[esi+32]") ;
FasmAdd($fasm,"movdqa xmm3,[esi+48]") ;
FasmAdd($fasm,"movntdq [edi],xmm0") ; move non-temporal (bypass cache -> faster), write image data
FasmAdd($fasm,"movntdq [edi+16],xmm1") ;
FasmAdd($fasm,"movntdq [edi+32],xmm2") ;
FasmAdd($fasm,"movntdq [edi+48],xmm3") ;
FasmAdd($fasm,"add esi,64") ;increase pointers
FasmAdd($fasm,"add edi,64") ;
FasmAdd($fasm,"loop .loopx") ;next loopx cycleFasmAdd($fasm,"cmp esi,ebx") ;check everything got copied (source>=end)
[/autoit] [autoit][/autoit] [autoit]
FasmAdd($fasm,"jb .loopy") ;if not (if source<end) repeat loopy
;//|now: still needed: edi=current image ptr,eax=level,ebx=end of image , in stack: nothing anymore;fill the last lines with color
[/autoit] [autoit][/autoit] [autoit]
;calculate color from level (blue->50->green->50->red)
FasmAdd($fasm,"mov ecx,0xFF0000FF") ;alpha=255, blue=255, red=0 and green=0
FasmAdd($fasm,"cmp eax,255") ;need to sub more than 255? (so to red)
FasmAdd($fasm,"jg .greater") ;goto red method for no problems and faster
FasmAdd($fasm,"mov ch,120") ;start points for better colors (brighter)
FasmAdd($fasm,"sub cl,al") ;move "color points" from blue
FasmAdd($fasm,"add ch,al") ;to green
FasmAdd($fasm,"jnc @f")
FasmAdd($fasm,"mov ch,0xFF") ;fix overflow (if there were an overflow)
FasmAdd($fasm,"@@:")
FasmAdd($fasm,"jmp .colorfinish") ;calculated color, start writing
FasmAdd($fasm,".greater:") ;
FasmAdd($fasm,"sub eax,255") ;do not use the points for blue to green, only use green to red points
FasmAdd($fasm,"xchg ch,cl") ;start from green points
FasmAdd($fasm,"ror ecx,8") ;rotate needed bytes to ch and cl
FasmAdd($fasm,"mov ch,120") ;start points for better colors (brighter)
FasmAdd($fasm,"sub cl,al") ;move points from green
FasmAdd($fasm,"add ch,al") ;to red
FasmAdd($fasm,"jnc @f")
FasmAdd($fasm,"mov ch,0xFF") ;fix overflow (if there were an overflow)
FasmAdd($fasm,"@@:")
FasmAdd($fasm,"rol ecx,8") ;rotate bytes back to get valid color
FasmAdd($fasm,".colorfinish:") ;;prepare to write data from xmm registers
[/autoit] [autoit][/autoit] [autoit]
FasmAdd($fasm,"movd xmm0,ecx") ;copy color to lwoer dword of xmm0
FasmAdd($fasm,"pshufd xmm0,xmm0,0") ;copy color to other dwords in xmm0
FasmAdd($fasm,"movdqa xmm1,xmm0") ;copy to the other register
FasmAdd($fasm,"movdqa xmm2,xmm0") ;
FasmAdd($fasm,"movdqa xmm3,xmm1") ;maybe this line processed parallel?;start writing and fill the remaining image bytes
[/autoit] [autoit][/autoit] [autoit]
FasmAdd($fasm,".loopfill:") ;loop to fill remaining lines
FasmAdd($fasm,"movntdq [edi],xmm0") ; write color from registers
FasmAdd($fasm,"movntdq [edi+16],xmm1") ;
FasmAdd($fasm,"movntdq [edi+32],xmm2") ;
FasmAdd($fasm,"movntdq [edi+48],xmm3") ;
FasmAdd($fasm,"add edi,64") ;increase pointer
FasmAdd($fasm,"cmp edi,ebx") ;end of image? (see loopy comments)
FasmAdd($fasm,"jb .loopfill") ;if not repeat loopfillFasmAdd($fasm,"xor eax,eax") ;no error, return 0
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
FasmAdd($fasm,"ret") ;return, the (simple) image calculation finished
;hope it is a good example for optimized assembly code
$bin=FasmGetBinary($fasm)
If @error Then
Local $Error = FasmGetLastError()
_exit("FasmGetBinary-Error:"&@CRLF&@CRLF&"Error Code: "&$Error[$FASMERRINDEX_CODE]&@CRLF&"Error Message: "& _
$Error[$FASMERRINDEX_MESSAGE]&@CRLF&"Error LineNumber: "&$Error[$FASMERRINDEX_LINENUMBER]& _
@CRLF&"Error Line: "&$Error[$FASMERRINDEX_LINE]&@CRLF)
EndIf
$codestruct=DllStructCreate("byte["&(StringLen($bin)/2-1)&"]")
DllStructSetData($codestruct,1,$bin)
$code=DllStructGetPtr($codestruct)
Return $codestruct
EndFuncFunc _Visualize($ptr,$w,$h,$data)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Local $bass=DllStructGetData($data,1,1)
$bass+=DllStructGetData($data,1,2)
$bass+=DllStructGetData($data,1,3)
$bass=Int($bass*$h/20)
If $bass<5 Then $bass=5
Local $level=0
For $x=1 To 30 ;die ersten 30 sind die meistens benutzen, der rest fast nie. geht viel schneller als 128 durchläufe
$level+=DllStructGetData($data,1,$x)
Next
$level=Int($level*240)
;speed=lastbass, color=0xFF0000FF->blue>>>green->green>>>red (level)
__process($ptr,BitOR(BitShift($w,-16),$h),$level,$bass) ;0xWWWWHHHH
EndFuncFunc _exit($txt="")
[/autoit]
_BASS_ChannelStop($stream)
FasmExit($fasm)
DllClose($user32)
_GDIPlus_BitmapDispose($bmp)
_GDIPlus_GraphicsDispose($backgra)
_GDIPlus_BitmapDispose($hbmp)
_GDIPlus_GraphicsDispose($gra)
_GDIPlus_Shutdown()
_BASS_StreamFree($stream)
_BASS_Free()
If $txt<>"" Then MsgBox(0,"Error",$txt)
Exit
EndFunc -
Eine Möglichkeit: Google
2. Es gibt einige Programme (z.B. Spy++ von Siual Studio) mit denen kannst du Funktionsnamen auslesen (das brauchst du zum ausführen)USB ist eigentlich ein Anschluss am PC, ich wäre mir nicht so sicher, ob man damit üebrhaupt die Wetterstation ansprechen kann.
Spy++: http://msdn.microsoft.com/en-us/library/…28VS.60%29.aspx
Irgendwas über Wetterstation-software ^^: http://pc-wetterstation.de/wswinen.pdf -
Ich hör auch sehr gerne elektronische Musik Was gerade das beste ist, ist aber situations- bzw. stimmungsbedingt
Pop, House, Electro remixe sind auch super.
8-bit Musik ist auch ziemlich viel gut -
Geil
und ich komm auch vor