I wrote a dll and the wrapper to convert non-animated WebP images to a GDI/GDI+ format / encode any GDI+ supported image to WebP format for use in Autoit.
What is WebP?
You can find more information about WebP and WebP tools / source codes here: https://developers.google.com/speed/webp
Maybe useful for one or the other... 🙂
WebP.au3:
;Version 0.3.3 build 2025-06-05 beta
#include-once
#include <GDIPlus.au3>
#include <Memory.au3>
Enum $WEBP_PRESET_DEFAULT = 0, _ ; default preset.
$WEBP_PRESET_PICTURE, _ ; digital picture, like portrait, inner shot
$WEBP_PRESET_PHOTO, _ ; outdoor photograph, with natural lighting
$WEBP_PRESET_DRAWING, _ ; hand or line drawing, with high-contrast details
$WEBP_PRESET_ICON, _ ; small-sized colorful images
$WEBP_PRESET_TEXT ; text-like
; #FUNCTION# ====================================================================================================================
; Name ..........: WebP_Ver
; Description ...: Displays the DLL version information in a messagebox window
; Syntax ........: WebP_Ver([$sPath2DLL = ""])
; Parameters ....: $sPath2DLL - [optional] a string value. Default is "". Path to WebP dll if not in script dir
; Return values .: None
; Author ........: UEZ
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func WebP_Ver($sPath2DLL = "")
Local $sDLL = Path2DLL($sPath2DLL)
If Not FileExists($sDLL) Then Return SetError(1, 0, 0) ;DLL not found
DllCall($sDLL, "none", "WebP_DLL_Version")
Return True
EndFunc ;==>WebP_Ver
; #FUNCTION# ====================================================================================================================
; Name ..........: WebP_Ver2
; Description ...: Returns the DLL version information
; Syntax ........: WebP_Ver([$sPath2DLL = ""])
; Parameters ....: $sPath2DLL - [optional] a string value. Default is "". Path to WebP dll if not in script dir
; Return values .: DLL version
; Author ........: UEZ
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func WebP_Ver2($sPath2DLL = "")
Local $sDLL = Path2DLL($sPath2DLL)
If Not FileExists($sDLL) Then Return SetError(1, 0, 0) ;DLL not found
Return DllCall($sDLL, "str", "Web_DLL_Version2")[0]
EndFunc ;==>WebP_Ver2
; #FUNCTION# ====================================================================================================================
; Name ..........: WebP_BitmapGetInfo
; Description ...: Gets some rudimentary information about the WebP image
; Syntax ........: WebP_BitmapGetInfo($sFilename[, $sPath2DLL = ""])
; Parameters ....: $sFilename - file to load
; $sPath2DLL - [optional] a string value. Default is "". Path to WebP dll if not in script dir
; Return values .: Struct
; Author ........: UEZ
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........: https://developers.google.com/speed/webp
; Example .......: No
; ===============================================================================================================================
Func WebP_BitmapGetInfo($sFilename, $sPath2DLL = "")
Local $sDLL = Path2DLL($sPath2DLL)
If Not FileExists($sDLL) Then Return SetError(1, 0, 0) ;DLL not found
If Not FileExists($sFilename) Then Return SetError(2, 0, 0) ;file not found
Local $iFileSize = FileGetSize($sFilename), $nBytes
Local $tBuffer = DllStructCreate("struct;byte bin[" & $iFileSize & "];endstruct")
Local Const $hFile = _WinAPI_CreateFile($sFilename, 2, 2)
_WinAPI_ReadFile($hFile, $tBuffer, $iFileSize, $nBytes)
_WinAPI_CloseHandle($hFile)
If Int(BinaryMid($tBuffer.bin, 1, 4)) <> 1179011410 Or Int(BinaryMid($tBuffer.bin, 9, 6)) <> 88331643929943 Then Return SetError(3, 0, 0) ;header must contain RIFF and WEBPVP
Local $tWebPBitstreamFeatures = DllStructCreate("struct;long width; long height; long has_alpha; long has_animation; long format; ulong pad[5];endstruct")
Local $iReturn = DllCall($sDLL, "long", "WebP_BitmapGetInfo", "struct*", $tBuffer, "uint", $iFileSize, "struct*", $tWebPBitstreamFeatures)
If $iReturn = 0 Then Return SetError(4, 0, 0)
Return $tWebPBitstreamFeatures
EndFunc ;==>WebP_BitmapGetInfo
; #FUNCTION# ====================================================================================================================
; Name ..........: WebP_BitmapCreateGDIp
; Description ...: Converts (decodes) a WebP image from disk to a GDI / GDI+ bitmap handle
; Syntax ........: WebP_BitmasFilename[, $bGDIImage = False[, $sPath2DLL = ""]])
; Parameters ....: $sFilename - file to load
; $bGDIImage - [optional] a boolean value. Default is False (GDIPlus bitmap handle). If True then output is GDI bitmap handle
; $bCountColors - [optional] a boolean value. Default is False. If True then the colors will be counted and saved in extended. Use @extended to get color count.
; $sPath2DLL - [optional] a string value. Default is "". Path to WebP dll if not in script dir
; Return values .: GDI / GDIPlus bitmap handle and color count if $bCountColors = True in extended.
; Author ........: UEZ
; Modified ......:
; Remarks .......: For animated WebP images see below!
; Related .......:
; Link ..........: https://developers.google.com/speed/webp
; Example .......: No
; ===============================================================================================================================
Func WebP_BitmapCreateGDIp($sFilename, $bGDIImage = False, $bCountColors = False, $sPath2DLL = "")
Local $sDLL = Path2DLL($sPath2DLL)
If Not FileExists($sDLL) Then Return SetError(1, 0, 0) ;DLL not found
If Not FileExists($sFilename) Then Return SetError(2, 0, 0) ;file not found
Local $iFileSize = FileGetSize($sFilename), $nBytes
Local $tBuffer = DllStructCreate("byte bin[" & $iFileSize & "]")
Local Const $hFile = _WinAPI_CreateFile($sFilename, 2, 2)
_WinAPI_ReadFile($hFile, $tBuffer, $iFileSize, $nBytes)
_WinAPI_CloseHandle($hFile)
If Int(BinaryMid($tBuffer.bin, 1, 4)) <> 1179011410 Or Int(BinaryMid($tBuffer.bin, 9, 6)) <> 88331643929943 Then Return SetError(3, 0, 0) ;header must contain RIFF and WEBPVP
Local $tColors = DllStructCreate("struct;ulong cc;endstruct")
Local Const $hBitmap = DllCall($sDLL, "ptr", "WebP_BitmapCreateGDIp", "struct*", $tBuffer, "uint", $iFileSize, "boolean", $bGDIImage, "boolean", $bCountColors, "struct*", $tColors)[0]
If $hBitmap = 0 Then Return SetError(4, 0, 0)
Return SetExtended($tColors.cc, $hBitmap)
EndFunc ;==>WebP_BitmapCreateGDIp
; #FUNCTION# ====================================================================================================================
; Name ..........: WebP_BitmapCreateGDIpFromMem
; Description ...: Converts (decodes) a WebP image from memory to a GDI / GDI+ bitmap handle
; Syntax ........: WebP_BitmapCreateGDIpFromMem($tBuffer[, $iBufferSize = 0[, $bGDIImage = False[, $sPath2DLL = ""]]])
; Parameters ....: $tBuffer - a dll struct with WebP binary data as content or pointer to the memory data
; $iBufferSize - the size of the binary data (file size)
; $bGDIImage - [optional] a boolean value. Default is False (GDIPlus bitmap handle). If True then output is GDI bitmap handle
; $bCountColors - [optional] a boolean value. Default is False. If True then the colors will be counted and saved in extended. Use @extended to get color count.
; $sPath2DLL - [optional] a string value. Default is "". Path to WebP dll if not in script dir
; Return values .: GDI / GDIPlus bitmap handle and color count if $bCountColors = True in extended.
; Author ........: UEZ
; Modified ......:
; Remarks .......: Currently only WebP images are supported - no animated WebP images yet!
; Related .......:
; Link ..........: https://developers.google.com/speed/webp
; Example .......: No
; ===============================================================================================================================
Func WebP_BitmapCreateGDIpFromMem($tBuffer, $iBufferSize = 0, $bGDIImage = False, $bCountColors = False, $sPath2DLL = "")
Local $sDLL = Path2DLL($sPath2DLL)
If Not FileExists($sDLL) Then Return SetError(1, 0, 0) ;DLL not found
If $iBufferSize = 0 Then Return SetError(2, 0, 0)
Local $binMem
If IsPtr($tBuffer) Then
Local $tMem = DllStructCreate("byte bin[" & $iBufferSize & "]", $tBuffer)
$binMem = $tMem.bin
Else
$binMem = DllStructGetData($tBuffer, 1)
EndIf
If Int(BinaryMid($binMem, 1, 4)) <> 1179011410 Or Int(BinaryMid($binMem, 9, 6)) <> 88331643929943 Then Return SetError(3, 0, 0) ;header must contain RIFF and WEBPVP
Local $tColors = DllStructCreate("struct;ulong cc;endstruct")
Local Const $hBitmap = DllCall($sDLL, "ptr", "WebP_BitmapCreateGDIp", "struct*", $tBuffer, "uint", $iBufferSize, "boolean", $bGDIImage, "boolean", $bCountColors, "struct*", $tColors)[0]
If $hBitmap = 0 Then Return SetError(4, 0, 0)
Return SetExtended($tColors.cc, $hBitmap)
EndFunc ;==>WebP_BitmapCreateGDIpFromMem
; #FUNCTION# ====================================================================================================================
; Name ..........: WebP_CreateWebPLossySimpleFromBitmap
; Description ...: Converts a bitmap to WebP lossy image and save it to HD
; Syntax ........: WebP_CreateWebPLossySimpleFromBitmap($sFilename, $hBitmap[, $iQuality = 75[, $sPath2DLL = ""]])
; Parameters ....: $sFilename - file to load
; $hBitmap - GDIPlus bitmap handle
; $iQuality - [optional] an integer value. Default is 75. Valid range is 0 - 100.
; $sPath2DLL - [optional] a string value. Default is "". Path to WebP dll if not in script dir.
; Return values .: 0 for failure, 1 for success.
; Author ........: UEZ
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........: https://developers.google.com/speed/webp
; Example .......: No
; ===============================================================================================================================
Func WebP_CreateWebPLossySimpleFromBitmap($sFilename, $hBitmap, $iQuality = 75, $sPath2DLL = "")
If $sFilename = "" Then Return SetError(1, 0, 0)
Local $sDLL = Path2DLL($sPath2DLL)
If Not FileExists($sDLL) Then Return SetError(2, 0, 0) ;DLL not found
Local $iReturn = DllCall($sDLL, "long", "WebP_CreateWebPLossySimpleFromBitmap", "str", $sFilename, "ptr", $hBitmap, "float", $iQuality)[0]
If $iReturn = 0 Then Return SetError(3, 0, 0)
Return 1
EndFunc ;==>WebP_CreateWebPLossySimpleFromBitmap
; #FUNCTION# ====================================================================================================================
; Name ..........: WebP_CreateWebPLosslessSimpleFromBitmap
; Description ...: Converts a bitmap to WebP lossless image and save it to HD
; Syntax ........: WebP_CreateWebPLosslessSimpleFromBitmap($sFilename, $hBitmap[, $sPath2DLL = ""])
; Parameters ....: $sFilename - file to load
; $hBitmap - GDIPlus bitmap handle
; $sPath2DLL - [optional] a string value. Default is "". Path to WebP dll if not in script dir.
; Return values .: 0 for failure, 1 for success.
; Author ........: UEZ
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........: https://developers.google.com/speed/webp
; Example .......: No
; ===============================================================================================================================
Func WebP_CreateWebPLosslessSimpleFromBitmap($sFilename, $hBitmap, $sPath2DLL = "")
If $sFilename = "" Then Return SetError(1, 0, 0)
Local $sDLL = Path2DLL($sPath2DLL)
If Not FileExists($sDLL) Then Return SetError(2, 0, 0) ;DLL not found
Local $iReturn = DllCall($sDLL, "long", "WebP_CreateWebPLosslessSimpleFromBitmap", "str", $sFilename, "ptr", $hBitmap)[0]
If $iReturn = 0 Then Return SetError(3, 0, 0)
Return 1
EndFunc ;==>WebP_CreateWebPLosslessSimpleFromBitmap
; #FUNCTION# ====================================================================================================================
; Name ..........: WebP_CreateWebPAdvancedFromBitmap
; Description ...: Converts a bitmap to WebP lossy / lossless image and save it to HD
; Syntax ........: WebP_CreateWebPAdvancedFromBitmap($sFilename, $hBitmap[, $WebPPreset = $WEBP_PRESET_DEFAULT[, $lossless = 0[,
; $quality = 75.0[, $method = 4[, $sns_strength = 50[, $filter_sharpness = 0[, $filter_strength = 60[,
; $pass = 1[, $level = 6[, $sPath2DLL = ""]]]]]]]]]])
; Parameters ....: $sFilename - file to load
; $hBitmap - GDIPlus bitmap handle
; $WebPPreset - [optional] an unknown value. Default is $WEBP_PRESET_DEFAULT.
; $lossless - [optional] an unknown value. Default is 0. 0 for lossy encoding / 1 for lossless..
; $quality - [optional] an unknown value. Default is 75.0. Valid range is 0 - 100.
; $method - [optional] a map. Default is 4. Valid range is 0 - 6 (0=fast, 6=slower-better).
; $sns_strength - [optional] a string value. Default is 50. Spatial Noise Shaping. 0=off, 100=maximum
; $filter_sharpness - [optional] a floating point value. Default is 0. Range: [0 = off .. 7 = least sharp]
; $filter_strength - [optional] a floating point value. Default is 60. Range: [0 = off .. 100 = strongest]
; $pass - [optional] a pointer value. Default is 1. Number of entropy-analysis passes (in [1..10]).
; $level - [optional] an unknown value. Default is 6. Between 0 (fastest, lowest compression) and 9 (slower, best compression) only valid for lossless = 1!
; $near_lossless - [optional] an unknown value. Default is 100. Near lossless encoding [0 = max loss .. 100 = off (default)].
; $alpha_compression - [optional] an unknown value. Default is 1. Algorithm for encoding the alpha plane (0 = none,1 = compressed with WebP lossless). Default is 1.
; $alpha_filtering - [optional] an unknown value. Default is 1. Predictive filtering method for alpha plane.0: none, 1: fast, 2: best. Default if 1.
; $alpha_quality - [optional] an unknown value. Default is 100. Between 0 (smallest size) and 100 (lossless). Default is 100.
; $target_size - [optional] an unknown value. Default is 0. If non-zero, set the desired target size in bytes.
; $NoSave - [optional] an unknown value. Default is False.
; $pMem - [optional] a string value. Default is Null. If $NoSave = True then the pointer to the memory which holds the data will be returned.
; $pCallback - [optional] a pointer value. Default is 0. Pointer to a callback address for progress hook.
; $sPath2DLL - [optional] a string value. Default is "". Path to WebP dll if not in script dir.
; Return values .: negative value for failure, 1 for success or the struct with information (pointers, size) if $NoSave = True
; Author ........: UEZ
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........: https://developers.google.com/speed/webp
; Example .......: No
; ===============================================================================================================================
Func WebP_CreateWebPAdvancedFromBitmap($sFilename, $hBitmap, $WebPPreset = $WEBP_PRESET_DEFAULT, $lossless = 0, $quality = 75.0, $method = 4, $sns_strength = 50, _
$filter_sharpness = 0, $filter_strength = 60, $pass = 1, $level = 6, $near_lossless = 100, $alpha_compression = 1, $alpha_filtering = 1, $alpha_quality = 100, _
$target_size = 0, $NoSave = False, $pCallback = 0, $sPath2DLL = "")
If $sFilename = "" And Not $NoSave Then Return SetError(1, 0, 0)
Local $sDLL = Path2DLL($sPath2DLL)
If Not FileExists($sDLL) Then Return SetError(2, 0, 0) ;DLL not found
Local $tMem = DllStructCreate("struct;ptr pPic; ptr pWriter; ptr pMemData; uint memsize;endstruct")
Local $iReturn = DllCall($sDLL, "long", "WebP_CreateWebPAdvancedFromBitmap", _
"str", $sFilename, _ ;Webp filename
"ptr", $hBitmap, _ ;handle to GDI+ bitmap
"long", $WebPPreset, _ ;WebPPreset
"long", $lossless, _ ;lossless
"float", $quality, _ ;quality
"long", $method, _ ;method
"long", $sns_strength, _ ;sns_strength
"long", $filter_sharpness, _ ;filter_sharpness
"long", $filter_strength, _ ;filter_strength
"long", $pass, _ ;pass
"long", $level, _ ;level
"long", $near_lossless, _ ;near_lossless
"long", $alpha_compression, _ ;alpha_compression
"long", $alpha_filtering, _ ;alpha_filtering
"long", $alpha_quality, _ ;alpha_quality
"long", $target_size, _ ;target_size
"bool", $NoSave, _ ;
"struct*", $tMem, _ ;
"ptr", @AutoItX64 ? $pCallback : 0)[0] ;x86 crashes for unknown reason
If $iReturn < 0 Then Return SetError(3, 0, $iReturn)
If $NoSave And $tMem.memsize = 0 Then SetError(4, 0, 0)
Return $NoSave ? $tMem : $iReturn
EndFunc ;==>WebP_CreateWebPAdvancedFromBitmap
; #FUNCTION# ====================================================================================================================
; Name ..........: WebP_FreeUp
; Description ...: Release the ressources from $tMem struct
; Syntax ........: WebP_FreeUp(Byref $tMem[, $sPath2DLL = ""])
; Parameters ....: $tMem - [in/out] a dll struct value.
; $sPath2DLL - [optional] a string value. Default is "".
; Return values .: 1
; Author ........: UEZ
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........: https://developers.google.com/speed/webp
; Example .......: No
; ===============================================================================================================================
Func WebP_FreeUp(ByRef $tMem, $sPath2DLL = "")
Local $sDLL = Path2DLL($sPath2DLL)
If Not FileExists($sDLL) Then Return SetError(1, 0, 0) ;DLL not found
Local $iReturn = DllCall($sDLL, "long", "WebP_FreeUp", "struct*", $tMem)[0]
Return $iReturn
EndFunc ;==>WebP_FreeUp
; #FUNCTION# ====================================================================================================================
; Name ..........: BitmapCountColors
; Description ...: Counts the colors used by the bitmap
; Syntax ........: BitmapCountColors($hBitmap)
; Parameters ....: $hBitmap - a handle to a GDI+ bitmap.
; $bGDIImage - [optional] a boolean value. Default is False (GDIPlus bitmap handle).
; Return values .: Number of colors used by the image.
; Author ........: UEZ
; Modified ......:
; Remarks .......: The result may differ from other programs for JPG images depending on the decoder.
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func BitmapCountColors($hBitmap = 0, $bGDIImage = False, $sPath2DLL = "")
If IsPtr($hBitmap) = 0 Or $hBitmap = 0 Then SetError(1, 0, 0)
Local $sDLL = Path2DLL($sPath2DLL)
If Not FileExists($sDLL) Then Return SetError(2, 0, 0) ;DLL not found
Local $iReturn = DllCall(Path2DLL(), "ulong", "BitmapCountColors", "ptr", $hBitmap)[0]
Return $iReturn
EndFunc ;==>BitmapCountColors
; #FUNCTION# ====================================================================================================================
; Name ..........: WebP_ExtractAnimFramesToDisk
; Description ...: Extracts the frames of a WebP animated file
; Syntax ........: WebP_ExtractAnimFramesToDisk($sFile, $sDestPath = ""[, $sOutputFormat = "png"[, $sPath2DLL = ""]])
; Parameters ....: $sFilename - file to load. Default is "".
; $sDestPath - destination folder. If empty then script path will be used.
; $sOutputFormat - [optional] a string value. Default is "png".
; $sPath2DLL - [optional] a string value. Default is "".
; Return values .: 0 for failure, 1 for success.
; Author ........: UEZ
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func WebP_ExtractAnimFramesToDisk($sFilename, $sDestPath = "", $sOutputFormat = "png", $sPath2DLL = "")
Local $sDLL = Path2DLL($sPath2DLL)
If Not FileExists($sDLL) Then Return SetError(1, 0, 0) ;DLL not found
Local Const $iResult = DllCall($sDLL, "byte", "WebP_ExtractAnimFramesToDisk", "str", $sFilename, "str", $sDestPath, "str", $sOutputFormat)[0]
If $iResult = 0 Then Return SetError(2, 0, 0)
Return $iResult
EndFunc ;==>WebP_ExtractAnimFramesToDisk
; #FUNCTION# ====================================================================================================================
; Name ..........: WebP_GetAmountOfAnimFrames
; Description ...: Get the amount of frames from an animated webp file
; Syntax ........: WebP_GetAmountOfAnimFrames($sFilename[, $sPath2DLL = ""])
; Parameters ....: $sFilename - a string value.
; $sPath2DLL - [optional] a string value. Default is "".
; Return values .: 0 for failure, otherwise the amount of frames
; Author ........: UEZ
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func WebP_GetAmountOfAnimFrames($sFilename, $sPath2DLL = "")
Local $sDLL = Path2DLL($sPath2DLL)
If Not FileExists($sDLL) Then Return SetError(1, 0, 0) ;DLL not found
Local Const $iResult = DllCall($sDLL, "uint", "WebP_GetAmountOfAnimFrames", "str", $sFilename)[0]
If Not $iResult Or @error Then Return SetError(2, 0, 0)
Return $iResult
EndFunc ;==>WebP_GetAmountOfAnimFrames
; #FUNCTION# ====================================================================================================================
; Name ..........: WebP_ExtractAnimFramesToMem
; Description ...: Extracts all frames from a webp animated file to the memory
; Syntax ........: WebP_ExtractAnimFramesToMem($sFilename, Byref $iUB[, $sPath2DLL = ""])
; Parameters ....: $sFilename - a string value.
; $iUB - [in/out] an integer value. Needed to save the amount of data in struct array -> frames * 2
; $sPath2DLL - [optional] a string value. Default is "".
; Return values .: 0 for failure, otherwise struct array with pointer to the GDI+ image and frame delay
; Author ........: UEZ
; Modified ......:
; Remarks .......: You must dispose all frames when done.
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func WebP_ExtractAnimFramesToMem($sFilename, ByRef $iUB, $sPath2DLL = "")
Local $sDLL = Path2DLL($sPath2DLL)
If Not FileExists($sDLL) Then Return SetError(1, 0, 0) ;DLL not found
Local $iFrames = WebP_GetAmountOfAnimFrames($sFilename, $sPath2DLL)
If Not $iFrames Or @error Then Return SetError(2, 0, 0)
Local $tArray = DllStructCreate("uint ub"), $tImgPtr = DllStructCreate("ptr array[" & $iFrames * (32 + (@AutoItX64 ? 16 : 0)) & "]")
Local $pMem = _MemVirtualAlloc(DllStructGetPtr($tImgPtr), $iFrames * (32 + (@AutoItX64 ? 16 : 0)), $MEM_COMMIT, $PAGE_READWRITE)
Local Const $iResult = DllCall($sDLL, "byte", "WebP_ExtractAnimFramesToMem", "str", $sFilename, "struct*", $tArray, "ptr", DllStructGetPtr($tImgPtr))[0]
If Not $iResult Or @error Then Return SetError(3, 0, 0)
$iUB = $tArray.ub * 2
_MemVirtualFree($pMem, $iFrames * (32 + (@AutoItX64 ? 16 : 0)), $MEM_RELEASE)
Return $tImgPtr
EndFunc ;==>WebP_ExtractAnimFramesToMem
; #INTERNAL_USE_ONLY#============================================================================================================
; Name...........: Path2DLL
; Description ...: Return the path to the _WebP_x??.dll
; Author ........: UEZ
; Modified.......:
; Remarks .......: This function is used internally by WebP.au3
; ===============================================================================================================================
Func Path2DLL($sPath2DLL = "")
Return $sPath2DLL ? $sPath2DLL : @ScriptDir & (@AutoItX64 ? "\_WebP_x64.dll" : "\_WebP_x86.dll")
EndFunc ;==>Path2DLL
WebP Advanced Encoder GUI:
;Coded by UEZ build 2025-06-05
#AutoIt3Wrapper_UseX64=y
#AutoIt3Wrapper_Res_HiDpi=n
#AutoIt3Wrapper_Version=p
#AutoIt3Wrapper_Compile_Both=y
#AutoIt3Wrapper_Run_Au3Stripper=y
#Au3Stripper_Parameters=/so /pe ;/rm
#AutoIt3Wrapper_Run_After=del /f /q "%scriptdir%\%scriptfile%_stripped.au3"
#pragma compile(Icon, WebP_logo_2010_by_Simo99.ico)
#pragma compile(FileVersion, 0.9.9.1)
#pragma compile(ProductVersion, 3.3.16.1)
#pragma compile(CompanyName, "UEZ Software Development")
#pragma compile(ProductName, "WebP Advanced Encoder GUI")
AutoItSetOption("MustDeclareVars", 1)
#include <Array.au3>
#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiMenu.au3>
#include <GuiStatusBar.au3>
#include <Memory.au3>
#include <SliderConstants.au3>
#include <StaticConstants.au3>
#include <WinAPISysWin.au3>
#include <WinAPITheme.au3>
#include <WindowsConstants.au3>
#include "WebP.au3"
Break(0)
If @OSBuild < 10240 Then MsgBox($MB_ICONWARNING, "Warning", "Your Windows version is not support!", 30)
If WebP_Ver2() < "0.3.1" Then Exit MsgBox($MB_ICONERROR, "ERROR", "DLL Version v0.3.1+ required!", 30)
Global Const $ver = "v0.99.1", $build = "build 2025-06-05"
#Region TichySID
Global Const $tagIMAGE_DOS_HEADER = 'WORD e_magic;WORD e_cblp;WORD e_cp;WORD e_crlc;WORD e_cparhdr;WORD e_minalloc;WORD e_maxalloc;WORD e_ss;WORD e_sp;WORD e_csum;WORD e_ip;WORD e_cs;WORD e_lfarlc;WORD e_ovno;WORD e_res[4];WORD e_oemid;WORD e_oeminfo;WORD e_res2[10];LONG e_lfanew;'
Global Const $tagIMAGE_FILE_HEADER = 'WORD Machine;WORD NumberOfSections;DWORD TimeDateStamp;DWORD PointerToSymbolTable;DWORD NumberOfSymbols;WORD SizeOfOptionalHeader;WORD Characteristics;'
Global $tagIMAGE_OPTIONAL_HEADER = 'WORD Magic;BYTE MajorLinkerVersion;BYTE MinorLinkerVersion;DWORD SizeOfCode;DWORD SizeOfInitializedData;DWORD SizeOfUninitializedData;DWORD AddressOfEntryPoint;DWORD BaseOfCode;DWORD BaseOfData;PTR ImageBase;DWORD SectionAlignment;DWORD FileAlignment;WORD MajorOperatingSystemVersion;WORD MinorOperatingSystemVersion;WORD MajorImageVersion;WORD MinorImageVersion;WORD MajorSubsystemVersion;WORD MinorSubsystemVersion;DWORD Win32VersionValue;DWORD SizeOfImage;DWORD SizeOfHeaders;DWORD CheckSum;WORD Subsystem;WORD DllCharacteristics;PTR SizeOfStackReserve;PTR SizeOfStackCommit;PTR SizeOfHeapReserve;PTR SizeOfHeapCommit;DWORD LoaderFlags;DWORD NumberOfRvaAndSizes;'
If @AutoItX64 Then $tagIMAGE_OPTIONAL_HEADER = 'WORD Magic;BYTE MajorLinkerVersion;BYTE MinorLinkerVersion;DWORD SizeOfCode;DWORD SizeOfInitializedData;DWORD SizeOfUninitializedData;DWORD AddressOfEntryPoint;DWORD BaseOfCode;PTR ImageBase;DWORD SectionAlignment;DWORD FileAlignment;WORD MajorOperatingSystemVersion;WORD MinorOperatingSystemVersion;WORD MajorImageVersion;WORD MinorImageVersion;WORD MajorSubsystemVersion;WORD MinorSubsystemVersion;DWORD Win32VersionValue;DWORD SizeOfImage;DWORD SizeOfHeaders;DWORD CheckSum;WORD Subsystem;WORD DllCharacteristics;PTR SizeOfStackReserve;PTR SizeOfStackCommit;PTR SizeOfHeapReserve;PTR SizeOfHeapCommit;DWORD LoaderFlags;DWORD NumberOfRvaAndSizes;'
Global Const $tagIMAGE_NT_HEADER = 'DWORD Signature;' & $tagIMAGE_FILE_HEADER & $tagIMAGE_OPTIONAL_HEADER
Global Const $tagIMAGE_SECTION_HEADER = 'CHAR Name[8];DWORD VirtualSize;DWORD VirtualAddress;DWORD SizeOfRawData;DWORD PointerToRawData;DWORD PointerToRelocations;DWORD PointerToLinenumbers;WORD NumberOfRelocations;WORD NumberOfLinenumbers;DWORD Characteristics;'
Global Const $tagIMAGE_DATA_DIRECTORY = 'DWORD VirtualAddress;DWORD Size;'
Global Const $tagIMAGE_BASE_RELOCATION = 'DWORD VirtualAddress;DWORD SizeOfBlock;'
Global Const $tagIMAGE_IMPORT_DESCRIPTOR = 'DWORD OriginalFirstThunk;DWORD TimeDateStamp;DWORD ForwarderChain;DWORD Name;DWORD FirstThunk;'
Global Const $tagIMAGE_IMPORT_BY_NAME = 'WORD Hint;char Name[1];'
Global Const $tagIMAGE_EXPORT_DIRECTORY = 'DWORD Characteristics;DWORD TimeDateStamp;WORD MajorVersion;WORD MinorVersion;DWORD Name;DWORD Base;DWORD NumberOfFunctions;DWORD NumberOfNames;DWORD AddressOfFunctions;DWORD AddressOfNames;DWORD AddressOfNameOrdinals;'
Global $_KERNEL32DLL = DllOpen('kernel32.dll')
Global $_MFHookPtr, $_MFHookBak, $_MFHookApi = 'LocalCompact'
Global Const $tagModule = 'PTR ExportList;PTR CodeBase;PTR ImportList;PTR DllEntry;DWORD Initialized;'
Global Const $SID_MEMORY = 1
Global Const $SID_NON_DEFAULT = 2
Global $hTitchysidDll, $iSubsongCount = 0
#EndRegion
; enum _PROCESS_DPI_AWARENESS -> https://msdn.microsoft.com/en-us/library/windows/desktop/dn280512(v=vs.85).aspx
Global Enum $DPI_AWARENESS_INVALID = -1, $PROCESS_DPI_UNAWARE = 0, $PROCESS_SYSTEM_DPI_AWARE, $PROCESS_PER_MONITOR_DPI_AWARE
;https://docs.microsoft.com/en-us/windows/desktop/hidpi/dpi-awareness-context
Global Enum $Context_UnawareGdiScaled = -5, $Context_PerMonitorAwareV2, $Context_PerMonitorAware, $Context_SystemAware, $Context_Unaware
; enum _MONITOR_DPI_TYPE
Global Enum $MDT_EFFECTIVE_DPI = 0, $MDT_ANGULAR_DPI, $MDT_RAW_DPI
Global Const $MDT_DEFAULT = $MDT_EFFECTIVE_DPI
Global Const $SM_CXPADDEDBORDER = 92
_GDIPlus_Startup()
;~ Global $aDPI = _WinAPI_GetDpiForMonitor() ;_GDIPlus_GraphicsGetDPIRatio()
Global $aDPI = [1, 1]
Global $hGUI_About, $iFPS = 0, $iShowFPS = 0, $bExit, $bGUIBgColor = 0xFF808080
#Region GUI
Global Const $SC_DRAGMOVE = 0xF012, $iW = 322, $iH = 694
Global Const $hGUI = GUICreate("WAE GUI " & $ver & " Beta by UEZ", $iW, $iH, @DesktopWidth - $iW - 8, -1, -1, BitOR($WS_EX_ACCEPTFILES, $WS_EX_APPWINDOW, $WS_EX_TOPMOST, $WS_EX_NOACTIVATE))
GUISetFont(10 * $aDPI[0], 400, 0, "Arial Narrow")
Global Const $Title = GUICtrlCreateLabel("WebP Advanced Encoder GUI", 5, 8, 310, 41)
GUICtrlSetFont(-1, 21 * $aDPI[0], 400, 0, "Arial Narrow")
Global Const $icLoad = GUICtrlCreateIcon(@SystemDir & "\shell32.dll", -127, 8, 60, 32, 32, BitOR($GUI_SS_DEFAULT_ICON, $WS_BORDER))
GUICtrlSetTip(-1, "Load a GDI+ supported image")
Global Const $icSave = GUICtrlCreateIcon(@SystemDir & "\shell32.dll", -259, 56, 60, 32, 32, BitOR($GUI_SS_DEFAULT_ICON, $WS_BORDER))
GUICtrlSetTip(-1, "Save compressed image in WebP format.")
Global Const $icReset = GUICtrlCreateIcon(@SystemDir & "\shell32.dll", -239, 104, 60, 32, 32, BitOR($GUI_SS_DEFAULT_ICON, $WS_BORDER))
GUICtrlSetTip(-1, "Reset image position if image was moved (only for images larger than preview window).")
GUICtrlCreateLabel("", 0, 106, $iW - 2, 2, $SS_ETCHEDHORZ)
Global Const $lbPresets = GUICtrlCreateLabel("Presets", 10, 125, 39, 20)
Global Const $cbPreset = GUICtrlCreateCombo("Default", 120, 120, $iW - 177, 25, BitOR($CBS_DROPDOWN, $CBS_AUTOHSCROLL)), $hcbPreset = GUICtrlGetHandle($cbPreset)
GUICtrlSetData(-1, "Picture|Photo|Drawing|Icon|Text")
Global Const $chkbLossless = GUICtrlCreateCheckbox("&Lossless", 120, 152, 97, 17)
GUICtrlSetTip(-1, "Enable lossless compression. Default: lossy.")
Global Const $lbEncoding = GUICtrlCreateLabel("Encoding", 10, 152, 48, 20)
Global Const $lbQuality = GUICtrlCreateLabel("Quality", 10, 176, 36, 20)
Global Const $slQuality = GUICtrlCreateSlider(116, 176, $iW - 164, 21, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_ENABLESELRANGE)), $hslQuality = GUICtrlGetHandle($slQuality)
GUICtrlSetLimit(-1, 100, 0)
GUICtrlSetData(-1, 75)
GUICtrlSetTip(-1, "Between 0 and 100. 0 gives the smallest size and 100 the largest.")
Global Const $ipQuality = GUICtrlCreateInput("", $iW - 48, 172, 28, 24, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_READONLY))
GUICtrlSetData(-1, GUICtrlRead($slQuality))
Global Const $lbMethod = GUICtrlCreateLabel("Method", 10, 210, 39, 20)
Global Const $slMethod = GUICtrlCreateSlider(116, 210, $iW - 164, 21, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_ENABLESELRANGE)), $hslMethod = GUICtrlGetHandle($slMethod)
GUICtrlSetLimit(-1, 6, 0)
GUICtrlSetData(-1, 4)
GUICtrlSetTip(-1, "Quality/speed trade-off (0=fast, 6=slower-better.")
Global Const $ipMethod = GUICtrlCreateInput("", $iW - 48, 206, 28, 24, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_READONLY))
GUICtrlSetData(-1, GUICtrlRead($slMethod))
Global Const $lbSNS_Strength = GUICtrlCreateLabel("SNS-Strength", 10, 242, 66, 20)
Global Const $slSNS_Strength = GUICtrlCreateSlider(116, 244, $iW - 164, 21, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_ENABLESELRANGE)), $hslSNS_Strength = GUICtrlGetHandle($slSNS_Strength)
GUICtrlSetLimit(-1, 100, 0)
GUICtrlSetData(-1, 50)
GUICtrlSetTip(-1, "Spatial Noise Shaping. 0=off, 100=maximum.")
Global Const $ipSSN_Strength = GUICtrlCreateInput("", $iW - 48, 240, 28, 24, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_READONLY))
GUICtrlSetData(-1, GUICtrlRead($slSNS_Strength))
Global Const $lbFilterSharpness = GUICtrlCreateLabel("Filter Sharpness", 10, $iW - 48, 81, 20)
Global Const $slFilter_Sharpness = GUICtrlCreateSlider(116, 278, $iW - 164, 21, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_ENABLESELRANGE)), $hslFilter_Sharpness = GUICtrlGetHandle($slFilter_Sharpness)
GUICtrlSetLimit(-1, 7, 0)
GUICtrlSetTip(-1, "Range: [0 = off .. 7 = least sharp].")
Global Const $ipFilter_Sharpness = GUICtrlCreateInput("", $iW - 48, 274, 28, 24, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_READONLY))
GUICtrlSetData(-1, GUICtrlRead($slFilter_Sharpness))
Global Const $lbFilter_Strength = GUICtrlCreateLabel("Filter Strenght", 010, 304, 69, 20)
Global Const $slFilter_Strength = GUICtrlCreateSlider(116, 312, $iW - 164, 21, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_ENABLESELRANGE)), $hslFilter_Strength = GUICtrlGetHandle($slFilter_Strength)
GUICtrlSetLimit(-1, 100, 0)
GUICtrlSetData(-1, 60)
GUICtrlSetTip(-1, "Range: [0 = off .. 100 = strongest]")
Global Const $ipFilter_Strength = GUICtrlCreateInput("", $iW - 48, 308, 28, 24, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_READONLY))
GUICtrlSetData(-1, GUICtrlRead($slFilter_Strength))
Global Const $lbPass = GUICtrlCreateLabel("Pass", 10, 344, 27, 20)
Global Const $slPass = GUICtrlCreateSlider(116, 346, $iW - 164, 21, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_ENABLESELRANGE)), $hslPass = GUICtrlGetHandle($slPass)
GUICtrlSetLimit(-1, 10, 1)
GUICtrlSetData(-1, 6)
GUICtrlSetTip(-1, "Number of entropy-analysis passes (in [1..10]).")
Global Const $ipPass = GUICtrlCreateInput("", $iW - 48, 342, 28, 24, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_READONLY))
GUICtrlSetData(-1, GUICtrlRead($slPass))
Global Const $lbNear_Lossless = GUICtrlCreateLabel("Near Lossless", 10, 378, 80, 20)
Global Const $slNear_Lossless = GUICtrlCreateSlider(116, 380, $iW - 164, 21, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_ENABLESELRANGE)), $hslNear_Lossless = GUICtrlGetHandle($slNear_Lossless)
GUICtrlSetLimit(-1, 100, 0)
GUICtrlSetData(-1, 60)
GUICtrlSetTip(-1, "Specify the level of near-lossless image preprocessing. The range is 0 (maximum preprocessing) to 100 (no preprocessing, the default).")
Global Const $ipNear_Lossless = GUICtrlCreateInput("", $iW - 48, 374, 28, 24, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_READONLY))
GUICtrlSetData(-1, GUICtrlRead($slNear_Lossless))
Global Const $lbLevel = GUICtrlCreateLabel("Level", 10, 411, 30, 20)
Global Const $slLevel = GUICtrlCreateSlider(116, 414, $iW - 164, 21, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_ENABLESELRANGE)), $hslLevel = GUICtrlGetHandle($slLevel)
GUICtrlSetLimit(-1, 9, 0)
GUICtrlSetData(-1, 6)
GUICtrlSetTip(-1, "Switch on lossless compression mode with the specified level between 0 and 9, with level 0 being the fastest, 9 being the slowest.")
Global Const $ipLevel = GUICtrlCreateInput("", $iW - 48, 410, 28, 24, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_READONLY))
GUICtrlSetData(-1, GUICtrlRead($slLevel))
Global Const $lbAlpha_Compression = GUICtrlCreateLabel("Alpha Compression", 10, 444, 96, 20)
Global Const $chkbAlpha_Compression = GUICtrlCreateCheckbox("&Enable", 120, 444, 97, 17)
GUICtrlSetState(-1, $GUI_CHECKED)
Global Const $lbAlpha_Filtering = GUICtrlCreateLabel("Alpha Filtering", 10, 478, 71, 20)
Global Const $slAlpha_Filtering = GUICtrlCreateSlider(114, 482, $iW - 164, 21, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_ENABLESELRANGE)), $hslAlpha_Filtering = GUICtrlGetHandle($slAlpha_Filtering)
GUICtrlSetLimit(-1, 2, 0)
GUICtrlSetData(-1, 1)
GUICtrlSetTip(-1, "Predictive filtering method for alpha plane. 0: none, 1: fast, 2: best. Default if 1.")
Global Const $ipAlpha_Filtering = GUICtrlCreateInput("", $iW - 48, 478, 28, 24, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_READONLY))
GUICtrlSetData(-1, GUICtrlRead($slAlpha_Filtering))
Global Const $lbAlpha_Quality = GUICtrlCreateLabel("Alpha Quality", 8, 516, 66, 20)
Global Const $slAlpha_Quality = GUICtrlCreateSlider(114, 516, $iW - 164, 21, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_ENABLESELRANGE)), $hslAlpha_Quality = GUICtrlGetHandle($slAlpha_Quality)
GUICtrlSetLimit(-1, 100, 0)
GUICtrlSetData(-1, 100)
GUICtrlSetTip(-1, "Between 0 (smallest size) and 100 (lossless).")
Global Const $ipAlpha_Quality = GUICtrlCreateInput("", $iW - 48, 512, 28, 24, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_READONLY))
GUICtrlSetData(-1, GUICtrlRead($slAlpha_Quality))
Global Const $lbTarget_Size = GUICtrlCreateLabel("Target Size", 10, 552, 58, 20)
Global Const $ipTarget_Size = GUICtrlCreateInput("0", 120, 550, $iW - 177, 24, $ES_NUMBER)
GUICtrlSetTip(-1, "If non-zero, set the desired target size in bytes (lossy mode only!).")
Global Const $chkbCountColors = GUICtrlCreateCheckbox("&Count Colors", 10, 590, 87, 17)
Global Const $lbColorOriginal = GUICtrlCreateLabel("Source:", 101, 590, 38, 20)
Global Const $ipColorOriginal = GUICtrlCreateInput("0", 142, 588, 60, 24, BitOR($ES_NUMBER, $ES_READONLY))
Global Const $lbColorWebP = GUICtrlCreateLabel("WebP:", 215, 590, 32, 20)
Global Const $ipColorWebP = GUICtrlCreateInput("0", 250, 588, 60, 24, BitOR($ES_NUMBER, $ES_READONLY))
Global Const $btnShow = GUICtrlCreateButton("Show Original Image", 10, 630, 123, 25)
GUICtrlSetTip(-1, "Press lmb and hold it to display original image.")
Global Const $btnApply = GUICtrlCreateButton("&Apply Settings", 188, 630, 123, 25)
Global Const $StatusBar = _GUICtrlStatusBar_Create($hGUI), $iSBColor = 0xE9CFEC
_WinAPI_SetWindowTheme($StatusBar, "", "")
_GUICtrlStatusBar_SetText($StatusBar, " Welcome to 'WebP Advanced Encoder GUI' ٩(●̮̮̃•̃)۶")
_GUICtrlStatusBar_SetBkColor($StatusBar, $iSBColor)
Global Const $hGUI_Image = GUICreate("", 0, 0, -1, -1, $WS_EX_TOOLWINDOW, BitOR($WS_EX_TOOLWINDOW, $WS_EX_APPWINDOW))
GUISetBkColor(BitAND(0xFFFFFF, $bGUIBgColor), $hGUI_Image)
Global Const $iPic_WebP = GUICtrlCreatePic("", 0, 0, 0, 0), $hPic_WebP = GUICtrlGetHandle($iPic_WebP)
;~ Global Const $iW_Zoom = @DesktopWidth * 0.25, $iH_Zoom = @DesktopHeight * 0.25
;~ Global Const $hGUI_Image_Zoom = GUICreate("", $iW_Zoom, $iH_Zoom, 0, 0, $WS_POPUP)
Global Const $dw = _WinAPI_GetSystemMetrics($SM_CXDLGFRAME), $dh = _WinAPI_GetSystemMetrics($SM_CYDLGFRAME) + _WinAPI_GetSystemMetrics($SM_CYSIZE) + 1
Global Enum $idAbout = 5000, $idResetPicPos, $idResetValues
Global Const $hMenu_Sys = _GUICtrlMenu_GetSystemMenu($hGUI)
_GUICtrlMenu_AppendMenu($hMenu_Sys, $MF_SEPARATOR, 0, 0)
_GUICtrlMenu_AppendMenu($hMenu_Sys, $MF_STRING, $idAbout, "About")
Global Const $hImage_Icon = _GDIPlus_BitmapCreateFromMemory(_WebP_Icon())
Global Const $hIcon = _GDIPlus_HICONCreateFromBitmap($hImage_Icon)
_WinAPI_SetClassLongEx($hGUI, -34, $hIcon)
_GDIPlus_ImageDispose($hImage_Icon)
GUISetState(@SW_HIDE, $hGUI_Image)
GUISetState(@SW_SHOW, $hGUI)
;~ GUISetState(@SW_SHOW, $hGUI_Image_Zoom)
_WinAPI_SetProcessDpiAwarenessContext($Context_PerMonitorAwareV2, $hGUI, 2)
Global Const $iDummy_About = GUICtrlCreateDummy(), $iDummy_Return = GUICtrlCreateDummy()
Global $sFileLoad, $hImage, $hImage_GDI, $hHBitmap, $aDim, $aPixelFormat, $pMemData, $pMemData_Size, $tMem, $mp, $sFileSave, $hFile, $nBytes, $nBytes, $iResetPosX, $iResetPosY, _
$hImage_tmp
GUIRegisterMsg($WM_DROPFILES, "WM_DROPFILES")
GUIRegisterMsg($WM_LBUTTONDOWN, "WM_LBUTTONDOWN")
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
GUIRegisterMsg($WM_CONTEXTMENU, "WM_CONTEXTMENU")
GUIRegisterMsg($WM_SYSCOMMAND, "WM_SYSCOMMAND")
GUIRegisterMsg($WM_HSCROLL, "WM_HSCROLL")
#EndRegion GUI
Global $aGUIGetMsg, $aMPos1, $aMPos2, $iMPx, $iMPy, $iMPx_p = 0, $iMPy_p = 0, $bBigger = False, $iResult, $old_cursor, $bNew = False
While 1
$mp = GUIGetCursorInfo($hGUI)
If $hImage And $mp[2] And $mp[4] = $btnShow Then
_WinAPI_DeleteObject(GUICtrlSendMsg($iPic_WebP, $STM_SETIMAGE, $IMAGE_BITMAP, $hImage_GDI))
While $mp[2]
$mp = GUIGetCursorInfo($hGUI)
Sleep(10)
WEnd
_WinAPI_DeleteObject(GUICtrlSendMsg($iPic_WebP, $STM_SETIMAGE, $IMAGE_BITMAP, $hHBitmap))
EndIf
$mp = GUIGetCursorInfo($hGUI_Image)
$aMPos1 = MouseGetPos()
If $mp[4] = $iPic_WebP And $mp[2] And $bBigger And WinActive($hGUI_Image) Then
While $mp[2]
$mp = GUIGetCursorInfo($hGUI_Image)
Sleep(10)
$aMPos2 = MouseGetPos()
$iMPx = $iMPx_p + $aMPos2[0] - $aMPos1[0]
$iMPy = $iMPy_p + $aMPos2[1] - $aMPos1[1]
ControlMove($hGUI_Image, "", $iPic_WebP, $iMPx, $iMPy)
WEnd
$iMPx_p = $iMPx
$iMPy_p = $iMPy
EndIf
$aGUIGetMsg = GUIGetMsg(1)
Switch $aGUIGetMsg[1]
Case $hGUI
Switch $aGUIGetMsg[0]
Case $GUI_EVENT_CLOSE
GUIRegisterMsg($WM_DROPFILES, "")
GUIRegisterMsg($WM_LBUTTONDOWN, "")
GUIRegisterMsg($WM_COMMAND, "")
GUIRegisterMsg($WM_CONTEXTMENU, "")
GUIRegisterMsg($WM_SYSCOMMAND, "")
GUIRegisterMsg($WM_HSCROLL, "")
;~ If IsDllStruct($tMem) Then WebP_FreeUp($tMem)
_WinAPI_DestroyIcon($hIcon)
If $hImage_tmp Then _GDIPlus_ImageDispose($hImage_tmp)
If $hImage Then _GDIPlus_ImageDispose($hImage)
If $hHBitmap Then _WinAPI_DeleteObject($hHBitmap)
If $hImage_GDI Then _WinAPI_DeleteObject($hImage_GDI)
If $hGUI_Image Then GUIDelete($hGUI_Image)
_GDIPlus_Shutdown()
GUIDelete($hGUI_Image)
GUIDelete($hGUI)
DllClose($_KERNEL32DLL)
Exit
Case $btnApply, $iDummy_Return
If $hImage Then
CompressAndDisplay($hImage)
EndIf
Case $icLoad
$sFileLoad = FileOpenDialog("Select an image to compress", "", "Images (*.jpg;*.bmp;*.png;*.gif;*.tif;*webp)")
If @error Then ContinueLoop
LoadImage($sFileLoad)
Case $icSave
If $hImage Then
$sFileSave = FileSaveDialog("Save WebP Image", "", "WebP Image (*.webp)", BitOR($FD_PATHMUSTEXIST, $FD_PROMPTOVERWRITE), StringRegExpReplace($sFileLoad, ".+\\(.+)\..*", "$1") & ".webp", $hGUI)
If @error Then ContinueLoop
$hFile = _WinAPI_CreateFile($sFileSave, 1)
$iResult = _WinAPI_WriteFile($hFile, $tMem.pMemData, $tMem.memsize, $nBytes)
_WinAPI_CloseHandle($hFile)
If Not $iResult Then
MsgBox($MB_ICONERROR, "ERROR", "Unable to save WebP image to disk!", 30, $hGUI)
Else
MsgBox($MB_ICONINFORMATION, "Information", "WebP image successfully save to disk", 10, $hGUI)
EndIf
EndIf
Case $icReset
ResetImage()
Case $slAlpha_Filtering
GUICtrlSetData($ipAlpha_Filtering, GUICtrlRead($slAlpha_Filtering))
Case $slAlpha_Quality
GUICtrlSetData($ipAlpha_Quality, GUICtrlRead($slAlpha_Quality))
Case $slFilter_Sharpness
GUICtrlSetData($ipFilter_Sharpness, GUICtrlRead($slFilter_Sharpness))
Case $slFilter_Strength
GUICtrlSetData($ipFilter_Strength, GUICtrlRead($slFilter_Strength))
Case $slLevel
GUICtrlSetData($ipLevel, GUICtrlRead($slLevel))
Case $slMethod
GUICtrlSetData($ipMethod, GUICtrlRead($slMethod))
Case $slNear_Lossless
GUICtrlSetData($ipNear_Lossless, GUICtrlRead($slNear_Lossless))
Case $slPass
GUICtrlSetData($ipPass, GUICtrlRead($slPass))
Case $slQuality
GUICtrlSetData($ipQuality, GUICtrlRead($slQuality))
Case $slSNS_Strength
GUICtrlSetData($ipSSN_Strength, GUICtrlRead($slSNS_Strength))
Case $iDummy_About
AutoItSetOption("GUIOnEventMode", 1)
GDIPlus_About(11 * $aDPI[0], -12, 24.5)
AutoItSetOption("GUIOnEventMode", 0)
Case $btnShow
If BitAND(WinGetState($hGUI_Image), $WIN_STATE_VISIBLE) = $WIN_STATE_VISIBLE Then WinActivate($hGUI_Image)
EndSwitch
Case $hGUI_Image
Switch $aGUIGetMsg[0]
Case $GUI_EVENT_CLOSE
EndSwitch
EndSwitch
WEnd
Func ResetImage()
If $bBigger Then
$iMPx_p = $iResetPosX
$iMPy_p = $iResetPosY
ControlMove($hGUI_Image, "", $iPic_WebP, $iMPx_p, $iMPy_p)
EndIf
EndFunc
Func LoadImage($sFileLoad)
If $hImage_tmp Then _GDIPlus_ImageDispose($hImage_tmp)
If $hImage Then _GDIPlus_ImageDispose($hImage)
If $hImage_GDI Then _WinAPI_DeleteObject($hImage_GDI)
If StringRight($sFileLoad, 5) = ".webp" Then
If WebP_GetAmountOfAnimFrames($sFileLoad) > 0 Then Return MsgBox($MB_ICONERROR, "ERROR", "WebP animated image cannot be loaded!", 30, $hGUI)
$hImage_tmp = WebP_BitmapCreateGDIp($sFileLoad)
If @error Or $hImage_tmp = 0 Then
Return MsgBox($MB_ICONERROR, "ERROR", "Unable to decode WebP image!", 30, $hGUI)
EndIf
Else
$hImage_tmp = _GDIPlus_ImageLoadFromFile($sFileLoad)
If @error Or $hImage_tmp = 0 Then
Return MsgBox($MB_ICONERROR, "ERROR", "Unknown image format!", 30, $hGUI)
EndIf
EndIf
$aPixelFormat = _GDIPlus_ImageGetPixelFormat($hImage_tmp)
;Local Const $aImageRawFormat = _GDIPlus_ImageGetRawFormat($hImage_tmp)
If BitAND(GUICtrlRead($chkbCountColors), $GUI_CHECKED) Then
GUICtrlSetData($ipColorOriginal, BitmapCountColors($hImage_tmp))
Else
GUICtrlSetData($ipColorOriginal, 0)
EndIf
;~ If $hImage_tmp Then ConsoleWrite("Original color count: " & BitmapCountColors($hImage_tmp) & @CRLF)
$aDim = _GDIPlus_ImageGetDimension($hImage_tmp)
$hImage = _GDIPlus_BitmapCreateFromScan0($aDim[0], $aDim[1])
Local Const $hGfx = _GDIPlus_ImageGetGraphicsContext($hImage)
If $aPixelFormat[0] = 2498570 Then _GDIPlus_GraphicsClear($hGfx, $bGUIBgColor)
_GDIPlus_GraphicsDrawImageRect($hGfx, $hImage_tmp, 0, 0, $aDim[0], $aDim[1])
_GDIPlus_GraphicsDispose($hGfx)
$hImage_GDI = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
$bNew = True
_WinAPI_LockWindowUpdate($hGUI)
CompressAndDisplay($hImage, $aPixelFormat[1])
_WinAPI_LockWindowUpdate(0)
EndFunc ;==>LoadImage
Func CompressAndDisplay($hImage, $sFormat = "")
Local $aDim = _GDIPlus_ImageGetDimension($hImage)
If $hHBitmap Then _WinAPI_DeleteObject($hHBitmap)
$pMemData = 0
$pMemData_Size = 0
Local $iPreset = GUICtrlRead($cbPreset)
Switch $iPreset
Case "Default"
$iPreset = 0
Case "Picture"
$iPreset = 1
Case "Photo"
$iPreset = 2
Case "Drawing"
$iPreset = 3
Case "Icon"
$iPreset = 4
Case "Text"
$iPreset = 5
EndSwitch
;~ If IsDllStruct($tMem) Then WebP_FreeUp($tMem)
$old_cursor = MouseGetCursor()
GUISetCursor(15, 1, $hGUI)
_GUICtrlStatusBar_SetBkColor($StatusBar, 192)
Local $iCallback = DllCallbackRegister("Progress", "long", "long;ptr"), $hCallback = DllCallbackGetPtr($iCallback)
Sleep(10)
Local $end, $fTimer = TimerInit()
$tMem = WebP_CreateWebPAdvancedFromBitmap("", $hImage, _
$iPreset, _
BitAND(GUICtrlRead($chkbLossless), $GUI_CHECKED), _
GUICtrlRead($slQuality), _
GUICtrlRead($slMethod), _
GUICtrlRead($slSNS_Strength), _
GUICtrlRead($slFilter_Sharpness), _
GUICtrlRead($slFilter_Strength), _
GUICtrlRead($slPass), _
GUICtrlRead($slLevel), _
GUICtrlRead($slNear_Lossless), _
BitAND(GUICtrlRead($chkbAlpha_Compression), $GUI_CHECKED), _
GUICtrlRead($slAlpha_Filtering), _
GUICtrlRead($slAlpha_Quality), _
GUICtrlRead($ipTarget_Size), _
True, _ ;hold the compressed image in memory only, no save to HD!
$hCallback)
$end = TimerDiff($fTimer)
DllCallbackFree($hCallback)
ToolTip("")
_GUICtrlStatusBar_SetBkColor($StatusBar, $iSBColor)
GUISetCursor($old_cursor, 1, $hGUI)
Local $iColorsWebp = 0
If IsDllStruct($tMem) Then
_GUICtrlStatusBar_SetText($StatusBar, "WebP size: " & Round($tMem.memsize / 1024, 2) & " kb / encoded in " & Round($end, 2) & " ms.")
$hHBitmap = WebP_BitmapCreateGDIpFromMem($tMem.pMemData, $tMem.memsize, True, BitAND(GUICtrlRead($chkbCountColors), $GUI_CHECKED))
If @error Then Return MsgBox($MB_ICONERROR, "ERROR", "Unable to compress image", 30, $hGUI)
$iColorsWebp = @extended
GUICtrlSetData($ipColorWebP, $iColorsWebp)
If BitAND(GUICtrlRead($chkbCountColors), $GUI_CHECKED) And GUICtrlRead($ipColorOriginal) = "0" Then GUICtrlSetData($ipColorOriginal, BitmapCountColors($hImage_tmp))
;~ ConsoleWrite("WebP image color count: " & @extended & @CRLF)
Local $aTaskbar = WinGetPos("[CLASS:Shell_TrayWnd;INSTANCE:1]", ""), $tbw = 0, $tbh = 0
If $aTaskbar[2] > $aTaskbar[3] Then
$tbh = $aTaskbar[3]
ELse
$tbw = $aTaskbar[2]
EndIf
Local Const $minw = 384, $minh = $minw * 10 / 16
Local $maxw = Min($aDim[0] + $dw, @DesktopWidth * 0.95), $maxh = Min($aDim[1] + $dh, @DesktopHeight * 0.95), $iNewW = 0, $iNewH = 0
If $aDim[0] + $dw > @DesktopWidth * 0.95 Or $aDim[1] + $dh > @DesktopHeight * 0.95 Then
$bBigger = True
Else
$bBigger = False
EndIf
If $bNew Then
$iNewW = Max($minw, $maxw)
$iNewH = Max($minh, $maxh)
WinMove($hGUI_Image, "", (@DesktopWidth - $iNewW - (@DesktopWidth - $iW > $iNewW ? $iW : 0)) / 2 - $tbw, (@DesktopHeight - $iNewH - $tbh) / 2, $iNewW, $iNewH)
WinSetTitle($hGUI_Image, "", StringRegExpReplace($sFileLoad, ".+\\(.*)", "$1") & " / " & $aDim[0] & "x" & $aDim[1] & " px / " & $sFormat & " / " & Round(FileGetSize($sFileLoad) / 1024, 2) & " kb")
$iNewH -= $dh ;_WinAPI_GetSystemMetrics($SM_CXBORDER) + _WinAPI_GetSystemMetrics($SM_CYSIZE) + _WinAPI_GetSystemMetrics($SM_CXPADDEDBORDER) * 2
$iMPx_p = ($iNewW - $aDim[0]) / 2
$iMPy_p = ($iNewH - $aDim[1] - 4) / 2
$iResetPosX = $iMPx_p
$iResetPosY = $iMPy_p
GUICtrlSetPos($iPic_WebP, $iMPx_p, $iMPy_p, $iNewW - 1, $iNewH - 1)
$bNew = False
EndIf
_WinAPI_DeleteObject(GUICtrlSendMsg($iPic_WebP, $STM_SETIMAGE, $IMAGE_BITMAP, $hHBitmap))
Local Const $iWC_State = WinGetState($hGUI_Image)
If $iWC_State <> 7 Or $iWC_State <> 5 Then
WinSetState($hGUI_Image, "", @SW_SHOW)
WinActivate($hGUI_Image)
EndIf
WinActivate($hGUI)
Else
MsgBox($MB_ICONERROR, "ERROR", "DLL encode error " & $tMem, 30)
EndIf
EndFunc ;==>CompressAndDisplay
Func Progress($progress, $ptr)
ToolTip($progress & "%", MouseGetPos(0) - 40, MouseGetPos(1))
Return 1
EndFunc
Func WM_HSCROLL($hWnd, $Msg, $wParam, $lParam)
#forceref $hWnd, $Msg, $wParam
Switch $lParam
Case $hslAlpha_Filtering
GUICtrlSetData($ipAlpha_Filtering, GUICtrlRead($slAlpha_Filtering))
Case $hslAlpha_Quality
GUICtrlSetData($ipAlpha_Quality, GUICtrlRead($slAlpha_Quality))
Case $hslFilter_Sharpness
GUICtrlSetData($ipFilter_Sharpness, GUICtrlRead($slFilter_Sharpness))
Case $hslFilter_Strength
GUICtrlSetData($ipFilter_Strength, GUICtrlRead($slFilter_Strength))
Case $hslLevel
GUICtrlSetData($ipLevel, GUICtrlRead($slLevel))
Case $hslMethod
GUICtrlSetData($ipMethod, GUICtrlRead($slMethod))
Case $hslNear_Lossless
GUICtrlSetData($ipNear_Lossless, GUICtrlRead($slNear_Lossless))
Case $hslPass
GUICtrlSetData($ipPass, GUICtrlRead($slPass))
Case $hslQuality
GUICtrlSetData($ipQuality, GUICtrlRead($slQuality))
Case $hslSNS_Strength
GUICtrlSetData($ipSSN_Strength, GUICtrlRead($slSNS_Strength))
EndSwitch
Return "GUI_RUNDEFMSG"
EndFunc ;==>WM_HSCROLL
Func WM_DROPFILES($hWnd, $iMsg, $wParam, $lParam)
Local $i = 1
Local $aFileList = _WinAPI_DragQueryFileEx($wParam)
Do
If StringInStr(FileGetAttrib($aFileList[$i]), "D") Then
_ArrayDelete($aFileList, $i)
Else
$i += 1
EndIf
Until $i = UBound($aFileList)
$aFileList[0] = UBound($aFileList) - 1
$sFileLoad = $aFileList[1]
_WinAPI_DragFinish($wParam)
LoadImage($sFileLoad)
Return 0
EndFunc ;==>WM_DROPFILES#
Func WM_LBUTTONDOWN($hWnd, $iMsg, $wParam, $lParam)
_SendMessage($hWnd, $WM_SYSCOMMAND, $SC_DRAGMOVE, 0)
EndFunc ;==>_WM_LBUTTONDOWN
Func WM_SYSCOMMAND($hWnd, $iMsg, $iwParam, $ilParam)
#forceref $hWnd, $iMsg, $ilParam
Switch BitAND($iwParam, 0x0000FFFF)
Case $idAbout
GUICtrlSendToDummy($iDummy_About)
EndSwitch
Return "GUI_RUNDEFMSG"
EndFunc ;==>WM_SYSCOMMAND
Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
#forceref $hWnd, $iMsg
Switch $iwParam
Case 1
GUICtrlSendToDummy($iDummy_Return)
Return 0
Case $idResetPicPos
ResetImage()
Return 0
Case $idResetValues
GUICtrlSetData($slAlpha_Filtering, 1)
GUICtrlSetData($ipAlpha_Filtering, 1)
GUICtrlSetData($slAlpha_Quality, 100)
GUICtrlSetData($ipAlpha_Quality, 100)
GUICtrlSetData($slFilter_Sharpness, 0)
GUICtrlSetData($ipFilter_Sharpness, 0)
GUICtrlSetData($slFilter_Strength, 60)
GUICtrlSetData($ipFilter_Strength, 60)
GUICtrlSetData($slLevel, 6)
GUICtrlSetData($ipLevel, 6)
GUICtrlSetData($slMethod, 4)
GUICtrlSetData($ipMethod, 4)
GUICtrlSetData($slNear_Lossless, 60)
GUICtrlSetData($ipNear_Lossless, 60)
GUICtrlSetData($slPass, 6)
GUICtrlSetData($ipPass, 6)
GUICtrlSetData($slQuality, 75)
GUICtrlSetData($ipQuality, 75)
GUICtrlSetData($slSNS_Strength, 50)
GUICtrlSetData($ipSSN_Strength, 50)
GUICtrlSetData($ipTarget_Size, 0)
GUICtrlSetState($chkbAlpha_Compression, $GUI_CHECKED)
GUICtrlSetState($chkbLossless, $GUI_UNCHECKED)
_SendMessage($hcbPreset, $CB_SETCURSEL, 0)
Return 0
EndSwitch
Return "GUI_RUNDEFMSG"
EndFunc ;==>WM_COMMAND
Func WM_CONTEXTMENU($hWnd, $iMsg, $wParam, $lParam)
#forceref $hWnd, $iMsg, $lParam
Switch $hWnd
Case $hGUI
Local $hMenu
$hMenu = _GUICtrlMenu_CreatePopup()
_GUICtrlMenu_InsertMenuItem($hMenu, 0, "Reset values to default", $idResetValues)
If $bBigger Then
_GUICtrlMenu_InsertMenuItem($hMenu, 1, 0)
_GUICtrlMenu_InsertMenuItem($hMenu, 2, "Reset image position", $idResetPicPos)
EndIf
_GUICtrlMenu_TrackPopupMenu($hMenu, $wParam)
_GUICtrlMenu_DestroyMenu($hMenu)
Return True
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_CONTEXTMENU
Func Max($a, $b)
If $a > $b Then Return $a
Return $b
EndFunc
Func Min($a, $b)
If $a < $b Then Return $a
Return $b
EndFunc
Func GDIPlus_About($iFontsize = 10, $dx = 0, $dy = 0, $iSpeed = 333, $sFont = "MV Boli")
If @AutoItX64 = 0 Then
Local $binSIDSound = _Chip_Sound()
_SIDStartup()
_SIDOpen($binSIDSound)
EndIf
Local Const $iWh = $iW / 2, $iHh = $iH / 2, $sTitle = "GDI+ About Window"
Local Const $fPi = ACos(-1), $fRad = $fPi / 180, $fDeg = 180 / $fPi
#Region text
Local $sText = _
" WebP Advanced Encoder GUI ²" & _
" " & $ver & " beta " & _
" " & $build & " " & _
" " & _
" Coded by UEZ ;-) " & _
" " & _
"Credits to: " & _
" " & _
"* Google for the WebP API " & _
" and static libraries " & _
"* wakillon for TichySID " & _
" and Stat-Mat for the DLL " & _
"* Soren Lund for SID Tune " & _
"* Ward for Mem call code " & _
" " & _
"-------------------------- " & _
" " & _
"Greetings fly out to: " & _
" " & _
" All Autoit users " & _
" around the globe " & _
" " & _
" " & _
" Press ESC to exit. " & _
" " & _
" " & _
"-------------------------- " & _
" " & _
"NO ..--+++--.. WAR " & _
" .-' | `-. " & _
" +' | `+ " & _
" ' | ` " & _
" ' | ` " & _
": | : " & _
": +'|`+ : " & _
". +' | `+ ; " & _
" + +' | `+ + " & _
" `. +' | `+ .' " & _
" `._ | _.' " & _
"Peace `--.._|_..--' :-) "
#EndRegion
$bExit = False
$hGUI_About = GUICreate($sTitle, $iW, $iH, 0, 0, $WS_POPUP, $WS_EX_NOPARENTNOTIFY, $hGUI)
_WinAPI_SetParent($hGUI_About, $hGUI)
WinSetTrans($hGUI_About, "", 0xD8)
GUISetState(@SW_SHOWNA, $hGUI_About)
;create canvas elements
Local Const $hDC = _WinAPI_GetDC($hGUI_About)
Local Const $hHBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $iW, $iH)
Local Const $hDC_backbuffer = _WinAPI_CreateCompatibleDC($hDC)
Local Const $DC_obj = _WinAPI_SelectObject($hDC_backbuffer, $hHBitmap)
Local Const $hCanvas = _GDIPlus_GraphicsCreateFromHDC($hDC_backbuffer)
_GDIPlus_GraphicsSetSmoothingMode($hCanvas, $GDIP_SMOOTHINGMODE_HIGHQUALITY)
_GDIPlus_GraphicsSetPixelOffsetMode($hCanvas, $GDIP_PIXELOFFSETMODE_HIGHQUALITY)
Local Const $hBrush_Clr = _GDIPlus_HatchBrushCreate(18, 0xF0B0B0E0, 0xF0F0F0FF), _
$hBrush_FPS = _GDIPlus_BrushCreateSolid(0xF0808080), _
$hFormat_FPS = _GDIPlus_StringFormatCreate(), _
$hFamily_FPS = _GDIPlus_FontFamilyCreate("Arial"), _
$hFont_FPS = _GDIPlus_FontCreate($hFamily_FPS, 8), _
$tLayout_FPS = _GDIPlus_RectFCreate(0, 0, 100, 24)
$iFPS = 0
GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit_About")
Local $iLen = StringLen($sText), $iColums = StringInStr($sText, "²"), $i, $u, $s, $r, $iChar_Space, $x, $y, $t = 0, $f, $b = 0, $a = 512, $iCharCol = 0x101030
$sText = StringReplace($sText, "²", " ")
Local $aChars = StringSplit($sText, "", 2)
Local $hFormat_char = _GDIPlus_StringFormatCreate(), $hFamily_char = _GDIPlus_FontFamilyCreate($sFont), $hFont_char = _GDIPlus_FontCreate($hFamily_char, $iFontsize, 1), _
$tLayout_char = _GDIPlus_RectFCreate(), $hBrush_char = _GDIPlus_BrushCreateSolid(0xFF000000 + $iCharCol)
Local Const $iMilliSeconds = 5
AdlibRegister("CalcFPS", 1000)
Do
DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hCanvas, "handle", $hBrush_Clr, "float", 0, "float", 0, "float", $iW, "float", $iH) ;erase canvas background
For $i = 0 To UBound($aChars) - 1
If $aChars[$i] <> " " Then
$f = $t - $i / $iSpeed
$s = $f > 2 ? 2 : $f
$s = $s > 0 ? $s : 0
$r = (2 - $s) * $iColums * $iColums
$iChar_Space = $s / 5.1 * $iColums
$tLayout_char.x = $dx + $r / 2 * Sin($t + $i) + Mod($i, $iColums) * $iChar_Space
$tLayout_char.y = $dy + $r / 3 * Cos($t + $i) + Int($i / $iColums) * $iChar_Space * 1.3333
DllCall($__g_hGDIPDll, "int", "GdipDrawString", "handle", $hCanvas, "wstr", $aChars[$i], "int", -1, "handle", $hFont_char, "struct*", $tLayout_char, "handle", $tLayout_char, "handle", $hBrush_char)
EndIf
Next
$t += 0.025
DllCall($__g_hGDIPDll, "int", "GdipDrawString", "handle", $hCanvas, "wstr", "FPS: " & $iShowFPS, "int", -1, "handle", $hFont_FPS, "struct*", $tLayout_FPS, "handle", $hFormat_FPS, "handle", $hBrush_FPS)
DllCall("gdi32.dll", "bool", "BitBlt", "handle", $hDC, "int", 0, "int", 0, "int", $iW, "int", $iH, "handle", $hDC_backbuffer, "int", 0, "int", 0, "dword", $SRCCOPY)
$iFPS += 1
If $bExit Then ExitLoop
If $r = 0 Then $b = 1
If $b Then
$a -= 5
If $a < 256 Then DllCall($__g_hGDIPDll, "int", "GdipSetSolidFillColor", "handle", $hBrush_char, "dword", BitShift(Max(0, $a), -24) + $iCharCol)
If $a <= -50 Then
$b = 0
$a = 384
DllCall($__g_hGDIPDll, "int", "GdipSetSolidFillColor", "handle", $hBrush_char, "dword", 0xFF000000 + $iCharCol)
$t = 0
EndIf
EndIf
DllCall($_KERNEL32DLL, "dword", "SleepEx", "dword", $iMilliSeconds, "bool", True)
Until False
AdlibUnRegister("CalcFPS")
;release resources
_GDIPlus_FontDispose($hFont_char)
_GDIPlus_FontFamilyDispose($hFamily_char)
_GDIPlus_StringFormatDispose($hFormat_char)
_GDIPlus_BrushDispose($hBrush_char)
_GDIPlus_FontDispose($hFont_FPS)
_GDIPlus_FontFamilyDispose($hFamily_FPS)
_GDIPlus_StringFormatDispose($hFormat_FPS)
_GDIPlus_BrushDispose($hBrush_Clr)
_GDIPlus_BrushDispose($hBrush_FPS)
_GDIPlus_GraphicsDispose($hCanvas)
_WinAPI_SelectObject($hDC_backbuffer, $DC_obj)
_WinAPI_DeleteDC($hDC_backbuffer)
_WinAPI_DeleteObject($hHBitmap)
_WinAPI_ReleaseDC($hGUI_About, $hDC)
GUIDelete($hGUI_About)
If @AutoItX64 = 0 Then
_SIDStop()
_SIDClose()
_SIDShutdown()
$binSIDSound = 0
EndIf
EndFunc ;==>GDIPlus_About
Func _Exit_About()
$bExit = True
EndFunc ;==>_Exit_About
Func CalcFPS() ;display FPS
$iShowFPS = $iFPS
$iFPS = 0
EndFunc ;==>CalcFPS
Func _GDIPlus_GraphicsGetDPIRatio($iDPIDef = 96)
Local $hGfx = _GDIPlus_GraphicsCreateFromHWND(0)
If @error Then Return SetError(1, @extended, 0)
Local $aResult = DllCall($__g_hGDIPDll, "int", "GdipGetDpiX", "handle", $hGfx, "float*", 0)
If @error Then Return SetError(2, @extended, 0)
Local $iDPI = $aResult[2]
_GDIPlus_GraphicsDispose($hGfx)
Local $aResults[2] = [$iDPIDef / $iDPI, $iDPI / $iDPIDef]
Return $aResults
EndFunc ;==>_GDIPlus_GraphicsGetDPIRatio
Func _WinAPI_GetDpiForMonitor($dpiType = $MDT_DEFAULT, $iDPIDef = 96)
Local $aMonitors = _WinAPI_EnumDisplayMonitors()
Local $x, $y
Local $aRet = DllCall("Shcore.dll", "long", "GetDpiForMonitor", "long", $aMonitors[1][0], "int", $dpiType, "uint*", $x, "uint*", $y)
If @error Or Not IsArray($aRet) Then Return SetError(1, 0, 0)
Local $aDPI[2] = [$iDPIDef / $aRet[3], $aRet[3] / $iDPIDef]
Return $aDPI
EndFunc ;==>_WinAPI_GetDpiForMonitor
Func _WinAPI_SetDPIAwareness($hGUI = 0)
Switch @OSBuild
Case 6000 To 9199
If Not DllCall("user32.dll", "bool", "SetProcessDPIAware") Then Return SetError(1, 0, 0)
Return 1
Case 9200 To 13999
_WinAPI_SetProcessDpiAwareness($PROCESS_PER_MONITOR_DPI_AWARE)
If @error Then Return SetError(1, 0, 0)
Return 1
Case @OSBuild > 13999
#cs
Context_Unaware = ((DPI_AWARENESS_CONTEXT)(-1)),
Context_SystemAware = ((DPI_AWARENESS_CONTEXT)(-2)),
Context_PerMonitorAware = ((DPI_AWARENESS_CONTEXT)(-3)),
Context_PerMonitorAwareV2 = ((DPI_AWARENESS_CONTEXT)(-4)),
Context_UnawareGdiScaled = ((DPI_AWARENESS_CONTEXT)(-5))
#ce
_WinAPI_SetProcessDpiAwarenessContext($Context_PerMonitorAwareV2, $hGUI)
If @error Then Return SetError(3, @error, 0)
Return 1
EndSwitch
Return -1
EndFunc ;==>_WinAPI_SetDPIAwareness
Func _WinAPI_SetProcessDpiAwareness($DPIAware) ;https://docs.microsoft.com/en-us/windows/desktop/api/shellscalingapi/nf-shellscalingapi-setprocessdpiawareness
DllCall("Shcore.dll", "long", "SetProcessDpiAwareness", "int", $DPIAware)
If @error Then Return SetError(1, 0, 0)
Return 1
EndFunc ;==>_WinAPI_SetProcessDpiAwareness
;https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setprocessdpiawarenesscontext
Func _WinAPI_SetProcessDpiAwarenessContext($DPIAwareContext = $Context_PerMonitorAware, $hGUI = 0, $iMode = 1) ;https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setprocessdpiawarenesscontext
$DPIAwareContext = ($DPIAwareContext < -5) ? -5 : ($DPIAwareContext > -1) ? -1 : $DPIAwareContext
$iMode = ($iMode < 1) ? 1 : ($iMode > 3) ? 3 : $iMode
Switch $iMode
Case 1
Local $hDC = _WinAPI_GetDC($hGUI)
Local $aResult1 = DllCall("user32.dll", "ptr", "GetDpiFromDpiAwarenessContext", "ptr", $hDC)
If @error Or Not IsArray($aResult1) Then Return SetError(11, 0, 0)
_WinAPI_ReleaseDC(0, $hDC)
Local $aResult = DllCall("user32.dll", "Bool", "SetProcessDpiAwarenessContext", "int", $aResult1[0] + $DPIAwareContext)
If @error Or Not IsArray($aResult) Then Return SetError(12, 0, 0)
Case 2
;~ If Not $hGUI Then $hGUI = WinGetHandle(AutoItWinGetTitle())
Local $aResult2 = DllCall("user32.dll", "int", "GetWindowDpiAwarenessContext", "ptr", $hGUI)
If @error Or Not IsArray($aResult2) Then Return SetError(21, 0, 0)
Local $aResult = DllCall("user32.dll", "Bool", "SetProcessDpiAwarenessContext", "int", $aResult2[0] + $DPIAwareContext)
If @error Or Not IsArray($aResult) Then Return SetError(22, 0, 0)
Case 3
Local $aResult31 = DllCall("user32.dll", "ptr", "GetThreadDpiAwarenessContext")
If @error Or Not IsArray($aResult31) Then Return SetError(31, 0, 0)
Local $aResult32 = DllCall("user32.dll", "ptr", "GetAwarenessFromDpiAwarenessContext", "ptr", $aResult31[0])
If @error Or Not IsArray($aResult32) Then Return SetError(32, 0, 0)
Local $aResult = DllCall("user32.dll", "Bool", "SetThreadDpiAwarenessContext", "int", $aResult32[0] + $DPIAwareContext)
If @error Or Not IsArray($aResult) Then Return SetError(33, 0, 0)
EndSwitch
Return 1
EndFunc ;==>_WinAPI_SetProcessDpiAwarenessContext
;Code below was generated by: 'File to Base64 String' Code Generator v1.20 Build 2020-06-05
Func _Chip_Sound($bSaveBinary = False, $sSavePath = @ScriptDir)
Local $Chip_Sound
$Chip_Sound &= 'UFNJRAACAHwAABAAEAMAAQABAAAAAENvbW1vZG9yZSA2NAAAAAAAAAAAAAAAAAAAAAAAAAAAU/hyZW4gTHVuZCAoSmVmZikAAAAAAAAAAAAAAAAAAAAyMDA0IFZpcnV6L0NhbWVsb3QAAAAAAAAAAAAAAAAAAAAUAAAAAAAQTH0RTOoRTA0SrZaJkpWarS0oAykgCgUGBi8WCRIVGi0BAAAAAAAAAAABAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFic4S19ziqG61PAOLU5xlr3nE0J0qeAbWpviLHvOJ4XoUcE3tDfEV/WcTgnQo4JuaG6Ir+s5nBOhRgTc0NwQXtZyOCZCjAi4oLggvKzkcEyEGBBwQHBAeFjI4JgIMCAuAQEBAQEBAQEBAQECAgICAgICAwMDAwMEBAQEBQUFBgYGBwcICAkJCgoLDA0NDg8QERITFBUXGBobHR8gIiQnKSsuMTQ3Oj5BRUlOUldcYmhudXyDi5Ocpa+5xNDd6vj9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzRkAAAAAACAaAAAAAABlGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqKkPjfMRuSUQCqq9BheNexG9BxeNfBG5KRCNIxCtJBCNMhaNZxK5LRCNTxG5MRCNVhG5NRCNXRGiACDBEaIHIMERog6pAZ0+EZ05EZ1lEakCnQ8RqQSdEhGpAJ04EZ0TEZ1NEZ08ESAtEkxcFKX7SKX8SKkACQCNGNSiDiCpE6IHIKkTogAgqRNohfxohftgpftIpfxIog4gJRKiByAlEqIAICUSTAYSvTsR8OJMyhSp/506EZ0lEbwTEbmWGJ1jEbm2GJ0QEakAnSMRnRQRnTsRnSgRnSkRuTYZnScRuVYZnSYRqQOdEhHgANAZuRYZjRfU'
$Chip_Sound &= 'ufYYKfCN8RG51hiNaBGpAI1vEb04EcnA8CO5dhidBtSdPxC5VhidBdSdPhCpCZ0E1L1NEZ1OEakAnTgRYLxiEbmwGZ0G1J0/ELmTGUyWEqn/nToRTEMTKR+dDhH+PBHITC4T8OrJ/fAhsGipA50SEamAnSURjHoRvBMRuTYZnScRuVYZnSYRrHoR/jwRyEwuEyl/nRMR/jwRyEwuE71mEZ0PEb0+EdAJIMoUvU0RnU4RvTkQhfu9OhCF/Lw8EbH7yfuwn8mwsE/JgLDFyWCwh50kEf48Eb0OEZ05Ecix+8n/0Aj+TxGpAJ08Eb0+EdAQvTgRyRDwJ8kg8C/JUPBKYEwtEr0PEfCVyQLwCJADTMoUTJYUTCEU/jwRyEwuE71iEZ0lEakAnTgRYLxiEbmTGZ1jEakAnTgRYN4PEb05EfDCvQ8R8BhMyhS8YhG5sBmdPxC5kxmdPhCpAJ04EWC9ZRFJAZ1lEai5exGdDxHeORFMyhTwEsn+8AmpAJ0+EchMOxSp/p06EakAnT4RTEUUyMmwkDeMehE46bCdYhGouXYZnTgRMAWpAJ0+Eax6EUw7FLw8EfA2qf+dOhGdPhG9ORCF+706EIX8vDwRsfvJ+7CiyWCwur0+EfAPqf6dOhGpAJ0/EKn/nT4QTMoUvVARhfu9URGF/LxPEbH7MBmoua0anTkQuccanToQTCYUsfudTxGoTGkUyMn/8PIpf51NEf5PEUxpFL1lEUkBnWURqLl7EZ1mESDKFL04EclA0BSpAJ0SEZ0oEZ0pEZ04Eb1iEZ09EWDeFBFMCBWpAZ07Eb0UEdDwvBMRufYYKQ+dFBG8YxG5DhfJ/vAfkAyYOPl2F51jEahM4hSdZxEp9509ELl2F51kEf5jEbwlETATvSYRGHmwGZ0mEb0nEXmTGZ0nEb1nESkI0Dq9JBEYfU4RfWQRhfuouU4QGH0mEY14EbmuEH0nEY15Eb0SEfAryQLwJJBirXgRnQDUrXkRnQHU'
$Chip_Sound &= 'TDEWvSYRnQDUvWQRGH0nEZ0B1EwxFkz0FaT7uU8QOPlOEIX7ua8Q+a4Qhfy8PRG5kxlKaQCdIxG5sBnwCaiIRvxm+4gQ+f4SEaX7nVIRpfydUxFMMRa9KBEYfVIRnSgRvSkRfVMRnSkRrXgRGH0oEZ0A1K15EX0pEZ0B1L0jEd4jEdBPvD0RuZMZGGkBnSMR/hIRTDEWvSgROP1SEZ0oEb0pEf1TEZ0pEa14ERh9KBGdANSteRF9KRGdAdS9IxHeIxHQD7w9EbmTGRhpAZ0jEd4SEeAA0FisaBHwU7kOGNAbuSAYjXYRjRbUuUQY8ECNaBGouQ4YjXcRTI0WrGgR8C65IBgYbW8RjW8RuTIYbXYRjXYRjRbUuQ4YzXcRzncR0A25RBiNaBGouQ4YjXcRvBAR8F653hfQI7nqF508EJ0D1CnwnTsQnQLUuQIY8EOdEBGoud4XnRERTPAWvBAR8DG56hcYfTsQnTsQnQLUufYXfTwQnTwQnQPUud4X3RER3hER0A25AhidEBGoud4XnRERvT8QnQbUvT4QnQXUvT0QPToRnQTUYAQE////////Cf5B/okZGRkYGP6JSYiIiP+JGfn4/kFBQUERERER/0FBQUERERER/0FBQUERERER/0FBQUERERER/0FBQUERERER/4n+Ef4RQf4T/hkZGRkZGRn+if4T/hP+iRkZGBgYGBgY/xH+Ff4AAAAAzwkHBgQDAM8NVFBUApgeHh4AAAAAAAAAAAAIAAMHDAADBwwIAAUIDAAFCAwIAAUJDAAFCQwIAAUKDAAFCgwIzwAAAAAAABgAEAcGBQQEAwDPAAwADAAyDQkHBgUEBAQIAAAAAAAAEBAAADAwABAgIAAEQMAIBiDgBhAQ8AAAAP8AAAD/AAAA/wACAwIABgcGCQoLCgAABwAAAAcAMACAgACAgIAAAACwANzAqAAQgFCgYIjAgIB4aAAA6AAAAOwABAAA/wD//wAAAAACAAICBgAI'
$Chip_Sound &= 'AAoLCg0ODw4KCgAHBwcNBgkAAQcBAQEBtwECxwYHAcYGDQDhwQSnBgMFd4eHh/W3tSMldzs7OztzRTZze41FfWv1JUVDaXWZNVUAAgICBAsFERYCHygxOkMWC0VHRxZKR0wWFlRWWFpkZgABAQEABAAABAQFBQUFAAQEAAgIBAQIAAQEBAAAAAAAAAEDBAAAAAAJBQAAAAAHCQAHEQwRDBAAERERAAAAAAAQEBAQAAAAADAQAgICAhAwABAwMDAwMAAwMDAAAAAAAPHx8fEAAAAA8/EAAAAA8fMA8fPz8/PzAPPz8wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAMDAwEDAQBBAQFAQEFBQEBAQEBAQEBAQwBAQEBAQzNzsBQAIAAgI1P8A5AEA/5AwqKCQgPuw+gD++hzKysoCXwUIAwRN+BBLRTD4AAAAAACAABiAgCAAAAkNBAQEBAQEBAQEBAQEBAQEBgYGDwYGBg8GBgYPBgYGDwEBBwgBAQcIAQEHCAEBBwgGBgYPBgYGDwYGBg8GBgYPBgYGDwYGBg8QExUTEBMVE/8BCowDBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBIAFBQUFGBmMAwQEBAQEBAQEBAQEBAQEBIARFBYUERQWFP8BCwIMAgwCDAIMAgwCDAIMAgwCDAIMAgwCDAIMAgwCDAIMAgwCDIwXFxcXEgQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBP8B4eQBGz1fkK3K5+vy+RQ2WHWeyuz8Ez1qi74aGhsbGxsbGxsbGxsbHBwcHBwcHBwdHR0dHW/+/4JgD7Ni+4FgG7Ni+7BgD7P7iWEbsWAPs/u0G/v/hGEA/gD+hQD+hwD+AIYAhAD+hQD+hwCGAP+IYCf8LPwi/Cf8Lvwi/Cn8Lvwl/Cn8Kvwl/Cf8Kvws'
$Chip_Sound &= '/Cf//GAn/Cz8Ivwn/C78Ivwp/C78Jfwp/Cr8Jfwn/Cr8LPwn/4pgM7X7Y/5gM7X7Y/6LYDW1Yvtv/oxgMbX7Y/5gMbX7Y/6NYDW1+2P+i2A1tftr/v+CYA2zYvuBYA+zYvuwYA+z+4lhG7FgD7P7tBv7/4JgErNi+4FgHrNi+7BgErP7iWEesWASs/u0Hvv/gmAWs2L7gWAis2L7sGAWs/uJYSKxYBaz+7Qi+/+OZwD/kWAMtmb7/2H+hgD+AP+EYQD+AP6FAP6HAP4AhgCEAP6FAIYAhwCGAP+PYCf8LPwi/Cf8Lvwi/Cn8Lvwl/Cn8Kvwl/Cf8Kvws/Cf/iGAn/Cz8Ivwn/C78Ivwp/C78Jfwp/Cr8Jfwn/Cr8LPwn/4JgErNi+4FgFLNi+7BgFLP7iWEgsWAUs/u0IPv/kmAnt2L7Y/5gI7di+2P+YCK3Yvtj/mAet2L7Y/6TYBu3avty/rlg/v+bYDG+YvuSYCe3Yvtj/mAjt2L7Y/5gIrdi+2P+YB63Yvtj/pNgG7dy+2f+/5lgJ/ws/CL8J/wu/CL8Kfwu/CX8Kfwq/CX8J/wq/Cy9J//8YA+4aPt1/mv7vGP7b/7/l2MAZ/6VYAq6bvtr/rtn/rxj/pprAP+SYCe3Yvtj/mAjt2L7Y/6WYC63Yvtj/mAqt2L7Y/6TYCe3avty/rlg/v+bYCe+YvuSYCe3Yvtj/mAjt2L7Y/6WYC63Yvtj/mAqt2L7Y/6TYCe3cvtn/v+XYQCYYCL8J/wu/CL8KfwulwD8+5gq/CX8J/wq/Cz8J/+eYBjAYvvBY/vC+8Nn+8Rj+8X7xvtgSshi+8dgSsj+Sshi+8dgSsj+nxvJavvKYD9m+/+eYBjAYvvBY/vC+8Nn+8Rj+8X7y2H7zPtgSshi+8dgSsj+Sshi+8dgSsj+nz/KYvuXYwCHYQCQYwAAhWEA/w=='
Local $bString = _WinAPI_Base64Decode($Chip_Sound)
If @error Then Return SetError(1, 0, 0)
$bString = Binary($bString)
If $bSaveBinary Then
Local Const $hFile = FileOpen($sSavePath & "\Commodore_64.sid", 18)
If @error Then Return SetError(2, 0, $bString)
FileWrite($hFile, $bString)
FileClose($hFile)
EndIf
Return $bString
EndFunc ;==>_Chip_Sound
Func _WebP_Icon($bSaveBinary = False, $sSavePath = @ScriptDir)
Local $WebP_Icon
$WebP_Icon &= 'iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAIAAAAlC+aJAAAMkElEQVR4XsRZe3BU1Rn/vnPvPpNsdsnCIgkkFogoElIpFAMZmUIC5SVpBcb6ACMNFAYUi5RRKUgFNWTEDgyKBEHoA4y1ZkKxHQYspfJ0SpGEplIeCXntJvtIsu+993yF3EDGMs3eO67hd3fuP/fuOb/f9zrfOReoV8TkGBFdrwvo7oXFi5bNmjN59pzJi55dZh4OX5y91P3CXQUDFeAxZu0HhSu8BUtbpyxu/eFz3nsyIRZWnsG3BM5VDR1HgMJPFA16PdizojZHxOaI9ssM2NLAZuvX9UiEbweMqTJub9MTkcKvualRFwJPS9DvFUHGtuZrDsz+5Usbc76b7XL7BCYAECQIBKBnzO1vnD+3qKAwX3FFL2KQiP7/UAgAH+4/WLx81urSSdljfX6PBMBMKfK16v6t7iudkXpZAkBIJAhQAMbg/Q2wY/PvSn72uGJKRNTmAYXXwgUlVWd2vvVRvn1wm68FqCvkIkHMGtU0wpQmiiMQdZBwyLIhhRcUmJbM/8lXl2vLyl5FRMWgGjzQ7pbuy7XlTPEvWTM1xp3tLgmRKVYgAg5AMgEov8QDiawOUcB7X11emWWaWXWwSlsI/any2MyiSau35+RPT/W6vEE/CIwBQl+Cc56UKpstmTs2/vnqqfR/X2gApq4KbXht3cySSeXHZk6Yamxp8ISDIAgK+z4FQ+bvEPzuhqVr8yY/rcM0vC0sjoDz5y6/VGrIyPY1XvODxBAZ3BUgCMCCIfC6PHOL80w2CHR0S4iTxGajJRiJ+L2AwABRaw0hIFkmYARArHs2BI6CgAgIqFEDsWgUwoGYyQACqQshOcaVhUQrdZk4gKxPIvvA1IzMjKx778scmn3jnpGZbh9o0Rm5DDIRAWn3BUMJIBBUV0Y5cgEAuDarA+MWq85i6e9ri507faK6JtpcD6EQGAyQPgRG5/YbOXpMmiPs8/hC'
$WebP_Icon &= 'fo7EtLm2Kwdlla3ErSQhVeS72OuMNGCw0dtsWb/icPG0v54/MCfPWr6m6ERZyZevzD0zod+e0/smPvHI4Z2bjwu8v/0eEZhMRNpWNwBB5UKGIAOqEaBo5EYzmFNNn+xq+KCsee+2yic/mX0HgbGrX15AEqxZ89oTBWvLduUNzY21NQVJFjT5QVYpADip84Bie0hOTd31+ilXTS4PNn2tl+yJQoExRBHeLHvlyaefyhmbtWHXw6MmiK3XZdISS8hV5gAQMHVtF+NWh/HjnTXuf33vzOlTt6mzLvxPfHIuMSaOyslsvNyZnpmypXLy4Gy32ykhqVtkUH07zTlTU3OAW+y6+mrTR1t9J0+e6qJIvbTBjHUba1BG8hcnL61aeCQcSDOZmYaqpDaJ1VlfFMmkc2ze+PeKvcdvUURQhzHjhr24cPOBXUes9jQOHCihAgAkiAdOPNmqq73QZPYOm/HoRPUbKCWWuhqWVYf3Q9BrNBiBgBLqAY7I4hYfSklK/7Tyws+Xl2rZQPXEks4IeblFF2vOJqdYZDmhAhB5fBICJzSdPwPTp83qNqoWKNny6NTHzp5oMyWlAeMJ9YAMDIDiJACGA52xTsj4jtgzjsaaPnb8xNpqEJiZJTaEAHgcBQAoYDTiN2mhfWedGOQYEPADESSiCmkHIcE3Q0zijAHDuyGAZDLokqPyN5q14XqjNQ34XRHAZTKaU3gyOOvvWDxUF6Ljnx99MAfkmJero8ExQQLwpvcZYnjMOKg6WNlNSDv2V24dPyHbH2hDlTR4ojyAN6/OQOOMopxNb6/o6d7UQZZlAKi92Hw9UDN85NBQR1TT5oAnQICy4/ZIw0fb9Rn1v/ngkPqFjHMuCAIALFn8zKLnHRy80Qgg9nkOIILEIeT3vLCu8KnFM5wtYZXsFZ179vyxLvqX/KmjvW1+xtjdKaMCsA6f1H+Ic+22ccOyTeEQKJC4xDm/k7pMssL1s6Pnnln+o3VbCkORhmgUEFAt'
$WebP_Icon &= '03j7Ae2ZQMzdLD1UICx9/QGTDU8fqxn3/QdEJn4tK9jN67aZd773YcmL89/5eHKy3eVpZgIySGQZ1R5IJDFPY+ThGeay3094ZN7IeUXFdVc7uodWcGuKz49fzM0dW7pv/vufFtoz3d4WiWlmr84DpE0DyhJrbQhlPSjtOzTlSFXFiCm7B4kDfpC38P77c62WNKer/h//PPHZmd2GgVD8/IiH8gtDwRu2186eA5A6AaIgAiodkVoNxIW2ZsloaJk2b9T0uba6q0211aVHr0HwP2CzwdDpMG3V+AHpaVLE7W1tjEVRW+RwAiSdrpssiyugtaNplJhqSmHUzEHdTKgcoUWopb5Dr++w9RemzMgXdUmIJs5D0Yg/FGx31nfKMjDGBC3ncwQkGMBkFoMhCAR9AFbOgbFeT6e3vrN95cZlvz00G3V1Ppes1ddEwImoy2y3IhJRQIW3JhARityRkfS3yvDba7+MeghZdy2Oc7z+6y3lv9jy092VMwXjZZ9LUDT0KRT2Ou5ITzlS4drxqyvtzaQ3qa5Cz61c9MbKd0t+fFCODrPaOScO1NfsRYX9AVf5piudToW9qg8cPT4qK92+/r1l5X+YheIljwsRsc/4i3pwZFiOVLTeYO9rItEAmr7Q9GgofXPbG+XLdx98LMkejvkRBAFUA5W71u9QxJGR0QRVey+9u7623amwjyegFw2bNm55+a0Xpj8OnZ2AGrM5FAYZQKcDowCAav9l1IOzFb46CR11pDMCgAoBvWuoqKj0e0kUjJw0KNDr9UOGZBoNBqfT6WptQyR1AmRR1Hnbry14ttiSosLh/23WykIiPYJw51hcFEVBnxJ8MGBMBkREQV8EQfDFAw+8yGpAjSJhxYcIRiIS3VVXMt6Yw8iIJDMGIXFEFBFFxRtR8+D14C0Rx2tcD8Z18+djC8o//Q+T2SwLFtJUfVNd/1/VVdXd8itvky6eX3eZupW3SbQCb/TZAhU32WF9fILAP01OToaH'
$WebP_Icon &= 'h9/c3DxAMrHmm39twPejFy/kL06AOA8ywRSBxLBL8/Pz4OHA7e0tG3GS+PWY5wcR/f8UQpi1oF0HFhYWnJ/+Wr6RA0p3t5ymGxsbg4ODEri+vj4zM6M1tLKyAnx7e1vyjR3ARBKhs7i4eHZ25sBnia6vrycmJtQLfnBwoFYQrq6ueMbU1BQEm82G8Tn65Suqq6uDiHVXh/Py8pIn+/v7SwlpMBjYNE+B2dXVVbWau7u7k8vr4eEBffJQbSExMZEURHNzM+TCwkKebDQagYSGhnp5eTG4v78vdS0SIyMjr66uIPb19RHS1tYm6cAOxsrKyq2trdbWVgJxtb8Lv01ZX/6LRW0IYmJiMGZlZWEBS0pKCIyOjoaCYM94TkBAAMTAwEA1WF1dDbGsrIzEhoYGbRfu7+/XOhkSEoJxd3eXwbm5OVIbHx8npO634kc/iPKuT7N/FF//8uE3xk++NXzGFnx9fTHi1dnC0NAQEDIrIFOEjo+PeU5eXp7ZbAYzMjJCIP0vZG9vj0Rvb2+IJpOJjWqTnsXg4GBOaDX+RV4ueKtFyWoXzVMPvzNnzP05+cwcpx8XKT+JS+udZlBQkF0LNTU1AgIta1NTE/ilpSXwCBIppaWlUUbazZ+wsLDs7GxkUVRUVHx8fHJyMuGjo6NqNb1eL7Wd2NhY4Drdx6/cUh6bxJM/AhSiW+Xp7x88Ngrl5s5CVVWVFKmkpCRKk3ehkJmZiZGyore3l9edYoxxenqaaloq2aOjI9SGxWJBZ9jc3MT65Ofnt7e3R0REqNWoT7A/vEO97/KQLrv4e/DOR4LoPUjehDO5uLhIFigjrFar4FCRBmqXI41yIb6iogLM+fm5tAIoXEYclGBubi547nIgNzc34AUF+eDPLMqjn8XTEfHr8Pfnx0rHYPWzMZH+7xRKT0+XLPj4+AAvKioSEDiLcnJyMGZkZBC4trZGorZei4uLgaDHSQ4MDw8DRyNmB/z8/KS5Ozs7UhE3dZUU'
$WebP_Icon &= 'dYoCg0jWiy8N4qtO1yedn7MFnU4nWTg9PSUL2H8EtgYqDqpdOrqoQ5iQkICxpaXF7i5bWloKXtuapMeDZmdngeClX+scKVSEzYTDyhburHh6emrtokB5/5L2y8PDQ2GPuJuxk2j/7BvTxcWFeuPSbs1SW6uvr5csoPygILg/nJycxMXFIQc40rR1p6Sk9PT0EKil5eVlbIVYh8bGRpwpJAX04tTUVOIRv9ra2vLy8oGBAefOOXJfRnNDk0DL6ejokA5z941kB8bGxv7722msAxF4B6D0K05KGJl3MJ01mXGS+F6BAzmbZQv3eQXkG4Xdi4RQ7jehbOCAgyP3P94Red6jcQCLAAAAAElFTkSuQmCC'
Local $bString = _WinAPI_Base64Decode($WebP_Icon)
If @error Then Return SetError(1, 0, 0)
$bString = Binary($bString)
If $bSaveBinary Then
Local Const $hFile = FileOpen($sSavePath & "\WebP_logo_2010_64x64_Simo99.png", 18)
If @error Then Return SetError(2, 0, $bString)
FileWrite($hFile, $bString)
FileClose($hFile)
EndIf
Return $bString
EndFunc ;==>_WebP_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
#Region TichySID
Func _SIDClose()
Local $aRet = MemoryDllCall($hTitchysidDll, 'int', 'SIDClose')
If @error Then Return SetError(@error, 0, 0)
Return $aRet[0]
EndFunc ;==>_SIDClose
Func _SIDOpen($Sid, $iSubsong = 1)
Local $bSid
If Not IsBinary($Sid) Then
If Not FileExists($Sid) Then Return SetError(2, 0, 0)
Local $hFileOpen = FileOpen($Sid, 0)
If $hFileOpen = -1 Then Return SetError(-1, 0, 0)
$bSid = FileRead($hFileOpen)
FileClose($hFileOpen)
Else
$bSid = $Sid
EndIf
Local $tSid = DllStructCreate('byte[' & BinaryLen($bSid) & ']')
DllStructSetData($tSid, 1, $bSid)
Local $sType = BinaryToString(BinaryMid($bSid, 1, 4), 1)
ConsoleWrite('-->-- Sid File Type : ' & $sType & @CRLF)
Local $iVersion = Execute(BinaryMid($bSid, 5, 2))
ConsoleWrite('-->-- Sid File Version : ' & $iVersion & @CRLF)
$iSubsongCount = Int(StringTrimLeft(BinaryMid($bSid, 15, 2), 2))
ConsoleWrite('-->-- SubsongCount : ' & $iSubsongCount & @CRLF)
$iSubsong = $iSubsong - 1
If $iSubsong < 0 Then $iSubsong = 0
If $iSubsong > $iSubsongCount Then $iSubsong = 0
ConsoleWrite('-->-- Subsong : ' & $iSubsong & @CRLF)
Local $aRet = MemoryDllCall($hTitchysidDll, 'int', 'SIDOpen', 'ptr', DllStructGetPtr($tSid), 'int', DllStructGetSize($tSid), 'int', $SID_MEMORY, 'int', $SID_NON_DEFAULT, 'int', $iSubsong)
If @error Then Return SetError(@error, 0, 0)
$tSid = 0
$bSid = 0
Return $aRet[0]
EndFunc ;==>_SIDOpen
Func _SIDShutdown()
MemoryDllClose($hTitchysidDll)
$hTitchysidDll = 0
EndFunc ;==>_SIDShutdown
Func _SIDStartup()
$hTitchysidDll = MemoryDllOpen(TitchySIDdll())
If $hTitchysidDll = -1 Then Return SetError(1, 0, 0)
Return SetError(0, 0, $hTitchysidDll)
EndFunc ;==>_SIDStartup
Func _SIDStop()
Local $aRet = MemoryDllCall($hTitchysidDll, 'int', 'SIDStop')
If @error Then Return SetError(@error, 0, 0)
Return $aRet[0]
EndFunc ;==>_SIDStop
Func TitchySIDdll() ;only x86 :-(
Local $sFileBin = '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'
$sFileBin &= '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'
$sFileBin = Binary(_WinAPI_Base64Decode($sFileBin))
$sFileBin = Binary(_LzntDecompress($sFileBin))
Return SetError(0, 0, $sFileBin)
EndFunc ;==>TitchySIDdll
Func _LzntDecompress($bBinary)
$bBinary = Binary($bBinary)
Local $tInput = DllStructCreate('byte[' & BinaryLen($bBinary) & ']')
DllStructSetData($tInput, 1, $bBinary)
Local $tBuffer = DllStructCreate('byte[' & 16 * DllStructGetSize($tInput) & ']')
Local $a_Call = DllCall('ntdll.dll', 'int', 'RtlDecompressBuffer', 'ushort', 2, 'ptr', DllStructGetPtr($tBuffer), 'dword', DllStructGetSize($tBuffer), 'ptr', DllStructGetPtr($tInput), 'dword', DllStructGetSize($tInput), 'dword*', 0)
If @error Or $a_Call[0] Then Return SetError(1, 0, '')
Local $tOutput = DllStructCreate('byte[' & $a_Call[6] & ']', DllStructGetPtr($tBuffer))
Return SetError(0, 0, DllStructGetData($tOutput, 1))
EndFunc ;==>_LzntDecompress
Func API_FreeLibrary($Module)
Local $Ret = DllCall($_KERNEL32DLL, 'bool', 'FreeLibrary', 'handle', $Module)
If @error Then Return SetError(@error, @extended, 0)
Return $Ret[0]
EndFunc ;==>API_FreeLibrary
Func API_GetProcAddress($Module, $Procname)
If IsNumber($Procname) Then
Local $Ret = DllCall($_KERNEL32DLL, 'ptr', 'GetProcAddress', 'handle', $Module, 'int', $Procname)
Else
Local $Ret = DllCall($_KERNEL32DLL, 'ptr', 'GetProcAddress', 'handle', $Module, 'str', $Procname)
EndIf
If @error Then Return SetError(@error, @extended, 0)
Return $Ret[0]
EndFunc ;==>API_GetProcAddress
Func API_IsBadReadPtr($Ptr, $Len)
Local $Ret = DllCall($_KERNEL32DLL, 'int', 'IsBadReadPtr', 'ptr', $Ptr, 'UINT_PTR', $Len)
If @error Then Return SetError(@error, @extended, 0)
Return $Ret[0]
EndFunc ;==>API_IsBadReadPtr
Func API_LoadLibrary($Filename)
Local $Ret = DllCall($_KERNEL32DLL, 'handle', 'LoadLibraryW', 'wstr', $Filename)
If @error Then Return SetError(@error, @extended, 0)
Return $Ret[0]
EndFunc ;==>API_LoadLibrary
Func API_lstrlenA($Address)
Local $Ret = DllCall($_KERNEL32DLL, 'int', 'lstrlenA', 'ptr', $Address)
If @error Then Return SetError(@error, @extended, 0)
Return $Ret[0]
EndFunc ;==>API_lstrlenA
Func API_lstrlenW($Address)
Local $Ret = DllCall($_KERNEL32DLL, 'int', 'lstrlenW', 'ptr', $Address)
If @error Then Return SetError(@error, @extended, 0)
Return $Ret[0]
EndFunc ;==>API_lstrlenW
Func API_VirtualProtect($Address, $Size, $Protection)
Local $Ret = DllCall($_KERNEL32DLL, 'bool', 'VirtualProtect', 'ptr', $Address, 'dword_ptr', $Size, 'dword', $Protection, 'dword*', 0)
If @error Then Return SetError(@error, @extended, 0)
Return $Ret[0]
EndFunc ;==>API_VirtualProtect
Func API_ZeroMemory($Address, $Size)
Local $Ret = DllCall($_KERNEL32DLL, 'none', 'RtlZeroMemory', 'ptr', $Address, 'dword_ptr', $Size)
If @error Then Return SetError(@error, @extended, 0)
Return $Ret[0]
EndFunc ;==>API_ZeroMemory
Func MemLib_BuildImportTable($CodeBase, $PEHeader)
Local Const $IMAGE_DIRECTORY_ENTRY_IMPORT = 1
Local Const $SizeOfPtr = DllStructGetSize(DllStructCreate('ptr', 1))
Local $IMAGE_NT_HEADER = DllStructCreate($tagIMAGE_NT_HEADER, $PEHeader)
Local $SizeOfDataDirectory = DllStructGetSize(DllStructCreate($tagIMAGE_DATA_DIRECTORY))
Local $ImportDirectoryPtr = $PEHeader + DllStructGetSize($IMAGE_NT_HEADER) + $IMAGE_DIRECTORY_ENTRY_IMPORT * $SizeOfDataDirectory
Local $ImportDirectory = DllStructCreate($tagIMAGE_DATA_DIRECTORY, $ImportDirectoryPtr)
Local $ImportSize = DllStructGetData($ImportDirectory, 'Size')
Local $ImportVirtualAddress = DllStructGetData($ImportDirectory, 'VirtualAddress')
Local $SizeOfImportDir = DllStructGetSize(DllStructCreate($tagIMAGE_IMPORT_DESCRIPTOR))
Local $ImportList = ''
If $ImportSize > 0 Then
Local $ImportDescPtr = $CodeBase + $ImportVirtualAddress
While 1
If API_IsBadReadPtr($ImportDescPtr, $SizeOfImportDir) Then ExitLoop
Local $ImportDesc = DllStructCreate($tagIMAGE_IMPORT_DESCRIPTOR, $ImportDescPtr)
Local $NameOffset = DllStructGetData($ImportDesc, 'Name')
If $NameOffset = 0 Then ExitLoop
Local $Name = Peek('str', $CodeBase + $NameOffset)
Local $OriginalFirstThunk = DllStructGetData($ImportDesc, 'OriginalFirstThunk')
Local $FirstThunk = DllStructGetData($ImportDesc, 'FirstThunk')
Local $Handle = API_LoadLibrary($Name)
If $Handle Then
$ImportList &= $Handle & ','
Local $FuncRef = $CodeBase + $FirstThunk
Local $ThunkRef = $CodeBase + $OriginalFirstThunk
If $OriginalFirstThunk = 0 Then $ThunkRef = $FuncRef
While 1
Local $Ref = Peek('ptr', $ThunkRef)
If $Ref = 0 Then ExitLoop
If BitAND(Peek('byte', $ThunkRef + $SizeOfPtr - 1), 0x80) Then
Local $Ptr = API_GetProcAddress($Handle, BitAND($Ref, 0xffff))
Else
Local $IMAGE_IMPORT_BY_NAME = DllStructCreate($tagIMAGE_IMPORT_BY_NAME, $CodeBase + $Ref)
Local $NamePtr = DllStructGetPtr($IMAGE_IMPORT_BY_NAME, 2)
Local $FuncName = Peek('str', $NamePtr)
Local $Ptr = API_GetProcAddress($Handle, $FuncName)
EndIf
If $Ptr = 0 Then Return SetError(1, 0, False)
Poke('ptr', $FuncRef, $Ptr)
$ThunkRef += $SizeOfPtr
$FuncRef += $SizeOfPtr
WEnd
Else
Return SetError(1, 0, False)
EndIf
$ImportDescPtr += $SizeOfImportDir
WEnd
EndIf
Return $ImportList
EndFunc ;==>MemLib_BuildImportTable
Func MemLib_CopySections($CodeBase, $PEHeader, $DllDataPtr)
Local $IMAGE_NT_HEADER = DllStructCreate($tagIMAGE_NT_HEADER, $PEHeader)
Local $SizeOfFileHeader = DllStructGetPtr($IMAGE_NT_HEADER, 'Magic') - $PEHeader
Local $SizeOfOptionalHeader = DllStructGetData($IMAGE_NT_HEADER, 'SizeOfOptionalHeader')
Local $NumberOfSections = DllStructGetData($IMAGE_NT_HEADER, 'NumberOfSections')
Local $SectionAlignment = DllStructGetData($IMAGE_NT_HEADER, 'SectionAlignment')
Local $SectionPtr = $PEHeader + $SizeOfFileHeader + $SizeOfOptionalHeader
For $i = 1 To $NumberOfSections
Local $Section = DllStructCreate($tagIMAGE_SECTION_HEADER, $SectionPtr)
Local $VirtualAddress = DllStructGetData($Section, 'VirtualAddress')
Local $SizeOfRawData = DllStructGetData($Section, 'SizeOfRawData')
Local $PointerToRawData = DllStructGetData($Section, 'PointerToRawData')
If $SizeOfRawData = 0 Then
Local $Dest = _MemVirtualAlloc($CodeBase + $VirtualAddress, $SectionAlignment, $MEM_COMMIT, $PAGE_READWRITE)
API_ZeroMemory($Dest, $SectionAlignment)
Else
Local $Dest = _MemVirtualAlloc($CodeBase + $VirtualAddress, $SizeOfRawData, $MEM_COMMIT, $PAGE_READWRITE)
_MemMoveMemory($DllDataPtr + $PointerToRawData, $Dest, $SizeOfRawData)
EndIf
DllStructSetData($Section, 'VirtualSize', $Dest - $CodeBase)
$SectionPtr += DllStructGetSize($Section)
Next
EndFunc ;==>MemLib_CopySections
Func MemLib_FinalizeSections($CodeBase, $PEHeader)
Local Const $IMAGE_SCN_MEM_EXECUTE = 0x20000000
Local Const $IMAGE_SCN_MEM_READ = 0x40000000
Local Const $IMAGE_SCN_MEM_WRITE = 0x80000000
Local Const $IMAGE_SCN_MEM_NOT_CACHED = 0x4000000
Local Const $IMAGE_SCN_CNT_INITIALIZED_DATA = 64
Local Const $IMAGE_SCN_CNT_UNINITIALIZED_DATA = 128
Local Const $PAGE_WRITECOPY = 0x0008
Local Const $PAGE_EXECUTE_WRITECOPY = 0x0080
Local $IMAGE_NT_HEADER = DllStructCreate($tagIMAGE_NT_HEADER, $PEHeader)
Local $SizeOfFileHeader = DllStructGetPtr($IMAGE_NT_HEADER, 'Magic') - $PEHeader
Local $SizeOfOptionalHeader = DllStructGetData($IMAGE_NT_HEADER, 'SizeOfOptionalHeader')
Local $NumberOfSections = DllStructGetData($IMAGE_NT_HEADER, 'NumberOfSections')
Local $SectionAlignment = DllStructGetData($IMAGE_NT_HEADER, 'SectionAlignment')
Local $SectionPtr = $PEHeader + $SizeOfFileHeader + $SizeOfOptionalHeader
For $i = 1 To $NumberOfSections
Local $Section = DllStructCreate($tagIMAGE_SECTION_HEADER, $SectionPtr)
Local $Characteristics = DllStructGetData($Section, 'Characteristics')
Local $SizeOfRawData = DllStructGetData($Section, 'SizeOfRawData')
Local $Executable = (BitAND($Characteristics, $IMAGE_SCN_MEM_EXECUTE) <> 0)
Local $Readable = (BitAND($Characteristics, $IMAGE_SCN_MEM_READ) <> 0)
Local $Writeable = (BitAND($Characteristics, $IMAGE_SCN_MEM_WRITE) <> 0)
Local $ProtectList[8] = [$PAGE_NOACCESS, $PAGE_EXECUTE, $PAGE_READONLY, $PAGE_EXECUTE_READ, $PAGE_WRITECOPY, $PAGE_EXECUTE_WRITECOPY, $PAGE_READWRITE, $PAGE_EXECUTE_READWRITE]
Local $Protect = $ProtectList[$Executable + $Readable * 2 + $Writeable * 4]
If BitAND($Characteristics, $IMAGE_SCN_MEM_NOT_CACHED) Then $Protect = BitOR($Protect, $PAGE_NOCACHE)
Local $Size = $SizeOfRawData
If $Size = 0 Then
If BitAND($Characteristics, $IMAGE_SCN_CNT_INITIALIZED_DATA) Then
$Size = DllStructGetData($IMAGE_NT_HEADER, 'SizeOfInitializedData')
ElseIf BitAND($Characteristics, $IMAGE_SCN_CNT_UNINITIALIZED_DATA) Then
$Size = DllStructGetData($IMAGE_NT_HEADER, 'SizeOfUninitializedData')
EndIf
EndIf
If $Size > 0 Then
Local $PhysicalAddress = $CodeBase + DllStructGetData($Section, 'VirtualSize')
API_VirtualProtect($PhysicalAddress, $Size, $Protect)
EndIf
$SectionPtr += DllStructGetSize($Section)
Next
EndFunc ;==>MemLib_FinalizeSections
Func MemLib_FreeLibrary($ModulePtr)
If Not MemLib_Vaild($ModulePtr) Then Return 0
Local $Module = DllStructCreate($tagModule, $ModulePtr)
Local $CodeBase = DllStructGetData($Module, 'CodeBase')
Local $DllEntry = DllStructGetData($Module, 'DllEntry')
Local $Initialized = DllStructGetData($Module, 'Initialized')
Local $ImportListPtr = DllStructGetData($Module, 'ImportList')
Local $ExportListPtr = DllStructGetData($Module, 'ExportList')
If $Initialized And $DllEntry Then
Local $Success = MemoryFuncCall('bool', $DllEntry, 'ptr', $CodeBase, 'dword', 0, 'ptr', 0)
DllStructSetData($Module, 'Initialized', 0)
EndIf
If $ExportListPtr Then _MemGlobalFree($ExportListPtr)
If $ImportListPtr Then
Local $ImportList = StringSplit(Peek('str', $ImportListPtr), ',')
For $i = 1 To $ImportList[0]
If $ImportList[$i] Then API_FreeLibrary($ImportList[$i])
Next
_MemGlobalFree($ImportListPtr)
EndIf
If $CodeBase Then _MemVirtualFree($CodeBase, 0, $MEM_RELEASE)
DllStructSetData($Module, 'CodeBase', 0)
DllStructSetData($Module, 'ExportList', 0)
_MemGlobalFree($ModulePtr)
Return 1
EndFunc ;==>MemLib_FreeLibrary
Func MemLib_GetExportList($CodeBase, $PEHeader)
Local Const $IMAGE_DIRECTORY_ENTRY_EXPORT = 0
Local $IMAGE_NT_HEADER = DllStructCreate($tagIMAGE_NT_HEADER, $PEHeader)
Local $SizeOfDataDirectory = DllStructGetSize(DllStructCreate($tagIMAGE_DATA_DIRECTORY))
Local $ExportDirectoryPtr = $PEHeader + DllStructGetSize($IMAGE_NT_HEADER) + $IMAGE_DIRECTORY_ENTRY_EXPORT * $SizeOfDataDirectory
Local $ExportDirectory = DllStructCreate($tagIMAGE_DATA_DIRECTORY, $ExportDirectoryPtr)
Local $ExportSize = DllStructGetData($ExportDirectory, 'Size')
Local $ExportVirtualAddress = DllStructGetData($ExportDirectory, 'VirtualAddress')
Local $ExportList = ''
If $ExportSize > 0 Then
Local $IMAGE_EXPORT_DIRECTORY = DllStructCreate($tagIMAGE_EXPORT_DIRECTORY, $CodeBase + $ExportVirtualAddress)
Local $NumberOfNames = DllStructGetData($IMAGE_EXPORT_DIRECTORY, 'NumberOfNames')
Local $NumberOfFunctions = DllStructGetData($IMAGE_EXPORT_DIRECTORY, 'NumberOfFunctions')
Local $AddressOfFunctions = DllStructGetData($IMAGE_EXPORT_DIRECTORY, 'AddressOfFunctions')
If $NumberOfNames = 0 Or $NumberOfFunctions = 0 Then Return ''
Local $NameRef = $CodeBase + DllStructGetData($IMAGE_EXPORT_DIRECTORY, 'AddressOfNames')
Local $Ordinal = $CodeBase + DllStructGetData($IMAGE_EXPORT_DIRECTORY, 'AddressOfNameOrdinals')
For $i = 1 To $NumberOfNames
Local $Ref = Peek('dword', $NameRef)
Local $Idx = Peek('word', $Ordinal)
Local $FuncName = Peek('str', $CodeBase + $Ref)
If $Idx <= $NumberOfFunctions Then
Local $Addr = $CodeBase + Peek('dword', $CodeBase + $AddressOfFunctions + $Idx * 4)
$ExportList &= $FuncName & Chr(1) & $Addr & Chr(1)
EndIf
$NameRef += 4
$Ordinal += 2
Next
EndIf
Return $ExportList
EndFunc ;==>MemLib_GetExportList
Func MemLib_GetProcAddress($ModulePtr, $FuncName)
Local $ExportPtr = Peek('ptr', $ModulePtr)
If Not $ExportPtr Then Return 0
Local $ExportList = Peek('str', $ExportPtr)
Local $Match = StringRegExp($ExportList, '(?i)' & $FuncName & '\001([^\001]*)\001', 3)
If Not @error Then Return Ptr($Match[0])
Return 0
EndFunc ;==>MemLib_GetProcAddress
Func MemLib_LoadLibrary($DllBinary)
$DllBinary = Binary($DllBinary)
Local $DllData = DllStructCreate('byte[' & BinaryLen($DllBinary) & ']')
Local $DllDataPtr = DllStructGetPtr($DllData)
DllStructSetData($DllData, 1, $DllBinary)
Local $IMAGE_DOS_HEADER = DllStructCreate($tagIMAGE_DOS_HEADER, $DllDataPtr)
If DllStructGetData($IMAGE_DOS_HEADER, 'e_magic') <> 0x5A4D Then
Return SetError(1, 0, 0)
EndIf
Local $PEHeader = $DllDataPtr + DllStructGetData($IMAGE_DOS_HEADER, 'e_lfanew')
Local $IMAGE_NT_HEADER = DllStructCreate($tagIMAGE_NT_HEADER, $PEHeader)
If DllStructGetData($IMAGE_NT_HEADER, 'Signature') <> 0x4550 Then
Return SetError(1, 0, 0)
EndIf
Switch DllStructGetData($IMAGE_NT_HEADER, 'Magic')
Case 0x10B
If @AutoItX64 Then Return SetError(2, 0, 0)
Case 0x20B
If Not @AutoItX64 Then Return SetError(2, 0, 0)
EndSwitch
Local $ImageBase = DllStructGetData($IMAGE_NT_HEADER, 'ImageBase')
Local $SizeOfImage = DllStructGetData($IMAGE_NT_HEADER, 'SizeOfImage')
Local $SizeOfHeaders = DllStructGetData($IMAGE_NT_HEADER, 'SizeOfHeaders')
Local $AddressOfEntryPoint = DllStructGetData($IMAGE_NT_HEADER, 'AddressOfEntryPoint')
Local $ModulePtr = _MemGlobalAlloc(DllStructGetSize(DllStructCreate($tagModule)), $GPTR)
If $ModulePtr = 0 Then Return SetError(3, 0, 0)
Local $Module = DllStructCreate($tagModule, $ModulePtr)
Local $CodeBase = _MemVirtualAlloc($ImageBase, $SizeOfImage, $MEM_RESERVE, $PAGE_READWRITE)
If $CodeBase = 0 Then $CodeBase = _MemVirtualAlloc(0, $SizeOfImage, $MEM_RESERVE, $PAGE_READWRITE)
If $CodeBase = 0 Then Return SetError(3, 0, 0)
DllStructSetData($Module, 'CodeBase', $CodeBase)
_MemVirtualAlloc($CodeBase, $SizeOfImage, $MEM_COMMIT, $PAGE_READWRITE)
Local $Base = _MemVirtualAlloc($CodeBase, $SizeOfHeaders, $MEM_COMMIT, $PAGE_READWRITE)
_MemMoveMemory($DllDataPtr, $Base, $SizeOfHeaders)
MemLib_CopySections($CodeBase, $PEHeader, $DllDataPtr)
Local $LocationDelta = $CodeBase - $ImageBase
If $LocationDelta <> 0 Then MemLib_PerformBaseRelocation($CodeBase, $PEHeader, $LocationDelta)
Local $ImportList = MemLib_BuildImportTable($CodeBase, $PEHeader)
If @error Then
MemLib_FreeLibrary($ModulePtr)
Return SetError(2, 0, 0)
EndIf
Local $ExportList = MemLib_GetExportList($CodeBase, $PEHeader)
Local $ImportListPtr = _MemGlobalAlloc(StringLen($ImportList) + 2, $GPTR)
Local $ExportListPtr = _MemGlobalAlloc(StringLen($ExportList) + 2, $GPTR)
DllStructSetData($Module, 'ImportList', $ImportListPtr)
DllStructSetData($Module, 'ExportList', $ExportListPtr)
If $ImportListPtr = 0 Or $ExportListPtr = 0 Then
MemLib_FreeLibrary($ModulePtr)
Return SetError(3, 0, 0)
EndIf
Poke('str', $ImportListPtr, $ImportList)
Poke('str', $ExportListPtr, $ExportList)
MemLib_FinalizeSections($CodeBase, $PEHeader)
Local $DllEntry = $CodeBase + $AddressOfEntryPoint
DllStructSetData($Module, 'DllEntry', $DllEntry)
DllStructSetData($Module, 'Initialized', 0)
If $AddressOfEntryPoint Then
Local $Success = MemoryFuncCall('bool', $DllEntry, 'ptr', $CodeBase, 'dword', 1, 'ptr', 0)
If Not $Success[0] Then
MemLib_FreeLibrary($ModulePtr)
Return SetError(4, 0, 0)
EndIf
DllStructSetData($Module, 'Initialized', 1)
EndIf
Return $ModulePtr
EndFunc ;==>MemLib_LoadLibrary
Func MemLib_PerformBaseRelocation($CodeBase, $PEHeader, $LocationDelta)
Local Const $IMAGE_DIRECTORY_ENTRY_BASERELOC = 5
Local Const $IMAGE_REL_BASED_HIGHLOW = 3
Local Const $IMAGE_REL_BASED_DIR64 = 10
Local $IMAGE_NT_HEADER = DllStructCreate($tagIMAGE_NT_HEADER, $PEHeader)
Local $SizeOfDataDirectory = DllStructGetSize(DllStructCreate($tagIMAGE_DATA_DIRECTORY))
Local $RelocDirectoryPtr = $PEHeader + DllStructGetSize($IMAGE_NT_HEADER) + $IMAGE_DIRECTORY_ENTRY_BASERELOC * $SizeOfDataDirectory
Local $RelocDirectory = DllStructCreate($tagIMAGE_DATA_DIRECTORY, $RelocDirectoryPtr)
Local $RelocSize = DllStructGetData($RelocDirectory, 'Size')
Local $RelocVirtualAddress = DllStructGetData($RelocDirectory, 'VirtualAddress')
If $RelocSize > 0 Then
Local $Relocation = $CodeBase + $RelocVirtualAddress
While 1
Local $IMAGE_BASE_RELOCATION = DllStructCreate($tagIMAGE_BASE_RELOCATION, $Relocation)
Local $VirtualAddress = DllStructGetData($IMAGE_BASE_RELOCATION, 'VirtualAddress')
Local $SizeOfBlock = DllStructGetData($IMAGE_BASE_RELOCATION, 'SizeOfBlock')
If $VirtualAddress = 0 Then ExitLoop
Local $Dest = $CodeBase + $VirtualAddress
Local $Entries = ($SizeOfBlock - 8) / 2
Local $RelInfo = DllStructCreate('word[' & $Entries & ']', $Relocation + 8)
For $i = 1 To $Entries
Local $Info = DllStructGetData($RelInfo, 1, $i)
Local $Type = BitShift($Info, 12)
If $Type = $IMAGE_REL_BASED_HIGHLOW Or $Type = $IMAGE_REL_BASED_DIR64 Then
Local $Addr = DllStructCreate('ptr', $Dest + BitAND($Info, 0xFFF))
DllStructSetData($Addr, 1, DllStructGetData($Addr, 1) + $LocationDelta)
EndIf
Next
$Relocation += $SizeOfBlock
WEnd
EndIf
EndFunc ;==>MemLib_PerformBaseRelocation
Func MemLib_Vaild($ModulePtr)
Local $ModuleSize = DllStructGetSize(DllStructCreate($tagModule))
If API_IsBadReadPtr($ModulePtr, $ModuleSize) Then Return False
Local $Module = DllStructCreate($tagModule, $ModulePtr)
Local $CodeBase = DllStructGetData($Module, 'CodeBase')
If Not $CodeBase Then Return False
Return True
EndFunc ;==>MemLib_Vaild
Func MemoryDllCall($Module, $RetType, $FuncName, $Type1 = '', $Param1 = 0, $Type2 = '', $Param2 = 0, $Type3 = '', $Param3 = 0, $Type4 = '', $Param4 = 0, $Type5 = '', $Param5 = 0, $Type6 = '', $Param6 = 0, $Type7 = '', $Param7 = 0, $Type8 = '', $Param8 = 0, $Type9 = '', $Param9 = 0, $Type10 = '', $Param10 = 0, $Type11 = '', $Param11 = 0, $Type12 = '', $Param12 = 0, $Type13 = '', $Param13 = 0, $Type14 = '', $Param14 = 0, $Type15 = '', $Param15 = 0, $Type16 = '', $Param16 = 0, $Type17 = '', $Param17 = 0, $Type18 = '', $Param18 = 0, $Type19 = '', $Param19 = 0, $Type20 = '', $Param20 = 0)
Local $Ret, $OpenFlag = False
Local Const $MaxParams = 20
If (@NumParams < 3) Or (@NumParams > $MaxParams * 2 + 3) Or (Mod(@NumParams, 2) = 0) Then Return SetError(4, 0, 0)
If Not IsPtr($Module) Then
$OpenFlag = True
$Module = MemoryDllOpen($Module)
If @error Then Return SetError(1, 0, 0)
EndIf
Local $Addr = MemLib_GetProcAddress($Module, $FuncName)
If Not $Addr Then Return SetError(3, 0, 0)
Poke('ptr', $_MFHookPtr + 1 + @AutoItX64, $Addr)
Switch @NumParams
Case 3
$Ret = DllCall($_KERNEL32DLL, $RetType, $_MFHookApi)
Case 5
$Ret = DllCall($_KERNEL32DLL, $RetType, $_MFHookApi, $Type1, $Param1)
Case 7
$Ret = DllCall($_KERNEL32DLL, $RetType, $_MFHookApi, $Type1, $Param1, $Type2, $Param2)
Case 9
$Ret = DllCall($_KERNEL32DLL, $RetType, $_MFHookApi, $Type1, $Param1, $Type2, $Param2, $Type3, $Param3)
Case 11
$Ret = DllCall($_KERNEL32DLL, $RetType, $_MFHookApi, $Type1, $Param1, $Type2, $Param2, $Type3, $Param3, $Type4, $Param4)
Case 13
$Ret = DllCall($_KERNEL32DLL, $RetType, $_MFHookApi, $Type1, $Param1, $Type2, $Param2, $Type3, $Param3, $Type4, $Param4, $Type5, $Param5)
Case Else
Local $DllCallStr = 'DllCall ( $_KERNEL32DLL, $RetType, $_MFHookApi', $n = 1
For $i = 5 To @NumParams Step 2
$DllCallStr &= ', $Type' & $n & ', $Param' & $n
$n += 1
Next
$DllCallStr &= ' )'
$Ret = Execute($DllCallStr)
EndSwitch
Local $Err = @error
If $OpenFlag Then MemoryDllClose($Module)
Return SetError($Err, 0, $Ret)
EndFunc ;==>MemoryDllCall
Func MemoryDllClose($Module)
MemLib_FreeLibrary($Module)
EndFunc ;==>MemoryDllClose
Func MemoryDllOpen($DllBinary)
If Not IsDllStruct($_MFHookBak) Then MemoryFuncInit()
Local $Module = MemLib_LoadLibrary($DllBinary)
If @error Then Return SetError(@error, 0, -1)
Return $Module
EndFunc ;==>MemoryDllOpen
Func MemoryFuncCall($RetType, $Address, $Type1 = '', $Param1 = 0, $Type2 = '', $Param2 = 0, $Type3 = '', $Param3 = 0, $Type4 = '', $Param4 = 0, $Type5 = '', $Param5 = 0, $Type6 = '', $Param6 = 0, $Type7 = '', $Param7 = 0, $Type8 = '', $Param8 = 0, $Type9 = '', $Param9 = 0, $Type10 = '', $Param10 = 0, $Type11 = '', $Param11 = 0, $Type12 = '', $Param12 = 0, $Type13 = '', $Param13 = 0, $Type14 = '', $Param14 = 0, $Type15 = '', $Param15 = 0, $Type16 = '', $Param16 = 0, $Type17 = '', $Param17 = 0, $Type18 = '', $Param18 = 0, $Type19 = '', $Param19 = 0, $Type20 = '', $Param20 = 0)
If Not IsDllStruct($_MFHookBak) Then MemoryFuncInit()
Poke('ptr', $_MFHookPtr + 1 + @AutoItX64, $Address)
Local $Ret
Switch @NumParams
Case 2
$Ret = DllCall($_KERNEL32DLL, $RetType, $_MFHookApi)
Case 4
$Ret = DllCall($_KERNEL32DLL, $RetType, $_MFHookApi, $Type1, $Param1)
Case 6
$Ret = DllCall($_KERNEL32DLL, $RetType, $_MFHookApi, $Type1, $Param1, $Type2, $Param2)
Case 8
$Ret = DllCall($_KERNEL32DLL, $RetType, $_MFHookApi, $Type1, $Param1, $Type2, $Param2, $Type3, $Param3)
Case 10
$Ret = DllCall($_KERNEL32DLL, $RetType, $_MFHookApi, $Type1, $Param1, $Type2, $Param2, $Type3, $Param3, $Type4, $Param4)
Case 12
$Ret = DllCall($_KERNEL32DLL, $RetType, $_MFHookApi, $Type1, $Param1, $Type2, $Param2, $Type3, $Param3, $Type4, $Param4, $Type5, $Param5)
Case Else
Local $DllCallStr = 'DllCall($_KERNEL32DLL, $RetType, $_MFHookApi', $n = 1
For $i = 4 To @NumParams Step 2
$DllCallStr &= ', $Type' & $n & ', $Param' & $n
$n += 1
Next
$DllCallStr &= ')'
$Ret = Execute($DllCallStr)
EndSwitch
Return SetError(@error, 0, $Ret)
EndFunc ;==>MemoryFuncCall
Func MemoryFuncInit()
Local $KernelHandle = API_LoadLibrary('kernel32.dll')
API_FreeLibrary($KernelHandle)
Local $HookPtr = API_GetProcAddress($KernelHandle, $_MFHookApi)
Local $HookSize = 7 + @AutoItX64 * 5
$_MFHookPtr = $HookPtr
$_MFHookBak = DllStructCreate('byte[' & $HookSize & ']')
If Not API_VirtualProtect($_MFHookPtr, $HookSize, $PAGE_EXECUTE_READWRITE) Then Return False
DllStructSetData($_MFHookBak, 1, Peek('byte[' & $HookSize & ']', $_MFHookPtr))
If @AutoItX64 Then
Poke('word', $_MFHookPtr, 0xB848)
Poke('word', $_MFHookPtr + 10, 0xE0FF)
Else
Poke('byte', $_MFHookPtr, 0xB8)
Poke('word', $_MFHookPtr + 5, 0xE0FF)
EndIf
Return True
EndFunc ;==>MemoryFuncInit
Func Peek($Type, $Ptr)
If $Type = 'str' Then
$Type = 'char[' & API_lstrlenA($Ptr) & ']'
ElseIf $Type = 'wstr' Then
$Type = 'wchar[' & API_lstrlenW($Ptr) & ']'
EndIf
Return DllStructGetData(DllStructCreate($Type, $Ptr), 1)
EndFunc ;==>Peek
Func Poke($Type, $Ptr, $Value)
If $Type = 'str' Then
$Type = 'char[' & (StringLen($Value) + 1) & ']'
ElseIf $Type = 'wstr' Then
$Type = 'wchar[' & (StringLen($Value) + 1) & ']'
EndIf
DllStructSetData(DllStructCreate($Type, $Ptr), 1, $Value)
EndFunc ;==>Poke
#EndRegion
Download UDF, DLLs and examples on my 1Drv: WebP (to download all marked files, you must login first, otherwise 1by1 only)
Just a bit of fun because evidently I have too much time on my hands!
I'm doing all sorts of bad things to in order to handle note on/off events from the stream - so I wouldn't recommend using that part for any real project.
A few days early, but happy new year folks!🎉
HappyNewYear.zip
When you don't know something, the best place to start is the local help file of autoit.
In your code you have FileDelete($_sSrcPath2[$i] & "C:\Users\mdogru\Desktop\IFS ÇIKTILARI\*.pdf*") ???
The path of the files to be deleted, does not make sense.
and not only because it has a variable ($_sSrcPath2[$i]) that you do not define anywhere in this script
but also according to the existing path "C:\Users\mdogru\Desktop\IFS ÇIKTILARI\*.pdf*")
since the path starts with 'C:\' it could not have anything in front of 'C:\' , so 'something' & 'C:\' make no sense
according to help file 'See FileFindFirstFile() for a discussion about wildcards.'
You can use only one wildcard in the filename part or in the extension part i.e. a*.b?.
When using a 3-char extension any extension starting with those 3 chars will match, .e.g. "*.log" will match "test.log_1".
According to your case, it would fit something like this.
FileDelete ("C:\Users\mdogru\Desktop\IFS OUTPUTS \*.pdf")
Exactly. I had changed this locally but overlooked this file when pushing. Is now fixed - thanks.
I'm sure there will still be a few minor mistakes here and there. The thing is just really complex and extensive. The proper documentation of the individual functions alone took 2 weeks (that was a job for criminals!)
Linear Algebra UDF
A library for linear algebra, developed in AutoIt. This library offers a variety of functions for performing calculations and operations in linear algebra.
Idea
A UDF for linear algebra in AutoIt.
The aim of this is to be as thematically comprehensive, high-performance and easily accessible as possible.
The widely used software library BLAS/LAPACK serves as the basis for the UDF.
The user should be able to work as intuitively as possible and get by without any major administrative effort.
A particular focus is on extensive functionalities for non-linear adjustment calculations.
Structure
The UDF is divided into 3 sub-UDFs: BLAS.au3, LAPACK.au3 and LinearAlgebra.au3.
The low-level interfaces to the respective BLAS/LAPACK functionalities are implemented in the first two.
LinearAlgebra.au3, which is intended as the primary interface for the end user, is built on this basis.
The functions here offer simpler interfaces and access to more complex algorithms such as regressions and adjustment calculations.
In addition to these 3 files, a DLL is also required which implements the BLAS/LAPACK interface.
Install
Download the 3 files BLAS.au3, LAPACK.au3 and LinearAlgebra.au3 (or clone the repository) from >>HERE<<
Download a current BLAS/LAPACK DLL:
Recommendation: OpenBLAS (theoretically, other BLAS/LAPACK implementations should also work - however, additional adaptations may then be necessary)
Download the file OpenBLAS-x.x.xx-x64.zip from there and extract the file libopenblas.dll into the same folder as the LinearAlgebra.au3.
The sample files in the subfolder /examples should now be executable .
Features
---- vector/matrix creation ----
_la_fromArray - converts a AutoIt array or array define string into a matrix map
_la_fromStruct - creates a matrix/vector map from a DllStruct as used here in the UDF
_la_createVector - creates new empty vector
_la_createMatrix - creates new empty matrix
_la_createIdentity - create identity matrix/vector
_la_duplicate - creates an independent copy of a matrix/vector map
_la_fromFile - reads a matrix or a vector from a file created by _la_toFile()
---- extraction/transforming ----
_la_join - combines 2 matrices
_la_transpose - transposes a matrix in-place or out-place and [optional] scaling
_la_ReDim - changes the shape of a matrix by by changing the number of columns (also matrix <-> vector conversion)
_la_getRow - extracts a row of a matrix as a vector
_la_getColumn - extracts a column of a matrix as a vector
_la_getDiag - extracts the diagonal of a matrix as a vector
_la_getTriangle - extract upper or lower triangle part of a matrix
_la_VectorToDiag - creates a diagonal matrix from a vector
---- data output ----
_la_display - displays a matrix/vector map, similar to _ArrayDisplay
_la_toArray - converts a matrix/vector map into an AutoIt array
_la_toFile - write a matrix/vector into a file
---- scalar operations ----
_la_rotate - applies a plane rotation to coordinate-pairs
---- matrix attributes ----
_la_isPositiveDefinite - checks whether a matrix is positive definite
_la_isSymmetric - checks whether a matrix is symmetrical
_la_rank - determines the rank of a matrix
_la_determinant - calculate the determinant of a matrix
_la_conditionNumber - determine the condition number of a matrix
---- unary operations ----
_la_inverse - calculates the inverse of a matrix
_la_pseudoInverse - calculate the Moore-Penrose pseudo inverse of a matrix
_la_sum - calculates the sum of the elements of a matrix, vector or parts thereof
_la_asum - calculate the sum of the absolute(!) values of a matrix/vector
_la_amin - finds the first element having the minimum absolute(!) value
_la_amax - finds the first element having the maximum absolute(!) value
_la_norm - calculate the euclidian norm of a vector
_la_mean - calculate the mean of a vector or parts of a matrix
---- element wise operations ----
_la_sqrtElements - calculates the square root of each element of a matrix/vector
_la_squareElements - calculates the square of each element of a matrix/vector
_la_invElements - forms the reciprocal (1/x) for each element of the matrix/vector
---- addition subtraction ----
_la_sub - subtracts a matrix/vector B from matrix/vector A
_la_add - calculate the sum of a matrix/vector/scalar mA and a matrix/vector/scalar mB
---- multiplication ----
_la_mul - calculates a multiplication between a matrix/vector/scalar A and a matrix/vector/scalar B
_la_outerproduct - calculates the outer product ("tensor product") of two vectors
_la_dot - calculate the "dot product"/"scalar product"/"inner product" of two vectors
_la_scale - multiplies the elements of a matrix/vector by a scalar value
_la_mulElementWise - calculates the element-wise ("Hadarmard") product between two matrices/vectors
_la_cross - calculates the cross product between two 3-element vectors
---- factorization / decomposition ----
_la_LU - calculates the LU decomposition of a matrix
_la_QR - calculates the QR decomposition of a matrix
_la_SVD - calculates the singular value decomposition (SVD) of a matrix
_la_cholesky - calculate the cholesky decomposition of a symmetric, positive definite matrix ( A --> L * Lᵀ or A --> U * Uᵀ )
---- eigenvalues / eigenvectors ----
_la_eigen - computes for an N-by-N real matrix A, the eigenvalues and the left and/or right eigenvectors.
---- solve linear equation systems ----
_la_solve - computes the solution to a system of linear equations A * X = B
---- least squares solving ----
_la_lstsq - solves overdetermined or underdetermined [weighted] linear system
---- regression ----
_la_regression - calculates an n-dimensional linear or non-linear regression
---- adjustment ----
_la_adjustment - performs a least-squares adjustment calculation for a system of different [weighted] non-linear equations
_la_adjustment_l1 - performs a adjustment calculation to L1 norm for a system of different [weighted] non-linear equations
_la_adj_addObservation - adds an observation to the adjustment system
---- additional helper functions ----
_la_adj_showResult - formats the results of _la_adj more clearly and display them in a window
Documentation
The documentation for the individual functions is contained directly in the source code. Each function is provided with a description that explains its parameters and return values. In most cases, a short example is also included here. You will also find detailed explanations in the example files.
To-Do
Certain functions (e.g. _la_add(), _la_mul(), _la_solve(), ...) are currently implemented for the general case only. However, these would benefit accordingly if the specific functions for special matrix geometries (symmetric matrices, triangular matrices, band matrices, ...) were used in each case. The basic functions required for this are already implemented in BLAS.au3 and LAPACK.au3.
Maybe a mouse hook will work so you can get the info about what window is clicked from MOUSEHOOKSTRUCT structure. In order to find if it's a simple click or a double click you can use a timer and GetDoubleClickTime() function.
ShellExecute('ms-photos:viewer?fileName={Your image path here}')
or if your default app for certain file extension is already MS Photos you can simply use
ShellExecute('{Your image path here}')
PS: brackets above mark a placeholder, you don't need them
You can use TrIDLib. It's capable to ID many files based on their signature. Here is a full list with definitions.
#include-once
#include <Array.au3>
Global Const $TRID_GET_RES_NUM = 1 ; Get the number of results
Global Const $TRID_GET_RES_FILETYPE = 2 ; Filetype descriptions
Global Const $TRID_GET_RES_FILEEXT = 3 ; Filetype extension
Global Const $TRID_GET_RES_POINTS = 4 ; Matching points
Global Const $TRID_GET_VER = 1001 ; TrIDLib version
Global Const $TRID_GET_DEFSNUM = 1004 ; Filetypes definitions loaded
$aInfo = TrIDLib_AnalyzeFile('<FilePath>')
_ArrayDisplay($aInfo)
Func TrIDLib_AnalyzeFile($sFile, $DefsPack = '', $bVerbose = False, $LibPath = 'TrIDLib.dll')
Local $aRet, $hTrIDLib, $iTotal = 0
$hTrIDLib = DllOpen($LibPath)
If $hTrIDLib = -1 Then Return False
If $bVerbose Then
$aRet = DllCall($hTrIDLib, 'int', 'TrID_GetInfo', 'int', $TRID_GET_VER, 'int', 0, 'str', 0)
ConsoleWrite(Round($aRet[0] / 100, 2) & @CRLF)
EndIf
$aRet = DllCall($hTrIDLib, 'int', 'TrID_LoadDefsPack', 'str', $DefsPack)
If Not $aRet[0] Then
DllClose($hTrIDLib)
Return Null
EndIf
If Not FileExists($sFile) Then Return Null
$aRet = DllCall($hTrIDLib, 'int', 'TrID_SubmitFileA', 'str', $sFile)
If Not $aRet[0] Then
DllClose($hTrIDLib)
Return Null
EndIf
$aRet = DllCall($hTrIDLib, 'int', 'TrID_Analyze')
If Not $aRet[0] Then
DllClose($hTrIDLib)
Return Null
EndIf
$aRet = DllCall($hTrIDLib, 'int', 'TrID_GetInfo', 'int', $TRID_GET_RES_NUM, 'int', 0, 'str', 9)
If $aRet[0] < 1 Then
DllClose($hTrIDLib)
Return Null
EndIf
Local $aMatches[$aRet[0] + 1][4]
$aMatches[0][0] = $aRet[0]
For $Index = 1 To $aRet[0]
$aRet = DllCall($hTrIDLib, 'int', 'TrID_GetInfo', 'int', $TRID_GET_RES_FILETYPE, 'int', $Index, 'str', 0)
$aMatches[$Index][0] = $aRet[3]
$aRet = DllCall($hTrIDLib, 'int', 'TrID_GetInfo', 'int', $TRID_GET_RES_FILEEXT, 'int', $Index, 'str', 0)
$aMatches[$Index][1] = $aRet[3]
$aRet = DllCall($hTrIDLib, 'int', 'TrID_GetInfo', 'int', $TRID_GET_RES_POINTS, 'int', $Index, 'str', 0)
$aMatches[$Index][2] = $aRet[0]
$iTotal += $aRet[0]
Next
If $iTotal > 0 Then
For $Index = 1 To $aMatches[0][0]
$aMatches[$Index][3] = Round($aMatches[$Index][2] * 100 / $iTotal, 2)
Next
EndIf
DllClose($hTrIDLib)
Return $aMatches
EndFunc
Here you can download the required dll.
Looking again at your last post, I'd urge you to normalize your database. Category should be a separate table and you should use it as a foreign key in your main table.
You can use TrIDLib. It's capable to ID many files based on their signature. Here is a full list with definitions.
#include-once
#include <Array.au3>
Global Const $TRID_GET_RES_NUM = 1 ; Get the number of results
Global Const $TRID_GET_RES_FILETYPE = 2 ; Filetype descriptions
Global Const $TRID_GET_RES_FILEEXT = 3 ; Filetype extension
Global Const $TRID_GET_RES_POINTS = 4 ; Matching points
Global Const $TRID_GET_VER = 1001 ; TrIDLib version
Global Const $TRID_GET_DEFSNUM = 1004 ; Filetypes definitions loaded
$aInfo = TrIDLib_AnalyzeFile('<FilePath>')
_ArrayDisplay($aInfo)
Func TrIDLib_AnalyzeFile($sFile, $DefsPack = '', $bVerbose = False, $LibPath = 'TrIDLib.dll')
Local $aRet, $hTrIDLib, $iTotal = 0
$hTrIDLib = DllOpen($LibPath)
If $hTrIDLib = -1 Then Return False
If $bVerbose Then
$aRet = DllCall($hTrIDLib, 'int', 'TrID_GetInfo', 'int', $TRID_GET_VER, 'int', 0, 'str', 0)
ConsoleWrite(Round($aRet[0] / 100, 2) & @CRLF)
EndIf
$aRet = DllCall($hTrIDLib, 'int', 'TrID_LoadDefsPack', 'str', $DefsPack)
If Not $aRet[0] Then
DllClose($hTrIDLib)
Return Null
EndIf
If Not FileExists($sFile) Then Return Null
$aRet = DllCall($hTrIDLib, 'int', 'TrID_SubmitFileA', 'str', $sFile)
If Not $aRet[0] Then
DllClose($hTrIDLib)
Return Null
EndIf
$aRet = DllCall($hTrIDLib, 'int', 'TrID_Analyze')
If Not $aRet[0] Then
DllClose($hTrIDLib)
Return Null
EndIf
$aRet = DllCall($hTrIDLib, 'int', 'TrID_GetInfo', 'int', $TRID_GET_RES_NUM, 'int', 0, 'str', 9)
If $aRet[0] < 1 Then
DllClose($hTrIDLib)
Return Null
EndIf
Local $aMatches[$aRet[0] + 1][4]
$aMatches[0][0] = $aRet[0]
For $Index = 1 To $aRet[0]
$aRet = DllCall($hTrIDLib, 'int', 'TrID_GetInfo', 'int', $TRID_GET_RES_FILETYPE, 'int', $Index, 'str', 0)
$aMatches[$Index][0] = $aRet[3]
$aRet = DllCall($hTrIDLib, 'int', 'TrID_GetInfo', 'int', $TRID_GET_RES_FILEEXT, 'int', $Index, 'str', 0)
$aMatches[$Index][1] = $aRet[3]
$aRet = DllCall($hTrIDLib, 'int', 'TrID_GetInfo', 'int', $TRID_GET_RES_POINTS, 'int', $Index, 'str', 0)
$aMatches[$Index][2] = $aRet[0]
$iTotal += $aRet[0]
Next
If $iTotal > 0 Then
For $Index = 1 To $aMatches[0][0]
$aMatches[$Index][3] = Round($aMatches[$Index][2] * 100 / $iTotal, 2)
Next
EndIf
DllClose($hTrIDLib)
Return $aMatches
EndFunc
Here you can download the required dll.
This is a replication of an old game called Bulldozer created by John 'FlyMan' Hattan (The Code Zone). There is another implementation in AutoHotkey made by Weston Campbell so I made one in AutoIt. In Weston's github repository you can check the game objective and all valid movements and objects.
The controls are:
UP - Move bulldozer up
DOWN - Move bulldozer down
RIGHT - Move bulldozer right
LEFT - Move bulldozer left
R - Restart current level
U - Undo last move
J - Jump to a specific level
PAUSE - Pause the game
Currently I added just first 30 40 60 levels but the original game have 180 levels (eventually I will add all of them). Since Weston's code is on github I suppose it's under some kind of creative license so I didn't bother to create other sprites but if someone have time and inspiration to create new sprites, I am open to add new sprites.
To do:
Maybe some music
Hall of fame / Score table
Add all original game levels
Add more custom levels
Provide access to settings (fonts, colors, sprites, hotkeys, etc)
In the attachment is a compiled executable and also the source code.
#NoTrayIcon
#include-once
#include <GDIPlus.au3>
#include <WinAPI.au3>
#include <SQLite.au3>
If Not FileExists(@ScriptDir & '\Bulldozer.sqlite') Then
MsgBox(0x10, 'Error', 'Database could not be located!', 10)
Exit
EndIf
_SQLite_Startup(@ScriptDir & '\sqlite3.dll')
Global $hDB = _SQLite_Open(@ScriptDir & '\Bulldozer.sqlite')
Global Const $TileSize = Number(ReadProperty('TileSize', 32))
Global Const $XTiles = Number(ReadProperty('XTiles', 35))
Global Const $YTiles = Number(ReadProperty('YTiles', 25))
If @DesktopWidth < $XTiles * $TileSize Or @DesktopHeight < $YTiles * $TileSize Then
MsgBox(0x30, 'Warning', 'For a better experience you need a display with a resolution ' & String($XTiles * $TileSize) & 'x' & String($YTiles * $TileSize) & '.', 10)
EndIf
Global $X, $Y, $Direction
Global $mResources[]
Global $mTiles[]
Global $aTiles = GetTiles()
If IsArray($aTiles) Then
For $Index = 1 To UBound($aTiles) - 1
If $aTiles[$Index][1] Then $mTiles[$aTiles[$Index][0]] = $aTiles[$Index][1]
Next
Else
_SQLite_Close()
_SQLite_Shutdown()
MsgBox(0x10, 'Error', 'Cannot retrieve game tiles from database!', 10)
Exit
EndIf
Global $CurrentLevel = 1
Global $MaxLevel = Number(ReadProperty('MaxLevel', 1))
Global $AutoRestart = Number(ReadProperty('AutoRestart', 0))
Global $Font = ReadProperty('Font', 'Segoe UI')
Global $FontSize = Number(ReadProperty('FontSize', 40))
Global $SecFontSize = Number(ReadProperty('SMFontSize', 20))
Global $MessageColor = ReadProperty('MessageColor', 0xFFFFFFFF)
Global $SecMessageColor = ReadProperty('SMColor', 0xFF00A000)
Global $Start, $PlayTime = 0, $Pause = False, $MsgShow = False
Global $LastMove = Null, $PrevLevel = Null, $NumOfMoves = 0
Global $hMain, $aLevel[$YTiles][$XTiles]
Global $ClearColor = ReadProperty('ClearColor', '0xFF000000')
Global $KeyboardEnabled = False
_GDIPlus_Startup()
$mResources['Bitmap'] = _GDIPlus_BitmapCreateFromScan0($XTiles * $TileSize, $YTiles * $TileSize)
$mResources['Graphics'] = _GDIPlus_ImageGetGraphicsContext($mResources['Bitmap'])
_GDIPlus_GraphicsSetCompositingMode($mResources['Graphics'], 0)
_GDIPlus_GraphicsSetCompositingQuality($mResources['Graphics'], 2)
_GDIPlus_GraphicsSetInterpolationMode($mResources['Graphics'], 2)
_GDIPlus_GraphicsSetSmoothingMode($mResources['Graphics'], 2)
_GDIPlus_GraphicsSetTextRenderingHint($mResources['Graphics'], 3)
For $Index = 1 To UBound($aTiles) - 1
If $aTiles[$Index][2] Then $mResources[$aTiles[$Index][0]] = _GDIPlus_BitmapCreateFromMemory(Unpack($aTiles[$Index][2]))
Next
$hMain = GUICreate('Bulldozer', $XTiles * $TileSize, $YTiles * $TileSize)
$hPic = GUICtrlCreatePic('', 0, 0, $XTiles * $TileSize, $YTiles * $TileSize)
GUISetState(@SW_SHOW, $hMain)
LoadLevel()
DrawLevel()
DrawBulldozer($mResources['Bulldozer' & $Direction])
PushToScreen()
While True
If GUIGetMsg() = -3 Then Quit()
If LevelDone() Then NextLevel()
If WinActive($hMain) Then
If $KeyboardEnabled = False Then KeyboardInput(True)
Else
If $KeyboardEnabled Then KeyboardInput(False)
EndIf
Sleep(10)
WEnd
Func Quit()
Local $aKeys = MapKeys($mResources)
For $Index = 0 To UBound($aKeys) - 1
$aKeys[$Index] = 'Graphics' ? _GDIPlus_GraphicsDispose($mResources[$aKeys[$Index]]) : _GDIPlus_BitmapDispose($mResources[$aKeys[$Index]])
Next
_GDIPlus_Shutdown()
_SQLite_Close()
_SQLite_Shutdown()
Exit
EndFunc
Func KeyboardInput($Set = True)
Local $aKeys = GetKeyboard()
If IsArray($aKeys) Then
For $Index = 1 To UBound($aKeys) - 1
HotKeySet($aKeys[$Index][0], $Set ? $aKeys[$Index][1] : Null)
Next
EndIf
$KeyboardEnabled = $Set
EndFunc
Func MoveRight()
If $Pause Or $MsgShow Then Return
$PrevLevel = $aLevel
IsMovable($X + 1, $Y)
If $X + 1 < $XTiles And IsMovable($X + 1, $Y) Then
If IsRock($X + 1, $Y) And (IsEmpty($X + 2, $Y) Or IsEmptySocket($X + 2, $Y)) Then
$aLevel[$Y][$X + 1] = IsSocket($X + 1, $Y) ? $mTiles['Socket'] : $mTiles['None']
$aLevel[$Y][$X + 2] = IsEmpty($X + 2, $Y) ? $mTiles['Rock'] : $mTiles['RockSocket']
$X += 1
ElseIf IsRock($X + 1, $Y) And (Not IsMovable($X + 2, $Y) Or IsRock($X + 2, $Y)) Then
$X = $X
Else
$X += 1
EndIf
$NumOfMoves += 1
EndIf
$LastMove = 'R'
DrawLevel()
DrawBulldozer($mResources['BulldozerR'])
PushToScreen()
EndFunc
Func MoveLeft()
If $Pause Or $MsgShow Then Return
$PrevLevel = $aLevel
If $X - 1 > 0 And IsMovable($X - 1, $Y) Then
If IsRock($X - 1, $Y) And (IsEmpty($X - 2, $Y) Or IsEmptySocket($X - 2, $Y)) Then
$aLevel[$Y][$X - 1] = IsSocket($X - 1, $Y) ? $mTiles['Socket'] : $mTiles['None']
$aLevel[$Y][$X - 2] = IsEmpty($X - 2, $Y) ? $mTiles['Rock'] : $mTiles['RockSocket']
$X -= 1
ElseIf IsRock($X - 1, $Y) And (Not IsMovable($X - 2, $Y) Or IsRock($X - 2, $Y)) Then
$X = $X
Else
$X -= 1
EndIf
$NumOfMoves += 1
EndIf
$LastMove = 'L'
DrawLevel()
DrawBulldozer($mResources['BulldozerL'])
PushToScreen()
EndFunc
Func MoveUp()
If $Pause Or $MsgShow Then Return
$PrevLevel = $aLevel
If $Y - 1 > 0 And IsMovable($X, $Y - 1) Then
If IsRock($X, $Y - 1) And (IsEmpty($X, $Y - 2) Or IsEmptySocket($X, $Y - 2)) Then
$aLevel[$Y - 1][$X] = IsSocket($X, $Y - 1) ? $mTiles['Socket'] : $mTiles['None']
$aLevel[$Y - 2][$X] = IsEmpty($X, $Y - 2) ? $mTiles['Rock'] : $mTiles['RockSocket']
$Y -= 1
ElseIf IsRock($X, $Y - 1) And (Not IsMovable($X, $Y - 2) Or IsRock($X, $Y - 2)) Then
$Y = $Y
Else
$Y -= 1
EndIf
$NumOfMoves += 1
EndIf
$LastMove = 'U'
DrawLevel()
DrawBulldozer($mResources['BulldozerU'])
PushToScreen()
EndFunc
Func MoveDown()
If $Pause Or $MsgShow Then Return
$PrevLevel = $aLevel
If $Y + 1 < $YTiles And IsMovable($X, $Y + 1) Then
If IsRock($X, $Y + 1) And (IsEmpty($X, $Y + 2) Or IsEmptySocket($X, $Y + 2)) Then
$aLevel[$Y + 1][$X] = IsSocket($X, $Y + 1) ? $mTiles['Socket'] : $mTiles['None']
$aLevel[$Y + 2][$X] = IsEmpty($X, $Y + 2) ? $mTiles['Rock'] : $mTiles['RockSocket']
$Y += 1
ElseIf IsRock($X, $Y + 1) And (Not IsMovable($X, $Y + 2) Or IsRock($X, $Y + 2)) Then
$Y = $Y
Else
$Y += 1
EndIf
$NumOfMoves += 1
EndIf
$LastMove = 'D'
DrawLevel()
DrawBulldozer($mResources['BulldozerD'])
PushToScreen()
EndFunc
Func IsMovable($CX, $CY)
If $CX < 0 Or $CX >= $XTiles Then Return False
If $CY < 0 Or $CY >= $YTiles Then Return False
Switch $aLevel[$CY][$CX]
Case $mTiles['None'], $mTiles['Rock'], $mTiles['RockSocket'], $mTiles['Socket']
Return True
Case Else
Return False
EndSwitch
EndFunc
Func IsRock($CX, $CY)
If $CX < 0 Or $CX >= $XTiles Then Return False
If $CY < 0 Or $CY >= $YTiles Then Return False
Switch $aLevel[$CY][$CX]
Case $mTiles['Rock'], $mTiles['RockSocket']
Return True
Case Else
Return False
EndSwitch
EndFunc
Func IsEmpty($CX, $CY)
If $CX < 0 Or $CX >= $XTiles Then Return False
If $CY < 0 Or $CY >= $YTiles Then Return False
Switch $aLevel[$CY][$CX]
Case $mTiles['None']
Return True
Case Else
Return False
EndSwitch
EndFunc
Func IsEmptySocket($CX, $CY)
If $CX < 0 Or $CX >= $XTiles Then Return False
If $CY < 0 Or $CY >= $YTiles Then Return False
Switch $aLevel[$CY][$CX]
Case $mTiles['Socket']
Return True
Case Else
Return False
EndSwitch
EndFunc
Func IsSocket($CX, $CY)
If $CX < 0 Or $CX >= $XTiles Then Return False
If $CY < 0 Or $CY >= $YTiles Then Return False
Switch $aLevel[$CY][$CX]
Case $mTiles['RockSocket'], $mTiles['Socket']
Return True
Case Else
Return False
EndSwitch
EndFunc
Func JumpToLevel()
Local $iLevel = InputBox('Jump to level', 'Please type the level that you want to play')
If $iLevel And Int($iLevel) > 0 And Int($iLevel) <= $MaxLevel Then
$CurrentLevel = $iLevel
LoadLevel()
DrawLevel()
DrawBulldozer($mResources['Bulldozer' & $Direction])
PushToScreen()
EndIf
EndFunc
Func LevelDone()
For $j = 0 To $YTiles - 1
For $i = 0 To $XTiles - 1
If $aLevel[$j][$i] = $mTiles['Socket'] Then Return False
Next
Next
Return True
EndFunc
Func NextLevel()
$PlayTime += Int(TimerDiff($Start) / 1000)
ShowMessage('Level ' & $CurrentLevel & ' completed.' & @CRLF & ' ', 'Solved in ' & $NumOfMoves & ' moves.' & @CRLF & 'Time: ' & FormatTime($PlayTime), 4000)
If $CurrentLevel + 1 > $MaxLevel Then
GameEnd()
Else
$CurrentLevel += 1
LoadLevel()
DrawLevel()
DrawBulldozer($mResources['Bulldozer' & $Direction])
PushToScreen()
EndIf
EndFunc
Func LoadLevel()
Local $Data = SQLite_Query($hDB, 'SELECT Data FROM levels WHERE Level = ' & $CurrentLevel)
If @extended Then
$Data = BinaryToString(Unpack($Data[1][0]))
$Data = StringSplit($Data, @CRLF, 1)
For $Line = 1 To $YTiles
Local $Row = StringSplit($Data[$Line], '')
For $Index = 1 To $Row[0]
$aLevel[$Line - 1][$Index - 1] = $Row[$Index]
Next
Next
$X = $Data[26]
$Y = $Data[27]
$Direction = $Data[28]
ShowMessage('Level ' & $CurrentLevel)
$NumOfMoves = 0
$PlayTime = 0
$Start = TimerInit()
EndIf
EndFunc
Func RestartLevel()
If $Pause Then Return
LoadLevel()
DrawLevel()
DrawBulldozer($mResources['Bulldozer' & $Direction])
PushToScreen()
EndFunc
Func GameEnd()
ShowMessage('Congratulations!' & @CRLF & @CRLF & 'You have finished the game.', Null, 4000)
If $AutoRestart Then
$CurrentLevel = 1
RestartLevel()
Else
Quit()
EndIf
EndFunc
Func FormatTime($Sec)
If $Sec < 60 Then Return $Sec & ' seconds'
Local $Min = Int($Sec / 60)
$Sec -= $Min * 60
If $Min > 60 Then
Local $Hours = Int($Sec / 60)
$Min -= $Hours * 60
Return $Hours & ' hour' & ($Hours > 1 ? 's' : '') & ($Min <> 0 ? ', ' & $Min & ' minute' & ($Min > 1 ? 's' : '') : '') & ($Sec <> 0 ? ', ' & $Sec & ' second' & ($Sec > 1 ? 's' : '') : '')
Else
Return $Min & ' minute' & ($Min > 1 ? 's' : '') & ($Sec <> 0 ? ', ' & $Sec & ' second' & ($Sec > 1 ? 's' : '') : '')
EndIf
EndFunc
Func ShowMessage($Message, $SecMessage = Null, $iDelay = 1500)
$MsgShow = True
Local $hFamily = _GDIPlus_FontFamilyCreate($Font)
Local $hFont = _GDIPlus_FontCreate($hFamily, $FontSize, 1)
Local $tLayout = _GDIPlus_RectFCreate(0, 0, $XTiles * $TileSize, ($SecMessage ? ($YTiles * $TileSize / 2) : ($YTiles * $TileSize)))
Local $hBrush = _GDIPlus_BrushCreateSolid($MessageColor)
Local $hFormat = _GDIPlus_StringFormatCreate()
_GDIPlus_StringFormatSetAlign($hFormat, 1)
_GDIPlus_StringFormatSetLineAlign($hFormat, ($SecMessage ? 2 : 1))
_GDIPlus_GraphicsClear($mResources['Graphics'], $ClearColor)
_GDIPlus_GraphicsDrawStringEx($mResources['Graphics'], $Message, $hFont, $tLayout, $hFormat, $hBrush)
If $SecMessage Then
_GDIPlus_StringFormatSetLineAlign($hFormat, 0)
Local $hSecFont = _GDIPlus_FontCreate($hFamily, $SecFontSize, 1)
Local $tSecLayout = _GDIPlus_RectFCreate(0, ($YTiles * $TileSize / 2) , $XTiles * $TileSize, $YTiles * $TileSize / 2)
Local $hSecBrush = _GDIPlus_BrushCreateSolid($SecMessageColor)
_GDIPlus_GraphicsDrawStringEx($mResources['Graphics'], $SecMessage, $hSecFont, $tSecLayout, $hFormat, $hSecBrush)
EndIf
PushToScreen()
_GDIPlus_StringFormatDispose($hFormat)
_GDIPlus_BrushDispose($hBrush)
_GDIPlus_FontDispose($hFont)
If $SecMessage Then
_GDIPlus_BrushDispose($hSecBrush)
_GDIPlus_FontDispose($hSecFont)
EndIf
_GDIPlus_FontFamilyDispose($hFamily)
Local $DelayTimer = TimerInit()
Do
If GUIGetMsg() = -3 Then Quit()
Sleep(10)
Until TimerDiff($DelayTimer) >= $iDelay
$MsgShow = False
EndFunc
Func UndoLastMove()
If $PrevLevel = Null Then Return
If $LastMove = Null Then Return
If $Pause Then Return
$aLevel = $PrevLevel
DrawLevel()
Switch $LastMove
Case 'R'
$X -= 1
DrawBulldozer($mResources['BulldozerR'])
Case 'L'
$X += 1
DrawBulldozer($mResources['BulldozerL'])
Case 'U'
$Y += 1
DrawBulldozer($mResources['BulldozerU'])
Case 'D'
$Y -= 1
DrawBulldozer($mResources['BulldozerD'])
EndSwitch
PushToScreen()
$PrevLevel = Null
$NumOfMoves -= 1
EndFunc
Func Pause()
$Pause = Not $Pause
If $Pause Then
$PlayTime += Int(TimerDiff($Start) / 1000)
ShowMessage('Game is paused.', 'Press {Pause} button to resume your game.', 10)
Else
DrawLevel()
DrawBulldozer($mResources['Bulldozer' & $Direction])
PushToScreen()
$Start = TimerInit()
EndIf
Do
Sleep(10)
Until $Pause = False
EndFunc
Func DrawLevel()
_GDIPlus_GraphicsClear($mResources['Graphics'], $ClearColor)
For $j = 0 To $YTiles - 1
For $i = 0 To $XTiles - 1
Switch $aLevel[$j][$i]
Case $mTiles['Wall1']
_GDIPlus_GraphicsDrawImageRect($mResources['Graphics'], $mResources['Wall1'], $i * $TileSize, $j * $TileSize, $TileSize, $TileSize)
Case $mTiles['Wall2']
_GDIPlus_GraphicsDrawImageRect($mResources['Graphics'], $mResources['Wall2'], $i * $TileSize, $j * $TileSize, $TileSize, $TileSize)
Case $mTiles['Wall3']
_GDIPlus_GraphicsDrawImageRect($mResources['Graphics'], $mResources['Wall3'], $i * $TileSize, $j * $TileSize, $TileSize, $TileSize)
Case $mTiles['Wall4']
_GDIPlus_GraphicsDrawImageRect($mResources['Graphics'], $mResources['Wall4'], $i * $TileSize, $j * $TileSize, $TileSize, $TileSize)
Case $mTiles['Wall5']
_GDIPlus_GraphicsDrawImageRect($mResources['Graphics'], $mResources['Wall5'], $i * $TileSize, $j * $TileSize, $TileSize, $TileSize)
Case $mTiles['Wall6']
_GDIPlus_GraphicsDrawImageRect($mResources['Graphics'], $mResources['Wall6'], $i * $TileSize, $j * $TileSize, $TileSize, $TileSize)
Case $mTiles['Wall7']
_GDIPlus_GraphicsDrawImageRect($mResources['Graphics'], $mResources['Wall7'], $i * $TileSize, $j * $TileSize, $TileSize, $TileSize)
Case $mTiles['Wall8']
_GDIPlus_GraphicsDrawImageRect($mResources['Graphics'], $mResources['Wall8'], $i * $TileSize, $j * $TileSize, $TileSize, $TileSize)
Case $mTiles['Rock']
_GDIPlus_GraphicsDrawImageRect($mResources['Graphics'], $mResources['Rock'], $i * $TileSize, $j * $TileSize, $TileSize, $TileSize)
Case $mTiles['RockSocket']
_GDIPlus_GraphicsDrawImageRect($mResources['Graphics'], $mResources['RockSocket'], $i * $TileSize, $j * $TileSize, $TileSize, $TileSize)
Case $mTiles['Socket']
_GDIPlus_GraphicsDrawImageRect($mResources['Graphics'], $mResources['Socket'], $i * $TileSize, $j * $TileSize, $TileSize, $TileSize)
EndSwitch
Next
Next
EndFunc
Func DrawBulldozer($hImage)
_GDIPlus_GraphicsDrawImageRect($mResources['Graphics'], $hImage, $X * $TileSize, $Y * $TileSize, $TileSize, $TileSize)
EndFunc
Func PushToScreen()
Local $hHBITMAP = _GDIPlus_BitmapCreateHBITMAPFromBitmap($mResources['Bitmap'])
_WinAPI_DeleteObject(GUICtrlSendMsg($hPic, 0x0172, 0, $hHBITMAP))
_WinAPI_DeleteObject($hHBITMAP)
EndFunc
Func ReadProperty($sProperty, $vFallback = Null)
Local $aQuery = SQLite_Query($hDB, "SELECT Value FROM settings WHERE Property = " & _SQLite_FastEscape($sProperty))
If @extended Then
Return $aQuery[1][0]
Else
Return $vFallback
EndIf
EndFunc
Func GetTiles($vFallback = Null)
Local $aQuery = SQLite_Query($hDB, 'SELECT Tile, Symbol, Data FROM tiles')
If @extended Then
Return $aQuery
Else
Return $vFallback
EndIf
EndFunc
Func GetKeyboard($vFallback = Null)
Local $aQuery = SQLite_Query($hDB, 'SELECT Key, Function FROM keyboard')
If @extended Then
Return $aQuery
Else
Return $vFallback
EndIf
EndFunc
Func SQLite_Query($hDB, $sQuery)
Local $aResult, $iRows, $iColumns
_SQLite_GetTable2d($hDB, $sQuery, $aResult, $iRows, $iColumns)
If @error Then
Return SetError(1, 0, False)
Else
Return SetError(0, UBound($aResult, 1) - 1, $aResult)
EndIf
EndFunc
Func Unpack($bData)
Local $tData = DllStructCreate('byte Data[' & BinaryLen($bData) & ']')
Local $bCode = Binary('0x8B7424048B4C2408AC347F8846FF4975F7C20800')
Local $iSize = BinaryLen($bCode)
Local $tCode = DllStructCreate('byte Code[' & $iSize & ']')
DllStructSetData($tCode, 'Code', $bCode)
DllStructSetData($tData, 'Data', $bData)
DllCallAddress('int', DllStructGetPtr($tCode), 'ptr', DllStructGetPtr($tData), 'int', DllStructGetSize($tData))
Return DllStructGetData($tData, 'Data')
EndFunc
Have fun!
Expanding on Nine's task bar adventures... The overlay icon and tooltip were the only other interesting task bar things to me, so I added those + examples
#include <GUIConstantsEx.au3>
#include <WinAPIIcons.au3> ; For _WinAPI_DestroyIcon
#include <WinAPIShellEx.au3> ; For _WinAPI_ShellExtractIcon
Global Const $sCLSID_TaskbarList = "{56FDF344-FD6D-11D0-958A-006097C9A090}"
Global Const $sIID_ITaskbarList3 = "{EA1AFB91-9E28-4B86-90E9-9E9F8A5EEFAF}"
Global Const $tagITaskbarList3 = _
"HrInit hresult();" & _
"AddTab hresult(hwnd);" & _
"DeleteTab hresult(hwnd);" & _
"ActivateTab hresult(hwnd);" & _
"SetActiveAlt hresult(hwnd);" & _
"MarkFullscreenWindow hresult(hwnd;boolean);" & _
"SetProgressValue hresult(hwnd;uint64;uint64);" & _
"SetProgressState hresult(hwnd;int);" & _
"RegisterTab hresult(hwnd;hwnd);" & _
"UnregisterTab hresult(hwnd);" & _
"SetTabOrder hresult(hwnd;hwnd);" & _
"SetTabActive hresult(hwnd;hwnd;dword);" & _
"ThumbBarAddButtons hresult(hwnd;uint;ptr);" & _
"ThumbBarUpdateButtons hresult(hwnd;uint;ptr);" & _
"ThumbBarSetImageList hresult(hwnd;ptr);" & _
"SetOverlayIcon hresult(hwnd;ptr;wstr);" & _
"SetThumbnailTooltip hresult(hwnd;wstr);" & _
"SetThumbnailClip hresult(hwnd;ptr);"
Example()
Func Example()
Local $hGUI = GUICreate("AutoIt v3", 400, 100)
GUISetState()
Local $oTaskBar = TB_Init()
TB_ToolTip($oTaskBar, $hGUI, "Working...")
; Load an icon -- this is a blue refresh on Win11
Local $hIcon = _WinAPI_ShellExtractIcon(@SystemDir & "\shell32.dll", 238, 32, 32)
TB_SetOverlayIcon($oTaskBar, $hGUI, $hIcon, "Blue refresh")
For $i = 1 To 100
TB_SetProgress($oTaskBar, $hGUI, $i, 100)
Sleep(25)
Next
; Destroy the old icon
_WinAPI_DestroyIcon($hIcon)
Local $hSecondIcon = _WinAPI_ShellExtractIcon(@SystemDir & "\shell32.dll", 300, 32, 32)
TB_SetOverlayIcon($oTaskBar, $hGUI, $hSecondIcon, "Green checkmark")
TB_Flash($oTaskBar, $hGUI, 4, 300)
TB_ToolTip($oTaskBar, $hGUI, "Waiting for you to close the window")
While True
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
ExitLoop
EndSwitch
WEnd
; Clear the icon overlay
TB_SetOverlayIcon($oTaskBar, $hGUI, Null)
_WinAPI_DestroyIcon($hSecondIcon)
EndFunc ;==>Example
Func TB_Init()
Local $oTB = ObjCreateInterface($sCLSID_TaskbarList, $sIID_ITaskbarList3, $tagITaskbarList3)
$oTB.HrInit()
Return $oTB
EndFunc ;==>TB_Init
Func TB_SetProgress(ByRef $oTB, $hWnd, $iCurrent, $iCompleted)
$oTB.SetProgressValue($hWnd, $iCurrent, $iCompleted)
EndFunc ;==>TB_SetProgress
Func TB_Flash(ByRef $oTB, $hWnd, $iTimes, $iDelay)
For $i = 1 To $iTimes
$oTB.SetProgressState($hWnd, 0)
Sleep($iDelay)
$oTB.SetProgressValue($hWnd, 100, 100)
Sleep($iDelay)
Next
$oTB.SetProgressState($hWnd, 0)
EndFunc ;==>TB_Flash
; These are icons added to your taskbar icon, showing status usually. Each window only gets 1. Set $hIcon to NULL to clear.
; (Win11) Teams uses this to show your status (busy, free, inactive) and Outlook uses it to show if you have an unread email
Func TB_SetOverlayIcon(ByRef $oTB, $hWnd, $hIcon, $sAltText = "")
$oTB.SetOverlayIcon($hWnd, $hIcon, $sAltText)
EndFunc ;==>TB_SetOverlayIcon
; Depending on settings and version, this may be difficult to see. On Win11 with taskbar previews, it is only visible after hovering over the preview window.
Func TB_ToolTip(ByRef $oTB, $hWnd, $sTooltip)
$oTB.SetThumbnailTooltip($hWnd, $sTooltip)
EndFunc ;==>TB_ToolTip
Not tested as a fully script but something like this:
#include <Array.au3>
#include <GuiListView.au3>
; Create GUI here
$aList1 = ListColumnToArray($cList1, 1) ; $cList1 - handle or ctrl id of the first list
$aList2 = ListColumnToArray($cList2, 1) ; $cList2 - handle or ctrl id of the second list
For $Index = 1 To $aList1[0]
_ArraySearch($aList2, StringReplace($aList1[$Index], '.kml', '.srt'))
If Not @error Then _GUICtrlListView_DeleteItem($cList1, $Index - 1)
Next
Func ListColumnToArray($List, $Column)
Local $sData
If $Column > _GUICtrlListView_GetColumnCount($List) Then Return SetError(1, 0, Null)
Local $NumOfItems = _GUICtrlListView_GetItemCount($List)
For $Index = 0 To $NumOfItems - 1
$sData &= _GUICtrlListView_GetItemText($List, $Index, $Column) & '|'
Next
Return StringSplit(StringTrimRight($sData, 1), '|')
EndFunc
Your dll uses SetThreadToken function to set token.
The same done via my link.
Also you can use not-documented NtImpersonateThread instead of SetThreadToken.