;the Hilfiker / MobaTime Swiss Railway Clock
;coded by UEZ build 2018-03-01
;thanks to Eukalyptus for the _CreateBrushedAluminum() function!
#Pragma Compile(Icon, "GDI+ Swiss Railway Clock.ico")
#AutoIt3Wrapper_Run_Au3Stripper=y
#Au3Stripper_Parameters=/so /pe /rm
#AutoIt3Wrapper_Run_After=del /f /q "%scriptdir%\%scriptfile%_stripped.au3"
#AutoIt3Wrapper_UseX64=n
Break(0)
#include <GDIPlus.au3>
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
ProcessSetPriority(@AutoItPID, $PROCESS_LOW)
_GDIPlus_Startup()
Global $hGUI, $iFPS = 0, $iShowFPS = 0, $bExit
Global Const $iW = 512, $iH = $iW, $iWh = $iW / 2, $iHh = $iH / 2, $sTitle = "GDI+ Swiss Railway Clock v1.1"
Global Const $fRad = ACos(-1) / 180, $fDeg = 180 / ACos(-1), $iTimer = 30, $fDeltaShadow = $iW * 0.020
Global $hDC, $hCanvas, $hBitmap_Clock, $hBrush_Shadow, $hBrush_Update, $hPen_Update, $fDiameter = $iW, $hDC_backbuffer, $fShadowAngle, $fMin_next, _
$fRadius = $fDiameter / 2, $fSec, $fMin, $fHr, $fAmplitude = 3
AutoItSetOption("GUIOnEventMode", 1)
GDIPlus_SwissRailwayClock()
AutoItSetOption("GUIOnEventMode", 0)
_GDIPlus_Shutdown()
Func GDIPlus_SwissRailwayClock()
$bExit = False
$hGUI = GUICreate($sTitle, $iW + $fDeltaShadow, $iH + $fDeltaShadow, -1, -1, -1, $WS_EX_TOPMOST)
GUISetBkColor(0xFFFFFF, $hGUI)
GUISetState(@SW_SHOW, $hGUI)
;~ GUISetCursor(16, 1)
;create canvas elements
$hDC = _WinAPI_GetDC($hGUI)
Local Const $hHBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $iW + $fDeltaShadow, $iH + $fDeltaShadow)
$hDC_backbuffer = _WinAPI_CreateCompatibleDC($hDC)
Local Const $DC_obj = _WinAPI_SelectObject($hDC_backbuffer, $hHBitmap)
$hCanvas = _GDIPlus_GraphicsCreateFromHDC($hDC_backbuffer)
$hBrush_Shadow = _GDIPlus_BrushCreateSolid(0x14A0A0A0)
$hPen_Update = _GDIPlus_PenCreate(0xFFA02020)
$hBrush_Update = _GDIPlus_BrushCreateSolid(0)
_GDIPlus_GraphicsSetSmoothingMode($hCanvas, $GDIP_SMOOTHINGMODE_HIGHQUALITY)
_GDIPlus_GraphicsSetPixelOffsetMode($hCanvas, $GDIP_PIXELOFFSETMODE_HIGHQUALITY)
$fDiameter = $fDiameter < 128 ? 128 : $fDiameter > 1024 ? 1024 : $fDiameter
$hBitmap_Clock = GenerateClockBg($fDiameter)
GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit_About")
$fMin_next = @MIN
GUIRegisterMsg($WM_TIMER, "Draw") ;$WM_TIMER = 0x0113
Local $iID = DllCall("User32.dll", "uint_ptr", "SetTimer", "hwnd", $hGUI, "uint_ptr", 1, "uint", $iTimer, "ptr", 0)[0]
Do
If $bExit Then ExitLoop
Until Not Sleep(100)
;release resources
GUIRegisterMsg($WM_TIMER, "")
DllCall("user32.dll", "bool", "KillTimer", "hwnd", $hGUI, "uint_ptr", $iID)
_GDIPlus_PenDispose($hPen_Update)
_GDIPlus_BrushDispose($hBrush_Shadow)
_GDIPlus_BrushDispose($hBrush_Update)
_GDIPlus_GraphicsDispose($hCanvas)
_WinAPI_SelectObject($hDC_backbuffer, $DC_obj)
_WinAPI_DeleteDC($hDC_backbuffer)
_WinAPI_DeleteObject($hHBitmap)
_WinAPI_ReleaseDC($hGUI, $hDC)
GUIDelete($hGUI)
EndFunc ;==>GDIPlus_SwissRailwayClock
Func Draw($hWnd, $iMsg, $wParam, $lParam)
#forceref $hWnd, $iMsg, $wParam, $lParam
_GDIPlus_GraphicsDrawImageRect($hCanvas, $hBitmap_Clock, 0, 0, $fDiameter + $fDeltaShadow, $fDiameter + $fDeltaShadow)
UpdateClock($hCanvas, $fDiameter)
_WinAPI_BitBlt($hDC, 0, 0, $iW + $fDeltaShadow, $iH + $fDeltaShadow, $hDC_backbuffer, 0, 0, $SRCCOPY)
EndFunc
Func _Exit_About()
$bExit = True
EndFunc ;==>_Exit_About
Func UpdateClock($hGfx, $fDiameter)
Static $bBounce = 0, $f = 0
Local $m1 = $fDiameter * 0.015
;hour
$fHr = 30 * (@HOUR + @MIN / 60)
_GDIPlus_GraphicsTranslateTransform($hGfx, $fRadius, $fRadius)
_GDIPlus_GraphicsRotateTransform($hGfx, $fHr)
_GDIPlus_GraphicsTranslateTransform($hGfx, -$fRadius, -$fRadius)
Local $iWidth1 = $fDiameter * 0.0375, _
$iHeight1 = $fDiameter / 2.5, _
$iWidth12 = $iWidth1 / 2, _
$fPosY = $fDiameter * 0.2, $iWidth2, $iWidth22, $fPosY2
_GDIPlus_BrushSetSolidColor($hBrush_Update, 0xFF101010)
DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hGfx, "handle", $hBrush_Shadow, _
"float", $fRadius - $iWidth12 + Cos(($fShadowAngle - $fHr) * $fRad) * $m1, _
"float", $fPosY + Sin(($fShadowAngle - $fHr) * $fRad) * $m1, _
"float", $iWidth1, "float", $iHeight1)
DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hGfx, "handle", $hBrush_Update, _
"float", $fRadius - $iWidth12, _
"float", $fPosY, _
"float", $iWidth1, "float", $iHeight1)
_GDIPlus_GraphicsResetTransform($hGfx)
;min
If $fMin_next <> @MIN Then $bBounce = 1
Switch $bBounce
Case 1
$fMin = (6 * Mod(($fMin_next + 1), 60)) + Sin($f * 1.9) * $fAmplitude
If $fAmplitude = 0 Then
$fMin_next = @MIN
$f = 0
$fAmplitude = 3
$bBounce = 0
Else
$fAmplitude -= 0.5
$fAmplitude = $fAmplitude <= 0 ? 0 : $fAmplitude
$f += 1
EndIf
Case Else
$fMin = (6 * @MIN)
EndSwitch
_GDIPlus_GraphicsTranslateTransform($hGfx, $fRadius, $fRadius)
_GDIPlus_GraphicsRotateTransform($hGfx, $fMin)
_GDIPlus_GraphicsTranslateTransform($hGfx, -$fRadius, -$fRadius)
$iWidth1 = $fDiameter * 0.03
$iHeight1 = $fRadius
$iWidth12 = $iWidth1 / 2
$fPosY = $fDiameter * 0.1
DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hGfx, "handle", $hBrush_Shadow, _
"float", $fRadius - $iWidth12 + Cos(($fShadowAngle - $fMin) * $fRad) * $m1, _
"float", $fPosY + Sin(($fShadowAngle - $fMin) * $fRad) * $m1, _
"float", $iWidth1, "float", $iHeight1)
DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hGfx, "handle", $hBrush_Update, _
"float", $fRadius - $iWidth12, _
"float", $fPosY, _
"float", $iWidth1, "float", $iHeight1)
_GDIPlus_GraphicsResetTransform($hGfx)
;sec
$fSec = 6 * (@SEC * 1.02564 + @MSEC / 1000)
If $fSec >= 360 Then $fSec = 0
_GDIPlus_GraphicsTranslateTransform($hGfx, $fRadius, $fRadius)
_GDIPlus_GraphicsRotateTransform($hGfx, $fSec)
_GDIPlus_GraphicsTranslateTransform($hGfx, -$fRadius, -$fRadius)
$fPosY = $fDiameter * 0.27
$fPosY2 = $fDiameter * 0.19
$iWidth1 = $fDiameter * 0.0095
$iHeight1 = $fRadius * 1.3 - $fPosY
$iWidth12 = $iWidth1 / 2
$iWidth2 = $fDiameter * 0.083333
$iWidth22 = $iWidth2 / 2
;shadow seconds
DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hGfx, "handle", $hBrush_Shadow, _
"float", $fRadius + Cos(($fShadowAngle - $fSec) * $fRad) * $m1, _
"float", $fPosY + Sin(($fShadowAngle - $fSec) * $fRad) * $m1, _
"float", $iWidth1 + $fDiameter * 0.006667, "float", $iHeight1 + $fDiameter * 0.006667)
DllCall($__g_hGDIPDll, "int", "GdipFillEllipse", "handle", $hGfx, "handle", $hBrush_Shadow, _
"float", $fRadius - $iWidth22 + Cos(($fShadowAngle - $fSec) * $fRad) * $m1, _
"float", $fPosY2 + Sin(($fShadowAngle - $fSec) * $fRad) * $m1, _
"float", $iWidth2, "float", $iWidth2)
;seconds
_GDIPlus_BrushSetSolidColor($hBrush_Update, 0xFFC01010)
DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hGfx, "handle", $hBrush_Update, _
"float", $fRadius - $iWidth12, _
"float", $fPosY, _
"float", $iWidth1, "float", $iHeight1)
DllCall($__g_hGDIPDll, "int", "GdipFillEllipse", "handle", $hGfx, "handle", $hBrush_Update, _
"float", $fRadius - $iWidth22, _
"float", $fPosY2, _
"float", $iWidth2, "float", $iWidth2)
_GDIPlus_GraphicsResetTransform($hGfx)
;button in the center
DllCall($__g_hGDIPDll, "int", "GdipFillEllipse", "handle", $hGfx, "handle", $hBrush_Update, _
"float", $fRadius - $iWidth1, _
"float", $fRadius - $iWidth1, _
"float", 2 * $iWidth1, "float", 2 * $iWidth1)
DllCall($__g_hGDIPDll, "int", "GdipDrawEllipse", "handle", $hGfx, "handle", $hPen_Update, _
"float", $fRadius - $iWidth1, _
"float", $fRadius - $iWidth1, _
"float", 2 * $iWidth1, "float", 2 * $iWidth1)
EndFunc
Func GenerateClockBg($fDiameter)
Local Const $hBitmap = _GDIPlus_BitmapCreateFromScan0($fDiameter + $fDeltaShadow, $fDiameter + $fDeltaShadow), $hGfx = _GDIPlus_ImageGetGraphicsContext($hBitmap), _
$hBrush = _GDIPlus_BrushCreateSolid(0xFF000000), $fBorderSize = $fDiameter * 0.03333, _
$hEffect = _GDIPlus_EffectCreateBlur($fDiameter / 50, 0), $hPen = _GDIPlus_PenCreate(0xA0000000, $fBorderSize)
_GDIPlus_GraphicsSetSmoothingMode($hGfx, 4)
_GDIPlus_GraphicsSetPixelOffsetMode($hGfx, 4)
_GDIPlus_GraphicsSetTextRenderingHint($hGfx, 4)
_GDIPlus_GraphicsClear($hGfx, 0xFFFFFFFF)
Local Const $fSize = $fDiameter * 0.95 - $fBorderSize / 2
Local $fShadow_vx = $fDiameter * 0.0095, $fShadow_vy = $fDiameter * 0.01
$fShadowAngle = ATan($fShadow_vy / $fShadow_vx) * $fDeg
If $fShadow_vx < 0 And $fShadow_vy >= 0 Then $fShadowAngle += 180
If $fShadow_vx < 0 And $fShadow_vy < 0 Then $fShadowAngle -= 180
_GDIPlus_GraphicsDrawEllipse($hGfx, $fBorderSize + $fShadow_vx, $fBorderSize + $fShadow_vy, $fSize, $fSize, $hPen)
_GDIPlus_BitmapApplyEffect($hBitmap, $hEffect)
_GDIPlus_PenSetColor($hPen, 0xF0000000)
Local Const $hBitmap_Texture = _CreateBrushedAluminum($fDiameter, $fDiameter, $fShadowAngle)
Local Const $hTexture = _GDIPlus_TextureCreate($hBitmap_Texture)
DllCall($__g_hGDIPDll, "int", "GdipSetPenBrushFill", "ptr", $hPen, "ptr", $hTexture)
_GDIPlus_GraphicsDrawEllipse($hGfx, $fBorderSize, $fBorderSize, $fSize, $fSize, $hPen)
_GDIPlus_GraphicsTranslateTransform($hGfx, $fRadius, $fRadius)
_GDIPlus_GraphicsRotateTransform($hGfx, -6)
_GDIPlus_GraphicsTranslateTransform($hGfx, -$fRadius, -$fRadius)
Local $iWidth1 = $fDiameter * 0.026667, $iHeight1 = $fDiameter / 10, $iWidth12 = $iWidth1 / 2, $fPosY = $fDiameter * 0.083333, _
$iWidth2 = $fDiameter * 0.013333, $iHeight2 = $fDiameter * 0.0416667, $iWidth22 = $iWidth2 / 2
For $i = 0 to 59
_GDIPlus_GraphicsTranslateTransform($hGfx, $fRadius, $fRadius)
_GDIPlus_GraphicsRotateTransform($hGfx, 6)
_GDIPlus_GraphicsTranslateTransform($hGfx, -$fRadius, -$fRadius)
Switch Mod($i, 5)
Case 0
_GDIPlus_GraphicsFillRect($hGfx, $fRadius - $iWidth12, $fPosY, $iWidth1, $iHeight1, $hBrush)
Case Else
_GDIPlus_GraphicsFillRect($hGfx, $fRadius - $iWidth22, $fPosY, $iWidth2, $iHeight2, $hBrush)
EndSwitch
Next
_GDIPlus_GraphicsResetTransform($hGfx)
Local Const $hBitmap_Logo = _GDIPlus_BitmapCreateFromMemory(_Au3_Icon())
Local Const $hBitmap_Logo_Scaled = _GDIPlus_ImageResize($hBitmap_Logo, $fDiameter * 0.08, $fDiameter * 0.08)
Local $aDim = _GDIPlus_ImageGetDimension($hBitmap_Logo_Scaled)
_GDIPlus_GraphicsDrawImageRect($hGfx, $hBitmap_Logo_Scaled, $fRadius - $aDim[0] / 2, $fRadius / 1.75, $aDim[0], $aDim[1])
_GDIPlus_ImageDispose($hBitmap_Logo)
_GDIPlus_ImageDispose($hBitmap_Logo_Scaled)
Local Const $hFamily = _GDIPlus_FontFamilyCreate("Segoe Script"), $hFont = _GDIPlus_FontCreate($hFamily, $fDiameter * 0.025), $hFormat = _GDIPlus_StringFormatCreate()
_GDIPlus_StringFormatSetAlign($hFormat, 1)
_GDIPlus_StringFormatSetLineAlign($hFormat, 1)
;~ _GDIPlus_BrushSetSolidColor($hBrush, 0xFF400000)
_GDIPlus_GraphicsDrawStringEx($hGfx, "Clock by" & @CRLF & "MLK", $hFont, _GDIPlus_RectFCreate($fRadius - $fRadius * 0.2, $fRadius + $fRadius * 0.2, $fRadius * 0.4, $fRadius * 0.4), $hFormat, $hBrush)
_GDIPlus_ImageDispose($hBitmap_Texture)
_GDIPlus_BrushDispose($hTexture)
_GDIPlus_FontDispose($hFont)
_GDIPlus_FontFamilyDispose($hFamily)
_GDIPlus_StringFormatDispose($hFormat)
_GDIPlus_EffectDispose($hEffect)
_GDIPlus_PenDispose($hPen)
_GDIPlus_BrushDispose($hBrush)
_GDIPlus_GraphicsDispose($hGfx)
Return $hBitmap
EndFunc
Func _CreateBrushedAluminum($iW, $iH, $fLightAngle = 40, $iBlurDist = 12, $fBlurTrans = 0.6666, $fRed = 0.8, $fGreen = 0.9, $fBlue = 1, $iLightColor = 0xF0FFFFFF, $fLightSigma = 0.5, $fLightScale = 0.83) ;coded by Eukalyptus!
$iBlurDist = Ceiling($iBlurDist)
$iBlurDist += 1 - Mod($iBlurDist, 2)
Local $iOverSize = 0
For $i = 1 To $iBlurDist Step 2
$iOverSize += $i + $i + 1
Next
Local $iWO = $iW + $iOverSize
;=========================================
; Add Noise
;=========================================
Local $iNoiseSize = 40
Local $hBmp_Noise = _GDIPlus_BitmapCreateFromScan0($iNoiseSize, $iNoiseSize)
Local $hGfx_Noise = _GDIPlus_ImageGetGraphicsContext($hBmp_Noise)
Local $tData = _GDIPlus_BitmapLockBits($hBmp_Noise, 0, 0, $iNoiseSize, $iNoiseSize, BitOR($GDIP_ILMREAD, $GDIP_ILMWRITE), $GDIP_PXF32ARGB)
Local $iStride = DllStructGetData($tData, "Stride")
Local $iWidth = DllStructGetData($tData, "Width")
Local $iHeight = DllStructGetData($tData, "Height")
Local $pScan0 = DllStructGetData($tData, "Scan0")
Local $tPixel = DllStructCreate("dword[" & $iWidth * $iHeight & "];", $pScan0)
Local $iAmp
For $row = 0 To $iHeight - 1
For $col = 0 To $iWidth - 1
$iAmp = Random(0, 0xFF, 1)
DllStructSetData($tPixel, 1, BitOR(0xFF000000, BitShift($iAmp, -16), BitShift($iAmp, -8), $iAmp), $row * $iWidth + $col + 1)
Next
Next
_GDIPlus_BitmapUnlockBits($hBmp_Noise, $tData)
;=========================================
; Create Full NoiseBitmap
;=========================================
Local $hBmp_Full = _GDIPlus_BitmapCreateFromScan0($iWO, $iH)
Local $hGfx_Full = _GDIPlus_ImageGetGraphicsContext($hBmp_Full)
_GDIPlus_GraphicsSetSmoothingMode($hGfx_Full, 4)
_GDIPlus_GraphicsSetInterpolationMode($hGfx_Full, 3)
Local $iXOff, $iYOff, $iSizeX, $iSizeY
For $y = 0 To $iH Step $iNoiseSize / 2
For $x = 0 To $iWO Step $iNoiseSize / 2
$iXOff = Random(0, $iNoiseSize / 2, 1)
$iYOff = Random(0, $iNoiseSize / 2, 1)
$iSizeX = $iNoiseSize - $iXOff
$iSizeY = $iNoiseSize - $iYOff
_GDIPlus_GraphicsDrawImageRectRect($hGfx_Full, $hBmp_Noise, $iXOff, $iYOff, $iSizeX, $iSizeY, $x, $y, $iSizeX, $iSizeY)
Next
Next
_GDIPlus_GraphicsDispose($hGfx_Noise)
_GDIPlus_BitmapDispose($hBmp_Noise)
;=========================================
; MotionBlur
;=========================================
Local $hBmp_Full2 = _GDIPlus_BitmapCreateFromScan0($iWO, $iH)
Local $hGfx_Full2 = _GDIPlus_ImageGetGraphicsContext($hBmp_Full2)
_GDIPlus_GraphicsSetSmoothingMode($hGfx_Full2, 4)
_GDIPlus_GraphicsSetInterpolationMode($hGfx_Full, 3)
Local $tColorMatrix = DllStructCreate("float[5]; float[5]; float[5]; float[5]; float[5];")
DllStructSetData($tColorMatrix, 1, 1, 1)
DllStructSetData($tColorMatrix, 2, 1, 2)
DllStructSetData($tColorMatrix, 3, 1, 3)
DllStructSetData($tColorMatrix, 4, $fBlurTrans, 4)
DllStructSetData($tColorMatrix, 5, 1, 5)
Local $hImgAttrib = _GDIPlus_ImageAttributesCreate()
DllCall($__g_hGDIPDll, "int", "GdipSetImageAttributesColorMatrix", "ptr", $hImgAttrib, "int", 1, "int", 1, "struct*", $tColorMatrix, "struct*", 0, "int", 0)
For $i = 1 To $iBlurDist Step 2
DllCall($__g_hGDIPDll, "int", "GdipDrawImageRectRect", "ptr", $hGfx_Full2, "ptr", $hBmp_Full, _
"float", $i, "float", 0, "float", $iWO, "float", $iH, _
"float", 0, "float", 0, "float", $iWO, "float", $iH, _
"int", 2, "ptr", $hImgAttrib, "ptr", 0, "ptr", 0)
If $i >= $iBlurDist Then
DllStructSetData($tColorMatrix, 1, $fRed, 1)
DllStructSetData($tColorMatrix, 2, $fGreen, 2)
DllStructSetData($tColorMatrix, 3, $fBlue, 3)
DllStructSetData($tColorMatrix, 4, 1, 4)
DllCall($__g_hGDIPDll, "int", "GdipSetImageAttributesColorMatrix", "ptr", $hImgAttrib, "int", 1, "int", 1, "struct*", $tColorMatrix, "struct*", 0, "int", 0)
EndIf
DllCall($__g_hGDIPDll, "int", "GdipDrawImageRectRect", "ptr", $hGfx_Full, "ptr", $hBmp_Full2, _
"float", $i + 1, "float", 0, "float", $iWO, "float", $iH, _
"float", 0, "float", 0, "float", $iWO, "float", $iH, _
"int", 2, "ptr", $hImgAttrib, "ptr", 0, "ptr", 0)
Next
_GDIPlus_ImageAttributesDispose($hImgAttrib)
_GDIPlus_GraphicsDispose($hGfx_Full2)
_GDIPlus_BitmapDispose($hBmp_Full2)
_GDIPlus_GraphicsDispose($hGfx_Full)
;=========================================
; Add Light
;=========================================
Local $hBmp_Alu = _GDIPlus_BitmapCreateFromScan0($iW, $iH)
Local $hGfx_Alu = _GDIPlus_ImageGetGraphicsContext($hBmp_Alu)
_GDIPlus_GraphicsSetSmoothingMode($hGfx_Alu, 4)
_GDIPlus_GraphicsSetInterpolationMode($hGfx_Full, 3)
_GDIPlus_GraphicsDrawImage($hGfx_Alu, $hBmp_Full, -$iOverSize, 0)
_GDIPlus_BitmapDispose($hBmp_Full)
Local $tPointF1 = DllStructCreate("float; float;")
Local $tPointF2 = DllStructCreate("float; float;")
DllStructSetData($tPointF2, 2, $iH * $fLightScale)
$aResult = DllCall($__g_hGDIPDll, "int", "GdipCreateLineBrush", "struct*", $tPointF1, "struct*", $tPointF2, "uint", 0, "uint", $iLightColor, "int", 0, "handle*", 0)
If @error Or Not IsArray($aResult) Then Return SetError(1, 4, False)
Local $hBrush = $aResult[6]
_GDIPlus_LineBrushSetSigmaBlend($hBrush, $fLightSigma)
_GDIPlus_LineBrushSetGammaCorrection($hBrush)
DllCall($__g_hGDIPDll, "int", "GdipRotateLineTransform", "ptr", $hBrush, "float", $fLightAngle, "int", 0)
_GDIPlus_GraphicsFillRect($hGfx_Alu, 0, 0, $iW, $iH, $hBrush)
_GDIPlus_BrushDispose($hBrush)
_GDIPlus_GraphicsDispose($hGfx_Alu)
Return $hBmp_Alu
EndFunc ;==>_CreateBrushedAluminum
;Code below was generated by: 'File to Base64 String' Code Generator v1.20 Build 2018-02-02
Func _Au3_Icon($bSaveBinary = False, $sSavePath = @ScriptDir)
Local $Au3_Icon
$Au3_Icon &= 'iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAP0ElEQVR4XtWZW4hs6VXHf+v79qWquruquqtvZ/r0uc8540yScTIQQ0JkDOYyGhIkhhAxxhdR8mDAgAg+6FsE9UVffNMH8S0ERAwS1DFeEo3m6owzmUySc+Zc+15VXZd9+dZyp6ro4pDTORlGIfnDn703TW/+//X9v/Wt3i3PPfccP85w/GhBgLqkS23ixhpRfau6bgItIPpRN5Ag0Xl88jYrxu/E+KA492E0vJd44d245BKQ/H8bkAe80wMOEE5HA5c8SpQ822yv/ubW9vnfffyxR3+vs7r6YcS9HewZnP9ZXPwE0Py/NuCBJj65iERvQPybcNFP4JKzuPgq+CeR6GnwV3FJB4juM+mSNj55Ehe97/LFC5947PL2ey5tb755daW1+fiVc295+qk3fuTShfPPPnb10d+J60sfI6o9BbRer4EIaOLis1Nh6dtBfs6ljY82ljqfiNLFX8X597uk/ksrG4/8ftJo/lq62P51XPQOJHoc3DV8egZYxLkLcW3xQ088fvWTj2ysXItjnxRlGY6Ojmxvb98iJwtnz6xeXO80tx+9tP0Rcf6tuHhzLuS1YwmJLiHuslRVbzQbjydJsrXSbl4RIVlpLZ0xM71+e+cbC41a+8zayuVxlo9CCPnX/vslt7S89iEzy4/7R/+MT7+Lhq2V5dbbO63Ftbwog/feDYdDt7e3R71eo9vt2tbWlkZRRC1NFkHWQDpACmQ/bBuVWUyaiN+Kk9oH2q3mO/Ky0HNn1p9sNxeaBpiBmpl3TlTNqouoqkmFoKp5XuT1NKlVFS5ffOXm54ui2EFIr17afudCLV1SM5mBity+fRuAzc1NVC1EkfN3dg+/9e1vf/ePMfssYXz9hzXQJKo/BTyKlovrZ7Y+fPXi1luryubOOeKqPBpKQiilLAMhBAwEw7x3RN9jFImPIhTR8TjPQghFvZY2s7wYpkmc'
$Au3_Icon &= 'Ag5ARFBVuXHjBpVPqurTaDRMVRERQgjll776wp9YKP+KMP5a9NCsS7SBuHMgb2stt9+13FraXltubYegmkRRMh4POTwccdAbMy4CQTFDBBEDABMvYmnirNVIaC3UpVFP667WqFdmrRLfYA7MDIBWq0WaplQRIo5j8d6bVvDOxbV6fXV03C0BeYgBvyxx7R1prfbs2srym8+e6bxhtrwMjnt276Bv3UGOuYQ4bVCrJ1JVWtxEvxO0xBHIiiBVpbnbLexetysLidjmygKLCwsYzjATwACpQK/XY2VlBTNjZ2cHVTXvvYkgg3F2lI2z2+ByIEScjgRx23GSPvPU41d+BQE1zMqCnb197h2NxCeLttBeliiOmCUGDIIJFgIbzYh2IyUoqBrHo0LuHQ4ozMl37g1sqTaUrdWWJbW6haAChnOOPM/Z3d1lNBpRVX/CEJTIOxkOs2Mt8z4iAHa6ARdvVnzL+a3NnzfMVNEyz/z1Wzt2XHgWW+tUwkUV8tKYlQ81IZLA9nJMI40IaohAFAnLSxHeSm7sDWi0VuR4cMxLN/fl0maLxsICqlRUVldXOTg4IEkSOp2OVUAE1Iz+YLSHyAAYndZGE1yyAXqt1Wq/b3Vl6WxQC/lo4F5+dccK15Dmchs1yEpAHCAwEe+IKbm8GhN5T6mKEwGmwgAWFxdYHo7Y6fdoLDUZDz0vvnrI1S1lYXEJnRmuhANYBalozolT1dDt97+Chq+j+f6DDUh0Bh8/k9br7754buOng5oW2ci9fGNHxtRoLrbIgwEecw5sasAQRAPnVx3eC0UIE/FmxhxgwMZqm1G+T/d4SL3eoAzKizcPefycUG8soqqEEAxMzFARIcvL8fWbO18YH/c+DfICcPwgA4JZa2lp6b3XLp39kK8QQtBbd/ZlUIgttJakNFA8OIeZQ5hVPyhnm0Y9dpTBEMDMeBBMPGc6i/RvdRnnCVWTIMvHfPPWEU+c97iohpmad47jcda/u3Pw/MHh'
$Au3_Icon &= '0b+Zll8GfREtd08bJSJ81DgeDO6WQYOBHh3uy04/M5c0RCaxEBSHmsNMUKBUo5Uo6w0hVwEzToOZQcW01uCR5ZQym2zqSRcbZyW39gdgATPEgLu7hy/v7+3+jWn5GUz/Hi1vAPagUaKGS65geqndbD2ZJnE8Hh3bzb0BuFgkignq0FnmMWaCIHElFzuO0jwOQ+bR+YFGaomHMJyumIvAp1RdirVmnaRWMxGcqwi2i9mrhGyHOe43gEQrLq698+wj6x9f77SvWYVefyjjgOBjwKMiGG4uXsBZydU1jyGoKhpK8iLHe08cJ4gID4aAAhZQA8GBj7Gi4Ob+gMuPREBCGUKJWQNYBASw08bpBbDVtZXWNQPLs6FVvV6QyHAROmuRChigCGjg0rIjdTqpYlHk3L5zl2rO4Tu39iZmDDCzCZnfT4gTmL8PnAMXczTIyPOAqlk1JJ73Sf2NOH9pZoIHGYiApXqjcQVMMXQ8GssoV8NFgngMhyLA1IgLGRfa0K4beZCJ2J3dXfa7Q6I4pV9E3D0YYmV2f/7n90RRTC1yWChQExAPPsJUORzkTjVYNaVuXLm0/UHEXcDXaqcZSBBZi6NoAwRMGWUlhkzE4zwgqBoGYIGzLWG1rmQlOIHjfo+j45z11RUKE6ivcHsYca+bI9j0d21OMMR5Uq9okaEA4k5YGTBMKVV1MBwfYhpVbJy+AuKaYJEZqAbpjQoQx5yCMTspG8ZG05Opm4kL9IYZucJOd0AZL4G4yQgQxTXAMO6PkAF5NqY/KjAXA8LcgGecl6JBEcH1+sd3QFpA68EGosbC7IfxNNqlZaWdCAem92Y0IuXiMuQB5EQUdNotttY7bK52OL+6yLWO8pObsLboCMr3nws2NZAFAZ8whZwY0aAoAoY16rVVIIAVD+5CpklVqcvVmHwFM1TVBTU5GRNwiBnLDcfVjpIHB6bMAbVaQqNeQ8RQVcBRmCGnHWYYWZ5jEoGraDoTP6WpEYKK91YV'
$Au3_Icon &= 'pX1ld+/Ah6zonxYhFCsXGumqqk2fDDspCkanIVxbKRkHh6l+X09XNcoQKEolmKAnwgUDzO7fyKZKVgTwMYh7gEFsQtNw697BC6HIR4ic0oUEESQKqkFEHCYmjpMe5zAudCLGFoHp97dDQEQwZmbKchqPYZ9B/4DxoIdqeSJezQhlwTAvwaecQDiBiMwe8cvtxS0fpxfAWoB7QIQoQlm8/NIrNz9z7fLZ94vzSeycZaWJYDzxSB1MmW2q+0TrieAReZ6RF4FRHhgXSqEQJkl0PLadkiR+ZkIIoWCUGdRjmB/rJxQRvBfMQIwESEGSmQG930AY7+HS5/N8fCXPy6KeuiSNnR2Pc1mqJ5ONOywU78BsLjwfjRj0e5NO0s+UIH5aUV+HKJlm21fUkkwhwVAzBCiLgmCAiwG7n6b4yIub6VcsA7uO6Q4QHjRKFGg5rObzs/VasmiqZZr4qJrd7bGtBcnyAifzHIeg9LoH7B70GWoEyRIsLEzFu1nnMuaVRRjmBUupYgrihLIsURyIZ155nVIDjSRR50Sq9tx7+ZXrf46Gf8TKm4CdMguJz4uil+fFKIp80lxo2NZ6g+oZVQXmq9w9OuDmzhFaW4HFzrTSGNicU9hJsPMAmAIOwyjLAM7PzOr9xGgvpZhBvz/aE/HerMiA0WldSIGeqXZFJC6Dulq9ThmChBAwM0wVMxgOj7m730NrHVhYB+fAwikjtIAACGqAKjp7V1AD8QD3VZ5Q4H1kywux5EXQ732Ra7eab0I1AO40AyCupxpe2T/qf9P7yMTUiqKwk9YnMhnWDg+PyKUOjc682gg/EMJ8jzKFqoG4k8xjYUot6LQagikGriyDdnv9zyNyBJSnG9C8b0X2D3mpN9MkcveJB1SV7tE+B4MwFY8ADxEv833pBEwAM8bjMaNxBshcvJYQcpyPbKtTpyjNIufk7l73q1qMvoiVuwCnGRAgixvNKxe21t+VZVlpZq6izA4pBsd9dg5HkDZn'
$Au3_Icon &= 'J2eYb9RTMPdn1GLBcJhN33WUCcQNCMWEUwMF2+st0RCsAkf94W7/ePAVzO4Ag1MNzNDcPrP+B2aBEALARLzBJDp7B10CHnwCIQct59l/iAlBaUSgBoJRBp2KdxHo7F3FiFaraZ0Fb3kRDCyr/pz8pyIbfRa4B+hpBhLAti9cfmahnjyd53kBRFYBwFSt1+vZOC8hSkHnFZsygCmg87zcvwSIMR2bDcyUrFSAaSFCCeWIWr1hV9YbMspKjSPnrt/e/fdsNPg7TL9xWnyYn2qkYL/ovVPVWVLNBGA4HNLrDzmz1rbVVsMIGRVtugoFWDE3MjMzp4HmRGSIQBXNybfOLC/BbGqgGFq93uCJc21GeaFR5P0oK3pl0Bugz6P57R+U0wgoN7fO/8Zyq/nRooJhEYZUsLIsqDqA1Bs1lpotW9IgiXfcORqJlSNwCfgIxE84H78FYHofCupRCfjJp8K9wz4BD24SQVtpt+XiRsOqTY2A6/aGt1+9c+8vLBSfI4RXgIzTQQSki43axzHVEILI/Eua9fsDd9TtXd/c2Iy9d49kQfP2YhotNWJ5dW/EMJusguBicBMTcwPCFKqYQCgDg1FGXhqIWpQmnD/Tpplig9EYAesNsnu37tz7S9Pw14Tsf4AeD0F0/tLlReekphoEEDAB0SzL5ODoqI/qn+0e9ZezUp9dbjbOJ/W0aRAurNUlK+vubndsw6zAilwQARy4+SqIlZShIGt2LIQgca1h651l1tt1iqKQ42EIceTdzn7v+b39/U+L889j4VtT8Q+HfOUbL3zq7Ob6J800VlWbfR3W3b193z06/EPEfwoXP+ai+BdWO+0PFEXIq/3wBjAwVGazd29U0q+YFYGghjFF7KDmApVGGQ2PbWOtI1WzIC8Vg1Bp94fdwau37+78KdhzaHgFLbpA4OEgwmzNmPR8RCZDVuj2elG3e/S5NIn/KMuLQyR+Ucv80zs7ey+BbVVinIjUVpcXL816O82613Zd'
$Au3_Icon &= 'gMTEOQcCqIo4RlkpVRu2Uk129w8DneWxeO9v3N79l+pCnuVfxvRfCdkLwIDXAPnSf33tU+fOnvktEXNFUUi1af3e3sHXNRQfA746P0+p4eJlxJ9D5I3OR09fPnfml6vD5m6rubCdRC4FAUDNdDTOe977ej2NUjOjdzxgNBwVh73h3/ooGXrvk2w8esE0PI9Nus11oM9rhHzhi//xtpXV1c+msW92uz0ODw6fA/1t4Es8GDEu3kDcFRclP6Ua2nGcbMdxvI4hzossLdQvAeRFeS/Liv00jddUtej2Bs9pKP4TDYdgOdBD3C4h2wcCrx1M/8kn7j2Y/gxwM03Tz2RZdouHo4GLOuA2EGliNBGpY3qM8+uAoeV3MBvjXBucTJ5dfIcwGgIGlIDxOjAx8DrhgQioEdUjxCmmEQDlaDATGTPF+JRKv24Dbp71GX9M8L84Jo46QVTs6gAAAABJRU5ErkJggg=='
Local $bString = _WinAPI_Base64Decode($Au3_Icon)
If @error Then Return SetError(1, 0, 0)
$bString = Binary($bString)
If $bSaveBinary Then
Local Const $hFile = FileOpen($sSavePath & "\au3-icon2.png", 18)
If @error Then Return SetError(2, 0, $bString)
FileWrite($hFile, $bString)
FileClose($hFile)
EndIf
Return $bString
EndFunc ;==>_Au3_Icon
Func _WinAPI_Base64Decode($sB64String)
Local $aCrypt = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryA", "str", $sB64String, "dword", 0, "dword", 1, "ptr", 0, "dword*", 0, "ptr", 0, "ptr", 0)
If @error Or Not $aCrypt[0] Then Return SetError(1, 0, "")
Local $bBuffer = DllStructCreate("byte[" & $aCrypt[5] & "]")
$aCrypt = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryA", "str", $sB64String, "dword", 0, "dword", 1, "struct*", $bBuffer, "dword*", $aCrypt[5], "ptr", 0, "ptr", 0)
If @error Or Not $aCrypt[0] Then Return SetError(2, 0, "")
Return DllStructGetData($bBuffer, 1)
EndFunc ;==>_WinAPI_Base64Decode