summaryrefslogtreecommitdiffstats
path: root/include/vcl/animate
diff options
context:
space:
mode:
Diffstat (limited to 'include/vcl/animate')
-rw-r--r--include/vcl/animate/Animation.hxx125
-rw-r--r--include/vcl/animate/AnimationFrame.hxx85
2 files changed, 210 insertions, 0 deletions
diff --git a/include/vcl/animate/Animation.hxx b/include/vcl/animate/Animation.hxx
new file mode 100644
index 0000000000..cd8c464c05
--- /dev/null
+++ b/include/vcl/animate/Animation.hxx
@@ -0,0 +1,125 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#ifndef INCLUDED_VCL_ANIMATE_ANIMATION_HXX
+#define INCLUDED_VCL_ANIMATE_ANIMATION_HXX
+
+#include <tools/solar.h>
+#include <vcl/dllapi.h>
+#include <vcl/timer.hxx>
+#include <vcl/animate/AnimationFrame.hxx>
+
+#define ANIMATION_TIMEOUT_ON_CLICK 2147483647L
+
+class AnimationRenderer;
+struct AnimationData;
+
+class VCL_DLLPUBLIC Animation
+{
+public:
+ Animation();
+ Animation(const Animation& rAnimation);
+ ~Animation();
+
+ Animation& operator=(const Animation& rAnimation);
+ bool operator==(const Animation& rAnimation) const;
+ bool operator!=(const Animation& rAnimation) const { return !(*this == rAnimation); }
+
+ void Clear();
+
+ bool Start(OutputDevice& rOutDev, const Point& rDestPt, const Size& rDestSz,
+ tools::Long nRendererId, OutputDevice* pFirstFrameOutDev);
+
+ void Stop(const OutputDevice* pOutDev = nullptr, tools::Long nRendererId = 0);
+
+ void Draw(OutputDevice& rOutDev, const Point& rDestPt) const;
+ void Draw(OutputDevice& rOutDev, const Point& rDestPt, const Size& rDestSz) const;
+
+ bool IsInAnimation() const { return mbIsInAnimation; }
+ bool IsTransparent() const;
+
+ const Size& GetDisplaySizePixel() const { return maGlobalSize; }
+ void SetDisplaySizePixel(const Size& rSize) { maGlobalSize = rSize; }
+
+ const BitmapEx& GetBitmapEx() const { return maBitmapEx; }
+ void SetBitmapEx(const BitmapEx& rBmpEx) { maBitmapEx = rBmpEx; }
+
+ sal_uInt32 GetLoopCount() const { return mnLoopCount; }
+ void SetLoopCount(const sal_uInt32 nLoopCount);
+ void ResetLoopCount();
+
+ void SetNotifyHdl(const Link<Animation*, void>& rLink) { maNotifyLink = rLink; }
+ const Link<Animation*, void>& GetNotifyHdl() const { return maNotifyLink; }
+
+ std::vector<std::unique_ptr<AnimationFrame>>& GetAnimationFrames() { return maFrames; }
+ size_t Count() const { return maFrames.size(); }
+ bool Insert(const AnimationFrame& rAnimationFrame);
+ const AnimationFrame& Get(sal_uInt16 nAnimation) const;
+ void Replace(const AnimationFrame& rNewAnimationBmp, sal_uInt16 nAnimation);
+
+ sal_uLong GetSizeBytes() const;
+ BitmapChecksum GetChecksum() const;
+
+public:
+ void Convert(BmpConversion eConversion);
+ bool ReduceColors(sal_uInt16 nNewColorCount);
+
+ bool Invert();
+ void Mirror(BmpMirrorFlags nMirrorFlags);
+ void Adjust(short nLuminancePercent, short nContrastPercent, short nChannelRPercent,
+ short nChannelGPercent, short nChannelBPercent, double fGamma = 1.0,
+ bool bInvert = false);
+
+ friend SvStream& ReadAnimation(SvStream& rIStream, Animation& rAnimation);
+ friend SvStream& WriteAnimation(SvStream& rOStream, const Animation& rAnimation);
+
+public:
+ SAL_DLLPRIVATE static void ImplIncAnimCount() { gAnimationRendererCount++; }
+ SAL_DLLPRIVATE static void ImplDecAnimCount() { gAnimationRendererCount--; }
+ SAL_DLLPRIVATE sal_uLong ImplGetCurPos() const { return mnFrameIndex; }
+
+private:
+ SAL_DLLPRIVATE static sal_uLong gAnimationRendererCount;
+
+ std::vector<std::unique_ptr<AnimationFrame>> maFrames;
+ std::vector<std::unique_ptr<AnimationRenderer>> maRenderers;
+
+ Link<Animation*, void> maNotifyLink;
+ BitmapEx maBitmapEx;
+ Timer maTimer;
+ Size maGlobalSize;
+ sal_uInt32 mnLoopCount;
+ sal_uInt32 mnLoops;
+ size_t mnFrameIndex;
+ bool mbIsInAnimation;
+ bool mbLoopTerminated;
+
+ SAL_DLLPRIVATE std::vector<std::unique_ptr<AnimationData>> CreateAnimationDataItems();
+ SAL_DLLPRIVATE void PopulateRenderers();
+ SAL_DLLPRIVATE void RenderNextFrameInAllRenderers();
+ SAL_DLLPRIVATE void PruneMarkedRenderers();
+ SAL_DLLPRIVATE bool IsAnyRendererActive();
+
+ SAL_DLLPRIVATE void ImplRestartTimer(sal_uLong nTimeout);
+ DECL_DLLPRIVATE_LINK(ImplTimeoutHdl, Timer*, void);
+};
+
+#endif // INCLUDED_VCL_ANIMATE_ANIMATION_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/vcl/animate/AnimationFrame.hxx b/include/vcl/animate/AnimationFrame.hxx
new file mode 100644
index 0000000000..3e9a4b21d1
--- /dev/null
+++ b/include/vcl/animate/AnimationFrame.hxx
@@ -0,0 +1,85 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#pragma once
+
+#include <vcl/bitmapex.hxx>
+
+enum class Disposal
+{
+ Not,
+ Back,
+ Previous
+};
+
+enum class Blend
+{
+ Source,
+ Over
+};
+
+struct AnimationFrame
+{
+ BitmapEx maBitmapEx;
+ Point maPositionPixel;
+ Size maSizePixel;
+ tools::Long mnWait;
+ Disposal meDisposal;
+ Blend meBlend;
+ bool mbUserInput;
+
+ AnimationFrame()
+ : mnWait(0)
+ , meDisposal(Disposal::Not)
+ , meBlend(Blend::Over)
+ , mbUserInput(false)
+ {
+ }
+
+ AnimationFrame(const BitmapEx& rBitmapEx, const Point& rPositionPixel, const Size& rSizePixel,
+ tools::Long nWait = 0, Disposal eDisposal = Disposal::Not,
+ Blend eBlend = Blend::Over)
+ : maBitmapEx(rBitmapEx)
+ , maPositionPixel(rPositionPixel)
+ , maSizePixel(rSizePixel)
+ , mnWait(nWait)
+ , meDisposal(eDisposal)
+ , meBlend(eBlend)
+ , mbUserInput(false)
+ {
+ }
+
+ bool operator==(const AnimationFrame& rAnimationFrame) const
+ {
+ return (rAnimationFrame.maBitmapEx == maBitmapEx
+ && rAnimationFrame.maPositionPixel == maPositionPixel
+ && rAnimationFrame.maSizePixel == maSizePixel && rAnimationFrame.mnWait == mnWait
+ && rAnimationFrame.meDisposal == meDisposal && rAnimationFrame.meBlend == meBlend
+ && rAnimationFrame.mbUserInput == mbUserInput);
+ }
+
+ bool operator!=(const AnimationFrame& rAnimationFrame) const
+ {
+ return !(*this == rAnimationFrame);
+ }
+
+ BitmapChecksum GetChecksum() const;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */