From 72045d5768a126191a907bc640c28e81a11afdd6 Mon Sep 17 00:00:00 2001
From: Vadim Zeitlin <vadim@wxwidgets.org>
Date: Mon, 9 Oct 2006 17:51:07 +0000
Subject: [PATCH] added wxAnimationCtrl (patch 1570325)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@41819 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---
 Makefile.in                   | 233 ++++++++++++---
 build/bakefiles/files.bkl     |  17 ++
 build/msw/makefile.bcc        |  76 +++++
 build/msw/makefile.gcc        |  76 +++++
 build/msw/makefile.vc         |  76 +++++
 build/msw/makefile.wat        |  76 +++++
 build/msw/wx_adv.dsp          |  16 +
 build/msw/wx_core.dsp         |  16 +
 configure.in                  |  11 +
 docs/changes.txt              |   1 +
 docs/latex/wx/animatctrl.tex  | 159 ++++++++++
 docs/latex/wx/animation.tex   | 153 ++++++++++
 docs/latex/wx/category.tex    |   1 +
 docs/latex/wx/classes.tex     |   2 +
 include/wx/anidecod.h         |  77 +++++
 include/wx/animate.h          | 108 +++++++
 include/wx/animdecod.h        | 139 +++++++++
 include/wx/chkconf.h          |   8 +
 include/wx/generic/animate.h  | 189 ++++++++++++
 include/wx/gifdecod.h         | 128 +++-----
 include/wx/gtk/animate.h      | 181 +++++++++++
 include/wx/imagbmp.h          |   2 +-
 include/wx/mac/setup0.h       |   1 +
 include/wx/motif/setup0.h     |   1 +
 include/wx/msw/setup0.h       |   1 +
 include/wx/msw/wince/setup.h  |   1 +
 include/wx/os2/setup0.h       |   1 +
 include/wx/palmos/setup0.h    |   1 +
 include/wx/setup_inc.h        |   1 +
 samples/animate/Makefile.in   | 209 +++++++++++++
 samples/animate/anitest.bkl   |  20 ++
 samples/animate/anitest.cpp   | 266 ++++++++++++++++
 samples/animate/anitest.h     |  61 ++++
 samples/animate/anitest.rc    |   3 +
 samples/animate/hourglass.ani | Bin 0 -> 45182 bytes
 samples/animate/mondrian.ico  | Bin 0 -> 766 bytes
 samples/animate/mondrian.xpm  |  44 +++
 samples/animate/throbber.gif  | Bin 0 -> 2704 bytes
 samples/samples.bkl           |   1 +
 setup.h.in                    |   1 +
 src/common/anidecod.cpp       | 314 +++++++++++++++++++
 src/common/animatecmn.cpp     |  35 +++
 src/common/gifdecod.cpp       | 341 ++++++++-------------
 src/common/imagbmp.cpp        | 151 +---------
 src/common/imaggif.cpp        |  27 +-
 src/generic/animateg.cpp      | 549 ++++++++++++++++++++++++++++++++++
 src/gtk/animate.cpp           | 339 +++++++++++++++++++++
 src/html/m_image.cpp          |  26 +-
 src/wxWindows.dsp             |  24 ++
 49 files changed, 3658 insertions(+), 505 deletions(-)
 create mode 100644 docs/latex/wx/animatctrl.tex
 create mode 100644 docs/latex/wx/animation.tex
 create mode 100644 include/wx/anidecod.h
 create mode 100644 include/wx/animate.h
 create mode 100644 include/wx/animdecod.h
 create mode 100644 include/wx/generic/animate.h
 create mode 100644 include/wx/gtk/animate.h
 create mode 100644 samples/animate/Makefile.in
 create mode 100644 samples/animate/anitest.bkl
 create mode 100644 samples/animate/anitest.cpp
 create mode 100644 samples/animate/anitest.h
 create mode 100644 samples/animate/anitest.rc
 create mode 100644 samples/animate/hourglass.ani
 create mode 100644 samples/animate/mondrian.ico
 create mode 100644 samples/animate/mondrian.xpm
 create mode 100644 samples/animate/throbber.gif
 create mode 100644 src/common/anidecod.cpp
 create mode 100644 src/common/animatecmn.cpp
 create mode 100644 src/generic/animateg.cpp
 create mode 100644 src/gtk/animate.cpp

diff --git a/Makefile.in b/Makefile.in
index ffc07ab3fb..ad0f36a06b 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -2574,11 +2574,15 @@ COND_TOOLKIT_WINCE_GUI_HDR =  \
 	wx/msw/wince/textctrlce.h \
 	wx/msw/wince/resources.h
 @COND_TOOLKIT_WINCE@GUI_HDR = $(COND_TOOLKIT_WINCE_GUI_HDR)
-@COND_TOOLKIT_COCOA@ADVANCED_PLATFORM_HDR = \
-@COND_TOOLKIT_COCOA@	wx/cocoa/taskbar.h wx/mac/corefoundation/joystick.h
+COND_TOOLKIT_COCOA_ADVANCED_PLATFORM_HDR =  \
+	wx/generic/animate.h \
+	wx/cocoa/taskbar.h \
+	wx/mac/corefoundation/joystick.h
+@COND_TOOLKIT_COCOA@ADVANCED_PLATFORM_HDR = $(COND_TOOLKIT_COCOA_ADVANCED_PLATFORM_HDR)
 @COND_TOOLKIT_GTK@ADVANCED_PLATFORM_HDR = \
 @COND_TOOLKIT_GTK@	wx/unix/joystick.h wx/unix/sound.h wx/unix/taskbarx11.h
 COND_TOOLKIT_MAC_ADVANCED_PLATFORM_HDR =  \
+	wx/generic/animate.h \
 	wx/mac/carbon/drawer.h \
 	wx/mac/carbon/sound.h \
 	wx/mac/carbon/taskbarosx.h \
@@ -2587,17 +2591,22 @@ COND_TOOLKIT_MAC_ADVANCED_PLATFORM_HDR =  \
 @COND_TOOLKIT_MOTIF@ADVANCED_PLATFORM_HDR = \
 @COND_TOOLKIT_MOTIF@	wx/unix/joystick.h wx/unix/sound.h \
 @COND_TOOLKIT_MOTIF@	wx/unix/taskbarx11.h
-@COND_TOOLKIT_MSW@ADVANCED_PLATFORM_HDR = wx/msw/sound.h \
-@COND_TOOLKIT_MSW@	wx/msw/taskbar.h wx/msw/joystick.h
-@COND_TOOLKIT_PM@ADVANCED_PLATFORM_HDR = wx/os2/joystick.h \
-@COND_TOOLKIT_PM@	wx/os2/sound.h
+COND_TOOLKIT_MSW_ADVANCED_PLATFORM_HDR =  \
+	wx/generic/animate.h \
+	wx/msw/sound.h \
+	wx/msw/taskbar.h \
+	wx/msw/joystick.h
+@COND_TOOLKIT_MSW@ADVANCED_PLATFORM_HDR = $(COND_TOOLKIT_MSW_ADVANCED_PLATFORM_HDR)
+@COND_TOOLKIT_PM@ADVANCED_PLATFORM_HDR = \
+@COND_TOOLKIT_PM@	wx/generic/animate.h wx/os2/joystick.h wx/os2/sound.h
 @COND_TOOLKIT_WINCE@ADVANCED_PLATFORM_HDR = \
-@COND_TOOLKIT_WINCE@	wx/msw/sound.h wx/msw/taskbar.h
+@COND_TOOLKIT_WINCE@	wx/generic/animate.h wx/msw/sound.h wx/msw/taskbar.h
 @COND_TOOLKIT_X11@ADVANCED_PLATFORM_HDR = \
 @COND_TOOLKIT_X11@	wx/unix/joystick.h wx/unix/sound.h wx/unix/taskbarx11.h
 @COND_TOOLKIT_MSW@ADVANCED_PLATFORM_NATIVE_HDR = wx/msw/datectrl.h
 @COND_TOOLKIT_WINCE@ADVANCED_PLATFORM_NATIVE_HDR = wx/msw/datectrl.h
 COND_WXUNIV_0_ADVANCED_HDR =  \
+	wx/animate.h \
 	wx/bmpcbox.h \
 	wx/calctrl.h \
 	wx/dataview.h \
@@ -2637,6 +2646,7 @@ COND_WXUNIV_0_ADVANCED_HDR =  \
 	$(ADVANCED_PLATFORM_NATIVE_HDR)
 @COND_WXUNIV_0@ADVANCED_HDR = $(COND_WXUNIV_0_ADVANCED_HDR)
 COND_WXUNIV_1_ADVANCED_HDR =  \
+	wx/animate.h \
 	wx/bmpcbox.h \
 	wx/calctrl.h \
 	wx/dataview.h \
@@ -2820,6 +2830,7 @@ COND_USE_GUI_1_ALL_GUI_HEADERS =  \
 	wx/wupdlock.h \
 	wx/accel.h \
 	wx/access.h \
+	wx/anidecod.h \
 	wx/artprov.h \
 	wx/bitmap.h \
 	wx/bookctrl.h \
@@ -3312,6 +3323,7 @@ COND_USE_GUI_1_WXUNIV_0___CORE_SRC_OBJECTS =  \
 	$(__LOWLEVEL_SRC_OBJECTS) \
 	$(__GUI_SRC_OBJECTS) \
 	monodll_accesscmn.o \
+	monodll_anidecod.o \
 	monodll_appcmn.o \
 	monodll_artprov.o \
 	monodll_artstd.o \
@@ -3480,6 +3492,7 @@ COND_USE_GUI_1_WXUNIV_1___CORE_SRC_OBJECTS =  \
 	monodll_mono.o \
 	monodll_win32.o \
 	monodll_accesscmn.o \
+	monodll_anidecod.o \
 	monodll_appcmn.o \
 	monodll_artprov.o \
 	monodll_artstd.o \
@@ -4713,6 +4726,7 @@ COND_TOOLKIT_X11___LOWLEVEL_SRC_OBJECTS_1 =  \
 	monodll_window.o
 @COND_TOOLKIT_X11@__LOWLEVEL_SRC_OBJECTS_1 = $(COND_TOOLKIT_X11___LOWLEVEL_SRC_OBJECTS_1)
 COND_WXUNIV_0___ADVANCED_SRC_OBJECTS =  \
+	monodll_animatecmn.o \
 	monodll_datavcmn.o \
 	monodll_aboutdlgg.o \
 	monodll_bmpcboxg.o \
@@ -4735,6 +4749,7 @@ COND_WXUNIV_0___ADVANCED_SRC_OBJECTS =  \
 	$(__ADVANCED_PLATFORM_NATIVE_SRC_OBJECTS)
 @COND_WXUNIV_0@__ADVANCED_SRC_OBJECTS = $(COND_WXUNIV_0___ADVANCED_SRC_OBJECTS)
 COND_WXUNIV_1___ADVANCED_SRC_OBJECTS =  \
+	monodll_animatecmn.o \
 	monodll_datavcmn.o \
 	monodll_aboutdlgg.o \
 	monodll_bmpcboxg.o \
@@ -5047,6 +5062,7 @@ COND_USE_GUI_1_WXUNIV_0___CORE_SRC_OBJECTS_1 =  \
 	$(__LOWLEVEL_SRC_OBJECTS_2) \
 	$(__GUI_SRC_OBJECTS_1) \
 	monolib_accesscmn.o \
+	monolib_anidecod.o \
 	monolib_appcmn.o \
 	monolib_artprov.o \
 	monolib_artstd.o \
@@ -5215,6 +5231,7 @@ COND_USE_GUI_1_WXUNIV_1___CORE_SRC_OBJECTS_1 =  \
 	monolib_mono.o \
 	monolib_win32.o \
 	monolib_accesscmn.o \
+	monolib_anidecod.o \
 	monolib_appcmn.o \
 	monolib_artprov.o \
 	monolib_artstd.o \
@@ -6450,6 +6467,7 @@ COND_TOOLKIT_X11___LOWLEVEL_SRC_OBJECTS_3 =  \
 	monolib_window.o
 @COND_TOOLKIT_X11@__LOWLEVEL_SRC_OBJECTS_3 = $(COND_TOOLKIT_X11___LOWLEVEL_SRC_OBJECTS_3)
 COND_WXUNIV_0___ADVANCED_SRC_OBJECTS_1 =  \
+	monolib_animatecmn.o \
 	monolib_datavcmn.o \
 	monolib_aboutdlgg.o \
 	monolib_bmpcboxg.o \
@@ -6472,6 +6490,7 @@ COND_WXUNIV_0___ADVANCED_SRC_OBJECTS_1 =  \
 	$(__ADVANCED_PLATFORM_NATIVE_SRC_OBJECTS_1)
 @COND_WXUNIV_0@__ADVANCED_SRC_OBJECTS_1 = $(COND_WXUNIV_0___ADVANCED_SRC_OBJECTS_1)
 COND_WXUNIV_1___ADVANCED_SRC_OBJECTS_1 =  \
+	monolib_animatecmn.o \
 	monolib_datavcmn.o \
 	monolib_aboutdlgg.o \
 	monolib_bmpcboxg.o \
@@ -6998,6 +7017,7 @@ COND_USE_GUI_1_WXUNIV_0___CORE_SRC_OBJECTS_2 =  \
 	$(__LOWLEVEL_SRC_OBJECTS_4) \
 	$(__GUI_SRC_OBJECTS_2) \
 	coredll_accesscmn.o \
+	coredll_anidecod.o \
 	coredll_appcmn.o \
 	coredll_artprov.o \
 	coredll_artstd.o \
@@ -7166,6 +7186,7 @@ COND_USE_GUI_1_WXUNIV_1___CORE_SRC_OBJECTS_2 =  \
 	coredll_mono.o \
 	coredll_win32.o \
 	coredll_accesscmn.o \
+	coredll_anidecod.o \
 	coredll_appcmn.o \
 	coredll_artprov.o \
 	coredll_artstd.o \
@@ -8423,6 +8444,7 @@ COND_USE_GUI_1_WXUNIV_0___CORE_SRC_OBJECTS_3 =  \
 	$(__LOWLEVEL_SRC_OBJECTS_6) \
 	$(__GUI_SRC_OBJECTS_3) \
 	corelib_accesscmn.o \
+	corelib_anidecod.o \
 	corelib_appcmn.o \
 	corelib_artprov.o \
 	corelib_artstd.o \
@@ -8591,6 +8613,7 @@ COND_USE_GUI_1_WXUNIV_1___CORE_SRC_OBJECTS_3 =  \
 	corelib_mono.o \
 	corelib_win32.o \
 	corelib_accesscmn.o \
+	corelib_anidecod.o \
 	corelib_appcmn.o \
 	corelib_artprov.o \
 	corelib_artstd.o \
@@ -9872,6 +9895,7 @@ COND_USE_SOSYMLINKS_1___advdll___so_symlinks_inst_cmd = rm -f \
 @COND_USE_SOSYMLINKS_1@__advdll___so_symlinks_inst_cmd = $(COND_USE_SOSYMLINKS_1___advdll___so_symlinks_inst_cmd)
 @COND_PLATFORM_WIN32_1@__advdll___win32rc = advdll_version_rc.o
 COND_WXUNIV_0___ADVANCED_SRC_OBJECTS_2 =  \
+	advdll_animatecmn.o \
 	advdll_datavcmn.o \
 	advdll_aboutdlgg.o \
 	advdll_bmpcboxg.o \
@@ -9894,6 +9918,7 @@ COND_WXUNIV_0___ADVANCED_SRC_OBJECTS_2 =  \
 	$(__ADVANCED_PLATFORM_NATIVE_SRC_OBJECTS_2)
 @COND_WXUNIV_0@__ADVANCED_SRC_OBJECTS_2 = $(COND_WXUNIV_0___ADVANCED_SRC_OBJECTS_2)
 COND_WXUNIV_1___ADVANCED_SRC_OBJECTS_2 =  \
+	advdll_animatecmn.o \
 	advdll_datavcmn.o \
 	advdll_aboutdlgg.o \
 	advdll_bmpcboxg.o \
@@ -9931,6 +9956,7 @@ COND_MONOLITHIC_0_SHARED_0_USE_GUI_1___advlib___depname = \
 @COND_USE_PCH_1@___pch_wxprec_advlib_wx_wxprec_h_gch___depname \
 @COND_USE_PCH_1@	= .pch/wxprec_advlib/wx/wxprec.h.gch
 COND_WXUNIV_0___ADVANCED_SRC_OBJECTS_3 =  \
+	advlib_animatecmn.o \
 	advlib_datavcmn.o \
 	advlib_aboutdlgg.o \
 	advlib_bmpcboxg.o \
@@ -9953,6 +9979,7 @@ COND_WXUNIV_0___ADVANCED_SRC_OBJECTS_3 =  \
 	$(__ADVANCED_PLATFORM_NATIVE_SRC_OBJECTS_3)
 @COND_WXUNIV_0@__ADVANCED_SRC_OBJECTS_3 = $(COND_WXUNIV_0___ADVANCED_SRC_OBJECTS_3)
 COND_WXUNIV_1___ADVANCED_SRC_OBJECTS_3 =  \
+	advlib_animatecmn.o \
 	advlib_datavcmn.o \
 	advlib_aboutdlgg.o \
 	advlib_bmpcboxg.o \
@@ -10612,9 +10639,12 @@ COND_WITH_PLUGIN_SDL_1___sound_sdl___depname = \
 @COND_PLATFORM_MACOSX_1@__MAC_LOWLEVEL_SRC_OBJECTS \
 @COND_PLATFORM_MACOSX_1@	= monodll_gsockosx.o monodll_hid.o \
 @COND_PLATFORM_MACOSX_1@	monodll_utilsexc_cf.o
-@COND_TOOLKIT_COCOA@__ADVANCED_PLATFORM_SRC_OBJECTS = \
-@COND_TOOLKIT_COCOA@	monodll_taskbar.o monodll_taskbarcmn.o \
-@COND_TOOLKIT_COCOA@	monodll_hidjoystick.o
+COND_TOOLKIT_COCOA___ADVANCED_PLATFORM_SRC_OBJECTS =  \
+	monodll_animateg.o \
+	monodll_taskbar.o \
+	monodll_taskbarcmn.o \
+	monodll_hidjoystick.o
+@COND_TOOLKIT_COCOA@__ADVANCED_PLATFORM_SRC_OBJECTS = $(COND_TOOLKIT_COCOA___ADVANCED_PLATFORM_SRC_OBJECTS)
 COND_TOOLKIT_GTK_TOOLKIT_VERSION____ADVANCED_PLATFORM_SRC_OBJECTS =  \
 	monodll_taskbarcmn.o \
 	monodll_joystick.o \
@@ -10627,11 +10657,13 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION_2___ADVANCED_PLATFORM_SRC_OBJECTS =  \
 	monodll_sound.o \
 	monodll_taskbarx11.o \
 	monodll_aboutdlg.o \
+	monodll_animate.o \
 	monodll_taskbar.o \
 	monodll_dataview.o \
 	monodll_eggtrayicon.o
 @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2@__ADVANCED_PLATFORM_SRC_OBJECTS = $(COND_TOOLKIT_GTK_TOOLKIT_VERSION_2___ADVANCED_PLATFORM_SRC_OBJECTS)
 COND_TOOLKIT_MAC___ADVANCED_PLATFORM_SRC_OBJECTS =  \
+	monodll_animateg.o \
 	monodll_taskbarcmn.o \
 	monodll_aboutdlg.o \
 	monodll_drawer.o \
@@ -10646,6 +10678,7 @@ COND_TOOLKIT_MOTIF___ADVANCED_PLATFORM_SRC_OBJECTS =  \
 	monodll_taskbarx11.o
 @COND_TOOLKIT_MOTIF@__ADVANCED_PLATFORM_SRC_OBJECTS = $(COND_TOOLKIT_MOTIF___ADVANCED_PLATFORM_SRC_OBJECTS)
 COND_TOOLKIT_MSW___ADVANCED_PLATFORM_SRC_OBJECTS =  \
+	monodll_animateg.o \
 	monodll_taskbarcmn.o \
 	monodll_aboutdlg.o \
 	monodll_sound.o \
@@ -10653,10 +10686,14 @@ COND_TOOLKIT_MSW___ADVANCED_PLATFORM_SRC_OBJECTS =  \
 	monodll_joystick.o
 @COND_TOOLKIT_MSW@__ADVANCED_PLATFORM_SRC_OBJECTS = $(COND_TOOLKIT_MSW___ADVANCED_PLATFORM_SRC_OBJECTS)
 @COND_TOOLKIT_PM@__ADVANCED_PLATFORM_SRC_OBJECTS = \
-@COND_TOOLKIT_PM@	monodll_joystick.o monodll_sound.o
-@COND_TOOLKIT_WINCE@__ADVANCED_PLATFORM_SRC_OBJECTS = \
-@COND_TOOLKIT_WINCE@	monodll_taskbarcmn.o monodll_aboutdlg.o \
-@COND_TOOLKIT_WINCE@	monodll_sound.o monodll_taskbar.o
+@COND_TOOLKIT_PM@	monodll_animateg.o monodll_joystick.o monodll_sound.o
+COND_TOOLKIT_WINCE___ADVANCED_PLATFORM_SRC_OBJECTS =  \
+	monodll_animateg.o \
+	monodll_taskbarcmn.o \
+	monodll_aboutdlg.o \
+	monodll_sound.o \
+	monodll_taskbar.o
+@COND_TOOLKIT_WINCE@__ADVANCED_PLATFORM_SRC_OBJECTS = $(COND_TOOLKIT_WINCE___ADVANCED_PLATFORM_SRC_OBJECTS)
 COND_TOOLKIT_X11___ADVANCED_PLATFORM_SRC_OBJECTS =  \
 	monodll_taskbarcmn.o \
 	monodll_joystick.o \
@@ -10666,9 +10703,12 @@ COND_TOOLKIT_X11___ADVANCED_PLATFORM_SRC_OBJECTS =  \
 @COND_PLATFORM_MACOSX_1@__MAC_LOWLEVEL_SRC_OBJECTS_0 \
 @COND_PLATFORM_MACOSX_1@	= monolib_gsockosx.o monolib_hid.o \
 @COND_PLATFORM_MACOSX_1@	monolib_utilsexc_cf.o
-@COND_TOOLKIT_COCOA@__ADVANCED_PLATFORM_SRC_OBJECTS_0 = \
-@COND_TOOLKIT_COCOA@	monolib_taskbar.o monolib_taskbarcmn.o \
-@COND_TOOLKIT_COCOA@	monolib_hidjoystick.o
+COND_TOOLKIT_COCOA___ADVANCED_PLATFORM_SRC_OBJECTS_0 =  \
+	monolib_animateg.o \
+	monolib_taskbar.o \
+	monolib_taskbarcmn.o \
+	monolib_hidjoystick.o
+@COND_TOOLKIT_COCOA@__ADVANCED_PLATFORM_SRC_OBJECTS_0 = $(COND_TOOLKIT_COCOA___ADVANCED_PLATFORM_SRC_OBJECTS_0)
 COND_TOOLKIT_GTK_TOOLKIT_VERSION____ADVANCED_PLATFORM_SRC_OBJECTS_0 =  \
 	monolib_taskbarcmn.o \
 	monolib_joystick.o \
@@ -10681,11 +10721,13 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION_2___ADVANCED_PLATFORM_SRC_OBJECTS_0 =  \
 	monolib_sound.o \
 	monolib_taskbarx11.o \
 	monolib_aboutdlg.o \
+	monolib_animate.o \
 	monolib_taskbar.o \
 	monolib_dataview.o \
 	monolib_eggtrayicon.o
 @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2@__ADVANCED_PLATFORM_SRC_OBJECTS_0 = $(COND_TOOLKIT_GTK_TOOLKIT_VERSION_2___ADVANCED_PLATFORM_SRC_OBJECTS_0)
 COND_TOOLKIT_MAC___ADVANCED_PLATFORM_SRC_OBJECTS_0 =  \
+	monolib_animateg.o \
 	monolib_taskbarcmn.o \
 	monolib_aboutdlg.o \
 	monolib_drawer.o \
@@ -10700,6 +10742,7 @@ COND_TOOLKIT_MOTIF___ADVANCED_PLATFORM_SRC_OBJECTS_0 =  \
 	monolib_taskbarx11.o
 @COND_TOOLKIT_MOTIF@__ADVANCED_PLATFORM_SRC_OBJECTS_0 = $(COND_TOOLKIT_MOTIF___ADVANCED_PLATFORM_SRC_OBJECTS_0)
 COND_TOOLKIT_MSW___ADVANCED_PLATFORM_SRC_OBJECTS_0 =  \
+	monolib_animateg.o \
 	monolib_taskbarcmn.o \
 	monolib_aboutdlg.o \
 	monolib_sound.o \
@@ -10707,10 +10750,14 @@ COND_TOOLKIT_MSW___ADVANCED_PLATFORM_SRC_OBJECTS_0 =  \
 	monolib_joystick.o
 @COND_TOOLKIT_MSW@__ADVANCED_PLATFORM_SRC_OBJECTS_0 = $(COND_TOOLKIT_MSW___ADVANCED_PLATFORM_SRC_OBJECTS_0)
 @COND_TOOLKIT_PM@__ADVANCED_PLATFORM_SRC_OBJECTS_0 = \
-@COND_TOOLKIT_PM@	monolib_joystick.o monolib_sound.o
-@COND_TOOLKIT_WINCE@__ADVANCED_PLATFORM_SRC_OBJECTS_0 = \
-@COND_TOOLKIT_WINCE@	monolib_taskbarcmn.o monolib_aboutdlg.o \
-@COND_TOOLKIT_WINCE@	monolib_sound.o monolib_taskbar.o
+@COND_TOOLKIT_PM@	monolib_animateg.o monolib_joystick.o monolib_sound.o
+COND_TOOLKIT_WINCE___ADVANCED_PLATFORM_SRC_OBJECTS_0 =  \
+	monolib_animateg.o \
+	monolib_taskbarcmn.o \
+	monolib_aboutdlg.o \
+	monolib_sound.o \
+	monolib_taskbar.o
+@COND_TOOLKIT_WINCE@__ADVANCED_PLATFORM_SRC_OBJECTS_0 = $(COND_TOOLKIT_WINCE___ADVANCED_PLATFORM_SRC_OBJECTS_0)
 COND_TOOLKIT_X11___ADVANCED_PLATFORM_SRC_OBJECTS_0 =  \
 	monolib_taskbarcmn.o \
 	monolib_joystick.o \
@@ -10723,9 +10770,12 @@ COND_TOOLKIT_X11___ADVANCED_PLATFORM_SRC_OBJECTS_0 =  \
 @COND_PLATFORM_MACOSX_1@__MAC_LOWLEVEL_SRC_OBJECTS_9 \
 @COND_PLATFORM_MACOSX_1@	= corelib_gsockosx.o corelib_hid.o \
 @COND_PLATFORM_MACOSX_1@	corelib_utilsexc_cf.o
-@COND_TOOLKIT_COCOA@__ADVANCED_PLATFORM_SRC_OBJECTS_8 = \
-@COND_TOOLKIT_COCOA@	advdll_taskbar.o advdll_taskbarcmn.o \
-@COND_TOOLKIT_COCOA@	advdll_hidjoystick.o
+COND_TOOLKIT_COCOA___ADVANCED_PLATFORM_SRC_OBJECTS_8 =  \
+	advdll_animateg.o \
+	advdll_taskbar.o \
+	advdll_taskbarcmn.o \
+	advdll_hidjoystick.o
+@COND_TOOLKIT_COCOA@__ADVANCED_PLATFORM_SRC_OBJECTS_8 = $(COND_TOOLKIT_COCOA___ADVANCED_PLATFORM_SRC_OBJECTS_8)
 @COND_TOOLKIT_GTK_TOOLKIT_VERSION_@__ADVANCED_PLATFORM_SRC_OBJECTS_8 \
 @COND_TOOLKIT_GTK_TOOLKIT_VERSION_@	= advdll_taskbarcmn.o advdll_joystick.o \
 @COND_TOOLKIT_GTK_TOOLKIT_VERSION_@	advdll_sound.o advdll_taskbarx11.o
@@ -10735,11 +10785,13 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION_2___ADVANCED_PLATFORM_SRC_OBJECTS_8 =  \
 	advdll_sound.o \
 	advdll_taskbarx11.o \
 	advdll_aboutdlg.o \
+	advdll_animate.o \
 	advdll_taskbar.o \
 	advdll_dataview.o \
 	advdll_eggtrayicon.o
 @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2@__ADVANCED_PLATFORM_SRC_OBJECTS_8 = $(COND_TOOLKIT_GTK_TOOLKIT_VERSION_2___ADVANCED_PLATFORM_SRC_OBJECTS_8)
 COND_TOOLKIT_MAC___ADVANCED_PLATFORM_SRC_OBJECTS_8 =  \
+	advdll_animateg.o \
 	advdll_taskbarcmn.o \
 	advdll_aboutdlg.o \
 	advdll_drawer.o \
@@ -10751,6 +10803,7 @@ COND_TOOLKIT_MAC___ADVANCED_PLATFORM_SRC_OBJECTS_8 =  \
 @COND_TOOLKIT_MOTIF@	advdll_taskbarcmn.o advdll_joystick.o advdll_sound.o \
 @COND_TOOLKIT_MOTIF@	advdll_taskbarx11.o
 COND_TOOLKIT_MSW___ADVANCED_PLATFORM_SRC_OBJECTS_8 =  \
+	advdll_animateg.o \
 	advdll_taskbarcmn.o \
 	advdll_aboutdlg.o \
 	advdll_sound.o \
@@ -10758,16 +10811,23 @@ COND_TOOLKIT_MSW___ADVANCED_PLATFORM_SRC_OBJECTS_8 =  \
 	advdll_joystick.o
 @COND_TOOLKIT_MSW@__ADVANCED_PLATFORM_SRC_OBJECTS_8 = $(COND_TOOLKIT_MSW___ADVANCED_PLATFORM_SRC_OBJECTS_8)
 @COND_TOOLKIT_PM@__ADVANCED_PLATFORM_SRC_OBJECTS_8 = \
-@COND_TOOLKIT_PM@	advdll_joystick.o advdll_sound.o
-@COND_TOOLKIT_WINCE@__ADVANCED_PLATFORM_SRC_OBJECTS_8 = \
-@COND_TOOLKIT_WINCE@	advdll_taskbarcmn.o advdll_aboutdlg.o advdll_sound.o \
-@COND_TOOLKIT_WINCE@	advdll_taskbar.o
+@COND_TOOLKIT_PM@	advdll_animateg.o advdll_joystick.o advdll_sound.o
+COND_TOOLKIT_WINCE___ADVANCED_PLATFORM_SRC_OBJECTS_8 =  \
+	advdll_animateg.o \
+	advdll_taskbarcmn.o \
+	advdll_aboutdlg.o \
+	advdll_sound.o \
+	advdll_taskbar.o
+@COND_TOOLKIT_WINCE@__ADVANCED_PLATFORM_SRC_OBJECTS_8 = $(COND_TOOLKIT_WINCE___ADVANCED_PLATFORM_SRC_OBJECTS_8)
 @COND_TOOLKIT_X11@__ADVANCED_PLATFORM_SRC_OBJECTS_8 = \
 @COND_TOOLKIT_X11@	advdll_taskbarcmn.o advdll_joystick.o advdll_sound.o \
 @COND_TOOLKIT_X11@	advdll_taskbarx11.o
-@COND_TOOLKIT_COCOA@__ADVANCED_PLATFORM_SRC_OBJECTS_9 = \
-@COND_TOOLKIT_COCOA@	advlib_taskbar.o advlib_taskbarcmn.o \
-@COND_TOOLKIT_COCOA@	advlib_hidjoystick.o
+COND_TOOLKIT_COCOA___ADVANCED_PLATFORM_SRC_OBJECTS_9 =  \
+	advlib_animateg.o \
+	advlib_taskbar.o \
+	advlib_taskbarcmn.o \
+	advlib_hidjoystick.o
+@COND_TOOLKIT_COCOA@__ADVANCED_PLATFORM_SRC_OBJECTS_9 = $(COND_TOOLKIT_COCOA___ADVANCED_PLATFORM_SRC_OBJECTS_9)
 @COND_TOOLKIT_GTK_TOOLKIT_VERSION_@__ADVANCED_PLATFORM_SRC_OBJECTS_9 \
 @COND_TOOLKIT_GTK_TOOLKIT_VERSION_@	= advlib_taskbarcmn.o advlib_joystick.o \
 @COND_TOOLKIT_GTK_TOOLKIT_VERSION_@	advlib_sound.o advlib_taskbarx11.o
@@ -10777,11 +10837,13 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION_2___ADVANCED_PLATFORM_SRC_OBJECTS_9 =  \
 	advlib_sound.o \
 	advlib_taskbarx11.o \
 	advlib_aboutdlg.o \
+	advlib_animate.o \
 	advlib_taskbar.o \
 	advlib_dataview.o \
 	advlib_eggtrayicon.o
 @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2@__ADVANCED_PLATFORM_SRC_OBJECTS_9 = $(COND_TOOLKIT_GTK_TOOLKIT_VERSION_2___ADVANCED_PLATFORM_SRC_OBJECTS_9)
 COND_TOOLKIT_MAC___ADVANCED_PLATFORM_SRC_OBJECTS_9 =  \
+	advlib_animateg.o \
 	advlib_taskbarcmn.o \
 	advlib_aboutdlg.o \
 	advlib_drawer.o \
@@ -10793,6 +10855,7 @@ COND_TOOLKIT_MAC___ADVANCED_PLATFORM_SRC_OBJECTS_9 =  \
 @COND_TOOLKIT_MOTIF@	advlib_taskbarcmn.o advlib_joystick.o advlib_sound.o \
 @COND_TOOLKIT_MOTIF@	advlib_taskbarx11.o
 COND_TOOLKIT_MSW___ADVANCED_PLATFORM_SRC_OBJECTS_9 =  \
+	advlib_animateg.o \
 	advlib_taskbarcmn.o \
 	advlib_aboutdlg.o \
 	advlib_sound.o \
@@ -10800,10 +10863,14 @@ COND_TOOLKIT_MSW___ADVANCED_PLATFORM_SRC_OBJECTS_9 =  \
 	advlib_joystick.o
 @COND_TOOLKIT_MSW@__ADVANCED_PLATFORM_SRC_OBJECTS_9 = $(COND_TOOLKIT_MSW___ADVANCED_PLATFORM_SRC_OBJECTS_9)
 @COND_TOOLKIT_PM@__ADVANCED_PLATFORM_SRC_OBJECTS_9 = \
-@COND_TOOLKIT_PM@	advlib_joystick.o advlib_sound.o
-@COND_TOOLKIT_WINCE@__ADVANCED_PLATFORM_SRC_OBJECTS_9 = \
-@COND_TOOLKIT_WINCE@	advlib_taskbarcmn.o advlib_aboutdlg.o advlib_sound.o \
-@COND_TOOLKIT_WINCE@	advlib_taskbar.o
+@COND_TOOLKIT_PM@	advlib_animateg.o advlib_joystick.o advlib_sound.o
+COND_TOOLKIT_WINCE___ADVANCED_PLATFORM_SRC_OBJECTS_9 =  \
+	advlib_animateg.o \
+	advlib_taskbarcmn.o \
+	advlib_aboutdlg.o \
+	advlib_sound.o \
+	advlib_taskbar.o
+@COND_TOOLKIT_WINCE@__ADVANCED_PLATFORM_SRC_OBJECTS_9 = $(COND_TOOLKIT_WINCE___ADVANCED_PLATFORM_SRC_OBJECTS_9)
 @COND_TOOLKIT_X11@__ADVANCED_PLATFORM_SRC_OBJECTS_9 = \
 @COND_TOOLKIT_X11@	advlib_taskbarcmn.o advlib_joystick.o advlib_sound.o \
 @COND_TOOLKIT_X11@	advlib_taskbarx11.o
@@ -15377,6 +15444,9 @@ monodll_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONODLL_ODEP)
 @COND_USE_GUI_1@monodll_accesscmn.o: $(srcdir)/src/common/accesscmn.cpp $(MONODLL_ODEP)
 @COND_USE_GUI_1@	$(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/common/accesscmn.cpp
 
+@COND_USE_GUI_1@monodll_anidecod.o: $(srcdir)/src/common/anidecod.cpp $(MONODLL_ODEP)
+@COND_USE_GUI_1@	$(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/common/anidecod.cpp
+
 @COND_USE_GUI_1@monodll_appcmn.o: $(srcdir)/src/common/appcmn.cpp $(MONODLL_ODEP)
 @COND_USE_GUI_1@	$(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/common/appcmn.cpp
 
@@ -15716,6 +15786,9 @@ monodll_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONODLL_ODEP)
 @COND_USE_GUI_1@monodll_vscroll.o: $(srcdir)/src/generic/vscroll.cpp $(MONODLL_ODEP)
 @COND_USE_GUI_1@	$(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/generic/vscroll.cpp
 
+@COND_USE_GUI_1@monodll_animatecmn.o: $(srcdir)/src/common/animatecmn.cpp $(MONODLL_ODEP)
+@COND_USE_GUI_1@	$(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/common/animatecmn.cpp
+
 @COND_USE_GUI_1@monodll_datavcmn.o: $(srcdir)/src/common/datavcmn.cpp $(MONODLL_ODEP)
 @COND_USE_GUI_1@	$(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/common/datavcmn.cpp
 
@@ -15770,6 +15843,21 @@ monodll_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONODLL_ODEP)
 @COND_USE_GUI_1@monodll_wizard.o: $(srcdir)/src/generic/wizard.cpp $(MONODLL_ODEP)
 @COND_USE_GUI_1@	$(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/generic/wizard.cpp
 
+@COND_TOOLKIT_MSW_USE_GUI_1@monodll_animateg.o: $(srcdir)/src/generic/animateg.cpp $(MONODLL_ODEP)
+@COND_TOOLKIT_MSW_USE_GUI_1@	$(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/generic/animateg.cpp
+
+@COND_TOOLKIT_WINCE_USE_GUI_1@monodll_animateg.o: $(srcdir)/src/generic/animateg.cpp $(MONODLL_ODEP)
+@COND_TOOLKIT_WINCE_USE_GUI_1@	$(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/generic/animateg.cpp
+
+@COND_TOOLKIT_MAC_USE_GUI_1@monodll_animateg.o: $(srcdir)/src/generic/animateg.cpp $(MONODLL_ODEP)
+@COND_TOOLKIT_MAC_USE_GUI_1@	$(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/generic/animateg.cpp
+
+@COND_TOOLKIT_COCOA_USE_GUI_1@monodll_animateg.o: $(srcdir)/src/generic/animateg.cpp $(MONODLL_ODEP)
+@COND_TOOLKIT_COCOA_USE_GUI_1@	$(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/generic/animateg.cpp
+
+@COND_TOOLKIT_PM_USE_GUI_1@monodll_animateg.o: $(srcdir)/src/generic/animateg.cpp $(MONODLL_ODEP)
+@COND_TOOLKIT_PM_USE_GUI_1@	$(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/generic/animateg.cpp
+
 @COND_TOOLKIT_MSW_USE_GUI_1@monodll_taskbarcmn.o: $(srcdir)/src/common/taskbarcmn.cpp $(MONODLL_ODEP)
 @COND_TOOLKIT_MSW_USE_GUI_1@	$(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/common/taskbarcmn.cpp
 
@@ -15857,6 +15945,9 @@ monodll_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONODLL_ODEP)
 @COND_TOOLKIT_X11_USE_GUI_1@monodll_taskbarx11.o: $(srcdir)/src/unix/taskbarx11.cpp $(MONODLL_ODEP)
 @COND_TOOLKIT_X11_USE_GUI_1@	$(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/unix/taskbarx11.cpp
 
+@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@monodll_animate.o: $(srcdir)/src/gtk/animate.cpp $(MONODLL_ODEP)
+@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@	$(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/gtk/animate.cpp
+
 @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@monodll_dataview.o: $(srcdir)/src/gtk/dataview.cpp $(MONODLL_ODEP)
 @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@	$(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/gtk/dataview.cpp
 
@@ -19376,6 +19467,9 @@ monolib_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONOLIB_ODEP)
 @COND_USE_GUI_1@monolib_accesscmn.o: $(srcdir)/src/common/accesscmn.cpp $(MONOLIB_ODEP)
 @COND_USE_GUI_1@	$(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/common/accesscmn.cpp
 
+@COND_USE_GUI_1@monolib_anidecod.o: $(srcdir)/src/common/anidecod.cpp $(MONOLIB_ODEP)
+@COND_USE_GUI_1@	$(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/common/anidecod.cpp
+
 @COND_USE_GUI_1@monolib_appcmn.o: $(srcdir)/src/common/appcmn.cpp $(MONOLIB_ODEP)
 @COND_USE_GUI_1@	$(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/common/appcmn.cpp
 
@@ -19715,6 +19809,9 @@ monolib_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONOLIB_ODEP)
 @COND_USE_GUI_1@monolib_vscroll.o: $(srcdir)/src/generic/vscroll.cpp $(MONOLIB_ODEP)
 @COND_USE_GUI_1@	$(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/generic/vscroll.cpp
 
+@COND_USE_GUI_1@monolib_animatecmn.o: $(srcdir)/src/common/animatecmn.cpp $(MONOLIB_ODEP)
+@COND_USE_GUI_1@	$(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/common/animatecmn.cpp
+
 @COND_USE_GUI_1@monolib_datavcmn.o: $(srcdir)/src/common/datavcmn.cpp $(MONOLIB_ODEP)
 @COND_USE_GUI_1@	$(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/common/datavcmn.cpp
 
@@ -19769,6 +19866,21 @@ monolib_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONOLIB_ODEP)
 @COND_USE_GUI_1@monolib_wizard.o: $(srcdir)/src/generic/wizard.cpp $(MONOLIB_ODEP)
 @COND_USE_GUI_1@	$(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/generic/wizard.cpp
 
+@COND_TOOLKIT_MSW_USE_GUI_1@monolib_animateg.o: $(srcdir)/src/generic/animateg.cpp $(MONOLIB_ODEP)
+@COND_TOOLKIT_MSW_USE_GUI_1@	$(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/generic/animateg.cpp
+
+@COND_TOOLKIT_WINCE_USE_GUI_1@monolib_animateg.o: $(srcdir)/src/generic/animateg.cpp $(MONOLIB_ODEP)
+@COND_TOOLKIT_WINCE_USE_GUI_1@	$(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/generic/animateg.cpp
+
+@COND_TOOLKIT_MAC_USE_GUI_1@monolib_animateg.o: $(srcdir)/src/generic/animateg.cpp $(MONOLIB_ODEP)
+@COND_TOOLKIT_MAC_USE_GUI_1@	$(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/generic/animateg.cpp
+
+@COND_TOOLKIT_COCOA_USE_GUI_1@monolib_animateg.o: $(srcdir)/src/generic/animateg.cpp $(MONOLIB_ODEP)
+@COND_TOOLKIT_COCOA_USE_GUI_1@	$(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/generic/animateg.cpp
+
+@COND_TOOLKIT_PM_USE_GUI_1@monolib_animateg.o: $(srcdir)/src/generic/animateg.cpp $(MONOLIB_ODEP)
+@COND_TOOLKIT_PM_USE_GUI_1@	$(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/generic/animateg.cpp
+
 @COND_TOOLKIT_MSW_USE_GUI_1@monolib_taskbarcmn.o: $(srcdir)/src/common/taskbarcmn.cpp $(MONOLIB_ODEP)
 @COND_TOOLKIT_MSW_USE_GUI_1@	$(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/common/taskbarcmn.cpp
 
@@ -19856,6 +19968,9 @@ monolib_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONOLIB_ODEP)
 @COND_TOOLKIT_X11_USE_GUI_1@monolib_taskbarx11.o: $(srcdir)/src/unix/taskbarx11.cpp $(MONOLIB_ODEP)
 @COND_TOOLKIT_X11_USE_GUI_1@	$(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/unix/taskbarx11.cpp
 
+@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@monolib_animate.o: $(srcdir)/src/gtk/animate.cpp $(MONOLIB_ODEP)
+@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@	$(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/gtk/animate.cpp
+
 @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@monolib_dataview.o: $(srcdir)/src/gtk/dataview.cpp $(MONOLIB_ODEP)
 @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@	$(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/gtk/dataview.cpp
 
@@ -23714,6 +23829,9 @@ coredll_win32.o: $(srcdir)/src/univ/themes/win32.cpp $(COREDLL_ODEP)
 @COND_USE_GUI_1@coredll_accesscmn.o: $(srcdir)/src/common/accesscmn.cpp $(COREDLL_ODEP)
 @COND_USE_GUI_1@	$(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/common/accesscmn.cpp
 
+@COND_USE_GUI_1@coredll_anidecod.o: $(srcdir)/src/common/anidecod.cpp $(COREDLL_ODEP)
+@COND_USE_GUI_1@	$(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/common/anidecod.cpp
+
 @COND_USE_GUI_1@coredll_appcmn.o: $(srcdir)/src/common/appcmn.cpp $(COREDLL_ODEP)
 @COND_USE_GUI_1@	$(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/common/appcmn.cpp
 
@@ -26621,6 +26739,9 @@ corelib_win32.o: $(srcdir)/src/univ/themes/win32.cpp $(CORELIB_ODEP)
 @COND_USE_GUI_1@corelib_accesscmn.o: $(srcdir)/src/common/accesscmn.cpp $(CORELIB_ODEP)
 @COND_USE_GUI_1@	$(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/common/accesscmn.cpp
 
+@COND_USE_GUI_1@corelib_anidecod.o: $(srcdir)/src/common/anidecod.cpp $(CORELIB_ODEP)
+@COND_USE_GUI_1@	$(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/common/anidecod.cpp
+
 @COND_USE_GUI_1@corelib_appcmn.o: $(srcdir)/src/common/appcmn.cpp $(CORELIB_ODEP)
 @COND_USE_GUI_1@	$(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/common/appcmn.cpp
 
@@ -26966,6 +27087,9 @@ advdll_version_rc.o: $(srcdir)/src/msw/version.rc $(ADVDLL_ODEP)
 advdll_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(ADVDLL_ODEP)
 	$(CXXC) -c -o $@ $(ADVDLL_CXXFLAGS) $(srcdir)/src/unix/sound_sdl.cpp
 
+advdll_animatecmn.o: $(srcdir)/src/common/animatecmn.cpp $(ADVDLL_ODEP)
+	$(CXXC) -c -o $@ $(ADVDLL_CXXFLAGS) $(srcdir)/src/common/animatecmn.cpp
+
 advdll_datavcmn.o: $(srcdir)/src/common/datavcmn.cpp $(ADVDLL_ODEP)
 	$(CXXC) -c -o $@ $(ADVDLL_CXXFLAGS) $(srcdir)/src/common/datavcmn.cpp
 
@@ -27020,6 +27144,21 @@ advdll_tipdlg.o: $(srcdir)/src/generic/tipdlg.cpp $(ADVDLL_ODEP)
 advdll_wizard.o: $(srcdir)/src/generic/wizard.cpp $(ADVDLL_ODEP)
 	$(CXXC) -c -o $@ $(ADVDLL_CXXFLAGS) $(srcdir)/src/generic/wizard.cpp
 
+@COND_TOOLKIT_MSW@advdll_animateg.o: $(srcdir)/src/generic/animateg.cpp $(ADVDLL_ODEP)
+@COND_TOOLKIT_MSW@	$(CXXC) -c -o $@ $(ADVDLL_CXXFLAGS) $(srcdir)/src/generic/animateg.cpp
+
+@COND_TOOLKIT_WINCE@advdll_animateg.o: $(srcdir)/src/generic/animateg.cpp $(ADVDLL_ODEP)
+@COND_TOOLKIT_WINCE@	$(CXXC) -c -o $@ $(ADVDLL_CXXFLAGS) $(srcdir)/src/generic/animateg.cpp
+
+@COND_TOOLKIT_MAC@advdll_animateg.o: $(srcdir)/src/generic/animateg.cpp $(ADVDLL_ODEP)
+@COND_TOOLKIT_MAC@	$(CXXC) -c -o $@ $(ADVDLL_CXXFLAGS) $(srcdir)/src/generic/animateg.cpp
+
+@COND_TOOLKIT_COCOA@advdll_animateg.o: $(srcdir)/src/generic/animateg.cpp $(ADVDLL_ODEP)
+@COND_TOOLKIT_COCOA@	$(CXXC) -c -o $@ $(ADVDLL_CXXFLAGS) $(srcdir)/src/generic/animateg.cpp
+
+@COND_TOOLKIT_PM@advdll_animateg.o: $(srcdir)/src/generic/animateg.cpp $(ADVDLL_ODEP)
+@COND_TOOLKIT_PM@	$(CXXC) -c -o $@ $(ADVDLL_CXXFLAGS) $(srcdir)/src/generic/animateg.cpp
+
 @COND_TOOLKIT_MSW@advdll_taskbarcmn.o: $(srcdir)/src/common/taskbarcmn.cpp $(ADVDLL_ODEP)
 @COND_TOOLKIT_MSW@	$(CXXC) -c -o $@ $(ADVDLL_CXXFLAGS) $(srcdir)/src/common/taskbarcmn.cpp
 
@@ -27134,6 +27273,9 @@ advdll_wizard.o: $(srcdir)/src/generic/wizard.cpp $(ADVDLL_ODEP)
 @COND_TOOLKIT_X11@advdll_taskbarx11.o: $(srcdir)/src/unix/taskbarx11.cpp $(ADVDLL_ODEP)
 @COND_TOOLKIT_X11@	$(CXXC) -c -o $@ $(ADVDLL_CXXFLAGS) $(srcdir)/src/unix/taskbarx11.cpp
 
+@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2@advdll_animate.o: $(srcdir)/src/gtk/animate.cpp $(ADVDLL_ODEP)
+@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2@	$(CXXC) -c -o $@ $(ADVDLL_CXXFLAGS) $(srcdir)/src/gtk/animate.cpp
+
 @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2@advdll_dataview.o: $(srcdir)/src/gtk/dataview.cpp $(ADVDLL_ODEP)
 @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2@	$(CXXC) -c -o $@ $(ADVDLL_CXXFLAGS) $(srcdir)/src/gtk/dataview.cpp
 
@@ -27149,6 +27291,9 @@ advdll_wizard.o: $(srcdir)/src/generic/wizard.cpp $(ADVDLL_ODEP)
 advlib_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(ADVLIB_ODEP)
 	$(CXXC) -c -o $@ $(ADVLIB_CXXFLAGS) $(srcdir)/src/unix/sound_sdl.cpp
 
+advlib_animatecmn.o: $(srcdir)/src/common/animatecmn.cpp $(ADVLIB_ODEP)
+	$(CXXC) -c -o $@ $(ADVLIB_CXXFLAGS) $(srcdir)/src/common/animatecmn.cpp
+
 advlib_datavcmn.o: $(srcdir)/src/common/datavcmn.cpp $(ADVLIB_ODEP)
 	$(CXXC) -c -o $@ $(ADVLIB_CXXFLAGS) $(srcdir)/src/common/datavcmn.cpp
 
@@ -27203,6 +27348,21 @@ advlib_tipdlg.o: $(srcdir)/src/generic/tipdlg.cpp $(ADVLIB_ODEP)
 advlib_wizard.o: $(srcdir)/src/generic/wizard.cpp $(ADVLIB_ODEP)
 	$(CXXC) -c -o $@ $(ADVLIB_CXXFLAGS) $(srcdir)/src/generic/wizard.cpp
 
+@COND_TOOLKIT_MSW@advlib_animateg.o: $(srcdir)/src/generic/animateg.cpp $(ADVLIB_ODEP)
+@COND_TOOLKIT_MSW@	$(CXXC) -c -o $@ $(ADVLIB_CXXFLAGS) $(srcdir)/src/generic/animateg.cpp
+
+@COND_TOOLKIT_WINCE@advlib_animateg.o: $(srcdir)/src/generic/animateg.cpp $(ADVLIB_ODEP)
+@COND_TOOLKIT_WINCE@	$(CXXC) -c -o $@ $(ADVLIB_CXXFLAGS) $(srcdir)/src/generic/animateg.cpp
+
+@COND_TOOLKIT_MAC@advlib_animateg.o: $(srcdir)/src/generic/animateg.cpp $(ADVLIB_ODEP)
+@COND_TOOLKIT_MAC@	$(CXXC) -c -o $@ $(ADVLIB_CXXFLAGS) $(srcdir)/src/generic/animateg.cpp
+
+@COND_TOOLKIT_COCOA@advlib_animateg.o: $(srcdir)/src/generic/animateg.cpp $(ADVLIB_ODEP)
+@COND_TOOLKIT_COCOA@	$(CXXC) -c -o $@ $(ADVLIB_CXXFLAGS) $(srcdir)/src/generic/animateg.cpp
+
+@COND_TOOLKIT_PM@advlib_animateg.o: $(srcdir)/src/generic/animateg.cpp $(ADVLIB_ODEP)
+@COND_TOOLKIT_PM@	$(CXXC) -c -o $@ $(ADVLIB_CXXFLAGS) $(srcdir)/src/generic/animateg.cpp
+
 @COND_TOOLKIT_MSW@advlib_taskbarcmn.o: $(srcdir)/src/common/taskbarcmn.cpp $(ADVLIB_ODEP)
 @COND_TOOLKIT_MSW@	$(CXXC) -c -o $@ $(ADVLIB_CXXFLAGS) $(srcdir)/src/common/taskbarcmn.cpp
 
@@ -27317,6 +27477,9 @@ advlib_wizard.o: $(srcdir)/src/generic/wizard.cpp $(ADVLIB_ODEP)
 @COND_TOOLKIT_X11@advlib_taskbarx11.o: $(srcdir)/src/unix/taskbarx11.cpp $(ADVLIB_ODEP)
 @COND_TOOLKIT_X11@	$(CXXC) -c -o $@ $(ADVLIB_CXXFLAGS) $(srcdir)/src/unix/taskbarx11.cpp
 
+@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2@advlib_animate.o: $(srcdir)/src/gtk/animate.cpp $(ADVLIB_ODEP)
+@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2@	$(CXXC) -c -o $@ $(ADVLIB_CXXFLAGS) $(srcdir)/src/gtk/animate.cpp
+
 @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2@advlib_dataview.o: $(srcdir)/src/gtk/dataview.cpp $(ADVLIB_ODEP)
 @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2@	$(CXXC) -c -o $@ $(ADVLIB_CXXFLAGS) $(srcdir)/src/gtk/dataview.cpp
 
diff --git a/build/bakefiles/files.bkl b/build/bakefiles/files.bkl
index 8033700998..efc791abc5 100644
--- a/build/bakefiles/files.bkl
+++ b/build/bakefiles/files.bkl
@@ -551,6 +551,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
 
 <set var="GUI_CMN_SRC" hints="files">
     src/common/accesscmn.cpp
+    src/common/anidecod.cpp
     src/common/appcmn.cpp
     src/common/artprov.cpp
     src/common/artstd.cpp
@@ -756,6 +757,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
 
     wx/accel.h
     wx/access.h
+    wx/anidecod.h
     wx/artprov.h
     wx/bitmap.h
     wx/bookctrl.h
@@ -2611,6 +2613,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
 <!-- ====================================================================== -->
 
 <set var="ADVANCED_CMN_SRC" hints="files">
+    src/common/animatecmn.cpp
     src/common/datavcmn.cpp
     src/generic/aboutdlgg.cpp
     src/generic/bmpcboxg.cpp
@@ -2632,6 +2635,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
 </set>
 
 <set var="ADVANCED_CMN_HDR" hints="files">
+    wx/animate.h
     wx/bmpcbox.h
     wx/calctrl.h
     wx/dataview.h
@@ -2673,12 +2677,14 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
 </set>
 
 <set var="ADVANCED_MSW_SRC" hints="files">
+    src/generic/animateg.cpp
     src/common/taskbarcmn.cpp
     src/msw/aboutdlg.cpp
     src/msw/sound.cpp
     src/msw/taskbar.cpp
 </set>
 <set var="ADVANCED_MSW_HDR" hints="files">
+    wx/generic/animate.h
     wx/msw/sound.h
     wx/msw/taskbar.h
 </set>
@@ -2700,6 +2706,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
 </set>
 
 <set var="ADVANCED_MAC_SRC" hints="files">
+    src/generic/animateg.cpp
     src/common/taskbarcmn.cpp
     src/mac/carbon/aboutdlg.cpp
     src/mac/carbon/drawer.cpp
@@ -2708,6 +2715,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
     src/mac/corefoundation/hidjoystick.cpp
 </set>
 <set var="ADVANCED_MAC_HDR" hints="files">
+    wx/generic/animate.h
     wx/mac/carbon/drawer.h
     wx/mac/carbon/sound.h
     wx/mac/carbon/taskbarosx.h
@@ -2715,20 +2723,24 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
 </set>
 
 <set var="ADVANCED_COCOA_SRC" hints="files">
+    src/generic/animateg.cpp
     src/cocoa/taskbar.mm
     src/common/taskbarcmn.cpp
     src/mac/corefoundation/hidjoystick.cpp
 </set>
 <set var="ADVANCED_COCOA_HDR" hints="files">
+    wx/generic/animate.h
     wx/cocoa/taskbar.h
     wx/mac/corefoundation/joystick.h
 </set>
 
 <set var="ADVANCED_OS2_SRC" hints="files">
+    src/generic/animateg.cpp
     src/os2/joystick.cpp
     src/os2/sound.cpp
 </set>
 <set var="ADVANCED_OS2_HDR" hints="files">
+    wx/generic/animate.h
     wx/os2/joystick.h
     wx/os2/sound.h
 </set>
@@ -2747,10 +2759,15 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
 
 <set var="ADVANCED_GTK_SRC" hints="files">
     src/gtk/aboutdlg.cpp
+    src/gtk/animate.cpp
     src/gtk/taskbar.cpp
     src/gtk/dataview.cpp
     src/gtk/eggtrayicon.c
 </set>
+<set var="ADVANCED_GTK_HDR" hints="files">
+    wx/gtk/animate.h
+</set>
+
 <set var="ADVANCED_GTK1_SRC" hints="files">
 </set>
 
diff --git a/build/msw/makefile.bcc b/build/msw/makefile.bcc
index 7cf4b8800e..a657f3d1f5 100644
--- a/build/msw/makefile.bcc
+++ b/build/msw/makefile.bcc
@@ -1369,6 +1369,7 @@ ____CORE_SRC_FILENAMES_OBJECTS =  \
 	$(OBJS)\monodll_fdrepdlg.obj \
 	$(OBJS)\monodll_fontdlg.obj \
 	$(OBJS)\monodll_accesscmn.obj \
+	$(OBJS)\monodll_anidecod.obj \
 	$(OBJS)\monodll_appcmn.obj \
 	$(OBJS)\monodll_artprov.obj \
 	$(OBJS)\monodll_artstd.obj \
@@ -1587,6 +1588,7 @@ ____CORE_SRC_FILENAMES_OBJECTS =  \
 	$(OBJS)\monodll_mono.obj \
 	$(OBJS)\monodll_win32.obj \
 	$(OBJS)\monodll_accesscmn.obj \
+	$(OBJS)\monodll_anidecod.obj \
 	$(OBJS)\monodll_appcmn.obj \
 	$(OBJS)\monodll_artprov.obj \
 	$(OBJS)\monodll_artstd.obj \
@@ -1703,6 +1705,7 @@ ____CORE_SRC_FILENAMES_OBJECTS =  \
 !endif
 !if "$(WXUNIV)" == "0"
 ____ADVANCED_SRC_FILENAMES_OBJECTS =  \
+	$(OBJS)\monodll_animatecmn.obj \
 	$(OBJS)\monodll_datavcmn.obj \
 	$(OBJS)\monodll_aboutdlgg.obj \
 	$(OBJS)\monodll_bmpcboxg.obj \
@@ -1721,6 +1724,7 @@ ____ADVANCED_SRC_FILENAMES_OBJECTS =  \
 	$(OBJS)\monodll_splash.obj \
 	$(OBJS)\monodll_tipdlg.obj \
 	$(OBJS)\monodll_wizard.obj \
+	$(OBJS)\monodll_animateg.obj \
 	$(OBJS)\monodll_taskbarcmn.obj \
 	$(OBJS)\monodll_aboutdlg.obj \
 	$(OBJS)\monodll_sound.obj \
@@ -1730,6 +1734,7 @@ ____ADVANCED_SRC_FILENAMES_OBJECTS =  \
 !endif
 !if "$(WXUNIV)" == "1"
 ____ADVANCED_SRC_FILENAMES_OBJECTS =  \
+	$(OBJS)\monodll_animatecmn.obj \
 	$(OBJS)\monodll_datavcmn.obj \
 	$(OBJS)\monodll_aboutdlgg.obj \
 	$(OBJS)\monodll_bmpcboxg.obj \
@@ -1748,6 +1753,7 @@ ____ADVANCED_SRC_FILENAMES_OBJECTS =  \
 	$(OBJS)\monodll_splash.obj \
 	$(OBJS)\monodll_tipdlg.obj \
 	$(OBJS)\monodll_wizard.obj \
+	$(OBJS)\monodll_animateg.obj \
 	$(OBJS)\monodll_taskbarcmn.obj \
 	$(OBJS)\monodll_aboutdlg.obj \
 	$(OBJS)\monodll_sound.obj \
@@ -1961,6 +1967,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS =  \
 	$(OBJS)\monolib_fdrepdlg.obj \
 	$(OBJS)\monolib_fontdlg.obj \
 	$(OBJS)\monolib_accesscmn.obj \
+	$(OBJS)\monolib_anidecod.obj \
 	$(OBJS)\monolib_appcmn.obj \
 	$(OBJS)\monolib_artprov.obj \
 	$(OBJS)\monolib_artstd.obj \
@@ -2179,6 +2186,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS =  \
 	$(OBJS)\monolib_mono.obj \
 	$(OBJS)\monolib_win32.obj \
 	$(OBJS)\monolib_accesscmn.obj \
+	$(OBJS)\monolib_anidecod.obj \
 	$(OBJS)\monolib_appcmn.obj \
 	$(OBJS)\monolib_artprov.obj \
 	$(OBJS)\monolib_artstd.obj \
@@ -2295,6 +2303,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS =  \
 !endif
 !if "$(WXUNIV)" == "0"
 ____ADVANCED_SRC_FILENAMES_1_OBJECTS =  \
+	$(OBJS)\monolib_animatecmn.obj \
 	$(OBJS)\monolib_datavcmn.obj \
 	$(OBJS)\monolib_aboutdlgg.obj \
 	$(OBJS)\monolib_bmpcboxg.obj \
@@ -2313,6 +2322,7 @@ ____ADVANCED_SRC_FILENAMES_1_OBJECTS =  \
 	$(OBJS)\monolib_splash.obj \
 	$(OBJS)\monolib_tipdlg.obj \
 	$(OBJS)\monolib_wizard.obj \
+	$(OBJS)\monolib_animateg.obj \
 	$(OBJS)\monolib_taskbarcmn.obj \
 	$(OBJS)\monolib_aboutdlg.obj \
 	$(OBJS)\monolib_sound.obj \
@@ -2322,6 +2332,7 @@ ____ADVANCED_SRC_FILENAMES_1_OBJECTS =  \
 !endif
 !if "$(WXUNIV)" == "1"
 ____ADVANCED_SRC_FILENAMES_1_OBJECTS =  \
+	$(OBJS)\monolib_animatecmn.obj \
 	$(OBJS)\monolib_datavcmn.obj \
 	$(OBJS)\monolib_aboutdlgg.obj \
 	$(OBJS)\monolib_bmpcboxg.obj \
@@ -2340,6 +2351,7 @@ ____ADVANCED_SRC_FILENAMES_1_OBJECTS =  \
 	$(OBJS)\monolib_splash.obj \
 	$(OBJS)\monolib_tipdlg.obj \
 	$(OBJS)\monolib_wizard.obj \
+	$(OBJS)\monolib_animateg.obj \
 	$(OBJS)\monolib_taskbarcmn.obj \
 	$(OBJS)\monolib_aboutdlg.obj \
 	$(OBJS)\monolib_sound.obj \
@@ -2467,6 +2479,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS =  \
 	$(OBJS)\coredll_fdrepdlg.obj \
 	$(OBJS)\coredll_fontdlg.obj \
 	$(OBJS)\coredll_accesscmn.obj \
+	$(OBJS)\coredll_anidecod.obj \
 	$(OBJS)\coredll_appcmn.obj \
 	$(OBJS)\coredll_artprov.obj \
 	$(OBJS)\coredll_artstd.obj \
@@ -2685,6 +2698,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS =  \
 	$(OBJS)\coredll_mono.obj \
 	$(OBJS)\coredll_win32.obj \
 	$(OBJS)\coredll_accesscmn.obj \
+	$(OBJS)\coredll_anidecod.obj \
 	$(OBJS)\coredll_appcmn.obj \
 	$(OBJS)\coredll_artprov.obj \
 	$(OBJS)\coredll_artstd.obj \
@@ -2904,6 +2918,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS =  \
 	$(OBJS)\corelib_fdrepdlg.obj \
 	$(OBJS)\corelib_fontdlg.obj \
 	$(OBJS)\corelib_accesscmn.obj \
+	$(OBJS)\corelib_anidecod.obj \
 	$(OBJS)\corelib_appcmn.obj \
 	$(OBJS)\corelib_artprov.obj \
 	$(OBJS)\corelib_artstd.obj \
@@ -3122,6 +3137,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS =  \
 	$(OBJS)\corelib_mono.obj \
 	$(OBJS)\corelib_win32.obj \
 	$(OBJS)\corelib_accesscmn.obj \
+	$(OBJS)\corelib_anidecod.obj \
 	$(OBJS)\corelib_appcmn.obj \
 	$(OBJS)\corelib_artprov.obj \
 	$(OBJS)\corelib_artstd.obj \
@@ -3242,6 +3258,7 @@ __advdll___depname = \
 !endif
 !if "$(WXUNIV)" == "0"
 ____ADVANCED_SRC_FILENAMES_2_OBJECTS =  \
+	$(OBJS)\advdll_animatecmn.obj \
 	$(OBJS)\advdll_datavcmn.obj \
 	$(OBJS)\advdll_aboutdlgg.obj \
 	$(OBJS)\advdll_bmpcboxg.obj \
@@ -3260,6 +3277,7 @@ ____ADVANCED_SRC_FILENAMES_2_OBJECTS =  \
 	$(OBJS)\advdll_splash.obj \
 	$(OBJS)\advdll_tipdlg.obj \
 	$(OBJS)\advdll_wizard.obj \
+	$(OBJS)\advdll_animateg.obj \
 	$(OBJS)\advdll_taskbarcmn.obj \
 	$(OBJS)\advdll_aboutdlg.obj \
 	$(OBJS)\advdll_sound.obj \
@@ -3269,6 +3287,7 @@ ____ADVANCED_SRC_FILENAMES_2_OBJECTS =  \
 !endif
 !if "$(WXUNIV)" == "1"
 ____ADVANCED_SRC_FILENAMES_2_OBJECTS =  \
+	$(OBJS)\advdll_animatecmn.obj \
 	$(OBJS)\advdll_datavcmn.obj \
 	$(OBJS)\advdll_aboutdlgg.obj \
 	$(OBJS)\advdll_bmpcboxg.obj \
@@ -3287,6 +3306,7 @@ ____ADVANCED_SRC_FILENAMES_2_OBJECTS =  \
 	$(OBJS)\advdll_splash.obj \
 	$(OBJS)\advdll_tipdlg.obj \
 	$(OBJS)\advdll_wizard.obj \
+	$(OBJS)\advdll_animateg.obj \
 	$(OBJS)\advdll_taskbarcmn.obj \
 	$(OBJS)\advdll_aboutdlg.obj \
 	$(OBJS)\advdll_sound.obj \
@@ -3299,6 +3319,7 @@ __advlib___depname = \
 !endif
 !if "$(WXUNIV)" == "0"
 ____ADVANCED_SRC_FILENAMES_3_OBJECTS =  \
+	$(OBJS)\advlib_animatecmn.obj \
 	$(OBJS)\advlib_datavcmn.obj \
 	$(OBJS)\advlib_aboutdlgg.obj \
 	$(OBJS)\advlib_bmpcboxg.obj \
@@ -3317,6 +3338,7 @@ ____ADVANCED_SRC_FILENAMES_3_OBJECTS =  \
 	$(OBJS)\advlib_splash.obj \
 	$(OBJS)\advlib_tipdlg.obj \
 	$(OBJS)\advlib_wizard.obj \
+	$(OBJS)\advlib_animateg.obj \
 	$(OBJS)\advlib_taskbarcmn.obj \
 	$(OBJS)\advlib_aboutdlg.obj \
 	$(OBJS)\advlib_sound.obj \
@@ -3326,6 +3348,7 @@ ____ADVANCED_SRC_FILENAMES_3_OBJECTS =  \
 !endif
 !if "$(WXUNIV)" == "1"
 ____ADVANCED_SRC_FILENAMES_3_OBJECTS =  \
+	$(OBJS)\advlib_animatecmn.obj \
 	$(OBJS)\advlib_datavcmn.obj \
 	$(OBJS)\advlib_aboutdlgg.obj \
 	$(OBJS)\advlib_bmpcboxg.obj \
@@ -3344,6 +3367,7 @@ ____ADVANCED_SRC_FILENAMES_3_OBJECTS =  \
 	$(OBJS)\advlib_splash.obj \
 	$(OBJS)\advlib_tipdlg.obj \
 	$(OBJS)\advlib_wizard.obj \
+	$(OBJS)\advlib_animateg.obj \
 	$(OBJS)\advlib_taskbarcmn.obj \
 	$(OBJS)\advlib_aboutdlg.obj \
 	$(OBJS)\advlib_sound.obj \
@@ -5635,6 +5659,11 @@ $(OBJS)\monodll_accesscmn.obj: ..\..\src\common\accesscmn.cpp
 	$(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) $**
 !endif
 
+!if "$(USE_GUI)" == "1"
+$(OBJS)\monodll_anidecod.obj: ..\..\src\common\anidecod.cpp
+	$(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) $**
+!endif
+
 !if "$(USE_GUI)" == "1"
 $(OBJS)\monodll_appcmn.obj: ..\..\src\common\appcmn.cpp
 	$(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) $**
@@ -6200,6 +6229,11 @@ $(OBJS)\monodll_vscroll.obj: ..\..\src\generic\vscroll.cpp
 	$(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) $**
 !endif
 
+!if "$(USE_GUI)" == "1"
+$(OBJS)\monodll_animatecmn.obj: ..\..\src\common\animatecmn.cpp
+	$(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) $**
+!endif
+
 !if "$(USE_GUI)" == "1"
 $(OBJS)\monodll_datavcmn.obj: ..\..\src\common\datavcmn.cpp
 	$(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) $**
@@ -6290,6 +6324,11 @@ $(OBJS)\monodll_wizard.obj: ..\..\src\generic\wizard.cpp
 	$(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) $**
 !endif
 
+!if "$(USE_GUI)" == "1"
+$(OBJS)\monodll_animateg.obj: ..\..\src\generic\animateg.cpp
+	$(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) $**
+!endif
+
 !if "$(USE_GUI)" == "1"
 $(OBJS)\monodll_taskbarcmn.obj: ..\..\src\common\taskbarcmn.cpp
 	$(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) $**
@@ -7548,6 +7587,11 @@ $(OBJS)\monolib_accesscmn.obj: ..\..\src\common\accesscmn.cpp
 	$(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) $**
 !endif
 
+!if "$(USE_GUI)" == "1"
+$(OBJS)\monolib_anidecod.obj: ..\..\src\common\anidecod.cpp
+	$(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) $**
+!endif
+
 !if "$(USE_GUI)" == "1"
 $(OBJS)\monolib_appcmn.obj: ..\..\src\common\appcmn.cpp
 	$(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) $**
@@ -8113,6 +8157,11 @@ $(OBJS)\monolib_vscroll.obj: ..\..\src\generic\vscroll.cpp
 	$(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) $**
 !endif
 
+!if "$(USE_GUI)" == "1"
+$(OBJS)\monolib_animatecmn.obj: ..\..\src\common\animatecmn.cpp
+	$(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) $**
+!endif
+
 !if "$(USE_GUI)" == "1"
 $(OBJS)\monolib_datavcmn.obj: ..\..\src\common\datavcmn.cpp
 	$(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) $**
@@ -8203,6 +8252,11 @@ $(OBJS)\monolib_wizard.obj: ..\..\src\generic\wizard.cpp
 	$(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) $**
 !endif
 
+!if "$(USE_GUI)" == "1"
+$(OBJS)\monolib_animateg.obj: ..\..\src\generic\animateg.cpp
+	$(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) $**
+!endif
+
 !if "$(USE_GUI)" == "1"
 $(OBJS)\monolib_taskbarcmn.obj: ..\..\src\common\taskbarcmn.cpp
 	$(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) $**
@@ -9482,6 +9536,11 @@ $(OBJS)\coredll_accesscmn.obj: ..\..\src\common\accesscmn.cpp
 	$(CXX) -q -c -P -o$@ $(COREDLL_CXXFLAGS) $**
 !endif
 
+!if "$(USE_GUI)" == "1"
+$(OBJS)\coredll_anidecod.obj: ..\..\src\common\anidecod.cpp
+	$(CXX) -q -c -P -o$@ $(COREDLL_CXXFLAGS) $**
+!endif
+
 !if "$(USE_GUI)" == "1"
 $(OBJS)\coredll_appcmn.obj: ..\..\src\common\appcmn.cpp
 	$(CXX) -q -c -P -o$@ $(COREDLL_CXXFLAGS) $**
@@ -10722,6 +10781,11 @@ $(OBJS)\corelib_accesscmn.obj: ..\..\src\common\accesscmn.cpp
 	$(CXX) -q -c -P -o$@ $(CORELIB_CXXFLAGS) $**
 !endif
 
+!if "$(USE_GUI)" == "1"
+$(OBJS)\corelib_anidecod.obj: ..\..\src\common\anidecod.cpp
+	$(CXX) -q -c -P -o$@ $(CORELIB_CXXFLAGS) $**
+!endif
+
 !if "$(USE_GUI)" == "1"
 $(OBJS)\corelib_appcmn.obj: ..\..\src\common\appcmn.cpp
 	$(CXX) -q -c -P -o$@ $(CORELIB_CXXFLAGS) $**
@@ -11296,6 +11360,9 @@ $(OBJS)\advdll_version.res: ..\..\src\msw\version.rc
 $(OBJS)\advdll_datectrl.obj: ..\..\src\msw\datectrl.cpp
 	$(CXX) -q -c -P -o$@ $(ADVDLL_CXXFLAGS) $**
 
+$(OBJS)\advdll_animatecmn.obj: ..\..\src\common\animatecmn.cpp
+	$(CXX) -q -c -P -o$@ $(ADVDLL_CXXFLAGS) $**
+
 $(OBJS)\advdll_datavcmn.obj: ..\..\src\common\datavcmn.cpp
 	$(CXX) -q -c -P -o$@ $(ADVDLL_CXXFLAGS) $**
 
@@ -11350,6 +11417,9 @@ $(OBJS)\advdll_tipdlg.obj: ..\..\src\generic\tipdlg.cpp
 $(OBJS)\advdll_wizard.obj: ..\..\src\generic\wizard.cpp
 	$(CXX) -q -c -P -o$@ $(ADVDLL_CXXFLAGS) $**
 
+$(OBJS)\advdll_animateg.obj: ..\..\src\generic\animateg.cpp
+	$(CXX) -q -c -P -o$@ $(ADVDLL_CXXFLAGS) $**
+
 $(OBJS)\advdll_taskbarcmn.obj: ..\..\src\common\taskbarcmn.cpp
 	$(CXX) -q -c -P -o$@ $(ADVDLL_CXXFLAGS) $**
 
@@ -11371,6 +11441,9 @@ $(OBJS)\advlib_dummy.obj: ..\..\src\common\dummy.cpp
 $(OBJS)\advlib_datectrl.obj: ..\..\src\msw\datectrl.cpp
 	$(CXX) -q -c -P -o$@ $(ADVLIB_CXXFLAGS) $**
 
+$(OBJS)\advlib_animatecmn.obj: ..\..\src\common\animatecmn.cpp
+	$(CXX) -q -c -P -o$@ $(ADVLIB_CXXFLAGS) $**
+
 $(OBJS)\advlib_datavcmn.obj: ..\..\src\common\datavcmn.cpp
 	$(CXX) -q -c -P -o$@ $(ADVLIB_CXXFLAGS) $**
 
@@ -11425,6 +11498,9 @@ $(OBJS)\advlib_tipdlg.obj: ..\..\src\generic\tipdlg.cpp
 $(OBJS)\advlib_wizard.obj: ..\..\src\generic\wizard.cpp
 	$(CXX) -q -c -P -o$@ $(ADVLIB_CXXFLAGS) $**
 
+$(OBJS)\advlib_animateg.obj: ..\..\src\generic\animateg.cpp
+	$(CXX) -q -c -P -o$@ $(ADVLIB_CXXFLAGS) $**
+
 $(OBJS)\advlib_taskbarcmn.obj: ..\..\src\common\taskbarcmn.cpp
 	$(CXX) -q -c -P -o$@ $(ADVLIB_CXXFLAGS) $**
 
diff --git a/build/msw/makefile.gcc b/build/msw/makefile.gcc
index 5426f56632..e5d1946fa9 100644
--- a/build/msw/makefile.gcc
+++ b/build/msw/makefile.gcc
@@ -1379,6 +1379,7 @@ ____CORE_SRC_FILENAMES_OBJECTS =  \
 	$(OBJS)\monodll_fdrepdlg.o \
 	$(OBJS)\monodll_fontdlg.o \
 	$(OBJS)\monodll_accesscmn.o \
+	$(OBJS)\monodll_anidecod.o \
 	$(OBJS)\monodll_appcmn.o \
 	$(OBJS)\monodll_artprov.o \
 	$(OBJS)\monodll_artstd.o \
@@ -1599,6 +1600,7 @@ ____CORE_SRC_FILENAMES_OBJECTS =  \
 	$(OBJS)\monodll_mono.o \
 	$(OBJS)\monodll_win32.o \
 	$(OBJS)\monodll_accesscmn.o \
+	$(OBJS)\monodll_anidecod.o \
 	$(OBJS)\monodll_appcmn.o \
 	$(OBJS)\monodll_artprov.o \
 	$(OBJS)\monodll_artstd.o \
@@ -1716,6 +1718,7 @@ endif
 endif
 ifeq ($(WXUNIV),0)
 ____ADVANCED_SRC_FILENAMES_OBJECTS =  \
+	$(OBJS)\monodll_animatecmn.o \
 	$(OBJS)\monodll_datavcmn.o \
 	$(OBJS)\monodll_aboutdlgg.o \
 	$(OBJS)\monodll_bmpcboxg.o \
@@ -1734,6 +1737,7 @@ ____ADVANCED_SRC_FILENAMES_OBJECTS =  \
 	$(OBJS)\monodll_splash.o \
 	$(OBJS)\monodll_tipdlg.o \
 	$(OBJS)\monodll_wizard.o \
+	$(OBJS)\monodll_animateg.o \
 	$(OBJS)\monodll_taskbarcmn.o \
 	$(OBJS)\monodll_aboutdlg.o \
 	$(OBJS)\monodll_sound.o \
@@ -1743,6 +1747,7 @@ ____ADVANCED_SRC_FILENAMES_OBJECTS =  \
 endif
 ifeq ($(WXUNIV),1)
 ____ADVANCED_SRC_FILENAMES_OBJECTS =  \
+	$(OBJS)\monodll_animatecmn.o \
 	$(OBJS)\monodll_datavcmn.o \
 	$(OBJS)\monodll_aboutdlgg.o \
 	$(OBJS)\monodll_bmpcboxg.o \
@@ -1761,6 +1766,7 @@ ____ADVANCED_SRC_FILENAMES_OBJECTS =  \
 	$(OBJS)\monodll_splash.o \
 	$(OBJS)\monodll_tipdlg.o \
 	$(OBJS)\monodll_wizard.o \
+	$(OBJS)\monodll_animateg.o \
 	$(OBJS)\monodll_taskbarcmn.o \
 	$(OBJS)\monodll_aboutdlg.o \
 	$(OBJS)\monodll_sound.o \
@@ -1977,6 +1983,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS =  \
 	$(OBJS)\monolib_fdrepdlg.o \
 	$(OBJS)\monolib_fontdlg.o \
 	$(OBJS)\monolib_accesscmn.o \
+	$(OBJS)\monolib_anidecod.o \
 	$(OBJS)\monolib_appcmn.o \
 	$(OBJS)\monolib_artprov.o \
 	$(OBJS)\monolib_artstd.o \
@@ -2197,6 +2204,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS =  \
 	$(OBJS)\monolib_mono.o \
 	$(OBJS)\monolib_win32.o \
 	$(OBJS)\monolib_accesscmn.o \
+	$(OBJS)\monolib_anidecod.o \
 	$(OBJS)\monolib_appcmn.o \
 	$(OBJS)\monolib_artprov.o \
 	$(OBJS)\monolib_artstd.o \
@@ -2314,6 +2322,7 @@ endif
 endif
 ifeq ($(WXUNIV),0)
 ____ADVANCED_SRC_FILENAMES_1_OBJECTS =  \
+	$(OBJS)\monolib_animatecmn.o \
 	$(OBJS)\monolib_datavcmn.o \
 	$(OBJS)\monolib_aboutdlgg.o \
 	$(OBJS)\monolib_bmpcboxg.o \
@@ -2332,6 +2341,7 @@ ____ADVANCED_SRC_FILENAMES_1_OBJECTS =  \
 	$(OBJS)\monolib_splash.o \
 	$(OBJS)\monolib_tipdlg.o \
 	$(OBJS)\monolib_wizard.o \
+	$(OBJS)\monolib_animateg.o \
 	$(OBJS)\monolib_taskbarcmn.o \
 	$(OBJS)\monolib_aboutdlg.o \
 	$(OBJS)\monolib_sound.o \
@@ -2341,6 +2351,7 @@ ____ADVANCED_SRC_FILENAMES_1_OBJECTS =  \
 endif
 ifeq ($(WXUNIV),1)
 ____ADVANCED_SRC_FILENAMES_1_OBJECTS =  \
+	$(OBJS)\monolib_animatecmn.o \
 	$(OBJS)\monolib_datavcmn.o \
 	$(OBJS)\monolib_aboutdlgg.o \
 	$(OBJS)\monolib_bmpcboxg.o \
@@ -2359,6 +2370,7 @@ ____ADVANCED_SRC_FILENAMES_1_OBJECTS =  \
 	$(OBJS)\monolib_splash.o \
 	$(OBJS)\monolib_tipdlg.o \
 	$(OBJS)\monolib_wizard.o \
+	$(OBJS)\monolib_animateg.o \
 	$(OBJS)\monolib_taskbarcmn.o \
 	$(OBJS)\monolib_aboutdlg.o \
 	$(OBJS)\monolib_sound.o \
@@ -2499,6 +2511,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS =  \
 	$(OBJS)\coredll_fdrepdlg.o \
 	$(OBJS)\coredll_fontdlg.o \
 	$(OBJS)\coredll_accesscmn.o \
+	$(OBJS)\coredll_anidecod.o \
 	$(OBJS)\coredll_appcmn.o \
 	$(OBJS)\coredll_artprov.o \
 	$(OBJS)\coredll_artstd.o \
@@ -2719,6 +2732,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS =  \
 	$(OBJS)\coredll_mono.o \
 	$(OBJS)\coredll_win32.o \
 	$(OBJS)\coredll_accesscmn.o \
+	$(OBJS)\coredll_anidecod.o \
 	$(OBJS)\coredll_appcmn.o \
 	$(OBJS)\coredll_artprov.o \
 	$(OBJS)\coredll_artstd.o \
@@ -2944,6 +2958,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS =  \
 	$(OBJS)\corelib_fdrepdlg.o \
 	$(OBJS)\corelib_fontdlg.o \
 	$(OBJS)\corelib_accesscmn.o \
+	$(OBJS)\corelib_anidecod.o \
 	$(OBJS)\corelib_appcmn.o \
 	$(OBJS)\corelib_artprov.o \
 	$(OBJS)\corelib_artstd.o \
@@ -3164,6 +3179,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS =  \
 	$(OBJS)\corelib_mono.o \
 	$(OBJS)\corelib_win32.o \
 	$(OBJS)\corelib_accesscmn.o \
+	$(OBJS)\corelib_anidecod.o \
 	$(OBJS)\corelib_appcmn.o \
 	$(OBJS)\corelib_artprov.o \
 	$(OBJS)\corelib_artstd.o \
@@ -3289,6 +3305,7 @@ endif
 endif
 ifeq ($(WXUNIV),0)
 ____ADVANCED_SRC_FILENAMES_2_OBJECTS =  \
+	$(OBJS)\advdll_animatecmn.o \
 	$(OBJS)\advdll_datavcmn.o \
 	$(OBJS)\advdll_aboutdlgg.o \
 	$(OBJS)\advdll_bmpcboxg.o \
@@ -3307,6 +3324,7 @@ ____ADVANCED_SRC_FILENAMES_2_OBJECTS =  \
 	$(OBJS)\advdll_splash.o \
 	$(OBJS)\advdll_tipdlg.o \
 	$(OBJS)\advdll_wizard.o \
+	$(OBJS)\advdll_animateg.o \
 	$(OBJS)\advdll_taskbarcmn.o \
 	$(OBJS)\advdll_aboutdlg.o \
 	$(OBJS)\advdll_sound.o \
@@ -3316,6 +3334,7 @@ ____ADVANCED_SRC_FILENAMES_2_OBJECTS =  \
 endif
 ifeq ($(WXUNIV),1)
 ____ADVANCED_SRC_FILENAMES_2_OBJECTS =  \
+	$(OBJS)\advdll_animatecmn.o \
 	$(OBJS)\advdll_datavcmn.o \
 	$(OBJS)\advdll_aboutdlgg.o \
 	$(OBJS)\advdll_bmpcboxg.o \
@@ -3334,6 +3353,7 @@ ____ADVANCED_SRC_FILENAMES_2_OBJECTS =  \
 	$(OBJS)\advdll_splash.o \
 	$(OBJS)\advdll_tipdlg.o \
 	$(OBJS)\advdll_wizard.o \
+	$(OBJS)\advdll_animateg.o \
 	$(OBJS)\advdll_taskbarcmn.o \
 	$(OBJS)\advdll_aboutdlg.o \
 	$(OBJS)\advdll_sound.o \
@@ -3350,6 +3370,7 @@ endif
 endif
 ifeq ($(WXUNIV),0)
 ____ADVANCED_SRC_FILENAMES_3_OBJECTS =  \
+	$(OBJS)\advlib_animatecmn.o \
 	$(OBJS)\advlib_datavcmn.o \
 	$(OBJS)\advlib_aboutdlgg.o \
 	$(OBJS)\advlib_bmpcboxg.o \
@@ -3368,6 +3389,7 @@ ____ADVANCED_SRC_FILENAMES_3_OBJECTS =  \
 	$(OBJS)\advlib_splash.o \
 	$(OBJS)\advlib_tipdlg.o \
 	$(OBJS)\advlib_wizard.o \
+	$(OBJS)\advlib_animateg.o \
 	$(OBJS)\advlib_taskbarcmn.o \
 	$(OBJS)\advlib_aboutdlg.o \
 	$(OBJS)\advlib_sound.o \
@@ -3377,6 +3399,7 @@ ____ADVANCED_SRC_FILENAMES_3_OBJECTS =  \
 endif
 ifeq ($(WXUNIV),1)
 ____ADVANCED_SRC_FILENAMES_3_OBJECTS =  \
+	$(OBJS)\advlib_animatecmn.o \
 	$(OBJS)\advlib_datavcmn.o \
 	$(OBJS)\advlib_aboutdlgg.o \
 	$(OBJS)\advlib_bmpcboxg.o \
@@ -3395,6 +3418,7 @@ ____ADVANCED_SRC_FILENAMES_3_OBJECTS =  \
 	$(OBJS)\advlib_splash.o \
 	$(OBJS)\advlib_tipdlg.o \
 	$(OBJS)\advlib_wizard.o \
+	$(OBJS)\advlib_animateg.o \
 	$(OBJS)\advlib_taskbarcmn.o \
 	$(OBJS)\advlib_aboutdlg.o \
 	$(OBJS)\advlib_sound.o \
@@ -5852,6 +5876,11 @@ $(OBJS)\monodll_accesscmn.o: ../../src/common/accesscmn.cpp
 	$(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<
 endif
 
+ifeq ($(USE_GUI),1)
+$(OBJS)\monodll_anidecod.o: ../../src/common/anidecod.cpp
+	$(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<
+endif
+
 ifeq ($(USE_GUI),1)
 $(OBJS)\monodll_appcmn.o: ../../src/common/appcmn.cpp
 	$(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<
@@ -6417,6 +6446,11 @@ $(OBJS)\monodll_vscroll.o: ../../src/generic/vscroll.cpp
 	$(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<
 endif
 
+ifeq ($(USE_GUI),1)
+$(OBJS)\monodll_animatecmn.o: ../../src/common/animatecmn.cpp
+	$(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<
+endif
+
 ifeq ($(USE_GUI),1)
 $(OBJS)\monodll_datavcmn.o: ../../src/common/datavcmn.cpp
 	$(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<
@@ -6507,6 +6541,11 @@ $(OBJS)\monodll_wizard.o: ../../src/generic/wizard.cpp
 	$(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<
 endif
 
+ifeq ($(USE_GUI),1)
+$(OBJS)\monodll_animateg.o: ../../src/generic/animateg.cpp
+	$(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<
+endif
+
 ifeq ($(USE_GUI),1)
 $(OBJS)\monodll_taskbarcmn.o: ../../src/common/taskbarcmn.cpp
 	$(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<
@@ -7865,6 +7904,11 @@ $(OBJS)\monolib_accesscmn.o: ../../src/common/accesscmn.cpp
 	$(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<
 endif
 
+ifeq ($(USE_GUI),1)
+$(OBJS)\monolib_anidecod.o: ../../src/common/anidecod.cpp
+	$(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<
+endif
+
 ifeq ($(USE_GUI),1)
 $(OBJS)\monolib_appcmn.o: ../../src/common/appcmn.cpp
 	$(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<
@@ -8430,6 +8474,11 @@ $(OBJS)\monolib_vscroll.o: ../../src/generic/vscroll.cpp
 	$(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<
 endif
 
+ifeq ($(USE_GUI),1)
+$(OBJS)\monolib_animatecmn.o: ../../src/common/animatecmn.cpp
+	$(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<
+endif
+
 ifeq ($(USE_GUI),1)
 $(OBJS)\monolib_datavcmn.o: ../../src/common/datavcmn.cpp
 	$(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<
@@ -8520,6 +8569,11 @@ $(OBJS)\monolib_wizard.o: ../../src/generic/wizard.cpp
 	$(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<
 endif
 
+ifeq ($(USE_GUI),1)
+$(OBJS)\monolib_animateg.o: ../../src/generic/animateg.cpp
+	$(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<
+endif
+
 ifeq ($(USE_GUI),1)
 $(OBJS)\monolib_taskbarcmn.o: ../../src/common/taskbarcmn.cpp
 	$(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<
@@ -9899,6 +9953,11 @@ $(OBJS)\coredll_accesscmn.o: ../../src/common/accesscmn.cpp
 	$(CXX) -c -o $@ $(COREDLL_CXXFLAGS) $(CPPDEPS) $<
 endif
 
+ifeq ($(USE_GUI),1)
+$(OBJS)\coredll_anidecod.o: ../../src/common/anidecod.cpp
+	$(CXX) -c -o $@ $(COREDLL_CXXFLAGS) $(CPPDEPS) $<
+endif
+
 ifeq ($(USE_GUI),1)
 $(OBJS)\coredll_appcmn.o: ../../src/common/appcmn.cpp
 	$(CXX) -c -o $@ $(COREDLL_CXXFLAGS) $(CPPDEPS) $<
@@ -11239,6 +11298,11 @@ $(OBJS)\corelib_accesscmn.o: ../../src/common/accesscmn.cpp
 	$(CXX) -c -o $@ $(CORELIB_CXXFLAGS) $(CPPDEPS) $<
 endif
 
+ifeq ($(USE_GUI),1)
+$(OBJS)\corelib_anidecod.o: ../../src/common/anidecod.cpp
+	$(CXX) -c -o $@ $(CORELIB_CXXFLAGS) $(CPPDEPS) $<
+endif
+
 ifeq ($(USE_GUI),1)
 $(OBJS)\corelib_appcmn.o: ../../src/common/appcmn.cpp
 	$(CXX) -c -o $@ $(CORELIB_CXXFLAGS) $(CPPDEPS) $<
@@ -11813,6 +11877,9 @@ $(OBJS)\advdll_version_rc.o: ../../src/msw/version.rc
 $(OBJS)\advdll_datectrl.o: ../../src/msw/datectrl.cpp
 	$(CXX) -c -o $@ $(ADVDLL_CXXFLAGS) $(CPPDEPS) $<
 
+$(OBJS)\advdll_animatecmn.o: ../../src/common/animatecmn.cpp
+	$(CXX) -c -o $@ $(ADVDLL_CXXFLAGS) $(CPPDEPS) $<
+
 $(OBJS)\advdll_datavcmn.o: ../../src/common/datavcmn.cpp
 	$(CXX) -c -o $@ $(ADVDLL_CXXFLAGS) $(CPPDEPS) $<
 
@@ -11867,6 +11934,9 @@ $(OBJS)\advdll_tipdlg.o: ../../src/generic/tipdlg.cpp
 $(OBJS)\advdll_wizard.o: ../../src/generic/wizard.cpp
 	$(CXX) -c -o $@ $(ADVDLL_CXXFLAGS) $(CPPDEPS) $<
 
+$(OBJS)\advdll_animateg.o: ../../src/generic/animateg.cpp
+	$(CXX) -c -o $@ $(ADVDLL_CXXFLAGS) $(CPPDEPS) $<
+
 $(OBJS)\advdll_taskbarcmn.o: ../../src/common/taskbarcmn.cpp
 	$(CXX) -c -o $@ $(ADVDLL_CXXFLAGS) $(CPPDEPS) $<
 
@@ -11888,6 +11958,9 @@ $(OBJS)\advlib_dummy.o: ../../src/common/dummy.cpp
 $(OBJS)\advlib_datectrl.o: ../../src/msw/datectrl.cpp
 	$(CXX) -c -o $@ $(ADVLIB_CXXFLAGS) $(CPPDEPS) $<
 
+$(OBJS)\advlib_animatecmn.o: ../../src/common/animatecmn.cpp
+	$(CXX) -c -o $@ $(ADVLIB_CXXFLAGS) $(CPPDEPS) $<
+
 $(OBJS)\advlib_datavcmn.o: ../../src/common/datavcmn.cpp
 	$(CXX) -c -o $@ $(ADVLIB_CXXFLAGS) $(CPPDEPS) $<
 
@@ -11942,6 +12015,9 @@ $(OBJS)\advlib_tipdlg.o: ../../src/generic/tipdlg.cpp
 $(OBJS)\advlib_wizard.o: ../../src/generic/wizard.cpp
 	$(CXX) -c -o $@ $(ADVLIB_CXXFLAGS) $(CPPDEPS) $<
 
+$(OBJS)\advlib_animateg.o: ../../src/generic/animateg.cpp
+	$(CXX) -c -o $@ $(ADVLIB_CXXFLAGS) $(CPPDEPS) $<
+
 $(OBJS)\advlib_taskbarcmn.o: ../../src/common/taskbarcmn.cpp
 	$(CXX) -c -o $@ $(ADVLIB_CXXFLAGS) $(CPPDEPS) $<
 
diff --git a/build/msw/makefile.vc b/build/msw/makefile.vc
index a606c68d1f..1acada9fb5 100644
--- a/build/msw/makefile.vc
+++ b/build/msw/makefile.vc
@@ -1536,6 +1536,7 @@ ____CORE_SRC_FILENAMES_OBJECTS =  \
 	$(OBJS)\monodll_fdrepdlg.obj \
 	$(OBJS)\monodll_fontdlg.obj \
 	$(OBJS)\monodll_accesscmn.obj \
+	$(OBJS)\monodll_anidecod.obj \
 	$(OBJS)\monodll_appcmn.obj \
 	$(OBJS)\monodll_artprov.obj \
 	$(OBJS)\monodll_artstd.obj \
@@ -1754,6 +1755,7 @@ ____CORE_SRC_FILENAMES_OBJECTS =  \
 	$(OBJS)\monodll_mono.obj \
 	$(OBJS)\monodll_win32.obj \
 	$(OBJS)\monodll_accesscmn.obj \
+	$(OBJS)\monodll_anidecod.obj \
 	$(OBJS)\monodll_appcmn.obj \
 	$(OBJS)\monodll_artprov.obj \
 	$(OBJS)\monodll_artstd.obj \
@@ -1870,6 +1872,7 @@ ____CORE_SRC_FILENAMES_OBJECTS =  \
 !endif
 !if "$(WXUNIV)" == "0"
 ____ADVANCED_SRC_FILENAMES_OBJECTS =  \
+	$(OBJS)\monodll_animatecmn.obj \
 	$(OBJS)\monodll_datavcmn.obj \
 	$(OBJS)\monodll_aboutdlgg.obj \
 	$(OBJS)\monodll_bmpcboxg.obj \
@@ -1888,6 +1891,7 @@ ____ADVANCED_SRC_FILENAMES_OBJECTS =  \
 	$(OBJS)\monodll_splash.obj \
 	$(OBJS)\monodll_tipdlg.obj \
 	$(OBJS)\monodll_wizard.obj \
+	$(OBJS)\monodll_animateg.obj \
 	$(OBJS)\monodll_taskbarcmn.obj \
 	$(OBJS)\monodll_aboutdlg.obj \
 	$(OBJS)\monodll_sound.obj \
@@ -1897,6 +1901,7 @@ ____ADVANCED_SRC_FILENAMES_OBJECTS =  \
 !endif
 !if "$(WXUNIV)" == "1"
 ____ADVANCED_SRC_FILENAMES_OBJECTS =  \
+	$(OBJS)\monodll_animatecmn.obj \
 	$(OBJS)\monodll_datavcmn.obj \
 	$(OBJS)\monodll_aboutdlgg.obj \
 	$(OBJS)\monodll_bmpcboxg.obj \
@@ -1915,6 +1920,7 @@ ____ADVANCED_SRC_FILENAMES_OBJECTS =  \
 	$(OBJS)\monodll_splash.obj \
 	$(OBJS)\monodll_tipdlg.obj \
 	$(OBJS)\monodll_wizard.obj \
+	$(OBJS)\monodll_animateg.obj \
 	$(OBJS)\monodll_taskbarcmn.obj \
 	$(OBJS)\monodll_aboutdlg.obj \
 	$(OBJS)\monodll_sound.obj \
@@ -2134,6 +2140,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS =  \
 	$(OBJS)\monolib_fdrepdlg.obj \
 	$(OBJS)\monolib_fontdlg.obj \
 	$(OBJS)\monolib_accesscmn.obj \
+	$(OBJS)\monolib_anidecod.obj \
 	$(OBJS)\monolib_appcmn.obj \
 	$(OBJS)\monolib_artprov.obj \
 	$(OBJS)\monolib_artstd.obj \
@@ -2352,6 +2359,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS =  \
 	$(OBJS)\monolib_mono.obj \
 	$(OBJS)\monolib_win32.obj \
 	$(OBJS)\monolib_accesscmn.obj \
+	$(OBJS)\monolib_anidecod.obj \
 	$(OBJS)\monolib_appcmn.obj \
 	$(OBJS)\monolib_artprov.obj \
 	$(OBJS)\monolib_artstd.obj \
@@ -2468,6 +2476,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS =  \
 !endif
 !if "$(WXUNIV)" == "0"
 ____ADVANCED_SRC_FILENAMES_1_OBJECTS =  \
+	$(OBJS)\monolib_animatecmn.obj \
 	$(OBJS)\monolib_datavcmn.obj \
 	$(OBJS)\monolib_aboutdlgg.obj \
 	$(OBJS)\monolib_bmpcboxg.obj \
@@ -2486,6 +2495,7 @@ ____ADVANCED_SRC_FILENAMES_1_OBJECTS =  \
 	$(OBJS)\monolib_splash.obj \
 	$(OBJS)\monolib_tipdlg.obj \
 	$(OBJS)\monolib_wizard.obj \
+	$(OBJS)\monolib_animateg.obj \
 	$(OBJS)\monolib_taskbarcmn.obj \
 	$(OBJS)\monolib_aboutdlg.obj \
 	$(OBJS)\monolib_sound.obj \
@@ -2495,6 +2505,7 @@ ____ADVANCED_SRC_FILENAMES_1_OBJECTS =  \
 !endif
 !if "$(WXUNIV)" == "1"
 ____ADVANCED_SRC_FILENAMES_1_OBJECTS =  \
+	$(OBJS)\monolib_animatecmn.obj \
 	$(OBJS)\monolib_datavcmn.obj \
 	$(OBJS)\monolib_aboutdlgg.obj \
 	$(OBJS)\monolib_bmpcboxg.obj \
@@ -2513,6 +2524,7 @@ ____ADVANCED_SRC_FILENAMES_1_OBJECTS =  \
 	$(OBJS)\monolib_splash.obj \
 	$(OBJS)\monolib_tipdlg.obj \
 	$(OBJS)\monolib_wizard.obj \
+	$(OBJS)\monolib_animateg.obj \
 	$(OBJS)\monolib_taskbarcmn.obj \
 	$(OBJS)\monolib_aboutdlg.obj \
 	$(OBJS)\monolib_sound.obj \
@@ -2670,6 +2682,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS =  \
 	$(OBJS)\coredll_fdrepdlg.obj \
 	$(OBJS)\coredll_fontdlg.obj \
 	$(OBJS)\coredll_accesscmn.obj \
+	$(OBJS)\coredll_anidecod.obj \
 	$(OBJS)\coredll_appcmn.obj \
 	$(OBJS)\coredll_artprov.obj \
 	$(OBJS)\coredll_artstd.obj \
@@ -2888,6 +2901,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS =  \
 	$(OBJS)\coredll_mono.obj \
 	$(OBJS)\coredll_win32.obj \
 	$(OBJS)\coredll_accesscmn.obj \
+	$(OBJS)\coredll_anidecod.obj \
 	$(OBJS)\coredll_appcmn.obj \
 	$(OBJS)\coredll_artprov.obj \
 	$(OBJS)\coredll_artstd.obj \
@@ -3113,6 +3127,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS =  \
 	$(OBJS)\corelib_fdrepdlg.obj \
 	$(OBJS)\corelib_fontdlg.obj \
 	$(OBJS)\corelib_accesscmn.obj \
+	$(OBJS)\corelib_anidecod.obj \
 	$(OBJS)\corelib_appcmn.obj \
 	$(OBJS)\corelib_artprov.obj \
 	$(OBJS)\corelib_artstd.obj \
@@ -3331,6 +3346,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS =  \
 	$(OBJS)\corelib_mono.obj \
 	$(OBJS)\corelib_win32.obj \
 	$(OBJS)\corelib_accesscmn.obj \
+	$(OBJS)\corelib_anidecod.obj \
 	$(OBJS)\corelib_appcmn.obj \
 	$(OBJS)\corelib_artprov.obj \
 	$(OBJS)\corelib_artstd.obj \
@@ -3457,6 +3473,7 @@ __RUNTIME_LIBS_195 = $(__THREADSFLAG)
 !endif
 !if "$(WXUNIV)" == "0"
 ____ADVANCED_SRC_FILENAMES_2_OBJECTS =  \
+	$(OBJS)\advdll_animatecmn.obj \
 	$(OBJS)\advdll_datavcmn.obj \
 	$(OBJS)\advdll_aboutdlgg.obj \
 	$(OBJS)\advdll_bmpcboxg.obj \
@@ -3475,6 +3492,7 @@ ____ADVANCED_SRC_FILENAMES_2_OBJECTS =  \
 	$(OBJS)\advdll_splash.obj \
 	$(OBJS)\advdll_tipdlg.obj \
 	$(OBJS)\advdll_wizard.obj \
+	$(OBJS)\advdll_animateg.obj \
 	$(OBJS)\advdll_taskbarcmn.obj \
 	$(OBJS)\advdll_aboutdlg.obj \
 	$(OBJS)\advdll_sound.obj \
@@ -3484,6 +3502,7 @@ ____ADVANCED_SRC_FILENAMES_2_OBJECTS =  \
 !endif
 !if "$(WXUNIV)" == "1"
 ____ADVANCED_SRC_FILENAMES_2_OBJECTS =  \
+	$(OBJS)\advdll_animatecmn.obj \
 	$(OBJS)\advdll_datavcmn.obj \
 	$(OBJS)\advdll_aboutdlgg.obj \
 	$(OBJS)\advdll_bmpcboxg.obj \
@@ -3502,6 +3521,7 @@ ____ADVANCED_SRC_FILENAMES_2_OBJECTS =  \
 	$(OBJS)\advdll_splash.obj \
 	$(OBJS)\advdll_tipdlg.obj \
 	$(OBJS)\advdll_wizard.obj \
+	$(OBJS)\advdll_animateg.obj \
 	$(OBJS)\advdll_taskbarcmn.obj \
 	$(OBJS)\advdll_aboutdlg.obj \
 	$(OBJS)\advdll_sound.obj \
@@ -3520,6 +3540,7 @@ __RUNTIME_LIBS_208 = $(__THREADSFLAG)
 !endif
 !if "$(WXUNIV)" == "0"
 ____ADVANCED_SRC_FILENAMES_3_OBJECTS =  \
+	$(OBJS)\advlib_animatecmn.obj \
 	$(OBJS)\advlib_datavcmn.obj \
 	$(OBJS)\advlib_aboutdlgg.obj \
 	$(OBJS)\advlib_bmpcboxg.obj \
@@ -3538,6 +3559,7 @@ ____ADVANCED_SRC_FILENAMES_3_OBJECTS =  \
 	$(OBJS)\advlib_splash.obj \
 	$(OBJS)\advlib_tipdlg.obj \
 	$(OBJS)\advlib_wizard.obj \
+	$(OBJS)\advlib_animateg.obj \
 	$(OBJS)\advlib_taskbarcmn.obj \
 	$(OBJS)\advlib_aboutdlg.obj \
 	$(OBJS)\advlib_sound.obj \
@@ -3547,6 +3569,7 @@ ____ADVANCED_SRC_FILENAMES_3_OBJECTS =  \
 !endif
 !if "$(WXUNIV)" == "1"
 ____ADVANCED_SRC_FILENAMES_3_OBJECTS =  \
+	$(OBJS)\advlib_animatecmn.obj \
 	$(OBJS)\advlib_datavcmn.obj \
 	$(OBJS)\advlib_aboutdlgg.obj \
 	$(OBJS)\advlib_bmpcboxg.obj \
@@ -3565,6 +3588,7 @@ ____ADVANCED_SRC_FILENAMES_3_OBJECTS =  \
 	$(OBJS)\advlib_splash.obj \
 	$(OBJS)\advlib_tipdlg.obj \
 	$(OBJS)\advlib_wizard.obj \
+	$(OBJS)\advlib_animateg.obj \
 	$(OBJS)\advlib_taskbarcmn.obj \
 	$(OBJS)\advlib_aboutdlg.obj \
 	$(OBJS)\advlib_sound.obj \
@@ -5968,6 +5992,11 @@ $(OBJS)\monodll_accesscmn.obj: ..\..\src\common\accesscmn.cpp
 	$(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) $**
 !endif
 
+!if "$(USE_GUI)" == "1"
+$(OBJS)\monodll_anidecod.obj: ..\..\src\common\anidecod.cpp
+	$(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) $**
+!endif
+
 !if "$(USE_GUI)" == "1"
 $(OBJS)\monodll_appcmn.obj: ..\..\src\common\appcmn.cpp
 	$(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) $**
@@ -6533,6 +6562,11 @@ $(OBJS)\monodll_vscroll.obj: ..\..\src\generic\vscroll.cpp
 	$(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) $**
 !endif
 
+!if "$(USE_GUI)" == "1"
+$(OBJS)\monodll_animatecmn.obj: ..\..\src\common\animatecmn.cpp
+	$(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) $**
+!endif
+
 !if "$(USE_GUI)" == "1"
 $(OBJS)\monodll_datavcmn.obj: ..\..\src\common\datavcmn.cpp
 	$(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) $**
@@ -6623,6 +6657,11 @@ $(OBJS)\monodll_wizard.obj: ..\..\src\generic\wizard.cpp
 	$(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) $**
 !endif
 
+!if "$(USE_GUI)" == "1"
+$(OBJS)\monodll_animateg.obj: ..\..\src\generic\animateg.cpp
+	$(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) $**
+!endif
+
 !if "$(USE_GUI)" == "1"
 $(OBJS)\monodll_taskbarcmn.obj: ..\..\src\common\taskbarcmn.cpp
 	$(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) $**
@@ -7881,6 +7920,11 @@ $(OBJS)\monolib_accesscmn.obj: ..\..\src\common\accesscmn.cpp
 	$(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) $**
 !endif
 
+!if "$(USE_GUI)" == "1"
+$(OBJS)\monolib_anidecod.obj: ..\..\src\common\anidecod.cpp
+	$(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) $**
+!endif
+
 !if "$(USE_GUI)" == "1"
 $(OBJS)\monolib_appcmn.obj: ..\..\src\common\appcmn.cpp
 	$(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) $**
@@ -8446,6 +8490,11 @@ $(OBJS)\monolib_vscroll.obj: ..\..\src\generic\vscroll.cpp
 	$(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) $**
 !endif
 
+!if "$(USE_GUI)" == "1"
+$(OBJS)\monolib_animatecmn.obj: ..\..\src\common\animatecmn.cpp
+	$(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) $**
+!endif
+
 !if "$(USE_GUI)" == "1"
 $(OBJS)\monolib_datavcmn.obj: ..\..\src\common\datavcmn.cpp
 	$(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) $**
@@ -8536,6 +8585,11 @@ $(OBJS)\monolib_wizard.obj: ..\..\src\generic\wizard.cpp
 	$(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) $**
 !endif
 
+!if "$(USE_GUI)" == "1"
+$(OBJS)\monolib_animateg.obj: ..\..\src\generic\animateg.cpp
+	$(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) $**
+!endif
+
 !if "$(USE_GUI)" == "1"
 $(OBJS)\monolib_taskbarcmn.obj: ..\..\src\common\taskbarcmn.cpp
 	$(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) $**
@@ -9815,6 +9869,11 @@ $(OBJS)\coredll_accesscmn.obj: ..\..\src\common\accesscmn.cpp
 	$(CXX) /c /nologo /TP /Fo$@ $(COREDLL_CXXFLAGS) $**
 !endif
 
+!if "$(USE_GUI)" == "1"
+$(OBJS)\coredll_anidecod.obj: ..\..\src\common\anidecod.cpp
+	$(CXX) /c /nologo /TP /Fo$@ $(COREDLL_CXXFLAGS) $**
+!endif
+
 !if "$(USE_GUI)" == "1"
 $(OBJS)\coredll_appcmn.obj: ..\..\src\common\appcmn.cpp
 	$(CXX) /c /nologo /TP /Fo$@ $(COREDLL_CXXFLAGS) $**
@@ -11055,6 +11114,11 @@ $(OBJS)\corelib_accesscmn.obj: ..\..\src\common\accesscmn.cpp
 	$(CXX) /c /nologo /TP /Fo$@ $(CORELIB_CXXFLAGS) $**
 !endif
 
+!if "$(USE_GUI)" == "1"
+$(OBJS)\corelib_anidecod.obj: ..\..\src\common\anidecod.cpp
+	$(CXX) /c /nologo /TP /Fo$@ $(CORELIB_CXXFLAGS) $**
+!endif
+
 !if "$(USE_GUI)" == "1"
 $(OBJS)\corelib_appcmn.obj: ..\..\src\common\appcmn.cpp
 	$(CXX) /c /nologo /TP /Fo$@ $(CORELIB_CXXFLAGS) $**
@@ -11629,6 +11693,9 @@ $(OBJS)\advdll_version.res: ..\..\src\msw\version.rc
 $(OBJS)\advdll_datectrl.obj: ..\..\src\msw\datectrl.cpp
 	$(CXX) /c /nologo /TP /Fo$@ $(ADVDLL_CXXFLAGS) $**
 
+$(OBJS)\advdll_animatecmn.obj: ..\..\src\common\animatecmn.cpp
+	$(CXX) /c /nologo /TP /Fo$@ $(ADVDLL_CXXFLAGS) $**
+
 $(OBJS)\advdll_datavcmn.obj: ..\..\src\common\datavcmn.cpp
 	$(CXX) /c /nologo /TP /Fo$@ $(ADVDLL_CXXFLAGS) $**
 
@@ -11683,6 +11750,9 @@ $(OBJS)\advdll_tipdlg.obj: ..\..\src\generic\tipdlg.cpp
 $(OBJS)\advdll_wizard.obj: ..\..\src\generic\wizard.cpp
 	$(CXX) /c /nologo /TP /Fo$@ $(ADVDLL_CXXFLAGS) $**
 
+$(OBJS)\advdll_animateg.obj: ..\..\src\generic\animateg.cpp
+	$(CXX) /c /nologo /TP /Fo$@ $(ADVDLL_CXXFLAGS) $**
+
 $(OBJS)\advdll_taskbarcmn.obj: ..\..\src\common\taskbarcmn.cpp
 	$(CXX) /c /nologo /TP /Fo$@ $(ADVDLL_CXXFLAGS) $**
 
@@ -11704,6 +11774,9 @@ $(OBJS)\advlib_dummy.obj: ..\..\src\common\dummy.cpp
 $(OBJS)\advlib_datectrl.obj: ..\..\src\msw\datectrl.cpp
 	$(CXX) /c /nologo /TP /Fo$@ $(ADVLIB_CXXFLAGS) $**
 
+$(OBJS)\advlib_animatecmn.obj: ..\..\src\common\animatecmn.cpp
+	$(CXX) /c /nologo /TP /Fo$@ $(ADVLIB_CXXFLAGS) $**
+
 $(OBJS)\advlib_datavcmn.obj: ..\..\src\common\datavcmn.cpp
 	$(CXX) /c /nologo /TP /Fo$@ $(ADVLIB_CXXFLAGS) $**
 
@@ -11758,6 +11831,9 @@ $(OBJS)\advlib_tipdlg.obj: ..\..\src\generic\tipdlg.cpp
 $(OBJS)\advlib_wizard.obj: ..\..\src\generic\wizard.cpp
 	$(CXX) /c /nologo /TP /Fo$@ $(ADVLIB_CXXFLAGS) $**
 
+$(OBJS)\advlib_animateg.obj: ..\..\src\generic\animateg.cpp
+	$(CXX) /c /nologo /TP /Fo$@ $(ADVLIB_CXXFLAGS) $**
+
 $(OBJS)\advlib_taskbarcmn.obj: ..\..\src\common\taskbarcmn.cpp
 	$(CXX) /c /nologo /TP /Fo$@ $(ADVLIB_CXXFLAGS) $**
 
diff --git a/build/msw/makefile.wat b/build/msw/makefile.wat
index ae2182a250..b367c426a2 100644
--- a/build/msw/makefile.wat
+++ b/build/msw/makefile.wat
@@ -301,6 +301,7 @@ ____CORE_SRC_FILENAMES_OBJECTS =  &
 	$(OBJS)\monodll_fdrepdlg.obj &
 	$(OBJS)\monodll_fontdlg.obj &
 	$(OBJS)\monodll_accesscmn.obj &
+	$(OBJS)\monodll_anidecod.obj &
 	$(OBJS)\monodll_appcmn.obj &
 	$(OBJS)\monodll_artprov.obj &
 	$(OBJS)\monodll_artstd.obj &
@@ -521,6 +522,7 @@ ____CORE_SRC_FILENAMES_OBJECTS =  &
 	$(OBJS)\monodll_mono.obj &
 	$(OBJS)\monodll_win32.obj &
 	$(OBJS)\monodll_accesscmn.obj &
+	$(OBJS)\monodll_anidecod.obj &
 	$(OBJS)\monodll_appcmn.obj &
 	$(OBJS)\monodll_artprov.obj &
 	$(OBJS)\monodll_artstd.obj &
@@ -639,6 +641,7 @@ ____CORE_SRC_FILENAMES_OBJECTS =  &
 ____ADVANCED_SRC_FILENAMES_OBJECTS =
 !ifeq WXUNIV 0
 ____ADVANCED_SRC_FILENAMES_OBJECTS =  &
+	$(OBJS)\monodll_animatecmn.obj &
 	$(OBJS)\monodll_datavcmn.obj &
 	$(OBJS)\monodll_aboutdlgg.obj &
 	$(OBJS)\monodll_bmpcboxg.obj &
@@ -657,6 +660,7 @@ ____ADVANCED_SRC_FILENAMES_OBJECTS =  &
 	$(OBJS)\monodll_splash.obj &
 	$(OBJS)\monodll_tipdlg.obj &
 	$(OBJS)\monodll_wizard.obj &
+	$(OBJS)\monodll_animateg.obj &
 	$(OBJS)\monodll_taskbarcmn.obj &
 	$(OBJS)\monodll_aboutdlg.obj &
 	$(OBJS)\monodll_sound.obj &
@@ -666,6 +670,7 @@ ____ADVANCED_SRC_FILENAMES_OBJECTS =  &
 !endif
 !ifeq WXUNIV 1
 ____ADVANCED_SRC_FILENAMES_OBJECTS =  &
+	$(OBJS)\monodll_animatecmn.obj &
 	$(OBJS)\monodll_datavcmn.obj &
 	$(OBJS)\monodll_aboutdlgg.obj &
 	$(OBJS)\monodll_bmpcboxg.obj &
@@ -684,6 +689,7 @@ ____ADVANCED_SRC_FILENAMES_OBJECTS =  &
 	$(OBJS)\monodll_splash.obj &
 	$(OBJS)\monodll_tipdlg.obj &
 	$(OBJS)\monodll_wizard.obj &
+	$(OBJS)\monodll_animateg.obj &
 	$(OBJS)\monodll_taskbarcmn.obj &
 	$(OBJS)\monodll_aboutdlg.obj &
 	$(OBJS)\monodll_sound.obj &
@@ -903,6 +909,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS =  &
 	$(OBJS)\monolib_fdrepdlg.obj &
 	$(OBJS)\monolib_fontdlg.obj &
 	$(OBJS)\monolib_accesscmn.obj &
+	$(OBJS)\monolib_anidecod.obj &
 	$(OBJS)\monolib_appcmn.obj &
 	$(OBJS)\monolib_artprov.obj &
 	$(OBJS)\monolib_artstd.obj &
@@ -1123,6 +1130,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS =  &
 	$(OBJS)\monolib_mono.obj &
 	$(OBJS)\monolib_win32.obj &
 	$(OBJS)\monolib_accesscmn.obj &
+	$(OBJS)\monolib_anidecod.obj &
 	$(OBJS)\monolib_appcmn.obj &
 	$(OBJS)\monolib_artprov.obj &
 	$(OBJS)\monolib_artstd.obj &
@@ -1241,6 +1249,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS =  &
 ____ADVANCED_SRC_FILENAMES_1_OBJECTS =
 !ifeq WXUNIV 0
 ____ADVANCED_SRC_FILENAMES_1_OBJECTS =  &
+	$(OBJS)\monolib_animatecmn.obj &
 	$(OBJS)\monolib_datavcmn.obj &
 	$(OBJS)\monolib_aboutdlgg.obj &
 	$(OBJS)\monolib_bmpcboxg.obj &
@@ -1259,6 +1268,7 @@ ____ADVANCED_SRC_FILENAMES_1_OBJECTS =  &
 	$(OBJS)\monolib_splash.obj &
 	$(OBJS)\monolib_tipdlg.obj &
 	$(OBJS)\monolib_wizard.obj &
+	$(OBJS)\monolib_animateg.obj &
 	$(OBJS)\monolib_taskbarcmn.obj &
 	$(OBJS)\monolib_aboutdlg.obj &
 	$(OBJS)\monolib_sound.obj &
@@ -1268,6 +1278,7 @@ ____ADVANCED_SRC_FILENAMES_1_OBJECTS =  &
 !endif
 !ifeq WXUNIV 1
 ____ADVANCED_SRC_FILENAMES_1_OBJECTS =  &
+	$(OBJS)\monolib_animatecmn.obj &
 	$(OBJS)\monolib_datavcmn.obj &
 	$(OBJS)\monolib_aboutdlgg.obj &
 	$(OBJS)\monolib_bmpcboxg.obj &
@@ -1286,6 +1297,7 @@ ____ADVANCED_SRC_FILENAMES_1_OBJECTS =  &
 	$(OBJS)\monolib_splash.obj &
 	$(OBJS)\monolib_tipdlg.obj &
 	$(OBJS)\monolib_wizard.obj &
+	$(OBJS)\monolib_animateg.obj &
 	$(OBJS)\monolib_taskbarcmn.obj &
 	$(OBJS)\monolib_aboutdlg.obj &
 	$(OBJS)\monolib_sound.obj &
@@ -1432,6 +1444,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS =  &
 	$(OBJS)\coredll_fdrepdlg.obj &
 	$(OBJS)\coredll_fontdlg.obj &
 	$(OBJS)\coredll_accesscmn.obj &
+	$(OBJS)\coredll_anidecod.obj &
 	$(OBJS)\coredll_appcmn.obj &
 	$(OBJS)\coredll_artprov.obj &
 	$(OBJS)\coredll_artstd.obj &
@@ -1652,6 +1665,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS =  &
 	$(OBJS)\coredll_mono.obj &
 	$(OBJS)\coredll_win32.obj &
 	$(OBJS)\coredll_accesscmn.obj &
+	$(OBJS)\coredll_anidecod.obj &
 	$(OBJS)\coredll_appcmn.obj &
 	$(OBJS)\coredll_artprov.obj &
 	$(OBJS)\coredll_artstd.obj &
@@ -1879,6 +1893,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS =  &
 	$(OBJS)\corelib_fdrepdlg.obj &
 	$(OBJS)\corelib_fontdlg.obj &
 	$(OBJS)\corelib_accesscmn.obj &
+	$(OBJS)\corelib_anidecod.obj &
 	$(OBJS)\corelib_appcmn.obj &
 	$(OBJS)\corelib_artprov.obj &
 	$(OBJS)\corelib_artstd.obj &
@@ -2099,6 +2114,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS =  &
 	$(OBJS)\corelib_mono.obj &
 	$(OBJS)\corelib_win32.obj &
 	$(OBJS)\corelib_accesscmn.obj &
+	$(OBJS)\corelib_anidecod.obj &
 	$(OBJS)\corelib_appcmn.obj &
 	$(OBJS)\corelib_artprov.obj &
 	$(OBJS)\corelib_artstd.obj &
@@ -2226,6 +2242,7 @@ __advdll___depname = &
 ____ADVANCED_SRC_FILENAMES_2_OBJECTS =
 !ifeq WXUNIV 0
 ____ADVANCED_SRC_FILENAMES_2_OBJECTS =  &
+	$(OBJS)\advdll_animatecmn.obj &
 	$(OBJS)\advdll_datavcmn.obj &
 	$(OBJS)\advdll_aboutdlgg.obj &
 	$(OBJS)\advdll_bmpcboxg.obj &
@@ -2244,6 +2261,7 @@ ____ADVANCED_SRC_FILENAMES_2_OBJECTS =  &
 	$(OBJS)\advdll_splash.obj &
 	$(OBJS)\advdll_tipdlg.obj &
 	$(OBJS)\advdll_wizard.obj &
+	$(OBJS)\advdll_animateg.obj &
 	$(OBJS)\advdll_taskbarcmn.obj &
 	$(OBJS)\advdll_aboutdlg.obj &
 	$(OBJS)\advdll_sound.obj &
@@ -2253,6 +2271,7 @@ ____ADVANCED_SRC_FILENAMES_2_OBJECTS =  &
 !endif
 !ifeq WXUNIV 1
 ____ADVANCED_SRC_FILENAMES_2_OBJECTS =  &
+	$(OBJS)\advdll_animatecmn.obj &
 	$(OBJS)\advdll_datavcmn.obj &
 	$(OBJS)\advdll_aboutdlgg.obj &
 	$(OBJS)\advdll_bmpcboxg.obj &
@@ -2271,6 +2290,7 @@ ____ADVANCED_SRC_FILENAMES_2_OBJECTS =  &
 	$(OBJS)\advdll_splash.obj &
 	$(OBJS)\advdll_tipdlg.obj &
 	$(OBJS)\advdll_wizard.obj &
+	$(OBJS)\advdll_animateg.obj &
 	$(OBJS)\advdll_taskbarcmn.obj &
 	$(OBJS)\advdll_aboutdlg.obj &
 	$(OBJS)\advdll_sound.obj &
@@ -2289,6 +2309,7 @@ __advlib___depname = &
 ____ADVANCED_SRC_FILENAMES_3_OBJECTS =
 !ifeq WXUNIV 0
 ____ADVANCED_SRC_FILENAMES_3_OBJECTS =  &
+	$(OBJS)\advlib_animatecmn.obj &
 	$(OBJS)\advlib_datavcmn.obj &
 	$(OBJS)\advlib_aboutdlgg.obj &
 	$(OBJS)\advlib_bmpcboxg.obj &
@@ -2307,6 +2328,7 @@ ____ADVANCED_SRC_FILENAMES_3_OBJECTS =  &
 	$(OBJS)\advlib_splash.obj &
 	$(OBJS)\advlib_tipdlg.obj &
 	$(OBJS)\advlib_wizard.obj &
+	$(OBJS)\advlib_animateg.obj &
 	$(OBJS)\advlib_taskbarcmn.obj &
 	$(OBJS)\advlib_aboutdlg.obj &
 	$(OBJS)\advlib_sound.obj &
@@ -2316,6 +2338,7 @@ ____ADVANCED_SRC_FILENAMES_3_OBJECTS =  &
 !endif
 !ifeq WXUNIV 1
 ____ADVANCED_SRC_FILENAMES_3_OBJECTS =  &
+	$(OBJS)\advlib_animatecmn.obj &
 	$(OBJS)\advlib_datavcmn.obj &
 	$(OBJS)\advlib_aboutdlgg.obj &
 	$(OBJS)\advlib_bmpcboxg.obj &
@@ -2334,6 +2357,7 @@ ____ADVANCED_SRC_FILENAMES_3_OBJECTS =  &
 	$(OBJS)\advlib_splash.obj &
 	$(OBJS)\advlib_tipdlg.obj &
 	$(OBJS)\advlib_wizard.obj &
+	$(OBJS)\advlib_animateg.obj &
 	$(OBJS)\advlib_taskbarcmn.obj &
 	$(OBJS)\advlib_aboutdlg.obj &
 	$(OBJS)\advlib_sound.obj &
@@ -6080,6 +6104,11 @@ $(OBJS)\monodll_accesscmn.obj :  .AUTODEPEND ..\..\src\common\accesscmn.cpp
 	$(CXX) -bt=nt -zq -fo=$^@ $(MONODLL_CXXFLAGS) $<
 !endif
 
+!ifeq USE_GUI 1
+$(OBJS)\monodll_anidecod.obj :  .AUTODEPEND ..\..\src\common\anidecod.cpp
+	$(CXX) -bt=nt -zq -fo=$^@ $(MONODLL_CXXFLAGS) $<
+!endif
+
 !ifeq USE_GUI 1
 $(OBJS)\monodll_appcmn.obj :  .AUTODEPEND ..\..\src\common\appcmn.cpp
 	$(CXX) -bt=nt -zq -fo=$^@ $(MONODLL_CXXFLAGS) $<
@@ -6645,6 +6674,11 @@ $(OBJS)\monodll_vscroll.obj :  .AUTODEPEND ..\..\src\generic\vscroll.cpp
 	$(CXX) -bt=nt -zq -fo=$^@ $(MONODLL_CXXFLAGS) $<
 !endif
 
+!ifeq USE_GUI 1
+$(OBJS)\monodll_animatecmn.obj :  .AUTODEPEND ..\..\src\common\animatecmn.cpp
+	$(CXX) -bt=nt -zq -fo=$^@ $(MONODLL_CXXFLAGS) $<
+!endif
+
 !ifeq USE_GUI 1
 $(OBJS)\monodll_datavcmn.obj :  .AUTODEPEND ..\..\src\common\datavcmn.cpp
 	$(CXX) -bt=nt -zq -fo=$^@ $(MONODLL_CXXFLAGS) $<
@@ -6735,6 +6769,11 @@ $(OBJS)\monodll_wizard.obj :  .AUTODEPEND ..\..\src\generic\wizard.cpp
 	$(CXX) -bt=nt -zq -fo=$^@ $(MONODLL_CXXFLAGS) $<
 !endif
 
+!ifeq USE_GUI 1
+$(OBJS)\monodll_animateg.obj :  .AUTODEPEND ..\..\src\generic\animateg.cpp
+	$(CXX) -bt=nt -zq -fo=$^@ $(MONODLL_CXXFLAGS) $<
+!endif
+
 !ifeq USE_GUI 1
 $(OBJS)\monodll_taskbarcmn.obj :  .AUTODEPEND ..\..\src\common\taskbarcmn.cpp
 	$(CXX) -bt=nt -zq -fo=$^@ $(MONODLL_CXXFLAGS) $<
@@ -8093,6 +8132,11 @@ $(OBJS)\monolib_accesscmn.obj :  .AUTODEPEND ..\..\src\common\accesscmn.cpp
 	$(CXX) -bt=nt -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $<
 !endif
 
+!ifeq USE_GUI 1
+$(OBJS)\monolib_anidecod.obj :  .AUTODEPEND ..\..\src\common\anidecod.cpp
+	$(CXX) -bt=nt -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $<
+!endif
+
 !ifeq USE_GUI 1
 $(OBJS)\monolib_appcmn.obj :  .AUTODEPEND ..\..\src\common\appcmn.cpp
 	$(CXX) -bt=nt -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $<
@@ -8658,6 +8702,11 @@ $(OBJS)\monolib_vscroll.obj :  .AUTODEPEND ..\..\src\generic\vscroll.cpp
 	$(CXX) -bt=nt -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $<
 !endif
 
+!ifeq USE_GUI 1
+$(OBJS)\monolib_animatecmn.obj :  .AUTODEPEND ..\..\src\common\animatecmn.cpp
+	$(CXX) -bt=nt -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $<
+!endif
+
 !ifeq USE_GUI 1
 $(OBJS)\monolib_datavcmn.obj :  .AUTODEPEND ..\..\src\common\datavcmn.cpp
 	$(CXX) -bt=nt -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $<
@@ -8748,6 +8797,11 @@ $(OBJS)\monolib_wizard.obj :  .AUTODEPEND ..\..\src\generic\wizard.cpp
 	$(CXX) -bt=nt -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $<
 !endif
 
+!ifeq USE_GUI 1
+$(OBJS)\monolib_animateg.obj :  .AUTODEPEND ..\..\src\generic\animateg.cpp
+	$(CXX) -bt=nt -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $<
+!endif
+
 !ifeq USE_GUI 1
 $(OBJS)\monolib_taskbarcmn.obj :  .AUTODEPEND ..\..\src\common\taskbarcmn.cpp
 	$(CXX) -bt=nt -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $<
@@ -10127,6 +10181,11 @@ $(OBJS)\coredll_accesscmn.obj :  .AUTODEPEND ..\..\src\common\accesscmn.cpp
 	$(CXX) -bt=nt -zq -fo=$^@ $(COREDLL_CXXFLAGS) $<
 !endif
 
+!ifeq USE_GUI 1
+$(OBJS)\coredll_anidecod.obj :  .AUTODEPEND ..\..\src\common\anidecod.cpp
+	$(CXX) -bt=nt -zq -fo=$^@ $(COREDLL_CXXFLAGS) $<
+!endif
+
 !ifeq USE_GUI 1
 $(OBJS)\coredll_appcmn.obj :  .AUTODEPEND ..\..\src\common\appcmn.cpp
 	$(CXX) -bt=nt -zq -fo=$^@ $(COREDLL_CXXFLAGS) $<
@@ -11467,6 +11526,11 @@ $(OBJS)\corelib_accesscmn.obj :  .AUTODEPEND ..\..\src\common\accesscmn.cpp
 	$(CXX) -bt=nt -zq -fo=$^@ $(CORELIB_CXXFLAGS) $<
 !endif
 
+!ifeq USE_GUI 1
+$(OBJS)\corelib_anidecod.obj :  .AUTODEPEND ..\..\src\common\anidecod.cpp
+	$(CXX) -bt=nt -zq -fo=$^@ $(CORELIB_CXXFLAGS) $<
+!endif
+
 !ifeq USE_GUI 1
 $(OBJS)\corelib_appcmn.obj :  .AUTODEPEND ..\..\src\common\appcmn.cpp
 	$(CXX) -bt=nt -zq -fo=$^@ $(CORELIB_CXXFLAGS) $<
@@ -12041,6 +12105,9 @@ $(OBJS)\advdll_version.res :  .AUTODEPEND ..\..\src\msw\version.rc
 $(OBJS)\advdll_datectrl.obj :  .AUTODEPEND ..\..\src\msw\datectrl.cpp
 	$(CXX) -bt=nt -zq -fo=$^@ $(ADVDLL_CXXFLAGS) $<
 
+$(OBJS)\advdll_animatecmn.obj :  .AUTODEPEND ..\..\src\common\animatecmn.cpp
+	$(CXX) -bt=nt -zq -fo=$^@ $(ADVDLL_CXXFLAGS) $<
+
 $(OBJS)\advdll_datavcmn.obj :  .AUTODEPEND ..\..\src\common\datavcmn.cpp
 	$(CXX) -bt=nt -zq -fo=$^@ $(ADVDLL_CXXFLAGS) $<
 
@@ -12095,6 +12162,9 @@ $(OBJS)\advdll_tipdlg.obj :  .AUTODEPEND ..\..\src\generic\tipdlg.cpp
 $(OBJS)\advdll_wizard.obj :  .AUTODEPEND ..\..\src\generic\wizard.cpp
 	$(CXX) -bt=nt -zq -fo=$^@ $(ADVDLL_CXXFLAGS) $<
 
+$(OBJS)\advdll_animateg.obj :  .AUTODEPEND ..\..\src\generic\animateg.cpp
+	$(CXX) -bt=nt -zq -fo=$^@ $(ADVDLL_CXXFLAGS) $<
+
 $(OBJS)\advdll_taskbarcmn.obj :  .AUTODEPEND ..\..\src\common\taskbarcmn.cpp
 	$(CXX) -bt=nt -zq -fo=$^@ $(ADVDLL_CXXFLAGS) $<
 
@@ -12116,6 +12186,9 @@ $(OBJS)\advlib_dummy.obj :  .AUTODEPEND ..\..\src\common\dummy.cpp
 $(OBJS)\advlib_datectrl.obj :  .AUTODEPEND ..\..\src\msw\datectrl.cpp
 	$(CXX) -bt=nt -zq -fo=$^@ $(ADVLIB_CXXFLAGS) $<
 
+$(OBJS)\advlib_animatecmn.obj :  .AUTODEPEND ..\..\src\common\animatecmn.cpp
+	$(CXX) -bt=nt -zq -fo=$^@ $(ADVLIB_CXXFLAGS) $<
+
 $(OBJS)\advlib_datavcmn.obj :  .AUTODEPEND ..\..\src\common\datavcmn.cpp
 	$(CXX) -bt=nt -zq -fo=$^@ $(ADVLIB_CXXFLAGS) $<
 
@@ -12170,6 +12243,9 @@ $(OBJS)\advlib_tipdlg.obj :  .AUTODEPEND ..\..\src\generic\tipdlg.cpp
 $(OBJS)\advlib_wizard.obj :  .AUTODEPEND ..\..\src\generic\wizard.cpp
 	$(CXX) -bt=nt -zq -fo=$^@ $(ADVLIB_CXXFLAGS) $<
 
+$(OBJS)\advlib_animateg.obj :  .AUTODEPEND ..\..\src\generic\animateg.cpp
+	$(CXX) -bt=nt -zq -fo=$^@ $(ADVLIB_CXXFLAGS) $<
+
 $(OBJS)\advlib_taskbarcmn.obj :  .AUTODEPEND ..\..\src\common\taskbarcmn.cpp
 	$(CXX) -bt=nt -zq -fo=$^@ $(ADVLIB_CXXFLAGS) $<
 
diff --git a/build/msw/wx_adv.dsp b/build/msw/wx_adv.dsp
index e6de6d2529..44064f85c7 100644
--- a/build/msw/wx_adv.dsp
+++ b/build/msw/wx_adv.dsp
@@ -452,6 +452,10 @@ LIB32=link.exe -lib
 # PROP Default_Filter ""
 # Begin Source File
 
+SOURCE=..\..\src\common\animatecmn.cpp
+# End Source File
+# Begin Source File
+
 SOURCE=..\..\src\common\datavcmn.cpp
 # End Source File
 # Begin Source File
@@ -620,6 +624,10 @@ SOURCE=..\..\src\generic\aboutdlgg.cpp
 # End Source File
 # Begin Source File
 
+SOURCE=..\..\src\generic\animateg.cpp
+# End Source File
+# Begin Source File
+
 SOURCE=..\..\src\generic\bmpcboxg.cpp
 # End Source File
 # Begin Source File
@@ -1137,6 +1145,10 @@ SOURCE=..\..\include\wx\generic\aboutdlgg.h
 # End Source File
 # Begin Source File
 
+SOURCE=..\..\include\wx\generic\animate.h
+# End Source File
+# Begin Source File
+
 SOURCE=..\..\include\wx\generic\bmpcbox.h
 # End Source File
 # Begin Source File
@@ -1197,6 +1209,10 @@ SOURCE=..\..\include\wx\aboutdlg.h
 # End Source File
 # Begin Source File
 
+SOURCE=..\..\include\wx\animate.h
+# End Source File
+# Begin Source File
+
 SOURCE=..\..\include\wx\bmpcbox.h
 # End Source File
 # Begin Source File
diff --git a/build/msw/wx_core.dsp b/build/msw/wx_core.dsp
index 17b8d2c14f..b7ea3d8e6f 100644
--- a/build/msw/wx_core.dsp
+++ b/build/msw/wx_core.dsp
@@ -456,6 +456,10 @@ SOURCE=..\..\src\common\accesscmn.cpp
 # End Source File
 # Begin Source File
 
+SOURCE=..\..\src\common\anidecod.cpp
+# End Source File
+# Begin Source File
+
 SOURCE=..\..\src\common\appcmn.cpp
 # End Source File
 # Begin Source File
@@ -8165,6 +8169,10 @@ SOURCE=..\..\include\wx\generic\accel.h
 # End Source File
 # Begin Source File
 
+SOURCE=..\..\include\wx\generic\animate.h
+# End Source File
+# Begin Source File
+
 SOURCE=..\..\include\wx\generic\bmpcbox.h
 # End Source File
 # Begin Source File
@@ -8589,6 +8597,14 @@ SOURCE=..\..\include\wx\access.h
 # End Source File
 # Begin Source File
 
+SOURCE=..\..\include\wx\anidecod.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\include\wx\animate.h
+# End Source File
+# Begin Source File
+
 SOURCE=..\..\include\wx\artprov.h
 # End Source File
 # Begin Source File
diff --git a/configure.in b/configure.in
index 5179c97467..ecb36ecaa6 100644
--- a/configure.in
+++ b/configure.in
@@ -510,6 +510,7 @@ if test $DEBUG_CONFIGURE = 1; then
   DEFAULT_wxUSE_VALIDATORS=no
 
   DEFAULT_wxUSE_ACCEL=no
+  DEFAULT_wxUSE_ANIMATIONCTRL=no
   DEFAULT_wxUSE_BUTTON=no
   DEFAULT_wxUSE_BMPBUTTON=no
   DEFAULT_wxUSE_BITMAPCOMBOBOX=no
@@ -726,6 +727,7 @@ else
   DEFAULT_wxUSE_VALIDATORS=yes
 
   DEFAULT_wxUSE_ACCEL=yes
+  DEFAULT_wxUSE_ANIMATIONCTRL=yes
   DEFAULT_wxUSE_BUTTON=yes
   DEFAULT_wxUSE_BMPBUTTON=yes
   DEFAULT_wxUSE_BITMAPCOMBOBOX=yes
@@ -1054,6 +1056,7 @@ dnl --disable-<control> later on the command line - but by default all will be
 dnl used (and vice versa)
 if test "$wxUSE_CONTROLS" = "yes"; then
   DEFAULT_wxUSE_ACCEL=yes
+  DEFAULT_wxUSE_ANIMATIONCTRL=yes
   DEFAULT_wxUSE_BMPBUTTON=yes
   DEFAULT_wxUSE_BUTTON=yes
   DEFAULT_wxUSE_CALCTRL=yes
@@ -1103,6 +1106,7 @@ if test "$wxUSE_CONTROLS" = "yes"; then
   DEFAULT_wxUSE_TIPWINDOW=yes
 elif test "$wxUSE_CONTROLS" = "no"; then
   DEFAULT_wxUSE_ACCEL=no
+  DEFAULT_wxUSE_ANIMATIONCTRL=no
   DEFAULT_wxUSE_BMPBUTTON=no
   DEFAULT_wxUSE_BUTTON=no
   DEFAULT_wxUSE_CALCTRL=no
@@ -1153,6 +1157,7 @@ elif test "$wxUSE_CONTROLS" = "no"; then
 fi
 
 WX_ARG_ENABLE(accel,       [  --enable-accel          use accelerators], wxUSE_ACCEL)
+WX_ARG_ENABLE(animatectrl, [  --enable-animatectrl    use wxAnimationCtrl class], wxUSE_ANIMATIONCTRL)
 WX_ARG_ENABLE(button,      [  --enable-button         use wxButton class], wxUSE_BUTTON)
 WX_ARG_ENABLE(bmpbutton,   [  --enable-bmpbutton      use wxBitmapButton class], wxUSE_BMPBUTTON)
 WX_ARG_ENABLE(bmpcombobox, [  --enable-bmpcombobox    use wxBitmapComboBox class], wxUSE_BITMAPCOMBOBOX)
@@ -6462,6 +6467,12 @@ if test "$wxUSE_ACCEL" = "yes"; then
   USES_CONTROLS=1
 fi
 
+if test "$wxUSE_ACCEL" = "yes"; then
+  AC_DEFINE(wxUSE_ANIMATIONCTRL)
+  USES_CONTROLS=1
+  SAMPLES_SUBDIRS="$SAMPLES_SUBDIRS animate"
+fi
+
 if test "$wxUSE_BUTTON" = "yes"; then
   AC_DEFINE(wxUSE_BUTTON)
   USES_CONTROLS=1
diff --git a/docs/changes.txt b/docs/changes.txt
index cceaf5143d..4c145eeb69 100644
--- a/docs/changes.txt
+++ b/docs/changes.txt
@@ -68,6 +68,7 @@ All (GUI):
 
 - Support for right-to-left text layout (started by Diaa Sami during Google Summer of
   Code, with a lot of help from Tim Kosse and others).
+- wxAnimationCtrl added (Francesco Montorsi)
 - Added wxAboutBox() function for displaying the standard about dialog
 - Added wxID_PAGE_SETUP standard id.
 - Added wxSize::IncBy() and DecBy() methods.
diff --git a/docs/latex/wx/animatctrl.tex b/docs/latex/wx/animatctrl.tex
new file mode 100644
index 0000000000..d66bac7f0c
--- /dev/null
+++ b/docs/latex/wx/animatctrl.tex
@@ -0,0 +1,159 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Name:        animatctrl.tex
+%% Purpose:     wxAnimationCtrl documentation
+%% Author:      Francesco Montorsi
+%% Created:     24-9-2006
+%% RCS-ID:      $Id$
+%% Copyright:   (c) 2006 Francesco Montorsi
+%% License:     wxWindows license
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\section{\class{wxAnimationCtrl}}\label{wxanimationctrl}
+
+This is a static control which displays an animation.
+wxAnimationCtrl API is simple as possible and won't give you full control on the
+animation; if you need it then use \helpref{wxMediaCtrl}{wxmediactrl}.
+
+This control is useful to display a (small) animation while doing a long task
+(e.g. a "throbber").
+
+It is only available if \texttt{wxUSE\_ANIMATIONCTRL} is set to $1$ (the default).
+
+\wxheading{Derived from}
+
+\helpref{wxControl}{wxcontrol}\\
+\helpref{wxWindow}{wxwindow}\\
+\helpref{wxEvtHandler}{wxevthandler}\\
+\helpref{wxObject}{wxobject}
+
+\wxheading{Include files}
+
+<wx/animate.h>
+
+\wxheading{Window styles}
+
+\twocolwidtha{5cm}%
+\begin{twocollist}\itemsep=0pt
+\twocolitem{\windowstyle{wxAC\_DEFAULT\_STYLE}}{The default style: wxNO_BORDER.}
+\twocolitem{\windowstyle{wxAC\_NO_AUTORESIZE}}{By default, the control will adjust
+its size to exactly fit to the size of the animation when \helpref{SetAnimation}{wxanimationctrlsetanimation}
+is called. If this style flag is given, the control will not change its size}
+\end{twocollist}
+
+%\wxheading{Event handling}
+%
+%\twocolwidtha{7cm}%
+%\begin{twocollist}\itemsep=0pt
+%\twocolitem{{\bf EVT\_ANIMATION\_END(id, func)}}{}
+%\end{twocollist}
+
+\wxheading{See also}
+
+\helpref{wxAnimation}{wxanimation}
+
+
+\latexignore{\rtfignore{\wxheading{Members}}}
+
+\membersection{wxAnimationCtrl::wxAnimationCtrl}\label{wxanimationctrl}
+
+\func{}{wxAnimationCtrl}{\param{wxWindow *}{parent},\rtfsp
+\param{wxWindowID}{ id},\rtfsp
+\param{const wxAnimation\& }{anim},\rtfsp
+\param{const wxPoint\& }{pos = wxDefaultPosition},\rtfsp
+\param{const wxSize\& }{size = wxDefaultSize},\rtfsp
+\param{long}{ style = wxAC\_DEFAULT\_STYLE},\rtfsp
+\param{const wxString\& }{name = ``animationctrl"}}
+
+Initializes the object and calls \helpref{Create}{wxanimationctrlcreate} with
+all the parameters.
+
+
+\membersection{wxAnimationCtrl::Create}\label{wxanimationctrlcreate}
+
+\func{bool}{Create}{\param{wxWindow *}{parent},\rtfsp
+\param{wxWindowID}{ id},\rtfsp
+\param{const wxAnimation\& }{anim},\rtfsp
+\param{const wxPoint\& }{pos = wxDefaultPosition},\rtfsp
+\param{const wxSize\& }{size = wxDefaultSize},\rtfsp
+\param{long}{ style = wxAC\_DEFAULT\_STYLE},\rtfsp
+\param{const wxString\& }{name = ``animationctrl"}}
+
+\wxheading{Parameters}
+
+\docparam{parent}{Parent window, must not be non-\texttt{NULL}.}
+
+\docparam{id}{The identifier for the control.}
+
+\docparam{anim}{The initial animation shown in the control.}
+
+\docparam{pos}{Initial position.}
+
+\docparam{size}{Initial size.}
+
+\docparam{style}{The window style, see {\tt wxAC\_*} flags.}
+
+\docparam{name}{Control name.}
+
+After control creation you must explicitely call \helpref{Play}{wxanimationctrlplay}
+to start to play the animation. Until that function won't be called, the first frame
+of the animation is displayed.
+
+\wxheading{Return value}
+
+\true if the control was successfully created or \false if creation failed.
+
+
+\membersection{wxAnimationCtrl::GetAnimation}\label{wxanimationctrlgetanimation}
+
+\constfunc{wxAnimation}{GetAnimation}{\void}
+
+Returns the animation associated with this control.
+
+
+\membersection{wxAnimationCtrl::IsPlaying}\label{wxanimationctrlisplaying}
+
+\constfunc{bool}{IsPlaying}{\void}
+
+Returns \true if the animation is being played.
+
+
+\membersection{wxAnimationCtrl::LoadFile}\label{wxanimationctrlloadfile}
+
+\func{bool}{LoadFile}{\param{const wxString \&}{ file}, \param{wxAnimationType }{ animType = wxANIMATION\_TYPE\_ANY}}
+
+Loads the animation from the given file and calls \helpref{SetAnimation}{wxanimationctrlsetanimation}.
+See \helpref{wxAnimation::LoadFile}{wxanimationloadfile} for more info.
+
+
+\membersection{wxAnimationCtrl::Play}\label{wxanimationctrlplay}
+
+\func{bool}{Play}{\void}
+
+Starts playing the animation.
+The animation is always played in loop mode (unless the last frame of the animation
+has an infinite delay time) and always start from the first frame
+(even if you \helpref{atopped}{wxanimationctrlstop} it while some other frame was
+displayed).
+
+
+\membersection{wxAnimationCtrl::SetAnimation}\label{wxanimationctrlsetanimation}
+
+\func{void}{SetAnimation}{\param{const wxAnimation \&}{ anim}}
+
+Sets the animation to play in this control.
+If the previous animation is being played, it's \helpref{Stopped}{wxanimationctrlstop}.
+
+Until \helpref{Play}{wxanimationctrlplay} isn't called, the first frame
+of the animation is displayed.
+
+If {\tt wxNullAnimation} is given as animation, the control will be cleared to display
+the background colour (see \helpref{wxWindow::GetBackgroundColour}{wxwindowgetbackgroundcolour}).
+
+
+\membersection{wxAnimationCtrl::Stop}\label{wxanimationctrlstop}
+
+\func{void}{Stop}{\void}
+
+Stops playing the animation.
+The control will show the last frame rendered of the current animation until
+\helpref{Play}{wxanimationctrlplay} is called.
diff --git a/docs/latex/wx/animation.tex b/docs/latex/wx/animation.tex
new file mode 100644
index 0000000000..298c9f1df4
--- /dev/null
+++ b/docs/latex/wx/animation.tex
@@ -0,0 +1,153 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Name:        animation.tex
+%% Purpose:     wxAnimation documentation
+%% Author:      Francesco Montorsi
+%% Created:     24-9-2006
+%% RCS-ID:      $Id$
+%% Copyright:   (c) 2006 Francesco Montorsi
+%% License:     wxWindows license
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\section{\class{wxAnimation}}\label{wxanimation}
+
+This class encapsulates the concept of a platform-dependent animation.
+An animation is a sequence of frames of the same size.
+Sound is not supported by wxAnimation.
+
+\wxheading{Derived from}
+
+\helpref{wxGDIObject}{wxgdiobject}\\
+\helpref{wxObject}{wxobject}
+
+\wxheading{Include files}
+
+<wx/animate.h>
+
+\wxheading{Predefined objects}
+
+Objects:
+
+{\bf wxNullAnimation}
+
+\wxheading{See also}
+
+\helpref{wxAnimationCtrl}{wxanimationctrl}
+
+\latexignore{\rtfignore{\wxheading{Members}}}
+
+
+\membersection{wxAnimation::wxAnimation}\label{wxanimationctor}
+
+\func{}{wxAnimation}{\void}
+
+Default constructor.
+
+\func{}{wxAnimation}{\param{const wxAnimation\& }{anim}}
+
+Copy constructor.
+wxAnimation objects are reference counted so that this operation is very fast.
+
+\func{}{wxAnimation}{\param{const wxString\& }{name}, \param{wxAnimationType}{ type = wxANIMATION\_TYPE\_ANY}}
+
+Loads an animation from a file.
+
+\docparam{name}{The name of the file to load.}
+
+\docparam{type}{See \helpref{LoadFile}{wxanimationloadfile} for more info.}
+
+
+\membersection{wxAnimation::\destruct{wxAnimation}}\label{wxanimationdtor}
+
+\func{}{\destruct{wxAnimation}}{\void}
+
+Destroys the wxAnimation object and possibly the underlying animation data.
+Because reference counting is used, the animation may not actually be
+destroyed at this point - only when the reference count is zero will the
+data be deleted.
+
+
+\membersection{wxAnimation::GetDelay}\label{wxanimationgetdelay}
+
+\constfunc{int}{GetDelay}{\param{size_t }{i}}
+
+Returns the delay for the i-th frame in milliseconds.
+If {\tt -1} is returned the frame is to be displayed forever.
+
+
+\membersection{wxAnimation::GetFrameCount}\label{wxanimationgetframecount}
+
+\constfunc{size_t}{GetFrameCount}{\void}
+
+Returns the number of frames for this animation.
+
+
+\membersection{wxAnimation::GetFrame}\label{wxanimationgetframe}
+
+\constfunc{wxImage}{GetFrame}{\param{size_t }{i}}
+
+Returns the i-th frame as a \helpref{wxImage}{wximage}.
+
+
+\membersection{wxAnimation::GetSize}\label{wxanimationgetsize}
+
+\constfunc{wxSize}{GetSize}{\void}
+
+Returns the size of the animation.
+
+
+\membersection{wxAnimation::IsOk}\label{wxanimationisok}
+
+\constfunc{bool}{IsOk}{\void}
+
+Returns \true if animation data is present.
+
+
+\membersection{wxAnimation::Load}\label{wxanimationload}
+
+\func{bool}{Load}{\param{wxInputStream&}{ stream}, \param{wxAnimationType}{ type = wxANIMATION\_TYPE\_ANY}}
+
+Loads an animation from the given stream.
+
+\wxheading{Parameters}
+
+\docparam{stream}{The stream to use to load the animation.}
+
+\docparam{type}{One of the following values:
+
+\twocolwidtha{5cm}
+\begin{twocollist}
+\twocolitem{\indexit{wxANIM\_TYPE\_GIF}}{Load an animated GIF file.}
+\twocolitem{\indexit{wxANIM\_TYPE\_ANI}}{Load an ANI file.}
+\twocolitem{\indexit{wxANIM\_TYPE\_ANY}}{Try to autodetect the filetype.}
+\end{twocollist}
+}
+
+\wxheading{Return value}
+
+\true if the operation succeeded, \false otherwise.
+
+
+\membersection{wxAnimation::LoadFile}\label{wxanimationloadfile}
+
+\func{bool}{LoadFile}{\param{const wxString\&}{ name}, \param{wxAnimationType}{ type = wxANIMATION\_TYPE\_ANY}}
+
+Loads an animation from a file.
+
+\wxheading{Parameters}
+
+\docparam{name}{A filename.}
+
+\docparam{type}{One of the following values:
+
+\twocolwidtha{5cm}
+\begin{twocollist}
+\twocolitem{\indexit{wxANIM\_TYPE\_GIF}}{Load an animated GIF file.}
+\twocolitem{\indexit{wxANIM\_TYPE\_ANI}}{Load an ANI file.}
+\twocolitem{\indexit{wxANIM\_TYPE\_ANY}}{Try to autodetect the filetype.}
+\end{twocollist}
+}
+
+\wxheading{Return value}
+
+\true if the operation succeeded, \false otherwise.
+
diff --git a/docs/latex/wx/category.tex b/docs/latex/wx/category.tex
index 764cebed52..750d1456b7 100644
--- a/docs/latex/wx/category.tex
+++ b/docs/latex/wx/category.tex
@@ -85,6 +85,7 @@ that are not static can have \helpref{validators}{wxvalidator} associated with t
 
 \twocolwidtha{6cm}
 \begin{twocollist}\itemsep=0pt
+\twocolitem{\helpref{wxAnimationCtrl}{wxanimationctrl}}{A control to display an animation}
 \twocolitem{\helpref{wxControl}{wxcontrol}}{The base class for controls}
 \twocolitem{\helpref{wxButton}{wxbutton}}{Push button control, displaying text}
 \twocolitem{\helpref{wxBitmapButton}{wxbitmapbutton}}{Push button control, displaying a bitmap}
diff --git a/docs/latex/wx/classes.tex b/docs/latex/wx/classes.tex
index 60d8b51378..08aa6d1a82 100644
--- a/docs/latex/wx/classes.tex
+++ b/docs/latex/wx/classes.tex
@@ -11,6 +11,8 @@
 \input activevt.tex
 \input activexcontainer.tex
 \input activexevt.tex
+\input animation.tex
+\input animatctrl.tex
 \input app.tex
 \input apptraits.tex
 \input archive.tex
diff --git a/include/wx/anidecod.h b/include/wx/anidecod.h
new file mode 100644
index 0000000000..4fe25b6da8
--- /dev/null
+++ b/include/wx/anidecod.h
@@ -0,0 +1,77 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        wx/anidecod.h
+// Purpose:     wxANIDecoder, ANI reader for wxImage and wxAnimation
+// Author:      Francesco Montorsi
+// CVS-ID:      $Id$
+// Copyright:   (c) 2006 Francesco Montorsi
+// Licence:     wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef _WX_ANIDECOD_H
+#define _WX_ANIDECOD_H
+
+#include "wx/defs.h"
+
+#if wxUSE_STREAMS && wxUSE_GIF
+
+#include "wx/stream.h"
+#include "wx/image.h"
+#include "wx/animdecod.h"
+
+
+class /*WXDLLEXPORT*/ wxANIFrameInfo;
+
+WX_DECLARE_OBJARRAY(wxANIFrameInfo, wxANIFrameInfoArray);
+WX_DECLARE_OBJARRAY(wxImage, wxImageArray);
+
+// --------------------------------------------------------------------------
+// wxANIDecoder class
+// --------------------------------------------------------------------------
+
+class WXDLLEXPORT wxANIDecoder : public wxAnimationDecoder
+{
+private:
+
+    // frames stored as wxImage(s): ANI files are meant to be used mostly for animated
+    // cursors and thus they do not use any optimization to encode differences between
+    // two frames: they are just a list of images to display sequentially.
+    wxImageArray m_images;
+
+    // the info about each image stored in m_images.
+    // NB: m_info.GetCount() may differ from m_images.GetCount()!
+    wxANIFrameInfoArray m_info;
+
+    // this is the wxCURHandler used to load the ICON chunk of the ANI files
+    static wxCURHandler sm_handler;
+
+public:
+    virtual wxSize GetFrameSize(size_t frame) const;
+    virtual wxPoint GetFramePosition(size_t frame) const;
+    virtual wxAnimationDisposal GetDisposalMethod(size_t frame) const;
+    virtual long GetDelay(size_t frame) const;
+
+public:
+    // constructor, destructor, etc.
+    wxANIDecoder();
+    ~wxANIDecoder();
+
+public:     // implementation of wxAnimationDecoder's pure virtuals
+
+    virtual bool CanRead( wxInputStream& stream ) const;
+    virtual bool Load( wxInputStream& stream );
+
+    bool ConvertToImage(size_t frame, wxImage *image) const;
+
+    wxAnimationDecoder *Clone() const
+        { return new wxANIDecoder; }
+    wxAnimationType GetType() const
+        { return wxANIMATION_TYPE_ANI; }
+
+private:
+    DECLARE_NO_COPY_CLASS(wxANIDecoder)
+};
+
+
+#endif  // wxUSE_STREAM && wxUSE_GIF
+#endif  // _WX_ANIDECOD_H
+
diff --git a/include/wx/animate.h b/include/wx/animate.h
new file mode 100644
index 0000000000..5d2772fec5
--- /dev/null
+++ b/include/wx/animate.h
@@ -0,0 +1,108 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        wx/animate.h
+// Purpose:     wxAnimation and wxAnimationCtrl
+// Author:      Julian Smart and Guillermo Rodriguez Garcia
+// Modified by: Francesco Montorsi
+// Created:     13/8/99
+// RCS-ID:      $Id$
+// Copyright:   (c) Julian Smart and Guillermo Rodriguez Garcia
+// Licence:     wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef _WX_ANIMATEH__
+#define _WX_ANIMATEH__
+
+#include "wx/defs.h"
+
+#if wxUSE_ANIMATIONCTRL
+
+#include <wx/defs.h>
+#include <wx/string.h>
+#include <wx/gdicmn.h>
+#include <wx/list.h>
+#include <wx/timer.h>
+#include <wx/bitmap.h>
+#include <wx/colour.h>
+#include <wx/control.h>
+#include <wx/animdecod.h>
+
+class WXDLLIMPEXP_ADV wxAnimation;
+
+extern WXDLLEXPORT_DATA(wxAnimation) wxNullAnimation;
+extern WXDLLEXPORT_DATA(const wxChar) wxAnimationCtrlNameStr[];
+
+
+// ----------------------------------------------------------------------------
+// wxAnimationBase
+// ----------------------------------------------------------------------------
+
+class WXDLLEXPORT wxAnimationBase : public wxGDIObject
+{
+public:
+    wxAnimationBase() {}
+
+    virtual bool IsOk() const = 0;
+
+    // can be -1
+    virtual int GetDelay(size_t i) const = 0;
+
+    virtual size_t GetFrameCount() const = 0;
+    virtual wxImage GetFrame(size_t i) const = 0;
+    virtual wxSize GetSize() const = 0;
+
+    virtual bool LoadFile(const wxString &name, wxAnimationType type = wxANIMATION_TYPE_ANY) = 0;
+    virtual bool Load(wxInputStream &stream, wxAnimationType type = wxANIMATION_TYPE_ANY) = 0;
+
+protected:
+    DECLARE_ABSTRACT_CLASS(wxAnimationBase)
+};
+
+
+
+// ----------------------------------------------------------------------------
+// wxAnimationCtrlBase
+// ----------------------------------------------------------------------------
+
+// do not autoresize to the animation's size when SetAnimation() is called
+#define wxAC_NO_AUTORESIZE       (0x0010)
+
+// default style does not include wxAC_NO_AUTORESIZE, that is, the control
+// auto-resizes by default to fit the new animation when SetAnimation() is called
+#define wxAC_DEFAULT_STYLE       (wxNO_BORDER)
+
+
+class WXDLLIMPEXP_ADV wxAnimationCtrlBase : public wxControl
+{
+public:
+    wxAnimationCtrlBase() {}
+
+public:     // public API
+
+    virtual bool LoadFile(const wxString& filename, wxAnimationType type = wxANIMATION_TYPE_ANY) = 0;
+
+    virtual void SetAnimation(const wxAnimation &anim) = 0;
+    virtual wxAnimation GetAnimation() const = 0;
+
+    virtual bool Play() = 0;
+    virtual void Stop() = 0;
+
+    virtual bool IsPlaying() const = 0;
+
+private:
+    DECLARE_ABSTRACT_CLASS(wxAnimationCtrlBase)
+};
+
+
+// ----------------------------------------------------------------------------
+// include the platform-specific version of the wxAnimationCtrl class
+// ----------------------------------------------------------------------------
+
+#if defined(__WXGTK__)
+    #include "wx/gtk/animate.h"
+#else
+    #include "wx/generic/animate.h"
+#endif
+
+#endif      // wxUSE_ANIMATIONCTRL
+
+#endif // _WX_ANIMATEH__
diff --git a/include/wx/animdecod.h b/include/wx/animdecod.h
new file mode 100644
index 0000000000..2c65126e75
--- /dev/null
+++ b/include/wx/animdecod.h
@@ -0,0 +1,139 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        wx/animdecod.h
+// Purpose:     wxAnimationDecoder
+// Author:      Francesco Montorsi
+// CVS-ID:      $Id$
+// Copyright:   (c) 2006 Francesco Montorsi
+// Licence:     wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef _WX_ANIMDECOD_H
+#define _WX_ANIMDECOD_H
+
+#include "wx/defs.h"
+
+#if wxUSE_STREAMS && wxUSE_GIF
+
+#include "wx/stream.h"
+#include "wx/image.h"
+
+/*
+
+ Differences between a wxAnimationDecoder and a wxImageHandler:
+
+ 1) wxImageHandlers always load an input stream directly into a given wxImage
+    object converting from the format-specific data representation to the
+    wxImage native format (RGB24).
+    wxAnimationDecoders always load an input stream using some optimized format
+    to store it which is format-depedent. This allows to store a (possibly big)
+    animation using a format which is a good compromise between required memory
+    and time required to blit in on the screen.
+
+ 2) wxAnimationDecoders contain the animation data in some internal var.
+    That's why they derive from wxObjectRefData: they are data which can be shared.
+
+ 3) wxAnimationDecoders can be used by a wxImageHandler to retrieve a frame
+    in wxImage format; the viceversa cannot be done.
+
+ 4) wxAnimationDecoders are decoders only, thus do not support save features.
+
+ 5) wxAnimationDecoders are directly used by wxAnimation (generic implementation)
+    as wxObjectRefData while they need to be 'wrapped' by a wxImageHandler for
+    wxImage uses.
+
+*/
+
+
+// --------------------------------------------------------------------------
+// Constants
+// --------------------------------------------------------------------------
+
+// NB: the values of these enum items are not casual but coincide with the
+//     GIF disposal codes. Do not change them !!
+enum wxAnimationDisposal
+{
+    // No disposal specified. The decoder is not required to take any action.
+    wxANIM_UNSPECIFIED = -1,
+
+    // Do not dispose. The graphic is to be left in place.
+    wxANIM_DONOTREMOVE = 0,
+
+    // Restore to background color. The area used by the graphic must be 
+    // restored to the background color.
+    wxANIM_TOBACKGROUND = 1,
+
+    // Restore to previous. The decoder is required to restore the area 
+    // overwritten by the graphic with what was there prior to rendering the graphic.
+    wxANIM_TOPREVIOUS = 2
+};
+
+enum wxAnimationType
+{
+    wxANIMATION_TYPE_INVALID,
+    wxANIMATION_TYPE_GIF,
+    wxANIMATION_TYPE_ANI,
+
+    wxANIMATION_TYPE_ANY
+};
+
+
+// --------------------------------------------------------------------------
+// wxAnimationDecoder class
+// --------------------------------------------------------------------------
+
+class WXDLLEXPORT wxAnimationDecoder : public wxObjectRefData
+{
+protected:
+    wxSize m_szAnimation;
+    size_t m_nFrames;
+
+    // this is the colour to use for the wxANIM_TOBACKGROUND disposal.
+    // if not specified by the animation, it's set to wxNullColour
+    wxColour m_background;
+
+public:     // frame specific data getters
+
+    // not all frames may be of the same size; e.g. GIF allows to
+    // specify that between two frames only a smaller portion of the
+    // entire animation has changed.
+    virtual wxSize GetFrameSize(size_t frame) const = 0;
+
+    // the position of this frame in case it's not as big as m_szAnimation
+    // or wxPoint(0,0) otherwise.
+    virtual wxPoint GetFramePosition(size_t frame) const = 0;
+
+    // what should be done after displaying this frame.
+    virtual wxAnimationDisposal GetDisposalMethod(size_t frame) const = 0;
+
+    // the number of milliseconds this frame should be displayed.
+    // if returns -1 then the frame must be displayed forever.
+    virtual long GetDelay(size_t frame) const = 0;
+
+    // get global data
+    wxSize GetAnimationSize() const { return m_szAnimation; }
+    wxColour GetBackgroundColour() const { return m_background; }
+    size_t GetFrameCount() const { return m_nFrames; }
+
+public:
+    wxAnimationDecoder()
+    {
+        m_background = wxNullColour;
+        m_nFrames = 0;
+    }
+    ~wxAnimationDecoder() {}
+
+
+    virtual bool Load( wxInputStream& stream ) = 0;
+    virtual bool CanRead( wxInputStream& stream ) const = 0;
+
+    virtual wxAnimationDecoder *Clone() const = 0;
+    virtual wxAnimationType GetType() const = 0;
+
+    // convert given frame to wxImage
+    virtual bool ConvertToImage(size_t frame, wxImage *image) const = 0;
+};
+
+
+#endif  // wxUSE_STREAM && wxUSE_GIF
+#endif  // _WX_ANIMDECOD_H
+
diff --git a/include/wx/chkconf.h b/include/wx/chkconf.h
index 39a66b6c4e..6ad8476e07 100644
--- a/include/wx/chkconf.h
+++ b/include/wx/chkconf.h
@@ -328,6 +328,14 @@
 #   endif
 #endif /* !defined(wxUSE_ACCEL) */
 
+#ifndef wxUSE_ANIMATIONCTRL
+#   ifdef wxABORT_ON_CONFIG_ERROR
+#       error "wxUSE_ANIMATIONCTRL must be defined."
+#   else
+#       define wxUSE_ANIMATIONCTRL 0
+#   endif
+#endif /* !defined(wxUSE_ANIMATIONCTRL) */
+
 #ifndef wxUSE_BITMAPCOMBOBOX
 #   ifdef wxABORT_ON_CONFIG_ERROR
 #       error "wxUSE_BITMAPCOMBOBOX must be defined."
diff --git a/include/wx/generic/animate.h b/include/wx/generic/animate.h
new file mode 100644
index 0000000000..a244d32ccd
--- /dev/null
+++ b/include/wx/generic/animate.h
@@ -0,0 +1,189 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        wx/generic/animate.h
+// Purpose:     wxAnimation and wxAnimationCtrl
+// Author:      Julian Smart and Guillermo Rodriguez Garcia
+// Modified by: Francesco Montorsi
+// Created:     13/8/99
+// RCS-ID:      $Id$
+// Copyright:   (c) Julian Smart and Guillermo Rodriguez Garcia
+// Licence:     wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef _WX_GENERIC_ANIMATEH__
+#define _WX_GENERIC_ANIMATEH__
+
+#include <wx/defs.h>
+#include <wx/string.h>
+#include <wx/gdicmn.h>
+#include <wx/list.h>
+#include <wx/timer.h>
+#include <wx/bitmap.h>
+#include <wx/colour.h>
+#include <wx/control.h>
+#include <wx/animdecod.h>
+
+class WXDLLIMPEXP_ADV wxAnimationBase;
+class WXDLLIMPEXP_ADV wxAnimationPlayer;
+class WXDLLEXPORT wxImage;
+class WXDLLEXPORT wxGIFDecoder;
+class WXDLLEXPORT wxAnimation;
+
+
+// ----------------------------------------------------------------------------
+// wxAnimation
+// ----------------------------------------------------------------------------
+
+WX_DECLARE_LIST(wxAnimationDecoder, wxAnimationDecoderList);
+
+class WXDLLIMPEXP_ADV wxAnimation : public wxAnimationBase
+{
+public:
+    wxAnimation(const wxAnimation &tocopy)
+        { Ref(tocopy); }
+    wxAnimation() {}
+    ~wxAnimation() { UnRef(); }
+
+    wxAnimation &operator= (const wxAnimation &tocopy)
+    {
+        Ref(tocopy);
+        return *this;
+    }
+
+    bool operator == (const wxAnimation& anim) const
+        { return m_refData == anim.m_refData; }
+    bool operator != (const wxAnimation& anim) const
+        { return m_refData != anim.m_refData; }
+
+    bool IsOk() const
+        { return m_refData != NULL; }
+
+    size_t GetFrameCount() const;
+    int GetDelay(size_t i) const;
+    wxImage GetFrame(size_t i) const;
+    wxSize GetSize() const;
+
+    bool LoadFile(const wxString& filename, wxAnimationType type = wxANIMATION_TYPE_ANY);
+    bool Load(wxInputStream &stream, wxAnimationType type = wxANIMATION_TYPE_ANY);
+
+public:     // extended interface used by the generic implementation of wxAnimationCtrl
+
+    wxPoint GetFramePosition(size_t frame) const;
+    wxAnimationDisposal GetDisposalMethod(size_t frame) const;
+    wxColour GetBackgroundColour() const;
+
+protected:
+    static wxAnimationDecoderList sm_handlers;
+
+public:
+    static inline wxAnimationDecoderList& GetHandlers() { return sm_handlers; }
+    static void AddHandler(wxAnimationDecoder *handler);
+    static void InsertHandler(wxAnimationDecoder *handler);
+    static const wxAnimationDecoder *FindHandler( wxAnimationType animType );
+
+    static void CleanUpHandlers();
+    static void InitStandardHandlers();
+
+protected:
+    DECLARE_DYNAMIC_CLASS(wxAnimation)
+};
+
+
+// ----------------------------------------------------------------------------
+// wxAnimationCtrl
+// ----------------------------------------------------------------------------
+
+class WXDLLIMPEXP_ADV wxAnimationCtrl: public wxAnimationCtrlBase
+{
+public:
+    wxAnimationCtrl() {}
+    wxAnimationCtrl(wxWindow *parent,
+            wxWindowID id,
+            const wxAnimation& anim = wxNullAnimation,
+            const wxPoint& pos = wxDefaultPosition,
+            const wxSize& size = wxDefaultSize,
+            long style = wxAC_DEFAULT_STYLE,
+            const wxString& name = wxAnimationCtrlNameStr)
+    {
+        Create(parent, id, anim, pos, size, style, name);
+    }
+
+    bool Create(wxWindow *parent, wxWindowID id,
+                const wxAnimation& anim = wxNullAnimation,
+                const wxPoint& pos = wxDefaultPosition,
+                const wxSize& size = wxDefaultSize,
+                long style = wxAC_DEFAULT_STYLE,
+                const wxString& name = wxAnimationCtrlNameStr);
+
+    ~wxAnimationCtrl();
+
+public:
+    virtual bool LoadFile(const wxString& filename, wxAnimationType type = wxANIMATION_TYPE_ANY);
+
+    virtual void Stop();
+    virtual bool Play()
+        { return Play(true /* looped */); }
+    virtual bool IsPlaying() const
+        { return m_isPlaying; }
+
+    void SetAnimation(const wxAnimation &animation);
+    wxAnimation GetAnimation() const
+        { return m_animation; }
+
+public:     // event handlers
+
+    void OnPaint(wxPaintEvent& event);
+    void OnTimer(wxTimerEvent& event);
+    void OnSize(wxSizeEvent& event);
+
+public:     // extended API specific to this implementation of wxAnimateCtrl
+
+    // Specify whether the animation's background colour is to be shown (the default),
+    // or whether the window background should show through
+    void SetUseWindowBackgroundColour(bool useWinBackground = true)
+        { m_useWinBackgroundColour = useWinBackground; }
+    bool IsUsingWindowBackgroundColour() const
+        { return m_useWinBackgroundColour; }
+
+    // This overload of Play() lets you specify if the animation must loop or not
+    bool Play(bool looped);
+
+    // Draw the current frame of the animation into given DC.
+    // This is fast as current frame is always cached.
+    void DrawCurrentFrame(wxDC& dc);
+
+    // Returns a wxBitmap with the current frame drawn in it
+    wxBitmap& GetBackingStore()
+        { return m_backingStore; }
+
+protected:      // internal utilities
+
+    // resize this control to fit m_animation
+    void FitToAnimation();
+
+    // Draw the background; use this when e.g. previous frame had wxANIM_TOBACKGROUND disposal.
+    void DisposeToBackground(wxDC& dc);
+
+    void IncrementalUpdateBackingStore();
+    void RebuildBackingStoreUpToFrame(size_t);
+    void DrawFrame(wxDC &dc, size_t);
+
+    virtual wxSize DoGetBestSize() const;
+
+protected:
+    size_t        m_currentFrame;     // Current frame
+    bool          m_looped;           // Looped, or not
+    wxTimer       m_timer;            // The timer
+    wxAnimation   m_animation;        // The animation
+
+    bool          m_isPlaying;        // Is the animation playing?
+    bool          m_useWinBackgroundColour; // Use animation bg colour or window bg colour?
+
+    wxBitmap      m_backingStore;     // The frames are drawn here and then blitted
+                                      // on the screen
+
+private:
+    DECLARE_DYNAMIC_CLASS(wxAnimationCtrl)
+    DECLARE_EVENT_TABLE()
+};
+
+#endif // _WX_GENERIC_ANIMATEH__
diff --git a/include/wx/gifdecod.h b/include/wx/gifdecod.h
index cb9490e892..346ae800b9 100644
--- a/include/wx/gifdecod.h
+++ b/include/wx/gifdecod.h
@@ -17,6 +17,10 @@
 
 #include "wx/stream.h"
 #include "wx/image.h"
+#include "wx/animdecod.h"
+
+// internal utility used to store a frame in 8bit-per-pixel format
+class /*WXDLLEXPORT*/ GIFImage;
 
 
 // --------------------------------------------------------------------------
@@ -29,7 +33,7 @@
 //  stream; this means that if it was not reading directly from file,
 //  the stream will not be correctly positioned. the
 //
-enum
+enum wxGIFErrorCode
 {
     wxGIF_OK = 0,                   /* everything was OK */
     wxGIF_INVFORMAT,                /* error in gif header */
@@ -37,18 +41,6 @@ enum
     wxGIF_TRUNCATED                 /* file appears to be truncated */
 };
 
-// Disposal method
-//  Experimental; subject to change.
-//
-enum
-{
-    wxGIF_D_UNSPECIFIED = -1,       /* not specified */
-    wxGIF_D_DONOTDISPOSE = 0,       /* do not dispose */
-    wxGIF_D_TOBACKGROUND = 1,       /* restore to background colour */
-    wxGIF_D_TOPREVIOUS = 2          /* restore to previous image */
-};
-
-
 #define MAX_BLOCK_SIZE 256          /* max. block size */
 
 
@@ -56,45 +48,12 @@ enum
 // wxGIFDecoder class
 // --------------------------------------------------------------------------
 
-// internal class for storing GIF image data
-class GIFImage
-{
-public:
-    // def ctor
-    GIFImage();
-
-    unsigned int w;                 /* width */
-    unsigned int h;                 /* height */
-    unsigned int left;              /* x coord (in logical screen) */
-    unsigned int top;               /* y coord (in logical screen) */
-    int transparent;                /* transparent color (-1 = none) */
-    int disposal;                   /* disposal method (-1 = unspecified) */
-    long delay;                     /* delay in ms (-1 = unused) */
-    unsigned char *p;               /* bitmap */
-    unsigned char *pal;             /* palette */
-    unsigned int ncolours;          /* number of colours */
-    GIFImage *next;                 /* next image */
-    GIFImage *prev;                 /* prev image */
-
-    DECLARE_NO_COPY_CLASS(GIFImage)
-};
-
-
-class WXDLLEXPORT wxGIFDecoder
+class WXDLLEXPORT wxGIFDecoder : public wxAnimationDecoder
 {
 private:
-    // logical screen
-    unsigned int  m_screenw;        /* logical screen width */
-    unsigned int  m_screenh;        /* logical screen height */
-    int           m_background;     /* background color (-1 = none) */
-
-    // image data
-    bool          m_anim;           /* animated GIF */
-    int           m_nimages;        /* number of images */
-    int           m_image;          /* current image */
-    GIFImage      *m_pimage;        /* pointer to current image */
-    GIFImage      *m_pfirst;        /* pointer to first image */
-    GIFImage      *m_plast;         /* pointer to last image */
+    // a wxArray provides a constant access time rather than a linear time
+    // like for linked lists.
+    wxArrayPtrVoid m_frames;
 
     // decoder state vars
     int           m_restbits;       /* remaining valid bits */
@@ -103,52 +62,51 @@ private:
     unsigned char m_buffer[MAX_BLOCK_SIZE];     /* buffer for reading */
     unsigned char *m_bufp;          /* pointer to next byte in buffer */
 
-    // input stream
-    wxInputStream *m_f;             /* input stream */
-
 private:
-    int getcode(int bits, int abfin);
-    int dgif(GIFImage *img, int interl, int bits);
+    int getcode(wxInputStream& stream, int bits, int abfin);
+    wxGIFErrorCode dgif(wxInputStream& stream, GIFImage *img, int interl, int bits);
 
 public:
     // get data of current frame
-    int GetFrameIndex() const;
-    unsigned char* GetData() const;
-    unsigned char* GetPalette() const;
-    unsigned int GetNcolours() const;
-    unsigned int GetWidth() const;
-    unsigned int GetHeight() const;
-    unsigned int GetLeft() const;
-    unsigned int GetTop() const;
-    int GetDisposalMethod() const;
-    int GetTransparentColour() const;
-    long GetDelay() const;
-
-    // get global data
-    unsigned int GetLogicalScreenWidth() const;
-    unsigned int GetLogicalScreenHeight() const;
-    int GetBackgroundColour() const;
-    int GetNumberOfFrames() const;
-    bool IsAnimation() const;
-
-    // move through the animation
-    bool GoFirstFrame();
-    bool GoLastFrame();
-    bool GoNextFrame(bool cyclic = false);
-    bool GoPrevFrame(bool cyclic = false);
-    bool GoFrame(int which);
+    unsigned char* GetData(size_t frame) const;
+    unsigned char* GetPalette(size_t frame) const;
+    unsigned int GetNcolours(size_t frame) const;
+    int GetTransparentColour(size_t frame) const;
+
+    virtual wxSize GetFrameSize(size_t frame) const;
+    virtual wxPoint GetFramePosition(size_t frame) const;
+    virtual wxAnimationDisposal GetDisposalMethod(size_t frame) const;
+    virtual long GetDelay(size_t frame) const;
+
+    // GIFs can contain both static images and animations
+    bool IsAnimation() const
+        { return m_nFrames > 1; }
 
 public:
     // constructor, destructor, etc.
-    wxGIFDecoder(wxInputStream *s, bool anim = false);
+    wxGIFDecoder();
     ~wxGIFDecoder();
-    bool CanRead();
-    int ReadGIF();
+
+    // load function which returns more info than just Load():
+    wxGIFErrorCode LoadGIF( wxInputStream& stream );
+
+    // free all internal frames
     void Destroy();
 
-    // convert current frame to wxImage
-    bool ConvertToImage(wxImage *image) const;
+public:     // implementation of wxAnimationDecoder's pure virtuals
+
+    virtual bool CanRead( wxInputStream& stream ) const;
+    virtual bool Load( wxInputStream& stream )
+        { return LoadGIF(stream) == wxGIF_OK; }
+
+    bool ConvertToImage(size_t frame, wxImage *image) const;
 
+    wxAnimationDecoder *Clone() const
+        { return new wxGIFDecoder; }
+    wxAnimationType GetType() const
+        { return wxANIMATION_TYPE_GIF; }
+
+private:
     DECLARE_NO_COPY_CLASS(wxGIFDecoder)
 };
 
diff --git a/include/wx/gtk/animate.h b/include/wx/gtk/animate.h
new file mode 100644
index 0000000000..6e4704a42c
--- /dev/null
+++ b/include/wx/gtk/animate.h
@@ -0,0 +1,181 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        wx/gtk/animate.h
+// Purpose:     Animation classes
+// Author:      Julian Smart and Guillermo Rodriguez Garcia
+// Modified by: Francesco Montorsi
+// Created:     13/8/99
+// RCS-ID:      $Id$
+// Copyright:   (c) Julian Smart and Guillermo Rodriguez Garcia
+// Licence:     wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef _WX_GTKANIMATEH__
+#define _WX_GTKANIMATEH__
+
+#include "wx/defs.h"
+#include <gdk-pixbuf/gdk-pixbuf.h>
+
+// ----------------------------------------------------------------------------
+// wxAnimation
+// Unlike the generic wxAnimation object (see generic\animate.cpp), we won't
+// use directly wxAnimationHandlers as gdk-pixbuf already provides the
+// concept of handler and will automatically use the available handlers.
+// Like generic wxAnimation object, this implementation of wxAnimation is
+// refcounted so that assignment is very fast
+// ----------------------------------------------------------------------------
+
+class WXDLLEXPORT wxAnimation : public wxAnimationBase
+{
+public:
+    wxAnimation(const wxAnimation &tocopy)
+        { m_pixbuf=tocopy.m_pixbuf; if (m_pixbuf) g_object_ref(m_pixbuf); }
+    wxAnimation(GdkPixbufAnimation *p = NULL)
+        { m_pixbuf=p; }
+    ~wxAnimation()
+        { UnRef(); }
+
+    wxAnimation &operator= (const wxAnimation &tocopy)
+        {
+            m_pixbuf=tocopy.m_pixbuf;
+            if (m_pixbuf) g_object_ref(m_pixbuf);
+            return *this;
+        }
+
+    bool operator == (const wxAnimation& anim) const
+        { return m_pixbuf == anim.m_pixbuf; }
+    bool operator != (const wxAnimation& anim) const
+        { return m_pixbuf != anim.m_pixbuf; }
+
+    virtual bool IsOk() const
+        { return m_pixbuf != NULL; }
+
+
+    // unfortunately GdkPixbufAnimation does not expose these info:
+
+    virtual size_t GetFrameCount() const
+        { return 0; }
+    virtual wxImage GetFrame(size_t i) const
+        { return wxNullImage; }
+
+    // we can retrieve the delay for a frame only after building
+    // a GdkPixbufAnimationIter...
+    virtual int GetDelay(size_t i) const
+        { return 0; }
+
+    virtual wxSize GetSize() const
+        { return wxSize(gdk_pixbuf_animation_get_width(m_pixbuf),
+                        gdk_pixbuf_animation_get_height(m_pixbuf)); }
+
+    virtual bool LoadFile(const wxString &name, wxAnimationType type = wxANIMATION_TYPE_ANY);
+    virtual bool Load(wxInputStream &stream, wxAnimationType type = wxANIMATION_TYPE_ANY);
+
+    void UnRef()
+    {
+        if (m_pixbuf)
+            g_object_unref(m_pixbuf);
+        m_pixbuf = NULL;
+    }
+
+public:     // used by GTK callbacks
+
+    GdkPixbufAnimation *GetPixbuf() const
+        { return m_pixbuf; }
+    void SetPixbuf(GdkPixbufAnimation *p)
+        { m_pixbuf=p; if (m_pixbuf) g_object_ref(m_pixbuf); }
+
+protected:
+    GdkPixbufAnimation *m_pixbuf;
+
+    // used temporary by Load()
+    //bool m_bLoadComplete;
+
+protected:
+    DECLARE_DYNAMIC_CLASS(wxAnimation)
+};
+
+
+
+// ----------------------------------------------------------------------------
+// wxAnimationCtrl
+// ----------------------------------------------------------------------------
+
+// Resize to animation size if this is set
+#define wxAN_FIT_ANIMATION       0x0010
+
+class WXDLLIMPEXP_ADV wxAnimationCtrl: public wxAnimationCtrlBase
+{
+public:
+    wxAnimationCtrl() {}
+    wxAnimationCtrl(wxWindow *parent,
+                        wxWindowID id,
+                        const wxAnimation& anim = wxNullAnimation,
+                        const wxPoint& pos = wxDefaultPosition,
+                        const wxSize& size = wxDefaultSize,
+                        long style = wxAC_DEFAULT_STYLE,
+                        const wxString& name = wxAnimationCtrlNameStr)
+    {
+        Create(parent, id, anim, pos, size, style, name);
+    }
+
+    bool Create(wxWindow *parent, wxWindowID id,
+                const wxAnimation& anim = wxNullAnimation,
+                const wxPoint& pos = wxDefaultPosition,
+                const wxSize& size = wxDefaultSize,
+                long style = wxAC_DEFAULT_STYLE,
+                const wxString& name = wxAnimationCtrlNameStr);
+
+    ~wxAnimationCtrl();
+
+public:     // event handler
+
+    void OnTimer(wxTimerEvent &);
+
+public:     // public API
+
+    virtual bool LoadFile(const wxString& filename, wxAnimationType type = wxANIMATION_TYPE_ANY);
+
+    virtual void SetAnimation(const wxAnimation &anim);
+    virtual wxAnimation GetAnimation() const
+        { return wxAnimation(m_anim); }
+
+    virtual bool Play();
+    virtual void Stop();
+
+    virtual bool IsPlaying() const;
+
+    bool SetBackgroundColour( const wxColour &colour );
+
+protected:
+
+    virtual wxSize DoGetBestSize() const;
+    void FitToAnimation();
+    void ClearToBackgroundColour();
+
+    void ResetAnim()
+    {
+        if (m_anim)
+            g_object_unref(m_anim);
+        m_anim = NULL;
+    }
+
+    void ResetIter()
+    {
+        if (m_iter)
+            g_object_unref(m_iter);
+        m_iter = NULL;
+    }
+
+protected:      // internal vars
+
+    GdkPixbufAnimation *m_anim;
+    GdkPixbufAnimationIter *m_iter;
+
+    wxTimer m_timer;
+    bool m_bPlaying;
+
+private:
+    DECLARE_DYNAMIC_CLASS(wxAnimationCtrl)
+    DECLARE_EVENT_TABLE()
+};
+
+#endif // _WX_GTKANIMATEH__
diff --git a/include/wx/imagbmp.h b/include/wx/imagbmp.h
index d452670793..c85fac0e6a 100644
--- a/include/wx/imagbmp.h
+++ b/include/wx/imagbmp.h
@@ -1,6 +1,6 @@
 /////////////////////////////////////////////////////////////////////////////
 // Name:        imagbmp.h
-// Purpose:     wxImage BMP, ICO and CUR handlers
+// Purpose:     wxImage BMP, ICO, CUR and ANI handlers
 // Author:      Robert Roebling, Chris Elliott
 // RCS-ID:      $Id$
 // Copyright:   (c) Robert Roebling, Chris Elliott
diff --git a/include/wx/mac/setup0.h b/include/wx/mac/setup0.h
index 01a5ed2e82..9e2c824b85 100644
--- a/include/wx/mac/setup0.h
+++ b/include/wx/mac/setup0.h
@@ -601,6 +601,7 @@
 // Default is 1
 //
 // Recommended setting: 1
+#define wxUSE_ANIMATIONCTRL 1   // wxAnimationCtrl
 #define wxUSE_BUTTON        1   // wxButton
 #define wxUSE_BMPBUTTON     1   // wxBitmapButton
 #define wxUSE_CALENDARCTRL  1   // wxCalendarCtrl
diff --git a/include/wx/motif/setup0.h b/include/wx/motif/setup0.h
index 23bc554f40..43f560b438 100644
--- a/include/wx/motif/setup0.h
+++ b/include/wx/motif/setup0.h
@@ -600,6 +600,7 @@
 // Default is 1
 //
 // Recommended setting: 1
+#define wxUSE_ANIMATIONCTRL 1   // wxAnimationCtrl
 #define wxUSE_BUTTON        1   // wxButton
 #define wxUSE_BMPBUTTON     1   // wxBitmapButton
 #define wxUSE_CALENDARCTRL  1   // wxCalendarCtrl
diff --git a/include/wx/msw/setup0.h b/include/wx/msw/setup0.h
index 58d7558478..9b47d2cc3d 100644
--- a/include/wx/msw/setup0.h
+++ b/include/wx/msw/setup0.h
@@ -600,6 +600,7 @@
 // Default is 1
 //
 // Recommended setting: 1
+#define wxUSE_ANIMATIONCTRL 1   // wxAnimationCtrl
 #define wxUSE_BUTTON        1   // wxButton
 #define wxUSE_BMPBUTTON     1   // wxBitmapButton
 #define wxUSE_CALENDARCTRL  1   // wxCalendarCtrl
diff --git a/include/wx/msw/wince/setup.h b/include/wx/msw/wince/setup.h
index e0027b3598..8b055bab1d 100644
--- a/include/wx/msw/wince/setup.h
+++ b/include/wx/msw/wince/setup.h
@@ -600,6 +600,7 @@
 // Default is 1
 //
 // Recommended setting: 1
+#define wxUSE_ANIMATIONCTRL 1   // wxAnimationCtrl
 #define wxUSE_BUTTON        1   // wxButton
 #define wxUSE_BMPBUTTON     1   // wxBitmapButton
 #define wxUSE_CALENDARCTRL  1   // wxCalendarCtrl
diff --git a/include/wx/os2/setup0.h b/include/wx/os2/setup0.h
index 03405feab3..55b47dde66 100644
--- a/include/wx/os2/setup0.h
+++ b/include/wx/os2/setup0.h
@@ -600,6 +600,7 @@
 // Default is 1
 //
 // Recommended setting: 1
+#define wxUSE_ANIMATIONCTRL 1   // wxAnimationCtrl
 #define wxUSE_BUTTON        1   // wxButton
 #define wxUSE_BMPBUTTON     1   // wxBitmapButton
 #define wxUSE_CALENDARCTRL  1   // wxCalendarCtrl
diff --git a/include/wx/palmos/setup0.h b/include/wx/palmos/setup0.h
index fb5eacf1d6..a06bffa257 100644
--- a/include/wx/palmos/setup0.h
+++ b/include/wx/palmos/setup0.h
@@ -600,6 +600,7 @@
 // Default is 1
 //
 // Recommended setting: 1
+#define wxUSE_ANIMATIONCTRL 1   // wxAnimationCtrl
 #define wxUSE_BUTTON        1   // wxButton
 #define wxUSE_BMPBUTTON     1   // wxBitmapButton
 #define wxUSE_CALENDARCTRL  1   // wxCalendarCtrl
diff --git a/include/wx/setup_inc.h b/include/wx/setup_inc.h
index e0b6cb987e..387c59a715 100644
--- a/include/wx/setup_inc.h
+++ b/include/wx/setup_inc.h
@@ -596,6 +596,7 @@
 // Default is 1
 //
 // Recommended setting: 1
+#define wxUSE_ANIMATIONCTRL 1   // wxAnimationCtrl
 #define wxUSE_BUTTON        1   // wxButton
 #define wxUSE_BMPBUTTON     1   // wxBitmapButton
 #define wxUSE_CALENDARCTRL  1   // wxCalendarCtrl
diff --git a/samples/animate/Makefile.in b/samples/animate/Makefile.in
new file mode 100644
index 0000000000..4775d42bc5
--- /dev/null
+++ b/samples/animate/Makefile.in
@@ -0,0 +1,209 @@
+# =========================================================================
+#     This makefile was generated by
+#     Bakefile 0.2.0 (http://bakefile.sourceforge.net)
+#     Do not modify, all changes will be overwritten!
+# =========================================================================
+
+
+@MAKE_SET@
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+INSTALL = @INSTALL@
+EXEEXT = @EXEEXT@
+WINDRES = @WINDRES@
+REZ = @REZ@
+SETFILE = @SETFILE@
+NM = @NM@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+top_builddir = @top_builddir@
+LIBS = @LIBS@
+LDFLAGS_GUI = @LDFLAGS_GUI@
+CXX = @CXX@
+CXXFLAGS = @CXXFLAGS@
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+WX_LIB_FLAVOUR = @WX_LIB_FLAVOUR@
+TOOLKIT = @TOOLKIT@
+TOOLKIT_LOWERCASE = @TOOLKIT_LOWERCASE@
+TOOLKIT_VERSION = @TOOLKIT_VERSION@
+TOOLCHAIN_FULLNAME = @TOOLCHAIN_FULLNAME@
+EXTRALIBS = @EXTRALIBS@
+EXTRALIBS_GUI = @EXTRALIBS_GUI@
+EXTRALIBS_SDL = @EXTRALIBS_SDL@
+HOST_SUFFIX = @HOST_SUFFIX@
+SAMPLES_RPATH_FLAG = @SAMPLES_RPATH_FLAG@
+SAMPLES_RPATH_POSTLINK = @SAMPLES_RPATH_POSTLINK@
+
+### Variables: ###
+
+DESTDIR = 
+WX_RELEASE = 2.7
+WX_VERSION = $(WX_RELEASE).0
+LIBDIRNAME = $(top_builddir)lib
+ANITEST_CXXFLAGS = -D__WX$(TOOLKIT)__ $(__WXUNIV_DEFINE_p) \
+	$(__EXCEPTIONS_DEFINE_p) $(__RTTI_DEFINE_p) $(__THREAD_DEFINE_p) \
+	-I$(srcdir) $(__DLLFLAG_p) -I$(srcdir)/../../samples $(CPPFLAGS) $(CXXFLAGS)
+ANITEST_OBJECTS =  \
+	$(__anitest_os2_lib_res) \
+	anitest_anitest.o \
+	$(__anitest___win32rc)
+
+### Conditionally set variables: ###
+
+@COND_DEPS_TRACKING_0@CXXC = $(CXX)
+@COND_DEPS_TRACKING_1@CXXC = $(top_builddir)./bk-deps $(CXX)
+@COND_USE_PLUGINS_0@PLUGIN_ADV_EXTRALIBS = $(EXTRALIBS_SDL)
+@COND_USE_GUI_0@PORTNAME = base
+@COND_USE_GUI_1@PORTNAME = $(TOOLKIT_LOWERCASE)$(TOOLKIT_VERSION)
+@COND_TOOLKIT_MAC@WXBASEPORT = _carbon
+@COND_BUILD_DEBUG_DEBUG_FLAG_DEFAULT@WXDEBUGFLAG = d
+@COND_DEBUG_FLAG_1@WXDEBUGFLAG = d
+@COND_UNICODE_1@WXUNICODEFLAG = u
+@COND_WXUNIV_1@WXUNIVNAME = univ
+@COND_MONOLITHIC_0@EXTRALIBS_FOR_BASE = $(EXTRALIBS)
+@COND_MONOLITHIC_1@EXTRALIBS_FOR_BASE = $(EXTRALIBS) $(EXTRALIBS_GUI)
+@COND_MONOLITHIC_0@EXTRALIBS_FOR_GUI = $(EXTRALIBS_GUI)
+@COND_MONOLITHIC_1@EXTRALIBS_FOR_GUI = 
+@COND_PLATFORM_MAC_1@__anitest___mac_setfilecmd = \
+@COND_PLATFORM_MAC_1@	$(SETFILE) -a C anitest$(EXEEXT)
+@COND_PLATFORM_MAC_1@__anitest___mac_rezcmd = $(__MACOSX_RESOURCES_p_1)
+@COND_WXUNIV_1@__WXUNIV_DEFINE_p = -D__WXUNIVERSAL__
+@COND_WXUNIV_1@__WXUNIV_DEFINE_p_1 = -d __WXUNIVERSAL__
+@COND_WXUNIV_1@__WXUNIV_DEFINE_p_2 = --define __WXUNIVERSAL__
+@COND_USE_EXCEPTIONS_0@__EXCEPTIONS_DEFINE_p = -DwxNO_EXCEPTIONS
+@COND_USE_EXCEPTIONS_0@__EXCEPTIONS_DEFINE_p_1 = -d wxNO_EXCEPTIONS
+@COND_USE_EXCEPTIONS_0@__EXCEPTIONS_DEFINE_p_2 = --define wxNO_EXCEPTIONS
+@COND_USE_RTTI_0@__RTTI_DEFINE_p = -DwxNO_RTTI
+@COND_USE_RTTI_0@__RTTI_DEFINE_p_1 = -d wxNO_RTTI
+@COND_USE_RTTI_0@__RTTI_DEFINE_p_2 = --define wxNO_RTTI
+@COND_USE_THREADS_0@__THREAD_DEFINE_p = -DwxNO_THREADS
+@COND_USE_THREADS_0@__THREAD_DEFINE_p_1 = -d wxNO_THREADS
+@COND_USE_THREADS_0@__THREAD_DEFINE_p_2 = --define wxNO_THREADS
+@COND_SHARED_1@__DLLFLAG_p = -DWXUSINGDLL
+@COND_SHARED_1@__DLLFLAG_p_1 = -d WXUSINGDLL
+@COND_SHARED_1@__DLLFLAG_p_2 = --define WXUSINGDLL
+COND_PLATFORM_OS2_1___anitest___os2_emxbindcmd = $(NM) anitest$(EXEEXT) | if \
+	grep -q pmwin.763 ; then emxbind -ep anitest$(EXEEXT) ; fi
+@COND_PLATFORM_OS2_1@__anitest___os2_emxbindcmd = $(COND_PLATFORM_OS2_1___anitest___os2_emxbindcmd)
+@COND_TOOLKIT_MSW@__RCDEFDIR_p = -i \
+@COND_TOOLKIT_MSW@	$(LIBDIRNAME)/wx/include/$(TOOLCHAIN_FULLNAME)
+@COND_TOOLKIT_MSW@__RCDEFDIR_p_1 = --include-dir \
+@COND_TOOLKIT_MSW@	$(LIBDIRNAME)/wx/include/$(TOOLCHAIN_FULLNAME)
+@COND_PLATFORM_OS2_1@__anitest_os2_lib_res = \
+@COND_PLATFORM_OS2_1@	$(top_srcdir)/include/wx/os2/wx.res
+@COND_PLATFORM_MACOSX_1@__anitest_bundle___depname = anitest_bundle
+@COND_TOOLKIT_COCOA@____anitest_BUNDLE_TGT_REF_DEP = \
+@COND_TOOLKIT_COCOA@	anitest.app/Contents/PkgInfo
+@COND_TOOLKIT_MAC@____anitest_BUNDLE_TGT_REF_DEP = \
+@COND_TOOLKIT_MAC@	anitest.app/Contents/PkgInfo
+COND_MONOLITHIC_0___WXLIB_ADV_p = \
+	-lwx_$(PORTNAME)$(WXUNIVNAME)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)_adv-$(WX_RELEASE)$(HOST_SUFFIX)
+@COND_MONOLITHIC_0@__WXLIB_ADV_p = $(COND_MONOLITHIC_0___WXLIB_ADV_p)
+COND_MONOLITHIC_0___WXLIB_CORE_p = \
+	-lwx_$(PORTNAME)$(WXUNIVNAME)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)_core-$(WX_RELEASE)$(HOST_SUFFIX)
+@COND_MONOLITHIC_0@__WXLIB_CORE_p = $(COND_MONOLITHIC_0___WXLIB_CORE_p)
+COND_MONOLITHIC_0___WXLIB_BASE_p = \
+	-lwx_base$(WXBASEPORT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)
+@COND_MONOLITHIC_0@__WXLIB_BASE_p = $(COND_MONOLITHIC_0___WXLIB_BASE_p)
+@COND_PLATFORM_WIN32_1@__anitest___win32rc = anitest_sample_rc.o
+COND_MONOLITHIC_1___WXLIB_MONO_p = \
+	-lwx_$(PORTNAME)$(WXUNIVNAME)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)
+@COND_MONOLITHIC_1@__WXLIB_MONO_p = $(COND_MONOLITHIC_1___WXLIB_MONO_p)
+@COND_USE_GUI_1_WXUSE_LIBTIFF_BUILTIN@__LIB_TIFF_p \
+@COND_USE_GUI_1_WXUSE_LIBTIFF_BUILTIN@	= \
+@COND_USE_GUI_1_WXUSE_LIBTIFF_BUILTIN@	-lwxtiff$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)
+@COND_USE_GUI_1_WXUSE_LIBJPEG_BUILTIN@__LIB_JPEG_p \
+@COND_USE_GUI_1_WXUSE_LIBJPEG_BUILTIN@	= \
+@COND_USE_GUI_1_WXUSE_LIBJPEG_BUILTIN@	-lwxjpeg$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)
+@COND_USE_GUI_1_WXUSE_LIBPNG_BUILTIN@__LIB_PNG_p \
+@COND_USE_GUI_1_WXUSE_LIBPNG_BUILTIN@	= \
+@COND_USE_GUI_1_WXUSE_LIBPNG_BUILTIN@	-lwxpng$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)
+@COND_WXUSE_ZLIB_BUILTIN@__LIB_ZLIB_p = \
+@COND_WXUSE_ZLIB_BUILTIN@	-lwxzlib$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)
+@COND_WXUSE_ODBC_BUILTIN@__LIB_ODBC_p = \
+@COND_WXUSE_ODBC_BUILTIN@	-lwxodbc$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)
+COND_WXUSE_REGEX_BUILTIN___LIB_REGEX_p = \
+	-lwxregex$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)
+@COND_WXUSE_REGEX_BUILTIN@__LIB_REGEX_p = $(COND_WXUSE_REGEX_BUILTIN___LIB_REGEX_p)
+@COND_WXUSE_EXPAT_BUILTIN@__LIB_EXPAT_p = \
+@COND_WXUSE_EXPAT_BUILTIN@	-lwxexpat$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)
+COND_TOOLKIT_MAC___MACOSX_RESOURCES_p_1 = $(REZ) -d __DARWIN__ -t APPL -d \
+	__WX$(TOOLKIT)__ $(__WXUNIV_DEFINE_p_1) $(__EXCEPTIONS_DEFINE_p_1) \
+	$(__RTTI_DEFINE_p_1) $(__THREAD_DEFINE_p_1) -i $(srcdir) $(__DLLFLAG_p_1) -i \
+	$(srcdir)/../../samples $(__RCDEFDIR_p) -i $(top_srcdir)/include -o \
+	anitest$(EXEEXT) Carbon.r sample.r
+@COND_TOOLKIT_MAC@__MACOSX_RESOURCES_p_1 = $(COND_TOOLKIT_MAC___MACOSX_RESOURCES_p_1)
+
+### Targets: ###
+
+all: anitest$(EXEEXT) $(__anitest_bundle___depname) catalog
+
+install: all
+
+uninstall: 
+
+install-strip: install
+
+clean: 
+	rm -rf ./.deps ./.pch
+	rm -f ./*.o
+	rm -f anitest$(EXEEXT)
+	rm -rf anitest.app
+
+distclean: clean
+	rm -f config.cache config.log config.status bk-deps bk-make-pch shared-ld-sh Makefile
+
+anitest$(EXEEXT): $(ANITEST_OBJECTS) $(__anitest___win32rc)
+	$(CXX) -o $@ $(ANITEST_OBJECTS) $(LDFLAGS)   -L$(LIBDIRNAME) $(LDFLAGS_GUI) $(SAMPLES_RPATH_FLAG)  $(LIBS) $(__WXLIB_ADV_p) $(PLUGIN_ADV_EXTRALIBS) $(__WXLIB_CORE_p)  $(__WXLIB_BASE_p)  $(__WXLIB_MONO_p) $(__LIB_TIFF_p) $(__LIB_JPEG_p) $(__LIB_PNG_p) $(EXTRALIBS_FOR_GUI) $(__LIB_ZLIB_p) $(__LIB_ODBC_p) $(__LIB_REGEX_p) $(__LIB_EXPAT_p) $(EXTRALIBS_FOR_BASE)
+	$(__anitest___mac_rezcmd)
+	$(__anitest___mac_setfilecmd)
+	$(__anitest___os2_emxbindcmd)
+	$(SAMPLES_RPATH_POSTLINK)
+
+anitest.app/Contents/PkgInfo: anitest$(EXEEXT) $(top_srcdir)/src/mac/carbon/Info.plist.in $(top_srcdir)/src/mac/carbon/wxmac.icns
+	mkdir -p anitest.app/Contents
+	mkdir -p anitest.app/Contents/MacOS
+	mkdir -p anitest.app/Contents/Resources
+	
+	
+	sed -e "s/IDENTIFIER/`echo $(srcdir) | sed -e 's,\.\./,,g' | sed -e 's,/,.,g'`/" \
+	-e "s/EXECUTABLE/anitest/" \
+	-e "s/VERSION/$(WX_VERSION)/" \
+	$(top_srcdir)/src/mac/carbon/Info.plist.in >anitest.app/Contents/Info.plist
+	
+	
+	echo -n "APPL????" >anitest.app/Contents/PkgInfo
+	
+	
+	ln -f anitest$(EXEEXT) anitest.app/Contents/MacOS/anitest
+	
+	
+	cp -f $(top_srcdir)/src/mac/carbon/wxmac.icns anitest.app/Contents/Resources/wxmac.icns
+
+@COND_PLATFORM_MACOSX_1@anitest_bundle: $(____anitest_BUNDLE_TGT_REF_DEP)
+
+catalog: 
+	@mkdir -p .
+	@for f in throbber.gif hourglass.ani; do \
+	if test ! -f ./$$f -a ! -d ./$$f ; \
+	then x=yep ; \
+	else x=`find $(srcdir)/$$f -newer ./$$f -print` ; \
+	fi; \
+	case "$$x" in ?*) \
+	cp -pRf $(srcdir)/$$f . ;; \
+	esac; \
+	done
+
+anitest_anitest.o: $(srcdir)/anitest.cpp
+	$(CXXC) -c -o $@ $(ANITEST_CXXFLAGS) $(srcdir)/anitest.cpp
+
+anitest_sample_rc.o: $(srcdir)/../sample.rc
+	$(WINDRES) -i$< -o$@   --define __WX$(TOOLKIT)__ $(__WXUNIV_DEFINE_p_2)  $(__EXCEPTIONS_DEFINE_p_2) $(__RTTI_DEFINE_p_2) $(__THREAD_DEFINE_p_2)   --include-dir $(srcdir) $(__DLLFLAG_p_2) --include-dir $(srcdir)/../../samples $(__RCDEFDIR_p_1) --include-dir $(top_srcdir)/include
+
+
+# Include dependency info, if present:
+@IF_GNU_MAKE@-include .deps/*.d
+
+.PHONY: all install uninstall clean distclean anitest_bundle catalog
diff --git a/samples/animate/anitest.bkl b/samples/animate/anitest.bkl
new file mode 100644
index 0000000000..27b4cc59c5
--- /dev/null
+++ b/samples/animate/anitest.bkl
@@ -0,0 +1,20 @@
+<?xml version="1.0" ?>
+<makefile>
+
+    <include file="../../../build/bakefiles/common_samples.bkl"/>
+
+    <exe id="anitest" template="wx_sample" template_append="wx_append">
+        <sources>
+            anitest.cpp
+        </sources>
+        <wx-lib>adv</wx-lib>
+        <wx-lib>core</wx-lib>
+        <wx-lib>base</wx-lib>
+        <win32-res>../sample.rc</win32-res>
+    </exe>
+
+    <wx-data id="catalog">
+        <files>throbber.gif hourglass.ani</files>
+    </wx-data>
+
+</makefile>
diff --git a/samples/animate/anitest.cpp b/samples/animate/anitest.cpp
new file mode 100644
index 0000000000..a75e0f0c08
--- /dev/null
+++ b/samples/animate/anitest.cpp
@@ -0,0 +1,266 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        anitest.cpp
+// Purpose:     Animation sample
+// Author:      Julian Smart
+// Modified by: Francesco Montorsi
+// Created:     02/07/2001
+// RCS-ID:      $Id$
+// Copyright:   (c) Julian Smart
+// Licence:     wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+// ===========================================================================
+// declarations
+// ===========================================================================
+
+// ---------------------------------------------------------------------------
+// headers
+// ---------------------------------------------------------------------------
+
+// For compilers that support precompilation, includes "wx/wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+    #pragma hdrstop
+#endif
+
+#ifndef WX_PRECOMP
+    #include "wx/wx.h"
+#endif
+
+#ifndef __WXMSW__
+    #include "mondrian.xpm"
+#endif
+
+#include "anitest.h"
+
+IMPLEMENT_APP(MyApp)
+
+// ---------------------------------------------------------------------------
+// global variables
+// ---------------------------------------------------------------------------
+
+// ---------------------------------------------------------------------------
+// event tables
+// ---------------------------------------------------------------------------
+
+enum
+{
+    wxID_PLAY
+};
+
+BEGIN_EVENT_TABLE(MyFrame, wxFrame)
+    EVT_MENU(wxID_PLAY, MyFrame::OnPlay)
+    EVT_MENU(wxID_STOP, MyFrame::OnStop)
+    EVT_MENU(wxID_ABOUT, MyFrame::OnAbout)
+    EVT_MENU(wxID_EXIT, MyFrame::OnQuit)
+#if wxUSE_FILEDLG
+    EVT_MENU(wxID_OPEN, MyFrame::OnOpen)
+#endif // wxUSE_FILEDLG
+
+    EVT_SIZE(MyFrame::OnSize)
+    EVT_UPDATE_UI(wxID_ANY, MyFrame::OnUpdateUI)
+END_EVENT_TABLE()
+
+// ===========================================================================
+// implementation
+// ===========================================================================
+
+// ---------------------------------------------------------------------------
+// MyApp
+// ---------------------------------------------------------------------------
+
+// Initialise this in OnInit, not statically
+bool MyApp::OnInit()
+{
+    // Create the main frame window
+
+    MyFrame* frame = new MyFrame((wxFrame *)NULL, -1, _T("Animation Demo"),
+                        wxPoint(-1, -1), wxSize(500, 400),
+                        wxDEFAULT_FRAME_STYLE);
+
+    // Give it an icon
+#ifdef __WXMSW__
+    frame->SetIcon(wxIcon(_T("mdi_icn")));
+#else
+    frame->SetIcon(wxIcon( mondrian_xpm ));
+#endif
+
+    // Make a menubar
+    wxMenu *file_menu = new wxMenu;
+
+#if wxUSE_FILEDLG
+    file_menu->Append(wxID_OPEN, _T("&Open Animation...\tCtrl+O"), _T("Loads an animation"));
+#endif // wxUSE_FILEDLG
+    file_menu->Append(wxID_EXIT);
+
+    wxMenu *play_menu = new wxMenu;
+    play_menu->Append(wxID_PLAY, _T("Play\tCtrl+P"), _T("Play the animation"));
+    play_menu->Append(wxID_STOP, _T("Stop\tCtrl+P"), _T("Stop the animation"));
+
+    wxMenu *help_menu = new wxMenu;
+    help_menu->Append(wxID_ABOUT);
+
+    wxMenuBar *menu_bar = new wxMenuBar;
+
+    menu_bar->Append(file_menu, _T("&File"));
+    menu_bar->Append(play_menu, _T("&Animation"));
+    menu_bar->Append(help_menu, _T("&Help"));
+
+    // Associate the menu bar with the frame
+    frame->SetMenuBar(menu_bar);
+
+#if wxUSE_STATUSBAR
+    frame->CreateStatusBar();
+#endif // wxUSE_STATUSBAR
+
+    frame->Show(true);
+
+    SetTopWindow(frame);
+
+    return true;
+}
+
+// ---------------------------------------------------------------------------
+// MyFrame
+// ---------------------------------------------------------------------------
+
+#include "wx/wfstream.h"
+
+// Define my frame constructor
+MyFrame::MyFrame(wxWindow *parent,
+                 const wxWindowID id,
+                 const wxString& title,
+                 const wxPoint& pos,
+                 const wxSize& size,
+                 const long style)
+       : wxFrame(parent, id, title, pos, size,
+                          style | wxNO_FULL_REPAINT_ON_RESIZE)
+{
+    //m_canvas = new MyCanvas(this, wxPoint(0, 0), wxDefaultSize);
+
+    //wxSizer *sz = new wxBoxSizer(wxVERTICAL);
+
+    m_animationCtrl = new wxAnimationCtrl(this, wxID_ANY, wxNullAnimation,
+                                          wxPoint(0,0),wxSize(100,100));
+    if (m_animationCtrl->LoadFile(wxT("throbber.gif")))
+        m_animationCtrl->Play();
+
+    //sz->Add(m_animationCtrl, 1, wxGROW);
+
+    //SetSizer(sz);
+}
+
+MyFrame::~MyFrame()
+{
+}
+
+void MyFrame::OnPlay(wxCommandEvent& WXUNUSED(event))
+{
+    if (!m_animationCtrl->Play())
+        wxLogError(wxT("Invalid animation"));
+}
+
+void MyFrame::OnStop(wxCommandEvent& WXUNUSED(event))
+{
+    m_animationCtrl->Stop();
+}
+
+void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
+{
+    Close();
+}
+
+void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event) )
+{
+    /*
+
+    FIXME: on wxGTK at least using File->About command it shows
+    the message dialog but does not focus it
+
+    */
+
+    (void)wxMessageBox(_T("wxWidgets 2 Animation Demo\n")
+                       _T("Author: Julian Smart (c) 2001\n"),
+                       _T("About Animation Demo"));
+}
+
+#if wxUSE_FILEDLG
+void MyFrame::OnOpen(wxCommandEvent& WXUNUSED(event))
+{
+    wxFileDialog dialog(this, _T("Please choose an animation"),
+                        wxEmptyString, wxEmptyString, wxT("*.gif;*.ani"), wxFD_OPEN);
+    if (dialog.ShowModal() == wxID_OK)
+    {
+        wxString filename(dialog.GetPath());
+
+        // enable one of the two chunk of codes to test different parts of wxAnimation/wxAnimationCtrl
+#if 0
+        if (m_animationCtrl->LoadFile(filename))
+            m_animationCtrl->Play();
+        else
+            wxMessageBox(_T("Sorry, this animation is not a valid format for wxAnimation."));
+#else
+    #if 0
+        wxAnimation temp;
+        if (!temp.LoadFile(filename))
+        {
+            wxLogError(wxT("Sorry, this animation is not a valid format for wxAnimation."));
+            return;
+        }
+
+        m_animationCtrl->SetAnimation(temp);
+        m_animationCtrl->Play();
+    #else
+        wxFileInputStream stream(filename);
+        if (!stream.Ok())
+        {
+            wxLogError(wxT("Sorry, this animation is not a valid format for wxAnimation."));
+            return;
+        }
+
+        wxAnimation temp;
+        if (!temp.Load(stream))
+        {
+            wxLogError(wxT("Sorry, this animation is not a valid format for wxAnimation."));
+            return;
+        }
+
+        m_animationCtrl->SetAnimation(temp);
+        m_animationCtrl->Play();
+    #endif
+#endif
+    }
+}
+#endif // wxUSE_FILEDLG
+
+void MyFrame::OnUpdateUI(wxUpdateUIEvent& WXUNUSED(event) )
+{
+    GetMenuBar()->FindItem(wxID_STOP)->Enable(m_animationCtrl->IsPlaying());
+    GetMenuBar()->FindItem(wxID_PLAY)->Enable(!m_animationCtrl->IsPlaying());
+}
+
+// ---------------------------------------------------------------------------
+// MyCanvas
+// ---------------------------------------------------------------------------
+
+BEGIN_EVENT_TABLE(MyCanvas, wxScrolledWindow)
+    //EVT_PAINT(MyCanvas::OnPaint)
+END_EVENT_TABLE()
+
+// Define a constructor for my canvas
+MyCanvas::MyCanvas(wxWindow *parent, const wxPoint& pos, const wxSize& size)
+        : wxScrolledWindow(parent, -1, pos, size,
+                           wxSUNKEN_BORDER |
+                           wxNO_FULL_REPAINT_ON_RESIZE |
+                           wxVSCROLL | wxHSCROLL)
+{
+    SetBackgroundColour(wxColour(_T("YELLOW")));
+}
+
+void MyCanvas::OnPaint(wxPaintEvent& WXUNUSED(event))
+{
+    //wxPaintDC dc(this);
+
+    //dc.DrawRotatedText(wxT("Background"),
+}
diff --git a/samples/animate/anitest.h b/samples/animate/anitest.h
new file mode 100644
index 0000000000..2a265afa4d
--- /dev/null
+++ b/samples/animate/anitest.h
@@ -0,0 +1,61 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        anitest.cpp
+// Purpose:     anitest sample
+// Author:      Julian Smart
+// Modified by:
+// Created:     02/07/2001
+// RCS-ID:      $Id$
+// Copyright:   (c) Julian Smart
+// Licence:     wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#include "wx/animate.h"
+
+// Define a new application
+class MyApp : public wxApp
+{
+public:
+    bool OnInit();
+};
+
+class MyCanvas : public wxScrolledWindow
+{
+public:
+    MyCanvas(wxWindow *parent, const wxPoint& pos, const wxSize& size);
+    void OnPaint(wxPaintEvent& event);
+
+private:
+    DECLARE_EVENT_TABLE()
+};
+
+// Define a new frame
+class MyFrame : public wxFrame
+{
+public:
+
+    MyFrame(wxWindow *parent, const wxWindowID id, const wxString& title,
+            const wxPoint& pos, const wxSize& size, const long style);
+    ~MyFrame();
+
+    void OnAbout(wxCommandEvent& event);
+    void OnQuit(wxCommandEvent& event);
+
+    void OnPlay(wxCommandEvent& event);
+    void OnStop(wxCommandEvent& event);
+
+    void OnUpdateUI(wxUpdateUIEvent& event);
+
+#if wxUSE_FILEDLG
+    void OnOpen(wxCommandEvent& event);
+#endif // wxUSE_FILEDLG
+
+    MyCanvas* GetCanvas() const { return m_canvas; }
+    wxAnimationCtrl* GetAnimationCtrl() const { return m_animationCtrl; }
+
+protected:
+    MyCanvas*           m_canvas;
+    wxAnimationCtrl*    m_animationCtrl;
+
+private:
+    DECLARE_EVENT_TABLE()
+};
diff --git a/samples/animate/anitest.rc b/samples/animate/anitest.rc
new file mode 100644
index 0000000000..7655c62a4c
--- /dev/null
+++ b/samples/animate/anitest.rc
@@ -0,0 +1,3 @@
+mondrian ICON "mondrian.ico"
+#include "wx/msw/wx.rc"
+
diff --git a/samples/animate/hourglass.ani b/samples/animate/hourglass.ani
new file mode 100644
index 0000000000000000000000000000000000000000..68d1a3125c7b4d227f467d374368dfc2a66b4a72
GIT binary patch
literal 45182
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

literal 0
HcmV?d00001

diff --git a/samples/animate/mondrian.ico b/samples/animate/mondrian.ico
new file mode 100644
index 0000000000000000000000000000000000000000..2310c5d275a87af295d5ea8dc79ea417a5e74c53
GIT binary patch
literal 766
zcmZQzU<5)11px*Sc)`TLAO@s0fLH;D9e|jTfdxnc0Z<M**w4TKL=5})Lnt5#WHKB$
zaDbtqp#doIAB-6O{|B*v7zjZ^AOa2W|NsACHyAJ}De?dRKnp(HN~rljcR;{k;{zQE
i@;}UZ|9Q?Fpp*~yJCwmWbLIrN`9Qm9%}2L?p!oo$cZ4ed

literal 0
HcmV?d00001

diff --git a/samples/animate/mondrian.xpm b/samples/animate/mondrian.xpm
new file mode 100644
index 0000000000..5d092d54c4
--- /dev/null
+++ b/samples/animate/mondrian.xpm
@@ -0,0 +1,44 @@
+/* XPM */
+static char *mondrian_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 6 1",
+"  c black",
+". c blue",
+"X c #00BF00",
+"o c red",
+"O c yellow",
+"+ c gray100",
+/* pixels */
+"                                ",
+" oooooo +++++++++++++++++++++++ ",
+" oooooo +++++++++++++++++++++++ ",
+" oooooo +++++++++++++++++++++++ ",
+" oooooo +++++++++++++++++++++++ ",
+" oooooo +++++++++++++++++++++++ ",
+" oooooo +++++++++++++++++++++++ ",
+" oooooo +++++++++++++++++++++++ ",
+"                                ",
+" ++++++ ++++++++++++++++++ .... ",
+" ++++++ ++++++++++++++++++ .... ",
+" ++++++ ++++++++++++++++++ .... ",
+" ++++++ ++++++++++++++++++ .... ",
+" ++++++ ++++++++++++++++++ .... ",
+" ++++++ ++++++++++++++++++      ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++                    ++++ ",
+" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
+" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
+" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
+" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
+" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
+" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
+"                                "
+};
diff --git a/samples/animate/throbber.gif b/samples/animate/throbber.gif
new file mode 100644
index 0000000000000000000000000000000000000000..82c2170accecbd27ed4d781a12a69e26b65f8641
GIT binary patch
literal 2704
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
Nt(EtWmIPqi{{az}4IBUf

literal 0
HcmV?d00001

diff --git a/samples/samples.bkl b/samples/samples.bkl
index 932d95063f..5cfa6bad12 100644
--- a/samples/samples.bkl
+++ b/samples/samples.bkl
@@ -10,6 +10,7 @@
 
     <!-- all samples are enumerated here: -->
     <subproject id="access" template="sub"/>
+    <subproject id="animate" template="sub"/>
     <subproject id="artprov" template="sub"/>
     <subproject id="calendar" template="sub"/>
     <subproject id="caret" template="sub"/>
diff --git a/setup.h.in b/setup.h.in
index 1e968bbc70..60df19067f 100644
--- a/setup.h.in
+++ b/setup.h.in
@@ -305,6 +305,7 @@
 
 #define wxUSE_TIPWINDOW    0
 
+#define wxUSE_ANIMATIONCTRL 0
 #define wxUSE_BUTTON        0
 #define wxUSE_BMPBUTTON     0
 #define wxUSE_CALENDARCTRL  0
diff --git a/src/common/anidecod.cpp b/src/common/anidecod.cpp
new file mode 100644
index 0000000000..61cfb664d5
--- /dev/null
+++ b/src/common/anidecod.cpp
@@ -0,0 +1,314 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        src/common/anidecod.cpp
+// Purpose:     wxANIDecoder, ANI reader for wxImage and wxAnimation
+// Author:      Francesco Montorsi
+// RCS-ID:      $Id$
+// Copyright:   (c) Francesco Montorsi
+// Licence:     wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+    #pragma hdrstop
+#endif
+
+#if wxUSE_STREAMS && wxUSE_GIF
+
+#ifndef WX_PRECOMP
+    #include "wx/palette.h"
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#include "wx/anidecod.h"
+
+// static
+wxCURHandler wxANIDecoder::sm_handler;
+
+
+
+//---------------------------------------------------------------------------
+// wxANIFrameInfo
+//---------------------------------------------------------------------------
+
+class wxANIFrameInfo
+{
+public:
+    wxANIFrameInfo(size_t delay = 0, int idx = -1) 
+        { m_delay=delay; m_imageIndex=idx; }
+
+    size_t m_delay;
+    int m_imageIndex;
+};
+
+#include <wx/arrimpl.cpp> // this is a magic incantation which must be done!
+WX_DEFINE_OBJARRAY(wxImageArray);
+
+#include <wx/arrimpl.cpp> // this is a magic incantation which must be done!
+WX_DEFINE_OBJARRAY(wxANIFrameInfoArray);
+
+
+
+
+//---------------------------------------------------------------------------
+// wxANIDecoder
+//---------------------------------------------------------------------------
+
+wxANIDecoder::wxANIDecoder()
+{
+}
+
+wxANIDecoder::~wxANIDecoder()
+{
+}
+
+bool wxANIDecoder::ConvertToImage(size_t frame, wxImage *image) const
+{
+    size_t idx = m_info[frame].m_imageIndex;
+    *image = m_images[idx];       // copy
+    return image->Ok();
+}
+
+
+//---------------------------------------------------------------------------
+// Data accessors
+//---------------------------------------------------------------------------
+
+wxSize wxANIDecoder::GetFrameSize(size_t WXUNUSED(frame)) const
+{
+    // all frames are of the same size...
+    return m_szAnimation;
+}
+
+wxPoint wxANIDecoder::GetFramePosition(size_t WXUNUSED(frame)) const
+{
+    // all frames are of the same size...
+    return wxPoint(0,0);
+}
+
+wxAnimationDisposal wxANIDecoder::GetDisposalMethod(size_t WXUNUSED(frame)) const
+{
+    // this disposal is implicit for all frames inside an ANI file
+    return wxANIM_TOBACKGROUND;
+}
+
+long wxANIDecoder::GetDelay(size_t frame) const
+{
+    return m_info[frame].m_delay;
+}
+
+
+//---------------------------------------------------------------------------
+// ANI reading and decoding
+//---------------------------------------------------------------------------
+
+bool wxANIDecoder::CanRead(wxInputStream& stream) const
+{
+    wxInt32 FCC1, FCC2;
+    wxUint32 datalen ;
+
+    wxInt32 riff32;
+    memcpy( &riff32, "RIFF", 4 );
+    wxInt32 list32;
+    memcpy( &list32, "LIST", 4 );
+    wxInt32 ico32;
+    memcpy( &ico32, "icon", 4 );
+    wxInt32 anih32;
+    memcpy( &anih32, "anih", 4 );
+
+    stream.SeekI(0);
+    if ( !stream.Read(&FCC1, 4) )
+        return false;
+
+    if ( FCC1 != riff32 )
+        return false;
+
+    // we have a riff file:
+    while ( stream.IsOk() )
+    {
+        if ( FCC1 == anih32 )
+            return true;        // found the ANIH chunk - this should be an ANI file
+
+        // we always have a data size:
+        stream.Read(&datalen, 4);
+        datalen = wxINT32_SWAP_ON_BE(datalen) ;
+        
+        // data should be padded to make even number of bytes
+        if (datalen % 2 == 1) datalen ++ ;
+
+        // now either data or a FCC:
+        if ( (FCC1 == riff32) || (FCC1 == list32) )
+        {
+            stream.Read(&FCC2, 4);
+        }
+        else
+        {
+            stream.SeekI(stream.TellI() + datalen);
+        }
+
+        // try to read next data chunk:
+        if ( !stream.Read(&FCC1, 4) )
+        {
+            // reading failed -- either EOF or IO error, bail out anyhow
+            return false;
+        }
+    }
+
+    return false;
+}
+
+// the "anih" RIFF chunk
+struct wxANIHeader 
+{
+    wxInt32 cbSizeOf;     // Num bytes in AniHeader (36 bytes)
+    wxInt32 cFrames;      // Number of unique Icons in this cursor
+    wxInt32 cSteps;       // Number of Blits before the animation cycles
+    wxInt32 cx;           // width of the frames
+    wxInt32 cy;           // height of the frames
+    wxInt32 cBitCount;    // bit depth
+    wxInt32 cPlanes;      // 1
+    wxInt32 JifRate;      // Default Jiffies (1/60th of a second) if rate chunk not present.
+    wxInt32 flags;        // Animation Flag (see AF_ constants)
+};
+
+bool wxANIDecoder::Load( wxInputStream& stream )
+{
+    wxInt32 FCC1, FCC2;
+    wxUint32 datalen;
+    size_t globaldelay=0;
+
+    wxInt32 riff32;
+    memcpy( &riff32, "RIFF", 4 );
+    wxInt32 list32;
+    memcpy( &list32, "LIST", 4 );
+    wxInt32 ico32;
+    memcpy( &ico32, "icon", 4 );
+    wxInt32 anih32;
+    memcpy( &anih32, "anih", 4 );
+    wxInt32 rate32;
+    memcpy( &rate32, "rate", 4 );
+    wxInt32 seq32;
+    memcpy( &seq32, "seq ", 4 );
+
+    stream.SeekI(0);
+    stream.Read(&FCC1, 4);
+    if ( FCC1 != riff32 )
+        return false;
+
+    m_nFrames = 0;
+    m_szAnimation = wxDefaultSize;
+
+    m_images.Clear();
+    m_info.Clear();
+
+    // we have a riff file:
+    while ( stream.IsOk() )
+    {
+        // we always have a data size:
+        stream.Read(&datalen, 4);
+        datalen = wxINT32_SWAP_ON_BE(datalen);
+
+        //data should be padded to make even number of bytes
+        if (datalen % 2 == 1) datalen++;
+
+        // now either data or a FCC:
+        if ( (FCC1 == riff32) || (FCC1 == list32) )
+        {
+            stream.Read(&FCC2, 4);
+        }
+        else if ( FCC1 == anih32 )
+        {
+            if ( datalen != sizeof(wxANIHeader) )
+                return false;
+
+            if (m_nFrames > 0)
+                return false;       // already parsed an ani header?
+
+            struct wxANIHeader header;
+            stream.Read(&header, sizeof(wxANIHeader));
+
+            // we should have a global frame size
+            m_szAnimation = wxSize(header.cx, header.cy);
+
+            // save interesting info from the header
+            m_nFrames = header.cSteps;   // NB: not cFrames!!
+            if (m_nFrames==0)
+                return false;
+
+            globaldelay = wxINT32_SWAP_ON_BE(header.JifRate) * 1000 / 60;
+
+            m_images.Alloc(header.cFrames);
+            m_info.Add(wxANIFrameInfo(), m_nFrames);
+        }
+        else if ( FCC1 == rate32 )
+        {
+            // did we already process the anih32 chunk?
+            if (m_nFrames == 0)
+                return false;       // rate chunks should always be placed after anih chunk
+            
+            wxASSERT(m_info.GetCount() == m_nFrames);
+            for (size_t i=0; i<m_nFrames; i++)
+            {
+                stream.Read(&FCC2, 4);
+                m_info[i].m_delay = wxINT32_SWAP_ON_BE(FCC2) * 1000 / 60;
+            }
+        }
+        else if ( FCC1 == seq32 )
+        {
+            // did we already process the anih32 chunk?
+            if (m_nFrames == 0)
+                return false;       // seq chunks should always be placed after anih chunk
+
+            wxASSERT(m_info.GetCount() == m_nFrames);
+            for (size_t i=0; i<m_nFrames; i++)
+            {
+                stream.Read(&FCC2, 4);
+                m_info[i].m_imageIndex = wxINT32_SWAP_ON_BE(FCC2);
+            }
+        }
+        else if ( FCC1 == ico32 )
+        {
+            // use DoLoadFile() and not LoadFile()!
+            wxImage image;
+            if (!sm_handler.DoLoadFile(&image, stream, false /* verbose */, -1))
+                return false;
+
+            m_images.Add(image);
+        }
+        else
+            stream.SeekI(stream.TellI() + datalen);
+
+        // try to read next data chunk:
+        stream.Read(&FCC1, 4);
+    }
+
+    if (m_nFrames==0)
+        return false;
+
+    if (m_nFrames==m_images.GetCount())
+    {
+        // if no SEQ chunk is available, display the frames in the order
+        // they were loaded
+        for (size_t i=0; i<m_nFrames; i++)
+            if (m_info[i].m_imageIndex == -1)
+                m_info[i].m_imageIndex = i;
+    }
+
+    // if some frame has an invalid delay, use the global delay given in the
+    // ANI header
+    for (size_t i=0; i<m_nFrames; i++)
+        if (m_info[i].m_delay == 0)
+            m_info[i].m_delay = globaldelay;
+
+    // if the header did not contain a valid frame size, try to grab
+    // it from the size of the first frame (all frames are of the same size)
+    if (m_szAnimation.GetWidth() == 0 ||
+        m_szAnimation.GetHeight() == 0)
+        m_szAnimation = wxSize(m_images[0].GetWidth(), m_images[0].GetHeight());
+
+    return m_szAnimation!=wxDefaultSize;
+}
+
+#endif // wxUSE_STREAMS && wxUSE_GIF
diff --git a/src/common/animatecmn.cpp b/src/common/animatecmn.cpp
new file mode 100644
index 0000000000..d3b69867f5
--- /dev/null
+++ b/src/common/animatecmn.cpp
@@ -0,0 +1,35 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        src/common/animatecmn.cpp
+// Purpose:     wxAnimation and wxAnimationCtrl
+// Author:      Francesco Montorsi
+// Modified By:
+// Created:     24/09/2006
+// Id:          $Id$
+// Copyright:   (c) Francesco Montorsi
+// Licence:     wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
+
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
+#if wxUSE_ANIMATIONCTRL
+
+#include "wx/animate.h"
+
+const wxChar wxAnimationCtrlNameStr[] = wxT("animationctrl");
+
+// global object
+wxAnimation wxNullAnimation;
+
+//wxIMPLEMENT_HANDLER_LIST_MANAGER(wxAnimation,
+IMPLEMENT_ABSTRACT_CLASS(wxAnimationBase, wxObject)
+IMPLEMENT_ABSTRACT_CLASS(wxAnimationCtrlBase, wxControl)
+
+
+
+#endif      // wxUSE_ANIMATIONCTRL
diff --git a/src/common/gifdecod.cpp b/src/common/gifdecod.cpp
index 93cccbabb8..ab507b8d7f 100644
--- a/src/common/gifdecod.cpp
+++ b/src/common/gifdecod.cpp
@@ -26,6 +26,34 @@
 #include "wx/gifdecod.h"
 
 
+
+//---------------------------------------------------------------------------
+// GIFImage
+//---------------------------------------------------------------------------
+
+// internal class for storing GIF image data
+class GIFImage
+{
+public:
+    // def ctor
+    GIFImage();
+
+    unsigned int w;                 /* width */
+    unsigned int h;                 /* height */
+    unsigned int left;              /* x coord (in logical screen) */
+    unsigned int top;               /* y coord (in logical screen) */
+    int transparent;                /* transparent color index (-1 = none) */
+    wxAnimationDisposal disposal;   /* disposal method */
+    long delay;                     /* delay in ms (-1 = unused) */
+    unsigned char *p;               /* bitmap */
+    unsigned char *pal;             /* palette */
+    unsigned int ncolours;          /* number of colours */
+
+    DECLARE_NO_COPY_CLASS(GIFImage)
+};
+
+
+
 //---------------------------------------------------------------------------
 // GIFImage constructor
 //---------------------------------------------------------------------------
@@ -36,33 +64,19 @@ GIFImage::GIFImage()
     left = 0;
     top = 0;
     transparent = 0;
-    disposal = 0;
+    disposal = wxANIM_DONOTREMOVE;
     delay = -1;
     p = (unsigned char *) NULL;
     pal = (unsigned char *) NULL;
     ncolours = 0;
-    next = (GIFImage *) NULL;
-    prev = (GIFImage *) NULL;
 }
 
 //---------------------------------------------------------------------------
 // wxGIFDecoder constructor and destructor
 //---------------------------------------------------------------------------
 
-wxGIFDecoder::wxGIFDecoder(wxInputStream *s, bool anim)
+wxGIFDecoder::wxGIFDecoder()
 {
-    m_f    = s;
-    m_anim = anim;
-
-    m_background = -1;
-    m_screenw = 0;
-    m_screenh = 0;
-
-    m_pimage  = NULL;
-    m_pfirst  = NULL;
-    m_plast   = NULL;
-    m_image   = 0;
-    m_nimages = 0;
 }
 
 wxGIFDecoder::~wxGIFDecoder()
@@ -72,24 +86,17 @@ wxGIFDecoder::~wxGIFDecoder()
 
 void wxGIFDecoder::Destroy()
 {
-    GIFImage *pimg, *paux;
-
-    pimg = m_pfirst;
-
-    while (pimg != NULL)
+    wxASSERT(m_nFrames==m_frames.GetCount());
+    for (size_t i=0; i<m_nFrames; i++)
     {
-        paux = pimg->next;
-        free(pimg->p);
-        free(pimg->pal);
-        delete pimg;
-        pimg = paux;
+        GIFImage *f = (GIFImage*)m_frames[i];
+        free(f->p);
+        free(f->pal);
+        delete f;
     }
 
-    m_pimage  = NULL;
-    m_pfirst  = NULL;
-    m_plast   = NULL;
-    m_image   = 0;
-    m_nimages = 0;
+    m_frames.Clear();
+    m_nFrames = 0;
 }
 
 
@@ -99,7 +106,7 @@ void wxGIFDecoder::Destroy()
 
 // This function was designed by Vaclav Slavik
 
-bool wxGIFDecoder::ConvertToImage(wxImage *image) const
+bool wxGIFDecoder::ConvertToImage(size_t frame, wxImage *image) const
 {
     unsigned char *src, *dst, *pal;
     unsigned long i;
@@ -109,20 +116,21 @@ bool wxGIFDecoder::ConvertToImage(wxImage *image) const
     image->Destroy();
 
     /* create the image */
-    image->Create(GetWidth(), GetHeight());
+    wxSize sz = GetFrameSize(frame);
+    image->Create(sz.GetWidth(), sz.GetHeight());
 
     if (!image->Ok())
         return false;
 
-    pal = GetPalette();
-    src = GetData();
+    pal = GetPalette(frame);
+    src = GetData(frame);
     dst = image->GetData();
-    transparent = GetTransparentColour();
+    transparent = GetTransparentColour(frame);
 
     /* set transparent colour mask */
     if (transparent != -1)
     {
-        for (i = 0; i < GetNcolours(); i++)
+        for (i = 0; i < GetNcolours(frame); i++)
         {
             if ((pal[3 * i + 0] == 255) &&
                 (pal[3 * i + 1] == 0) &&
@@ -153,11 +161,12 @@ bool wxGIFDecoder::ConvertToImage(wxImage *image) const
         b[i] = pal[3*i + 2];
     }
 
-    image->SetPalette(wxPalette(GetNcolours(), r, g, b));
+    image->SetPalette(wxPalette(GetNcolours(frame), r, g, b));
 #endif // wxUSE_PALETTE
 
     /* copy image data */
-    for (i = 0; i < (GetWidth() * GetHeight()); i++, src++)
+    unsigned long npixel = sz.GetWidth() * sz.GetHeight();
+    for (i = 0; i < npixel; i++, src++)
     {
         *(dst++) = pal[3 * (*src) + 0];
         *(dst++) = pal[3 * (*src) + 1];
@@ -172,118 +181,36 @@ bool wxGIFDecoder::ConvertToImage(wxImage *image) const
 // Data accessors
 //---------------------------------------------------------------------------
 
-// Get data for current frame
-
-int wxGIFDecoder::GetFrameIndex() const         { return m_image; }
-unsigned char* wxGIFDecoder::GetData() const    { return (m_pimage->p); }
-unsigned char* wxGIFDecoder::GetPalette() const { return (m_pimage->pal); }
-unsigned int wxGIFDecoder::GetNcolours() const  { return (m_pimage->ncolours); }
-unsigned int wxGIFDecoder::GetWidth() const     { return (m_pimage->w); }
-unsigned int wxGIFDecoder::GetHeight() const    { return (m_pimage->h); }
-unsigned int wxGIFDecoder::GetTop() const       { return (m_pimage->top); }
-unsigned int wxGIFDecoder::GetLeft() const      { return (m_pimage->left); }
-int wxGIFDecoder::GetTransparentColour() const  { return (m_pimage->transparent); }
-int wxGIFDecoder::GetDisposalMethod() const     { return (m_pimage->disposal); }
-long wxGIFDecoder::GetDelay() const             { return (m_pimage->delay); }
-
-// Get global data
-
-unsigned int wxGIFDecoder::GetLogicalScreenWidth() const    { return m_screenw; }
-unsigned int wxGIFDecoder::GetLogicalScreenHeight() const   { return m_screenh; }
-int wxGIFDecoder::GetBackgroundColour() const   { return m_background; }
-int wxGIFDecoder::GetNumberOfFrames() const     { return m_nimages; }
-bool wxGIFDecoder::IsAnimation() const          { return (m_nimages > 1); }
+#define GetFrame(n)     ((GIFImage*)m_frames[n])
 
 
-//---------------------------------------------------------------------------
-// Functions to move through the animation
-//---------------------------------------------------------------------------
+// Get data for current frame
 
-bool wxGIFDecoder::GoFirstFrame()
+wxSize wxGIFDecoder::GetFrameSize(size_t frame) const 
 {
-    if (!IsAnimation())
-        return false;
-
-    m_image = 1;
-    m_pimage = m_pfirst;
-    return true;
+    return wxSize(GetFrame(frame)->w, GetFrame(frame)->h);
 }
 
-bool wxGIFDecoder::GoLastFrame()
+wxPoint wxGIFDecoder::GetFramePosition(size_t frame) const
 {
-    if (!IsAnimation())
-        return false;
-
-    m_image = m_nimages;
-    m_pimage = m_plast;
-    return true;
+    return wxPoint(GetFrame(frame)->left, GetFrame(frame)->top);
 }
 
-bool wxGIFDecoder::GoNextFrame(bool cyclic)
+wxAnimationDisposal wxGIFDecoder::GetDisposalMethod(size_t frame) const
 {
-    if (!IsAnimation())
-        return false;
-
-    if ((m_image < m_nimages) || (cyclic))
-    {
-        m_pimage = m_pimage->next;
-        m_image++;
-
-        if (!m_pimage)
-        {
-            m_image = 1;
-            m_pimage = m_pfirst;
-        }
-
-        return true;
-    }
-    else
-        return false;
+    return GetFrame(frame)->disposal;
 }
 
-bool wxGIFDecoder::GoPrevFrame(bool cyclic)
+long wxGIFDecoder::GetDelay(size_t frame) const
 {
-    if (!IsAnimation())
-        return false;
-
-    if ((m_image > 1) || (cyclic))
-    {
-        m_pimage = m_pimage->prev;
-        m_image--;
-
-        if (!m_pimage)
-        {
-            m_image = m_nimages;
-            m_pimage = m_plast;
-        }
-
-        return true;
-    }
-    else
-        return false;
+    return GetFrame(frame)->delay;
 }
 
-bool wxGIFDecoder::GoFrame(int which)
-{
-    if (!IsAnimation())
-        return false;
+unsigned char* wxGIFDecoder::GetData(size_t frame) const    { return (GetFrame(frame)->p); }
+unsigned char* wxGIFDecoder::GetPalette(size_t frame) const { return (GetFrame(frame)->pal); }
+unsigned int wxGIFDecoder::GetNcolours(size_t frame) const  { return (GetFrame(frame)->ncolours); }
+int wxGIFDecoder::GetTransparentColour(size_t frame) const  { return (GetFrame(frame)->transparent); }
 
-    if ((which >= 1) && (which <= m_nimages))
-    {
-        m_image = 1;
-        m_pimage = m_pfirst;
-
-        while (m_image < which)
-        {
-            m_image++;
-            m_pimage = m_pimage->next;
-        }
-
-        return true;
-    }
-    else
-        return false;
-}
 
 
 //---------------------------------------------------------------------------
@@ -293,12 +220,11 @@ bool wxGIFDecoder::GoFrame(int which)
 // getcode:
 //  Reads the next code from the file stream, with size 'bits'
 //
-int wxGIFDecoder::getcode(int bits, int ab_fin)
+int wxGIFDecoder::getcode(wxInputStream& stream, int bits, int ab_fin)
 {
     unsigned int mask;          /* bit mask */
     unsigned int code;          /* code (result) */
 
-
     /* get remaining bits from last byte read */
     mask = (1 << bits) - 1;
     code = (m_lastbyte >> (8 - m_restbits)) & mask;
@@ -309,7 +235,7 @@ int wxGIFDecoder::getcode(int bits, int ab_fin)
         /* if no bytes left in this block, read the next block */
         if (m_restbyte == 0)
         {
-            m_restbyte = (unsigned char)m_f->GetC();
+            m_restbyte = (unsigned char)stream.GetC();
 
             /* Some encoders are a bit broken: instead of issuing
              * an end-of-image symbol (ab_fin) they come up with
@@ -323,8 +249,8 @@ int wxGIFDecoder::getcode(int bits, int ab_fin)
             }
 
             /* prefetch data */
-            m_f->Read((void *) m_buffer, m_restbyte);
-            if (m_f->LastRead() != m_restbyte)
+            stream.Read((void *) m_buffer, m_restbyte);
+            if (stream.LastRead() != m_restbyte)
             {
                 code = ab_fin;
                 return code;
@@ -354,7 +280,7 @@ int wxGIFDecoder::getcode(int bits, int ab_fin)
 //  is 'bits'. Supports interlaced images (interl == 1).
 //  Returns wxGIF_OK (== 0) on success, or an error code if something
 // fails (see header file for details)
-int wxGIFDecoder::dgif(GIFImage *img, int interl, int bits)
+wxGIFErrorCode wxGIFDecoder::dgif(wxInputStream& stream, GIFImage *img, int interl, int bits)
 {
     static const int allocSize = 4096 + 1;
     int *ab_prefix = new int[allocSize]; /* alphabet (prefixes) */
@@ -410,7 +336,7 @@ int wxGIFDecoder::dgif(GIFImage *img, int interl, int bits)
     do
     {
         /* get next code */
-        readcode = code = getcode(ab_bits, ab_fin);
+        readcode = code = getcode(stream, ab_bits, ab_fin);
 
         /* end of image? */
         if (code == ab_fin) break;
@@ -629,20 +555,20 @@ as an End of Information itself)
 // CanRead:
 //  Returns true if the file looks like a valid GIF, false otherwise.
 //
-bool wxGIFDecoder::CanRead()
+bool wxGIFDecoder::CanRead(wxInputStream &stream) const
 {
     unsigned char buf[3];
 
-    if ( !m_f->Read(buf, WXSIZEOF(buf)) )
+    if ( !stream.Read(buf, WXSIZEOF(buf)) )
         return false;
 
-    m_f->SeekI(-(wxFileOffset)WXSIZEOF(buf), wxFromCurrent);
+    stream.SeekI(-(wxFileOffset)WXSIZEOF(buf), wxFromCurrent);
 
     return memcmp(buf, "GIF", WXSIZEOF(buf)) == 0;
 }
 
 
-// ReadGIF:
+// LoadGIF:
 //  Reads and decodes one or more GIF images, depending on whether
 //  animated GIF support is enabled. Can read GIFs with any bit
 //  size (color depth), but the output images are always expanded
@@ -651,48 +577,48 @@ bool wxGIFDecoder::CanRead()
 //  (== 0) on success, or an error code if something fails (see
 //  header file for details)
 //
-int wxGIFDecoder::ReadGIF()
+wxGIFErrorCode wxGIFDecoder::LoadGIF(wxInputStream& stream)
 {
     unsigned int  global_ncolors = 0;
-    int           bits, interl, transparent, disposal, i;
+    int           bits, interl, transparent, i;
+    wxAnimationDisposal disposal;
     long          size;
     long          delay;
     unsigned char type = 0;
     unsigned char pal[768];
     unsigned char buf[16];
-    GIFImage      **ppimg;
-    GIFImage      *pimg, *pprev;
+    bool anim = true;
 
     /* check GIF signature */
-    if (!CanRead())
+    if (!CanRead(stream))
         return wxGIF_INVFORMAT;
 
     /* check for animated GIF support (ver. >= 89a) */
 
     static const size_t headerSize = (3 + 3);
-    m_f->Read(buf, headerSize);
-    if (m_f->LastRead() != headerSize)
+    stream.Read(buf, headerSize);
+    if (stream.LastRead() != headerSize)
     {
         return wxGIF_INVFORMAT;
     }
 
     if (memcmp(buf + 3, "89a", 3) < 0)
     {
-        m_anim = false;
+        anim = false;
     }
 
     /* read logical screen descriptor block (LSDB) */
     static const size_t lsdbSize = (2 + 2 + 1 + 1 + 1);
-    m_f->Read(buf, lsdbSize);
-    if (m_f->LastRead() != lsdbSize)
+    stream.Read(buf, lsdbSize);
+    if (stream.LastRead() != lsdbSize)
     {
         return wxGIF_INVFORMAT;
     }
 
-    m_screenw = buf[0] + 256 * buf[1];
-    m_screenh = buf[2] + 256 * buf[3];
+    m_szAnimation.SetWidth( buf[0] + 256 * buf[1] );
+    m_szAnimation.SetHeight( buf[2] + 256 * buf[3] );
 
-    if ((m_screenw == 0) || (m_screenh == 0))
+    if ((m_szAnimation.GetWidth() == 0) || (m_szAnimation.GetHeight() == 0))
     {
         return wxGIF_INVFORMAT;
     }
@@ -700,32 +626,30 @@ int wxGIFDecoder::ReadGIF()
     /* load global color map if available */
     if ((buf[4] & 0x80) == 0x80)
     {
-        m_background = buf[5];
+        int backgroundColIndex = buf[5];
 
         global_ncolors = 2 << (buf[4] & 0x07);
         size_t numBytes = 3 * global_ncolors;
-        m_f->Read(pal, numBytes);
-        if (m_f->LastRead() != numBytes)
+        stream.Read(pal, numBytes);
+        if (stream.LastRead() != numBytes)
         {
             return wxGIF_INVFORMAT;
         }
+
+        m_background.Set(pal[backgroundColIndex*3 + 0],
+                         pal[backgroundColIndex*3 + 1],
+                         pal[backgroundColIndex*3 + 2]);
     }
 
     /* transparent colour, disposal method and delay default to unused */
     transparent = -1;
-    disposal = -1;
+    disposal = wxANIM_UNSPECIFIED;
     delay = -1;
 
-    /* read images */
-    ppimg = &m_pfirst;
-    pprev = NULL;
-    pimg  = NULL;
-
     bool done = false;
-
     while (!done)
     {
-        type = (unsigned char)m_f->GetC();
+        type = (unsigned char)stream.GetC();
 
         /*
         If the end of file has been reached (or an error) and a ";"
@@ -735,7 +659,7 @@ int wxGIFDecoder::ReadGIF()
         be decoded as far as possible). returning wxGIF_TRUNCATED is not
         possible here since some init code is done after this loop.
         */
-        if (m_f->Eof())// || !m_f->IsOk())
+        if (stream.Eof())// || !stream.IsOk())
         {
             /*
             type is set to some bogus value, so there's no
@@ -753,12 +677,12 @@ int wxGIFDecoder::ReadGIF()
         /* extension block? */
         if (type == 0x21)
         {
-            if (((unsigned char)m_f->GetC()) == 0xF9)
+            if (((unsigned char)stream.GetC()) == 0xF9)
             /* graphics control extension, parse it */
             {
                 static const size_t gceSize = 6;
-                m_f->Read(buf, gceSize);
-                if (m_f->LastRead() != gceSize)
+                stream.Read(buf, gceSize);
+                if (stream.LastRead() != gceSize)
                 {
                     Destroy();
                     return wxGIF_INVFORMAT;
@@ -772,15 +696,15 @@ int wxGIFDecoder::ReadGIF()
                     transparent = buf[4];
 
                 /* read disposal method */
-                disposal = ((buf[1] & 0x1C) >> 2) - 1;
+                disposal = (wxAnimationDisposal)(((buf[1] & 0x1C) >> 2) - 1);
             }
             else
             /* other extension, skip */
             {
-                while ((i = (unsigned char)m_f->GetC()) != 0)
+                while ((i = (unsigned char)stream.GetC()) != 0)
                 {
-                    m_f->SeekI(i, wxFromCurrent);
-                    if (m_f->Eof())
+                    stream.SeekI(i, wxFromCurrent);
+                    if (stream.Eof())
                     {
                         done = true;
                         break;
@@ -793,7 +717,7 @@ int wxGIFDecoder::ReadGIF()
         if (type == 0x2C)
         {
             /* allocate memory for IMAGEN struct */
-            pimg = (*ppimg) = new GIFImage();
+            GIFImage *pimg = new GIFImage();
 
             if (pimg == NULL)
             {
@@ -803,8 +727,8 @@ int wxGIFDecoder::ReadGIF()
 
             /* fill in the data */
             static const size_t idbSize = (2 + 2 + 2 + 2 + 1);
-            m_f->Read(buf, idbSize);
-            if (m_f->LastRead() != idbSize)
+            stream.Read(buf, idbSize);
+            if (stream.LastRead() != idbSize)
             {
                 Destroy();
                 return wxGIF_INVFORMAT;
@@ -819,7 +743,8 @@ int wxGIFDecoder::ReadGIF()
             pimg->w = buf[4] + 256 * buf[5];
             pimg->h = buf[6] + 256 * buf[7];
 
-            if ((pimg->w == 0) || (pimg->w > m_screenw) || (pimg->h == 0) || (pimg->h > m_screenh))
+            if ((pimg->w == 0) || (pimg->w > (unsigned int)m_szAnimation.GetWidth()) || 
+                (pimg->h == 0) || (pimg->h > (unsigned int)m_szAnimation.GetHeight()))
             {
                 Destroy();
                 return wxGIF_INVFORMAT;
@@ -831,10 +756,6 @@ int wxGIFDecoder::ReadGIF()
             pimg->transparent = transparent;
             pimg->disposal = disposal;
             pimg->delay = delay;
-            pimg->next = NULL;
-            pimg->prev = pprev;
-            pprev = pimg;
-            ppimg = &pimg->next;
 
             /* allocate memory for image and palette */
             pimg->p   = (unsigned char *) malloc((size_t)size);
@@ -851,9 +772,9 @@ int wxGIFDecoder::ReadGIF()
             {
                 unsigned int local_ncolors = 2 << (buf[8] & 0x07);
                 size_t numBytes = 3 * local_ncolors;
-                m_f->Read(pimg->pal, numBytes);
+                stream.Read(pimg->pal, numBytes);
                 pimg->ncolours = local_ncolors;
-                if (m_f->LastRead() != numBytes)
+                if (stream.LastRead() != numBytes)
                 {
                     Destroy();
                     return wxGIF_INVFORMAT;
@@ -866,7 +787,7 @@ int wxGIFDecoder::ReadGIF()
             }
 
             /* get initial code size from first byte in raster data */
-            bits = (unsigned char)m_f->GetC();
+            bits = (unsigned char)stream.GetC();
             if (bits == 0)
             {
                 Destroy();
@@ -874,56 +795,54 @@ int wxGIFDecoder::ReadGIF()
             }
 
             /* decode image */
-            int result = dgif(pimg, interl, bits);
+            wxGIFErrorCode result = dgif(stream, pimg, interl, bits);
             if (result != wxGIF_OK)
             {
                 Destroy();
                 return result;
             }
-            m_nimages++;
+
+            /* add the image to our frame array */
+            m_frames.Add((void*)pimg);
+            m_nFrames++;
 
             /* if this is not an animated GIF, exit after first image */
-            if (!m_anim)
+            if (!anim)
                 done = true;
         }
     }
 
-    if (m_nimages <= 0)
+    if (m_nFrames <= 0)
     {
         Destroy();
         return wxGIF_INVFORMAT;
     }
 
-    /* setup image pointers */
-    m_image = 1;
-    m_plast = pimg;
-    m_pimage = m_pfirst;
-
     /* try to read to the end of the stream */
     while (type != 0x3B)
     {
-        if (!m_f->IsOk())
+        if (!stream.IsOk())
             return wxGIF_TRUNCATED;
 
-        type = (unsigned char)m_f->GetC();
+        type = (unsigned char)stream.GetC();
 
         if (type == 0x21)
         {
             /* extension type */
-            (void) m_f->GetC();
+            (void) stream.GetC();
 
             /* skip all data */
-            while ((i = (unsigned char)m_f->GetC()) != 0)
+            while ((i = (unsigned char)stream.GetC()) != 0)
             {
-                m_f->SeekI(i, wxFromCurrent);
+                stream.SeekI(i, wxFromCurrent);
             }
         }
         else if (type == 0x2C)
         {
             /* image descriptor block */
             static const size_t idbSize = (2 + 2 + 2 + 2 + 1);
-            m_f->Read(buf, idbSize);
-            if (m_f->LastRead() != idbSize)
+            stream.Read(buf, idbSize);
+            if (stream.LastRead() != idbSize)
             {
                 Destroy();
                 return wxGIF_INVFORMAT;
@@ -933,10 +852,10 @@ int wxGIFDecoder::ReadGIF()
             if ((buf[8] & 0x80) == 0x80)
             {
                 unsigned int local_ncolors = 2 << (buf[8] & 0x07);
-                wxFileOffset pos = m_f->TellI();
+                wxFileOffset pos = stream.TellI();
                 wxFileOffset numBytes = 3 * local_ncolors;
-                m_f->SeekI(numBytes, wxFromCurrent);
-                if (m_f->TellI() != (pos + numBytes))
+                stream.SeekI(numBytes, wxFromCurrent);
+                if (stream.TellI() != (pos + numBytes))
                 {
                     Destroy();
                     return wxGIF_INVFORMAT;
@@ -944,12 +863,12 @@ int wxGIFDecoder::ReadGIF()
             }
 
             /* initial code size */
-            (void) m_f->GetC();
+            (void) stream.GetC();
 
             /* skip all data */
-            while ((i = (unsigned char)m_f->GetC()) != 0)
+            while ((i = (unsigned char)stream.GetC()) != 0)
             {
-                m_f->SeekI(i, wxFromCurrent);
+                stream.SeekI(i, wxFromCurrent);
             }
         }
         else if ((type != 0x3B) && (type != 00)) /* testing */
diff --git a/src/common/imagbmp.cpp b/src/common/imagbmp.cpp
index c2e8e6599f..5f45ba9207 100644
--- a/src/common/imagbmp.cpp
+++ b/src/common/imagbmp.cpp
@@ -32,6 +32,7 @@
 #include "wx/filefn.h"
 #include "wx/wfstream.h"
 #include "wx/quantize.h"
+#include "wx/anidecod.h"
 
 // For memcpy
 #include <string.h>
@@ -1324,160 +1325,28 @@ IMPLEMENT_DYNAMIC_CLASS(wxANIHandler, wxCURHandler)
 #if wxUSE_STREAMS
 
 bool wxANIHandler::LoadFile(wxImage *image, wxInputStream& stream,
-                            bool verbose, int index)
+                            bool WXUNUSED(verbose), int index)
 {
-    wxInt32 FCC1, FCC2;
-    wxUint32 datalen;
-
-    wxInt32 riff32;
-    memcpy( &riff32, "RIFF", 4 );
-    wxInt32 list32;
-    memcpy( &list32, "LIST", 4 );
-    wxInt32 ico32;
-    memcpy( &ico32, "icon", 4 );
-    int iIcon = 0;
-
-    stream.SeekI(0);
-    stream.Read(&FCC1, 4);
-    if ( FCC1 != riff32 )
+    wxANIDecoder decoder;
+    if (!decoder.Load(stream))
         return false;
 
-    // we have a riff file:
-    while (stream.IsOk())
-    {
-        // we always have a data size
-        stream.Read(&datalen, 4);
-        datalen = wxINT32_SWAP_ON_BE(datalen) ;
-        //data should be padded to make even number of bytes
-        if (datalen % 2 == 1) datalen ++ ;
-        //now either data or a FCC
-        if ( (FCC1 == riff32) || (FCC1 == list32) )
-        {
-            stream.Read(&FCC2, 4);
-        }
-        else
-        {
-            if (FCC1 == ico32 && iIcon >= index)
-            {
-                return DoLoadFile(image, stream, verbose, -1);
-            }
-            else
-            {
-                stream.SeekI(stream.TellI() + datalen);
-                if ( FCC1 == ico32 )
-                    iIcon ++;
-            }
-        }
-
-        // try to read next data chunk:
-        stream.Read(&FCC1, 4);
-    }
-    return false;
+    return decoder.ConvertToImage(index != -1 ? (size_t)index : 0, image);
 }
 
 bool wxANIHandler::DoCanRead(wxInputStream& stream)
 {
-    wxInt32 FCC1, FCC2;
-    wxUint32 datalen ;
-
-    wxInt32 riff32;
-    memcpy( &riff32, "RIFF", 4 );
-    wxInt32 list32;
-    memcpy( &list32, "LIST", 4 );
-    wxInt32 ico32;
-    memcpy( &ico32, "icon", 4 );
-    wxInt32 anih32;
-    memcpy( &anih32, "anih", 4 );
-
-    stream.SeekI(0);
-    if ( !stream.Read(&FCC1, 4) )
-        return false;
-
-    if ( FCC1 != riff32 )
-        return false;
-
-    // we have a riff file:
-    while ( stream.IsOk() )
-    {
-        if ( FCC1 == anih32 )
-            return true;
-        // we always have a data size:
-        stream.Read(&datalen, 4);
-        datalen = wxINT32_SWAP_ON_BE(datalen) ;
-        //data should be padded to make even number of bytes
-        if (datalen % 2 == 1) datalen ++ ;
-        // now either data or a FCC:
-        if ( (FCC1 == riff32) || (FCC1 == list32) )
-        {
-            stream.Read(&FCC2, 4);
-        }
-        else
-        {
-            stream.SeekI(stream.TellI() + datalen);
-        }
-
-        // try to read next data chunk:
-        if ( !stream.Read(&FCC1, 4) )
-        {
-            // reading failed -- either EOF or IO error, bail out anyhow
-            return false;
-        }
-    }
-
-    return false;
+    wxANIDecoder decod;
+    return decod.CanRead(stream);
 }
 
 int wxANIHandler::GetImageCount(wxInputStream& stream)
 {
-    wxInt32 FCC1, FCC2;
-    wxUint32 datalen ;
-
-    wxInt32 riff32;
-    memcpy( &riff32, "RIFF", 4 );
-    wxInt32 list32;
-    memcpy( &list32, "LIST", 4 );
-    wxInt32 ico32;
-    memcpy( &ico32, "icon", 4 );
-    wxInt32 anih32;
-    memcpy( &anih32, "anih", 4 );
-
-    stream.SeekI(0);
-    stream.Read(&FCC1, 4);
-    if ( FCC1 != riff32 )
+    wxANIDecoder decoder;
+    if (!decoder.Load(stream))
         return wxNOT_FOUND;
 
-    // we have a riff file:
-    while ( stream.IsOk() )
-    {
-        // we always have a data size:
-        stream.Read(&datalen, 4);
-        datalen = wxINT32_SWAP_ON_BE(datalen) ;
-        //data should be padded to make even number of bytes
-        if (datalen % 2 == 1) datalen ++ ;
-        // now either data or a FCC:
-        if ( (FCC1 == riff32) || (FCC1 == list32) )
-        {
-            stream.Read(&FCC2, 4);
-        }
-        else
-        {
-            if ( FCC1 == anih32 )
-            {
-                wxUint32 *pData = new wxUint32[datalen/4];
-                stream.Read(pData, datalen);
-                int nIcons = wxINT32_SWAP_ON_BE(*(pData + 1));
-                delete[] pData;
-                return nIcons;
-            }
-            else
-                stream.SeekI(stream.TellI() + datalen);
-        }
-
-        // try to read next data chunk:
-        stream.Read(&FCC1, 4);
-    }
-
-    return wxNOT_FOUND;
+    return decoder.GetFrameCount();
 }
 
 #endif // wxUSE_STREAMS
diff --git a/src/common/imaggif.cpp b/src/common/imaggif.cpp
index 69a0fbb094..22a8dc04cc 100644
--- a/src/common/imaggif.cpp
+++ b/src/common/imaggif.cpp
@@ -37,12 +37,12 @@ bool wxGIFHandler::LoadFile(wxImage *image, wxInputStream& stream,
                             bool verbose, int index)
 {
     wxGIFDecoder *decod;
-    int error;
+    wxGIFErrorCode error;
     bool ok = true;
 
 //    image->Destroy();
-    decod = new wxGIFDecoder(&stream, true);
-    error = decod->ReadGIF();
+    decod = new wxGIFDecoder();
+    error = decod->LoadGIF(stream);
 
     if ((error != wxGIF_OK) && (error != wxGIF_TRUNCATED))
     {
@@ -71,24 +71,9 @@ bool wxGIFHandler::LoadFile(wxImage *image, wxInputStream& stream,
         /* go on; image data is OK */
     }
 
-    if (index != -1)
-    {
-        // We're already on index = 0 by default. So no need
-        // to call GoFrame(0) then. On top of that GoFrame doesn't
-        // accept an index of 0. (Instead GoFirstFrame() should be used)
-        // Also if the gif image has only one frame, calling GoFrame(0)
-        // fails because GoFrame() only works with gif animations.
-        // (It fails if IsAnimation() returns false)
-        // All valid reasons to NOT call GoFrame when index equals 0.
-        if (index != 0)
-        {
-            ok = decod->GoFrame(index);
-        }
-    }
-
     if (ok)
     {
-        ok = decod->ConvertToImage(image);
+        ok = decod->ConvertToImage(index != -1 ? (size_t)index : 0, image);
     }
     else
     {
@@ -111,8 +96,8 @@ bool wxGIFHandler::SaveFile( wxImage * WXUNUSED(image),
 
 bool wxGIFHandler::DoCanRead( wxInputStream& stream )
 {
-    wxGIFDecoder decod(&stream);
-    return decod.CanRead();
+    wxGIFDecoder decod;
+    return decod.CanRead(stream);
 }
 
 #endif  // wxUSE_STREAMS
diff --git a/src/generic/animateg.cpp b/src/generic/animateg.cpp
new file mode 100644
index 0000000000..2ab49659dd
--- /dev/null
+++ b/src/generic/animateg.cpp
@@ -0,0 +1,549 @@
+///////////////////////////////////////////////////////////////////////////////
+// Name:        animateg.cpp
+// Purpose:     wxAnimation and wxAnimationCtrl
+// Author:      Julian Smart and Guillermo Rodriguez Garcia
+// Modified by: Francesco Montorsi
+// Created:     13/8/99
+// RCS-ID:      $Id$
+// Copyright:   (c) Julian Smart and Guillermo Rodriguez Garcia
+// Licence:     wxWindows licence
+///////////////////////////////////////////////////////////////////////////////
+
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+  #pragma hdrstop
+#endif  //__BORLANDC__
+
+
+#if wxUSE_ANIMATIONCTRL
+
+#include "wx/log.h"
+#include "wx/wfstream.h"
+#include "wx/image.h"
+#include "wx/gifdecod.h"
+#include "wx/anidecod.h"
+#include "wx/dcmemory.h"
+#include "wx/dc.h"
+#include "wx/dcclient.h"
+#include "wx/animate.h"
+#include "wx/animdecod.h"
+
+
+#include <wx/listimpl.cpp>
+WX_DEFINE_LIST(wxAnimationDecoderList);
+
+wxAnimationDecoderList wxAnimation::sm_handlers;
+
+
+
+// ----------------------------------------------------------------------------
+// wxAnimation
+// ----------------------------------------------------------------------------
+
+IMPLEMENT_DYNAMIC_CLASS(wxAnimation, wxAnimationBase)
+#define M_ANIMDATA      wx_static_cast(wxAnimationDecoder*, m_refData)
+
+wxSize wxAnimation::GetSize() const
+{
+    wxCHECK_MSG( IsOk(), wxDefaultSize, wxT("invalid animation") );
+
+    return M_ANIMDATA->GetAnimationSize();
+}
+
+size_t wxAnimation::GetFrameCount() const
+{
+    wxCHECK_MSG( IsOk(), 0, wxT("invalid animation") );
+
+    return M_ANIMDATA->GetFrameCount();
+}
+
+wxImage wxAnimation::GetFrame(size_t i) const
+{
+    wxCHECK_MSG( IsOk(), wxNullImage, wxT("invalid animation") );
+
+    wxImage ret;
+    if (!M_ANIMDATA->ConvertToImage(i, &ret))
+        return wxNullImage;
+    return ret;
+}
+
+int wxAnimation::GetDelay(size_t i) const
+{
+    wxCHECK_MSG( IsOk(), 0, wxT("invalid animation") );
+
+    return M_ANIMDATA->GetDelay(i);
+}
+
+wxPoint wxAnimation::GetFramePosition(size_t frame) const
+{
+    wxCHECK_MSG( IsOk(), wxDefaultPosition, wxT("invalid animation") );
+
+    return M_ANIMDATA->GetFramePosition(frame);
+}
+
+wxAnimationDisposal wxAnimation::GetDisposalMethod(size_t frame) const
+{
+    wxCHECK_MSG( IsOk(), wxANIM_UNSPECIFIED, wxT("invalid animation") );
+
+    return M_ANIMDATA->GetDisposalMethod(frame);
+}
+
+wxColour wxAnimation::GetBackgroundColour() const
+{
+    wxCHECK_MSG( IsOk(), wxNullColour, wxT("invalid animation") );
+
+    return M_ANIMDATA->GetBackgroundColour();
+}
+
+bool wxAnimation::LoadFile(const wxString& filename, wxAnimationType type)
+{
+    wxFileInputStream stream(filename);
+    if (!stream.Ok())
+        return false;
+
+    return Load(stream, type);
+}
+
+bool wxAnimation::Load(wxInputStream &stream, wxAnimationType type)
+{
+    UnRef();
+
+    const wxAnimationDecoder *handler;
+    if ( type == wxANIMATION_TYPE_ANY )
+    {
+        for ( wxAnimationDecoderList::compatibility_iterator node = sm_handlers.GetFirst(); 
+              node; node = node->GetNext() )
+        {
+            handler=(const wxAnimationDecoder*)node->GetData();
+
+            if ( handler->CanRead(stream) )
+            {
+                // do a copy of the handler from the static list which we will own
+                // as our reference data
+                m_refData = handler->Clone();
+                return M_ANIMDATA->Load(stream);
+            }
+
+        }
+
+        wxLogWarning( _("No handler found for animation type.") );
+        return false;
+    }
+
+    handler = FindHandler(type);
+
+    // do a copy of the handler from the static list which we will own
+    // as our reference data
+    m_refData = handler->Clone();
+
+    if (handler == NULL)
+    {
+        wxLogWarning( _("No animation handler for type %ld defined."), type );
+
+        return false;
+    }
+
+    if (stream.IsSeekable() && !M_ANIMDATA->CanRead(stream))
+    {
+        wxLogError(_("Animation file is not of type %ld."), type);
+        return false;
+    }
+    else
+        return M_ANIMDATA->Load(stream);
+}
+
+
+// ----------------------------------------------------------------------------
+// animation decoders
+// ----------------------------------------------------------------------------
+
+void wxAnimation::AddHandler( wxAnimationDecoder *handler )
+{
+    // Check for an existing handler of the type being added.
+    if (FindHandler( handler->GetType() ) == 0)
+    {
+        sm_handlers.Append( handler );
+    }
+    else
+    {
+        // This is not documented behaviour, merely the simplest 'fix'
+        // for preventing duplicate additions.  If someone ever has
+        // a good reason to add and remove duplicate handlers (and they
+        // may) we should probably refcount the duplicates.
+        //   also an issue in InsertHandler below.
+
+        wxLogDebug( _T("Adding duplicate animation handler for '%d' type"),
+                    handler->GetType() );
+        delete handler;
+    }
+}
+
+void wxAnimation::InsertHandler( wxAnimationDecoder *handler )
+{
+    // Check for an existing handler of the type being added.
+    if (FindHandler( handler->GetType() ) == 0)
+    {
+        sm_handlers.Insert( handler );
+    }
+    else
+    {
+        // see AddHandler for additional comments.
+        wxLogDebug( _T("Inserting duplicate animation handler for '%d' type"),
+                    handler->GetType() );
+        delete handler;
+    }
+}
+
+const wxAnimationDecoder *wxAnimation::FindHandler( wxAnimationType animType )
+{
+    wxAnimationDecoderList::compatibility_iterator node = sm_handlers.GetFirst();
+    while (node)
+    {
+        const wxAnimationDecoder *handler = (const wxAnimationDecoder *)node->GetData();
+        if (handler->GetType() == animType) return handler;
+        node = node->GetNext();
+    }
+    return 0;
+}
+
+void wxAnimation::InitStandardHandlers()
+{
+    AddHandler(new wxGIFDecoder);
+    AddHandler(new wxANIDecoder);
+}
+
+void wxAnimation::CleanUpHandlers()
+{
+    wxAnimationDecoderList::compatibility_iterator node = sm_handlers.GetFirst();
+    while (node)
+    {
+        wxAnimationDecoder *handler = (wxAnimationDecoder *)node->GetData();
+        wxAnimationDecoderList::compatibility_iterator next = node->GetNext();
+        delete handler;
+        node = next;
+    }
+
+    sm_handlers.Clear();
+}
+
+
+// A module to allow wxAnimation initialization/cleanup
+// without calling these functions from app.cpp or from
+// the user's application.
+
+class wxAnimationModule: public wxModule
+{
+DECLARE_DYNAMIC_CLASS(wxAnimationModule)
+public:
+    wxAnimationModule() {}
+    bool OnInit() { wxAnimation::InitStandardHandlers(); return true; };
+    void OnExit() { wxAnimation::CleanUpHandlers(); };
+};
+
+IMPLEMENT_DYNAMIC_CLASS(wxAnimationModule, wxModule)
+
+
+
+
+// ----------------------------------------------------------------------------
+// wxAnimationCtrl
+// ----------------------------------------------------------------------------
+
+IMPLEMENT_CLASS(wxAnimationCtrl, wxAnimationCtrlBase)
+BEGIN_EVENT_TABLE(wxAnimationCtrl, wxAnimationCtrlBase)
+    EVT_PAINT(wxAnimationCtrl::OnPaint)
+    EVT_SIZE(wxAnimationCtrl::OnSize)
+    EVT_TIMER(wxID_ANY, wxAnimationCtrl::OnTimer)
+END_EVENT_TABLE()
+
+bool wxAnimationCtrl::Create(wxWindow *parent, wxWindowID id,
+            const wxAnimation& animation, const wxPoint& pos,
+            const wxSize& size, long style, const wxString& name)
+{
+    m_animation = animation;
+    m_currentFrame = 0;
+    m_looped = true;
+    m_isPlaying = false;
+    m_useWinBackgroundColour = false;
+    m_timer.SetOwner(this);
+
+    if (!wxControl::Create(parent, id, pos, size, style, wxDefaultValidator, name))
+        return false;
+
+    // by default we get the same background colour of our parent
+    SetBackgroundColour(parent->GetBackgroundColour());
+    return true;
+}
+
+wxAnimationCtrl::~wxAnimationCtrl()
+{
+    Stop();
+}
+
+bool wxAnimationCtrl::LoadFile(const wxString& filename, wxAnimationType type)
+{
+    wxAnimation anim;
+    if (!anim.LoadFile(filename, type) || 
+        !anim.IsOk())
+        return false;
+
+    SetAnimation(anim);
+    return true;
+}
+
+wxSize wxAnimationCtrl::DoGetBestSize() const
+{
+    if (m_animation.IsOk() && !this->HasFlag(wxAC_NO_AUTORESIZE))
+        return m_animation.GetSize();
+
+    return wxSize(100, 100);
+}
+
+void wxAnimationCtrl::SetAnimation(const wxAnimation& animation)
+{
+    if (IsPlaying())
+        Stop();
+
+    m_animation = animation;
+
+    if (m_animation.GetBackgroundColour() == wxNullColour)
+        SetUseWindowBackgroundColour();
+    if (!this->HasFlag(wxAC_NO_AUTORESIZE))
+        FitToAnimation();
+
+    // display first frame
+    m_currentFrame = 0;
+    if (m_animation.IsOk())
+        RebuildBackingStoreUpToFrame(0);
+    else
+    {
+        // clear to 
+        wxMemoryDC dc;
+        dc.SelectObject(m_backingStore);
+
+        // Draw the background
+        DisposeToBackground(dc);
+    }
+
+    Refresh();
+}
+
+void wxAnimationCtrl::FitToAnimation()
+{
+    SetSize(m_animation.GetSize());
+}
+
+
+// ----------------------------------------------------------------------------
+// wxAnimationCtrl - stop/play methods
+// ----------------------------------------------------------------------------
+
+void wxAnimationCtrl::Stop()
+{
+    // leave current frame displayed until Play() is called again
+    m_timer.Stop();
+    m_isPlaying = false;
+}
+
+bool wxAnimationCtrl::Play(bool looped)
+{
+    if (!m_animation.IsOk())
+        return false;
+
+    int oldframe = m_currentFrame;
+    m_looped = looped;
+    m_currentFrame = 0;
+    m_isPlaying = true;
+
+    // small optimization: if the back store was already updated to the
+    // first frame, don't rebuild it
+    if (oldframe != 0)
+        RebuildBackingStoreUpToFrame(0);
+
+    // DrawCurrentFrame() will use our updated backing store
+    wxClientDC clientDC(this);
+    DrawCurrentFrame(clientDC);
+
+    // start the timer
+    int delay = m_animation.GetDelay(0);
+    if (delay == 0)
+        delay = 1;      // 0 is invalid timeout for wxTimer.
+    m_timer.Start(delay);
+
+    return true;
+}
+
+
+
+// ----------------------------------------------------------------------------
+// wxAnimationCtrl - rendering methods
+// ----------------------------------------------------------------------------
+
+void wxAnimationCtrl::RebuildBackingStoreUpToFrame(size_t frame)
+{
+    // if we've not created the backing store yet or it's too
+    // small, then recreate it
+    wxSize sz = m_animation.GetSize(),
+           winsz = GetClientSize();
+    int w = wxMin(sz.GetWidth(), winsz.GetWidth());
+    int h = wxMin(sz.GetHeight(), winsz.GetHeight());
+
+    if (m_backingStore.GetWidth() < w ||
+        m_backingStore.GetHeight() < h)
+        m_backingStore.Create(w, h);
+
+    wxMemoryDC dc;
+    dc.SelectObject(m_backingStore);
+
+    // Draw the background
+    DisposeToBackground(dc);
+
+    // Draw all intermediate frames that haven't been removed from the animation
+    for (size_t i = 0; i < frame; i++)
+    {
+        if (m_animation.GetDisposalMethod(i) == wxANIM_DONOTREMOVE ||
+            m_animation.GetDisposalMethod(i) == wxANIM_UNSPECIFIED)
+        {
+            DrawFrame(dc, i);
+        }
+    }
+
+    // finally draw this frame
+    DrawFrame(dc, frame);
+    dc.SelectObject(wxNullBitmap);
+}
+
+void wxAnimationCtrl::IncrementalUpdateBackingStore()
+{
+    wxMemoryDC dc;
+    dc.SelectObject(m_backingStore);
+
+    // OPTIMIZATION:
+    // since wxAnimationCtrl can only play animations forward, without skipping
+    // frames, we can be sure that m_backingStore contains the m_currentFrame-1
+    // frame and thus we just need to dispose the m_currentFrame-1 frame and
+    // render the m_currentFrame-th one.
+
+    if (m_currentFrame == 0)
+    {
+        // before drawing the first frame always dispose to bg colour
+        DisposeToBackground(dc);
+    }
+    else
+    {
+        switch (m_animation.GetDisposalMethod(m_currentFrame-1))
+        {
+        case wxANIM_TOBACKGROUND:
+            DisposeToBackground(dc);
+            break;
+
+        case wxANIM_TOPREVIOUS:
+            // this disposal should never be used too often.
+            // E.g. GIF specification explicitely say to keep the usage of this
+            //      disposal limited to the minimum. 
+            // In fact it may require a lot of time to restore 
+            if (m_currentFrame == 1)
+            {
+                // if 0-th frame disposal is to restore to previous frame,
+                // the best we can do is to restore to background
+                DisposeToBackground(dc);
+            }
+            else
+                RebuildBackingStoreUpToFrame(m_currentFrame-2);
+            break;
+
+        case wxANIM_DONOTREMOVE:
+        case wxANIM_UNSPECIFIED:
+            break;
+        }
+    }
+
+    // now just draw the current frame on the top of the backing store
+    DrawFrame(dc, m_currentFrame);
+    dc.SelectObject(wxNullBitmap);
+}
+
+void wxAnimationCtrl::DrawFrame(wxDC &dc, size_t frame)
+{
+    // PERFORMANCE NOTE:
+    // this draw stuff is not as fast as possible: the wxAnimationDecoder
+    // needs first to convert from its internal format to wxImage RGB24;
+    // the wxImage is then converted as a wxBitmap and finally blitted.
+    // If wxAnimationDecoder had a function to convert directly from its
+    // internal format to a port-specific wxBitmap, it would be somewhat faster.
+    wxBitmap bmp(m_animation.GetFrame(frame));
+    dc.DrawBitmap(bmp, m_animation.GetFramePosition(frame),
+                  true /* use mask */);
+}
+
+void wxAnimationCtrl::DrawCurrentFrame(wxDC& dc)
+{
+    wxASSERT(m_backingStore.Ok());
+
+    // m_backingStore always contains the current frame
+    dc.DrawBitmap(m_backingStore, 0, 0);
+}
+
+void wxAnimationCtrl::DisposeToBackground(wxDC& dc)
+{
+    wxBrush brush(IsUsingWindowBackgroundColour() ? 
+                  this->GetBackgroundColour() : m_animation.GetBackgroundColour(), wxSOLID);
+    dc.SetBackground(brush);
+    dc.Clear();
+}
+
+// ----------------------------------------------------------------------------
+// wxAnimationCtrl - event handlers
+// ----------------------------------------------------------------------------
+
+void wxAnimationCtrl::OnPaint(wxPaintEvent& WXUNUSED(event))
+{
+    // VERY IMPORTANT: the wxPaintDC *must* be created in any case
+    wxPaintDC dc(this);
+
+    // both if we are playing or not, we need to refresh the current frame
+    if (m_backingStore.Ok())
+        DrawCurrentFrame(dc);
+    //else: m_animation is not valid and thus we don't have a valid backing store...
+}
+
+void wxAnimationCtrl::OnTimer(wxTimerEvent &WXUNUSED(event))
+{
+    m_currentFrame++;
+    if (m_currentFrame == m_animation.GetFrameCount())
+    {
+        // Should a non-looped animation display the last frame?
+        if (!m_looped)
+        {
+            m_timer.Stop();
+            m_isPlaying = false;
+            return;
+        }
+        else
+            m_currentFrame = 0;     // let's restart
+    }
+
+    IncrementalUpdateBackingStore();
+
+    wxClientDC dc(this);
+    DrawCurrentFrame(dc);
+
+    // Set the timer for the next frame
+    int delay = m_animation.GetDelay(m_currentFrame);
+    if (delay == 0)
+        delay = 1;      // 0 is invalid timeout for wxTimer.
+    m_timer.Start(delay);
+}
+
+void wxAnimationCtrl::OnSize(wxSizeEvent &WXUNUSED(event))
+{
+    // NB: resizing an animation control may take a lot of time
+    //     for big animations as the backing store must be
+    //     extended and rebuilt. Try to avoid it!!
+    if (m_animation.IsOk())
+        RebuildBackingStoreUpToFrame(m_currentFrame);
+}
+
+#endif      // wxUSE_ANIMATIONCTRL
+
diff --git a/src/gtk/animate.cpp b/src/gtk/animate.cpp
new file mode 100644
index 0000000000..df942e3c1a
--- /dev/null
+++ b/src/gtk/animate.cpp
@@ -0,0 +1,339 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        src/gtk/animate.cpp
+// Purpose:     wxAnimation and wxAnimationCtrl
+// Author:      Francesco Montorsi
+// Modified By:
+// Created:     24/09/2006
+// Id:          $Id$
+// Copyright:   (c) Francesco Montorsi
+// Licence:     wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
+
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
+#if wxUSE_ANIMATIONCTRL
+
+#include "wx/animate.h"
+#include <gtk/gtk.h>
+#include <gtk/gtkimage.h>
+
+
+// ============================================================================
+// implementation
+// ============================================================================
+
+void gdk_pixbuf_area_updated(GdkPixbufLoader *loader,
+                             gint             x,
+                             gint             y,
+                             gint             width,
+                             gint             height,
+                             wxAnimation      *anim)
+{
+    if (anim && anim->GetPixbuf() == NULL)
+    {
+        // we need to set the pixbuf only if this is the first time this signal
+        // has been called!
+        anim->SetPixbuf(gdk_pixbuf_loader_get_animation(loader));
+    }
+}
+
+
+//-----------------------------------------------------------------------------
+// wxAnimation
+//-----------------------------------------------------------------------------
+
+IMPLEMENT_DYNAMIC_CLASS(wxAnimation, wxAnimationBase)
+
+bool wxAnimation::LoadFile(const wxString &name, wxAnimationType WXUNUSED(type))
+{
+    UnRef();
+    m_pixbuf = gdk_pixbuf_animation_new_from_file(name.c_str(), NULL);
+    return IsOk();
+}
+
+bool wxAnimation::Load(wxInputStream &stream, wxAnimationType type)
+{
+    UnRef();
+
+    char anim_type[12];
+    switch (type)
+    {
+    case wxANIMATION_TYPE_GIF:
+        strcpy(anim_type, "gif");
+        break;
+
+    case wxANIMATION_TYPE_ANI:
+        strcpy(anim_type, "ani");
+        break;
+
+    default:
+        break;
+    }
+
+    // create a GdkPixbufLoader
+    GError *error = NULL;
+    GdkPixbufLoader *loader;
+    if (type != wxANIMATION_TYPE_INVALID && type != wxANIMATION_TYPE_ANY)
+        loader = gdk_pixbuf_loader_new_with_type(anim_type, &error);
+    else
+        loader = gdk_pixbuf_loader_new();
+
+    if (!loader)
+    {
+        wxLogDebug(wxT("Could not create the loader for '%s' animation type"), anim_type);
+        return false;
+    }
+
+    // connect to loader signals
+    g_signal_connect(loader, "area-updated", G_CALLBACK(gdk_pixbuf_area_updated), this);
+
+    //m_bLoadComplete = false;
+    guchar buf[2048];
+    while (stream.IsOk())
+    {
+        // read a chunk of data
+        stream.Read(buf, 2048);
+
+        // fetch all data into the loader
+        if (!gdk_pixbuf_loader_write(loader, buf, stream.LastRead(), &error))
+        {
+            gdk_pixbuf_loader_close(loader, &error);
+            wxLogDebug(wxT("Could not write to the loader"));
+            return false;
+        }
+    }
+
+    // load complete
+    if (!gdk_pixbuf_loader_close(loader, &error))
+    {
+        wxLogDebug(wxT("Could not close the loader"));
+        return false;
+    }
+    //m_bLoadComplete = true;
+
+    // wait until we get the last area_updated signal
+    return true;
+}
+
+
+//-----------------------------------------------------------------------------
+// wxAnimationCtrl
+//-----------------------------------------------------------------------------
+
+IMPLEMENT_DYNAMIC_CLASS(wxAnimationCtrl, wxAnimationCtrlBase)
+BEGIN_EVENT_TABLE(wxAnimationCtrl, wxAnimationCtrlBase)
+    EVT_TIMER(wxID_ANY, wxAnimationCtrl::OnTimer)
+END_EVENT_TABLE()
+
+bool wxAnimationCtrl::Create( wxWindow *parent, wxWindowID id,
+                              const wxAnimation& anim,
+                              const wxPoint& pos,
+                              const wxSize& size,
+                              long style,
+                              const wxString& name)
+{
+    m_needParent = true;
+    m_acceptsFocus = true;
+
+    if (!PreCreation( parent, pos, size ) ||
+        !wxControl::CreateBase(parent, id, pos, size, style & wxWINDOW_STYLE_MASK,
+                               wxDefaultValidator, name))
+    {
+        wxFAIL_MSG( wxT("wxAnimationCtrl creation failed") );
+        return false;
+    }
+
+    SetWindowStyle(style);
+
+    m_widget = gtk_image_new();
+    gtk_widget_show( GTK_WIDGET(m_widget) );
+
+    m_parent->DoAddChild( this );
+
+    PostCreation(size);
+    SetBestSize(size);
+
+    m_anim = NULL;
+    m_iter = NULL;
+    m_bPlaying = false;
+    if (anim != wxNullAnimation)
+        SetAnimation(anim);
+
+    // init the timer used for animation
+    m_timer.SetOwner(this);
+
+    return true;
+}
+
+wxAnimationCtrl::~wxAnimationCtrl()
+{
+    ResetAnim();
+    ResetIter();
+}
+
+bool wxAnimationCtrl::LoadFile(const wxString &filename, wxAnimationType type)
+{
+    wxAnimation anim;
+    if (!anim.LoadFile(filename, type))
+        return false;
+
+    SetAnimation(anim);
+    return true;
+}
+
+void wxAnimationCtrl::SetAnimation(const wxAnimation &anim)
+{
+    if (IsPlaying())
+        Stop();
+
+    ResetAnim();
+    ResetIter();
+
+    // copy underlying GdkPixbuf object
+    m_anim = anim.GetPixbuf();
+
+    // m_anim may be null in case wxNullAnimation has been passed
+    if (m_anim)
+    {
+        // add a reference to the GdkPixbufAnimation
+        g_object_ref(m_anim);
+
+        if (!this->HasFlag(wxAC_NO_AUTORESIZE))
+            FitToAnimation();
+
+        // display first frame
+        gtk_image_set_from_pixbuf(GTK_IMAGE(m_widget),
+                                  gdk_pixbuf_animation_get_static_image(m_anim));
+    }
+    else
+    {
+        // we need to clear the control to the background colour
+        ClearToBackgroundColour();
+    }
+}
+
+void wxAnimationCtrl::FitToAnimation()
+{
+    if (!m_anim)
+        return;
+
+    int w = gdk_pixbuf_animation_get_width(m_anim),
+        h = gdk_pixbuf_animation_get_height(m_anim);
+
+    // update our size to fit animation
+    //if (w > 0 && h > 0)
+//        gtk_widget_set_size_request(m_widget, w, h);
+        SetSize(w, h);
+}
+
+bool wxAnimationCtrl::Play()
+{
+    if (m_anim == NULL)
+        return false;
+
+    // init the iterator and start a one-shot timer
+    ResetIter();
+    m_iter = gdk_pixbuf_animation_get_iter (m_anim, NULL);
+    m_bPlaying = true;
+
+    // gdk_pixbuf_animation_iter_get_delay_time() may return -1 which means
+    // that the timer should not start
+    int n = gdk_pixbuf_animation_iter_get_delay_time(m_iter);
+    if (n >= 0)
+        m_timer.Start(n, true);
+
+    return true;
+}
+
+void wxAnimationCtrl::Stop()
+{
+    // leave current frame displayed until Play() is called again
+    if (IsPlaying())
+        m_timer.Stop();
+    m_bPlaying = false;
+}
+
+bool wxAnimationCtrl::IsPlaying() const
+{
+    // NB: we cannot just return m_timer.IsRunning() as this would not
+    //     be safe as e.g. if we are displaying a frame forever,
+    //     then we are "officially" still playing the animation, but
+    //     the timer is not running anymore...
+    return m_bPlaying;
+}
+
+wxSize wxAnimationCtrl::DoGetBestSize() const
+{
+    if (m_anim && !this->HasFlag(wxAC_NO_AUTORESIZE))
+    {
+        return wxSize(gdk_pixbuf_animation_get_width(m_anim),
+                      gdk_pixbuf_animation_get_height(m_anim));
+    }
+
+    return wxSize(100,100);
+}
+
+void wxAnimationCtrl::ClearToBackgroundColour()
+{
+    wxSize sz = GetClientSize();
+    GdkPixbuf *newpix = gdk_pixbuf_new(GDK_COLORSPACE_RGB, false, 8,
+                                       sz.GetWidth(), sz.GetHeight());
+    if (!newpix)
+        return;
+
+    wxColour clr = GetBackgroundColour();
+    guint32 col = (clr.Red() << 24) | (clr.Green() << 16) | (clr.Blue() << 8);
+    gdk_pixbuf_fill(newpix, col);
+
+    wxLogDebug(wxT("Clearing to background %s"), clr.GetAsString().c_str());
+
+    gtk_image_set_from_pixbuf(GTK_IMAGE(m_widget), newpix);
+    g_object_unref(newpix);
+}
+
+bool wxAnimationCtrl::SetBackgroundColour( const wxColour &colour )
+{
+    // wxWindowGTK::SetBackgroundColour works but since our m_widget is a GtkImage
+    // it won't show the background colour unlike the user would expect.
+    // Thus we clear the GtkImage contents to the background colour...
+    if (!wxControl::SetBackgroundColour(colour))
+        return false;
+    ClearToBackgroundColour();
+    return true;
+}
+
+
+//-----------------------------------------------------------------------------
+// wxAnimationCtrl - event handlers
+//-----------------------------------------------------------------------------
+
+void wxAnimationCtrl::OnTimer(wxTimerEvent &ev)
+{
+    wxASSERT(m_iter != NULL);
+
+    // gdk_pixbuf_animation_iter_advance() will automatically restart
+    // the animation, if necessary and we have no way to know !!
+    if (gdk_pixbuf_animation_iter_advance(m_iter, NULL))
+    {
+        // start a new one-shot timer
+        int n = gdk_pixbuf_animation_iter_get_delay_time(m_iter);
+        if (n >= 0)
+            m_timer.Start(n, true);
+
+        gtk_image_set_from_pixbuf(GTK_IMAGE(m_widget),
+                                  gdk_pixbuf_animation_iter_get_pixbuf(m_iter));
+    }
+    else
+    {
+        // no need to update the m_widget yet
+        m_timer.Start(10, true);
+    }
+}
+
+#endif      // wxUSE_ANIMATIONCTRL
diff --git a/src/html/m_image.cpp b/src/html/m_image.cpp
index 41c8a636df..80d6dba87b 100644
--- a/src/html/m_image.cpp
+++ b/src/html/m_image.cpp
@@ -309,6 +309,7 @@ private:
     wxGIFDecoder       *m_gifDecoder;
     wxTimer            *m_gifTimer;
     int                 m_physX, m_physY;
+    size_t              m_nCurrFrame;
 #endif
     double              m_scale;
     wxHtmlImageMapCell *m_imageMap;
@@ -358,6 +359,7 @@ wxHtmlImageCell::wxHtmlImageCell(wxHtmlWindowInterface *windowIface,
     m_gifDecoder = NULL;
     m_gifTimer = NULL;
     m_physX = m_physY = wxDefaultCoord;
+    m_nCurrFrame = 0;
 #endif
 
     if ( m_bmpW && m_bmpH )
@@ -374,11 +376,11 @@ wxHtmlImageCell::wxHtmlImageCell(wxHtmlWindowInterface *windowIface,
                      (input->GetLocation().Matches(wxT("*.gif")) ||
                       input->GetLocation().Matches(wxT("*.GIF"))) )
                 {
-                    m_gifDecoder = new wxGIFDecoder(s, true);
-                    if ( m_gifDecoder->ReadGIF() == wxGIF_OK )
+                    m_gifDecoder = new wxGIFDecoder();
+                    if ( m_gifDecoder->LoadGIF(*s) == wxGIF_OK )
                     {
                         wxImage img;
-                        if ( m_gifDecoder->ConvertToImage(&img) )
+                        if ( m_gifDecoder->ConvertToImage(0, &img) )
                             SetImage(img);
 
                         readImg = false;
@@ -386,7 +388,7 @@ wxHtmlImageCell::wxHtmlImageCell(wxHtmlWindowInterface *windowIface,
                         if ( m_gifDecoder->IsAnimation() )
                         {
                             m_gifTimer = new wxGIFTimer(this);
-                            m_gifTimer->Start(m_gifDecoder->GetDelay(), true);
+                            m_gifTimer->Start(m_gifDecoder->GetDelay(0), true);
                         }
                         else
                         {
@@ -481,7 +483,10 @@ void wxHtmlImageCell::AdvanceAnimation(wxTimer *timer)
 {
     wxImage img;
 
-    m_gifDecoder->GoNextFrame(true);
+    // advance current frame
+    m_nCurrFrame++;
+    if (m_nCurrFrame == m_gifDecoder->GetFrameCount())
+        m_nCurrFrame = 0;
 
     if ( m_physX == wxDefaultCoord )
     {
@@ -499,17 +504,16 @@ void wxHtmlImageCell::AdvanceAnimation(wxTimer *timer)
     wxRect rect(pos, wxSize(m_Width, m_Height));
 
     if ( win->GetClientRect().Intersects(rect) &&
-         m_gifDecoder->ConvertToImage(&img) )
+         m_gifDecoder->ConvertToImage(m_nCurrFrame, &img) )
     {
 #if !defined(__WXMSW__) || wxUSE_WXDIB
-        if ( (int)m_gifDecoder->GetWidth() != m_Width ||
-             (int)m_gifDecoder->GetHeight() != m_Height ||
-             m_gifDecoder->GetLeft() != 0 || m_gifDecoder->GetTop() != 0 )
+        if ( m_gifDecoder->GetFrameSize(m_nCurrFrame) != wxSize(m_Width, m_Height) ||
+             m_gifDecoder->GetFramePosition(m_nCurrFrame) != wxPoint(0, 0) )
         {
             wxBitmap bmp(img);
             wxMemoryDC dc;
             dc.SelectObject(*m_bitmap);
-            dc.DrawBitmap(bmp, m_gifDecoder->GetLeft(), m_gifDecoder->GetTop(),
+            dc.DrawBitmap(bmp, m_gifDecoder->GetFramePosition(m_nCurrFrame),
                           true /* use mask */);
         }
         else
@@ -518,7 +522,7 @@ void wxHtmlImageCell::AdvanceAnimation(wxTimer *timer)
         win->Refresh(img.HasMask(), &rect);
     }
 
-    timer->Start(m_gifDecoder->GetDelay(), true);
+    timer->Start(m_gifDecoder->GetDelay(m_nCurrFrame), true);
 }
 
 void wxHtmlImageCell::Layout(int w)
diff --git a/src/wxWindows.dsp b/src/wxWindows.dsp
index 4dbdc4af16..45379d7902 100644
--- a/src/wxWindows.dsp
+++ b/src/wxWindows.dsp
@@ -301,6 +301,14 @@ SOURCE=.\common\accesscmn.cpp
 # End Source File
 # Begin Source File
 
+SOURCE=.\common\anidecod.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\common\animatecmn.cpp
+# End Source File
+# Begin Source File
+
 SOURCE=.\common\appbase.cpp
 # End Source File
 # Begin Source File
@@ -971,6 +979,10 @@ SOURCE=.\generic\aboutdlgg.cpp
 # End Source File
 # Begin Source File
 
+SOURCE=.\generic\animateg.cpp
+# End Source File
+# Begin Source File
+
 SOURCE=.\generic\bmpcboxg.cpp
 # End Source File
 # Begin Source File
@@ -2159,6 +2171,14 @@ SOURCE=..\include\wx\afterstd.h
 # End Source File
 # Begin Source File
 
+SOURCE=..\include\wx\anidecod.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\include\wx\animate.h
+# End Source File
+# Begin Source File
+
 SOURCE=..\include\wx\app.h
 # End Source File
 # Begin Source File
@@ -4103,6 +4123,10 @@ SOURCE=..\include\wx\generic\accel.h
 # End Source File
 # Begin Source File
 
+SOURCE=..\include\wx\generic\animate.h
+# End Source File
+# Begin Source File
+
 SOURCE=..\include\wx\generic\bmpcbox.h
 # End Source File
 # Begin Source File
-- 
2.50.0

