corz.org uses cookies to remember that you've seen this notice explaining that corz.org uses cookies, okay!
;
;
Global Const $hGIFDLL__KERNEL32 = DllOpen("kernel32.dll")
Global Const $hGIFDLL__USER32 = DllOpen("user32.dll")
Global Const $hGIFDLL__GDI32 = DllOpen("gdi32.dll")
Global Const $hGIFDLL__COMCTL32 = DllOpen("comctl32.dll")
Global Const $hGIFDLL__OLE32 = DllOpen("ole32.dll")
Global Const $hGIFDLL__GDIPLUS = DllOpen("gdiplus.dll")
;
Global $sGIF__ASSOCSTRING_INTERNAL = "
;
;
Func _GIF_DeleteGIF($iGIFId, $fDelCtrl = True)
Local $pGIF = _GIF_GetGIFAssoc($iGIFId)
Local $tGIF = DllStructCreate("handle GIFThread & _
"ptr CodeBuffer & _
"hwnd ControlHandle & _
"handle ImageList & _
"bool ExitFlag, _
$pGIF)
Local $hGIFThread = DllStructGetData($tGIF, "GIFThread")
If $hGIFThread Then
_GIF_ResumeThread($hGIFThread)
DllStructSetData($tGIF, "ExitFlag", 1)
_GIF_WaitForSingleObject($hGIFThread)
_GIF_CloseHandle($hGIFThread)
EndIf
Local $pCodeBuffer = DllStructGetData($tGIF, "CodeBuffer")
If $pCodeBuffer Then _GIF_MemGlobalFree($pCodeBuffer)
Local $hImageList = DllStructGetData($tGIF, "ImageList")
If $hImageList Then _GIF_ImageList_Destroy($hImageList)
_GIF_MemGlobalFree($pGIF)
_GIF_DeleteObject(GUICtrlSendMsg($iGIFId, 370, 0, 0))
If $fDelCtrl Then GUICtrlDelete($iGIFId)
$sGIF__ASSOCSTRING_INTERNAL = StringReplace($sGIF__ASSOCSTRING_INTERNAL, $iGIFId & "|" & $pGIF & ", "")
Return 1
EndFunc
;
Func _GIF_ExitAnimation($iGIFId)
Local $pGIF = _GIF_GetGIFAssoc($iGIFId)
Local $tGIF = DllStructCreate("handle GIFThread & _
"ptr CodeBuffer & _
"hwnd ControlHandle & _
"handle ImageList & _
"bool ExitFlag & _
"bool Transparent & _
"dword CurrentFrame, _
$pGIF)
Local $hGIFThread = DllStructGetData($tGIF, "GIFThread")
If $hGIFThread Then
_GIF_ResumeThread($hGIFThread)
DllStructSetData($tGIF, "ExitFlag", 1)
_GIF_WaitForSingleObject($hGIFThread)
_GIF_CloseHandle($hGIFThread)
DllStructSetData($tGIF, "GIFThread", 0)
EndIf
Local $pCodeBuffer = DllStructGetData($tGIF, "CodeBuffer")
If $pCodeBuffer Then _GIF_MemGlobalFree($pCodeBuffer)
DllStructSetData($tGIF, "CodeBuffer", 0)
Local $hImageList = DllStructGetData($tGIF, "ImageList")
If $hImageList Then _GIF_ImageList_Destroy($hImageList)
DllStructSetData($tGIF, "ImageList", 0)
DllStructSetData($tGIF, "CurrentFrame", 0)
GUICtrlSetState($iGIFId, GUICtrlGetState($iGIFId))
Return 1
EndFunc
;
Func _GIF_GetCurrentFrame($iGIFId)
Local $pGIF = _GIF_GetGIFAssoc($iGIFId)
Local $tGIF = DllStructCreate("handle GIFThread & _
"ptr CodeBuffer & _
"hwnd ControlHandle & _
"handle ImageList & _
"bool ExitFlag & _
"bool Transparent & _
"dword CurrentFrame, _
$pGIF)
Return DllStructGetData($tGIF, "CurrentFrame")
EndFunc
;
Func _GIF_GetDimension($vGIF, $vAdditionalData = "")
Local $aOut[2] = [0, 0]
Local $vData
If IsBinary($vGIF) Then
$vData = $vGIF
Else
If $vAdditionalData Then
Local $aData = StringSplit($vAdditionalData, ", 2)
If UBound($aData) < 3 Then ReDim $aData[3]
$vData = _GIF_ResourceGetAsRaw($vGIF, $aData[0], $aData[1], $aData[2])
If @error Then
$vData = $vGIF
Else
If $aData[0] = 2 Then $vData = _GIF_MakeBitmapFromRT_BITMAP($vData)
EndIf
Else
$vData = $vGIF
EndIf
EndIf
Local $hGDIP
Local $hMemGlobal
Local $pBitmap, $iWidth, $iHeight
If IsString($vData) Then
$pBitmap = _GIF_CreateBitmapFromFile($hGDIP, $vData, $iWidth, $iHeight)
If @error Then $pBitmap = _GIF_CreateBitmapFromBinaryImage($hGDIP, $hMemGlobal, Binary($vData), $iWidth, $iHeight)
If @error Then
$vData = FileRead($vData)
$pBitmap = _GIF_CreateBitmapFromBinaryImage($hGDIP, $hMemGlobal, $vData, $iWidth, $iHeight)
EndIf
Else
$pBitmap = _GIF_CreateBitmapFromBinaryImage($hGDIP, $hMemGlobal, $vData, $iWidth, $iHeight)
EndIf
If @error Then Return SetError(1, 0, $aOut)
_GIF_FreeGdipAndMem($pBitmap, $hGDIP, $hMemGlobal)
$aOut[0] = $iWidth
$aOut[1] = $iHeight
Return $aOut
EndFunc
;
Func _GIF_GetSize($iGIFId)
Local $pGIF = _GIF_GetGIFAssoc($iGIFId)
Local $aOut[2] = [0, 0]
Local $tGIF = DllStructCreate("handle GIFThread & _
"ptr CodeBuffer & _
"hwnd ControlHandle & _
"handle ImageList, _
$pGIF)
Local $hImageList = DllStructGetData($tGIF, "ImageList")
If $hImageList Then Return _GIF_ImageList_GetIconSize($hImageList)
Local $hControl = DllStructGetData($tGIF, "ControlHandle")
If Not $hControl Then Return SetError(1, 0, $aOut)
Local $aArray = WinGetPos($hControl)
If @error Then Return SetError(1, 0, $aOut)
$aOut[0] = $aArray[2]
$aOut[1] = $aArray[3]
Return $aOut
EndFunc
;
Func _GIF_PauseAnimation($iGIFId)
Local $pGIF = _GIF_GetGIFAssoc($iGIFId)
Local $tGIF = DllStructCreate("handle GIFThread, $pGIF)
Local $hGIFThread = DllStructGetData($tGIF, "GIFThread")
If Not $hGIFThread Then Return SetExtended(1, 1)
If _GIF_SuspendThread($hGIFThread) Then _GIF_ResumeThread($hGIFThread)
Return 1
EndFunc
;
Func _GIF_RefreshGIF($iGIFId)
Local $pGIF = _GIF_GetGIFAssoc($iGIFId)
Local $tGIF = DllStructCreate("handle GIFThread & _
"ptr CodeBuffer & _
"hwnd ControlHandle & _
"handle ImageList & _
"bool ExitFlag & _
"bool Transparent & _
"dword CurrentFrame, _
$pGIF)
If @error Then Return SetError(1, 0, 0)
If Not DllStructGetData($tGIF, "ImageList") Then Return 1
Local $hDC = _GIF_GetDC(DllStructGetData($tGIF, "ControlHandle"))
If @error Then Return SetError(2, 0, 0)
Local $iColorRef = -1
If DllStructGetData($tGIF, "Transparent") Then $iColorRef = _GIF_GetUnderlyingColor(DllStructGetData($tGIF, "ControlHandle"))
_GIF_ImageList_DrawEx(DllStructGetData($tGIF, "ImageList"), DllStructGetData($tGIF, "CurrentFrame"), $hDC, 0, 0, 0, 0, $iColorRef, -1, 0)
_GIF_ReleaseDC(0, $hDC)
Return 1
EndFunc
;
Func _GIF_ResumeAnimation($iGIFId)
Local $pGIF = _GIF_GetGIFAssoc($iGIFId)
Local $tGIF = DllStructCreate("handle GIFThread, $pGIF)
Local $hGIFThread = DllStructGetData($tGIF, "GIFThread")
If Not $hGIFThread Then Return SetExtended(1, 1)
If _GIF_ResumeThread($hGIFThread) = 2 Then _GIF_SuspendThread($hGIFThread)
Return 1
EndFunc
;
Func _GIF_ValidateGIF($iGIFId)
Local $pGIF = _GIF_GetGIFAssoc($iGIFId)
Local $tGIF = DllStructCreate("handle GIFThread & _
"ptr CodeBuffer & _
"hwnd ControlHandle & _
"handle ImageList & _
"bool ExitFlag & _
"bool Transparent & _
"dword CurrentFrame & _
"dword NumberOfFrames, _
$pGIF)
If @error Then Return SetError(1, 0, 0)
If DllStructGetData($tGIF, "NumberOfFrames") < 2 Then Return 1
If Not DllStructGetData($tGIF, "GIFThread") Then Return 1
_GIF_RedrawWindow(DllStructGetData($tGIF, "ControlHandle"), 0, 0, 1280)
_GIF_RefreshGIF($iGIFId)
Return 1
EndFunc
;
Func _GUICtrlCreateGIF($vGIF, $vAdditionalData, $iLeft, $iTop, $iWidth = Default, $iHeight = Default, $iRenderingStyle = Default, $iForcedARGB = Default, $hGIFControl = 0)
If $iWidth = -1 Then $iWidth = Default
If $iHeight = -1 Then $iHeight = Default
Local $vData
If IsBinary($vGIF) Then
$vData = $vGIF
Else
If $vAdditionalData Then
Local $aData = StringSplit($vAdditionalData, ", 2)
If UBound($aData) < 3 Then ReDim $aData[3]
$vData = _GIF_ResourceGetAsRaw($vGIF, $aData[0], $aData[1], $aData[2])
If @error Then
$vData = $vGIF
Else
If $aData[0] = 2 Then $vData = _GIF_MakeBitmapFromRT_BITMAP($vData)
EndIf
Else
$vData = $vGIF
EndIf
EndIf
Local $iWidthDef, $iHeightDef
If Not IsKeyword($iWidthDef) = 1 Then $iWidthDef = $iWidth
If Not IsKeyword($iHeightDef) = 1 Then $iHeightDef = $iHeight
Local $pGIF = _GIF_Create_pGIF($vData, $iWidthDef, $iHeightDef, $hGIFControl, $iLeft, $iTop, $iForcedARGB)
If @error Then
$vData = FileRead($vData)
$pGIF = _GIF_Create_pGIF($vData, $iWidthDef, $iHeightDef, $hGIFControl, $iLeft, $iTop, $iForcedARGB)
If @error Then
$pGIF = _GIF_Create_pGIF(Binary($vGIF), $iWidthDef, $iHeightDef, $hGIFControl, $iLeft, $iTop, $iForcedARGB)
If @error Then Return SetError(1, @extended = True, 0)
EndIf
EndIf
Local $tGIF = DllStructCreate("handle GIFThread & _
"ptr CodeBuffer & _
"hwnd ControlHandle & _
"handle ImageList & _
"bool ExitFlag & _
"bool Transparent & _
"dword CurrentFrame & _
"dword NumberOfFrames, _
$pGIF)
Local $iFrameCount = DllStructGetData($tGIF, "NumberOfFrames")
$tGIF = DllStructCreate("handle GIFThread & _
"ptr CodeBuffer & _
"hwnd ControlHandle & _
"handle ImageList & _
"bool ExitFlag & _
"bool Transparent & _
"dword CurrentFrame & _
"dword NumberOfFrames & _
"dword FrameDelay[" & $iFrameCount & "], _
$pGIF)
GUICtrlSetResizing($hGIFControl, 802)
DllStructSetData($tGIF, "ControlHandle", GUICtrlGetHandle($hGIFControl))
If $iFrameCount = 1 Then
$sGIF__ASSOCSTRING_INTERNAL &= $hGIFControl & "|" & $pGIF & "
Return SetExtended(1, $hGIFControl)
EndIf
Local $iSizeCodeBuffer = 157
If @AutoItX64 Then $iSizeCodeBuffer = 220
Local $pCodeBuffer = _GIF_MemGlobalAlloc($iSizeCodeBuffer, 64)
If @error Then Return SetError(2, 0, $hGIFControl)
DllStructSetData($tGIF, "CodeBuffer", $pCodeBuffer)
_GIF_VirtualProtect($pCodeBuffer, $iSizeCodeBuffer, 64)
If @error Then Return SetError(3, 0, $hGIFControl)
Local $tCodeBuffer = DllStructCreate("byte[" & $iSizeCodeBuffer & "]", $pCodeBuffer)
Local $pImageList_DrawEx = _GIF_GetAddress(_GIF_GetModuleHandle("comctl32.dll"), "ImageList_DrawEx")
If @error Then Return SetError(4, 1, $hGIFControl)
Local $pSleep = _GIF_GetAddress(_GIF_GetModuleHandle("kernel32.dll"), "Sleep")
If @error Then Return SetError(4, 2, $hGIFControl)
Local $pGetPixel = _GIF_GetAddress(_GIF_GetModuleHandle("gdi32.dll"), "GetPixel")
If @error Then Return SetError(4, 3, $hGIFControl)
Local $hUser32 = _GIF_GetModuleHandle("user32.dll")
Local $pGetDC = _GIF_GetAddress($hUser32, "GetDC")
If @error Then Return SetError(4, 4, $hGIFControl)
Local $pReleaseDC = _GIF_GetAddress($hUser32, "ReleaseDC")
If @error Then Return SetError(4, 5, $hGIFControl)
Local $hImageList = DllStructGetData($tGIF, "ImageList")
Local $hControl = DllStructGetData($tGIF, "ControlHandle")
Local $iStyle
If $iRenderingStyle = Default Then
$iStyle = 1
If DllStructGetData($tGIF, "Transparent") Then $iStyle = 0
Else
$iStyle = $iRenderingStyle
EndIf
If @AutoItX64 Then
DllStructSetData($tCodeBuffer, 1, _
"0x" & _
"4883EC" & _GIF_SwapEndian(88, 1) & _
"" & _
"4831F6" & _
"" & _
"" & _
"8BC6" & _
"A3" & _GIF_SwapEndian(DllStructGetPtr($tGIF, "CurrentFrame"), 8) & _
"" & _
"48B9" & _GIF_SwapEndian($hControl, 8) & _
"48B8" & _GIF_SwapEndian($pGetDC, 8) & _
"FFD0" & _
"" & _
"4889C3" & _
"" & _
"49C7C0" & _GIF_SwapEndian(0, 4) & _
"BA" & _GIF_SwapEndian(0, 4) & _
"4889C1" & _
"48B8" & _GIF_SwapEndian($pGetPixel, 8) & _
"FFD0" & _
"" & _
"3D" & _GIF_SwapEndian(-1, 4) & _
"75" & _GIF_SwapEndian(2, 1) & _
"8BC7" & _
"" & _
"8BF8" & _
"" & _
"89442438" & _
"B8" & _GIF_SwapEndian($iStyle, 4) & _
"89442448" & _
"4989D8" & _
"49C7C1" & _GIF_SwapEndian(0, 4) & _
"89F2" & _
"48B9" & _GIF_SwapEndian($hImageList, 8) & _
"" & _
"48B8" & _GIF_SwapEndian($pImageList_DrawEx, 8) & _
"FFD0" & _
"" & _
"4889DA" & _
"48B9" & _GIF_SwapEndian($hControl, 8) & _
"48B8" & _GIF_SwapEndian($pReleaseDC, 8) & _
"FFD0" & _
"" & _
"A1" & _GIF_SwapEndian(DllStructGetPtr($tGIF, "ExitFlag"), 8) & _
"85C0" & _
"75" & _GIF_SwapEndian(46, 1) & _
"" & _
"48BB" & _GIF_SwapEndian(DllStructGetPtr($tGIF, "FrameDelay"), 8) & _
"488B0CB3" & _
"48B8" & _GIF_SwapEndian($pSleep, 8) & _
"FFD0" & _
"" & _
"FFC6" & _
"" & _
"81FE" & _GIF_SwapEndian($iFrameCount, 4) & _
"" & _
"74" & _GIF_SwapEndian(5, 1) & _
"E9" & _GIF_SwapEndian(-200, 4) & _
"E9" & _GIF_SwapEndian(-208, 4) & _
"" & _
"4831C0" & _
"4883C4" & _GIF_SwapEndian(88, 1) & _
"C3" _
)
Else
DllStructSetData($tCodeBuffer, 1, _
"0x" & _
"" & _
"33F6" & _
"" & _
"" & _
"8BC6" & _
"A3" & _GIF_SwapEndian(DllStructGetPtr($tGIF, "CurrentFrame"), 4) & _
"68" & _GIF_SwapEndian($iStyle, 4) & _
"68" & _GIF_SwapEndian(-1, 4) & _
"" & _
"68" & _GIF_SwapEndian($hControl, 4) & _
"B8" & _GIF_SwapEndian($pGetDC, 4) & _
"FFD0" & _
"" & _
"8BD8" & _
"" & _
"68" & _GIF_SwapEndian(0, 4) & _
"68" & _GIF_SwapEndian(0, 4) & _
"53" & _
"B8" & _GIF_SwapEndian($pGetPixel, 4) & _
"FFD0" & _
"" & _
"3D" & _GIF_SwapEndian(-1, 4) & _
"75" & _GIF_SwapEndian(2, 1) & _
"8BC7" & _
"" & _
"8BF8" & _
"" & _
"50" & _
"68" & _GIF_SwapEndian(0, 4) & _
"68" & _GIF_SwapEndian(0, 4) & _
"68" & _GIF_SwapEndian(0, 4) & _
"68" & _GIF_SwapEndian(0, 4) & _
"53" & _
"56" & _
"68" & _GIF_SwapEndian($hImageList, 4) & _
"" & _
"B8" & _GIF_SwapEndian($pImageList_DrawEx, 4) & _
"FFD0" & _
"" & _
"53" & _
"68" & _GIF_SwapEndian($hControl, 4) & _
"B8" & _GIF_SwapEndian($pReleaseDC, 4) & _
"FFD0" & _
"" & _
"A1" & _GIF_SwapEndian(DllStructGetPtr($tGIF, "ExitFlag"), 4) & _
"85C0" & _
"75" & _GIF_SwapEndian(35, 1) & _
"" & _
"BB" & _GIF_SwapEndian(DllStructGetPtr($tGIF, "FrameDelay"), 4) & _
"8B0CB3" & _
"51" & _
"B8" & _GIF_SwapEndian($pSleep, 4) & _
"FFD0" & _
"" & _
"46" & _
"" & _
"81FE" & _GIF_SwapEndian($iFrameCount, 4) & _
"" & _
"74" & _GIF_SwapEndian(5, 1) & _
"E9" & _GIF_SwapEndian(-147, 4) & _
"E9" & _GIF_SwapEndian(-154, 4) & _
"" & _
"33C0" & _
"C3" _
)
EndIf
Local $hThread = _GIF_CreateThread($pCodeBuffer)
If @error Then Return SetError(5, 0, $hGIFControl)
DllStructSetData($tGIF, "GIFThread", $hThread)
_GIF_InvalidateRect(_GIF_GetParent($hControl))
$sGIF__ASSOCSTRING_INTERNAL &= $hGIFControl & "|" & $pGIF & "
Return $hGIFControl
EndFunc
;
Func _GUICtrlSetGIF($iControld, $vGIF, $vAdditionalData = Default, $iRenderingStyle = Default, $iForcedARGB = Default)
Local $aCtrlPos = WinGetPos(GUICtrlGetHandle($iControld))
If @error Then Return SetError(6, 0, False)
If $vAdditionalData = Default Then $vAdditionalData = ""
If $aCtrlPos[2] = 0 Then $aCtrlPos[2] = Default
If $aCtrlPos[3] = 0 Then $aCtrlPos[3] = Default
_GIF_DeleteGIF($iControld, False)
_GUICtrlCreateGIF($vGIF, $vAdditionalData, $aCtrlPos[0], $aCtrlPos[1], $aCtrlPos[2], $aCtrlPos[3], $iRenderingStyle, $iForcedARGB, $iControld)
Return SetError(@error, @extended, Not @error)
EndFunc
;
Func _GIF_CloseHandle($hHandle)
Local $aCall = DllCall($hGIFDLL__KERNEL32, "bool", "CloseHandle", "handle", $hHandle)
If @error Or Not $aCall[0] Then Return SetError(1, 0, 0)
Return 1
EndFunc
Func _GIF_WaitForSingleObject($hHandle, $iMiliSec = -1)
Local $aCall = DllCall($hGIFDLL__KERNEL32, "dword", "WaitForSingleObject", "handle", $hHandle, "dword", $iMiliSec)
If @error Then Return SetError(1, 0, 0)
Return $aCall[0]
EndFunc
Func _GIF_CreateThread($pAddress)
Local $aCall = DllCall($hGIFDLL__KERNEL32, "handle", "CreateThread", _
"ptr", 0, _
"dword_ptr", 0, _
"ptr", $pAddress, _
"ptr", 0, _
"dword", 0, _
"dword*", 0)
If @error Or Not $aCall[0] Then Return SetError(1, 0, 0)
Return $aCall[0]
EndFunc
Func _GIF_SuspendThread($hTread)
Local $aCall = DllCall($hGIFDLL__KERNEL32, "dword", "SuspendThread", "handle", $hTread)
If @error Or $aCall[0] = -1 Then Return SetError(1, 0, -1)
Return $aCall[0]
EndFunc
Func _GIF_ResumeThread($hTread)
Local $aCall = DllCall($hGIFDLL__KERNEL32, "dword", "ResumeThread", "handle", $hTread)
If @error Or $aCall[0] = -1 Then Return SetError(1, 0, -1)
Return $aCall[0]
EndFunc
Func _GIF_VirtualProtect($pAddress, $iSize, $iProtection)
Local $aCall = DllCall($hGIFDLL__KERNEL32, "bool", "VirtualProtect", "ptr", $pAddress, "dword_ptr", $iSize, "dword", $iProtection, "dword*", 0)
If @error Or Not $aCall[0] Then Return SetError(1, 0, 0)
Return 1
EndFunc
Func _GIF_GetAddress($hModule, $vFuncName)
Local $sType = "str"
If IsNumber($vFuncName) Then $sType = "int"
Local $aCall = DllCall($hGIFDLL__KERNEL32, "ptr", "GetProcAddress", "handle", $hModule, $sType, $vFuncName)
If @error Or Not $aCall[0] Then Return SetError(1, 0, 0)
Return $aCall[0]
EndFunc
Func _GIF_GetModuleHandle($vModule = 0)
Local $sType = "wstr"
If Not $vModule Then $sType = "ptr"
Local $aCall = DllCall($hGIFDLL__KERNEL32, "ptr", "GetModuleHandleW", $sType, $vModule)
If @error Or Not $aCall[0] Then Return SetError(1, 0, 0)
Return $aCall[0]
EndFunc
Func _GIF_GetBkColor($hWnd)
Local $hDC = _GIF_GetDC($hWnd)
If @error Then Return SetError(1, 0, -1)
Local $aCall = DllCall($hGIFDLL__GDI32, "dword", "GetBkColor", "handle", $hDC)
If @error Or $aCall[0] = -1 Then
_GIF_ReleaseDC($hWnd, $hDC)
Return SetError(2, 0, -1)
EndIf
_GIF_ReleaseDC($hWnd, $hDC)
Return $aCall[0]
EndFunc
Func _GIF_GetDC($hWnd)
Local $aCall = DllCall($hGIFDLL__USER32, "handle", "GetDC", "hwnd", $hWnd)
If @error Or Not $aCall[0] Then Return SetError(1, 0, 0)
Return $aCall[0]
EndFunc
Func _GIF_ReleaseDC($hWnd, $hDC)
Local $aCall = DllCall($hGIFDLL__USER32, "int", "ReleaseDC", "hwnd", $hWnd, "handle", $hDC)
If @error Or Not $aCall[0] Then Return SetError(1, 0, 0)
Return 1
EndFunc
Func _GIF_InvalidateRect($hWnd, $pRect = 0, $fErase = True)
Local $aCall = DllCall($hGIFDLL__USER32, "bool", "InvalidateRect", _
"hwnd", $hWnd, _
"ptr", $pRect, _
"bool", $fErase)
If @error Or Not $aCall[0] Then Return SetError(1, 0, 0)
Return 1
EndFunc
Func _GIF_ValidateRect($hWnd, $pRect = 0)
Local $aCall = DllCall($hGIFDLL__USER32, "bool", "ValidateRect", "hwnd", $hWnd, "ptr", $pRect)
If @error Or Not $aCall[0] Then Return SetError(1, 0, 0)
Return 1
EndFunc
Func _GIF_RedrawWindow($hWnd, $pRect, $hRegion, $iFlags)
Local $aCall = DllCall($hGIFDLL__USER32, "bool", "RedrawWindow", "hwnd", $hWnd, "ptr", $pRect, "handle", $hRegion, "dword", $iFlags)
If @error Or Not $aCall[0] Then Return SetError(1, 0, 0)
Return $aCall[0]
EndFunc
Func _GIF_GetUnderlyingColor($hWnd)
Local $hParent = _GIF_GetParent($hWnd)
If @error Then Return SetError(1, 0, -1)
Local $iColor = _GIF_GetBkColor($hParent)
Return SetError(@error, 0, $iColor)
EndFunc
Func _GIF_GetParent($hWnd)
Local $aCall = DllCall($hGIFDLL__USER32, "hwnd", "GetParent", "hwnd", $hWnd)
If @error Or Not $aCall[0] Then Return SetError(1, 0, 0)
Return $aCall[0]
EndFunc
Func _GIF_Create_pGIF($bBinary, ByRef $iWidth, ByRef $iHeight, ByRef $hGIFControl, $iLeft = 0, $iTop = 0, $iARGB = Default)
If $iARGB = Default Then $iARGB = 0xFF000000
Local $hGDIP
Local $hMemGlobal
Local $pBitmap, $iWidthReal, $iHeightReal
If IsBinary($bBinary) Then
$pBitmap = _GIF_CreateBitmapFromBinaryImage($hGDIP, $hMemGlobal, $bBinary, $iWidthReal, $iHeightReal)
Else
$pBitmap = _GIF_CreateBitmapFromFile($hGDIP, $bBinary, $iWidthReal, $iHeightReal)
EndIf
If @error Then
Local $iErr = @error
_GIF_FreeGdipAndMem($pBitmap, $hGDIP, $hMemGlobal)
Return SetError(1, $iErr, 0)
EndIf
Local $fDoResize
If $iWidth = Default Then
$iWidth = $iWidthReal
Else
$fDoResize = True
EndIf
If $iHeight = Default Then
$iHeight = $iHeightReal
Else
$fDoResize = True
EndIf
Local $iFrameDimensionsCount = _GIF_GdipImageGetFrameDimensionsCount($pBitmap)
If @error Then
_GIF_FreeGdipAndMem($pBitmap, $hGDIP, $hMemGlobal)
Return SetError(2, 0, 0)
EndIf
Local $tGUID = DllStructCreate("dword)
Local $pGUID = DllStructGetPtr($tGUID)
_GIF_GdipImageGetFrameDimensionsList($pBitmap, $pGUID, $iFrameDimensionsCount)
If @error Then
_GIF_FreeGdipAndMem($pBitmap, $hGDIP, $hMemGlobal)
Return SetError(3, 0, 0)
EndIf
Local $iFrameCount = _GIF_GdipImageGetFrameCount($pBitmap, $pGUID)
If @error Then
_GIF_FreeGdipAndMem($pBitmap, $hGDIP, $hMemGlobal)
Return SetError(4, 0, 0)
EndIf
Local $pGIF = _GIF_MemGlobalAlloc(4 * (8 + 4 * @AutoItX64 + $iFrameCount), 64)
If @error Then
_GIF_FreeGdipAndMem($pBitmap, $hGDIP, $hMemGlobal)
Return SetError(3, 0, 0)
EndIf
Local $tGIF = DllStructCreate("handle GIFThread & _
"ptr CodeBuffer & _
"hwnd ControlHandle & _
"handle ImageList & _
"bool ExitFlag & _
"bool Transparent & _
"dword CurrentFrame & _
"dword NumberOfFrames & _
"dword FrameDelay[" & $iFrameCount & "], _
$pGIF)
DllStructSetData($tGIF, "GIFThread", 0)
DllStructSetData($tGIF, "ControlHandle", 0)
DllStructSetData($tGIF, "ExitFlag", 0)
DllStructSetData($tGIF, "CurrentFrame", 0)
DllStructSetData($tGIF, "NumberOfFrames", $iFrameCount)
Local $fNewControl = False
If Not $hGIFControl Then
$fNewControl = True
$hGIFControl = GUICtrlCreatePic("", $iLeft, $iTop, $iWidth, $iHeight)
EndIf
If $iFrameCount = 1 Then
Local $hGIFBitmap = _GIF_GdipCreateHBITMAPFromBitmap($pBitmap, $iARGB)
If $fDoResize Then _GIF_ResizeBitmap($hGIFBitmap, $iWidth, $iHeight)
_GIF_FreeGdipAndMem($pBitmap, $hGDIP, $hMemGlobal)
_GIF_DeleteObject(GUICtrlSendMsg($hGIFControl, 370, 0, $hGIFBitmap))
_GIF_DeleteObject($hGIFBitmap)
Return $pGIF
EndIf
Local $hImageList = _GIF_ImageList_Create($iWidth, $iHeight, 32, $iFrameCount)
If @error Then
If $fNewControl Then GUICtrlDelete($hGIFControl)
_GIF_FreeGdipAndMem($pBitmap, $hGDIP, $hMemGlobal, $pGIF)
Return SetError(4, 0, 0)
EndIf
DllStructSetData($tGIF, "ImageList", $hImageList)
Local $hBitmap
For $j = 0 To $iFrameCount - 1
_GIF_GdipImageSelectActiveFrame($pBitmap, $pGUID, $j)
If @error Then ContinueLoop
$hBitmap = _GIF_GdipCreateHBITMAPFromBitmap($pBitmap, $iARGB)
If $fDoResize Then _GIF_ResizeBitmap($hBitmap, $iWidth, $iHeight)
_GIF_ImageList_Add($hImageList, $hBitmap)
If $j = 0 Then
_GIF_DeleteObject(GUICtrlSendMsg($hGIFControl, 370, 0, $hBitmap))
_GIF_DeleteObject($hBitmap)
EndIf
_GIF_DeleteObject($hBitmap)
Next
Local $iPropertyItemSize = _GIF_GdipGetPropertyItemSize($pBitmap, 0x5100)
If @error Then
If $fNewControl Then GUICtrlDelete($hGIFControl)
_GIF_FreeGdipAndMem($pBitmap, $hGDIP, $hMemGlobal, $pGIF)
Return SetError(5, 0, 0)
EndIf
Local $tRawPropItem = DllStructCreate("byte[" & $iPropertyItemSize & "]")
_GIF_GdipGetPropertyItem($pBitmap, 0x5100, $iPropertyItemSize, DllStructGetPtr($tRawPropItem))
If @error Then
If $fNewControl Then GUICtrlDelete($hGIFControl)
_GIF_FreeGdipAndMem($pBitmap, $hGDIP, $hMemGlobal, $pGIF)
Return SetError(6, 0, 0)
EndIf
Local $tPropItem = DllStructCreate("int Id & _
"dword Length & _
"word Type & _
"ptr Value", _
DllStructGetPtr($tRawPropItem))
Local $iSize = DllStructGetData($tPropItem, "Length") / 4
Local $tPropertyData = DllStructCreate("dword[" & $iSize & "]", DllStructGetData($tPropItem, "Value"))
Local $iDelay
For $j = 1 To $iFrameCount
$iDelay = DllStructGetData($tPropertyData, 1, $j) * 10
If Not $iDelay Then $iDelay = 130
If $iDelay < 50 Then $iDelay = 50
DllStructSetData($tGIF, "FrameDelay", $iDelay, $j)
Next
Local $fTransparent = True
Local $iPixelColor = _GIF_GdipBitmapGetPixel($pBitmap, 0, 0)
If BitShift($iPixelColor, 24) Then $fTransparent = False
DllStructSetData($tGIF, "Transparent", $fTransparent)
_GIF_FreeGdipAndMem($pBitmap, $hGDIP, $hMemGlobal)
Return $pGIF
EndFunc
Func _GIF_CreateStreamOnHGlobal($hGlobal, $iFlag = 1)
Local $aCall = DllCall($hGIFDLL__OLE32, "long", "CreateStreamOnHGlobal", "handle", $hGlobal, "int", $iFlag, "ptr*", 0)
If @error Or $aCall[0] Then Return SetError(1, 0, 0)
Return $aCall[3]
EndFunc
Func _GIF_GetObject($hObject, $iSize, $pObject)
Local $aCall = DllCall($hGIFDLL__GDI32, "int", "GetObject", "handle", $hObject, "int", $iSize, "ptr", $pObject)
If @error Then Return SetError(1, 0, 0)
Return $aCall[0]
EndFunc
Func _GIF_DeleteObject($hObject)
Local $aCall = DllCall($hGIFDLL__GDI32, "bool", "DeleteObject", "handle", $hObject)
If @error Or Not $aCall[0] Then Return SetError(1, 0, 0)
Return 1
EndFunc
Func _GIF_ImageList_GetIconSize($hImageList)
Local $aOut[2] = [0, 0]
Local $aCall = DllCall($hGIFDLL__COMCTL32, "bool", "ImageList_GetIconSize", "handle", $hImageList, "int*", 0, "int*", 0)
If @error Or Not $aCall[0] Then Return SetError(1, 0, $aOut)
$aOut[0] = $aCall[2]
$aOut[1] = $aCall[3]
Return $aOut
EndFunc
Func _GIF_ImageList_Create($iWidth, $iHeight, $iFlag, $iInitial, $iGrow = 0)
Local $aCall = DllCall($hGIFDLL__COMCTL32, "handle", "ImageList_Create", _
"int", $iWidth, _
"int", $iHeight, _
"dword", $iFlag, _
"int", $iInitial, _
"int", $iGrow)
If @error Or Not $aCall[0] Then Return SetError(1, 0, 0)
Return $aCall[0]
EndFunc
Func _GIF_ImageList_Add($hImageList, $hBitmap)
Local $aCall = DllCall($hGIFDLL__COMCTL32, "int", "ImageList_Add", _
"handle", $hImageList, _
"handle", $hBitmap, _
"handle", 0)
If @error Or $aCall[0] = -1 Then Return SetError(1, 0, 0)
Return $aCall[0]
EndFunc
Func _GIF_ImageList_Destroy($hImageList)
Local $aCall = DllCall($hGIFDLL__COMCTL32, "bool", "ImageList_Destroy", "handle", $hImageList)
If @error Or Not $aCall[0] Then Return SetError(1, 0, 0)
Return 1
EndFunc
Func _GIF_ImageList_DrawEx($hImageList, $iImageIndex, $hDC, $iXPos = 0, $iYPos = 0, $iWidth = 0, $iHeight = 0, $iBkColRef = -1, $iFgColRef = -1, $iStyle = 0)
Local $aCall = DllCall($hGIFDLL__COMCTL32, "bool", "ImageList_DrawEx", _
"handle", $hImageList, _
"int", $iImageIndex, _
"handle", $hDC, _
"int", $iXPos, _
"int", $iYPos, _
"int", $iWidth, _
"int", $iHeight, _
"dword", $iBkColRef, _
"dword", $iFgColRef, _
"dword", $iStyle)
If @error Or Not $aCall[0] Then Return SetError(1, 0, 0)
Return 1
EndFunc
Func _GIF_CreateBitmapFromFile(ByRef $hGDIP, $sFile, ByRef $iWidth, ByRef $iHeight)
$hGDIP = _GIF_GdiplusStartup()
If @error Then Return SetError(1, 0, 0)
Local $pBitmap = _GIF_GdipLoadImageFromFile($sFile)
If @error Then
_GIF_GdiplusShutdown($hGDIP)
Return SetError(2, 0, 0)
EndIf
_GIF_GdipGetImageDimension($pBitmap, $iWidth, $iHeight)
If @error Then
_GIF_FreeGdipAndMem($pBitmap, $hGDIP)
Return SetError(3, 0, 0)
EndIf
Return $pBitmap
EndFunc
Func _GIF_CreateBitmapFromBinaryImage(ByRef $hGDIP, ByRef $hMemGlobal, $bBinary, ByRef $iWidth, ByRef $iHeight)
$bBinary = Binary($bBinary)
Local $iSize = BinaryLen($bBinary)
$hMemGlobal = _GIF_MemGlobalAlloc($iSize, 2)
If @error Then Return SetError(1, 0, 0)
Local $pMemory = _GIF_MemGlobalLock($hMemGlobal)
If @error Then
_GIF_MemGlobalFree($hMemGlobal)
Return SetError(2, 0, 0)
EndIf
Local $tBinary = DllStructCreate("byte[" & $iSize & "]", $pMemory)
DllStructSetData($tBinary, 1, $bBinary)
Local $pStream = _GIF_CreateStreamOnHGlobal($pMemory, 0)
If @error Then
_GIF_MemGlobalFree($hMemGlobal)
Return SetError(3, 0, 0)
EndIf
_GIF_MemGlobalUnlock($pMemory)
$hGDIP = _GIF_GdiplusStartup()
If @error Then
_GIF_MemGlobalFree($hMemGlobal)
Return SetError(4, 0, 0)
EndIf
Local $pBitmap = _GIF_GdipCreateBitmapFromStream($pStream)
If @error Then
_GIF_GdiplusShutdown($hGDIP)
_GIF_MemGlobalFree($hMemGlobal)
Return SetError(5, 0, 0)
EndIf
_GIF_GdipGetImageDimension($pBitmap, $iWidth, $iHeight)
If @error Then
_GIF_FreeGdipAndMem($pBitmap, $hGDIP, $hMemGlobal)
Return SetError(6, 0, 0)
EndIf
DllCallAddress("dword", DllStructGetData(DllStructCreate("ptr QueryInterface, DllStructGetData(DllStructCreate("ptr pObj;", $pStream), "pObj")), "Release"), "ptr", $pStream)
Return $pBitmap
EndFunc
Func _GIF_ResizeBitmap(ByRef $hBitmap, $iNewWidth, $iNewHeight)
Local $tBMP = DllStructCreate("long Type)
_GIF_GetObject($hBitmap, DllStructGetSize($tBMP), DllStructGetPtr($tBMP))
Local $pBitmap = _GIF_GdipCreateBitmapFromScan0(DllStructGetData($tBMP, "Width"), DllStructGetData($tBMP, "Height"), DllStructGetData($tBMP, "WidthBytes"), 0x26200A, DllStructGetData($tBMP, "Bits"))
_GIF_GdipImageRotateFlip($pBitmap, 6)
Local $pNewBitmap = _GIF_GdipCreateBitmapFromScan0($iNewWidth, $iNewHeight)
Local $hGraphics = _GIF_GdipGetImageGraphicsContext($pNewBitmap)
_GIF_GdipDrawImageRect($hGraphics, $pBitmap, 0, 0, $iNewWidth, $iNewHeight)
Local $hNewBitmap = _GIF_GdipCreateHBITMAPFromBitmap($pNewBitmap)
_GIF_GdipDisposeImage($pBitmap)
_GIF_GdipDeleteGraphics($hGraphics)
_GIF_DeleteObject($hBitmap)
_GIF_GdipDisposeImage($pNewBitmap)
$hBitmap = $hNewBitmap
Return 1
EndFunc
Func _GIF_GdiplusStartup()
Local $tGdiplusStartupInput = DllStructCreate("dword GdiplusVersion & _
"ptr DebugEventCallback & _
"int SuppressBackgroundThread & _
"int SuppressExternalCodecs")
DllStructSetData($tGdiplusStartupInput, "GdiplusVersion", 1)
Local $aCall = DllCall($hGIFDLL__GDIPLUS, "dword", "GdiplusStartup", "dword_ptr*", 0, "ptr", DllStructGetPtr($tGdiplusStartupInput), "ptr", 0)
If @error Or $aCall[0] Then Return SetError(1, 0, 0)
Return $aCall[1]
EndFunc
Func _GIF_GdiplusShutdown($hGDIP)
DllCall($hGIFDLL__GDIPLUS, "none", "GdiplusShutdown", "dword_ptr", $hGDIP)
EndFunc
Func _GIF_GdipDisposeImage($hImage)
Local $aCall = DllCall($hGIFDLL__GDIPLUS, "dword", "GdipDisposeImage", "handle", $hImage)
If @error Or $aCall[0] Then Return SetError(1, 0, 0)
Return 1
EndFunc
Func _GIF_GdipGetImageDimension($pBitmap, ByRef $iWidth, ByRef $iHeight)
Local $aCall = DllCall($hGIFDLL__GDIPLUS, "dword", "GdipGetImageDimension", "ptr", $pBitmap, "float*", 0, "float*", 0)
If @error Or $aCall[0] Then Return SetError(1, 0, 0)
$iWidth = $aCall[2]
$iHeight = $aCall[3]
EndFunc
Func _GIF_GdipImageGetFrameDimensionsCount($pBitmap)
Local $aCall = DllCall($hGIFDLL__GDIPLUS, "dword", "GdipImageGetFrameDimensionsCount", "ptr", $pBitmap, "dword*", 0)
If @error Or $aCall[0] Then Return SetError(1, 0, 0)
Return $aCall[2]
EndFunc
Func _GIF_GdipImageGetFrameDimensionsList($pBitmap, $pGUID, $iFrameDimensionsCount)
Local $aCall = DllCall($hGIFDLL__GDIPLUS, "dword", "GdipImageGetFrameDimensionsList", _
"ptr", $pBitmap, _
"ptr", $pGUID, _
"dword", $iFrameDimensionsCount)
If @error Or $aCall[0] Then Return SetError(1, 0, 0)
Return 1
EndFunc
Func _GIF_GdipImageGetFrameCount($pBitmap, $pGUID)
Local $aCall = DllCall($hGIFDLL__GDIPLUS, "dword", "GdipImageGetFrameCount", _
"ptr", $pBitmap, _
"ptr", $pGUID, _
"dword*", 0)
If @error Or $aCall[0] Then Return SetError(1, 0, 0)
Return $aCall[3]
EndFunc
Func _GIF_GdipImageSelectActiveFrame($pBitmap, $pGUID, $iFrameIndex)
Local $aCall = DllCall($hGIFDLL__GDIPLUS, "dword", "GdipImageSelectActiveFrame", _
"ptr", $pBitmap, _
"ptr", $pGUID, _
"dword", $iFrameIndex)
If @error Or $aCall[0] Then Return SetError(1, 0, 0)
Return 1
EndFunc
Func _GIF_GdipGetPropertyItemSize($pBitmap, $iPropID)
Local $aCall = DllCall($hGIFDLL__GDIPLUS, "dword", "GdipGetPropertyItemSize", _
"ptr", $pBitmap, _
"ptr", $iPropID, _
"dword*", 0)
If @error Or $aCall[0] Then Return SetError(1, 0, 0)
Return $aCall[3]
EndFunc
Func _GIF_GdipGetPropertyItem($pBitmap, $iPropID, $iSize, $pBuffer)
Local $aCall = DllCall($hGIFDLL__GDIPLUS, "dword", "GdipGetPropertyItem", _
"ptr", $pBitmap, _
"dword", $iPropID, _
"dword", $iSize, _
"ptr", $pBuffer)
If @error Or $aCall[0] Then Return SetError(1, 0, 0)
Return 1
EndFunc
Func _GIF_GdipBitmapGetPixel($pBitmap, $iX, $iY)
Local $aCall = DllCall($hGIFDLL__GDIPLUS, "dword", "GdipBitmapGetPixel", _
"ptr", $pBitmap, _
"int", $iX, _
"int", $iY, _
"dword*", 0)
If @error Or $aCall[0] Then Return SetError(1, 0, 0)
Return $aCall[4]
EndFunc
Func _GIF_GdipLoadImageFromFile($sFile)
Local $aCall = DllCall($hGIFDLL__GDIPLUS, "dword", "GdipLoadImageFromFile", "wstr", $sFile, "ptr*", 0)
If @error Or $aCall[0] Then Return SetError(1, 0, 0)
Return $aCall[2]
EndFunc
Func _GIF_GdipCreateBitmapFromScan0($iWidth, $iHeight, $iStride = 0, $iPixelFormat = 0x26200A, $pScan0 = 0)
Local $aCall = DllCall($hGIFDLL__GDIPLUS, "dword", "GdipCreateBitmapFromScan0", "int", $iWidth, "int", $iHeight, "int", $iStride, "dword", $iPixelFormat, "ptr", $pScan0, "ptr*", 0)
If @error Or $aCall[0] Then Return SetError(1, 0, 0)
Return $aCall[6]
EndFunc
Func _GIF_GdipCreateBitmapFromStream($pStream)
Local $aCall = DllCall($hGIFDLL__GDIPLUS, "dword", "GdipCreateBitmapFromStream", "ptr", $pStream, "ptr*", 0)
If @error Or $aCall[0] Then Return SetError(1, 0, 0)
Return $aCall[2]
EndFunc
Func _GIF_GdipCreateHBITMAPFromBitmap($pBitmap, $iARGB = 0xFF000000)
Local $aCall = DllCall($hGIFDLL__GDIPLUS, "dword", "GdipCreateHBITMAPFromBitmap", "ptr", $pBitmap, "handle*", 0, "dword", $iARGB)
If @error Or $aCall[0] Then Return SetError(1, 0, 0)
Return $aCall[2]
EndFunc
Func _GIF_GdipGetImageGraphicsContext($hImage)
Local $aCall = DllCall($hGIFDLL__GDIPLUS, "dword", "GdipGetImageGraphicsContext", "ptr", $hImage, "ptr*", 0)
If @error Or $aCall[0] Then Return SetError(1, 0, 0)
Return $aCall[2]
EndFunc
Func _GIF_GdipDrawImageRect($hGraphics, $hImage, $iX, $iY, $iWidth, $iHeight)
Local $aCall = DllCall($hGIFDLL__GDIPLUS, "dword", "GdipDrawImageRectI", "ptr", $hGraphics, "ptr", $hImage, "int", $iX, "int", $iY, "int", $iWidth, "int", $iHeight)
If @error Or $aCall[0] Then Return SetError(1, 0, 0)
Return 1
EndFunc
Func _GIF_GdipDeleteGraphics($hGraphics)
Local $aCall = DllCall($hGIFDLL__GDIPLUS, "dword", "GdipDeleteGraphics", "handle", $hGraphics)
If @error Or $aCall[0] Then Return SetError(1, 0, 0)
Return 1
EndFunc
Func _GIF_GdipImageRotateFlip($hImage, $iType)
Local $aCall = DllCall($hGIFDLL__GDIPLUS, "dword", "GdipImageRotateFlip", "handle", $hImage, "dword", $iType)
If @error Or $aCall[0] Then Return SetError(1, 0, 0)
Return 1
EndFunc
Func _GIF_FreeGdipAndMem($pBitmap = 0, $hGDIP = 0, $hMem = 0, $pGIF = 0)
If $pBitmap Then _GIF_GdipDisposeImage($pBitmap)
If $hGDIP Then _GIF_GdiplusShutdown($hGDIP)
If $hMem Then _GIF_MemGlobalFree($hMem)
If $pGIF Then _GIF_MemGlobalFree($pGIF)
EndFunc
Func _GIF_MemGlobalAlloc($iSize, $iFlag)
Local $aCall = DllCall($hGIFDLL__KERNEL32, "handle", "GlobalAlloc", "dword", $iFlag, "dword_ptr", $iSize)
If @error Or Not $aCall[0] Then Return SetError(1, 0, 0)
Return $aCall[0]
EndFunc
Func _GIF_MemGlobalFree($hMem)
Local $aCall = DllCall($hGIFDLL__KERNEL32, "ptr", "GlobalFree", "handle", $hMem)
If @error Or $aCall[0] Then Return SetError(1, 0, 0)
Return 1
EndFunc
Func _GIF_MemGlobalLock($hMem)
Local $aCall = DllCall($hGIFDLL__KERNEL32, "ptr", "GlobalLock", "handle", $hMem)
If @error Or Not $aCall[0] Then Return SetError(1, 0, 0)
Return $aCall[0]
EndFunc
Func _GIF_MemGlobalUnlock($hMem)
Local $aCall = DllCall($hGIFDLL__KERNEL32, "bool", "GlobalUnlock", "handle", $hMem)
If @error Then Return SetError(1, 0, 0)
If $aCall[0] Or _GIF_GetLastError() Then Return $aCall[0]
Return 1
EndFunc
Func _GIF_GetLastError()
Local $aCall = DllCall($hGIFDLL__KERNEL32, "dword", "GetLastError")
If @error Then Return SetError(1, 0, -1)
Return $aCall[0]
EndFunc
Func _GIF_FindResourceEx($hModule, $vResType, $vResName, $iResLang = 0)
Local $sTypeType = "wstr"
If $vResType == Number($vResType) Then $sTypeType = "int"
Local $sNameType = "wstr"
If $vResName == Number($vResName) Then $sNameType = "int"
Local $aCall = DllCall($hGIFDLL__KERNEL32, "handle", "FindResourceExW", _
"handle", $hModule, _
$sTypeType, $vResType, _
$sNameType, $vResName, _
"int", $iResLang)
If @error Or Not $aCall[0] Then Return SetError(1, 0, 0)
Return $aCall[0]
EndFunc
Func _GIF_SizeofResource($hModule, $hResource)
Local $aCall = DllCall($hGIFDLL__KERNEL32, "int", "SizeofResource", "handle", $hModule, "handle", $hResource)
If @error Or Not $aCall[0] Then Return SetError(1, 0, 0)
Return $aCall[0]
EndFunc
Func _GIF_LoadResource($hModule, $hResource)
Local $aCall = DllCall($hGIFDLL__KERNEL32, "handle", "LoadResource", "handle", $hModule, "handle", $hResource)
If @error Or Not $aCall[0] Then Return SetError(1, 0, 0)
Return $aCall[0]
EndFunc
Func _GIF_LockResource($hResource)
Local $aCall = DllCall($hGIFDLL__KERNEL32, "ptr", "LockResource", "handle", $hResource)
If @error Or Not $aCall[0] Then Return SetError(1, 0, 0)
Return $aCall[0]
EndFunc
Func _GIF_LoadLibraryEx($sModule, $iFlag = 0)
Local $aCall = DllCall($hGIFDLL__KERNEL32, "handle", "LoadLibraryExW", "wstr", $sModule, "handle", 0, "dword", $iFlag)
If @error Or Not $aCall[0] Then Return SetError(1, 0, 0)
Return $aCall[0]
EndFunc
Func _GIF_FreeLibrary($hModule)
Local $aCall = DllCall($hGIFDLL__KERNEL32, "bool", "FreeLibrary", "handle", $hModule)
If @error Or Not $aCall[0] Then Return SetError(1, 0, 0)
Return $aCall[0]
EndFunc
Func _GIF_ResourceGetAsRaw($sModule, $vResType, $vResName, $iResLang = 0)
Local $hModule = _GIF_LoadLibraryEx($sModule, 2)
If @error Then Return SetError(1, 0, "")
Local $hResource = _GIF_FindResourceEx($hModule, $vResType, $vResName, $iResLang)
If @error Then
_GIF_FreeLibrary($hModule)
Return SetError(2, 0, "")
EndIf
Local $iSizeOfResource = _GIF_SizeofResource($hModule, $hResource)
If @error Then
_GIF_FreeLibrary($hModule)
Return SetError(3, 0, "")
EndIf
$hResource = _GIF_LoadResource($hModule, $hResource)
If @error Then
_GIF_FreeLibrary($hModule)
Return SetError(4, 0, "")
EndIf
Local $pResource = _GIF_LockResource($hResource)
If @error Then
_GIF_FreeLibrary($hModule)
Return SetError(5, 0, "")
EndIf
Local $tBinary = DllStructCreate("byte[" & $iSizeOfResource & "]", $pResource)
Local $bBinary = DllStructGetData($tBinary, 1)
_GIF_FreeLibrary($hModule)
Return $bBinary
EndFunc
Func _GIF_MakeBitmapFromRT_BITMAP($bBinary)
Local $tBinary = DllStructCreate("byte[" & BinaryLen($bBinary) & "]")
DllStructSetData($tBinary, 1, $bBinary)
Local $iHeaderSize = DllStructGetData(DllStructCreate("dword HeaderSize", DllStructGetPtr($tBinary)), "HeaderSize")
Local $tBitmap, $iMultiplier
Switch $iHeaderSize
Case 40
$tBitmap = DllStructCreate("dword HeaderSize & _
"dword Width & _
"dword Height & _
"word Planes & _
"word BitPerPixel & _
"dword CompressionMethod & _
"dword Size & _
"dword Hresolution & _
"dword Vresolution & _
"dword Colors & _
"dword ImportantColors", _
DllStructGetPtr($tBinary))
$iMultiplier = 4
Case 12
$tBitmap = DllStructCreate("dword HeaderSize & _
"word Width & _
"word Height & _
"word Planes & _
"word BitPerPixel", _
DllStructGetPtr($tBinary))
$iMultiplier = 3
Case Else
Return SetError(1, 0, 0)
EndSwitch
Local $iExponent = DllStructGetData($tBitmap, "BitPerPixel")
Local $tDIB = DllStructCreate("align 2 & _
"dword BitmapSize & _
"short & _
"short & _
"dword BitmapOffset & _
"byte Body[" & BinaryLen($bBinary) & "]")
DllStructSetData($tDIB, "Identifier", "BM")
DllStructSetData($tDIB, "BitmapSize", BinaryLen($bBinary) + 14)
Local $iRawBitmapSize = DllStructGetData($tBitmap, "Size")
If $iRawBitmapSize Then
DllStructSetData($tDIB, "BitmapOffset", BinaryLen($bBinary) - $iRawBitmapSize + 14)
Else
If $iExponent = 24 Then
DllStructSetData($tDIB, "BitmapOffset", $iHeaderSize + 14)
Else
Local $iWidth = DllStructGetData($tBitmap, "Width")
Local $iHeight = DllStructGetData($tBitmap, "Height")
$iRawBitmapSize = 4 * Floor(($iWidth * $iExponent + 31) / 32) * $iHeight
Local $iOffset1 = BinaryLen($bBinary) - $iRawBitmapSize + 14
Local $iOffset2 = 2 ^ $iExponent * $iMultiplier + $iHeaderSize + 14
If $iOffset2 < $iOffset1 Then
DllStructSetData($tDIB, "BitmapOffset", $iOffset2)
Else
DllStructSetData($tDIB, "BitmapOffset", $iOffset1 - 2)
EndIf
EndIf
EndIf
DllStructSetData($tDIB, "Body", $bBinary)
Return DllStructGetData(DllStructCreate("byte[" & DllStructGetSize($tDIB) & "]", DllStructGetPtr($tDIB)), 1)
EndFunc
Func _GIF_SwapEndian($iValue, $iSize = 0)
If $iSize Then
Local $sPadd = "00000000"
Return Hex(BinaryMid($iValue, 1, $iSize)) & StringLeft($sPadd, 2 * ($iSize - BinaryLen($iValue)))
EndIf
Return Hex(Binary($iValue))
EndFunc
Func _GIF_GetGIFAssoc($iGIFId)
Local $aArray = StringRegExp($sGIF__ASSOCSTRING_INTERNAL, "(?i) & $iGIFId & "\|(.*?);", 3)
If @error Then Return 0
Return Ptr($aArray[0])
EndFunc