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 #include "FrozenImage.h"
7 
8 namespace mozilla {
9 
10 using namespace gfx;
11 using layers::ImageContainer;
12 using layers::LayerManager;
13 
14 namespace image {
15 
IncrementAnimationConsumers()16 void FrozenImage::IncrementAnimationConsumers() {
17   // Do nothing. This will prevent animation from starting if there are no other
18   // instances of this image.
19 }
20 
DecrementAnimationConsumers()21 void FrozenImage::DecrementAnimationConsumers() {
22   // Do nothing.
23 }
24 
25 NS_IMETHODIMP
GetAnimated(bool * aAnimated)26 FrozenImage::GetAnimated(bool* aAnimated) {
27   bool dummy;
28   nsresult rv = InnerImage()->GetAnimated(&dummy);
29   if (NS_SUCCEEDED(rv)) {
30     *aAnimated = false;
31   }
32   return rv;
33 }
34 
NS_IMETHODIMP_(already_AddRefed<SourceSurface>)35 NS_IMETHODIMP_(already_AddRefed<SourceSurface>)
36 FrozenImage::GetFrame(uint32_t aWhichFrame, uint32_t aFlags) {
37   return InnerImage()->GetFrame(FRAME_FIRST, aFlags);
38 }
39 
NS_IMETHODIMP_(already_AddRefed<SourceSurface>)40 NS_IMETHODIMP_(already_AddRefed<SourceSurface>)
41 FrozenImage::GetFrameAtSize(const IntSize& aSize, uint32_t aWhichFrame,
42                             uint32_t aFlags) {
43   return InnerImage()->GetFrameAtSize(aSize, FRAME_FIRST, aFlags);
44 }
45 
IsNonAnimated() const46 bool FrozenImage::IsNonAnimated() const {
47   // We usually don't create frozen images for non-animated images, but it might
48   // happen if we don't have enough data at the time of the creation to
49   // determine whether the image is actually animated.
50   bool animated = false;
51   return NS_SUCCEEDED(InnerImage()->GetAnimated(&animated)) && !animated;
52 }
53 
NS_IMETHODIMP_(bool)54 NS_IMETHODIMP_(bool)
55 FrozenImage::IsImageContainerAvailable(LayerManager* aManager,
56                                        uint32_t aFlags) {
57   if (IsNonAnimated()) {
58     return InnerImage()->IsImageContainerAvailable(aManager, aFlags);
59   }
60   return false;
61 }
62 
NS_IMETHODIMP_(already_AddRefed<ImageContainer>)63 NS_IMETHODIMP_(already_AddRefed<ImageContainer>)
64 FrozenImage::GetImageContainer(layers::LayerManager* aManager,
65                                uint32_t aFlags) {
66   if (IsNonAnimated()) {
67     return InnerImage()->GetImageContainer(aManager, aFlags);
68   }
69   // XXX(seth): GetImageContainer does not currently support anything but the
70   // current frame. We work around this by always returning null, but if it ever
71   // turns out that FrozenImage is widely used on codepaths that can actually
72   // benefit from GetImageContainer, it would be a good idea to fix that method
73   // for performance reasons.
74   return nullptr;
75 }
76 
NS_IMETHODIMP_(bool)77 NS_IMETHODIMP_(bool)
78 FrozenImage::IsImageContainerAvailableAtSize(LayerManager* aManager,
79                                              const IntSize& aSize,
80                                              uint32_t aFlags) {
81   if (IsNonAnimated()) {
82     return InnerImage()->IsImageContainerAvailableAtSize(aManager, aSize,
83                                                          aFlags);
84   }
85   return false;
86 }
87 
NS_IMETHODIMP_(ImgDrawResult)88 NS_IMETHODIMP_(ImgDrawResult)
89 FrozenImage::GetImageContainerAtSize(layers::LayerManager* aManager,
90                                      const gfx::IntSize& aSize,
91                                      const Maybe<SVGImageContext>& aSVGContext,
92                                      const Maybe<ImageIntRegion>& aRegion,
93                                      uint32_t aFlags,
94                                      layers::ImageContainer** aOutContainer) {
95   if (IsNonAnimated()) {
96     return InnerImage()->GetImageContainerAtSize(
97         aManager, aSize, aSVGContext, aRegion, aFlags, aOutContainer);
98   }
99 
100   // XXX(seth): GetImageContainer does not currently support anything but the
101   // current frame. We work around this by always returning null, but if it ever
102   // turns out that FrozenImage is widely used on codepaths that can actually
103   // benefit from GetImageContainer, it would be a good idea to fix that method
104   // for performance reasons.
105   return ImgDrawResult::NOT_SUPPORTED;
106 }
107 
NS_IMETHODIMP_(ImgDrawResult)108 NS_IMETHODIMP_(ImgDrawResult)
109 FrozenImage::Draw(gfxContext* aContext, const nsIntSize& aSize,
110                   const ImageRegion& aRegion,
111                   uint32_t /* aWhichFrame - ignored */,
112                   SamplingFilter aSamplingFilter,
113                   const Maybe<SVGImageContext>& aSVGContext, uint32_t aFlags,
114                   float aOpacity) {
115   return InnerImage()->Draw(aContext, aSize, aRegion, FRAME_FIRST,
116                             aSamplingFilter, aSVGContext, aFlags, aOpacity);
117 }
118 
119 NS_IMETHODIMP
StartDecoding(uint32_t aFlags,uint32_t aWhichFrame)120 FrozenImage::StartDecoding(uint32_t aFlags, uint32_t aWhichFrame) {
121   return InnerImage()->StartDecoding(aFlags, FRAME_FIRST);
122 }
123 
StartDecodingWithResult(uint32_t aFlags,uint32_t aWhichFrame)124 bool FrozenImage::StartDecodingWithResult(uint32_t aFlags,
125                                           uint32_t aWhichFrame) {
126   return InnerImage()->StartDecodingWithResult(aFlags, FRAME_FIRST);
127 }
128 
RequestDecodeWithResult(uint32_t aFlags,uint32_t aWhichFrame)129 imgIContainer::DecodeResult FrozenImage::RequestDecodeWithResult(
130     uint32_t aFlags, uint32_t aWhichFrame) {
131   return InnerImage()->RequestDecodeWithResult(aFlags, FRAME_FIRST);
132 }
133 
134 NS_IMETHODIMP
RequestDecodeForSize(const nsIntSize & aSize,uint32_t aFlags,uint32_t aWhichFrame)135 FrozenImage::RequestDecodeForSize(const nsIntSize& aSize, uint32_t aFlags,
136                                   uint32_t aWhichFrame) {
137   return InnerImage()->RequestDecodeForSize(aSize, aFlags, FRAME_FIRST);
138 }
139 
NS_IMETHODIMP_(void)140 NS_IMETHODIMP_(void)
141 FrozenImage::RequestRefresh(const TimeStamp& aTime) {
142   // Do nothing.
143 }
144 
145 NS_IMETHODIMP
GetAnimationMode(uint16_t * aAnimationMode)146 FrozenImage::GetAnimationMode(uint16_t* aAnimationMode) {
147   *aAnimationMode = kNormalAnimMode;
148   return NS_OK;
149 }
150 
151 NS_IMETHODIMP
SetAnimationMode(uint16_t aAnimationMode)152 FrozenImage::SetAnimationMode(uint16_t aAnimationMode) {
153   // Do nothing.
154   return NS_OK;
155 }
156 
157 NS_IMETHODIMP
ResetAnimation()158 FrozenImage::ResetAnimation() {
159   // Do nothing.
160   return NS_OK;
161 }
162 
NS_IMETHODIMP_(float)163 NS_IMETHODIMP_(float)
164 FrozenImage::GetFrameIndex(uint32_t aWhichFrame) {
165   MOZ_ASSERT(aWhichFrame <= FRAME_MAX_VALUE, "Invalid argument");
166   return 0;
167 }
168 
169 }  // namespace image
170 }  // namespace mozilla
171