1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. eukalyptus

Beiträge von eukalyptus

  • _BASS_EXT_ChannelGetFFT Werte auslesen

    • eukalyptus
    • 20. April 2013 um 12:53

    Die Werte liegen zwischen 0 und 1

    Das menschliche Gehör arbeitet logarithmisch.
    Deshalb sollte man erstens die Werte noch via _BASS_EXT_Level2dB umwandeln.

    Und zweitens die Frequenzbänder "anpassen"
    Ich hab mal versucht das hier zu erklären: FFT Bass.dll kleiner Lehrgang

    Spoiler anzeigen
    [autoit]

    #AutoIt3Wrapper_UseX64=n
    #include "Bass.au3"
    #include "BassExt.au3"

    [/autoit] [autoit][/autoit] [autoit]

    Opt("GUIOnEventMode", 1)

    [/autoit] [autoit][/autoit] [autoit]

    Global $sFile = FileOpenDialog("Open...", "", "playable formats (*.MP3;*.MP2;*.MP1;*.OGG;*.WAV;*.AIFF;*.AIF)")

    [/autoit] [autoit][/autoit] [autoit]

    Global $hGui = GUICreate("FFT", 1034, 220)
    GUISetOnEvent(-3, "_EXIT")
    Global $cDummy_1 = GUICtrlCreateDummy()
    For $i = 1 To 128
    GUICtrlCreateProgress(($i - 1) * 8 + 5, 10, 7, 100, 5)
    Next
    Global $cDummy_2 = GUICtrlCreateDummy()
    For $i = 1 To 128
    GUICtrlCreateProgress(($i - 1) * 8 + 5, 115, 7, 100, 5)
    Next
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    _BASS_Startup()
    _BASS_Init(0, -1, 44100, 0, "")

    [/autoit] [autoit][/autoit] [autoit]

    Global $hStream = _BASS_StreamCreateFile(False, $sFile, 0, 0, $BASS_SAMPLE_FLOAT)

    [/autoit] [autoit][/autoit] [autoit]

    Global $tFFT = DllStructCreate("float[128];")
    Global $pFFT = DllStructGetPtr($tFFT)
    Global $fdB, $adB_1[129], $adB_2[129], $iIdx

    [/autoit] [autoit][/autoit] [autoit]

    _BASS_ChannelPlay($hStream, True)

    [/autoit] [autoit][/autoit] [autoit]

    Global $iTimer = TimerInit()
    While _BASS_ChannelIsActive($hStream)
    If TimerDiff($iTimer) > 25 Then
    $iTimer = TimerInit()
    _BASS_ChannelGetData($hStream, $pFFT, $BASS_DATA_FFT256)

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To 128
    $fdB = _BASS_EXT_Level2dB(DllStructGetData($tFFT, 1, $i)) * 100
    If $fdB > $adB_1[$i] Then $adB_1[$i] = $fdB
    GUICtrlSetData($cDummy_1 + $i, $adB_1[$i])
    $adB_1[$i] -= 4

    [/autoit] [autoit][/autoit] [autoit]

    $iIdx = Round(10 ^ ($i * (Log(128) / Log(10)) / 128))
    $fdB = _BASS_EXT_Level2dB(DllStructGetData($tFFT, 1, $iIdx)) * 100
    If $fdB > $adB_2[$i] Then $adB_2[$i] = $fdB
    GUICtrlSetData($cDummy_2 + $i, $adB_2[$i])
    $adB_2[$i] -= 4
    Next

    [/autoit] [autoit][/autoit] [autoit]

    EndIf
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    _Exit()

    [/autoit] [autoit][/autoit] [autoit]

    Func _Exit()
    _BASS_StreamFree($hStream)
    _BASS_Free()
    Exit
    EndFunc ;==>_Exit

    [/autoit]

    E

  • _BASS_EXT_ChannelGetFFT Werte auslesen

    • eukalyptus
    • 18. April 2013 um 21:29

    Die Daten erhälst du via _BASS_ChannelGetData mit dem entsprechenden Parameter wie etwa: $BASS_DATA_FFT1024.

    Im Forum findest du ein paar Beispiele, z.B.: Visualizer - gesammtes Spektrum

    E

  • Über die String-Dekompression

    • eukalyptus
    • 17. April 2013 um 08:06

    Hi

    Da meine ersten Tests vielversprechend aussahen, hab ich auch eine Funktion geschieben, um Binäre Daten als String zu komprimieren.
    Das Endergebnis ist dann doch nicht ganz so rosig, wie ich am anfang dachte ^^

    AutoIt3.exe kann ich auf gut 48 % zusammenschrumpfen.
    Das ist nicht wirklich viel mehr Kompression, als etwa Andys AutoItOnly Version.

    Bei Daten, wo viele gleiche Wiederholungen auftreten (etwa Bitmaps mit großen einfärbigen Flächen), steigt die Kompressionsrate aber enorm.
    Das Array 10000 mal 0xFF112233 schrumpft so auf 0.04%
    Zugegeben, solche Daten kommen eher selten vor :D

    Und Bitmaps mit großen einfäbigen Flächen sollte man dann doch zuerst als Jpg speichern und dann erst komprimieren...

    Nun ja, vielleicht findet ja trotzdem jemand Verwendung dafür...

    Spoiler anzeigen
    [autoit]

    ;#include "ASM.au3"

    [/autoit] [autoit][/autoit] [autoit]

    ;$hFile = FileOpen(@AutoItExe, 16)
    ;$bData = FileRead($hFile)
    ;FileClose($hFile)

    [/autoit] [autoit][/autoit] [autoit]

    ;#cs
    $iMax = 10000
    $tData = DllStructCreate("uint[" & $iMax & "];")
    For $i = 1 To $iMax
    ;DllStructSetData($tData, 1, Random(0, 0xFF, 1), $i)
    DllStructSetData($tData, 1, 0xFF112233, $i)
    Next
    $tByte = DllStructCreate("byte[" & DllStructGetSize($tData) & "];", DllStructGetPtr($tData))
    $bData = DllStructGetData($tByte, 1)
    #ce

    [/autoit] [autoit][/autoit] [autoit]

    $sComp = _Comp($bData)
    $sConst = _CreateConst($sComp)
    ClipPut($sConst)

    [/autoit] [autoit][/autoit] [autoit]

    ConsoleWrite(@CRLF)
    ConsoleWrite("> Data: " & StringLen($bData) & " " & StringLeft($bData, 1000) & @CRLF)
    ConsoleWrite("> Comp: " & StringLen($sComp) & " " & StringLeft($sComp, 1000) & @CRLF)
    ConsoleWrite(@CRLF)
    ConsoleWrite("! Comp Rate: " & StringFormat("%.2f", StringLen($sComp) * 100 / StringLen($bData)) & " %" & @CRLF)
    ConsoleWrite(@CRLF)
    $bDeComp = _DeComp($sComp)

    [/autoit] [autoit][/autoit] [autoit]

    _Compare($bData, $bDeComp, "Result")
    ConsoleWrite(@CRLF)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _DeComp($sComp)
    Local $t_ASM_DeCompPrepare = DllStructCreate("byte[138];")
    DllStructSetData($t_ASM_DeCompPrepare, 1, "0x8B7424048B7C2408668B063C21762B3C4372182C4388C4C0EC04240F6605333366890783C70283C601EBDD6605101066890783C70283C602EBCE83C601B8000000008A2E80FD007440BA00000000B1000FB65E0180FB32771480FB23720F83C60180EB23D3E380C10409DAEBE383C60180FD52770A83C00183EA017FF8EBC383C00283EA017FF8EBB9C3")
    Local $t_ASM_DeCompPMut = DllStructCreate("byte[109];")
    DllStructSetData($t_ASM_DeCompPMut, 1, "0x8B7424048B7C24088B54240C8A0683C6013C217602EBF58A2E80FD00744EBB00000000B1000FB646013C3277123C23720E83C6012C23D3E080C10409C3EBE683C60180FD52770C882F83C70183EB017FF6EBC480ED530FB6C5D1E0668B0C0266890F83C70283EB017FF5EBABC3")
    Local $t_ASM_DeCompBufCalcSize = DllStructCreate("byte[66];")
    DllStructSetData($t_ASM_DeCompBufCalcSize, 1, "0x8B742404B800000000668B1E83C60280FB00742D80FF00742880FB42770A80FF42771483C001EBE180FF42770A0FB6D780EA3301D0EBD20FB6D780EA4301D0EBC8C3")
    Local $t_ASM_DeCompBuf = DllStructCreate("byte[182];")
    DllStructSetData($t_ASM_DeCompBuf, 1, "0x8B7424048B7C24088B54240C660FEFDB668B0683C6023C000F84970000003C42770E80FC437220662D13436689C1EB2B80FC437209662D43436689C1EB1D662D33336689C1EB14662D3333C0E40408E00FB6C0660F6EE0B501EB090FB6D9F30F6F641A01F30F7F270FB6C501C78A0200E83C3076282C300FB6C0F30F6F7C0201F30F6F740211F30F6F6C0221F30F7F7A01F30F7F7211F30F7F6A2128020FB602F30F7F64020100E8F30F7F5C0201002AE95BFFFFFFC3")

    [/autoit] [autoit][/autoit] [autoit]

    If Not StringRegExp($sComp, "[\x{0023}-\x{FFFF}]*\x{0021}[\x{0023}-\x{FFFF}]{2,}") Then Return SetError(1, 1, False)
    Local $iLen = StringLen($sComp)
    Local $tComp = DllStructCreate("char[" & $iLen + 1 & "]")
    Local $pComp = DllStructGetPtr($tComp)
    DllStructSetData($tComp, 1, $sComp)

    [/autoit] [autoit][/autoit] [autoit]

    Local $tPMut = DllStructCreate("word[173];")
    Local $pPMut = DllStructGetPtr($tPMut)

    [/autoit] [autoit][/autoit] [autoit]

    Local $aRet = DllCall("user32.dll", "uint", "CallWindowProcW", "ptr", DllStructGetPtr($t_ASM_DeCompPrepare), "ptr", $pComp, "ptr", $pPMut, "int", 0, "int", 0)
    If @error Or Not IsArray($aRet) Then Return SetError(1, 2, False)
    Local $iSize = $aRet[0]

    [/autoit] [autoit][/autoit] [autoit]

    Local $tCompBuf = DllStructCreate("byte[" & $iSize & "]; byte[16];")
    Local $pCompBuf = DllStructGetPtr($tCompBuf)

    [/autoit] [autoit][/autoit] [autoit]

    DllCall("user32.dll", "none", "CallWindowProcW", "ptr", DllStructGetPtr($t_ASM_DeCompPMut), "ptr", $pComp, "ptr", $pCompBuf, "ptr", $pPMut, "int", 0)

    [/autoit] [autoit][/autoit] [autoit]

    $aRet = DllCall("user32.dll", "uint", "CallWindowProcW", "ptr", DllStructGetPtr($t_ASM_DeCompBufCalcSize), "ptr", $pCompBuf, "int", 0, "int", 0, "int", 0)
    If @error Or Not IsArray($aRet) Then Return SetError(1, 3, False)
    $iSize = $aRet[0]

    [/autoit] [autoit][/autoit] [autoit]

    Local $tDeComp = DllStructCreate("byte[" & $iSize & "]; byte[16];")
    Local $pDeComp = DllStructGetPtr($tDeComp)

    [/autoit] [autoit][/autoit] [autoit]

    Local $tBuf = DllStructCreate("byte[65];");[1]BufCnt + [16*3]Buffer + [16]Pad
    Local $pBuf = DllStructGetPtr($tBuf)

    [/autoit] [autoit][/autoit] [autoit]

    DllCall("user32.dll", "none", "CallWindowProcW", "ptr", DllStructGetPtr($t_ASM_DeCompBuf), "ptr", $pCompBuf, "ptr", $pDeComp, "ptr", $pBuf, "int", 0)

    [/autoit] [autoit][/autoit] [autoit]

    Return DllStructGetData($tDeComp, 1)
    EndFunc ;==>_DeComp

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Comp($bData)
    Local $t_ASM_CompBuf = DllStructCreate("byte[335];")
    DllStructSetData($t_ASM_CompBuf, 1, "0x8B7424048B7C24088B54240C8B5C2410660F6ECBF30F6F26F30F6F6A01F30F6F7211F30F6F7A21B100660FEFD2660F6FDC660F74DD660FD7C3BB01000000B50085D8740AD1E380C50180FD0F72F2660F7ED338EF7704660F6ED1660F73DD01660F6FC6660F73F80F660FEBE8660F73DE01660F6FC7660F73F80F660FEBF0660F73DF0180C1013A0A72A3660F7ED1660F7ECB0FB6C539D8760288DD80FD02723B80F90F770F6689C86605434366890783C702EB3F80F91F77116689C82C106605433366890783C702EB296689C82C206605334366890783C702EB18660FC5C400B50188C4C0EC04240F6605333366890783C7028A0200E83C3076282C300FB6C0F30F6F7C0201F30F6F740211F30F6F6C0221F30F7F7A01F30F7F7211F30F7F6A2128020FB602F30F7F64020100E8660FEFC0F30F7F440201002A0FB6C501C6660F7ECB29C383FB000F87C2FEFFFFC3")
    Local $t_ASM_Comp = DllStructCreate("byte[411];")
    DllStructSetData($t_ASM_Comp, 1, "0x8B7424048B7C2408B13383C702B53366890F83C70480C50180FD5372F280C10180F95372E88B7C2408668B0683C60180FC007423662D33330FB6DC0FB6D0C1E307C1E20201D3668B0C1F6683F9FF74056683041F01EBD2B900000000BAFE03000089D6C1E6028B04378B5C37046639D87307891C37894437044A39CA7DE34181F9FF03000072D566BB002166B90000668B176683FA027244668B57028B742404B50088CB80C353668B063C00741780FC0074126639D0750866891E83C601B50183C601EBE280FD00740380C101660FB6D566891783C70480F9AD72B366BAFFFF6689178B74240489F78A0683C6013C00740B3C2176F3880783C701EBECC607008B7424088B7C240C668B166683FA007C3D6683FA007432668B560280FA42771E80FE4277196689D0662D3333C0E40408E03CBC77090443880783C701EB0B6681EA101066891783C70283C604EBBAC607218B74240489F7BA010000008A0683C6013A067424880783C70183FA02721589D3C1EA0483E30F83C323881F83C70183FA0075EBBA0000000083C2013C217202EBCA660FEFC0F30F7F07C3")

    [/autoit] [autoit][/autoit] [autoit]

    If StringRegExp($bData, "[^[:xdigit:]xX]") Then Return SetError(1, 1, False)
    Local $iSize = BinaryLen($bData)
    If $iSize < 1 Then Return SetError(1, 2, False)

    [/autoit] [autoit][/autoit] [autoit]

    Local $tData = DllStructCreate("byte Data[" & $iSize & "]; byte[16];")
    Local $pData = DllStructGetPtr($tData)
    DllStructSetData($tData, "Data", $bData)

    [/autoit] [autoit][/autoit] [autoit]

    Local $tComp = DllStructCreate("char[" & $iSize * 2 + 1 & "];")
    Local $pComp = DllStructGetPtr($tComp)

    [/autoit] [autoit][/autoit] [autoit]

    Local $tBuf = DllStructCreate("byte[65];");[1]BufCnt + [16*3]Buffer + [16]Pad
    Local $pBuf = DllStructGetPtr($tBuf)

    [/autoit] [autoit][/autoit] [autoit]

    DllCall("user32.dll", "none", "CallWindowProcW", "ptr", DllStructGetPtr($t_ASM_CompBuf), "ptr", $pData, "ptr", $pComp, "ptr", $pBuf, "uint", $iSize)

    [/autoit] [autoit][/autoit] [autoit]

    Local $tPMut = DllStructCreate("word[2048];");32*32*2
    Local $pPMut = DllStructGetPtr($tPMut)

    [/autoit] [autoit][/autoit] [autoit]

    Local $tDef = DllStructCreate("char[347];");173*2+1
    Local $pDef = DllStructGetPtr($tDef)

    [/autoit] [autoit][/autoit] [autoit]

    DllCall("user32.dll", "none", "CallWindowProcW", "ptr", DllStructGetPtr($t_ASM_Comp), "ptr", $pComp, "ptr", $pPMut, "ptr", $pDef, "int", 0)

    [/autoit] [autoit][/autoit] [autoit]

    Return DllStructGetData($tDef, 1) & DllStructGetData($tComp, 1)
    EndFunc ;==>_Comp

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _CreateConst($sStr, $sName = "sComp")
    Local $sConst = 'Global Const $' & $sName & ' = '
    Local $aRegExp = StringRegExp($sStr, '^.{' & 4085 - StringLen($sConst) & '}|.{4077}|.*$', 3)
    If @error Or Not IsArray($aRegExp) Then Exit
    If Not $aRegExp[UBound($aRegExp) - 1] Then ReDim $aRegExp[UBound($aRegExp) - 1]
    For $i = 0 To UBound($aRegExp) - 1
    Switch $i
    Case UBound($aRegExp) - 1
    $sConst &= '"' & $aRegExp[$i] & '"'
    Case Else
    $sConst &= '"' & $aRegExp[$i] & '" & _' & @CRLF & ' '
    EndSwitch
    Next
    Return $sConst
    EndFunc ;==>_CreateConst

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Compare($bData1, $bData2, $sDesc = "")
    Local $iSize1 = BinaryLen($bData1)
    Local $iSize2 = BinaryLen($bData2)
    Local $iByte1, $iByte2

    [/autoit] [autoit][/autoit] [autoit]

    If (BinaryMid($bData1, 1, $iSize1) = BinaryMid($bData2, 1, $iSize2)) And ($iSize1 = $iSize2) Then
    If $iSize1 > 10000 Then
    ConsoleWrite("+ " & $sDesc & ": " & BinaryMid($bData1, 1, 10000) & @CRLF)
    Else
    ConsoleWrite("+ " & $sDesc & ": " & $bData1 & @CRLF)
    EndIf
    Else
    If $iSize1 > 10000 Then
    ConsoleWrite("! " & $sDesc & ": " & BinaryMid($bData1, 1, 10000) & @CRLF)
    ConsoleWrite("! " & $sDesc & ": " & BinaryMid($bData2, 1, 10000) & @CRLF)
    Else
    ConsoleWrite("! " & $sDesc & ": " & $bData1 & @CRLF)
    ConsoleWrite("! " & $sDesc & ": " & $bData2 & @CRLF)
    EndIf
    ConsoleWrite("! " & $sDesc & " ")
    For $i = 1 To $iSize1
    $iByte1 = BinaryMid($bData1, $i, 1)
    $iByte2 = BinaryMid($bData2, $i, 1)
    If $iByte1 = $iByte2 Then
    ConsoleWrite("__")
    Else
    ConsoleWrite("##")
    ;ExitLoop
    EndIf
    Next
    ConsoleWrite(@CRLF)
    EndIf
    EndFunc ;==>_Compare

    [/autoit]

    E

  • Schnelle Grafikroutinen aus der MSIMG32

    • eukalyptus
    • 17. April 2013 um 06:58

    Diese Funktionen rufen doch einfach die "normalen" GDI-Funktionen auf, somit gibt es keinen Unterschied.
    Außer, dass man noch einen Tick langsamer ist ;)

    Kann aber auch sein, dass ich mich irre und es genau andersrum ist...

  • Code Optimierungsvorschläge

    • eukalyptus
    • 14. März 2013 um 17:04
    Zitat von UEZ

    Da habe ich dich auf was heiß gemacht...

    In der Tat ;)

    Der Zeilenübergreifende Algo war einfacher als erwartet:

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Opt("GUIOnEventMode", 1)
    Opt("MustDeclareVars", 1)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_Startup()

    [/autoit] [autoit][/autoit] [autoit]

    ;Global $hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\30x30.bmp")
    Global $hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\Tussie.png")
    ;Global $hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\earth.bmp")

    [/autoit] [autoit][/autoit] [autoit]

    Global $iImgW = _GDIPlus_ImageGetWidth($hImage)
    Global $iImgH = _GDIPlus_ImageGetHeight($hImage)

    [/autoit] [autoit][/autoit] [autoit]

    Global $fScale = 1.8

    [/autoit] [autoit][/autoit] [autoit]

    Global $iWidth = $iImgW * $fScale
    Global $iHeight = $iImgH * $fScale

    [/autoit] [autoit][/autoit] [autoit]

    Global $hGui = GUICreate("Test", $iWidth, $iHeight)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    Global $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGui)
    Global $hBmpBuffer = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphics)
    Global $hGfxBuffer = _GDIPlus_ImageGetGraphicsContext($hBmpBuffer)
    _GDIPlus_GraphicsSetSmoothingMode($hGfxBuffer, 2)
    DllCall($ghGDIPDll, "uint", "GdipSetInterpolationMode", "hwnd", $hGfxBuffer, "int", 5)
    DllCall($ghGDIPDll, "uint", "GdipSetPixelOffsetMode", "hwnd", $hGfxBuffer, "int", 2)
    _GDIPlus_GraphicsClear($hGfxBuffer, 0xFFFFFFFF)

    [/autoit] [autoit][/autoit] [autoit]

    Global $hPen = _GDIPlus_PenCreate(0xFF00FF00, 1)
    Global $hBrush = _GDIPlus_BrushCreateSolid(0x88FF0000)

    [/autoit] [autoit][/autoit] [autoit]

    GUIRegisterMsg($WM_PAINT, "_WM_PAINT")

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_GraphicsDrawImageRect($hGfxBuffer, $hImage, 0, 0, $iWidth, $iHeight)
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    Global $iTimer = TimerInit()
    Global $hPath = _ScanBMP($hImage, $fScale, 0)
    ConsoleWrite("! " & TimerDiff($iTimer) & @CRLF)
    DllCall($ghGDIPDll, "uint", "GdipFillPath", "hwnd", $hGfxBuffer, "hwnd", $hBrush, "hwnd", $hPath)
    DllCall($ghGDIPDll, "uint", "GdipDrawPath", "hwnd", $hGfxBuffer, "hwnd", $hPen, "hwnd", $hPath)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    DllCall($ghGDIPDll, "uint", "GdipDeletePath", "hwnd", $hPath)
    _GDIPlus_GraphicsDrawImage($hGraphics, $hBmpBuffer, 0, 0)

    [/autoit] [autoit][/autoit] [autoit]

    While Sleep(10)
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _ScanBMP($hBitmap, $fScale = 1, $iMin = 0)
    Local $aPixelFormat = _GDIPlus_ImageGetPixelFormat($hBitmap)
    If $aPixelFormat[0] <> $GDIP_PXF01INDEXED Then Return SetError(1, 1, False)

    [/autoit] [autoit][/autoit] [autoit]

    Local $iBmpW = _GDIPlus_ImageGetWidth($hBitmap)
    Local $iBmpH = _GDIPlus_ImageGetHeight($hBitmap)

    [/autoit] [autoit][/autoit] [autoit]

    Local $tData = _GDIPlus_BitmapLockBits($hBitmap, 0, 0, $iBmpW, $iBmpH, $GDIP_ILMREAD, $GDIP_PXF32ARGB)
    Local $iStride = DllStructGetData($tData, "Stride")
    Local $iWidth = DllStructGetData($tData, "Width")
    Local $iHeight = DllStructGetData($tData, "Height")

    [/autoit] [autoit][/autoit] [autoit]

    Local $tScan0 = DllStructCreate("byte[" & $iWidth * $iHeight * 4 & "];", DllStructGetData($tData, "Scan0"))
    Local $tPixel = DllStructCreate("uint[" & $iWidth * $iHeight & "];")
    Local $tSet = DllStructCreate("byte[" & DllStructGetSize($tPixel) & "];", DllStructGetPtr($tPixel))
    DllStructSetData($tSet, 1, DllStructGetData($tScan0, 1))
    _GDIPlus_BitmapUnlockBits($hBitmap, $tData)

    [/autoit] [autoit][/autoit] [autoit]

    Local $iRect = 0
    Local $tRects = DllStructCreate("uint[" & $iWidth * $iHeight * 4 & "];")

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Local $iOff, $iPos
    Local $iRectX1, $iRectY1, $iRectX2, $iRectY2
    Local $iTmpX1, $iTmpY1, $iTmpX2, $iTmpY2
    For $y = 0 To $iHeight - 1
    $iOff = $y * $iWidth
    For $x = 0 To $iWidth - 1

    [/autoit] [autoit][/autoit] [autoit]

    While DllStructGetData($tPixel, 1, $iOff + $x + 1) = 4278190080

    [/autoit] [autoit][/autoit] [autoit]

    $iPos = $iOff + $x
    $iTmpX1 = 0
    While $x + $iTmpX1 < $iWidth
    $iTmpX1 += 1
    $iPos += 1
    If DllStructGetData($tPixel, 1, $iPos + 1) <> 4278190080 Then
    ExitLoop
    EndIf
    WEnd
    $iTmpX1 = BitShift($iTmpX1, 1)

    [/autoit] [autoit][/autoit] [autoit]

    $iPos = $iOff + $x + $iTmpX1
    $iTmpY1 = 0
    While $y + $iTmpY1 < $iHeight
    $iTmpY1 += 1
    $iPos += $iWidth
    If DllStructGetData($tPixel, 1, $iPos + 1) <> 4278190080 Then
    ExitLoop
    EndIf
    WEnd
    $iTmpY1 = BitShift($iTmpY1, 1)

    [/autoit] [autoit][/autoit] [autoit]

    $iRectX1 = $x + $iTmpX1
    $iRectY1 = $y + $iTmpY1
    $iRectX2 = $iRectX1
    $iRectY2 = $iRectY1

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    $iTmpX1 = $iRectX1
    $iTmpY1 = $iRectY1
    $iTmpX2 = $iRectX2
    $iTmpY2 = $iRectY2

    [/autoit] [autoit][/autoit] [autoit]

    ;Test RectX1 -= 1
    If $iRectX1 > 0 Then
    ;?####
    ;?####
    ;?####
    $iRectX1 -= 1
    $iPos = $iRectY1 * $iWidth + $iRectX1
    For $i = $iRectY1 To $iRectY2
    If DllStructGetData($tPixel, 1, $iPos + 1) <> 4278190080 Then
    $iRectX1 = $iTmpX1
    ExitLoop
    EndIf
    $iPos += $iWidth ;Nächste Zeile
    Next
    EndIf

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;Test RectY1 -= 1
    If $iRectY1 > 0 Then
    ;?????
    ;#####
    ;#####
    $iRectY1 -= 1
    $iPos = $iRectY1 * $iWidth + $iRectX1
    For $i = $iRectX1 To $iRectX2
    If DllStructGetData($tPixel, 1, $iPos + 1) <> 4278190080 Then
    $iRectY1 = $iTmpY1
    ExitLoop
    EndIf
    $iPos += 1 ;Nächster Pixel
    Next
    EndIf

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;Test RectX2 += 1
    If $iRectX2 < $iWidth Then
    ;####?
    ;####?
    ;####?
    $iRectX2 += 1
    $iPos = $iRectY1 * $iWidth + $iRectX2
    For $i = $iRectY1 To $iRectY2
    If DllStructGetData($tPixel, 1, $iPos + 1) <> 4278190080 Then
    $iRectX2 = $iTmpX2
    ExitLoop
    EndIf
    $iPos += $iWidth ;Nächste Zeile
    Next
    EndIf

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;Test RectY2 += 1
    If $iRectY2 < $iHeight Then
    ;#####
    ;#####
    ;?????
    $iRectY2 += 1
    $iPos = $iRectY2 * $iWidth + $iRectX1
    For $i = $iRectX1 To $iRectX2
    If DllStructGetData($tPixel, 1, $iPos + 1) <> 4278190080 Then
    $iRectY2 = $iTmpY2
    ExitLoop
    EndIf
    $iPos += 1 ;Nächster Pixel
    Next
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    If $iRectX1 = $iTmpX1 And $iRectX2 = $iTmpX2 And $iRectY1 = $iTmpY1 And $iRectY2 = $iTmpY2 Then ExitLoop
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    ConsoleWrite("> Rect: " & $iRectX1 & " " & $iRectY1 & " " & $iRectX2 - $iRectX1 + 1 & " " & $iRectY2 - $iRectY1 + 1 & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    For $j = $iRectY1 To $iRectY2
    $iPos = $j * $iWidth
    For $i = $iRectX1 To $iRectX2
    DllStructSetData($tPixel, 1, 0, $iPos + $i + 1)
    Next
    Next

    [/autoit] [autoit][/autoit] [autoit]

    $iTmpX1 = $iRectX2 - $iRectX1 + 1
    $iTmpY1 = $iRectY2 - $iRectY1 + 1
    If $iTmpX1 > $iMin Or $iTmpY1 > $iMin Then
    DllStructSetData($tRects, 1, $iRectX1, $iRect * 4 + 1)
    DllStructSetData($tRects, 1, $iRectY1, $iRect * 4 + 2)
    DllStructSetData($tRects, 1, $iTmpX1, $iRect * 4 + 3)
    DllStructSetData($tRects, 1, $iTmpY1, $iRect * 4 + 4)
    $iRect += 1
    EndIf
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Next
    Next

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreatePath", "int", 0, "int*", 0)
    Local $hPath = $aResult[2]
    $aResult = DllCall($ghGDIPDll, "uint", "GdipAddPathRectanglesI", "hwnd", $hPath, "ptr", DllStructGetPtr($tRects), "int", $iRect)

    [/autoit] [autoit][/autoit] [autoit]

    $aResult = DllCall($ghGDIPDll, "uint", "GdipGetPointCount", "hwnd", $hPath, "int*", 0)
    ConsoleWrite("! Path Pnt: " & $aResult[2] & @CRLF)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Local $hMatrix = _GDIPlus_MatrixCreate()
    _GDIPlus_MatrixScale($hMatrix, $fScale, $fScale)
    DllCall($ghGDIPDll, "uint", "GdipTransformPath", "hwnd", $hPath, "hwnd", $hMatrix)
    _GDIPlus_MatrixDispose($hMatrix)

    [/autoit] [autoit][/autoit] [autoit]

    ConsoleWrite("! iRect: " & $iRect & @CRLF & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    Return $hPath
    EndFunc ;==>_ScanBMP

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _WM_PAINT($hWnd, $iMsg, $wParam, $lParam)
    _GDIPlus_GraphicsDrawImage($hGraphics, $hBmpBuffer, 0, 0)
    Return $GUI_RUNDEFMSG
    EndFunc ;==>_WM_PAINT

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Exit()
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_PenDispose($hPen)
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_GraphicsDispose($hGfxBuffer)
    _GDIPlus_BitmapDispose($hBmpBuffer)
    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>_Exit

    [/autoit]

    Die Anzahl der Rechtecke lässt sich massiv reduzieren.
    Zudem kann man nun auch angeben, ab welcher Größe ein Rechteck überhaupt verwendet werden soll.

    Die Umsetzung in ASM scheint mir aber doch etwas zu kompliziert :rolleyes:
    In FreeBasic sollte es aber relativ einfach sein...

    E

  • Code Optimierungsvorschläge

    • eukalyptus
    • 14. März 2013 um 13:53

    Hi

    Hier die ASM-Version:

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    ;#include "ASM.au3"

    [/autoit] [autoit][/autoit] [autoit]

    Global $tASM_BMPtoRect = DllStructCreate("byte[204]") ;reserve Memory for opcodes
    DllStructSetData($tASM_BMPtoRect, 1, "0x8B7424048B7C24088B54240CBB01000000660F6EFB660F70F7F3660FEFED660F70E73F660FEFDB660F6FD78B0ABB000000008B0683F8FF741D660F7ED083F8017406660FFEDFEB36660FEFD2660F6FC5660F6FDFEB28660F6FD7660F7ED883F800741B83C301660FFEC4660F70CBCF660FFEC1F30F7F0783C710660FEFDB660FFEEF660F7EE83B42047234660F6FD7660F7ED883F800741B83C301660FFEC4660F70CBCF660FFEC1F30F7F0783C710660FEFDB660FEFED660FFEE6660F6FD783C604490F8769FFFFFF891AC3") ;write opcodes into memory

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Opt("GUIOnEventMode", 1)
    Opt("MustDeclareVars", 1)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_Startup()

    [/autoit] [autoit][/autoit] [autoit]

    ;Global $hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\10x10.bmp")
    ;Global $hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\Tussie.png")
    Global $hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\Earth.bmp")

    [/autoit] [autoit][/autoit] [autoit]

    Global $iImgW = _GDIPlus_ImageGetWidth($hImage)
    Global $iImgH = _GDIPlus_ImageGetHeight($hImage)

    [/autoit] [autoit][/autoit] [autoit]

    Global $fScale = 1
    Global $iWidth = $iImgW * $fScale
    Global $iHeight = $iImgH * $fScale

    [/autoit] [autoit][/autoit] [autoit]

    Global $hGui = GUICreate("Test", $iWidth, $iHeight)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    GUISetBkColor(0xC00000, $hGui)
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    Global $iTimer = TimerInit()
    _Perforate($hGui, $hImage, $fScale)
    ConsoleWrite("! " & TimerDiff($iTimer) & @CRLF)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While Sleep(10)
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Perforate($hWnd, $hBitmap, $fScale = 1)
    ;Local $hPath = _BMPtoPath($hImage)
    Local $hPath = _BMPtoPathASM($hImage)
    If @error Then Return SetError(@error, 1, False)

    [/autoit] [autoit][/autoit] [autoit]

    Local $hMatrix = _GDIPlus_MatrixCreate()
    _GDIPlus_MatrixScale($hMatrix, $fScale, $fScale)
    _GDIPlus_MatrixTranslate($hMatrix, _WinAPI_GetSystemMetrics(7), _WinAPI_GetSystemMetrics(8) + _WinAPI_GetSystemMetrics($SM_CYSIZE) + 1, 1)
    DllCall($ghGDIPDll, "uint", "GdipTransformPath", "hwnd", $hPath, "hwnd", $hMatrix)
    _GDIPlus_MatrixDispose($hMatrix)

    [/autoit] [autoit][/autoit] [autoit]

    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateRegionPath", "hwnd", $hPath, "int*", 0)
    Local $hRegion = $aResult[2]
    DllCall($ghGDIPDll, "uint", "GdipDeletePath", "hwnd", $hPath)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Local $aSize = WinGetPos(HWnd($hWnd))
    Local $tRect = _GDIPlus_RectFCreate(0, 0, $aSize[2], $aSize[3])
    $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateRegionRect", "ptr", DllStructGetPtr($tRect), "int*", 0)
    Local $hRegion_1 = $aResult[2]

    [/autoit] [autoit][/autoit] [autoit]

    Local $aClient = WinGetClientSize(HWnd($hWnd))
    $tRect = _GDIPlus_RectFCreate(0, 0, $aClient[0], $aClient[1])

    [/autoit] [autoit][/autoit] [autoit]

    Local $tPnt = DllStructCreate("int X; int Y;")
    _WinAPI_ClientToScreen($hWnd, $tPnt)
    DllStructSetData($tRect, 1, DllStructGetData($tPnt, "X") - $aSize[0])
    DllStructSetData($tRect, 2, DllStructGetData($tPnt, "Y") - $aSize[1])

    [/autoit] [autoit][/autoit] [autoit]

    DllCall($ghGDIPDll, "uint", "GdipCombineRegionRect", "hwnd", $hRegion_1, "ptr", DllStructGetPtr($tRect), "int", 3)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    DllCall($ghGDIPDll, "uint", "GdipCombineRegionRegion", "hwnd", $hRegion, "hwnd", $hRegion_1, "int", 2)
    DllCall($ghGDIPDll, "uint", "GdipDeleteRegion", "hwnd", $hRegion_1)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Local $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    $aResult = DllCall($ghGDIPDll, "uint", "GdipGetRegionHRgn", "hwnd", $hRegion, "hwnd", $hGraphics, "int*", 0)
    Local $hRgn = $aResult[3]
    DllCall($ghGDIPDll, "uint", "GdipDeleteRegion", "hwnd", $hRegion)

    [/autoit] [autoit][/autoit] [autoit]

    DllCall('user32.dll', 'long', 'SetWindowRgn', 'hwnd', $hWnd, 'long', $hRgn, 'int', 1)
    _WinAPI_DeleteObject($hRegion)

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_GraphicsDispose($hGraphics)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>_Perforate

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _BMPtoPathASM($hBitmap)
    Local $aPixelFormat = _GDIPlus_ImageGetPixelFormat($hBitmap)
    If $aPixelFormat[0] <> $GDIP_PXF01INDEXED Then Return SetError(1, 1, False)

    [/autoit] [autoit][/autoit] [autoit]

    Local $iBmpW = _GDIPlus_ImageGetWidth($hBitmap)
    Local $iBmpH = _GDIPlus_ImageGetHeight($hBitmap)

    [/autoit] [autoit][/autoit] [autoit]

    Local $tData = _GDIPlus_BitmapLockBits($hBitmap, 0, 0, $iBmpW, $iBmpH, $GDIP_ILMREAD, $GDIP_PXF32ARGB)
    Local $iStride = DllStructGetData($tData, "Stride")
    Local $iWidth = DllStructGetData($tData, "Width")
    Local $iHeight = DllStructGetData($tData, "Height")
    Local $pScan0 = DllStructGetData($tData, "Scan0")

    [/autoit] [autoit][/autoit] [autoit]

    Local $iRect = $iWidth * $iHeight
    Local $tRects = DllStructCreate("int[" & $iRect * 4 & "];")

    [/autoit] [autoit][/autoit] [autoit]

    Local $tVal = DllStructCreate("uint Cnt; uint W;")
    DllStructSetData($tVal, "Cnt", $iWidth * $iHeight)
    DllStructSetData($tVal, "W", $iWidth)

    [/autoit] [autoit][/autoit] [autoit]

    ;$_ASSEMBLEIT_FLAG = 0
    ;_AssembleIt("none", "_ASM_BMPtoRECT", "ptr", $pScan0, "ptr", DllStructGetPtr($tRects), "ptr", DllStructGetPtr($tVal))
    DllCall("user32.dll", "none", "CallWindowProcW", "ptr", DllStructGetPtr($tASM_BMPtoRect), "ptr", $pScan0, "ptr", DllStructGetPtr($tRects), "ptr", DllStructGetPtr($tVal), "int", 0)

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_BitmapUnlockBits($hBitmap, $tData)

    [/autoit] [autoit][/autoit] [autoit]

    $iRect = DllStructGetData($tVal, "Cnt")

    [/autoit] [autoit][/autoit] [autoit]

    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreatePath", "int", 0, "int*", 0)
    Local $hPath = $aResult[2]
    $aResult = DllCall($ghGDIPDll, "uint", "GdipAddPathRectanglesI", "hwnd", $hPath, "ptr", DllStructGetPtr($tRects), "int", $iRect)

    [/autoit] [autoit][/autoit] [autoit]

    Return $hPath
    EndFunc ;==>_BMPtoPathASM

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _BMPtoPath($hBitmap)
    Local $aPixelFormat = _GDIPlus_ImageGetPixelFormat($hBitmap)
    If $aPixelFormat[0] <> $GDIP_PXF01INDEXED Then Return SetError(1, 1, False)

    [/autoit] [autoit][/autoit] [autoit]

    Local $iBmpW = _GDIPlus_ImageGetWidth($hBitmap)
    Local $iBmpH = _GDIPlus_ImageGetHeight($hBitmap)

    [/autoit] [autoit][/autoit] [autoit]

    Local $tData = _GDIPlus_BitmapLockBits($hBitmap, 0, 0, $iBmpW, $iBmpH, $GDIP_ILMREAD, $GDIP_PXF32ARGB)
    Local $iStride = DllStructGetData($tData, "Stride")
    Local $iWidth = DllStructGetData($tData, "Width")
    Local $iHeight = DllStructGetData($tData, "Height")
    Local $pScan0 = DllStructGetData($tData, "Scan0")
    Local $tPixel = DllStructCreate("uint[" & $iWidth * $iHeight & "];", $pScan0)

    [/autoit] [autoit][/autoit] [autoit]

    Local $iRect = $iWidth * $iHeight
    Local $tRects = DllStructCreate("int[" & $iRect * 4 & "];")
    $iRect = -1

    [/autoit] [autoit][/autoit] [autoit]

    Local $iOff, $iNew = 1, $iIdx
    Local $iRectX, $iRectW = 0
    For $y = 0 To $iHeight - 1
    $iOff = $y * $iWidth
    For $x = 0 To $iWidth - 1

    [/autoit] [autoit][/autoit] [autoit]

    Switch DllStructGetData($tPixel, 1, $iOff + $x + 1)
    Case 4294967295;0xFFFFFFFF
    $iNew = 1
    If $iRectW > 0 Then
    $iRect += 1
    $iIdx = $iRect * 4
    DllStructSetData($tRects, 1, $iRectX, $iIdx + 1)
    DllStructSetData($tRects, 1, $y, $iIdx + 2)
    DllStructSetData($tRects, 1, $iRectW, $iIdx + 3)
    DllStructSetData($tRects, 1, 1, $iIdx + 4)
    $iRectW = 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Case Else
    Switch $iNew
    Case 1
    $iNew = 0
    $iRectX = $x
    $iRectW = 1
    Case Else
    $iRectW += 1
    EndSwitch

    [/autoit] [autoit][/autoit] [autoit]

    EndSwitch
    Next

    [/autoit] [autoit][/autoit] [autoit]

    $iNew = 1
    If $iRectW > 0 Then
    $iRect += 1
    $iIdx = $iRect * 4
    DllStructSetData($tRects, 1, $iRectX, $iIdx + 1)
    DllStructSetData($tRects, 1, $y, $iIdx + 2)
    DllStructSetData($tRects, 1, $iRectW, $iIdx + 3)
    DllStructSetData($tRects, 1, 1, $iIdx + 4)
    $iRectW = 0
    EndIf
    Next
    $iRect += 1

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_BitmapUnlockBits($hBitmap, $tData)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreatePath", "int", 0, "int*", 0)
    Local $hPath = $aResult[2]
    $aResult = DllCall($ghGDIPDll, "uint", "GdipAddPathRectanglesI", "hwnd", $hPath, "ptr", DllStructGetPtr($tRects), "int", $iRect)

    [/autoit] [autoit][/autoit] [autoit]

    Return $hPath
    EndFunc ;==>_BMPtoPath

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Exit()
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>_Exit

    [/autoit]

    ASM.au3:

    Spoiler anzeigen
    [autoit]

    #include <AssembleIt.au3>

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _ASM_BMPtoRECT()
    _("use32") ;32Bit!

    [/autoit] [autoit][/autoit] [autoit]

    _("mov esi, dword[esp+4]") ;Scan0
    _("mov edi, dword[esp+8]") ;Rects
    _("mov edx, dword[esp+12]") ;Val

    [/autoit] [autoit][/autoit] [autoit]

    _("mov ebx, 1")
    _("movd xmm7, ebx") ;1,0,0,0
    _("pshufd xmm6, xmm7, 0xF3") ;0,1,0,0
    _("pxor xmm5, xmm5") ;0,0,0,0
    _("pshufd xmm4, xmm7, 0x3F") ;0,0,0,1
    _("pxor xmm3, xmm3") ;0,0,0,0
    _("movdqa xmm2, xmm7") ;1,0,0,0

    [/autoit] [autoit][/autoit] [autoit]

    ;xmm7 = 1,0,0,0 = add X
    ;xmm6 = 0,1,0,0 = add Y
    ;xmm5 = 0,0,0,0 = XPos
    ;xmm4 = 0,0,0,1 = YPos (incl. RectH = 1)
    ;xmm3 = 0,0,0,0 = RectW
    ;xmm2 = 1,0,0,0 = New
    ;xmm1 = shuffle RectW
    ;xmm0 = 0,0,0,0 = Save

    [/autoit] [autoit][/autoit] [autoit]

    _("mov ecx, [edx]") ;PixelCount
    _("mov ebx, 0") ;RectCount
    _("_Loop:")

    [/autoit] [autoit][/autoit] [autoit]

    _("mov eax, [esi]") ;load Pixel
    _("cmp eax, 0xFFFFFFFF")
    _("je _Trans")
    _("_Full:")
    _("movd eax, xmm2")
    _("cmp eax, 1") ;New = 1?
    _("je _NewRect")
    _("_ContRect:")
    _("paddd xmm3, xmm7") ;RectW += 1
    _("jmp _FullCont")

    [/autoit] [autoit][/autoit] [autoit]

    _("_NewRect:")
    _("pxor xmm2, xmm2") ;New = 0
    _("movdqa xmm0, xmm5") ;RectX = XPos
    _("movdqa xmm3, xmm7") ;RectW = 1

    [/autoit] [autoit][/autoit] [autoit]

    _("jmp _FullCont")

    [/autoit] [autoit][/autoit] [autoit]

    _("_Trans:")
    _("movdqa xmm2, xmm7") ;New = 1

    [/autoit] [autoit][/autoit] [autoit]

    _("movd eax, xmm3")
    _("cmp eax, 0") ;RectW > 0
    _("je _NoWrite")
    _("_Write:")
    _("add ebx, 1")
    ;Xmm0 = XPos, 0, 0, 0
    _("paddd xmm0, xmm4") ;Add 0, YPos, 0, 1
    _("pshufd xmm1, xmm3, 0xCF") ;RectW -> xmm1 0,0,RectW,0
    _("paddd xmm0, xmm1") ;Add 0, 0, RectW, 0

    [/autoit] [autoit][/autoit] [autoit]

    _("movdqu [edi], xmm0")
    _("add edi, 16")
    _("pxor xmm3, xmm3") ;RectW = 0

    [/autoit] [autoit][/autoit] [autoit]

    _("_NoWrite:")

    [/autoit] [autoit][/autoit] [autoit]

    _("_FullCont:")

    [/autoit] [autoit][/autoit] [autoit]

    _("paddd xmm5, xmm7") ;XPos += 1
    _("movd eax, xmm5")
    _("cmp eax, [edx+4]") ;XPos > Width
    _("jb _SameLine")
    _("_NewLine:")
    _("movdqa xmm2, xmm7") ;New = 1

    [/autoit] [autoit][/autoit] [autoit]

    _("movd eax, xmm3")
    _("cmp eax, 0") ;RectW > 0
    _("je _NoWrite1")
    _("_Write1:")
    _("add ebx, 1") ;RectCount += 1
    ;Xmm0 = XPos, 0, 0, 0
    _("paddd xmm0, xmm4") ;Add 0, YPos, 0, 1
    _("pshufd xmm1, xmm3, 0xCF")
    _("paddd xmm0, xmm1") ;Add 0, 0, RectW, 0

    [/autoit] [autoit][/autoit] [autoit]

    _("movdqu [edi], xmm0")
    _("add edi, 16")
    _("pxor xmm3, xmm3") ;RectW = 0

    [/autoit] [autoit][/autoit] [autoit]

    _("_NoWrite1:")

    [/autoit] [autoit][/autoit] [autoit]

    _("pxor xmm5, xmm5") ;XPos = 0
    _("paddd xmm4, xmm6") ;YPos += 1
    _("movdqa xmm2, xmm7") ;New = 1

    [/autoit] [autoit][/autoit] [autoit]

    _("_SameLine:")

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    _("add esi, 4")
    _("dec ecx")
    _("ja _Loop")

    [/autoit] [autoit][/autoit] [autoit]

    _("mov [edx], ebx") ;Save RectCount
    _("ret ") ;return
    EndFunc ;==>_ASM_BMPtoRECT

    [/autoit]

    Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.

    Der Code fasst alle nebeneinanderliegene Pixel in einer Zeile zu einem Rechteck(Höhe 1) zusammen.
    Besser wäre es natürlich, wenn man auch Zeilenübergreifend zusammen fassen würde, denn je weniger Daten in einer Region sind, desto flüssiger läuft es.

    Bei zuvielen Rechtecken kann auch schonmal der PC abkacken...

    lgE

    Dateien

    Earth.bmp 24,7 kB – 269 Downloads
  • Code Optimierungsvorschläge

    • eukalyptus
    • 13. März 2013 um 23:26

    Hier mal der Code, um das Bild in einen Path zu packen:

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Opt("GUIOnEventMode", 1)
    Opt("MustDeclareVars", 1)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_Startup()

    [/autoit] [autoit][/autoit] [autoit]

    Global $hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\Tussie.png")

    [/autoit] [autoit][/autoit] [autoit]

    Global $iImgW = _GDIPlus_ImageGetWidth($hImage) * 96 / _GDIPlus_ImageGetHorizontalResolution($hImage)
    Global $iImgH = _GDIPlus_ImageGetHeight($hImage) * 96 / _GDIPlus_ImageGetVerticalResolution($hImage)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Global $iWidth = $iImgW
    Global $iHeight = $iImgH

    [/autoit] [autoit][/autoit] [autoit]

    Global $hGui = GUICreate("Test", $iWidth, $iHeight)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    Global $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGui)
    Global $hBmpBuffer = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphics)
    Global $hGfxBuffer = _GDIPlus_ImageGetGraphicsContext($hBmpBuffer)
    _GDIPlus_GraphicsSetSmoothingMode($hGfxBuffer, 2)
    _GDIPlus_GraphicsClear($hGfxBuffer, 0xFFFFFFFF)

    [/autoit] [autoit][/autoit] [autoit]

    Global $hPen = _GDIPlus_PenCreate(0xFF00AA00)

    [/autoit] [autoit][/autoit] [autoit]

    GUIRegisterMsg($WM_PAINT, "_WM_PAINT")

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_GraphicsDrawImageRect($hGfxBuffer, $hImage, 0, 0, $iWidth, $iHeight)
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    Global $iTimer = TimerInit()
    Global $hPath = _ScanBMP($hImage)
    ConsoleWrite("! " & TimerDiff($iTimer) & @CRLF)
    DllCall($ghGDIPDll, "uint", "GdipDrawPath", "hwnd", $hGfxBuffer, "hwnd", $hPen, "hwnd", $hPath)
    DllCall($ghGDIPDll, "uint", "GdipDeletePath", "hwnd", $hPath)
    _GDIPlus_GraphicsDrawImage($hGraphics, $hBmpBuffer, 0, 0)

    [/autoit] [autoit][/autoit] [autoit]

    While Sleep(20)
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _ScanBMP($hBitmap)
    Local $aPixelFormat = _GDIPlus_ImageGetPixelFormat($hBitmap)
    If $aPixelFormat[0] <> $GDIP_PXF01INDEXED Then Return SetError(1, 1, False)

    [/autoit] [autoit][/autoit] [autoit]

    Local $iBmpW = _GDIPlus_ImageGetWidth($hBitmap)
    Local $iBmpH = _GDIPlus_ImageGetHeight($hBitmap)

    [/autoit] [autoit][/autoit] [autoit]

    Local $tData = _GDIPlus_BitmapLockBits($hBitmap, 0, 0, $iBmpW, $iBmpH, $GDIP_ILMREAD, $GDIP_PXF32ARGB)
    Local $iStride = DllStructGetData($tData, "Stride")
    Local $iWidth = DllStructGetData($tData, "Width")
    Local $iHeight = DllStructGetData($tData, "Height")
    Local $pScan0 = DllStructGetData($tData, "Scan0")
    Local $tPixel = DllStructCreate("uint[" & $iWidth * $iHeight & "];", $pScan0)

    [/autoit] [autoit][/autoit] [autoit]

    Local $iRect = $iWidth * $iHeight
    Local $tRects = DllStructCreate("int[" & $iRect * 4 & "];")
    $iRect = -1

    [/autoit] [autoit][/autoit] [autoit]

    Local $iOff, $iNew = 1
    Local $iRectX, $iRectW = 0
    For $y = 0 To $iHeight - 1
    $iOff = $y * $iWidth
    For $x = 0 To $iWidth - 1

    [/autoit] [autoit][/autoit] [autoit]

    Switch DllStructGetData($tPixel, 1, $iOff + $x + 1)
    Case 4294967295
    $iNew = 1
    If $iRectW > 0 Then
    $iRect += 1
    DllStructSetData($tRects, 1, $iRectX, $iRect * 4 + 1)
    DllStructSetData($tRects, 1, $y, $iRect * 4 + 2)
    DllStructSetData($tRects, 1, $iRectW, $iRect * 4 + 3)
    DllStructSetData($tRects, 1, 1, $iRect * 4 + 4)
    $iRectW = 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Case Else
    Switch $iNew
    Case 1
    $iNew = 0
    $iRectX = $x
    $iRectW = 1
    Case Else
    $iRectW += 1
    EndSwitch

    [/autoit] [autoit][/autoit] [autoit]

    EndSwitch
    Next

    [/autoit] [autoit][/autoit] [autoit]

    $iNew = 1
    If $iRectW > 0 Then
    $iRect += 1
    DllStructSetData($tRects, 1, $iRectX, $iRect * 4 + 1)
    DllStructSetData($tRects, 1, $y, $iRect * 4 + 2)
    DllStructSetData($tRects, 1, $iRectW, $iRect * 4 + 3)
    DllStructSetData($tRects, 1, 1, $iRect * 4 + 4)
    $iRectW = 0
    EndIf
    Next
    $iRect += 1

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_BitmapUnlockBits($hBitmap, $tData)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreatePath", "int", 0, "int*", 0)
    Local $hPath = $aResult[2]
    $aResult = DllCall($ghGDIPDll, "uint", "GdipAddPathRectanglesI", "hwnd", $hPath, "ptr", DllStructGetPtr($tRects), "int", $iRect)

    [/autoit] [autoit][/autoit] [autoit]

    Return $hPath
    EndFunc ;==>_ScanBMP

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _WM_PAINT($hWnd, $iMsg, $wParam, $lParam)
    _GDIPlus_GraphicsDrawImage($hGraphics, $hBmpBuffer, 0, 0)
    Return $GUI_RUNDEFMSG
    EndFunc ;==>_WM_PAINT

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Exit()
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_PenDispose($hPen)
    _GDIPlus_GraphicsDispose($hGfxBuffer)
    _GDIPlus_BitmapDispose($hBmpBuffer)
    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>_Exit

    [/autoit]


    Eine Region daraus erhält man wie in meinem ersten Beispiel.
    Dieser Code sollte sich auch relativ einfach in ASM umsetzen lassen...

    lgE

  • Code Optimierungsvorschläge

    • eukalyptus
    • 13. März 2013 um 21:58

    Hast du das Bild zur Hand?
    Dann werd ich das mal ausprobieren...


    Dies wäre die Methode via vorher berechneter Region:

    Region Berechnen:

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <TestArray.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Opt("GUIOnEventMode", 1)
    Opt("MustDeclareVars", 1)

    [/autoit] [autoit][/autoit] [autoit]

    Global $aPixelArray = _PixelCoordinate()
    Global $bRegion = _CreateRegionData($aPixelArray)

    [/autoit] [autoit][/autoit] [autoit]

    Global $sOut = "Global $bRegion = "
    Global $iLen = 4096 - 26
    While StringLen($bRegion) > 1
    $sOut &= '"' & StringLeft($bRegion, $iLen) & '"'
    $bRegion = StringTrimLeft($bRegion, $iLen)
    If StringLen($bRegion) > 1 Then $sOut &= ' & _' & @CRLF & @TAB & @TAB
    $iLen = 4096 - 16
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    ConsoleWrite($sOut & @CRLF)
    ClipPut($sOut)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _CreateRegionData($aPix)
    Local $iCnt = UBound($aPix) - 1
    Local $tRects = DllStructCreate("float[" & $iCnt * 4 & "];")

    [/autoit] [autoit][/autoit] [autoit]

    Local $aSplit, $iIdx
    For $i = 1 To $iCnt
    $iIdx = ($i - 1) * 4
    $aSplit = StringSplit($aPix[$i], ',')
    DllStructSetData($tRects, 1, $aSplit[1], $iIdx + 1)
    DllStructSetData($tRects, 1, $aSplit[2], $iIdx + 2)
    DllStructSetData($tRects, 1, 1, $iIdx + 3)
    DllStructSetData($tRects, 1, 1, $iIdx + 4)
    Next

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_Startup()

    [/autoit] [autoit][/autoit] [autoit]

    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreatePath", "int", 0, "int*", 0)
    Local $hPath = $aResult[2]

    [/autoit] [autoit][/autoit] [autoit]

    DllCall($ghGDIPDll, "uint", "GdipAddPathRectangles", "hwnd", $hPath, "ptr", DllStructGetPtr($tRects), "int", $iCnt)
    $aResult = DllCall($ghGDIPDll, "uint", "GdipGetPointCount", "hwnd", $hPath, "int*", 0)
    ;ConsoleWrite("! Path Pnt: " & $aResult[2] & @CRLF)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateRegionPath", "hwnd", $hPath, "int*", 0)
    Local $hRegion = $aResult[2]

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Local $hMatrix = _GDIPlus_MatrixCreate()
    $aResult = DllCall($ghGDIPDll, "uint", "GdipGetRegionScansCount", "hwnd", $hRegion, "uint*", 0, "hwnd", $hMatrix)
    Local $iScans = $aResult[2]

    [/autoit] [autoit][/autoit] [autoit]

    $tRects = DllStructCreate("float[" & $iScans * 4 & "]")
    $aResult = DllCall($ghGDIPDll, "uint", "GdipGetRegionScans", "hwnd", $hRegion, "ptr", DllStructGetPtr($tRects), "int*", $iScans, "hwnd", $hMatrix)

    [/autoit] [autoit][/autoit] [autoit]

    DllCall($ghGDIPDll, "uint", "GdipResetPath", "hwnd", $hPath)
    DllCall($ghGDIPDll, "uint", "GdipAddPathRectangles", "hwnd", $hPath, "ptr", DllStructGetPtr($tRects), "int", $iScans)
    $aResult = DllCall($ghGDIPDll, "uint", "GdipGetPointCount", "hwnd", $hPath, "int*", 0)
    ;ConsoleWrite("! Path Pnt: " & $aResult[2] & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_MatrixDispose($hMatrix)
    DllCall($ghGDIPDll, "uint", "GdipDeleteRegion", "hwnd", $hRegion)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateRegionPath", "hwnd", $hPath, "int*", 0)
    Local $hRegion = $aResult[2]
    DllCall($ghGDIPDll, "uint", "GdipDeletePath", "hwnd", $hPath)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $aResult = DllCall($ghGDIPDll, "uint", "GdipGetRegionDataSize", "hwnd", $hRegion, "uint*", 0)
    Local $iData = $aResult[2]
    Local $tData = DllStructCreate("byte Data[" & $iData & "];")
    $aResult = DllCall($ghGDIPDll, "uint", "GdipGetRegionData", "hwnd", $hRegion, "ptr", DllStructGetPtr($tData), "int", $iData, "int*", 0)
    ;ConsoleWrite("! " & $iData & " " & $aResult[3] & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    DllCall($ghGDIPDll, "uint", "GdipDeleteRegion", "hwnd", $hRegion)
    _GDIPlus_Shutdown()

    [/autoit] [autoit][/autoit] [autoit]

    Return DllStructGetData($tData, 1)
    EndFunc ;==>_CreateRegionData

    [/autoit]


    (Via GdipGetRegionScans kann man die Anzahl der Rechtecke erheblich verringern)


    Beispiel:

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    #include <WinAPI.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Opt("GUIOnEventMode", 1)
    Opt("MustDeclareVars", 1)

    [/autoit] [autoit][/autoit] [autoit]

    Global $fScale = 1.4

    [/autoit] [autoit][/autoit] [autoit]

    Global $bRegion = "0xB4530000621D9BED0110C0DB0000000001000010A45300000110C0DBB810000000400000C6000100DA000100DA000200C6000200C0000200DE000200DE000300C0000300BC000300E4000300E4000400BC000400B9000400E7000400E7000500B9000500B6000500EA000500EA000600B6000600B4000600EC000600EC000700B4000700B1000700EE000700EE000800B1000800AE000800F1000800F1000900AE000900AC000900F2000900F2000A00AC000A00AA000A00F4000A00F4000B00AA000B00A9000B00F5000B00F5000C00A9000C00A7000C00F6000C00F6000D00A7000D00A6000D00F8000D00F8000E00A6000E00A5000E00F9000E00F9000F00A5000F00A3000F00FA000F00FA001000A3001000A2001000FB001000FB001100A2001100A1001100FC001100FC001200A1001200A0001200FD001200FD001300A00013009F001300FD001300FD0014009F0014009E001400FE001400FE0015009E0015009D001500FF001500FF0016009D0016009C00160000011600000117009C0017009B00170000011700000118009B0018009A00180002011800020119009A001900990019000201190002011A0099001A0098001A0003011A0003011B0098001B0098001B0004011B0004011C0098001C0097001C0005011C0005011D0097001D0096001D0005011D0005011E0096001E0095001E0006011E0006011F0095001F0095001F0007011F00070120009500200094002000E8002000E800210094002100E90020000701200007012100E900210093002100E7002100E700220093002200E80021000801210008012200E800220092002200E7002200E700230092002300E80022000901220009012300E800230092002300090123000901240092002400910024000A0124000A01250091002500910025000B0125000B01260091002600900026000B0126000B0127009000270090002700D8002700D800280090002800D90027000C0127000C012800D90028008F0028000C0128000C0129008F0029008F0029000D0129000D012A008F002A008E002A000D012A000D012B008E002B008E002B000E012B000E012C008E002C008D002C000E012C000E012D008D002D008D002D000F012D000F012E008D002E008C002E000F012E000F012F008C002F008C002F0010012F00100131008C0031008B00310011013100110132008B0032008A00320011013200110133008A0033008A00330012013300120134008A0034008A003400D9003400D90035008A003500DB0034001201340012013500DB00350089003500D9003500D900360089003600DB0035001301350013013600DB00360089003600D9003600D900370089003700DC0036001301360013013700DC00370089003700D8003700D800380089003800DD0037001301370013013800DD00380088003800D8003800D800390088003900DD0038001401380014013900DD00390088003900BD003900BD003A0088003A00BE003900D8003900D8003A00BE003A00DD0039001401390014013A00DD003A0088003A00BC003A00BC003B0088003B00BF003A00D7003A00D7003B00BF003B00DD003A0015013A0015013B00DD003B0088003B00BC003B00BC003C0088003C00BF003B00D7003B00D7003C00BF003C00DE003B0015013B0015013C00DE003C0087003C00BC003C00BC003D0087003D00C0003C00D6003C00D6003D00C0003D00DE003C0015013C0015013D00DE003D0087003D00B7003D00B7003E0087003E00B9003D00BC003D00BC003E00B9003E00C0003D00D6003D00D6003E00C0003E00DE003D0016013D0016013E00DE003E0087003E00B6003E00B6003F0087003F00B9003E00BD003E00BD003F00B9003F00C0003E00D6003E00D6003F00C0003F00DF003E0016013E0016013F00DF003F0087003F00B6003F00B600400087004000BA003F00BD003F00BD004000BA004000C1003F00D5003F00D5004000C1004000E0003F0016013F0016014000E000400086004000B6004000B600410086004100BB004000BD004000BD004100BB004100C1004000D5004000D5004100C1004100E00040001701400017014100E000410086004100B6004100B600420086004200BC004100BE004100BE004200BC004200C2004100D5004100D5004200C2004200E00041001701410017014200E000420086004200B6004200B600430086004300BD004200BE004200BE004300BD004300C2004200D5004200D5004300C2004300E00042001701420017014300E000430086004300B6004300B600440086004400C3004300D5004300D5004400C3004400E00043001801430018014400E000440085004400B6004400B600450085004500C4004400D5004400D5004500C4004500E00044001801440018014500E000450085004500B6004500B600460085004600C4004500D4004500D4004600C4004600E00045001801450018014600E000460085004600B7004600B700470085004700C4004600D4004600D4004700C4004700E00046001801460018014700E000470085004700B7004700B700480085004800C5004700D4004700D4004800C5004800E00047001901470019014800E000480085004800B7004800B700490085004900C5004800D4004800D4004900C5004900DF0048001901480019014900DF00490084004900B8004900B8004A0084004A00C6004900D4004900D4004A00C6004A00DF0049001901490019014A00DF004A0084004A00B8004A00B8004B0084004B00C7004A00D4004A00D4004B00C7004B00DF004A0019014A0019014B00DF004B0084004B00BA004B00BA004C008400" & _
    "4C00C8004B00D3004B00D3004C00C8004C00DF004B0019014B0019014C00DF004C0084004C00BB004C00BB004D0084004D00C8004C00D2004C00D2004D00C8004D00DE004C001A014C001A014D00DE004D0084004D00BE004D00BE004E0084004E00C9004D00D2004D00D2004E00C9004E00DC004D00EB004D00EB004E00DC004E00EE004D001A014D001A014E00EE004E0084004E00BF004E00BF004F0084004F00CA004E00D2004E00D2004F00CA004F00DB004E00EC004E00EC004F00DB004F00EF004E00F0004E00F0004F00EF004F00F1004E001A014E001A014F00F1004F0084004F00C0004F00C000500084005000CA004F00D2004F00D2005000CA005000DA004F00E8004F00E8005000DA005000EB004F00EC004F00EC005000EB005000EF004F001A014F001A015000EF00500084005000AA005000AA00510084005100AC005000AF005000AF005100AC005100B0005000C1005000C1005100B0005100CB005000D1005000D1005100CB005100DA005000E8005000E8005100DA005100E9005000EA005000EA005100E9005100ED005000F3005000F3005100ED005100F40050001A0150001A015100F400510084005100A9005100A900520084005200AC005100AD005100AD005200AC005200AE005100B0005100B0005200AE005200B2005100C1005100C1005200B2005200CC005100D1005100D1005200CC005200D9005100EC005100EC005200D9005200ED005100F3005100F3005200ED005200F40051001A0151001A015200F400520084005200A8005200A800530084005300A9005200C2005200C2005300A9005300CE005200D1005200D1005300CE005300D8005200EC005200EC005300D8005300EE0052001B0152001B015300EE00530083005300C1005300C100540083005400CF005300D1005300D1005400CF005400D9005300EC005300EC005400D9005400EE0053001B0153001B015400EE00540083005400A4005400A400550083005500A5005400AA005400AA005500A5005500AB005400C0005400C0005500AB005500DC0054001B0154001B015500DC00550083005500C0005500C000560083005600DA0055001B0155001B015600DA00560083005600BF005600BF00570083005700C0005600C1005600C1005700C0005700DA0056001B0156001B015700DA00570083005700C1005700C100580083005800DA0057001C0157001C015800DA00580083005800A3005800A300590083005900A4005800C1005800C1005900A4005900D9005800DA005800DA005900D9005900DB0058001C0158001C015900DB00590083005900A3005900A3005A0083005A00A4005900C2005900C2005A00A4005A00D9005900DA005900DA005A00D9005A00DB0059001C0159001C015A00DB005A0083005A00A3005A00A3005B0083005B00A4005A00BF005A00BF005B00A4005B00D9005A00F9005A00F9005B00D9005B00FA005A001C015A001C015B00FA005B0083005B00A3005B00A3005C0083005C00A5005B00C0005B00C0005C00A5005C00DA005B00DC005B00DC005C00DA005C00DD005B00F9005B00F9005C00DD005C00FA005B001C015B001C015C00FA005C0083005C00A3005C00A3005D0083005D00A7005C00B2005C00B2005D00A7005D00B3005C00C1005C00C1005D00B3005D00DA005C00DC005C00DC005D00DA005D00DD005C00E9005C00E9005D00DD005D00EB005C00F9005C00F9005D00EB005D00FB005C001C015C001C015D00FB005D0083005D00A3005D00A3005E0083005E00A7005D00B1005D00B1005E00A7005E00B4005D00BC005D00BC005E00B4005E00BF005D00C1005D00C1005E00BF005E00DB005D00E9005D00E9005E00DB005E00EB005D00F6005D00F6005E00EB005E00F7005D00F9005D00F9005E00F7005E00FB005D001C015D001C015E00FB005E0083005E00A3005E00A3005F0083005F00A8005E00B2005E00B2005F00A8005F00B4005E00BC005E00BC005F00B4005F00BF005E00C1005E00C1005F00BF005F00DB005E00DE005E00DE005F00DB005F00E1005E00E9005E00E9005F00E1005F00EB005E00F5005E00F5005F00EB005F00FB005E001C015E001C015F00FB005F0083005F00A3005F00A300600083006000A9005F00B3005F00B3006000A9006000B5005F00BC005F00BC006000B5006000DA005F00DE005F00DE006000DA006000E1005F00E8005F00E8006000E1006000E9005F00F4005F00F4006000E9006000FB005F001D015F001D016000FB00600083006000A4006000A400610083006100AA006000BA006000BA006100AA006100DA006000DC006000DC006100DA006100E3006000F3006000F3006100E3006100FB0060001D0160001D016100FB00610083006100A4006100A400620083006200AC006100BB006100BB006200AC006200E2006100F1006100F1006200E2006200FB0061001D0161001D016200FB00620083006200A4006200A400630083006300AE006200BB006200BB006300AE006300E4006200EE006200EE006300E4006300FB0062001D0162001D016300FB00630083006300A4006300A400640083006400B4006300B9006300B9006400B4006400FB0063001D0163001D016400FB00640083006400A4006400A400650083006500FB0064001D0164001D016500FB00650083006500A4006500A400660083006600FA0065001D0165001D016600FA00660083006600A5006600A500670083006700FA0066001D0166001D016700FA00670083006700A4006700A400680083006800FA0067001D0167001D016800FA00680083006800A5006800A500690083006900FA0068001D01" & _
    "68001D016900FA00690083006900A5006900A5006B0083006B00F90069001D0169001D016B00F9006B0083006B00A6006B00A6006D0083006D00F9006B001D016B001D016D00F9006D0084006D00A7006D00A7006E0084006E00F9006D001D016D001D016E00F9006E0084006E00A7006E00A700700084007000F7006E001D016E001D017000F700700084007000A8007000A800710084007100F70070001D0170001D017100F700710084007100A8007100A800730084007300F50071001D0171001D017300F500730084007300A9007300A900740084007400F50073001D0173001D017400F500740085007400A9007400A900760085007600F40074001D0174001D017600F400760085007600AA007600AA00780085007800F40076001D0176001D017800F400780086007800AB007800AB00790086007900D2007800D4007800D4007900D2007900F40078001D0178001D017900F400790086007900AB007900AB007C0086007C00F30079001D0179001D017C00F3007C0086007C00AB007C00AB007D0086007D00F2007C001D017C001D017D00F2007D0086007D00AA007D00AA007E0086007E00F2007D001D017D001D017E00F2007E0087007E00AA007E00AA00800087008000F3007E001D017E001D018000F300800087008000A9008000A900810087008100F40080001D0180001D018100F400810087008100A9008100A900820087008200F50081001D0181001D018200F50082008800820097008200970083008800830098008200A9008200A900830098008300F0008200F1008200F1008300F0008300F50082001D0182001D018300F50083008800830097008300970084008800840098008300A9008300A900840098008400C7008300C8008300C8008400C7008400F40083001C0183001C018400F40084008800840096008400960085008800850099008400AA008400AA00850099008500C4008400C8008400C8008500C4008500D6008400DA008400DA008500D6008500F30084001C0184001C018500F30085008800850097008500970086008800860099008500AA008500AA00860099008600C2008500CB008500CB008600C2008600D5008500DD008500DD008600D5008600F30085001C0185001C018600F3008600880086009C0086009C008700880087009D008600AB008600AB0087009D008700C0008600CD008600CD008700C0008700D4008600DF008600DF008700D4008700F30086001C0186001C018700F300870089008700980087009800880089008800990087009C0087009C008800990088009D008700AB008700AB0088009D008800BE008700C8008700C8008800BE008800D8008700E2008700E2008800D8008800F30087001C0187001C018800F300880089008800AB008800AB00890089008900BD008800C8008800C8008900BD008900D8008800E2008800E2008900D8008900F20088001C0188001C018900F200890089008900AC008900AC008A0089008A00BE008900CA008900CA008A00BE008A00D6008900E1008900E1008A00D6008A00F20089001C0189001C018A00F2008A0089008A00AD008A00AD008B0089008B00BE008A00CB008A00CB008B00BE008B00D4008A00E0008A00E0008B00D4008B00F2008A001C018A001C018B00F2008B008A008B00AE008B00AE008C008A008C00BF008B00C5008B00C5008C00BF008C00DB008B00E0008B00E0008C00DB008C00F0008B001C018B001C018C00F0008C008A008C009A008C009A008D008A008D009B008C00AE008C00AE008D009B008D00C0008C00C5008C00C5008D00C0008D00DA008C00DF008C00DF008D00DA008D00F0008C001C018C001C018D00F0008D008A008D00AE008D00AE008E008A008E00C1008D00C9008D00C9008E00C1008E00D9008D00DE008D00DE008E00D9008E00F0008D001B018D001B018E00F0008E008B008E00AF008E00AF008F008B008F00C2008E00CA008E00CA008F00C2008F00DB008E00DD008E00DD008F00DB008F00EF008E001B018E001B018F00EF008F008B008F00B0008F00B00090008B009000C2008F00C6008F00C6009000C2009000D0008F00D1008F00D1009000D0009000DA008F00DD008F00DD009000DA009000EE008F001B018F001B019000EE0090008B009000B1009000B10091008B009100C3009000C6009000C6009100C3009100D9009000DB009000DB009100D9009100ED0090001B0190001B019100ED0091008C009100B1009100B10092008C009200D8009100DA009100DA009200D8009200ED0091001B0191001B019200ED0092008C009200B3009200B30093008C009300D8009200D9009200D9009300D8009300EC0092001B0192001B019300EC0093008C009300B3009300B30094008C009400EB0093001B0193001B019400EB0094008C009400B4009400B40095008C009500C8009400CC009400CC009500C8009500D2009400D7009400D7009500D2009500EB0094001B0194001B019500EB0095008D009500B5009500B50096008D009600CC009500D2009500D2009600CC009600E90095001B0195001B019600E90096008D009600B6009600B60098008D009800E80096001A0196001A019800E80098008D009800B6009800B60099008D009900E70098001A0198001A019900E70099008E009900B7009900B7009A008E009A00E70099001A0199001A019A00E7009A008E009A00B7009A00B7009B008E009B00E5009A0019019A0019019B00E5009B008E009B00B9009B00B9009C008E009C00E5009B0019019B0019019C00E5009C008E009C00BA009C00BA009D008E009D00E5009C0019019C0019019D00E500" & _
    "9D008E009D00BA009D00BA009E008E009E00E3009D0019019D0019019E00E3009E008E009E00BD009E00BD009F008E009F00E2009E0019019E0019019F00E2009F008E009F00BE009F00BE00A0008E00A000E0009F0019019F001901A000E000A0008F00A000BF00A000BF00A1008F00A100DF00A0001901A0001901A100DF00A1008F00A100C100A100C100A2008F00A200DE00A1001901A1001901A200DE00A2008F00A200C300A200C300A3008F00A300DC00A2001901A2001901A300DC00A3008F00A300C400A300C400A4008F00A400DB00A3001901A3001901A400DB00A4008F00A400C600A400C600A5008F00A500D800A4001901A4001901A500D800A5008F00A500C700A500C700A6008F00A600D600A5001901A5001901A600D600A6008F00A600CB00A600CB00A7008F00A700D400A6001901A6001901A700D400A7008F00A700D000A700D000A8008F00A800D100A7001901A7001901A800D100A8009000A8001901A8001901AB009000AB009000AB001A01AB001A01AC009000AC009000AC00E300AC00E300AD009000AD00EA00AC001A01AC001A01AD00EA00AD009000AD00E000AD00E000AE009000AE00EB00AD001A01AD001A01AE00EB00AE009000AE00DE00AE00DE00AF009000AF00EB00AE001A01AE001A01AF00EB00AF009000AF00DC00AF00DC00B0009000B000EB00AF001A01AF001A01B000EB00B0009000B000DB00B000DB00B1009000B100E900B0001A01B0001A01B100E900B1009000B100DA00B100DA00B2009000B200EB00B1001B01B1001B01B200EB00B2009000B200D900B200D900B3009000B300EB00B2001B01B2001B01B300EB00B3009000B300D800B300D800B4009000B400EA00B3001B01B3001B01B400EA00B4008F00B400D600B400D600B5008F00B500EA00B4001B01B4001B01B500EA00B5008F00B500C500B500C500B6008F00B600C800B500D300B500D300B600C800B600E900B5001B01B5001B01B600E900B6008F00B600C400B600C400B7008F00B700CB00B600CF00B600CF00B700CB00B700D000B600D200B600D200B700D000B700E900B6001C01B6001C01B700E900B7008F00B700C400B700C400B8008F00B800CB00B700CE00B700CE00B800CB00B800D000B700D100B700D100B800D000B800E900B7001C01B7001C01B800E900B8008F00B800C300B800C300B9008F00B900E900B8001D01B8001D01B900E900B9008F00B900C300B900C300BA008F00BA00E800B9002201B9002201BA00E800BA008F00BA00C400BA00C400BB008F00BB00E800BA002601BA002601BB00E800BB003701BA003801BA003801BB003701BB008F00BB00C300BB00C300BC008F00BC00E800BB003B01BB003B01BC00E800BC008F00BC00C300BC00C300BD008F00BD00E700BC001701BC001701BD00E700BD001D01BC003E01BC003E01BD001D01BD008E00BD00C300BD00C300BE008E00BE00E700BD001701BD001701BE00E700BE002101BD003001BD003001BE002101BE003A01BD004501BD004501BE003A01BE008E00BE00C300BE00C300BF008E00BF00E700BE001701BE001701BF00E700BF003F01BE004901BE004901BF003F01BF008E00BF00C400BF00C400C0008E00C000E600BF001801BF001801C000E600C0004501BF004D01BF004D01C0004501C0008E00C000C400C000C400C1008E00C100E600C0001801C0001801C100E600C1004901C0004F01C0004F01C1004901C1008E00C100C400C100C400C2008E00C200E600C1001801C1001801C200E600C2004C01C1005101C1005101C2004C01C2008E00C200BD00C200BD00C3008E00C300BF00C200C400C200C400C300BF00C300E500C2001801C2001801C300E500C3004E01C2005301C2005301C3004E01C3008D00C300BD00C300BD00C4008D00C400C000C300C500C300C500C400C000C400E500C3001801C3001801C400E500C4005101C3005501C3005501C4005101C4008D00C400BD00C400BD00C5008D00C500C100C400C400C400C400C500C100C500E400C4001801C4001801C500E400C5005201C4005701C4005701C5005201C5008D00C500BB00C500BB00C6008D00C600C100C500C400C500C400C600C100C600E400C5001801C5001801C600E400C6005401C5005801C5005801C6005401C6008D00C600BB00C600BB00C7008D00C700C200C600C400C600C400C700C200C700E400C6001901C6001901C700E400C7005601C6005A01C6005A01C7005601C7008D00C700BB00C700BB00C8008D00C800E300C7001901C7001901C800E300C8005701C7005B01C7005B01C8005701C8008C00C800BB00C800BB00C9008C00C900E200C8001901C8001901C900E200C9005801C8005C01C8005C01C9005801C9008C00C900BB00C900BB00CA008C00CA00E200C9001901C9001901CA00E200CA005901C9005C01C9005C01CA005901CA008C00CA00BB00CA00BB00CB008C00CB00E200CA001901CA001901CB00E200CB005A01CA005D01CA005D01CB005A01CB008C00CB00BB00CB00BB00CC008C00CC00E200CB001901CB001901CC00E200CC005B01CB005E01CB005E01CC005B01CC008C00CC00BA00CC00BA00CD008C00CD00E100CC001901CC001901CD00E100CD005C01CC005F01CC005F01CD005C01CD008B00CD00BA00CD00BA00CE008B00CE00E100CD001901CD001901CE00E100CE005C01CD006001CD006001CE005C01CE008B00CE00BA00CE00BA00D0008B00D000E000CE001901CE001901D000E000D0005D01CE006001CE006001D0005D01D0008A00D000BC00D000BC00D1008A00D100DE00D0001901D0001901D100DE00D1005E01D0006101" & _
    "D0006101D1005E01D1008A00D100BC00D100BC00D2008A00D200DA00D1001901D1001901D200DA00D2005E01D1006101D1006101D2005E01D2008A00D200BC00D200BC00D3008A00D300D700D2001901D2001901D300D700D3005F01D2006201D2006201D3005F01D3008900D300BD00D300BD00D4008900D400D400D3001901D3001901D400D400D4005F01D3006201D3006201D4005F01D4008900D400BE00D400BE00D5008900D500C600D4001901D4001901D500C600D5006001D4006301D4006301D5006001D5008800D500BE00D500BE00D6008800D600C400D5001901D5001901D600C400D6006001D5006301D5006301D6006001D6008800D6001A01D6001A01D7008800D7006001D6006301D6006301D7006001D7008800D7001A01D7001A01D8008800D8006101D7006301D7006301D8006101D8008700D8001A01D8001A01D9008700D9006101D8006401D8006401D9006101D9008600D9001A01D9001A01DB008600DB006101D9006401D9006401DB006101DB008500DB001A01DB001A01DC008500DC006201DB006401DB006401DC006201DC008400DC001A01DC001A01DD008400DD006201DC006501DC006501DD006201DD008300DD001B01DD001B01DF008300DF006201DD006501DD006501DF006201DF008100DF008900DF008900E0008100E0008C00DF001B01DF001B01E0008C00E0006201DF006501DF006501E0006201E0007F00E0008600E0008600E1007F00E1008E00E0001B01E0001B01E1008E00E1006301E0006501E0006501E1006301E1007D00E1008300E1008300E2007D00E2008E00E1001B01E1001B01E2008E00E2006301E1006501E1006501E2006301E2007A00E2008000E2008000E3007A00E3008E00E2001C01E2001C01E3008E00E3006301E2006601E2006601E3006301E3007800E3007E00E3007E00E4007800E4008E00E3001C01E3001C01E4008E00E4006301E3006601E3006601E4006301E4007600E4007B00E4007B00E5007600E5008E00E4001C01E4001C01E5008E00E5006301E4006601E4006601E5006301E5007300E5007900E5007900E6007300E6008F00E5001C01E5001C01E6008F00E6006301E5006601E5006601E6006301E6007200E6007700E6007700E7007200E7008F00E6001D01E6001D01E7008F00E7006401E6006601E6006601E7006401E7007000E7007500E7007500E8007000E8009000E7001D01E7001D01E8009000E8006401E7006601E7006601E8006401E8006E00E8007300E8007300E9006E00E9009000E8001D01E8001D01E9009000E9006401E8006601E8006601E9006401E9006C00E9007200E9007200EA006C00EA009000E9001E01E9001E01EA009000EA006401E9006601E9006601EA006401EA006B00EA007000EA007000EB006B00EB008F00EA001E01EA001E01EB008F00EB006401EA006701EA006701EB006401EB006D01EA007501EA007501EB006D01EB006A00EB006E00EB006E00EC006A00EC008F00EB001E01EB001E01EC008F00EC006401EB006701EB006701EC006401EC006901EB007001EB007001EC006901EC007301EB007801EB007801EC007301EC006900EC006D00EC006D00ED006900ED008F00EC001F01EC001F01ED008F00ED006401EC006D01EC006D01ED006401ED007501EC007A01EC007A01ED007501ED006800ED006B00ED006B00EE006800EE008F00ED001F01ED001F01EE008F00EE006401ED006B01ED006B01EE006401EE007601ED007B01ED007B01EE007601EE006700EE006B00EE006B00EF006700EF008E00EE002001EE002001EF008E00EF006401EE006801EE006801EF006401EF007901EE007D01EE007D01EF007901EF006700EF006A00EF006A00F0006700F0008E00EF002001EF002001F0008E00F0006101EF006701EF006701F0006101F0007B01EF007F01EF007F01F0007B01F0006600F0006900F0006900F1006600F1008E00F0002001F0002001F1008E00F1006001F0006501F0006501F1006001F1007C01F0008001F0008001F1007C01F1006600F1006900F1006900F2006600F2008E00F1002101F1002101F2008E00F2005E01F1006201F1006201F2005E01F2007E01F1008101F1008101F2007E01F2006500F2006800F2006800F3006500F3008E00F2002201F2002201F3008E00F3005E01F2006001F2006001F3005E01F3007F01F2008201F2008201F3007F01F3006500F3006800F3006800F4006500F4008D00F3002201F3002201F4008D00F4005D01F3005F01F3005F01F4005D01F4008001F3008201F3008201F4008001F4006500F4006700F4006700F5006500F5008D00F4002301F4002301F5008D00F5005D01F4005F01F4005F01F5005D01F5008001F4008201F4008201F5008001F5006500F5006700F5006700F6006500F6008D00F5002301F5002301F6008D00F6005D01F5006001F5006001F6005D01F6008101F5008301F5008301F6008101F6006400F6006700F6006700F7006400F7008C00F6002401F6002401F7008C00F7005F01F6006301F6006301F7005F01F7008101F6008301F6008301F7008101F7006400F7006700F7006700F8006400F8008C00F7002501F7002501F8008C00F8006001F7006501F7006501F8006001F8008201F7008301F7008301F8008201F8006400F8006700F8006700F9006400F9008C00F8002601F8002601F9008C00F9006101F8006701F8006701F9006101F9006E01F8007101F8007101F9006E01F9008201F8008301F8008301F9008201F9006400F9006700F9006700FA006400FA008C00F9002601F9002601FA008C00FA006101F9006301F9006301FA006101" & _
    "FA006D01F9007301F9007301FA006D01FA008201F9008401F9008401FA008201FA006400FA006600FA006600FB006400FB008B00FA002701FA002701FB008B00FB006001FA006201FA006201FB006001FB006C01FA006F01FA006F01FB006C01FB007001FA007401FA007401FB007001FB008201FA008401FA008401FB008201FB006400FB006600FB006600FC006400FC008B00FB002801FB002801FC008B00FC005F01FB006101FB006101FC005F01FC006C01FB006F01FB006F01FC006C01FC007101FB007501FB007501FC007101FC008101FB008301FB008301FC008101FC006300FC006600FC006600FD006300FD008A00FC002901FC002901FD008A00FD005F01FC006101FC006101FD005F01FD006C01FC007401FC007401FD006C01FD008101FC008201FC008201FD008101FD006300FD006600FD006600FE006300FE008A00FD002901FD002901FE008A00FE005E01FD006001FD006001FE005E01FE006B01FD007301FD007301FE006B01FE008001FD008201FD008201FE008001FE006300FE006600FE006600FF006300FF008A00FE002A01FE002A01FF008A00FF005D01FE005F01FE005F01FF005D01FF006A01FE006C01FE006C01FF006A01FF006E01FE007201FE007201FF006E01FF007F01FE008101FE008101FF007F01FF006300FF006600FF0066000001630000018900FF002B01FF002B010001890000015D01FF005F01FF005F0100015D0100017F01FF008101FF00810100017F01000163000001660000016600010163000101890000012C0100012C010101890001015C0100015E0100015E0101015C0101017E01000181010001810101017E01010163000101660001016600020163000201890001012C0101012C010201890002015B0101015E0101015E0102015B0102017E01010180010101800102017E01020163000201660002016600030163000301880002012D0102012D010301880003015A0102015D0102015D0103015A0103017E01020180010201800103017E01030163000301660003016600040163000401880003012E0103012E010401880004015A0103015C0103015C0104015A0104017E01030180010301800104017E01040163000401660004016600050163000501880004012E0104012E01050188000501580104015B0104015B010501580105017D0104017F0104017F0105017D01050163000501660005016600060163000601870005012F0105012F01060187000601570105015A0105015A010601570106017D0105017F0105017F0106017D0106016300060166000601660007016300070187000601300106013001070187000701560106015901060159010701560107017C0106017F0106017F0107017C0107016300070166000701660008016300080187000701310107013101080187000801550107015801070158010801550108017C0107017F0107017F0108017C0108016300080166000801660009016300090186000801320108013201090186000901540108015601080156010901540109017C0108017E0108017E0109017C010901640009016600090166000A0164000A01850009013201090132010A0185000A01530109015501090155010A0153010A017B0109017E0109017E010A017B010A0164000A0166000A0166000B0164000B0185000A0133010A0133010B0185000B0152010A0155010A0155010B0152010B017B010A017E010A017E010B017B010B0164000B0167000B0167000C0164000C0185000B0134010B0134010C0185000C0152010B0154010B0154010C0152010C017C010B017E010B017E010C017C010C0164000C0167000C0167000D0164000D0184000C0135010C0135010D0184000D0151010C0153010C0153010D0151010D017C010C017E010C017E010D017C010D0164000D0167000D0167000E0164000E0184000D0135010D0135010E0184000E0150010D0152010D0152010E0150010E017D010D017F010D017F010E017D010E0164000E0167000E0167000F0164000F0183000E0136010E0136010F0183000F0150010E0152010E0152010F0150010F017D010E017F010E017F010F017D010F0164000F0167000F01670010016400100183000F0137010F01370110018300100150010F0152010F0152011001500110017E010F0180010F01800110017E01100164001001670010016700110164001101820010013801100138011101820011014F01100151011001510111014F0111017E01100180011001800111017E01110164001101670011016700120164001201820011013801110138011201820012014E01110150011101500112014E0112017F01110181011101810112017F01120164001201670012016700130164001301810012013901120139011301810013013A0112013C0112013C0113013A0113014E01120150011201500113014E0113017F01120181011201810113017F01130164001301670013016700140164001401800013013C0113013C011401800014014D0113014F0113014F0114014D0114018001130182011301820114018001140165001401670014016700150165001501800014013C0114013C011501800015014C0114014F0114014F0115014C0115018101140182011401820115018101150165001501680015016800160165001601800015013C0115013C011601800016014C0115014E0115014E0116014C01160181011501830115018301160181011601650016016800160168001701650017017F0016013C0116013C0117017F0017014B0116014D0116014D0117014B01170182011601830116018301170182011701650017016800" & _
    "170168001801650018017E0017013D0117013D0118017E0018014A0117014D0117014D0118014A0118015401170155011701550118015401180182011701840117018401180182011801650018016800180168001901650019017D0018013D0118013D0119017D001901490118014C0118014C0119014901190182011801840118018401190182011901650019016800190168001A0165001A016B0019016C0019016C001A016B001A017D0019013E0119013E011A017D001A01480119014B0119014B011A0148011A01520119015301190153011A0152011A01820119018401190184011A0182011A0166001A0169001A0169001B0166001B016B001A016C001A016C001B016B001B017C001A013E011A013E011B017C001B0148011A014A011A014A011B0148011B0181011A0184011A0184011B0181011B0166001B0169001B0169001C0166001C016B001B016D001B016D001C016B001C017B001B013F011B013F011C017B001C0147011B0149011B0149011C0147011C0181011B0183011B0183011C0181011C0166001C0169001C0169001D0166001D016B001C016D001C016D001D016B001D017B001C013F011C013F011D017B001D0146011C0149011C0149011D0146011D0181011C0183011C0183011D0181011D0166001D016A001D016A001E0166001E016C001D016D001D016D001E016C001E017A001D0140011D0140011E017A001E0146011D0148011D0148011E0146011E0182011D0184011D0184011E0182011E0166001E016A001E016A001F0166001F016C001E016D001E016D001F016C001F017A001E0140011E0140011F017A001F0145011E0148011E0148011F0145011F0182011E0184011E0184011F0182011F0167001F016A001F016A002001670020016C001F016D001F016D0020016C00200179001F0141011F01410120017900200145011F0147011F01470120014501200182011F0185011F018501200182012001670020016A0020016A002101670021016C0020016D0020016D0021016C0021016E0020016F0020016F0021016E002101780020014101200141012101780021014501200147012001470121014501210183012001850120018501210183012101670021016A0021016A002201670022016B0021016D0021016D0022016B0022016E00210170002101700022016E002201780021014201210142012201780022014501210148012101480122014501220183012101850121018501220183012201670022016A0022016A002301670023016C00220170002201700023016C002301770022014201220142012301770023014501220148012201480123014501230183012201860122018601230183012301670023016B0023016B002401670024016C00230170002301700024016C002401750023014301230143012401750024014501230148012301480124014501240183012301860123018601240183012401680024016B0024016B002501680025016C00240171002401710025016C00250174002401430124014301250174002501450124014801240148012501450125016401240165012401650125016401250183012401850124018501250183012501680025016B0025016B002601680026016C00250172002501720026016C00260174002501440125014401260174002601450125014801250148012601450126016201250166012501660126016201260170012501720125017201260170012601830125018501250185012601830126016800260144012601440127016800270145012601480126014801270145012701610126016501260165012701610127016F01260173012601730127016F01270182012601850126018501270182012701690027014801270148012801690028015F01270165012701650128015F0128016F01270173012701730128016F0128018201270184012701840128018201280169002801480128014801290169002901640128016501280165012901640129016F01280172012801720129016F01290182012801840128018401290182012901690029014801290148012A0169002A01830129018401290184012A0183012A016A002A0148012A0148012C016A002C0183012A0185012A0185012C0183012C016B002C0148012C0148012E016B002E0183012C0185012C0185012E0183012E016C002E0148012E01480130016C00300183012E0185012E0185013001830130016D00300148013001480131016D003101820130018401300184013101820131016E00310148013101480132016E003201810131018301310183013201810132016E00320148013201480133016E0033017F01320183013201830133017F0133016E00330148013301480134016E0034017E01330181013301810134017E0134016E00340148013401480135016E0035017C0134017F0134017F0135017C0135016E00350148013501480136016E0036017A0135017E0135017E0136017A0136016D00360148013601480137016D003701780136017D0136017D013701780137016D00370148013701480138016D003801770137017B0137017B013801770138016D00380148013801480139016D003901750138017901380179013901750139016C0039014801390148013A016C003A01750139017801390178013A0175013A016C003A0148013A0148013B016C003B0174013A0177013A0177013B0174013B016C003B0148013B0148013C016C003C0172013B0176013B0176013C0172013C016B003C0148013C0148013D016B003D0171013C0175013C0175013D0171013D016B003D0148013D0148013E016B00" & _
    "3E0170013D0174013D0174013E0170013E016B003E0148013E0148013F016B003F016E013E0172013E0172013F016E013F016B003F0148013F01480140016B0040016C013F0171013F01710140016C0140016B00400148014001480141016B0041016B01400170014001700141016B0141016B00410148014101480142016B004201690141016E0141016E014201690142016B00420148014201480143016B004301680142016C0142016C014301680143016A00430148014301480144016A004401650143016A0143016A014401650144016A00440148014401480145016A004501640144016901440169014501640145016A00450148014501480146016A004601630145016701450167014601630146016A00460148014601480147016A004701630146016601460166014701630147016A00470148014701480148016A004801620147016501470165014801620148016A00480148014801480149016A004901610148016501480165014901610149016A0049014901490149014A016A004A01600149016501490165014A0160014A016A004A0148014A0148014B016A004B0160014A0166014A0166014B0160014B016A004B0148014B01480150016A00500162014B0165014B0165015001620150016A00500147015001470151016A005101620150016501500165015101620151016B00510145015101450152016B005201620151016401510164015201620152016B00520145015201450153016B00530146015201470152014701530146015301610152016401520164015301610153016B00530144015301440154016B00540146015301470153014701540146015401610153016301530163015401610154016B00540143015401430155016B005501600154016301540163015501600155016C00550143015501430156016C005601600155016301550163015601600156016C00560143015601430157016C005701600156016201560162015701600157016C00570142015701420158016C0058015F01570162015701620158015F0158016C00580141015801410159016C0059015F01580162015801620159015F0159016D0059014101590141015A016D005A015F0159016101590161015A015F015A016D005A0140015A0140015B016D005B015E015A0161015A0161015B015E015B016D005B013F015B013F015C016D005C015E015B0160015B0160015C015E015C016E005C013E015C013E015D016E005D015E015C0160015C0160015D015E015D016F005D013D015D013D015E016F005E015D015D0160015D0160015E015D015E016F005E013D015E013D015F016F005F015D015E015F015E015F015F015D015F016F005F013C015F013C0160016F0060015D015F015F015F015F0160015D016001700060013A0160013A016101700061015C0160015F0160015F0161015C016101710061013A0161013A016201710062015C0161015F0161015F0162015C016201710062013801620138016301710063015C0162015F0162015F0163015C016301720063013801630138016401720064015C0163015E0163015E0164015C016401730064013701640137016501730065015C0164015E0164015E0165015C016501740065013601650136016601740066015C0165015E0165015E0166015C016601750066013401660134016701750067015C0166015E0166015E0167015C016701750067013301670133016801750068015C0167015E0167015E0168015C016801750068013201680132016901750069015C0168015E0168015E0169015C016901760069013001690130016A0176006A015C0169015E0169015E016A015C016A0176006A012E016A012E016D0176006D015C016A015E016A015E016D015C016D0176006D012D016D012D016E0176006E015C016D015E016D015E016E015C016E0177006E017A006E017A006F0177006F017B006E012D016E012D016F017B006F015C016E015E016E015E016F015C016F0177006F017A006F017A007001770070017F006F012D016F012D0170017F0070015C016F015E016F015E0170015C017001780070017B0070017B007101780071017D0070017F0070017F0071017D007101800070012C0170012C017101800071015C0170015F0170015F0171015C017101780071017B0071017B007201780072017D0071017E0071017E0072017D007201800071012C0171012C017201800072015C0171015F0171015F0172015C017201780072017B0072017B007301780073017D0072017E0072017E0073017D00730182007201830072018300730182007301850072012C0172012C017301850073015D0172015F0172015F0173015D017301790073017C0073017C00750179007501850073012B0173012B017501850075015D0173015F0173015F0175015D017501790075017C0075017C00760179007601860075012B0175012B017601860076015D0175015F0175015F0176015D0176017A0076017D0076017D0077017A007701880076012A0176012A017701880077015D0176015F0176015F0177015D0177017A0077017D0077017D0078017A007801890077012A0177012A017801890078015E0177015F0177015F0178015E0178017A0078017E0078017E0079017A007901890078012A0178012A017901890079015E0178015F0178015F0179015E0179017A0079017E0079017E007A017A007A01890079012901790129017A0189007A015E0179016001790160017A015E017A017B007A017D007A017D007B017B007B0189007A0129017A0129017B0189007B015E017A0160017A0160017B015E017B0158007B015B00" & _
    "7B015B007C0158007C017B007B017D007B017D007C017B007C0189007B0129017B0129017C0189007C015E017B0160017B0160017C015E017C0154007C015D007C015D007D0154007D017B007C017D007C017D007D017B007D0189007C0128017C0128017D0189007D015E017C0160017C0160017D015E017D0150007D0155007D0155007E0150007E015B007D015F007D015F007E015B007E017A007D017D007D017D007E017A007E0189007D0128017D0128017E0189007E015E017D0160017D0160017E015E017E014D007E0152007E0152007F014D007F015D007E0161007E0161007F015D007F017A007E017D007E017D007F017A007F0189007E0127017E0127017F0189007F015E017E0160017E0160017F015E017F014A007F014F007F014F0080014A0080015E007F0162007F01620080015E0080017A007F017D007F017D0080017A00800189007F0127017F0127018001890080015E017F0160017F01600180015E018001470080014C0080014C00810147008101600080016400800164008101600081017A0080017C0080017C0081017A008101890080012601800126018101890081015E01800161018001610181015E01810144008101490081014900820144008201620081016600810166008201620082017A0081017C0081017C0082017A008201890081012601810126018201890082015E01810161018101610182015E01820141008201460082014600830141008301630082016800820168008301630083017A0082017C0082017C0083017A008301880082012501820125018301880083015E01820161018201610183015E0183013D00830143008301430084013D008401650083016900830169008401650084017A0083017C0083017C0084017A0084018B00830125018301250184018B0084015E01830161018301610184015E0184013B00840140008401400085013B008501670084016B0084016B00850167008501790084017C0084017C00850179008501880084012401840124018501880085015E01840161018401610185015E018501380085013D0085013D00860138008601690085016C0085016C00860169008601790085017C0085017C00860179008601880085012401850124018601880086015E01850161018501610186015E01860100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001" & _
    "018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001" & _
    "01810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181000101810001018100010181"

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Global $iWidth = 390 * $fScale
    Global $iHeight = 390 * $fScale

    [/autoit] [autoit][/autoit] [autoit]

    Global $hGui = GUICreate("Test", $iWidth, $iHeight)
    GUISetBkColor(0xC00000, $hGui)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")

    [/autoit] [autoit][/autoit] [autoit]

    _SetRegion($hGui, $bRegion, $fScale)
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While Sleep(20)
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _SetRegion($hWnd, ByRef $bRegion, $fScale = 1)
    _GDIPlus_Startup()

    [/autoit] [autoit][/autoit] [autoit]

    Local $iData = BinaryLen($bRegion)
    Local $tData = DllStructCreate("byte[" & $iData & "];")
    DllStructSetData($tData, 1, $bRegion)
    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateRegionRgnData", "ptr", DllStructGetPtr($tData), "int", $iData, "int*", 0)
    Local $hRegion = $aResult[3]

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Local $hMatrix = _GDIPlus_MatrixCreate()
    _GDIPlus_MatrixScale($hMatrix, $fScale, $fScale)
    _GDIPlus_MatrixTranslate($hMatrix, _WinAPI_GetSystemMetrics(7), _WinAPI_GetSystemMetrics(8) + _WinAPI_GetSystemMetrics($SM_CYSIZE) + 1)
    DllCall($ghGDIPDll, "uint", "GdipTransformRegion", "hwnd", $hRegion, "hwnd", $hMatrix)
    _GDIPlus_MatrixDispose($hMatrix)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Local $aSize = WinGetPos(HWnd($hWnd))
    Local $tRect = _GDIPlus_RectFCreate(0, 0, $aSize[2], $aSize[3])
    $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateRegionRect", "ptr", DllStructGetPtr($tRect), "int*", 0)
    Local $hRegion_1 = $aResult[2]

    [/autoit] [autoit][/autoit] [autoit]

    Local $aClient = WinGetClientSize(HWnd($hWnd))
    $tRect = _GDIPlus_RectFCreate(0, 0, $aClient[0], $aClient[1])

    [/autoit] [autoit][/autoit] [autoit]

    Local $tPnt = DllStructCreate("int X; int Y;")
    _WinAPI_ClientToScreen($hWnd, $tPnt)
    DllStructSetData($tRect, 1, DllStructGetData($tPnt, "X") - $aSize[0])
    DllStructSetData($tRect, 2, DllStructGetData($tPnt, "Y") - $aSize[1])

    [/autoit] [autoit][/autoit] [autoit]

    DllCall($ghGDIPDll, "uint", "GdipCombineRegionRect", "hwnd", $hRegion_1, "ptr", DllStructGetPtr($tRect), "int", 3)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    DllCall($ghGDIPDll, "uint", "GdipCombineRegionRegion", "hwnd", $hRegion, "hwnd", $hRegion_1, "int", 2)
    DllCall($ghGDIPDll, "uint", "GdipDeleteRegion", "hwnd", $hRegion_1)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Local $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    $aResult = DllCall($ghGDIPDll, "uint", "GdipGetRegionHRgn", "hwnd", $hRegion, "hwnd", $hGraphics, "int*", 0)
    Local $hRgn = $aResult[3]
    DllCall($ghGDIPDll, "uint", "GdipDeleteRegion", "hwnd", $hRegion)

    [/autoit] [autoit][/autoit] [autoit]

    DllCall('user32.dll', 'long', 'SetWindowRgn', 'hwnd', $hWnd, 'long', $hRgn, 'int', 1)
    _WinAPI_DeleteObject($hRegion)

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_Shutdown()
    EndFunc ;==>_SetRegion

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Exit()
    Exit
    EndFunc ;==>_Exit

    [/autoit]
  • Code Optimierungsvorschläge

    • eukalyptus
    • 13. März 2013 um 20:40

    Hi

    Hier der Ansatz via GDI+ Path:

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    #include <TestArray.au3>
    #include <WinAPI.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Opt("GUIOnEventMode", 1)
    Opt("MustDeclareVars", 1)

    [/autoit] [autoit][/autoit] [autoit]

    Global $fScale = 1

    [/autoit] [autoit][/autoit] [autoit]

    Global $aPixelArray = _PixelCoordinate()

    [/autoit] [autoit][/autoit] [autoit]

    Global $aSize = StringSplit($aPixelArray[0], ",", 2)
    Global $iWidth = $aSize[0] * $fScale
    Global $iHeight = $aSize[1] * $fScale

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Global $hGui = GUICreate("OSC", $iWidth, $iHeight)
    GUISetBkColor(0xC00000, $hGui)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")

    [/autoit] [autoit][/autoit] [autoit]

    _SetRegion($hGui, $aPixelArray, $fScale)
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While Sleep(20)
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _SetRegion($hWnd, $aPix, $fScale)
    Local $iCnt = UBound($aPix) - 1
    Local $tRect = DllStructCreate("float[" & $iCnt * 4 & "];")

    [/autoit] [autoit][/autoit] [autoit]

    Local $aSplit, $iIdx
    For $i = 1 To $iCnt
    $iIdx = ($i - 1) * 4
    $aSplit = StringSplit($aPix[$i], ',')
    DllStructSetData($tRect, 1, $aSplit[1], $iIdx + 1)
    DllStructSetData($tRect, 1, $aSplit[2], $iIdx + 2)
    DllStructSetData($tRect, 1, 1, $iIdx + 3)
    DllStructSetData($tRect, 1, 1, $iIdx + 4)
    Next

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_Startup()

    [/autoit] [autoit][/autoit] [autoit]

    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreatePath", "int", 0, "int*", 0)
    Local $hPath = $aResult[2]

    [/autoit] [autoit][/autoit] [autoit]

    DllCall($ghGDIPDll, "uint", "GdipAddPathRectangles", "hwnd", $hPath, "ptr", DllStructGetPtr($tRect), "int", $iCnt)

    [/autoit] [autoit][/autoit] [autoit]

    Local $hMatrix = _GDIPlus_MatrixCreate()
    _GDIPlus_MatrixScale($hMatrix, $fScale, $fScale)
    _GDIPlus_MatrixTranslate($hMatrix, _WinAPI_GetSystemMetrics(7), _WinAPI_GetSystemMetrics(8) + _WinAPI_GetSystemMetrics($SM_CYSIZE) + 1)
    DllCall($ghGDIPDll, "uint", "GdipTransformPath", "hwnd", $hPath, "hwnd", $hMatrix)
    _GDIPlus_MatrixDispose($hMatrix)

    [/autoit] [autoit][/autoit] [autoit]

    $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateRegionPath", "hwnd", $hPath, "int*", 0)
    Local $hRegion = $aResult[2]
    DllCall($ghGDIPDll, "uint", "GdipDeletePath", "hwnd", $hPath)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Local $aSize = WinGetPos(HWnd($hWnd))
    $tRect = _GDIPlus_RectFCreate(0, 0, $aSize[2], $aSize[3])
    $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateRegionRect", "ptr", DllStructGetPtr($tRect), "int*", 0)
    Local $hRegion_1 = $aResult[2]

    [/autoit] [autoit][/autoit] [autoit]

    Local $aClient = WinGetClientSize(HWnd($hWnd))
    $tRect = _GDIPlus_RectFCreate(0, 0, $aClient[0], $aClient[1])

    [/autoit] [autoit][/autoit] [autoit]

    Local $tPnt = DllStructCreate("int X; int Y;")
    _WinAPI_ClientToScreen($hWnd, $tPnt)
    DllStructSetData($tRect, 1, DllStructGetData($tPnt, "X") - $aSize[0])
    DllStructSetData($tRect, 2, DllStructGetData($tPnt, "Y") - $aSize[1])

    [/autoit] [autoit][/autoit] [autoit]

    DllCall($ghGDIPDll, "uint", "GdipCombineRegionRect", "hwnd", $hRegion_1, "ptr", DllStructGetPtr($tRect), "int", 3)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    DllCall($ghGDIPDll, "uint", "GdipCombineRegionRegion", "hwnd", $hRegion, "hwnd", $hRegion_1, "int", 2)
    DllCall($ghGDIPDll, "uint", "GdipDeleteRegion", "hwnd", $hRegion_1)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Local $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    $aResult = DllCall($ghGDIPDll, "uint", "GdipGetRegionHRgn", "hwnd", $hRegion, "hwnd", $hGraphics, "int*", 0)
    Local $hRgn = $aResult[3]
    DllCall($ghGDIPDll, "uint", "GdipDeleteRegion", "hwnd", $hRegion)

    [/autoit] [autoit][/autoit] [autoit]

    DllCall('user32.dll', 'long', 'SetWindowRgn', 'hwnd', $hWnd, 'long', $hRgn, 'int', 1)
    _WinAPI_DeleteObject($hRegion)

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_Shutdown()
    EndFunc ;==>_SetRegion

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Exit()
    Exit
    EndFunc ;==>_Exit

    [/autoit]


    Du kannst auch die in dieser Funktion erstellte Region mit GdipGetRegionData auslesen und als Binary im Script mitgeben und via GdipCreateRegionRgnData erstellen.
    Dann ersparst du dir schonmal die Schleife.
    Mit GdipTransformRegion kann diese Region immer noch skaliert werden...

    lgE

  • Happy Birthday Eukalyptus & Developer30

    • eukalyptus
    • 5. März 2013 um 08:38

    Nachträglich noch Alles Gute Developer30! :thumbup:
    Und Vielen Dank an Euch für die netten Glückwünsche!

    Zitat von UEZ

    @GDI+ Meister: lange nicht mehr aktiv!?!?!?


    Du meinst doch nicht etwa mich?! :D
    Langsam sehe ich ein Licht am Ende des Tunnels; Der Streß wird weniger und bald sollte ich wieder etwas mehr Zeit für mich und meine Hobbies haben.

    Also bis bald ;)

  • Coole Bilder berechnen (Domain coloring / complex numbers) (Assembler)

    • eukalyptus
    • 28. Dezember 2012 um 00:05

    Erstmal vielen Dank fürs Feedback!

    Gibt es in diesem Fall ein besseres Kompliment, als mit Andy verwechselt zu werden ?!? :rock:

    Zitat von name22

    Jetzt werde ich mich wohl für eine Weile mit der Mathematik hinter dem ganzen beschäftigen.

    Die grundlegende Mathematik verstehe ich auch nicht :whistling:
    Es handelt sich grob gesagt um komplexe Zahlen, welche durch einen Real und einen Imaginär Anteil definiert sind.

    Der Real Anteil wird mit X-Koordinaten befüllt, der Imag-Anteil mit Y-Koordinaten.
    Dann werden diese komplexe Zahlen keiner oder mehrerer mathematischer Operationen unterzogen und dann wird das Bild im HSV-Format berechnet.
    Diese Formeln hab ich mir einfach abgeguckt :whistling:

    Hier das Testscript in reinem AutoItCode:

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    #include <WinAPI.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global Const $cPI = ATan(1) * 4
    Global Const $c2PI = $cPI * 2
    Global Const $cPI2 = $cPI / 2

    [/autoit] [autoit][/autoit] [autoit]

    Global $_hMSVCRT = DllOpen('msvcrt.dll')

    [/autoit] [autoit][/autoit] [autoit]

    Opt("MustDeclareVars", 1)
    Opt("GUIOnEventMode", 1)

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_Startup()

    [/autoit] [autoit][/autoit] [autoit]

    Global $iWidth = 600
    Global $iHeight = 600

    [/autoit] [autoit][/autoit] [autoit]

    Global $hGui = GUICreate("GDI+ Script by Eukalyptus", $iWidth, $iHeight)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    Global $hDC = _WinAPI_GetDC($hGui)
    Global $hBMP = _WinAPI_CreateCompatibleBitmap($hDC, $iWidth, $iHeight)
    Global $hBmpTmp = _GDIPlus_BitmapCreateFromHBITMAP($hBMP)
    _WinAPI_DeleteObject($hBMP)
    $hBMP = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBmpTmp)
    _GDIPlus_BitmapDispose($hBmpTmp)
    Global $hCDC = _WinAPI_CreateCompatibleDC($hDC)
    Global $hOBJ = _WinAPI_SelectObject($hCDC, $hBMP)
    Global $hGfxBuffer = _GDIPlus_GraphicsCreateFromHDC($hCDC)

    [/autoit] [autoit][/autoit] [autoit]

    ;_GDIPlus_GraphicsSetSmoothingMode($hGfxBuffer, 2)
    _GDIPlus_GraphicsClear($hGfxBuffer, 0xFF000000)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    GUIRegisterMsg($WM_PAINT, "WM_PAINT")
    GUIRegisterMsg($WM_ERASEBKGND, "WM_PAINT")

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Global $fRmi = -3
    Global $fRma = 3
    Global $fImi = -3
    Global $fIma = 3

    [/autoit] [autoit][/autoit] [autoit]

    _CalcColors(80, 80, $iWidth, $iHeight)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    ;_Draw()
    Sleep(10)
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _CalcColors($iCX, $iCY, $iW, $iH)
    Local $iTimer = TimerInit()

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_GraphicsClear($hGfxBuffer, 0xFF000000)
    Local $hBrush = _GDIPlus_BrushCreateSolid()

    [/autoit] [autoit][/autoit] [autoit]

    Local $fX, $fY, $fW, $fH

    [/autoit] [autoit][/autoit] [autoit]

    $fW = $iW / $iCX
    $fH = $iH / $iCY

    [/autoit] [autoit][/autoit] [autoit]

    Local $fRe, $fIm, $fIm2, $tC, $aV
    Local $fHue, $fSat, $fVal
    Local $iR, $iG, $iB

    [/autoit] [autoit][/autoit] [autoit]

    For $y = 0 To $iCY - 1
    $fY = $y * $fH
    $fIm2 = $fIma - ($fIma - $fImi) * $y / ($iCY - 1)

    [/autoit] [autoit][/autoit] [autoit]

    For $x = 0 To $iCX - 1
    $fX = $x * $fW

    [/autoit] [autoit][/autoit] [autoit]

    $fRe = $fRma - ($fRma - $fRmi) * $x / ($iCX - 1)
    $fIm = $fIm2

    [/autoit] [autoit][/autoit] [autoit]

    ;_CPow($fRe, $fIm, 0.4)
    ;_CSqrt($fRe, $fIm)
    _CLog($fRe, $fIm)
    ;_CSin($fRe, $fIm)
    ;_CCos($fRe, $fIm)
    ;_CTan($fRe, $fIm)
    ;_CExp($fRe, $fIm)
    ;_CAbs($fRe, $fIm)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $fHue = _Atan2($fIm, $fRe)
    While $fHue < 0
    $fHue += $c2PI
    WEnd
    $fHue /= $c2PI

    [/autoit] [autoit][/autoit] [autoit]

    $fSat = Abs(Sin($c2PI * Sqrt($fRe * $fRe + $fIm * $fIm)))

    [/autoit] [autoit][/autoit] [autoit]

    $fVal = Abs(Sin($c2PI * $fIm) * Sin($c2PI * $fRe)) ^ 0.3
    $fVal = 0.5 * ((1 - $fSat) + $fVal + Sqrt((1 - $fSat - $fVal) ^ 2 + 0.01))

    [/autoit] [autoit][/autoit] [autoit]

    If $fSat > 1 Then
    $fSat = 1
    ElseIf $fSat < 0 Then
    $fSat = 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    If $fVal > 1 Then
    $fVal = 1
    ElseIf $fVal < 0 Then
    $fVal = 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    _HSVtoRGB($fHue, $fSat, $fVal, $iR, $iG, $iB)

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_BrushSetSolidColor($hBrush, BitOR(0xFF000000, BitShift($iR * 0xFF, -16), BitShift($iG * 0xFF, -8), $iB * 0xFF))
    DllCall($ghGDIPDll, "int", "GdipFillRectangle", "handle", $hGfxBuffer, "handle", $hBrush, "float", $fX, "float", $fY, "float", $fW, "float", $fH)

    [/autoit] [autoit][/autoit] [autoit]

    Next
    Next

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_BrushDispose($hBrush)

    [/autoit] [autoit][/autoit] [autoit]

    _WinAPI_BitBlt($hDC, 0, 0, $iWidth, $iHeight, $hCDC, 0, 0, 0x00CC0020)

    [/autoit] [autoit][/autoit] [autoit]

    ConsoleWrite(TimerDiff($iTimer) & @CRLF)
    EndFunc ;==>_CalcColors

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Atan2($fY, $fX)
    Local $aResult = DllCall($_hMSVCRT, "double:cdecl", "atan2", "double", $fY, "double", $fX)
    If @error Then Return SetError(1, 1, False)
    Return $aResult[0]
    EndFunc ;==>_Atan2

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _CLog(ByRef $fR, ByRef $fI)
    Local $fRP = Sqrt($fR * $fR + $fI * $fI)
    Local $fIP = _Atan2($fI, $fR)
    If $fIP > $cPI Then $fIP = $fIP - $c2PI
    $fR = Log($fRP)
    $fI = $fIP
    EndFunc ;==>_CLog

    [/autoit] [autoit][/autoit] [autoit]

    Func _CSqrt(ByRef $fR, ByRef $fI)
    Local $fT = Sqrt($fR * $fR + $fI * $fI)
    Local $fRP = Sqrt(0.5 * ($fT + $fR))
    Local $fIP = Sqrt(0.5 * ($fT - $fR))
    If $fI < 0.0 Then $fIP = -$fIP

    [/autoit] [autoit][/autoit] [autoit]

    $fR = $fRP
    $fI = $fIP
    EndFunc ;==>_CSqrt

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _CAbs(ByRef $fR, ByRef $fI)
    $fR = Abs($fR)
    $fI = Abs($fI)
    EndFunc ;==>_CAbs

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _CPow(ByRef $fR, ByRef $fI, $fExp)
    _CLog($fR, $fI)
    $fR *= $fExp
    $fI *= $fExp
    _CExp($fR, $fI)
    EndFunc ;==>_CPow

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _CSin(ByRef $fR, ByRef $fI)
    Local $fRT = $fR
    Local $fIT = $fI
    $fR = Sin($fRT) * (Exp($fIT) + Exp(-$fIT)) * 0.5
    $fI = Cos($fRT) * (Exp($fIT) - Exp(-$fIT)) * 0.5
    EndFunc ;==>_CSin

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _CCos(ByRef $fR, ByRef $fI)
    Local $fRT = $fR
    Local $fIT = $fI
    $fR = Cos($fRT) * (Exp($fIT) + Exp(-$fIT)) * 0.5
    $fI = Sin($fRT) * (Exp($fIT) - Exp(-$fIT)) * 0.5
    EndFunc ;==>_CCos

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _CTan(ByRef $fR, ByRef $fI)
    Local $fR1 = $fR
    Local $fI1 = $fI
    Local $fR2 = $fR
    Local $fI2 = $fI
    _CSin($fR1, $fI1)
    _CCos($fR2, $fI2)

    [/autoit] [autoit][/autoit] [autoit]

    Local $Y_AbsSqrtInv = 1.0 / (($fR2 * $fR2) + ($fI2 * $fI2))
    $fR = $Y_AbsSqrtInv * (($fR1 * $fR2) - ($fI1 * $fI2))
    $fI = $Y_AbsSqrtInv * (($fR1 * $fI2) - ($fI1 * $fR2))
    EndFunc ;==>_CTan

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _CExp(ByRef $fR, ByRef $fI)
    Local $fRT = Exp($fR)
    $fR = $fRT * Cos($fI)
    $fI = $fRT * Sin($fI)
    EndFunc ;==>_CExp

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _HSVtoRGB($fH, $fS, $fV, ByRef $iR, ByRef $iG, ByRef $iB)
    $fH *= 6

    [/autoit] [autoit][/autoit] [autoit]

    Local $iS = Floor($fH)
    Local $fF = $fH - $iS

    [/autoit] [autoit][/autoit] [autoit]

    Local $fP = $fV * (1 - $fS)
    Local $fQ = $fV * (1 - $fS * $fF)
    Local $fT = $fV * (1 - $fS * (1 - $fF))

    [/autoit] [autoit][/autoit] [autoit]

    Switch $iS
    Case 0
    $iR = $fV
    $iG = $fT
    $iB = $fP
    Case 1
    $iR = $fQ
    $iG = $fV
    $iB = $fP
    Case 2
    $iR = $fP
    $iG = $fV
    $iB = $fT
    Case 3
    $iR = $fP
    $iG = $fQ
    $iB = $fV
    Case 4
    $iR = $fT
    $iG = $fP
    $iB = $fV
    Case Else
    $iR = $fV
    $iG = $fP
    $iB = $fQ
    EndSwitch

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>_HSVtoRGB

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Draw()
    _GDIPlus_GraphicsClear($hGfxBuffer, 0xFF000000)

    [/autoit] [autoit][/autoit] [autoit]

    _WinAPI_BitBlt($hDC, 0, 0, $iWidth, $iHeight, $hCDC, 0, 0, 0x00CC0020)
    EndFunc ;==>_Draw

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func WM_PAINT($hWnd, $uMsgm, $wParam, $lParam)
    _WinAPI_BitBlt($hDC, 0, 0, $iWidth, $iHeight, $hCDC, 0, 0, 0x00CC0020)
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_PAINT

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Exit()
    _GDIPlus_GraphicsDispose($hGfxBuffer)
    _WinAPI_SelectObject($hCDC, $hOBJ)
    _WinAPI_DeleteObject($hBMP)
    _WinAPI_DeleteDC($hCDC)
    _WinAPI_ReleaseDC($hGui, $hDC)
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>_Exit

    [/autoit]

    E

  • Coole Bilder berechnen (Domain coloring / complex numbers) (Assembler)

    • eukalyptus
    • 26. Dezember 2012 um 22:28

    Hi

    Domain coloring: http://en.wikipedia.org/wiki/Domain_coloring
    Beispiel Wikipedia: http://en.wikipedia.org/wiki/File:Comp…in-z-,1024-.jpg

    Die Codes zur Berechnung hab ich ua von hier http://mathematica.stackexchange.com/questions/7275…n-coloring-plot


    Beispiele:
    Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist. Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist. Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist. Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist. Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist. Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.


    Das Script läuft nur im 32Bit-Modus.
    Die ASM-Codes sind noch nicht ganz optimiert, aber es funktioniert schon ganz gut.
    Wer die ASM.au3 verwenden will, benötigt noch AssembleIt.au3, FASM.au3 und MemoryDll.au3 (im Forum zu finden)

    Um ein neues Bild zu generieren, einfach in das Fenster klicken.
    (Die Parameter werden zufällig gewählt.
    Evtl.mach ich auch noch eine Version, wo der User diese eingeben kann...)

    Hier das fertige Script:

    Spoiler anzeigen
    [autoit]

    ;#include "ASM.au3"
    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Opt("MustDeclareVars", 1)
    Opt("GUIOnEventMode", 1)

    [/autoit] [autoit][/autoit] [autoit]

    Global $t_ASM_CalcRangeValues = DllStructCreate("byte[106]") ;reserve Memory for opcodes
    DllStructSetData($t_ASM_CalcRangeValues, 1, "0x8B7C24048B7424108B44240889068B44240C894604660F107E08660F107618BA000000008B5C24080FAFDAB90000000089D801C86BC010660F106E18660F6EE9F30FE6ED660F6EE2F30FE6E4660FC6EC44660F5CEE660F59EF660F112C07413B0E72CD423B560472BBC3") ;write opcodes into memory

    [/autoit] [autoit][/autoit] [autoit]

    Global $t_ASM_Calc_Color = DllStructCreate("byte[609]") ;reserve Memory for opcodes
    DllStructSetData($t_ASM_Calc_Color, 1, "0x9BDBE38B7C24048B7424088B4C240C8B5424109BD97A489BDBE266C7424A6307D96A4ADD42184989CB6BDB10DD441E08DD041ED9F3DD4250DEE9D9E49BDFE09B9E7311D9E59BDFE09B9E7204D8C1EBEADDD8D9EED8F1DD4238DEC9DD1AD9E8660F103C1E660F59FF660F70F7EE660F58FE660F51FF660F117A08DD4208D8CAD9FED9E1DD5208DD4220DD041ED8CCD9FEDD441E08D8CDD9FEDEC9D9E1D9E49BDFE09B9E7412D9F1D9C0D9FCDCE9D9C9D9F0D9E8DEC1D9FDDDD9DD4228DD4230D9E8D8E4D8E3D8C8D8C2D9FAD9E8D8E5D8C4D8C1D8CADDDBDDD8DDD8DC52409BDFE09E7606DDD8D9E8EB0DD9E49BDFE09B9E7304DDD8D9EEDD5A10DC52409BDFE09B9E7606DDD8D9E8EB0DD9E49BDFE09B9E7304DDD8D9EE660F103ADD02D9FCDD1ADED9DDD8660F1032660F5CFEB801000000660F6EC0F30FE6C0660F106A08660F106210660F28D0660F5CD7660F59D5660F28D8660F5CDA660F59DC660F28CD660F59CF660F28D0660F5CD1660F59D4660F5CC5660F59C4F20FE6F6660F7EF083F800770E660F28FC660F28F3660F28E8EB5883F801770E660F28FA660F28F4660F28E8EB4583F802770E660F28F8660F28F4660F28EBEB3283F803770E660F28F8660F28F2660F28ECEB1F83F804770E660F28FB660F28F0660F28ECEB0C660F28FC660F28F0660F28EAB8FF000000660F6EC0660F6EC8F30FE6C0660F59F8660F59F0660F59E8660F6FD9660F72F318F20FE6FF660FDBF9660F6FD7660F72F210660FEBDAF20FE6F6660FDBF1660F6FD6660F72F208660FEBDAF20FE6ED660FDBE9660FEBDD89CB6BDB04660F7E1C1F83F9000F85CCFDFFFF9BDBE2D96A48C3") ;write opcodes into memory

    [/autoit] [autoit][/autoit] [autoit]

    Global $t_ASM_Calc_CLog = DllStructCreate("byte[75]") ;reserve Memory for opcodes
    DllStructSetData($t_ASM_Calc_CLog, 1, "0x9BDBE38B7C24048B4C24088B74240C4989CB6BDB10D9EDDD041FD8C8DD441F08D8C8DEC1D9FAD9F1DD441F08DD041FD9F3DC169BDFE09E7605DD4608DEE9DD5C1F08DD1C1F83F90075C5C3") ;write opcodes into memory

    [/autoit] [autoit][/autoit] [autoit]

    Global $t_ASM_Calc_CSQRT = DllStructCreate("byte[115]") ;reserve Memory for opcodes
    DllStructSetData($t_ASM_Calc_CSQRT, 1, "0x8B7C24048B4C24088B74240C660F1006660F104E10660F57D24989CB6BDB10660F103C1F660F28F7660F59F6660F70EEEE660F58F5660F51F6660F70F644660F70EF44660F59E8660F58F5660F59F1660F51F6660FC2FA01660F50F7F7C6020000007404660F59F0660F11341F83F90075A7C3") ;write opcodes into memory

    [/autoit] [autoit][/autoit] [autoit]

    Global $t_ASM_Calc_CSin = DllStructCreate("byte[117]") ;reserve Memory for opcodes
    DllStructSetData($t_ASM_Calc_CSin, 1, "0x8B7C24048B4C24088B74240C4989CB6BDB10DD441F08D9EADEC9D9C0D9FCDCE9D9C9D9F0D9E8DEC1D9FDDDD9D9EEDD441F08DEE9D9EADEC9D9C0D9FCDCE9D9C9D9F0D9E8DEC1D9FDDDD9D9C1D9C1DEE9DD06DEC9DD041FD9FFDEC9DD5C1F08DEC1DD06DEC9DD041FD9FEDEC9DD1C1F83F9007598C3") ;write opcodes into memory

    [/autoit] [autoit][/autoit] [autoit]

    Global $t_ASM_Calc_CCos = DllStructCreate("byte[117]") ;reserve Memory for opcodes
    DllStructSetData($t_ASM_Calc_CCos, 1, "0x8B7C24048B4C24088B74240C4989CB6BDB10DD441F08D9EADEC9D9C0D9FCDCE9D9C9D9F0D9E8DEC1D9FDDDD9D9EEDD441F08DEE9D9EADEC9D9C0D9FCDCE9D9C9D9F0D9E8DEC1D9FDDDD9D9C1D9C1DEE9DD06DEC9DD041FD9FEDEC9DD5C1F08DEC1DD06DEC9DD041FD9FFDEC9DD1C1F83F9007598C3") ;write opcodes into memory

    [/autoit] [autoit][/autoit] [autoit]

    Global $t_ASM_Calc_CTan = DllStructCreate("byte[134]") ;reserve Memory for opcodes
    DllStructSetData($t_ASM_Calc_CTan, 1, "0x8B7C24048B4C24088B74240C8B542410660F1006B801000000660F6EC8F30FE6C9660F70C9444989CB6BDB10660F103C1A660F28F7660F59F6660F70EEEE660F58F5660F70F644660F28E9660F5EEE660F10341E660F70E74E660F59FE660F59F4660F70E74E660F5CFC660F70E64E660F5CF4660F14FE660F59FD660F113C1F83F90075A1C3") ;write opcodes into memory

    [/autoit] [autoit][/autoit] [autoit]

    Global $t_ASM_Calc_CExp = DllStructCreate("byte[70]") ;reserve Memory for opcodes
    DllStructSetData($t_ASM_Calc_CExp, 1, "0x8B7C24048B4C24084989CB6BDB10DD041FD9EADEC9D9C0D9FCDCE9D9C9D9F0D9E8DEC1D9FDDDD9D9C0DD441F08D9FFDEC9DD1C1FDD441F08D9FEDEC9DD5C1F0883F90075C3C3") ;write opcodes into memory

    [/autoit] [autoit][/autoit] [autoit]

    Global $t_ASM_Calc_CPow = DllStructCreate("byte[42]") ;reserve Memory for opcodes
    DllStructSetData($t_ASM_Calc_CPow, 1, "0x8B7C24048B4C24088B74240C660F10064989CB6BDB10660F100C1F660F59C8660F110C1F83F90075E7C3") ;write opcodes into memory

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Global Const $cPI = ATan(1) * 4
    Global Const $c2PI = $cPI * 2
    Global Const $cPI2 = $cPI / 2
    Global Const $cDegToRad = $cPI / 180

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_Startup()

    [/autoit] [autoit][/autoit] [autoit]

    Global $iWidth = 600
    Global $iHeight = 600

    [/autoit] [autoit][/autoit] [autoit]

    Global $hGui = GUICreate("Click to create new image", $iWidth, $iHeight)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, "_New")
    Global $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGui)
    Global $hBmpBuffer = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphics)
    Global $hGfxBuffer = _GDIPlus_ImageGetGraphicsContext($hBmpBuffer)
    _GDIPlus_GraphicsSetSmoothingMode($hGfxBuffer, 2)
    _GDIPlus_GraphicsClear($hGfxBuffer, 0xFF000000)

    [/autoit] [autoit][/autoit] [autoit]

    GUIRegisterMsg($WM_PAINT, "WM_PAINT")
    GUIRegisterMsg($WM_ERASEBKGND, "WM_PAINT")

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW, $hGui)

    [/autoit] [autoit][/autoit] [autoit]

    Global $hImage
    Global $aInfo
    _New()

    [/autoit] [autoit][/autoit] [autoit]

    While Sleep(10)
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _New()
    _GDIPlus_ImageDispose($hImage)

    [/autoit] [autoit][/autoit] [autoit]

    Local $iAlgo1 = Random(0, 10, 1)
    Local $iAlgo2 = Random(0, 10, 1)
    Local $iAlgo3 = Random(0, 10, 1)
    Local $iR = Random(1, 24, 1)
    Local $fColorOff = Random(0, 360)
    Local $fVal1 = Random(0, 3)
    Local $fVal2 = Random(0, 0.1)
    $hImage = _CreateImage($iWidth, $iHeight, $iAlgo1, $iAlgo2, $iAlgo3, $iR, $iR, 0.5, 0.5, $fColorOff, $fVal1, $fVal2)

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_GraphicsDrawImageRect($hGfxBuffer, $hImage, 0, 0, $iWidth, $iHeight)
    _GDIPlus_GraphicsDrawImage($hGraphics, $hBmpBuffer, 0, 0)
    EndFunc ;==>_New

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _CreateImage($iW, $iH, $iAlgo1 = 0, $iAlgo2 = 0, $iAlgo3 = 0, $fRangeX = 6, $fRangeY = 6, $fXOff = 0.5, $fYOff = 0.5, $fColorOff = 0, $fVal1 = 0.3, $fVal2 = 0.01)
    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $iW, "int", $iH, "int", 0, "int", 0x0026200A, "ptr", 0, "int*", 0)
    If @error Or Not IsArray($aResult) Then Return SetError(1, 1, False)
    Local $hBitmap = $aResult[6]

    [/autoit] [autoit][/autoit] [autoit]

    Local $tData = _GDIPlus_BitmapLockBits($hBitmap, 0, 0, $iW, $iH, $GDIP_ILMWRITE, $GDIP_PXF32ARGB)
    Local $iStride = DllStructGetData($tData, "Stride")
    Local $iBmpW = DllStructGetData($tData, "Width")
    Local $iBmpH = DllStructGetData($tData, "Height")
    Local $pScan0 = DllStructGetData($tData, "Scan0")

    [/autoit] [autoit][/autoit] [autoit]

    Local $tComplex = DllStructCreate("double[" & $iBmpW * $iBmpH * 2 & "];")
    Local $pComplex = DllStructGetPtr($tComplex)

    [/autoit] [autoit][/autoit] [autoit]

    Local $iW1 = $iW - 1
    Local $iH1 = $iH - 1
    Local $fRngX = $fRangeX / $iW1
    Local $fRngY = $fRangeY / $iH1
    $fXOff *= $iW1
    $fYOff *= $iH1

    [/autoit] [autoit][/autoit] [autoit]

    Local $tVar = DllStructCreate("uint W; uint H; double RangeX; double RangeY; double XOff; double YOff;")
    DllStructSetData($tVar, "RangeX", $fRngX)
    DllStructSetData($tVar, "RangeY", $fRngY)
    DllStructSetData($tVar, "XOff", $fXOff)
    DllStructSetData($tVar, "YOff", $fYOff)

    [/autoit] [autoit][/autoit] [autoit]

    DllCall("user32.dll", "none", "CallWindowProcW", "ptr", DllStructGetPtr($t_ASM_CalcRangeValues), "ptr", $pComplex, "uint", $iW, "uint", $iH, "ptr", DllStructGetPtr($tVar))
    ;$_ASSEMBLEIT_FLAG = 0
    ;_AssembleIt("none", "_ASM_CalcRangeValues", "ptr", $pComplex, "uint", $iW, "uint", $iH, "ptr", DllStructGetPtr($tVar))
    $tVar = 0

    [/autoit] [autoit][/autoit] [autoit]

    Switch $iAlgo1
    Case 1
    _Algo_Sqrt($pComplex, $iBmpW * $iBmpH)
    Case 2
    _Algo_Log($pComplex, $iBmpW * $iBmpH)
    Case 3
    _Algo_Sin($pComplex, $iBmpW * $iBmpH)
    Case 4
    _Algo_Cos($pComplex, $iBmpW * $iBmpH)
    Case 5
    _Algo_Tan($pComplex, $iBmpW * $iBmpH)
    Case 6
    _Algo_Exp($pComplex, $iBmpW * $iBmpH)
    Case 7
    _Algo_Pow($pComplex, $iBmpW * $iBmpH, 2)
    EndSwitch

    [/autoit] [autoit][/autoit] [autoit]

    Switch $iAlgo2
    Case 1
    _Algo_Sqrt($pComplex, $iBmpW * $iBmpH)
    Case 2
    _Algo_Log($pComplex, $iBmpW * $iBmpH)
    Case 3
    _Algo_Sin($pComplex, $iBmpW * $iBmpH)
    Case 4
    _Algo_Cos($pComplex, $iBmpW * $iBmpH)
    Case 5
    _Algo_Tan($pComplex, $iBmpW * $iBmpH)
    Case 6
    _Algo_Exp($pComplex, $iBmpW * $iBmpH)
    Case 7
    _Algo_Pow($pComplex, $iBmpW * $iBmpH, 2)
    EndSwitch

    [/autoit] [autoit][/autoit] [autoit]

    Switch $iAlgo3
    Case 1
    _Algo_Sqrt($pComplex, $iBmpW * $iBmpH)
    Case 2
    _Algo_Log($pComplex, $iBmpW * $iBmpH)
    Case 3
    _Algo_Sin($pComplex, $iBmpW * $iBmpH)
    Case 4
    _Algo_Cos($pComplex, $iBmpW * $iBmpH)
    Case 5
    _Algo_Tan($pComplex, $iBmpW * $iBmpH)
    Case 6
    _Algo_Exp($pComplex, $iBmpW * $iBmpH)
    Case 7
    _Algo_Pow($pComplex, $iBmpW * $iBmpH, 2)
    EndSwitch

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $tVar = DllStructCreate("double Hue; double Sat; double Val; double 2PI; double Exp; double 001; double Div2; double 6; double 1; uint CW; double ColorOff;")
    DllStructSetData($tVar, "2PI", $c2PI)
    DllStructSetData($tVar, "Exp", $fVal1)
    DllStructSetData($tVar, "001", $fVal2)
    DllStructSetData($tVar, "Div2", 0.5)
    DllStructSetData($tVar, "6", 6)
    DllStructSetData($tVar, "1", 1)
    DllStructSetData($tVar, "ColorOff", Mod($fColorOff, 360) * $cDegToRad)

    [/autoit] [autoit][/autoit] [autoit]

    DllCall("user32.dll", "none", "CallWindowProcW", "ptr", DllStructGetPtr($t_ASM_Calc_Color), "ptr", $pScan0, "ptr", $pComplex, "uint", $iBmpW * $iBmpH, "ptr", DllStructGetPtr($tVar))
    ;$_ASSEMBLEIT_FLAG = 0
    ;_AssembleIt("none", "_ASM_Calc_Color", "ptr", $pScan0, "ptr", $pComplex, "uint", $iBmpW * $iBmpH, "ptr", DllStructGetPtr($tVar))

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_BitmapUnlockBits($hBitmap, $tData)

    [/autoit] [autoit][/autoit] [autoit]

    Return $hBitmap
    EndFunc ;==>_CreateImage

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Algo_Log($pComplex, $iPixel)
    Local $tVar = DllStructCreate("double PI; double 2PI;")
    DllStructSetData($tVar, "PI", $cPI)
    DllStructSetData($tVar, "2PI", $c2PI)
    DllCall("user32.dll", "none", "CallWindowProcW", "ptr", DllStructGetPtr($t_ASM_Calc_CLog), "ptr", $pComplex, "uint", $iPixel, "ptr", DllStructGetPtr($tVar), "int", 0)
    ;$_ASSEMBLEIT_FLAG = 0
    ;_AssembleIt("none", "_ASM_Calc_CLog", "ptr", $pComplex, "uint", $iPixel, "ptr", DllStructGetPtr($tVar))
    EndFunc ;==>_Algo_Log

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Algo_Sqrt($pComplex, $iPixel)
    Local $tVar = DllStructCreate("double[4];")
    DllStructSetData($tVar, 1, 1, 1)
    DllStructSetData($tVar, 1, -1, 2)
    DllStructSetData($tVar, 1, 0.5, 3)
    DllStructSetData($tVar, 1, 0.5, 4)
    DllCall("user32.dll", "none", "CallWindowProcW", "ptr", DllStructGetPtr($t_ASM_Calc_CSQRT), "ptr", $pComplex, "uint", $iPixel, "ptr", DllStructGetPtr($tVar), "int", 0)
    ;$_ASSEMBLEIT_FLAG = 0
    ;_AssembleIt("none", "_ASM_Calc_CSQRT", "ptr", $pComplex, "uint", $iPixel, "ptr", DllStructGetPtr($tVar))
    EndFunc ;==>_Algo_Sqrt

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Algo_Sin($pComplex, $iPixel)
    Local $tVar = DllStructCreate("double;")
    DllStructSetData($tVar, 1, 0.5)
    DllCall("user32.dll", "none", "CallWindowProcW", "ptr", DllStructGetPtr($t_ASM_Calc_CSin), "ptr", $pComplex, "uint", $iPixel, "ptr", DllStructGetPtr($tVar), "int", 0)
    ;$_ASSEMBLEIT_FLAG = 0
    ;_AssembleIt("none", "_ASM_Calc_CSin", "ptr", $pComplex, "uint", $iPixel, "ptr", DllStructGetPtr($tVar))
    EndFunc ;==>_Algo_Sin

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Algo_Cos($pComplex, $iPixel)
    Local $tVar = DllStructCreate("double;")
    DllStructSetData($tVar, 1, 0.5)
    DllCall("user32.dll", "none", "CallWindowProcW", "ptr", DllStructGetPtr($t_ASM_Calc_CCos), "ptr", $pComplex, "uint", $iPixel, "ptr", DllStructGetPtr($tVar), "int", 0)
    ;$_ASSEMBLEIT_FLAG = 0
    ;_AssembleIt("none", "_ASM_Calc_CCos", "ptr", $pComplex, "uint", $iPixel, "ptr", DllStructGetPtr($tVar))
    EndFunc ;==>_Algo_Cos

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Algo_Tan($pComplex, $iPixel)
    Local $iSize = $iPixel * 2 * 8
    Local $tComplex_Sin = DllStructCreate("byte[" & $iSize & "];")
    Local $tComplex_Cos = DllStructCreate("byte[" & $iSize & "];")
    Local $tComplex = DllStructCreate("byte[" & $iSize & "];", $pComplex)

    [/autoit] [autoit][/autoit] [autoit]

    Local $bData = DllStructGetData($tComplex, 1)
    DllStructSetData($tComplex_Sin, 1, $bData)
    DllStructSetData($tComplex_Cos, 1, $bData)

    [/autoit] [autoit][/autoit] [autoit]

    _Algo_Sin(DllStructGetPtr($tComplex_Sin), $iPixel)
    _Algo_Cos(DllStructGetPtr($tComplex_Cos), $iPixel)

    [/autoit] [autoit][/autoit] [autoit]

    DllCall("user32.dll", "none", "CallWindowProcW", "ptr", DllStructGetPtr($t_ASM_Calc_CTan), "ptr", $pComplex, "uint", $iPixel, "ptr", DllStructGetPtr($tComplex_Sin), "ptr", DllStructGetPtr($tComplex_Cos))
    ;$_ASSEMBLEIT_FLAG = 0
    ;_AssembleIt("none", "_ASM_Calc_CTan", "ptr", $pComplex, "uint", $iPixel, "ptr", DllStructGetPtr($tComplex_Sin), "ptr", DllStructGetPtr($tComplex_Cos))
    EndFunc ;==>_Algo_Tan

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Algo_Exp($pComplex, $iPixel)
    DllCall("user32.dll", "none", "CallWindowProcW", "ptr", DllStructGetPtr($t_ASM_Calc_CExp), "ptr", $pComplex, "uint", $iPixel, "int", 0, "int", 0)
    ;$_ASSEMBLEIT_FLAG = 0
    ;_AssembleIt("none", "_ASM_Calc_CExp", "ptr", $pComplex, "uint", $iPixel)
    EndFunc ;==>_Algo_Exp

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Algo_Pow($pComplex, $iPixel, $fExp)
    _Algo_Log($pComplex, $iPixel)
    Local $tVar = DllStructCreate("double[2];")
    DllStructSetData($tVar, 1, $fExp, 1)
    DllStructSetData($tVar, 1, $fExp, 2)
    DllCall("user32.dll", "none", "CallWindowProcW", "ptr", DllStructGetPtr($t_ASM_Calc_CPow), "ptr", $pComplex, "uint", $iPixel, "ptr", DllStructGetPtr($tVar), "int", 0)
    ;$_ASSEMBLEIT_FLAG = 0
    ;_AssembleIt("none", "_ASM_Calc_CPow", "ptr", $pComplex, "uint", $iPixel, "ptr", DllStructGetPtr($tVar))
    _Algo_Exp($pComplex, $iPixel)
    EndFunc ;==>_Algo_Pow

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func WM_PAINT($hWnd, $uMsgm, $wParam, $lParam)
    _GDIPlus_GraphicsDrawImage($hGraphics, $hBmpBuffer, 0, 0)
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_PAINT

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Exit()
    _GDIPlus_BitmapDispose($hImage)
    _GDIPlus_GraphicsDispose($hGfxBuffer)
    _GDIPlus_BitmapDispose($hBmpBuffer)
    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>_Exit

    [/autoit]


    der Assembler code: (wird nicht benötigt)

    Spoiler anzeigen
    [autoit]

    #include "AssembleIt.au3"

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _ASM_CalcRangeValues()
    _("use32") ;32Bit!

    [/autoit] [autoit][/autoit] [autoit]

    _("mov edi, [esp+4]") ;pComplex
    _("mov esi, [esp+16]") ;pVar

    [/autoit] [autoit][/autoit] [autoit]

    _("mov eax, [esp+8]") ;Width
    _("mov [esi], eax") ; = width

    [/autoit] [autoit][/autoit] [autoit]

    _("mov eax, [esp+12]") ;Height
    _("mov [esi+4], eax") ; = height

    [/autoit] [autoit][/autoit] [autoit]

    _("movupd xmm7, [esi+8]") ;xmm7 = RangeX, RangeY
    _("movupd xmm6, [esi+24]") ;xmm6 = XOff, YOff

    [/autoit] [autoit][/autoit] [autoit]

    _("mov edx, 0") ;Y-Schleifenzähler = 0
    _("_LoopY:")
    _("mov ebx, [esp+8]") ;
    _("imul ebx, edx") ;ebx = y * width

    [/autoit] [autoit][/autoit] [autoit]

    _("mov ecx, 0") ;X-Schleifenzähler = 0
    _("_LoopX:")

    [/autoit] [autoit][/autoit] [autoit]

    _("mov eax, ebx")
    _("add eax, ecx") ;eax = ebx + x
    _("imul eax, 16") ;pComplex position

    [/autoit] [autoit][/autoit] [autoit]

    _("movupd xmm5, [esi+24]")
    _("movd xmm5, ecx")
    _("cvtdq2pd xmm5, xmm5") ;convert to double

    [/autoit] [autoit][/autoit] [autoit]

    _("movd xmm4, edx")
    _("cvtdq2pd xmm4, xmm4") ;convert to double

    [/autoit] [autoit][/autoit] [autoit]

    _("shufpd xmm5, xmm4, 0x44");xmm5 => [Y, X]

    [/autoit] [autoit][/autoit] [autoit]

    _("subpd xmm5, xmm6") ;X-XOff; Y-YOff
    _("mulpd xmm5, xmm7") ;(X-XOff)*rangeX

    [/autoit] [autoit][/autoit] [autoit]

    _("movupd [edi+eax], xmm5")

    [/autoit] [autoit][/autoit] [autoit]

    _("inc ecx")
    _("cmp ecx, [esi]") ;ecx < width ?
    _("jb _LoopX")

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    _("inc edx")
    _("cmp edx, [esi+4]") ;edx < height ?
    _("jb _LoopY")

    [/autoit] [autoit][/autoit] [autoit]

    _("ret ") ;return

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _ASM_Calc_CSQRT()
    _("use32") ;32Bit!

    [/autoit] [autoit][/autoit] [autoit]

    _("mov edi, [esp+4]") ;pComplex
    _("mov ecx, [esp+8]") ;PixelCount
    _("mov esi, [esp+12]") ;pVar

    [/autoit] [autoit][/autoit] [autoit]

    _("movupd xmm0, [esi]")
    _("movupd xmm1, [esi+16]")
    _("XORPD xmm2, xmm2")

    [/autoit] [autoit][/autoit] [autoit]

    _("_Loop:")
    _("dec ecx")
    _("mov ebx, ecx")
    _("imul ebx, 16") ;pComplex position

    [/autoit] [autoit][/autoit] [autoit]

    _("movupd xmm7, [edi+ebx]")

    [/autoit] [autoit][/autoit] [autoit]

    ;xmm6 => [Sqrt($fRe * $fRe + $fIm * $fIm), Sqrt($fRe * $fRe + $fIm * $fIm)]
    _("movapd xmm6, xmm7")
    _("mulpd xmm6, xmm6")
    _("pshufd xmm5, xmm6, 0xEE")
    _("addpd xmm6, xmm5")
    _("sqrtpd xmm6, xmm6")
    _("pshufd xmm6, xmm6, 0x44")

    [/autoit] [autoit][/autoit] [autoit]

    ;xmm6 => [ Sqrt(0.5 * ($fTmp - $fRe)), Sqrt(0.5 * ($fTmp + $fRe))]
    _("pshufd xmm5, xmm7, 0x44") ;RE in beide xmm5
    _("mulpd xmm5, xmm0") ;RE Hi * -1
    _("addpd xmm6, xmm5") ;xmm6 +- re
    _("mulpd xmm6, xmm1") ;* 0.5
    _("sqrtpd xmm6, xmm6")

    [/autoit] [autoit][/autoit] [autoit]

    _("CMPLTPD xmm7, xmm2")
    _("movmskpd esi, xmm7")
    _("test esi, 2")
    _("jz _Write")
    _("mulpd xmm6, xmm0")

    [/autoit] [autoit][/autoit] [autoit]

    _("_Write:")
    _("movupd [edi+ebx], xmm6")

    [/autoit] [autoit][/autoit] [autoit]

    _("cmp ecx, 0")
    _("jnz _Loop")

    [/autoit] [autoit][/autoit] [autoit]

    _("ret ") ;return

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _ASM_Calc_CLog()
    _("use32") ;32Bit!
    _("FINIT")

    [/autoit] [autoit][/autoit] [autoit]

    _("mov edi, [esp+4]") ;pComplex
    _("mov ecx, [esp+8]") ;PixelCount
    _("mov esi, [esp+12]") ;pVar

    [/autoit] [autoit][/autoit] [autoit]

    _("_Loop:")
    _("dec ecx")
    _("mov ebx, ecx")
    _("imul ebx, 16") ;pComplex position

    [/autoit] [autoit][/autoit] [autoit]

    _("FLDLN2") ;[Log2]
    _("fld qword [edi+ebx]") ; [Re] [Log2]
    _("fmul st0, st0") ; [Re*Re] [Log2]
    _("fld qword [edi+ebx+8]") ; [Im] [Re*Re] [Log2]
    _("fmul st0, st0") ;[Im*Im] [Re*Re] [Log2]
    _("faddp") ; [Sum] [Log2]
    _("fsqrt") ; [Sqrt] [Log2]
    _("fyl2x") ; [Log]

    [/autoit] [autoit][/autoit] [autoit]

    _("fld qword [edi+ebx+8]") ;[Im] [Log]
    _("fld qword [edi+ebx]") ;[Re] [Im] [Log]
    _("fpatan") ; Atan2 Im/Re [Atan] [Log]

    [/autoit] [autoit][/autoit] [autoit]

    _("FCOM qword [esi]") ;Atan > PI
    _("fstsw ax")
    _("sahf")
    _("jbe _Continue")
    _("fld qword [esi+8]") ;[2Pi] [Atan] [Log]
    _("fsubp st1, st0") ;[Atan] [Log]

    [/autoit] [autoit][/autoit] [autoit]

    _("_Continue:")
    _("fstp qword [edi+ebx+8]") ; [Log]
    _("fstp qword [edi+ebx]")

    [/autoit] [autoit][/autoit] [autoit]

    _("cmp ecx, 0")
    _("jnz _Loop")

    [/autoit] [autoit][/autoit] [autoit]

    _("ret ") ;return

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _ASM_Calc_CSin()
    _("use32") ;32Bit!

    [/autoit] [autoit][/autoit] [autoit]

    _("mov edi, [esp+4]") ;pComplex
    _("mov ecx, [esp+8]") ;PixelCount
    _("mov esi, [esp+12]") ;pVar

    [/autoit] [autoit][/autoit] [autoit]

    _("_Loop:")
    _("dec ecx")
    _("mov ebx, ecx")
    _("imul ebx, 16") ;pComplex position

    [/autoit] [autoit][/autoit] [autoit]

    ;Exp(Im):
    _("fld qword [edi+ebx+8]") ; [Im]
    _("fldl2e") ; [log2] [Exp]
    _("fmulp") ; [Z]
    _("fld st0") ; [Z] [Z]
    _("frndint") ; [Round Z] [Z]
    _("fsub st1, st0") ; [Z - RoundZ = a] [Z]
    _("fxch") ; [Z] [a]
    _("f2xm1") ; [2^a]
    _("fld1") ; [1] [Z] [a]
    _("faddp st1, st0") ; [Z+1] [a]
    _("fscale")
    _("fstp st1") ; [Exp(Im)]

    [/autoit] [autoit][/autoit] [autoit]

    ;Exp(-Im):
    _("fldz") ;[0] [Exp(Im)]
    _("fld qword [edi+ebx+8]") ; [Im] [0] [Exp(Im)]
    _("fsubp") ; [-Im] [Exp(Im)]
    _("fldl2e") ; [log2] [-Im] [Exp(Im)]
    _("fmulp") ; [Z] [Exp(Im)]
    _("fld st0") ; [Z] [Z] [Exp(Im)]
    _("frndint") ; [Round Z] [Z] [Exp(Im)]
    _("fsub st1, st0") ; [Z - RoundZ = a] [Z] [Exp(Im)]
    _("fxch") ; [Z] [a] [Exp(Im)]
    _("f2xm1") ; [2^a] [Exp(Im)]
    _("fld1") ; [1] [Z] [a] [Exp(Im)]
    _("faddp st1, st0") ; [Z+1] [a] [Exp(Im)]
    _("fscale")

    [/autoit] [autoit][/autoit] [autoit]

    _("fstp st1") ; [Exp(-Im)] [Exp(Im)]
    _("fld st1") ; [Exp(Im)] [Exp(-Im)] [Exp(Im)]
    _("fld st1") ; [Exp(-Im)] [Exp(Im)] [Exp(-Im)] [Exp(Im)]
    _("fsubp") ; [Exp(Im) + Exp(-Im)] [Exp(-Im)] [Exp(Im)]

    [/autoit] [autoit][/autoit] [autoit]

    _("fld qword [esi]"); [0.5] [Exp(Im) + Exp(-Im)] [Exp(-Im)] [Exp(Im)]
    _("fmulp")
    _("fld qword [edi+ebx]") ; [Re]...
    _("fcos") ; [Cos] [E - E] [E-] [E+]
    _("fmulp") ; [Im] [E-] [E+]
    _("fstp qword [edi+ebx+8]") ; [E-] [E+]

    [/autoit] [autoit][/autoit] [autoit]

    _("faddp") ; [E + E]
    _("fld qword [esi]"); [0.5] [E + E]
    _("fmulp")
    _("fld qword [edi+ebx]") ; [Re]...
    _("fsin") ; [Sin] [E - E]
    _("fmulp") ; [Im]
    _("fstp qword [edi+ebx]")

    [/autoit] [autoit][/autoit] [autoit]

    _("cmp ecx, 0")
    _("jnz _Loop")

    [/autoit] [autoit][/autoit] [autoit]

    _("ret ") ;return
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _ASM_Calc_CCos()
    _("use32") ;32Bit!

    [/autoit] [autoit][/autoit] [autoit]

    _("mov edi, [esp+4]") ;pComplex
    _("mov ecx, [esp+8]") ;PixelCount
    _("mov esi, [esp+12]") ;pVar

    [/autoit] [autoit][/autoit] [autoit]

    _("_Loop:")
    _("dec ecx")
    _("mov ebx, ecx")
    _("imul ebx, 16") ;pComplex position

    [/autoit] [autoit][/autoit] [autoit]

    ;Exp(Im):
    _("fld qword [edi+ebx+8]") ; [Im]
    _("fldl2e") ; [log2] [Exp]
    _("fmulp") ; [Z]
    _("fld st0") ; [Z] [Z]
    _("frndint") ; [Round Z] [Z]
    _("fsub st1, st0") ; [Z - RoundZ = a] [Z]
    _("fxch") ; [Z] [a]
    _("f2xm1") ; [2^a]
    _("fld1") ; [1] [Z] [a]
    _("faddp st1, st0") ; [Z+1] [a]
    _("fscale")
    _("fstp st1") ; [Exp(Im)]

    [/autoit] [autoit][/autoit] [autoit]

    ;Exp(-Im):
    _("fldz") ;[0] [Exp(Im)]
    _("fld qword [edi+ebx+8]") ; [Im] [0] [Exp(Im)]
    _("fsubp") ; [-Im] [Exp(Im)]
    _("fldl2e") ; [log2] [-Im] [Exp(Im)]
    _("fmulp") ; [Z] [Exp(Im)]
    _("fld st0") ; [Z] [Z] [Exp(Im)]
    _("frndint") ; [Round Z] [Z] [Exp(Im)]
    _("fsub st1, st0") ; [Z - RoundZ = a] [Z] [Exp(Im)]
    _("fxch") ; [Z] [a] [Exp(Im)]
    _("f2xm1") ; [2^a] [Exp(Im)]
    _("fld1") ; [1] [Z] [a] [Exp(Im)]
    _("faddp st1, st0") ; [Z+1] [a] [Exp(Im)]
    _("fscale")

    [/autoit] [autoit][/autoit] [autoit]

    _("fstp st1") ; [Exp(-Im)] [Exp(Im)]
    _("fld st1") ; [Exp(Im)] [Exp(-Im)] [Exp(Im)]
    _("fld st1") ; [Exp(-Im)] [Exp(Im)] [Exp(-Im)] [Exp(Im)]
    _("fsubp") ; [Exp(Im) + Exp(-Im)] [Exp(-Im)] [Exp(Im)]

    [/autoit] [autoit][/autoit] [autoit]

    _("fld qword [esi]"); [0.5] [Exp(Im) + Exp(-Im)] [Exp(-Im)] [Exp(Im)]
    _("fmulp")
    _("fld qword [edi+ebx]") ; [Re]...
    _("fsin") ; [Sin] [E - E] [E-] [E+]
    _("fmulp") ; [Im] [E-] [E+]
    _("fstp qword [edi+ebx+8]") ; [E-] [E+]

    [/autoit] [autoit][/autoit] [autoit]

    _("faddp") ; [E + E]
    _("fld qword [esi]"); [0.5] [E + E]
    _("fmulp")
    _("fld qword [edi+ebx]") ; [Re]...
    _("fcos") ; [Cos] [E - E]
    _("fmulp") ; [Im]
    _("fstp qword [edi+ebx]")

    [/autoit] [autoit][/autoit] [autoit]

    _("cmp ecx, 0")
    _("jnz _Loop")

    [/autoit] [autoit][/autoit] [autoit]

    _("ret ") ;return
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _ASM_Calc_CTan()
    _("use32") ;32Bit!

    [/autoit] [autoit][/autoit] [autoit]

    _("mov edi, [esp+4]") ;pComplex
    _("mov ecx, [esp+8]") ;PixelCount
    _("mov esi, [esp+12]") ;pComplex_Sin
    _("mov edx, [esp+16]") ;pComplex_Cos

    [/autoit] [autoit][/autoit] [autoit]

    _("movupd xmm0, [esi]") ; xmm0 = Exp, Exp
    _("mov eax, 1")
    _("movd xmm1, eax")
    _("cvtdq2pd xmm1, xmm1") ;xmm1 = 1.0
    _("pshufd xmm1, xmm1, 0x44")

    [/autoit] [autoit][/autoit] [autoit]

    _("_Loop:")
    _("dec ecx")
    _("mov ebx, ecx")
    _("imul ebx, 16") ;pComplex position

    [/autoit] [autoit][/autoit] [autoit]

    _("movupd xmm7, [edx+ebx]") ;xmm7 = Cos_Re, Cos_Im

    [/autoit] [autoit][/autoit] [autoit]

    ;xmm6 => [$CRe * CRe + CIm * CIm, $CRe * CRe + CIm * CIm]
    _("movapd xmm6, xmm7")
    _("mulpd xmm6, xmm6")
    _("pshufd xmm5, xmm6, 0xEE")
    _("addpd xmm6, xmm5")
    _("pshufd xmm6, xmm6, 0x44")

    [/autoit] [autoit][/autoit] [autoit]

    _("movapd xmm5, xmm1")
    _("divpd xmm5, xmm6") ; xmm5 = 1.0 / (CRe * CRe + CIm * CIm), 1.0 / (CRe * CRe + CIm * CIm)

    [/autoit] [autoit][/autoit] [autoit]

    _("movupd xmm6, [esi+ebx]") ;xmm6 = Sin_Re, Sin_Im
    _("pshufd xmm4, xmm7, 0x4E") ;xmm4 = Cos_Im, Cos_Re

    [/autoit] [autoit][/autoit] [autoit]

    _("mulpd xmm7, xmm6") ; xmm7 = SRe * CRe, SIm * CIm
    _("mulpd xmm6, xmm4") ; xmm6 = SRe * CIm, SIm * CRe

    [/autoit] [autoit][/autoit] [autoit]

    _("pshufd xmm4, xmm7, 0x4E") ; xmm4 = SIm * CIm, SRe * CRe
    _("subpd xmm7, xmm4") ; xmm7 = SRe * CRe - SIm * CIm

    [/autoit] [autoit][/autoit] [autoit]

    _("pshufd xmm4, xmm6, 0x4E") ; xmm4 = SIm * CRe, SRe * CIm
    _("subpd xmm6, xmm4") ; xmm6 = SRe * CIm - SIm * CRe

    [/autoit] [autoit][/autoit] [autoit]

    _("UNPCKLPD xmm7, xmm6") ;xmm7 = SRe * CRe - SIm * CIm, SRe * CIm - SIm * CRe
    _("mulpd xmm7, xmm5")

    [/autoit] [autoit][/autoit] [autoit]

    _("movupd [edi+ebx], xmm7")

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    _("cmp ecx, 0")
    _("jnz _Loop")

    [/autoit] [autoit][/autoit] [autoit]

    _("ret ") ;return
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _ASM_Calc_CPow()
    _("use32") ;32Bit!

    [/autoit] [autoit][/autoit] [autoit]

    _("mov edi, [esp+4]") ;pComplex
    _("mov ecx, [esp+8]") ;PixelCount
    _("mov esi, [esp+12]") ;pExp

    [/autoit] [autoit][/autoit] [autoit]

    _("movupd xmm0, [esi]") ; xmm0 = Exp, Exp

    [/autoit] [autoit][/autoit] [autoit]

    _("_Loop:")
    _("dec ecx")
    _("mov ebx, ecx")
    _("imul ebx, 16") ;pComplex position

    [/autoit] [autoit][/autoit] [autoit]

    _("movupd xmm1, [edi+ebx]") ; xmm1 = Re, Im
    _("mulpd xmm1, xmm0")
    _("movupd [edi+ebx], xmm1")

    [/autoit] [autoit][/autoit] [autoit]

    _("cmp ecx, 0")
    _("jnz _Loop")

    [/autoit] [autoit][/autoit] [autoit]

    _("ret ") ;return
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _ASM_Calc_CExp()
    _("use32") ;32Bit!

    [/autoit] [autoit][/autoit] [autoit]

    _("mov edi, [esp+4]") ;pComplex
    _("mov ecx, [esp+8]") ;PixelCount

    [/autoit] [autoit][/autoit] [autoit]

    _("_Loop:")
    _("dec ecx")
    _("mov ebx, ecx")
    _("imul ebx, 16") ;pComplex position

    [/autoit] [autoit][/autoit] [autoit]

    ;Exp(Im):
    _("fld qword [edi+ebx]") ; [Re]
    _("fldl2e") ; [log2] [Exp]
    _("fmulp") ; [Z]
    _("fld st0") ; [Z] [Z]
    _("frndint") ; [Round Z] [Z]
    _("fsub st1, st0") ; [Z - RoundZ = a] [Z]
    _("fxch") ; [Z] [a]
    _("f2xm1") ; [2^a]
    _("fld1") ; [1] [Z] [a]
    _("faddp st1, st0") ; [Z+1] [a]
    _("fscale")
    _("fstp st1") ; [Exp(Re)]

    [/autoit] [autoit][/autoit] [autoit]

    _("fld st0") ; [Exp] [Exp]
    _("fld qword [edi+ebx+8]") ; [Im] [Exp] [Exp]
    _("fcos") ; [Cos(Im)] [Exp] [Exp]
    _("fmulp") ; [Re] [Exp]
    _("fstp qword [edi+ebx]") ; [Exp]

    [/autoit] [autoit][/autoit] [autoit]

    _("fld qword [edi+ebx+8]") ; [Im] [Exp]
    _("fsin") ; [Sin(Im)] [Exp]
    _("fmulp") ; [Im]
    _("fstp qword [edi+ebx+8]")

    [/autoit] [autoit][/autoit] [autoit]

    _("cmp ecx, 0")
    _("jnz _Loop")

    [/autoit] [autoit][/autoit] [autoit]

    _("ret ") ;return
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _ASM_Calc_Color()
    _("use32") ;32Bit!
    _("FINIT")

    [/autoit] [autoit][/autoit] [autoit]

    _("mov edi, [esp+4]") ;pScan0
    _("mov esi, [esp+8]") ;pComplex
    _("mov ecx, [esp+12]") ;iPixels
    _("mov edx, [esp+16]") ;pVar

    [/autoit] [autoit][/autoit] [autoit]

    _("fstcw [edx+72]") ; Save control word
    _("fclex") ; Clear exceptions
    _("mov word [edx+74], 0x0763") ; Rounding control word
    _("fldcw [edx+74]") ; Set new rounding control

    [/autoit] [autoit][/autoit] [autoit]

    _("fld qword [edx+24]") ;2PI in ST(0)
    _("_Loop:")

    [/autoit] [autoit][/autoit] [autoit]

    _("dec ecx")
    _("mov ebx, ecx")
    _("imul ebx, 16") ;pComplex position

    [/autoit] [autoit][/autoit] [autoit]

    ;Calc Hue
    _("fld qword [esi+ebx+8]") ;Im in St(0) [Im] [2PI]
    _("fld qword [esi+ebx]") ;Re in St(0) [Re] [Im] [2PI]
    _("fpatan") ; Atan2 Im/Re [Atan] [2PI]

    [/autoit] [autoit][/autoit] [autoit]

    _("fld qword [edx+80]") ; [ColorOff] [Atan] [2PI]
    _("fsubp") ; [Atan] [2PI]

    [/autoit] [autoit][/autoit] [autoit]

    _("_LoopHue:")
    _("FTST")
    _("fstsw ax")
    _("fwait")
    _("sahf")
    _("jae _CalcSat")

    [/autoit] [autoit][/autoit] [autoit]

    _("FXAM")
    _("fstsw ax")
    _("fwait")
    _("sahf")
    _("jc _Inf")
    _("fadd st0, st1")
    _("jmp _LoopHue")

    [/autoit] [autoit][/autoit] [autoit]

    _("_Inf:")
    _("fstp st0")
    _("fldz")

    [/autoit] [autoit][/autoit] [autoit]

    ;Calc Saturation
    _("_CalcSat:")

    [/autoit] [autoit][/autoit] [autoit]

    _("fdiv st0, st1")
    _("fld qword [edx+56]") ;load 6.0 [6.0] [Hue] [2PI]
    _("fmulp")
    _("FSTP qword [edx]") ;store Hue [2PI]

    [/autoit] [autoit][/autoit] [autoit]

    _("fld1") ;[1] [2PI]
    ;$fSat = Abs(Sin($c2PI * Sqrt($fRe * $fRe + $fIm * $fIm)))
    _("movupd xmm7, [esi+ebx]")
    _("mulpd xmm7, xmm7")
    _("pshufd xmm6, xmm7, 0xEE")
    _("addpd xmm7, xmm6")
    _("sqrtpd xmm7, xmm7")
    _("movupd [edx+8], xmm7")
    _("fld qword [edx+8]") ; [SQRT] [1] [2PI]
    _("fmul st0, st2")
    _("fsin")
    _("fabs")
    _("fst qword [edx+8]") ;Store Staturation [Sat] [1] [2PI]

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;Calc Value
    _("_CalcVal:")

    [/autoit] [autoit][/autoit] [autoit]

    ;$fVal = Abs(Sin($c2PI * $fIm) * Sin($c2PI * $fRe)) ^ 0.3
    _("fld qword [edx+32]") ;Exp in ST(0) [Exp] [Sat] [1] [2PI]
    _("fld qword [esi+ebx]") ;load Re [Re] [Exp] [Sat] [1] [2PI]
    _("fmul st0, st4")
    _("fsin")

    [/autoit] [autoit][/autoit] [autoit]

    _("fld qword [esi+ebx+8]") ;load Im [Im] [Sin_Re] [Exp] [Sat] [1] [2PI]
    _("fmul st0, st5")
    _("fsin")

    [/autoit] [autoit][/autoit] [autoit]

    _("fmulp") ; [Sin_Im * Sin_Re] [Exp] [Sat] [1] [2PI]
    _("fabs")

    [/autoit] [autoit][/autoit] [autoit]

    _("ftst") ; st0 = 0.0
    _("fstsw ax")
    _("fwait")
    _("sahf")
    _("jz _NoPow")

    [/autoit] [autoit][/autoit] [autoit]

    ;Power: exp(exponent * ln(base))
    _("fyl2x")
    _("fld st0")
    _("frndint")
    _("fsub st1, st0")
    _("fxch st1")
    _("f2xm1")
    _("fld1")
    _("faddp st1, st0")
    _("fscale")

    [/autoit] [autoit][/autoit] [autoit]

    _("_NoPow:")
    _("fstp st1") ;Store Value [Val] [Sat] [1] [2PI]

    [/autoit] [autoit][/autoit] [autoit]

    ;$fVal = 0.5 * ((1 - $fSat) + $fVal + Sqrt((1 - $fSat - $fVal) ^ 2 + 0.01))
    _("fld qword [edx+40]") ;0.01 in ST(0) [0.01] [Val] [Sat] [1] [2PI]
    _("fld qword [edx+48]") ;0.5 in ST(0) [0.5] [0.01] [Val] [Sat] [1] [2PI]
    _("fld1") ;1 in ST(0) [1] [0.5] [0.01] [Val] [Sat] [1] [2PI]
    _("fsub st0, st4")
    _("fsub st0, st3")
    _("fmul st0, st0")
    _("fadd st0, st2")
    _("fsqrt") ;[Sqrt((1 - $fSat - $fVal) ^ 2 + 0.01)] [0.5] [0.01] [Val] [Sat] [1] [2PI]

    [/autoit] [autoit][/autoit] [autoit]

    _("fld1") ;1 in ST(0) [1] [Sqrt((1 - $fSat - $fVal) ^ 2 + 0.01)] [0.5] [0.01] [Val] [Sat] [1] [2PI]
    _("fsub st0, st5")
    _("fadd st0, st4")
    _("fadd st0, st1")
    _("fmul st0, st2")

    [/autoit] [autoit][/autoit] [autoit]

    _("fstp st3") ;Store Value [Sqrt((1 - $fSat - $fVal) ^ 2 + 0.01)] [0.5] [0.01] [Val] [Sat] [1] [2PI]
    _("fstp st0")
    _("fstp st0")

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    _("_ValCmpOne:")
    _("FCOM qword [edx+64]") ;Val > 1
    _("fstsw ax")
    _("sahf")
    _("jbe _ValCmpZero")
    _("fstp st0")
    _("fld1") ;Val = 1
    _("jmp _SatCmpOne")

    [/autoit] [autoit][/autoit] [autoit]

    _("_ValCmpZero:")
    _("FTST")
    _("fstsw ax")
    _("fwait")
    _("sahf")
    _("jae _SatCmpOne")
    _("fstp st0")
    _("FLDZ") ;Val = 0

    [/autoit] [autoit][/autoit] [autoit]

    _("_SatCmpOne:")
    _("fstp qword [edx+16]") ;Store Value [Sat] [1] [2PI]
    _("FCOM qword [edx+64]") ;Sat > 1
    _("fstsw ax")
    _("fwait")
    _("sahf")
    _("jbe _SatCmpZero")
    _("fstp st0")
    _("fld1") ;Sat = 1
    _("jmp _CalcRGB")

    [/autoit] [autoit][/autoit] [autoit]

    _("_SatCmpZero:")
    _("FTST")
    _("fstsw ax")
    _("fwait")
    _("sahf")
    _("jae _CalcRGB")
    _("fstp st0")
    _("FLDZ") ;Sat = 0

    [/autoit] [autoit][/autoit] [autoit]

    _("_CalcRGB:")
    _("movupd xmm7, [edx]") ;load Hue
    _("fld qword[edx]") ;load Hue [Hue] [Sat] [Val] [1] [2PI]
    _("FRNDINT")
    _("fstp qword [edx]") ;[Sat] [Val] [1] [2PI]
    _("FCOMPP") ;[Val] [1] [2PI]
    _("fstp st0")

    [/autoit] [autoit][/autoit] [autoit]

    _("movupd xmm6, [edx]") ;load Floor(Hue)
    _("subpd xmm7, xmm6") ;xmm7 = Hue - Floor(Hue)

    [/autoit] [autoit][/autoit] [autoit]

    _("mov eax, 1")
    _("movd xmm0, eax")
    _("cvtdq2pd xmm0, xmm0") ;xmm6 = 1

    [/autoit] [autoit][/autoit] [autoit]

    _("movupd xmm5, [edx+8]") ;load Sat
    _("movupd xmm4, [edx+16]") ;load Val

    [/autoit] [autoit][/autoit] [autoit]

    _("movapd xmm2, xmm0")
    _("subpd xmm2, xmm7") ;1 - Floor
    _("mulpd xmm2, xmm5") ; * Sat
    _("movapd xmm3, xmm0")
    _("subpd xmm3, xmm2")
    _("mulpd xmm3, xmm4") ;xmm3 = fT

    [/autoit] [autoit][/autoit] [autoit]

    _("movapd xmm1, xmm5")
    _("mulpd xmm1, xmm7") ;Sat * Floor
    _("movapd xmm2, xmm0")
    _("subpd xmm2, xmm1")
    _("mulpd xmm2, xmm4") ;xmm2 = fQ

    [/autoit] [autoit][/autoit] [autoit]

    _("subpd xmm0, xmm5")
    _("mulpd xmm0, xmm4") ;xmm0 = fP

    [/autoit] [autoit][/autoit] [autoit]

    ;xmm7 = Trunc(Hue)
    ;xmm6 = Floor(Hue)
    ;xmm5 = Sat
    ;xmm4 = Val
    ;xmm3 = fT
    ;xmm2 = fQ
    ;xmm1 = not used
    ;xmm0 = fP

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    _("cvtpd2dq xmm6, xmm6")
    _("movd eax, xmm6")

    [/autoit] [autoit][/autoit] [autoit]

    ;xmm7 = red
    ;xmm6 = green
    ;xmm5 = blue
    ;xmm4 = Val
    ;xmm3 = fT
    ;xmm2 = fQ
    ;xmm1 =
    ;xmm0 = fP

    [/autoit] [autoit][/autoit] [autoit]

    _("_Cmp0:") ;Val fT, fP
    _("cmp eax, 0")
    _("ja _Cmp1")
    _("movapd xmm7, xmm4")
    _("movapd xmm6, xmm3")
    _("movapd xmm5, xmm0")
    _("jmp _Cmp6")

    [/autoit] [autoit][/autoit] [autoit]

    _("_Cmp1:") ;fQ, Val, fP
    _("cmp eax, 1")
    _("ja _Cmp2")
    _("movapd xmm7, xmm2")
    _("movapd xmm6, xmm4")
    _("movapd xmm5, xmm0")
    _("jmp _Cmp6")

    [/autoit] [autoit][/autoit] [autoit]

    _("_Cmp2:") ;fP, fVal, fT
    _("cmp eax, 2")
    _("ja _Cmp3")
    _("movapd xmm7, xmm0")
    _("movapd xmm6, xmm4")
    _("movapd xmm5, xmm3")
    _("jmp _Cmp6")

    [/autoit] [autoit][/autoit] [autoit]

    _("_Cmp3:") ;fP, fQ, fVal
    _("cmp eax, 3")
    _("ja _Cmp4")
    _("movapd xmm7, xmm0")
    _("movapd xmm6, xmm2")
    _("movapd xmm5, xmm4")
    _("jmp _Cmp6")

    [/autoit] [autoit][/autoit] [autoit]

    _("_Cmp4:") ;fT, fP, fVal
    _("cmp eax, 4")
    _("ja _Cmp5")
    _("movapd xmm7, xmm3")
    _("movapd xmm6, xmm0")
    _("movapd xmm5, xmm4")
    _("jmp _Cmp6")

    [/autoit] [autoit][/autoit] [autoit]

    _("_Cmp5:") ;fVal, fP, fQ
    _("movapd xmm7, xmm4")
    _("movapd xmm6, xmm0")
    _("movapd xmm5, xmm2")

    [/autoit] [autoit][/autoit] [autoit]

    _("_Cmp6:")
    _("mov eax, 0xFF")
    _("movd xmm0, eax")
    _("movd xmm1, eax")

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    _("cvtdq2pd xmm0, xmm0")
    _("mulpd xmm7, xmm0")
    _("mulpd xmm6, xmm0")
    _("mulpd xmm5, xmm0")

    [/autoit] [autoit][/autoit] [autoit]

    _("movdqa xmm3, xmm1")
    _("PSLLD xmm3, 24") ;Alpha

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    _("cvtpd2dq xmm7, xmm7")
    _("Pand xmm7, xmm1"); And 000000FF
    _("movdqa xmm2, xmm7")
    _("PSLLD xmm2, 16")
    _("por xmm3, xmm2")

    [/autoit] [autoit][/autoit] [autoit]

    _("cvtpd2dq xmm6, xmm6")
    _("Pand xmm6, xmm1"); And 000000FF
    _("movdqa xmm2, xmm6")
    _("PSLLD xmm2, 8")
    _("por xmm3, xmm2")

    [/autoit] [autoit][/autoit] [autoit]

    _("cvtpd2dq xmm5, xmm5")
    _("Pand xmm5, xmm1"); And 000000FF
    _("por xmm3, xmm5")

    [/autoit] [autoit][/autoit] [autoit]

    _("mov ebx, ecx")
    _("imul ebx, 4") ;pScan0 position
    _("movd [edi+ebx], xmm3")

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    _("cmp ecx, 0")
    _("jnz _Loop")

    [/autoit] [autoit][/autoit] [autoit]

    _("fclex") ; Clear exceptions
    _("fldcw [edx+72]") ; Restore control word
    _("ret ") ;return

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit]


    Hoffe es gefällt euch!

    E

    Dateien

    Complex_1.jpg 38,99 kB – 0 Downloads Complex_2.jpg 68,21 kB – 0 Downloads Complex_3.jpg 54,1 kB – 0 Downloads Complex_4.jpg 39,1 kB – 0 Downloads Complex_5.jpg 49,44 kB – 0 Downloads Complex_6.jpg 31,1 kB – 0 Downloads
  • Bildschirmschonereinstellungsfenster kleines Vorschaufenster

    • eukalyptus
    • 19. Dezember 2012 um 20:39

    Hi

    In der Sektion "/p" bekommst du als zweiten Parameter in $CmdLine[2] das Handle des Vorschaufensters.
    Via WinGetPos kannst du dessen Größe bestimmen.

    Im Previewmode erstellst du selber kein GUI, sondern zeichnest direkt in das Vorschaufenster.
    Am einfachsten mit _GdiPlus_GraphicsCreateFromHWND und _GdiPlus_GraphicsDrawImageRect

    Hier findest du ein paar Beispiel-Bildschirmschoner:
    Bildschirmschoner incl. Config und Preview
    GDI+ Screensavers (jetzt mit 2 Beispielen)

    E

  • GDIPlus Zeichnen ohne sichtbare GUI

    • eukalyptus
    • 15. Dezember 2012 um 13:40

    Zum löschen entweder den Context mit der Farbe 0 "clearen", oder via _WinAPI_CreateCompatibleBitmap einen leeren Buffer erzeugen:

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <StructureConstants.au3>
    #include <WinAPI.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    HotKeySet("{ESC}", "_Exit")

    [/autoit] [autoit][/autoit] [autoit]

    Opt("MustDeclareVars", 1)

    [/autoit] [autoit][/autoit] [autoit]

    Global $iWidth = @DesktopWidth
    Global $iHeight = @DesktopHeight

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_Startup()
    Global $hGui = GUICreate("Test", $iWidth, $iHeight, 0, 0, $WS_POPUP, BitOR($WS_EX_TOPMOST, $WS_EX_LAYERED, $WS_EX_TRANSPARENT))

    [/autoit] [autoit][/autoit] [autoit]

    Global $tSize = DllStructCreate($tagSIZE)
    Global $pSize = DllStructGetPtr($tSize)
    DllStructSetData($tSize, "X", $iWidth)
    DllStructSetData($tSize, "Y", $iHeight)
    Global $tSource = DllStructCreate($tagPOINT)
    Global $pSource = DllStructGetPtr($tSource)
    Global $tBlend = DllStructCreate($tagBLENDFUNCTION)
    Global $pBlend = DllStructGetPtr($tBlend)
    DllStructSetData($tBlend, "Alpha", 0xFF)
    DllStructSetData($tBlend, "Format", 1)

    [/autoit] [autoit][/autoit] [autoit]

    Global $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $iWidth, "int", $iHeight, "int", 0, "int", 0x0026200A, "ptr", 0, "int*", 0)
    Global $hBitmap = $aResult[6]
    Global $hContext = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    _GDIPlus_GraphicsSetSmoothingMode($hContext, 2)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    _DrawEllipse()

    [/autoit] [autoit][/autoit] [autoit]

    Sleep(1000)

    [/autoit] [autoit][/autoit] [autoit]

    _UpdateWindow(0)

    [/autoit] [autoit][/autoit] [autoit]

    Sleep(1000)

    [/autoit] [autoit][/autoit] [autoit]

    _DrawRandom()

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While Sleep(10)
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _DrawRandom()
    Local $hBrush = _GDIPlus_BrushCreateSolid(0)
    Local $hPen = _GDIPlus_PenCreate(0, 3)

    [/autoit] [autoit][/autoit] [autoit]

    Local $fX, $fY, $fR, $iR, $iG, $iB

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To 20

    [/autoit] [autoit][/autoit] [autoit]

    $iR = Random(0, 0xFF, 1)
    $iG = Random(0, 0xFF, 1)
    $iB = Random(0, 0xFF, 1)
    _GDIPlus_PenSetColor($hPen, BitOR(0xFF000000, BitShift($iR, -16), BitShift($iG, -8), $iB))
    _GDIPlus_BrushSetSolidColor($hBrush, BitOR(0x60000000, BitShift($iR, -16), BitShift($iG, -8), $iB))

    [/autoit] [autoit][/autoit] [autoit]

    $fX = Random(0, $iWidth)
    $fY = Random(0, $iHeight)
    $fR = Random(50, 300)
    _GDIPlus_GraphicsFillEllipse($hContext, $fX - $fR, $fY - $fR, $fR * 2, $fR * 2, $hBrush)
    _GDIPlus_GraphicsDrawEllipse($hContext, $fX - $fR, $fY - $fR, $fR * 2, $fR * 2, $hPen)
    _UpdateWindow($hBitmap)

    [/autoit] [autoit][/autoit] [autoit]

    If Mod($i, 3) = 2 Then _GDIPlus_GraphicsClear($hContext, 0)

    [/autoit] [autoit][/autoit] [autoit]

    Sleep(800)
    Next

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_PenDispose($hPen)
    EndFunc ;==>_DrawRandom

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _DrawEllipse()
    Local $hBrush = _GDIPlus_BrushCreateSolid(0x88886600)
    _GDIPlus_GraphicsFillEllipse($hContext, $iWidth * 0.1, $iHeight * 0.1, $iWidth * 0.8, $iHeight * 0.8, $hBrush)
    _GDIPlus_BrushDispose($hBrush)

    [/autoit] [autoit][/autoit] [autoit]

    Local $hPen = _GDIPlus_PenCreate(0xFFAA8800, 10)
    _GDIPlus_GraphicsDrawEllipse($hContext, $iWidth * 0.1, $iHeight * 0.1, $iWidth * 0.8, $iHeight * 0.8, $hPen)
    _GDIPlus_PenDispose($hPen)

    [/autoit] [autoit][/autoit] [autoit]

    _UpdateWindow($hBitmap)

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_GraphicsClear($hContext, 0)
    EndFunc ;==>_DrawEllipse

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _UpdateWindow($hBitmap)
    Local $hDC = _WinAPI_GetDC($hGui)
    Local $hCDC = _WinAPI_CreateCompatibleDC($hDC)
    Local $hBMP
    If $hBitmap Then
    $hBMP = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
    Else
    $hBMP = _WinAPI_CreateCompatibleBitmap($hCDC, $iWidth, $iHeight)
    EndIf
    Local $hOBJ = _WinAPI_SelectObject($hCDC, $hBMP)

    [/autoit] [autoit][/autoit] [autoit]

    _WinAPI_UpdateLayeredWindow($hGui, $hDC, 0, $pSize, $hCDC, $pSource, 0, $pBlend, $ULW_ALPHA)

    [/autoit] [autoit][/autoit] [autoit]

    _WinAPI_SelectObject($hCDC, $hOBJ)
    _WinAPI_DeleteObject($hBMP)
    _WinAPI_DeleteDC($hCDC)
    _WinAPI_ReleaseDC($hGui, $hDC)
    EndFunc ;==>_UpdateWindow

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Exit()
    _GDIPlus_GraphicsDispose($hContext)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>_Exit

    [/autoit]
  • GDIPlus Zeichnen ohne sichtbare GUI

    • eukalyptus
    • 15. Dezember 2012 um 09:07

    Es gibt mehrere Möglichkeiten.

    Für die einfachste Methode schau dir mal das Hilfebeispiel zu _WinAPI_DrawLine an.

    Wenn die Zeichnung dauerhaft sichtbar sein soll, dann arbeite am besten mit UpdateLayeredWindow:

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <StructureConstants.au3>
    #include <WinAPI.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    HotKeySet("{ESC}", "_Exit")

    [/autoit] [autoit][/autoit] [autoit]

    Opt("MustDeclareVars", 1)

    [/autoit] [autoit][/autoit] [autoit]

    Global $iWidth = @DesktopWidth
    Global $iHeight = @DesktopHeight

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_Startup()
    Global $hGui = GUICreate("Test", $iWidth, $iHeight, 0, 0, $WS_POPUP, BitOR($WS_EX_TOPMOST, $WS_EX_LAYERED, $WS_EX_TRANSPARENT))

    [/autoit] [autoit][/autoit] [autoit]

    Global $tSize = DllStructCreate($tagSIZE)
    Global $pSize = DllStructGetPtr($tSize)
    DllStructSetData($tSize, "X", $iWidth)
    DllStructSetData($tSize, "Y", $iHeight)
    Global $tSource = DllStructCreate($tagPOINT)
    Global $pSource = DllStructGetPtr($tSource)
    Global $tBlend = DllStructCreate($tagBLENDFUNCTION)
    Global $pBlend = DllStructGetPtr($tBlend)
    DllStructSetData($tBlend, "Alpha", 0xFF)
    DllStructSetData($tBlend, "Format", 1)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    _Draw()

    [/autoit] [autoit][/autoit] [autoit]

    While Sleep(10)
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Draw()
    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $iWidth, "int", $iHeight, "int", 0, "int", 0x0026200A, "ptr", 0, "int*", 0)
    Local $hBitmap = $aResult[6]
    Local $hContext = _GDIPlus_ImageGetGraphicsContext($hBitmap)

    [/autoit] [autoit][/autoit] [autoit]

    Local $hBrush = _GDIPlus_BrushCreateSolid(0x88886600)
    _GDIPlus_GraphicsFillEllipse($hContext, $iWidth * 0.1, $iHeight * 0.1, $iWidth * 0.8, $iHeight * 0.8, $hBrush)
    _GDIPlus_BrushDispose($hBrush)

    [/autoit] [autoit][/autoit] [autoit]

    Local $hPen = _GDIPlus_PenCreate(0xFFAA8800, 10)
    _GDIPlus_GraphicsDrawEllipse($hContext, $iWidth * 0.1, $iHeight * 0.1, $iWidth * 0.8, $iHeight * 0.8, $hPen)
    _GDIPlus_PenDispose($hPen)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_GraphicsDispose($hContext)
    Local $hDC = _WinAPI_GetDC($hGui)
    Local $hCDC = _WinAPI_CreateCompatibleDC($hDC)
    Local $hBMP = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
    _GDIPlus_BitmapDispose($hBitmap)
    Local $hOBJ = _WinAPI_SelectObject($hCDC, $hBMP)

    [/autoit] [autoit][/autoit] [autoit]

    _WinAPI_UpdateLayeredWindow($hGui, $hDC, 0, $pSize, $hCDC, $pSource, 0, $pBlend, $ULW_ALPHA)

    [/autoit] [autoit][/autoit] [autoit]

    _WinAPI_SelectObject($hCDC, $hOBJ)
    _WinAPI_DeleteObject($hBMP)
    _WinAPI_DeleteDC($hCDC)
    _WinAPI_ReleaseDC($hGui, $hDC)
    EndFunc ;==>_Draw

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Exit()
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>_Exit

    [/autoit]

    zu _WinAPI_UpdateLayeredWindow findest du im Forum noch weitere zahlreiche Beispiele...

    E

  • Dos Befehle Ausführen mit STDOut und Rückgabewert

    • eukalyptus
    • 14. Dezember 2012 um 12:27

    Den Exitcode bekommst du via GetExitCodeProcess:

    [autoit]

    $hPID = Run(@ScriptDir & "\Run.exe", "", @SW_SHOW, BitOR($STDERR_CHILD, $STDOUT_CHILD))
    $hProcess = _WinAPI_OpenProcess(0x0400, 0, $hPID)

    [/autoit][autoit][/autoit][autoit]

    ;Hier StdOut-Loop

    [/autoit][autoit][/autoit][autoit]

    $iExitCode = _WinAPI_GetExitCodeProcess($hProcess)
    _WinAPI_CloseHandle($hProcess)

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func _WinAPI_GetExitCodeProcess($hProcess)
    Local $aResult = DllCall("kernel32", "hwnd", "GetExitCodeProcess", "handle", $hProcess, "dword*", 0)
    If @error Or Not IsArray($aResult) Then Return SetError(@error, @extended, 0)
    Return $aResult[2]
    EndFunc ;==>_WinAPI_GetExitCodeProcess

    [/autoit]

    E

  • Pee wird 24 und Funkey 32

    • eukalyptus
    • 4. Dezember 2012 um 20:44

    Alles Gute, euch beiden!

  • stdout zu array

    • eukalyptus
    • 4. Dezember 2012 um 20:38

    Kommt drauf an, wie der Output wiklich ausschaut, aber am besten nimmt du StringRegExp

    [autoit]

    #include <Array.au3>

    [/autoit][autoit][/autoit][autoit]

    $sStdOut = "User RAM Path" & @CRLF & _
    "abcd123 20% /usr/lib/firefox" & @CRLF & _
    "abcd345 23% /usr/lib/soffice"

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    $aStdOut = _StdOut($sStdOut)
    _ArrayDisplay($aStdOut)

    [/autoit][autoit][/autoit][autoit]

    Func _StdOut($sStdOut)
    Local $aStdOut[1][3] = [[0]], $iCnt = 0

    [/autoit][autoit][/autoit][autoit]

    Local $aRegExp = StringRegExp($sStdOut, "(\w+)\h+(\d+%)\h+([^\r\n]+)", 3)

    [/autoit][autoit][/autoit][autoit]

    If IsArray($aRegExp) Then
    $iCnt = UBound($aRegExp) / 3
    ReDim $aStdOut[$iCnt + 1][3]
    $aStdOut[0][0] = $iCnt

    [/autoit][autoit][/autoit][autoit]

    For $i = 0 To $iCnt - 1
    $aStdOut[$i + 1][0] = $aRegExp[$i * 3]
    $aStdOut[$i + 1][1] = $aRegExp[$i * 3 + 1]
    $aStdOut[$i + 1][2] = $aRegExp[$i * 3 + 2]
    Next
    EndIf

    [/autoit][autoit][/autoit][autoit]

    Return $aStdOut
    EndFunc ;==>_StdOut

    [/autoit]

    E

  • GDI+ Spielerei - Feuerwerk

    • eukalyptus
    • 1. Dezember 2012 um 01:13

    Danke für euer Feedback!

    Hab noch ein paar Kleinigkeiten verändert.

    Eigentlich würde mich eine ASM-Umsetzung in Realtime reizen, aber das verschiebe auf ein anderes mal...

    E

  • GDI+ Spielerei - Feuerwerk

    • eukalyptus
    • 30. November 2012 um 18:55

    Hallo, meine Lieben!

    Die letzten Monate hatte ich kaum Zeit für das Forum.
    Dieser Zustand wird auch noch ein paar Monate anhalten...

    Quasi als Entschuldigung hab ich hier ein Script für euch:

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global Const $cPI = ATan(1) * 4
    Global Const $c2PI = $cPI * 2
    Global Const $cPI2 = $cPI / 2

    [/autoit] [autoit][/autoit] [autoit]

    Global Const $LENS = 2000

    [/autoit] [autoit][/autoit] [autoit]

    Opt("MustDeclareVars", 1)
    Opt("GUIOnEventMode", 1)

    [/autoit] [autoit][/autoit] [autoit]

    Global $iWidth = 800
    Global $iHeight = 600

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_Startup()

    [/autoit] [autoit][/autoit] [autoit]

    ProgressOn("Please wait...", "creating big firework... 1/3")
    Global $aFW_B = _FireWork_Create($iWidth / 2, $iHeight / 2, 180, 7, 0xFFFFFFFF, $iWidth, $iHeight)
    ProgressOn("Please wait...", "creating mid firework... 2/3")
    Global $aFW_M = _FireWork_Create($iHeight / 2, $iHeight / 2, 120, 5, 0xFFFFFFFF, $iWidth, $iHeight)
    ProgressOn("Please wait...", "creating small firework... 3/3")
    Global $aFW_S = _FireWork_Create($iHeight / 2, $iHeight / 2, 60, 3, 0xFFFFFFFF, $iWidth, $iHeight)
    ProgressOff()

    [/autoit] [autoit][/autoit] [autoit]

    Global $hGui = GUICreate("FireWork", $iWidth, $iHeight)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    Global $hDC = _WinAPI_GetDC($hGui)
    Global $hBMP = _WinAPI_CreateCompatibleBitmap($hDC, $iWidth, $iHeight)
    Global $hBmpTmp = _GDIPlus_BitmapCreateFromHBITMAP($hBMP)
    _WinAPI_DeleteObject($hBMP)
    $hBMP = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBmpTmp)
    _GDIPlus_BitmapDispose($hBmpTmp)
    Global $hCDC = _WinAPI_CreateCompatibleDC($hDC)
    Global $hOBJ = _WinAPI_SelectObject($hCDC, $hBMP)
    Global $hGfxBuffer = _GDIPlus_GraphicsCreateFromHDC($hCDC)
    _GDIPlus_GraphicsClear($hGfxBuffer, 0xFF000000)

    [/autoit] [autoit][/autoit] [autoit]

    Global $hBmpBG = _CreateBackGround()

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    GUIRegisterMsg($WM_PAINT, "WM_PAINT")
    GUIRegisterMsg($WM_ERASEBKGND, "WM_PAINT")

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Global $aAttrib = _CreateImageAttributes()
    Global $tColorMX = DllStructCreate("float[5]; float[5]; float[5]; float[5]; float[5];")
    DllStructSetData($tColorMX, 1, 1, 1)
    DllStructSetData($tColorMX, 2, 1, 2)
    DllStructSetData($tColorMX, 3, 1, 3)
    DllStructSetData($tColorMX, 4, 1, 4)
    DllStructSetData($tColorMX, 5, 1, 5)

    [/autoit] [autoit][/autoit] [autoit]

    Global $iTimer = TimerInit()
    While 1
    If TimerDiff($iTimer) >= 20 Then
    $iTimer = TimerInit()
    _Draw()
    EndIf
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _CreateImageAttributes()
    Local $aAttrib[7]
    Local $aResult

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To 6
    $aResult = DllCall($ghGDIPDll, "int", "GdipCreateImageAttributes", "ptr*", 0)
    $aAttrib[$i] = $aResult[1]
    Next

    [/autoit] [autoit][/autoit] [autoit]

    Return $aAttrib
    EndFunc ;==>_CreateImageAttributes

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _FireWork_Create($fCX, $fCY, $iCnt, $fSpeed, $iColor, $iW, $iH)
    Local $aExp[$iCnt + 1][40] = [[$iCnt]]
    Local $fPhi, $fTheta
    Local $fVX, $fVY, $fVZ, $fD

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To $iCnt
    $fPhi = Random(0, $cPI2)
    $fTheta = Random(0, $c2PI)

    [/autoit] [autoit][/autoit] [autoit]

    $fVX = Sin($fPhi) * Cos($fTheta) * $fSpeed
    $fVY = Sin($fPhi) * Sin($fTheta) * $fSpeed
    $fVZ = Cos($fPhi) * $fSpeed

    [/autoit] [autoit][/autoit] [autoit]

    $fD = ($LENS - $fVZ)

    [/autoit] [autoit][/autoit] [autoit]

    $aExp[$i][0] = $fCX
    $aExp[$i][1] = $fCY
    $aExp[$i][2] = $LENS * $fVX / $fD
    $aExp[$i][3] = $LENS * $fVY / $fD
    $aExp[$i][4] = Random(70, 122, 1)
    $aExp[$i][5] = Random(0.4, 1.6)

    [/autoit] [autoit][/autoit] [autoit]

    For $j = 0 To 32 Step 2
    $aExp[$i][6 + $j] = $fCX
    $aExp[$i][7 + $j] = $fCY
    Next
    Next

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Local $aFW[129]
    Local $fX, $fY, $fR, $fTX, $fTY
    Local $hContext, $hBitmap
    Local $hPen = _GDIPlus_PenCreate($iColor, 1)
    Local $hBrush = _GDIPlus_BrushCreateSolid(BitOR(0x08000000, BitAND($iColor, 0x00FFFFFF)))

    [/autoit] [autoit][/autoit] [autoit]

    Local $tCMX = DllStructCreate("float[5]; float[5]; float[5]; float[5]; float[5];")
    DllStructSetData($tCMX, 1, 1, 1)
    DllStructSetData($tCMX, 2, 1, 2)
    DllStructSetData($tCMX, 3, 1, 3)
    DllStructSetData($tCMX, 4, 0.85, 4)
    DllStructSetData($tCMX, 5, 1, 5)

    [/autoit] [autoit][/autoit] [autoit]

    Local $aResult = DllCall($ghGDIPDll, "int", "GdipCreateImageAttributes", "ptr*", 0)
    Local $hAttr = $aResult[1]
    DllCall($ghGDIPDll, "int", "GdipSetImageAttributesColorMatrix", "ptr", $hAttr, "int", 1, "int", 1, "ptr", DllStructGetPtr($tCMX), "ptr", 0, "int", 0)

    [/autoit] [autoit][/autoit] [autoit]

    Local $fSW = $fSpeed / 3
    Local $fSW2 = $fSW * 1.5, $fSW4 = $fSW * 3
    Local $aLog[33]
    For $i = 0 To 32 Step 2
    $aLog[$i] = Log($i * 5 / 32 + 2) * $fSW
    Next

    [/autoit] [autoit][/autoit] [autoit]

    For $iStep = 1 To 128
    ProgressSet($iStep / 128 * 100)
    For $i = 1 To $iCnt
    $aExp[$i][2] += -$aExp[$i][2] / 48
    $aExp[$i][3] += ($aExp[$i][5] - $aExp[$i][3]) / 48

    [/autoit] [autoit][/autoit] [autoit]

    For $j = 32 To 2 Step -2
    $aExp[$i][6 + $j] = $aExp[$i][4 + $j]
    $aExp[$i][7 + $j] = $aExp[$i][5 + $j]
    Next

    [/autoit] [autoit][/autoit] [autoit]

    $aExp[$i][6] = $aExp[$i][0]
    $aExp[$i][7] = $aExp[$i][1]
    $aExp[$i][0] += $aExp[$i][2]
    $aExp[$i][1] += $aExp[$i][3]
    Next

    [/autoit] [autoit][/autoit] [autoit]

    $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $iW, "int", $iH, "int", 0, "int", 0x0026200A, "ptr", 0, "int*", 0)
    $hBitmap = $aResult[6]
    $aFW[$iStep] = $hBitmap
    $hContext = _GDIPlus_ImageGetGraphicsContext($aFW[$iStep])
    _GDIPlus_GraphicsSetSmoothingMode($hContext, 2)

    [/autoit] [autoit][/autoit] [autoit]

    DllCall($ghGDIPDll, "int", "GdipDrawImageRectRectI", "hwnd", $hContext, "hwnd", $aFW[$iStep - 1], "int", 0, "int", 0, "int", $iW, "int", $iH, "int", 0, "int", 0, "int", $iW, "int", $iH, "int", 2, "ptr", $hAttr, "int", 0, "int", 0)

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To $aExp[0][0]
    If $iStep > $aExp[$i][4] Then ContinueLoop
    $fX = $aExp[$i][0] + Random(-1, 1)
    $fY = $aExp[$i][1] + Random(-1, 1)
    ;DllCall($ghGDIPDll, "int", "GdipDrawEllipse", "handle", $hContext, "handle", $hPen, "float", $fX, "float", $fY, "float", 1, "float", 1)
    DllCall($ghGDIPDll, "uint", "GdipBitmapSetPixel", "hwnd", $hBitmap, "int", $fX, "int", $fY, "uint", $iColor)

    [/autoit] [autoit][/autoit] [autoit]

    For $j = 0 To 32 Step 2
    $fR = $aLog[$j];Log($j * 5 / 32 + 2) * $fSW
    $fX = $aExp[$i][6 + $j] + Random(-$fR, $fR)
    $fY = $aExp[$i][7 + $j] + Random(-$fR, $fR)

    [/autoit] [autoit][/autoit] [autoit]

    If (76 - $j) - $iStep > 0 Then
    ;DllCall($ghGDIPDll, "int", "GdipFillEllipse", "handle", $hContext, "handle", $hBrush, "float", $fX - $fSW2, "float", $fY - $fSW2, "float", $fSW4, "float", $fSW4)
    DllCall($ghGDIPDll, "int", "GdipFillRectangle", "handle", $hContext, "handle", $hBrush, "float", $fX - $fSW2, "float", $fY - $fSW2, "float", $fSW4, "float", $fSW4)
    ;DllCall($ghGDIPDll, "int", "GdipDrawEllipse", "handle", $hContext, "handle", $hPen, "float", $fX, "float", $fY, "float", 1, "float", 1)
    DllCall($ghGDIPDll, "uint", "GdipBitmapSetPixel", "hwnd", $hBitmap, "int", $fX, "int", $fY, "uint", $iColor)
    EndIf
    Next
    Next
    _GDIPlus_GraphicsDispose($hContext)
    Next

    [/autoit] [autoit][/autoit] [autoit]

    DllCall($ghGDIPDll, "int", "GdipDisposeImageAttributes", "ptr", $hAttr)
    _GDIPlus_PenDispose($hPen)
    _GDIPlus_BrushDispose($hBrush)

    [/autoit] [autoit][/autoit] [autoit]

    $aFW[0] = 128
    Return $aFW
    EndFunc ;==>_FireWork_Create

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _FireWork_Dispose(ByRef $aFW)
    If Not IsArray($aFW) Then Return
    For $i = 1 To $aFW[0]
    _GDIPlus_BitmapDispose($aFW[$i])
    Next
    $aFW = 0
    EndFunc ;==>_FireWork_Dispose

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _CreateBackGround()
    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $iWidth, "int", $iHeight, "int", 0, "int", 0x0026200A, "ptr", 0, "int*", 0)
    Local $hBitmap = $aResult[6]
    Local $hContext = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    _GDIPlus_GraphicsSetSmoothingMode($hContext, 2)
    _GDIPlus_GraphicsClear($hContext, 0xFF00000A)

    [/autoit] [autoit][/autoit] [autoit]

    Local $hBrush1 = _GDIPlus_BrushCreateSolid(0x88FFFFFF)
    Local $hBrush2 = _GDIPlus_BrushCreateSolid(0x02FFFFFF)

    [/autoit] [autoit][/autoit] [autoit]

    Local $fX, $fY, $fR, $fR1
    For $i = 1 To 250
    $fX = Random(0, $iWidth)
    $fY = Random(0, $iHeight)
    $fR = Random(0.2, 2.5)
    $fR1 = $fR * 4
    DllCall($ghGDIPDll, "int", "GdipFillEllipse", "handle", $hContext, "handle", $hBrush2, "float", $fX - $fR1, "float", $fY - $fR1, "float", $fR1 + $fR1, "float", $fR1 + $fR1)
    DllCall($ghGDIPDll, "int", "GdipFillEllipse", "handle", $hContext, "handle", $hBrush1, "float", $fX - $fR, "float", $fY - $fR, "float", $fR + $fR, "float", $fR + $fR)
    Next

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_BrushDispose($hBrush1)
    _GDIPlus_BrushDispose($hBrush2)
    _GDIPlus_GraphicsDispose($hContext)
    Return $hBitmap
    EndFunc ;==>_CreateBackGround

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Draw()
    Local Static $aStep[7] = [0, 5000, 129, 129, 129, 129, 129], $aWait[7] = [0, Random(140, 500, 1), Random(140, 500, 1), Random(140, 500, 1), Random(400, 1000, 1), Random(400, 1000, 1), Random(400, 1000, 1)]
    Local Static $aPos[7][2]

    [/autoit] [autoit][/autoit] [autoit]

    Local $fR, $fG, $fB

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To 6
    $aStep[$i] += 1
    If $aStep[$i] > $aWait[$i] Then
    $aStep[$i] = 1
    If $i <= 3 Then
    $aWait[$i] = Random(140, 500, 1)
    Else
    $aWait[$i] = Random(400, 1000, 1)
    EndIf
    $aPos[$i][0] = Random(-300, 300, 1)
    $aPos[$i][1] = Random(-200, 100, 1)

    [/autoit] [autoit][/autoit] [autoit]

    $fR = Random(0, 1)
    $fG = Random(0, 1)
    $fB = Random(0, 1)

    [/autoit] [autoit][/autoit] [autoit]

    Switch Random(0, 2, 1)
    Case 0
    $fR = 1
    Case 1
    $fG = 1
    Case Else
    $fB = 1
    EndSwitch

    [/autoit] [autoit][/autoit] [autoit]

    DllStructSetData($tColorMX, 1, $fR, 1)
    DllStructSetData($tColorMX, 2, $fG, 2)
    DllStructSetData($tColorMX, 3, $fB, 3)
    DllCall($ghGDIPDll, "int", "GdipSetImageAttributesColorMatrix", "ptr", $aAttrib[$i], "int", 1, "int", 1, "ptr", DllStructGetPtr($tColorMX), "ptr", 0, "int", 0)
    EndIf
    Next

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_GraphicsDrawImage($hGfxBuffer, $hBmpBG, 0, 0)

    [/autoit] [autoit][/autoit] [autoit]

    If $aStep[1] <= 128 Then DllCall($ghGDIPDll, "int", "GdipDrawImageRectRectI", "hwnd", $hGfxBuffer, "hwnd", $aFW_B[$aStep[1]], "int", $aPos[1][0], "int", $aPos[1][1], "int", $iWidth, "int", $iHeight, "int", 0, "int", 0, "int", $iWidth, "int", $iHeight, "int", 2, "ptr", $aAttrib[1], "int", 0, "int", 0)
    If $aStep[2] <= 128 Then DllCall($ghGDIPDll, "int", "GdipDrawImageRectRectI", "hwnd", $hGfxBuffer, "hwnd", $aFW_M[$aStep[2]], "int", $aPos[2][0], "int", $aPos[2][1], "int", $iWidth, "int", $iHeight, "int", 0, "int", 0, "int", $iWidth, "int", $iHeight, "int", 2, "ptr", $aAttrib[2], "int", 0, "int", 0)
    If $aStep[3] <= 128 Then DllCall($ghGDIPDll, "int", "GdipDrawImageRectRectI", "hwnd", $hGfxBuffer, "hwnd", $aFW_S[$aStep[3]], "int", $aPos[3][0], "int", $aPos[3][1], "int", $iWidth, "int", $iHeight, "int", 0, "int", 0, "int", $iWidth, "int", $iHeight, "int", 2, "ptr", $aAttrib[3], "int", 0, "int", 0)

    [/autoit] [autoit][/autoit] [autoit]

    If $aStep[4] <= 128 Then DllCall($ghGDIPDll, "int", "GdipDrawImageRectRectI", "hwnd", $hGfxBuffer, "hwnd", $aFW_B[$aStep[4]], "int", $aPos[4][0], "int", $aPos[4][1], "int", $iWidth, "int", $iHeight, "int", 0, "int", 0, "int", $iWidth, "int", $iHeight, "int", 2, "ptr", $aAttrib[4], "int", 0, "int", 0)
    If $aStep[5] <= 128 Then DllCall($ghGDIPDll, "int", "GdipDrawImageRectRectI", "hwnd", $hGfxBuffer, "hwnd", $aFW_M[$aStep[5]], "int", $aPos[5][0], "int", $aPos[5][1], "int", $iWidth, "int", $iHeight, "int", 0, "int", 0, "int", $iWidth, "int", $iHeight, "int", 2, "ptr", $aAttrib[5], "int", 0, "int", 0)
    If $aStep[6] <= 128 Then DllCall($ghGDIPDll, "int", "GdipDrawImageRectRectI", "hwnd", $hGfxBuffer, "hwnd", $aFW_S[$aStep[6]], "int", $aPos[6][0], "int", $aPos[6][1], "int", $iWidth, "int", $iHeight, "int", 0, "int", 0, "int", $iWidth, "int", $iHeight, "int", 2, "ptr", $aAttrib[6], "int", 0, "int", 0)

    [/autoit] [autoit][/autoit] [autoit]

    _WinAPI_BitBlt($hDC, 0, 0, $iWidth, $iHeight, $hCDC, 0, 0, 0x00CC0020)
    EndFunc ;==>_Draw

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func WM_PAINT($hWnd, $uMsgm, $wParam, $lParam)
    _WinAPI_BitBlt($hDC, 0, 0, $iWidth, $iHeight, $hCDC, 0, 0, 0x00CC0020)
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_PAINT

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Exit()
    For $i = 1 To 6
    DllCall($ghGDIPDll, "int", "GdipDisposeImageAttributes", "ptr", $aAttrib[$i])
    Next
    _FireWork_Dispose($aFW_B)
    _FireWork_Dispose($aFW_M)
    _FireWork_Dispose($aFW_S)
    _GDIPlus_BitmapDispose($hBmpBG)
    _GDIPlus_GraphicsDispose($hGfxBuffer)
    _WinAPI_SelectObject($hCDC, $hOBJ)
    _WinAPI_DeleteObject($hBMP)
    _WinAPI_DeleteDC($hCDC)
    _WinAPI_ReleaseDC($hGui, $hDC)
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>_Exit

    [/autoit]


    Läuft zwar nicht 100% flüssig, aber ich hoffe, es gefällt euch trotzdem...

    Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.

    Viel Spaß beim Ausprobieren!
    E

    Dateien

    Feuerwerk.JPG 42,36 kB – 0 Downloads

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™