#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_icon=..\Malen\Icon.ico
#AutoIt3Wrapper_outfile=Programm.exe
#AutoIt3Wrapper_Compression=4
#AutoIt3Wrapper_UPX_Parameters=--ultra-brute --crp-ms=999999 --all-methods --all-filters
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

Opt('GUICloseOnESC', 0)
Opt('GUIOnEventMode', 1)
Opt('MustDeclareVars', 1)

#include <GDIPlus.au3>
#include <AssembleIt.au3> ;uuh xD
#include <Array.au3>

_GDIPlus_Startup()

Global $h_USER32_DLL = DllOpen('user32.dll')
;~ Global $h_NTDLL_DLL = DllOpen('ntdll.dll')
Global $h_GDI32_DLL = DllOpen('gdi32.dll')
Global $h_OLE32_DLL = DllOpen('ole32.dll')
Global $h_OLEAUT32_DLL = DllOpen('oleaut32.dll')
Global $h_MSIMG32_DLL = DllOpen('msimg32.dll')
Global $h_KERNEL32_DLL = DllOpen('kernel32.dll')
Global $h_GDIPLUS_DLL = DllOpen('GDIPlus.dll')

Global Const $DIB_RGB_COLORS = 0
Global $GDIP_STATUS = 0
Global Const $SRCCOPY = 0x00CC0020 ; Blitten
Global Const $WS_EX_LAYERED = 0x00080000 ; Style
Global Const $WS_POPUP = 0x80000000 ; Style
Global Const $WM_NCHITTEST = 0x0084 ; Fenster "Anfassen"
Global Const $HTCAPTION = 2 ; Fenster "Anfassen"
Global Const $Titel = 'Programm', $Breite = 500, $Hoehe = 300

Global $hGUI = GUICreate($Titel, $Breite, $Hoehe, _C($Breite, 1), _C($Hoehe), $WS_POPUP, $WS_EX_LAYERED) ; Fenster ohne Alles
GUISetBkColor(0x000000, $hGUI) ; Damit kann man sehen ob iwo was transparent ist, oder nicht gezeichnet wird.
WinSetTrans($hGUI, '', 255) ; Bei XP gibt es manchmal Probleme mit der Geschwindigkeit ohne 255 Trans
GUISetOnEvent(-3, '_Exit', $hGUI)
GUISetState(@SW_SHOW, $hGUI)

Global $hDC_Gui = _WinAPI_GetDC($hGUI)



Global $h_AlphaStruct = _GDI_AlphaBlend_GetStruct_Array() ;Hier steckt ein Array

Global $h_ASM_Struct_Verpixelung = _Get_ASM_Verpixelung_Struct() ; Wichtig für die Perlinberechnungen.

Global $h_ASM_Struct_Faerben = _Get_ASM_Faerben_Struct() ; Um Schrift zu Färben.
Global $h_ASM_Struct_Clear = _Get_ASM_Clear_Struct() ; Um Schrift zu Färben.


;~ Global $h_ASM_Struct_GemHintFarbe = _Get_ASM_GemHintFarbe_Struct() ; Zum Färben der Gems.
;~ Global $h_ASM_Struct_Kontrast = _Get_ASM_Kontrast_Struct() ;Um den Kontrast zu verändern.
;~ Global $h_ASM_Struct_GFaerben = _Get_ASM_GFaerben_Struct() ;Um den Kontrast zu verändern.


Global $Zahlen_Anz = 10, $Zahlen_Image[$Zahlen_Anz] ;Die Zahlen von 0 bis 9

For $i = 0 To 9 Step 1

	$Zahlen_Image[$i] = _CreateImageSchrift($i, 0xFFBBBBBB, 5)
Next

Global $Zahlen_Anz_Rot = 11, $Zahlen_Image_Rot[$Zahlen_Anz_Rot] ;---> Zahlen von 0 bis 9 und der Punkt in nr. 10

For $i = 0 To 9 Step 1
	$Zahlen_Image_Rot[$i] = _CreateImageSchrift($i, 0xFFFF0000, 5)
Next

$Zahlen_Image_Rot[10] = _CreateImageSchrift('.', 0xFFFF0000, 5)

Global $Pos = _MouseGetPos($hGUI)


Global $_Backbuffer = _CreateImage($Breite, $Hoehe)
Global $Backbuffer = DllStructGetData($_Backbuffer, 1, 1)

GUIRegisterMsg($WM_NCHITTEST, 'WM_NCHITTEST')

;~ Local $1 = _CreatePerlin(100,100,128, Random(0, 10000), 0xFF000000, 0xFFFF0000)
;~ Local $2 = _CreatePerlin(100,100,128, Random(0, 10000), 0xFF000000, 0xFF00FF00)
;~ Local $3 = _CreatePerlin(100,100,128, Random(0, 10000), 0xFF000000, 0xFF0000FF)

;~ _DrawImageTransEX(DllStructGetData($3, 1,1), 0, 0, $1, 128)
;~ _DrawImageTransEX(DllStructGetData($3, 1,1), 0, 0, $2, 64)

;~ _SaveImage($3)

_Main()
_Exit()

Func _Main()

	Local $Exit = False

	Local $Button_Exit = _CreateButton(30,20,'Exit')

	Local $Titelleiste = _CreatePerlin($Breite - 30, 20, 150, Random(0, 10000), 0xFF000000, 0xFFCCCCFF)

	Local $Weiss = _CreateFarbe(0xFFFFFFFF)

	Local $L_Klick = _IsPressed('01')

	Local $Laden = _CreateButton(100,20,'Bild Laden')

	Local $Speichern = _CreateButton(160,20,'Fertiges Bild Speichern')

	Local $Extrahieren = _CreateButton(120, 20, 'Daten Extrahieren')

	Local $DateiSuchen = _CreateButton(100, 20, 'Datei Wählen')

	Local $Vorschaubild = _CreateFarbe(0xFF123456)

	Local $Nachher = _CreateFarbe(0xFF123456)

	Local $Pixel_img = _CreateImageSchrift('Pixel:', 0xFFBBBBBB, 5)
	Local $Kapazitaet = _CreateImageSchrift('Kapazität:', 0xFFBBBBBB, 5)
Local $KB = _CreateImageSchrift('Byte', 0xFFBBBBBB, 5)
	Local $Pixel = False
	Local $Bits = False


	While Sleep(20) And Not $Exit
		$Pos = _MouseGetPos($hGUI)
		$L_Klick = _IsPressed('01')

		_ClearImg($_Backbuffer, 0xFF303030)

		If _Btn($Button_Exit, $Breite - 30, 0, $L_Klick, $Backbuffer) Then $Exit = True
		If _Btn($Laden, 0, 20, $L_Klick, $Backbuffer) Then _LoadImage($Vorschaubild, $Pixel, $Bits)
		If $Bits And _Btn($DateiSuchen, $Breite/2 - 50, 20, $L_Klick, $Backbuffer) Then _DateiInBild($Nachher, $Vorschaubild)
		If $Bits And _Btn($Extrahieren, $Breite/2 - 60, $Hoehe - 20, $L_Klick, $Backbuffer) Then _DateiAusBild($Vorschaubild)

		_DrawImage($Backbuffer, 0, 0, $Titelleiste)
		_DrawImageTransStretchEx($Backbuffer, 0, 0, $Breite, 10, $Weiss, 70)

		If DllStructGetData($Vorschaubild, 1, 2) > 1 Then _DrawImageTransStretchEx($Backbuffer, 5, 45, 200, 200, $Vorschaubild)
		If $Pixel Then _DrawImageZahl($Backbuffer, 70, $Hoehe - 50, $Pixel)
		_DrawImageTrans($Backbuffer, 5, $Hoehe - 50, $Pixel_img)

		_DrawImageTrans($Backbuffer, 5, $Hoehe - 40, $Kapazitaet)
		If $Bits Then
		_DrawImageZahlRot($Backbuffer, 70, $Hoehe - 40, Int($Bits/8))
		_DrawImageTrans($Backbuffer, 130, $Hoehe - 40, $KB)
	EndIf

	If DllStructGetData($Nachher, 1, 2) > 1 Then
	_DrawImageTransStretchEx($Backbuffer, $Breite - 205, 45, 200, 200, $Nachher)
	If _Btn($Speichern, $Breite - 160, $Hoehe - 20, $L_Klick, $Backbuffer) Then _SaveImage($Nachher)
	EndIf




		_DrawImage($hDC_Gui, 0, 0, $_Backbuffer)
	WEnd

_DeleteBtn($Extrahieren)
_DeleteBtn($Speichern)
_DeleteBtn($DateiSuchen)
_DeleteImage($Nachher)
_DeleteImage($KB)
_DeleteImage($Pixel_img)
_DeleteImage($Kapazitaet)
_DeleteImage($Vorschaubild)
_DeleteBtn($Laden)
	_DeleteBtn($Button_Exit)
	_DeleteImage($Weiss)
	_DeleteImage($Titelleiste)

EndFunc

Func _DateiAusBild($img)

	Local $Daten = ''
	Local $len = DllStructGetData($img, 1, 2) * DllStructGetData($img, 1, 3) ; Länge in Pixeln
	Local $ptr = DllStructGetData($img ,1 , 4)
	Local $Struct = DllStructCreate('int[' & $len & ']', $ptr)
	Local $col = 0x00000000
	Local $RGB[3]


	For $i = 1 To $len Step 1
		$col = Hex(DllStructGetData($Struct, 1, $i),8)
		$RGB = _GetRGB($col)
		$Daten &= StringRight(_HTB2($RGB[0]),1)
		$Daten &= StringRight(_HTB2($RGB[1]),1)
		$Daten &= StringRight(_HTB2($RGB[2]),1)
		If $i/10 = Int($i/10) Then ToolTip('Daten werden geladen' & @CRLF & 'Pixel: ' & $i)
;~ 		ToolTip('Pixel: ' & $i & @CRLF & 'ARGB: ' & $col & @CRLF & 'Binär: ' & $RGB[0] & ' ' & $RGB[1] & ' ' & $RGB[2])
;~ 		Sleep(100)

	Next

	$Daten = _BinToHex($Daten)

	Local $split = StringSplit($Daten, '5B7E2A7E5D', 1)
	If $split[0] >= 2 Then ; Falls die Zeichenfolge später nochmal auftaucht ist es wurscht. Die Daten stehen ja vorne.
	Local $pfad = BinaryToString('0x' & $split[1])
	$Daten = BinaryToString('0x' & $split[2])

;~ 	_ArrayDisplay($split)
;~ 	$Daten = BinaryToString('0x' & $split[0])

;~ 	ToolTip($pfad & @CRLF & $Daten)

	If FileExists('_' & $pfad) Then
		If MsgBox(4, 'Die Datei exisitert schon !', 'Wollen sie die vorhandene Datei überschreiben ?') = 6 Then
			FileDelete('_' & $pfad)
		EndIf
	EndIf

	If Not FileExists('_' & $pfad) Then
		FileWrite('_' & $pfad, $Daten)
		Tip('Die Datei: _' & $pfad &  ' wurde erfolgreich extrahiert')
	EndIf

Else
	Tip('Da lief etwas schief...' & @CRLF & 'vllt sind keine Daten in dem Bild ?')

	EndIf


EndFunc

Func Tip($a)
	ToolTip($a)
	AdlibRegister('DelTip', 2000)
EndFunc

Func DelTip()
	ToolTip('')
	AdlibUnRegister('DelTip')
EndFunc

Func _BinToHex($a)
	Local $len = StringLen($a)
;~ 	ToolTip($len)
;~ 	If $len/8 <> Int($len/8) Then Return StringTrimLeft(StringToBinary('Ungültiger Text'),2)
$len = Int($len/8) * 8
	Local $b = ''
	For $i = 0 To $len/4 Step 1
		$b &= _BTH(StringLeft($a, 4))
		$a = StringTrimLeft($a, 4)
	Next
	Return $b
EndFunc

Func _DateiInBild(ByRef $img_ziel, $img_quelle)
	Local $pfad = FileOpenDialog('Beliebige Datei wählen', @ScriptDir, '(*.*)')
	If $pfad Then
	Local $split = StringSplit($pfad, '\')
	Local $Dateiname = $split[$split[0]] & '[~*~]' ; --> '5B7E2A7E5D'

	Local $Daten = $Dateiname & FileRead($pfad) & '[~*~]' ; um zu wissen Wo die Datei Endet im Bild.

	Local $len = StringLen($Daten)

	Local $Pixel = DllStructGetData($img_quelle, 1, 2) * DllStructGetData($img_quelle, 1, 3)
	Local $Bits = $Pixel * 3 ;Bei R G B wird der Letzte Wert ersetzt.

	If $len * 8 < $Bits Then

	$Daten = StringToBinary($Daten)

;~ 	ToolTip($Daten)
;~ ClipPut($Daten)
;~ 	Sleep(5000)
	$Daten = _HexToBin($Daten) ;Hier ist der String komplett nur noch aus 0 und 1

	_DeleteImage($img_ziel)
	$img_ziel = _CopyImage($img_quelle)

	_WriteDataInImage($img_ziel, $Daten)





Else
	Tip('zu viele Daten für das Bild')

EndIf

	EndIf
EndFunc

Func _WriteDataInImage($img, $Daten)
	Local $len = DllStructGetData($img, 1, 2) * DllStructGetData($img, 1, 3) ; Länge in Pixeln
	Local $ptr = DllStructGetData($img ,1 , 4)
	Local $Struct = DllStructCreate('int[' & $len & ']', $ptr)
	Local $col = 0x00000000
	Local $RGB[3]

	Local $len2 = StringLen($Daten) ;Länge des 0/1 Strings.
	Local $len3 = Ceiling($len2/3) ; Anzahl der benötigten Pixel um die Daten zu sichern.

	For $i = 1 To $len3 + 1 Step 1
		$col = Hex(DllStructGetData($Struct, 1, $i),8)
		$RGB = _GetRGB($col)
		$RGB[0] = _BTH2(StringLeft(_HTB2($RGB[0]), 7) & StringLeft($Daten,1))
		$Daten = StringTrimLeft($Daten, 1)
		$RGB[1] = _BTH2(StringLeft(_HTB2($RGB[1]), 7) & StringLeft($Daten,1))
		$Daten = StringTrimLeft($Daten, 1)
		$RGB[2] = _BTH2(StringLeft(_HTB2($RGB[2]), 7) & StringLeft($Daten,1))
		$Daten = StringTrimLeft($Daten, 1)

		$col = '0xFF' & $RGB[0] & $RGB[1] & $RGB[2]

		DllStructSetData($Struct, 1, $col, $i)

;~ 		ToolTip('Pixel: ' & $i & @CRLF & 'ARGB: ' & $col & @CRLF & 'Binär: ' & $RGB[0] & ' ' & $RGB[1] & ' ' & $RGB[2])
;~ 		ToolTip('Daten werden Geschrieben' & @CRLF & 'Pixel: ' & $i)
		If $i/10 = Int($i/10) Then ToolTip('Daten werden geschrieben' & @CRLF & 'Pixel: ' & $i)
;~ 		Sleep(10)
	Next

	ToolTip('')


EndFunc

Func _GetRGB($col)
	$col = '0x' & $col
	Local $a[3]
	$a[0] = Hex(BitAND(BitShift($col, 16), 0xFF),2)
	$a[1] = Hex(BitAND(BitShift($col, 8), 0xFF),2)
	$a[2] = Hex(BitAND($col, 0xFF),2)
	Return $a
EndFunc

Func _HexToBin($a)
	Local $Data = StringTrimLeft($a, 2) ; 0x weg machen
	Local $len = StringLen($Data)
	Local $b = '' ;Neuer String
	For $i = 0 To $len - 1 Step 1
		$b &= _HTB(StringLeft($Data, 1))
		$Data = StringTrimLeft($Data, 1)
	Next
	Return $b
EndFunc

Func _HTB2($a)
	Local $b = _HTB(StringLeft($a, 1)) & _HTB(StringRight($a, 1))
Return $b
EndFunc

Func _BTH2($a)
;~ 	ToolTip($a)
;~ 	Sleep(500)
	Local $b = _BTH(StringLeft($a, 4)) & _BTH(StringRight($a, 4))
	Return $b
EndFunc

Func _HTB($a)
	Switch $a
		Case '0'
			Return '0000'
		Case '1'
			Return '0001'
		Case '2'
			Return '0010'
		Case '3'
			Return '0011'
		Case '4'
			Return '0100'
		Case '5'
			Return '0101'
		Case '6'
			Return '0110'
		Case '7'
			Return '0111'
		Case '8'
			Return '1000'
		Case '9'
			Return '1001'
		Case 'A'
			Return '1010'
		Case 'B'
			Return '1011'
		Case 'C'
			Return '1100'
		Case 'D'
			Return '1101'
		Case 'E'
			Return '1110'
		Case 'F'
			Return '1111'
	EndSwitch
EndFunc

Func _BTH($a)
	Switch $a
		Case '1111'
			Return 'F'
		Case '1110'
			Return 'E'
		Case '1101'
			Return 'D'
		Case '1100'
			Return 'C'
		Case '1011'
			Return 'B'
		Case '1010'
			Return 'A'
		Case '1001'
			Return '9'
		Case '1000'
			Return '8'
		Case '0111'
			Return '7'
		Case '0110'
			Return '6'
		Case '0101'
			Return '5'
		Case '0100'
			Return '4'
		Case '0011'
			Return '3'
		Case '0010'
			Return '2'
		Case '0001'
			Return '1'
		Case '0000'
			Return '0'
		Case Else
			Return 'X'
	EndSwitch
EndFunc   ;==>_StringReplace

Func _LoadImage(ByRef $img, ByRef $Pixel, ByRef $Bits)
	Local $pfad = FileOpenDialog('png/bmp Bild wählen', @ScriptDir, '(*.png;*.bmp;*.jpg)')
	If $pfad Then
		_DeleteImage($img)
		$img = _CreateImageFile($pfad)
	EndIf
	$Pixel	= DllStructGetData($img ,1, 2) * DllStructGetData($img ,1, 3)
	$Bits = $Pixel * 3
EndFunc

Func _ClearImg($img, $col)
DllCall($h_USER32_DLL, 'ptr', 'CallWindowProcW', 'ptr', DllStructGetPtr($h_ASM_Struct_Clear), 'ptr', DllStructGetData($img ,1, 4), 'int', $col, 'int',DllStructGetData($img ,1, 2)*DllStructGetData($img ,1, 3) , 'int', 0)
EndFunc

Func __ASM_Clear()
	_('use32')
	_('mov edi, [esp+4]') ; pointer
	_('mov ebx, [esp+8]') ; Farbe
	_('mov ecx, [esp+12]') ; zähler
	_('_Schleife:')
	_('mov dword[edi], ebx')
	_('add edi,4') ;Nächster Pixel
	_('sub ecx, 1')
	_('ja _Schleife')
	_('ret ')
EndFunc

Func _Get_ASM_Clear_Struct()
	FasmReset($Fasm)
	__ASM_Clear()
	Local $bytecode = FasmGetBinary($Fasm)
	Local $struct = _AsmToStruct($bytecode)
	Return $struct
EndFunc   ;==>_Get_ASM_Faerben_Struct

Func _CreateImageFile($pfad)
	Local $gdiplusImg = _GDIPlus_ImageLoadFromFile($pfad)
	Local $b = _GDIPlus_ImageGetWidth($gdiplusImg), $h = _GDIPlus_ImageGetHeight($gdiplusImg)
	Local $img = _CreateImage($b, $h)
	Local $gr = _GDIPlus_GraphicsCreateFromHDC(DllStructGetData($img, 1, 1))
	_GDIPlus_GraphicsDrawImage($gr, $gdiplusImg, 0, 0)
	_GDIPlus_ImageDispose($gdiplusImg)
	_GDIPlus_GraphicsDispose($gr)
	Return $img
EndFunc

Func _Kollision_Viereck_Punkt($x1, $y1, $x2, $y2, $b2, $h2) ;Selbsterklärend
	Return ($x1 > $x2 And $y1 > $y2 And $x1 < $x2 + $b2 And $y1 < $y2 + $h2)
EndFunc   ;==>_Kollision_Viereck_Punkt

Func WM_NCHITTEST($hWnd, $iMsg, $iwParam, $ilParam)
	If ($hWnd = $hGUI) And ($iMsg = $WM_NCHITTEST) And _Kollision_Viereck_Punkt($Pos[0], $Pos[1], 0, 0,$Breite - 30, 20) Then Return $HTCAPTION
EndFunc   ;==>WM_NCHITTEST

Func _DeleteBtn(ByRef $Btn)
	_DeleteImage($Btn[0])
	_DeleteImage($Btn[1])
	$Btn = 0
EndFunc   ;==>_DeleteBtn

Func _Btn(ByRef $Btn, $x, $y, $L_Klick, $buf)
	Local $Tmp = _MausRect($Pos, $x, $y, $Btn[2], $Btn[3])
	Switch $Tmp
		Case True
			_DrawImage($buf, $x, $y, $Btn[1])
		Case False
			_DrawImage($buf, $x, $y, $Btn[0])
	EndSwitch
	If Not $Tmp Then $Btn[4] = False
	If $L_Klick And $Tmp Then $Btn[4] = True
	If Not $L_Klick And $Btn[4] Then
		$Btn[4] = False
		Return True
	EndIf
	Return False
EndFunc   ;==>_Btn

Func _CreateFarbe($col)
	Local $img = _CreateImage(1, 1)
	Local $ptr = DllStructGetData($img, 1, 4)
	Local $str = DllStructCreate('int', $ptr)
	DllStructSetData($str, 1, $col)
	Return $img
EndFunc

Func _CreateButton($b, $h, $Text, $kl = 5, $Hover = False, $Rnd = False) ; Gibt ein Array mit Image1, Image2, b, h und TMP aus.
	Local $f2 = 0xFF804020
	Local $col = 0xFFFF8000
	Local $hel = 60
	If Not $Rnd Then $Rnd = Random(0, 10000)
	If $Hover Then
		$f2 = 0xFFFFE000
		$col = 0xFFFFFF00
		$hel = 100
	EndIf
	Local $img = _CreatePerlin($b, $h, $hel, $Rnd, 0xFF000000, $f2)
	Local $img2 = _CreatePerlin($b - 2, $h - 2, 100, $Rnd, 0xFF000000, 0xFF804020)
	_DrawImage(DllStructGetData($img, 1, 1), 1, 1, $img2)
	Local $Fon = _CreateImageSchrift($Text, $col, $kl)
	_DrawImageTrans(DllStructGetData($img, 1, 1), $b / 2 - DllStructGetData($Fon, 1, 2) / 2, $h / 2 - DllStructGetData($Fon, 1, 3) / 2, $Fon)
	_DeleteImage($Fon)
	_DeleteImage($img2)
	If Not $Hover Then
		Local $Btn_Aktiv = _CreateButton($b, $h, $Text, $kl, True, $Rnd)
		Local $aRet[5] = [$img, $Btn_Aktiv, $b, $h, False]
		Return $aRet
	Else
		Return $img
	EndIf
EndFunc   ;==>_ButtonBild

Func _MausRect($Pos, $x2, $y2, $b2, $h2)
	Return ($Pos[0] > $x2 And $Pos[1] > $y2 And $Pos[0] < $x2 + $b2 And $Pos[1] < $y2 + $h2)
EndFunc   ;==>_MausRect



Func _Exit()

_DeleteImage($_Backbuffer)
_WinAPI_DeleteDC($hDC_Gui)

	DllClose($h_GDI32_DLL)
;~ 	DllClose($h_NTDLL_DLL)
	DllClose($h_USER32_DLL)
	DllClose($h_OLE32_DLL)
	DllClose($h_MSIMG32_DLL)
	DllClose($h_KERNEL32_DLL)
	DllClose($h_OLEAUT32_DLL)
	DllClose($h_GDIPLUS_DLL)

	_GDIPlus_Shutdown()

	Exit
EndFunc

Func _Betrag($a)
	If $a > 0 Then Return $a
	Return -$a
EndFunc   ;==>_Betrag

Func _Min($a, $b)
	If $a > $b Then Return $b
	Return $a
EndFunc   ;==>_Min

Func _GDI_AlphaBlend($hDCDest, $nXOriginDest, $nYOriginDest, $nWidthDest, $nHeightDest, $hDCSrc, $nXOriginSrc, $nYOriginSrc, $nWidthSrc, $nHeightSrc, $blendFunction)
	DllCall($h_MSIMG32_DLL, 'int', 'AlphaBlend', _
			'ptr', $hDCDest, _  ;  // handle to destination DC
			'int', $nXOriginDest, _  ;  // x-coord of upper-left corner
			'int', $nYOriginDest, _  ;  // y-coord of upper-left corner
			'int', $nWidthDest, _  ;  // destination width
			'int', $nHeightDest, _  ;  // destination height
			'ptr', $hDCSrc, _  ;  // handle to source DC
			'int', $nXOriginSrc, _  ;  // x-coord of upper-left corner
			'int', $nYOriginSrc, _  ;  // y-coord of upper-left corner
			'int', $nWidthSrc, _  ;  // source width
			'int', $nHeightSrc, _  ;  // source height
			'dword', $blendFunction);$blendFunction)   ;  // alpha-blending function
EndFunc   ;==>_GDI_AlphaBlend

Func _WinAPI_StretchBlt($hDestDC, $iXDest, $iYDest, $iWidthDest, $iHeightDest, $hSrcDC, $iXSrc, $iYSrc, $iWidthSrc, $iHeightSrc, $iRop)
	DllCall($h_GDI32_DLL, 'int', 'StretchBlt', 'hwnd', $hDestDC, 'int', $iXDest, 'int', $iYDest, 'int', $iWidthDest, 'int', $iHeightDest, 'hwnd', $hSrcDC, 'int', $iXSrc, 'int', $iYSrc, 'int', $iWidthSrc, 'int', $iHeightSrc, 'dword', $iRop)
EndFunc   ;==>_WinAPI_StretchBlt

Func _IsPressed($a)
	Local $b = DllCall($h_USER32_DLL, "short", "GetAsyncKeyState", "int", '0x' & $a)
	Return BitAND($b[0], 0x8000) <> 0
EndFunc   ;==>_IsPressed

Func _MemGlobalAlloc($iBytes, $iFlags = 0)
	Local $aResult = DllCall($h_KERNEL32_DLL, 'handle', 'GlobalAlloc', 'uint', $iFlags, 'ulong_ptr', $iBytes)
	Return $aResult[0]
EndFunc   ;==>_MemGlobalAlloc

Func _MemGlobalLock($hMem)
	Local $aResult = DllCall($h_KERNEL32_DLL, 'ptr', 'GlobalLock', 'handle', $hMem)
	Return $aResult[0]
EndFunc   ;==>_MemGlobalLock

Func _MemGlobalUnlock($hMem)
	Local $aResult = DllCall($h_KERNEL32_DLL, 'bool', 'GlobalUnlock', 'handle', $hMem)
	Return $aResult[0]
EndFunc   ;==>_MemGlobalUnlock

Func _MemGlobalFree($hMem)
	DllCall($h_KERNEL32_DLL, "ptr", "GlobalFree", "handle", $hMem)
EndFunc   ;==>_MemGlobalFree

Func _MemMoveMemory($pSource, $pDest, $iLength)
	DllCall($h_KERNEL32_DLL, "none", "RtlMoveMemory", "ptr", $pDest, "ptr", $pSource, "ulong_ptr", $iLength)
EndFunc   ;==>_MemMoveMemory

Func _GDIPlus_ImageLoadFromStream($pStream)
	Local $aResult = DllCall($h_GDIPLUS_DLL, "uint", "GdipLoadImageFromStream", "ptr", $pStream, "int*", 0)
	$GDIP_STATUS = $aResult[0]
	Return $aResult[2]
EndFunc   ;==>_GDIPlus_ImageLoadFromStream

Func _GDIPlus_GraphicsSetInterpolationMode($hGraphics, $iInterpolationMode)
	Local $aResult = DllCall($h_GDIPLUS_DLL, "uint", "GdipSetInterpolationMode", "hwnd", $hGraphics, "int", $iInterpolationMode)
	$GDIP_STATUS = $aResult[0]
	Return $aResult[0] = 0
EndFunc   ;==>_GDIPlus_GraphicsSetInterpolationMode

Func _GDI_AlphaBlend_GetStruct($Alpha = 255)
	Local $struct = DllStructCreate($tagBLENDFUNCTION)
	DllStructSetData($struct, 1, 0) ; 0 = AC_SRC_OVER
	DllStructSetData($struct, 2, 0) ; 0 "Must be Zero"
	DllStructSetData($struct, 3, $Alpha) ; Alpha fürs ganze Bild
	DllStructSetData($struct, 4, 1) ; 1 = Bild enthält einen Alphakanal
	Local $data = DllStructCreate("dword", DllStructGetPtr($struct))
	$data = DllStructGetData($data, 1)
	Return $data
EndFunc   ;==>_GDI_AlphaBlend_GetStruct

Func _GDI_AlphaBlend_GetStruct_Array()
	Local $a[256]
	For $i = 0 To 255 Step 1
		$a[$i] = _GDI_AlphaBlend_GetStruct($i)
	Next
	Return $a
EndFunc   ;==>_GDI_AlphaBlend_GetStruct_Array

Func _MouseGetPos($hWnd)
	Local $aPos = MouseGetPos()
	Local $tPoint = DllStructCreate('long X;long Y')
	DllStructSetData($tPoint, 'X', $aPos[0])
	DllStructSetData($tPoint, 'Y', $aPos[1])
	DllCall($h_USER32_DLL, 'bool', 'ScreenToClient', 'hwnd', $hWnd, 'ptr', DllStructGetPtr($tPoint))
	$aPos[0] = DllStructGetData($tPoint, 'X')
	$aPos[1] = DllStructGetData($tPoint, 'Y')
	Return $aPos
EndFunc   ;==>_MouseGetPos

#Region - Image UDF (by Mars)

Func _CreateImage($b, $h)
	Local $ptr, $hDC, $hbmp
	$hDC = _CreateNewBmp32($b, $h, $ptr, $hbmp)
	Local $struct = DllStructCreate('int[5]')
	DllStructSetData($struct, 1, $hDC, 1)
	DllStructSetData($struct, 1, $b, 2)
	DllStructSetData($struct, 1, $h, 3)
	DllStructSetData($struct, 1, $ptr, 4)
	DllStructSetData($struct, 1, $hbmp, 5)
	Return $struct
EndFunc   ;==>_CreateImage

Func _CreateImageRes($res)
	Local $hMem = _MemGlobalAllocFromBinary($res)
	Local $hBitmap = _GDIPlus_ImageLoadFromHGlobal($hMem)
	Local $b = _GDIPlus_ImageGetWidth($hBitmap)
	Local $h = _GDIPlus_ImageGetHeight($hBitmap)
	Local $img = _CreateImage($b, $h)
	Local $gr = _GDIPlus_GraphicsCreateFromHDC(DllStructGetData($img, 1, 1))
	_GDIPlus_GraphicsDrawImage($gr, $hBitmap, 0, 0)
	_GDIPlus_GraphicsDispose($gr)
	_GDIPlus_ImageDispose($hBitmap)
	Return $img
EndFunc   ;==>_CreateImageRes

Func _CreateImageSchrift($String, $Farbe = 0xFFFFFFFF, $Size_ = 5, $abs = 1)
	Local $HyruleFont = False
	If $Size_ = 5.1 Then
		$HyruleFont = True
		$Size_ = 5
	EndIf

	Local $size = _GetSize($String, $Size_, $abs)
	Local $b = $size[0]
	Local $h = $size[1]
	Local $ptr, $hbmp
	Local $hDC = _CreateNewBmp32($b, $h, $ptr, $hbmp)
	Local $hgr = _GDIPlus_GraphicsCreateFromHDC($hDC)
	_GDIPlus_GraphicsClear($hgr, 0x00000000)
	_GDIPlus_GraphicsDispose($hgr)
;~

	_DrawSchrift($hDC, $String, $Size_, $Farbe, $abs, $HyruleFont)
;~
	Local $struct = DllStructCreate('int[5]')
	DllStructSetData($struct, 1, $hDC, 1)
	DllStructSetData($struct, 1, $b, 2)
	DllStructSetData($struct, 1, $h, 3)
	DllStructSetData($struct, 1, $ptr, 4)
	DllStructSetData($struct, 1, $hbmp, 5)
	Return $struct
EndFunc   ;==>_CreateImageSchrift

Func _CreatePerlin($b, $h, $Helligkeit = 100, $Nummer = 1, $Farbe1 = 0xFF000000, $Farbe2 = 0xFFFFFFFF, $Tiefe = 15)
;~ 	$Helligkeit = Int($Helligkeit)
	If $Tiefe < 1 Then $Tiefe = 1
	If Int(_Log(_Min($b, $h), 2)) - 1 <= Int($Tiefe) Then $Tiefe = Int(_Log(_Min($b, $h), 2)) - 1 ;Überprüfung ob die Tiefe möglich ist bei der angegebenen Auflösung
	Local $randx = Int($b / 3) ; Ein Rand muss sein, da sonst unten und rechts alles dunkel ist
	Local $randy = Int($h / 3) ; Und oben und links alles hell. Kommt durch das Vergrößern...
	$b += $randx
	$h += $randy
	Local $img = _CreateImage($b, $h) ;Bild erzeugen Hier liegen die ganzen Verpixelungen
	Local $hDC = DllStructGetData($img, 1, 1)
	Local $ptr = DllStructGetData($img, 1, 4)
	Local $hbmp = DllStructGetData($img, 1, 5)
	Local $struct = DllStructCreate('int[' & $b * $h & ']', $ptr)
	Local $ziel = _CreateImage($b, $h) ;Hier wird das Endergebnis zusammengebaut.
	Local $hdc_ziel = DllStructGetData($ziel, 1, 1)
	Local $tmpImg = _CreateImage($b, $h) ;Hier wird immer jeweils eine Ebene vergrößert.
	Local $gr = _GDIPlus_GraphicsCreateFromHDC(DllStructGetData($tmpImg, 1, 1))
	Local $bm
	_GDIPlus_GraphicsSetInterpolationMode($gr, 7)
	For $P = 0 To $Tiefe Step 1
		_ASM_Verpixelung(DllStructGetPtr($struct), $Nummer, $b, $h, $Farbe1, $Farbe2)
		$bm = _GDIPlus_BitmapCreateFromHBITMAP($hbmp)
		_GDIPlus_GraphicsDrawImageRectRect($gr, $bm, 0, 0, $b / 2 ^ ($Tiefe - $P), $h / 2 ^ ($Tiefe - $P), 0, 0, $b, $h)
		_GDIPlus_BitmapDispose($bm)
		_GDI_AlphaBlend($hdc_ziel, 0, 0, $b, $h, DllStructGetData($tmpImg, 1, 1), 0, 0, $b, $h, _GDI_AlphaBlend_GetStruct(255 / 2 ^ $P))
	Next
	$b -= $randx
	$h -= $randy
	Local $tmpImg2 = _CreateImage($b, $h) ; Dieses Bild enthält das Endbild.
	_WinAPI_BitBlt(DllStructGetData($tmpImg2, 1, 1), 0, 0, $b, $h, $hdc_ziel, $randx / 2, $randy / 2, $SRCCOPY) ;Es wird der Mittelteil ins Endbild kopiert. Ränder werden so beschnitten.
	Switch $Helligkeit
		Case 0 To 127
			_GDIPlus_GraphicsClear($gr, 0xFF000000) ; TmpImg1 wird nicht mehr gebraucht
			_GDI_AlphaBlend(DllStructGetData($tmpImg2, 1, 1), 0, 0, $b, $h, DllStructGetData($tmpImg, 1, 1), 0, 0, 10, 10, _GDI_AlphaBlend_GetStruct(255 - $Helligkeit * 2))
		Case 129 To 255
			_GDIPlus_GraphicsClear($gr, 0xFFFFFFFF) ; TmpImg1 wird nicht mehr gebraucht
			_GDI_AlphaBlend(DllStructGetData($tmpImg2, 1, 1), 0, 0, $b, $h, DllStructGetData($tmpImg, 1, 1), 0, 0, 10, 10, _GDI_AlphaBlend_GetStruct($Helligkeit * 2 - 255))
	EndSwitch
	_GDIPlus_GraphicsDispose($gr)
	_DeleteImage($img)
	_DeleteImage($tmpImg)
	_DeleteImage($ziel)
	Return $tmpImg2
EndFunc   ;==>_CreatePerlin

Func _DrawImage($hDC, $x, $y, $struct)
	_WinAPI_BitBlt($hDC, $x, $y, DllStructGetData($struct, 1, 2), DllStructGetData($struct, 1, 3), DllStructGetData($struct, 1, 1), 0, 0, $SRCCOPY)
EndFunc   ;==>_DrawImage

Func _DrawImageTrans($hDC, $x, $y, $struct)
	_GDI_AlphaBlend($hDC, $x, $y, DllStructGetData($struct, 1, 2), DllStructGetData($struct, 1, 3), DllStructGetData($struct, 1, 1), 0, 0, DllStructGetData($struct, 1, 2), DllStructGetData($struct, 1, 3), $h_AlphaStruct[255])
EndFunc   ;==>_DrawImageTrans

Func _DrawImageStretch($hDC, $x, $y, $b, $h, $struct)
	_WinAPI_StretchBlt($hDC, $x, $y, $b, $h, DllStructGetData($struct, 1, 1), 0, 0, DllStructGetData($struct, 1, 2), DllStructGetData($struct, 1, 3), $SRCCOPY)
EndFunc   ;==>_DrawImageStretch

Func _DrawImageTransEX($hDC, $x, $y, $struct, $Alpha)
	_GDI_AlphaBlend($hDC, $x, $y, DllStructGetData($struct, 1, 2), DllStructGetData($struct, 1, 3), DllStructGetData($struct, 1, 1), 0, 0, DllStructGetData($struct, 1, 2), DllStructGetData($struct, 1, 3), $h_AlphaStruct[$Alpha])
EndFunc   ;==>_DrawImageTransEX

Func _DrawImageTransStretchEx($hDC, $x, $y, $b, $h, $struct, $Alpha = 255)
	_GDI_AlphaBlend($hDC, $x, $y, $b, $h, DllStructGetData($struct, 1, 1), 0, 0, DllStructGetData($struct, 1, 2), DllStructGetData($struct, 1, 3), $h_AlphaStruct[$Alpha])
EndFunc   ;==>_DrawImageTransStretchEx

Func _DrawImageZahl($hDC, $x, $y, $i)

	$i = _Betrag(Int($i)) ;Nur Natürliche Zahlen
	Local $len = StringLen($i)
	For $o = 0 To $len - 1 Step 1
		_DrawImageTrans($hDC, $x + $o * 6, $y, $Zahlen_Image[Int(StringLeft($i, 1))])
		$i = StringTrimLeft($i, 1)
	Next

EndFunc   ;==>_DrawImageZahl

Func _DrawImageZahlC($hDC, $x, $y, $i) ;Zentriert die Zahl zur gegebenen X koordinate

	$i = _Betrag(Int($i)) ;Nur Natürliche Zahlen
	Local $len = StringLen($i)
	For $o = 0 To $len - 1 Step 1
		_DrawImageTrans($hDC, $x + $o * 6 - $len * 6 / 2, $y, $Zahlen_Image[Int(StringLeft($i, 1))])
		$i = StringTrimLeft($i, 1)
	Next

EndFunc   ;==>_DrawImageZahlC

Func _DrawImageZahlRot($hDC, $x, $y, $i) ; Nur in Verwendung des Zahlenarrays verwendbar. - Zahlen werden zur Laufzeit generiert und gespeichert.

	$i = Round(_Betrag($i), 1) ;Rute Zahlen gehen auf eine Stelle hinter dem Komma.
	Local $len = StringLen($i)
	Local $left = ''
	For $o = 0 To $len - 1 Step 1
		$left = StringLeft($i, 1)
		Switch $left
			Case '.'
				_DrawImageTrans($hDC, $x + $o * 6, $y, $Zahlen_Image_Rot[10]) ;in der 10 steckt der Punkt
			Case Else
				_DrawImageTrans($hDC, $x + $o * 6, $y, $Zahlen_Image_Rot[Int(StringLeft($i, 1))])
		EndSwitch
		$i = StringTrimLeft($i, 1)
	Next

EndFunc   ;==>_DrawImageZahlRot

Func _DeleteImage(ByRef $struct)
	_Delete_Bitmap32(DllStructGetData($struct, 1, 1), DllStructGetData($struct, 1, 5))
	$struct = 0
EndFunc   ;==>_DeleteImage

Func _CopyImage($img)
	Local $hDC_img = DllStructGetData($img, 1, 1)
	Local $b_img = DllStructGetData($img, 1, 2)
	Local $h_img = DllStructGetData($img, 1, 3)
	Local $ret = _CreateImage($b_img, $h_img)
	_DrawImage(DllStructGetData($ret, 1, 1), 0, 0, $img)
	Return $ret
EndFunc   ;==>_CopyImage

Func _SaveImage($img)
	Local $pfad = FileSaveDialog('BildSpeichern', @ScriptDir, '(*,.png)', Default, Hex(Random(256, 16 ^ 3, 1), 3) & '.png')
	If $pfad Then
		If Not StringRight($pfad, 4) = '.png' Then $pfad &= '.png'
		Local $bm = _GDIPlus_BitmapCreateFromHBITMAP(DllStructGetData($img, 1, 5))
		_GDIPlus_ImageSaveToFile($bm, $pfad)
		_GDIPlus_BitmapDispose($bm)
	EndIf
EndFunc   ;==>_SaveImage

Func _SaveImageEx($img, $pfad)
	If $pfad Then
		If Not StringRight($pfad, 4) = '.png' Then $pfad &= '.png'
		Local $bm = _GDIPlus_BitmapCreateFromHBITMAP(DllStructGetData($img, 1, 5))
		_GDIPlus_ImageSaveToFile($bm, $pfad)
		_GDIPlus_BitmapDispose($bm)
	EndIf
EndFunc   ;==>_SaveImageEx

#Region Hilfsmittel

; Alle ASM Funktionen müssen zu Beginn generiert werden. Sonst gibts en Error.

Func _Get_ASM_Verpixelung_Struct()
	FasmReset($Fasm)
	__ASM_Verpixelung_()
	Local $bytecode = FasmGetBinary($Fasm)
	Local $struct = _AsmToStruct($bytecode)
	Return $struct
EndFunc   ;==>_Get_ASM_Verpixelung_Struct

Func _Get_ASM_Faerben_Struct()
	FasmReset($Fasm)
	__ASM_Schrift_Faerben()
	Local $bytecode = FasmGetBinary($Fasm)
	Local $struct = _AsmToStruct($bytecode)
	Return $struct
EndFunc   ;==>_Get_ASM_Faerben_Struct

Func __ASM_Verpixelung_() ;ne Beschreibung gibts auch. aber nicht hier :P
	_('use32')
	_('org ' & FasmGetBasePtr($Fasm))
	_('mov ecx, [esp+4]')
	_('mov edi,dword[ecx]')
	_('mov edx,dword[ecx+4]')
	_('mov eax, dword[ecx+16]')
	_('mov dword[farbe1], eax')
	_('mov eax, dword[ecx+20]')
	_('mov dword[farbe2], eax')
	_('mov eax,dword[ecx+8]')
	_('mov ebx,dword[ecx+12]')
	_('push ecx')
	_('mov ecx, eax')
	_('_x:')
	_('push ecx')
	_('push eax')
	_('push ebx')
	_('call Schleife2')
	_('pop ebx')
	_('pop eax')
	_('pop ecx')
	_('sub ecx,1')
	_('ja _x')
	_('pop ecx')
	_('mov dword[ecx + 4], edx')
	_('ret ')
	_('Schleife2:')
	_('mov eax, 0')
	_('mov ecx, ebx')
	_('_y:')
	_('call zufall')
	_('cmp eax, 0')
	_('jne ungleich')
	_('mov eax,dword[farbe1]')
	_('mov dword[edi], eax')
	_('jmp weiter')
	_('ungleich:')
	_('mov eax,dword[farbe2]')
	_('mov dword[edi], eax')
	_('weiter:')
	_('add edi,4')
	_('sub ecx,1')
	_('ja _y')
	_('ret ')
	_('zufall:')
	_('mov eax, edx')
	_('mov edx, 0')
	_('imul eax, 7141')
	_('add eax, 54773')
	_('mov edx, 0')
	_('mov ebx, 259200')
	_('idiv ebx')
	_('cmp edx, 129600')
	_('ja edxgr')
	_('mov eax, 0')
	_('jmp zufallende')
	_('edxgr:')
	_('mov eax, 1')
	_('zufallende:')
	_('ret ')
	_('farbe1 dd ?')
	_('farbe2 dd ?')
EndFunc   ;==>__ASM_Verpixelung_

Func _ASM_Verpixelung($ziel, ByRef $Nummer, $b, $h, $f1, $f2)
	Local $struct = DllStructCreate('int[6]')
	DllStructSetData($struct, 1, $ziel, 1)
	DllStructSetData($struct, 1, $Nummer, 2)
	DllStructSetData($struct, 1, $b, 3)
	DllStructSetData($struct, 1, $h, 4)
	DllStructSetData($struct, 1, $f1, 5)
	DllStructSetData($struct, 1, $f2, 6)
	DllCall($h_USER32_DLL, 'ptr', 'CallWindowProcW', 'ptr', DllStructGetPtr($h_ASM_Struct_Verpixelung), 'ptr', DllStructGetPtr($struct), 'int', 0, 'int', 0, 'int', 0)
	$Nummer = DllStructGetData($struct, 1, 2)
	$struct = 0
EndFunc   ;==>_ASM_Verpixelung

Func _Log($x, $y) ; Logarithmus zur Basis y
	Return Log($x) / Log($y)
EndFunc   ;==>_Log

Func _Zufall(ByRef $Z) ; Eine Pseudo Zufallszahl wird generiert.
	$Z = Mod((7141 * $Z + 54773), 259200)
	If $Z < 129600 Then Return 1 ; Nur mit 0 und 1
	Return 0
EndFunc   ;==>_Zufall

Func _Zufall2(ByRef $Z) ; Eine Pseudo Zufallszahl wird generiert.
	$Z = Mod((7141 * $Z + 54773), 259200)
	Return $Z / 259200 ; Ein Kommawert zw 0 und 1
EndFunc   ;==>_Zufall2

Func _AsmToStruct($ASM_Code)
	Local $struct = DllStructCreate('byte[' & StringLen($ASM_Code) / 2 - 1 & ']')
	DllStructSetData($struct, 1, $ASM_Code)
	Return $struct
EndFunc   ;==>_AsmToStruct

Func _DrawSchrift($hDC, $String, $px, $Farbe = 0xFFFF0000, $abs = 1, $Hyrule = False)
	If $Hyrule Then $px += 0.1
	Local $FontPng = _SchriftRes($px)

	If $Hyrule Then $px -= 0.1
	Local $Font
	Local $ptr, $hbmp, $imgBreite, $imgHoehe

	Local $Img_Font = _CreateImageRes($FontPng)

	Local $hDC_Font = DllStructGetData($Img_Font, 1, 1)
	$imgBreite = DllStructGetData($Img_Font, 1, 2)
	$imgHoehe = DllStructGetData($Img_Font, 1, 3)
	$ptr = DllStructGetData($Img_Font, 1, 4)

	_Farbe($ptr, $Farbe, $imgBreite * $imgHoehe)

	Local $l = StringLen($String)
	Local $s = ''
	Local $x = 0, $y = 0, $Nr = 0
	For $i = 1 To $l Step 1
		$s = StringMid($String, $i, 1)
		If $s = '|' Then
			$y += $px + $abs
			$x = 0
		Else
			$Nr = _GetNr($s)
			If $Nr <> 36 Then _WinAPI_StretchBlt($hDC, $x, $y, $px, $px, $hDC_Font, $Nr * $px, 0, $px, $px, $SRCCOPY)
			$x += $px + $abs
		EndIf
	Next
	_DeleteImage($Img_Font)
EndFunc   ;==>_DrawSchrift

Func _GetSize($a, $px, $abs = 1)
	Local $l = StringLen($a)
	Local $s = ''
	Local $c = 0, $c2 = 0, $c3 = 0
	For $i = 1 To $l Step 1
		$c += 1
		If $c >= $c2 Then $c2 = $c
		$s = StringMid($a, $i, 1)
		If $s = '|' Then
			$c = 0
			$c3 += 1
		EndIf
	Next
	Local $ret[2] = [$c2 * ($px + $abs), ($c3 + 1) * ($px + $abs)] ;5px für den Buchstaben und einer für den Abstand, $c3 wird erhöht, da Zeile 0 sonst nicht mitgezählt wird.
	Return $ret
EndFunc   ;==>_GetSize

Func _GetNr($a) ;Gibt die Nummer des Zeichens aus
	Local $b[36 + 23] = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '_', '.', ';', 'ä', 'ö', 'ü', '-', '§', '$', '%', '&', '#', '>', '<', '[', ']', '(', ')', '"', "'", '=', '+', ':']
	For $i = 0 To 35 + 23 Step 1
		If $a = $b[$i] Then Return $i
	Next
	Return 36 + 23
EndFunc   ;==>_GetNr

Func _Farbe($ptr, $col, $px)
	DllCall($h_USER32_DLL, 'ptr', 'CallWindowProcW', 'ptr', DllStructGetPtr($h_ASM_Struct_Faerben), 'ptr', $ptr, 'int', $col, 'int', $px, 'int', 0)
EndFunc   ;==>_Farbe

Func __ASM_Schrift_Faerben() ;Ersetzt den Innenteil der _Farbe Func in AutoIt
	_('use32')
	_('mov edi, [esp+4]') ; edi = Ptr fürs Bitmap
	_('mov ebx, [esp+8]') ; ebx = Farbe
	_('mov ecx, [esp+12]') ; ecx = Zähler. also anzahl Pixel
	_('_Schleife:')
	_('mov edx, dword[edi]')
	_('cmp edx, 0xFFFFFFFF')
	_('jne ungleich')
	;######## If edx = 0xFFFFFFFF Then
	_('mov dword[edi], ebx')
	;################################# Endif
	_('jmp weiter')
	_('ungleich:')
	;######## If edx <> 0xFFFFFFFF Then
	_('mov dword[edi], 0x00000000')
	;################################# Endif
	_('weiter:')
	_('add edi,4') ;Nächster Pixel
	_('sub ecx, 1')
	_('ja _Schleife')
	_('ret ')
EndFunc   ;==>__ASM_Schrift_Faerben

Func _SchriftRes($px) ;Enthält die png Bilder der Schriften als Ressourcen.
	Switch $px
		Case 4
			Return '0x89504E470D0A1A0A0000000D49484452000000EC000000040100000000A5BFEE56000000874944415478DA017C0083FF00FEFEFFF9FF98FDFFFFFF99999FEFF8F8FFFF0006660BF996C3BD7EA4F000009989888921A8BD9999C299B693231ACF999B000FF90BF24F3CC3A5A4044000FA89EEBF21E8BB9FAE3296B6FC2C7F393FFD004F996B042F3CC3A5000E00009FFEF8F9F69F9BF8D9F2F6F92FFFF2FF1F1FF449FF0BF996C3BD7E00F4400A2C4763C17ADCEC0000000049454E44AE426082'
		Case 5
			Return '0x89504E470D0A1A0A0000000D49484452000001270000000501000000002F321765000000C94944415478DA01BE0041FF00FFFFEFFFF1FFE30DC7FFFFFFF8C6318FFDFFC3F0FFFFF0000A52815FC92AC0EFD7F9440000008C6118423120630AE6318C6048C6B1884410C21F8C6330001FFC4150265F21303A1544F908008DA11F7A1F207D0AD6318FFE48C6AEFFC5F7D3F10FE35000118C5D5F908A1E303A1400038000FC6118427120630ACE3F948248AAB1240500FC311C7F90009F8C4150493F21303A1400F908008FFFEFC3F1FBE3F8C7F0EC7E4F93F127FFFF93FF0FC3FF9091FFC15FA64AC0EFD7F80000002DA25C98C2B780160000000049454E44AE426082'
		Case 5.1
			Return '0x89504E470D0A1A0A0000000D49484452000001270000000501000000002F321765000000C74944415478DA63F869E0FFFFE18F4A3EF9FDF2FF3C267FEC51FED026FFFFE10706AEA0C6F8935A07DE5FFFE9C2C0C0D029E0C1C0C8E1C924B441C0C163927D8F92419B444BA200035F8963805ABCA28195A8CB4F0E86F5F77F31FFD7F464B7DAFFFDBFD7FF27FFFFDDFFFFADFDFF0706C19ED8F8095D720656220CCC0D0C1D811C758A20B3960832791C69E148163826D8922DC030BFC731C0D35E11A40A6856FFC7FFED0FFF9FFFFC7989A4FDFF3F2D1CF5FF8FFF6FC9FE3F6162F9C1F8655E4077FD003A0B00D70452C2FDB358190000000049454E44AE426082'
	EndSwitch
EndFunc   ;==>_SchriftRes

Func _Delete_Bitmap32($hDC, $hbmp) ;Modifiziert. Vorher war ReleaseDC
	_WinAPI_DeleteObject($hbmp)
	_WinAPI_DeleteDC($hDC)
EndFunc   ;==>_Delete_Bitmap32

Func _CreateNewBmp32($iWidth, $iHeight, ByRef $ptr, ByRef $hbmp) ;erstellt leere 32-bit-Bitmap; Rückgabe DC und ptr und handle auf die Bitmapdaten
	Local $hcdc = _WinAPI_CreateCompatibleDC(0) ;Desktop-Kompatiblen DeviceContext erstellen lassen
	Local $tBMI = DllStructCreate($tagBITMAPINFO) ;Struktur der Bitmapinfo erstellen und Daten eintragen
	DllStructSetData($tBMI, "Size", DllStructGetSize($tBMI) - 4);Structgröße abzüglich der Daten für die Palette
	DllStructSetData($tBMI, "Width", $iWidth)
	DllStructSetData($tBMI, "Height", -$iHeight) ;minus =standard = bottomup
	DllStructSetData($tBMI, "Planes", 1)
	DllStructSetData($tBMI, "BitCount", 32) ;32 Bit = 4 Bytes => AABBGGRR
	Local $adib = DllCall($h_GDI32_DLL, 'ptr', 'CreateDIBSection', 'hwnd', 0, 'ptr', DllStructGetPtr($tBMI), 'uint', $DIB_RGB_COLORS, 'ptr*', 0, 'ptr', 0, 'uint', 0)
	$hbmp = $adib[0] ;hbitmap handle auf die Bitmap, auch per GDI+ zu verwenden
	$ptr = $adib[4] ;pointer auf den Anfang der Bitmapdaten, vom Assembler verwendet
	_WinAPI_SelectObject($hcdc, $hbmp) ;objekt hbitmap in DC
	Return $hcdc ;DC der Bitmap zurückgeben
EndFunc   ;==>_CreateNewBmp32

Func _GDIPlus_ImageLoadFromHGlobal($hGlobal)
	Local $aResult = DllCall($h_OLE32_DLL, "int", "CreateStreamOnHGlobal", "handle", $hGlobal, "bool", True, "ptr*", 0)
	If @error Or $aResult[0] <> 0 Or $aResult[3] = 0 Then Return SetError(1, @error, 0)
	Local $hImage = _GDIPlus_ImageLoadFromStream($aResult[3])
	Local $error = @error
	Local $tVARIANT = DllStructCreate("word vt;word r1;word r2;word r3;ptr data; ptr")
	Local $aCall = DllCall($h_OLEAUT32_DLL, "long", "DispCallFunc", "ptr", $aResult[3], "dword", 8 + 8 * @AutoItX64, "dword", 4, "dword", 23, "dword", 0, "ptr", 0, "ptr", 0, "ptr", DllStructGetPtr($tVARIANT))
	If $error Then Return SetError(2, $error, 0)
	Return $hImage
EndFunc   ;==>_GDIPlus_ImageLoadFromHGlobal

Func _MemGlobalAllocFromBinary(Const $bBinary)
	Local $iLen = BinaryLen($bBinary)
	If $iLen = 0 Then Return SetError(1, 0, 0)
	Local $hMem = _MemGlobalAlloc($iLen, 0x0002)
	If @error Or Not $hMem Then Return SetError(2, 0, 0)
	DllStructSetData(DllStructCreate("byte[" & $iLen & "]", _MemGlobalLock($hMem)), 1, $bBinary)
	If @error Then
		_MemGlobalUnlock($hMem)
		_MemGlobalFree($hMem)
		Return SetError(3, 0, 0)
	EndIf
	_MemGlobalUnlock($hMem)
	Return $hMem
EndFunc   ;==>_MemGlobalAllocFromBinary

Func _MemGlobalAllocFromMem($pSource, $iLength)
	If Not $pSource Then Return SetError(1, 0, 0)
	If $iLength < 1 Then Return SetError(2, 0, 0)
	Local $hMem = _MemGlobalAlloc($iLength, 0x0002)
	If @error Or Not $hMem Then Return SetError(3, 0, 0)
	_MemMoveMemory($pSource, _MemGlobalLock($hMem), $iLength)
	_MemGlobalUnlock($hMem)
	Return $hMem
EndFunc   ;==>_MemGlobalAllocFromMem

#EndRegion Hilfsmittel
;EndRegion Hilfsmittel

#EndRegion - Image UDF (by Mars)
;EndRegion - Image UDF (by Mars)

Func _C($a, $b = 0) ;Gibt x/y Koords für ein Fenster damit es zentriert ist.
	If $b Then Return @DesktopWidth / 2 - $a / 2 ; Wenn b dann x
	Return @DesktopHeight / 2 - $a / 2 ; Sonst y
EndFunc   ;==>_C