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

  • 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:
    autoit.de/wcf/attachment/17817/ autoit.de/wcf/attachment/17822/ autoit.de/wcf/attachment/17827/ autoit.de/wcf/attachment/17832/ autoit.de/wcf/attachment/17837/ autoit.de/wcf/attachment/17842/


    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

  • Very impressiv Andy, meine Eukalyptus :D

    Das hast du also zu Weihnachten gemacht! ;)

    Starkes Stück arbeit, vor allem der ASM Teil ist der Hammer! Cool wäre noch eine Art Animation...


    Ich habe da auch eine Vision als Intro für meine Watermark App, aber ich habe keine Ahnung, ob ich die Vision in Bits und Bytes bringen kann... ?(

    LG,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Könnte man das nicht als Grundlage nehmen um vom Benutzer eingegebene komplexe Funktionen zu plotten?
    Du machst im Grunde ja nichts anderes, als zufällig generierte komplexe Funktionen per domain coloring zu zeichnen, oder hab ich da was falsch verstanden?
    Auf jeden Fall klasse Arbeit!

  • Sehr schön :love:

    Sorry aber ich konnte mir nicht verkneifen, noch etwas daran rumzubasteln :D
    Ich weiss, ich hab nur ein paar Linien etwas verändert, deshalb sag ich auch nicht ICH habs geschrieben.
    Da ein bisschen was weggelassen und hier ein bisschen was hinzugefügt und zack...wird daraus ein wunderschöner (noch etwas leicht umgehbarer) Screensaver :thumbup:

    Spoiler anzeigen
    [autoit]

    #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 = @DesktopWidth
    Global $iHeight = @DesktopHeight

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

    Global $hGui = GUICreate("", $iWidth, $iHeight, "", "", BitOR($WS_SYSMENU,$WS_MAXIMIZE,$WS_POPUP), BitOR($WS_EX_TOPMOST,$WS_EX_WINDOWEDGE))
    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, 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
    While True
    _New()
    Sleep(10000)
    WEnd

    [/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]


    Edit: Das ganze noch als fertig kompilierter Screensaver, "rechtsklick->installieren" und fertig :love:

  • Wow... wirklich tolle Arbeit, Respekt.

    Ich werd mir demnächst auch mal die Mathematik dahinter ansehen :D

    There's a joke that C has the speed and efficieny of assembly language combined with readability of....assembly language. In other words, it's just a glorified assembly language. - Teh Interwebz

    C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, you blow off your whole leg. - Bjarne Stroustrup
    Genie zu sein, bedeutet für mich, alles zu tun, was ich will. - Klaus Kinski

  • Seeeeehr nice :thumbup: , was soll ich sagen....wie immer :thumbup:

  • Erstmal vielen Dank fürs Feedback!

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

    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

  • Naja im Grunde genommen ist es einfach eine Art komplexe Funktionen darzustellen. Eine reelle Funktion lässt sich ja in einem 2 dimensionalen kartesischen Koordinatensystem darstellen. Wenn man eine komplexe Zahl darstellen möchte, braucht man wiederum ein 2 dimensionales Koordinatensystem; eine Achse mit imaginären Anteil, eine mit reellem. Wenn man nun eine komplexe Funktion darstellen möchte, bräuchte man also ein 4 dimensionales Koordinatensystem. Da das nicht möglich ist bedient man sich beim Domain Coloring einer anderen Technik.
    Eine komplexe Zahl z=a+bi lässt sich auch in ihren Polarkoordinaten darstellen: z = re^iθ, wobei r die Länge des Vektors im komplexen Koordinatensystem und θ der Winkel zur positiven reellen Achse ist.
    Nun stellt man beim Domain Coloring den Winkel als Farbwert und r als Farbintensität dar.
    Mit dieser Technik lassen sich also nun komplexe Funktionen darstellen.

    Ich hoffe ich konnte mich verständlich genug ausdrücken und peitsch mich bitte aus, falls ich irgendeinen Schwachsinn verzapft hab:D
    mfg K4z

  • Hi,

    habe mir den ASM-Code natürlich angeschaut und ausgestoppt.
    Die Funktion _ASM_Calc_Color() benötigt auf meinem Rechner ca. 100-200 Millisekunden.
    Das liegt unter anderem an "meinem Freund" FPATAN()und auch daran, dass recht viel mit Variablen aus dem Speicher gerechnet wird, statt mit den Prozessorregistern. Alles in allem aber ein feiner Code :thumbup:

    Da ich weiss, wieviel Mühe, Zeit und Nerven es kostet ASM-Code zu optimieren (jaja AspirinJunkie, lach nur ^^), habe ich den AutoIt-Code von Eukalyptus mehr schlecht als recht in einen OpenCl-Kernel transferiert. Sagen wir mal so, es läuft^^, die C-Freaks werden sicher etwas zu verbessern haben.

    Auf der CPU (DualCore) ist das OpenCL-Programm in etwa gleich schnell, pro Core also etwa halb so schnell wie der ASM-Code. OpenCl nutzt alle verfügbaren Cores, daher wird schon bei einem Quadcore das Programm ca. doppelt so schnell laufen wie der ASM-Code.
    Auf der GPU wird aber wieder mal gezeigt, wo der Hammer hängt! Selbst auf meiner lowlevel-Grafikkarte läuft das Programm ca. 17x schneller als Eukalyptus´ASM-Code....

    Sicherlich kann man den OpenCL-Kernel noch optimieren, allein durch SIMD würde der Code auf der CPU ca. 1.5x schneller laufen.
    Gerade bei float-Berechnungen die sich gut parallelisieren lassen, führt imho kein Weg an OpenCL vorbei, schon garnicht, wenn auf einer Grafikkarte bzw. GPU gerechnet wird.

    Der Kernel gehört natürlich in eine CL-Datei, dann ist der Code wesentlich einfacher zu editieren und auch zu lesen....aber da war die Nacht zuende :sleeping:

    Wer mehrere GPU´s in seinem Rechner hat, kann diese in Zeile 129 einzeln anwählen per _CL_GetDevice("GPU",1,nummer_device) oder die erste einfach per _CL_GetDevice("GPU")

    Spoiler anzeigen
    [autoit]

    ;#AutoIt3Wrapper_UseX64=y

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

    ;**** Directives created by AutoIt3Wrapper_GUI ****
    #include <opencl_easy.au3>
    #include <GUIConstantsEx.au3>
    #include <WinAPI.au3>
    #include <GDIConstants.au3>
    #include <Misc.au3>

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

    ;"#pragma OPENCL EXTENSION cl_amd_printf : enable"& @CRLF & _
    Global $KernelSource = "#define cPI atan(1.0f) * 4.0f" & @CRLF & _;konstanten atan(1.0f) * 4.0f
    "#define c2PI cPI*2.0f" & @CRLF & _
    "#define cPI2 cPI/2.0f" & @CRLF & _
    "void _CLog(float *fR, float *fI)" & @CRLF & _;funktion
    "{" & @CRLF & _
    "float fRP = sqrt(*fR * *fR + *fI * *fI);" & @CRLF & _
    "float fIP = atan2(*fI, *fR);" & @CRLF & _; 'printf("var2 %f\n",fIP);'& @CRLF & _
    "if (fIP > cPI) fIP = fIP - c2PI;" & @CRLF & _
    "*fR = log(fRP);" & @CRLF & _
    "*fI = fIP;" & @CRLF & _
    "}" & @CRLF & _
    "void _HSVtoRGB(float fH, float fS, float fV, int *iRs, int *iGs, int *iBs)" & @CRLF & _
    "{;" & @CRLF & _
    "float iR,iG,iB;"& @CRLF & _
    "fH = fH*6.0f;" & @CRLF & _
    "float iS = floor(fH);" & @CRLF & _
    "float fF = fH - iS;" & @CRLF & _
    "float fP = fV * (1.0f - fS);" & @CRLF & _
    "float fQ = fV * (1.0f - fS * fF);" & @CRLF & _
    "float fT = fV * (1.0f - fS * (1.0f - fF));" & @CRLF & _
    "switch ((int)iS) {" & @CRLF & _
    "case 0:" & @CRLF & _
    " iR = fV;" & @CRLF & _
    " iG = fT;" & @CRLF & _
    " iB = fP;" & @CRLF & _
    " break;" & @CRLF & _
    "case 1:" & @CRLF & _
    " iR = fQ;" & @CRLF & _
    " iG = fV;" & @CRLF & _
    " iB = fP;" & @CRLF & _
    " break;" & @CRLF & _
    "case 2:" & @CRLF & _
    " iR = fP;" & @CRLF & _
    " iG = fV;" & @CRLF & _
    " iB = fT;" & @CRLF & _
    " break;" & @CRLF & _
    "case 3:" & @CRLF & _
    " iR = fP;" & @CRLF & _
    " iG = fQ;" & @CRLF & _
    " iB = fV;" & @CRLF & _
    " break;" & @CRLF & _
    "case 4:" & @CRLF & _
    " iR = fT;" & @CRLF & _
    " iG = fP;" & @CRLF & _
    " iB = fV;" & @CRLF & _
    " break;" & @CRLF & _
    "default:" & @CRLF & _
    " iR = fV;" & @CRLF & _
    " iG = fP;" & @CRLF & _
    " iB = fQ;" & @CRLF & _
    "}" & @CRLF & _
    "" & @CRLF & _
    "*iRs = (int)(iR * 255.0f);" & @CRLF & _; 'printf("var %f\n",iR);'& @CRLF & _
    "*iGs = (int)(iG * 255.0f);" & @CRLF & _
    "*iBs = (int)(iB * 255.0f);" & @CRLF & _
    "" & @CRLF & _
    "" & @CRLF & _
    "}" & @CRLF & _
    "__kernel void domain_coloring( __global int* output,const unsigned int iW,const unsigned int iH)" & @CRLF & _
    "{" & @CRLF & _
    "float fRmi = -3;" & @CRLF & _
    "float fRma = 3;" & @CRLF & _
    "float fImi = -3;" & @CRLF & _
    "float fIma = 3;" & @CRLF & _
    "uint threadid = get_global_id(0);" & @CRLF & _ ;thread-id, d.h. jedes pixel von 1 bis b*h;get_global_id(0)
    "float y = threadid/iH;" & @CRLF & _ ;pixelkoordinaten
    "float x = threadid%iW;" & @CRLF & _ ;pixelkoordinaten
    "float fIm = fIma - (fIma - fImi) * y /((float)(iH-1));" & @CRLF & _ ;...Berechnungen
    "float fRe = fRma - (fRma - fRmi) * x /((float)(iW-1));" & @CRLF & _ ;...Berechnungen 'printf("var2 %f\n",fRe);'& @CRLF & _
    "_CLog(&fRe,&fIm);" & @CRLF & _;
    "float fHue = atan2(fIm, fRe);" & @CRLF & _; 'printf("var2 %f\n",fHue);'& @CRLF & _
    "while (fHue < 0.0f) fHue = fHue+c2PI;" & @CRLF & _; 'printf("var2 %f\n",fHue);'& @CRLF & _
    "fHue = fHue / (c2PI);" & @CRLF & _;warum muss man die klammern um c2PI setzen?????? 'printf("var2 %f\n",fHue);'& @CRLF & _
    "float fSat = fabs((float) (sin(c2PI * sqrt(fRe * fRe + fIm * fIm))));" & @CRLF & _;
    "float fVal = pow((float) fabs((float) (sin(c2PI * fIm) * sin(c2PI * fRe))), 0.3f);" & @CRLF & _;
    "fVal = 0.5f * ((1.0f - fSat) + fVal + sqrt( pow((float) (1.0f - fSat - fVal) , 2.0f) + 0.01f));" & @CRLF & _; 'if (threadid==10) printf("var %f\n",fVal);'& @CRLF & _;if (threadid==10)
    "if (fSat>1) fSat=1;" & @CRLF & _
    "if (fSat<0) fSat=0;" & @CRLF & _
    "if (fVal>1) fVal=1;" & @CRLF & _
    "if (fVal<0) fVal=0;" & @CRLF & _;
    "int iRc=0,iGc=0,iBc=0;"& @CRLF & _
    "_HSVtoRGB(fHue, fSat, fVal, &iRc, &iGc, &iBc);" & @CRLF & _; 'printf("var2 %d\n",iGc);'& @CRLF & _
    "output[threadid] = 0xFF000000+(iRc<<16)+(iGc<<8)+iBc;" & @CRLF & _ ;Pixel schreiben 0xFFBBGGRR, BB=GG=RR=t native_powr(iter,2)
    "}"

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

    ;

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

    ;Daten
    Global $width = 600 ;breite und höhe der gui/grafik, die Anzahl der "Threads" sollte ein Vielfaches von 16 sein!
    Global $height = 600
    Global $dll = DllOpen("user32.dll")
    Global $mouseflag = 1
    Global $fps = 0

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

    Opt("GUIOnEventMode", 1)
    Opt("MouseCoordMode", 2)

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

    $hgui = GUICreate("Domain Coloring", $width, $height, 1, 1) ;GUI erstellen
    $hdc_gui = _WinAPI_GetDC($hgui) ;HDC holen zum blitten
    GUISetState()
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")

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

    AdlibRegister("_fps", 1000) ;FramesPerSecond

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

    ;bitmap erzeugen, in $ptr_bitmap steht nach dem Funktionsaufruf der Pointer auf die Pixeldaten
    Local $ptr_bitmap, $hbmp_bitmap ;byref
    $hDC_bitmap = _CreateNewBmp32($width, $height, $ptr_bitmap, $hbmp_bitmap) ;DC, Pointer auf die Bitmapdaten und ein Handle für GDI+....eine eierlegende Wollmilchsau

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

    Global $DATA_SIZE = $width * $height ;bildgröße=anzahl pixel (rgba)
    Global $NULL = 0

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

    ;ab hier gehts mit OpenCl los
    ;Zunächst werden die verfügbaren Geräte(Devices) gesucht.
    _CL_GetDevice("ALL") ;..ALL oder CPU oder GPU, ermittelt das Gerät, auf dem die Berechnungen durchgeführt werden.
    ;zweiter Parameter gibt bei z.b. mehreren Grafikkarten die Nummer des Geräts an

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

    ;Puffer für die Bitmap
    $output_buffer = DllStructCreate("dword[" & $DATA_SIZE & "]", $ptr_bitmap);halleluja! bitmaps werden immer 16byte-aligned!
    $CL_buffer_out = _CL_CreateBuffer($output_buffer)

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

    ;Parameter an den Kernel übergeben
    _CL_SetArg(0, "ptr*", $CL_buffer_out)
    _CL_SetArg(1, "uint*", $width)
    _CL_SetArg(2, "uint*", $height)

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

    $CL_DEBUGFLAG = 0 ;Debug-Ausgabe ausschalten, um Geschwindigkeit zu erhöhen

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

    While 1 ;endless loop...
    _CL_RunKernel($DATA_SIZE, 0) ;Kernel ausführen, d
    _CL_ReadBuffer($CL_buffer_out, $output_buffer);Puffer(alle Pixel) lesen
    _WinAPI_BitBlt($hdc_gui, 0, 0, $width, $height, $hDC_bitmap, 0, 0, $srccopy) ;Bitmap in die GUI blitten
    $fps += 1 ;Frames pro Sekunde zählen
    WEnd

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

    ;...das wars schon^^

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

    Func _CreateNewBmp32($iwidth, $iheight, ByRef $ptr, ByRef $hbmp) ;erstellt leere 32-bit-Bitmap; Rückgabe DC und ptr und handle auf die Bitmapdaten
    ;by Andy
    Local $hcdc = _WinAPI_CreateCompatibleDC(0) ;Desktop-Kompatiblen DeviceContext erstellen lassen
    Local $tBMI = DllStructCreate($tagBITMAPINFO) ;Struktur der Bitmapinfo erstellen und Daten eintragen
    DllStructSetData($tBMI, "Size", DllStructGetSize($tBMI) - 4) ;Structgröße abzüglich der Daten für die Palette
    DllStructSetData($tBMI, "Width", $iwidth)
    DllStructSetData($tBMI, "Height", -$iheight) ;minus =standard = bottomup
    DllStructSetData($tBMI, "Planes", 1)
    DllStructSetData($tBMI, "BitCount", 32) ;32 Bit = 4 Bytes => AABBGGRR
    Local $adib = DllCall('gdi32.dll', 'ptr', 'CreateDIBSection', 'hwnd', 0, 'ptr', DllStructGetPtr($tBMI), 'uint', $DIB_RGB_COLORS, 'ptr*', 0, 'ptr', 0, 'uint', 0)
    $hbmp = $adib[0] ;hbitmap handle auf die Bitmap, auch per GDI+ zu verwenden
    $ptr = $adib[4] ;pointer auf den Anfang der Bitmapdaten, vom Assembler verwendet
    _WinAPI_SelectObject($hcdc, $hbmp) ;objekt hbitmap in DC
    Return $hcdc ;DC der Bitmap zurückgeben
    EndFunc ;==>_CreateNewBmp32

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

    Func _fps()
    WinSetTitle($hgui, "", "Domain Coloring " & $fps & " FPS")
    $fps = 0
    EndFunc ;==>_fps

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

    Func _Exit()
    Exit
    EndFunc ;==>_Exit

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

    die benötigten Includes und weitere Infos gibts HIER

    //EDIT
    den Kernel in eine Datei ausgelagert

    domain_coloring.cl

    , dann muss nur noch eine Zeile im Script geändert werden

    [autoit]

    Global $KernelSource = fileread("domain_coloring.cl")

    [/autoit]

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    3 Mal editiert, zuletzt von Andy (29. Dezember 2012 um 13:41)

  • Ich hab mir den Code noch nicht gerade sehr genau angeguckt, aber 2 kleine Sachen hab ich gefunden:
    eukalyptus imul register,16 geht schneller mit shl register,4 (2 hoch 4 = 16) (shl=shift left).
    Andy soweit ich weiß hat atan noch einen recht großen Geschindigkeitsunterschied zu atanf. atanf entspricht dem ASM-Code fpatan, während in atan noch zusätzlicher Code ist (wie gesagt, meines Wissens nach, noch nicht nachgeprüft).

    eukalyptus vielleicht interessiert dich der ASM-Befehl "jecxz" (jump if ecx zero)

  • Hi,

    Zitat

    eukalyptus imul register,16 geht schneller mit shl register,4 (2 hoch 4 = 16) (shl=shift left).

    ich hatte solchen "Kleinkram" einfach aussen vorgelassen, denn die Optimierung von Assemblercode auf den heutigen Prozessorern bedeutet nicht (unbedingt) einen Befehl zu verwenden, der einen halben Takt einspart. Aber natürlich hast du Recht, idR ist ein Shift schneller....
    Aber auch die Rechnerei mit Variablen im Speicher ist so langsam nicht, solange man darauf achtet, dass die angeforderten Adressen im Lvl1-Cache liegen. Wie gesagt, alles eine Frage, auf welchen Prozessor/Architektur optimiert wird.

    Angenommen, wir zerreissen den Code auf Teufel komm raus und holen, sagen wir mal, Faktor 3-4 an Geschwindigkeit raus. Das wäre natürlich in diesem speziellen Fall nicht schlecht, die Framerate würde von 5-10 auf ca. 30 FPS steigen. Bissl Multithreading drumrumgestrickt und in eine Dll verpackt, voila 8o

    Die selbe Arbeit in die Optimierung des OpenCL-Kernels gesteckt, würde die Framerate nicht mal verdoppeln, da nicht die BERECHNUNG der Pixel die meiste Zeit beansprucht, sondern der Transfer der Daten von und zu der Grafikkarte! Und btw., eine Erhöhung von 250fps auf 500? Wer bräuchte das?

    Bin gerade dabei, bei OpenCl die reinen Ausführungsszeiten der Kernel auf den einzelnen Geräten und dazu auch den Transfer der Daten in und aus dem Speicher zu "profilen".
    Im vorliegenden Fall sieht das so aus:

    Bild 600x600 Pixel
    Grafikkarte: Ausführungszeit Kernel ~0,9ms, Speichertransfer Grafikkartenspeicher>RAM ~1ms
    CPU (dualcore): Ausführungszeit Kernel ~80ms, SpeichertransferRAM>RAM ~0,2ms
    Der Zeitaufwand fürs Blitten bleibt jeweils konstant, das lassen wir mal aussen vor.

    Bild 6000x6000 Pixel
    Grafikkarte: Ausführungszeit Kernel ~90ms, Speichertransfer Grafikkartenspeicher>RAM ~150ms
    CPU (dualcore): Ausführungszeit Kernel ~9000ms (!!!), Speichertransfer RAM>RAM ~35ms

    Bei diesen Ergebnissen stellt sich nicht mehr die Frage, wo in Zukunft berechnet wird...

  • Hi,
    ja, das kannst du doch per SIMD, siehe Beispielkernel beim AlphaBlend.

    AutoIt-Code
    [autoit]

    Global $KernelSource = "__kernel void alphablend( __global int* output, __global int* dest, __global int* source, const unsigned int width,const unsigned int height,const int alpha)" & @CRLF & _
    "{" & @CRLF & _
    "uint threadid = get_global_id(0);" & @CRLF & _ ;thread-id, d.h. jedes pixel von 1 bis b*h
    "uchar a1= dest[threadid]>>24;" & @CRLF & _;alpha
    "uchar r1 =(dest[threadid]&0x00FF0000)>>16;" & @CRLF & _;rdest
    "uchar g1 =(dest[threadid]&0x0000FF00)>>8;" & @CRLF & _;g
    "uchar b1 =(dest[threadid]&0x000000FF)>>0;" & @CRLF & _;b
    "uchar p=(a1*(255-alpha))>>8;"& @CRLF & _;
    "uchar a2= source[threadid]>>24;" & @CRLF & _;alpha
    "uchar r2 =(source[threadid]&0x00FF0000)>>16;" & @CRLF & _;rsource
    "uchar g2 =(source[threadid]&0x0000FF00)>>8;" & @CRLF & _;g
    "uchar b2 =(source[threadid]&0x000000FF)>>0;" & @CRLF & _;b
    ";" & @CRLF & _
    ";" & @CRLF & _
    "uchar a=(a2*(255-p)+(a1*p))>>8;" & @CRLF & _
    "uchar r=(r2*(255-p)+(r1*p))>>8;" & @CRLF & _
    "uchar g=(g2*(255-p)+(g1*p))>>8;" & @CRLF & _;
    "uchar b=(b2*(255-p)+(b1*p))>>8;" & @CRLF & _
    ";" & @CRLF & _
    ";" & @CRLF & _
    ";" & @CRLF & _
    "output[threadid] =(a<<24)|(r<<16)|(g<<8)|b;" & @CRLF & _;
    "}"

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

    Global $KernelSource = "__kernel void alphablend( __global uchar4* output, __global uchar4* dest, __global uchar4* source, const unsigned int width,const unsigned int height,const int alpha)" & @CRLF & _
    "{" & @CRLF & _
    "uint threadid = get_global_id(0);" & @CRLF & _ ;thread-id, d.h. jedes pixel von 1 bis b*h
    "uchar4 dst= dest[threadid];" & @CRLF & _;destination pixel
    "uchar p=((dst.s3*(255-alpha))>>8);" & @CRLF & _;precalculated alpha
    "uchar4 src= source[threadid];" & @CRLF & _;source pixel
    "uchar4 argb;"& @CRLF & _
    "argb.s0=(src.s0*(255-p)+(dst.s0*p))>>8;" & @CRLF & _
    "argb.s1=(src.s1*(255-p)+(dst.s1*p))>>8;" & @CRLF & _
    "argb.s2=(src.s2*(255-p)+(dst.s2*p))>>8;" & @CRLF & _;
    "argb.s3=(src.s3*(255-p)+(dst.s3*p))>>8;" & @CRLF & _
    "output[threadid] =argb;" & @CRLF & _;(a<<24)|(r<<16)|(g<<8)|b
    "}"

    [/autoit]
    alphablend.cl

    der untere Kernel macht dasselbe wie der obere, da gehts jetzt konkret zwar nur um 4 Bytes, aber es gibt natürlich auch andere Datenformate, z.B. 16 Bytes (4 Pixel).
    Allerdings bringt das im Großen und Ganzen nur etwas auf CPU´s, da dort dann die SSE-Befehle genutzt werden, d.h. paralle Verarbeitung von 16Bytes.
    Die GPU bricht jedes "Problem" auf die kleinste Größe herunter (Anzahl der Workgroups/Workitems), will sagen, es werden (wenn möglich) alle Shader gleichzeitig benutzt.
    Verwendet man nun z.B. doppelt große Datenwörter, dann werden eben 2 Shader darauf angesetzt. Im Endeffekt bringt das also auf einer GPU nicht viel, auf einer CPU aber einen massiven Performance-Schub (SSE).

    Komprimierung ist ein anderes Thema ;)
    Man könnte die zu komprimierenden Daten anhand der vorhandenen Hardware (Anzahl der Workgroups/Workitems) schon im Vorfeld so in Blöcke aufteilen, dass die Hardware immer optimal ausgenutzt wird.
    Leider sind die gängigen Kompressionsalgoritmen darauf angelegt, mehrere Durchläufe NACHEINANDER durchzuführen. Die Daten werden dabei meist insgesamt bearbeitet, will heissen, der Algorithmus komprimiert 1Kb besser als 10 Blöcke zu je 100Bytes....
    Aber bei z.B. JPG gehts sowieso nur um 4x4 bzw 16x16 Pixel, da kann man dann sehr schön paralllel arbeiten!

    Das Aufteilen in parallel (gleichzeitig) verarbeitbare Blöcke ist also das Geheimnis.
    So ist z.B. Kantendetektion per Sobel-Operator seeeehr fix, vor allem da man dann pro Workgroup noch 16kB lokalen Speicher auf der Graka verwenden kann, der im Zugriff ca. 100x schneller ist als globaler Speicher.
    Auch Passwort-Cracken ist, wie schon mehrfach bewiesen, nun auch nicht mehr nur Supercomputern vorbehalten.....

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    3 Mal editiert, zuletzt von Andy (31. Dezember 2012 um 14:17)