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

  • Kleines GDI+ Beispiel: XOR Textur

    • eukalyptus
    • 23. September 2013 um 21:19

    Dann noch Colormatrix mit XOR dazu und fertig ;)

    Spoiler anzeigen
    [autoit]

    #AutoIt3Wrapper_Autoit3Dir=c:\Program Files (x86)\AutoIt3\Beta

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

    #include <Screencapture.au3>

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

    Opt('GUIOnEventMode', 1)

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

    Global $iSize = 32, $iW = 576, $iH = 576

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

    Global $hGUI, $hGFX, $hBMP, $hBUF, $hBmps[$iSize][$iSize], $hBRU, $iFrame, $iTimer = TimerInit(), $iFPS, $iFrameTimer = TimerInit(), $iCount = 0, _
    $hHBitmap, $hBitmap, $x, $y

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

    _GDIPlus_Startup()

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

    $sFile = FileOpenDialog("Select an image", "", "Images (*.bmp;*.png;*.jpg;*.gif;*.tif)")
    If @error Or Not FileExists($sFile) Then Exit
    $hImage = _GDIPlus_ImageLoadFromFile($sFile)
    $iImgW = _GDIPlus_ImageGetWidth($hImage)
    $iImgH = _GDIPlus_ImageGetHeight($hImage)

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

    $hGUI = GUICreate('Text', $iW, $iH)
    $hGFX = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    $hBMP = _GDIPlus_BitmapCreateFromGraphics($iW, $iH, $hGFX)
    $hBUF = _GDIPlus_ImageGetGraphicsContext($hBMP)
    ;$hHBitmap = _ScreenCapture_Capture("", 0, 0, $iSize^2, $iSize^2)

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

    $hBitmap = _GDIPlus_BitmapCreateFromScan0($iSize^2, $iSize^2)
    $hContext = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    _GDIPlus_GraphicsDrawImageRect($hContext, $hImage, 0, 0, $iSize^2, $iSize^2)
    _GDIPlus_GraphicsDispose($hContext)
    _GDIPlus_ImageDispose($hImage)

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

    ;_WinAPI_DeleteObject($hHBitmap)

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

    $tCM = _GDIPlus_ColorMatrixCreateScale(0,0,0)
    $hImgAttr = _GDIPlus_ImageAttributesCreate()
    Local $aResult, $fValue
    $fSizeInv = 1 / $iSize

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

    For $y = 0 To $iSize - 1
    For $x = 0 To $iSize - 1
    $hBmps[$y][$x] = _GDIPlus_BitmapCreateFromScan0($iSize, $iSize)
    $hCtxt = _GDIPlus_ImageGetGraphicsContext($hBmps[$y][$x])

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

    $fValue = BitXOR($x, $y) * $fSizeInv
    $tCM.m(1) = $fValue
    $tCM.m(13) = 1-$fValue
    _GDIPlus_ImageAttributesSetColorMatrix($hImgAttr, 0, True, $tCM)

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

    $aResult = DllCall($ghGDIPDll, "int", "GdipCreateTextureIA", "handle", $hBitmap, "handle", $hImgAttr, "float", $x * $iSize, "float", $y * $iSize, "float", $iSize, "float", $iSize, "handle*", 0)
    _GDIPlus_GraphicsFillRect($hCtxt, 0, 0, $iSize, $iSize, $aResult[7])
    _GDIPlus_GraphicsDispose($hCtxt)
    _GDIPlus_BrushDispose($aResult[7])
    Next
    Next
    _GDIPlus_ImageAttributesDispose($hImgAttr)

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

    GUISetOnEvent(-3, '_Exit', $hGUI)
    GUIRegisterMsg(0xF, 'WM_PAINT')
    GUISetState(@SW_SHOW, $hGUI)

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

    While Sleep(10)
    _XOR_Tex()
    WEnd

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

    Func _XOR_Tex()
    Local $iCol, $iTMP
    Local Static $iSin = 0, $iMulti = 256 / $iSize, $2Multi = 2 * $iMulti
    $iSin += 5 / (1000 / TimerDiff($iFrameTimer))
    $iFrameTimer = TimerInit()
    _GDIPlus_GraphicsClear($hBUF, 0xA0808080)
    For $x = 0 To $iSize - 1
    $iTMP = 2 * $x * $iMulti
    For $y = 0 To $iSize - 1
    _GDIPlus_GraphicsDrawImageRectF($hBUF, $hBmps[$y][$x], _
    25 + 15 * Sin($y * $iMulti / 64 + $iSin) + $iTMP, _
    15 * Cos($x * $iMulti / 64 + $iSin) + 25 + $y * $2Multi, _
    $2Multi * 1.1, _
    $2Multi * 1.1)
    Next
    Next
    $iFPS += 1
    If TimerDiff($iTimer) > 1000 Then
    $iTimer = TimerInit()
    WinSetTitle($hGUI, '', 'XOR Textur (' & $iFPS & 'FPS - ' & $iSize & 'x' & $iSize & ')')
    $xFPS = $iFPS
    $iFPS = 0
    EndIf
    WM_PAINT()
    EndFunc ;==>_XOR_Tex

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

    Func WM_PAINT()
    _GDIPlus_GraphicsDrawImage($hGFX, $hBMP, 0, 0)
    EndFunc ;==>WM_PAINT

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

    Func _Exit()
    _GDIPlus_GraphicsDispose($hBUF)
    _GDIPlus_BitmapDispose($hBMP)
    _GDIPlus_GraphicsDispose($hGFX)
    For $y = 0 To $iSize - 1
    For $x = 0 To $iSize - 1
    _GDIPlus_BitmapDispose($hBmps[$y][$x])
    Next
    Next
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>_Exit

    [/autoit]
  • Kleines GDI+ Beispiel: XOR Textur

    • eukalyptus
    • 23. September 2013 um 20:51

    Toller Effekt mit wenig Code - sehr gut :rock:

  • Ascii anzeigen ... aber wie ?

    • eukalyptus
    • 23. September 2013 um 20:15

    Du kannst auch einen normalen Font erstellen:

    [autoit]

    Global $hFont = _WinAPI_CreateFont($iSize, $iSize * 8 / 12, 0, 0, 400, False, False, False, $OEM_CHARSET, $OUT_DEFAULT_PRECIS, $CLIP_DEFAULT_PRECIS, $DEFAULT_QUALITY, 0, "Terminal")

    [/autoit]


    Somit kannst du auch die Schriftgröße angeben

    Oder auch Edit benutzen:

    [autoit]

    Global $cEdit = GUICtrlCreateEdit($sAscii, 5, 5, $iWidth-10, $iHeight-10)
    GUICtrlSetFont($cEdit, 10, 400, 0, "Terminal")

    [/autoit]

    E

  • Ascii anzeigen ... aber wie ?

    • eukalyptus
    • 23. September 2013 um 19:13

    Hier eine Möglichkeit:

    [autoit]

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

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

    Global $iWidth = 800
    Global $iHeight = 500

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

    Global $hGui = GUICreate("Test", $iWidth, $iHeight)
    GUISetState()

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

    Global $hDC = _WinAPI_GetDC($hGui)
    _WinAPI_SetTextColor($hDC, 0x0000FF)
    _WinAPI_SetBkColor($hDC, 0x000000)
    _WinAPI_SetBkMode($hDC, $TRANSPARENT)
    Global $hStock = _WinAPI_GetStockObject($OEM_FIXED_FONT)
    Global $hOldStock = _WinAPI_SelectObject($hDC, $hStock)

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

    Global $sAscii = FileRead(@ScriptDir & "\bomb_ascii.txt")

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

    Global $tRECT = DllStructCreate($tagRect)
    DllStructSetData($tRECT, "Left", 0)
    DllStructSetData($tRECT, "Top", 0)
    DllStructSetData($tRECT, "Right", $iWidth)
    DllStructSetData($tRECT, "Bottom", $iHeight)

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

    _WinAPI_DrawText($hDC, $sAscii, $tRECT, $DT_CENTER)

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

    While GUIGetMsg() <> -3
    WEnd

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

    _WinAPI_SelectObject($hDC, $hOldStock)
    _WinAPI_ReleaseDC($hGui, $hDC)

    [/autoit]
  • Audiofiles zusammenführen

    • eukalyptus
    • 23. September 2013 um 15:27

    Wenn du ein professionelles Programm zur Lautstärkenanalyse hast, dann nimm mal diese Werte
    Bei mir hat Mix.au3 die erwartete Loudness.


    Ändere mal den Parameter $bLimit = False
    und probiers nochmal aus
    MP3Gain ist zwar gut, aber nicht perfekt...

  • Audiofiles zusammenführen

    • eukalyptus
    • 23. September 2013 um 01:27

    Mit Schalldruck hat das nichts zu tun.
    (Hier wird auch anders mit dB´s gerechnet, deshalb die Verwirrung)

    Wir rechnen "ganz normal" wie man es von einem Mischpult kennt: Fader um 6dB nach unten = halbe Lautstärke
    In welchem Bereich sich dB´s bewegen ist egal, es handelt sich um relative Werte
    Deshalb kannst du auch die Angaben von MP3Gain direkt übernehmen.

    Hier eine angepasste Version:

    Spoiler anzeigen
    [autoit]

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

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

    ;Opt("MustDeclareVars", 1)

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

    OnAutoItExitRegister("OnAutoItExit")

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

    _BASS_Startup()
    _BASS_EXT_Startup()
    _BASS_MIX_Startup()
    _BASS_ENCODE_Startup()

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

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

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

    Global $sFile_Opener = @ScriptDir & "\Opener.mp3"
    Global $sFile_Main = @ScriptDir & "\Main.mp3"
    Global $sFile_Closer = @ScriptDir & "\Closer.mp3"

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

    Global $fdB_Opener = _MP3Gain_GetdB($sFile_Opener)
    Global $fdB_Main = _MP3Gain_GetdB($sFile_Main)
    Global $fdB_Closer = _MP3Gain_GetdB($sFile_Closer)
    ConsoleWrite(StringFormat("+ Opener: %.2f dB", $fdB_Opener) & @CRLF)
    ConsoleWrite(StringFormat("+ Main: %.2f dB", $fdB_Main) & @CRLF)
    ConsoleWrite(StringFormat("+ Closer: %.2f dB", $fdB_Closer) & @CRLF)

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

    _Audio_Mix(@ScriptDir & "\Mix.mp3", 89, $sFile_Opener, $fdB_Opener, $sFile_Main, $fdB_Main, $sFile_Closer, $fdB_Closer)

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

    Func _MP3Gain_GetdB($sFile)
    Local $sStdOut, $aRegExp, $iValue, $fdB

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

    ProgressOn("Analyzing Audiofile", $sFile)

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

    Local $hPID = Run(@ScriptDir & '\mp3gain -s sr -c "' & $sFile & '"', "", @SW_HIDE, 0x8)
    While 1
    $sStdOut = StdoutRead($hPID)
    If @error Then ExitLoop
    If $sStdOut Then
    $aRegExp = StringRegExp($sStdOut, "(?i)\r\h*(\d+)%\h+of\h+\d+\h+bytes\h+analyzed", 3)
    If IsArray($aRegExp) Then ProgressSet(Number($aRegExp[0]))

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

    $aRegExp = StringRegExp($sStdOut, '(?mi)^\h*Recommended\h+"Track"\h+dB\h+change:\h*(-?\d+.\d+)', 3)
    If IsArray($aRegExp) Then $fdB = Number($aRegExp[0])
    EndIf
    WEnd

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

    ProgressOff()

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

    Return 89 - $fdB
    EndFunc ;==>_MP3Gain_GetdB

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

    Func _Audio_Mix($sFile_Mix, $fdB_Studio, $sFile_Opener, $fdB_Opener, $sFile_Main, $fdB_Main, $sFile_Closer, $fdB_Closer, $fTH_Silence = -30, $fXFade = 0.3, $bLimit = True)
    Local $hStream_Opener = _BASS_StreamCreateFile(False, $sFile_Opener, 0, 0, $BASS_STREAM_DECODE)
    Local $hStream_Main = _BASS_StreamCreateFile(False, $sFile_Main, 0, 0, $BASS_STREAM_DECODE)
    Local $hStream_Closer = _BASS_StreamCreateFile(False, $sFile_Closer, 0, 0, $BASS_STREAM_DECODE)

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

    Local $iByteStart = 0, $iByteEnd = _BASS_ChannelGetLength($hStream_Main, $BASS_POS_BYTE)
    If $fTH_Silence < 0 Then _Audio_FindSilence($hStream_Main, $iByteStart, $iByteEnd, $fTH_Silence)

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

    $fdB_Gain_Opener = $fdB_Studio - $fdB_Opener
    $fdB_Gain_Main = $fdB_Studio - $fdB_Main
    $fdB_Gain_Closer = $fdB_Studio - $fdB_Closer
    ConsoleWrite(StringFormat("> Gain Opener: %.2f dB", $fdB_Gain_Opener) & @CRLF)
    ConsoleWrite(StringFormat("> Gain Main : %.2f dB", $fdB_Gain_Main) & @CRLF)
    ConsoleWrite(StringFormat("> Gain Closer: %.2f dB", $fdB_Gain_Closer) & @CRLF)

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

    Local $fdB_MaxPeak_Opener = _Audio_CalcMaxPeak($hStream_Opener)
    Local $fdB_MaxPeak_Main = _Audio_CalcMaxPeak($hStream_Main)
    Local $fdB_MaxPeak_Closer = _Audio_CalcMaxPeak($hStream_Closer)
    ConsoleWrite(StringFormat("> Max Peak Opener: %.2f dB", $fdB_MaxPeak_Opener) & @CRLF)
    ConsoleWrite(StringFormat("> Max Peak Main : %.2f dB", $fdB_MaxPeak_Main) & @CRLF)
    ConsoleWrite(StringFormat("> Max Peak Closer: %.2f dB", $fdB_MaxPeak_Closer) & @CRLF)

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

    Local $hFX_Opener, $hFX_Main, $hFX_Closer

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

    If $fdB_MaxPeak_Opener + $fdB_Gain_Opener > 0 Then
    ConsoleWrite(StringFormat("! Opener Peaks %.2f dB im Clippingbereich", $fdB_MaxPeak_Opener + $fdB_Gain_Opener) & @CRLF)
    If $bLimit Then
    ConsoleWrite(StringFormat("+ Opener Compressor auf %.2f dB, Ratio = 2.1:1", $fdB_MaxPeak_Opener - ($fdB_MaxPeak_Opener + $fdB_Gain_Opener) * 2) & @CRLF)
    $hFX_Opener = _BASS_ChannelSetFX($hStream_Opener, $BASS_FX_DX8_COMPRESSOR, 1)
    _BASS_FXSetParameters($hFX_Opener, "0|0.01|20|" & $fdB_MaxPeak_Opener - ($fdB_MaxPeak_Opener + $fdB_Gain_Opener) * 2 & "|2.1|0")
    EndIf
    EndIf

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

    If $fdB_MaxPeak_Main + $fdB_Gain_Main > 0 Then
    ConsoleWrite(StringFormat("! Main Peaks %.2f dB im Clippingbereich", $fdB_MaxPeak_Main + $fdB_Gain_Main) & @CRLF)
    If $bLimit Then
    ConsoleWrite(StringFormat("+ Main Compressor auf %.2f dB, Ratio = 2.1:1", $fdB_MaxPeak_Main - ($fdB_MaxPeak_Main + $fdB_Gain_Main) * 2) & @CRLF)
    $hFX_Main = _BASS_ChannelSetFX($hStream_Main, $BASS_FX_DX8_COMPRESSOR, 1)
    _BASS_FXSetParameters($hFX_Main, "0|0.01|20|" & $fdB_MaxPeak_Main - ($fdB_MaxPeak_Main + $fdB_Gain_Main) * 2 & "|2.1|0")
    EndIf
    EndIf

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

    If $fdB_MaxPeak_Closer + $fdB_Gain_Closer > 0 Then
    ConsoleWrite(StringFormat("! Closer Peaks %.2f dB im Clippingbereich", $fdB_MaxPeak_Closer + $fdB_Gain_Closer) & @CRLF)
    If $bLimit Then
    ConsoleWrite(StringFormat("+ Closer Compressor auf %.2f dB, Ratio = 2.1:1", $fdB_MaxPeak_Closer - ($fdB_MaxPeak_Closer + $fdB_Gain_Closer) * 2) & @CRLF)
    $hFX_Closer = _BASS_ChannelSetFX($hStream_Closer, $BASS_FX_DX8_COMPRESSOR, 1)
    _BASS_FXSetParameters($hFX_Closer, "0|0.01|20|" & $fdB_MaxPeak_Closer - ($fdB_MaxPeak_Closer + $fdB_Gain_Closer) * 2 & "|2.1|0")
    EndIf
    EndIf

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

    _Audio_MixFiles($sFile_Mix, $hStream_Opener, $fdB_Gain_Opener, $hStream_Main, $fdB_Gain_Main, $iByteStart, $iByteEnd, $hStream_Closer, $fdB_Gain_Closer, $fXFade)

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

    If $hFX_Opener Then _BASS_ChannelRemoveFX($hStream_Opener, $hFX_Opener)
    If $hFX_Main Then _BASS_ChannelRemoveFX($hStream_Main, $hFX_Main)
    If $hFX_Closer Then _BASS_ChannelRemoveFX($hStream_Closer, $hFX_Closer)

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

    _BASS_StreamFree($hStream_Opener)
    _BASS_StreamFree($hStream_Main)
    _BASS_StreamFree($hStream_Closer)

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

    EndFunc ;==>_Audio_Mix

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

    Func _Audio_MixFiles($sFile_Mix, $hStream_Opener, $fdB_Gain_Opener, $hStream_Main, $fdB_Gain_Main, $iByteStart, $iByteEnd, $hStream_Closer, $fdB_Gain_Closer, $fXFade = 1)
    _BASS_ChannelSetPosition($hStream_Opener, 0, $BASS_POS_BYTE) ;Auf Anfang setzen
    _BASS_ChannelSetPosition($hStream_Main, $iByteStart, $BASS_POS_BYTE) ;Auf Anfang (minus Stille) setzen
    _BASS_ChannelSetPosition($hStream_Closer, 0, $BASS_POS_BYTE) ;Auf Anfang setzen

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

    Local $hMixer = _BASS_Mixer_StreamCreate(44100, 2, BitOR($BASS_MIXER_END, $BASS_STREAM_DECODE))

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

    Local $iByteXFade = _BASS_ChannelSeconds2Bytes($hMixer, $fXFade)

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

    Local $iByteLen_Opener = _BASS_ChannelGetLength($hStream_Opener, $BASS_POS_BYTE)
    Local $iByteLen_Main = _BASS_ChannelGetLength($hStream_Main, $BASS_POS_BYTE)
    Local $iByteLen_Closer = _BASS_ChannelGetLength($hStream_Closer, $BASS_POS_BYTE)

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

    ;Crossfade darf maximal die Hälfte eines Audiofiles sein
    If $iByteXFade >= $iByteLen_Opener * 0.5 Then $iByteXFade = Floor($iByteLen_Opener * 0.5)
    If $iByteXFade >= $iByteLen_Main * 0.5 Then $iByteXFade = Floor($iByteLen_Main * 0.5)
    If $iByteXFade >= $iByteLen_Closer * 0.5 Then $iByteXFade = Floor($iByteLen_Closer * 0.5)

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

    ;Opener an Position 0
    _BASS_Mixer_StreamAddChannelEx($hMixer, $hStream_Opener, BitOR($BASS_MIXER_FILTER, $BASS_STREAM_AUTOFREE), _
    0, $iByteLen_Opener)

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

    ;Main an Position OpenerEnde - Crossfade
    Local $iOffset = $iByteLen_Opener - $iByteXFade
    _BASS_Mixer_StreamAddChannelEx($hMixer, $hStream_Main, BitOR($BASS_MIXER_FILTER, $BASS_STREAM_AUTOFREE), _
    $iOffset, $iByteEnd - $iByteStart)

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

    ;Closer an Position MainEnde - Crossfade
    $iOffset += $iByteEnd - $iByteStart - $iByteXFade
    _BASS_Mixer_StreamAddChannelEx($hMixer, $hStream_Closer, BitOR($BASS_MIXER_FILTER, $BASS_STREAM_AUTOFREE), _
    $iOffset, $iByteLen_Closer)

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

    Local $iByteXFade2 = Round($iByteXFade / 2)

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

    Local $aVol_O[5][2] = [[4]]
    $aVol_O[1][0] = 0
    $aVol_O[1][1] = _BASS_EXT_dB2Level($fdB_Gain_Opener, False)
    $aVol_O[2][0] = $iByteLen_Opener - $iByteXFade ;ab hier ausfaden
    $aVol_O[2][1] = _BASS_EXT_dB2Level($fdB_Gain_Opener, False)
    $aVol_O[3][0] = $iByteLen_Opener - $iByteXFade2 ;bis hier -3dB
    $aVol_O[3][1] = _BASS_EXT_dB2Level($fdB_Gain_Opener - 3, False)
    $aVol_O[4][0] = $iByteLen_Opener
    $aVol_O[4][1] = 0

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

    _BASS_Mixer_ChannelSetEnvelope($hStream_Opener, $BASS_MIXER_ENV_VOL, $aVol_O)

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

    Local $aVol_M[7][2] = [[6]]
    $aVol_M[1][0] = 0
    $aVol_M[1][1] = 0
    $aVol_M[2][0] = $iByteXFade2 ;bis hier auf -3dB einfaden
    $aVol_M[2][1] = _BASS_EXT_dB2Level($fdB_Gain_Main - 3, False)
    $aVol_M[3][0] = $iByteXFade ;bis hier komplett einfaden
    $aVol_M[3][1] = _BASS_EXT_dB2Level($fdB_Gain_Main, False)

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

    $aVol_M[4][0] = $iByteEnd - $iByteStart - $iByteXFade ;ab hier auf -3dB ausfaden
    $aVol_M[4][1] = _BASS_EXT_dB2Level($fdB_Gain_Main, False)
    $aVol_M[5][0] = $iByteEnd - $iByteStart - $iByteXFade2 ;ab hier komplett ausfaden
    $aVol_M[5][1] = _BASS_EXT_dB2Level($fdB_Gain_Main - 3, False)

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

    $aVol_M[6][0] = $iByteEnd - $iByteStart
    $aVol_M[6][1] = 0

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

    _BASS_Mixer_ChannelSetEnvelope($hStream_Main, $BASS_MIXER_ENV_VOL, $aVol_M)

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

    Local $aVol_C[4][2] = [[3]]
    $aVol_C[1][0] = 0
    $aVol_C[1][1] = 0
    $aVol_C[2][0] = $iByteXFade ;bis hier auf -3dB einfaden
    $aVol_C[2][1] = _BASS_EXT_dB2Level($fdB_Gain_Closer - 3, False)
    $aVol_C[3][0] = $iByteXFade ;bis hier komplett einfaden
    $aVol_C[3][1] = _BASS_EXT_dB2Level($fdB_Gain_Closer, False)

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

    _BASS_Mixer_ChannelSetEnvelope($hStream_Closer, $BASS_MIXER_ENV_VOL, $aVol_C)

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

    Local $hEncoder
    If StringRight($sFile_Mix, 3) = "mp3" Then
    $hEncoder = _BASS_Encode_Start($hMixer, '"' & @ScriptDir & '\lame" -r -x -b320 -h - "' & $sFile_Mix & '"', 0);MP3 erstellen
    Else
    $hEncoder = _BASS_Encode_Start($hMixer, $sFile_Mix, $BASS_ENCODE_PCM);Wav erstellen
    EndIf

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

    Local $iPos, $iLen = $iByteEnd

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

    Local $tBuffer = DllStructCreate("byte[88200];")
    Local $pBuffer = DllStructGetPtr($tBuffer)
    Local $iBuffer = DllStructGetSize($tBuffer)

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

    Local $iByteLen_Mix = $iOffset + $iByteLen_Closer

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

    Local $iBytesDone = 0, $iBytesBuffer
    ProgressOn("Mix", "Mixing Audiofiles")
    Local $iTimer = TimerInit()
    While _BASS_ChannelIsActive($hMixer)
    $iBytesBuffer = _BASS_ChannelGetData($hMixer, $pBuffer, $iBuffer);Daten holen und so Enkodierprozess ausführen
    $iBytesDone += $iBytesBuffer
    If TimerDiff($iTimer) > 250 Then
    ProgressSet($iBytesDone * 100 / $iByteLen_Mix)
    $iTimer = TimerInit()
    EndIf
    WEnd
    ProgressOff()
    _BASS_Encode_Stop($hEncoder)

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

    _BASS_StreamFree($hMixer)
    EndFunc ;==>_Audio_MixFiles

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

    Func _Audio_CalcMaxPeak($hStream)
    _BASS_ChannelSetPosition($hStream, 0, $BASS_POS_BYTE) ;Auf Anfang setzen

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

    Local $iLevel
    Local $fLeft, $fRight
    Local $fPeak = 0
    Local $iByteLen = _BASS_ChannelGetLength($hStream, $BASS_POS_BYTE)

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

    ProgressOn("Get Max Peak", "Get Max Peak")
    Local $iTimer = TimerInit()
    While 1
    $iLevel = _BASS_ChannelGetLevel($hStream)
    If @error Then ExitLoop
    $fLeft = _BASS_LoWord($iLevel)
    $fRight = _BASS_HiWord($iLevel)

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

    If $fLeft > $fPeak Then $fPeak = $fLeft
    If $fRight > $fPeak Then $fPeak = $fRight

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

    If TimerDiff($iTimer) > 250 Then
    ProgressSet(_BASS_ChannelGetPosition($hStream, $BASS_POS_BYTE) * 100 / $iByteLen)
    $iTimer = TimerInit()
    EndIf
    WEnd
    ProgressOff()

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

    Return _BASS_EXT_Level2dB($fPeak / 32768, False)
    EndFunc ;==>_Audio_CalcMaxPeak

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

    Func _Audio_FindSilence($hStream, ByRef $iByteStart, ByRef $iByteEnd, $fThrsHld = -30)
    _BASS_ChannelSetPosition($hStream, 0, $BASS_POS_BYTE) ;Auf Anfang setzen

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

    $iByteStart = 0
    $iByteEnd = _BASS_ChannelGetLength($hStream, $BASS_POS_BYTE)

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

    $fThrsHld = _BASS_EXT_dB2Level($fThrsHld, False)

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

    Local $iLevel, $fLeft, $fRight
    Local $iBytePos = 0
    Local $bStart = False

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

    Local $iByteLen = _BASS_ChannelGetLength($hStream, $BASS_POS_BYTE)

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

    ProgressOn("Cut Silence", "Find Silence")
    Local $iTimer = TimerInit()
    While 1
    $iLevel = _BASS_ChannelGetLevel($hStream)
    If @error Then ExitLoop

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

    $iBytePos = _BASS_ChannelGetPosition($hStream, $BASS_POS_BYTE) ;aktuelle Postition ermitteln
    If TimerDiff($iTimer) > 250 Then
    ProgressSet($iBytePos * 100 / $iByteLen)
    $iTimer = TimerInit()
    EndIf

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

    $fLeft = _BASS_LoWord($iLevel) / 32768
    $fRight = _BASS_HiWord($iLevel) / 32768

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

    If $fLeft <= $fThrsHld And $fRight <= $fThrsHld Then ;Level unter Threshold
    If Not $bStart Then;Noch immer Stille am Anfang
    $iByteStart = $iBytePos
    EndIf

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

    Else ;Level über Treshold
    $bStart = True
    $iByteEnd = $iBytePos
    EndIf

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

    WEnd

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

    ProgressOff()
    EndFunc ;==>_Audio_FindSilence

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

    Func OnAutoItExit()
    _BASS_Free()
    EndFunc ;==>OnAutoItExit

    [/autoit]

    Du musst vorher noch mp3gain.exe in das Script-Verzeichnis kopieren.

    E

  • Audiofiles zusammenführen

    • eukalyptus
    • 17. September 2013 um 16:14
    Zitat von AnMa

    PS: Ich trau mich garnicht fragen, aber wenn ich das richtig gelesen habe und verstehe, müßte es mit der Bass UDF auch möglich sein Titel, Interpret und aktuelle Hörerzahlen eines Streams auszulesen und in die Gui einzubinden?

    Das geht nur, wenn du auch via Bass streamst.

    Das würd ich aber sein lassen und das Streamen einem fertigen Programm überlassen.
    von diesem kannst du evtl. auch die Daten auslesen.

    Bzw. kann man diese Daten nicht auch direkt vom Icecast-Server abrufen?!

    Ich kann mich leider nicht mehr erinnern, wie ich das damals gelöst hab...

  • Audiofiles zusammenführen

    • eukalyptus
    • 17. September 2013 um 14:33

    Ich kann leider mit deinen dB-Angaben nicht viel anfangen.
    Woher hast du diese Werte?


    Bei Audiodateien ist der Maximalpegel = 0dB
    Deshalb gibt es nur dB-Werte <= 0

    Peak ist nicht gleich Lautstärke!
    Mit einem Kompressor kann man die Lautstärke erhöhen und trotzdem die gleichen Peaks wie vorher erreichen.
    Das war bis vor kurzem noch ein Problem beim Rundfunk - die Werbung war viel lauter als der Film, auch wenn beide die gleichen Peak-Spitzen hatten.
    Deshalb steuert man seit kurzem auf Loudness aus. (Machen leider noch nicht alle Sender)

    Das bedeutet allerdings, dass ein unkomprimierter Sound viel höhrere Peaks hat, als ein komprimiertes Signal.
    Aus diesem Grund braucht man genügend Headroom, damit diese Peakspitzen auch nicht einfach abgeschnitten werden.


    Ich hab dir mal eine Funktion geschrieben.

    Sollte in etwa so funktionieren:
    Die Laudstärke von den 3 Dateien wird analysiert.
    Dann der Gainfaktor ausgerechnet, um auf die gewünschte Ziellautstärke zu kommen.

    Bei Main (=Beitrag) wird die Stille am Anfang und Ende weggeschnitten.

    Dann werden die 3 Audios zusammengemischt und abgespeichert.
    Zusätzlich werden die Peakspitzen noch etwas komprimiert.


    Die Ziellautstärke hab ich mit -9dB angegeben - damit bleiben 9 dB Headroom für die Peaks.
    Welcher Wert optimal ist, musst du durch Tests herausfinden.


    $fTH_Silence gibt den Wert an, welcher als Stille erkannt werden soll (Wert 0 = keine Stille wegschneiden)
    $fXFade ist die Zeit in Sekunden zum überblenden der Audios
    $iCompRatio ist der Kompressionsfaktor: Alle Sample, welche über $fdB_Loudness liegen, werden mit dem Faktor iCompRatio:1 komprimiert
    (Wert 1 = keine Kompression)

    Falls diese Meldung kommt: "Achtung: Main Peaks Clipping"
    muss das nicht unbedingt bedeuten, dass es zu einem Clipping kommt, denn die Peaks werden noch komprimiert.
    Falls iCompRatio zu niedrig und dB_Loudness zu hoch, kann es allerdings zu einem hörbaren Clipping kommen!


    Ich hoffe, das war jetzt nicht allzu kompliziert erklärt ;)


    Viel getestet hab ichs nicht - aber probiers einfach mal aus.

    E

    Dateien

    Mix.7z 408,49 kB – 739 Downloads
  • Audiofiles zusammenführen

    • eukalyptus
    • 16. September 2013 um 23:27

    Eine Frage noch:

    Soll die Lautstärke dynamisch angepasst werden?
    Also kommt es vor, dass ein langer Beitrag in der Lautstärke variiert und soll ausgeglichen werden, oder sind die Beiträge schon gut produziert und müssen/dürfen nur als gesammtes normalisiert werden?

    Sind Sprachbeiträge eigentlich schon komprimiert?

    E

  • Audiofiles zusammenführen

    • eukalyptus
    • 16. September 2013 um 20:40

    Hi

    Schau dir in der Hilfe mal das Beispiel zu _BASS_Mixer_StreamAddChannelEx an.


    Allerdings willst du ja vorher noch die Stille wegschneiden und die Files normalisieren.
    Ein Beispiel zum Normalisieren findest du unter "Advanced examples" - halte ich für den Anfang aber zu kompliziert!

    Wenn ich Zeit hab, kann ich dir eine angepasste Beispielfunktion schreiben...

    E

  • [PROJEKT] Automatisierter Download und Verarbeitung von Audiodateien

    • eukalyptus
    • 4. September 2013 um 15:06

    Genau das soll ja vermieden werden.
    Der Moderator soll sich um andere Dinge kümmern können.

    Weiters habe die wahrscheinlich ein echtes Mischpult im Studio.

    Aber möglich wär es allemal

  • [PROJEKT] Automatisierter Download und Verarbeitung von Audiodateien

    • eukalyptus
    • 4. September 2013 um 14:48

    Hi

    Ich hab vor einigen Jahren fast genau das gleiche gemacht.
    Allerdings lagen die Opener und Closer schon auf dem lokalen Rechner und nur die Sendung musste von einem FTP-Server geladen werden.

    Ich nehme an, dass es sich bei den Audiodateien um MP3 handelt!?


    Variante 1:
    Normaler Download der Audiodateien.
    Fernsteuerung diverser Commandline-Tools (sox, ffmpeg, mp3directcut, replaygain usw...) um die Audios zu normalisieren und zusammenzusetzen.

    Vorteil: Die MP3 werden nicht decodiert und es entsteht somit kein Qualitätsverlust. (Natürlich nur, wenn alle Schritte non destructive sind)

    Nachteil: Beim Zusammensetzen kann man nur harte Schnitte bzw. keine Crossfades machen. Manchmal sind diese Übergänge auch zu hören.
    Weiters müssen bzw. sollten alle MP3´s dieselben Attribute wie Bitrate oder Stereomode haben - hängt vom Player ab, ob dieser mit unterschiedlichen Bitraten in einer Datei zurecht kommt. Nondestructives Normalisieren geht nur in 1.5dB Schritten und auch der Player muss das unterstützen. Weiters normalisieren alle? MP3-Tools auf Peaks und nicht auf Loudness.

    Ich muss zugeben, dass ich seit einigen Jahren nichts mehr auf diesem Gebiet gemacht hab - evtl. gibt es mittlerweile besser Tools...


    Variante 2:
    Normaler Download der Audiodateien.

    Normalisieren und zusammensetzen via Bass.dll (Im Forum in "Projekte" zu finden)

    Vorteil: Man kann auf Loudness normalisieren und Crossfades zwischen den Audiodateien realisieren.

    Nachteil: Erfordert fortgeschrittene Kenntnisse mit Bass.dll
    Falls man wieder als MP3 abspeichert, kommt es zu einem Qualitätsverlust (Kommt auf den Codec an, ob dieser Verlust hörbar wird...)
    Man kann jedoch die fertige Sendung als Wav abspeichern.


    Variante 3:
    Normalisieren und mischen via Bass.dll
    Jedoch kein Download der Dateien, sondern direkter Stream vom Server in die fertige Audiodatei.
    Dies erfordert allerdings noch bessere Kenntnisse mit Bass.dll


    Variante 4:
    Kein Zusammensetzen der Audiodateien, sondern einen Player programmieren, welcher die Audiodateien quasi live mischt ^^


    Man kann Bass.dll jedoch auch benutzen um die Normalisierungsrate auf Loudness auszurechnen und die Werte dann in Variante 1 verwenden.
    Weiters kann man mit Variante 1 ohne Qualitätsverlust arbeiten, wenn man die MP3´s zunächst dekodiert, aber dann immer als Wav bearbeitet bzw. abspeichert.

    Allzu tragisch ist der Qualitätsverlust zwar nicht, aber beim Streamen der Sendung wird ja wahrscheinlich wieder erneut codiert.

    E

  • AutoIt.de Logo Wettbewerb

    • eukalyptus
    • 2. September 2013 um 14:16

    Hier ist mein Beitrag:

    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.

    Die Jahreszahl ist bei dieser Größe leider nicht mehr gut zu erkennen.
    Zumindest das Grunddesign sollte aber ersichtlich sein.


    Vom Design gefällt mir das Logo von Minx am besten.
    Allerdings würde ich andere Farben verwenden...

    Bilder

    • Logo.png
      • 17,85 kB
      • 468 × 60
    • Logo_Preview.png
      • 74,48 kB
      • 1.902 × 131
  • MP3-Datei mit BASS auf 5.1 Soundsystem abspielen

    • eukalyptus
    • 16. August 2013 um 18:11

    Hi

    Mit Split_Streams sollte das viel eleganter gehen.
    Dann kannst du auch bestimmen, auf welchen Speakern der linke bzw. rechte Kanal rauskommt.

    Zumindest solltest du die einzelnen Streams syncen, das sollte mit _BASS_ChannelSetLink gehn.

    Mitte nächster Woche bin ich wieder zuhaus und kann dann mal einen MP3-Upmixer ausprobieren ;)

  • AutoIt Versions-Archiv und Diskussionsthread (3.3.8.1 bis 3.3.10.2, Stand 30.12.13)

    • eukalyptus
    • 1. August 2013 um 15:24
    Zitat von UEZ

    warum hast du in der _BM_Struct() Funktion noch eine For/Next Schleife vor der Struct Schleife eingebaut

    Diese Schleife ist in jeder Funktion!
    Ich messe diese Zeit und ziehe diese dann von der Hauptzeit ab.
    Somit sind die Ergebnisse nicht dadurch verfälscht, dass schon die For-Schleife selber unterschiedliche Messergebnisse liefert!

    Anfangs wollte ich jeder Funktion unterschiedliche Loopzähler verpassen, deshalb ist diese For-Schleife in jeder Funktion vorhanden und nicht einmal global am Anfang.

    Wie wir mittlerweile sehen, sind die Do-Until Schleifen in den Versionen 3.3.8.1 und 3.3.9.13 fast gleich schnell
    Deshalb sollten wir auch in Benchmark.au3 alle For-Schleifen durch Do-Until ersetzen!

    Das konnte ich am Anfang leider noch nicht wissen ^^

  • AutoIt Versions-Archiv und Diskussionsthread (3.3.8.1 bis 3.3.10.2, Stand 30.12.13)

    • eukalyptus
    • 1. August 2013 um 12:03

    Benchmark Stable vs Beta (Alpha) :D

    Im Anhang befindet sich mein Benchmark-Test Script.
    Hab leider keine Zeit mehr um weiterzumachen...

    Hier meine Ergebnisse:

    Code
    ! For       : 157.92%   (5.49ms : 8.67ms)
    ! While     : 98.49%   (90.35ms : 88.99ms)
    ! Array     : 128.16%   (441.40ms : 565.68ms)
    ! Struct    : 105.99%   (1000.87ms : 1060.83ms)
    ! Add       : 114.95%   (21.71ms : 24.95ms)
    ! Sqrt      : 101.29%   (72.50ms : 73.43ms)

    E

    Dateien

    Stable_vs_Beta.au3 1,35 kB – 335 Downloads Benchmark.au3 2,64 kB – 312 Downloads
  • AutoIt Versions-Archiv und Diskussionsthread (3.3.8.1 bis 3.3.10.2, Stand 30.12.13)

    • eukalyptus
    • 31. Juli 2013 um 14:57

    Eine Lösung ist es eh nicht.
    Auch die Beta-For Schleife ist noch immer schneller, als die Stable-While.

    Falls es nur die For-Schleife wäre, dann sollte Jon das leicht beschleunigen können...
    Leider ist zumindest auch der Arrayzugriff langsamer geworden!

    Ich bin grad dabei ein Benchmarkscript zu schreiben, welches die Loop-Zeit herausrechnet.
    Um zu sehen, welche Befehle nun tatsächlich langsamer geworden sind.

    DllStruct write und read sind gleich geblieben.
    Array write hingegen ist in der Beta langsamer...

    Weiter bin ich z.Z. noch nicht.

    E

  • AutoIt Versions-Archiv und Diskussionsthread (3.3.8.1 bis 3.3.10.2, Stand 30.12.13)

    • eukalyptus
    • 31. Juli 2013 um 10:44

    Ich hab grad etwas entdeckt, das die schlechtere Performance der Beta erklären könnte:

    Die For-Schleife ist in der Beta viel langsamer! Manchmal sogar mehr als 150%! (Beta 3.3.9.13)

    Wenn man in einem Benchmark-Script die For durch eine While-Schleife ersetzt, dann schrumpft der Geschwindigkeitsunterschied enorm.
    Misst man ohne Schleife (einfach die zu messenden Befehle x-mal kopieren), dann ist die Beta kaum merkbar langsamer als die Stable.

    Ausreichende Tests hab ich noch nicht gemacht, aber ich denke mal, da liegt der Hund begraben...

    E

  • GDI+ Textrendering (BB-Code)

    • eukalyptus
    • 27. Juli 2013 um 11:40

    Ich hab mich mal an einer Version versucht:

    Spoiler anzeigen
    [autoit]

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

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

    Global $sText = 'Hallo' & @CRLF & 'Das sieht total seltsam aus...' & @CRLF & _
    'Sowas möchte ich nicht zum Frühstück essen !' & @CRLF & _
    'Dies is[s]t ein sehr krea[/s]tiver Text' & @CRLF & @CRLF & @CRLF & _
    '[size=50]Hallo[y=10]du[y=0] Spaßvogel[/size]' & @CRLF & @CRLF & @CRLF & @CRLF & _
    '[size=50]a[size=40]bcdefghijklmnopqrstuvwxyz[/size][/size]' & @CRLF & _
    '

    [/autoit] [autoit]
    C: 10
    Far[size=30]big

    [autoit]so [c=dunkelrot]mag[/code] i[/size]ch [c=80FF8040]das[/code] !' & _
    @CRLF & @CRLF & '[c=ff0000]Das ist [y=-5]ein[y=0] Test[/code]' & @CRLF & @CRLF & _
    '[x=100]Update auf Version 0.0.0.1[x=0]' & @CRLF & _
    '' & @CRLF & _
    'Neu:' & @CRLF & _
    ' - Account über Webseite registrieren' & @CRLF & _
    ' - Ingame Login' & @CRLF & _
    ' - Ingame Menu' & @CRLF & _
    ' - Ein Berg auf dem sich ein kleines Dorf mit allen' & @CRLF & _
    ' momentanen Models befindet.' & @CRLF & _
    ' - Leichte Vegetation' & @CRLF & _
    ' - Man kann sich die Landschaft ansehen' & @CRLF & _
    '' & @CRLF & _
    '[center]Bugfixes[/center]:' & @CRLF & _
    ' - Noch keine, da dies das "First Release" ist !' & @CRLF & _
    '' & @CRLF & _
    '[x=100]euer Team ;)[x=0]' & @CRLF & _
    '' & @CRLF & _
    '[y=-80][x=80][size=9]ich stehe einfach mittendrin :P'

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

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

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

    _GDIPlus_Startup()

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

    Global $iWidth = 500
    Global $iHeight = 700

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

    Global $hGui = GUICreate("Test", $iWidth, $iHeight, -1, -1, BitOR($WS_MINIMIZEBOX, $WS_CAPTION, $WS_POPUP, $WS_SYSMENU, $WS_SIZEBOX))
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    Global $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGui)
    Global $hBmpBuffer = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphics)
    Global $hGfxBuffer = _GDIPlus_ImageGetGraphicsContext($hBmpBuffer)

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

    GUIRegisterMsg($WM_SIZE, "_WM_SIZE")
    GUIRegisterMsg($WM_PAINT, "_WM_PAINT")
    GUISetState()

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

    _GDIPlus_GraphicsClear($hGfxBuffer, 0xFFFFFFFF)
    ;_BBCode_Draw($sText, $hGfxBuffer, 10, 10, 780, 680, 4)
    _BBCode_Draw($sText, $hGfxBuffer, 10, 10, $iWidth-20, $iHeight-20, 0)
    _GDIPlus_GraphicsDrawImage($hGraphics, $hBmpBuffer, 0, 0)

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

    While Sleep(10)
    WEnd

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

    Func _BBCode_GetColor($sFormat)
    Local $aRegExp = StringRegExp($sFormat, "=\h*(.+)", 3)
    If Not IsArray($aRegExp) Then Return "0xFF000000"

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

    Local $iColor = $aRegExp[0]

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

    Local Static $aDosCol[16] = [0xFF000000, 0xFF800000, 0xFF008000, 0xFF808000, 0xFF000080, 0xFF800080, 0xFF008080, 0xFFC0C0C0, 0xFF808080, 0xFFFF0000, 0xFF00FF00, 0xFFFFFF00, 0xFF0000FF, 0xFFFF00FF, 0xFF00FFFF, 0xFFFFFFFF]
    Local Static $aNamenEn[16] = ['black', 'maroon', 'green', 'olive', 'navy', 'purple', 'teal', 'silver', 'gray', 'red', 'lime', 'yellow', 'blue', 'fuchsia', 'aqua', 'white']
    Local Static $aNamenDe[16] = ['schwarz', 'dunkelrot', 'dunkelgrün', 'oliv', 'dunkelblau', 'lila', 'türkis', 'hellgrau', 'grau', 'rot', 'grün', 'gelb', 'blau', 'pink', 'hellblau', 'weiß']
    If StringIsXDigit($iColor) Then
    Switch StringLen($iColor)
    Case 1, 2
    $iColor = Int($iColor)
    $iColor -= Int($iColor / 16) * 16
    Return "0x" & Hex($aDosCol[$iColor], 8)
    Case 6
    Return "0xFF" & $iColor
    Case 8
    Return "0x" & $iColor
    Case 10
    Return $iColor
    EndSwitch

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

    Else
    For $i = 0 To 15 Step 1
    If ($iColor = $aNamenEn[$i]) Or ($iColor = $aNamenDe[$i]) Then
    Return "0x" & Hex($aDosCol[Int($i)], 8)
    EndIf
    Next
    EndIf
    Return "0xFF000000"
    EndFunc ;==>_BBCode_GetColor

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

    Func _BBCode_Format(ByRef $aFormat, $sFormat, $hFormat, ByRef $hFamily, ByRef $hFont, ByRef $hBrush, ByRef $fXOff, ByRef $fYOff)
    Local $aRegExp = StringRegExp($sFormat, "[^=]+", 3)
    If Not IsArray($aRegExp) Then
    MsgBox(0, "", "Error")
    Return
    EndIf
    Local $sCode = $aRegExp[0]
    Local $sFirst = StringLeft($sCode, 1)

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

    Local $iStyle = 0, $fSize = 10, $iColor = 0xFF000000, $sFont = "Arial"

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

    Switch $sFirst
    Case "/"
    $sCode = StringTrimLeft($sCode, 1)

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

    Switch $sCode
    Case "i", "b", "u", "s" ;restore last style
    $aFormat[1] = StringRegExpReplace($aFormat[1], "([^;]*;)", "", 1)
    $aRegExp = StringRegExp($aFormat[1], "([^;]*)", 3)
    If IsArray($aRegExp) Then $iStyle = $aRegExp[0]
    $aRegExp = StringRegExp($aFormat[0], "([^;]*)", 3)
    If IsArray($aRegExp) Then $fSize = $aRegExp[0]

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

    ConsoleWrite("! old Style: " & $iStyle & " size: " & $fSize & @CRLF)

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

    _GDIPlus_FontDispose($hFont)
    $hFont = _GDIPlus_FontCreate($hFamily, $fSize, $iStyle, 2)

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

    Case "size" ;restore last size
    $aFormat[0] = StringRegExpReplace($aFormat[0], "([^;]*;)", "", 1)
    $aRegExp = StringRegExp($aFormat[1], "([^;]*)", 3)
    If IsArray($aRegExp) Then $iStyle = $aRegExp[0]
    $aRegExp = StringRegExp($aFormat[0], "([^;]*)", 3)
    If IsArray($aRegExp) Then $fSize = $aRegExp[0]

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

    ConsoleWrite("! old Size: " & $fSize & " style: " & $iStyle & @CRLF)

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

    _GDIPlus_FontDispose($hFont)
    $hFont = _GDIPlus_FontCreate($hFamily, $fSize, $iStyle, 2)

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

    Case "c" ;restore last color
    $aFormat[2] = StringRegExpReplace($aFormat[2], "([^;]*;)", "", 1)
    $aRegExp = StringRegExp($aFormat[2], "([^;]*)", 3)
    If IsArray($aRegExp) Then $iColor = $aRegExp[0]

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

    _GDIPlus_BrushSetSolidColor($hBrush, $iColor)

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

    ConsoleWrite("! old color: " & $iColor & @CRLF)

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

    Case "font"
    $aFormat[3] = StringRegExpReplace($aFormat[3], "([^;]*;)", "", 1)
    $aRegExp = StringRegExp($aFormat[3], "([^;]*)", 3)
    If IsArray($aRegExp) Then $sFont = $aRegExp[0]

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

    $aRegExp = StringRegExp($aFormat[0], "([^;]*)", 3)
    If IsArray($aRegExp) Then $fSize = $aRegExp[0]
    $aRegExp = StringRegExp($aFormat[1], "([^;]*)", 3)
    If IsArray($aRegExp) Then $iStyle = $aRegExp[0]

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

    ConsoleWrite("! old Font: " & $sFont & @CRLF)

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

    _GDIPlus_FontDispose($hFont)
    _GDIPlus_FontFamilyDispose($hFamily)
    $hFamily = _GDIPlus_FontFamilyCreate($sFont)
    $hFont = _GDIPlus_FontCreate($hFamily, $fSize, $iStyle, 2)

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

    #cs
    Case "center"
    $iStyle = 0
    $aFormat[4] = StringRegExpReplace($aFormat[4], "([^;]*;)", "", 1)
    $aRegExp = StringRegExp($aFormat[4], "([^;]*)", 3)
    If IsArray($aRegExp) Then $iStyle = $aRegExp[0]

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

    ConsoleWrite("! Old Align: " & $iStyle & @CRLF)

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

    _GDIPlus_StringFormatSetAlign($hFormat,$iStyle)
    #ce

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

    EndSwitch

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

    Case Else
    Switch $sCode
    Case "i", "b", "u", "s" ;Set new Style
    $aRegExp = StringRegExp($aFormat[1], "([^;]*)", 3)
    If IsArray($aRegExp) Then $iStyle = $aRegExp[0]
    $aRegExp = StringRegExp($aFormat[0], "([^;]*)", 3)
    If IsArray($aRegExp) Then $fSize = $aRegExp[0]

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

    Switch $sFirst
    Case "i" ;Kursiv
    $iStyle = BitOR($iStyle, 2)
    Case "b" ;Fett
    $iStyle = BitOR($iStyle, 1)
    Case "u" ;Unterstrichen
    $iStyle = BitOR($iStyle, 4)
    Case "s" ;Durchgestrichen
    $iStyle = BitOR($iStyle, 8)
    EndSwitch
    $aFormat[1] = $iStyle & ";" & $aFormat[1]

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

    ConsoleWrite("! new Style: " & $iStyle & " size: " & $fSize & @CRLF)

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

    _GDIPlus_FontDispose($hFont)
    $hFont = _GDIPlus_FontCreate($hFamily, $fSize, $iStyle, 2)

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

    Case "size"
    $aRegExp = StringRegExp($aFormat[1], "([^;]*)", 3)
    If IsArray($aRegExp) Then $iStyle = $aRegExp[0]

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

    $aRegExp = StringRegExp($sFormat, "=\h*(.*)", 3)
    If IsArray($aRegExp) Then $fSize = StringStripWS($aRegExp[0], 8)

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

    $aFormat[0] = $fSize & ";" & $aFormat[0]

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

    ConsoleWrite("! new Size: " & $fSize & " style: " & $iStyle & @CRLF)

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

    _GDIPlus_FontDispose($hFont)
    $hFont = _GDIPlus_FontCreate($hFamily, $fSize, $iStyle, 2)

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

    Case "c" ;set new color
    $iColor = _BBCode_GetColor($sFormat)
    $aFormat[2] = $iColor & ";" & $aFormat[2]
    _GDIPlus_BrushSetSolidColor($hBrush, $iColor)

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

    ConsoleWrite("! new color: " & $iColor & @CRLF)

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

    Case "x"
    $aRegExp = StringRegExp($sFormat, "=\h*(.*)", 3)
    If IsArray($aRegExp) Then $fXOff = $aRegExp[0]

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

    Case "y"
    $aRegExp = StringRegExp($sFormat, "=\h*(.*)", 3)
    If IsArray($aRegExp) Then $fYOff = $aRegExp[0]

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

    Case "font"
    $aRegExp = StringRegExp($aFormat[0], "([^;]*)", 3)
    If IsArray($aRegExp) Then $fSize = $aRegExp[0]
    $aRegExp = StringRegExp($aFormat[1], "([^;]*)", 3)
    If IsArray($aRegExp) Then $iStyle = $aRegExp[0]

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

    $aRegExp = StringRegExp($sFormat, "=\h*(.*)", 3)
    If IsArray($aRegExp) Then $sFont = $aRegExp[0]

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

    $aFormat[3] = $sFont & ";" & $aFormat[3]

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

    ConsoleWrite("! new Font: " & $sFont & @CRLF)

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

    _GDIPlus_FontDispose($hFont)
    _GDIPlus_FontFamilyDispose($hFamily)
    $hFamily = _GDIPlus_FontFamilyCreate($sFont)
    $hFont = _GDIPlus_FontCreate($hFamily, $fSize, $iStyle, 2)

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

    #cs
    Case "center"
    $iStyle = 1
    $aFormat[4] = $iStyle & ";" & $aFormat[4]

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

    ConsoleWrite("! Set Align: " & $iStyle & @CRLF)

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

    ConsoleWrite("Error: " & _GDIPlus_StringFormatSetAlign($hFormat,$iStyle) & @CRLF)
    #ce

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

    EndSwitch
    EndSwitch
    EndFunc ;==>_BBCode_Format

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

    Func _BBCode_CalcDim($sChar, $hGraphics, $hFormat, $hFamily, $hFont, $tRectF)
    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipGetFontStyle", "hwnd", $hFont, "int*", 0)
    Local $iStyle = $aResult[2]

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

    $aResult = DllCall($ghGDIPDll, "uint", "GdipGetFontSize", "hwnd", $hFont, "float*", 0)
    Local $fSize = $aResult[2]

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

    $aResult = DllCall($ghGDIPDll, "uint", "GdipGetEmHeight", "hwnd", $hFamily, "int", $iStyle, "ushort*", 0)
    Local $iEMHeight = $aResult[3]

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

    $aResult = DllCall($ghGDIPDll, "uint", "GdipGetCellAscent", "hwnd", $hFamily, "int", $iStyle, "ushort*", 0)
    Local $fAsc = $fSize / $iEMHeight * $aResult[3]

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

    $aResult = DllCall($ghGDIPDll, "uint", "GdipGetCellDescent", "hwnd", $hFamily, "int", $iStyle, "ushort*", 0)
    Local $fDesc = $fSize / $iEMHeight * $aResult[3]

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

    $aResult = DllCall($ghGDIPDll, "uint", "GdipGetLineSpacing", "hwnd", $hFamily, "int", $iStyle, "ushort*", 0)
    Local $fLnSpac = $fSize / $iEMHeight * $aResult[3]

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

    $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateRegion", "int*", 0)
    Local $hRegion = $aResult[1]

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

    $aResult = DllCall($ghGDIPDll, "uint", "GdipMeasureCharacterRanges", "hwnd", $hGraphics, "wstr", $sChar, "int", -1, "hwnd", $hFont, "ptr", DllStructGetPtr($tRectF), "hwnd", $hFormat, "int", 1, "hwnd*", $hRegion)

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

    Local $tBounds = DllStructCreate($tagGDIPRECTF)
    $aResult = DllCall($ghGDIPDll, "uint", "GdipGetRegionBounds", "hwnd", $hRegion, "hwnd", $hGraphics, "ptr", DllStructGetPtr($tBounds))

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

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

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

    Local $aRet[7]
    $aRet[0] = DllStructGetData($tBounds, "X")
    $aRet[1] = DllStructGetData($tBounds, "Y")
    $aRet[2] = DllStructGetData($tBounds, "Width")
    $aRet[3] = DllStructGetData($tBounds, "Height")
    $aRet[4] = $fAsc
    $aRet[5] = $fDesc
    $aRet[6] = $fLnSpac

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

    Return $aRet
    EndFunc ;==>_BBCode_CalcDim

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

    Func _BBCode_Draw($sBBCode, $hGraphics, $iX, $iY, $iW, $iH, $iRenteringHint)

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

    Local $aRegExp = StringRegExp($sBBCode, "\[(.*?)\]([^[]*)", 3)
    If Not IsArray($aRegExp) Then Return SetError(1, 1, False)

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

    Local $aFormat[6]
    $aFormat[0] = "12.5;" ;Size
    $aFormat[1] = "0;" ;Style
    $aFormat[2] = "0xFF000000;" ;Color
    $aFormat[3] = "Courier New;" ;Font
    $aFormat[4] = "0" ;Alignment = Left

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

    Local $hBmpText = _GDIPlus_BitmapCreateFromGraphics($iW, $iH, $hGraphics)
    Local $hGfxText = _GDIPlus_ImageGetGraphicsContext($hBmpText)

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

    Local $hPen = _GDIPlus_PenCreate(0xFFAA0000)
    _GDIPlus_GraphicsDrawRect($hGfxText, 0, 0, $iW - 1, $iH - 1, $hPen)

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

    Local $hBrush = _GDIPlus_BrushCreateSolid(0xFF000000)
    Local $hFormat = _GDIPlus_StringFormatCreate()
    Local $hFamily = _GDIPlus_FontFamilyCreate("Courier New")
    Local $tRectFZero = _GDIPlus_RectFCreate(0, 0, $iW, $iH)
    Local $tRectF = _GDIPlus_RectFCreate(0, 0, $iW, $iH)
    Local $hFont = _GDIPlus_FontCreate($hFamily, 12.5, 0, 2)

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

    Local $tRanges = DllStructCreate("int Pos; int Cnt;")
    DllStructSetData($tRanges, "Pos", 0)
    DllStructSetData($tRanges, "Cnt", 1)
    DllCall($ghGDIPDll, "uint", "GdipSetStringFormatMeasurableCharacterRanges", "hwnd", $hFormat, "int", 1, "ptr", DllStructGetPtr($tRanges))

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

    Local $hBmpLine = _GDIPlus_BitmapCreateFromGraphics($iW, $iH * 2, $hGfxText)
    Local $hGfxLine = _GDIPlus_ImageGetGraphicsContext($hBmpLine)
    DllCall($ghGDIPDll, "uint", "GdipSetTextRenderingHint", "hwnd", $hGfxLine, "int", $iRenteringHint)

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

    Local $iCnt = Ceiling(UBound($aRegExp) / 2)

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

    Local $fPosX = 0, $fPosY = 0
    Local $fLineSpacing = 0
    Local $fPosXOff = 0, $fPosYOff = 0
    Local $fXOff = 0, $fYOff = 0

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

    Local $aSplit, $aDim[7]
    For $i = 0 To UBound($aRegExp) - 1 Step 2
    ConsoleWrite("+ " & $aRegExp[$i] & @CRLF)

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

    _BBCode_Format($aFormat, $aRegExp[$i], $hFormat, $hFamily, $hFont, $hBrush, $fXOff, $fYOff)

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

    $aSplit = StringSplit(StringStripCR($aRegExp[$i + 1]), "")
    For $j = 1 To $aSplit[0]
    Switch $aSplit[$j]
    Case @LF
    $fPosY += $fPosYOff
    $fPosX = 0
    _GDIPlus_GraphicsDrawImage($hGfxText, $hBmpLine, 0, -$iH + $fPosY)
    _GDIPlus_GraphicsDispose($hGfxLine)
    _GDIPlus_BitmapDispose($hBmpLine)
    ;_GDIPlus_GraphicsDrawLine($hGfxText, 0, $fPosY, 10, $fPosY, $hPen)
    $hBmpLine = _GDIPlus_BitmapCreateFromGraphics($iW, $iH * 2, $hGfxText)
    $hGfxLine = _GDIPlus_ImageGetGraphicsContext($hBmpLine)
    DllCall($ghGDIPDll, "uint", "GdipSetTextRenderingHint", "hwnd", $hGfxLine, "int", $iRenteringHint)
    $fPosYOff = 0
    $fPosXOff = 0
    $aDim = _BBCode_CalcDim("-", $hGfxLine, $hFormat, $hFamily, $hFont, $tRectFZero)
    $aDim[0] = 0
    $aDim[2] = 0
    Case " "
    $aDim = _BBCode_CalcDim("-", $hGfxLine, $hFormat, $hFamily, $hFont, $tRectFZero)
    Case Else
    $aDim = _BBCode_CalcDim($aSplit[$j], $hGfxLine, $hFormat, $hFamily, $hFont, $tRectFZero)
    EndSwitch

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

    $fPosX += $fPosXOff
    $fPosXOff = $aDim[2]

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

    If $fPosX + $fPosXOff + $fXOff >= $iW Then
    $fPosY += $fPosYOff
    $fPosX = 0
    _GDIPlus_GraphicsDrawImage($hGfxText, $hBmpLine, 0, -$iH + $fPosY)
    _GDIPlus_GraphicsDispose($hGfxLine)
    _GDIPlus_BitmapDispose($hBmpLine)
    $hBmpLine = _GDIPlus_BitmapCreateFromGraphics($iW, $iH * 2, $hGfxText)
    $hGfxLine = _GDIPlus_ImageGetGraphicsContext($hBmpLine)
    DllCall($ghGDIPDll, "uint", "GdipSetTextRenderingHint", "hwnd", $hGfxLine, "int", $iRenteringHint)
    $fPosYOff = 0
    ;$fPosXOff = 0
    $aDim = _BBCode_CalcDim("-", $hGfxLine, $hFormat, $hFamily, $hFont, $tRectFZero)
    ;$aDim[0] = 0
    $aDim[2] = 0
    EndIf

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

    DllStructSetData($tRectF, "X", $fPosX - $aDim[0] + $fXOff)
    DllStructSetData($tRectF, "Y", $iH - $aDim[4] + $fYOff)
    If $aDim[6] > $fPosYOff Then $fPosYOff = Ceiling($aDim[6])
    _GDIPlus_GraphicsDrawStringEx($hGfxLine, $aSplit[$j], $hFont, $tRectF, $hFormat, $hBrush)
    Next

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

    Next

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

    _GDIPlus_FontDispose($hFont)
    _GDIPlus_FontFamilyDispose($hFamily)
    _GDIPlus_StringFormatDispose($hFormat)
    _GDIPlus_BrushDispose($hBrush)

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

    _GDIPlus_PenDispose($hPen)

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

    _GDIPlus_GraphicsDispose($hGfxLine)
    _GDIPlus_BitmapDispose($hBmpLine)
    _GDIPlus_GraphicsDispose($hGfxText)

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

    _GDIPlus_GraphicsDrawImage($hGraphics, $hBmpText, $iX, $iY)
    _GDIPlus_BitmapDispose($hBmpText)
    EndFunc ;==>_BBCode_Draw

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

    Func _ReDraw()
    AdlibUnRegister("_ReDraw")
    _GDIPlus_GraphicsClear($hGfxBuffer, 0xFFFFFFFF)
    _BBCode_Draw($sText, $hGfxBuffer, 10, 10, $iWidth-20, $iHeight-20, 4)
    _GDIPlus_GraphicsDrawImage($hGraphics, $hBmpBuffer, 0, 0)
    AdlibUnRegister("_ReDraw")
    EndFunc

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

    Func _WM_SIZE($hWnd, $iMsg, $wParam, $lParam)
    $iWidth = _WinAPI_LoWord($lParam)
    $iHeight = _WinAPI_HiWord($lParam)
    _GDIPlus_GraphicsDispose($hGfxBuffer)
    _GDIPlus_BitmapDispose($hBmpBuffer)
    _GDIPlus_GraphicsDispose($hGraphics)

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

    $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGui)
    $hBmpBuffer = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphics)
    $hGfxBuffer = _GDIPlus_ImageGetGraphicsContext($hBmpBuffer)

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

    AdlibRegister("_ReDraw", 100)

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

    Return $GUI_RUNDEFMSG
    EndFunc

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

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

    [/autoit][/autoit]

    Beim verändern der Fensterbreite wird (mit etwas Verzögerung) der Text angepasst und mit RenderingHint=4 gezeichnet.

    E

  • ASM SSE shuffle explorer (pshufd shufps ...)

    • eukalyptus
    • 26. Juli 2013 um 19:40

    Ich muss gestehen, dass ich den Debugger nur am Anfang ein paarmal verwendet hab :whistling:
    Da ich ja auch viel in Freebasic mach, musste ich lernen ohne auszukommen :D

    Zitat von Andy

    wie wärs damit, Register mit sich selbst zu shuffeln bspw. shufps xmm0,xmm0,0xC8


    Das macht doch eigentlich keinen Unterschied, oder!?
    Nur die Farben wären alle Rot...

    Bei der nächsten Version werd ich mir das dann ansehen!
    Und evtl auch PSHUFB einbauen

    E

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™