_gdiplus_startup()
Global Const $__gif_tclsid = _winapi_guidfromstring(_gdiplus_encodersgetclsid("gif"))
Global Const $__gif_pclsid = DllStructGetPtr($__gif_tclsid)
Global $__gif_tgfxex, $__gif_bgfxex
Global $__gif_tappex, $__gif_bappex
_gif_initializevars()
Func _gif_createanimatedgif($sfilename, $hfirstframe, $irepeat = 0)
Local $hgiffile = FileOpen($sfilename, 18)
If $hgiffile = 0 Then Return SetError(1, 0, False)
Local $pstream, $hmemory, $pmemory, $imemsize
Local $timagedata, $bimagedata
Local $ilow = $irepeat, $ihigh = 0
Local $fok
$pstream = _winapi_createstreamonhglobal()
$fok = _gdiplus_imagesavetostream($hfirstframe, $pstream, $__gif_pclsid)
If $fok Then
$hmemory = _winapi_gethglobalfromstream($pstream)
$imemsize = _memglobalsize($hmemory)
$hmemory = _memglobalalloc($imemsize, $gmem_moveable)
$pmemory = _memgloballock($hmemory)
_memglobalunlock($hmemory)
$pstream = _winapi_createstreamonhglobal($pmemory)
_gdiplus_imagesavetostream($hfirstframe, $pstream, $__gif_pclsid)
$timagedata = DllStructCreate("byte[" & $imemsize & "]", $pmemory)
$bimagedata = DllStructGetData($timagedata, 1)
_memglobalfree($hmemory)
If $irepeat > 255 Then
$irepeat = BitAND($irepeat, 65535)
$ilow = BitAND($irepeat, 255)
$ihigh = BitShift($irepeat, 8)
EndIf
DllStructSetData($__gif_tappex, 1, $ilow, 17)
DllStructSetData($__gif_tappex, 1, $ihigh, 18)
$__gif_bappex = DllStructGetData($__gif_tappex, 1)
FileWrite($hgiffile, BinaryMid($bimagedata, 1, 781))
FileWrite($hgiffile, $__gif_bappex)
FileWrite($hgiffile, $__gif_bgfxex)
FileWrite($hgiffile, BinaryMid($bimagedata, 790, BinaryLen($bimagedata) - 790))
Return $hgiffile
Else
Return SetError(2, 0, False)
EndIf
EndFunc
Func _gif_fileaddframe($hgiffile, $hframe)
If $hgiffile = 0 Then Return SetError(1, 0, False)
Local $pstream, $hmemory, $pmemory, $imemsize
Local $timagedata, $bimagedata
Local $fok
$pstream = _winapi_createstreamonhglobal()
$fok = _gdiplus_imagesavetostream($hframe, $pstream, $__gif_pclsid)
If $fok Then
$hmemory = _winapi_gethglobalfromstream($pstream)
$imemsize = _memglobalsize($hmemory)
$hmemory = _memglobalalloc($imemsize, $gmem_moveable)
$pmemory = _memgloballock($hmemory)
_memglobalunlock($hmemory)
$pstream = _winapi_createstreamonhglobal($pmemory)
_gdiplus_imagesavetostream($hframe, $pstream, $__gif_pclsid)
$timagedata = DllStructCreate("byte[" & $imemsize & "]", $pmemory)
$bimagedata = DllStructGetData($timagedata, 1)
_memglobalfree($hmemory)
FileWrite($hgiffile, $__gif_bgfxex)
FileWrite($hgiffile, BinaryMid($bimagedata, 790, BinaryLen($bimagedata) - 790))
Return True
Else
Return SetError(2, 0, False)
EndIf
EndFunc
Func _gif_filefinalize($hgiffile)
If $hgiffile = 0 Then Return SetError(1, 0, False)
FileWrite($hgiffile, ";")
FileClose($hgiffile)
Return True
EndFunc
Func _gif_fileaddframeex($hgiffile, $hframe, ByRef $image_line)
If $hgiffile = 0 Then Return SetError(1, 0, False)
Local $pstream, $hmemory, $pmemory, $imemsize
Local $timagedata, $bimagedata
Local $fok
$pstream = _winapi_createstreamonhglobal()
$fok = _gdiplus_imagesavetostream($hframe, $pstream, $__gif_pclsid)
If $fok Then
$hmemory = _winapi_gethglobalfromstream($pstream)
$imemsize = _memglobalsize($hmemory)
$hmemory = _memglobalalloc($imemsize, $gmem_moveable)
$pmemory = _memgloballock($hmemory)
_memglobalunlock($hmemory)
$pstream = _winapi_createstreamonhglobal($pmemory)
_gdiplus_imagesavetostream($hframe, $pstream, $__gif_pclsid)
$timagedata = DllStructCreate("byte[" & $imemsize & "]", $pmemory)
$bimagedata = DllStructGetData($timagedata, 1)
_memglobalfree($hmemory)
If StringLen($image_line) > 20 * 1024 * 1024 Then
FileWrite($hfile, "0x" & $image_line)
$image_line = ""
EndIf
$image_line &= StringTrimLeft($__gif_bgfxex, 2) & StringTrimLeft(BinaryMid($bimagedata, 790, BinaryLen($bimagedata) - 790), 2)
Return True
Else
Return SetError(2, 0, False)
EndIf
EndFunc
Func _gif_filefinalizeex($hgiffile, ByRef $image_line)
If $hgiffile = 0 Then Return SetError(1, 0, False)
FileWrite($hgiffile, "0x" & $image_line)
FileWrite($hgiffile, ";")
FileClose($hgiffile)
Return True
EndFunc
Func _gif_setframedelay($idelay = 0)
Local $ilow = $idelay, $ihigh = 0
If $idelay > 255 Then
$idelay = BitAND($idelay, 65535)
$ilow = BitAND($idelay, 255)
$ihigh = BitShift($idelay, 8)
EndIf
DllStructSetData($__gif_tgfxex, 1, $ilow, 5)
DllStructSetData($__gif_tgfxex, 1, $ihigh, 6)
$__gif_bgfxex = DllStructGetData($__gif_tgfxex, 1)
EndFunc
Func _gif_settransparentcolorentry($icolorentry = 0)
DllStructSetData($__gif_tgfxex, 1, $icolorentry, 7)
EndFunc
Func _gif_initializevars()
$__gif_tappex = DllStructCreate("byte[19]")
DllStructSetData($__gif_tappex, 1, 33, 1)
DllStructSetData($__gif_tappex, 1, 255, 2)
DllStructSetData($__gif_tappex, 1, 11, 3)
DllStructSetData($__gif_tappex, 1, 78, 4)
DllStructSetData($__gif_tappex, 1, 69, 5)
DllStructSetData($__gif_tappex, 1, 84, 6)
DllStructSetData($__gif_tappex, 1, 83, 7)
DllStructSetData($__gif_tappex, 1, 67, 8)
DllStructSetData($__gif_tappex, 1, 65, 9)
DllStructSetData($__gif_tappex, 1, 80, 10)
DllStructSetData($__gif_tappex, 1, 69, 11)
DllStructSetData($__gif_tappex, 1, 50, 12)
DllStructSetData($__gif_tappex, 1, 46, 13)
DllStructSetData($__gif_tappex, 1, 48, 14)
DllStructSetData($__gif_tappex, 1, 3, 15)
DllStructSetData($__gif_tappex, 1, 1, 16)
DllStructSetData($__gif_tappex, 1, 0, 17)
DllStructSetData($__gif_tappex, 1, 0, 18)
DllStructSetData($__gif_tappex, 1, 0, 19)
$__gif_tgfxex = DllStructCreate("byte[8]")
DllStructSetData($__gif_tgfxex, 1, 33, 1)
DllStructSetData($__gif_tgfxex, 1, 249, 2)
DllStructSetData($__gif_tgfxex, 1, 4, 3)
DllStructSetData($__gif_tgfxex, 1, 9, 4)
DllStructSetData($__gif_tgfxex, 1, 25, 5)
DllStructSetData($__gif_tgfxex, 1, 0, 6)
DllStructSetData($__gif_tgfxex, 1, 255, 7)
DllStructSetData($__gif_tgfxex, 1, 0, 8)
$__gif_bappex = DllStructGetData($__gif_tappex, 1)
$__gif_bgfxex = DllStructGetData($__gif_tgfxex, 1)
EndFunc
Func _winapi_createstreamonhglobal($hglobal = 0, $fdeleteonrelease = True)
Local $aresult = DllCall("ole32.dll", "int", "CreateStreamOnHGlobal", "hwnd", $hglobal, "int", $fdeleteonrelease, "ptr*", 0)
If @error Then Return SetError(@error, @extended, 0)
Return SetError($aresult[0], 0, $aresult[3])
EndFunc
Func _winapi_gethglobalfromstream($pstream)
Local $aresult = DllCall("ole32.dll", "int", "GetHGlobalFromStream", "ptr", $pstream, "ptr*", 0)
If @error Then Return SetError(@error, @extended, 0)
$gdip_status = $aresult[0]
Return $aresult[2]
EndFunc