Bug 1498115 - Part 1: Remove the FlexboxContainerProperties component. r=pbro
[gecko.git] / image / DynamicImage.cpp
blobd42109567db58c88b5b148176186d0d3cd88406f
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/. */
6 #include "DynamicImage.h"
7 #include "gfxPlatform.h"
8 #include "gfxUtils.h"
9 #include "mozilla/gfx/2D.h"
10 #include "mozilla/gfx/Logging.h"
11 #include "mozilla/RefPtr.h"
12 #include "ImageRegion.h"
13 #include "Orientation.h"
14 #include "SVGImageContext.h"
16 #include "mozilla/MemoryReporting.h"
18 using namespace mozilla;
19 using namespace mozilla::gfx;
20 using mozilla::layers::LayerManager;
21 using mozilla::layers::ImageContainer;
23 namespace mozilla {
24 namespace image {
26 // Inherited methods from Image.
28 already_AddRefed<ProgressTracker>
29 DynamicImage::GetProgressTracker()
31 return nullptr;
34 size_t
35 DynamicImage::SizeOfSourceWithComputedFallback(SizeOfState& aState) const
37 return 0;
40 void
41 DynamicImage::CollectSizeOfSurfaces(nsTArray<SurfaceMemoryCounter>& aCounters,
42 MallocSizeOf aMallocSizeOf) const
44 // We can't report anything useful because gfxDrawable doesn't expose this
45 // information.
48 void
49 DynamicImage::IncrementAnimationConsumers()
50 { }
52 void
53 DynamicImage::DecrementAnimationConsumers()
54 { }
56 #ifdef DEBUG
57 uint32_t
58 DynamicImage::GetAnimationConsumers()
60 return 0;
62 #endif
64 nsresult
65 DynamicImage::OnImageDataAvailable(nsIRequest* aRequest,
66 nsISupports* aContext,
67 nsIInputStream* aInStr,
68 uint64_t aSourceOffset,
69 uint32_t aCount)
71 return NS_OK;
74 nsresult
75 DynamicImage::OnImageDataComplete(nsIRequest* aRequest,
76 nsISupports* aContext,
77 nsresult aStatus,
78 bool aLastPart)
80 return NS_OK;
83 void
84 DynamicImage::OnSurfaceDiscarded(const SurfaceKey& aSurfaceKey)
85 { }
87 void
88 DynamicImage::SetInnerWindowID(uint64_t aInnerWindowId)
89 { }
91 uint64_t
92 DynamicImage::InnerWindowID() const
94 return 0;
97 bool
98 DynamicImage::HasError()
100 return !mDrawable;
103 void
104 DynamicImage::SetHasError()
107 nsIURI*
108 DynamicImage::GetURI() const
110 return nullptr;
113 // Methods inherited from XPCOM interfaces.
115 NS_IMPL_ISUPPORTS(DynamicImage, imgIContainer)
117 NS_IMETHODIMP
118 DynamicImage::GetWidth(int32_t* aWidth)
120 *aWidth = mDrawable->Size().width;
121 return NS_OK;
124 NS_IMETHODIMP
125 DynamicImage::GetHeight(int32_t* aHeight)
127 *aHeight = mDrawable->Size().height;
128 return NS_OK;
131 nsresult
132 DynamicImage::GetNativeSizes(nsTArray<IntSize>& aNativeSizes) const
134 return NS_ERROR_NOT_IMPLEMENTED;
137 size_t
138 DynamicImage::GetNativeSizesLength() const
140 return 0;
143 NS_IMETHODIMP
144 DynamicImage::GetIntrinsicSize(nsSize* aSize)
146 IntSize intSize(mDrawable->Size());
147 *aSize = nsSize(intSize.width, intSize.height);
148 return NS_OK;
151 NS_IMETHODIMP
152 DynamicImage::GetIntrinsicRatio(nsSize* aSize)
154 IntSize intSize(mDrawable->Size());
155 *aSize = nsSize(intSize.width, intSize.height);
156 return NS_OK;
159 NS_IMETHODIMP_(Orientation)
160 DynamicImage::GetOrientation()
162 return Orientation();
165 NS_IMETHODIMP
166 DynamicImage::GetType(uint16_t* aType)
168 *aType = imgIContainer::TYPE_RASTER;
169 return NS_OK;
172 NS_IMETHODIMP
173 DynamicImage::GetAnimated(bool* aAnimated)
175 *aAnimated = false;
176 return NS_OK;
179 NS_IMETHODIMP_(already_AddRefed<SourceSurface>)
180 DynamicImage::GetFrame(uint32_t aWhichFrame,
181 uint32_t aFlags)
183 IntSize size(mDrawable->Size());
184 return GetFrameAtSize(IntSize(size.width, size.height),
185 aWhichFrame,
186 aFlags);
189 NS_IMETHODIMP_(already_AddRefed<SourceSurface>)
190 DynamicImage::GetFrameAtSize(const IntSize& aSize,
191 uint32_t aWhichFrame,
192 uint32_t aFlags)
194 RefPtr<DrawTarget> dt = gfxPlatform::GetPlatform()->
195 CreateOffscreenContentDrawTarget(aSize, SurfaceFormat::B8G8R8A8);
196 if (!dt || !dt->IsValid()) {
197 gfxWarning() <<
198 "DynamicImage::GetFrame failed in CreateOffscreenContentDrawTarget";
199 return nullptr;
201 RefPtr<gfxContext> context = gfxContext::CreateOrNull(dt);
202 MOZ_ASSERT(context); // already checked the draw target above
204 auto result = Draw(context, aSize, ImageRegion::Create(aSize),
205 aWhichFrame, SamplingFilter::POINT, Nothing(), aFlags,
206 1.0);
208 return result == ImgDrawResult::SUCCESS ? dt->Snapshot() : nullptr;
211 NS_IMETHODIMP_(bool)
212 DynamicImage::WillDrawOpaqueNow()
214 return false;
217 NS_IMETHODIMP_(bool)
218 DynamicImage::IsImageContainerAvailable(LayerManager* aManager, uint32_t aFlags)
220 return false;
223 NS_IMETHODIMP_(already_AddRefed<ImageContainer>)
224 DynamicImage::GetImageContainer(LayerManager* aManager, uint32_t aFlags)
226 return nullptr;
229 NS_IMETHODIMP_(bool)
230 DynamicImage::IsImageContainerAvailableAtSize(LayerManager* aManager,
231 const IntSize& aSize,
232 uint32_t aFlags)
234 return false;
237 NS_IMETHODIMP_(ImgDrawResult)
238 DynamicImage::GetImageContainerAtSize(layers::LayerManager* aManager,
239 const gfx::IntSize& aSize,
240 const Maybe<SVGImageContext>& aSVGContext,
241 uint32_t aFlags,
242 layers::ImageContainer** aContainer)
244 return ImgDrawResult::NOT_SUPPORTED;
247 NS_IMETHODIMP_(ImgDrawResult)
248 DynamicImage::Draw(gfxContext* aContext,
249 const nsIntSize& aSize,
250 const ImageRegion& aRegion,
251 uint32_t aWhichFrame,
252 SamplingFilter aSamplingFilter,
253 const Maybe<SVGImageContext>& aSVGContext,
254 uint32_t aFlags,
255 float aOpacity)
257 MOZ_ASSERT(!aSize.IsEmpty(), "Unexpected empty size");
259 IntSize drawableSize(mDrawable->Size());
261 if (aSize == drawableSize) {
262 gfxUtils::DrawPixelSnapped(aContext, mDrawable, SizeDouble(drawableSize), aRegion,
263 SurfaceFormat::B8G8R8A8, aSamplingFilter,
264 aOpacity);
265 return ImgDrawResult::SUCCESS;
268 gfxSize scale(double(aSize.width) / drawableSize.width,
269 double(aSize.height) / drawableSize.height);
271 ImageRegion region(aRegion);
272 region.Scale(1.0 / scale.width, 1.0 / scale.height);
274 gfxContextMatrixAutoSaveRestore saveMatrix(aContext);
275 aContext->Multiply(gfxMatrix::Scaling(scale.width, scale.height));
277 gfxUtils::DrawPixelSnapped(aContext, mDrawable, SizeDouble(drawableSize), region,
278 SurfaceFormat::B8G8R8A8, aSamplingFilter,
279 aOpacity);
280 return ImgDrawResult::SUCCESS;
283 NS_IMETHODIMP
284 DynamicImage::StartDecoding(uint32_t aFlags)
286 return NS_OK;
289 bool
290 DynamicImage::StartDecodingWithResult(uint32_t aFlags)
292 return true;
295 NS_IMETHODIMP
296 DynamicImage::RequestDecodeForSize(const nsIntSize& aSize, uint32_t aFlags)
298 return NS_OK;
301 NS_IMETHODIMP
302 DynamicImage::LockImage()
304 return NS_OK;
307 NS_IMETHODIMP
308 DynamicImage::UnlockImage()
310 return NS_OK;
313 NS_IMETHODIMP
314 DynamicImage::RequestDiscard()
316 return NS_OK;
319 NS_IMETHODIMP_(void)
320 DynamicImage::RequestRefresh(const mozilla::TimeStamp& aTime)
323 NS_IMETHODIMP
324 DynamicImage::GetAnimationMode(uint16_t* aAnimationMode)
326 *aAnimationMode = kNormalAnimMode;
327 return NS_OK;
330 NS_IMETHODIMP
331 DynamicImage::SetAnimationMode(uint16_t aAnimationMode)
333 return NS_OK;
336 NS_IMETHODIMP
337 DynamicImage::ResetAnimation()
339 return NS_OK;
342 NS_IMETHODIMP_(float)
343 DynamicImage::GetFrameIndex(uint32_t aWhichFrame)
345 return 0;
348 NS_IMETHODIMP_(int32_t)
349 DynamicImage::GetFirstFrameDelay()
351 return 0;
354 NS_IMETHODIMP_(void)
355 DynamicImage::SetAnimationStartTime(const mozilla::TimeStamp& aTime)
358 nsIntSize
359 DynamicImage::OptimalImageSizeForDest(const gfxSize& aDest,
360 uint32_t aWhichFrame,
361 SamplingFilter aSamplingFilter,
362 uint32_t aFlags)
364 IntSize size(mDrawable->Size());
365 return nsIntSize(size.width, size.height);
368 NS_IMETHODIMP_(nsIntRect)
369 DynamicImage::GetImageSpaceInvalidationRect(const nsIntRect& aRect)
371 return aRect;
374 already_AddRefed<imgIContainer>
375 DynamicImage::Unwrap()
377 nsCOMPtr<imgIContainer> self(this);
378 return self.forget();
381 void
382 DynamicImage::PropagateUseCounters(nsIDocument*)
384 // No use counters.
387 } // namespace image
388 } // namespace mozilla