Line data Source code
1 : /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 : /* This Source Code Form is subject to the terms of the Mozilla Public
3 : * License, v. 2.0. If a copy of the MPL was not distributed with this
4 : * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 :
6 : #ifndef mozilla_image_FrozenImage_h
7 : #define mozilla_image_FrozenImage_h
8 :
9 : #include "ImageWrapper.h"
10 : #include "mozilla/gfx/2D.h"
11 : #include "mozilla/RefPtr.h"
12 :
13 : namespace mozilla {
14 : namespace image {
15 :
16 : /**
17 : * An Image wrapper that disables animation, freezing the image at its first
18 : * frame. It does this using two strategies. If this is the only instance of the
19 : * image, animation will never start, because IncrementAnimationConsumers is
20 : * ignored. If there is another instance that is animated, that's still OK,
21 : * because any imgIContainer method that is affected by animation gets its
22 : * aWhichFrame argument set to FRAME_FIRST when it passes through FrozenImage.
23 : *
24 : * XXX(seth): There a known (performance, not correctness) issue with
25 : * GetImageContainer. See the comments for that method for more information.
26 : */
27 : class FrozenImage : public ImageWrapper
28 : {
29 : typedef gfx::SourceSurface SourceSurface;
30 :
31 : public:
32 : NS_DECL_ISUPPORTS_INHERITED
33 :
34 : virtual void IncrementAnimationConsumers() override;
35 : virtual void DecrementAnimationConsumers() override;
36 :
37 : NS_IMETHOD GetAnimated(bool* aAnimated) override;
38 : NS_IMETHOD_(already_AddRefed<SourceSurface>)
39 : GetFrame(uint32_t aWhichFrame, uint32_t aFlags) override;
40 : NS_IMETHOD_(already_AddRefed<SourceSurface>)
41 : GetFrameAtSize(const gfx::IntSize& aSize,
42 : uint32_t aWhichFrame,
43 : uint32_t aFlags) override;
44 : NS_IMETHOD_(bool) IsImageContainerAvailable(layers::LayerManager* aManager,
45 : uint32_t aFlags) override;
46 : NS_IMETHOD_(already_AddRefed<layers::ImageContainer>)
47 : GetImageContainer(layers::LayerManager* aManager,
48 : uint32_t aFlags) override;
49 : NS_IMETHOD_(DrawResult) Draw(gfxContext* aContext,
50 : const nsIntSize& aSize,
51 : const ImageRegion& aRegion,
52 : uint32_t aWhichFrame,
53 : gfx::SamplingFilter aSamplingFilter,
54 : const Maybe<SVGImageContext>& aSVGContext,
55 : uint32_t aFlags,
56 : float aOpacity) override;
57 : NS_IMETHOD_(void) RequestRefresh(const TimeStamp& aTime) override;
58 : NS_IMETHOD GetAnimationMode(uint16_t* aAnimationMode) override;
59 : NS_IMETHOD SetAnimationMode(uint16_t aAnimationMode) override;
60 : NS_IMETHOD ResetAnimation() override;
61 : NS_IMETHOD_(float) GetFrameIndex(uint32_t aWhichFrame) override;
62 :
63 : protected:
64 0 : explicit FrozenImage(Image* aImage) : ImageWrapper(aImage) { }
65 0 : virtual ~FrozenImage() { }
66 :
67 : private:
68 : friend class ImageOps;
69 : };
70 :
71 : } // namespace image
72 : } // namespace mozilla
73 :
74 : #endif // mozilla_image_FrozenImage_h
|