1450 lines
67 KiB
AutoIt
1450 lines
67 KiB
AutoIt
|
;.......script written by trancexx (trancexx at yahoo dot com)
|
||
|
|
||
|
#include-once
|
||
|
|
||
|
; #INDEX# ========================================================================================
|
||
|
; Title ...............: GIFAnimation v2.1.2
|
||
|
; File Name............: GIFAnimation.au3
|
||
|
; Min. AutoIt Version..: v3.3.2.0
|
||
|
; Description .........: Display GIF in AutoIt
|
||
|
; Author... ...........: trancexx
|
||
|
; Dll .................: kernel32.dll, user32.dll, gdi32.dll, comctl32.dll, ole32.dll, gdiplus.dll
|
||
|
; ================================================================================================
|
||
|
|
||
|
; #CONSTANTS# ===============================================================================
|
||
|
; Pseudo-handles for DLLs to use
|
||
|
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# ==================================================================================
|
||
|
; GIF associative string. Don't try to edit the content, this is very important internal variable!
|
||
|
Global $sGIF__ASSOCSTRING_INTERNAL = ";"
|
||
|
;============================================================================================
|
||
|
|
||
|
; #CURRENT# =================================================================================
|
||
|
;_GIF_DeleteGIF
|
||
|
;_GIF_ExitAnimation
|
||
|
;_GIF_GetCurrentFrame
|
||
|
;_GIF_GetDimension
|
||
|
;_GIF_GetSize
|
||
|
;_GIF_PauseAnimation
|
||
|
;_GIF_RefreshGIF
|
||
|
;_GIF_ResumeAnimation
|
||
|
;_GIF_ValidateGIF
|
||
|
;_GUICtrlCreateGIF
|
||
|
;_GUICtrlSetGIF
|
||
|
; ===========================================================================================
|
||
|
|
||
|
; #FUNCTION# ;===============================================================================
|
||
|
; Name...........: _GIF_DeleteGIF
|
||
|
; Description ...: Deletes GIF control
|
||
|
; Syntax.........: _GIF_DeleteGIF($iGIFId)
|
||
|
; Parameters ....: $iGIFId - Control ID. Returned by _GUICtrlCreateGIF function
|
||
|
; Return values .: Returns 1
|
||
|
; Author ........: trancexx
|
||
|
;============================================================================================
|
||
|
Func _GIF_DeleteGIF($iGIFId, $fDelCtrl = True)
|
||
|
Local $pGIF = _GIF_GetGIFAssoc($iGIFId)
|
||
|
; Read $pGIF (shorter version - only handles and memory pointers)
|
||
|
Local $tGIF = DllStructCreate("handle GIFThread;" & _
|
||
|
"ptr CodeBuffer;" & _
|
||
|
"hwnd ControlHandle;" & _
|
||
|
"handle ImageList;" & _
|
||
|
"bool ExitFlag;", _
|
||
|
$pGIF)
|
||
|
; GIFThread. Will alow it to exit gracefully for it to close all internally opened handles
|
||
|
Local $hGIFThread = DllStructGetData($tGIF, "GIFThread")
|
||
|
If $hGIFThread Then
|
||
|
; Maybe it's suspended
|
||
|
_GIF_ResumeThread($hGIFThread)
|
||
|
; Set exit Flag
|
||
|
DllStructSetData($tGIF, "ExitFlag", 1)
|
||
|
; Thread will exit now. Wait for it to exit
|
||
|
_GIF_WaitForSingleObject($hGIFThread)
|
||
|
_GIF_CloseHandle($hGIFThread) ; closing the handle
|
||
|
EndIf
|
||
|
; CodeBuffer
|
||
|
Local $pCodeBuffer = DllStructGetData($tGIF, "CodeBuffer")
|
||
|
If $pCodeBuffer Then _GIF_MemGlobalFree($pCodeBuffer)
|
||
|
; ImageList
|
||
|
Local $hImageList = DllStructGetData($tGIF, "ImageList")
|
||
|
If $hImageList Then _GIF_ImageList_Destroy($hImageList)
|
||
|
; The rest of the cleaning job
|
||
|
_GIF_MemGlobalFree($pGIF)
|
||
|
; Not sure if GUICtrlDelete will delete associated Bitmap. Will do that by myself...
|
||
|
_GIF_DeleteObject(GUICtrlSendMsg($iGIFId, 370, 0, 0)) ; STM_SETIMAGE
|
||
|
; Delete control
|
||
|
If $fDelCtrl Then GUICtrlDelete($iGIFId)
|
||
|
; Remove this entry from global assoc string
|
||
|
$sGIF__ASSOCSTRING_INTERNAL = StringReplace($sGIF__ASSOCSTRING_INTERNAL, $iGIFId & "|" & $pGIF & ";", "")
|
||
|
Return 1
|
||
|
EndFunc ;==>_GIF_DeleteGIF
|
||
|
|
||
|
; #FUNCTION# ;===============================================================================
|
||
|
; Name...........: _GIF_ExitAnimation
|
||
|
; Description ...: Exits animation of GIF control
|
||
|
; Syntax.........: _GIF_ExitAnimation($iGIFId)
|
||
|
; Parameters ....: $iGIFId - Control ID. Returned by _GUICtrlCreateGIF function
|
||
|
; Return values .: Returns 1
|
||
|
; Author ........: trancexx
|
||
|
;============================================================================================
|
||
|
Func _GIF_ExitAnimation($iGIFId)
|
||
|
Local $pGIF = _GIF_GetGIFAssoc($iGIFId)
|
||
|
; Read $pGIF (shorter version - only handles and memory pointers)
|
||
|
Local $tGIF = DllStructCreate("handle GIFThread;" & _
|
||
|
"ptr CodeBuffer;" & _
|
||
|
"hwnd ControlHandle;" & _
|
||
|
"handle ImageList;" & _
|
||
|
"bool ExitFlag;" & _
|
||
|
"bool Transparent;" & _
|
||
|
"dword CurrentFrame;", _
|
||
|
$pGIF)
|
||
|
; GIFThread. Will alow it to exit gracefully for it to close all internally opened handles
|
||
|
Local $hGIFThread = DllStructGetData($tGIF, "GIFThread")
|
||
|
If $hGIFThread Then
|
||
|
; Maybe it's suspended
|
||
|
_GIF_ResumeThread($hGIFThread)
|
||
|
; Set exit Flag
|
||
|
DllStructSetData($tGIF, "ExitFlag", 1)
|
||
|
; Thread will exit now. Wait for it to exit
|
||
|
_GIF_WaitForSingleObject($hGIFThread)
|
||
|
_GIF_CloseHandle($hGIFThread) ; closing the handle
|
||
|
DllStructSetData($tGIF, "GIFThread", 0)
|
||
|
EndIf
|
||
|
; CodeBuffer
|
||
|
Local $pCodeBuffer = DllStructGetData($tGIF, "CodeBuffer")
|
||
|
If $pCodeBuffer Then _GIF_MemGlobalFree($pCodeBuffer)
|
||
|
DllStructSetData($tGIF, "CodeBuffer", 0)
|
||
|
; ImageList
|
||
|
Local $hImageList = DllStructGetData($tGIF, "ImageList")
|
||
|
If $hImageList Then _GIF_ImageList_Destroy($hImageList)
|
||
|
DllStructSetData($tGIF, "ImageList", 0)
|
||
|
; Set value of CurrentFrame to 0
|
||
|
DllStructSetData($tGIF, "CurrentFrame", 0)
|
||
|
; Refresh the control
|
||
|
GUICtrlSetState($iGIFId, GUICtrlGetState($iGIFId))
|
||
|
Return 1
|
||
|
EndFunc ;==>_GIF_ExitAnimation
|
||
|
|
||
|
; #FUNCTION# ;===============================================================================
|
||
|
; Name...........: _GIF_GetCurrentFrame
|
||
|
; Description ...: Retrieves index of currently displayed frame of the GIF control
|
||
|
; Syntax.........: _GIF_GetCurrentFrame($iGIFId)
|
||
|
; Parameters ....: $iGIFId - Control ID. Returned by _GUICtrlCreateGIF function
|
||
|
; Return values .: Returns frame index
|
||
|
; Author ........: trancexx
|
||
|
;============================================================================================
|
||
|
Func _GIF_GetCurrentFrame($iGIFId)
|
||
|
Local $pGIF = _GIF_GetGIFAssoc($iGIFId)
|
||
|
; Read $pGIF (shorter version)
|
||
|
Local $tGIF = DllStructCreate("handle GIFThread;" & _
|
||
|
"ptr CodeBuffer;" & _
|
||
|
"hwnd ControlHandle;" & _
|
||
|
"handle ImageList;" & _
|
||
|
"bool ExitFlag;" & _
|
||
|
"bool Transparent;" & _
|
||
|
"dword CurrentFrame;", _
|
||
|
$pGIF)
|
||
|
Return DllStructGetData($tGIF, "CurrentFrame")
|
||
|
EndFunc ;==>_GIF_GetCurrentFrame
|
||
|
|
||
|
; #FUNCTION# ;===============================================================================
|
||
|
; Name...........: _GIF_GetDimension
|
||
|
; Description ...: Returns array of GIF image dimension
|
||
|
; Syntax.........: _GIF_GetDimension($vGIF [, $vAdditionalData])
|
||
|
; Parameters ....: $vGIF - filename of the GIF file
|
||
|
; $vAdditionalData - optional parameter used if the GIF if embedded resource inside PE file.
|
||
|
; resurce type, name and language (all separated by semicolon ';')
|
||
|
; language is optional
|
||
|
; Return values .: Success - Returns array which first element [0] is width,
|
||
|
; second element [1] is height
|
||
|
; Failure - Returns array which first element [0] is 0 (zero),
|
||
|
; second element [1] is 0 (zero),
|
||
|
; - Sets @error:
|
||
|
; |1 - invalid input or Gdip failure
|
||
|
; Author ........: trancexx
|
||
|
;============================================================================================
|
||
|
Func _GIF_GetDimension($vGIF, $vAdditionalData = "")
|
||
|
Local $aOut[2] = [0, 0] ; preset output
|
||
|
Local $vData
|
||
|
; Process passed
|
||
|
If IsBinary($vGIF) Then ; GIF binary data passed
|
||
|
$vData = $vGIF
|
||
|
Else
|
||
|
If $vAdditionalData Then ; likely resource
|
||
|
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 ; it's not resource, $vAdditionalData was wrong
|
||
|
Else
|
||
|
; RT_BITMAP is stored without BMP header. Add it:
|
||
|
If $aData[0] = 2 Then $vData = _GIF_MakeBitmapFromRT_BITMAP($vData)
|
||
|
EndIf
|
||
|
Else
|
||
|
$vData = $vGIF ; maybe $vGIF is the file name
|
||
|
EndIf
|
||
|
EndIf
|
||
|
Local $hGDIP ; Gdip engine
|
||
|
Local $hMemGlobal ; Memory
|
||
|
; Bitmap object
|
||
|
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) ; Nothing worked. Invalid input or Gdip failure.
|
||
|
_GIF_FreeGdipAndMem($pBitmap, $hGDIP, $hMemGlobal)
|
||
|
$aOut[0] = $iWidth
|
||
|
$aOut[1] = $iHeight
|
||
|
Return $aOut
|
||
|
EndFunc ;==>_GIF_GetDimension
|
||
|
|
||
|
; #FUNCTION# ;===============================================================================
|
||
|
; Name...........: _GIF_GetSize
|
||
|
; Description ...: Returns array of GIF Control dimension
|
||
|
; Syntax.........: _GIF_GetSize($iGIFId)
|
||
|
; Parameters ....: $iGIFId - Control ID. Returned by _GUICtrlCreateGIF function
|
||
|
; Return values .: Success - Returns array which first element [0] is width,
|
||
|
; second element [1] is height,
|
||
|
; Failure - Returns array which first element [0] is 0 (zero),
|
||
|
; second element [1] is 0 (zero),
|
||
|
; Sets @error to 1
|
||
|
; Author ........: trancexx
|
||
|
;============================================================================================
|
||
|
Func _GIF_GetSize($iGIFId)
|
||
|
Local $pGIF = _GIF_GetGIFAssoc($iGIFId)
|
||
|
Local $aOut[2] = [0, 0] ; preset output
|
||
|
; Read $pGIF (shorter version)
|
||
|
Local $tGIF = DllStructCreate("handle GIFThread;" & _
|
||
|
"ptr CodeBuffer;" & _
|
||
|
"hwnd ControlHandle;" & _
|
||
|
"handle ImageList;", _
|
||
|
$pGIF)
|
||
|
; ImageList
|
||
|
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 ;==>_GIF_GetSize
|
||
|
|
||
|
; #FUNCTION# ;===============================================================================
|
||
|
; Name...........: _GIF_PauseAnimation
|
||
|
; Description ...: Pauses animation of GIF control
|
||
|
; Syntax.........: _GIF_PauseAnimation($iGIFId)
|
||
|
; Parameters ....: $iGIFId - Control ID. Returned by _GUICtrlCreateGIF function
|
||
|
; Return values .: Returns 1
|
||
|
; Author ........: trancexx
|
||
|
;============================================================================================
|
||
|
Func _GIF_PauseAnimation($iGIFId)
|
||
|
Local $pGIF = _GIF_GetGIFAssoc($iGIFId)
|
||
|
; Read $pGIF (short version - only GIFThread)
|
||
|
Local $tGIF = DllStructCreate("handle GIFThread;", $pGIF)
|
||
|
; GIFThread
|
||
|
Local $hGIFThread = DllStructGetData($tGIF, "GIFThread")
|
||
|
If Not $hGIFThread Then Return SetExtended(1, 1)
|
||
|
If _GIF_SuspendThread($hGIFThread) Then _GIF_ResumeThread($hGIFThread) ; make sure not to increment suspended count of the thread
|
||
|
Return 1
|
||
|
EndFunc ;==>_GIF_PauseAnimation
|
||
|
|
||
|
; #FUNCTION# ;===============================================================================
|
||
|
; Name...........: _GIF_RefreshGIF
|
||
|
; Description ...: Refreshes GIF control
|
||
|
; Syntax.........: _GIF_RefreshGIF($iGIFId)
|
||
|
; Parameters ....: $iGIFId - Control ID. Returned by _GUICtrlCreateGIF function
|
||
|
; Return values .: Success - Returns 1. Refreshes GIF control
|
||
|
; Failure - Sets @error:
|
||
|
; |1 - GIF Control doesn't exist
|
||
|
; |2 - Couldn't get DC for the control
|
||
|
; Remarks........: Meant to be used with GUIRegisterMsg function
|
||
|
; Author ........: trancexx
|
||
|
;============================================================================================
|
||
|
Func _GIF_RefreshGIF($iGIFId)
|
||
|
Local $pGIF = _GIF_GetGIFAssoc($iGIFId)
|
||
|
; Make structure at $pGIF address
|
||
|
Local $tGIF = DllStructCreate("handle GIFThread;" & _
|
||
|
"ptr CodeBuffer;" & _
|
||
|
"hwnd ControlHandle;" & _
|
||
|
"handle ImageList;" & _
|
||
|
"bool ExitFlag;" & _
|
||
|
"bool Transparent;" & _
|
||
|
"dword CurrentFrame;", _
|
||
|
$pGIF)
|
||
|
; If there is no $pGIF error will occur. Great opportunity to return
|
||
|
If @error Then Return SetError(1, 0, 0)
|
||
|
; Is it animated at all
|
||
|
If Not DllStructGetData($tGIF, "ImageList") Then Return 1
|
||
|
; Get DC
|
||
|
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")) ; if transparent gif then set bk color to GUI's bk color
|
||
|
_GIF_ImageList_DrawEx(DllStructGetData($tGIF, "ImageList"), DllStructGetData($tGIF, "CurrentFrame"), $hDC, 0, 0, 0, 0, $iColorRef, -1, 0)
|
||
|
_GIF_ReleaseDC(0, $hDC)
|
||
|
Return 1
|
||
|
EndFunc ;==>_GIF_RefreshGIF
|
||
|
|
||
|
; #FUNCTION# ;===============================================================================
|
||
|
; Name...........: _GIF_ResumeAnimation
|
||
|
; Description ...: Resumes stopped animation of GIF control
|
||
|
; Syntax.........: _GIF_ResumeAnimation($iGIFId)
|
||
|
; Parameters ....: $iGIFId - Control ID. Returned by _GUICtrlCreateGIF function
|
||
|
; Return values .: Returns 1
|
||
|
; Author ........: trancexx
|
||
|
;============================================================================================
|
||
|
Func _GIF_ResumeAnimation($iGIFId)
|
||
|
Local $pGIF = _GIF_GetGIFAssoc($iGIFId)
|
||
|
; Read $pGIF (short version - only GIFThread)
|
||
|
Local $tGIF = DllStructCreate("handle GIFThread;", $pGIF)
|
||
|
; GIFThread
|
||
|
Local $hGIFThread = DllStructGetData($tGIF, "GIFThread")
|
||
|
If Not $hGIFThread Then Return SetExtended(1, 1)
|
||
|
If _GIF_ResumeThread($hGIFThread) = 2 Then _GIF_SuspendThread($hGIFThread) ; make sure not to increment non-suspended count of the thread
|
||
|
Return 1
|
||
|
EndFunc ;==>_GIF_ResumeAnimation
|
||
|
|
||
|
; #FUNCTION# ;===============================================================================
|
||
|
; Name...........: _GIF_ValidateGIF
|
||
|
; Description ...: Removes the GIF Control from the update region of the main window and in the same time upates the control
|
||
|
; Syntax.........: _GIF_ValidateGIF($iGIFId)
|
||
|
; Parameters ....: $iGIFId - Control ID. Returned by _GUICtrlCreateGIF function
|
||
|
; Return values .: Success - Returns 1
|
||
|
; Failure - Sets @error to 1
|
||
|
; Remarks........: Meant to be used with GUIRegisterMsg function
|
||
|
; Author ........: trancexx
|
||
|
;============================================================================================
|
||
|
Func _GIF_ValidateGIF($iGIFId)
|
||
|
Local $pGIF = _GIF_GetGIFAssoc($iGIFId)
|
||
|
; Make structure at $pGIF address
|
||
|
Local $tGIF = DllStructCreate("handle GIFThread;" & _
|
||
|
"ptr CodeBuffer;" & _
|
||
|
"hwnd ControlHandle;" & _
|
||
|
"handle ImageList;" & _
|
||
|
"bool ExitFlag;" & _
|
||
|
"bool Transparent;" & _
|
||
|
"dword CurrentFrame;" & _
|
||
|
"dword NumberOfFrames;", _
|
||
|
$pGIF)
|
||
|
; If there is no $pGIF error will occur. Great opportunity to return
|
||
|
If @error Then Return SetError(1, 0, 0)
|
||
|
; Check to see if it's needed to proceed. If not then just return sucess
|
||
|
If DllStructGetData($tGIF, "NumberOfFrames") < 2 Then Return 1
|
||
|
; Is it animated at all
|
||
|
If Not DllStructGetData($tGIF, "GIFThread") Then Return 1
|
||
|
; Redraw the control
|
||
|
_GIF_RedrawWindow(DllStructGetData($tGIF, "ControlHandle"), 0, 0, 1280) ; RDW_UPDATENOW | RDW_FRAME
|
||
|
_GIF_RefreshGIF($iGIFId)
|
||
|
Return 1
|
||
|
EndFunc ;==>_GIF_ValidateGIF
|
||
|
|
||
|
; #FUNCTION# ;===============================================================================
|
||
|
; Name...........: _GUICtrlCreateGIF
|
||
|
; Description ...: Creates GIF control for the GUI
|
||
|
; Syntax.........: _GUICtrlCreateGIF($vGIF, $vAdditionalData, $iLeft, $iTop [, $iWidth = Default [, $iHeight = Default [, $iRenderingStyle = Default [, $iForcedARGB = Default ]]]])
|
||
|
; Parameters ....: $vGIF - filename of the GIF to be loaded
|
||
|
; $vAdditionalData - resurce type, name and language (all separated by semicolon ';') if the GIF is stored as resource inside PE file
|
||
|
; language is optional
|
||
|
; $iLeft - left side coordinate of the control
|
||
|
; $iTop - the top of the control
|
||
|
; $iWidth - [optional] the width of the control. Default is the width of the image.
|
||
|
; $iHeight - [optional] the height of the control. Default is the height of the image.
|
||
|
; $iRenderingStyle - [optional] Advanced optional parameter. Coresponds to style paremeter of ImageList_DrawEx function.Default is ILD_NORMAL for images with defined transparency.
|
||
|
; $iForcedARGB - [optional] Advanced optional parameter. Use with semi-transparent images. Default is 0xFF000000 (opaque black).
|
||
|
; Return values .: Success - Returns controlID of the new control
|
||
|
; - Sets @extended to 1 if GIF contains only one frame (no animation)
|
||
|
; Failure - Sets @error:
|
||
|
; |1 - if @extended is not set then failure is likely due to invalid input
|
||
|
; if @extended = 1 then Gdip failure occured
|
||
|
; 0 (zero) is returned in both cases
|
||
|
; |2 - Needed memory allocation failed. Returns ControlID.
|
||
|
; |3 - Memory protection step failed. Returns ControlID.
|
||
|
; |4 - Some of the functions are not accessible for unknown reasons. Check @extended to determine which one. Returns ControlID.
|
||
|
; |5 - Couldn't create thread for the animation. Returns ControlID.
|
||
|
; Author ........: trancexx
|
||
|
;============================================================================================
|
||
|
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
|
||
|
; Process passed
|
||
|
If IsBinary($vGIF) Then ; GIF binary data passed
|
||
|
$vData = $vGIF
|
||
|
Else
|
||
|
If $vAdditionalData Then ; likely resource
|
||
|
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 ; it's not resource, $vAdditionalData was wrong
|
||
|
Else
|
||
|
; RT_BITMAP is stored without BMP header. Add it:
|
||
|
If $aData[0] = 2 Then $vData = _GIF_MakeBitmapFromRT_BITMAP($vData)
|
||
|
EndIf
|
||
|
Else
|
||
|
$vData = $vGIF ; maybe $vGIF is the file name
|
||
|
EndIf
|
||
|
EndIf
|
||
|
; Generate pGIF
|
||
|
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 ; try some more options
|
||
|
$vData = FileRead($vData)
|
||
|
$pGIF = _GIF_Create_pGIF($vData, $iWidthDef, $iHeightDef, $hGIFControl, $iLeft, $iTop, $iForcedARGB)
|
||
|
If @error Then ; finally maybe it's GIF content passed as string
|
||
|
$pGIF = _GIF_Create_pGIF(Binary($vGIF), $iWidthDef, $iHeightDef, $hGIFControl, $iLeft, $iTop, $iForcedARGB)
|
||
|
If @error Then Return SetError(1, @extended = True, 0) ; Nothing worked, Invalid input or Gdip failure.
|
||
|
EndIf
|
||
|
EndIf
|
||
|
; Arrange/parse that space
|
||
|
Local $tGIF = DllStructCreate("handle GIFThread;" & _
|
||
|
"ptr CodeBuffer;" & _
|
||
|
"hwnd ControlHandle;" & _
|
||
|
"handle ImageList;" & _
|
||
|
"bool ExitFlag;" & _
|
||
|
"bool Transparent;" & _
|
||
|
"dword CurrentFrame;" & _
|
||
|
"dword NumberOfFrames;", _
|
||
|
$pGIF)
|
||
|
; Read NumberOfFrames to know the size of the structure
|
||
|
Local $iFrameCount = DllStructGetData($tGIF, "NumberOfFrames")
|
||
|
; Make it complete now:
|
||
|
$tGIF = DllStructCreate("handle GIFThread;" & _
|
||
|
"ptr CodeBuffer;" & _
|
||
|
"hwnd ControlHandle;" & _
|
||
|
"handle ImageList;" & _
|
||
|
"bool ExitFlag;" & _
|
||
|
"bool Transparent;" & _
|
||
|
"dword CurrentFrame;" & _
|
||
|
"dword NumberOfFrames;" & _
|
||
|
"dword FrameDelay[" & $iFrameCount & "];", _
|
||
|
$pGIF)
|
||
|
; Set default resizing value for this control
|
||
|
GUICtrlSetResizing($hGIFControl, 802)
|
||
|
; Save Control handle
|
||
|
DllStructSetData($tGIF, "ControlHandle", GUICtrlGetHandle($hGIFControl))
|
||
|
; If there is just one frame there is no animation. Return control id
|
||
|
If $iFrameCount = 1 Then
|
||
|
; Expand global assoc string
|
||
|
$sGIF__ASSOCSTRING_INTERNAL &= $hGIFControl & "|" & $pGIF & ";"
|
||
|
Return SetExtended(1, $hGIFControl)
|
||
|
EndIf
|
||
|
; Allocate enough memory space for machine code
|
||
|
Local $iSizeCodeBuffer = 157
|
||
|
If @AutoItX64 Then $iSizeCodeBuffer = 220 ; x64 code is little longer
|
||
|
Local $pCodeBuffer = _GIF_MemGlobalAlloc($iSizeCodeBuffer, 64) ; GPTR
|
||
|
If @error Then Return SetError(2, 0, $hGIFControl) ; Couldn't allocate
|
||
|
; Save that value
|
||
|
DllStructSetData($tGIF, "CodeBuffer", $pCodeBuffer)
|
||
|
; Set proper 'protection'
|
||
|
_GIF_VirtualProtect($pCodeBuffer, $iSizeCodeBuffer, 64) ; MEM_EXECUTE_READWRITE
|
||
|
If @error Then Return SetError(3, 0, $hGIFControl) ; Couldn't set MEM_EXECUTE_READWRITE
|
||
|
Local $tCodeBuffer = DllStructCreate("byte[" & $iSizeCodeBuffer & "]", $pCodeBuffer)
|
||
|
; Get functions addresses
|
||
|
Local $pImageList_DrawEx = _GIF_GetAddress(_GIF_GetModuleHandle("comctl32.dll"), "ImageList_DrawEx")
|
||
|
If @error Then Return SetError(4, 1, $hGIFControl) ; Couldn't get address of ImageList_DrawEx function
|
||
|
Local $pSleep = _GIF_GetAddress(_GIF_GetModuleHandle("kernel32.dll"), "Sleep")
|
||
|
If @error Then Return SetError(4, 2, $hGIFControl) ; Couldn't get address of Sleep function
|
||
|
Local $pGetPixel = _GIF_GetAddress(_GIF_GetModuleHandle("gdi32.dll"), "GetPixel")
|
||
|
If @error Then Return SetError(4, 3, $hGIFControl) ; Couldn't get address of GetPixel function
|
||
|
Local $hUser32 = _GIF_GetModuleHandle("user32.dll")
|
||
|
Local $pGetDC = _GIF_GetAddress($hUser32, "GetDC")
|
||
|
If @error Then Return SetError(4, 4, $hGIFControl) ; Couldn't get address of GetDC function
|
||
|
Local $pReleaseDC = _GIF_GetAddress($hUser32, "ReleaseDC")
|
||
|
If @error Then Return SetError(4, 5, $hGIFControl) ; Couldn't get address of ReleaseDC function
|
||
|
; Read from $tGIF
|
||
|
Local $hImageList = DllStructGetData($tGIF, "ImageList")
|
||
|
Local $hControl = DllStructGetData($tGIF, "ControlHandle")
|
||
|
; Define style for ImageList_DrawEx function
|
||
|
Local $iStyle
|
||
|
If $iRenderingStyle = Default Then
|
||
|
$iStyle = 1
|
||
|
If DllStructGetData($tGIF, "Transparent") Then $iStyle = 0 ; correct value if needed
|
||
|
Else
|
||
|
$iStyle = $iRenderingStyle
|
||
|
EndIf
|
||
|
; Write code
|
||
|
If @AutoItX64 Then
|
||
|
DllStructSetData($tCodeBuffer, 1, _
|
||
|
"0x" & _
|
||
|
"4883EC" & _GIF_SwapEndian(88, 1) & _ ; sub rsp, 88d ;<- expand the stack
|
||
|
"" & _ ; 10 START
|
||
|
"4831F6" & _ ; xor rsi, rsi ;<- rsi = 0
|
||
|
"" & _ ; 20 MAIN LOOP
|
||
|
"" & _ ; 25 SET CurrentFrame
|
||
|
"8BC6" & _ ; mov aax, asi ;<- esi is current frame index. Copy it to eax
|
||
|
"A3" & _GIF_SwapEndian(DllStructGetPtr($tGIF, "CurrentFrame"), 8) & _ ; mov $pCurrentFrame, eax ;<- from eax to structure
|
||
|
"" & _ ; 30 GET CONTROL'S DC
|
||
|
"48B9" & _GIF_SwapEndian($hControl, 8) & _ ; mov rcx, Control handle
|
||
|
"48B8" & _GIF_SwapEndian($pGetDC, 8) & _ ; mov rax, GetDC ;<- set rax to address of GetDC function
|
||
|
"FFD0" & _ ; call rax ;<- calling rax (function)
|
||
|
"" & _ ; 50 SAVE DC (to release later)
|
||
|
"4889C3" & _ ; mov rbx, rax ;<- storing DC into rbx
|
||
|
"" & _ ; 60 GET BACKGROUND COLOR (upper left pixel)
|
||
|
"49C7C0" & _GIF_SwapEndian(0, 4) & _ ; mov r8, $iTop ;<- Y coordinate (0)
|
||
|
"BA" & _GIF_SwapEndian(0, 4) & _ ; mov rdx, $iTop ;<- X coordinate (0)
|
||
|
"4889C1" & _ ; mov rcx, rax ;<- DC handle (currently rax=rbx, so I could have set it to rbx too with no difference)
|
||
|
"48B8" & _GIF_SwapEndian($pGetPixel, 8) & _ ; mov rax, GetPixel ;<- set rax to address of GetPixel function
|
||
|
"FFD0" & _ ; call rax ;<- calling rax (function)
|
||
|
"" & _ ; 65 CHECK for CLR_INVALID
|
||
|
"3D" & _GIF_SwapEndian(-1, 4) & _ ; cmp eax, -1
|
||
|
"75" & _GIF_SwapEndian(2, 1) & _ ; jne 2d ;<- if not equal then jump forward 2 bytes; (to 70)
|
||
|
"8BC7" & _ ; mov eax, edi ; If CLR_INVALID then retrieve the color value from memory (edi register).
|
||
|
"" & _ ; 70
|
||
|
"8BF8" & _ ; mov edi, eax ;<- from eax to edi This is to save the last valid value.
|
||
|
"" & _ ; 80
|
||
|
"89442438" & _ ; mov [rsp+56], eax ;<- SET $iBkColRef parameter
|
||
|
"B8" & _GIF_SwapEndian($iStyle, 4) & _ ; mov eax, $iStyle
|
||
|
"89442448" & _ ; mov [rsp+72], eax ;<- SET $iStyle parameter
|
||
|
"4989D8" & _ ; mov r8, rbx ; <- SET $hDC parameter
|
||
|
"49C7C1" & _GIF_SwapEndian(0, 4) & _ ; mov r9, 0 ; <- SET $iXPos parameter
|
||
|
"89F2" & _ ; mov edx, esi ; <- SET $iImageIndex parameter
|
||
|
"48B9" & _GIF_SwapEndian($hImageList, 8) & _ ; mov rcx, $hImageList handle ; <- SET $hImageList parameter
|
||
|
"" & _ ; 100 DRAW FINALLY
|
||
|
"48B8" & _GIF_SwapEndian($pImageList_DrawEx, 8) & _ ; mov rax, $pImageList_DrawEx ;<- set rax to address of ImageList_DrawEx function
|
||
|
"FFD0" & _ ; call rax ;<- calling rax (function)
|
||
|
"" & _ ; 110 RELEASE DC
|
||
|
"4889DA" & _ ; mov rdx, rbx ;<- previously stored DC
|
||
|
"48B9" & _GIF_SwapEndian($hControl, 8) & _ ; mov rcx, Control handle ;<- can be NULL too
|
||
|
"48B8" & _GIF_SwapEndian($pReleaseDC, 8) & _ ; mov rax, ReleaseDC ;<- set rax to address of ReleaseDC function
|
||
|
"FFD0" & _ ; call rax ;<- calling rax (function)
|
||
|
"" & _ ; 115 CHECK IF EXIT FLAG IS SET
|
||
|
"A1" & _GIF_SwapEndian(DllStructGetPtr($tGIF, "ExitFlag"), 8) & _ ; mov eax, Address of ExitFlag
|
||
|
"85C0" & _ ; test eax, eax
|
||
|
"75" & _GIF_SwapEndian(46, 1) & _ ; jne 46d ;<- if set then jump forward 46 bytes; (to 160)
|
||
|
"" & _ ; 120 SLEEP FOR GIF TIME DELAY VALUE
|
||
|
"48BB" & _GIF_SwapEndian(DllStructGetPtr($tGIF, "FrameDelay"), 8) & _ ; mov rbx, Address of FrameDelay
|
||
|
"488B0CB3" & _ ; mov rcx, qword[rbx+4*rsi] ;<- move pointer for every new frame to exact position
|
||
|
"48B8" & _GIF_SwapEndian($pSleep, 8) & _ ; mov rax, Sleep ;<- set rax to address of Sleep function
|
||
|
"FFD0" & _ ; call rax ;<- calling rax (function)
|
||
|
"" & _ ; 130 INCREMENTATING 'POSITION INDEX'
|
||
|
"FFC6" & _ ; inc esi ;<- increment esi by value of 1
|
||
|
"" & _ ; 140 CHECK 'POSITION'
|
||
|
"81FE" & _GIF_SwapEndian($iFrameCount, 4) & _ ; cmp esi, $iFrameCount ;<- compare esi with $iFrameCount
|
||
|
"" & _ ; 150 DEAL WITH DIFFERENT CASES
|
||
|
"74" & _GIF_SwapEndian(5, 1) & _ ; je 5d ;<- if equal jump forward five bytes
|
||
|
"E9" & _GIF_SwapEndian(-200, 4) & _ ; jmp -200d ;<- jump back 200 bytes (to 20)
|
||
|
"E9" & _GIF_SwapEndian(-208, 4) & _ ; jmp -208d ;<- jump back 208 bytes (to 10)
|
||
|
"" & _ ; 160 SET EXIT CODE TO 0 BEFORE THE END
|
||
|
"4831C0" & _ ; xor rax, rax ;<- rax = 0
|
||
|
"4883C4" & _GIF_SwapEndian(88, 1) & _ ; add rsp, 88d ;<- shrink stack (88 bytes)
|
||
|
"C3" _ ; ret ;<- Return.
|
||
|
)
|
||
|
Else
|
||
|
DllStructSetData($tCodeBuffer, 1, _
|
||
|
"0x" & _
|
||
|
"" & _ ; 10 START
|
||
|
"33F6" & _ ; xor esi, esi ;<- esi = 0
|
||
|
"" & _ ; 20 MAIN LOOP
|
||
|
"" & _ ; 25 SET CurrentFrame
|
||
|
"8BC6" & _ ; mov eax, esi ;<- esi is current frame index. Copy it to eax
|
||
|
"A3" & _GIF_SwapEndian(DllStructGetPtr($tGIF, "CurrentFrame"), 4) & _ ; mov $pCurrentFrame, eax ;<- from eax to structure
|
||
|
"68" & _GIF_SwapEndian($iStyle, 4) & _ ; push Style
|
||
|
"68" & _GIF_SwapEndian(-1, 4) & _ ; push FgColRef
|
||
|
"" & _ ; GET CONTROL'S DC
|
||
|
"68" & _GIF_SwapEndian($hControl, 4) & _ ; push Control handle
|
||
|
"B8" & _GIF_SwapEndian($pGetDC, 4) & _ ; mov eax, GetDC ;<- set eax to address of GetDC function
|
||
|
"FFD0" & _ ; call eax ;<- calling eax (function)
|
||
|
"" & _ ; 50 SAVE DC (to release later)
|
||
|
"8BD8" & _ ; mov ebx, eax ;<- storing DC into ebx
|
||
|
"" & _ ; 60 GET BACKGROUND COLOR (upper left pixel)
|
||
|
"68" & _GIF_SwapEndian(0, 4) & _ ; push Y coordinate
|
||
|
"68" & _GIF_SwapEndian(0, 4) & _ ; push X coordinate
|
||
|
"53" & _ ; push ebx ;<- DC handle (currently eax=ebx, so I could have pushed eax too with no difference)
|
||
|
"B8" & _GIF_SwapEndian($pGetPixel, 4) & _ ; mov eax, GetPixel ;<- set eax to address of GetPixel function
|
||
|
"FFD0" & _ ; call eax ;<- calling eax (function)
|
||
|
"" & _ ; 65 CHECK for CLR_INVALID
|
||
|
"3D" & _GIF_SwapEndian(-1, 4) & _ ; cmp eax, -1
|
||
|
"75" & _GIF_SwapEndian(2, 1) & _ ; jne 2d ;<- if not equal then jump forward 2 bytes; (to 70)
|
||
|
"8BC7" & _ ; mov eax, edi ; If CLR_INVALID then retrieve the color value from memory (edi register).
|
||
|
"" & _ ; 70
|
||
|
"8BF8" & _ ; mov edi, eax ;<- from eax to edi This is to save the last valid value.
|
||
|
"" & _ ; 80
|
||
|
"50" & _ ; push eax ; push retrieved background color on the stack
|
||
|
"68" & _GIF_SwapEndian(0, 4) & _ ; push Height
|
||
|
"68" & _GIF_SwapEndian(0, 4) & _ ; push Width
|
||
|
"68" & _GIF_SwapEndian(0, 4) & _ ; push YPos
|
||
|
"68" & _GIF_SwapEndian(0, 4) & _ ; push XPos
|
||
|
"53" & _ ; push ebx ;<- push DC (again)
|
||
|
"56" & _ ; push esi ;<- this is ImageList's index of the frame to render
|
||
|
"68" & _GIF_SwapEndian($hImageList, 4) & _ ; push ImageList
|
||
|
"" & _ ; 100 DRAW FINALLY
|
||
|
"B8" & _GIF_SwapEndian($pImageList_DrawEx, 4) & _ ; mov eax, ImageList_DrawEx ;<- set eax to address of ImageList_DrawEx function
|
||
|
"FFD0" & _ ; call eax ;<- calling eax (function)
|
||
|
"" & _ ; 110 RELEASE DC
|
||
|
"53" & _ ; push ebx ;<- DC is found in ebx
|
||
|
"68" & _GIF_SwapEndian($hControl, 4) & _ ; push Control handle ;<- can be NULL also
|
||
|
"B8" & _GIF_SwapEndian($pReleaseDC, 4) & _ ; mov eax, ReleaseDC ;<- set eax to address of ReleaseDC function
|
||
|
"FFD0" & _ ; call eax ;<- calling eax (function)
|
||
|
"" & _ ; 115 CHECK IF EXIT FLAG IS SET
|
||
|
"A1" & _GIF_SwapEndian(DllStructGetPtr($tGIF, "ExitFlag"), 4) & _ ; mov eax, Address of ExitFlag
|
||
|
"85C0" & _ ; test eax, eax
|
||
|
"75" & _GIF_SwapEndian(35, 1) & _ ; jne 35d ;<- if set then jump forward 35 bytes; (to 160)
|
||
|
"" & _ ; 120 SLEEP FOR GIF TIME DELAY VALUE
|
||
|
"BB" & _GIF_SwapEndian(DllStructGetPtr($tGIF, "FrameDelay"), 4) & _ ; mov ebx, Address of FrameDelay
|
||
|
"8B0CB3" & _ ; mov ecx, dword[ebx+4*esi] ;<- move pointer for every new frame to exact position
|
||
|
"51" & _ ; push ecx ;<- push TimeDelay value
|
||
|
"B8" & _GIF_SwapEndian($pSleep, 4) & _ ; mov eax, Sleep ;<- set eax to address of Sleep function
|
||
|
"FFD0" & _ ; call eax ;<- calling eax (function)
|
||
|
"" & _ ; 130 INCREMENTATING 'POSITION INDEX'
|
||
|
"46" & _ ; inc esi ;<- increment esi by value of 1
|
||
|
"" & _ ; 140 CHECK 'POSITION'
|
||
|
"81FE" & _GIF_SwapEndian($iFrameCount, 4) & _ ; cmp esi, $iFrameCount ;<- compare esi with $iFrameCount
|
||
|
"" & _ ; 150 DEAL WITH DIFFERENT CASES
|
||
|
"74" & _GIF_SwapEndian(5, 1) & _ ; je 5d ;<- if equal jump forward five bytes
|
||
|
"E9" & _GIF_SwapEndian(-147, 4) & _ ; jmp -147d ;<- jump back 147 bytes (to 20)
|
||
|
"E9" & _GIF_SwapEndian(-154, 4) & _ ; jmp -154d ;<- jump back 154 bytes (to 10)
|
||
|
"" & _ ; 160 SET EXIT CODE TO 0 BEFORE THE END
|
||
|
"33C0" & _ ; xor eax, eax ;<- eax = 0
|
||
|
"C3" _ ; ret ;<- Return.
|
||
|
)
|
||
|
EndIf
|
||
|
; Create thread in which to run the code
|
||
|
Local $hThread = _GIF_CreateThread($pCodeBuffer)
|
||
|
If @error Then Return SetError(5, 0, $hGIFControl) ; Couldn't create thread
|
||
|
; Save that handle
|
||
|
DllStructSetData($tGIF, "GIFThread", $hThread)
|
||
|
; Redraw parent window
|
||
|
_GIF_InvalidateRect(_GIF_GetParent($hControl))
|
||
|
; Expand global assoc string
|
||
|
$sGIF__ASSOCSTRING_INTERNAL &= $hGIFControl & "|" & $pGIF & ";"
|
||
|
; All went well. Return Control Identifier
|
||
|
Return $hGIFControl
|
||
|
EndFunc ;==>_GUICtrlCreateGIF
|
||
|
|
||
|
; #FUNCTION# ;===============================================================================
|
||
|
; Name...........: _GUICtrlSetGIF
|
||
|
; Description ...: Sets the image for a control
|
||
|
; Syntax.........: _GUICtrlSetGIF($iControld, $vGIF, [$vAdditionalData = Default, [, $iRenderingStyle = Default [, $iForcedARGB = Default]]])
|
||
|
; Parameters ....: $iControld - The control identifier (controlID)
|
||
|
; $vGIF - filename of the GIF to be loaded
|
||
|
; $vAdditionalData - resurce type, name and language (all separated by semicolon ';') if the GIF is stored as resource inside PE file
|
||
|
; language is optional. Default is empty string (no additional data).
|
||
|
; $iRenderingStyle - [optional] Advanced optional parameter. Coresponds to style paremeter of ImageList_DrawEx function.Default is ILD_NORMAL for images with defined transparency.
|
||
|
; $iForcedARGB - [optional] Advanced optional parameter. Use with semi-transparent images. Default is 0xFF000000 (opaque black).
|
||
|
; Return values .: Success - Returns True.
|
||
|
; - Sets @extended to 1 if GIF contains only one frame (no animation)
|
||
|
; Failure - Returns False.
|
||
|
; - Sets @error:
|
||
|
; |1 - if @extended is not set then failure is likely due to invalid input
|
||
|
; if @extended = 1 then Gdip failure occured.
|
||
|
; |2 - Needed memory allocation failed.
|
||
|
; |3 - Memory protection step failed.
|
||
|
; |4 - Some of the functions are not accessible for unknown reasons. Check @extended to determine which one.
|
||
|
; |5 - Couldn't create thread for the animation.
|
||
|
; |6 - Control ID invalid.
|
||
|
; Author ........: trancexx
|
||
|
;============================================================================================
|
||
|
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 ;==>_GUICtrlSetGIF
|
||
|
|
||
|
; #INTERNAL FUNCTIONS DOWN BELOW# ;==========================================================
|
||
|
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 ;==>_GIF_CloseHandle
|
||
|
|
||
|
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 ;==>_GIF_WaitForSingleObject
|
||
|
|
||
|
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 ;==>_GIF_CreateThread
|
||
|
|
||
|
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 ;==>_GIF_SuspendThread
|
||
|
|
||
|
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 ;==>_GIF_ResumeThread
|
||
|
|
||
|
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 ;==>_GIF_VirtualProtect
|
||
|
|
||
|
Func _GIF_GetAddress($hModule, $vFuncName)
|
||
|
Local $sType = "str"
|
||
|
If IsNumber($vFuncName) Then $sType = "int" ; if ordinal value passed
|
||
|
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 ;==>_GIF_GetAddress
|
||
|
|
||
|
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 ;==>_GIF_GetModuleHandle
|
||
|
|
||
|
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 ;==>_GIF_GetBkColor
|
||
|
|
||
|
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 ;==>_GIF_GetDC
|
||
|
|
||
|
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 ;==>_GIF_ReleaseDC
|
||
|
|
||
|
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 ;==>_GIF_InvalidateRect
|
||
|
|
||
|
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 ;==>_GIF_ValidateRect
|
||
|
|
||
|
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 ;==>_GIF_RedrawWindow
|
||
|
|
||
|
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 ;==>_GIF_GetUnderlyingColor
|
||
|
|
||
|
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 ;==>_GIF_GetParent
|
||
|
|
||
|
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 ; Gdip engine
|
||
|
Local $hMemGlobal ; Memory
|
||
|
; Bitmap object
|
||
|
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
|
||
|
; Get number of frame dimensions
|
||
|
Local $iFrameDimensionsCount = _GIF_GdipImageGetFrameDimensionsCount($pBitmap)
|
||
|
If @error Then
|
||
|
_GIF_FreeGdipAndMem($pBitmap, $hGDIP, $hMemGlobal)
|
||
|
Return SetError(2, 0, 0)
|
||
|
EndIf
|
||
|
; GUID
|
||
|
Local $tGUID = DllStructCreate("dword;word;word;byte[8]")
|
||
|
Local $pGUID = DllStructGetPtr($tGUID)
|
||
|
; Get the identifiers for the frame dimensions
|
||
|
_GIF_GdipImageGetFrameDimensionsList($pBitmap, $pGUID, $iFrameDimensionsCount)
|
||
|
If @error Then
|
||
|
_GIF_FreeGdipAndMem($pBitmap, $hGDIP, $hMemGlobal)
|
||
|
Return SetError(3, 0, 0)
|
||
|
EndIf
|
||
|
; Number of frames
|
||
|
Local $iFrameCount = _GIF_GdipImageGetFrameCount($pBitmap, $pGUID)
|
||
|
If @error Then
|
||
|
_GIF_FreeGdipAndMem($pBitmap, $hGDIP, $hMemGlobal)
|
||
|
Return SetError(4, 0, 0)
|
||
|
EndIf
|
||
|
; Allocate needed global memory
|
||
|
Local $pGIF = _GIF_MemGlobalAlloc(4 * (8 + 4 * @AutoItX64 + $iFrameCount), 64) ; GPTR
|
||
|
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)
|
||
|
; Set number of frames
|
||
|
DllStructSetData($tGIF, "NumberOfFrames", $iFrameCount)
|
||
|
; Make GIF Control
|
||
|
Local $fNewControl = False
|
||
|
If Not $hGIFControl Then
|
||
|
$fNewControl = True
|
||
|
$hGIFControl = GUICtrlCreatePic("", $iLeft, $iTop, $iWidth, $iHeight)
|
||
|
EndIf
|
||
|
; If frame count is 1 then free what needs to be freed and return $pGIF. This requires no animation.
|
||
|
If $iFrameCount = 1 Then
|
||
|
Local $hGIFBitmap = _GIF_GdipCreateHBITMAPFromBitmap($pBitmap, $iARGB)
|
||
|
If $fDoResize Then _GIF_ResizeBitmap($hGIFBitmap, $iWidth, $iHeight)
|
||
|
_GIF_FreeGdipAndMem($pBitmap, $hGDIP, $hMemGlobal)
|
||
|
; Render default image
|
||
|
_GIF_DeleteObject(GUICtrlSendMsg($hGIFControl, 370, 0, $hGIFBitmap)) ; STM_SETIMAGE
|
||
|
_GIF_DeleteObject($hGIFBitmap)
|
||
|
Return $pGIF
|
||
|
EndIf
|
||
|
; Make ImageList
|
||
|
Local $hImageList = _GIF_ImageList_Create($iWidth, $iHeight, 32, $iFrameCount) ; ILC_COLOR32
|
||
|
If @error Then
|
||
|
If $fNewControl Then GUICtrlDelete($hGIFControl)
|
||
|
_GIF_FreeGdipAndMem($pBitmap, $hGDIP, $hMemGlobal, $pGIF)
|
||
|
Return SetError(4, 0, 0)
|
||
|
EndIf
|
||
|
; Set imagelist
|
||
|
DllStructSetData($tGIF, "ImageList", $hImageList)
|
||
|
Local $hBitmap
|
||
|
For $j = 0 To $iFrameCount - 1 ; for all frames
|
||
|
; Select the frame
|
||
|
_GIF_GdipImageSelectActiveFrame($pBitmap, $pGUID, $j)
|
||
|
If @error Then ContinueLoop
|
||
|
; Fill the array with HBITMAPs
|
||
|
$hBitmap = _GIF_GdipCreateHBITMAPFromBitmap($pBitmap, $iARGB)
|
||
|
If $fDoResize Then _GIF_ResizeBitmap($hBitmap, $iWidth, $iHeight)
|
||
|
; Add it to the ImageList
|
||
|
_GIF_ImageList_Add($hImageList, $hBitmap)
|
||
|
If $j = 0 Then ; Export "static" GIF (first frame)
|
||
|
; Render default image
|
||
|
_GIF_DeleteObject(GUICtrlSendMsg($hGIFControl, 370, 0, $hBitmap)) ; STM_SETIMAGE
|
||
|
_GIF_DeleteObject($hBitmap)
|
||
|
EndIf
|
||
|
; Delete it
|
||
|
_GIF_DeleteObject($hBitmap)
|
||
|
Next
|
||
|
; Get size of PropertyTagFrameDelay
|
||
|
Local $iPropertyItemSize = _GIF_GdipGetPropertyItemSize($pBitmap, 0x5100) ; PropertyTagFrameDelay
|
||
|
If @error Then
|
||
|
If $fNewControl Then GUICtrlDelete($hGIFControl)
|
||
|
_GIF_FreeGdipAndMem($pBitmap, $hGDIP, $hMemGlobal, $pGIF)
|
||
|
Return SetError(5, 0, 0)
|
||
|
EndIf
|
||
|
; Raw structure for the call
|
||
|
Local $tRawPropItem = DllStructCreate("byte[" & $iPropertyItemSize & "]")
|
||
|
; Fill the structure
|
||
|
_GIF_GdipGetPropertyItem($pBitmap, 0x5100, $iPropertyItemSize, DllStructGetPtr($tRawPropItem)) ; PropertyTagFrameDelay
|
||
|
If @error Then
|
||
|
If $fNewControl Then GUICtrlDelete($hGIFControl)
|
||
|
_GIF_FreeGdipAndMem($pBitmap, $hGDIP, $hMemGlobal, $pGIF)
|
||
|
Return SetError(6, 0, 0)
|
||
|
EndIf
|
||
|
; Formatted structure in place of the raw
|
||
|
Local $tPropItem = DllStructCreate("int Id;" & _
|
||
|
"dword Length;" & _
|
||
|
"word Type;" & _
|
||
|
"ptr Value", _
|
||
|
DllStructGetPtr($tRawPropItem))
|
||
|
; Read the "Length"
|
||
|
Local $iSize = DllStructGetData($tPropItem, "Length") / 4 ; 'Delay Time' is dword type. 4 is size of dword.
|
||
|
; Make new structure for the data
|
||
|
Local $tPropertyData = DllStructCreate("dword[" & $iSize & "]", DllStructGetData($tPropItem, "Value"))
|
||
|
; Read and fill array
|
||
|
Local $iDelay
|
||
|
For $j = 1 To $iFrameCount ; loop through all frames
|
||
|
$iDelay = DllStructGetData($tPropertyData, 1, $j) * 10 ; 1 = 10 msec
|
||
|
; Corrections
|
||
|
If Not $iDelay Then $iDelay = 130 ; interpreting 0 as 130 ms
|
||
|
If $iDelay < 50 Then $iDelay = 50 ; will slow it down to prevent more extensive cpu usage
|
||
|
; Set delay
|
||
|
DllStructSetData($tGIF, "FrameDelay", $iDelay, $j)
|
||
|
Next
|
||
|
; Determining trancparency
|
||
|
Local $fTransparent = True ; preset
|
||
|
; Get pixel color
|
||
|
Local $iPixelColor = _GIF_GdipBitmapGetPixel($pBitmap, 0, 0) ; upper left pixel
|
||
|
; Color is ARGB. If A is set then it's not transparent
|
||
|
If BitShift($iPixelColor, 24) Then $fTransparent = False
|
||
|
; Set transparency
|
||
|
DllStructSetData($tGIF, "Transparent", $fTransparent)
|
||
|
; Free
|
||
|
_GIF_FreeGdipAndMem($pBitmap, $hGDIP, $hMemGlobal)
|
||
|
; Return sucess (pointer to allocated memory)
|
||
|
Return $pGIF
|
||
|
EndFunc ;==>_GIF_Create_pGIF
|
||
|
|
||
|
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 ;==>_GIF_CreateStreamOnHGlobal
|
||
|
|
||
|
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 ;==>_GIF_GetObject
|
||
|
|
||
|
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 ;==>_GIF_DeleteObject
|
||
|
|
||
|
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 ;==>_GIF_ImageList_GetIconSize
|
||
|
|
||
|
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 ;==>_GIF_ImageList_Create
|
||
|
|
||
|
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 ;==>_GIF_ImageList_Add
|
||
|
|
||
|
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 ;==>_GIF_ImageList_Destroy
|
||
|
|
||
|
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 ;==>_GIF_ImageList_DrawEx
|
||
|
|
||
|
Func _GIF_CreateBitmapFromFile(ByRef $hGDIP, $sFile, ByRef $iWidth, ByRef $iHeight)
|
||
|
; Initialize Gdip
|
||
|
$hGDIP = _GIF_GdiplusStartup()
|
||
|
If @error Then Return SetError(1, 0, 0)
|
||
|
; Create bitmap object out of the file
|
||
|
Local $pBitmap = _GIF_GdipLoadImageFromFile($sFile)
|
||
|
If @error Then
|
||
|
_GIF_GdiplusShutdown($hGDIP)
|
||
|
Return SetError(2, 0, 0)
|
||
|
EndIf
|
||
|
; Get dimension
|
||
|
_GIF_GdipGetImageDimension($pBitmap, $iWidth, $iHeight)
|
||
|
If @error Then
|
||
|
_GIF_FreeGdipAndMem($pBitmap, $hGDIP)
|
||
|
Return SetError(3, 0, 0)
|
||
|
EndIf
|
||
|
Return $pBitmap
|
||
|
EndFunc ;==>_GIF_CreateBitmapFromFile
|
||
|
|
||
|
Func _GIF_CreateBitmapFromBinaryImage(ByRef $hGDIP, ByRef $hMemGlobal, $bBinary, ByRef $iWidth, ByRef $iHeight)
|
||
|
$bBinary = Binary($bBinary)
|
||
|
; Determine the size of binary data
|
||
|
Local $iSize = BinaryLen($bBinary)
|
||
|
; Allocate global moveable memory in requred size
|
||
|
$hMemGlobal = _GIF_MemGlobalAlloc($iSize, 2); GMEM_MOVEABLE
|
||
|
If @error Then Return SetError(1, 0, 0)
|
||
|
; Get pointer to it
|
||
|
Local $pMemory = _GIF_MemGlobalLock($hMemGlobal)
|
||
|
If @error Then
|
||
|
_GIF_MemGlobalFree($hMemGlobal)
|
||
|
Return SetError(2, 0, 0)
|
||
|
EndIf
|
||
|
; Make structure at that address
|
||
|
Local $tBinary = DllStructCreate("byte[" & $iSize & "]", $pMemory)
|
||
|
; Fill it
|
||
|
DllStructSetData($tBinary, 1, $bBinary)
|
||
|
; Create stream
|
||
|
Local $pStream = _GIF_CreateStreamOnHGlobal($pMemory, 0)
|
||
|
If @error Then
|
||
|
_GIF_MemGlobalFree($hMemGlobal)
|
||
|
Return SetError(3, 0, 0)
|
||
|
EndIf
|
||
|
; Unlock memory (almost irrelevant)
|
||
|
_GIF_MemGlobalUnlock($pMemory)
|
||
|
; Initialize Gdip
|
||
|
$hGDIP = _GIF_GdiplusStartup()
|
||
|
If @error Then
|
||
|
_GIF_MemGlobalFree($hMemGlobal)
|
||
|
Return SetError(4, 0, 0)
|
||
|
EndIf
|
||
|
; Create bitmap object out of the stream
|
||
|
Local $pBitmap = _GIF_GdipCreateBitmapFromStream($pStream)
|
||
|
If @error Then
|
||
|
_GIF_GdiplusShutdown($hGDIP)
|
||
|
_GIF_MemGlobalFree($hMemGlobal)
|
||
|
Return SetError(5, 0, 0)
|
||
|