aboutsummaryrefslogtreecommitdiff
path: root/gui/animation
diff options
context:
space:
mode:
authorEugene Sandulenko2015-04-13 01:53:10 +0200
committerAlexander Tkachev2016-08-24 16:07:55 +0600
commitea80e24481f12c117d6aecf6e5260b08423454ec (patch)
tree337aa3f0f143a1936c58680a1b47f1f638e35590 /gui/animation
parent6524a8d103c87def348b9560418850cb48d24ce4 (diff)
downloadscummvm-rg350-ea80e24481f12c117d6aecf6e5260b08423454ec.tar.gz
scummvm-rg350-ea80e24481f12c117d6aecf6e5260b08423454ec.tar.bz2
scummvm-rg350-ea80e24481f12c117d6aecf6e5260b08423454ec.zip
GUI: Added animation classes
Diffstat (limited to 'gui/animation')
-rw-r--r--gui/animation/AccelerateInterpolator.h45
-rw-r--r--gui/animation/AlphaAnimation.h53
-rw-r--r--gui/animation/Animation.cpp98
-rw-r--r--gui/animation/Animation.h76
-rw-r--r--gui/animation/DeccelerateInterpolator.h41
-rw-r--r--gui/animation/Drawable.h109
-rw-r--r--gui/animation/Interpolator.h44
-rw-r--r--gui/animation/ParallelAnimation.h72
-rw-r--r--gui/animation/RepeatAnimationWrapper.cpp52
-rw-r--r--gui/animation/RepeatAnimationWrapper.h61
-rw-r--r--gui/animation/ScaleAnimation.h69
-rw-r--r--gui/animation/SequenceAnimationComposite.cpp72
-rw-r--r--gui/animation/SequenceAnimationComposite.h51
-rw-r--r--gui/animation/WaitForConditionAnimation.h71
14 files changed, 914 insertions, 0 deletions
diff --git a/gui/animation/AccelerateInterpolator.h b/gui/animation/AccelerateInterpolator.h
new file mode 100644
index 0000000000..31494d369f
--- /dev/null
+++ b/gui/animation/AccelerateInterpolator.h
@@ -0,0 +1,45 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+// Based on code by omergilad.
+
+#ifndef GUI_ANIMATION_ACCELERATEINTERPOLATOR_H
+#define GUI_ANIMATION_ACCELERATEINTERPOLATOR_H
+
+#include "gui/animation/Interpolator.h"
+
+namespace GUI {
+
+class AccelerateInterpolator: public Interpolator {
+public:
+ AccelerateInterpolator() {}
+ virtual ~AccelerateInterpolator() {}
+
+ virtual float interpolate(float linearValue) {
+ return pow(linearValue, 2);
+ }
+
+};
+
+} // End of namespace GUI
+
+#endif /* GUI_ANIMATION_ACCELERATEINTERPOLATOR_H */
diff --git a/gui/animation/AlphaAnimation.h b/gui/animation/AlphaAnimation.h
new file mode 100644
index 0000000000..82cf3d4ba9
--- /dev/null
+++ b/gui/animation/AlphaAnimation.h
@@ -0,0 +1,53 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+// Based on code by omergilad.
+
+#ifndef GUI_ANIMATION_ANIMATION_H
+#define GUI_ANIMATION_ANIMATION_H
+
+#include "gui/animation/Animation.h"
+
+namespace GUI {
+
+class AlphaAnimation: public Animation {
+public:
+ AlphaAnimation() {}
+ virtual ~AlphaAnimation() {}
+ float getEndAlpha() const { return _endAlpha; }
+ void setEndAlpha(float endAlpha) { _endAlpha = endAlpha; }
+ float getStartAlpha() const { return _startAlpha; }
+ void setStartAlpha(float startAlpha) { _startAlpha = startAlpha; }
+
+protected:
+ virtual void updateInternal(Drawable* drawable, float interpolation) {
+ // Calculate alpha value based on properties and interpolation
+ drawable->setAlpha(_startAlpha * (1 - interpolation) + _endAlpha * interpolation);
+ }
+
+ float _startAlpha;
+ float _endAlpha;
+};
+
+} // End of namespace GUI
+
+#endif /* GUI_ANIMATION_ANIMATION_H */
diff --git a/gui/animation/Animation.cpp b/gui/animation/Animation.cpp
new file mode 100644
index 0000000000..ee4d900b4d
--- /dev/null
+++ b/gui/animation/Animation.cpp
@@ -0,0 +1,98 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+// Based on code by omergilad.
+
+#include "gui/animation/Animation.h"
+
+namespace GUI {
+
+Animation::Animation()
+ : _startTime(0), _duration(0), _finished(false), _finishOnEnd(true) {
+}
+
+Animation::~Animation() {
+}
+
+void Animation::start(long currentTime) {
+ _finished = false;
+ _startTime = currentTime;
+}
+
+void Animation::setDuration(long duration) {
+ _duration = duration;
+}
+
+void Animation::update(Drawable *drawable, long currentTime) {
+ float interpolation;
+
+ if (currentTime < _startTime) {
+ // If the start time is in the future, nothing changes - the interpolated value is 0
+ interpolation = 0;
+ } else if (currentTime > _startTime + _duration) {
+ // If the animation is finished, the interpolated value is 1 and the animation is marked as finished
+ interpolation = 1;
+ finishAnimation();
+ } else {
+ // Calculate the interpolated value
+ interpolation = (currentTime - _startTime) / (float) (_duration);
+ }
+
+ // Activate the interpolator if present
+ if (_interpolator.get() != NULL) {
+ interpolation = _interpolator->interpolate(interpolation);
+ }
+
+ updateInternal(drawable, interpolation);
+}
+
+void Animation::finishAnimation() {
+ if (_finishOnEnd) {
+ _finished = true;
+ }
+}
+
+void Animation::updateInternal(Drawable *drawable, float interpolation) {
+ // Default implementation
+}
+
+bool Animation::isFinished() const {
+ return _finished;
+}
+
+bool Animation::isFinishOnEnd() const {
+ return _finishOnEnd;
+}
+
+void Animation::setFinishOnEnd(bool finishOnEnd) {
+ _finishOnEnd = finishOnEnd;
+}
+
+InterpolatorPtr Animation::getInterpolator() const {
+ return _interpolator;
+}
+
+void Animation::setInterpolator(InterpolatorPtr interpolator) {
+ _interpolator = interpolator;
+}
+
+} // End of namespace GUI
diff --git a/gui/animation/Animation.h b/gui/animation/Animation.h
new file mode 100644
index 0000000000..300720b419
--- /dev/null
+++ b/gui/animation/Animation.h
@@ -0,0 +1,76 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+// Based on code by omergilad.
+
+#ifndef GUI_ANIMATION_ANIMATION_H
+#define GUI_ANIMATION_ANIMATION_H
+
+#include "gui/animation/Interpolator.h"
+
+namespace GUI {
+
+class Drawable;
+
+class Animation {
+public:
+ Animation();
+ virtual ~Animation() = 0;
+
+ virtual void update(Drawable *drawable, long currentTime);
+
+ /**
+ * Set start time in millis
+ */
+ virtual void start(long currentTime);
+
+ /**
+ * Set duration in millis
+ */
+ virtual void setDuration(long duration);
+
+ virtual bool isFinished() const;
+
+ bool isFinishOnEnd() const;
+
+ void setFinishOnEnd(bool finishOnEnd);
+
+ InterpolatorPtr getInterpolator() const;
+ void setInterpolator(InterpolatorPtr interpolator);
+
+protected:
+ void finishAnimation();
+
+ virtual void updateInternal(Drawable *drawable, float interpolation);
+
+ long _startTime;
+ long _duration;
+ bool _finished;
+ bool _finishOnEnd;
+ InterpolatorPtr _interpolator;
+};
+
+typedef Common::SharedPtr<Animation> AnimationPtr;
+
+} // End of namespace GUI
+
+#endif /* GUI_ANIMATION_ANIMATION_H */
diff --git a/gui/animation/DeccelerateInterpolator.h b/gui/animation/DeccelerateInterpolator.h
new file mode 100644
index 0000000000..e25ff6a4ba
--- /dev/null
+++ b/gui/animation/DeccelerateInterpolator.h
@@ -0,0 +1,41 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+// Based on code by omergilad.
+
+#ifndef GUI_ANIMATION_DECCELERATEINTERPOLATOR_H
+#define GUI_ANIMATION_DECCELERATEINTERPOLATOR_H
+
+#include "gui/animation/Interpolator.h"
+
+namespace GUI {
+
+class DeccelerateInterpolator: public Interpolator {
+public:
+ DeccelerateInterpolator() {}
+ virtual ~DeccelerateInterpolator() {}
+ virtual float interpolate(float linearValue) { return sqrt(linearValue); }
+};
+
+} // End of namespace GUI
+
+#endif /* GUI_ANIMATION_DECCELERATEINTERPOLATOR_H */
diff --git a/gui/animation/Drawable.h b/gui/animation/Drawable.h
new file mode 100644
index 0000000000..cf604270aa
--- /dev/null
+++ b/gui/animation/Drawable.h
@@ -0,0 +1,109 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+// Based on code by omergilad.
+
+#ifndef GUI_ANIMATION_DRAWABLE_H
+#define GUI_ANIMATION_DRAWABLE_H
+
+#include "common/ptr.h"
+#include "graphics/transparent_surface.h"
+
+#include "gui/animation/Animation.h"
+
+namespace GUI {
+
+class Animation;
+typedef Common::SharedPtr<Animation> AnimationPtr;
+
+class Drawable {
+public:
+ Drawable() :
+ _bitmap(NULL), _positionX(0), _positionY(0), _width(0), _height(0), _alpha(1),
+ _usingSnapshot(false), _shouldCenter(false) {
+ _displayRatio = 1.0;
+ }
+
+ virtual ~Drawable() {
+ if (_usingSnapshot)
+ delete _bitmap;
+ }
+
+ void updateAnimation(long currentTime) {
+ if (_animation.get() != NULL) {
+ _animation->update(this, currentTime);
+ }
+ }
+
+ bool isAnimationFinished() {
+ if (_animation.get() != NULL)
+ return _animation->isFinished();
+
+ return false;
+ }
+
+ float getAlpha() const { return _alpha; }
+ void setAlpha(float alpha) { _alpha = alpha; }
+ AnimationPtr getAnimation() const { return _animation; }
+ void setAnimation(AnimationPtr animation) { _animation = animation; }
+ Graphics::TransparentSurface *getBitmap() const { return _bitmap; }
+ void setBitmap(Graphics::TransparentSurface *bitmap) { _bitmap = bitmap; }
+ float getPositionX() const { return _positionX; }
+ void setPositionX(float positionX) { _positionX = positionX; }
+ float getPositionY() const { return _positionY; }
+ void setPositionY(float positionY) { _positionY = positionY; }
+ virtual float getWidth() const { return _width; }
+ void setWidth(float width) { _width = width; }
+
+ virtual float getHeight() const {
+ if (_height == 0)
+ return getWidth() * _bitmap->getRatio() * _displayRatio;
+
+ return _height;
+ }
+
+ void setHeight(float height) { _height = height; }
+ void setDisplayRatio(float ratio) { _displayRatio = ratio; }
+ inline bool shouldCenter() const { return _shouldCenter; }
+ void setShouldCenter(bool shouldCenter) { _shouldCenter = shouldCenter; }
+
+protected:
+ bool _usingSnapshot;
+
+private:
+ Graphics::TransparentSurface *_bitmap;
+ float _positionX;
+ float _positionY;
+ float _width;
+ float _height;
+ float _alpha;
+ bool _shouldCenter;
+ AnimationPtr _animation;
+
+ float _displayRatio;
+};
+
+typedef Common::SharedPtr<Drawable> DrawablePtr;
+
+} // End of namespace GUI
+
+#endif /* GUI_ANIMATION_DRAWABLE_H */
diff --git a/gui/animation/Interpolator.h b/gui/animation/Interpolator.h
new file mode 100644
index 0000000000..72d7acb8d4
--- /dev/null
+++ b/gui/animation/Interpolator.h
@@ -0,0 +1,44 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+// Based on code by omergilad.
+
+#ifndef GUI_ANIMATION_INTERPOLATOR_H
+#define GUI_ANIMATION_INTERPOLATOR_H
+
+#include "common/ptr.h"
+
+namespace GUI {
+
+class Interpolator {
+public:
+ Interpolator() {}
+ virtual ~Interpolator() {}
+
+ virtual float interpolate(float linearValue) = 0;
+};
+
+typedef Common::SharedPtr<Interpolator> InterpolatorPtr;
+
+} // End of namespace GUI
+
+#endif /* GUI_ANIMATION_INTERPOLATOR_H */
diff --git a/gui/animation/ParallelAnimation.h b/gui/animation/ParallelAnimation.h
new file mode 100644
index 0000000000..ce1f599fb1
--- /dev/null
+++ b/gui/animation/ParallelAnimation.h
@@ -0,0 +1,72 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+// Based on code by omergilad.
+
+#ifndef GUI_ANIMATION_PARALLELANIMATION_H
+#define GUI_ANIMATION_PARALLELANIMATION_H
+
+#include "gui/animation/Animation.h"
+#include "common/array.h"
+
+namespace GUI {
+
+class ParallelAnimation: public Animation {
+public:
+ ParallelAnimation() {}
+ virtual ~ParallelAnimation() {}
+
+ virtual void addAnimation(AnimationPtr animation) {
+ _animations.push_back(animation);
+ }
+
+ virtual void update(Drawable *drawable, long currentTime) {
+ for (AnimationPtr anim : _animations) {
+ anim->update(drawable, currentTime);
+ if (anim->isFinished()) {
+ finishAnimation();
+ }
+ }
+ }
+
+ virtual void start(long currentTime) {
+ Animation::start(currentTime);
+
+ for (AnimationPtr anim : _animations)
+ anim->start(currentTime);
+ }
+
+ virtual void setDuration(long duration) {
+ Animation::setDuration(duration);
+
+ for (AnimationPtr anim : _animations)
+ anim->setDuration(duration);
+ }
+
+private:
+
+ Common::Array<AnimationPtr> _animations;
+};
+
+} // End of namespace GUI
+
+#endif /* GUI_ANIMATION_PARALLELANIMATION_H */
diff --git a/gui/animation/RepeatAnimationWrapper.cpp b/gui/animation/RepeatAnimationWrapper.cpp
new file mode 100644
index 0000000000..a7e1413093
--- /dev/null
+++ b/gui/animation/RepeatAnimationWrapper.cpp
@@ -0,0 +1,52 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+// Based on code by omergilad.
+
+#include "gui/animation/RepeatAnimationWrapper.h"
+
+namespace GUI {
+
+void RepeatAnimationWrapper::update(Drawable* drawable, long currentTime) {
+ // Update wrapped animation
+ _animation->update(drawable, currentTime);
+
+ // If the animation is finished, increase the repeat count and restart it if needed
+ if (_animation->isFinished()) {
+ ++_repeatCount;
+ if (_timesToRepeat > 0 && _repeatCount >= _timesToRepeat) {
+ finishAnimation();
+ } else {
+ _animation->start(currentTime);
+ }
+ }
+}
+
+void RepeatAnimationWrapper::start(long currentTime) {
+ Animation::start(currentTime);
+ _repeatCount = 0;
+
+ // Start wrapped animation
+ _animation->start(currentTime);
+}
+
+} // End of namespace GUI
diff --git a/gui/animation/RepeatAnimationWrapper.h b/gui/animation/RepeatAnimationWrapper.h
new file mode 100644
index 0000000000..3d766dd1c5
--- /dev/null
+++ b/gui/animation/RepeatAnimationWrapper.h
@@ -0,0 +1,61 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+// Based on code by omergilad.
+
+#ifndef GUI_ANIMATION_REPEATANIMATIONWRAPPER_H
+#define GUI_ANIMATION_REPEATANIMATIONWRAPPER_H
+
+#include "gui/animation/Animation.h"
+
+namespace GUI {
+
+class RepeatAnimationWrapper: public Animation {
+public:
+ /**
+ * Animation - animation to repeat
+ *
+ * timesToRepeat - 0 means infinite
+ */
+ RepeatAnimationWrapper(AnimationPtr animation, uint16 timesToRepeat) :
+ _animation(animation), _timesToRepeat(timesToRepeat) {}
+
+ virtual ~RepeatAnimationWrapper() {}
+
+ virtual void update(Drawable* drawable, long currentTime);
+
+ /**
+ * Set start time in millis
+ */
+ virtual void start(long currentTime);
+
+private:
+ uint16 _timesToRepeat;
+ uint16 _repeatCount;
+
+ AnimationPtr _animation;
+
+};
+
+} // End of namespace GUI
+
+#endif /* GUI_ANIMATION_REPEATANIMATIONWRAPPER_H */
diff --git a/gui/animation/ScaleAnimation.h b/gui/animation/ScaleAnimation.h
new file mode 100644
index 0000000000..80a4ae6305
--- /dev/null
+++ b/gui/animation/ScaleAnimation.h
@@ -0,0 +1,69 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+// Based on code by omergilad.
+
+#ifndef GUI_ANIMATION_SCALEANIMATION_H
+#define GUI_ANIMATION_SCALEANIMATION_H
+
+#include "gui/animation/Animation.h"
+
+namespace GUI {
+
+class ScaleAnimation: public Animation {
+public:
+ ScaleAnimation() : _endWidth(0), _endWidthFactor(0) {}
+
+ virtual ~ScaleAnimation() {}
+
+ float getEndWidth() const { return _endWidth; }
+ void setEndWidth(float endWidth) { _endWidth = endWidth; }
+ float getEndWidthFactor() const { return _endWidthFactor; }
+ void setEndWidthFactor(float endWidthFactor) { _endWidthFactor = endWidthFactor; }
+ float getStartWidth() const { return _startWidth; }
+ void setStartWidth(float startWidth) { _startWidth = startWidth; }
+
+ void updateInternal(Drawable *drawable, float interpolation) {
+ // If start width was set as 0 -> use the current width as the start dimension
+ if (_startWidth == 0)
+ _startWidth = drawable->getWidth();
+
+ // If end width was set as 0 - multiply the start width by the given factor
+ if (_endWidth == 0)
+ _endWidth = _startWidth * _endWidthFactor;
+
+ // Calculate width based on interpolation
+ float width = _startWidth * (1 - interpolation) + _endWidth * interpolation;
+ drawable->setWidth(width);
+ }
+
+private:
+ virtual void updateInternal(Drawable *drawable, float interpolation);
+ float _startWidth;
+ float _endWidth;
+ float _endWidthFactor;
+};
+
+} // End of namespace GUI
+
+
+#endif /* GUI_ANIMATION_SCALEANIMATION_H */
diff --git a/gui/animation/SequenceAnimationComposite.cpp b/gui/animation/SequenceAnimationComposite.cpp
new file mode 100644
index 0000000000..9ecfeebc8c
--- /dev/null
+++ b/gui/animation/SequenceAnimationComposite.cpp
@@ -0,0 +1,72 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+// Based on code by omergilad.
+
+#include "gui/animation/SequenceAnimationComposite.h"
+
+namespace GUI {
+
+void SequenceAnimationComposite::start(long currentTime) {
+ Animation::start(currentTime);
+
+ // The first animation in the sequence should a start time equal to this sequence
+ if (_sequence.size() >= 1)
+ _sequence[0]->start(currentTime);
+
+ // Set the index to 0
+ _index = 0;
+}
+
+void SequenceAnimationComposite::addAnimation(AnimationPtr animation) {
+ _sequence.push_back(animation);
+}
+
+void SequenceAnimationComposite::update(Drawable *drawable, long currentTime) {
+ uint16 sequenceSize = _sequence.size();
+
+ // Check index bounds
+ if (_index >= sequenceSize)
+ return;
+
+ // Get the current animation in the sequence
+ AnimationPtr anim = _sequence[_index];
+
+ // Update the drawable
+ anim->update(drawable, currentTime);
+
+ // Check if the current animation is finished
+ if (anim->isFinished()) {
+ // Increase the index - move to the next animation
+ ++_index;
+
+ if (_index >= sequenceSize) {
+ // Finished the sequence
+ finishAnimation();
+ } else {
+ // Set the start time for the next animation
+ _sequence[_index]->start(currentTime);
+ }
+ }
+}
+
+} // End of namespace GUI
diff --git a/gui/animation/SequenceAnimationComposite.h b/gui/animation/SequenceAnimationComposite.h
new file mode 100644
index 0000000000..4ec0331751
--- /dev/null
+++ b/gui/animation/SequenceAnimationComposite.h
@@ -0,0 +1,51 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+// Based on code by omergilad.
+
+#ifndef GUI_ANIMATION_SEQUENCEANIMATION_H
+#define GUI_ANIMATION_SEQUENCEANIMATION_H
+
+#include "gui/animation/Animation.h"
+#include "common/array.h"
+
+namespace GUI {
+
+class SequenceAnimationComposite: public Animation {
+public:
+ SequenceAnimationComposite() {}
+ virtual ~SequenceAnimationComposite() {}
+
+ virtual void addAnimation(AnimationPtr animation);
+
+ virtual void update(Drawable* drawable, long currentTime);
+
+ virtual void start(long currentTime);
+
+private:
+ uint16 _index;
+ Common::Array<AnimationPtr> _sequence;
+};
+
+} // End of namespace GUI
+
+#endif /* GUI_ANIMATION_SEQUENCEANIMATION_H */
diff --git a/gui/animation/WaitForConditionAnimation.h b/gui/animation/WaitForConditionAnimation.h
new file mode 100644
index 0000000000..5a67a37493
--- /dev/null
+++ b/gui/animation/WaitForConditionAnimation.h
@@ -0,0 +1,71 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+// Based on code by omergilad.
+
+#ifndef GUI_ANIMATION_WAITFORCONDITIONANIMATION_H
+#define GUI_ANIMATION_WAITFORCONDITIONANIMATION_H
+
+#include "gui/animation/Animation.h"
+
+namespace GUI {
+
+class Condition {
+
+public:
+ virtual ~Condition() {}
+
+ virtual bool evaluate() = 0;
+};
+
+typedef Common::SharedPtr<Condition> ConditionPtr;
+
+/**
+ * Used for delaying the animation sequence until a certain condition has been met
+ */
+class WaitForConditionAnimation: public Animation {
+public:
+ WaitForConditionAnimation() {}
+ virtual ~WaitForConditionAnimation() {}
+
+ virtual void update(Drawable *drawable, long currentTime) {
+ // Check the condition - if it has been met, finish.
+ if (_condition.get() != NULL && _condition->evaluate()) {
+ finishAnimation();
+ }
+ }
+
+ ConditionPtr getCondition() const {
+ return _condition;
+ }
+
+ void setCondition(ConditionPtr condition) {
+ _condition = condition;
+ }
+
+private:
+ ConditionPtr _condition;
+};
+
+} // End of namespace GUI
+
+#endif /* GUI_ANIMATION_WAITFORCONDITIONANIMATION_H */