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"
9 #include "mozilla/gfx/2D.h"
10 #include "mozilla/RefPtr.h"
11 #include "ImageRegion.h"
12 #include "Orientation.h"
13 #include "SVGImageContext.h"
15 #include "mozilla/MemoryReporting.h"
17 using namespace mozilla
;
18 using namespace mozilla::gfx
;
19 using mozilla::layers::LayerManager
;
20 using mozilla::layers::ImageContainer
;
25 // Inherited methods from Image.
28 DynamicImage::Init(const char* aMimeType
, uint32_t aFlags
)
33 already_AddRefed
<imgStatusTracker
>
34 DynamicImage::GetStatusTracker()
40 DynamicImage::FrameRect(uint32_t aWhichFrame
)
42 gfxIntSize
size(mDrawable
->Size());
43 return nsIntRect(0, 0, size
.width
, size
.height
);
47 DynamicImage::SizeOfData()
49 // We don't know the answer to this (and the same goes for the other
50 // memory-related methods) since gfxDrawable doesn't expose a way to check.
55 DynamicImage::HeapSizeOfSourceWithComputedFallback(mozilla::MallocSizeOf aMallocSizeOf
) const
61 DynamicImage::HeapSizeOfDecodedWithComputedFallback(mozilla::MallocSizeOf aMallocSizeOf
) const
67 DynamicImage::NonHeapSizeOfDecoded() const
73 DynamicImage::OutOfProcessSizeOfDecoded() const
79 DynamicImage::HeapSizeOfVectorImageDocument(nsACString
* aDocURL
) const
85 DynamicImage::IncrementAnimationConsumers()
89 DynamicImage::DecrementAnimationConsumers()
94 DynamicImage::GetAnimationConsumers()
101 DynamicImage::OnImageDataAvailable(nsIRequest
* aRequest
,
102 nsISupports
* aContext
,
103 nsIInputStream
* aInStr
,
104 uint64_t aSourceOffset
,
111 DynamicImage::OnImageDataComplete(nsIRequest
* aRequest
,
112 nsISupports
* aContext
,
120 DynamicImage::OnNewSourceData()
126 DynamicImage::SetInnerWindowID(uint64_t aInnerWindowId
)
130 DynamicImage::InnerWindowID() const
136 DynamicImage::HasError()
142 DynamicImage::SetHasError()
146 DynamicImage::GetURI()
151 // Methods inherited from XPCOM interfaces.
153 NS_IMPL_ISUPPORTS(DynamicImage
, imgIContainer
)
156 DynamicImage::GetWidth(int32_t* aWidth
)
158 *aWidth
= mDrawable
->Size().width
;
163 DynamicImage::GetHeight(int32_t* aHeight
)
165 *aHeight
= mDrawable
->Size().height
;
170 DynamicImage::GetIntrinsicSize(nsSize
* aSize
)
172 gfxIntSize
intSize(mDrawable
->Size());
173 *aSize
= nsSize(intSize
.width
, intSize
.height
);
178 DynamicImage::GetIntrinsicRatio(nsSize
* aSize
)
180 gfxIntSize
intSize(mDrawable
->Size());
181 *aSize
= nsSize(intSize
.width
, intSize
.height
);
185 NS_IMETHODIMP_(Orientation
)
186 DynamicImage::GetOrientation()
188 return Orientation();
192 DynamicImage::GetType(uint16_t* aType
)
194 *aType
= imgIContainer::TYPE_RASTER
;
198 NS_IMETHODIMP_(uint16_t)
199 DynamicImage::GetType()
201 return imgIContainer::TYPE_RASTER
;
205 DynamicImage::GetAnimated(bool* aAnimated
)
211 NS_IMETHODIMP_(TemporaryRef
<SourceSurface
>)
212 DynamicImage::GetFrame(uint32_t aWhichFrame
,
215 gfxIntSize
size(mDrawable
->Size());
217 RefPtr
<DrawTarget
> dt
= gfxPlatform::GetPlatform()->
218 CreateOffscreenContentDrawTarget(IntSize(size
.width
, size
.height
),
219 SurfaceFormat::B8G8R8A8
);
220 nsRefPtr
<gfxContext
> context
= new gfxContext(dt
);
222 nsresult rv
= Draw(context
, size
, ImageRegion::Create(size
),
223 aWhichFrame
, GraphicsFilter::FILTER_NEAREST
,
226 NS_ENSURE_SUCCESS(rv
, nullptr);
227 return dt
->Snapshot();
231 DynamicImage::FrameIsOpaque(uint32_t aWhichFrame
)
233 // XXX(seth): For performance reasons it'd be better to return true here, but
234 // I'm not sure how we can guarantee it for an arbitrary gfxDrawable.
239 DynamicImage::GetImageContainer(LayerManager
* aManager
, ImageContainer
** _retval
)
246 DynamicImage::Draw(gfxContext
* aContext
,
247 const nsIntSize
& aSize
,
248 const ImageRegion
& aRegion
,
249 uint32_t aWhichFrame
,
250 GraphicsFilter aFilter
,
251 const Maybe
<SVGImageContext
>& aSVGContext
,
254 MOZ_ASSERT(!aSize
.IsEmpty(), "Unexpected empty size");
256 gfxIntSize
drawableSize(mDrawable
->Size());
258 if (aSize
== drawableSize
) {
259 gfxUtils::DrawPixelSnapped(aContext
, mDrawable
, drawableSize
, aRegion
,
260 SurfaceFormat::B8G8R8A8
, aFilter
);
264 gfxSize
scale(double(aSize
.width
) / drawableSize
.width
,
265 double(aSize
.height
) / drawableSize
.height
);
267 ImageRegion
region(aRegion
);
268 region
.Scale(1.0 / scale
.width
, 1.0 / scale
.height
);
270 gfxContextMatrixAutoSaveRestore
saveMatrix(aContext
);
271 aContext
->Multiply(gfxMatrix::Scaling(scale
.width
, scale
.height
));
273 gfxUtils::DrawPixelSnapped(aContext
, mDrawable
, drawableSize
, region
,
274 SurfaceFormat::B8G8R8A8
, aFilter
);
279 DynamicImage::RequestDecode()
285 DynamicImage::StartDecoding()
291 DynamicImage::IsDecoded()
297 DynamicImage::LockImage()
303 DynamicImage::UnlockImage()
309 DynamicImage::RequestDiscard()
315 DynamicImage::RequestRefresh(const mozilla::TimeStamp
& aTime
)
319 DynamicImage::GetAnimationMode(uint16_t* aAnimationMode
)
321 *aAnimationMode
= kNormalAnimMode
;
326 DynamicImage::SetAnimationMode(uint16_t aAnimationMode
)
332 DynamicImage::ResetAnimation()
337 NS_IMETHODIMP_(float)
338 DynamicImage::GetFrameIndex(uint32_t aWhichFrame
)
343 NS_IMETHODIMP_(int32_t)
344 DynamicImage::GetFirstFrameDelay()
350 DynamicImage::SetAnimationStartTime(const mozilla::TimeStamp
& aTime
)
354 DynamicImage::OptimalImageSizeForDest(const gfxSize
& aDest
, uint32_t aWhichFrame
, GraphicsFilter aFilter
, uint32_t aFlags
)
356 gfxIntSize
size(mDrawable
->Size());
357 return nsIntSize(size
.width
, size
.height
);
360 NS_IMETHODIMP_(nsIntRect
)
361 DynamicImage::GetImageSpaceInvalidationRect(const nsIntRect
& aRect
)
366 already_AddRefed
<imgIContainer
>
367 DynamicImage::Unwrap()
369 nsCOMPtr
<imgIContainer
> self(this);
370 return self
.forget();
374 } // namespace mozilla