;Coded by UEZ 2010/2011 - thanks to Ximorro for the idea with the bubbles ;-)
#AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
#AutoIt3Wrapper_UseX64=n
;~ #AutoIt3Wrapper_Icon=
#AutoIt3Wrapper_Res_Description=Simple downloader made with AutoIt
#AutoIt3Wrapper_Res_Fileversion=0.9.6.0
#AutoIt3Wrapper_Res_LegalCopyright=UEZ 2010/2011
#AutoIt3Wrapper_Res_Language=1033
#AutoIt3Wrapper_Res_Field=Coded by|UEZ
#AutoIt3Wrapper_Res_Field=Build|2011-01-24 Beta
#AutoIt3Wrapper_Res_Field=Compile date|%longdate% %time%
#AutoIt3Wrapper_Res_Field=AutoIt Version|%AutoItVer%
#AutoIt3Wrapper_UseUpx=y
#AutoIt3Wrapper_UPX_Parameters=--ultra-brute
#AutoIt3Wrapper_Run_Obfuscator=y
#Obfuscator_Parameters=/sf /sv /om /cs=0 /cn=0
#AutoIt3Wrapper_Run_After=del /f /q "%scriptdir%\%scriptfile%_Obfuscated.au3"

#NoTrayIcon
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>
#include <GuiStatusBar.au3>
#include <ProgressConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

Opt("GUIOnEventMode", 1)
Opt("MustDeclareVars", 1)
Opt("GUICloseOnESC", 0)

#region GUI
Global Const $width = 615, $height = 266
Global $hGUI = GUICreate("Tiny URL Downloader v0.96 Build 2011-01-24 by UEZ " & ChrW(9996), $width, $height)
WinSetTrans($hGUI,"", 0xFF);
Global $bg_color = "E0E0F0"
GUISetBkColor("0x" & $bg_color, $hGUI)
GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
Global $Input_URL = GUICtrlCreateInput("http://translation.autoit.de/autoitinfo/hilfedateien/AutoIt-Hilfe-Deutsch-3.3.6.1-Stand-07_09_10.zip", 64, 24, 497, 21)

GUICtrlSetTip(-1, "Type in any valid URL address (http://, https://, ftp://)!")
Global $Label1 = GUICtrlCreateLabel("URL:", 32, 27, 28, 14)
GUICtrlSetBkColor(-1, -2)
GUICtrlSetFont(-1, 9, 400, 1, "Arial")
Global $Start_DL = GUICtrlCreateButton("&Download", 64, 128, 75, 25)
GUICtrlSetOnEvent(-1, "Start_DL")
GUICtrlSetTip(-1, "Press Download button to start download")
Global $Stop_DL = GUICtrlCreateButton("&Cancel", 488, 128, 75, 25)
GUICtrlSetOnEvent(-1, "Stop_DL")
GUICtrlSetTip(-1, "Press Cancel button to stop download")
GUICtrlSetState(-1, $GUI_DISABLE)
Global $Exit = GUICtrlCreateButton("&Exit", 276, 128, 75, 25)
GUICtrlSetOnEvent(-1, "_Exit")
GUICtrlSetTip(-1, "Close program")
Global $Progress = GUICtrlCreateProgress(22, 182, 570, 32)
Global $StatusBar = _GUICtrlStatusBar_Create($hGUI)
_GUICtrlStatusBar_SetText($StatusBar, "Ready")
Global $aStatusBar = ControlGetPos("", "", $StatusBar)
Global $dh = $aStatusBar[3] ;get the heigth of the statusbar

Global $Input_Save_To = GUICtrlCreateInput(@ScriptDir, 64, 80, 410, 21)
Global $Label2 = GUICtrlCreateLabel("Save to:", 17, 82, 44, 17)
GUICtrlSetFont(-1, 9, 400, 1, "Arial")
GUICtrlSetBkColor($Label2, -2)
Global $Save_To = GUICtrlCreateButton("&Select Folder", 486, 78)
GUICtrlSetOnEvent(-1, "Select_Folder")
GUICtrlSetTip(-1, "Select a folder where you want to save the downloaded file (UNC path not supported yet!)")
Global $ContextMenu = GUICtrlCreateContextMenu()
Global $Submenu_Anim = GUICtrlCreateMenu("Animation", $ContextMenu)
Global $Anim_Start = GUICtrlCreateMenuItem("Start", $Submenu_Anim)
Global $Anim_Stop = GUICtrlCreateMenuItem("Stop", $Submenu_Anim)
Global $Anim_Seperator = GUICtrlCreateMenuItem("", $Submenu_Anim)
Global $Anim_Disable = GUICtrlCreateMenuItem("Disable", $Submenu_Anim)

GUICtrlSetState($Anim_Start, $GUI_CHECKED)
GUICtrlSetState($Anim_Stop, $GUI_UNCHECKED)
Global $Display_Anim = True
Global $Disable_Anim = False
GUICtrlSetOnEvent($Anim_Start, "Start_Anim")
GUICtrlSetOnEvent($Anim_Stop, "Stop_Anim")
GUICtrlSetOnEvent($Anim_Disable, "Disable_Anim")

;~ Global $Group = GuiCtrlCreateGroup("", 3, 5, $width - 6, 220,  BitOR($GUI_SS_DEFAULT_GROUP,$BS_FLAT))
;~ GUICtrlCreateGroup("", -99, -99, 1, 1)

;Pseudo group
Global $Lx = 10
Global $Ly = 8
Global $Lw = $width -  2 * $Lx
Global $Lh = $height - 34
Global $Line1 = GUICtrlCreateLabel("", $lx, $ly, $Lw, 1, $SS_SUNKEN)
Global $Line2 = GUICtrlCreateLabel("", $lx, $Lh - 2, $Lw, 1, $SS_SUNKEN)
Global $Line3 = GUICtrlCreateLabel("", $Lx, $ly, 1, $Lh - 9, $SS_SUNKEN)
Global $Line4 = GUICtrlCreateLabel("", $Lw + $Lx - 1, $ly, 1, $Lh - 9, $SS_SUNKEN)
Global $GText = GUICtrlCreateLabel("UEZ'11 ", $Lw - 2 * $Lx + 2, $Lh - 12, 25, 10, $SS_CENTER, $WS_EX_TOPMOST)
GUICtrlSetFont(-1, 6, 100, 0)
GUICtrlSetBkColor($GText, "0x" & $bg_color)
GUICtrlSetColor(-1, 0x000040)

GUISetState(@SW_SHOW)
ControlFocus($hGUI, "", $Start_DL)
#endregion

#region GDI+ init
_GDIPlus_Startup()
Global $i
Global Const $bubbles = 10, $max_speed = 5, $min_size = 30, $max_size = 70
Global $aData[$bubbles][6] ;x,y,vx,vy,size,bmp
For $i = 0 To $bubbles - 1
	$aData[$i][0] = Random(0, $width - $max_size, 1)
	$aData[$i][1] = Random(0, $height - $max_size, 1)
	$aData[$i][2] = _Random(-$max_speed, $max_speed, -1.5, 1.5) ;vx
	$aData[$i][3] = _Random(-$max_speed, $max_speed, -1.5, 1.5) ;vy
	$aData[$i][4] = Random($min_size, $max_size, 1) ;size
;~ 	$aData[$i][5] = _CreateBubbleBitmap($aData[$i][4], "0xA0" & Hex(Random(0xA0A0A0, 0xF0F0F0, 1), 6), "0xA0" & Hex(Random(0x808080, 0xF0F0F0, 1), 6)) ;handle to bitmap
	$aData[$i][5] = _CreateBubbleBitmap($aData[$i][4]) ;handle to bitmap
Next

Global $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
Global $hBitmap = _GDIPlus_BitmapCreateFromGraphics($width, $height, $hGraphic)
Global $hBackbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
Global $hBrush = _GDIPlus_BrushCreateSolid("0xFF" & $bg_color)
_GDIPlus_GraphicsClear($hBackbuffer, "0xFF" & $bg_color)

Global Const $GW_CHILD = 5, $GW_HWNDNEXT = 2
Global $hRegion = _GDIPlus_RegionCreateFromRect(_GDIPlus_RectFCreate(0, 0, $width, $height))
Global $hChild = _WinAPI_GetWindow($hGUI, $GW_CHILD)
Global $aRect

Do
	$aRect = ControlGetPos($hChild, "", 0)
	_GDIPlus_RegionCombineRect($hRegion, _GDIPlus_RectFCreate($aRect[0], $aRect[1], $aRect[2], $aRect[3]), 3)
	$hChild = _WinAPI_GetWindow($hChild, $GW_HWNDNEXT)
Until Not $hChild
_GDIPlus_GraphicsSetClipRegion($hGraphic, $hRegion)
_GDIPlus_RegionDispose($hRegion)

;~ AdlibRegister("Start_Animation", 50)
GUIRegisterMsg(0x0113, "Start_Animation") ;$WM_TIMER = 0x0113
DllCall("User32.dll", "int", "SetTimer", "hwnd", $hGUI, "int", 0, "int", 50, "int", 0) ;set GUIRegisterMsg($WM_TIMER, "Draw") timer
#endregion GDI+ init

Global $hDownload, $nBytes, $nRead, $nSize, $calc, $file, $url, $current
Global $speed = 0
Global $prog = 0
Global $stop = 0

While Sleep(0x7FFFFF)
WEnd

Func Disable_Anim()
	$Display_Anim = False
	$Disable_Anim = True
	GUICtrlSetState($Anim_Start, $GUI_UNCHECKED)
	GUICtrlSetState($Anim_Stop, $GUI_UNCHECKED)
	GUICtrlSetState($Anim_Disable, $GUI_CHECKED)
EndFunc   ;==>Disable_Anim

Func Start_Anim()
	$Display_Anim = True
	$Disable_Anim = False
	GUICtrlSetState($Anim_Start, $GUI_CHECKED)
	GUICtrlSetState($Anim_Stop, $GUI_UNCHECKED)
	GUICtrlSetState($Anim_Disable, $GUI_UNCHECKED)
EndFunc   ;==>Start_Anim

Func Stop_Anim()
	$Display_Anim = False
	$Disable_Anim = False
	GUICtrlSetState($Anim_Start, $GUI_UNCHECKED)
	GUICtrlSetState($Anim_Stop, $GUI_CHECKED)
	GUICtrlSetState($Anim_Disable, $GUI_UNCHECKED)
EndFunc   ;==>Stop_Anim

Func _Random($min, $max, $emin, $emax, $int = 0)
	Local $r1 = Random($min, $emin, $int)
	Local $r2 = Random($emax, $max, $int)
	If Random(0, 1, 1) Then Return $r1
	Return $r2
EndFunc   ;==>_Random

Func Select_Folder()
	Local $folder = FileSelectFolder("Select a folder", "", 5)
	If @error Or StringMid($folder, 2, 2) <> ":\" Then Return
	GUICtrlSetData($Input_Save_To, $folder)
EndFunc   ;==>Select_Folder

Func Start_DL()
	Local $mc = MouseGetCursor()
	$url = GUICtrlRead($Input_URL)
	$file = GUICtrlRead($Input_Save_To)
	If $url <> "" And $file <> "" Then
		GUISetOnEvent($GUI_EVENT_CLOSE, "")
		Disable_Buttons()
		GUISetCursor(15, 0, $hGUI)
		Sleep(100)
		$nSize = InetGetSize($url)
		If $nSize < 1 Then
			GUISetCursor($mc, 0, $hGUI)
			Enable_Buttons()
			GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
			MsgBox(16, "Error", "Unable to get file size from server!" & @CRLF & @CRLF & "Check URL or maybe server down!", 15)
			Return
		EndIf
		GUISetCursor($mc, 0, $hGUI)
		$file &= "\" & StringRight($url, StringLen($url) - StringInStr($url, "/", 0, -1)) & ".tmp"
		$hDownload = InetGet($url, $file, 1, 1)
		AdlibRegister("DL_Check", 50)
		$current = 0
		AdlibRegister("DL_Speed", 1000)
	EndIf
EndFunc   ;==>Start_DL

Func DL_Check()
	Local $msg
	If InetGetInfo($hDownload, 2) Or $stop Then
		InetClose($hDownload)
		Enable_Buttons()
		AdlibUnRegister("DL_Check")
		AdlibUnRegister("DL_Speed")
		If $stop Then
			$msg = MsgBox(4 + 48, "Warning", "Download was cancelled!" & @LF & @LF & _
													  " Delete incomplete file?", 20)
			Switch $msg
				Case -1, 6
					FileDelete($file)
					If @error Then $msg = MsgBox(16, "Error", "Unable to delete file, maybe locked by another process!" & @CRLF & _
																							  "Check manually!", 20)
		  EndSwitch
		  GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
		Else
			GUICtrlSetData($Progress, 100)
			_GUICtrlStatusBar_SetText($StatusBar, $nSize & " / " & $nSize & " bytes (100 % @ " & $speed & " kb/s)")
			Sleep(500)
			FileMove($file, StringLeft($file, StringLen($file) - 4), 9)
			MsgBox(0, "Information", "Download completed!", 20)
			GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
		EndIf
		$stop = 0
		GUICtrlSetData($Progress, 0)
		_GUICtrlStatusBar_SetText($StatusBar, "Ready")
	Else
		$nRead = InetGetInfo($hDownload, 0)
		$calc = Int(100 * $nRead / $nSize)
		GUICtrlSetData($Progress, $calc)
		_GUICtrlStatusBar_SetText($StatusBar, $nRead & " / " & $nSize & " bytes (" & $calc & " % @ " & $speed & " kb/s)")
	EndIf
EndFunc   ;==>DL_Check

Func Enable_Buttons()
	GUICtrlSetState($Start_DL, $GUI_ENABLE)
	GUICtrlSetState($Stop_DL, $GUI_DISABLE)
	GUICtrlSetState($Exit, $GUI_ENABLE)
	GUICtrlSetState($Input_Save_To, $GUI_ENABLE)
	GUICtrlSetState($Input_URL, $GUI_ENABLE)
	GUICtrlSetState($Save_To, $GUI_ENABLE)
EndFunc   ;==>Enable_Buttons

Func Disable_Buttons()
	GUICtrlSetState($Start_DL, $GUI_DISABLE)
	GUICtrlSetState($Exit, $GUI_DISABLE)
	GUICtrlSetState($Input_Save_To, $GUI_DISABLE)
	GUICtrlSetState($Input_URL, $GUI_DISABLE)
	GUICtrlSetState($Save_To, $GUI_DISABLE)
	GUICtrlSetState($Stop_DL, $GUI_ENABLE)
EndFunc   ;==>Disable_Buttons

Func DL_Speed()
	$speed = Round(($nRead - $current) / 1024, 2)
	$current = $nRead
EndFunc   ;==>DL_Speed

Func Stop_DL()
	$stop = 1
EndFunc   ;==>Stop_DL

Func _Exit()
	InetClose($hDownload)
	Close_GDIplus()
	GUIDelete($hGUI)
	Exit
EndFunc   ;==>_Exit

#region GDI+
Func Start_Animation()
	Local $j
	;draw bubbles
	If $Disable_Anim Then _GDIPlus_GraphicsClear($hGraphic, "0xFF" & $bg_color)
	If $Display_Anim Then
;~ 		_GDIPlus_GraphicsClear($hBackbuffer, "0xFF" & $bg_color)
		_GDIPlus_GraphicsFillRect($hBackbuffer, 0, 0, $width, $height, $hBrush)
		For $j = 0 To $bubbles - 1
			_GDIPlus_GraphicsDrawImage($hBackbuffer, $aData[$j][5], $aData[$j][0], $aData[$j][1])
		Next
		;calculate new position incl. border collision check
		For $j = 0 To $bubbles - 1
			$aData[$j][0] += $aData[$j][2] ;increase x coordinate with appropriate slope
			$aData[$j][1] += $aData[$j][3] ;increase y coordinate with appropriate slope
			If $aData[$j][0] <= 0 Then ;border collision x left
				$aData[$j][0] = 1
				$aData[$j][2] *= -1
			ElseIf $aData[$j][0] >= $width - $aData[$j][4] Then ;border collision x right
				$aData[$j][0] = $width - ($aData[$j][4] + 1)
				$aData[$j][2] *= -1
			EndIf
			If $aData[$j][1] <= 0 Then ;border collision y top
				$aData[$j][1] = 1
				$aData[$j][3] *= -1
			ElseIf $aData[$j][1] >= $height - $aData[$j][4] - $dh Then ;border collision y bottom
				$aData[$j][1] = $height - ($aData[$j][4] + 1) - $dh
				$aData[$j][3] *= -1
			EndIf
		Next
		Collision_Check()
	EndIf
	If Not $Disable_Anim Then _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $width, $height)
EndFunc   ;==>Start_Animation

Func Collision_Check() ;0:x, 1:y, 2:vx, 3:vy, 4:size, 5:bmp
	Local $Delta_X, $Delta_Y, $Distance, $Matrix11, $Matrix12, $Matrix21, $Matrix22, $Vp1, $Vp2, $Vs1, $Vs2
	For $i = 0 To $bubbles - 1
		For $j = $i + 1 To $bubbles - 1
			If Pixel_Distance($aData[$i][0], $aData[$i][1], $aData[$j][0], $aData[$j][1]) < ($aData[$i][4] + $aData[$j][4]) / 2 Then
				 $Delta_X = $aData[$i][0] - $aData[$j][0]
				 $Delta_Y = $aData[$i][1] - $aData[$j][1]
				 $Distance = Sqrt($Delta_X * $Delta_X + $Delta_Y * $Delta_Y)

				 $Matrix11 = $Delta_X / $Distance
				 $Matrix12 = -$Delta_Y / $Distance
				 $Matrix21 = $Delta_Y / $Distance
				 $Matrix22 = $Delta_X / $Distance

				 $Vp1 = $aData[$i][2] * $Matrix11 + $aData[$i][3] * - $Matrix12
				 $Vs1 = $aData[$i][2] * - $Matrix21 + $aData[$i][3] * $Matrix22
				 $Vp2 = $aData[$j][2] * $Matrix11 + $aData[$j][3] * - $Matrix12
				 $Vs2 = $aData[$j][2] * - $Matrix21 + $aData[$j][3] * $Matrix22

				If $Vp1 - $Vp2 < 0 Then
					$aData[$i][2] = $Matrix11 + $Vs1 * $Matrix12
					$aData[$i][3] = $Matrix21 + $Vs1 * $Matrix22
					$aData[$j][2] = $Matrix11 + $Vs2 * $Matrix12
					$aData[$j][3] = $Matrix21 + $Vs2 * $Matrix22
				EndIf
			EndIf
		Next
	Next
EndFunc   ;==>Collision_Check

Func Pixel_Distance($x1, $y1, $x2, $y2) ;Pythagoras theorem
	Local $a, $b
	If $x2 = $x1 And $y2 = $y1 Then Return 0
	$a = $y2 - $y1
	$b = $x2 - $x1
	Return Sqrt($a * $a + $b * $b)
EndFunc   ;==>Pixel_Distance

Func Close_GDIplus()
;~ 	AdlibUnRegister("Start_Animation")
	GUIRegisterMsg(0x0113, "")
	_GDIPlus_BrushDispose($hBrush)
	For $i = 0 To $bubbles - 1
		_GDIPlus_BitmapDispose($aData[$i][5])
	Next
	_GDIPlus_GraphicsDispose($hBackbuffer)
	_GDIPlus_BitmapDispose($hBitmap)
	_GDIPlus_GraphicsDispose($hGraphic)
	_GDIPlus_Shutdown()
EndFunc   ;==>Close_GDIplus

Func _CreateBubbleBitmap($size = 75, $gradient_start = 0xA0F0C0C0, $gradient_end = 0xA0C0F0C0, $angle1 = 90, $angle2 = 45, $pen1 = 0x55AAAAAF, $pen2 = 0x50FFFFFF)
	Local $ps1 = 2, $ps2 = Int($size / 12)
	Local $hBitmap = _GDIPlus_BitmapCreateFromScan0($size, $size)
	Local $hContext = _GDIPlus_ImageGetGraphicsContext($hBitmap)
	_GDIPlus_GraphicsSetSmoothingMode($hContext, 2)
	Local $Pen_Border = _GDIPlus_PenCreate($pen1, $ps1)
	Local $Pen_Reflection = _GDIPlus_PenCreate($pen2, $ps2)
	Local $Brush_Gradient = _GDIPlus_CreateLineBrush(0, 0, $size, $size, $gradient_start, $gradient_end)
	_GDIPlus_GraphicsFillEllipse($hContext, 0, 0, $size, $size, $Brush_Gradient)
	_GDIPlus_GraphicsDrawArc($hContext, $size / 3, $size / 5, $size / 2, $size / 2, 10, -$angle1, $Pen_Reflection)
	_GDIPlus_GraphicsDrawArc($hContext, $size / 6, $size / 3.5, $size / 2, $size / 2, -210, -$angle2, $Pen_Reflection)
	_GDIPlus_GraphicsDrawEllipse($hContext, 0, 0, $size - $ps1, $size - $ps1, $Pen_Border)
	_GDIPlus_PenDispose($Pen_Border)
	_GDIPlus_PenDispose($Pen_Reflection)
	_GDIPlus_BrushDispose($Brush_Gradient)
	_GDIPlus_GraphicsDispose($hContext)
	Return $hBitmap
EndFunc   ;==>_CreateBubbleBitmap

Func _GDIPlus_BitmapCreateFromScan0($iWidth, $iHeight, $iStride = 0, $iPixelFormat = 0x0026200A, $pScan0 = 0)
	Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $iWidth, "int", $iHeight, "int", $iStride, "int", $iPixelFormat, "ptr", $pScan0, "int*", 0)
	If @error Then Return SetError(@error, @extended, 0)
	Return $aResult[6]
EndFunc   ;==>_GDIPlus_BitmapCreateFromScan0

Func _GDIPlus_CreateLineBrush($iPoint1X, $iPoint1Y, $iPoint2X, $iPoint2Y, $iArgb1 = 0xFF0000FF, $iArgb2 = 0xFFFF0000, $WrapMode = 0)
	Local $tPoint1, $pPoint1, $tPoint2, $pPoint2, $aRet
	If $iArgb1 = "" Then $iArgb1 = 0xFF0000FF
	If $iArgb2 = "" Then $iArgb2 = 0xFFFF0000
	If $WrapMode = -1 Then $WrapMode = 0
	$tPoint1 = DllStructCreate("float X;float Y")
	$pPoint1 = DllStructGetPtr($tPoint1)
	DllStructSetData($tPoint1, "X", $iPoint1X)
	DllStructSetData($tPoint1, "Y", $iPoint1Y)
	$tPoint2 = DllStructCreate("float X;float Y")
	$pPoint2 = DllStructGetPtr($tPoint2)
	DllStructSetData($tPoint2, "X", $iPoint2X)
	DllStructSetData($tPoint2, "Y", $iPoint2Y)
	$aRet = DllCall($ghGDIPDll, "int", "GdipCreateLineBrush", "ptr", $pPoint1, "ptr", $pPoint2, "int", $iArgb1, "int", $iArgb2, "int", $WrapMode, "int*", 0)
	Return $aRet[6]
EndFunc   ;==>_GDIPlus_CreateLineBrush

Func _GDIPlus_GraphicsSetClipRegion($hGraphics, $hRegion, $iCombineMode = 0)
	Local $aResult = DllCall($ghGDIPDll, "uint", "GdipSetClipRegion", "hwnd", $hGraphics, "hwnd", $hRegion, "int", $iCombineMode)
	If @error Then Return SetError(@error, @extended, False)
	Return $aResult[0] = 0
EndFunc   ;==>_GDIPlus_GraphicsSetClipRegion

Func _GDIPlus_RegionCreateFromRect($tRectF)
	Local $pRectF, $aResult
	$pRectF = DllStructGetPtr($tRectF)
	$aResult = DllCall($ghGDIPDll, "uint", "GdipCreateRegionRect", "ptr", $pRectF, "int*", 0)
	If @error Then Return SetError(@error, @extended, 0)
	Return $aResult[2]
EndFunc   ;==>_GDIPlus_RegionCreateFromRect

Func _GDIPlus_RegionCombineRect($hRegion, $tRectF, $iCombineMode = 2)
	Local $pRectF, $aResult
	$pRectF = DllStructGetPtr($tRectF)
	$aResult = DllCall($ghGDIPDll, "uint", "GdipCombineRegionRect", "hwnd", $hRegion, "ptr", $pRectF, "int", $iCombineMode)
	If @error Then Return SetError(@error, @extended, False)
	Return $aResult[0] = 0
EndFunc   ;==>_GDIPlus_RegionCombineRect

Func _GDIPlus_RegionDispose($hRegion)
	Local $aResult = DllCall($ghGDIPDll, "uint", "GdipDeleteRegion", "hwnd", $hRegion)
	If @error Then Return SetError(@error, @extended, False)
	Return $aResult[0] = 0
EndFunc   ;==>_GDIPlus_RegionDispose
#endregion GDI+