By
UEZ
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.1 build 2022-06-13 beta
#include-once
#include <GDIPlus.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_Ver
; #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 .......: Currently only WebP images are supported - no animated WebP images yet!
; 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
; #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 2022-06-18
#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.0)
#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", $build = "build 2022-06-18"
#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 - 330, -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, 324, 2, $SS_ETCHEDHORZ)
Global Const $lbPresets = GUICtrlCreateLabel("Presets", 10, 125, 39, 20)
Global Const $cbPreset = GUICtrlCreateCombo("Default", 120, 120, 145, 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, 158, 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("", 274, 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, 158, 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("", 274, 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, 158, 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("", 274, 240, 28, 24, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_READONLY))
GUICtrlSetData(-1, GUICtrlRead($slSNS_Strength))
Global Const $lbFilterSharpness = GUICtrlCreateLabel("Filter Sharpness", 10, 274, 81, 20)
Global Const $slFilter_Sharpness = GUICtrlCreateSlider(116, 278, 158, 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("", 274, 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, 158, 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("", 274, 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, 158, 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("", 274, 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, 158, 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("", 274, 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, 158, 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("", 274, 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, 158, 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("", 274, 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, 158, 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("", 274, 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, 121, 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], 0.5, 18.5)
AutoItSetOption("GUIOnEventMode", 0)
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
$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 / 4.5 * $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 7-Zip archive for the UDF, DLLs and examples: WebP v0.3.1 build 2022-06-18 beta.7z
Recommended Comments