Jump to content

AVI writing udf


monoceres
 Share

Recommended Posts

@monoceres

Sorry for have spamming your udf i thought it was nice idea to make an example but i went to far and made app with it :)

You didnt have to call mod but now its done... anyway thanks :o

And the most important is to keep it up ! :D

Cheers, FireFox.

You weren't spamming. Just thought it would be better if we had our seperate topics since we have different scripts and you seem to want to build a great tool. Just wanted to stop confusion among people :D

Same thing for alerting big_daddy, I wanted to keep your old posts, but unfortunately you were too quick :(

I'm looking into audio support now. Seems to be pretty trivial :D

Broken link? PM me and I'll send you the file!

Link to comment
Share on other sites

I have two functions, so you can create your AVI with HBitmaps:

; Adds a bitmap file to an already opened avi file.
; monoceres, Prog@ndy
Func _AddHBitmapToAvi(ByRef $Avi_Handle, $hBitmap)
    Local $DC = _WinAPI_GetDC(0)
    Local $hDC = _WinAPI_CreateCompatibleDC($DC)
    _WinAPI_ReleaseDC(0,$DC)
    
    Local $OldBMP = _WinAPI_SelectObject($hDC, $hBitmap)
    Local $bits = DllStructCreate("byte[" & DllStructGetData($Avi_Handle[3],"biSizeImage") & "]")
    $x = _WinAPI_GetDIBits($hDC,$hBitmap,0,Abs(DllStructGetData($Avi_Handle[3],"biHeight")),DllStructGetPtr($bits),DllStructGetPtr($Avi_Handle[3]),0)
    _WinAPI_SelectObject($hDC,$OldBMP)
    _WinAPI_DeleteDC($hDC)
    
    $ret = DllCall($Avi32_Dll, "int", "AVIStreamWrite", "ptr", $Avi_Handle[1], "long", $Avi_Handle[2], "long", 1, "ptr", DllStructGetPtr($bits), _
            "long", DllStructGetSize($bits), "long", $AVIIF_KEYFRAME, "ptr*", 0, "ptr*", 0)
    $Avi_Handle[2] += 1
EndFunc   ;==>_AddBitmapToAvi

; monoceres, Prog@ndy
Func _CreateAvi2($sFilename, $FrameRate, $Width, $Height, $BitCount=24)
    Local $RetArr[5] ; avi file handle, stream handle, bitmap count, BitmapInfoheader, Stride
    
    Local $ret, $pfile, $asi, $pstream
    
    $ret = DllCall($Avi32_Dll, "int", "AVIFileOpenW", "ptr*", 0, "wstr", $sFilename, "uint", $OF_CREATE, "ptr", 0)
    $pfile = $ret[1]
    
    
    $asi = DllStructCreate($AVISTREAMINFO)
    DllStructSetData($asi, "fccType", $streamtypeVIDEO)
    DllStructSetData($asi, "fccHandler", $mmioFOURCC_M_S_V_C)
    DllStructSetData($asi, "dwScale", 1)
    DllStructSetData($asi, "dwRate", $FrameRate)
    DllStructSetData($asi, "dwQuality", 10000)
    DllStructSetData($asi, "rright", $Width)
    DllStructSetData($asi, "rbottom", $Height)
    
    $ret = DllCall($Avi32_Dll, "int", "AVIFileCreateStream", "ptr", $pfile, "ptr*", 0, "ptr", DllStructGetPtr($asi))

    $pstream = $ret[2]
    
    Local $stride = BitAND(($Width * ($BitCount / 8) + 3) ,BitNOT(3))
    
    Local $bi = DllStructCreate($BITMAPINFOHEADER)
    DllStructSetData($bi,"biSize",DllStructGetSize($bi))
    DllStructSetData($bi,"biWidth",$Width)
    DllStructSetData($bi,"biHeight",$Height)
    DllStructSetData($bi,"biPlanes",1)
    DllStructSetData($bi,"biBitCount",$BitCount)
    DllStructSetData($bi,"biSizeImage",$stride*$Height)

    ; The format for the stream is the same as BITMAPINFOHEADER
    $ret = DllCall($Avi32_Dll, "int", "AVIStreamSetFormat", "ptr", $pstream, "long", 0, "ptr", DllStructGetPtr($bi), "long", DllStructGetSize($bi))
    
    $RetArr[0] = $pfile
    $RetArr[1] = $pstream
    $RetArr[2]=0
    $RetArr[3]= $bi
    $RetArr[4]= $stride
    Return $RetArr
EndFunc

First, you have to create the AVI with _ACiCreate2 and then add the images with _AviHBitmapAdd.

You can create HBitmaps :

a) _ScreenCapture_Capture with empty filename: "" -> no extra file required to record screen.

:) _GDIPlus_BitmapCreateHBitmapFromBitmap

c) _WinAPI_LoadImage :o

example:

CODE

#include <ScreenCapture.au3>

#include "AVIWriter.au3"

Hotkeyset("{ESC}","close")

Break(0)

FileDelete(@DesktopDir & "\test.avi")

_StartAviLibrary()

$avi = _CreateAvi2(@DesktopDir & "\test.avi", 5,200,200)

Do

$m = MouseGetPos()

$hBmp = _ScreenCapture_Capture("", $m[0] - 100, $m[1] - 100, $m[0] + 100, $m[1] + 100, True)

_AddHBitmapToAvi($avi, $hBmp)

_WinAPI_DeleteObject($hBmp)

Sleep(200)

Until False

Func close()

_CloseAvi($avi)

_StopAviLibrary()

exit

EndFunc ;==>close

*GERMAN* [note: you are not allowed to remove author / modified info from my UDFs]My UDFs:[_SetImageBinaryToCtrl] [_TaskDialog] [AutoItObject] [Animated GIF (GDI+)] [ClipPut for Image] [FreeImage] [GDI32 UDFs] [GDIPlus Progressbar] [Hotkey-Selector] [Multiline Inputbox] [MySQL without ODBC] [RichEdit UDFs] [SpeechAPI Example] [WinHTTP]UDFs included in AutoIt: FTP_Ex (as FTPEx), _WinAPI_SetLayeredWindowAttributes

Link to comment
Share on other sites

OK :)

Edited by ProgAndy

*GERMAN* [note: you are not allowed to remove author / modified info from my UDFs]My UDFs:[_SetImageBinaryToCtrl] [_TaskDialog] [AutoItObject] [Animated GIF (GDI+)] [ClipPut for Image] [FreeImage] [GDI32 UDFs] [GDIPlus Progressbar] [Hotkey-Selector] [Multiline Inputbox] [MySQL without ODBC] [RichEdit UDFs] [SpeechAPI Example] [WinHTTP]UDFs included in AutoIt: FTP_Ex (as FTPEx), _WinAPI_SetLayeredWindowAttributes

Link to comment
Share on other sites

@monoceres

I've finished AVICapture v1.4 wich instead of creating avi , create only frame in folder because some people wanted to record in this way; but as I see, ProgAndy have made HBitmap so im waiting for you update your udf :) (pm me when youve finished)

Cheers, FireFox.

Link to comment
Share on other sites

@monoceres

I've finished AVICapture v1.4 wich instead of creating avi , create only frame in folder because some people wanted to record in this way; but as I see, ProgAndy have made HBitmap so im waiting for you update your udf :) (pm me when youve finished)

Cheers, FireFox.

It's already done. I updated the UDF just minutes after I posted the response.

Broken link? PM me and I'll send you the file!

Link to comment
Share on other sites

I got it to record the whole screen, but it captures wierd or something.. i get a massive file that only plays for like a few seconds and is all glitchy n stuff..

#include <ScreenCapture.au3>
#include "AVIWriter.au3"

Hotkeyset("{ESC}","close")

Break(0)


_StartAviLibrary()

$avi = _CreateAvi(@DesktopDir & "\test.avi", 30, @DesktopWidth,@DesktopHeight)

Do
    $X = @DesktopWidth
    $Y = @DesktopHeight
    $hBmp = _ScreenCapture_Capture("",0,0,$X,$Y,True)
    _AddHBitmapToAvi($avi, $hBmp)
    _WinAPI_DeleteObject($hBmp)
    Sleep(10)
Until False



Func close()
    _CloseAvi($avi)
    _StopAviLibrary()
    exit
EndFunc;==>close
Link to comment
Share on other sites

I have two functions, so you can create your AVI with HBitmaps:

; Adds a bitmap file to an already opened avi file.
; monoceres, Prog@ndy
Func _AddHBitmapToAvi(ByRef $Avi_Handle, $hBitmap)
    Local $DC = _WinAPI_GetDC(0)
    Local $hDC = _WinAPI_CreateCompatibleDC($DC)
    _WinAPI_ReleaseDC(0,$DC)
    
    Local $OldBMP = _WinAPI_SelectObject($hDC, $hBitmap)
    Local $bits = DllStructCreate("byte[" & DllStructGetData($Avi_Handle[3],"biSizeImage") & "]")
    $x = _WinAPI_GetDIBits($hDC,$hBitmap,0,Abs(DllStructGetData($Avi_Handle[3],"biHeight")),DllStructGetPtr($bits),DllStructGetPtr($Avi_Handle[3]),0)
    _WinAPI_SelectObject($hDC,$OldBMP)
    _WinAPI_DeleteDC($hDC)
    
    $ret = DllCall($Avi32_Dll, "int", "AVIStreamWrite", "ptr", $Avi_Handle[1], "long", $Avi_Handle[2], "long", 1, "ptr", DllStructGetPtr($bits), _
            "long", DllStructGetSize($bits), "long", $AVIIF_KEYFRAME, "ptr*", 0, "ptr*", 0)
    $Avi_Handle[2] += 1
EndFunc   ;==>_AddBitmapToAvi

; monoceres, Prog@ndy
Func _CreateAvi2($sFilename, $FrameRate, $Width, $Height, $BitCount=24)
    Local $RetArr[5] ; avi file handle, stream handle, bitmap count, BitmapInfoheader, Stride
    
    Local $ret, $pfile, $asi, $pstream
    
    $ret = DllCall($Avi32_Dll, "int", "AVIFileOpenW", "ptr*", 0, "wstr", $sFilename, "uint", $OF_CREATE, "ptr", 0)
    $pfile = $ret[1]
    
    
    $asi = DllStructCreate($AVISTREAMINFO)
    DllStructSetData($asi, "fccType", $streamtypeVIDEO)
    DllStructSetData($asi, "fccHandler", $mmioFOURCC_M_S_V_C)
    DllStructSetData($asi, "dwScale", 1)
    DllStructSetData($asi, "dwRate", $FrameRate)
    DllStructSetData($asi, "dwQuality", 10000)
    DllStructSetData($asi, "rright", $Width)
    DllStructSetData($asi, "rbottom", $Height)
    
    $ret = DllCall($Avi32_Dll, "int", "AVIFileCreateStream", "ptr", $pfile, "ptr*", 0, "ptr", DllStructGetPtr($asi))

    $pstream = $ret[2]
    
    Local $stride = BitAND(($Width * ($BitCount / 8) + 3) ,BitNOT(3))
    
    Local $bi = DllStructCreate($BITMAPINFOHEADER)
    DllStructSetData($bi,"biSize",DllStructGetSize($bi))
    DllStructSetData($bi,"biWidth",$Width)
    DllStructSetData($bi,"biHeight",$Height)
    DllStructSetData($bi,"biPlanes",1)
    DllStructSetData($bi,"biBitCount",$BitCount)
    DllStructSetData($bi,"biSizeImage",$stride*$Height)

    ; The format for the stream is the same as BITMAPINFOHEADER
    $ret = DllCall($Avi32_Dll, "int", "AVIStreamSetFormat", "ptr", $pstream, "long", 0, "ptr", DllStructGetPtr($bi), "long", DllStructGetSize($bi))
    
    $RetArr[0] = $pfile
    $RetArr[1] = $pstream
    $RetArr[2]=0
    $RetArr[3]= $bi
    $RetArr[4]= $stride
    Return $RetArr
EndFunc

First, you have to create the AVI with _ACiCreate2 and then add the images with _AviHBitmapAdd.

You can create HBitmaps :

a) _ScreenCapture_Capture with empty filename: "" -> no extra file required to record screen.

:) _GDIPlus_BitmapCreateHBitmapFromBitmap

c) _WinAPI_LoadImage :o

example:

CODE

#include <ScreenCapture.au3>

#include "AVIWriter.au3"

Hotkeyset("{ESC}","close")

Break(0)

FileDelete(@DesktopDir & "\test.avi")

_StartAviLibrary()

$avi = _CreateAvi2(@DesktopDir & "\test.avi", 5,200,200)

Do

$m = MouseGetPos()

$hBmp = _ScreenCapture_Capture("", $m[0] - 100, $m[1] - 100, $m[0] + 100, $m[1] + 100, True)

_AddHBitmapToAvi($avi, $hBmp)

_WinAPI_DeleteObject($hBmp)

Sleep(200)

Until False

Func close()

_CloseAvi($avi)

_StopAviLibrary()

exit

EndFunc ;==>close

Very nice ProgAndy.

When the words fail... music speaks.

Link to comment
Share on other sites

freeking love this :o

made this capturing script for it :)

#include <ScreenCapture.au3>
#include "AVIWriter.au3"
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>

Hotkeyset("{ESC}","close")
HotKeySet("^{F9}","_Stop")
HotKeySet("^{F5}","_ToggleFollow")

Break(0)
_StartAviLibrary()

Global $Fps = 30
Global $Win_Move_Speed = 20

Global $Print_Cursor = False
Global $Frame_Count = 0
Global $avi
Global $Working = False
Global $FPS_Timer, $Real_FPS

If $Win_Move_Speed < 1 Then
    $Win_Move_Speed = 1
ElseIf $Win_Move_Speed > 50 Then
    $Win_Move_Speed = 50
EndIf

$Gui = GUICreate("Ctrl + F9 to stop recording, Ctrl + F5 to toggle Follow cursor",800, 600, 0, 0, 0x00040000, BitOR($WS_EX_TOOLWINDOW ,$WS_EX_LAYERED, $WS_EX_TOPMOST))
GUISetBkColor(0xFFFF00)
$BG_Label = GUICtrlCreateLabel("",0,0,800, 20)
$Record_Button = GUICtrlCreateButton("Record",0,0,40,20)
$Gui_BorderSize = WinGetClientSize($Gui)
$Follow_Cursor = GUICtrlCreateCheckbox("Follow Cursor",50, 0, 90, 20)
$Show_Cursor = GUICtrlCreateCheckbox("Show Cursor",150, 0, 90, 20)
GUISetState()
GUICtrlSetBkColor($BG_Label, 0xcccccc)
GUICtrlSetBkColor($Follow_Cursor, 0xcccccc)
GUICtrlSetBkColor($Show_Cursor, 0xcccccc)
GUICtrlSetState($BG_Label, $GUI_DISABLE)
GUICtrlSetResizing($BG_Label, 774)
GUICtrlSetResizing($Follow_Cursor, 802)
GUICtrlSetResizing($Show_Cursor, 802)
GUICtrlSetResizing($Record_Button, 802)
WinSetOnTop($Gui, "", 1)
_WinAPI_SetLayeredWindowAttributes($Gui, 0xFFFF00,254)

Do
    Sleep(10)
    Switch GUIGetMsg()
        Case -3
            close()
        Case $Record_Button
            WinSetOnTop($Gui, "", 1)
            Switch GUICtrlRead($Record_Button)
                Case "Record"
                    $File_Save = FileSaveDialog("","","Avi (*.avi)")
                    If $File_Save <> "" Then
                        GUICtrlSetData($Record_Button, "Stop")
                        If StringRight($File_Save, 4) <> ".avi" Then
                            $File_Save &= ".avi"
                        EndIf
                        
                        If GUICtrlRead($Show_Cursor) = 1 Then
                            $Print_Cursor = True
                        EndIf
                        
                        WinSetTitle($Gui, "", "Calculating framerate for the clip")
                        $Gui_BorderSize = WinGetClientSize($Gui)
                        $avi = _CreateAvi("test.avi", $Fps, $Gui_BorderSize[0], $Gui_BorderSize[1])
                        $FPS_Timer = TimerInit()
                        $Frame_Count = 0
                        $Real_FPS = $Fps
                        $Timer = InitTimer("Print", 1000/$Fps)
                        Do
                            Sleep(10)
                        Until TimerDiff($FPS_Timer) > 3000
                        KillTimer($Timer)
                        _CloseAvi($avi)
                        FileDelete("test.avi")
                        ConsoleWrite("Change fps settings to -> " & $Real_FPS & @CRLF)
                        WinSetTitle($Gui, "", "Ctrl + F9 to stop recording, Ctrl + F5 to toggle Follow cursor")
                        $avi = _CreateAvi($File_Save, $Real_FPS, $Gui_BorderSize[0], $Gui_BorderSize[1])
                        $Frame_Count = 0
                        $Timer = InitTimer("Print", 1000/$Fps)
                        GUISetStyle($GUI_SS_DEFAULT_GUI,BitOR($WS_EX_TOOLWINDOW ,$WS_EX_LAYERED, $WS_EX_TOPMOST))
                    EndIf
                Case "Stop"
                    _Stop()
            EndSwitch
    EndSwitch
    
    If GUICtrlRead($Record_Button) = "Stop" And GUICtrlRead($Follow_Cursor) = 1 Then
        _LockWinToCursor($Gui, $Win_Move_Speed) ;This should only be used with small recoding area, else it will lag :S
    EndIf
    
Until False

Func _LockWinToCursor($hwnd, $speed)
    Local $Pos[2]
    $Win_Pos = WinGetPos($hwnd)
    $Gui_BorderSize = WinGetClientSize($hwnd)
    $Gui_BorderSize[0] = ($Win_Pos[2] - $Gui_BorderSize[0])
    $Gui_BorderSize[1] = ($Win_Pos[3] - $Gui_BorderSize[1])
    $Pos[0] = MouseGetPos(0) - (($Win_Pos[2]- $Gui_BorderSize[0]) / 2)
    $Pos[1] = MouseGetPos(1) - (($Win_Pos[3]- $Gui_BorderSize[1]) / 2)
    
    $Pos[0] = $Win_Pos[0] + (($Pos[0]-$Win_Pos[0])/$speed)
    $Pos[1] = $Win_Pos[1] + (($Pos[1]-$Win_Pos[1] )/$speed)
    
    If $Pos[0] < -($Gui_BorderSize[0]/2) Then
        $Pos[0] = -($Gui_BorderSize[0]/2)
    ElseIf $Pos[0] > @DesktopWidth - ($Win_Pos[2] - ($Gui_BorderSize[0]/2)) Then
        $Pos[0] = @DesktopWidth - ($Win_Pos[2] - ($Gui_BorderSize[0]/2))
    EndIf
    
    If $Pos[1] < -($Gui_BorderSize[1] - ($Gui_BorderSize[0]/2)) Then
        $Pos[1] = -($Gui_BorderSize[1] - ($Gui_BorderSize[0]/2))
    ElseIf $Pos[1]  > @DesktopHeight- ($Win_Pos[3] - ($Gui_BorderSize[1] - ($Gui_BorderSize[0]/2)))Then
        $Pos[1] = @DesktopHeight - ($Win_Pos[3] - ($Gui_BorderSize[1] - ($Gui_BorderSize[0]/2)))
    EndIf
    
    WinMove($Gui ,"", $Pos[0], $Pos[1])
EndFunc

Func _ToggleFollow()
    If GUICtrlRead($Follow_Cursor) = 1 Then
        GUICtrlSetState($Follow_Cursor, $GUI_UNCHECKED)
    Else
        GUICtrlSetState($Follow_Cursor, $GUI_CHECKED)
    EndIf
EndFunc

Func Print($hWnd, $iMsg, $iIDTimer, $dwTime)
    If $Working = True Then
        Return
    EndIf
    $Working = True
    $Pos = WinGetPos($Gui)
    $Gui_BorderSize = WinGetClientSize($Gui)
    $Pos[0] += (($Pos[2] - $Gui_BorderSize[0]) / 2)
    $Pos[1] += (($Pos[3] - $Gui_BorderSize[1]) - (($Pos[2] - $Gui_BorderSize[0]) / 2))
    
    #cs
    To avoid speeding up the video we need to get the real FPS that the
    script can generating with the FPS the user wants, usally the real FPS is about 10 FPS less then
    what the user asks for.
    
    So we capture a short 3sec clip to get the Real FPS, then we create a new AVI file with the Real FPS but we continue
    to capture with the FPS that the user wants, I think this FPS loss is due to the functions called above, with only
    the capturing part i was able to capture at 200FPS in theory.
    #ce
    $Real_FPS = 1000 /(TimerDiff($FPS_Timer) / $Frame_Count)
    
    $hBmp = _ScreenCapture_Capture("",$Pos[0] , $Pos[1]  , $Pos[0] + $Gui_BorderSize[0], $Pos[1] + $Gui_BorderSize[1], $Print_Cursor)
    _AddHBitmapToAvi($avi, $hBmp)
    _WinAPI_DeleteObject($hBmp)
    $Frame_Count += 1
    $Working = False
EndFunc

Func _Stop()
    If GUICtrlRead($Record_Button) = "Record" Then
        Return
    EndIf
    KillTimer($Timer)
    _CloseAvi($avi)
    
    WinActivate($Gui)
    GUISetStyle(BitOR($GUI_SS_DEFAULT_GUI,0x00040000), BitOR($WS_EX_TOOLWINDOW ,$WS_EX_LAYERED, $WS_EX_TOPMOST))
    GUICtrlSetData($Record_Button, "Record")
EndFunc

Func _GetMaxFPS()
    $timer = TimerInit()
    $avi = _CreateAvi("fdsafd.avi", $Fps, 100, 100)
    $hBmp = _ScreenCapture_Capture("",0 , 1 , @DesktopWidth, @DesktopHeight, True)
    _AddHBitmapToAvi($avi, $hBmp)
    _WinAPI_DeleteObject($hBmp)
    $timer = TimerDiff($timer)
    _CloseAvi($avi)
    FileDelete("fdsafd.avi")
    Return 1000 / $timer
EndFunc

Func close()
    If GUICtrlRead($Record_Button) = "Stop" Then
        KillTimer($Timer)
        _CloseAvi($avi)
    EndIf
    _StopAviLibrary()
    exit
EndFunc ;==>close

Func _WinAPI_SetLayeredWindowAttributes($hwnd, $i_transcolor, $Transparency = 255, $dwFlages = 0x03, $isColorRef = False)
    If $dwFlages = Default Or $dwFlages = "" Or $dwFlages < 0 Then 
        $dwFlages = 0x03
        EndIf

    If Not $isColorRef Then
        $i_transcolor = Hex(String($i_transcolor), 6)
        $i_transcolor = Execute('0x00' & StringMid($i_transcolor, 5, 2) & StringMid($i_transcolor, 3, 2) & StringMid($i_transcolor, 1, 2))
    EndIf
    
    Local $Ret = DllCall("user32.dll", "int", "SetLayeredWindowAttributes", "hwnd", $hwnd, "long", $i_transcolor, "byte", $Transparency, "long", $dwFlages)
    Select
        Case @error
            Return SetError(@error, 0, 0)
        Case $Ret[0] = 0
            Return SetError(4, _WinAPI_GetLastError(), 0)
        Case Else
            Return 1
    EndSelect
EndFunc


Func InitTimer($func, $time = 1000)
    Local $return[2]
    $return[0] = DllCallbackRegister($func, "none", "hwnd;int;int;dword")
    $return[1] = DllCall("user32.dll", "int", "SetTimer", "hwnd", 0, "int", Random(2000,2200,1), "int", $time, "ptr", DllCallbackGetPtr($return[0]))
    Return $return
EndFunc

Func KillTimer($hwnd) ;For some reason this funciton is causeing the program to freeze :S
    Local $timer_hwnd = $hwnd[1]
    DllCall("user32.dll", "int", "KillTimer", "hwnd", 0, "int", $timer_hwnd[0])
    DllCallbackFree($hwnd[0])
EndFuncree($hwnd[0])
EndFunc

Edit: Anyone know a way to compress it??

tried with ffmpeg, but the output was black and white with the image tilted backwards and to the right 45 degress :S

Edited by Alek

[font="Impact"]Never fear, I is here.[/font]

Link to comment
Share on other sites

@Alek

Look at AVICapture for many functions to capture your screen :)

@monoceres

if you dont want to help me, say it to me but dont let me waiting for few days :o

Cheers, FireFox.

I wanna help you, I was just busy last night.

Edit:

@Alek

I just tried compressing a video with the XviD codec. Worked flawless (used VirtualDub for opening the file).

Edited by monoceres

Broken link? PM me and I'll send you the file!

Link to comment
Share on other sites

I wanna help you, I was just busy last night.

Edit:

@Alek

I just tried compressing a video with the XviD codec. Worked flawless (used VirtualDub for opening the file).

thanks, worked great ^^

[font="Impact"]Never fear, I is here.[/font]

Link to comment
Share on other sites

Create an account or sign in to comment

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

Create an account

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

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...