Jump to content

Fill image with other colors - (Moved)


Recommended Posts

  • Moderators

Moved to the appropriate forum, as the AutoIt Example Scripts forum very clearly states:

Quote

Share your cool AutoIt scripts, UDFs and applications with others.


Do not post general support questions here, instead use the AutoIt Help and Support forums.

Moderation Team

Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind

Open spoiler to see my UDFs:

Spoiler

ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Link to post
Share on other sites

Look at _GDIPlus_BitmapGetPixel in the autoit help file.  It is pretty much all you need in there.  You will need to adjust the, lets call it, filter. And you will need to read a file instead of a screencapture. This one easy way to do it, among other solutions.

Good scripting !

Link to post
Share on other sites
#include <GDIPlus.au3>

; base color 0xFF0080 (255,0,128)
Global $iBaseR = 255, $iBaseG = 0, $iBaseB = 128
; shade-variation (0-255)
Global $iVary = 107
; color to change base color
Global $iChangeBaseColor = 0x000000
; color to change other colors
Global $iChangeOtherColor = 0xFFFFFF

Global $sSourceFile = "1.jpg"
Global $sDestFile = "2.jpg"

SplashTextOn("", "Processing...", 300, 100, Default, Default, 33)
_GDIPlus_Startup()

$hImage = _GDIPlus_ImageLoadFromFile($sSourceFile)
$iW = _GDIPlus_ImageGetWidth($hImage)
$iH = _GDIPlus_ImageGetHeight($hImage)

$tBits = _GDIPlus_BitmapLockBits($hImage, 0, 0, $iW, $iH, BitOR($GDIP_ILMWRITE, $GDIP_ILMREAD))
$iScan0 = DllStructGetData($tBits, "Scan0")
$tPixel = DllStructCreate("int[" & $iW * $iH & "];", $iScan0)
For $iY = 0 To $iH - 1
  $iOffset = $iY * $iW + 1
  For $iX = 0 To $iW - 1
    $iColor = DllStructGetData($tPixel, 1, $iOffset + $iX)
    $iR = BitAND(BitShift($iColor, 16), 0xFF)
    $iG = BitAND(BitShift($iColor, 8), 0xFF)
    $iB = BitAND($iColor, 0xFF)
    If  $iR > $iBaseR - $iVary And $iR < $iBaseR + $iVary _
    And $iG > $iBaseG - $iVary And $iG < $iBaseG + $iVary _
    And $iB > $iBaseB - $iVary And $iB < $iBaseB + $iVary Then
      DllStructSetData($tPixel, 1, $iChangeBaseColor, $iOffset + $iX)
    Else
      DllStructSetData($tPixel, 1, $iChangeOtherColor, $iOffset + $iX)
    EndIf
  Next
Next
_GDIPlus_BitmapUnlockBits($hImage, $tBits)

_GDIPlus_ImageSaveToFile($hImage, $sDestFile)
_GDIPlus_ImageDispose($hImage)
_GDIPlus_Shutdown()

SplashOff()
ShellExecute($sDestFile)

 

Link to post
Share on other sites

Check this out (example is from help file but modified appropriately):

;coded by UEZ
#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>

Example()

Func Example()
    Local $sFile = "C:\Temp\Ballons_364x227.png"
    If Not FileExists($sFile) Then
        MsgBox(BitOR($MB_SYSTEMMODAL, $MB_ICONHAND), "", $sFile & " not found!", 30)
        Return False
    EndIf

    _GDIPlus_Startup()
    Local $hImage = _GDIPlus_ImageLoadFromFile($sFile) ;create an image object based on a file
    If @error Then
        _GDIPlus_Shutdown()
        MsgBox(BitOR($MB_SYSTEMMODAL, $MB_ICONHAND), "", "An error has occured - unable to load image!", 30)
        Return False
    EndIf

    Local $iW = _GDIPlus_ImageGetWidth($hImage), $iH = _GDIPlus_ImageGetHeight($hImage) ;get width and height of the image
    Local $hBitmap = _GDIPlus_BitmapCreateFromScan0($iW, $iH)
    Local $hContext = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    _GDIPlus_GraphicsDrawImageRect($hContext, $hImage, 0, 0, $iW, $iH)

    Local $tBitmapData = _GDIPlus_BitmapLockBits($hBitmap, 0, 0, $iW, $iH, BitOR($GDIP_ILMWRITE, $GDIP_ILMREAD), $GDIP_PXF32ARGB) ;locks a portion of a bitmap for reading and writing. More infor at http://msdn.microsoft.com/en-us/library/windows/desktop/ms536298(v=vs.85).aspx
    Local $iScan0 = DllStructGetData($tBitmapData, "Scan0") ;get scan0 (pixel data) from locked bitmap
    Local $tPixel = DllStructCreate("int argb[" & $iW * $iH & "];", $iScan0)
    Local $iRGBA, $iRowOffset, $aHSL

    For $iY = 0 To $iH - 1
        $iRowOffset = $iY * $iW + 1
        For $iX = 0 To $iW - 1 ;get each pixel in each line and row
            $iRGBA = DllStructGetData($tPixel, 1, $iRowOffset + $iX)
            $aHSL = RGB2HSL($iRGBA) ;convert color to HSL color space
            ;check if HSL color is in the red / purple range -> see http://hslpicker.com for details
            If ($aHSL[0] < 30 And InRange(Round(100 * $aHSL[1]), 100) And InRange(Round(100 * $aHSL[2]), 50)) Or _
               ($aHSL[0] > 300 And InRange(Round(100 * $aHSL[1]), 100) And InRange(Round(100 * $aHSL[2]), 50)) Then
                DllStructSetData($tPixel, 1, 0xFFFFFFFF, $iRowOffset + $iX) ;if yes then set white pixel
            Else
                DllStructSetData($tPixel, 1, 0xFF000000, $iRowOffset + $iX) ;else black pixel
            EndIf
        Next
    Next
    _GDIPlus_BitmapUnlockBits($hBitmap, $tBitmapData) ;unlocks a portion of a bitmap that was locked by _GDIPlus_BitmapLockBits


    ;display manipulated image
    Local $hGUI = GUICreate("_GDIPlus_BitmapLockBits Demo", $iW, $iH)
    GUISetState(@SW_SHOW)

    Local $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI) ;create a Graphics object from a window handle
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $iW, $iH) ;copy manipulated image to graphics handle

    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE

    ;cleanup resources
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_GraphicsDispose($hContext)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()
    GUIDelete($hGUI)
EndFunc   ;==>Example

Func InRange($iNumber, $iRange, $iPlus = 25, $iMinus = 25)
    If $iNumber > ($iRange - $iMinus) And $iNumber < ($iRange + $iPlus) Then Return 1
    Return 0
EndFunc

Func RGB2HSL($iColor)
    Local $r = BitAND(BitShift($iColor, 16), 255) / 255, $g = BitAND(BitShift($iColor, 8), 255) / 255, $b = BitAND($iColor, 255) / 255
    Local $Cmax = Max(Max($r, $g), $b), $Cmin = Min(Min($r, $g), $b), $deltaChroma = $Cmax - $Cmin
    Local $L = ($Cmin + $Cmax) / 2, $H, $S
    If $deltaChroma = 0 Then
        $H = 0
        $S = 0
    Else
        $S = $deltaChroma / (1 - Abs(2 * $L - 1))
        If $r = $Cmax Then ;r is max
            $H = Mod(($g - $b) / $deltaChroma, 6)
        ElseIf $g = $Cmax Then ;g is max
            $H = ($b - $r) / $deltaChroma + 2
        Else ;else b is max
            $H = ($r - $g) / $deltaChroma + 4
        EndIf
        $H *= 60
        If $H < 0 Then $H += 360
    EndIf
    Local $aHSL[3] = [$H, $S, $L]
    Return $aHSL
EndFunc

Func Min($a, $b)
    Return ($a < $b) ? $a : $b
EndFunc

Func Max($a, $b)
    Return ($a > $b) ? $a : $b
EndFunc

Replace $sFile with proper path to the image before you run the script!

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Link to post
Share on other sites
8 hours ago, qwert said:

@UEZ: thanks for that annotated variation. I now have plenty to look at for a few days. I'm still determined to have a tunable script than can render a monochome result. This looks promising.

Have a look to 

There is a function called _GDIPlus_BlackAndWhite() which can convert an image to b/w aka monochrom.

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By UEZ
      I don't think I ever posted The Matrix here, so here's the upload:

       
      The Matrix v1.31.au3
      ;coded by UEZ build 2018-10-20 #pragma compile(Icon, "c:\Program Files (x86)\AutoIt3\Icons\au3.ico") #AutoIt3Wrapper_UseX64=n #AutoIt3Wrapper_Run_Au3Stripper=y #Au3Stripper_Parameters=/so /pe ;/rm #AutoIt3Wrapper_Run_After=del /f /q "%scriptdir%\%scriptfile%_stripped.au3" #include <GDIPlus.au3> #include <GuiConstantsEx.au3> #include <WindowsConstants.au3> #include "The Matrix Sound.au3" _GDIPlus_Startup() Global $hGUI, $iFPS = 0, $iShowFPS = 0, $bExit Global Const $iW = @DesktopWidth / 2, $iH = @DesktopHeight / @DesktopWidth * $iW, $sTitle = "GDI / GDI+ The MATRIX v1.31" AutoItSetOption("GUIOnEventMode", 1) ProcessSetPriority (@AutoItPID, $PROCESS_HIGH) TheMatrix_v1() AutoItSetOption("GUIOnEventMode", 0) _GDIPlus_Shutdown() Func TheMatrix_v1() Local $bFullscreen = True, $iMsg = MsgBox(BitOR($MB_ICONQUESTION, $MB_TOPMOST, $MB_YESNO), "Question", "Enable fullscreen?", 5) If $iMsg = 7 Then $bFullscreen = False Local $binMusic = _Music() Local Const $iLen = BinaryLen($binMusic) Local $tMem = DllStructCreate("byte[" & $iLen & "]") DllStructSetData($tMem, 1, $binMusic) FSOUND_Init() Local Const $hMod = LoadSongEx($tMem, 0, $iLen) FMUSIC_MasterVolume($hMod, 50) FMUSIC_PlaySong($hMod) FMUSIC_SetLooping($hMod, 1) $binMusic = 0 $bExit = False If $bFullscreen Then Local Const $hFullScreen = WinGetHandle("[TITLE:Program Manager;CLASS:Progman]") Local Const $aFullScreen = WinGetPos($hFullScreen), $iPosMainScreen = Abs($aFullScreen[0]) $hGUI = GUICreate($sTitle, $aFullScreen[2], $aFullScreen[3], $aFullScreen[0], $aFullScreen[1], $WS_POPUP, $WS_EX_TOPMOST) Else $hGUI = GUICreate($sTitle, $iW, $iH, -1, -1) EndIf GUISetBkColor(0) GUISetState(@SW_SHOW, $hGUI) GUISetCursor(16, 1) ;create canvas elements Local Const $hDC = _WinAPI_GetDC($hGUI) Local Const $hHBitmap = _WinAPI_BitmapCreateDIB($iW, $iH) Local Const $hDC_backbuffer = _WinAPI_CreateCompatibleDC($hDC) Local Const $hDC_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 $hHBitmap2 = _WinAPI_BitmapCreateDIB($iW, $iH) Local Const $hDC_backbuffer2 = _WinAPI_CreateCompatibleDC($hDC) Local Const $hDC_obj2 = _WinAPI_SelectObject($hDC_backbuffer2, $hHBitmap2) Local Const $hCanvas2 = _GDIPlus_GraphicsCreateFromHDC($hDC_backbuffer2) _GDIPlus_GraphicsSetSmoothingMode($hCanvas2, $GDIP_SMOOTHINGMODE_HIGHQUALITY) _GDIPlus_GraphicsSetPixelOffsetMode($hCanvas2, $GDIP_PIXELOFFSETMODE_HIGHQUALITY) Local Const $hImage_Bg = _GDIPlus_BitmapCreateFromMemory(_BG_Image()) Local Const $hHBitmap3 = _WinAPI_BitmapCreateDIB($iW, $iH) Local Const $hDC_backbuffer3 = _WinAPI_CreateCompatibleDC($hDC) Local Const $hDC_obj3 = _WinAPI_SelectObject($hDC_backbuffer3, $hHBitmap3) Local Const $hCanvas3 = _GDIPlus_GraphicsCreateFromHDC($hDC_backbuffer3) Local $tColorMatrix = _GDIPlus_ColorMatrixCreate() DllStructSetData($tColorMatrix, "m", 2, 2) DllStructSetData($tColorMatrix, "m", -1, 12) DllStructSetData($tColorMatrix, "m", 0.0175, 19) Local $hIA = _GDIPlus_ImageAttributesCreate() _GDIPlus_ImageAttributesSetColorMatrix($hIA, 0, True, $tColorMatrix) Local $iPosY = $iH - _GDIPlus_ImageGetHeight($hImage_Bg) $iPosY = $iPosY < 0 ? 0 : $iPosY _GDIPlus_GraphicsDrawImageRectRect($hCanvas3, $hImage_Bg, 0, 0, $iW, $iH, 0, $iPosY, $iW, $iH, $hIA) Local Const $hBrush_Clr = _GDIPlus_BrushCreateSolid(0x0B000000), _ $hBrush_FPS = _GDIPlus_BrushCreateSolid(0xF0C0FFC0), _ $hFormat_FPS = _GDIPlus_StringFormatCreate(), _ $hFamily_FPS = _GDIPlus_FontFamilyCreate("Arial"), _ $hFont_FPS = _GDIPlus_FontCreate($hFamily_FPS, 8), _ $tLayout_FPS = _GDIPlus_RectFCreate(0, 0, 60, 16) _GDIPlus_GraphicsClear($hCanvas) $iFPS = 0 Local Const $fFontSize = 8, $iW_Char = Int($fFontSize * 1.5), $iH_Char = Int($fFontSize * 1.5), $iMaxSpeed = 8, $iMinSpeed = 2, _ $iAmountChars = ($bFullscreen ? 75 : 100) Local $aTable[$iAmountChars][4], $aChars[56], $i, $sChar, $iChar = 0 For $i = 0 To UBound($aChars) - 1 $aChars[$i] = ChrW($i + 65382) Next $sChar = $aChars[0] Local Const $hFamily = _GDIPlus_FontFamilyCreate("Times New Roman") Local Const $hFont = _GDIPlus_FontCreate($hFamily, $fFontSize, 1) Local Const $hFont_Glow = _GDIPlus_FontCreate($hFamily, $iW_Char, 1) Local Const $tLayout2 = _GDIPlus_RectFCreate(0, 0, $iW_Char, $iH_Char) Local $tLayout3 = _GDIPlus_RectFCreate(0, 0, $iW_Char, $iH_Char) Local Const $hStringFormat = _GDIPlus_StringFormatCreate() Local Const $hBrush_Char = _GDIPlus_BrushCreateSolid(0xE8E0FFE0) , _ $hBrush_CharGlow = _GDIPlus_LineBrushCreateFromRectWithAngle($tLayout3, 0x4000FF00, 0xE0A0FFA0, 0, False, 1), _ $hBrush_CharGlow2 = _GDIPlus_BrushCreateSolid(0xF000FF00), _ $hBrush_Bg = _GDIPlus_HatchBrushCreate(9, 0xFF002800, 0xF0000000) _GDIPlus_LineBrushSetSigmaBlend($hBrush_CharGlow, 0.5, 1) _GDIPlus_LineBrushSetGammaCorrection($hBrush_CharGlow) _GDIPlus_StringFormatSetAlign($hStringFormat, 1) _GDIPlus_StringFormatSetLineAlign($hStringFormat, 1) For $i = 0 To UBound($aTable) - 1 $aTable[$i][0] = Random(0, $iW - $iW_Char) ;x $aTable[$i][1] = -1 * Random(3, 200) ;Y $aTable[$i][2] = Random($iMinSpeed, $iMaxSpeed) ;vy $aTable[$i][3] = $aTable[$i][1] - $iH_Char - 1 ;delta y counter Next Local $hGfx, $aChars_pre[UBound($aChars)][3] Local Const $hEffect = _GDIPlus_EffectCreateBlur(2) For $i = 0 To UBound($aChars_pre) - 1 $aChars_pre[$i][0] = _GDIPlus_BitmapCreateFromScan0($iW_Char, $iH_Char) $hGfx = _GDIPlus_ImageGetGraphicsContext($aChars_pre[$i][0]) _GDIPlus_GraphicsSetSmoothingMode($hGfx, 4) _GDIPlus_GraphicsSetPixelOffsetMode($hGfx, 4) _GDIPlus_GraphicsSetTextRenderingHint($hGfx, 3) _GDIPlus_GraphicsDrawStringEx($hGfx, $aChars[$i], $hFont_Glow, $tLayout2, $hStringFormat, $hBrush_CharGlow) _GDIPlus_GraphicsDispose($hGfx) $aChars_pre[$i][1] = _GDIPlus_BitmapCreateFromScan0($iW_Char, $iH_Char) $hGfx = _GDIPlus_ImageGetGraphicsContext($aChars_pre[$i][1]) _GDIPlus_GraphicsSetSmoothingMode($hGfx, 4) _GDIPlus_GraphicsSetPixelOffsetMode($hGfx, 4) _GDIPlus_GraphicsSetTextRenderingHint($hGfx, 3) _GDIPlus_GraphicsDrawStringEx($hGfx, $aChars[$i], $hFont, $tLayout2, $hStringFormat, $hBrush_Char) _GDIPlus_GraphicsDispose($hGfx) $aChars_pre[$i][2] = _GDIPlus_BitmapCreateFromScan0($iW_Char, $iH_Char) $hGfx = _GDIPlus_ImageGetGraphicsContext($aChars_pre[$i][2]) _GDIPlus_GraphicsSetSmoothingMode($hGfx, 4) _GDIPlus_GraphicsSetPixelOffsetMode($hGfx, 4) _GDIPlus_GraphicsSetTextRenderingHint($hGfx, 3) _GDIPlus_GraphicsDrawStringEx($hGfx, $aChars[$i], $hFont_Glow, $tLayout2, $hStringFormat, $hBrush_CharGlow2) _GDIPlus_BitmapApplyEffect($aChars_pre[$i][2], $hEffect) _GDIPlus_GraphicsDispose($hGfx) Next _GDIPlus_EffectDispose($hEffect) GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit_About") AdlibRegister("CalcFPS", 1000) Local $c = 500, $bDisplay = -1 Do DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hCanvas2, "handle", $hBrush_Bg, "float", 0, "float", 0, "float", $iW, "float", $iH) DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hCanvas, "handle", $hBrush_Clr, "float", 0, "float", 0, "float", $iW, "float", $iH) For $i = 0 To UBound($aTable) - 1 If $aTable[$i][1] - $aTable[$i][3] > $iH_Char Then DllCall($__g_hGDIPDll, "int", "GdipDrawImageRect", "handle", $hCanvas, "handle", $aChars_pre[$iChar][0], "float", $aTable[$i][0], "float", $aTable[$i][1], "float", $iW_Char, "float", $iH_Char) $aTable[$i][3] = $aTable[$i][1] EndIf $iChar = Random(0, UBound($aChars) - 1, 1) DllCall($__g_hGDIPDll, "int", "GdipDrawImageRect", "handle", $hCanvas2, "handle", $aChars_pre[$iChar][2], "float", $aTable[$i][0], "float", $aTable[$i][1], "float", $iW_Char, "float", $iH_Char) DllCall($__g_hGDIPDll, "int", "GdipDrawImageRect", "handle", $hCanvas2, "handle", $aChars_pre[$iChar][1], "float", $aTable[$i][0], "float", $aTable[$i][1], "float", $iW_Char, "float", $iH_Char) $aTable[$i][1] += $aTable[$i][2] If $aTable[$i][1] > $iH Then $aTable[$i][0] = Random(0, $iW - $iW_Char, 1) ;x $aTable[$i][1] = -1 ;Y $aTable[$i][2] = Random($iMinSpeed, $iMaxSpeed) ;vy $aTable[$i][3] = $aTable[$i][1] - $iH_Char - 1 ;delta y EndIf Next _GDIPlus_GraphicsDrawStringEx($hCanvas2, "FPS: " & $iShowFPS, $hFont_FPS, $tLayout_FPS, $hFormat_FPS, $hBrush_FPS) If Not Mod($c, 1000) Then $bDisplay *= -1 EndIf $c += 1 If $bDisplay = 1 Then _WinAPI_BitBlt($hDC_backbuffer, 0, 0, $iW, $iH, $hDC_backbuffer3, 0, 0, $SRCPAINT) _WinAPI_BitBlt($hDC_backbuffer2, 0, 0, $iW, $iH, $hDC_backbuffer, 0, 0, $SRCPAINT) Switch $bFullscreen Case True _WinAPI_StretchBlt($hDC, $iPosMainScreen, 0, @DesktopWidth, @DesktopHeight, $hDC_backbuffer2, 0, 0, $iW, $iH, $SRCCOPY) Case Else _WinAPI_BitBlt($hDC, 0, 0, $iW, $iH, $hDC_backbuffer2, 0, 0, $SRCCOPY) EndSwitch $iFPS += 1 If $bExit Then ExitLoop DllCall($_MDKernel32Dll, "none", "Sleep", "uint", 5) Until False AdlibUnRegister("CalcFPS") ;release resources For $i = 0 To UBound($aChars_pre) - 1 _GDIPlus_ImageDispose($aChars_pre[$i][0]) _GDIPlus_ImageDispose($aChars_pre[$i][1]) _GDIPlus_ImageDispose($aChars_pre[$i][2]) Next _GDIPlus_ImageAttributesDispose($hIA) _GDIPlus_FontFamilyDispose($hFamily) _GDIPlus_FontDispose($hFont) _GDIPlus_FontDispose($hFont_Glow) _GDIPlus_StringFormatDispose($hStringFormat) _GDIPlus_BrushCreateSolid($hBrush_Char) _GDIPlus_BrushCreateSolid($hBrush_CharGlow) _GDIPlus_BrushCreateSolid($hBrush_CharGlow2) _GDIPlus_BrushCreateSolid($hBrush_Bg) _GDIPlus_FontDispose($hFont_FPS) _GDIPlus_FontFamilyDispose($hFamily_FPS) _GDIPlus_StringFormatDispose($hFormat_FPS) _GDIPlus_BrushDispose($hBrush_Clr) _GDIPlus_BrushDispose($hBrush_FPS) _GDIPlus_ImageDispose($hImage_Bg) _GDIPlus_GraphicsDispose($hCanvas3) _WinAPI_SelectObject($hDC_backbuffer3, $hDC_obj3) _WinAPI_DeleteDC($hDC_backbuffer3) _GDIPlus_GraphicsDispose($hCanvas2) _WinAPI_SelectObject($hDC_backbuffer2, $hDC_obj2) _WinAPI_DeleteDC($hDC_backbuffer2) _WinAPI_DeleteObject($hHBitmap2) _GDIPlus_GraphicsDispose($hCanvas) _WinAPI_SelectObject($hDC_backbuffer, $hDC_obj) _WinAPI_DeleteDC($hDC_backbuffer) _WinAPI_DeleteObject($hHBitmap) _WinAPI_ReleaseDC($hGUI, $hDC) GUIDelete($hGUI) FMUSIC_StopSong($hMod) FSOUND_Close() MemoryDllClose($F_DLL) MemoryDllExit() DllClose($_MDKernel32Dll) EndFunc ;==>TheMatrix_v1 Func _Exit_About() $bExit = True EndFunc ;==>_Exit_About Func CalcFPS() ;display FPS $iShowFPS = $iFPS $iFPS = 0 EndFunc ;==>CalcFPS Func _WinAPI_BitmapCreateDIB($iWidth, $iHeight) Local $tBMI = DllStructCreate($tagBITMAPINFO) $tBMI.biSize = DllStructGetSize($tBMI) $tBMI.biWidth = $iWidth $tBMI.biHeight = -$iHeight $tBMI.biPlanes = 1 $tBMI.biBitCount = 32 $tBMI.biCompression = $BI_RGB Local $aResult = DllCall("gdi32.dll", "ptr", "CreateDIBSection", "hwnd", 0, "struct*", $tBMI, "uint", 0, "ptr*", 0, "ptr", 0, "uint", 0) Return $aResult[0] EndFunc ;Code below was generated by: 'File to Base64 String' Code Generator v1.20 Build 2018-02-02 Func _BG_Image($bSaveBinary = False, $sSavePath = @ScriptDir) Local $BG_Image $BG_Image &= 'iVBORw0KGgoAAAANSUhEUgAAAyAAAAH0CAMAAADynrlKAAAARVBMVEVHcEzdzLzCmnaee2J2XkxnQTG0nY5SQjZFJxgwIx43MSoUDw4lGxocGBcvKicgHRwqIiKCWkbWknfiuJP1z6uQUkGycFteeNywAAAAAXRSTlMAQObYZgAAen9JREFUeNrswQkNACAQAKD7+0c2hxsQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwlq2d2uvsy8x47d5aoWArGALisg/4nIYH0/jfboD2swbp8hOEOj8ZZt8ev4/jhVhVWJV6tbtzP6/fj9+/nvXHX5DTk+NkeV9WqR3X5bu336krtpqy06/UpyJrH8TO9qu0alMBn27ccvaPfz3ZtZVZb9dnObcnx8zyudq16tBv3qgFhLFK3PMi677pa1bWchhw/sR+1LvfXDdytPW91WOrqfa+ewn1XFXc/fh3HT/Oo63pdrYiO2JYdWNb0IgcIQrbrOk9nHT/Oo9XCKsBwtw0l8iZpyo4MZHKX5HE6cvzxHo//j1XXpyLo6MYeCXq37DnjaRm2lYCsdm5Ijj+3F4/3+snjc/vB61GsKndZ3VYAf8wlMmzssZOEZDsVOf48j9f71fFlXb5f12PX5OL1amCNLkU2bBJGlxElVuaUZasrWAiuVDslOf4sj+tqrRWrvep6vLgbctXraoWbgAXZ1iDQbRmJFFvygj0yyKq2VJF1Xacjxx/j4gLcJDrramu+VkHaVSShDFtxSHRYnvCc09ObuhVwKVbV9VH1x7xN6ziuqva8q+0bkruDRF21chWLMAYsebRyh4140UqX5QQjCmQHk2RVtVat6vNOlOP4ci/W63W1AtKuBssi2XY9qgjUUE/MxtiwFcebujURSbYlDZJjcKm21LI6ct6Gcny3V2uvNesmWcQNeCVVYK0xipBEXkS3syJvsjQz7WlJwR4CEHKl6mq1ll/bacjxtR6vate1cjUWibdu' $BG_Image &= 'J0AVd4BoVKM7vIf8JiWalu0gsmcWO3HPf49KTjeOr/ZotV1VTBAFIADNYNSnIQGz9085YrvLtjTX8Eqi7kGOETjGYEbI4iTrNOT4Yo+LVVxmonAAAUckhaiPDIKt0YatwIvsyG+BIA0WbUUgB5KpsXag2q/j+FaPVyMAMuhSMEisCAnAqpUiOGZVo7sR+UNzTi+KpT7JYRkgi0QGRiAFvbOd25DjW70u2oClCIhQJAcwMEjWShVJgK0qsDX36mllygtsRUls8K2K0ALIAszrNOT4To+r0AV7QEGATyMGAL7P3MClqgI4lu3pmeyD4gl7n0UCAmtAH8gnvH4dxxd6tNnRZahLMpDBYtX4NOWdBSzVQgBakbKSaXtuawuyWGD0+bWnpAlZPg/Uj+90BR1etCAzIFlVDPDeWdgD/Pw4RqRAiBLNXYS9JVYiOBiG8zGjQAbi+fp1HF/nlR6jw9ACIAOs2vm3KVUoPEFwn0kCH4I0pUjyShDDY8QKDG/IEAR0mOcm5Pg6L+Lulu2ZSIMRl1qIvbVPQQhg7GORN+5xkwVgQHvMKXkkTjQgw0BkOcnnv9SR05Dj2zwq6B2GgwQKhzBQZC2fgizYc3diI3nXXfW87xUAEgQFiQYgKUOLZcnJICF0YZyGHF/mErZEnpA0BgncKLDeWn2wyDVruWv5nPYZNyAIIwowBJDAvwXZBkkAYr1+HccXeSUAGRgREGCAa4Io7nJ83PWsJ9b29tx5Pp/t+V7uBdANCVkJSSAZGQvm1GA1Ere+6ksdjuPB2yBgI0EwMDgGQECF2tq7EKW93cU11+lec/vr+qutmlTdvEEgWFgY8YCkAGMQGCwWCL5OQY4v0ng7seXpZIwgCwKA2FVof7N3RkuOqzoUnRhjaSsywfF0/v9TL5Iojnse7rNTxQI7yen0PPWqjQxwIikc7nciv6/5OFLDJDmy2QMWKEQkcmP3NY1aixhmF2OdY6zJNwUIGrpXm8pogniM1NLu' $BG_Image &= 'BhnreqzH4RZkg1pj8yOvq/ux+Lly69o0inIEUmqtZtzewKvuzTzEJkPmKcjke0g7sOuO1l7+rKmgvkIPppxNj9Vj4r01D47jyPnomjQ/zI5tO5flXNrb9tnyhVXEpWuYIdoaKmoRt22uN5l8EQSI+VFfrxgJlYqqCoEXIHl1C9K2bO92pYaFSZPj8PjYtuU8/57nYzF9miOWLyxsQmi1jVWOvlChithf+Gcy+aYR1g70FSEVgDYAZspHIzUWS4iz8fagOOxqgpg2i9nxt3Gei4fIkQ1mAJYd7Ypjrp+7lqJFkNJckDX5GhJsCl1r9X0dpZSq0NYjPCwsNkuP5RxsXnE4y/I4H25Hux4uTyhiJTyg9WX/MLCHLBVQVEmzSp98DVIV2BVqgtRair60suSc1/STPumd3pEfQxHLCiMtaduaGUb/79vijhyWIiRAwUtRUSCNUl87VEVSmkXI5Et4iOoTWveq+jJDdFdVK819dLU1DYyuh4swgsRy5XH+tRYhcppHW3/sa4qMqXSoqdefHVOaCTL5ElJRxCDoVRvw4oNzbnZ8UjI9nDOaMzS5fjZD+k+W5JgirFAWgcIssQsoZZ5vMvkaNuz1VVt/Garw8iP34nzIEXYsw44hSajhrd+8WF+aXp/1yMQSC+ZLQ2tVVYhMQybfwlYVWlCr1l1RALXyw+zw/Nh6gJzDEHPDe687ehuWdEWWFHMmjMziQKQAUC1TkMnXsAFFa0VsBQEgTDa/YWymyD8jrIsh4xZSDF16EZ/eyWbeLUIYDQGJInbzziJ98iWkilJq0wMeICzZ/QjCjz7AuhoyLPGBVRByhDQRNz7xzjkzVCGAZYg+UbWufyaTr2CFoPTD34DKlG3uw3ryacDNDdlCjn8NMYYddo+PvVYPQzIxZybXo7auu6LOmcLJ1+wlLIinvFAwZXI3eg1yGWGZJINRknfOcb8Ms6ISsSkRZiJSFTFJZFctsv2ZTL6ATaDi5yzoC/ClhHF6' $BG_Image &= 'tQtiLfBE2H4bYi//0nNlKBKVes5EJBr7qPBUzOWKk68RpKjuPsASQc5ef+QuSB9ieQHi9IQYNgwGbs5lkGWK5ExshgigVUR3xSxCJt8iCLRqbR0CohwBchwp+Pcp1jAl2m+GGldFUhiSicRAQ4F5SO/kWwRRrepThMxMh4+vrDc+XoVsIYh3T5BGd8F4eB+cvYVGXqh/0s9KjAwRkqKKBs0iZPItgtSie2uAkE8RHml1O9LmdgxDQpDrzODgXz+iQgm8UDdDWFSkVNVSeM6ETL6CVPtpP1GiRwmydkeWNPTwFoQCER4jQx52N3rC9Ba5Y4tOiLmSoohgVzDoz2Ryex6EhlXpqi5IjqdYpslnPMjauh6DXmm4G+M+FIke9KVZh2+hEqhWQAGZh1hPvoHHKoDp4YJkE+RIq7Vhh/VRhdjO2v8iYngRvd8uE+qP9v3+sDeTsAj0VaAKFpmCTL4hQawqeKq+APEEOVZ3o88Ujjrk7IY4j/6oKsSIa9jRm1fohrEca2YyQWpF1QbXWaVP7s8mJNhfqgoQZRfEzyY5jnTdD/K7AvknQkKOQdhx/W6fUGcSUYWaItjnTMjk/mzmh9aKhiBzbqTDm/FZwpGxHmvQDRhyPLw1xnLFCJkgZgtZiOCo6lyONfkCNhHYOnc0suTGcaTV9IgEGUXIaa3xsD4IJ/6l6xGi9An1IyKEIKVAtWqZRcjk/iRBQxUKBks2whBjsb6NFYseIXZtI0J6dlgfDDEuCbKM2XTx/CiKOmdCJrdnFcCrZq/RM0eEeDtijLW4JkbY8Zv/GyDWLD7GGEsY0jA7oDqLkMndeRADO1wQBluNfk2Qj7uR+hirMeJjpMNlyvAx/GhcI8QsSSnlNWcRCKAoCp1FyOT+ggjgkyAKoeyCHMc6KpC09BZyjAHW4LoV5Mqv8VXfGJLXlQjiggCqc0/I5O48hAFUrYCAJTvHeMTrd4uQUYY4W//jX66G2DtvvwdZy3+r3n1XiJCI' $BG_Image &= 'QqtdU5DJFzzE0h0VgCDmCcdjrHBkuexM9zYIAy6GXOWICPE+BFnXWPJOqkCB7rNKn9xeEDRKrUVHDTISxFkadrsqsoQg9jIKjj67PqqQ+DS+HGMsyhxFugpUn1OQybcIUgESohx6HGsUIUsaVfqw41cVsvTyY6gy9LjWINY8QVZhwAUpovMx1uT2JDQE1W56TZDgM6p0J8qPK12DhzlxUWQIMgLEVVtzhgAQVX+lP5PJrVlrJAigQuIBEhHicnQ3hiJn6yHJZaAVdvx9eA9ObyM+rPcEIXCBCAydz3knd2eFUytQvQY5cjfk0wMkeiekiHvgckT9EdMhQw+7jS+GII3uhmqBQqYgky/YLoWqgEJ6CZItQJzQY+THhXFIb+jhZgxCl/41b0MQIlGIQAGozASZ3JuHiKD1WgsEDLYS5McM8Qrd+J0fpsXjlyOP8OS6Zeq8bLx1oggxQ0hEBQ01I9cpyOT2gihQWi8goVGEuCGfbdQg2wiQ9/Uv/xFePNyJwb9J02uQdc2ZWKSvdleVNAWZ3H+IZQlSLEJEYoiVTZCoP0yRrTXjeiKWdftokfE2SwZjkeJg1CDHaoLAqQDKFGRyd0EsNiAo5gd+JYiHR/R/dtw++qTgFltuvV24FCD2frFmfiTzgwDTUQHoFGRydxKJ1QUCmB7c/RizhO/f0+jbeb4ffQXJw8NkYG9dl3MYcmFpWIBkIkYBKmqFzg0hk7uzCmgVkSosTNkYE4WuxsDrj5Ye7789Qewl0iMSJK6oR65u/B3TIDlThrgeWtGYgkxuDqEKiRSBUH/K24+vNjviuibIe+y6be3d+vVELOe8nh63XJ9hJQsQgguCUoAyBZncHDIzhAplg9ZsHGMO/cJ7Od+mx9sy5Pwbogw34vX3sQ3BYq3RS5CeIDBDpiCTu7OiEhXpR/50VhckxbjK1BgZ8j7DkbOxvU/jfZUkHDHOgcWIC3JYgKiguCCi0CnI5Oas4pTStKCVKGfym72s' $BG_Image &= 'jZTiIe/QJAw5r7REGRkyuCRIoycIC4FQoVpFAKx/JpNbsyIEEcpra0TEygplA2zk47A08ULCIySa50mX5e/78a8hp19jkNUPbQAJUKMCUdQpyOTmrEIkIiiZaCUwFKoABGpwd4SyR8l72SxDFvfCnOk8LhMi9mbpk4jW/e3SMEEYgKBRRAClP5PJrUlCRAIIDsoE1dBDFXolguSz2VArLsuFiJDl/Q47mg3bltJ6ZGf14LlumMqUgYpSYSgwFytOvkOQIuQr0d0LQBt7Q59P/wi1zjkf29b1MEKTbWsRsjU1qMEkxAwWZo7Hxqk74hHCQG29FLNEpyCTu7OJEJWYR1fn1dW4ok91mPNnczGsv9tlLR3HT/bCRRneGawKix3DHIkEyQwzo8C6AjIFmdybBwmRlAIBdH+99qfuz31/2tXuhr04uztybOnT48Nv6cjawEWpHjwVAuauiBmy5pgmdAqmIJP7sxKRNFS1QvfqPrQb2hWOXG4mSE4phRzBymo8rZlE9hIf4c0U4Xy0ELEihMMchTEFmdyeZHqsG+2q1v3aew5ElthL/9i68toEGQmyrbxfoyMIQyxyENtMKK9p22KMVVEjQVSx/ZlMbr8jpKTkVQZ0V8+KIYb1SBKNHNEnOLPvOvykz+c4sroN2pVoxFu1l11fqoKcrV5PiwnCUDdEUXgKMvkCQYqAVjRqDUHMjvCi9UYoomGNKvvjW+vHT86skRgeMerf2v21tfYOqgyibKwpK2vpQyydgky+AYIUEZRaVd0EJ/LDr16LuDwagnzeS0ytH5kjOuwWctmlDahqMwWAGUKZslUj5D9BQ0V5rnef3B4CCoAKxLMo3QdPNyaaWoYUggnSDPFDrT82s8HP+KmFx8iPoL+BUsZBrJzXRD0/UAQ8E2RydzaCoAhUQ5GnDidMj/4p6m8I6VM5Hz/90PfPYQEC2b0OaXezw9AO/AIok7LaMGsjVdSQEjIFmdybbRUuda+qihp+aI+C' $BG_Image &= '8QzL3xha61NNEJsJsYWI6WB+7iIlShDrroc1raqvHbsqKCODfY2wpFVUoxCB0BRkcms2sEJQ4bMWeFr38lq7FVGNGFFquCAWH36E4mIJslfxn1sPmfaXaucFqCIjE5hyygSiWgFoKUXmPMjk1jxWZjCkVDS0YXp48wCJBOmq2EdVF2Tp/3/bJgirC7TH2EwjPhqqWtVFQYMoW1sJIqXWAkVRKXOINbk3iZgZ8tIqUI2uLsgIDxfA5HC6IG2EZbggXqaMDNkD3VVftbomUBCyr1ykLAAiQSAyBZncGysilKEK9jpdESnSi3Mj2OvuwijY5kH8UMW/5zuxagRIa0MR9STRXV8IBNlJmRRRf6gy0VzNO7m7IEdmFtVKBG1U06Sqasxn9AhpDVGUKCTbRKFvGHwsKSubEl6c2D2+HpmjTkyEICMEYdPDUaI5DTK5NykfP9kEKX0OD9X10L0RRjyN+GgaEOfDdt6aIe/zk1kRFj330CO+ZpniXQEBQDlnHJt93Yi18GkGyOTepJ8mCLFCaLUXdV5RaZsSjn0ATAMFOI8a5DxT7oV9LHQcaxz919XwvKhhSIotU4h/5ji2WYJM7k3KPz9Hhqoc2QwxMV59bNUnC2OaHC6PUFbOP5+lJ8jf98GqcH20qn09nmiZYyYNjCog+HbElJi1oEE/Ztk2I2Ryc0GyLziEZFozoZohDbXuxACrvuAQKB9H8uOx/NSSlFkIO7wed0HUf8HzJAQRGJl/NtsRojCI0tvOPJmCTG7NJ+e8EqDZD87NUGN/vV67aizK3aH98RYocz7iECBPEDtlsfmVGXuF4XHTJ0MasbK9wa0f7Ze2lUjhU4ZNj/f7ff6ZTG6M/XmTAMjNEMpEPq3xetlf+dic3m7QWiHCLsgn2fFxDy9CLEJyFtQdzjN+B7sG1X4PUG5KPJYlZRNE9ThNr5+f5c9kcmOOzBkEsOmRyWVR9TGWxUh9Gfte60uZ7SuHC/JufrxbDWItc2aB' $BG_Image &= 'J4xegI/KKgzus+/LlrIoc+bj8ff8/ExBJl8gCAtemQ5ThC1E3JDn6/kK9sarVlCm9UhHPn7SZ3v7WYrNkvP8yWxe8a95eAMKRxUwPxbPG3NpPT5/l/TTmBMhkzvzOJgZpJp7gjBxJmZ2Rzr7jiqw2uOT0vFjgvQEsfMVt7dJlhmKWlt/avcEDX/HzMfx7uePHqw2TDvPT/r85CnI5NY8skFABAhlYbEUERI0VHVXqBYhsoHVth0/NsR6b++3C/Kwp1nLkaOSUUWF1TC1EYJ4y0czy/JjObeDGb4j8X/sneGO4ygQhOMuINnT6qTGod//UY/qEvbtPEGy4mvAyU40v+67ApshsP7xU6zNFuRVHeXXjI1SJy8WqbyIynfVgW49fMzysH7mFEuHt3cZcq9D0gzBxx+OCLP8cOPvpS3drPc9xdp8viADhf+TLzWPVmAnnGnp9bPyijAzIAUJ0I/OANHh7jb4Md4Dkxd6ij6zotZa3Ad646ds9jIFicbnKO/eYwuy+WjwqrXw//1enl4Tr+6ZEiPGRUSex4twAlhbCdLSEYtKhtwideJj8FfBQDcybcBFj9mbXtGQvRtr88mUZ/V80EdN6EqRHAAC1htTY7auM911CO/w0fr5fvf8vs6MAqbDGDIkR9c44NFMdhibGbNJtrxTkPdjs/nkGVb1yo2DpdTC9BhON4JemG483QPgSQaCEkS8J92CiTE8BoLVZvV22pm89SusvChI79rJ1W0nyOZzaa9KMkHKvPoEjknoWzvpiIogDake6FOP/l6GdKXJefTW29H1HTp8UnK+tWFLKEFeL2/neQmyE2TzuSAF+T2roNTiNCQwqxmM/KFID7gwO/ubJtwRImjGLI7ilB72Xr/JXy/0HtE7vep7t+Lms49sqKz6q0IJElqA2Gw/6FeA6C7Wm+QKncgJ2XEbcq6SJ2Z5Om87bYww5s5OkM0Hc3DFLD+exb3OctCPYLO45ZhCrHtYdTi6cWmegoj3' $BG_Image &= 'xaGSPgoQwgCZPbc29haj0pD+3gmy+WDai1TyRPHqBDELaQism1GGbgSQRLkGWQmiCFl2SIwLrUEWNqEgrU8/BqjdFmTzweBXlR+v+nTUsvbqsiiHGklHwlOQGugmJ/qbepD3zaHxTg8FCNvRUKuffTBBgpZtQTafC34zQISj1DtD1p3elSCnkeHDSbTeOz2gHTZrsuTQpVMPNS3S5Yi1UiveFjFG5EJ9C7L5bEGWIQWeCTI8MkMYITLkShBQHlCg3mXEtcDQWykiuupegiTNq09teg/SP/ku1maD1x0hjuIURAARuQRRguiKgWid8jBBJIHsOLuW7EsRPUScTShBrJmZu/Hf+9m/IEE2++RqcieI1+FXgoQFtaAcMgSOZg0edObUfdwLrcjvRyBnpzVUwViimY6cIzLkvQXZfCxH+S1BRq0uQdy10EBgYmFyhA2IFs3gfyRIP+8E4bNzDnpzpYcaAQdGSxrU46OnWJtNK1WGlFohQUjMQqBj/TfdmSGBhD8ySylyiSH6NcHSq670UHwI6NcpbGRIP3eCbD4ZXHvTPRchvgDuZ4XdEmjqBf6Ud7E4iVKCXBlCjkyIOztsNgI2vskPSZDPTpDNpl2GlHUbS5MsZgjCUhGmABPERwaIw0MP15tNqAZdoRaCesyx/6lHQ4NNMkB0j5hLkC3I5oM5SqmVgnh1rN0mIrRQn/RsAffAhILAVipMPSgEPWGlHgtjJR2GBgmlnEmDPj1BNlsQhE9FqntxUJCFNKABCgHDcAdcszFE6/QDYJZwmrVO69X93T7HLj0ulZo1+rEEoR/z+thsPhhUhA+fFC+FglS+JStBTrZuwwdGffFvzX0AMYtG1UFFjD502jEbK6EOJpAB0pgp6cehXVx9C7L5aNpTq47wAnjxSc3S8xDci/TBf+N0jIakHuGpyxhhEkQ3s5KeehhR0MAmTUsQJg0/3Ht7bDafzPGsPhBQhsgMjStCtJAAcm5V628KorU8/eD6' $BG_Image &= 'hYacMkRTLJF+iEZJNMMS7zb70cMem81Hgzx9pI6qBPG6BAlEYMVHD0wTqvO7dvhihIf7i+Q7013bXHvQkjtBerrBlmj2JZE+/0yTzaY9q3CHl7oMKT5ZinQzjJeOuXrmEQ8OJkiVLWNErjtM20vkgASRGMhK7s3xJ1f3j83mw3nWezOWU5FKTXLeRT1EpAw6TZSGaI3ioypB7NQ5vZN1tdkSZG+8co2uG16zIlrbAbL5eFqRIA4Ur1681FLrcIcD60QsICdXs83vwqEh/MQAMkZqzOCQIayfSxCaQUvanSD81+848mezQXnWMbxkhFQKUr1WZQiCguiG7jSB6ZGzqtkGIAIMEApid4RIDwF26B6WaY+JsXaAbL6BoxX3OqgHX5QsbccyWKKoeM6a8fGb36DmDhiZ4/9OOFkJYjkIpB33GiQ/mK48NpvvUARtdnjJAFm7esO1GQsIeFJJxofnxsPjJPcRJgwPYRdgg4lcf2ibfGuPzeZ7OFBKYYCw1+oDExoyASNkFj8wUbq0c5LDlCMbUXz8CBAZcgvCoNkrkM23zbRkSEkHintgYup3ihSXHpZyHAyO+wxFO7sMsUVThCzGiDzX/dwLkM2XwQSps7K57mJF6hGpB7tnAxoNsUOGsH5s42X/mSBLkOiN9dhsvk2Qp5fKqlU5EdkMwgORevz/uTgNkSIcr6N8LTstwqzF6aO2htZ2fmy+jjYFkR8crr9LD3UHUaS0WQazw+784FLkTg+WwFXUZYzxfhzbjs0X0p6FbmRpM9atCAUR1tYKY23MNdphs0sRm5VN3PMr2Amv2HZsvpNWaMhsLC8yxN1x0Ww23b3KEHkLy25nYqxrrztY4JW0+Nrvfd5sDs6w/liCODSySLRO2nl0hgaXH2S+TkGErRIKkNmJu7fHZvOlgixDigxZhQKOMVvE7HmkydmuY93nkF4QpYfe/riF1ax5rVuQzfcKogW6r0V6dsxWQD9i+CARnbQeAGgDoRuq' $BG_Image &= 'dSFg0Q3htWxBNl/KgeeyQ182JUMK1MOdgohgmORFe7Jmipg42ZUjRAsQ0eCOx2bzpYB6+JMzLZ9ID5aTwVZ9sIiuTJXAlRo/80O1APYMa/O9oDgD5FkmtAHuhQ2O4SPtGTrHt/IyZiM+W+A0IUluRe5rM0M5HpvN9z4IoSCl8DqBV3hBRgnVmfzWV1K9ZpH1pyETmAFYhgjAWIu2Bdl8M62U9KBM7jmW9CC/XzXrGtYLesJPLkN+BEjLV+CIx2bzrRwUpDJAnp7Ay2xMit+zGBrjIiJaTObLKk8oCXAvQpAlmhk4tMdm87Wg0IZyJwh4rYwI2YHRotGM3vqR1SNmG+szDjBBVmyot2VK2/tMNt8+xyqFhlQJAvohhnswNugGmwzRq1CQUJD7MF+wYAsZsgXZfLcgJadYd4LA66xJpgdmRZMkXXZE79HTivAxC7ZAFoc7Qh6bzReDMqmMESdwL7OL4QMxadHZstQ4hE2AACjLed/EStB0n3cHyOaraSi3Io4CeDIw4BqXIz3RJXpYnxUgV35gZYhk2TOszbdzIPWYOAVhg3MMDJniGBjBNqtRkZAFosO6JbJDYoC1Z1ib76elHKrrGSEcAb0M7TgZXnObSQiuQa57uwtciqxxC7L5dg6AhsyOIjdYDgTC3YuLOrzqpxNaQT26FBFQXYbsNfrmr6ABCpCih+hr6aH6QTg8ANxPz+lK54VY1kSD7TX65us5GkrqkXYUlyIIwDFYPvxCGbKsEGC/s0NsQTZ/CweUIUX5sVirELChrDwBsaT/3xBi6uIvWoJs9iQLKE4JXB0+KyYIn33QlqxAUIwuMRaXG1YMhBfbgmz+ChoNqShrSQ6NrAGP2TTt0spdOnAgmI2FAORJYWNvhuOx2Xw9DQaUUlC9zLoTJEusq0Fa0BO9Sz1uCspscMC2IJu/glaaAbX4FSEaIPq10ujZsMbsfCN/qAztoB4T2rMF2fwFHM/S4KU4i+2SQwr88SUHzW5h' $BG_Image &= 'BFgFSD9YDq+evmxBNn8BR6kOSI7iRBMsg5GTjYeMHvnFOTRlSXIrsizR1x56+lFfz/LYbL6dA6XCQDsqB7gXTMLENOJtOtWdZJb80IM+CGpG3+B1fov0PztDNt8PaimA8mNtyNKyYkFFpiHvY1oijCUgFCD64vWSerx+/YvHZvPttKe7NzBDSnEHO4l7kvWe42HvnGjZKhNQ6Q5WZXs+pxyT17/Px2bz7bRaizdMSjrCMMHPCLH/2DujNIdZG4p2Gif4ykLceej+t1oJQZOZDXT8fzrIgP1+PiFMHJckqpBMIPnwpyDfh1/PZzvPE4mI1LvC4vZ8ze+TvDIFRBERq6yIx/oEw9e/M+Yn3V+uR8RUJP0IQqzj2Z4niM4AJia1xir+ER+xTkNilfXMLd99nOqdQjxxzH+Y2nrElX6EIk+P5+nAYYCgVZle3J7jGV68whB3xdv3IxWZBrgkr1AjN7R8tpJHkuV51B5NABBKGscwB0CtsYr784g11uEmZBmSisxC/fVZhHzNibdfCSQTz/NUKEAqSBOLDidqjVXcnkd86ccNec1CJBSJYn3W6a/8bfnS45XJ4zOBHGvz6jyva4xOggrQADPDWWus4v68jvkR68eqJqYg/iQfbEN+sxLIMZV6nqpjcDAAAQiE3p0lSPEPEGSusY48f3VM4jYfRIQiEb+I5DHLD0T64MZEzCg+oIqQ4v58ZQbJjLEVSUHyUaaSn2T58e1qNdHeM3/MiwYLQSAAWUVIcX9B8j9yQpEg5Igr2ifpSUTqkZ++bqJXpxm3HhSaIwICrAOLxe3xRJB1+hYiBNndLz7OXoUfrWmQbtBoiZhPAYiVIMXd+cptrJBkG+Gj4913TBN//DbmiPRxPuXEdV1dmVhclpqIkDC2fxXF7UsQ59vbu/R4i7F+KfI8NlOTZxwraQ16aYd9LrAGYTAjBCCsBCluzqHnsx0hiGeRx3M5Mgd/8v6jaJ84R0Qkj1OaRPpA7+Rm0IbR' $BG_Image &= 'm5gHAKl93uLefEHDkHcO+d55Ikg3vtOMDc6zeYOmHkYlwIl5GHcdAhEpQYpb81IHrWWh7rgV3k9B5pNQIy1xjRzxq52n6eV0JvC2AGwDk1YvQopb8zqvMARhwXfmkf/ljuxyjbWRqD2ep2ro0Tm2IAsjYdFyjWWjXoQUt+ZLVK8wpLUWRuyFVrR0JAbvw542rxN6BdpJDC5UlYGBZpCYmIhUlV7cXpBQxDlbJJBsmUdy+2o681y0c2YPvXrv2ocN/sQIA0TMcqwipLi5IH3lA0eyWJ9rqzQlt3jX36m3JieupA8lmXqojkFwATODQAQwqS83FP8MQdKQlqki1NjrLCclaQ26XLp6QCoD5RhUh7YzCGQGzOpdenFzQbKi6GlI2hHh3WQpI2nHphMdpoBClYkqjDYRQ6YRs3oTUtyZL8DdGJfTVRXLkNzfXQkkfm6+c0cynGmEAmDebZDFBxKrE+/FzTPIhav3K5iLrCALEdcjJk3CoY1effRBpaND1eekj1CaAwsEJkbAZ1WEFHfmAYQd3dulV25lBUfLBOKCpB9vet8ZYwQ6RhpCADRCvBmJJUqlkOLGHJeiO9fOIe0IPWYK+Y7p+av4mH6wc5OCvI+Z0DDFMANDj3qbXtyZdmnYMZYfl8rKIM8E508/nDE4lDp8jHCUE4vAWmYhDYGPZUhx600s5AorOWNtFS26dgp+ZA8PpSr7rkBm+phdYrSI1IMmFO+k6pDivkexYtF0jW2InunH05mHrvTDDyd06CP62elQDiaW1zIkBhgImLAMKW7J49K5xrriSlTmJu9/XBD5kT9m+sj1VAyZNnoMn4bQLCYK26eyADErQ4o7ItApx/DeWxAbWe5HpJAG/Kw/xlBlKDEt6cPp1PE2xKJz4JgJJAwxj1F1SHE/vuRSb33sjaxA0Z7H/PmH4Epw9YSDujevGBG6vBlMQbyDB8yBeAOlDCluxwt6aY/sod45e693/gC3we8T3X70kXqwe++t' $BG_Image &= '7/xhyZ6sRzCZfhhQ53qL2/FA10gcIyuM8CRQRP44ml6Trnk+MaTQzmCMud6a07xW8RHNmbdxA4gDA+oLJ8XtOFyJKcbowZXopfBCpEGvRXfoMSvyLNDzuImmLj82erFEmb0JJCTxqEK9uJ8gOhdXY6wSJG4nCqz6vTvaJ+nByF7p9LwxD/vcx/KWPUUEaUh96724G7mI6hHZnHykgIYtfcPOQY/c4lWNm5QlDXFyhAEWjaBfjhiCOpVV3I3WVcOOqEHSk6SHID4i23uF5ZAEqX3QY+FPwWSaYR9f/xGACOplSHE32nVpD0H6LtK9TdSJG/SJjp6luA5NSZzhkd1G6QCEwSacHQgBOo9aYxW34rg2fS+xfjzxSzu8aR4vmdfI8+47laQeZszRI+/lY7eXAyAo0l7lSHEfmurHMasrI5lTXRU6ta+Tu+w5zgeZPX5jWGqEI1zzTvityL0OvxeVQXTbkOHdpgfoytFTjxSEQSgS96TyNzttMIKJAWIGhRC10CruQjtDhLQhLYl++4EUo698EcG1vppi+POcME341OIzfQyaBABCFMrxeL2+SpPiz9P60mMLMofF8DuqsiuV1FWDuCD7N1PgZPDjTUgKkpJsPWICmIghJkQ8F2nH41GeFH+Yr6aRM9KQjM8Mwk4d3nx8V+c50xjfmLdPzHYfWJB+QEQwm0MS0tyTqtyLP8lLLr22Ibvpx+l29k6ObCFKVx/zyZuswt95g2mHWK7Kwg0PIcwbRGCC5IQAQqAd5Ujx93icmTCy/1mEdGUn9V2da9QiOq7c8f0EU4vPk4obVW5pLMwAzCAA5O3IeQL4g7tbRSF4y/He7s2bWaBrlOjTC43kQXqveUxx0BHjxjK2EEINO0BzYCaI8EsCOAYxMRCOBEcpUvwpXoBeE01N1pAXh44+kwU6MbrP+/5BYbImZjk4+TDvdYQn0w7j7CUiLfELHraTicQorXa3ir+VQIIRWnzU6ppTkponS5YTyp4Z' $BG_Image &= 'JCxIbEUOZuuZukupjETH2fJOxCCwJI2RGHDiFCNNqmgv/gavC7o2edVbxMep3tzLJYZyaO+qVAUZ49sOiWGSaSP73ruSJulMOEIuH5C1iMh2JgwB6N05A7IkKUeK/zPtv+ydh5LEOgpFN8+gRsD/f+36+pRoeffllEbXMmDUXXFOIWy5Z5oKxibevCXJ7av3Dnd36og1HYEP5eRBhI/paoQkV3GfgwxvT+mQCmvBeqvGZe5K83EKydHv24G8WEzJeHcgmMu595ZdOc+y8i4T+LHft8Kl9wz/IcSoLnHL6NcNWJoPPjqGubVE0u+23Do6+rC1qsK/YGNVlVmIFsSqgAMCMkBi0F4sklAoM6xo0UdYQUJRTq5BJ6IpTVYBzBWPy+u08cnNrd8TkqPzo6P9m3Hevcd7ieXNQ2W6c23QULh+OijlpaJUUD+iyoZRWESG6RQISg+7TYR8WdS4ZBXDuAH8+XmNvr11GDn6jfWfcHDQqYM2HV6k3O/kio4wRRpgQZjUhlpwyHLQlo9Hs9FBDbKUDE4+CXR3BEKaKBvnYfvRb/yjow4Pa42Fo4LIZxRyBVyY4cHjsuSdxnzojAE/TLWNEUvEhYeKdfOXeEimSSoIu1M+zttWR7+dPvz9YNAblKkYzdw7chQVJstYyizX1E4NNYAk8bi/utTEjMJDBiVHMUut62Q5BjIfZ6119Btp+Oo7eAwCKxMveVIn0Fv92CPWS7he0mBGE/FeazFKrlVSPEUpkXAVAoJd8iAiDekwcvTr6+8GExMgfI39hcJCWRHf8M45fjrpd8euuInAF9hYr6vIPbnAr1BgINNA+sTHqPFxHiMe/cr6j/vLvfe396536YUyk7/1DY12OSuzEBgwuIOlXCPDNDIc6u/s5WPQ18vDBbu25JitGFW/8s7Go/OqVN5EmOwED9igkEjzXRuiCN4uZ15ja8ZhSYMMcS+1hkKurNdgpGjhNaSmQ+NdQIoKMgxWrui07Ee/mv45' $BG_Image &= 'Xu5bb84/KpT2l9Iza4k6IPmleZ3bVE8rbDQ6zSVEKLZwA6e3Bs16N++EJkZsUFWwQKKkxSkjR7+K/vNRj9u6dp2Kp06IAZAmJAvn6T5ffqnf/sDeIzqhYLuEFzN5cmR0wsNoXgbn6MDYvSXLhA0JSk43cvRL6++UDx39UND6BtYEEQCRCjqweX/PCwFClw2CBcqljkoReECNhRGrLKAxivqxBhIaxvyjbedQ8p+njBz9kngkhYOnhLQeXHKh8ULJ7zTAhmdeU66jCoEEMBAQ0YEQLyasIAZv5Ts8YIIItww9iCbkRov0sBpnb/zRL1c9ug/v/Vd2HbNbdmk1Ia5GnN2KRX+y6Ehcr64udUajF1ddRcZYGSvVhPIABlxpdKbwsrTsrK+AguJxD4ipX2Sv1tHRf0Y2Hk8ZhaR//OdNSKU7Naae6h269WaDLPHepNSgfESZlVXJ2/NpCKJW6AxkMUgak4CCDHsdVXZ2/R79TP39X9XbrkwGIHy+11rtlqZPJ1UVqdFwVL5XV3hc9yUbIVItIpQykpSWNyKF2zSgQuJT1BNrOEzhp5E5PfvRT9Z/6m6w+3dG/VE/OFC3IcpBxy1ehaJtp0ZsXTm+tkhxe++OZJUW4tEkaKBW7zihL5dWjVky09DW+MuY/eRfDzo6P6L46S4sfPXnm7yXVvJMTfeZ6ZWV/WB8ZKSCBgMbVBMNJoPjTULhDcunYm87CKuK632BxZCxrijYTbzPLp0icvRTuo/xak1x8hQtu8n59JrwYLjc7+KCixdQMDC4BAamiJGVAQ+xBYuutXSClyHTKs3ZCNMZA+EpKC0yOiJOETn60TevvCYrK3HglAwdrZbYAIt1C8uTlFy+MVHUcHAoVlCo11RLzBGE6YAHedwm7lUpZzwo7F5FlEDI55CwJnOjdIrI0Y9cXq3dVpgJLE9GHDx8NeA1L/G/D8RDnyjcKuhKnpt5CxHBDDMdLG6sdFqwuYopigYqlla3D8JbCmjP' $BG_Image &= '5aVmBEys7PwzxKMfrn8Oexm9BWdb1lo0JWiuVzxm5jXtyb8khIvUQPbAQqZkSCni5HrRwgxzxkvrtlZYTMlxjkAEEPJsRyzGQ8ZpMnlWWUc/UH8f9XLjfu702XpNDCcFBkDu06tKU3kNqaADVkIDBQY1BpWragBHdyP4InwiwSC9A0IaDThR9B1STTqLrKMfWD78RechEFq+MDERgkyG+lG38CAhk1kouncfDzJk0Io2KvhAE2JWgUY7Pl2gZSQ16llIZIZ9FyA2ziLr6Ift2xUDqg6IMuJQscmucadcgKj3KPrxd4d+B74BUvTsKStRA3ZeSDz+7LutZzQgLbKDudZAwaGEkUOt+2nI0DiLrKMfsPPKLwkKRLBUiw0jEBqX3KdsXcqbI6d0YL9LNBwrKgjAVCeKTwFBBTLcaEKGTuUpGv0OiA592PYHIcBiY8+dEnL0/c8+zJ1d7bkWUNPTa0elJtaqFJdzW5cuJF+virxU0KEoYQBYynPHo0sEhkR0Ay+RZE8WN2wvryPCmFn0GGDJQ8AwAKDEiJVNhlmK04Ucfd/Oq3Hj4TcMeUPh8tBRokH5vFxlZSpFC2I+wcGrQr7gAb8rvuOyCZEhAI6nESVyb1UJmlbf4+WTyKChFRikOYt//e3o6Duac62PhMhLWPDPonRg4GLWJbiYxc2s+4N1G3DYbvJyyVUvpVASc01LTxXZOm9cEZoFWY1h9eg/KCetUs7kdmz+H5A9Y3ZKyNF3ra6mmwrIrbzk02v6rGukl0NKigwBoXhym/fiKivEAaPeT0KyfDUTPS0T1Qpst+KdJUk0mpM23yB7w4Ab9r4nDBTYb958EqcLOfr21dX97NxzTh6Fu9cECwXp6//XXuollgDJYk9K8dVKCKkGRDFhSyhgnoBkdx1kZIYS7xxfLeNKIkWAxfFmFIm+RoR3ymIrJqeEHH0zHvUye7mASIqHe/E3n5PAZ5W4mPChCQApr5J/cVuL7/fffWokASLV' $BG_Image &= '4cYLwtfWplfhNwhGVK+grB6Q5L6bUdEovmKD81b3KSuBP3d6j75xdWV+aU5XVSgAIZ6VdwG5o5uNzCwiSS1IBUWEkuFizOFCB6Z88RDY2vTsRjC4WPiMAg2FI5TqLkRJZH0hjXU3y2wRQucODgRQQsbOnd6jb9qXaG5+jZe5CGFHlbuV033MBIcqdiJOGnaadLDIigCC3Ft1Qi9zf3QeiUFR2NC0nOw9UL+ubrdjZtRjPga+SuFKsKXXwizuAAiAg1JCm3In8R9/Ozp66J+j1HromE55SJfUipQLD0UPVYmNSt4UcXEhUzKEqRNESk5D10g+ZAMn9RORjhVuq6wRLbKktyszJtWOYyQyCyLwGN9wRwudNdbR88l5mdkUGiof0qxyCTfdhQkqJ0SZSQV578Py22QuOlxqKPCryAQmoqcJK4ji8bxwlMk3GAOE3l+x8Bp2KYbx2EMWxiTSW/ch95SNUWeNdfToPvidXcFRVI+kcKRjaTjABVYWNvqgHpzwCQkkqBmuqyR6dulRrcjtOlcYELI16CUgjEv4URj9wVLF4KZU2WUl4yMyiPl1lDUUmx57eo/OzSu75FMVJH2yOup7s92ru3ziZC8/p2Lx8cpGI4sPlm+VQnYjqFEJLFdbZ57EYbeNAS4yoxYtkNFF5M1QOWwMXhphqt57FYNw1Ddv7rV9jXV0VlfxsnkNgwr3ykmpyKoCDtZVmXWFDDQ1SQGpjACIot2QYANbnO2ik6mYShOEsdNCGMVN3aGIqUs16tGGiB/bfsShmDY85cOiwyH4njuxUJ3tJkesrj6mTb/GnJPeOn1tzq1c7QOQVCmQkWayxuoFVmOwseD4TCyuloIYPaYiaEwMGvjrX06mGcGAUS+s+jMxOL1MxGiW1l1B8YDQHmx82FCROWuso3t1FV4mPOw66DRYFDmrqVqLq0nh0AkYiI6eFRbFY2/Gk1R2JBUSAKiVmIeaBQUV1qluTN6ojNWVG6TUEBRUGitd' $BG_Image &= 'h5CQ5dDoXyWFEWRnu8kR75zbp7aWmM2iOfd+idwri1YjnWbEp+I5J/XEp84SIPpuVHYBas6SMuLbSiugkD4jCrW2LEjs2+HHIKkzK4YiQdB3cflwFZf0GIV6XxbPPmhEaljs6ysZps6jkKP/fIy7FPDCh9Nz+JTJSaO9akVi4IIgZbsF6acWXp6xcHAnyOwKI+FDyYUCs1wy+z5AhnOZkLp+DIymLKzMrKgO/R1ifgklEP97CjNMZ7DGGnHeCjnSS4Pm5u42k16DLqEmt54KGOCDc2neJyZrssKCgQ4Y+453QiYIWvl80zZLFkpIZgYEGn6VFi5Kw9hUstih11jfuqwN5UwI1b7R5PFKITkZO2usr76zZEy2lkza8P4DzkvFskpS+k1HdnSvt/ATQEDC4WJvNiqfXHT22bBzMtds2ErGLbKc76KSMpcGfDw1opxt7iU8BqSESgcbs6wBQcRnjfXFHw1Os0kBKYpEsQX3BkKeVVTf6L0vUxGBxBfYoLgQ4avrWlqNe1NUOwsZASdPdWXY0GkgurDQgvTN3GZn3yP/bkpo0IeRpn70z/buD9XNdH3WWF96Z8n0ac6+9RIiq0GfpVC0yKfgmO4FG7p6iRBy+t6cfZcXvpR9Lqq6pHDcIx71hJDRCmyCBLYw+KJHJ1vgYaOCg69I06r/ryc/4VAjFh6qIArt+Ybh115jnY27qh5WVSYcFh78OSvW5aQhr6KCtFr6Cq9XZWVRbqrkBApxCjPFnKSiJGwSolQcmASFd4PNNW4F2/uGAoPI4GdN2/oMy6kK2FgF4/ZEARqoxscpIV+1O3ezF1sT13O8XM1HKXB/FwwFBRBqOxD5qaF3pLofvyfeXbrA67mlJHw2KKGQTOjjj/2KiZNow/tqtfWjlDYLzZu8sg3JCGTDLhGTW/0HmIzW55fdbnL0L977mB7ptW8/N27xTpfJVMSfPE83JtDUFbwUykm6iZVZbMKaJbGRl44dQUnb7sT9wQ2j' $BG_Image &= 'xESM3BrySlew7UyUq31/lulSePDDvdUtTHVDYpqLWISU2pB36ZCppsO+6g9knYcfltPnFCEplXdvzusd/WtWPBTsp+fAkhoz31r/9dmLrv1VNOZvwcvzbVtgISAsJyTl/RpIynKSIiwIGPj9Hpe6CdipsT4qVb9DxTe5rEF0mSVb5qyxvp7+/vnpNqcLBXOv8mLPlXlmzfLrrER9oxdHUJ4P3T9c7SymIAm8ujOX2Xr22/S5uTXXCo1WXML0Ft7uxVERDQsbNaqzVeuLXPZaKhRgOrfr/FO2r/mTiSKDztWnXDcJs6as4icgmHmfziQ2pyqIAOHvm6ciTHZns75BlgPljkUWNmRkYYFc6CSqYSyoimlQqB794rpRP+ZCbRSduXzxCCSQYOFsfck11tE/TXuvLnmae03acfZdsdlKkUTTDhUUhn7sAR7FB6ZqCAxVpUtMIEVeqPsOGOnxmGtRH9IJ+wkhfrBvl0uygan3r5xsd4/JvKtKUDEApQFpLlpnz/tX+9Eru985t2mpMuJVZZ5ePODjv//XwqMoGxqpgUqTEjb51yDuPEIvCNrrhSzBqhALQBIZ2y75IInTBDb3l29hgIlREngMAmbXp1EjAxyAwdDZ93xRy04T8qX4GG737V1X5RAPZXO+d7gLF9/+/F1sUD1oz3WpABVOj0GEjb9vQLUoM5qTsFmI7xNBB1ErsLGfIT8eNaWjIC8VpgDkkeYlkCYDVoqlV/fnnF/vRu/Zmzh9WnpNHXkP7l950nzMhBCMS1Wyvc6iHKBqQLK83xJsdQEBqeqqgX/uPekI9UPCep+YvYQ8jv6UyeZNUlCPnhqFgxAC+ECtz9OEfCU+3NzsbqJn6fC6Ii/PWoT47MZaWg/L788hLiVZBB++VYBVO3BJ+8IEs1zsBrDaoi4B+BFUC5MtLjBFQGJUbF/ONQMERLW/VqhzEHX9wNtX2rB4llef7v56L6lq1qXkd0lSYa2f3k10xV4yl6Yv5d5k' $BG_Image &= 'sFORTjzpFXgKvigi6fiS4dyvaUoet7RaC4F+K0RX9oRpp0SH2VZPvNNo0+CUTAFY7BXEzpOQL/Tm4PsNWdeBm3VZ+o37MjeBRn+tL5mtRFphlb9mVtAfeBRNv+zeozsASEpshlT7jvZFFXh0acCQgJHuUmqbyGQOMQsV3YgUwTc26SNOE/Il+Cjzl7lP5092TsfBSKVUE3BatB53lZnrVfQ7ibqCTPfSbhP+Il/Obi5JuVJQveTaTD179GIUikIjsrt1gvGEQ0dfcNj7Awh4WtWbeaXRbu/PQ/5r/EfPo4+y6fbf9q52yXEkuUU41jFNJSDk+z+tPUIlokSz7/xXOqJbZJFia/aHsFnIz9qTSyj0dKJOWION7hiIKf3QbkWASPju2WIJjWJRAGtMVGvIZKKEDJL07Asdon6aUaZa3srXXUtm+DK/Yz8SIPQfRww5g9fNrq0+IkraCyPsSCHuf0jV1B39IMjXa5V3qNlLjFBCCgGbVOyDGXKCn9tMCFmAusvgdOVVQ8hEaHWIuPy9T6/T8eRCnmTz1EEsQ47TF6s7+SfHMU1IW1oJWceKfhwRIP7pvz8mTsKFwc/Pf0I61l37gePAwWpJhOPnXPOhxJZtRPLSvchdhwBFdNN8SSRxDAit4OsvlqhwNfsKrgi7sJDOeyslxTfYzcueTxVB4pNiSnaWdLgEmCmv8qfj6VzeYI+EpDT95Od93pGQ/4R5tYWDJcNmghJJaSzIKqS1ZTG4BElDNh3J51UrDKmyBUlLd3VngzZ0gHp+MA+cnVlq5XK3GX6tYQi7Y8s3TwzxGNzHug2pXUFlgjyfpkhHom/WxNXqG0n+PI7/gEjIzY8fAOCWoNtDDlEOoZPeX/WYD7+ZpooAQQjtv0gohKKqyrspTMK6GpO5mF7vHV/VW4HhuTOpWtNWMfJas9WSrzuIct9H4r4GgZgz2vOALTiO1ZfUQ3RctL7XGAZtg3K3IP320nOgeJCEDIrrHIMidYts' $BG_Image &= 'idwUOpADEdDy22wDqwqckHjkuDkiKfHH1jsjtG6k31wYlGMQN25Hafh6y0DxKnsxQ/Tt5Cf6b6Y/XK/4oN+JBunHjuctQr66a3umnVuBJFmXZgq9fkcIkSz3tSQ6/ePGf1tVe+JImz2dwOHcyGWgzu2wR33G+8zbNQj9YnB0pzYkKsVEXAQJktM7Gt0XJs1Zgvw873Ssb64dbOJAYbxTFEmORrfN0A47eYFqCfI6pbYA1RAK3Sg0WJbmIUICGVg7rMQC1/lcP+WfbM0uSPTeSjR1hFluUz6TD59HpNUB+xdp3kl5H2TiVHCLkK/dXf3zOBw+NyuAVVm+jMe8Uv6BsSaO8jF9FUmIoG82UGqATvGtoqW4sQUDk5CF3hkUXmTpw553MlnxMSK7yAhVHkOQxEZCFLPEn3macbgTJWfzZBbR6d9cE3KL8+dB4CgA7JVZshGEFNmKEdmRMpBU23IYQ6obJQClllhVMjWEVkeDA/A9szJpVj7tU3RCFq+ekSDohWye1M+zu9fYeqDknOBjKGIqTUDRiPWwJJ+R0MbxvSLkzr3igcm+Ir27kpW462rJFmkLEkSfk92TX2I0CC0v7d7QughFfwvolKdnBA81ZMghDImo92kXItjtx2mezpbCe44n5pEG/UkbNSLXjZkzFdth59aO4xYh32g/jgMFb4t0NCC2QDYB0VQhm7rGdCLVcAOS2kLELHFssEAUkKhIwxSbcAmcRx8D8jaJTSHWBE+UN092IVNuO7R4p004s7t+JSr7rjeG5BjhYZgb/wEi5M5tP7y7Yh2NZkOUHBAnaX3e5ojlez+lAAWAVCpArKFHlvTiCoFCFUd8OJDYUA+NJqze6FP4/LLjKPYH5FXKarOxCiFMg21xzuSFfHWYEEdY4C3WmSaXRbffGAm58d8vAwKgRR6UlYHIVvf4sqh2tklAGQ3IlkMz+1x27DpVJXK9WVWQUgGFxSC0mZJwx55mEjGvfViCTxKUmDl83hGL' $BG_Image &= 'sNWZ5w1FgywLIm3UynDcHUl7T4v3FUIMjuedjvV1G6yfRMA9WY2Te0VSdC4We15DjQCi/1ad1qNTOiUJ3AbrpCUWpLVtSvajrcdQQNEafjJuXGiI4Dh/NPxZWURcpFpw329tXuAOHU9+rAsnVq4yrDAIT26CfF1r0Z9a+yPy8E5KTXtTGf3RluhkAuwGAQiypdimhBDqxnBDXIF0l1zZYgBqbCm6wmm+lNQ5JMnXl7mg1iDoiAoNVVJa2IHfiPXouLdA6nX/2KupFlJtG0yGSXgRHLcI+S48fg6gylKbhJpJTaTNhyFSZELqc0S8V46JW4WgCwZhLiQMMgmIDqD4aLuztH5cvLKeQTgiky6X77pk0+KzPcoDuYxYD3yboOSHzJFYkVAjlHGu4nNvbBI870jIt4VAALe/EtRLkKvpLccQQxQ1wXRelNoSUkHzpZedWWNPZHrUBAznyw9yBlK19uxEJeChXYq0ydYR6ZopbDhHOSJA9hTERD3Cn5iRiqN4WskdCRcOcr2GILiKcPDnFVa/C9O/LQZC4JgAuMTFA7V5MJQYSeIrxXyMGwuTbjUkQWfdIOlELJgZ6+1M4uHYH9uIkEIZhXhOYNSIcqmNU4hjbj/6LEv2HJNAVENaExMeOy8uOzikZa+nUAXfJ0LuAluwkYR22Zc7zX5I5doy3T9BWlBPMHBcuNJYCkdCCBYK6l6KRIkz+u1u9QTUzYCZIBIaaB+VMBQIQaSrQPlTuZdzPL4BGqS07c22qMcFzAtPvj0ex5/H408m3t6hwi9r8EN2bIJtRYui182BGaNhkhEPFvzTSgqv31FHupctCNXTehTqSBVEiduU9DakZ1fyiOZ48wOHKI+I87+H1BNqa10tPd8ZAzQkQnqbUjXL9kU404shQUZ7vk64Vfp3EcSbIEMSKZkW4+dlk1sFiB8LTUop+KA2s1AOp2fkbaFQkeHhjhrEdNui2ZAeEG3aJKckjLmcQbWrEF+EGY/lzHqY' $BG_Image &= 'Lfnix4slJDiZopGHFyFL4oMpKtzbNfj0jZ0b7ihIj2HY1Ua3pHivhiuhRtJ81ymAOiknDh5qXVZhS2pMBi/qdbYkacmCPUXqUR4y48yIIJm9gVIOZWS1L/dCkJ5tn+R35mU++feiPsR8+fIe1nceFggBigYhl9GIKPcdZy5qfjZWkFKuEy7MTmswUZA4gttX4yHm+usZuz6ciEfLvFKyENUnT+8VlunwIQpjmLAokv83LCQHeIaC9EzOiT6JBDnh+DoRcluQRDAoslMnNSH0RZUQYV5eDLKExnJAINqCfVJ5R4MQmRRiH28SVdSNzCtEAuWKajm7tNDvyPc+UUHLj1N0PXYmFqS0S/zV92eX7Ol0YoIcbwbkz9iPu33cVxFkfUetM5pJSjTWjWy5IuVF0FfUO6wdoBLCDXm8LaDVWseShICi5BuuzfXROiQ57sOatXieyxK1u6ZMmdyQV3veb5S4hjACQe0DFDqWoxP+8MjoBdPDi+DbiqbuMAgIHBBBo8datGjIr2aHDeDwRCq9o9cOa68DSRwdWqkgPe9R0OYfFpaDd9caW7IW4sp6E+nPvaIq7AhOMcLwJBcCJ1PZj5oUDwfV2y3e20VSJodPxtmjdYuQ78E/INSHSIJUmyCbDMlaFHvzYmV1QhJ7vb9i+IFa5kPJN0yKy5ITHEUSAqTDIvw9FtzefZfkOzEU3d37KkcbgBAkb2ulLO9/4La8tidLg3juemKF5yihCXLcIuSbCALCXz0qfDCUA7PdigopneRHK9YFIJoAyZk1RTuxpF6qAJLAzCu0cUj+e1KuZMOQWaDAokqqEtMNSOf4n1eagEY/Wk8lXrInokgUWVSSVx5bZ4enkTZZmTrVqyjk+cVFU3cxSBWAcCHsUDOn8KYZDWKOkIglgd9znDzBDyXT/XU5Uwrc7IRoDMVaC7EZkEKBlNWKkyK/mw5TJA918Hzsqlx7iWGgw965ImOPFjPcVytG49HHau5r7XHZoveb' $BG_Image &= 'RMiNP1gmhDzCgxPEnJp7urvJsRbRJ+msODssoUwWlEN81UrRIXQCkLYOhtkiSMJa7vocPmVvtetx7A2sd79Vxn8OoSCSpbmb2IdXIcjxooabKG5K/RQrvEXI9wTSf37Wnt/kmJd8GbTE7l7siD6vxRWeCALGgVUA2plYrrjNRGhzpzXotZw/pdbsg62TnNPfsdVUKSxKD9KwY5cgCi/Mk9x3mjzJYknvicC75Hgd3Pd9Wr0/k/G+4+eLIiE3QVJtyxP6/UKiX4aXoMIQ7iodcWBFeFcVqoqkxNeq0ICpkdeyElZF2TE5po7x+kIrL343FwmLpDhE2S4plqNz1rMDidYg5m8aokzoZPDIeML0WHxrX/2NIuSuBikAeiLpiF5QUm9uXnWz1Wc2FCXx0oYQBIlOqiJYgUMlNgYKSTTBD3C/7Tie3+nEQ2JV/MiO3NojISHGGAi12tLFLu6yBpHf7oQIA4uO9jKMOfl5f76MIHcgfc0jIANll5UkE272w+9I5Ysc6XODhJAooCCQS6Qv0KyRwx/bBqsFTp8sRHBbqkPIF1/nuZ45tDpMgJ4ZySZlSsjTq3AJMs1nZulpZnTwiqM/PEFnZS0+L8dB350bvocgrkfv1ubLNQWCU3YWIa9iNPaz2Ft/d2laYpkgYNWqraLZs6H9WqRJelbiINOJbkVNdO63+MJ5QK6R7VbUSGLvDnqybUEi3ZcHKxRZ0uPoDEpvM+Rdg/wxQ467aOprAulY31gSJxNCRaqneTWpSrAQRSUDnhqYETsahcUMOIbuEMjyqoYh6RbvaVYtJvVEeh1NnjDicnfVLT2f4cNWrB6ujNJ32N8GksuEaGvcO6NDQpC/w3W6M1En/DhDt0r/EoLwqMoW6yzOW2QxUOgQmxFsJbgsgJxi9WGMBxIm231h2QBEcTis7ie70aopKgSQkVOpKTSUDMbLydBbXXobljOpVlRRrJo4yOJT/nJvsDhCPaIkbUh3EXLnK35Tpgks' $BG_Image &= 'wQeSlDWzkO/ntFkSSmeJfp3rvherN20YYFahYQvhkyWHWlM95cj7REe0GZC1DCXOJNHYkiiUrZUpRjt1VLrxtJ3IuJ0g6bxHaJK2WKHItxRN3fhzlAkABuJWEVUsLxJDr8UF35hDQEBlGZLRU1MsZfsgxz9iFwQj3d1nQjvU4D4KAZNxgm49s9WKnggzzqzZz/LT6OSzmCPFKkp6pmfEa491HM9NrI/1SBx9zhEhPt4q/WsKbo+Vy04GWqhFEgfROASQCOoK9PsIGosAhSJMiTJRGPcVYLfuTKWa5lreZgl+rQG4PpsxymwQX+1uX6F3gW42BQIUA9S2hlXFkvZYoVv/HMl3z2honz2X7RUVOefzHn2LkO+IEx4oSMKeoVinjVaZJol4nMsIy6sFECJXgokkpicWbB/oIAhkWQFSNilqcAam+/1SI93fIzSQXZRy1+eNJKZFJP2mSZ7CBByX/ajyAN6iP6OD59HHsWIiSTd5JSv61+dssP58XU3IPfigig45lJmRkIB8Sa0TJaoUS6EB3u4RRDcLyXcn2hJkLighzuCcHf8wSyCTqUeSqJO4awkjnbdP2oclzO0wJJ5exYY0ZLBeL4f5R94c5kTbgDxcMGUN4m1WJuhcREKOLxEhtxPrQBUJqcnFEM1MKTHwzXOayYAKItIzqbAhW5BOEso2j0peoRsa+Q5o3VFTqaNK861Vrh5CSCFCJDtCniCVifAnmgsaE1i0BRmSpZj9OCJB9o5YXqzVjuN78hVv/ENYorfA0RrJP7T1iArZ/LzmT70OOqFFoXcvlmPovlRjOogA0krXKgkNmja9NEkDMm+8mrqQDh9iEvQ8pb6PMnnG0/XMA5p/1zJLqpIZQhbhz0zrxUcyentGpve+rwpBzsH0W4R8B0FQjng0q8jS60TWVi01N+Kx8u2s10uELQhJCC1u8worc9n8VzjZHFKTerJ4IZNlT2ektma90R8hzGlM9CAdSnMTQota5KAtx3Lz' $BG_Image &= 'ClEwFiHH0UnJ6iHGeHlnkxX8+bJ8xdvLa4KwsbZYlQmFVcXXQYXieHrXIfxIElbBxqQAcPFCgkBrdC+7tQOSyRMhQlBQwxCwV1ENBYYT2Knhm1e6XNpLTGbwKEvFZTks0s0UhVcepNN9rCZacWN5Vk6Kpo6zAfkSlX47sf7YgoDqjgXx7ipdDGpVo8ZoyGuAUSS7So8EMWxH3LDBv+fUEhRTwS4mT57LfMRm+OWf+Y1kSPq6YjeM6UnXMT5rk0eVVIZEzqqlff7OYX/v1KabDk5yH/vh15kjdzrWN5RLgSCbDbwIYoqIwwjRF0VSGP2RLvCjbxWkKN1mIWWFVSxrECxT4KO7qpsgUse3pekeNxzpUEVJeJcaoYpvnZMY0+p3SGYG0/GcokKQJdI5Vsr06ON5HMO1KUzvx9P9GhIqvNhi9S1CvsHLW+BC3Fik5NtFmjUqYjRIdmBRI7EeWAaEhJYNYQji+9CyBNkxQRjvb8R9GptkKEKejwV5Z0Xcu+GG3wpPRPhKghQXRBkUvbZIeu/7sKoKM0ja7bGe2WSdJ0G7888tQr7DywszRGAvCxI7UfQVq7K/mp8tSjgEyc1FBXq/pGprkBcWN/YiKSIhE7Tize0ZPSWTIAQ5xUDUGmIYIckG6a0LxCTNBIqft4C3blpJNLEksQmxk3fYYeX+/NJxt3cuLwkRPXlXpIhSvFihCnwlgaSC0KVlFBosJAQYgthQSIHXI1UaSAzFZIB2jW4uLIQ0sRDDGMWcBOiGMrcEkE4EIVXyqhwfSRPrdiTdGA1ihrRPjxyMY0mQ5x0q/Hj8ccyOAnmwqphQiFdUwTv0GJZYkFJcWbWrdYQb6f3z+iXBeKV6NyMgVoI8KBDOLik1CLMoNiQHqIHO/VTeaozUc2eTYB9xc/2JRIkhiBiGCNBmQnzwna0Z6QwoTN1t8CdTC2+V/vlOrKMKfBPjRcH02ALqtUU8qqUtAR4cYgQs7B7gGieWfcnQppgbSGBk' $BG_Image &= 'EQ4y4sACslRCHEjS+hgPYahksuRbnX2ZkVW9WxAvCoI/cWgx5mMihsfj2X/ZYY7EfnxnJOR2YiXXXYRNiHlhtvhkbUIFJLaseIQgfDuUIkksfy3bhVZPhmQsioJIEwUrtNfoN8fvuXfc9Fzc/FBKz4cOfwKyBtJGkZAjRmQPi6QA92w8Qo4vIsidqmiGoNmUOVE0lE2WykJkT+R1EMEmxXcCzsu2giaIN1qJ/tUsAL7TIsthwZSVBAkTKqGReVLy+lwPIkFnkCGIKG7LMT8Og6S+0Bepk3LmYoxIEBy3Sv9w/HPUwUGjWMUCgy2TN6QZHQJJ4E6KoN8JMx0bknNCgk6FR+VDxucbnZHdUk3pBpS6EItu9yQ9CfWJ9Glu+P0w5MqAcOhCR0Btk1Jwu9jxPCw6jNWXd59WuPdY/PMd86DvRBMWMSKkEglxwNAEGY9WKe5dshBSiJWlAqa6CkRNGEQF0hSZaCIpYjceHQliuHgkWSfDgCSO+GdGUmG9HSR4rjM/VIN9be7vw3j2GdKPww3jenl4H/8CN0E+vpzwhyuvENTIDS6eZOETxY0SsSbbEIRS6wI9BemFoQQKVdPN2h/bm3DXINdEY6FdvY71JpRGDuYMOrZnb++Ds6Ez5w1V1lRBMSH7IAQH1dOxdxvpecGM7xAhN0EIHhwVQlbBZGCpVqBZpWh0USLi7kVKR9Kg/cqM9CIICoYZAtiztUuQN2rkZ0rYOT1/3ZMx5mNjCOQ7iaHnhOwJN5TBYsgC896fNtoj/RuO43UKHm77c4mfO1/x4zU6UGp7sdjYLUiN9KgoEE0bh0y29T1Sge9p8npHg1RNtju66Vk6fXQRHD9vQL6HPERMBQdhSHPH8RBFhu9j2Z69F952LF+oqxBkTMgkZG1Fu3FkPfo4XkkmneFsxkW51JfMg74TTY5CEUKbBBViiEUHB7e7e2G6slxcQZ1LcdtLu3khEklexMS3C+gr925vJIEIOApOupwKPa7f' $BG_Image &= 'dMuaZSpGlK6k0r7JIhVzxz2Z10XpZP7a2DuQHuu8m5DfHb0/twj5dCfWil8TJOPGUb2XSpVvJIs3nFC4grd+WWMTetPoBdTEyfvRvvXCHjq5hollCFpXGtOx2p0Ihdd5T2cMZEKY1UX1RpDEewxKexQkHHntr47nGbEawZ+w5E7o/fQ4+lEUG80wBCxmV25qTHiAojaaUCjCN5PSG+TWhEG6MLN6uqpkipDY/vBsgFqieqgxNYmwMlfI4F8gkZBodL/rZcfCUYOdIIZIKX+Smbc2HX8ZcjxiRiZZ8dgZkvXPx6v0ezQIxlSAiBdLRVmGeGU+cEiRDVYtVWI2IOLkomKQBYCTxo4qPBqrVAscQhhZcJYQiEm/wlDBPxkhYroAbXLkOx4R8hyfdM1nx4TYq520LCmF7Ulx7+fjWL2wJpweigQdG/IlIuSOo6MoYQZLzTeEosokUTExkBSlcxab7i2JSPyioAWKqIK9ugSRGWvt2PrJ+ERBZE3L8yYkGA0Ji3+tHs4kVBIVoQxn26jHCicZC1IxIaXQy8hEtmyxdgmSjN5BDMjPTZCPb/kDSosdsSBmB8IQJhdrWJLuo4hrS/kNd8waea7U66D0HAWZKnQFMRw7V2D4zLYlEtI8LjoEQjITtbe1zvK9012nDt0mZMHk78AW5GU3zJC0sV64CIP4+PPZCb23RucBB8a8yxqGxNGb744PCXsIk5uVcCG5VxcaIQhq2rs78FGEIN8FKpzwIYtzn61odKbhL5RSwq2b6IkhqUPcm2CV16aF7QdNlvVOZ5ZhXsffRJOYkE5XkxOOkOSuKvxoPH4A6mRBEjW38eBWpU5TqRZDsOQKRWTgFKkNFLSoAVSNJakIb1ZSQBLEeG4EaZm9JYDaooVtPd5RHFBjLwcJQ3wOiyTOFotDkNSCDEMSbHw+JqDiMtvHX4X+iOVIu/fjZD/+zBarb4J8chy9QPIYDb5/Ryxax8nrVaprE0woTR1HxXCkgKRp' $BG_Image &= 'AWF3VUG1MOGQiW5wdW6AwhPtoFpXwAh3B8qB5OxuBDNJoGEKWHBsZ88voaRaEMlh2OpA9zRFkt37PFxxa6S54k4S0+SjRcit0ScRygeC+YKoos79kqkxNOEiVcVk+In9ZZCEu00NAxcvZB0iEquKvafzT9DauAGd0IgnV8mI78ZSInlny38XQXB5IBS3hF8GawjSM2vKh+OVbTIbreM5WAL9eMZ6/PmKfMVbozec2n5O3eOSHWVyzAGF0qY3iqHCRhL6ilmhVFUyXot2nRSnvZz9W4sg4cfmjYp435Em1t3R5xIEZNRnaNKZe0iQVcs8pumPXr+BCZJ8lcdqaOLV0+xYBsSHX7qP/nx0qPDW6E6tbWZblLAZGAPCstyYzgYUxk/63s0kCN/mfpkgTExPGBDMHJH0xhK3nVZ0dwAF5oemRbY6Bbgj2DvXrn0vbFqrDK+5r3dHca+uiivb3cbjeI3zNLZGvffA9C/CH2CZEILaIgFk/her5L3Pc4q7Si4kYYji1SaA0/22sHunkEY/aDNETK4v0QwFOocr9MYBqbO9sjyJAfGl5Q4Kyy7abmyk0MmA9DkSYoIsUT6deS8rb//k+HMT5IM1OoBku4cfSf5WaQXTc4+MD4gsIqXpKrVIbkmLA07sOpMGluHoLjulhGU9WsuSKE2qbU1wMW16Sj/2OepSC5MMGSME2xhNJJ9ktlVXmDDi0wzcCgstQI7j79Hu3rDkTI7PFyE3QZ5I07hSvTf5MDmoWBGRnFfNBGgm6hYdI8aE+Ja9WHv8j9MMbmYjyNaE+R7/WyQDJcPW0Mpcg+ziEkwfg+VaX6o0zjmDuwFRcU8HHqRGas0HOY5HLMjrzgl/PpwgtxPLOyx0j7iuQXYhetttgZDEEpYRSb8gvIfPfeJQh5WvHB05bKT6Sct8FBsrwh4WnBHy9PQqacOEkFMhU587NR3LOBWJApFKydJZgxhLOnUSspZGf66Zno/HcVijD3ovRt9XPx+v' $BG_Image &= '0u+uo02hZDsxsJA1MTjivLZR6V5WIvDbHLO0z1oc4dIgAVCW44DUhS5rbBKoQl/m9naut8sECtFCTxKLodbWswEmJQiUSVqqOtnMDWFITIh1+st0/P19hCLp7X6Nn7uq8GM1emGreIXICjwGgTEgS40kGHIuD+GmEXKA0p9NASXCEHpWEgZsSROYvyRLxH6m1NqJZUuRenVExQsBAUrxPQQ7V/YaybNQf/y1IP7Zim77eJ4D6cFNkM+eDEJSaasYiBM+I8WR67EgE3mXlAm4C1YoZLRJCBIAsg1ZgXQMmO69Yvhw2WsrGgTqLCHBV2ZLxYgAQ0tmn0hSvxiQ+LHCkMyXes70zsNjdPaMrFO+yeer9NuJRTS7CYYgATWOHntElXxecWFEeSwD01BxT0VZIj0oCBmWM0pdYqiiTs6tD70NWtgBUwO9jWwDtgkKLW1CBPRB+e+9MiC7CdmbPqQ5lr1Yj8O8SD7vM/wIRT5chNzzny1BorVrR0aD2JqYIDBLsr9av8x+Kp2AokFUJgilFmwEakKUkEDwbUShTuB2HooaLm0PqRoI7BBz65Mn4Kc0FFFSB4Ks94x3SL3P85z+7sfDQt2WYxsRcuHt/dRQ4a3R67BvlYpdqCBFdg6DW6izCDNmtETRMEtiRuocBqn92p4qVLJ5SwJIB0G6z+0aW2FhBE4PQcyUyI1N0BBsWaH305bGlFLIVteIAVEMiGJBnsuCmBrGw+YkOCJEPlmE3A0brEGOqO26IEjCBbYyxQI17tIkMpKxH0Vh4weVMEi6oDg6KBGmygLVQAHhRpCmdTvcQzHbqVgfL/25oyOe+9QpM87teAOe0xUF4K02ferTlwV5tQB6nBKxbhHyPfhTGcoRl1TtUHH9TL0dmRYNEewCt71PzpWZIfMBStM5JghCjg1hRHoVlNKSFnVhP6g0rkZm4/TspDrFVSt86I3W60JuGTSEriuQ8hGmxsYQT5c6XtnuzyNGJIbDfPA5NuQW' $BG_Image &= 'IZ/pxMJhRRDzwbMJUU3VVLo7K1qZth5zXSlT37/HZ41ep64lyLSqOrWcE6+FCGniSJ03oM4OCtYi5GT6Jh4iteV8K0UmbwazgpUeBsWJFbzo0Q8XhfQapGOK+BjjkfVNkI8kyFFOnWVnx11BTIhfdmZRlUk7Kbm1yPCmZgyIC913gnAYExA6I28XteuYU1heOmPrtohQBUrColbOyUzEDbgzJKtQRGmtJVfd2ovl7dWxIoTTuMFT2YK9LuS4VfpnxtEdETCUuFlA38qEkOT0atPlXtS+wzJrBN97F+lc71CgEHtxYV+ogCFUVPtZjRiyKDF6EUQNpHlDCOLTb5FCb/mUZKxMCDnMkb8avXvlYb3OXydCbo1+LPXQTMXtpQnRWlnXngjCsCRskMT8hB9viIERzzxgbEie6ao8F/T2qyR2WYTbfkjwlfbCqU4jIGWPdQaKVUgf01gfC/Rn92qL5VOSeuPmDTOCmyAfOBkEI69X1atUJ9DEGJosQiD1I4p84BbXw9adNGNpdF3vVBtFmPf3WONe6K4rZG40CKgzyBZmCGI7ZnAhnk+lFcovoUKgGJO06JEBbH0cHpO+/Y4NeZ77xn2sSr/j6LYgpJYJScp3YHbQ57i6qPLFCo8Q70FuVkS3MimTVJIYK4/nwCxDmLAjB5yaOHSuAfjQkenJzGrr85R1hCsmiK5NCFiEMAPWYQVyPPNycfpLevRjeXr7Ikz4oSLkjqM/gFgQltbX/cSPNP7xa5VKwVxBKTH4wdAgN2ELglxKljOh1Ipe5BClHjWDzVgwq5x7ckwmEt+ZSNXYnrLSHkh6tiTVJWyPIMV6PH1wronTst77mhj9LbMK744mB7AV7V2qkKj0VRlCP+XHiViVsMMohCvFdw1SNEE2CogePmAylIw88kaKChMrJJkw/ORZJb7nW92w0dhtR+LjlwTBGslLTan7M+m8bqxoijgIYlwpdFuQn49U6bcTa9JafTzn8xpiVbLetx45' $BG_Image &= 'flglv8bFVNuBc3OPg0TUz4Bc6RQ1QWUOVHj7C6wjQhAByghcGxMRPckncUjNWfKJlxqkKsOserWQ6ziyHq84yOPvyhLEG6yYj4uExZsgn6fRj+SHpP5pEDimHDUiyCYjL4Vd8T2pYgJOXiwnARaKCl+CXO6sOee9g+ZVrx8DmV3YyBrwyyW5IUQk+9Mn4VqEWKULrivZ8OjDw6CTy+tFJPrJgnyoSr8ng0QX9Bb5Y12oECWgvolzeUmleVxysHzMeAQTZEXb/RtlHiaU7coAWeWxIOuQxERYGbwIY0wRoiEpba1DEGsSQdcapJxNqRnJs029PY50OAlBoj/6bEI+MqH3dmIdzjTJHouR6EHa4fjMzJmRF6GMyFijHM0I1QTSGSuSMivOkxR83vQMLtJMcm1mxIKgQaKLTKdRIVsukNw8tsrhKQnNaxUCB9PzuDaG9GPmsSVd8fg9TviZUxDurqP7l5r+OXPE9FCa5HCZjqk0lDBxwn3XtAcP9y1Wd6b3S8OI5PkGYQH8eQi5dp70PiPBRJhjd5xavdmSveP7eqGBX/ZYUf5St55PdVxZx9GP7m2M52Pz9F5S5CbIp2n0nwNYlSBthiQOcuHpVZkTKJEJZ6BKnFhhvLSo8UVRCRSKWiJgPft8Lh+wsrdiDvDRV6dSKSgIPRoZDkqIGgVCq3UMJExi1bMlV60D9StDJt9xm5gus+TRDx+XC8utfy4aWH9oLP2eDIID0AqDgFoinXWGUhti7bHIIQ5fSEKUtFskOFySZlsq7qEMV2gwxqP2idLcaWIwi9iloFPX7sMwIsJ98SbjETqYcvVLekSCRN6/CZEYkN5KQvrCenxi2e2NnzixBCJltFciZCrvNA2tpVoMSW8GIuSoqRmpKIwqBd1y8EH9FlBM9H1dEwwxCuLcu1Tro9Mpk4PrWuaEIDMEq9GVokSez5iQC4aQaT4nm4/J6D28r5oaw+HGM+yICfH5HhPyYRr95zhq2Y0MQGCp' $BG_Image &= 'eGlAxrioaB7FKSVuApyzKO11Tinxtq5OahYhYt6hkpw1sfp8SLrJa4e//j0JvASbMR/uBdSJsCP7JailZ2S3y6euI4UAT02GUjt1eBybm7wfj55AoU9hSShyl91+mEb/OVY+uESgxGHIlQjJGITyj3xpgIqnl+uoOduU2BAZ7bBhKyaGu/LOOozjrv3XEqANhiAYiYW0HP72LTI7L0LvMt0nB1cGQTxq/Ta+bZVMHX8Pf/nhypCHBYitSJCikA9U6bdGr8hWRoJcb7K0ebHyQ1E0pFmL1EaOEsEE37eUkdbABItLeLCtwKT2JsCeAaDxMolor8KWXZ2LBP1GguqZ8ty4jJCG1Op9qLRxvPIU27mKI0HcbfEbSkLuHdZ//4Br1z5f0Qx+PiFT060/aoT51tC6hmDrY7Crak0tbxJ8M688lMrJXNuTHi9zToYameYJQiIwOSbYZnwKBiECgJ1SihiRoCsDsjM2dmc1beiHT89dpD9PUXSfwpGbIB8VRwfK+3YRVuhpM3pGOrwrVYXJ813mR4l7wEQb7AksUiIgy6BQcyJzg+BFNvwbi9KpHaB255XlCGS1rrRq3NpESC3t5SEtXVoQJt7iYw9CkWebHJkydYFQ5rjdWJ+D//o5DrzACTKz/BsEafMcqoQlDhdqswMR18MAnrtBUItNUeAopSOjDdGbOFGQfwYbiFiLZsyHCRPz8lrVutNtqbLVqbOCKK6SwpDudci4qZiPx/pJskko4dNaHXeyyUdpdBwEqKZEzaGuHb0yM1gxIGTJNgRbB9Kr3dKSNaxAAzKPCYVt25WNVU5GKDP2AgEhavFE8GJ7gAj2Xg7pecIr3wSViH0IZYQhI0B8+N1+fNi89FujmyAQmxa/U0lexmVZYWlzZ8F3RVaZCYianvaKqlJE+oLfUphUiZBX+ZIhgg958r33z4Q7SLSiRQTJHJgIYVIWORfybxtq2YKcsXdXDJciQ15YqVieb7si6X1dFHI8bz/v' $BG_Image &= 'JxWDFIhC8zBDKBq6JoiJMbMLqdIyI/EtOTiiU+8GStwb354FN63nC5EaaUPXo+nzsEKr2ARhUYHoVrPTpbfNkm7lORRKaXgixTFVZxFiyiP96U7tfwxP8jz+kmM4Enqco4Wf5ca68efnAA6KKxFLSluT6z0Ws9cauhjKanEsvX6Q6GMK0pWjYWYK60Eh2yujFFBZlARy/FfEHKUtVVGdriZwHH3nlCS4F5BMIamuQBn9Potnea5Om6w+TT8IN7K8CfJJTiyWFfqRrp7pPXpFkH2ajjaGFEr+USpwJfIUWVESe/e+jEMh+mYUf/R77a4thjFEpkcrNEGhuzE5V2gDhuyyQy/zEZK43EOX0R8Fe5Gu4WqQMCQaPSmLEek53m6sjyHIATd2P5pNCem4W5cqPZFCG4/Flkh20N9fJmQomQgJwW3iIQypsNLvCAq9zA1/dNgUm1IJ+6WXu9qLZTEynlBo9bpnNkjmSEOttH6/rIOhxiksJZye7g3PDj38Ssr7CR/YoPcuBqFDa82DVAYNXg9GphmSOTrLJTwpvic31m6RitLGjxadzVWp8tgn7iCGJpzZwEQOUSK4An9yUF1tUsREJBromzYh2tPiG53cLPE6lE4ZNh4RIhkKbduRs7PfzxLdvz93658P0ugHAIrdb3ui0OMdrJgW5YIlv5MPeAvvMTeszRnhXvRFxcyEUuGGacNcnsKJKBA6B0LWCzOYrVsxFW1i2PSYjWZKE79qELJqL806V4Z0L2JYkLwUevgRknzkqMJ7MohlLfs4KCqx8N8Yoqp9dnLiIT6LIjaGbJ/oD/QbMQy1LgrkViaYh97jhkqgvsIYFAhQocgYBxsSRX57e6WNJGgnEQhq+T1Iuuy6Ssb2qecQA5JNVkbdJl540umfRZAbD8fRmyQ7X0iaAkFAMVm8s+EyTVIukhh4FIiKopwlb0LMgX4j9zJJfY8dokIWKNQZHqJMi1YIAnGshxoOgiS6B2GEu7iNKmzi' $BG_Image &= '10BIrKN6Z8jTq63g9vFs5ywuExJivB+P28/7QeNt0yXBYZCK8L62IEkwkUZ1lFaYUL5bWFunzL+x74oT/6iaWP2pzWiFnuPl2iIg5DZgIWF4UAHFvfGP1CbOTLeFZHXuI4FmCtczL+TMkERFY0A6+e7pGfT0SJ2M9nQ+b+pCTky5CfI51VLLqTOJfUJsyC8mZBtRlqi6yVEqKCrE6GlhXdTix6hwmETY92FCWEPMu8nkkrQf/O8GPYRBD0lavmipzQxbFchHgQ1N2N3ska7TB0gF5wYnliBu3uCp0Isdz6tQ+vFB+by3E4sAxy0qZS5OXRNkLIZqMUjUlu6eVie7jjC4EyT2QUgoJFF3yijfLxuNaBC/9SusLhRWADJTlner2wei0eERjDYZr3XXbkEybmTBocJVlm6C/HkcI9SDGJDbz/tBXUeT7sq99umaH2mMFcsxZCLLLIkP1ncWSiR3gqxDvbVmyH1qzlQa0qVQUVq2BmHfRpCxEw3EhZV91CSsj/JotIReZSTXW6zERhU7pWU9vFzl6A+rdTPkiAE5UcMzo28/76c4sZgoNGdnZfyiQWxCVruGcMKLaNlMS3/7ppthpIJS9LfpQWzREx+ynEWZRyR2j3D6tsPwd32f6Skpk3AnjOg92J7LJZFXcZB9j7X3LlWC6f1cue6e/Hz8OazTk4cVV9YHtXi/M7FgEGDkR0zIFZjfzGozZ1Dzd1taYcT3EIQhRwgwij5UYEwM9u0YtRYonWB6QI6Px4S0MNmKshFZDEr1B9JDbnilupo+55eMXi1RtPEj9YVjQDy38FKD/Ln9vB/jxBrzIQD/nz2WSowCSeUUYfmepCsmdz0kUDRIkOySHEytvfg8j/n93dNL1kmkR4RQLTXWDkrecDW8hqBeT0R6AGZLmLxD9tPFfMDWIwhLzJHlw7puYv1R3RVvJ9YPlGpCmwAffzMgTDWIalxTJkWBJGsPqE9Ab/NiKbJ97kkp/cgXkdMLCwm5' $BG_Image &= 'x188TFFw8mJBPflXkIStobvfMEu6TRjQ8kT2bl1KEJr9MSDOx4ozy9o8QqRf/EjZ1K5AvDg+iCB3W96kuFKALUBigFfwbiiDEKTK09EvqQiBz1S0r4oaMJYjBiN2ZA+HCFJAIj3k1NrRLcXn0FgsiGKY0ii02nzAOggaukisC1AMQ4S9dipIl3erkOXo7VlFgfhw+3k/pJwQgHqq7Bj5wN9Vurg1xDJjXpdigbVsiWpr9m7NMH9uQNx6jYKWIPCnjyVJ4opZZAnNvCUFoRuEvX81ItynHbDQFiiabHcnainjdXTtxIrVEpKteCq9dbJiOxJy7t5g++EwyU2Qz8A/WKBgfhD8dyKdpfKbjPCo9WNWEIQDI5xAR7rGSa3skcCiwFpWhoYv/UAlW7G2asftbyScJUg7TJ7adNsLH0wRG4yYDiiJKo7gXFWlhx5L1AiSWicLsuBs96t0rDEidyDkE/AnQXRBgFg0TINrLDqUfFQlfEjWMh1Qgs8hyJ7tnrIsmBhSLWtSp1IRFZTdmmrX835P2rdavfZWgXW6t1XdouMidu+mBnf39FK8GB30HkyHP2ST6s/xYrku/WluHE5bNDOSqnh8UKTw9vJyqrSn7ai/5Y6K/zsTYhokv1fTyJqU78RWzMfx1J69fJkseRMkSb+SP+zU+WS7WOhtMe3jOhurFQ7ZG50kPcu3U5AoXVjOGNQ3DaJO+dSWjOVoyEaQswH5X6IcN0E+ZLZU0r4FWhiMNCjVb+DKAPeiSMnqO7yIq9e39jhh+k5b9m5SPOOkNdf7HGmGVL6x903ZEfUhKOUggq3EXlSodYN+RzB+LZiSuZxtXLrOPXN+73DSx0UgJIubIB8xIP3nzYMlBiL1qwhhck2iOpjNl0qMFYmkToqTBqAYqJLkaAIxv3wPpNfWTC4kkgLEh0UoMj2SvX02U+Z22vkKuoyk/8VGxvSMb/lkfmzkMDWeFwbE57t33Kd4eTc3bwb7M5uo35BsRcv0' $BG_Image &= 'iBBuZYbzXpI0KhrEaqLEhN8lG5e0rDM9SMy4kPKLMSQhBrWjG7EiNhs9VoNQw6SIAOHku7MFkC3x2mg6x3/Q7W1a0t9Tn57Kwteowr+XYUcOH9I77vbyCockUngrlaUohzouIZ9GqFMsk4rzZ8kueQuCmyCQTBILFFm5bP86SggFqIASwUUjeinlMLCdWIzHZIYATNouAXoV74TFOwGEyjto+yeBQrK+0oc0MEcefxu+x4mVeOEu1f/cBPkULy+FfPuU7VWqza9AJZN3OXjycNqRUtwgMRaEWsAU7b5+pxgq+y2zoSDDFN40v/xzhu3H7KUa3blU6m7hd0OSBsbw2FwFgWwxFU9AD0WCVS71ysNyScjftXGmyE2QT8CfAwelRlq2zSznRYJrUHsDB9VsroZUZF6UmRINksbvlCzIx/KIomJYahfgOzem/U5kidGndHcnmQwvWlpaPGID4/ACO2Rp6DrVxGdq0E3vsl7rdxvyePylh03IyX7kdBPkU5xYB6XE7kanj8T4NZ9Xfu0VuKXKZJ0JqW+QuGW711BnwihzK8oiO6jcmFcl2B/ibFiSYlV6TOC8G/Cr1SaJS9UJjRDhMj0Xfl7tRVOGsyDhs5TuPy/n1ULcvUE2WHc676cQZO0tOsMHSiRKiRRegZHppCYTy+QaymjSxP1Z52ReijJnhhil6Jb4qfaUeGQVwkSnQAMKhJH+WMvZq0lNbABc1BCB+RNJk9B8ZUNoIgftiqvT0Nulzp23OD8XBuQmyGd0VcQhqPfhNatViP6lG8vJV5l8m5wT/xHTw0HFyscOQXy59dztVu1TRcRYjyj3zBlpC+rhQ47IzMJ1hRYITFlUytFbkvWJuI8MGbVyPZ3RADVI/YiksGNef+H+Jn2Rz/tB+e63lxcUlK7sVIrL9esWK1sr8yTWZJkSVYYiYJRICJKJhinMc6URqFgW7vobeZ4yQiFRF8hXXRkbova2Sr3kutB+MS2uDV7HQTQ2RBQU' $BG_Image &= 'xbNaN6Z3g4YmLpwyIkL2VKzPqJi6vbxYwY/G3gQRIpPN+7tK3xS5Mh2EjN/XCEMqBFHQkT9lta4Qg7Nkwh5zkbcvgbQUJSEM5IAI1ELkgxPRksNLAF3S9WStMY2JgkB6ryuUbYfLb21GLgrTP2fS7U2QRh1sQkamDubb/xvMitmY+1kTIbVTsTMJkmQENKkW1YkZMl6qrMwXhiI1hxAmAuU3gJBIYA+vA6S/yyrE3QVnnJBoiRc1tz7siS1AZo5oTEgyTuznfR7ZY0Wg24R8CkFuL2+S+DL8v0YJ/Ot0RcsOkjI/FErYqsQZBguT4ZsgbH2g88XPlHVKSD26DdPwQ2Gygn97CaHDD9sWtcalhV5vN2eHFY2+I4YylgxGAybGwnMaADlC6N9gU+p367jPmG8b7/+WCJgAx682RMw8z4zUYSkSZOOKuSMyjUc5Ul0t+4pPW6q0b/CtdTGv08roK3r0EERxxwLwZW9teom3QAjF3yejiArzGlI2b8+OBLFCn9x357cHY0FugnyAl/c4juX+3ChCi2uZIlfIlMJMi5avTIgJHKowdIkBgVKarm4NOWJU+N42LkSZV2TKNfpKkyQncUqjmD5yyHecbZZQFK9DheR0b5C55T/tlZOVXosZfrByTXY3b1T6TZAPcGIlgrxkCAc2B//azbuZicWAUpouqsIVcCX4JtNEqZuqzD8IDXYdUhxzQ5w0Oq+JkSvkFl6Ie0utWsVTWPxJLgoBWEP9QpC9TmXp+0UP9SBerKXS+xmCxIB8CEFuJ9bBRubGSNOAmuFKXSMVh/6KVwbZlkabgKFa+V0mkM4kyF4MK9wk+1Lam4fLi8QGr9Fv5xEKtiTt4CGqW8IMaiO7JU1KM3nJD1NkCJr2W4T2YLqPRozIyYx8BkFughyWpRCaEn2Rlj22DdfgeD5T85QmDsqOatR7biRQWIOdG6fcEZ7akELXuLYgympreqVWTMZssFYMRJ04yKXhTG1Ymaacj/Qf' $BG_Image &= 'p8QwFuRFkotcrPzeBPkIJ1ZzZbAikeLaEtivEepwrWdA+lCm9g7XFr2nCYV1HjZlrlQ4osouy4Q9+YHFyfBF0s99uGoEZEK0GpyeWHIoXalBtFxvScXfmhIbJrCVPrhydaZsSpbpV8Zj32TdBPmM+bagJCWETEqKU1b1K1jaq6qUJg5E5n4wRkji1ty9W1cgU2ArI0tCFy19w5SFXq9U+nkJwKfp817J5rU8MV0kFASqxEt2iF6JpNkk+O9sRQzZeKwWWUf6m7zhJsintB3lXoqtqSSf8+Rb/dpf8dTsx5SRtXmtj9LIjvBDfeZFVhmTY57GsuSQ9RmZYI40rZ5lYuXomV/YoIAIeAiyHRB0rdLTumEGsdO0SCvszg7LIsShQo9AiBkJboJ8SscGNaSxJFwQY0WuYVduTIgiYe3nGevhZVHpAZFMjYDCLEQHQUCvZhdlLOLw3BboLDtSa7sPhPa99DRpJNUdABEhv1of6TeCqBZD6D+LERqzpU2n9zHxwpiRDxLpt5f3BzgkKf2gtHUiUf1OkaiP3YCEXeXjMkQatixkIzTO25NF6FSwx4iEPu8xkd8xcQm1OgRAjEi30CPaiZgRqQmoyF+NJlerO4CM8THnZncns+NlPzo93j9xi3Xn8v7MmBmk3W2UgxzF+A0qJSaYvmo+mWE+ixmDW4akjSGkTuh4syCh/FTowVgW5RC0lO99L2mhzHawDBekuHR9A8Bb+julX/6HYKc2KsW5tlFpjb3B5SDu0Ds4bD4+yYLcubzQfH2yeaGKir64xp54ZYoYqowOZCBV2EYZPfxgSLJXgWjMR5LdQ5O8vZ44A5nuDK0XYUI0ZMviR1qxKwLVwuzgfvPxklUg/DKpIKTAMCJklab/rUnvMOQzLchNENmApCCEA8WR9duYkIQ9itlZ+RK5kQbWZSiIkze1IJjG12POLtTGIs3vgNmQabbCgjSFtxbjU4+7EDH/e98fG0IAtfTL2CEXLb6Xp3va' $BG_Image &= '7Ro4dYxKjwq5kxU/oS/vcSi7jHQwNJYC/wW7AQkVNmKRkR5T68E9DBJCpPlV5HixIPoiY6BDkbh2O2nwg5YxRYRTfS7QlDAhlPwaIEd50Si06hreS6JYAJlB0ukEkQZc0x3r8MDbEeobOz4lm/ceLnX4GyQQSirvCGz9rkFmF+YXyWKoolgTMEGV7NaUBokOpewB8306znJlpWXchBELixTxadGnAHQKCZNN0pmh1UoW77oOgxxTXx/5Wy9JUNNqj/4zQv7R6gP8TDDdm6wkY234DAtye3kPQHsgxD9mSjqVXIHk3qJ3ESVFVGdI+STqDcTenmFO9MvveL0DegPfGYKuZSsyhlD+8rf5sbWqbiGlT+PkEnVtM20ILUJG+E9herZwS4Xo2R4U8teK9HlIyIc0bbgL0n+A6HRqhtcwPW7qVyz7MrnuoZNIryNJwrdYkHRdVMgQiky5lheiQL7RghHqq71C1EwACmhqJngkXarXuiVbFft7IShRki5JdQ2K3mCBtPVw0jyBxCC3Bg7Hq8eiJxX2/zUgd0XhB6QqopFNRrQAJarSwucKSkKW1qHemaHU31Z2WXt6YjRFNkpzeMG3t2cUJuVvxbk/zxsJe7Raa5bUNOYVUv4HGxf0sjSYhu+6yvNnZs6hCNQyIDFFmEr3FU+3BVkavV1b+M6Q24J8AEEO9AS6AAY2ByPUL8EMJax9HtsiFkpYs0IUrbKghT1v90QCTAgl3/88sruGUx0cVocgUqdFdQaBDDkmQKhOyaE2qa3LSGE65AlVJmAhHNlcYA2ozbrj+fdnBrGdc03uzoofMCH9wAIxu5NCaZuAfg0m24TKd6cYpC2KkJhKNIjChSmbYq59IFI5KBuhyXfcnyyUny5tHUmXLpAjFLYgktLQREIK0s0dtWaLJEIpXTmBy3ICLABNcs9ToUVN6gr33iad9oobboJ8QEH6EQUCKgVTqPh59bsXi4kSKhRRWDIjBLEW+aST5i7una+o' $BG_Image &= 'ikL3TwxMykzSXS5gusptiTOZtDnTCdXp9SbfNTm835JfQkuXqVgxk1he3tev/ErK/PtIz+N4WoOc+PEx3d3vtqOAEmwmSUjeXSVt5HcbklEg2UnFv5s5tBWNvicr7vLcd/INj3wXCTvAxMxmsOUo2zlTJ3IleSqNbk40EEtv+Hp2XBiz0sk74forGyhdy64yPyLS2UAEvm3UKJHn4RCh54X0Fib8EAtyD5c66K0zCRQ46R3QVuFRvyDiPK1MVIkRIj3d5cjanq4Y5THYcxMpMYTxFk0llZWNqSaDOUg1ViT3WkEuV+Rwgu29Lld0fUXVaZF+BZX3jMUYOTSghF40cZVkLL5keqjx/CgNcnt5D6IlDERNbqFU/vkVe8WtTUjJIp0LykI0mQwFe/+SBP4Sd4dKog95OE/ThBKvO2V1jt0+ucl7ooMuuhXgg6Ru0BfXDEk+5m6y0g5mEiS1NbF295+0WPw4DXI7sWg/b+ZpiBnkn0zd35DQoJ/NMJ2dHpb7KaIypDNDsOT10Mnhhmh0FaZGXms1lgeSiOv8LMsM241ZqregSGccW/vevKT6BSwsgpCrfaktL6aOFxk69aLH30ihBYjnsWWT9fFz0r8f/xyW6B16SAQnZlcZGHWF8IclDrwq7XeUDN8QJDgFQNJqlBddrBP7QOUG68oOqXVeeNlA+wAL91SrOx+lHCm8FOl7x8hSDMjU8w///NlOcDlcFPI0Tk7enw+Ycnt3bDiAhqLSlTicRP4yQSdIP9G0aIg6F3cUlfr2ECSdGkzIOKZ8WKRALIPfwXob3srtbd5/R4yJkJJcYNroCoZaMzZ60fxagqQY+W0c9GR3yb/bSM8XQ3pxZMcHEOTuqmgLgsH6KmLLWv+dH2UGlbXKOf6xQ36dvViR5bk1titMLZVUqBS1nwavS6cYOjdGBAG0vFqSQ3nx4M1oXNaI7qvWimm0Gr9bK/EjiNNGroWMm3IkxMgu69sI8j/twS5+biz0fwAA' $BG_Image &= 'AABJRU5ErkJggg==' Local $bString = _WinAPI_Base64Decode($BG_Image) If @error Then Return SetError(1, 0, 0) $bString = Binary($bString) If $bSaveBinary Then Local Const $hFile = FileOpen($sSavePath & "\Neo_Matrix_800x500_cut_32c.png", 18) If @error Then Return SetError(2, 0, $bString) FileWrite($hFile, $bString) FileClose($hFile) EndIf Return $bString EndFunc ;==>_BG_Image You need The Matrix Sound.au3 which is in the Zip archive (see below) to run the code properly!
       
      Download: The Matrix v1.31 (incl. sound), without sound The Matrix v1.30
       
      Can you decipher the code?
       
    • 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
       
    • By Trax
      This is kind of a side question but it has always driven me a little crazy. A vast majority of times (as in the example below) I have windows that really only contain one value at any given time. I never want to scroll. I never want lists. if I put a value in that windows I want it to overwrite the value that is already there. After looking at all the options I have chosen a listbox. Is that really my best option?
         Anyway..... I have been trying to get things to display in color and am having fits. It might somehow relate to the above side question. I have been using Melba23's example here:
      and can't get anything to display in the windows.  Here is my code:
       
      <#region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_Icon=SRT.ico #AutoIt3Wrapper_Res_Comment= #AutoIt3Wrapper_Res_Description= #AutoIt3Wrapper_Run_Au3Stripper=n #Au3Stripper_Parameters=/so #endregion ;**** Directives created by AutoIt3Wrapper_GUI **** AutoItSetOption("MouseCoordMode", 1) ; 0=Relative to Active Window, 1=Absolute Screen 2=Relitive to Client Area AutoItSetOption("GUICloseOnESC", 1) ; Close on ESC #include-once Opt("TrayMenuMode", 1) #include <GUIConstantsEx.au3> #include <GUIListBox.au3> #include <StaticConstants.au3> #include <WindowsConstants.au3> #include <CommInterface.au3> #include <GuiListBox.au3> #include <Date.au3> #include <SQLite.au3> #include <SQLite.dll.au3> #include <File.au3> #include <GuiRichEdit.au3> #Region ### START Koda GUI section ### Form=c:\users\jimbecher\desktop\idem v2.10\koda_1.7.2.0\forms\efdeck.kxf $EFDeck = GUICreate("EF Deck Display", 755, 248, 1001, 271) $EFDAvgTemp1 = _GUICtrlRichEdit_Create ($EFDeck,"", 184, 24, 57, 19) $EFDAvgTemp2 = _GUICtrlRichEdit_Create ($EFDeck,"", 184, 112, 57, 19) $EFDAvgTemp3 = _GUICtrlRichEdit_Create ($EFDeck,"", 184, 200, 57, 19) $EFDLimit1 = _GUICtrlRichEdit_Create ($EFDeck,"", 328, 24, 57, 19) $EFDLimit2 = _GUICtrlRichEdit_Create ($EFDeck,"", 328, 112, 57, 19) $EFDLimit3 = _GUICtrlRichEdit_Create ($EFDeck,"", 328, 200, 57, 19) $EFDExceeded1 = _GUICtrlRichEdit_Create ($EFDeck,"", 528, 24, 17, 19) $EFDExceeded2 = _GUICtrlRichEdit_Create ($EFDeck,"", 529, 112, 15, 19) $EFDExceeded3 = _GUICtrlRichEdit_Create ($EFDeck,"", 528, 200, 17, 19) $EFDReadings1 = _GUICtrlRichEdit_Create ($EFDeck,"", 672, 24, 57, 19) $EFDReadings2 = _GUICtrlRichEdit_Create ($EFDeck,"", 672, 112, 57, 19) $EFDReadings3 = _GUICtrlRichEdit_Create ($EFDeck,"", 672, 192, 57, 19) $Label2 = GUICtrlCreateLabel("Limit Exceeded:", 448, 24, 79, 17) $Label1 = GUICtrlCreateLabel(" 3 Hr Avg Temp:", 104, 24, 82, 17) $Label3 = GUICtrlCreateLabel("Readings:", 616, 24, 52, 17) $Label5 = GUICtrlCreateLabel("Baghouse 1", 32, 24, 61, 17) $Label9 = GUICtrlCreateLabel("3 Hr Avg Temp:", 104, 112, 79, 17) $Label10 = GUICtrlCreateLabel("Limit Exceeded:", 448, 112, 79, 17) $Label11 = GUICtrlCreateLabel("Readings:", 616, 112, 52, 17) $Label13 = GUICtrlCreateLabel("Baghouse 2", 32, 112, 61, 17) $Label17 = GUICtrlCreateLabel("3 Hr Avg Temp:", 104, 200, 79, 17) $Label18 = GUICtrlCreateLabel("Limit Exceeded:", 440, 200, 79, 17) $Label19 = GUICtrlCreateLabel("Readings:", 616, 192, 52, 17) $Label21 = GUICtrlCreateLabel("Baghouse 3", 32, 200, 61, 17) $Label37 = GUICtrlCreateLabel("Limit: ", 296, 24, 31, 17) $Label38 = GUICtrlCreateLabel("Limit:", 296, 112, 28, 17) $Label39 = GUICtrlCreateLabel("Limit", 296, 200, 25, 17) GUISetState(@SW_SHOW) #EndRegion ### END Koda GUI section ### ColorWrite($EFDLimit1, 1 & @CRLF, -6, "", 0x000000) ColorWrite($EFDLimit2, 2 & @CRLF, -6, "", 0x000000) ColorWrite($EFDLimit3, 3 & @CRLF, -6, "", 0x000000) While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE GUIDelete() Exit EndSwitch WEnd Func ColorWrite($hWnd, $sText, $iIncrement = 0, $sAttrib = "", $iColor = -1) ; Count the @CRLFs StringReplace(_GUICtrlRichEdit_GetText($hWnd, True), @CRLF, "") Local $iLines = @extended ; Adjust the text char count to account for the @CRLFs Local $iEndPoint = _GUICtrlRichEdit_GetTextLength($hWnd, True, True) - $iLines ; Add new text _GUICtrlRichEdit_AppendText($hWnd, $sText & @CRLF) ; Select text between old and new end points _GuiCtrlRichEdit_SetSel($hWnd, $iEndPoint, -1) ; Convert colour from RGB to BGR $iColor = Hex($iColor, 6) $iColor = '0x' & StringMid($iColor, 5, 2) & StringMid($iColor, 3, 2) & StringMid($iColor, 1, 2) ; Set colour If $iColor <> -1 Then _GuiCtrlRichEdit_SetCharColor($hWnd, $iColor) ; Set size If $iIncrement <> 0 Then _GUICtrlRichEdit_ChangeFontSize($hWnd, $iIncrement) ; Set weight If $sAttrib <> "" Then _GUICtrlRichEdit_SetCharAttributes($hWnd, $sAttrib) ; Clear selection _GUICtrlRichEdit_Deselect($hWnd) EndFunc >  
    • By kcvinu
      Hi all,
      I want to show a color dialog box to user from my script. Is it possible ? I searched in help file but can't find anything related to a color dialog. 
    • By UEZ
      As already annouced in >this topic here the GUI version of the GDI+ v1.1 color effects.
       

       
      GDI+ Color Transformer.au3:
       
      ;IMPORTANT: You are not allowed to sell this code or just parts of it in a commercial project or modify it and distribute it with a different name! ;Distributing copies of the program in compiled pe format (exe) must be free of any fee! ;~ #AutoIt3Wrapper_AutoIt3Dir=c:\Program Files (x86)\AutoIt3\3.3.8.1\ ;~ #AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 #AutoIt3Wrapper_UseX64=n #AutoIt3Wrapper_Icon=Color_32x32.ico #AutoIt3Wrapper_Res_Field=CompanyName|UEZ Software Development #AutoIt3Wrapper_Res_Field=ProductName|GDI+ Color Transformer #AutoIt3Wrapper_Res_Field=ProductVersion|%AutoItVer% #AutoIt3Wrapper_Res_Fileversion=0.9.7.0 #AutoIt3Wrapper_Res_Field=Build|2016-04-23 #AutoIt3Wrapper_Res_LegalCopyright=UEZ Software Development #AutoIt3Wrapper_Res_Language=1033 #AutoIt3Wrapper_Res_Field=URL|http://www.autoitscript.com/forum/index.php?showtopic=151155 #AutoIt3Wrapper_Run_Au3Stripper=y #Au3Stripper_Parameters=/so #AutoIt3Wrapper_Run_After=del /f /q "%scriptdir%\%scriptfile%_stripped.au3" #AutoIt3Wrapper_UseUpx=n #AutoIt3Wrapper_UPX_Parameters=--best --lzma #include <Clipboard.au3> #include <Constants.au3> #include <ButtonConstants.au3> #include <EditConstants.au3> #include <GDIPlus.au3> #include <GUIConstantsEx.au3> #include <GUIMenu.au3> #include <Misc.au3> #include <SliderConstants.au3> #include <StaticConstants.au3> #include <TabConstants.au3> #include <WindowsConstants.au3> Global $iResult = _GDIPlus_Startup() If @error Then If @error = 2 Or @extended < 6 Then Global $sUrl = "http://www.winsxs.org/?OtherTech/thread-13-1-1" Global $iChoice = MsgBox(4 + 16 + 262144, "Error", _ "GDIPlus.dll v1.1 is needed to run this script properly!" & @CRLF & _ "How to use GDI+ v1.1 e.g. on WinXP: " & $sUrl & @CRLF & @CRLF & "Open site with default browser?") If $iChoice = 6 Then ShellExecute($sUrl) Exit Else Exit MsgBox(16 + 262144, "Error", "Cannot initialize GDI+", 120) Endif EndIf Global Const $ghGDIPDll = $__g_hGDIPDll DllCall("Kernel32.dll", "long", "SetProcessDEPPolicy", "long", False) ;disable DEP for this process Global $tRECTF = DllStructCreate($tagGDIPRECTF) DllStructSetData($tRECTF, "X", 0) DllStructSetData($tRECTF, "Y", 0) Global Enum $iAdjustExposure = 0, $iAdjustDensity, $iAdjustContrast, $iAdjustHighlight, $iAdjustShadow, _ ;http://msdn.microsoft.com/en-us/library/windows/desktop/ms534098(v=vs.85).aspx $iAdjustMidtone, $iAdjustWhiteSaturation, $iAdjustBlackSaturation Global Enum $iCurveChannelAll = 0, $iCurveChannelRed, $iCurveChannelGreen, $iCurveChannelBlue ;http://msdn.microsoft.com/en-us/library/windows/desktop/ms534100(v=vs.85).aspx Global $iType = $iAdjustExposure, $iChannel = $iCurveChannelAll Global $bUpdatePreview = False Global $hGUI = GUICreate("GDI+ Color Transformer by UEZ v0.9.7 build 2016-04-23", 1200, 690, -1, -1, Default, $WS_EX_TOPMOST + $WS_EX_ACCEPTFILES) GUISetFont(12, 400, 0, "Times New Roman") GUISetBkColor(0xFFFFFF, $hGUI) Global $iTab = GUICtrlCreateTab(824, 232, 369, 393, $TCS_MULTILINE, $TCS_EX_FLATSEPARATORS) Global $iSlider_BWThreshold_Default = 50, $iSlider_BlurRadius_Default = 0, $iSlider_BCBrightness_Default = 0, $iSlider_BCContrast_Default = 0, _ $iSlider_CBCyanRed_Default = 0, $iSlider_CBMagentaGreen_Default = 0, $iSlider_CBYellowBlue_Default = 0, _ $iSlider_CMRed_Default = 100, $iSlider_CMGreen_Default = 100, $iSlider_CMBlue_Default = 100, $iSlider_SharpenRadius_Default = 0, $iSlider_SharpenAmount_Default = 0, _ $iSlider_HSLLightnLevel_Default = 0, $iSlider_HSLHueLevel_Default = 0, $iSlider_HSLSatLevel_Default = 0, _ $iSlider_LevelsShadow_Default = 0, $iSlider_LevelsHighlight_Default = 100, $iSlider_LevelsMidtone_Default = 0, _ $iSlider_TintHue_Default = 0, $iSlider_TintAmount_Default = 0, _ $iSlider_GSLumRed_Default = 31, $iSlider_GSLumGreen_Default = 61, $iSlider_GSLumBlue_Default = 8 Global $GDIP__RLUM = $iSlider_GSLumRed_Default / 100, $GDIP__GLUM = $iSlider_GSLumGreen_Default / 100, $GDIP__BLUM = $iSlider_GSLumBlue_Default / 100; ; Colors luminace Global $iTabSelection = 0, $iBGDefColor = 0xFFFFFF #Region Tabs #Region B/W Global $iBW = GUICtrlCreateTabItem("Black / White") Global $iLabel_BWThreshold = GUICtrlCreateLabel("Threshold", 837, 411, 93, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) Global $iSlider_BWThreshold = GUICtrlCreateSlider(837, 443, 278, 45, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_BOTH, $TBS_ENABLESELRANGE)) GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlSetLimit(-1, 100, 0) GUICtrlSetData(-1, $iSlider_BWThreshold_Default) GUICtrlSetTip(-1, "Range is from 0 to 1") Global $hSlider_BWThreshold = GUICtrlGetHandle($iSlider_BWThreshold) Global $iInp_BWThreshold = GUICtrlCreateInput(StringFormat("%04.2f", $iSlider_BWThreshold_Default / 100), 1126, 455, 49, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER, $ES_READONLY)) #EndRegion B/W #Region Blur Global $iBlur = GUICtrlCreateTabItem("Blur") ;~ GUICtrlSetState(-1, $GUI_SHOW) Global $iCheckbox_BlurExpandEdge = GUICtrlCreateCheckbox("Expand Edge", 838, 381, 177, 25) GUICtrlSetFont(-1, 12, 400, 0, "Arial") GUICtrlSetTip(-1, "If set, the bitmap expands by an amount equal to the radius so that it can have soft edges." & @CRLF & _ "the bitmap remains the same size and the soft edges are clipped.") Global $iLabel_BlurRadius = GUICtrlCreateLabel("Radius", 838, 445, 64, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) Global $iSlider_BlurRadius = GUICtrlCreateSlider(838, 477, 278, 45, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_BOTH, $TBS_ENABLESELRANGE)) GUICtrlSetLimit(-1, 255, 0) GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlSetTip(-1, "Range is from 0 to 255") GUICtrlSetData(-1, $iSlider_BlurRadius_Default) Global $hSlider_BlurRadius = GUICtrlGetHandle($iSlider_BlurRadius) Global $iInp_BlurRadius = GUICtrlCreateInput($iSlider_BlurRadius_Default, 1126, 489, 49, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER, $ES_READONLY)) #EndRegion Blur #Region BC Global $iBC = GUICtrlCreateTabItem("Brightness / Contrast") Global $iLabel_BCBrightness = GUICtrlCreateLabel("Brightness", 838, 377, 99, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) Global $iSlider_BCBrightness = GUICtrlCreateSlider(838, 409, 278, 45, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_BOTH, $TBS_ENABLESELRANGE)) GUICtrlSetLimit(-1, 255, -255) GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlSetTip(-1, "Range is from -255 to 255") GUICtrlSetData(-1, $iSlider_BCBrightness_Default) Global $hSlider_BCBrightness = GUICtrlGetHandle($iSlider_BCBrightness) Global $iInp_BCBrightness = GUICtrlCreateInput($iSlider_BCBrightness_Default, 1126, 421, 49, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER, $ES_READONLY)) Global $iLabel_BCContrast = GUICtrlCreateLabel("Contrast", 838, 504, 80, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) Global $iSlider_BCContrast = GUICtrlCreateSlider(838, 541, 278, 45, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_BOTH, $TBS_ENABLESELRANGE)) GUICtrlSetLimit(-1, 100, -100) GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlSetTip(-1, "Range is from -100 to 100") GUICtrlSetData(-1, $iSlider_BCContrast_Default) Global $hSlider_BCContrast = GUICtrlGetHandle($iSlider_BCContrast) Global $iInp_BCContrast = GUICtrlCreateInput($iSlider_BCContrast_Default, 1126, 553, 49, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER, $ES_READONLY)) #EndRegion BC #Region CB Global $iCB = GUICtrlCreateTabItem("Color Balance") Global $iLabel_CBCyanRed = GUICtrlCreateLabel("Cyan Red", 838, 355, 87, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) Global $iSlider_CBCyanRed = GUICtrlCreateSlider(838, 387, 278, 45, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_BOTH, $TBS_ENABLESELRANGE)) GUICtrlSetLimit(-1, 100, -100) GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlSetData(-1, $iSlider_CBCyanRed_Default) GUICtrlSetTip(-1, "Range is from -100 to 100") Global $hSlider_CBCyanRed = GUICtrlGetHandle($iSlider_CBCyanRed) Global $iInp_CBCyanRed = GUICtrlCreateInput($iSlider_CBCyanRed_Default, 1126, 399, 49, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER, $ES_READONLY)) Global $iLabel_CBMagentaGreen = GUICtrlCreateLabel("Magenta Green", 838, 445, 139, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) Global $iSlider_CBMagentaGreen = GUICtrlCreateSlider(838, 477, 278, 45, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_BOTH, $TBS_ENABLESELRANGE)) GUICtrlSetLimit(-1, 100, -100) GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlSetData(-1, $iSlider_CBMagentaGreen_Default) GUICtrlSetTip(-1, "Range is from -100 to 100") Global $hSlider_CBMagentaGreen = GUICtrlGetHandle($iSlider_CBMagentaGreen) Global $iInp_CBMagentaGreen = GUICtrlCreateInput($iSlider_CBMagentaGreen_Default, 1126, 489, 49, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER, $ES_READONLY)) Global $iLabel_CBYellowBlue = GUICtrlCreateLabel("Yellow Blue", 838, 535, 107, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) Global $iSlider_CBYellowBlue = GUICtrlCreateSlider(838, 567, 278, 45, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_BOTH, $TBS_ENABLESELRANGE)) GUICtrlSetLimit(-1, 100, -100) GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlSetData(-1, $iSlider_CBYellowBlue_Default) GUICtrlSetTip(-1, "Range is from -100 to 100") Global $hSlider_CBYellowBlue = GUICtrlGetHandle($iSlider_CBYellowBlue) Global $iInp_CBYellowBlue = GUICtrlCreateInput($iSlider_CBYellowBlue_Default, 1126, 579, 49, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER, $ES_READONLY)) #EndRegion CB #Region CC Global $iCC = GUICtrlCreateTabItem("Color Curve") Global $iLabel_CCCurveAdjust = GUICtrlCreateLabel("Curve Adjustments", 838, 355, 171, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlCreateGroup("", 0, 0, 0, 0) Global $iRadio_CCExposure = GUICtrlCreateRadio("Exposure", 837, 387, 73, 17) GUICtrlSetFont(-1, 8, 400, 0, "Arial") GUICtrlSetState(-1, $GUI_CHECKED) Global $iRadio_CCDensity = GUICtrlCreateRadio("Density", 927, 387, 73, 17) GUICtrlSetFont(-1, 8, 400, 0, "Arial") Global $iRadio_CCContrast = GUICtrlCreateRadio("Contrast", 1017, 387, 73, 17) GUICtrlSetFont(-1, 8, 400, 0, "Arial") Global $iRadio_CCHighlight = GUICtrlCreateRadio("Highlight", 1107, 387, 65, 17) GUICtrlSetFont(-1, 8, 400, 0, "Arial") Global $iRadio_CCShadow = GUICtrlCreateRadio("Shadow", 837, 411, 73, 17) GUICtrlSetFont(-1, 8, 400, 0, "Arial") Global $iRadio_CCMidtone = GUICtrlCreateRadio("Midtone", 927, 411, 73, 17) GUICtrlSetFont(-1, 8, 400, 0, "Arial") Global $iRadio_CCWhiteSaturation = GUICtrlCreateRadio("White Satur.", 1017, 411, 81, 17) GUICtrlSetFont(-1, 8, 400, 0, "Arial") Global $iRadio_CCBlackSaturation = GUICtrlCreateRadio("Black Satur.", 1107, 411, 73, 17) GUICtrlSetFont(-1, 8, 400, 0, "Arial") Global $iLabel_CCCurveChannel = GUICtrlCreateLabel("Curve Channel", 838, 445, 132, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlCreateGroup("", -99, -99, 1, 1) GUICtrlCreateGroup("", 0, 0, 0, 0) Global $iRadio_CCCurveAllChannel = GUICtrlCreateRadio("All Channel", 837, 477, 73, 17) GUICtrlSetFont(-1, 8, 400, 0, "Arial") GUICtrlSetState(-1, $GUI_CHECKED) Global $iRadio_CCCurveRed = GUICtrlCreateRadio("Red", 927, 477, 73, 17) GUICtrlSetFont(-1, 8, 400, 0, "Arial") Global $iRadio_CCCurveGreen = GUICtrlCreateRadio("Green", 1017, 477, 73, 17) GUICtrlSetFont(-1, 8, 400, 0, "Arial") Global $iRadio_CCCurveBlue = GUICtrlCreateRadio("Blue", 1107, 477, 65, 17) GUICtrlSetFont(-1, 8, 400, 0, "Arial") GUICtrlCreateGroup("", -99, -99, 1, 1) Global $iLabel_CCValue = GUICtrlCreateLabel("Value", 838, 535, 54, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) Global $iSlider_CCValue = GUICtrlCreateSlider(838, 567, 278, 45, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_BOTH, $TBS_ENABLESELRANGE)) GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlSetLimit(-1, 255, -255) GUICtrlSetData(-1, 0) GUICtrlSetTip(-1, "Range is from -255 to 255") Global $hSlider_CCValue = GUICtrlGetHandle($iSlider_CCValue) Global $iInp_CCValue = GUICtrlCreateInput(0, 1126, 579, 49, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER, $ES_READONLY)) #EndRegion CC #Region CLUT Global $iCL = GUICtrlCreateTabItem("Color LUT") Global $iLabel_CLUT = GUICtrlCreateLabel("Coming soon!", 838, 425, 340, 60) GUICtrlSetFont(-1, 34, 400, 0, "Arial Black", 4) GUICtrlSetBkColor(-1, 0xFFFFFF) #EndRegion CLUT #Region CM Global $iCM = GUICtrlCreateTabItem("Color Matrix") Global $iLabel_CMRed = GUICtrlCreateLabel("Red", 838, 355, 38, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) Global $iSlider_CMRed = GUICtrlCreateSlider(838, 387, 278, 45, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_BOTH, $TBS_ENABLESELRANGE)) GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlSetLimit(-1, 100, 0) GUICtrlSetData(-1, $iSlider_CMRed_Default) GUICtrlSetTip(-1, "Range is from 0 to 1") Global $hSlider_CMRed = GUICtrlGetHandle($iSlider_CMRed) Global $iInp_CMRed = GUICtrlCreateInput(StringFormat("%04.2f", $iSlider_CMRed_Default / 100), 1126, 399, 49, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER, $ES_READONLY)) Global $iLabel_CMGreen = GUICtrlCreateLabel("Green", 838, 445, 57, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) Global $iSlider_CMGreen = GUICtrlCreateSlider(838, 477, 278, 45, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_BOTH, $TBS_ENABLESELRANGE)) GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlSetLimit(-1, 100, 0) GUICtrlSetData(-1, $iSlider_CMGreen_Default) GUICtrlSetTip(-1, "Range is from 0 to 1") Global $hSlider_CMGreen = GUICtrlGetHandle($iSlider_CMGreen) Global $iInp_CMGreen = GUICtrlCreateInput(StringFormat("%04.2f", $iSlider_CMGreen_Default / 100), 1126, 489, 49, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER, $ES_READONLY)) Global $iLabel_CMBlue = GUICtrlCreateLabel("Blue", 838, 535, 43, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) Global $iSlider_CMBlue = GUICtrlCreateSlider(838, 567, 278, 45, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_BOTH, $TBS_ENABLESELRANGE)) GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlSetLimit(-1, 100, 0) GUICtrlSetData(-1, $iSlider_CMBlue_Default) GUICtrlSetTip(-1, "Range is from 0 to 1") Global $hSlider_CMBlue = GUICtrlGetHandle($iSlider_CMBlue) Global $iInp_CMBlue = GUICtrlCreateInput(StringFormat("%04.2f", $iSlider_CMBlue_Default / 100), 1126, 579, 49, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER, $ES_READONLY)) #EndRegion CM #Region Greyscale Global $iGreyscale = GUICtrlCreateTabItem("Greyscale") Global $iLabel_GSLumRed = GUICtrlCreateLabel("Luminance Red", 838, 355, 138, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) Global $iSlider_GSLumRed = GUICtrlCreateSlider(838, 387, 278, 45, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_BOTH, $TBS_ENABLESELRANGE)) GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlSetLimit(-1, 100, 0) GUICtrlSetData(-1, $iSlider_GSLumRed_Default) GUICtrlSetTip(-1, "Range is from 0 to 1") Global $hSlider_GSLumRed = GUICtrlGetHandle($iSlider_GSLumRed) Global $iInp_GSLumRed = GUICtrlCreateInput(StringFormat("%04.2f", $iSlider_GSLumRed_Default / 100), 1126, 399, 49, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER, $ES_READONLY)) Global $iLabel_GSLumGreen = GUICtrlCreateLabel("Luminance Green", 838, 445, 157, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) Global $iSlider_GSLumGreen = GUICtrlCreateSlider(838, 477, 278, 45, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_BOTH, $TBS_ENABLESELRANGE)) GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlSetLimit(-1, 100, 0) GUICtrlSetData(-1, $iSlider_GSLumGreen_Default) GUICtrlSetTip(-1, "Range is from 0 to 1") Global $hSlider_GSLumGreen = GUICtrlGetHandle($iSlider_GSLumGreen) Global $iInp_GSLumGreen = GUICtrlCreateInput(StringFormat("%04.2f", $iSlider_GSLumGreen_Default / 100), 1126, 489, 49, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER, $ES_READONLY)) Global $iLabel_GSLumBlue = GUICtrlCreateLabel("Luminance Blue", 838, 535, 143, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) Global $iSlider_GSLumBlue = GUICtrlCreateSlider(838, 567, 278, 45, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_BOTH, $TBS_ENABLESELRANGE)) GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlSetLimit(-1, 100, 0) GUICtrlSetData(-1, $iSlider_GSLumBlue_Default) GUICtrlSetTip(-1, "Range is from 0 to 1") Global $hSlider_GSLumBlue = GUICtrlGetHandle($iSlider_GSLumBlue) Global $iInp_GSLumBlue = GUICtrlCreateInput(StringFormat("%04.2f", $iSlider_GSLumBlue_Default / 100), 1126, 579, 49, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER, $ES_READONLY)) #EndRegion Greyscale #Region HSL Global $iHSL = GUICtrlCreateTabItem("Hue / Sat. / Lightn.") Global $iLabel_HSLHueLevel = GUICtrlCreateLabel("Hue Level", 838, 355, 92, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) Global $iSlider_HSLHueLevel = GUICtrlCreateSlider(838, 387, 278, 45, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_BOTH, $TBS_ENABLESELRANGE)) GUICtrlSetLimit(-1, 180, -180) GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlSetData(-1, $iSlider_HSLHueLevel_Default) GUICtrlSetTip(-1, "Range is from -180 to 180") Global $hSlider_HSLHueLevel = GUICtrlGetHandle($iSlider_HSLHueLevel) Global $iInp_HSLHueLevel = GUICtrlCreateInput($iSlider_HSLHueLevel_Default, 1126, 399, 49, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER, $ES_READONLY)) Global $iLabel_HSLSatLevel = GUICtrlCreateLabel("Saturation Level", 838, 445, 150, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) Global $iSlider_HSLSatLevel = GUICtrlCreateSlider(838, 477, 278, 45, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_BOTH, $TBS_ENABLESELRANGE)) GUICtrlSetLimit(-1, 100, -100) GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlSetData(-1, $iSlider_HSLSatLevel_Default) GUICtrlSetTip(-1, "Range is from -100 to 100") Global $hSlider_HSLSatLevel = GUICtrlGetHandle($iSlider_HSLSatLevel) Global $iInp_HSLSatLevel = GUICtrlCreateInput($iSlider_HSLSatLevel_Default, 1126, 489, 49, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER, $ES_READONLY)) Global $iLabel_HSLLightnLevel = GUICtrlCreateLabel("Lightness Level", 838, 535, 144, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) Global $iSlider_HSLLightnLevel = GUICtrlCreateSlider(838, 567, 278, 45, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_BOTH, $TBS_ENABLESELRANGE)) GUICtrlSetLimit(-1, 100, -100) GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlSetLimit(-1, 100, -100) GUICtrlSetData(-1, $iSlider_HSLLightnLevel_Default) GUICtrlSetTip(-1, "Range is from -100 to 100") Global $hSlider_HSLLightnLevel = GUICtrlGetHandle($iSlider_HSLLightnLevel) Global $iInp_HSLLightnLevel = GUICtrlCreateInput($iSlider_HSLLightnLevel_Default, 1126, 579, 49, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER, $ES_READONLY)) #EndRegion HSL #Region Levels Global $iLevels = GUICtrlCreateTabItem("Levels") Global $iLabel_LevelsHighlight = GUICtrlCreateLabel("Highlight", 838, 355, 83, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) Global $iSlider_LevelsHighlight = GUICtrlCreateSlider(838, 387, 278, 45, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_BOTH, $TBS_ENABLESELRANGE)) GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlSetLimit(-1, 100, 0) GUICtrlSetData(-1, $iSlider_LevelsHighlight_Default) GUICtrlSetTip(-1, "Range is from 0 to 100") Global $hSlider_LevelsHighlight = GUICtrlGetHandle($iSlider_LevelsHighlight) Global $iInp_LevelsHighlight = GUICtrlCreateInput($iSlider_LevelsHighlight_Default, 1126, 399, 49, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER, $ES_READONLY)) Global $iLabel_LevelsMidtone = GUICtrlCreateLabel("Midtone", 838, 445, 75, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) Global $iSlider_LevelsMidtone = GUICtrlCreateSlider(838, 477, 278, 45, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_BOTH, $TBS_ENABLESELRANGE)) GUICtrlSetLimit(-1, 100, -100) GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlSetLimit(-1, 100, -100) GUICtrlSetData(-1, $iSlider_LevelsMidtone_Default) GUICtrlSetTip(-1, "Range is from -100 to 100") Global $hSlider_LevelsMidtone = GUICtrlGetHandle($iSlider_LevelsMidtone) Global $iInp_LevelsMidtone = GUICtrlCreateInput($iSlider_LevelsMidtone_Default, 1126, 489, 49, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER, $ES_READONLY)) Global $iLabel_LevelsShadow = GUICtrlCreateLabel("Shadow", 838, 535, 75, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) Global $iSlider_LevelsShadow = GUICtrlCreateSlider(838, 567, 278, 45, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_BOTH, $TBS_ENABLESELRANGE)) GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlSetLimit(-1, 100, 0) GUICtrlSetData(-1, $iSlider_LevelsShadow_Default) GUICtrlSetTip(-1, "Range is from 0 to 100") Global $hSlider_LevelsShadow = GUICtrlGetHandle($iSlider_LevelsShadow) Global $iInp_LevelsShadow = GUICtrlCreateInput($iSlider_LevelsShadow_Default, 1126, 579, 49, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER, $ES_READONLY)) #EndRegion Levels #Region Negative Global $iNegative = GUICtrlCreateTabItem("Negative") Global $iLabel_Negative = GUICtrlCreateLabel("Nothing to configure", 838, 445, 340, 60) GUICtrlSetFont(-1, 23, 400, 0, "Arial Black", 4) GUICtrlSetBkColor(-1, 0xFFFFFF) #EndRegion Negative #Region Sharpen Global $iSharpen = GUICtrlCreateTabItem("Sharpen") Global $iLabel_SharpenRadius = GUICtrlCreateLabel("Radius", 838, 377, 64, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) Global $iSlider_SharpenRadius = GUICtrlCreateSlider(838, 409, 278, 45, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_BOTH, $TBS_ENABLESELRANGE)) GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlSetLimit(-1, 255, 0) GUICtrlSetData(-1, $iSlider_SharpenRadius_Default) GUICtrlSetTip(-1, "Range is from 0 to 255") Global $hSlider_SharpenRadius = GUICtrlGetHandle($iSlider_SharpenRadius) Global $iInp_SharpenRadius = GUICtrlCreateInput($iSlider_SharpenRadius_Default, 1126, 421, 49, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER, $ES_READONLY)) Global $iLabelSharpenAmount = GUICtrlCreateLabel("Amount", 838, 504, 72, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) Global $iSlider_SharpenAmount = GUICtrlCreateSlider(838, 541, 278, 45, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_BOTH, $TBS_ENABLESELRANGE)) GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlSetLimit(-1, 100, 0) GUICtrlSetData(-1, $iSlider_SharpenAmount_Default) GUICtrlSetTip(-1, "Range is from 0 to 100") Global $hSlider_SharpenAmount = GUICtrlGetHandle($iSlider_SharpenAmount) Global $iInp_SharpenAmount = GUICtrlCreateInput($iSlider_SharpenAmount_Default, 1126, 553, 49, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER, $ES_READONLY)) #EndRegion Sharpen #Region Tint Global $iTint = GUICtrlCreateTabItem("Tint") ;~ GUICtrlSetState(-1, $GUI_SHOW) Global $iLabel_TintHue = GUICtrlCreateLabel("Hue", 838, 377, 39, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) Global $iSlider_TintHue = GUICtrlCreateSlider(838, 409, 278, 45, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_BOTH, $TBS_ENABLESELRANGE)) GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlSetLimit(-1, 180, -180) GUICtrlSetData(-1, $iSlider_TintHue_Default) GUICtrlSetTip(-1, "Range is from -180 to 180") Global $hSlider_TintHue = GUICtrlGetHandle($iSlider_TintHue) Global $iInp_TintHue = GUICtrlCreateInput($iSlider_TintHue_Default, 1126, 421, 49, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER, $ES_READONLY)) Global $iLabel_TintAmount = GUICtrlCreateLabel("Amount", 838, 504, 72, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) Global $iSlider_TintAmount = GUICtrlCreateSlider(838, 541, 278, 45, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_BOTH, $TBS_ENABLESELRANGE)) GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlSetLimit(-1, 100, -100) GUICtrlSetData(-1, $iSlider_TintAmount_Default) GUICtrlSetTip(-1, "Range is from -100 to 100") Global $hSlider_TintAmount = GUICtrlGetHandle($iSlider_TintAmount) Global $iInp_TintAmount = GUICtrlCreateInput($iSlider_TintAmount_Default, 1126, 553, 49, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER, $ES_READONLY)) #EndRegion Tint GUICtrlCreateTabItem("") #EndRegion Tabs ;~ Global Const $STM_SETIMAGE = 0x0172; $IMAGE_BITMAP = 0 Global $hTmp = _GDIPlus_BitmapCreateFromMemory(_Logo(), True) Global $iPicLogo = GUICtrlCreatePic("", 8, 8, 1184, 196, BitOR($SS_CENTERIMAGE, $GUI_SS_DEFAULT_PIC, $WS_BORDER)) Global $hB = GUICtrlSendMsg($iPicLogo, $STM_SETIMAGE, $IMAGE_BITMAP, $hTmp) If $hB Then _WinAPI_DeleteObject($hB) _WinAPI_DeleteObject($hTmp) Global $iW_Prev = 800, $iH_Prev = 450 Global $iPicPreview = GUICtrlCreatePic("", 8, 232, $iW_Prev, $iH_Prev, BitOR($GUI_SS_DEFAULT_PIC, $WS_BORDER, $SS_CENTERIMAGE)) Global $hPicPreview = GUICtrlGetHandle($iPicPreview) Global $iBtnSave = GUICtrlCreateButton("&Save Image", 1117, 634, 75, 49, $BS_MULTILINE) GUICtrlSetState(-1, $GUI_DISABLE) GUICtrlSetTip(-1, "Press right mouse buttom to copy image to clipboard") Global $iBtnLoad = GUICtrlCreateButton("&Load Image", 1036, 634, 75, 49, $BS_MULTILINE) Global $iBtnApply = GUICtrlCreateButton("&Apply Effect", 825, 634, 75, 49, $BS_MULTILINE) GUICtrlSetState(-1, $GUI_DISABLE) Global $iBtnUndo = GUICtrlCreateButton("&Undo Effect", 905, 634, 75, 49, $BS_MULTILINE) GUICtrlSetState(-1, $GUI_DISABLE) Global $iLabelImg = GUICtrlCreateLabel(" Image Info:", 8, 214, 68, 16) GUICtrlSetFont(-1, 10, 400, 0, "Times New Roman", 4) GUICtrlSetColor(-1, 0xF0F0F0) GUICtrlSetBkColor(-1, 0x0) Global $i, $j = 89, $k = 256 For $i = 0 To 731 ;76 + 732 GUICtrlCreateLabel("", 76 + $i, 214, 1, 16) GUICtrlSetBkColor(-1, 0x10000 * Int($j * $i / $k) + 0x100 * Int($j * $i / $k) + Int($j * $i / $k)) Next Global $iLabelImgInfo = GUICtrlCreateLabel(" no image loaded", 76, 214, 732, 16) GUICtrlSetFont(-1, 10, 400, 0, "Times New Roman", 5) GUICtrlSetColor(-1, 0xB0F0B0) GUICtrlSetBkColor(-1, -2) Global $iLabel_BgColor = GUICtrlCreateLabel("Bg Color", 984, 634, 47, 19) GUICtrlSetFont(-1, 9, 400, 0, "Times New Roman") GUICtrlSetBkColor(-1, -2) Global $iBtnBgColor = GUICtrlCreateButton("", 992, 654, 32, 28, $WS_BORDER) GUICtrlSetBkColor(-1, $iBGDefColor) GUICtrlSetTip(-1, "Change image background color (used also for save format)." & @CRLF & "PNG file format is excluded by background color") Global Enum $iReset = 0x400, $iClipboard Global $hQMenu = _GUICtrlMenu_CreatePopup() _GUICtrlMenu_InsertMenuItem($hQMenu, 0, "Reset to default", $iReset) $hTmp = _GDIPlus_BitmapCreateFromMemory(Reset_Icon()) Global $hBmp_Reset = _GDIPlus_Convert2HBitmap($hTmp, $COLOR_MENU) _GUICtrlMenu_SetItemBmp($hQMenu, 0, $hBmp_Reset) _GDIPlus_BitmapDispose($hTmp) Global $hQMenu2 = _GUICtrlMenu_CreatePopup() _GUICtrlMenu_InsertMenuItem($hQMenu2, 0, "Copy image to clipboard", $iClipboard) Global $hBmp_Clipboard = _GDIPlus_BitmapCreateFromMemory(_Clipboard(), True) _GUICtrlMenu_SetItemBmp($hQMenu2, 0, $hBmp_Clipboard) GUISetState(@SW_SHOW) Global $hDLL_GDI32 = DllOpen("gdi32.dll") Global $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $iW_Prev, "int", $iH_Prev, "int", 0, "int", $GDIP_PXF32ARGB, "ptr", 0, "int*", 0) Global $hHBitmap_Preview = _GDIPlus_BitmapCreateHBITMAPFromBitmap($aResult[6]) _GDIPlus_BitmapDispose($aResult[6]) Global $hDC = _WinAPI_GetWindowDC($hPicPreview) Global $hDC_backbuffer = _WinAPI_CreateCompatibleDC($hDC) Global $DC_obj = _WinAPI_SelectObject($hDC_backbuffer, $hHBitmap_Preview) Global $hGraphic = _GDIPlus_GraphicsCreateFromHDC($hDC_backbuffer) _GDIPlus_GraphicsClear($hGraphic, 0xFF000000 + $iBGDefColor) Global $tGUID = DllStructCreate($tagGUID) Global $hImage = 0, $hImage_tmp, $hBmp_Preview = 0, $hBmp_tmp = 0, $hBmp_Save = 0, $hBmp_Save_1bpp = 0, $hCtx_tmp, $hBmp_Undo, $hBmp_Empty, _ $iWidth, $iHeight, $aPixelFormat, $aImageRawFormat, $hEffect, $aAnim, $sPrefix, $sFile, $iBGColor = $iBGDefColor, _ $bDnD = False, $bStart = False, $bDrawFX = False, $t, $iOld GUIRegisterMsg($WM_HSCROLL, "WM_HSCROLL") GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY") GUIRegisterMsg($WM_PAINT, "WM_PAINT") GUIRegisterMsg($WM_DROPFILES, "WM_DROPFILES") GUIRegisterMsg($WM_CONTEXTMENU, "WM_CONTEXTMENU") GUIRegisterMsg($WM_COMMAND, "WM_COMMAND") While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE GUIRegisterMsg($WM_HSCROLL, "") GUIRegisterMsg($WM_NOTIFY, "") GUIRegisterMsg($WM_PAINT, "") GUIRegisterMsg($WM_DROPFILES, "") GUIRegisterMsg($WM_CONTEXTMENU, "") GUIRegisterMsg($WM_COMMAND, "") If $hBmp_tmp Then _GDIPlus_GraphicsDispose($hCtx_tmp) _GDIPlus_BitmapDispose($hBmp_tmp) EndIf _WinAPI_DeleteObject($hBmp_Reset) _WinAPI_DeleteObject($hBmp_Clipboard) _GDIPlus_GraphicsDispose($hGraphic) _WinAPI_SelectObject($hDC_backbuffer, $DC_obj) _WinAPI_DeleteObject($hHBitmap_Preview) _WinAPI_ReleaseDC($hPicPreview, $hDC) _WinAPI_DeleteDC($hDC) If $hImage Then _GDIPlus_ImageDispose($hImage) GUIDelete() _GDIPlus_Shutdown() DllClose($hDLL_GDI32) Exit Case $iBtnApply If $hBmp_Undo Then _GDIPlus_BitmapDispose($hBmp_Undo) $hBmp_Undo = _GDIPlus_ImageClone($hImage) Switch $iTabSelection Case 0 _GDIPlus_BlackAndWhite($hImage, $hCtx_tmp, GUICtrlRead($iInp_BWThreshold), False) Case 7 _GDIPlus_Greyscale($hImage, $hCtx_tmp, False) EndSwitch _GDIPlus_BitmapDispose($hImage) $hImage = _GDIPlus_ImageClone($hBmp_tmp) $bUpdatePreview = True GUICtrlSetState($iBtnUndo, $GUI_ENABLE) GUICtrlSetState($iBtnSave, $GUI_ENABLE) ResetSettings() Case $iBtnUndo _GDIPlus_BitmapDispose($hImage) $hImage = _GDIPlus_ImageClone($hBmp_Undo) If $hBmp_tmp Then _GDIPlus_GraphicsDispose($hCtx_tmp) _GDIPlus_BitmapDispose($hBmp_tmp) EndIf $hBmp_tmp = _GDIPlus_ImageClone($hImage) $hCtx_tmp = _GDIPlus_ImageGetGraphicsContext($hBmp_tmp) $bUpdatePreview = True Case $iBtnBgColor $t = $iBGColor $iBGColor = _ChooseColor(2, 0xFF0000, 2, $hGUI) If @error Then $iBGColor = $t _GDIPlus_GraphicsClear($hGraphic, 0xFF000000 + $iBGColor) GUICtrlSetBkColor($iBtnBgColor, $iBGColor) $bUpdatePreview = True Case $iBtnLoad If Not $bDnD Then $sFile = FileOpenDialog("Load an image", "", "Images (*.jpg;*.bmp;*.png;*.gif;*.tif)|All (*.*)", 3, "", $hGUI) If @error Then ContinueLoop EndIf If $hImage Then _GDIPlus_ImageDispose($hImage) $hImage = _GDIPlus_ImageLoadFromFile($sFile) If Not $hImage Then ContinueLoop $iWidth = _GDIPlus_ImageGetWidth($hImage) $iHeight = _GDIPlus_ImageGetHeight($hImage) $aAnim = DllCall($ghGDIPDll, "uint", "GdipImageGetFrameDimensionsCount", "handle", $hImage, "int*", 0) DllCall($ghGDIPDll, "uint", "GdipImageGetFrameDimensionsList", "handle", $hImage, "struct*", $tGUID, "int", $aAnim[2]) $aAnim = DllCall($ghGDIPDll, "uint", "GdipImageGetFrameCount", "handle", $hImage, "struct*", $tGUID, "uint*", 0) $aPixelFormat = _GDIPlus_ImageGetPixelFormat($hImage) $aImageRawFormat = _GDIPlus_ImageGetRawFormat($hImage) $sPrefix = "" If $aAnim[3] > 1 Then $sPrefix = "animated " ;~ CopyImage2Gfx($hImage, $hGraphic, $hDC, $hDC_backbuffer, $iWidth, $iHeight) GUICtrlSetData($iLabelImgInfo, StringRegExpReplace($sFile, ".*\\(.*)", "$1") & ", " & $sPrefix & $aImageRawFormat[1] & ", " & $iWidth & "x" & $iHeight & ", " & $aPixelFormat[1] & ", " & Round(FileGetSize($sFile) / 1024, 2) & " kb") $bDnD = False $bStart = True $bUpdatePreview = True DllStructSetData($tRECTF, "Width", $iWidth) DllStructSetData($tRECTF, "Height", $iHeight) If $hBmp_tmp Then _GDIPlus_GraphicsDispose($hCtx_tmp) _GDIPlus_BitmapDispose($hBmp_tmp) EndIf $hBmp_tmp = _GDIPlus_ImageClone($hImage) $hCtx_tmp = _GDIPlus_ImageGetGraphicsContext($hBmp_tmp) GUICtrlSetState($iBtnApply, $GUI_ENABLE) If $hBmp_Undo Then _GDIPlus_BitmapDispose($hBmp_Undo) $hBmp_Undo = _GDIPlus_ImageClone($hImage) If $hBmp_Empty Then _GDIPlus_BitmapDispose($hBmp_Empty) $hBmp_Empty = _GDIPlus_BitmapCreateFromScan0($iWidth, $iHeight) $iOld = $iTabSelection For $iTabSelection = 0 To 12 ResetSettings() Next $iTabSelection = $iOld Case $iBtnSave $sFile = FileSaveDialog("Save Image", "", "Image (*.png;*.jpg;*.bmp;*.gif;*.tif)", 2, "", $hGUI) If @error Then ContinueLoop If $hBmp_tmp Then _GDIPlus_GraphicsDispose($hCtx_tmp) _GDIPlus_BitmapDispose($hBmp_tmp) EndIf $hBmp_tmp = _GDIPlus_ImageClone($hBmp_Empty) $hCtx_tmp = _GDIPlus_ImageGetGraphicsContext($hBmp_tmp) DllCall($ghGDIPDll, "uint", "GdipSetInterpolationMode", "handle", $hCtx_tmp, "int", 7) Switch $iTabSelection Case 0 ;Black & White DllCall($ghGDIPDll, "uint", "GdipSetInterpolationMode", "handle", $hCtx_tmp, "int", 5) _GDIPlus_BlackAndWhite($hImage, $hCtx_tmp, GUICtrlRead($iInp_BWThreshold), False) Case 1 ;Blur $hEffect = _GDIPlus_EffectCreateBlur(GUICtrlRead($iInp_BlurRadius), BitAND(GUICtrlRead($iCheckbox_BlurExpandEdge), $GUI_CHECKED)) Case 2 ;Brightness / Contrast $hEffect = _GDIPlus_EffectCreateBrightnessContrast(GUICtrlRead($iInp_BCBrightness), GUICtrlRead($iInp_BCContrast)) Case 3 ;Color Balance $hEffect = _GDIPlus_EffectCreateColorBalance(GUICtrlRead($iInp_CBCyanRed), GUICtrlRead($iInp_CBMagentaGreen), GUICtrlRead($iInp_CBYellowBlue)) Case 4 ;Color Curve $hEffect = _GDIPlus_EffectCreateColorCurve($iType, $iChannel, GUICtrlRead($iInp_CCValue)) Case 5 ;Color LUT Case 6 ;Color Matrix Local $tColorMatrix = DllStructCreate($tagGDIPCOLORMATRIX) DllStructSetData($tColorMatrix, "m", GUICtrlRead($iInp_CMRed), 1) DllStructSetData($tColorMatrix, "m", GUICtrlRead($iInp_CMGreen), 7) DllStructSetData($tColorMatrix, "m", GUICtrlRead($iInp_CMBlue), 13) DllStructSetData($tColorMatrix, "m", 1, 19) DllStructSetData($tColorMatrix, "m", 1, 25) $hEffect = _GDIPlus_EffectCreateColorMatrix($tColorMatrix) Case 7 ;Greyscale _GDIPlus_Greyscale($hImage, $hCtx_tmp, False) Case 8 ;Hue / Saturation / Lightness $hEffect = _GDIPlus_EffectCreateHueSaturationLightness(GUICtrlRead($iInp_HSLHueLevel), GUICtrlRead($iInp_HSLSatLevel), GUICtrlRead($iInp_HSLLightnLevel)) Case 9 ;Levels $hEffect = _GDIPlus_EffectCreateLevels(GUICtrlRead($iInp_LevelsHighlight), GUICtrlRead($iInp_LevelsMidtone), GUICtrlRead($iInp_LevelsShadow)) Case 10;Negative _GDIPlus_Negative($hImage, $hCtx_tmp) Case 11;Sharpen $hEffect = _GDIPlus_EffectCreateSharpen(GUICtrlRead($iInp_SharpenRadius), GUICtrlRead($iInp_SharpenAmount)) Case 12;Tint $hEffect = _GDIPlus_EffectCreateTint(GUICtrlRead($iInp_TintHue), GUICtrlRead($iInp_TintAmount)) EndSwitch If $iTabSelection <> 0 And $iTabSelection <> 7 Then _GDIPlus_BitmapApplyEffect($hImage, $hEffect) _GDIPlus_EffectDispose($hEffect) EndIf _GDIPlus_SaveBitmap($sFile, $hBmp_tmp, 90, $iBGColor) ;~ Switch _GDIPlus_ImageSaveToFile($hBmp_tmp, $sFile) ;~ Case 0 ;~ MsgBox(16 + 262144, "Error", "Image couldn't be saved!", 20, $hGUI) ;~ Case Else ;~ MsgBox(64 + 262144, "Information", "Image has been successfully saved!", 20, $hGUI) ;~ EndSwitch Case $iRadio_CCExposure, $iRadio_CCDensity GUICtrlSetLimit($iSlider_CCValue, 255, -255) GUICtrlSetData($iSlider_CCValue, 0) GUICtrlSetData($iInp_CCValue, 0) GUICtrlSetTip($iSlider_CCValue, "Range is from -255 to 255") If BitAND(GUICtrlRead($iRadio_CCExposure), $GUI_CHECKED) Then $iType = $iAdjustExposure Else $iType = $iAdjustDensity EndIf $bUpdatePreview = True Case $iRadio_CCBlackSaturation, $iRadio_CCWhiteSaturation If BitAND(GUICtrlRead($iRadio_CCBlackSaturation), $GUI_CHECKED) Then $iType = $iAdjustBlackSaturation GUICtrlSetLimit($iSlider_CCValue, 254, 0) GUICtrlSetData($iSlider_CCValue, 0) GUICtrlSetData($iInp_CCValue, 0) GUICtrlSetTip($iSlider_CCValue, "Range is from 0 to 254") Else $iType = $iAdjustWhiteSaturation GUICtrlSetLimit($iSlider_CCValue, 255, 1) GUICtrlSetData($iSlider_CCValue, 255) GUICtrlSetData($iInp_CCValue, 255) GUICtrlSetTip($iSlider_CCValue, "Range is from 1 to 255") EndIf $bUpdatePreview = True Case $iRadio_CCContrast, $iRadio_CCHighlight, $iRadio_CCShadow, $iRadio_CCMidtone GUICtrlSetLimit($iSlider_CCValue, 100, -100) GUICtrlSetData($iSlider_CCValue, 0) GUICtrlSetData($iInp_CCValue, 0) GUICtrlSetTip($iSlider_CCValue, "Range is from -100 to 100") If BitAND(GUICtrlRead($iRadio_CCBlackSaturation), $GUI_CHECKED) Then $iType = $iAdjustContrast ElseIf BitAND(GUICtrlRead($iRadio_CCHighlight), $GUI_CHECKED) Then $iType = $iAdjustHighlight ElseIf BitAND(GUICtrlRead($iRadio_CCShadow), $GUI_CHECKED) Then $iType = $iAdjustShadow Else $iType = $iAdjustMidtone EndIf $bUpdatePreview = True Case $iRadio_CCCurveAllChannel $iChannel = $iCurveChannelAll $bUpdatePreview = True Case $iRadio_CCCurveRed $iChannel = $iCurveChannelRed $bUpdatePreview = True Case $iRadio_CCCurveGreen $iChannel = $iCurveChannelGreen $bUpdatePreview = True Case $iRadio_CCCurveBlue $iChannel = $iCurveChannelBlue $bUpdatePreview = True Case $iCheckbox_BlurExpandEdge $bUpdatePreview = True Case $iTab Switch GUICtrlRead($iTab) Case 0 ;Black & White $iTabSelection = 0 Case 1 ;Blur $iTabSelection = 1 Case 2 ;Brightness / Contrast $iTabSelection = 2 Case 3 ;Color Balance $iTabSelection = 3 Case 4 ;Color Curve $iTabSelection = 4 Case 5 ;Color LUT $iTabSelection = 5 Case 6 ;Color Matrix $iTabSelection = 6 Case 7 ;Greyscale $iTabSelection = 7 Case 8 ;Hue / Saturation / Lightness $iTabSelection = 8 Case 9 ;Levels $iTabSelection = 9 Case 10;Negative $iTabSelection = 10 Case 11;Sharpen $iTabSelection = 11 Case 12;Tint $iTabSelection = 12 EndSwitch $bUpdatePreview = True EndSwitch If $bUpdatePreview And $bStart Then $bUpdatePreview = False DllCall($ghGDIPDll, "uint", "GdipSetInterpolationMode", "handle", $hGraphic, "int", 7) $hImage_tmp = _GDIPlus_ImageClone($hImage) Switch $iTabSelection Case 0 ;Black & White DllCall($ghGDIPDll, "uint", "GdipSetInterpolationMode", "handle", $hGraphic, "int", 5) _GDIPlus_BlackAndWhite($hImage_tmp, $hGraphic, GUICtrlRead($iInp_BWThreshold)) $bDrawFX = False Case 1 ;Blur $hEffect = _GDIPlus_EffectCreateBlur(GUICtrlRead($iInp_BlurRadius), BitAND(GUICtrlRead($iCheckbox_BlurExpandEdge), $GUI_CHECKED)) $bDrawFX = True Case 2 ;Brightness / Contrast $hEffect = _GDIPlus_EffectCreateBrightnessContrast(GUICtrlRead($iInp_BCBrightness), GUICtrlRead($iInp_BCContrast)) $bDrawFX = True Case 3 ;Color Balance $hEffect = _GDIPlus_EffectCreateColorBalance(GUICtrlRead($iInp_CBCyanRed), GUICtrlRead($iInp_CBMagentaGreen), GUICtrlRead($iInp_CBYellowBlue)) $bDrawFX = True Case 4 ;Color Curve $hEffect = _GDIPlus_EffectCreateColorCurve($iType, $iChannel, GUICtrlRead($iInp_CCValue)) $bDrawFX = True Case 5 ;Color LUT $bDrawFX = False Case 6 ;Color Matrix Local $tColorMatrix = DllStructCreate($tagGDIPCOLORMATRIX) DllStructSetData($tColorMatrix, "m", GUICtrlRead($iInp_CMRed), 1) DllStructSetData($tColorMatrix, "m", GUICtrlRead($iInp_CMGreen), 7) DllStructSetData($tColorMatrix, "m", GUICtrlRead($iInp_CMBlue), 13) DllStructSetData($tColorMatrix, "m", 1, 19) DllStructSetData($tColorMatrix, "m", 1, 25) $hEffect = _GDIPlus_EffectCreateColorMatrix($tColorMatrix) $bDrawFX = True Case 7 ;Greyscale _GDIPlus_Greyscale($hImage_tmp, $hGraphic) $bDrawFX = False Case 8 ;Hue / Saturation / Lightness $hEffect = _GDIPlus_EffectCreateHueSaturationLightness(GUICtrlRead($iInp_HSLHueLevel), GUICtrlRead($iInp_HSLSatLevel), GUICtrlRead($iInp_HSLLightnLevel)) $bDrawFX = True Case 9 ;Levels $hEffect = _GDIPlus_EffectCreateLevels(GUICtrlRead($iInp_LevelsHighlight), GUICtrlRead($iInp_LevelsMidtone), GUICtrlRead($iInp_LevelsShadow)) $bDrawFX = True Case 10;Negative _GDIPlus_Negative($hImage_tmp, $hGraphic) $bDrawFX = False Case 11;Sharpen $hEffect = _GDIPlus_EffectCreateSharpen(GUICtrlRead($iInp_SharpenRadius), GUICtrlRead($iInp_SharpenAmount)) $bDrawFX = True Case 12;Tint $hEffect = _GDIPlus_EffectCreateTint(GUICtrlRead($iInp_TintHue), GUICtrlRead($iInp_TintAmount)) $bDrawFX = True EndSwitch If $bDrawFX Then _GDIPlus_GraphicsClear($hCtx_tmp, 0xFF000000 + $iBGColor) _GDIPlus_BitmapApplyEffect($hImage_tmp, $hEffect) _GDIPlus_GraphicsDrawImageRect($hCtx_tmp, $hImage_tmp, 0, 0, $iWidth, $iHeight) _GDIPlus_EffectDispose($hEffect) CopyImage2Gfx($hBmp_tmp, $hGraphic, $hDC, $hDC_backbuffer, $iWidth, $iHeight) Else DllCall($hDLL_GDI32, "bool", "BitBlt", "handle", $hDC, "int", 2, "int", 2, "int", $iW_Prev - 4, "int", $iH_Prev - 4, "handle", $hDC_backbuffer, "int", 0, "int", 0, "dword", $SRCCOPY) EndIf _GDIPlus_ImageDispose($hImage_tmp) EndIf WEnd Func ResetSettings() Switch $iTabSelection Case 0 ;Black & White GUICtrlSetData($iSlider_BWThreshold, $iSlider_BWThreshold_Default) GUICtrlSetData($iInp_BWThreshold, StringFormat("%04.2f", $iSlider_BWThreshold_Default / 100)) $bUpdatePreview = True Case 1 ;Blur GUICtrlSetData($iSlider_BlurRadius, $iSlider_BlurRadius_Default) GUICtrlSetData($iInp_BlurRadius, $iSlider_BlurRadius_Default) GUICtrlSetState($iCheckbox_BlurExpandEdge, $GUI_UNCHECKED) $bUpdatePreview = True Case 2 ;Brightness / Contrast GUICtrlSetData($iSlider_BCBrightness, $iSlider_BCBrightness_Default) GUICtrlSetData($iInp_BCBrightness, $iSlider_BCBrightness_Default) GUICtrlSetData($iSlider_BCContrast, $iSlider_BCContrast_Default) GUICtrlSetData($iInp_BCContrast, $iSlider_BCContrast_Default) $bUpdatePreview = True Case 3 ;Color Balance GUICtrlSetData($iSlider_CBCyanRed, $iSlider_CBCyanRed_Default) GUICtrlSetData($iInp_CBCyanRed, $iSlider_CBCyanRed_Default) GUICtrlSetData($iSlider_CBMagentaGreen, $iSlider_CBMagentaGreen_Default) GUICtrlSetData($iInp_CBMagentaGreen, $iSlider_CBMagentaGreen_Default) GUICtrlSetData($iSlider_CBYellowBlue, $iSlider_CBYellowBlue_Default) GUICtrlSetData($iInp_CBYellowBlue, $iSlider_CBYellowBlue_Default) $bUpdatePreview = True Case 4 ;Color Curve GUICtrlSetData($iSlider_CCValue, 0) GUICtrlSetData($iInp_CCValue, 0) GUICtrlSetState($iRadio_CCExposure, $GUI_CHECKED) GUICtrlSetState($iRadio_CCCurveAllChannel, $GUI_CHECKED) $bUpdatePreview = True Case 5 ;Color LUT ;~ $bUpdatePreview = True Case 6 ;Color Matrix GUICtrlSetData($iSlider_CMRed, $iSlider_CMRed_Default) GUICtrlSetData($iInp_CMRed, StringFormat("%04.2f", $iSlider_CMRed_Default / 100)) GUICtrlSetData($iSlider_CMGreen, $iSlider_CMGreen_Default) GUICtrlSetData($iInp_CMGreen, StringFormat("%04.2f", $iSlider_CMGreen_Default / 100)) GUICtrlSetData($iSlider_CMBlue, $iSlider_CMBlue_Default) GUICtrlSetData($iInp_CMBlue, StringFormat("%04.2f", $iSlider_CMBlue_Default / 100)) $bUpdatePreview = True Case 7 ;Greyscale GUICtrlSetData($iSlider_GSLumRed, $iSlider_GSLumRed_Default) GUICtrlSetData($iInp_GSLumRed, StringFormat("%04.2f", $iSlider_GSLumRed_Default / 100)) GUICtrlSetData($iSlider_GSLumGreen, $iSlider_GSLumGreen_Default) GUICtrlSetData($iInp_GSLumGreen, StringFormat("%04.2f", $iSlider_GSLumGreen_Default / 100)) GUICtrlSetData($iSlider_GSLumBlue, $iSlider_GSLumBlue_Default) GUICtrlSetData($iInp_GSLumBlue, StringFormat("%04.2f", $iSlider_GSLumBlue_Default / 100)) $GDIP__RLUM = $iSlider_GSLumRed_Default / 100 $GDIP__GLUM = $iSlider_GSLumGreen_Default / 100 $GDIP__BLUM = $iSlider_GSLumBlue_Default / 100 $bUpdatePreview = True Case 8 ;Hue / Saturation / Lightness GUICtrlSetData($iSlider_HSLHueLevel, $iSlider_HSLHueLevel_Default) GUICtrlSetData($iInp_HSLHueLevel, $iSlider_HSLHueLevel_Default) GUICtrlSetData($iSlider_HSLSatLevel, $iSlider_HSLSatLevel_Default) GUICtrlSetData($iInp_HSLSatLevel, $iSlider_HSLSatLevel_Default) GUICtrlSetData($iSlider_HSLLightnLevel, $iSlider_HSLLightnLevel_Default) GUICtrlSetData($iInp_HSLLightnLevel, $iSlider_HSLLightnLevel_Default) $bUpdatePreview = True Case 9 ;Levels GUICtrlSetData($iSlider_LevelsHighlight, $iSlider_LevelsHighlight_Default) GUICtrlSetData($iInp_LevelsHighlight, $iSlider_LevelsHighlight_Default) GUICtrlSetData($iSlider_LevelsMidtone, $iSlider_LevelsMidtone_Default) GUICtrlSetData($iInp_LevelsMidtone, $iSlider_LevelsMidtone_Default) GUICtrlSetData($iSlider_LevelsShadow, $iSlider_LevelsShadow_Default) GUICtrlSetData($iInp_LevelsShadow, $iSlider_LevelsShadow_Default) $bUpdatePreview = True Case 10;Negative $bUpdatePreview = True Case 11;Sharpen GUICtrlSetData($iSlider_SharpenRadius, $iSlider_SharpenRadius_Default) GUICtrlSetData($iInp_SharpenRadius, $iSlider_SharpenRadius_Default) GUICtrlSetData($iSlider_SharpenAmount, $iSlider_SharpenAmount_Default) GUICtrlSetData($iInp_SharpenAmount, $iSlider_SharpenAmount_Default) $bUpdatePreview = True Case 12;Tint GUICtrlSetData($iSlider_TintHue, $iSlider_TintHue_Default) GUICtrlSetData($iInp_TintHue, $iSlider_TintHue_Default) GUICtrlSetData($iSlider_TintAmount, $iSlider_TintAmount_Default) GUICtrlSetData($iInp_TintAmount, $iSlider_TintAmount_Default) $bUpdatePreview = True EndSwitch EndFunc ;==>ResetSettings #Region GDI+ FX functions Func _GDIPlus_BlackAndWhite($hBitmap, $hGraphic, $iThreshold, $bUpdate = True) Local Const $hIA = _GDIPlus_ImageAttributesCreate() _GDIPlus_ImageAttributesSetThreshold($hIA, $iThreshold) Local $pBWMatrix = DllStructGetPtr(_GDIPlus_ColorMatrixCreateGrayScale()) _GDIPlus_ImageAttributesSetColorMatrix($hIA, $GDIP_COLORADJUSTTYPE_DEFAULT, True, $pBWMatrix) Local $iW = _GDIPlus_ImageGetWidth($hBitmap), $iH = _GDIPlus_ImageGetHeight($hBitmap) If $bUpdate Then CopyImage2Gfx($hBitmap, $hGraphic, $hDC, $hDC_backbuffer, $iW, $iH, $hIA) Else _GDIPlus_GraphicsClear($hGraphic, 0xFF000000 + $iBGColor) _GDIPlus_GraphicsDrawImageRectRect($hGraphic, $hBitmap, 0, 0, $iW, $iH, 0, 0, $iW, $iH, $hIA) EndIf _GDIPlus_ImageAttributesDispose($hIA) EndFunc ;==>_GDIPlus_BlackAndWhite Func _GDIPlus_Greyscale($hBitmap, $hGraphic, $bUpdate = True) Local $ii, $iJ, $tColorMatrix, $aLums[4] = [GUICtrlRead($iInp_GSLumRed), GUICtrlRead($iInp_GSLumGreen), GUICtrlRead($iInp_GSLumBlue), 0] $tColorMatrix = DllStructCreate($tagGDIPCOLORMATRIX) For $ii = 0 To 3 For $iJ = 1 To 3 DllStructSetData($tColorMatrix, "m", $aLums[$ii], $ii * 5 + $iJ) Next Next DllStructSetData($tColorMatrix, "m", 1, 19) DllStructSetData($tColorMatrix, "m", 1, 25) Local Const $hIA = _GDIPlus_ImageAttributesCreate() _GDIPlus_ImageAttributesSetColorMatrix($hIA, 0, True, $tColorMatrix) Local $iW = _GDIPlus_ImageGetWidth($hBitmap), $iH = _GDIPlus_ImageGetHeight($hBitmap) If $bUpdate Then CopyImage2Gfx($hBitmap, $hGraphic, $hDC, $hDC_backbuffer, $iW, $iH, $hIA) Else _GDIPlus_GraphicsClear($hGraphic, 0xFF000000 + $iBGColor) _GDIPlus_GraphicsDrawImageRectRect($hGraphic, $hBitmap, 0, 0, $iW, $iH, 0, 0, $iW, $iH, $hIA) EndIf _GDIPlus_ImageAttributesDispose($hIA) EndFunc ;==>_GDIPlus_Greyscale Func _GDIPlus_Negative(ByRef $hBitmap, ByRef $hGraphic) Local Const $hIA = _GDIPlus_ImageAttributesCreate() _GDIPlus_ImageAttributesSetColorMatrix($hIA, 0, True, _GDIPlus_ColorMatrixCreateNegative()) CopyImage2Gfx($hBitmap, $hGraphic, $hDC, $hDC_backbuffer, _GDIPlus_ImageGetWidth($hBitmap), _GDIPlus_ImageGetHeight($hBitmap), $hIA) _GDIPlus_ImageAttributesDispose($hIA) EndFunc ;==>_GDIPlus_Negative #EndRegion GDI+ FX functions #Region Message Functions Func WM_HSCROLL($hWnd, $Msg, $wParam, $lParam) #forceref $hWnd, $Msg, $wParam Switch $lParam Case $hSlider_BWThreshold GUICtrlSetData($iInp_BWThreshold, StringFormat("%04.2f", GUICtrlRead($iSlider_BWThreshold) / 100)) $bUpdatePreview = True If BitAND(GUICtrlGetState($iBtnSave), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($iBtnSave, $GUI_DISABLE) Case $hSlider_BlurRadius GUICtrlSetData($iInp_BlurRadius, GUICtrlRead($iSlider_BlurRadius)) $bUpdatePreview = True If BitAND(GUICtrlGetState($iBtnSave), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($iBtnSave, $GUI_DISABLE) Case $hSlider_BCBrightness GUICtrlSetData($iInp_BCBrightness, GUICtrlRead($iSlider_BCBrightness)) $bUpdatePreview = True If BitAND(GUICtrlGetState($iBtnSave), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($iBtnSave, $GUI_DISABLE) Case $hSlider_BCContrast GUICtrlSetData($iInp_BCContrast, GUICtrlRead($iSlider_BCContrast)) $bUpdatePreview = True If BitAND(GUICtrlGetState($iBtnSave), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($iBtnSave, $GUI_DISABLE) Case $hSlider_CBCyanRed GUICtrlSetData($iInp_CBCyanRed, GUICtrlRead($iSlider_CBCyanRed)) $bUpdatePreview = True If BitAND(GUICtrlGetState($iBtnSave), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($iBtnSave, $GUI_DISABLE) Case $hSlider_CBMagentaGreen GUICtrlSetData($iInp_CBMagentaGreen, GUICtrlRead($iSlider_CBMagentaGreen)) $bUpdatePreview = True If BitAND(GUICtrlGetState($iBtnSave), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($iBtnSave, $GUI_DISABLE) Case $hSlider_CBYellowBlue GUICtrlSetData($iInp_CBYellowBlue, GUICtrlRead($iSlider_CBYellowBlue)) $bUpdatePreview = True If BitAND(GUICtrlGetState($iBtnSave), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($iBtnSave, $GUI_DISABLE) Case $hSlider_CCValue GUICtrlSetData($iInp_CCValue, GUICtrlRead($iSlider_CCValue)) $bUpdatePreview = True If BitAND(GUICtrlGetState($iBtnSave), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($iBtnSave, $GUI_DISABLE) Case $hSlider_CMBlue GUICtrlSetData($iInp_CMBlue, StringFormat("%04.2f", GUICtrlRead($iSlider_CMBlue) / 100)) $bUpdatePreview = True If BitAND(GUICtrlGetState($iBtnSave), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($iBtnSave, $GUI_DISABLE) Case $hSlider_CMGreen GUICtrlSetData($iInp_CMGreen, StringFormat("%04.2f", GUICtrlRead($iSlider_CMGreen) / 100)) $bUpdatePreview = True If BitAND(GUICtrlGetState($iBtnSave), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($iBtnSave, $GUI_DISABLE) Case $hSlider_CMRed GUICtrlSetData($iInp_CMRed, StringFormat("%04.2f", GUICtrlRead($iSlider_CMRed) / 100)) $bUpdatePreview = True If BitAND(GUICtrlGetState($iBtnSave), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($iBtnSave, $GUI_DISABLE) Case $hSlider_GSLumBlue GUICtrlSetData($iInp_GSLumBlue, StringFormat("%04.2f", GUICtrlRead($iSlider_GSLumBlue) / 100)) $GDIP__BLUM = GUICtrlRead($iSlider_GSLumBlue) / 100 $bUpdatePreview = True If BitAND(GUICtrlGetState($iBtnSave), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($iBtnSave, $GUI_DISABLE) Case $hSlider_GSLumGreen GUICtrlSetData($iInp_GSLumGreen, StringFormat("%04.2f", GUICtrlRead($iSlider_GSLumGreen) / 100)) $GDIP__GLUM = GUICtrlRead($iSlider_GSLumGreen) / 100 $bUpdatePreview = True If BitAND(GUICtrlGetState($iBtnSave), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($iBtnSave, $GUI_DISABLE) Case $hSlider_GSLumRed GUICtrlSetData($iInp_GSLumRed, StringFormat("%04.2f", GUICtrlRead($iSlider_GSLumRed) / 100)) $GDIP__RLUM = GUICtrlRead($iSlider_GSLumRed) / 100 $bUpdatePreview = True If BitAND(GUICtrlGetState($iBtnSave), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($iBtnSave, $GUI_DISABLE) Case $hSlider_HSLHueLevel GUICtrlSetData($iInp_HSLHueLevel, GUICtrlRead($iSlider_HSLHueLevel)) $bUpdatePreview = True If BitAND(GUICtrlGetState($iBtnSave), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($iBtnSave, $GUI_DISABLE) Case $hSlider_HSLLightnLevel GUICtrlSetData($iInp_HSLLightnLevel, GUICtrlRead($iSlider_HSLLightnLevel)) $bUpdatePreview = True If BitAND(GUICtrlGetState($iBtnSave), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($iBtnSave, $GUI_DISABLE) Case $hSlider_HSLSatLevel GUICtrlSetData($iInp_HSLSatLevel, GUICtrlRead($iSlider_HSLSatLevel)) $bUpdatePreview = True If BitAND(GUICtrlGetState($iBtnSave), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($iBtnSave, $GUI_DISABLE) Case $hSlider_LevelsHighlight GUICtrlSetData($iInp_LevelsHighlight, GUICtrlRead($iSlider_LevelsHighlight)) $bUpdatePreview = True If BitAND(GUICtrlGetState($iBtnSave), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($iBtnSave, $GUI_DISABLE) Case $hSlider_LevelsMidtone GUICtrlSetData($iInp_LevelsMidtone, GUICtrlRead($iSlider_LevelsMidtone)) $bUpdatePreview = True If BitAND(GUICtrlGetState($iBtnSave), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($iBtnSave, $GUI_DISABLE) Case $hSlider_LevelsShadow GUICtrlSetData($iInp_LevelsShadow, GUICtrlRead($iSlider_LevelsShadow)) $bUpdatePreview = True If BitAND(GUICtrlGetState($iBtnSave), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($iBtnSave, $GUI_DISABLE) Case $hSlider_SharpenAmount GUICtrlSetData($iInp_SharpenAmount, GUICtrlRead($iSlider_SharpenAmount)) $bUpdatePreview = True If BitAND(GUICtrlGetState($iBtnSave), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($iBtnSave, $GUI_DISABLE) Case $hSlider_SharpenRadius GUICtrlSetData($iInp_SharpenRadius, GUICtrlRead($iSlider_SharpenRadius)) $bUpdatePreview = True If BitAND(GUICtrlGetState($iBtnSave), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($iBtnSave, $GUI_DISABLE) Case $hSlider_TintAmount GUICtrlSetData($iInp_TintAmount, GUICtrlRead($iSlider_TintAmount)) $bUpdatePreview = True If BitAND(GUICtrlGetState($iBtnSave), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($iBtnSave, $GUI_DISABLE) Case $hSlider_TintHue GUICtrlSetData($iInp_TintHue, GUICtrlRead($iSlider_TintHue)) $bUpdatePreview = True If BitAND(GUICtrlGetState($iBtnSave), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($iBtnSave, $GUI_DISABLE) EndSwitch Return "GUI_RUNDEFMSG" EndFunc ;==>WM_HSCROLL Func WM_COMMAND($hWnd, $Msg, $wParam, $lParam) #forceref $hWnd, $Msg, $lParam Switch $wParam Case $iReset ResetSettings() Case $iClipboard Local $hHBmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBmp_tmp) Local $hClipboard_Bitmap = _WinAPI_CopyImage($hHBmp, 0, 0, 0, $LR_COPYDELETEORG + $LR_COPYRETURNORG) _ClipBoard_Open(HWnd($hGUI)) _ClipBoard_Empty() _ClipBoard_SetDataEx($hClipboard_Bitmap, $CF_BITMAP) If Not @error Then MsgBox(64 + 262144, "Information", "Image put to clipboard!", 10) Else MsgBox(16 + 262144, "Error", "An error has occured: " & @error, 10) EndIf _ClipBoard_Close() _WinAPI_DeleteObject($hHBmp) _WinAPI_DeleteObject($hClipboard_Bitmap) EndSwitch Return "GUI_RUNDEFMSG" EndFunc ;==>WM_COMMAND Func WM_CONTEXTMENU($hWnd, $Msg, $wParam, $lParam) #forceref $Msg, $wParam, $lParam Local $aCI = GUIGetCursorInfo(HWnd($hGUI)) If Not @error Then Switch $aCI[4] Case $iTab _GUICtrlMenu_TrackPopupMenu($hQMenu, $hWnd) Return True Case $iBtnSave _GUICtrlMenu_TrackPopupMenu($hQMenu2, $hWnd) Return True EndSwitch EndIf Return "GUI_RUNDEFMSG" EndFunc ;==>WM_CONTEXTMENU Func WM_PAINT($hWnd, $Msg, $wParam, $lParam) #forceref $hWnd, $Msg,$wParam, $lParam DllCall($hDLL_GDI32, "bool", "BitBlt", "handle", $hDC, "int", 2, "int", 2, "int", $iW_Prev - 4, "int", $iH_Prev - 4, "handle", $hDC_backbuffer, "int", 0, "int", 0, "dword", $SRCCOPY) Return "GUI_RUNDEFMSG" EndFunc ;==>WM_PAINT Func WM_NOTIFY($hWnd, $Msg, $wParam, $lParam) #forceref $hWnd, $Msg,$wParam, $lParam DllCall($hDLL_GDI32, "bool", "BitBlt", "handle", $hDC, "int", 2, "int", 2, "int", $iW_Prev - 4, "int", $iH_Prev - 4, "handle", $hDC_backbuffer, "int", 0, "int", 0, "dword", $SRCCOPY) Return "GUI_RUNDEFMSG" EndFunc ;==>WM_NOTIFY Func WM_DROPFILES($hWnd, $Msg, $wParam, $lParam) #forceref $hWnd, $Msg, $lParam Local $aRet = DllCall("shell32.dll", "int", "DragQueryFile", "int", $wParam, "int", -1, "ptr", 0, "int", 0) If @error Then Return SetError(1, 0, 0) Local $sDroppedFile, $tBuffer = DllStructCreate("char[256]") If $aRet[0] = 1 Then DllCall("shell32.dll", "int", "DragQueryFile", "int", $wParam, "int", 0, "ptr", DllStructGetPtr($tBuffer), "int", DllStructGetSize($tBuffer)) $sDroppedFile = DllStructGetData($tBuffer, 1) If StringInStr(FileGetAttrib($sDroppedFile), "D") Then DllCall("shell32.dll", "none", "DragFinish", "int", $wParam) Return MsgBox(16 + 262144, "Error", "This is not a file ;-)", 20, $hGUI) EndIf EndIf DllCall("shell32.dll", "none", "DragFinish", "int", $wParam) $sFile = $sDroppedFile $bDnD = True GUICtrlSendMsg($iBtnLoad, $BM_CLICK, 0, 0) Return "GUI_RUNDEFMSG" EndFunc ;==>WM_DROPFILES #EndRegion Message Functions #Region needed additional functions Func _GDIPlus_SaveBitmap($sFilename, $hBmp, $iJPGQual = 90, $iTpColor = 0) Local $bError = False, $bResult, $aResult, $hBmp_BG, $hBmp1bpp, $hCtxt1bpp; $hBmp8bpp, $hCtxt8bpp Local $sSaveTypes = "|jpg|bmp|gif|png|tif|", $sSaveType = "jpg" Local $sSuffix = StringRight($sFilename, 3) If StringInStr($sSaveTypes, $sSuffix) Then $sSaveType = $sSuffix Else $sFilename &= "." & $sSaveType EndIf If FileExists($sFilename) Then Local $iChoice = MsgBox(4 + 32 + 256 + 262144, "Warning", "'" & $sFilename & "' already exists!" & @CRLF & @CRLF & "Overwrite file?", 0, $hGUI) If $iChoice = 7 Then Return 0 FileDelete($sFilename) EndIf If Not $iTabSelection Then $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $iWidth, "int", $iHeight, "int", 0, "int", $GDIP_PXF01INDEXED, "ptr", 0, "int*", 0) ;create empty 32 bit bitmap $hBmp1bpp = $aResult[6] $hCtxt1bpp = _GDIPlus_ImageGetGraphicsContext($hBmp1bpp) DllCall($ghGDIPDll, "uint", "GdipSetInterpolationMode", "handle", $hCtxt1bpp, "int", 5) _GDIPlus_GraphicsDrawImageRect($hCtxt1bpp, $hBmp, 0, 0, $iWidth, $iHeight) _GDIPlus_GraphicsDispose($hCtxt1bpp) $hBmp = $hBmp1bpp ;~ ElseIf $iTabSelection = 7 Then ;~ $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $iWidth, "int", $iHeight, "int", 0, "int", $GDIP_PXF08INDEXED, "ptr", 0, "int*", 0) ;create empty 32 bit bitmap ;~ $hBmp8bpp = $aResult[6] ;~ $hCtxt8bpp = _GDIPlus_ImageGetGraphicsContext($hBmp8bpp) ;~ DllCall($ghGDIPDll, "uint", "GdipSetInterpolationMode", "handle", $hCtxt8bpp, "int", 0) ;~ _GDIPlus_GraphicsDrawImageRect($hCtxt8bpp, $hBmp, 0, 0, $iWidth, $iHeight) ;~ _GDIPlus_GraphicsDispose($hCtxt8bpp) ;~ $hBmp = $hBmp8bpp EndIf Switch $sSaveType Case "jpg" Local $sCLSID = _GDIPlus_EncodersGetCLSID("JPG") Local $tParams = _GDIPlus_ParamInit(1) Local $tData = DllStructCreate("int Quality") DllStructSetData($tData, "Quality", $iJPGQual) Local $pData = DllStructGetPtr($tData) _GDIPlus_ParamAdd($tParams, $GDIP_EPGQUALITY, 1, $GDIP_EPTLONG, $pData) Local $pParams = DllStructGetPtr($tParams) If $iTpColor Then $hBmp_BG = _GDIPlus_ChangeBGColor($hBmp, 0xFF000000 + $iTpColor) $bResult = _GDIPlus_ImageSaveToFileEx($hBmp_BG, $sFilename, $sCLSID, $pParams) _GDIPlus_BitmapDispose($hBmp_BG) Else $bResult = _GDIPlus_ImageSaveToFileEx($hBmp, $sFilename, $sCLSID, $pParams) EndIf If Not $bResult Then $bError = True Else $bError = False EndIf $tData = "" $tParams = "" Case Else If $iTpColor And $sSuffix <> "png" Then $hBmp_BG = _GDIPlus_ChangeBGColor($hBmp, 0xFF000000 + $iTpColor) $bResult = _GDIPlus_ImageSaveToFile($hBmp_BG, $sFilename) _GDIPlus_BitmapDispose($hBmp_BG) Else $bResult = _GDIPlus_ImageSaveToFile($hBmp, $sFilename) EndIf If Not $bResult Then $bError = True Else $bError = False EndIf EndSwitch If Not $iTabSelection Then _GDIPlus_BitmapDispose($hBmp) If $bError Then MsgBox(16 + 262144, "ERROR", "An error has occured - the image couldn't saved!", 30, $hGUI) Return 0 EndIf MsgBox(64 + 262144, "Information", "Image successfully saved to '" & $sFilename & "'", 10, $hGUI) Return 1 EndFunc ;==>_GDIPlus_SaveBitmap Func _GDIPlus_ChangeBGColor($hBitmap, $iBGColor) Local $iW_TP = _GDIPlus_ImageGetWidth($hBitmap), $iH_TP = _GDIPlus_ImageGetHeight($hBitmap) Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $iW_TP, "int", $iH_TP, "int", 0, "int", 0x0026200A, "ptr", 0, "int*", 0) ;create empty 32 bit bitmap Local $hBmp_TP = $aResult[6] Local $hCtxt_TP = _GDIPlus_ImageGetGraphicsContext($hBmp_TP) _GDIPlus_GraphicsClear($hCtxt_TP, $iBGColor) _GDIPlus_GraphicsDrawImageRect($hCtxt_TP, $hBitmap, 0, 0, $iW_TP, $iH_TP) _GDIPlus_GraphicsDispose($hCtxt_TP) Return $hBmp_TP EndFunc ;==>_GDIPlus_ChangeBGColor Func CopyImage2Gfx($hBmp, $hGraphic, $hDC, $hDC_backbuffer, $bW, $bH, $hIA = 0) Local $f, $iXPos, $iYPos, $iImgW, $iImgH _GDIPlus_GraphicsClear($hGraphic, 0xFF000000 + $iBGColor) If $bW < $iW_Prev And $bH < $iH_Prev Then $iXPos = ($iW_Prev - $bW) / 2 $iYPos = ($iH_Prev - $bH) / 2 $iImgW = $bW $iImgH = $bH Else If $bW > $bH Then $f = $bW / $iW_Prev If ($bH / $f) > $iH_Prev Then $f = $bH / $iH_Prev Else $f = $bH / $iH_Prev EndIf $iImgW = Int($bW / $f) $iImgH = Int($bH / $f) $iXPos = ($iW_Prev - $iImgW) / 2 - 2 $iYPos = ($iH_Prev - $iImgH) / 2 - 2 EndIf If $hIA Then _GDIPlus_GraphicsDrawImageRectRect($hGraphic, $hBmp, 0, 0, $bW, $bH, $iXPos, $iYPos, $iImgW, $iImgH, $hIA) Else _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBmp, $iXPos, $iYPos, $iImgW, $iImgH) EndIf DllCall($hDLL_GDI32, "bool", "BitBlt", "handle", $hDC, "int", 2, "int", 2, "int", $iW_Prev - 4, "int", $iH_Prev - 4, "handle", $hDC_backbuffer, "int", 0, "int", 0, "dword", $SRCCOPY) EndFunc ;==>CopyImage2Gfx Func _GDIPlus_Convert2HBitmap($hBitmap, $iColor); removes alpha backround using system color and converts to gdi bitmap Local $iBGColor = _WinAPI_GetSysColor($iColor) $iBGColor = 0x10000 * BitAND($iBGColor, 0xFF) + BitAND($iBGColor, 0x00FF00) + BitShift($iBGColor, 16) Local $iWidth = _GDIPlus_ImageGetWidth($hBitmap), $iHeight = _GDIPlus_ImageGetHeight($hBitmap) Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $iWidth, "int", $iHeight, "int", 0, "int", 0x0026200A, "ptr", 0, "int*", 0) Local $hBitmap_New = $aResult[6] Local $hCtx_new = _GDIPlus_ImageGetGraphicsContext($hBitmap_New) Local $hBrush = _GDIPlus_BrushCreateSolid(0xFF000000 + $iBGColor) _GDIPlus_GraphicsFillRect($hCtx_new, 0, 0, $iWidth, $iHeight, $hBrush) _GDIPlus_GraphicsDrawImageRect($hCtx_new, $hBitmap, 0, 0, $iWidth, $iHeight) Local $hHBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap_New) _GDIPlus_BrushDispose($hBrush) _GDIPlus_BitmapDispose($hBitmap_New) _GDIPlus_GraphicsDispose($hCtx_new) Return $hHBitmap EndFunc ;==>_GDIPlus_Convert2HBitmap ;Code below was generated by: 'File to Base64 String' Code Generator v1.12 Build 2013-05-17 Func Reset_Icon() Local $Reset_Icon $Reset_Icon &= "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACC0lEQVR42mNkIAKwxjMJM/9i8vjx9M86hkMM35HlGAlpZslmcFMxllssrMcidq7/Ydr3pX9nE2dANIOImD7HXCltAT9hUX4GEUkhhps7vj+/kHpBCq8B7BHMvPwezFUCnHylopI8zOxM7AyszGwMAvwCDPwK3Axz9Hf6/rv9fwtOA5itGIPlUvjXiMryMPDy8jFwMHMwcLJzMgjw8jNoK6gwrF9y/vGh2MNy+L3AwcDGYMRgoJMivdLQWUOBm4WbgYebh4HxNyPDP5FvDPNd92S92/N5OsFAtFqj8cDCVVeenY2D4fyxa3c4jkvclnDm9fzw4BvDishNjAQNCDhu/VbfREPo28/vDA8OvPq42mePQGRKLPfyOYu/EhWNQUdt3uiaawh//PKR4cdhln8zfJczo6vBa4DHJtPHZj66Mm/fvWf4tov5//yoNUwwuf///7MwMjL+wWuAzUyd97ZpJgJvnr5h2H/i9Ls7IS+FQeJrVq1nDAkL/E/QBYELvK+yeX3UYv/Ew7Dn7u4HDGdzjJ9VTXxHtBeCZwR1vOO9H8tjwyL15fC3R5/OftQ62//kK9EGgIDaZMmez4ovikV5JRmYtvBmXui+OQMkPmPxSsaM2PD/BA0AgfA6t9gzpqcX/WT6yiC6V0n3fN+NK/uOXmZ0stYlzgAQiOwOdb/14+yEs5z3/jOUMGjBxAESN7ER3OAlewAAAABJRU5ErkJggg==" Return Binary(_Base64Decode($Reset_Icon)) EndFunc ;==>Reset_Icon Func _Clipboard($bSaveBinary = False, $sSavePath = @ScriptDir) Local $Clipboard $Clipboard &= 'iVBORw0KGgoAAAANSUhEUgAAAAwAAAAQCAMAAAAVv241AAABBVBMVEX8/f/s7vD49vj5+vv4+fuQSBTh4eH4+vvk5ujt7u/t7vDj5efAwMDy8vP09fbS0tLc2tr49/j9/v/59/jw8PD7/f/Tizba2trDkFbQgSTg29OtfUTq2MDk5OTj4+Pk4uHPfyLk4+LdkTLSiTbSgiPLeyLj4+Tn5+e2il62mn/m5ube1cvs7u+zgU+5cCnk5ebWlEOufEHNzc3Fdyazbi7Ozs7MzMytcDiyczq2k2+vd0fj5OaxbzauflatajSvh2bk5eenZjKyknahYTGleVbv7Ozz8vPHxcOudkHz9PXw8fLl5uedXS6ZURuxcDaQRxSMRhSJRhaMTiOTXDSYaEWUXjeYTxv6l0DeAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAlElEQVR4Xj2M1a6EUAADe3CHdXd3d3eXq///KbtLgHlpJm0K7xtOUQKfhL/ZOrR1vdePpDPIho1CjOPi5Uo0iFCCgglPSkimXJZII+TyltBSER3BmjHVGuoNj9uEFo/oypTPhCEDDAVH7hhPnNkUM7vhyRyLpX0trrCW7WuywdbY7VVV007nyxU3ln2wz6/vn9+//xdk9BJOUsHn+gAAAABJRU5ErkJggg==' Local $bString = Binary(_Base64Decode($Clipboard)) If $bSaveBinary Then Local $hFile = FileOpen($sSavePath & "\clipboard_paper_16x16.png", 18) FileWrite($hFile, $bString) FileClose($hFile) EndIf Return $bString EndFunc ;==>_Clipboard Func _Logo($bSaveBinary = False, $sSavePath = @ScriptDir) Local $Logo $Logo &= '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' $Logo &= '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' $Logo &= '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' $Logo &= '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' $Logo &= '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' $Logo &= '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' $Logo &= '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' $Logo &= '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' $Logo &= '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' $Logo &= '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' $Logo &= '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' $Logo &= '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' $Logo &= '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' $Logo &= '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' $Logo &= 'U4hxR4WQIJ2nShwQ4oBtKoxSUSpQgv284Cw4D2MR5QfPapd42PWDoyfHpNWzrC1Rpm1wGWVAsy2dn9jQlQxLY4qdhPs5WGB7H23V4CzRtXaUoeCQ2BsjwQjaH4JRTiFAV4WQWAQi2UlMvJbtmA4Zq8aiGv3QWWrQOUoILA2TgQ4IOyViOIZK/wDEwliZTiU4lOINStiZ1p1nGFx4w+SQeRBq878Gz1uEODSJskLZCIVleNSkqV41K/wWwNkPZHgfIPuPOaZjnP7txiuWZzr5Ggc8zR18fbinkZjdOpfS68pWleIWOTDZaGd/GpUrxqC0eAyUH2fBXjUr/CLIlwdLtsUBMWRZUhWDQevZKkCtpleUyveBXEp8alSv4V4KfwFeFeLaWy0lrEnVEJcDYWs7zB2epPmPSo7t68e9WWDtlCMiwRlH8a8SvCpUr+FSvCpXgkYICvCpSU8FSpX+il+AQ7QDaAQBCK/1UgsJ2jto8UM2gTR4hmruxsbL6Rpv2Chqhh55YmqLlYQNgciXjW/5nooWwbSPX4oO0OGM1Atg3xhAac58x/mS/AV4hG0p/wBapbCivEI2lMrwqV/6leCv9uvBWVlfxsCLRt6KUNmsf9YAsCVXKoGgBzFyx7yFjTqtnf8Ai820Ba8DdlElwFdi6xiVSNJIX1w107wCEAoDb/PXgr/ZqVK//QYcT+Y7RYiwOF1epiUmzFjGu2zdVTeA6xAINgB3cF4jSDYnjEyaPp45pHIDLDtkJVsOKHSiugOlwKK//hxlA2tBWXWLwBXsQA5Lsc8Zx7gYD81Hl44n+2S7kAACg0P/AIN//9oADAMBAAIAAwAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQgAAAAAAAAAAAAAAQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABggRwyQigAwlAAAAADyiTAgAATAAAAAAABR3RgRt0AAAAAAAAAAABACgAAAAAAAAAAAAAAAAAACBtR8Fari/ih0gC8gBFdtrTDTRU2ByQgggizSFSDM0whSQAgAgRzCxHHPzgAAwAAwwwQgAwgggBS7JxMMoX0btgoi6gRTKIQIqUknlfq2+zrDgBJ+KMIhoQ91hZJmtxvnzxwsGMd8NBxk/DerjLjgCgQMzGv6vC5fyhSIUExgCABL2J1pl1I/bJlwDQZtDA29RK3wJZkVXv0JpACgH4+yUXOkr/2Am3wDh7tBK6HCQmsNGoSCCyT/CANT2rVCIvqOWyAAC5oAjKBB3R0qnt9XLfVDsCXP1iuaokSc5u5IyABRI9zY/8AWUNmexLPwgwZUv2JN8UuJuGZf2AAAA0kIxtMmKeepmioLHd5gxgkmxsBo3dWBeZP+AAAA0keU59Hu8k0UUo4AQIi0RBIYYAsoUEcUgAAsG3MQoQQw44o8qSWxAUIk80IowIUw8bEM4kUgAAAAAww40IQAAAAAAAAAAwQwMAXBAAGTAAAAAAAAggAAAAAAAAAAYcAgwAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARKAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8QALBEBAAEDAwMEAgICAwEAAAAAAREAITFBUWFxgaEQkbHB0fAg4TDxQFBwYP/aAAgBAwEBPxD/AMiRQE/8idWY2J/gigJaRUOf+kBl5XXgNXwapRCbbX8BB3nrR10cJHtNQYyf0xSUKIpayrDGIUmOYqRJ7PE7z4rw5PAS7yKEVV3fBLew' $Logo &= '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' $Logo &= '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' $Logo &= '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' $Logo &= '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' $Logo &= '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' $Logo &= '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' $Logo &= '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' $Logo &= 'TBe3QLqE/ZO+JMvytHBQbaB4gRzaDyFarq5h0CCiBCAGXllxW1Y9gQAUStVB1kQuEcEAwP4JcMuPiRbLYvixk6mjuM2Got7zVOmb+yFkaUNdkdTlYJxwZXToIP8AtbvUn9dHeK3msXdW/ELu1srqfjn4l1xtBMkRcPUI3T1KrCCcERUG9kU3A7JSQRpLa4c0+otolFBjBCGkUthHSAYH8n4CHdop2CIxB3RLU6MlbPFUoc5d2hxe/FKvywxL2o5R70NEoQ7WRRjTCAJUEy4si+iNmn1DbfUJs9RsgDpBTSZtIWgjjLzE1U89WrBOrc2je417azKqi9uAlmFSWl6hxyrkO0DsIVVzmWidTfemGtdDdI2QhQQ5AwGob6jkKYKFS9kjU4K9H5AX3mFyLZ7lqWzbS1FNJiGg+LDMNbJZXCnT6jeiGYJWqqbZMkaYStKlbSO6RDSAGkPWQuuoRwTAVGTxYSoUobtomNGXLP4hbAwnlHoVWFQ3JLKFbfUM6fUpqExVUYwjpAMD/AkB1JtEVtHjTppTshMCVCEBhRNBhCpS3qUi5ujWQMWP6uWxW8sdpzsgUJrZjoEqMfUpsJpJCgp8JEup8ATaEVEleIU2lfySEdICxfzsMaEd0EdLHSIUiYBTwIvKI89Zn0dgvRbvAMsNhvuGP7UXamq2SjDQYY2Stga0iOJXiCeKOsoVFp0NWVKjaVgTQlSo2g29gNvE6ZcV3jtK8QJtKiSvEK7Sv5ukuIsTJHCQZVaAN2Hu1hT24UGr2HM9Kkd9uOqSwWAnSBKjFeIU2lfFRtEcfEGU4lOIRXwqVCgdkFMQbb32VNNQQUyniqbOWfji/wA6Xafk1DW77qgxBBRDTSOaQQ0fGPmol2leIA2hSVG0rxCK+Kj0TDaVGOyVLNYS6QR0hxUS7RkSAbTsleIV2lf46lSpUqVoNrI1n6Tak2qbZANof6ioLrNgl3hL3H1GOn1GzGUlEoQ+EogVqBsBFtVgjUVS4K8QlCWUAsWMLlm1bwIhkFNPb+dzl2otoL0miJDmlACSw6kIpU4HWtZoZWWW4qDT/NUgWsijfw8O2BX+pUYIS8shfo9TZ0E6QpKjbaV4gf69Sv8AaSNtSU4geJUr/YqNoh2+QCaED+AcP0lYlk0hEhdX1BA9cRhsgwUcGLsuqGseUwQIjgdbD+FRpbVWrVzQL0BWgUA9GKiIJTYvZTrMzIs0CCTNDejNJbZzRDUA0A2P8yRtqSnEKSv9dI32leIRX/19Qk6F9L1AyrhWIo0GTCyQCNOBEtEPwVc5SZixS3LYXTTFUEeKJIghpVqlp+QY4rTK75yWNapxG0xkqVMk2ujTZmlEFQKtbf8A8HaPNCFiqjdVXlWO7hTIDcitK4LaWLC5wZYBNug9wvwVf6UW7pMJYQygqAoDj/8Ag3//2Q==' Local $bString = Binary(_Base64Decode($Logo)) If $bSaveBinary Then Local $hFile = FileOpen($sSavePath & "\GDI+ Color Transformer 07.2.2.1.jpg", 18) FileWrite($hFile, $bString) FileClose($hFile) EndIf Return $bString EndFunc ;==>_Logo Func _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 ;==>_Base64Decode Func _WinAPI_LZNTDecompress(ByRef $tInput, ByRef $tOutput, $iBufferSize) $tOutput = DllStructCreate("byte[" & $iBufferSize & "]") If @error Then Return SetError(1, 0, 0) Local $aRet = DllCall("ntdll.dll", "uint", "RtlDecompressBuffer", "ushort", 0x0002, "struct*", $tOutput, "ulong", $iBufferSize, "struct*", $tInput, "ulong", DllStructGetSize($tInput), "ulong*", 0) If @error Then Return SetError(2, 0, 0) If $aRet[0] Then Return SetError(3, $aRet[0], 0) Return $aRet[6] EndFunc ;==>_WinAPI_LZNTDecompress #EndRegion needed additional functions Requirements: Vista or higher operating system! Souce Code is made for AutoIt version 3.3.8.1 only!
       
       
      Please report any bug if found (I'm sure you will  )
       
      Download: GDI+ Color Transformer v0.9.7 build 2016-04-23.7z  (previous downloads: 347)
       
      Br,
      UEZ
×
×
  • Create New...