Wenn du im OnEventMode Arbeitest kann dir das mit dem Message Loop nicht passieren.
Dann funktionieren die Buttons auch wärend einem Funktionsaufruf oder wärend einem Sleep Befehl.
Wenn du im OnEventMode Arbeitest kann dir das mit dem Message Loop nicht passieren.
Dann funktionieren die Buttons auch wärend einem Funktionsaufruf oder wärend einem Sleep Befehl.
Ich denke, dass ein Programm genau das gleiche kann wie ein Mensch.
Bisher geht man davon aus, dass ein Programm nur so gut ist wie der, der es geschrieben hat.
Vor kurzem noch, als die Dampfmaschine erfunden war, glaubten die Menschen, dass reisen mit einer hohen Geschwindigkeit wie sie bei einer Dampfbetriebenen Lokomotive erreicht wird zu Geistigen Schäden führt. Heute fahre ich mit 250 über die Autobahn... (ok. Das schließt keine Geistigen Schäden aus :P)
Alles was mal Passieren kann wird passieren. Die Frage ist nur Wann.
Und eines Tages wird durch Zufall, in einem Keller, ein kleiner Hobbyprogrammierer eine KI schreiben, die sich selbst weiterentwickeln kann.
Und schon sitzen wir in der Matrix.
Woher weiß die Person in DieSims, dass sie nicht real ist ?
Woher wissen wir, dass wir real sind ?
Angenommen wir sind ein Programm, dann können wir nicht wissen, dass wir eines sind, weil nicht einprogrammiert wurde, dass wir es wissen können.
lg
Mars(i)
iwie klappts bei mir nicht.
Also ansich schon. Aber es kommen nie Deutsche Wörter dabei raus^^
#include <File.au3>
#include <Array.au3>
#include <Misc.au3>
Global $Dateien = _DateienLaden() ;Es werden die 5 Dateien geöffnet und die Zeilen gezählt.
Global $Dictionary
_FileReadToArray(@scriptdir&"\data\dic.part", $Dictionary)
_Main()
[/autoit] [autoit][/autoit] [autoit]_Beenden($Dateien)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Func _Main()
[/autoit] [autoit][/autoit] [autoit]Local $aRet, $t
[/autoit] [autoit][/autoit] [autoit]While Sleep(10)
$t = TimerInit()
$aRet = _CreateWord($Dateien, $Dictionary, True)
ConsoleWrite("Wort: "&$aRet[0]&@crlf&$aRet[2]&@crlf&$aRet[1]&@crlf&"Dauer:: " & Round(TimerDiff($t),2) & ' ms' & @CRLF & @CRLF)
If _IsPressed("1B") Then Exit
WEnd
EndFunc
[/autoit] [autoit][/autoit] [autoit]Func _CreateWord($Dateien, $Dictionary, $Wortpruefung)
[/autoit] [autoit][/autoit] [autoit]Local $Bridge = $Dateien[0][0]
Local $Praefix = $Dateien[1][0]
Local $Affix = $Dateien[2][0]
Local $K = $Dateien[3][0]
Local $V = $Dateien[4][0]
Local $Param[10]
Local $aRet[3]
$Param[0] = Random(0,1,1)
$Param[1] = Random(0,1,1)
$Param[2] = Random(1, $Dateien[0][1], 1)
$Param[3] = Random(1, $Dateien[1][1], 1)
$Param[4] = Random(1, $Dateien[2][1], 1)
$Param[5] = Random(0,1,1)
$Param[6] = Random(1, $Dateien[3][1], 1)
$Param[7] = Random(0,1,1)
$Param[8] = Random(1, $Dateien[3][1], 1)
$Param[9] = Random(1, $Dateien[4][1], 1)
If $Param[0] = 1 Then
Local $Part1 = FileReadLine($Praefix, $Param[9])&FileReadLine($V, $Param[6])
Else
Local $Part1 = FileReadLine($K, $Param[4])&FileReadLine($V, $Param[6])
EndIf
If $Param[1] = 1 Then
$Part2 = FileReadLine($Bridge, $Param[2])&FileReadLine($V, $Param[8])&FileReadLine($Affix, $Param[3])
Else
$Part2 = FileReadLine($V, $Param[8])&FileReadLine($Affix, $Param[3])
EndIf
$sWord = $Part1&$Part2
[/autoit] [autoit][/autoit] [autoit]_Replace($sWord) ; Die Ersetzungen werden vorgenommen
[/autoit] [autoit][/autoit] [autoit]$aRet[0] = $sWord
$aRet[1] = "Aus "&$Part1&"-"&$Part2&" enstanden!"
Switch $Wortpruefung
Case True
SetError(0)
_ArraySearch($Dictionary, $sWord)
If @error Then
$aRet[2] = "Fail !"
Else
$aRet[2] = "Ein deutsches Wort wurde generiert! #####"
EndIf
Case Else
$aRet[2] = 'Wortprüfung nicht durchgeführt.'
EndSwitch
Return $aRet
EndFunc ;==> _CreateWord()
Func _DateienLaden()
Local $aRet[5][2]
$aRet[0][0] = FileOpen(@scriptdir&"\data\bri.part")
$aRet[1][0] = FileOpen(@scriptdir&"\data\pre.part")
$aRet[2][0] = FileOpen(@scriptdir&"\data\aff.part")
$aRet[3][0] = FileOpen(@scriptdir&"\data\kon.part")
$aRet[4][0] = FileOpen(@scriptdir&"\data\vok.part")
$aRet[0][1] = _filecountlines(@scriptdir&"\data\bri.part")
$aRet[1][1] = _filecountlines(@scriptdir&"\data\aff.part")
$aRet[2][1] = _filecountlines(@scriptdir&"\data\kon.part")
$aRet[3][1] = _filecountlines(@scriptdir&"\data\vok.part")
$aRet[4][1] = _filecountlines(@scriptdir&"\data\pre.part")
Return $aRet
EndFunc
Func _Beenden($Dateien)
For $i = 0 To 4 Step 1
FileClose($Dateien[$i][0])
Next
EndFunc
Func _Replace(ByRef $sWord)
$sWord = StringReplace($sWord, "oe", "ö")
$sWord = StringReplace($sWord, "ue", "ü")
$sWord = StringReplace($sWord, "ae", "ä")
$sWord = StringReplace($sWord, "aa", "a")
$sWord = StringReplace($sWord, "ee", "eh")
$sWord = StringReplace($sWord, "ii", "i")
$sWord = StringReplace($sWord, "oo", "o")
$sWord = StringReplace($sWord, "uu", "u")
$sWord = StringReplace($sWord, "ji", "i")
$sWord = StringReplace($sWord, "ij", "j")
$sWord = StringReplace($sWord, "kk", "ck")
$sWord = StringReplace($sWord, "q", "qu")
EndFunc
(So gehts en bissl schneller und spuckt die Wörter in der Konsole aus.)
lg
Mars(i)
Klasse Sache !
Ich finds gut, dass sich die Neuen an sowas rantrauen und es so gut wie möglich zusammenbauen.
Besser werden kann man immer. Auch nachdem man schon einiges programmiert hat.
Und für den Anfang ist so ein kleines Spiel doch was schönes.
Das Nächste wird geringfügig größer und vllt etwas sauberer und das nächste wieder und so weiter und so fort.
lg
Mars(i)
Um eine sinnvolle antwort zu erhalten ist es wichtig sein Skript zu posten.
Sonst kann niemand wirklich den Fehler finden außer durch raten.
ToolTip(Ping('www.google.de'))
[/autoit]Das funktioniert bei mir.
lg
Mars(i)
Das Wichtigste an dem Spiel war: Wie mache ich was total einfaches möglichst umständlich.^^
Und halt alles ohn iwelche Grafikfunktionen zu machen.
Und dass alles so klein wie möglich ist^^
Das mit der Wand ist Absicht. So hat man mehr freiheit.
Und ich bin bestimmt nicht der einzige der gerne bei Snake durch Wände geht um den Weg abzukürzen oder einen Knoten zu vermeiden.
lg
Moin
Ich mag ja immer Sachen die "klein" sind.
So auch bei dieser Version von Snake.
So viel Arbeit wars nicht. Eher Spaß^^
Das spiel hat 30x30 Pixel !
Für Menschen ohne Lupe gibt es allerdings die Möglichkeit das Spiel ein bisschen zu Zoomen.
Dazu bitte die Ini die beim ersten Spielstart entsteht bearbeiten. (ab einem Faktor von 10 wird es sogar Spielbar :P)
Wenn man nicht weiter weiß: Enter Drücken. Zum verstellen der Schnelligkeit die Pfeiltasten (hoch/runter) nutzen.
Verwendet wird:
- Kein GDI+
- Keine Grafiken
Ich wünsche allen viel Spaß damit.
Ich hoffe bald etwas leicht Größeres veröffentlichen zu können.
Aber dazu braucht es wohl noch etwas Zeit...
[Blockierte Grafik: http://img6.imagebanana.com/img/aqubfgv5/Screen06.png] [Blockierte Grafik: http://img6.imagebanana.com/img/rmbgfupm/Screen07.png]
Ca. 60% Fertig ist das Spiel...
lg
Mars(i)
Auch von mir alles Gute
lg
Das Scheint ja eine Musterlösung für das Problem zu sein
Moin
Load_BMP_From_Mem() verschlingt komischerweise Speicher...
Ich weiß leider nicht, wie man das Problem beheben kann...
Als Beispielskript habe ich mal eins gemacht, was einen Smiley aus der Ressource läd und auf den Bildschirm bringt.
Dabei wird in einer Endlosschleife unmengen Hauptspeicher vollgemacht. Also bitte nur ein Paar sek laufen lassen und dann mit Return beenden.
#include <Memory.au3>
#include <GDIPlus.au3>
#include <winapiex.au3>
_GDIPlus_Startup()
[/autoit] [autoit][/autoit] [autoit]Global $dc = _WinAPI_GetDC(0)
Global $gr = _GDIPlus_GraphicsCreateFromHDC($dc)
While Not _IsPressed('0D')
[/autoit] [autoit][/autoit] [autoit]$bmp = Load_BMP_From_Mem(_res())
_GDIPlus_GraphicsDrawImageRect($gr, $bmp, @DesktopWidth/2 - 50, @DesktopHeight/2 - 50, 100, 100)
_GDIPlus_BitmapDispose($bmp)
WEnd
[/autoit] [autoit][/autoit] [autoit]_GDIPlus_GraphicsDispose($gr)
_WinAPI_ReleaseDC(0, $dc)
_GDIPlus_Shutdown()
Func _IsPressed($a)
Local $b = DllCall('user32.dll', 'short', 'GetAsyncKeyState', 'int', '0x' & $a)
Return BitAND($b[0], 0x8000) <> 0
EndFunc ;==>_IsPressed
[/autoit] [autoit][/autoit] [autoit]Func _res()
Local $a = ''
$a &= '0x89504E470D0A1A0A0000000D49484452000000320000003208060000001E3F88B10000000467414D410000B18E7CFB5193000000206348524D0000870F00008C0F0000FD520000814000007D790000E98B00003CE5000019CC733C857700000A396943435050686F746F73686F70204943432070726F66696C65000048C79D96775454D71687CFBD777AA1CD30025286DEBBC000D27B935E456198196028030E3334B121A2021145449A224850C480D150245644B1101454B007240828311845542C6F46D68BAEACBCF7F2F2FBE3AC6FEDB3F7B9FBECBDCF5A170092A72F9797064B0190CA13F0833C9CE911915174EC0080011E608029004C5646BA5FB07B0810C9CBCD859E2172025F0401F07A58BC0270D3D033804E07FF9FA459E97C81E89800119BB339192C11178838254B902EB6CF8A981A972C66182566BE284111CB893961910D3EFB2CB2A398D9A93CB688C539A7B353D962EE15F1B64C2147C488AF880B33B99C2C11DF12B1468A30952BE237E2D8540E33030014496C1770588922361131891F12E422E2E500E048095F71DC572CE0640BC49772494BCFE173131205741D962EDDD4DA9A41F7E464A5700402C300262B99C967D35DD252D399BC1C0016EFFC5932E2DAD24545B634B5B6B434343332FDAA50FF75F36F4ADCDB457A19F8B96710ADFF8BEDAFFCD21A0060CC896AB3F38B2DAE0A80CE2D00C8DDFB62D3380080A4A86F1DD7BFBA0F4D3C2F890241BA8DB1715656961197C3321217F40FFD4F87BFA1AFBE67243EEE8FF2D05D39F14C618A802EAE1B2B2D254DC8A767A433591CBAE19F87F81F07FE751E06419C780E9FC313458489A68CCB4B10B59BC7E60AB8693C3A97F79F9AF80FC3FEA4C5B91689D2F81150638C80D4752A407EED07280A1120D1FBC55DFFA36FBEF830207E79E12A938B73FFEF37FD67C1A5E225839BF039CE252884CE12F23317F7C4CF12A0010148022A9007CA401DE800436006AC802D70046EC01BF8831010095603164804A9800FB2401ED8040A4131D809F6806A50071A41336805C741273805CE834BE01AB8016E83FB60144C80676016BC060B10046121324481E421154813D287CC2006640FB941BE50101409C54209100F124279D066A8182A83AAA17AA819FA1E3A099D87AE4083D05D680C9A867E87DEC1084C82A9B012AC051BC30CD809F68143E0557002BC06CE850BE01D7025DC001F853BE0F3F035F8363C0A3F83E7108010111AA28A18220CC405F147A29078848FAC478A900AA4016945BA913EE426328ACC206F51181405454719A26C519EA850140BB506B51E5582AA461D4675A07A51375163A859D4473419AD88D647DBA0BDD011E8047416BA105D816E42B7A32FA26FA327D0AF31180C0DA38DB1C2786222314998B59812CC3E4C1BE61C6610338E99C362B1F2587DAC1DD61FCBC40AB085D82AEC51EC59EC107602FB0647C4A9E0CC70EEB8281C0F978FABC01DC19DC10DE126710B7829BC26DE06EF8F67E373F0A5F8467C37FE3A7E02BF4090266813EC08218424C2264225A1957091F080F0924824AA11AD8981442E7123B192788C789938467C4B9221E9915C48D124216907E910E91CE92EE925994CD6223B92A3C802F20E7233F902F911F98D0445C248C24B822DB141A246A2436248E2B9245E5253D24972B564AE6485E409C9EB92335278292D291729A6D47AA91AA99352235273D2146953697FE954E912E923D257A4A764B0325A326E326C99029983321764C62908459DE242615136531A29172913540C559BEA454DA21653BFA30E506765656497C986C966CBD6C89E961DA521342D9A172D85564A3B4E1BA6BD5BA2B4C4690967C9F625AD4B8696CCCB2D957394E3C815C9B5C9DD967B274F9777934F96DF25DF29FF5001A5A0A710A890A5B05FE1A2C2CC52EA52DBA5ACA5454B8F2FBDA7082BEA290629AE553CA8D8AF38A7A4ACE4A194AE54A57441694699A6ECA89CA45CAE7C46795A85A262AFC255295739ABF2942E4B77A2A7D02BE9BDF4595545554F55A16ABDEA80EA829AB65AA85ABE5A9BDA4375823A433D5EBD5CBD477D564345C34F234FA345E39E265E93A199A8B957B34F735E4B5B2B5C6BAB56A7D694B69CB69776AE768BF6031DB28E83CE1A9D069D5BBA185D866EB2EE3EDD1B7AB09E855EA25E8DDE757D58DF529FABBF4F7FD0006D606DC0336830183124193A19661AB6188E19D18C7C8DF28D3A8D9E1B6B184719EF32EE33FE6862619262D26872DF54C6D4DB34DFB4DBF477333D3396598DD92D73B2B9BBF906F32EF317CBF4977196ED5F76C78262E167B1D5A2C7E283A59525DFB2D572DA4AC32AD6AAD66A84416504304A1897ADD1D6CED61BAC4F59BFB5B1B411D81CB7F9CDD6D036D9F688EDD472EDE59CE58DCBC7EDD4EC9876F576A3F674FB58FB03F6A30EAA0E4C870687C78EEA8E6CC726C749275DA724A7A34ECF9D4D9CF9CEEDCEF32E362EEB5CCEB922AE1EAE45AE036E326EA16ED56E8FDCD5DC13DC5BDC673D2C3CD67A9CF3447BFA78EEF21CF152F26279357BCD7A5B79AFF3EEF521F904FB54FB3CF6D5F3E5FB76FBC17EDE7EBBFD1EACD05CC15BD1E90FFCBDFC77FB3F0CD00E5813F06320263020B026F0499069505E505F30253826F848F0EB10E790D290FBA13AA1C2D09E30C9B0E8B0E6B0F970D7F0B2F0D108E3887511D7221522B9915D51D8A8B0A8A6A8B9956E2BF7AC9C88B6882E8C1E5EA5BD2A7BD595D50AAB53569F8E918C61C69C8845C786C71E897DCFF4673630E7E2BCE26AE366592EACBDAC676C4776397B9A63C729E34CC6DB'
$a &= 'C597C54F25D825EC4E984E7448AC489CE1BA70ABB92F923C93EA92E693FD930F257F4A094F694BC5A5C6A69EE4C9F09279BD69CA69D96983E9FAE985E9A36B6CD6EC5933CBF7E137654019AB32BA0454D1CF54BF5047B8453896699F5993F9262B2CEB44B674362FBB3F472F677BCE64AE7BEEB76B516B596B7BF254F336E58DAD735A57BF1E5A1FB7BE6783FA86820D131B3D361EDE44D894BCE9A77C93FCB2FC579BC337771728156C2C18DFE2B1A5A550A2905F38B2D5766BDD36D436EEB681EDE6DBABB67F2C62175D2D3629AE287E5FC22AB9FA8DE93795DF7CDA11BF63A0D4B274FF4ECC4EDECEE15D0EBB0E974997E5968DEFF6DBDD514E2F2F2A7FB52766CF958A6515757B097B857B472B7D2BBBAA34AA7656BDAF4EACBE5DE35CD356AB58BBBD767E1F7BDFD07EC7FDAD754A75C575EF0E700FDCA9F7A8EF68D06AA83888399879F049635863DFB78C6F9B9B149A8A9B3E1CE21D1A3D1C74B8B7D9AAB9F988E291D216B845D8327D34FAE88DEF5CBFEB6A356CAD6FA3B5151F03C784C79E7E1FFBFDF0719FE33D2718275A7FD0FCA1B69DD25ED40175E474CC7626768E7645760D9EF43ED9D36DDBDDFEA3D18F874EA99EAA392D7BBAF40CE14CC1994F6773CFCE9D4B3F37733EE1FC784F4CCFFD0B11176EF506F60E5CF4B978F992FBA50B7D4E7D672FDB5D3E75C5E6CAC9AB8CAB9DD72CAF75F45BF4B7FF64F153FB80E540C775ABEB5D37AC6F740F2E1F3C33E43074FEA6EBCD4BB7BC6E5DBBBDE2F6E070E8F09D91E891D13BEC3B537753EEBEB897796FE1FEC607E807450FA51E563C527CD4F0B3EECF6DA396A3A7C75CC7FA1F073FBE3FCE1A7FF64BC62FEF270A9E909F544CAA4C364F994D9D9A769FBEF174E5D38967E9CF16660A7F95FEB5F6B9CEF31F7E73FCAD7F366276E205FFC5A7DF4B5ECABF3CF46AD9AB9EB980B947AF535F2FCC17BD917F73F82DE36DDFBBF077930B59EFB1EF2B3FE87EE8FEE8F3F1C1A7D44F9FFE050398F3FCBAC4E8D3000000097048597300002E2200002E2201AAE2DD920000001974455874536F667477617265005061696E742E4E45542076332E352E314EE738F900001122494441546843ED99775454D7DAC6676862D7888DD84BAE1A6B44408D35D805542496688C8929F60A562CD8506C28A0580322222822228A8A622F8894993943B1C4281A0B9A6B079C79EEF3C2B056BE7CF9560266DDEF9FCC5ABFB5A79C7DCEFBBC6DEF7346A5FAE7F58F07FEF1C07FCD03037BD897215DC94CB29DC490B3E43889203E6424A9F75F33EAAF5E8846552483C901F29CC0D5C91E5FBA3A62C270478C1FE680EFDDED306E881DBE74B1C7E05EF6906388421693E644FD57AFF7DEC7F162E6A42D994BFCC816729264BBF4E8F0CECDC90E9E633BE2F0BA36C80EAD8F077B6A20777715FC1262839CEDD5F0D396EAD0FAD7C1719F8FB065565BCC1DDB012307D8C3B9A7FDAF3CC756D2F4BD8DFC2B27E085A6933724920C2527C4B3C3FA3B62D9447B8C1EF8097CC7FD0BF7FCCAE06DB025F282AD91B7BB2CDF97C3AB6D65F03CC01CCFFCD478B4CE0C396BAD70C7B71C327DAA60EFD486F8DEB59D44E819994CACFE8A3DA53EC694DF92E363C80397CFECB1747227DC8A690B83660CB2767E84EF87B4C177FD5A22795125BC8BAD0A1CA90A6374651823CAC3B0B71C0A8229729B055E0698E1B99F199EAE51E3C1523532E75A62D7B87A18DACBCEC073EF21354B6DE89F4D34A5D604898A5B1F0784AFEE8897973AC37899DC8B82F1941DEE85DB60B44B7B7CDDA715D216578421A92E70B93E90680B1CAF09C4DA00FBABC0185601EF765AE37580051EAD52E3E7452A64CE54E1E8781B7C3DB0BD44E72AA9FB673695EA779E7812C91F39D01157C2BA203F6B0670270086B8A6F47A59E05425E04A75A41D6804F77E1D30B97F33DC5CCF88689B02698DF85B43E002459DFA90826A304A9591B7DD1AB96BCD7177890A591E6A683D3FC0C5D94D30D9A5B5884921B54B65ECFF358927EC49DE7EDECF0157F7D8C3F0700F602C80F1EA6818F69701E22B005769A09EA26EB7406C48070CEEED08FF61B6C83D5C1DC66CFEA6303A1A0A49A2A8C4BA30F2FB8290F278E16F89072B54B831D702BAB935A159D20697A6D7C3C4012D458CB46C8BBF458C849864BA3A39203EA01D8D9A00FCB29FD10885E1701D188F301A17AA03D96D8147AEC0CB0930BC9886D0A041F86670179C9B5401053AA695F20190CEBA49A1A8CB0D18195B1863AA213FB82C9EAE57E3B6971ACAACB248F7B445FAB24E3831CE16A3FB14368139EF2D8427511369B3F09B6D8782CB6D604CF986C633CFA3AC618CA588335580D43A404E67E0AD17237502301CC2DBC723B1D4B31B56BBD5C3FD5D8C98BE1A8CA92CFCEB14748562CEB06E8E568721A202FEED6F86BBCB54C8986986D449D648F56A8724AF2E08FDA6295C7ADAE7F2FA2DDF4B0C4F60475E8F7476C4D3638D5010D788294163A2994EB1E5982295816B35801BCCFFC79F301A5F02054114B41C78DA038F591F1743EAE3CEC6B230EA3EA0133837A9028C5738EF34051DE577911412A0468E0F0BDE438594EFD5B83EED43247BF7C1D5059DE031A495446577A98598BA549833A371D0B725F20F57434184058C8728E228459C67244444563D18EF3781E17E63E05927E039D32B97D179C022CFA947581B37995A1482944A781C5F11DE139AE3595439A616A3BACF1ABFFAAB71977592EE618ED83115B079583D788DE88C296E9D316E4061177B4DDA964A0C27D6232FC6B8DAE3498C2DF2F65AC21065C988309D'
$a &= '12D8A1922942614ADDA0A1D91C6FD1E847AD80272D808714F590517AC45AB85DBB488486C2932B20EF6C19787DDB1C53DD3FC6C185B638E2550BBB26DA62C5C88658E8D618AB86D6C39661B5B17B544DEC1D65839D236A62BE6B1311B3A6B442C64B6D6CF4688DFC2395911F66C66858C1185F1EB82886898126148E59CCFB9C0630E6D42714754F04B2CDEAA405B3C8D3447C7918CF5BE231D3D2E7CB869832A019BC5C1B21F80B1B5C1C6F85CC592AE867A9A199551DD7E7B7C7F565BD717D7137C4793A88906C52BEC46238294E8424EFA88F37E11678B78F42E2CAC09828ADB61AD384E9924634B568A8A40E3B979E51CA207AB65CA9897436050D85A452C4753AE01AD3E91CD333D102AFA3CC717F3553CA5B857BCBC94A157E667ADDE2E2A89B570B29CB9C90B2DA0D292B06E2AAAF33463B3B1A694FBB1209E1844AE4CE30AE1B8FA32AE1D58F6AE453C8BB238CC85916EB657A3889AB742A05A48B20BE4FA3D1692C627626A9055CAFC8E2AE0423D3492281648A60348C89E6302458E0ED7E355EEF56E1E576157237A9F060B50A7729E686970ADA99EC5C4BBB20D59742560F41CAC661DC647695A84C28A990969CF46AFAA87678B6D71A2F77AA90176E8682582BBC3BC57DD3391A78A90A72136B2323BA0E0CC96CADD768787245B6561A7CC99A6B85892436866BAC2B8944821A8693E6C83B6886577B282258855F835478E4A7C2FDB58C0885642FA0906916DCE2B4A7108A58330CA9815F61C7DC9E22646B8984B87CE6E82469B5FCBBE67812648E57BCE05B46E46D3477B5B16550105F1686C48A5839B905DC7ADB212D80422E315217D9852E306A8288B94A11491471DE0238A1E2124367C498E1CD5E8A60349ED341B9812A3C9688AC677A71DF7563A1396BA43CD2BC1D90BA7608198EB4A0EFB0DFDB4984249448C8E0DE9F0E77EEE988C0C94DF1988BD50BA6D6CB300A22AF23CCF196F95DC07A39E3571B3EC31B207DB6150ACE718D384F216768F445B6E82B147099E379B32211F12A188EA891B75F5528E4C58F8CC6D62221B98CCAFD0D6CBF4BACA15F580EBA055CDD5774459A08593F0AE9BBA6E0E092EE2224AD44425C9D3A8E1221DBA636C1A34D1678BA558D17C114B49B30255E8531D528263FC612CF432CF162AF150CC799FF27292281869F25E7CCB960AA1905729422E2D4787788F32255781DCE6850C8530A784A31BF3022BAA59670EFD51E7EA3EA433BBF0ED2573951C850A46DFE019AE01988F2722CBCAB2C91104E1822A9B5617C333CDC6885275BCCF1EF1DBC3853EC7908615ABCA131792CD8FC283681432CE0583158CDED3ABD9F2069448E913815DE1D666A1EA480083A818E7821694521CF58E88F19919F59E8598CC686314D70E4BB8AD07856A1905E48DB3002E9BBE743B36B1A22E6142E8CC92515D299930C4BBEFA171EAC53530C6F82E8B95F29E61979CADC2E1443C3DED2C3922EF9D1F4780C3D1F2B2954348A803C0A78B98F73E9845CE950DBC816159E04B02E984E7729E2E65233642FB5817E79536899569A25AD90BE6600D2377F074DE42A282193113ABD7003195352218D39E9D9DCD12D90C3BB38E9280F19FE279BE941F2D0BF68FC955E154112A597CC7BF1F81B0A13816F68FC4BA6A0887EC4637FE19C0734FE3E3B548EAF0A7764CD584A115C37B21659F3B6B73194351DA15DDE1EDAB5FDA0F11F054DC81C68A2372263F764AC1F5FB828FA96548895E4E317DCE7DCF2B52ABCB0707F5D11920AF728EE01C589C04734F00923F68C463FA5C745A4189EC363EFAE2A5AE8A4B5DE213F71977B438CE77A21642EB040A6774D64AEB7876E435F6837B8421BF435B43FCE80F6E07A0AD9848CE06F3073849D08195622217230276D933AB9B4A42A4558B235D210AEC062C8CDC5842BF22DBE17AF8A9162F02FB21EB08D4ABAFCC4636FF2CEEFC642AE0D850693F9DCAACF2573F89E63E63C0B642CAC8ACCB59F20639B3B74DBC640B76B1274A173A03DB00A9AB8EDD044AC44CA2667B8F7EEF096F6D4298D1057111238814F46D655C5CFCB79F32386990CCA9C2786D0AB344E8C152FDFE683845BDE5C0BC4DBFC5E7ED7D368C5935D895B741DF7528A305B0DFD3C2B642CB241C6EA96C80C72857EF704E8C23CA0DBB708BAA835D0C56D8536762B743F4E41A4472789C67952F2272C9C5481DCFECAD90E99819FE0A795157063B159A1817A1A25061653E46535B2E6CA1391A2F719622CD1799A518019B43338CE3487D6C312BAD965A12C6071FBB647C67677E8C3A640D9371FBAFDCBA03BBC11DAF85DD01E0F6654D641D9E48239C3DBC93E6B7C89A3614A2DB93B5CCCFB1163985777DC0E6C8FEC15B599265CB43CCD69143D4B410A1F1A28B3CDE8F5DFC2DF3D790FEE6945CAF2A1427968E75486765EF5C2C54E3BBF16742B5A42D93A14FABDD3A0442C80EEC04A462108BA93A1D02584417B6C1774C13391B0A43D063B75C8A12D354A25C424A6164F706F149F086A4346236B632764AD6E0DBD775D7AB60C34DC1369A6D3608F22B4B32C8915294328C08302668B801AD02EE442B7E42368BD3F82CEA72D942D6E50C26640899454F2812E7E0794C44828A72328641F74D1EB707B575F4C195AB87ECC2FB588E2893CC90FE4DDCA292E5082C732158643BF65109495AD685C23681634A087E9657A5AE755346A177CC8DFF8BD18BEBC15343E6CA93E76D0ADEA00C5BF3F945D63A184CF662A2D8572D017CAB16D50CE1C80FEB40839C0CF3B706BFFB7D83AA3B0E5A691AA7F87106B9EE898CB670ED8BCE00B64442D'
$a &= '4246B807F4E1B3981A23A1040C856E7D5FD21B3ABF3ED012DD467EF61F085DE0208EFDA1DBD497B93E9002BE8176DF0268C4F8980D5062FD69F44E2867A32820929108878EB5712B7A16629777C5905E0E05BC7697F716F19BA8D4E009F5DC832178C578282776427F34084AFC76282C50258C851A4A0F87525C28D38514BE0F99C6AE3309CA1E0F284C1FE5F88FD08BE759034AC2DEC22828E70F71A49013A1D0C70751C40C5CF0EB8A11FD1C0A0674EFB09036989B30E3284FEDDFEFC93D85B42059437A77C20E9FA9D09D3B04FDD5D3D0279D2E32483C7B3800BA83EB08DBE7A10DEC4001D0722DB816B71BC7C2B7E1C2517AFDC2112817E3C85128176239773FF4744CF6F175B8133B11096B7AE02B677B43DF2EEDFD6B54AB5C8D86572065491962F9B788A29066442791D9B0880BD7E5E3C8D0A52343AB4146DA35645C3B0BFDC563F4FAC1A27C4F3C806BC723E1337F2A268E198A6B27250231D0339532CEEC43C6E910649D0AC2CD935CFCF64FC1164F27DEDF381ABA7668B9C7CAD2A22D8D6E44E419702D22A22A91722651F204B2384A25CF3E595DA566F8BFC6BB39E3062131D21F19574F22239D424414D16B53292C09FA944B483E771CBCB9E123D4CE38B26F07F457E29179E508B2AE4423EB22D3EB5420A2032763D6989E18D0DDEE45CB8F1A849B99994DA46563891BE9445A13F9FF4444491BAE6C12541CA152A59BFAC39AD56A767768EDCD1C7E3EBCFFA7F09DE98E0BA19EB8713A0037926290957A16999A24646AAF43D12463E7E60D58BF723152AF9E4766DA3964A5C423FB72184E862DC5FC499FC3AD4F2774B1FBF8BE4DD54A9134501EFB789379641619430611297A79E228519287DBD2C9243A22462253E29778A321B1AF6553D59D06ECEBD7CD2E97B7C718E7DE03BEB30621DAEF2B24B2F8AF44AFC4B563814CAF6DB81CBB0909A18B10B16E1C7CA60FC2D76EDD30B0A783A4D1C3BAB56DCEA8D5EA709E730FD941369155C493FC601233946347D282D42712194935A91D6908257E599B4E2427ED4E03FA54AD5CE1CBD6CD1A6EEA66DFEA52BFAE76FC2BCD21DFC5A9A3D1AD6F670C1BF029860FEC0277BE77FEACA3A17F77FBBC1E8EAD1FB769D630BDFA07958F9A9B9B150B90C7A2DB4D225672948E35937C4B461167D28134FF9D10B1A7544244B9149AEC44ED4937D29BB890CF2D2CCCC7D6AE5E7561D306B6412D9AD43BC49C3FD9BC71DD787E8EB3AD512DB25CD9323B795C20D96C1AFD39AE27ABC90AB2847890A944D26A30F98CB4378968C051FED12A4E2DD948962AB54448F14BDAA208122F7D423A9B2EDA9FA3AB082352B49388E4FB6C32D784FC5D209FC568F94D0C17EF8F20E27D719038AA0D6946249D6D890D9194926B8B088946A98A9DF3FEC74B4E22795AC574A1C61C3F26D269E4C9A01D71209F921EA417E967422229DF4967128FB732192D1D4A8A5AFE8F17E3AB13894045522CE0FDDAEFEF55FC812809B37412E928E23911285E14C42041D604A1F8FBE251BEFBC03447E6CA6228E7913A10EF8BF11281BF6795FF1331F2B344492E26C885C5001127C61423512C460C2D7E2FBFCBB1C21F19FEB7A4D15FD0F0BF0E29DE1FFD762C16F947E3EF8F2FCD35FF99F3FFEE81FF0000E4E4ED959015A50000000049454E44AE426082'
Return $a
EndFunc
Func Load_BMP_From_Mem($pic)
Local $memBitmap, $len, $tMem, $hImage, $hData, $pData, $hStream, $hBitmapFromStream
$memBitmap = Binary($pic)
$len = BinaryLen($memBitmap)
$hData = _MemGlobalAlloc($len, 0x0002)
$pData = _MemGlobalLock($hData)
$tMem = DllStructCreate("byte[" & $len & "]", $pData)
DllStructSetData($tMem, 1, $memBitmap)
_MemGlobalUnlock($hData)
$hStream = _WinAPI_CreateStreamOnHGlobal($pData)
$hBitmapFromStream = _GDIPlus_BitmapCreateFromStream($hStream)
$tMem = ""
Return $hBitmapFromStream
EndFunc ;==>Load_BMP_From_Mem
Func _GDIPlus_BitmapCreateFromStream($pStream)
Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromStream", "ptr", $pStream, "int*", 0)
Return $aResult[2]
EndFunc ;==>_GDIPlus_BitmapCreateFromStream
Mein System ist WinXP.
Es kann sein, dass unter 7 oder Vista alles läuft (bezweifle ich aber).
lg
Mars(i)
Auch wenn im Startpost steht, dass es keine asm Beschleunigung geben soll...
naja..
ich konnte nicht wiederstehen^^
Das Resultat ist etwa 25 Mal so schnell wie vorher. --> ca. 1000 px/s statt 40^^
#include <GDIPlus.au3>
#include <AssembleIt.au3>
;~ #include 'GlPluginUtils.au3'
Opt('GUICloseOnESC', 0)
Opt('GUIOnEventMode', 0)
;~ Opt('MustDeclareVars', 1)
_GDIPlus_Startup()
[/autoit] [autoit][/autoit] [autoit];################## Hier Parameter bestimmen ###########################
Global $hell = 168 ;Helligkeit des Bildes
Global $Tiefe__ = 15 ;Tiefenwert
Global $Seed = 9 ;Nummer des Bildes
Global $F1 = 0xFF6060FF ;Farbe 1
Global $F2 = 0xFFFFFFFF ;Farbe 2
Global $Size = Int(@DesktopHeight*0.92) ; Welche Breite und Höhe soll das Bild haben ?
Global $Stretch = 1 ;Um welchen Faktor wird das Bild vergrößert ?
;#######################################################################
;~ Global Const $Size = 200
;~ Global Const $Stretch = 2
Global Const $BreiteMulti = 1
Global Const $Breite = $Size
Global Const $Hoehe = $Size
Global Const $Titel = 'Perlin'
Global Const $WM_NCHITTEST = 0x0084 ; Fenster "Anfassen"
Global Const $HTCAPTION = 2 ; Fenster "Anfassen"
Global Const $WS_EX_LAYERED = 0x00080000
Global Const $WS_POPUP = 0x80000000
Global Const $SRCCOPY = 0x00CC0020
Global Const $BLACKNESS = 0x00000042
Global Const $DIB_RGB_COLORS = 0 ;Eine Absolut sinnlose Variable die aber immer fehlt.
Global Const $h_NTDLL_DLL = DllOpen('ntdll.dll')
Global Const $h_MSIMG32_DLL = DllOpen('msimg32.dll')
Global Const $h_GDI32_DLL = DllOpen('gdi32.dll')
Global Const $h_OLE32_DLL = DllOpen('ole32.dll')
Global Const $h_USER32_DLL = DllOpen('user32.dll')
Global Const $h_KERNEL32_DLL = DllOpen('kernel32.dll')
Global Const $h_AlphaStruct = _GDI_AlphaBlend_GetStruct()
[/autoit] [autoit][/autoit] [autoit]Global $hGUI = GUICreate($Titel, $Breite * $Stretch * $BreiteMulti, $Hoehe * $Stretch, _C($Breite * $Stretch * $BreiteMulti, 1), _C($Hoehe * $Stretch, 0), $WS_POPUP, $WS_EX_LAYERED)
GUISetBkColor(0xFF0000, $hGUI)
WinSetTrans($hGUI, '', 255)
GUISetOnEvent(-3, '_Exit', $hGUI)
GUISetState(@SW_SHOW, $hGUI)
Global Const $hdc_GUI = _WinAPI_GetDC($hGUI)
Global $ASM_Struct_Verpixelung = _AsmToStruct('0x8B4C24048B398B51048B4110A3ED7C62018B4114A3F17C62018B41088B590C5189C1515053E80D0000005B585983E90177F059895104C3B80000000089D9E81E00000083F8007509A1ED7C62018907EB07A1F17C6201890783C70483E90177DEC389D0BA0000000069C0E51B000005F5D5000031D2BB80F40300F7FB81FA40FA01007707B800000000EB05B801000000C3') ;Wird für den Perlingenerator gebraucht.
Global $Backbuffer = _CreateImage($Breite*$Stretch*$BreiteMulti, $Hoehe*$Stretch)
Global $hDC_Backbuffer = DllStructGetData($Backbuffer, 1, 1)
;~ ;################## Hier Parameter bestimmen ###########################
;~ Global $hell = 120 ;Helligkeit des Bildes
;~ Global $Tiefe__ = 15 ;Tiefenwert
;~ Global $Seed = 9 ;Nummer des Bildes
;~ Global $F1 = 0xFF4040A0 ;Farbe 1
;~ Global $F2 = 0xFFFFFFFF ;Farbe 2
;~ ;#######################################################################
Global $Tiefe_ = 0
Global $Timer = TimerInit()
Global $Perlin = _CreatePerlin($Breite, $Hoehe, $Tiefe__, $Seed, $hell, $F1, $F2)
Global $Diff = Int(TimerDiff($Timer))
;~ _SaveImage($Perlin)
[/autoit] [autoit][/autoit] [autoit]Global $ImageSchrift_Zeit = _CreateImageSchrift('Size: ' & $Breite & 'x' & $Hoehe & ' px' & '|Helligkeit: ' & $hell & '|Tiefe: ' & $Tiefe_ & '|Benötigte Zeit: ' & $Diff & ' ms|Pixel pro ms: ' & Round($Breite*$Hoehe/$Diff, 2), 0xFF000000, 4) ; 4px große Schrift
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Func _AsmToStruct($ASM_Code)
Local $CodeStruct = DllStructCreate('byte[' & StringLen($ASM_Code) / 2 - 1 & ']')
DllStructSetData($CodeStruct, 1, $ASM_Code)
Return $CodeStruct
EndFunc ;==>_AsmToStruct
Func _ASM_Verpixelung($Ziel, ByRef $Nummer, $b, $h, $f1, $f2)
;~ Ziel = Bitmap wo der Spaß hinsoll
;~ Nummer = Startwert
;~ b = Breite
;~ h = Hoehe
;~ $f1 = 0xFF00FF00
;~ $f2 = 0xFFFf00FF
Local $struct = DllStructCreate('int[6]')
DllStructSetData($struct, 1, $Ziel, 1)
DllStructSetData($struct, 1, $Nummer, 2)
DllStructSetData($struct, 1, $b, 3)
DllStructSetData($struct, 1, $h, 4)
DllStructSetData($struct, 1, $f1, 5)
DllStructSetData($struct, 1, $f2, 6)
;~ _AssembleIt('ptr','_ASM_Verpixelung_','ptr', $Ziel, 'int', $Nummer, 'int', $b, 'int', $h) ;um den code zu erhalten. - Veraltet
;~ _AssembleIt('ptr','_ASM_Verpixelung_','ptr', DllStructGetPtr($struct)) - Neu. Mit Struct
;~ ToolTip('vorher: ' & $Nummer & @CRLF & _
;~ 'nachher: ' & DllStructGetData($struct, 1, 2))
DllCall($h_USER32_DLL, 'ptr', 'CallWindowProcW', 'ptr', DllStructGetPtr($ASM_Struct_Verpixelung), 'ptr', DllStructGetPtr($struct), 'int', 0, 'int', 0, 'int', 0)
[/autoit] [autoit][/autoit] [autoit]$Nummer = DllStructGetData($struct, 1, 2)
$struct = 0
EndFunc ;==>_ASM_BitBlt
[/autoit] [autoit][/autoit] [autoit]Func _ASM_Verpixelung_()
_('use32')
_('org '&FasmGetBasePtr($Fasm))
_('mov ecx, [esp+4]') ;Pointer auf die Struct (Hier steckt alles an Daten drin.
_('mov edi,dword[ecx]') ;Pointer fürs Bitmap = edi
_('mov edx,dword[ecx+4]') ;Startnummer = edx
_('mov eax, dword[ecx+16]') ; Farbe1 aus der Struct holen
_('mov dword[farbe1], eax') ; Farbe 1 speichern
_('mov eax, dword[ecx+20]') ; Farbe2 aus der Struct holen
_('mov dword[farbe2], eax') ; Farbe 2 speichern
_('mov eax,dword[ecx+8]') ;Breite = eax
_('mov ebx,dword[ecx+12]') ;Höhe = ebx
_('push ecx') ;Datenpointer sichern. (esp + 4)
_('mov ecx, eax') ; Der Zähler enthält die breite.
_('_x:') ;Schleife 1
_('push ecx') ; Der Zähler wird gesichert.(esp + 4)
_('push eax') ; Die Breite wird gesichert, weil eax in der Schleife2 gebraucht wird(esp + 4)
_('push ebx') ; Auch die Höhe wird gesichert.(esp + 4)
_('call Schleife2') ; Hier wird tüchtig gefärbt
_('pop ebx') ;Höhe wieder herstlelen
_('pop eax') ;Die Breite wird wieder hergestellt
_('pop ecx') ;Zähler wieder herstellen
_('sub ecx,1');Schleife 1
_('ja _x');ende von Schleife 1
_('pop ecx') ;Pointer auf die Daten wieder holen
_('mov dword[ecx + 4], edx') ;Startummer abspeichern
_('ret ') ; Ende
_('Schleife2:') ;Sprungstelle zu Schleife 2
_('mov eax, 0') ;Speicherstelle leeren. Hier sitzt später die 0 oder 1
_('mov ecx, ebx') ;Die breite wird geholt für die Anzahl Durchläufe
_('_y:') ;Schleife 2
_('call zufall') ;edx erhält die fortlaufende Nr, eax enthält 0 oder 1
_('cmp eax, 0') ;Wenn die Zufallszahl 0 ist dann:
_('jne ungleich')
;######## Wenn eax = 0 Dann
_('mov eax,dword[farbe1]')
_('mov dword[edi], eax') ;Färben
;#################################
_('jmp weiter')
_('ungleich:')
;######## Wenn eax <> 0 Dann
_('mov eax,dword[farbe2]')
_('mov dword[edi], eax') ;Färben
;#################################
_('weiter:')
_('add edi,4') ;Nächster Pixel
_('sub ecx,1') ;Runterzählen
_('ja _y');Schleife 2
_('ret ') ;Rücksprung zum Aufruf
_('zufall:') ; edx hat die startnummer
_('mov eax, edx') ;Die Startnummer wird ins eax kopiert
_('mov edx, 0') ;edx leeren
_('imul eax, 7141') ; Multiplikation mit 7141
_('add eax, 54773') ; Addition von 54773
_('xor edx, edx') ; edx leeren
_('mov ebx, 259200') ; den Wert ins ebx packen
_('idiv ebx') ; edx = mod(eax, ebx)
_('cmp edx, 129600'); Vergleichen von edx
_('ja edxgr') ; Wenn größer dann
_('mov eax, 0') ; eax = 0 --> Farbe 1
_('jmp zufallende'); Das setzen der 1 überspringen, da eax = 0
_('edxgr:') ; Wenns größer ist wird hier weiter gemacht.
_('mov eax, 1') ; eax = 1 --> Farbe 2
_('zufallende:') ; um alles zu beenden.
_('ret ') ; Weiter gehts. eax enthält 0 oder 1, edx enthält die zufallszahl
_('farbe1 dd ?') ; Speicher für Die Farben
_('farbe2 dd ?') ; Speicher für Die Farben
EndFunc
GUIRegisterMsg($WM_NCHITTEST, "WM_NCHITTEST")
OnAutoItExitRegister('_Exit')
;~ Global $3D_Profil = _Create3DProfil_from_PerlinImage($Perlin, $hGUI, $breite*$Stretch, 0, $breite*$Stretch, $hoehe*$Stretch)
[/autoit] [autoit][/autoit] [autoit]#cs _Create3DProfil_from_PerlinImage
Func _Create3DProfil_from_PerlinImage($img, $hGUI, $x, $y, $breite, $hoehe)
Local $b = DllStructGetData($img, 1, 2)
Local $h = DllStructGetData($img, 1, 3)
Local $ptr = DllStructGetData($img, 1, 4)
Local $Struct = DllStructCreate('int['& $b * $h &']', $ptr)
_DrawImageStretch($hDC_Backbuffer, 0, 0, $img, $Stretch)
_DrawImage($hdc_GUI, 0, 0, $Backbuffer)
EmbedGlWindow( $hGUI, $breite,$hoehe,$x,$y)
SetClearColor(1,1,1)
Local $oBalken = ObjectCreate()
Local $col, $high
Local $x1, $y1, $z1, $x2, $y2, $z2
Local $X_Achse = 0, $Y_Achse = 0, $Z_Achse = 0
Local $rot, $blau, $gruen
SetPrint($oBalken)
SetCamera(0, 0, $b*1.3, 0, 0, 0)
For $i = 0 To $b - 1 Step 1
For $o = 0 To $h - 1 Step 1
$col = DllStructGetData($struct, 1, $b * $i + $o + 1);pixelfarbe aus bitmap
$high = Dec(Hex($col, 2)) ;höhe aus farbe
;~ ToolTip($high)
;~ Sleep(100)
Switch $high
Case 0 To 70
$rot = $high/255*2.5
$blau = $high/255*5
$gruen = $high/255*2.5
Case 70 To 160
$rot = $high/255*2
$blau = $high/255*3
$gruen = $high/255*5
Case 160 To 255
$rot = $high/255*5
$blau = $high/255*5
$gruen = $high/255*5
EndSwitch
_CreateCube($oBalken, $i-$b/2, $o-$h/2, 0,1+$i-$b/2, 1+$o-$h/2, $high^0.6, $rot, $gruen, $blau, 255)
;~ _CreateCube($oBalken, -$b + $i, $h, 0,-$b+1 + $i, $h+1, $high, 1, 0, 0, 255)
;~ SceneDraw()
;~ ObjectRotate($oBalken, $Y_Achse, $X_Achse, 0)
Next
Next
;~ $high = 100
[/autoit] [autoit][/autoit] [autoit];~ _CreateCube($oBalken, -$b, $h, 0,-$b+1, $h+1, $high, Random(0, 5), Random(0, 5), Random(0, 5), 255)
[/autoit] [autoit][/autoit] [autoit];~ $high = 150
;~ _CreateCube($oBalken, -$b+1, $h, 0,-$b+2, $h+1, $high, Random(0, 5), Random(0, 5), Random(0, 5), 255)
;~ _CreateCube( $ObjId, $OrX, $OrY, $OrZ, $DeX, $DeY, $DeZ ,$Red, $Green, $Blue, $Alpha, $Tex = "" )
;~ AddCube($oBalken, 1, 1, 100, 3, 6, 0, 1)
while Sleep(10)
SceneDraw()
_DrawImageStretch($hDC_Backbuffer, 0, 0, $img, $Stretch)
_DrawImage($hdc_GUI, 0, 0, $Backbuffer)
;~ $X_Achse += 0.1
;~ $Y_Achse += -0.1
$Z_Achse += 0.1
;~ ToolTip($Y_Achse)
If $Y_Achse < 0 Then $Y_Achse += 360
If $Y_Achse > 360 Then $Y_Achse -= 360
If $X_Achse < 0 Then $X_Achse += 360
If $X_Achse > 360 Then $X_Achse -= 360
If $z_Achse < 0 Then $z_Achse += 360
If $z_Achse > 360 Then $z_Achse -= 360
$Y_Achse = 300
ObjectRotate($oBalken, $Y_Achse, $X_Achse, $Z_Achse)
WEnd
Return _CreateImage($b, $h)
EndFunc
#ce _Create3DProfil_from_PerlinImage
[/autoit] [autoit][/autoit] [autoit]While Sleep(100)
$Seed = Random(0, 50000, 1)
_DrawImageStretch($hDC_Backbuffer, 0, 0, $Perlin, $Stretch)
;~ _DrawImageStretch($hDC_Backbuffer, $Breite * $Stretch, 0, $3D_Profil, $Stretch)
_DrawImageTrans($hDC_Backbuffer, 2*$Stretch, ($Hoehe - DllStructGetData($ImageSchrift_Zeit, 1, 3) - 1)*$Stretch, $ImageSchrift_Zeit, $Stretch)
_DrawImage($hdc_GUI, 0, 0, $Backbuffer)
_DeleteImage($Perlin)
_DeleteImage($ImageSchrift_Zeit)
;~ $hell += 1
If $hell > 255 Then $hell = 0
$Timer = TimerInit()
$Perlin = _CreatePerlin($Breite, $Hoehe, $Tiefe__, $Seed, $hell, $F1, $F2)
$Diff = Int(TimerDiff($Timer))
$ImageSchrift_Zeit = _CreateImageSchrift('Size: ' & $Breite & 'x' & $Hoehe & ' px' & '|Helligkeit: ' & $hell & '|Tiefe: ' & $Tiefe_ & '|Benötigte Zeit: ' & $Diff & ' ms|Pixel pro ms: ' & Round($Breite*$Hoehe/$Diff, 2), 0xFF000000, 4) ; 4px große Schrift
WEnd
Func _Zufall(ByRef $Z) ; Eine Pseudo Zufallszahl wird generiert.
$Z = Mod((7141 * $Z + 54773), 259200)
If $Z < 129600 Then Return 1 ; Nur mit 0 und 1
Return 0
EndFunc ;==>_Zufall
Func _Zufall2(ByRef $Z) ; Eine Pseudo Zufallszahl wird generiert.
$Z = Mod((7141 * $Z + 54773), 259200)
Return $Z / 259200 ; Ein Kommawert zw 0 und 1
EndFunc ;==>_Zufall
Func _CreatePerlin($b, $h, $Tiefe = 15, $Nummer = 1, $Helligkeit = 100, $Farbe1 = 0xFF000000, $Farbe2 = 0xFFFFFFFF)
If $Tiefe < 1 Then $Tiefe = 1
If Int(_Log(_Min($b, $h),2)) - 1 <= Int($Tiefe) Then $Tiefe = Int(_Log(_Min($b, $h),2)) - 1 ;Überprüfung ob die Tiefe möglich ist bei der angegebenen Auflösung
$Tiefe_ = $Tiefe
Local $randx = Int($b/3) ; Ein Rand muss sein, da sonst unten und rechts alles dunkel ist
Local $randy = Int($h/3) ; Und oben und links alles hell. Kommt durch das Vergrößern...
$b += $randx
$h += $randy
Local $img = _CreateImage($b, $h) ;Bild erzeugen Hier liegen die ganzen Verpixelungen
Local $hdc = DllStructGetData($img, 1, 1)
Local $ptr = DllStructGetData($img, 1, 4)
Local $hbmp = DllStructGetData($img, 1, 5)
Local $struct = DllStructCreate('int['& $b * $h &']', $ptr)
Local $ziel = _CreateImage($b, $h) ;Hier wird das Endergebnis zusammengebaut.
Local $hdc_ziel = DllStructGetData($ziel, 1, 1)
Local $tmpImg = _CreateImage($b, $h) ;Hier wird immer jeweils eine Ebene vergrößert.
;~ Local $Mode = 0
$gr = _GDIPlus_GraphicsCreateFromHDC(DllStructGetData($tmpImg, 1, 1))
_GDIPlus_GraphicsSetInterpolationMode($gr, 7)
For $p = 0 To $Tiefe Step 1
_ASM_Verpixelung(DllStructGetPtr($struct), $Nummer, $b, $h, $Farbe1, $Farbe2)
[/autoit] [autoit][/autoit] [autoit];~ Die Asm Func macht folgendes:
;~ - Verpixelung der kompletten Bitmap (bisher wird nicht nur ein Teil verpixelt, sondern alles) - kommt wahrscheinlich auch nicht mehr, da die meiste Ausbremsung durch AutoIt kommt und nicht durch die paar Pixel die zuviel gefüllt werden. (vllt aber doch :P)
;~ - Die Fortlaufende Nummer wird aktualisiert
;~ - Farben werden nun auch beachtet
;~ _Zufall($Nummer)
;~ ToolTip($Nummer)
;~ Sleep(1000)
;~ For $i = 0 To $b / 2 ^ ($Tiefe - $p) - 1 Step 1
;~ For $o = 0 To $h / 2 ^ ($Tiefe - $p) - 1 Step 1
;~ Switch _Zufall($Nummer)
;~ Case 1
;~ DllStructSetData($struct, 1, $Farbe2, $b * $i + $o + 1)
;~ Case 0
;~ DllStructSetData($struct, 1, $Farbe1, $b * $i + $o + 1)
;~ EndSwitch
;~ Next
;~ Next
;~ $Mode = 1
$bm = _GDIPlus_BitmapCreateFromHBITMAP($hbmp)
_GDIPlus_GraphicsDrawImageRectRect($gr, $bm, 0, 0, $b / 2 ^ ($Tiefe - $p), $h / 2 ^ ($Tiefe - $p), 0, 0, $b, $h)
_GDIPlus_BitmapDispose($bm)
_GDI_AlphaBlend($hdc_ziel, 0, 0, $b, $h, DllStructGetData($tmpImg, 1, 1), 0, 0, $b, $h, _GDI_AlphaBlend_GetStruct(255 / 2 ^ $p))
Next
$b -= $randx
$h -= $randy
Local $tmpImg2 = _CreateImage($b, $h) ; Dieses Bild enthält das Endbild.
_WinAPI_BitBlt(DllStructGetData($tmpImg2, 1, 1), 0, 0, $b, $h, $hdc_ziel, $randx/2,$randy/2, $SRCCOPY) ;Es wird der Mittelteil ins Endbild kopiert. Ränder werden so beschnitten.
Switch $Helligkeit
Case 0 To 255/2
_GDIPlus_GraphicsClear($gr, 0xFF000000) ; TmpImg1 wird nicht mehr gebraucht
_GDI_AlphaBlend(DllStructGetData($tmpImg2, 1, 1), 0, 0, $b, $h, DllStructGetData($tmpImg, 1, 1), 0, 0, 10,10, _GDI_AlphaBlend_GetStruct(255-$Helligkeit*2))
Case 255/2 To 255
_GDIPlus_GraphicsClear($gr, 0xFFFFFFFF) ; TmpImg1 wird nicht mehr gebraucht
_GDI_AlphaBlend(DllStructGetData($tmpImg2, 1, 1), 0, 0, $b, $h, DllStructGetData($tmpImg, 1, 1), 0, 0, 10,10, _GDI_AlphaBlend_GetStruct($Helligkeit*2 - 255))
EndSwitch
_GDIPlus_GraphicsDispose($gr)
_DeleteImage($img)
_DeleteImage($tmpImg)
_DeleteImage($ziel)
Return $tmpImg2
EndFunc ;==>_PerlinNoise
Func _GDIPlus_GraphicsSetInterpolationMode($hGraphics, $iInterpolationMode)
Local $aResult = DllCall($ghGDIPDll, "uint", "GdipSetInterpolationMode", "hwnd", $hGraphics, "int", $iInterpolationMode)
If @error Then Return SetError(@error, @extended, False)
$GDIP_STATUS = $aResult[0]
Return $aResult[0] = 0
EndFunc ;==>_GDIPlus_GraphicsSetInterpolationMode
Func _WinAPI_SetStretchBltMode($hDC, $iMode)
[/autoit] [autoit][/autoit] [autoit]Local $Ret = DllCall($h_GDI32_DLL, 'int', 'SetStretchBltMode', 'hwnd', $hDC, 'int', $iMode)
[/autoit] [autoit][/autoit] [autoit]If (@error) Or (Not $Ret[0]) Then
Return SetError(1, 0, 0)
EndIf
Return 1
EndFunc ;==>_WinAPI_SetStretchBltMode
#cs - Alte Perlin Noise Func
[/autoit] [autoit][/autoit] [autoit]Func _PerlinNoise($b, $h, $Tiefe, $Helligkeit, $Nummer, $hGraphics, $hDC_Backbuffer)
If $Tiefe < 1 Then $Tiefe = 1
If Int(_Log(_Min($b, $h),2)) - 1 <= Int($Tiefe) Then $Tiefe = Int(_Log(_Min($b, $h),2)) - 1 ;Überprüfung ob die Tiefe möglich ist bei der angegebenen Auflösung
$Tiefe_ = $Tiefe
;~ $b = Breite
;~ $h = Hoehe
;~ $Tiefe = Anzahl Bilder
;~ $Helligkeit = 0 - 255
Local $img = _CreateImage($b, $h) ;Bild erzeugen
Local $hdc = DllStructGetData($img, 1, 1)
Local $ptr = DllStructGetData($img, 1, 4)
Local $struct = DllStructCreate('int['&$b * $h&']', $ptr)
Local $bmp = _GDIPlus_BitmapCreateFromGraphics($b, $h, $hGraphics)
Local $hBu = _GDIPlus_ImageGetGraphicsContext($bmp)
Local $col
Local $bmp2 = _GDIPlus_BitmapCloneArea($bmp, 0, 0, $b, $h)
Local $bbuffer = _GDIPlus_ImageGetGraphicsContext($bmp2)
Local $hBuffer = _GDIPlus_GraphicsCreateFromHDC($hDC_Backbuffer)
Local $Erhellen = 1, $Verdunkeln = 1
$Helligkeit = _Betrag($Helligkeit)
While $Helligkeit > 2
$Helligkeit -= 1
WEnd
If $Helligkeit < 1 Then
$Verdunkeln = $Helligkeit
$Erhellen = 1
Else
$Erhellen = 1 - ($Helligkeit - 1)
$Verdunkeln = 1
EndIf
Local $px = 0
Local $pxges = 0
For $p = 0 To $Tiefe Step 1 ;p = BildNummern
For $x = 0 To $b / 2 ^ ($Tiefe - $p) Step 1
For $y = 0 To $h / 2 ^ ($Tiefe - $p) Step 1
$pxges += 1
Next
Next
Next
For $p = 0 To $Tiefe Step 1 ;p = BildNummern
For $x = 0 To $b / 2 ^ ($Tiefe - $p) Step 1
For $y = 0 To $h / 2 ^ ($Tiefe - $p) Step 1
Switch _Zufall($Nummer)
Case 0
$col = '0x' & Hex((255 / 2 ^ $p) * $Erhellen, 2) & '000000'
Case 1
$col = '0x' & Hex((255 / 2 ^ $p) * $Verdunkeln, 2) & 'FFFFFF'
EndSwitch
DllCall($ghGDIPDll, 'int', 'GdipBitmapSetPixel', 'hwnd', $bmp, 'int', $x, 'int', $y, 'dword', $col)
Next
Next
_GDIPlus_GraphicsDrawImageRectRect($bbuffer, $bmp, 0, 0, $b / 2 ^ ($Tiefe - $p), $h / 2 ^ ($Tiefe - $p), 0, 0, $b, $h)
Next
Local $_ptr, $_hbmp
Local $_hdc = _CreateNewBmp32($b, $h, $_ptr, $_hbmp)
Local $gra = _GDIPlus_GraphicsCreateFromHDC($_hdc)
_GDIPlus_GraphicsDrawImage($gra, $bmp2, 0, 0)
_GDIPlus_GraphicsDispose($gra)
_GDIPlus_GraphicsDispose($hBu)
_GDIPlus_GraphicsDispose($hBuffer)
_GDIPlus_GraphicsDispose($bbuffer)
_GDIPlus_BitmapDispose($bmp)
_GDIPlus_BitmapDispose($bmp2)
Local $a[3] = [$_hdc, $_hbmp, $_ptr]
Return $a
EndFunc ;==>_PerlinNoise
#ce
[/autoit] [autoit][/autoit] [autoit]#Region - Image UDF (by Mars)
[/autoit] [autoit][/autoit] [autoit]Func _CreateImage($b, $h)
Local $ptr, $hdc, $hbmp
$hdc = _CreateNewBmp32($b, $h, $ptr, $hbmp)
Local $struct = DllStructCreate('int[5]')
DllStructSetData($struct, 1, $hdc, 1)
DllStructSetData($struct, 1, $b, 2)
DllStructSetData($struct, 1, $h, 3)
DllStructSetData($struct, 1, $ptr, 4)
DllStructSetData($struct, 1, $hbmp, 5)
Return $struct
EndFunc ;==>_CreateImage
Func _CreateImageRes($res)
Local $ptr, $hdc, $hbmp, $b, $h
$hdc = getDCfromRes32($res, $ptr, $hbmp, $b, $h)
Local $struct = DllStructCreate('int[5]')
DllStructSetData($struct, 1, $hdc, 1)
DllStructSetData($struct, 1, $b, 2)
DllStructSetData($struct, 1, $h, 3)
DllStructSetData($struct, 1, $ptr, 4)
DllStructSetData($struct, 1, $hbmp, 5)
Return $struct
EndFunc ;==>_CreateImageRes
Func _CreateImageSchrift($String, $Farbe = 0xFFFFFFFF, $Size_ = 5, $abs = 1)
Local $size = _GetSize($String, $Size_, $abs)
Local $b = $size[0]
Local $h = $size[1]
Local $ptr, $hbmp
Local $hdc = _CreateNewBmp32($b, $h, $ptr, $hbmp)
Local $hgr = _GDIPlus_GraphicsCreateFromHDC($hdc)
_GDIPlus_GraphicsClear($hgr, 0x00000000)
_GDIPlus_GraphicsDispose($hgr)
_DrawSchrift($hdc, $String, $Size_, $Farbe, $abs)
Local $struct = DllStructCreate('int[5]')
DllStructSetData($struct, 1, $hdc, 1)
DllStructSetData($struct, 1, $b, 2)
DllStructSetData($struct, 1, $h, 3)
DllStructSetData($struct, 1, $ptr, 4)
DllStructSetData($struct, 1, $hbmp, 5)
Return $struct
EndFunc ;==>_CreateImageSchrift
Func _DrawImage($hdc, $x, $y, $struct, $yoffset = 0)
_WinAPI_BitBlt($hdc, $x, $y + $yoffset, DllStructGetData($struct, 1, 2), DllStructGetData($struct, 1, 3), DllStructGetData($struct, 1, 1), 0, 0, $SRCCOPY)
EndFunc ;==>_DrawImage
Func _DrawImageStretch($hdc, $x, $y, $struct, $Zoom = 1, $yoffset = 0)
_WinAPI_StretchBlt($hdc, $x, $y, DllStructGetData($struct, 1, 2)*$Zoom, DllStructGetData($struct, 1, 3)*$Zoom, DllStructGetData($struct, 1, 1), 0, 0,DllStructGetData($struct, 1, 2), DllStructGetData($struct, 1, 3), $SRCCOPY)
EndFunc
Func _DrawImageTrans($hdc, $x, $y, $struct, $Zoom = 1, $yoffset = 0)
_GDI_AlphaBlend($hdc, $x, $y + $yoffset, DllStructGetData($struct, 1, 2)*$Zoom, DllStructGetData($struct, 1, 3)*$Zoom, DllStructGetData($struct, 1, 1), 0, 0, DllStructGetData($struct, 1, 2), DllStructGetData($struct, 1, 3), $h_AlphaStruct)
EndFunc ;==>_DrawImageTrans
Func _DeleteImage(ByRef $struct)
_Delete_Bitmap32(DllStructGetData($struct, 1, 1), DllStructGetData($struct, 1, 5))
$struct = 0
EndFunc ;==>_DeleteImage
Func _CopyImage($img)
Local $hDC_img = DllStructGetData($img, 1, 1)
Local $b_img = DllStructGetData($img, 1, 2)
Local $h_img = DllStructGetData($img, 1, 3)
Local $ret = _CreateImage($b_img, $h_img)
_DrawImage(DllStructGetData($ret, 1, 1), 0, 0, $img, 0)
Return $ret
EndFunc ;==>_CopyImage
Func _SaveImage($img)
Local $Pfad = FileSaveDialog('BildSpeichern', @ScriptDir, '(*,.png)', Default, Hex(Random(256, 16 ^ 3, 1), 3) & '.png')
If Not StringRight($Pfad, 4) = '.png' Then $Pfad &= '.png'
;~ _GDIPlus_Startup()
Local $bm = _GDIPlus_BitmapCreateFromHBITMAP(DllStructGetData($img, 1, 5))
_GDIPlus_ImageSaveToFile($bm, $Pfad)
_GDIPlus_BitmapDispose($bm)
;~ _GDIPlus_Shutdown()
EndFunc ;==>_Save
#EndRegion - Image UDF (by Mars)
;EndRegion - Image UDF (by Mars)
#Region
[/autoit] [autoit][/autoit] [autoit]Func _Exit()
_GDIPlus_Shutdown()
_WinAPI_ReleaseDC($hGUI, $hdc_GUI)
_DeleteImage($Backbuffer)
_DeleteImage($Perlin)
_DeleteImage($ImageSchrift_Zeit)
;~ _DeleteImage($3D_Profil)
DllClose($h_NTDLL_DLL)
DllClose($h_MSIMG32_DLL)
DllClose($h_GDI32_DLL)
DllClose($h_OLE32_DLL)
DllClose($h_USER32_DLL)
DllClose($h_KERNEL32_DLL)
EndFunc
Func _Log($x, $y) ; Logarithmus zur Basis y
Return Log($x) / Log($y)
EndFunc ;==>Log2
Func _Betrag($a)
If $a > 0 Then Return $a
Return -$a
EndFunc ;==>_Betrag
Func _Min($a, $b)
If $a > $b Then Return $b
Return $a
EndFunc ;==>_Min
Func WM_NCHITTEST($hWnd, $iMsg, $iwParam, $ilParam)
If ($hWnd = $hGUI) And ($iMsg = $WM_NCHITTEST) Then Return $HTCAPTION
EndFunc ;==>WM_NCHITTEST
Func _DrawSchrift($hdc, $String, $px, $Farbe = 0xFFFF0000, $abs = 1)
Local $FontPng = _SchriftRes($px)
Local $Font
Local $ptr, $hbmp, $imgBreite, $imgHoehe
Local $hDC_Font = getDCfromRes32($FontPng, $ptr, $hbmp, $imgBreite, $imgHoehe)
_Farbe($ptr, $Farbe, $imgBreite * $imgHoehe)
Local $l = StringLen($String)
Local $s = ''
Local $x = 0, $y = 0, $nr = 0
For $i = 1 To $l Step 1
$s = StringMid($String, $i, 1)
If $s = '|' Then
$y += $px + $abs
$x = 0
Else
$nr = _GetNr($s)
If $nr <> 36 Then _WinAPI_StretchBlt($hdc, $x, $y, $px, $px, $hDC_Font, $nr * $px, 0, $px, $px, $SRCCOPY)
$x += $px + $abs
EndIf
Next
_Delete_Bitmap32($hDC_Font, $hbmp)
EndFunc ;==>_DrawSchrift
Func _GetSize($a, $px, $abs = 1)
Local $l = StringLen($a)
Local $s = ''
Local $c = 0, $c2 = 0, $c3 = 0
For $i = 1 To $l Step 1
$c += 1
If $c >= $c2 Then $c2 = $c
$s = StringMid($a, $i, 1)
If $s = '|' Then
$c = 0
$c3 += 1
EndIf
Next
Local $ret[2] = [$c2 * ($px + $abs), ($c3 + 1) * ($px + $abs)] ;5px für den Buchstaben und einer für den Abstand, $c3 wird erhöht, da Zeile 0 sonst nicht mitgezählt wird.
Return $ret
EndFunc ;==>_GetSize
Func _GetNr($a) ;Gibt die Nummer des Zeichens aus
Local $b[36 + 23] = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '_', '.', ';', 'ä', 'ö', 'ü', '-', '§', '$', '%', '&', '#', '>', '<', '[', ']', '(', ')', '"', "'", '=', '+', ':']
For $i = 0 To 35 + 23 Step 1
If $a = $b[$i] Then Return $i
Next
Return 36 + 23
EndFunc ;==>_GetNr
Func _Farbe($ptr, $col, $px)
Local $_Struct = DllStructCreate('int[' & $px & ']', $ptr)
For $i = 0 To $px Step 1
If DllStructGetData($_Struct, 1, $i) = 0xFFFFFFFF Then
DllStructSetData($_Struct, 1, $col, $i)
Else
DllStructSetData($_Struct, 1, 0x00000000, $i)
EndIf
Next
EndFunc ;==>_Farbe
Func _SchriftRes($px) ;Enthält die png Bilder der Schriften als Ressourcen.
Switch $px
Case 4
Return '0x89504E470D0A1A0A0000000D49484452000000EC000000040100000000A5BFEE56000000874944415468DE017C0083FF00FEFEFFF9FF98FDFFFFFF99999FEFF8F8FFFF0006660BF996C3BD7EA4F000009989888921A8BD9999C299B693231ACF999B000FF90BF42F3CC3A5A4044000FA89EEBF21E8BB9FAE3296B6FC2C7F393FFD004F996B024F3CC3A5000E00009FFEF8F9F69F9BF8D9F2F6F92FFFF2FF1F1FF449FF0BF996C3BD7E00F440068A47638487EBE40000000049454E44AE426082'
Case 5
Return '0x89504E470D0A1A0A0000000D49484452000001270000000501000000002F321765000000C94944415478DA01BE0041FF00FFFFEFFFF1FFE30DC7FFFFFFF8C6318FFDFFC3F0FFFFF0000A52815FC92AC0EFD7F9440000008C6118423120630AE6318C6048C6B1884410C21F8C6330001FFC4150265F21303A1544F908008DA11F7A1F207D0AD6318FFE48C6AEFFC5F7D3F10FE35000118C5D5F908A1E303A1400038000FC6118427120630ACE3F948248AAB1240500FC311C7F90009F8C4150493F21303A1400F908008FFFEFC3F1FBE3F8C7F0EC7E4F93F127FFFF93FF0FC3FF9091FFC15FA64AC0EFD7F80000002DA25C98C2B780160000000049454E44AE426082'
EndSwitch
EndFunc ;==>_SchriftRes
Func _MemGlobalAlloc($iBytes, $iFlags = 0)
Local $aResult = DllCall($h_KERNEL32_DLL, 'handle', 'GlobalAlloc', 'uint', $iFlags, 'ulong_ptr', $iBytes)
Return $aResult[0]
EndFunc ;==>_MemGlobalAlloc
Func _MemGlobalLock($hMem)
Local $aResult = DllCall($h_KERNEL32_DLL, 'ptr', 'GlobalLock', 'handle', $hMem)
Return $aResult[0]
EndFunc ;==>_MemGlobalLock
Func _MemGlobalUnlock($hMem)
Local $aResult = DllCall($h_KERNEL32_DLL, 'bool', 'GlobalUnlock', 'handle', $hMem)
Return $aResult[0]
EndFunc ;==>_MemGlobalUnlock
Func _IsPressed($a)
Local $b = DllCall($h_USER32_DLL, "short", "GetAsyncKeyState", "int", '0x' & $a)
Return BitAND($b[0], 0x8000) <> 0
EndFunc ;==>_IsPressed
Func _Delete_Bitmap32($hdc, $hbmp)
_WinAPI_DeleteObject($hbmp)
_WinAPI_DeleteDC($hdc)
EndFunc ;==>_Delete_Bitmap32
Func _CreateNewBmp32($iWidth, $iHeight, ByRef $ptr, ByRef $hbmp) ;erstellt leere 32-bit-Bitmap; Rückgabe DC und ptr und handle auf die Bitmapdaten
;by Andy
Local $hcdc = _WinAPI_CreateCompatibleDC(0) ;Desktop-Kompatiblen DeviceContext erstellen lassen
Local $tBMI = DllStructCreate($tagBITMAPINFO) ;Struktur der Bitmapinfo erstellen und Daten eintragen
DllStructSetData($tBMI, "Size", DllStructGetSize($tBMI) - 4);Structgröße abzüglich der Daten für die Palette
DllStructSetData($tBMI, "Width", $iWidth)
DllStructSetData($tBMI, "Height", -$iHeight) ;minus =standard = bottomup
DllStructSetData($tBMI, "Planes", 1)
DllStructSetData($tBMI, "BitCount", 32) ;32 Bit = 4 Bytes => AABBGGRR
Local $adib = DllCall($h_GDI32_DLL, 'ptr', 'CreateDIBSection', 'hwnd', 0, 'ptr', DllStructGetPtr($tBMI), 'uint', $DIB_RGB_COLORS, 'ptr*', 0, 'ptr', 0, 'uint', 0)
$hbmp = $adib[0] ;hbitmap handle auf die Bitmap, auch per GDI+ zu verwenden
$ptr = $adib[4] ;pointer auf den Anfang der Bitmapdaten, vom Assembler verwendet
_WinAPI_SelectObject($hcdc, $hbmp) ;objekt hbitmap in DC
Return $hcdc ;DC der Bitmap zurückgeben
EndFunc ;==>_CreateNewBmp32
Func getDCfromRes32($res, ByRef $ptr, ByRef $hbmp, ByRef $iwidth_file32, ByRef $iheight_file32);Erstellt eine 32-Bit Bitmap von Ressource Daten. + Breite und Höhe werden ermittelt
_GDIPlus_Startup()
Local $hBitmap = Load_BMP_From_Mem($res)
$hbmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
$iwidth_file32 = _GDIPlus_ImageGetWidth($hBitmap)
$iheight_file32 = _GDIPlus_ImageGetHeight($hBitmap)
;by Andy
Local $hcdc = _WinAPI_CreateCompatibleDC(0) ;Desktop-Kompatiblen DeviceContext erstellen lassen
Local $tBMI = DllStructCreate($tagBITMAPINFO) ;Struktur der Bitmapinfo erstellen und Daten eintragen
DllStructSetData($tBMI, "Size", DllStructGetSize($tBMI) - 4);Structgröße abzüglich der Daten für die Palette
DllStructSetData($tBMI, "Width", $iwidth_file32)
DllStructSetData($tBMI, "Height", -$iheight_file32) ;minus =standard = bottomup
DllStructSetData($tBMI, "Planes", 1)
DllStructSetData($tBMI, "BitCount", 32) ;32 Bit = 4 Bytes => AABBGGRR
Local $adib = DllCall($h_GDI32_DLL, 'ptr', 'CreateDIBSection', 'hwnd', 0, 'ptr', DllStructGetPtr($tBMI), 'uint', $DIB_RGB_COLORS, 'ptr*', 0, 'ptr', 0, 'uint', 0)
_WinAPI_SelectObject($hcdc, $adib[0])
; copy the content of the bitmap into the buffer ...
_WinAPI_GetDIBits($hcdc, $hbmp, 0, $iheight_file32, $adib[4], DllStructGetPtr($tBMI), $DIB_RGB_COLORS)
$hbmp = $adib[0] ;hbitmap handle auf die Bitmap, auch per GDI+ zu verwenden
$ptr = $adib[4] ;pointer auf den Anfang der Bitmapdaten, vom Assembler verwendet
;_arraydisplay($adib)
_WinAPI_SelectObject($hcdc, $hbmp) ;objekt hbitmap in DC
Return $hcdc ;DC der Bitmap zurückgeben
EndFunc ;==>getDCfromRes32
Func Load_BMP_From_Mem($pic)
Local $memBitmap, $len, $tMem, $hImage, $hData, $pData, $hStream, $hBitmapFromStream
$memBitmap = Binary($pic)
$len = BinaryLen($memBitmap)
$hData = _MemGlobalAlloc($len, 0x0002)
$pData = _MemGlobalLock($hData)
$tMem = DllStructCreate("byte[" & $len & "]", $pData)
DllStructSetData($tMem, 1, $memBitmap)
_MemGlobalUnlock($hData)
$hStream = _WinAPI_CreateStreamOnHGlobal($pData)
$hBitmapFromStream = _GDIPlus_BitmapCreateFromStream($hStream)
$tMem = ""
Return $hBitmapFromStream
EndFunc ;==>Load_BMP_From_Mem
Func _WinAPI_StretchBlt($hDestDC, $iXDest, $iYDest, $iWidthDest, $iHeightDest, $hSrcDC, $iXSrc, $iYSrc, $iWidthSrc, $iHeightSrc, $iRop)
DllCall('gdi32.dll', 'int', 'StretchBlt', 'hwnd', $hDestDC, 'int', $iXDest, 'int', $iYDest, 'int', $iWidthDest, 'int', $iHeightDest, 'hwnd', $hSrcDC, 'int', $iXSrc, 'int', $iYSrc, 'int', $iWidthSrc, 'int', $iHeightSrc, 'dword', $iRop)
EndFunc ;==>_WinAPI_StretchBlt
Func _GDI_AlphaBlend_GetStruct($Alpha = 255)
Local $struct = DllStructCreate($tagBLENDFUNCTION)
DllStructSetData($struct, 1, 0) ; 0 = AC_SRC_OVER
DllStructSetData($struct, 2, 0) ; 0 "Must be Zero"
DllStructSetData($struct, 3, $Alpha) ; Alpha fürs ganze Bild
DllStructSetData($struct, 4, 1) ; 1 = Bild enthält einen Alphakanal
Local $data = DllStructCreate("dword", DllStructGetPtr($struct))
$data = DllStructGetData($data, 1)
Return $data
EndFunc ;==>_GDI_AlphaBlend_GetStruct
Func _GDI_AlphaBlend($hDCDest, $nXOriginDest, $nYOriginDest, $nWidthDest, $nHeightDest, $hDCSrc, $nXOriginSrc, $nYOriginSrc, $nWidthSrc, $nHeightSrc, $blendFunction)
DllCall($h_MSIMG32_DLL, 'int', 'AlphaBlend', _
'ptr', $hDCDest, _ ; // handle to destination DC
'int', $nXOriginDest, _ ; // x-coord of upper-left corner
'int', $nYOriginDest, _ ; // y-coord of upper-left corner
'int', $nWidthDest, _ ; // destination width
'int', $nHeightDest, _ ; // destination height
'ptr', $hDCSrc, _ ; // handle to source DC
'int', $nXOriginSrc, _ ; // x-coord of upper-left corner
'int', $nYOriginSrc, _ ; // y-coord of upper-left corner
'int', $nWidthSrc, _ ; // source width
'int', $nHeightSrc, _ ; // source height
'dword', $blendFunction);$blendFunction) ; // alpha-blending function
EndFunc ;==>_GDI_AlphaBlend
Func _WinAPI_CreateStreamOnHGlobal($hGlobal = 0, $fDeleteOnRelease = True)
Local $aResult = DllCall($h_OLE32_DLL, "int", "CreateStreamOnHGlobal", "hwnd", $hGlobal, "int", $fDeleteOnRelease, "ptr*", 0)
Return $aResult[3]
EndFunc ;==>_WinAPI_CreateStreamOnHGlobal
Func _GDIPlus_BitmapCreateFromStream($pStream)
Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromStream", "ptr", $pStream, "int*", 0)
Return $aResult[2]
EndFunc ;==>_GDIPlus_BitmapCreateFromStream
Func _C($a, $b = 0) ;Gibt x/y Koords für ein Fenster damit es zentriert ist.
If $b Then Return @DesktopWidth / 2 - $a / 2 ; Wenn b dann x
Return @DesktopHeight / 2 - $a / 2 ; Sonst y
EndFunc ;==>_C
#EndRegion
[/autoit]Das OpenGl Teil für AutoIt hab ich durch Zufall gefunden.
Hab mich damit noch nie auseinander gesetzt. (kein GDI xD).
Und mit etwas Glück hat das sogar geklappt. Aber ich könnte wetten, dass ich einige grobe Schnitzer drin habe.
Im Prinzip würde ich das viel lieber nur mit GDI-Funcs bauen.
Aber da hab ich das eine 3D beispiel nicht gefunden. (ich suchs nochmal. finde ich bestimmt. weiß eig wos ist^^)
Ich wollte das so aufbauen:
Der Boden wird Gekachelt mit Vierecken. Jede Ecke hat neben x und y Koords die Höhe z der Höhenkarte.
--> Man hat eine Schräglage für jede einzelne Kachel.
--> Man hat (wenn die Kantenlänge n Pixel breit ist) n² Pixel und (n-1)² Kacheln.
--> Man kann JEDE Kachel einzeln mit einer Grafik versehen (Draw Image 4 Points)
--> Am Winkel kann man auch die Beleuchtung festmachen.
Das ist aber ein ganz schön großes Projekt... Das muss ich vertagen (für mich jedenfalls.) hab nicht sooo viel Zeit...
Da bin ich dafür !
Ich vermute allerdings, dass das nicht "mal Eben" machbar ist.
Schon gar keine 3D enigne...
Da müsste man mal bei den 64K Demos gucken wie die Engine gebaut wird... (Und wie man sie anschließend verwendet^^)
Soooooo xD
Andy ich hab die Idee mit den Senkrechten Linien mal aufgegriffen und bissl was Drei Dimensionales gebastelt.
Leider braucht man für den Spaß einen sehr leistungsfähigen Rechner und ein paar Dlls.
Deshalb kommt alles in ein Rar Archiv...
Aber es kommt schon was cooles dabei aus
Dass es am anfang schwarz ist liegt an der Helligkeit.
Die ist zu beginn auf 0 eingestellt und wird mit jedem Bild um 1 erhöht, bis sie schließlich 255 erreicht.
Man kann sie auch einfach auf 100 oder so stellen. Dann hat man beim ersten Bild direkt gute Wolken.
Das mit dem Färben sollte kein Problem darstellen.
Man kann ja als Parameter $Farbe1 und $Farbe2 einbauen. (mach ich gleich mal)
#include <GDIPlus.au3>
[/autoit] [autoit][/autoit] [autoit]Opt('GUICloseOnESC', 0)
Opt('GUIOnEventMode', 0)
;~ Opt('MustDeclareVars', 1)
_GDIPlus_Startup()
[/autoit] [autoit][/autoit] [autoit];################## Hier Parameter bestimmen ###########################
Global $hell = 120 ;Helligkeit des Bildes
Global $Tiefe__ = 15 ;Tiefenwert
Global $Seed = 9 ;Nummer des Bildes
Global $F1 = 0xFF4040A0 ;Farbe 1
Global $F2 = 0xFFFFFFFF ;Farbe 2
Global $Size = 250 ; Welche Breite und Höhe soll das Bild haben ?
Global $Stretch = 2 ;Um welchen Faktor wird das Bild vergrößert ?
;#######################################################################
;~ Global Const $Size = 200
;~ Global Const $Stretch = 2
Global Const $Breite = $Size
Global Const $Hoehe = $Size
Global Const $Titel = 'Perlin'
Global Const $WM_NCHITTEST = 0x0084 ; Fenster "Anfassen"
Global Const $HTCAPTION = 2 ; Fenster "Anfassen"
Global Const $WS_EX_LAYERED = 0x00080000
Global Const $WS_POPUP = 0x80000000
Global Const $SRCCOPY = 0x00CC0020
Global Const $BLACKNESS = 0x00000042
Global Const $DIB_RGB_COLORS = 0 ;Eine Absolut sinnlose Variable die aber immer fehlt.
Global Const $h_NTDLL_DLL = DllOpen('ntdll.dll')
Global Const $h_MSIMG32_DLL = DllOpen('msimg32.dll')
Global Const $h_GDI32_DLL = DllOpen('gdi32.dll')
Global Const $h_OLE32_DLL = DllOpen('ole32.dll')
Global Const $h_USER32_DLL = DllOpen('user32.dll')
Global Const $h_KERNEL32_DLL = DllOpen('kernel32.dll')
Global Const $h_AlphaStruct = _GDI_AlphaBlend_GetStruct()
[/autoit] [autoit][/autoit] [autoit]Global $hGUI = GUICreate($Titel, $Breite * $Stretch, $Hoehe * $Stretch, _C($Breite * $Stretch, 1), _C($Hoehe * $Stretch, 0), $WS_POPUP, $WS_EX_LAYERED)
GUISetBkColor(0xFF0000, $hGUI)
WinSetTrans($hGUI, '', 255)
GUISetOnEvent(-3, '_Exit', $hGUI)
GUISetState(@SW_SHOW, $hGUI)
Global Const $hdc_GUI = _WinAPI_GetDC($hGUI)
[/autoit] [autoit][/autoit] [autoit]Global $Backbuffer = _CreateImage($Breite*$Stretch, $Hoehe*$Stretch)
Global $hDC_Backbuffer = DllStructGetData($Backbuffer, 1, 1)
;~ ;################## Hier Parameter bestimmen ###########################
;~ Global $hell = 120 ;Helligkeit des Bildes
;~ Global $Tiefe__ = 15 ;Tiefenwert
;~ Global $Seed = 9 ;Nummer des Bildes
;~ Global $F1 = 0xFF4040A0 ;Farbe 1
;~ Global $F2 = 0xFFFFFFFF ;Farbe 2
;~ ;#######################################################################
Global $Tiefe_ = 0
Global $Timer = TimerInit()
Global $Perlin = _CreatePerlin($Breite, $Hoehe, $Tiefe__, $Seed, $hell, $F1, $F2)
Global $Diff = Int(TimerDiff($Timer))
Global $ImageSchrift_Zeit = _CreateImageSchrift('Size: ' & $Breite & 'x' & $Hoehe & ' px' & '|Helligkeit: ' & $hell & '|Tiefe: ' & $Tiefe_ & '|Benötigte Zeit: ' & $Diff & ' ms|Pixel pro ms: ' & Round($Breite*$Hoehe/$Diff, 2), 0xFF000000, 4) ; 4px große Schrift
[/autoit] [autoit][/autoit] [autoit]GUIRegisterMsg($WM_NCHITTEST, "WM_NCHITTEST")
OnAutoItExitRegister('_Exit')
While Sleep(100)
$Seed = Random(0, 50000)
_DrawImageStretch($hDC_Backbuffer, 0, 0, $Perlin, $Stretch)
_DrawImageTrans($hDC_Backbuffer, 2*$Stretch, ($Hoehe - DllStructGetData($ImageSchrift_Zeit, 1, 3) - 1)*$Stretch, $ImageSchrift_Zeit, $Stretch)
_DrawImage($hdc_GUI, 0, 0, $Backbuffer)
_DeleteImage($Perlin)
_DeleteImage($ImageSchrift_Zeit)
$hell += 1
If $hell > 255 Then $hell = 0
$Timer = TimerInit()
$Perlin = _CreatePerlin($Breite, $Hoehe, $Tiefe__, $Seed, $hell, $F1, $F2)
$Diff = Int(TimerDiff($Timer))
$ImageSchrift_Zeit = _CreateImageSchrift('Size: ' & $Breite & 'x' & $Hoehe & ' px' & '|Helligkeit: ' & $hell & '|Tiefe: ' & $Tiefe_ & '|Benötigte Zeit: ' & $Diff & ' ms|Pixel pro ms: ' & Round($Breite*$Hoehe/$Diff, 2), 0xFF000000, 4) ; 4px große Schrift
WEnd
Func _Zufall(ByRef $Z) ; Eine Pseudo Zufallszahl wird generiert.
$Z = Mod((7141 * $Z + 54773), 259200)
If $Z < 129600 Then Return 1 ; Nur mit 0 und 1
Return 0
EndFunc ;==>_Zufall
Func _Zufall2(ByRef $Z) ; Eine Pseudo Zufallszahl wird generiert.
$Z = Mod((7141 * $Z + 54773), 259200)
Return $Z / 259200 ; Ein Kommawert zw 0 und 1
EndFunc ;==>_Zufall
Func _CreatePerlin($b, $h, $Tiefe = 15, $Nummer = 1, $Helligkeit = 100, $Farbe1 = 0xFF000000, $Farbe2 = 0xFFFFFFFF)
If $Tiefe < 1 Then $Tiefe = 1
If Int(_Log(_Min($b, $h),2)) - 1 <= Int($Tiefe) Then $Tiefe = Int(_Log(_Min($b, $h),2)) - 1 ;Überprüfung ob die Tiefe möglich ist bei der angegebenen Auflösung
$Tiefe_ = $Tiefe
Local $randx = Int($b/3) ; Ein Rand muss sein, da sonst unten und rechts alles dunkel ist
Local $randy = Int($h/3) ; Und oben und links alles hell. Kommt durch das Vergrößern...
$b += $randx
$h += $randy
Local $img = _CreateImage($b, $h) ;Bild erzeugen Hier liegen die ganzen Verpixelungen
Local $hdc = DllStructGetData($img, 1, 1)
Local $ptr = DllStructGetData($img, 1, 4)
Local $hbmp = DllStructGetData($img, 1, 5)
Local $struct = DllStructCreate('int['& $b * $h &']', $ptr)
Local $ziel = _CreateImage($b, $h) ;Hier wird das Endergebnis zusammengebaut.
Local $hdc_ziel = DllStructGetData($ziel, 1, 1)
Local $tmpImg = _CreateImage($b, $h) ;Hier wird immer jeweils eine Ebene vergrößert.
Local $Mode = 0
$gr = _GDIPlus_GraphicsCreateFromHDC(DllStructGetData($tmpImg, 1, 1))
_GDIPlus_GraphicsSetInterpolationMode($gr, 7)
For $p = 0 To $Tiefe Step 1
For $i = 0 To $b / 2 ^ ($Tiefe - $p) - 1 Step 1
For $o = 0 To $h / 2 ^ ($Tiefe - $p) - 1 Step 1
Switch _Zufall($Nummer)
Case 1
DllStructSetData($struct, 1, $Farbe2, $b * $i + $o + 1)
Case 0
DllStructSetData($struct, 1, $Farbe1, $b * $i + $o + 1)
EndSwitch
Next
Next
$Mode = 1
$bm = _GDIPlus_BitmapCreateFromHBITMAP($hbmp)
_GDIPlus_GraphicsDrawImageRectRect($gr, $bm, 0, 0, $b / 2 ^ ($Tiefe - $p), $h / 2 ^ ($Tiefe - $p), 0, 0, $b, $h)
_GDIPlus_BitmapDispose($bm)
_GDI_AlphaBlend($hdc_ziel, 0, 0, $b, $h, DllStructGetData($tmpImg, 1, 1), 0, 0, $b, $h, _GDI_AlphaBlend_GetStruct(255 / 2 ^ $p))
Next
$b -= $randx
$h -= $randy
Local $tmpImg2 = _CreateImage($b, $h) ; Dieses Bild enthält das Endbild.
_WinAPI_BitBlt(DllStructGetData($tmpImg2, 1, 1), 0, 0, $b, $h, $hdc_ziel, $randx/2,$randy/2, $SRCCOPY) ;Es wird der Mittelteil ins Endbild kopiert. Ränder werden so beschnitten.
Switch $Helligkeit
Case 0 To 255/2
_GDIPlus_GraphicsClear($gr, 0xFF000000) ; TmpImg1 wird nicht mehr gebraucht
_GDI_AlphaBlend(DllStructGetData($tmpImg2, 1, 1), 0, 0, $b, $h, DllStructGetData($tmpImg, 1, 1), 0, 0, 10,10, _GDI_AlphaBlend_GetStruct(255-$Helligkeit*2))
Case 255/2 To 255
_GDIPlus_GraphicsClear($gr, 0xFFFFFFFF) ; TmpImg1 wird nicht mehr gebraucht
_GDI_AlphaBlend(DllStructGetData($tmpImg2, 1, 1), 0, 0, $b, $h, DllStructGetData($tmpImg, 1, 1), 0, 0, 10,10, _GDI_AlphaBlend_GetStruct($Helligkeit*2 - 255))
EndSwitch
_GDIPlus_GraphicsDispose($gr)
_DeleteImage($img)
_DeleteImage($tmpImg)
_DeleteImage($ziel)
Return $tmpImg2
EndFunc ;==>_PerlinNoise
Func _GDIPlus_GraphicsSetInterpolationMode($hGraphics, $iInterpolationMode)
Local $aResult = DllCall($ghGDIPDll, "uint", "GdipSetInterpolationMode", "hwnd", $hGraphics, "int", $iInterpolationMode)
If @error Then Return SetError(@error, @extended, False)
$GDIP_STATUS = $aResult[0]
Return $aResult[0] = 0
EndFunc ;==>_GDIPlus_GraphicsSetInterpolationMode
Func _WinAPI_SetStretchBltMode($hDC, $iMode)
[/autoit] [autoit][/autoit] [autoit]Local $Ret = DllCall($h_GDI32_DLL, 'int', 'SetStretchBltMode', 'hwnd', $hDC, 'int', $iMode)
[/autoit] [autoit][/autoit] [autoit]If (@error) Or (Not $Ret[0]) Then
Return SetError(1, 0, 0)
EndIf
Return 1
EndFunc ;==>_WinAPI_SetStretchBltMode
#cs - Alte Perlin Noise Func
[/autoit] [autoit][/autoit] [autoit]Func _PerlinNoise($b, $h, $Tiefe, $Helligkeit, $Nummer, $hGraphics, $hDC_Backbuffer)
If $Tiefe < 1 Then $Tiefe = 1
If Int(_Log(_Min($b, $h),2)) - 1 <= Int($Tiefe) Then $Tiefe = Int(_Log(_Min($b, $h),2)) - 1 ;Überprüfung ob die Tiefe möglich ist bei der angegebenen Auflösung
$Tiefe_ = $Tiefe
;~ $b = Breite
;~ $h = Hoehe
;~ $Tiefe = Anzahl Bilder
;~ $Helligkeit = 0 - 255
Local $img = _CreateImage($b, $h) ;Bild erzeugen
Local $hdc = DllStructGetData($img, 1, 1)
Local $ptr = DllStructGetData($img, 1, 4)
Local $struct = DllStructCreate('int['&$b * $h&']', $ptr)
Local $bmp = _GDIPlus_BitmapCreateFromGraphics($b, $h, $hGraphics)
Local $hBu = _GDIPlus_ImageGetGraphicsContext($bmp)
Local $col
Local $bmp2 = _GDIPlus_BitmapCloneArea($bmp, 0, 0, $b, $h)
Local $bbuffer = _GDIPlus_ImageGetGraphicsContext($bmp2)
Local $hBuffer = _GDIPlus_GraphicsCreateFromHDC($hDC_Backbuffer)
Local $Erhellen = 1, $Verdunkeln = 1
$Helligkeit = _Betrag($Helligkeit)
While $Helligkeit > 2
$Helligkeit -= 1
WEnd
If $Helligkeit < 1 Then
$Verdunkeln = $Helligkeit
$Erhellen = 1
Else
$Erhellen = 1 - ($Helligkeit - 1)
$Verdunkeln = 1
EndIf
Local $px = 0
Local $pxges = 0
For $p = 0 To $Tiefe Step 1 ;p = BildNummern
For $x = 0 To $b / 2 ^ ($Tiefe - $p) Step 1
For $y = 0 To $h / 2 ^ ($Tiefe - $p) Step 1
$pxges += 1
Next
Next
Next
For $p = 0 To $Tiefe Step 1 ;p = BildNummern
For $x = 0 To $b / 2 ^ ($Tiefe - $p) Step 1
For $y = 0 To $h / 2 ^ ($Tiefe - $p) Step 1
Switch _Zufall($Nummer)
Case 0
$col = '0x' & Hex((255 / 2 ^ $p) * $Erhellen, 2) & '000000'
Case 1
$col = '0x' & Hex((255 / 2 ^ $p) * $Verdunkeln, 2) & 'FFFFFF'
EndSwitch
DllCall($ghGDIPDll, 'int', 'GdipBitmapSetPixel', 'hwnd', $bmp, 'int', $x, 'int', $y, 'dword', $col)
Next
Next
_GDIPlus_GraphicsDrawImageRectRect($bbuffer, $bmp, 0, 0, $b / 2 ^ ($Tiefe - $p), $h / 2 ^ ($Tiefe - $p), 0, 0, $b, $h)
Next
Local $_ptr, $_hbmp
Local $_hdc = _CreateNewBmp32($b, $h, $_ptr, $_hbmp)
Local $gra = _GDIPlus_GraphicsCreateFromHDC($_hdc)
_GDIPlus_GraphicsDrawImage($gra, $bmp2, 0, 0)
_GDIPlus_GraphicsDispose($gra)
_GDIPlus_GraphicsDispose($hBu)
_GDIPlus_GraphicsDispose($hBuffer)
_GDIPlus_GraphicsDispose($bbuffer)
_GDIPlus_BitmapDispose($bmp)
_GDIPlus_BitmapDispose($bmp2)
Local $a[3] = [$_hdc, $_hbmp, $_ptr]
Return $a
EndFunc ;==>_PerlinNoise
#ce
[/autoit] [autoit][/autoit] [autoit]#Region - Image Befehle (by Mars)
[/autoit] [autoit][/autoit] [autoit]Func _CreateImage($b, $h)
Local $ptr, $hdc, $hbmp
$hdc = _CreateNewBmp32($b, $h, $ptr, $hbmp)
Local $struct = DllStructCreate('int[5]')
DllStructSetData($struct, 1, $hdc, 1)
DllStructSetData($struct, 1, $b, 2)
DllStructSetData($struct, 1, $h, 3)
DllStructSetData($struct, 1, $ptr, 4)
DllStructSetData($struct, 1, $hbmp, 5)
Return $struct
EndFunc ;==>_CreateImage
Func _CreateImageRes($res)
Local $ptr, $hdc, $hbmp, $b, $h
$hdc = getDCfromRes32($res, $ptr, $hbmp, $b, $h)
Local $struct = DllStructCreate('int[5]')
DllStructSetData($struct, 1, $hdc, 1)
DllStructSetData($struct, 1, $b, 2)
DllStructSetData($struct, 1, $h, 3)
DllStructSetData($struct, 1, $ptr, 4)
DllStructSetData($struct, 1, $hbmp, 5)
Return $struct
EndFunc ;==>_CreateImageRes
Func _CreateImageSchrift($String, $Farbe = 0xFFFFFFFF, $Size_ = 5, $abs = 1)
Local $size = _GetSize($String, $Size_, $abs)
Local $b = $size[0]
Local $h = $size[1]
Local $ptr, $hbmp
Local $hdc = _CreateNewBmp32($b, $h, $ptr, $hbmp)
Local $hgr = _GDIPlus_GraphicsCreateFromHDC($hdc)
_GDIPlus_GraphicsClear($hgr, 0x00000000)
_GDIPlus_GraphicsDispose($hgr)
_DrawSchrift($hdc, $String, $Size_, $Farbe, $abs)
Local $struct = DllStructCreate('int[5]')
DllStructSetData($struct, 1, $hdc, 1)
DllStructSetData($struct, 1, $b, 2)
DllStructSetData($struct, 1, $h, 3)
DllStructSetData($struct, 1, $ptr, 4)
DllStructSetData($struct, 1, $hbmp, 5)
Return $struct
EndFunc ;==>_CreateImageSchrift
Func _DrawImage($hdc, $x, $y, $struct, $yoffset = 0)
_WinAPI_BitBlt($hdc, $x, $y + $yoffset, DllStructGetData($struct, 1, 2), DllStructGetData($struct, 1, 3), DllStructGetData($struct, 1, 1), 0, 0, $SRCCOPY)
EndFunc ;==>_DrawImage
Func _DrawImageStretch($hdc, $x, $y, $struct, $Zoom = 1, $yoffset = 0)
_WinAPI_StretchBlt($hdc, $x, $y, DllStructGetData($struct, 1, 2)*$Zoom, DllStructGetData($struct, 1, 3)*$Zoom, DllStructGetData($struct, 1, 1), 0, 0,DllStructGetData($struct, 1, 2), DllStructGetData($struct, 1, 3), $SRCCOPY)
EndFunc
Func _DrawImageTrans($hdc, $x, $y, $struct, $Zoom = 1, $yoffset = 0)
_GDI_AlphaBlend($hdc, $x, $y + $yoffset, DllStructGetData($struct, 1, 2)*$Zoom, DllStructGetData($struct, 1, 3)*$Zoom, DllStructGetData($struct, 1, 1), 0, 0, DllStructGetData($struct, 1, 2), DllStructGetData($struct, 1, 3), $h_AlphaStruct)
EndFunc ;==>_DrawImageTrans
Func _DeleteImage(ByRef $struct)
_Delete_Bitmap32(DllStructGetData($struct, 1, 1), DllStructGetData($struct, 1, 5))
$struct = 0
EndFunc ;==>_DeleteImage
Func _CopyImage($img)
Local $hDC_img = DllStructGetData($img, 1, 1)
Local $b_img = DllStructGetData($img, 1, 2)
Local $h_img = DllStructGetData($img, 1, 3)
Local $ret = _CreateImage($b_img, $h_img)
_DrawImage(DllStructGetData($ret, 1, 1), 0, 0, $img, 0)
Return $ret
EndFunc ;==>_CopyImage
Func _SaveImage($img)
Local $Pfad = FileSaveDialog('BildSpeichern', @ScriptDir, '(*,.png)', Default, Hex(Random(256, 16 ^ 3, 1), 3) & '.png')
If Not StringRight($Pfad, 4) = '.png' Then $Pfad &= '.png'
_GDIPlus_Startup()
Local $bm = _GDIPlus_BitmapCreateFromHBITMAP(DllStructGetData($img, 1, 5))
_GDIPlus_ImageSaveToFile($bm, $Pfad)
_GDIPlus_BitmapDispose($bm)
_GDIPlus_Shutdown()
EndFunc ;==>_Save
#EndRegion - Image Befehle (by Mars)
;EndRegion - Image Befehle (by Mars)
#Region
[/autoit] [autoit][/autoit] [autoit]Func _Exit()
_GDIPlus_Shutdown()
_WinAPI_ReleaseDC($hGUI, $hdc_GUI)
_DeleteImage($Backbuffer)
_DeleteImage($Perlin)
_DeleteImage($ImageSchrift_Zeit)
DllClose($h_NTDLL_DLL)
DllClose($h_MSIMG32_DLL)
DllClose($h_GDI32_DLL)
DllClose($h_OLE32_DLL)
DllClose($h_USER32_DLL)
DllClose($h_KERNEL32_DLL)
EndFunc
Func _Log($x, $y) ; Logarithmus zur Basis y
Return Log($x) / Log($y)
EndFunc ;==>Log2
Func _Betrag($a)
If $a > 0 Then Return $a
Return -$a
EndFunc ;==>_Betrag
Func _Min($a, $b)
If $a > $b Then Return $b
Return $a
EndFunc ;==>_Min
Func WM_NCHITTEST($hWnd, $iMsg, $iwParam, $ilParam)
If ($hWnd = $hGUI) And ($iMsg = $WM_NCHITTEST) Then Return $HTCAPTION
EndFunc ;==>WM_NCHITTEST
Func _DrawSchrift($hdc, $String, $px, $Farbe = 0xFFFF0000, $abs = 1)
Local $FontPng = _SchriftRes($px)
Local $Font
Local $ptr, $hbmp, $imgBreite, $imgHoehe
Local $hDC_Font = getDCfromRes32($FontPng, $ptr, $hbmp, $imgBreite, $imgHoehe)
_Farbe($ptr, $Farbe, $imgBreite * $imgHoehe)
Local $l = StringLen($String)
Local $s = ''
Local $x = 0, $y = 0, $nr = 0
For $i = 1 To $l Step 1
$s = StringMid($String, $i, 1)
If $s = '|' Then
$y += $px + $abs
$x = 0
Else
$nr = _GetNr($s)
If $nr <> 36 Then _WinAPI_StretchBlt($hdc, $x, $y, $px, $px, $hDC_Font, $nr * $px, 0, $px, $px, $SRCCOPY)
$x += $px + $abs
EndIf
Next
_Delete_Bitmap32($hDC_Font, $hbmp)
EndFunc ;==>_DrawSchrift
Func _GetSize($a, $px, $abs = 1)
Local $l = StringLen($a)
Local $s = ''
Local $c = 0, $c2 = 0, $c3 = 0
For $i = 1 To $l Step 1
$c += 1
If $c >= $c2 Then $c2 = $c
$s = StringMid($a, $i, 1)
If $s = '|' Then
$c = 0
$c3 += 1
EndIf
Next
Local $ret[2] = [$c2 * ($px + $abs), ($c3 + 1) * ($px + $abs)] ;5px für den Buchstaben und einer für den Abstand, $c3 wird erhöht, da Zeile 0 sonst nicht mitgezählt wird.
Return $ret
EndFunc ;==>_GetSize
Func _GetNr($a) ;Gibt die Nummer des Zeichens aus
Local $b[36 + 23] = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '_', '.', ';', 'ä', 'ö', 'ü', '-', '§', '$', '%', '&', '#', '>', '<', '[', ']', '(', ')', '"', "'", '=', '+', ':']
For $i = 0 To 35 + 23 Step 1
If $a = $b[$i] Then Return $i
Next
Return 36 + 23
EndFunc ;==>_GetNr
Func _Farbe($ptr, $col, $px)
Local $_Struct = DllStructCreate('int[' & $px & ']', $ptr)
For $i = 0 To $px Step 1
If DllStructGetData($_Struct, 1, $i) = 0xFFFFFFFF Then
DllStructSetData($_Struct, 1, $col, $i)
Else
DllStructSetData($_Struct, 1, 0x00000000, $i)
EndIf
Next
EndFunc ;==>_Farbe
Func _SchriftRes($px) ;Enthält die png Bilder der Schriften als Ressourcen.
Switch $px
Case 4
Return '0x89504E470D0A1A0A0000000D49484452000000EC000000040100000000A5BFEE56000000874944415468DE017C0083FF00FEFEFFF9FF98FDFFFFFF99999FEFF8F8FFFF0006660BF996C3BD7EA4F000009989888921A8BD9999C299B693231ACF999B000FF90BF42F3CC3A5A4044000FA89EEBF21E8BB9FAE3296B6FC2C7F393FFD004F996B024F3CC3A5000E00009FFEF8F9F69F9BF8D9F2F6F92FFFF2FF1F1FF449FF0BF996C3BD7E00F440068A47638487EBE40000000049454E44AE426082'
Case 5
Return '0x89504E470D0A1A0A0000000D49484452000001270000000501000000002F321765000000C94944415478DA01BE0041FF00FFFFEFFFF1FFE30DC7FFFFFFF8C6318FFDFFC3F0FFFFF0000A52815FC92AC0EFD7F9440000008C6118423120630AE6318C6048C6B1884410C21F8C6330001FFC4150265F21303A1544F908008DA11F7A1F207D0AD6318FFE48C6AEFFC5F7D3F10FE35000118C5D5F908A1E303A1400038000FC6118427120630ACE3F948248AAB1240500FC311C7F90009F8C4150493F21303A1400F908008FFFEFC3F1FBE3F8C7F0EC7E4F93F127FFFF93FF0FC3FF9091FFC15FA64AC0EFD7F80000002DA25C98C2B780160000000049454E44AE426082'
EndSwitch
EndFunc ;==>_SchriftRes
Func _MemGlobalAlloc($iBytes, $iFlags = 0)
Local $aResult = DllCall($h_KERNEL32_DLL, 'handle', 'GlobalAlloc', 'uint', $iFlags, 'ulong_ptr', $iBytes)
Return $aResult[0]
EndFunc ;==>_MemGlobalAlloc
Func _MemGlobalLock($hMem)
Local $aResult = DllCall($h_KERNEL32_DLL, 'ptr', 'GlobalLock', 'handle', $hMem)
Return $aResult[0]
EndFunc ;==>_MemGlobalLock
Func _MemGlobalUnlock($hMem)
Local $aResult = DllCall($h_KERNEL32_DLL, 'bool', 'GlobalUnlock', 'handle', $hMem)
Return $aResult[0]
EndFunc ;==>_MemGlobalUnlock
Func _IsPressed($a)
Local $b = DllCall($h_USER32_DLL, "short", "GetAsyncKeyState", "int", '0x' & $a)
Return BitAND($b[0], 0x8000) <> 0
EndFunc ;==>_IsPressed
Func _Delete_Bitmap32($hdc, $hbmp)
_WinAPI_DeleteObject($hbmp)
_WinAPI_DeleteDC($hdc)
EndFunc ;==>_Delete_Bitmap32
Func _CreateNewBmp32($iWidth, $iHeight, ByRef $ptr, ByRef $hbmp) ;erstellt leere 32-bit-Bitmap; Rückgabe DC und ptr und handle auf die Bitmapdaten
;by Andy
Local $hcdc = _WinAPI_CreateCompatibleDC(0) ;Desktop-Kompatiblen DeviceContext erstellen lassen
Local $tBMI = DllStructCreate($tagBITMAPINFO) ;Struktur der Bitmapinfo erstellen und Daten eintragen
DllStructSetData($tBMI, "Size", DllStructGetSize($tBMI) - 4);Structgröße abzüglich der Daten für die Palette
DllStructSetData($tBMI, "Width", $iWidth)
DllStructSetData($tBMI, "Height", -$iHeight) ;minus =standard = bottomup
DllStructSetData($tBMI, "Planes", 1)
DllStructSetData($tBMI, "BitCount", 32) ;32 Bit = 4 Bytes => AABBGGRR
Local $adib = DllCall($h_GDI32_DLL, 'ptr', 'CreateDIBSection', 'hwnd', 0, 'ptr', DllStructGetPtr($tBMI), 'uint', $DIB_RGB_COLORS, 'ptr*', 0, 'ptr', 0, 'uint', 0)
$hbmp = $adib[0] ;hbitmap handle auf die Bitmap, auch per GDI+ zu verwenden
$ptr = $adib[4] ;pointer auf den Anfang der Bitmapdaten, vom Assembler verwendet
_WinAPI_SelectObject($hcdc, $hbmp) ;objekt hbitmap in DC
Return $hcdc ;DC der Bitmap zurückgeben
EndFunc ;==>_CreateNewBmp32
Func getDCfromRes32($res, ByRef $ptr, ByRef $hbmp, ByRef $iwidth_file32, ByRef $iheight_file32);Erstellt eine 32-Bit Bitmap von Ressource Daten. + Breite und Höhe werden ermittelt
_GDIPlus_Startup()
Local $hBitmap = Load_BMP_From_Mem($res)
$hbmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
$iwidth_file32 = _GDIPlus_ImageGetWidth($hBitmap)
$iheight_file32 = _GDIPlus_ImageGetHeight($hBitmap)
;by Andy
Local $hcdc = _WinAPI_CreateCompatibleDC(0) ;Desktop-Kompatiblen DeviceContext erstellen lassen
Local $tBMI = DllStructCreate($tagBITMAPINFO) ;Struktur der Bitmapinfo erstellen und Daten eintragen
DllStructSetData($tBMI, "Size", DllStructGetSize($tBMI) - 4);Structgröße abzüglich der Daten für die Palette
DllStructSetData($tBMI, "Width", $iwidth_file32)
DllStructSetData($tBMI, "Height", -$iheight_file32) ;minus =standard = bottomup
DllStructSetData($tBMI, "Planes", 1)
DllStructSetData($tBMI, "BitCount", 32) ;32 Bit = 4 Bytes => AABBGGRR
Local $adib = DllCall($h_GDI32_DLL, 'ptr', 'CreateDIBSection', 'hwnd', 0, 'ptr', DllStructGetPtr($tBMI), 'uint', $DIB_RGB_COLORS, 'ptr*', 0, 'ptr', 0, 'uint', 0)
_WinAPI_SelectObject($hcdc, $adib[0])
; copy the content of the bitmap into the buffer ...
_WinAPI_GetDIBits($hcdc, $hbmp, 0, $iheight_file32, $adib[4], DllStructGetPtr($tBMI), $DIB_RGB_COLORS)
$hbmp = $adib[0] ;hbitmap handle auf die Bitmap, auch per GDI+ zu verwenden
$ptr = $adib[4] ;pointer auf den Anfang der Bitmapdaten, vom Assembler verwendet
;_arraydisplay($adib)
_WinAPI_SelectObject($hcdc, $hbmp) ;objekt hbitmap in DC
Return $hcdc ;DC der Bitmap zurückgeben
EndFunc ;==>getDCfromRes32
Func Load_BMP_From_Mem($pic)
Local $memBitmap, $len, $tMem, $hImage, $hData, $pData, $hStream, $hBitmapFromStream
$memBitmap = Binary($pic)
$len = BinaryLen($memBitmap)
$hData = _MemGlobalAlloc($len, 0x0002)
$pData = _MemGlobalLock($hData)
$tMem = DllStructCreate("byte[" & $len & "]", $pData)
DllStructSetData($tMem, 1, $memBitmap)
_MemGlobalUnlock($hData)
$hStream = _WinAPI_CreateStreamOnHGlobal($pData)
$hBitmapFromStream = _GDIPlus_BitmapCreateFromStream($hStream)
$tMem = ""
Return $hBitmapFromStream
EndFunc ;==>Load_BMP_From_Mem
Func _WinAPI_StretchBlt($hDestDC, $iXDest, $iYDest, $iWidthDest, $iHeightDest, $hSrcDC, $iXSrc, $iYSrc, $iWidthSrc, $iHeightSrc, $iRop)
DllCall('gdi32.dll', 'int', 'StretchBlt', 'hwnd', $hDestDC, 'int', $iXDest, 'int', $iYDest, 'int', $iWidthDest, 'int', $iHeightDest, 'hwnd', $hSrcDC, 'int', $iXSrc, 'int', $iYSrc, 'int', $iWidthSrc, 'int', $iHeightSrc, 'dword', $iRop)
EndFunc ;==>_WinAPI_StretchBlt
Func _GDI_AlphaBlend_GetStruct($Alpha = 255)
Local $struct = DllStructCreate($tagBLENDFUNCTION)
DllStructSetData($struct, 1, 0) ; 0 = AC_SRC_OVER
DllStructSetData($struct, 2, 0) ; 0 "Must be Zero"
DllStructSetData($struct, 3, $Alpha) ; Alpha fürs ganze Bild
DllStructSetData($struct, 4, 1) ; 1 = Bild enthält einen Alphakanal
Local $data = DllStructCreate("dword", DllStructGetPtr($struct))
$data = DllStructGetData($data, 1)
Return $data
EndFunc ;==>_GDI_AlphaBlend_GetStruct
Func _GDI_AlphaBlend($hDCDest, $nXOriginDest, $nYOriginDest, $nWidthDest, $nHeightDest, $hDCSrc, $nXOriginSrc, $nYOriginSrc, $nWidthSrc, $nHeightSrc, $blendFunction)
DllCall($h_MSIMG32_DLL, 'int', 'AlphaBlend', _
'ptr', $hDCDest, _ ; // handle to destination DC
'int', $nXOriginDest, _ ; // x-coord of upper-left corner
'int', $nYOriginDest, _ ; // y-coord of upper-left corner
'int', $nWidthDest, _ ; // destination width
'int', $nHeightDest, _ ; // destination height
'ptr', $hDCSrc, _ ; // handle to source DC
'int', $nXOriginSrc, _ ; // x-coord of upper-left corner
'int', $nYOriginSrc, _ ; // y-coord of upper-left corner
'int', $nWidthSrc, _ ; // source width
'int', $nHeightSrc, _ ; // source height
'dword', $blendFunction);$blendFunction) ; // alpha-blending function
EndFunc ;==>_GDI_AlphaBlend
Func _WinAPI_CreateStreamOnHGlobal($hGlobal = 0, $fDeleteOnRelease = True)
Local $aResult = DllCall($h_OLE32_DLL, "int", "CreateStreamOnHGlobal", "hwnd", $hGlobal, "int", $fDeleteOnRelease, "ptr*", 0)
Return $aResult[3]
EndFunc ;==>_WinAPI_CreateStreamOnHGlobal
Func _GDIPlus_BitmapCreateFromStream($pStream)
Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromStream", "ptr", $pStream, "int*", 0)
Return $aResult[2]
EndFunc ;==>_GDIPlus_BitmapCreateFromStream
Func _C($a, $b = 0) ;Gibt x/y Koords für ein Fenster damit es zentriert ist.
If $b Then Return @DesktopWidth / 2 - $a / 2 ; Wenn b dann x
Return @DesktopHeight / 2 - $a / 2 ; Sonst y
EndFunc ;==>_C
#EndRegion
[/autoit]Soo Fertig !
Jetzt sollte direkt ein Bild zu sehen sein.
Man kann jetzt alles Relevante in den ersten Paar Zeilen Skript einstellen. (dann muss man nicht suchen wo die Variablen sind um was zu verändern.)
Boah.
Da wird einem aber was abverlangt xD
Wenn das teil in AutoIt steht kann man es bestimmt mit einer Dll oder Asm beschleunigen.
Die Grundlagen von asm habe ich mir inzwischen angeeignet. Aber für sowas wirds nicht reichen.
Und C++ (mit DEVC++) kann ich auch nicht soo gut, dass da was rauskommt was wirklich hilft^^
Was aber gehen müsste ist das Pixelfärben für den Generator komplett in asm zu machen.
Das sollte relativ einfach zu machen sein.
Darum muss ich mich aber später kümmern.
Morgen nachmittag --> XXL - Restaurant xD
Danach bin ich wahrscheinlich unfähig still am PC zu sitzen oder nachzudenken xD
lg
Mars(i)
Neue Funktion:
//Edit: Musste ich leider entfernen, da iwo der Speicher nicht wieder freigegeben wurde. --> nach ein paar min hat man eine Ram Überlastung.
//Edit2: Fehler gefunden. ein dc wurde nur freigegeben statt gelöscht.
#include <GDIPlus.au3>
[/autoit] [autoit][/autoit] [autoit]Opt('GUICloseOnESC', 0)
Opt('GUIOnEventMode', 0)
;~ Opt('MustDeclareVars', 1)
_GDIPlus_Startup()
[/autoit] [autoit][/autoit] [autoit]Global Const $Size = 300
Global Const $Stretch = 2
Global Const $Breite = $Size
Global Const $Hoehe = $Size
Global Const $Titel = 'Perlin'
Global Const $WM_NCHITTEST = 0x0084 ; Fenster "Anfassen"
Global Const $HTCAPTION = 2 ; Fenster "Anfassen"
Global Const $WS_EX_LAYERED = 0x00080000
Global Const $WS_POPUP = 0x80000000
Global Const $SRCCOPY = 0x00CC0020
Global Const $BLACKNESS = 0x00000042
Global Const $DIB_RGB_COLORS = 0 ;Eine Absolut sinnlose Variable die aber immer fehlt.
Global Const $h_NTDLL_DLL = DllOpen('ntdll.dll')
Global Const $h_MSIMG32_DLL = DllOpen('msimg32.dll')
Global Const $h_GDI32_DLL = DllOpen('gdi32.dll')
Global Const $h_OLE32_DLL = DllOpen('ole32.dll')
Global Const $h_USER32_DLL = DllOpen('user32.dll')
Global Const $h_KERNEL32_DLL = DllOpen('kernel32.dll')
Global Const $h_AlphaStruct = _GDI_AlphaBlend_GetStruct()
[/autoit] [autoit][/autoit] [autoit]Global $hGUI = GUICreate($Titel, $Breite * $Stretch, $Hoehe * $Stretch, _C($Breite * $Stretch, 1), _C($Hoehe * $Stretch, 0), $WS_POPUP, $WS_EX_LAYERED)
GUISetBkColor(0xFF0000, $hGUI)
WinSetTrans($hGUI, '', 255)
GUISetOnEvent(-3, '_Exit', $hGUI)
GUISetState(@SW_SHOW, $hGUI)
Global Const $hdc_GUI = _WinAPI_GetDC($hGUI)
[/autoit] [autoit][/autoit] [autoit]Global $Backbuffer = _CreateImage($Breite*$Stretch, $Hoehe*$Stretch)
Global $hDC_Backbuffer = DllStructGetData($Backbuffer, 1, 1)
Global $Timer = TimerInit()
Global $hell = 0
Global $Tiefe_ = 0
Global $Perlin = _CreatePerlin($Breite, $Hoehe, 15, 1, $hell)
Global $Diff = Int(TimerDiff($Timer))
Global $ImageSchrift_Zeit = _CreateImageSchrift('Tiefe: ' & $Tiefe_ & '|Benötigte Zeit: ' & $Diff & ' ms|Pixel pro ms: ' & Round($Breite*$Hoehe/$Diff, 2), 0xAABBFFFF, 5) ; 5px große Schrift
[/autoit] [autoit][/autoit] [autoit]GUIRegisterMsg($WM_NCHITTEST, "WM_NCHITTEST")
OnAutoItExitRegister('_Exit')
;~ While 1
[/autoit] [autoit][/autoit] [autoit];~ _DeleteImage($Perlin)
;~ $Perlin = _CreatePerlin(50, 50, 15, 1, $hell)
;~ WEnd
[/autoit] [autoit][/autoit] [autoit]While Sleep(100)
_DrawImageStretch($hDC_Backbuffer, 0, 0, $Perlin, $Stretch)
_DrawImageTrans($hDC_Backbuffer, 2*$Stretch, ($Hoehe - DllStructGetData($ImageSchrift_Zeit, 1, 3) - 1)*$Stretch, $ImageSchrift_Zeit, $Stretch)
_DrawImage($hdc_GUI, 0, 0, $Backbuffer)
_DeleteImage($Perlin)
_DeleteImage($ImageSchrift_Zeit)
$hell += 1
If $hell > 255 Then $hell = 0
$Timer = TimerInit()
$Perlin = _CreatePerlin($Breite, $Hoehe, 15, 1, $hell)
$Diff = Int(TimerDiff($Timer))
$ImageSchrift_Zeit = _CreateImageSchrift('Tiefe: ' & $Tiefe_ & '|Benötigte Zeit: ' & $Diff & ' ms|Pixel pro ms: ' & Round($Breite*$Hoehe/$Diff, 2), 0xAABBFFFF, 5) ; 5px große Schrift
WEnd
[/autoit] [autoit][/autoit] [autoit]Func _Zufall(ByRef $Z) ; Eine Pseudo Zufallszahl wird generiert.
$Z = Mod((7141 * $Z + 54773), 259200)
If $Z < 129600 Then Return 1 ; Nur mit 0 und 1
Return 0
EndFunc ;==>_Zufall
Func _Zufall2(ByRef $Z) ; Eine Pseudo Zufallszahl wird generiert.
$Z = Mod((7141 * $Z + 54773), 259200)
Return $Z / 259200 ; Ein Kommawert zw 0 und 1
EndFunc ;==>_Zufall
Func _CreatePerlin($b, $h, $Tiefe = 15, $Nummer = 1, $Helligkeit = 100)
If $Tiefe < 1 Then $Tiefe = 1
If Int(_Log(_Min($b, $h),2)) - 1 <= Int($Tiefe) Then $Tiefe = Int(_Log(_Min($b, $h),2)) - 1 ;Überprüfung ob die Tiefe möglich ist bei der angegebenen Auflösung
$Tiefe_ = $Tiefe
Local $randx = Int($b/3) ; Ein Rand muss sein, da sonst unten und rechts alles dunkel ist
Local $randy = Int($h/3) ; Und oben und links alles hell. Kommt durch das Vergrößern...
$b += $randx
$h += $randy
Local $img = _CreateImage($b, $h) ;Bild erzeugen Hier liegen die ganzen Verpixelungen
Local $hdc = DllStructGetData($img, 1, 1)
Local $ptr = DllStructGetData($img, 1, 4)
Local $hbmp = DllStructGetData($img, 1, 5)
Local $struct = DllStructCreate('int['& $b * $h &']', $ptr)
Local $ziel = _CreateImage($b, $h) ;Hier wird das Endergebnis zusammengebaut.
Local $hdc_ziel = DllStructGetData($ziel, 1, 1)
Local $tmpImg = _CreateImage($b, $h) ;Hier wird immer jeweils eine Ebene vergrößert.
Local $Mode = 0
$gr = _GDIPlus_GraphicsCreateFromHDC(DllStructGetData($tmpImg, 1, 1))
_GDIPlus_GraphicsSetInterpolationMode($gr, 7)
For $p = 0 To $Tiefe Step 1
For $i = 0 To $b / 2 ^ ($Tiefe - $p) - 1 Step 1
For $o = 0 To $h / 2 ^ ($Tiefe - $p) - 1 Step 1
Switch _Zufall($Nummer)
Case 1
DllStructSetData($struct, 1, 0xFFFFFFFF, $b * $i + $o + 1)
Case 0
DllStructSetData($struct, 1, 0xFF000000, $b * $i + $o + 1)
EndSwitch
Next
Next
$Mode = 1
$bm = _GDIPlus_BitmapCreateFromHBITMAP($hbmp)
_GDIPlus_GraphicsDrawImageRectRect($gr, $bm, 0, 0, $b / 2 ^ ($Tiefe - $p), $h / 2 ^ ($Tiefe - $p), 0, 0, $b, $h)
_GDIPlus_BitmapDispose($bm)
_GDI_AlphaBlend($hdc_ziel, 0, 0, $b, $h, DllStructGetData($tmpImg, 1, 1), 0, 0, $b, $h, _GDI_AlphaBlend_GetStruct(255 / 2 ^ $p))
Next
$b -= $randx
$h -= $randy
Local $tmpImg2 = _CreateImage($b, $h) ; Dieses Bild enthält das Endbild.
_WinAPI_BitBlt(DllStructGetData($tmpImg2, 1, 1), 0, 0, $b, $h, $hdc_ziel, $randx/2,$randy/2, $SRCCOPY) ;Es wird der Mittelteil ins Endbild kopiert. Ränder werden so beschnitten.
Switch $Helligkeit
Case 0 To 255/2
_GDIPlus_GraphicsClear($gr, 0xFF000000) ; TmpImg1 wird nicht mehr gebraucht
_GDI_AlphaBlend(DllStructGetData($tmpImg2, 1, 1), 0, 0, $b, $h, DllStructGetData($tmpImg, 1, 1), 0, 0, 10,10, _GDI_AlphaBlend_GetStruct(255-$Helligkeit*2))
Case 255/2 To 255
_GDIPlus_GraphicsClear($gr, 0xFFFFFFFF) ; TmpImg1 wird nicht mehr gebraucht
_GDI_AlphaBlend(DllStructGetData($tmpImg2, 1, 1), 0, 0, $b, $h, DllStructGetData($tmpImg, 1, 1), 0, 0, 10,10, _GDI_AlphaBlend_GetStruct($Helligkeit*2 - 255))
EndSwitch
_GDIPlus_GraphicsDispose($gr)
_DeleteImage($img)
_DeleteImage($tmpImg)
_DeleteImage($ziel)
Return $tmpImg2
EndFunc ;==>_PerlinNoise
Func _GDIPlus_GraphicsSetInterpolationMode($hGraphics, $iInterpolationMode)
Local $aResult = DllCall($ghGDIPDll, "uint", "GdipSetInterpolationMode", "hwnd", $hGraphics, "int", $iInterpolationMode)
If @error Then Return SetError(@error, @extended, False)
$GDIP_STATUS = $aResult[0]
Return $aResult[0] = 0
EndFunc ;==>_GDIPlus_GraphicsSetInterpolationMode
Func _WinAPI_SetStretchBltMode($hDC, $iMode)
[/autoit] [autoit][/autoit] [autoit]Local $Ret = DllCall($h_GDI32_DLL, 'int', 'SetStretchBltMode', 'hwnd', $hDC, 'int', $iMode)
[/autoit] [autoit][/autoit] [autoit]If (@error) Or (Not $Ret[0]) Then
Return SetError(1, 0, 0)
EndIf
Return 1
EndFunc ;==>_WinAPI_SetStretchBltMode
#cs - Alte Perlin Noise Func
[/autoit] [autoit][/autoit] [autoit]Func _PerlinNoise($b, $h, $Tiefe, $Helligkeit, $Nummer, $hGraphics, $hDC_Backbuffer)
If $Tiefe < 1 Then $Tiefe = 1
If Int(_Log(_Min($b, $h),2)) - 1 <= Int($Tiefe) Then $Tiefe = Int(_Log(_Min($b, $h),2)) - 1 ;Überprüfung ob die Tiefe möglich ist bei der angegebenen Auflösung
$Tiefe_ = $Tiefe
;~ $b = Breite
;~ $h = Hoehe
;~ $Tiefe = Anzahl Bilder
;~ $Helligkeit = 0 - 255
Local $img = _CreateImage($b, $h) ;Bild erzeugen
Local $hdc = DllStructGetData($img, 1, 1)
Local $ptr = DllStructGetData($img, 1, 4)
Local $struct = DllStructCreate('int['&$b * $h&']', $ptr)
Local $bmp = _GDIPlus_BitmapCreateFromGraphics($b, $h, $hGraphics)
Local $hBu = _GDIPlus_ImageGetGraphicsContext($bmp)
Local $col
Local $bmp2 = _GDIPlus_BitmapCloneArea($bmp, 0, 0, $b, $h)
Local $bbuffer = _GDIPlus_ImageGetGraphicsContext($bmp2)
Local $hBuffer = _GDIPlus_GraphicsCreateFromHDC($hDC_Backbuffer)
Local $Erhellen = 1, $Verdunkeln = 1
$Helligkeit = _Betrag($Helligkeit)
While $Helligkeit > 2
$Helligkeit -= 1
WEnd
If $Helligkeit < 1 Then
$Verdunkeln = $Helligkeit
$Erhellen = 1
Else
$Erhellen = 1 - ($Helligkeit - 1)
$Verdunkeln = 1
EndIf
Local $px = 0
Local $pxges = 0
For $p = 0 To $Tiefe Step 1 ;p = BildNummern
For $x = 0 To $b / 2 ^ ($Tiefe - $p) Step 1
For $y = 0 To $h / 2 ^ ($Tiefe - $p) Step 1
$pxges += 1
Next
Next
Next
For $p = 0 To $Tiefe Step 1 ;p = BildNummern
For $x = 0 To $b / 2 ^ ($Tiefe - $p) Step 1
For $y = 0 To $h / 2 ^ ($Tiefe - $p) Step 1
Switch _Zufall($Nummer)
Case 0
$col = '0x' & Hex((255 / 2 ^ $p) * $Erhellen, 2) & '000000'
Case 1
$col = '0x' & Hex((255 / 2 ^ $p) * $Verdunkeln, 2) & 'FFFFFF'
EndSwitch
DllCall($ghGDIPDll, 'int', 'GdipBitmapSetPixel', 'hwnd', $bmp, 'int', $x, 'int', $y, 'dword', $col)
Next
Next
_GDIPlus_GraphicsDrawImageRectRect($bbuffer, $bmp, 0, 0, $b / 2 ^ ($Tiefe - $p), $h / 2 ^ ($Tiefe - $p), 0, 0, $b, $h)
Next
Local $_ptr, $_hbmp
Local $_hdc = _CreateNewBmp32($b, $h, $_ptr, $_hbmp)
Local $gra = _GDIPlus_GraphicsCreateFromHDC($_hdc)
_GDIPlus_GraphicsDrawImage($gra, $bmp2, 0, 0)
_GDIPlus_GraphicsDispose($gra)
_GDIPlus_GraphicsDispose($hBu)
_GDIPlus_GraphicsDispose($hBuffer)
_GDIPlus_GraphicsDispose($bbuffer)
_GDIPlus_BitmapDispose($bmp)
_GDIPlus_BitmapDispose($bmp2)
Local $a[3] = [$_hdc, $_hbmp, $_ptr]
Return $a
EndFunc ;==>_PerlinNoise
#ce
[/autoit] [autoit][/autoit] [autoit]#Region - Image Befehle (by Mars)
[/autoit] [autoit][/autoit] [autoit]Func _CreateImage($b, $h)
Local $ptr, $hdc, $hbmp
$hdc = _CreateNewBmp32($b, $h, $ptr, $hbmp)
Local $struct = DllStructCreate('int[5]')
DllStructSetData($struct, 1, $hdc, 1)
DllStructSetData($struct, 1, $b, 2)
DllStructSetData($struct, 1, $h, 3)
DllStructSetData($struct, 1, $ptr, 4)
DllStructSetData($struct, 1, $hbmp, 5)
Return $struct
EndFunc ;==>_CreateImage
Func _CreateImageRes($res)
Local $ptr, $hdc, $hbmp, $b, $h
$hdc = getDCfromRes32($res, $ptr, $hbmp, $b, $h)
Local $struct = DllStructCreate('int[5]')
DllStructSetData($struct, 1, $hdc, 1)
DllStructSetData($struct, 1, $b, 2)
DllStructSetData($struct, 1, $h, 3)
DllStructSetData($struct, 1, $ptr, 4)
DllStructSetData($struct, 1, $hbmp, 5)
Return $struct
EndFunc ;==>_CreateImageRes
Func _CreateImageSchrift($String, $Farbe = 0xFFFFFFFF, $Size_ = 5, $abs = 1)
Local $size = _GetSize($String, $Size_, $abs)
Local $b = $size[0]
Local $h = $size[1]
Local $ptr, $hbmp
Local $hdc = _CreateNewBmp32($b, $h, $ptr, $hbmp)
Local $hgr = _GDIPlus_GraphicsCreateFromHDC($hdc)
_GDIPlus_GraphicsClear($hgr, 0x00000000)
_GDIPlus_GraphicsDispose($hgr)
_DrawSchrift($hdc, $String, $Size_, $Farbe, $abs)
Local $struct = DllStructCreate('int[5]')
DllStructSetData($struct, 1, $hdc, 1)
DllStructSetData($struct, 1, $b, 2)
DllStructSetData($struct, 1, $h, 3)
DllStructSetData($struct, 1, $ptr, 4)
DllStructSetData($struct, 1, $hbmp, 5)
Return $struct
EndFunc ;==>_CreateImageSchrift
Func _DrawImage($hdc, $x, $y, $struct, $yoffset = 0)
_WinAPI_BitBlt($hdc, $x, $y + $yoffset, DllStructGetData($struct, 1, 2), DllStructGetData($struct, 1, 3), DllStructGetData($struct, 1, 1), 0, 0, $SRCCOPY)
EndFunc ;==>_DrawImage
Func _DrawImageStretch($hdc, $x, $y, $struct, $Zoom = 1, $yoffset = 0)
_WinAPI_StretchBlt($hdc, $x, $y, DllStructGetData($struct, 1, 2)*$Zoom, DllStructGetData($struct, 1, 3)*$Zoom, DllStructGetData($struct, 1, 1), 0, 0,DllStructGetData($struct, 1, 2), DllStructGetData($struct, 1, 3), $SRCCOPY)
EndFunc
Func _DrawImageTrans($hdc, $x, $y, $struct, $Zoom = 1, $yoffset = 0)
_GDI_AlphaBlend($hdc, $x, $y + $yoffset, DllStructGetData($struct, 1, 2)*$Zoom, DllStructGetData($struct, 1, 3)*$Zoom, DllStructGetData($struct, 1, 1), 0, 0, DllStructGetData($struct, 1, 2), DllStructGetData($struct, 1, 3), $h_AlphaStruct)
EndFunc ;==>_DrawImageTrans
Func _DeleteImage(ByRef $struct)
_Delete_Bitmap32(DllStructGetData($struct, 1, 1), DllStructGetData($struct, 1, 5))
$struct = 0
EndFunc ;==>_DeleteImage
Func _CopyImage($img)
Local $hDC_img = DllStructGetData($img, 1, 1)
Local $b_img = DllStructGetData($img, 1, 2)
Local $h_img = DllStructGetData($img, 1, 3)
Local $ret = _CreateImage($b_img, $h_img)
_DrawImage(DllStructGetData($ret, 1, 1), 0, 0, $img, 0)
Return $ret
EndFunc ;==>_CopyImage
#EndRegion - Image Befehle (by Mars)
;EndRegion - Image Befehle (by Mars)
#Region
[/autoit] [autoit][/autoit] [autoit]Func _Exit()
_GDIPlus_Shutdown()
_WinAPI_ReleaseDC($hGUI, $hdc_GUI)
_DeleteImage($Backbuffer)
_DeleteImage($Perlin)
_DeleteImage($ImageSchrift_Zeit)
DllClose($h_NTDLL_DLL)
DllClose($h_MSIMG32_DLL)
DllClose($h_GDI32_DLL)
DllClose($h_OLE32_DLL)
DllClose($h_USER32_DLL)
DllClose($h_KERNEL32_DLL)
EndFunc
Func _Log($x, $y) ; Logarithmus zur Basis y
Return Log($x) / Log($y)
EndFunc ;==>Log2
Func _Betrag($a)
If $a > 0 Then Return $a
Return -$a
EndFunc ;==>_Betrag
Func _Min($a, $b)
If $a > $b Then Return $b
Return $a
EndFunc ;==>_Min
Func WM_NCHITTEST($hWnd, $iMsg, $iwParam, $ilParam)
If ($hWnd = $hGUI) And ($iMsg = $WM_NCHITTEST) Then Return $HTCAPTION
EndFunc ;==>WM_NCHITTEST
Func _DrawSchrift($hdc, $String, $px, $Farbe = 0xFFFF0000, $abs = 1)
Local $FontPng = _SchriftRes($px)
Local $Font
Local $ptr, $hbmp, $imgBreite, $imgHoehe
Local $hDC_Font = getDCfromRes32($FontPng, $ptr, $hbmp, $imgBreite, $imgHoehe)
_Farbe($ptr, $Farbe, $imgBreite * $imgHoehe)
Local $l = StringLen($String)
Local $s = ''
Local $x = 0, $y = 0, $nr = 0
For $i = 1 To $l Step 1
$s = StringMid($String, $i, 1)
If $s = '|' Then
$y += $px + $abs
$x = 0
Else
$nr = _GetNr($s)
If $nr <> 36 Then _WinAPI_StretchBlt($hdc, $x, $y, $px, $px, $hDC_Font, $nr * $px, 0, $px, $px, $SRCCOPY)
$x += $px + $abs
EndIf
Next
_Delete_Bitmap32($hDC_Font, $hbmp)
EndFunc ;==>_DrawSchrift
Func _GetSize($a, $px, $abs = 1)
Local $l = StringLen($a)
Local $s = ''
Local $c = 0, $c2 = 0, $c3 = 0
For $i = 1 To $l Step 1
$c += 1
If $c >= $c2 Then $c2 = $c
$s = StringMid($a, $i, 1)
If $s = '|' Then
$c = 0
$c3 += 1
EndIf
Next
Local $ret[2] = [$c2 * ($px + $abs), ($c3 + 1) * ($px + $abs)] ;5px für den Buchstaben und einer für den Abstand, $c3 wird erhöht, da Zeile 0 sonst nicht mitgezählt wird.
Return $ret
EndFunc ;==>_GetSize
Func _GetNr($a) ;Gibt die Nummer des Zeichens aus
Local $b[36 + 23] = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '_', '.', ';', 'ä', 'ö', 'ü', '-', '§', '$', '%', '&', '#', '>', '<', '[', ']', '(', ')', '"', "'", '=', '+', ':']
For $i = 0 To 35 + 23 Step 1
If $a = $b[$i] Then Return $i
Next
Return 36 + 23
EndFunc ;==>_GetNr
Func _Farbe($ptr, $col, $px)
Local $_Struct = DllStructCreate('int[' & $px & ']', $ptr)
For $i = 0 To $px Step 1
If DllStructGetData($_Struct, 1, $i) = 0xFFFFFFFF Then
DllStructSetData($_Struct, 1, $col, $i)
Else
DllStructSetData($_Struct, 1, 0x00000000, $i)
EndIf
Next
EndFunc ;==>_Farbe
Func _SchriftRes($px) ;Enthält die png Bilder der Schriften als Ressourcen.
Switch $px
Case 4
Return '0x89504E470D0A1A0A0000000D49484452000000EC000000040100000000A5BFEE56000000874944415468DE017C0083FF00FEFEFFF9FF98FDFFFFFF99999FEFF8F8FFFF0006660BF996C3BD7EA4F000009989888921A8BD9999C299B693231ACF999B000FF90BF42F3CC3A5A4044000FA89EEBF21E8BB9FAE3296B6FC2C7F393FFD004F996B024F3CC3A5000E00009FFEF8F9F69F9BF8D9F2F6F92FFFF2FF1F1FF449FF0BF996C3BD7E00F440068A47638487EBE40000000049454E44AE426082'
Case 5
Return '0x89504E470D0A1A0A0000000D49484452000001270000000501000000002F321765000000C94944415478DA01BE0041FF00FFFFEFFFF1FFE30DC7FFFFFFF8C6318FFDFFC3F0FFFFF0000A52815FC92AC0EFD7F9440000008C6118423120630AE6318C6048C6B1884410C21F8C6330001FFC4150265F21303A1544F908008DA11F7A1F207D0AD6318FFE48C6AEFFC5F7D3F10FE35000118C5D5F908A1E303A1400038000FC6118427120630ACE3F948248AAB1240500FC311C7F90009F8C4150493F21303A1400F908008FFFEFC3F1FBE3F8C7F0EC7E4F93F127FFFF93FF0FC3FF9091FFC15FA64AC0EFD7F80000002DA25C98C2B780160000000049454E44AE426082'
EndSwitch
EndFunc ;==>_SchriftRes
Func _MemGlobalAlloc($iBytes, $iFlags = 0)
Local $aResult = DllCall($h_KERNEL32_DLL, 'handle', 'GlobalAlloc', 'uint', $iFlags, 'ulong_ptr', $iBytes)
Return $aResult[0]
EndFunc ;==>_MemGlobalAlloc
Func _MemGlobalLock($hMem)
Local $aResult = DllCall($h_KERNEL32_DLL, 'ptr', 'GlobalLock', 'handle', $hMem)
Return $aResult[0]
EndFunc ;==>_MemGlobalLock
Func _MemGlobalUnlock($hMem)
Local $aResult = DllCall($h_KERNEL32_DLL, 'bool', 'GlobalUnlock', 'handle', $hMem)
Return $aResult[0]
EndFunc ;==>_MemGlobalUnlock
Func _IsPressed($a)
Local $b = DllCall($h_USER32_DLL, "short", "GetAsyncKeyState", "int", '0x' & $a)
Return BitAND($b[0], 0x8000) <> 0
EndFunc ;==>_IsPressed
Func _Delete_Bitmap32($hdc, $hbmp)
_WinAPI_DeleteObject($hbmp)
_WinAPI_DeleteDC($hdc)
EndFunc ;==>_Delete_Bitmap32
Func _CreateNewBmp32($iWidth, $iHeight, ByRef $ptr, ByRef $hbmp) ;erstellt leere 32-bit-Bitmap; Rückgabe DC und ptr und handle auf die Bitmapdaten
;by Andy
Local $hcdc = _WinAPI_CreateCompatibleDC(0) ;Desktop-Kompatiblen DeviceContext erstellen lassen
Local $tBMI = DllStructCreate($tagBITMAPINFO) ;Struktur der Bitmapinfo erstellen und Daten eintragen
DllStructSetData($tBMI, "Size", DllStructGetSize($tBMI) - 4);Structgröße abzüglich der Daten für die Palette
DllStructSetData($tBMI, "Width", $iWidth)
DllStructSetData($tBMI, "Height", -$iHeight) ;minus =standard = bottomup
DllStructSetData($tBMI, "Planes", 1)
DllStructSetData($tBMI, "BitCount", 32) ;32 Bit = 4 Bytes => AABBGGRR
Local $adib = DllCall($h_GDI32_DLL, 'ptr', 'CreateDIBSection', 'hwnd', 0, 'ptr', DllStructGetPtr($tBMI), 'uint', $DIB_RGB_COLORS, 'ptr*', 0, 'ptr', 0, 'uint', 0)
$hbmp = $adib[0] ;hbitmap handle auf die Bitmap, auch per GDI+ zu verwenden
$ptr = $adib[4] ;pointer auf den Anfang der Bitmapdaten, vom Assembler verwendet
_WinAPI_SelectObject($hcdc, $hbmp) ;objekt hbitmap in DC
Return $hcdc ;DC der Bitmap zurückgeben
EndFunc ;==>_CreateNewBmp32
Func getDCfromRes32($res, ByRef $ptr, ByRef $hbmp, ByRef $iwidth_file32, ByRef $iheight_file32);Erstellt eine 32-Bit Bitmap von Ressource Daten. + Breite und Höhe werden ermittelt
_GDIPlus_Startup()
Local $hBitmap = Load_BMP_From_Mem($res)
$hbmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
$iwidth_file32 = _GDIPlus_ImageGetWidth($hBitmap)
$iheight_file32 = _GDIPlus_ImageGetHeight($hBitmap)
;by Andy
Local $hcdc = _WinAPI_CreateCompatibleDC(0) ;Desktop-Kompatiblen DeviceContext erstellen lassen
Local $tBMI = DllStructCreate($tagBITMAPINFO) ;Struktur der Bitmapinfo erstellen und Daten eintragen
DllStructSetData($tBMI, "Size", DllStructGetSize($tBMI) - 4);Structgröße abzüglich der Daten für die Palette
DllStructSetData($tBMI, "Width", $iwidth_file32)
DllStructSetData($tBMI, "Height", -$iheight_file32) ;minus =standard = bottomup
DllStructSetData($tBMI, "Planes", 1)
DllStructSetData($tBMI, "BitCount", 32) ;32 Bit = 4 Bytes => AABBGGRR
Local $adib = DllCall($h_GDI32_DLL, 'ptr', 'CreateDIBSection', 'hwnd', 0, 'ptr', DllStructGetPtr($tBMI), 'uint', $DIB_RGB_COLORS, 'ptr*', 0, 'ptr', 0, 'uint', 0)
_WinAPI_SelectObject($hcdc, $adib[0])
; copy the content of the bitmap into the buffer ...
_WinAPI_GetDIBits($hcdc, $hbmp, 0, $iheight_file32, $adib[4], DllStructGetPtr($tBMI), $DIB_RGB_COLORS)
$hbmp = $adib[0] ;hbitmap handle auf die Bitmap, auch per GDI+ zu verwenden
$ptr = $adib[4] ;pointer auf den Anfang der Bitmapdaten, vom Assembler verwendet
;_arraydisplay($adib)
_WinAPI_SelectObject($hcdc, $hbmp) ;objekt hbitmap in DC
Return $hcdc ;DC der Bitmap zurückgeben
EndFunc ;==>getDCfromRes32
Func Load_BMP_From_Mem($pic)
Local $memBitmap, $len, $tMem, $hImage, $hData, $pData, $hStream, $hBitmapFromStream
$memBitmap = Binary($pic)
$len = BinaryLen($memBitmap)
$hData = _MemGlobalAlloc($len, 0x0002)
$pData = _MemGlobalLock($hData)
$tMem = DllStructCreate("byte[" & $len & "]", $pData)
DllStructSetData($tMem, 1, $memBitmap)
_MemGlobalUnlock($hData)
$hStream = _WinAPI_CreateStreamOnHGlobal($pData)
$hBitmapFromStream = _GDIPlus_BitmapCreateFromStream($hStream)
$tMem = ""
Return $hBitmapFromStream
EndFunc ;==>Load_BMP_From_Mem
Func _WinAPI_StretchBlt($hDestDC, $iXDest, $iYDest, $iWidthDest, $iHeightDest, $hSrcDC, $iXSrc, $iYSrc, $iWidthSrc, $iHeightSrc, $iRop)
DllCall('gdi32.dll', 'int', 'StretchBlt', 'hwnd', $hDestDC, 'int', $iXDest, 'int', $iYDest, 'int', $iWidthDest, 'int', $iHeightDest, 'hwnd', $hSrcDC, 'int', $iXSrc, 'int', $iYSrc, 'int', $iWidthSrc, 'int', $iHeightSrc, 'dword', $iRop)
EndFunc ;==>_WinAPI_StretchBlt
Func _GDI_AlphaBlend_GetStruct($Alpha = 255)
Local $struct = DllStructCreate($tagBLENDFUNCTION)
DllStructSetData($struct, 1, 0) ; 0 = AC_SRC_OVER
DllStructSetData($struct, 2, 0) ; 0 "Must be Zero"
DllStructSetData($struct, 3, $Alpha) ; Alpha fürs ganze Bild
DllStructSetData($struct, 4, 1) ; 1 = Bild enthält einen Alphakanal
Local $data = DllStructCreate("dword", DllStructGetPtr($struct))
$data = DllStructGetData($data, 1)
Return $data
EndFunc ;==>_GDI_AlphaBlend_GetStruct
Func _GDI_AlphaBlend($hDCDest, $nXOriginDest, $nYOriginDest, $nWidthDest, $nHeightDest, $hDCSrc, $nXOriginSrc, $nYOriginSrc, $nWidthSrc, $nHeightSrc, $blendFunction)
DllCall($h_MSIMG32_DLL, 'int', 'AlphaBlend', _
'ptr', $hDCDest, _ ; // handle to destination DC
'int', $nXOriginDest, _ ; // x-coord of upper-left corner
'int', $nYOriginDest, _ ; // y-coord of upper-left corner
'int', $nWidthDest, _ ; // destination width
'int', $nHeightDest, _ ; // destination height
'ptr', $hDCSrc, _ ; // handle to source DC
'int', $nXOriginSrc, _ ; // x-coord of upper-left corner
'int', $nYOriginSrc, _ ; // y-coord of upper-left corner
'int', $nWidthSrc, _ ; // source width
'int', $nHeightSrc, _ ; // source height
'dword', $blendFunction);$blendFunction) ; // alpha-blending function
EndFunc ;==>_GDI_AlphaBlend
Func _WinAPI_CreateStreamOnHGlobal($hGlobal = 0, $fDeleteOnRelease = True)
Local $aResult = DllCall($h_OLE32_DLL, "int", "CreateStreamOnHGlobal", "hwnd", $hGlobal, "int", $fDeleteOnRelease, "ptr*", 0)
Return $aResult[3]
EndFunc ;==>_WinAPI_CreateStreamOnHGlobal
Func _GDIPlus_BitmapCreateFromStream($pStream)
Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromStream", "ptr", $pStream, "int*", 0)
Return $aResult[2]
EndFunc ;==>_GDIPlus_BitmapCreateFromStream
Func _C($a, $b = 0) ;Gibt x/y Koords für ein Fenster damit es zentriert ist.
If $b Then Return @DesktopWidth / 2 - $a / 2 ; Wenn b dann x
Return @DesktopHeight / 2 - $a / 2 ; Sonst y
EndFunc ;==>_C
#EndRegion
[/autoit]Arbeitet nun auch korrekt mit Helligkeiten.
Man hat 255 Abstufungen. von 0 = Schwarz bis 255 = weiß.
Da ich leider keine Ordentliche Interpolation per StretchBlt hinbekomme
( _WinAPI_SetStretchBltMode kann _GDIPlus_GraphicsSetInterpolationMode iwie nicht ersetzen)
ist das Ganze leider etwas ausgebremst.
Zudem macht das Vergrößern immer nur nach rechts unten vergrößern und die obere Linke Ecke bleibt gleich.
Dadurch muss man einen Rand verwenden der 1/3 der Bildbreite ausmacht. (also 1/6 an jeder seite) und den später abschneiden.
Auch das verlangsamt natürlich alles noch einmal.
Im Endeffekt kommt man aber auch annehmbare Zeiten:
200x200 - 950 ms - 42px/ms
400x400 - 3.820ms - 41.5px/ms
600x600 - 8.454ms - 42.58px/ms
Bei mir passiert nix, wenn ich das Skript ausführe.
Deshalb kann ichs auch nicht bearbeiten, dass es richtig Funktioniert.
Wenn du Volle Transparenz haben willst musst du AlphaBlend nutzen.
[autoit]Func _GDI_AlphaBlend_GetStruct($Alpha = 255)
Local $struct = DllStructCreate($tagBLENDFUNCTION)
DllStructSetData($struct, 1, 0) ; 0 = AC_SRC_OVER
DllStructSetData($struct, 2, 0) ; 0 "Must be Zero"
DllStructSetData($struct, 3, $Alpha) ; Alpha fürs ganze Bild
DllStructSetData($struct, 4, 1) ; 1 = Bild enthält einen Alphakanal
Local $data = DllStructCreate("dword", DllStructGetPtr($struct))
$data = DllStructGetData($data, 1)
Return $data
EndFunc ;==>_GDI_AlphaBlend_GetStruct
Func _GDI_AlphaBlend($hDCDest, $nXOriginDest, $nYOriginDest, $nWidthDest, $nHeightDest, $hDCSrc, $nXOriginSrc, $nYOriginSrc, $nWidthSrc, $nHeightSrc, $blendFunction)
DllCall($h_MSIMG32_DLL, 'int', 'AlphaBlend', _
'ptr', $hDCDest, _ ; // handle to destination DC
'int', $nXOriginDest, _ ; // x-coord of upper-left corner
'int', $nYOriginDest, _ ; // y-coord of upper-left corner
'int', $nWidthDest, _ ; // destination width
'int', $nHeightDest, _ ; // destination height
'ptr', $hDCSrc, _ ; // handle to source DC
'int', $nXOriginSrc, _ ; // x-coord of upper-left corner
'int', $nYOriginSrc, _ ; // y-coord of upper-left corner
'int', $nWidthSrc, _ ; // source width
'int', $nHeightSrc, _ ; // source height
'dword', $blendFunction);$blendFunction) ; // alpha-blending function
EndFunc ;==>_GDI_AlphaBlend
die Blend Func als Eingabewert ist der Rückgabewert der GetStruct func.
lg
Mars(i)
Die GDIPlus Funktionen sind in der Beziehung Dumm.
Benutze einfach BitBlt mit hdc´s
Dann machst du 2 Backbuffer.
Den untersten versiehst du z.B. mit einem Bild und den Oberen zeichnest du drüber.
Den oberen kannst du Transparent machen mit GraphicsClear. (Also wenn man die Graphic geholt hat vom hdc)
Wenns nicht geht etwas rumprobieren.
Das problem taucht immer wieder auf.^^
Ich hab jetzt keine Lust mehr ein Funktionierendes Beispiel zu machen.
Wenn morgen nachmittag keine Lösung da ist mach ichs vllt wenn ich daran denke.
lg