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 "ImageWrapper.h"
7 #include "mozilla/gfx/2D.h"
8 #include "mozilla/RefPtr.h"
9 #include "Orientation.h"
11 #include "mozilla/MemoryReporting.h"
16 using gfx::DataSourceSurface
;
18 using gfx::SamplingFilter
;
19 using gfx::SourceSurface
;
20 using layers::ImageContainer
;
21 using layers::LayerManager
;
25 // Inherited methods from Image.
27 already_AddRefed
<ProgressTracker
> ImageWrapper::GetProgressTracker() {
28 return mInnerImage
->GetProgressTracker();
31 size_t ImageWrapper::SizeOfSourceWithComputedFallback(
32 SizeOfState
& aState
) const {
33 return mInnerImage
->SizeOfSourceWithComputedFallback(aState
);
36 void ImageWrapper::CollectSizeOfSurfaces(
37 nsTArray
<SurfaceMemoryCounter
>& aCounters
,
38 MallocSizeOf aMallocSizeOf
) const {
39 mInnerImage
->CollectSizeOfSurfaces(aCounters
, aMallocSizeOf
);
42 void ImageWrapper::IncrementAnimationConsumers() {
43 MOZ_ASSERT(NS_IsMainThread(),
44 "Main thread only to encourage serialization "
45 "with DecrementAnimationConsumers");
46 mInnerImage
->IncrementAnimationConsumers();
49 void ImageWrapper::DecrementAnimationConsumers() {
50 MOZ_ASSERT(NS_IsMainThread(),
51 "Main thread only to encourage serialization "
52 "with IncrementAnimationConsumers");
53 mInnerImage
->DecrementAnimationConsumers();
57 uint32_t ImageWrapper::GetAnimationConsumers() {
58 return mInnerImage
->GetAnimationConsumers();
62 nsresult
ImageWrapper::OnImageDataAvailable(nsIRequest
* aRequest
,
63 nsISupports
* aContext
,
64 nsIInputStream
* aInStr
,
65 uint64_t aSourceOffset
,
67 return mInnerImage
->OnImageDataAvailable(aRequest
, aContext
, aInStr
,
68 aSourceOffset
, aCount
);
71 nsresult
ImageWrapper::OnImageDataComplete(nsIRequest
* aRequest
,
72 nsISupports
* aContext
,
73 nsresult aStatus
, bool aLastPart
) {
74 return mInnerImage
->OnImageDataComplete(aRequest
, aContext
, aStatus
,
78 void ImageWrapper::OnSurfaceDiscarded(const SurfaceKey
& aSurfaceKey
) {
79 return mInnerImage
->OnSurfaceDiscarded(aSurfaceKey
);
82 void ImageWrapper::SetInnerWindowID(uint64_t aInnerWindowId
) {
83 mInnerImage
->SetInnerWindowID(aInnerWindowId
);
86 uint64_t ImageWrapper::InnerWindowID() const {
87 return mInnerImage
->InnerWindowID();
90 bool ImageWrapper::HasError() { return mInnerImage
->HasError(); }
92 void ImageWrapper::SetHasError() { mInnerImage
->SetHasError(); }
94 nsIURI
* ImageWrapper::GetURI() const { return mInnerImage
->GetURI(); }
96 // Methods inherited from XPCOM interfaces.
98 NS_IMPL_ISUPPORTS(ImageWrapper
, imgIContainer
)
101 ImageWrapper::GetWidth(int32_t* aWidth
) {
102 return mInnerImage
->GetWidth(aWidth
);
106 ImageWrapper::GetHeight(int32_t* aHeight
) {
107 return mInnerImage
->GetHeight(aHeight
);
110 nsresult
ImageWrapper::GetNativeSizes(nsTArray
<IntSize
>& aNativeSizes
) const {
111 return mInnerImage
->GetNativeSizes(aNativeSizes
);
114 size_t ImageWrapper::GetNativeSizesLength() const {
115 return mInnerImage
->GetNativeSizesLength();
119 ImageWrapper::GetIntrinsicSize(nsSize
* aSize
) {
120 return mInnerImage
->GetIntrinsicSize(aSize
);
124 ImageWrapper::GetIntrinsicRatio(nsSize
* aSize
) {
125 return mInnerImage
->GetIntrinsicRatio(aSize
);
128 NS_IMETHODIMP_(Orientation
)
129 ImageWrapper::GetOrientation() { return mInnerImage
->GetOrientation(); }
132 ImageWrapper::GetType(uint16_t* aType
) { return mInnerImage
->GetType(aType
); }
135 ImageWrapper::GetAnimated(bool* aAnimated
) {
136 return mInnerImage
->GetAnimated(aAnimated
);
139 NS_IMETHODIMP_(already_AddRefed
<SourceSurface
>)
140 ImageWrapper::GetFrame(uint32_t aWhichFrame
, uint32_t aFlags
) {
141 return mInnerImage
->GetFrame(aWhichFrame
, aFlags
);
144 NS_IMETHODIMP_(already_AddRefed
<SourceSurface
>)
145 ImageWrapper::GetFrameAtSize(const IntSize
& aSize
, uint32_t aWhichFrame
,
147 return mInnerImage
->GetFrameAtSize(aSize
, aWhichFrame
, aFlags
);
151 ImageWrapper::WillDrawOpaqueNow() { return mInnerImage
->WillDrawOpaqueNow(); }
154 ImageWrapper::IsImageContainerAvailable(LayerManager
* aManager
,
156 return mInnerImage
->IsImageContainerAvailable(aManager
, aFlags
);
159 NS_IMETHODIMP_(already_AddRefed
<ImageContainer
>)
160 ImageWrapper::GetImageContainer(LayerManager
* aManager
, uint32_t aFlags
) {
161 return mInnerImage
->GetImageContainer(aManager
, aFlags
);
165 ImageWrapper::IsImageContainerAvailableAtSize(LayerManager
* aManager
,
166 const IntSize
& aSize
,
168 return mInnerImage
->IsImageContainerAvailableAtSize(aManager
, aSize
, aFlags
);
171 NS_IMETHODIMP_(ImgDrawResult
)
172 ImageWrapper::GetImageContainerAtSize(layers::LayerManager
* aManager
,
173 const gfx::IntSize
& aSize
,
174 const Maybe
<SVGImageContext
>& aSVGContext
,
176 layers::ImageContainer
** aOutContainer
) {
177 return mInnerImage
->GetImageContainerAtSize(aManager
, aSize
, aSVGContext
,
178 aFlags
, aOutContainer
);
181 NS_IMETHODIMP_(ImgDrawResult
)
182 ImageWrapper::Draw(gfxContext
* aContext
, const nsIntSize
& aSize
,
183 const ImageRegion
& aRegion
, uint32_t aWhichFrame
,
184 SamplingFilter aSamplingFilter
,
185 const Maybe
<SVGImageContext
>& aSVGContext
, uint32_t aFlags
,
187 return mInnerImage
->Draw(aContext
, aSize
, aRegion
, aWhichFrame
,
188 aSamplingFilter
, aSVGContext
, aFlags
, aOpacity
);
192 ImageWrapper::StartDecoding(uint32_t aFlags
) {
193 return mInnerImage
->StartDecoding(aFlags
);
196 bool ImageWrapper::StartDecodingWithResult(uint32_t aFlags
) {
197 return mInnerImage
->StartDecodingWithResult(aFlags
);
201 ImageWrapper::RequestDecodeForSize(const nsIntSize
& aSize
, uint32_t aFlags
) {
202 return mInnerImage
->RequestDecodeForSize(aSize
, aFlags
);
206 ImageWrapper::LockImage() {
207 MOZ_ASSERT(NS_IsMainThread(),
208 "Main thread to encourage serialization with UnlockImage");
209 return mInnerImage
->LockImage();
213 ImageWrapper::UnlockImage() {
214 MOZ_ASSERT(NS_IsMainThread(),
215 "Main thread to encourage serialization with LockImage");
216 return mInnerImage
->UnlockImage();
220 ImageWrapper::RequestDiscard() { return mInnerImage
->RequestDiscard(); }
223 ImageWrapper::RequestRefresh(const TimeStamp
& aTime
) {
224 return mInnerImage
->RequestRefresh(aTime
);
228 ImageWrapper::GetAnimationMode(uint16_t* aAnimationMode
) {
229 return mInnerImage
->GetAnimationMode(aAnimationMode
);
233 ImageWrapper::SetAnimationMode(uint16_t aAnimationMode
) {
234 return mInnerImage
->SetAnimationMode(aAnimationMode
);
238 ImageWrapper::ResetAnimation() { return mInnerImage
->ResetAnimation(); }
240 NS_IMETHODIMP_(float)
241 ImageWrapper::GetFrameIndex(uint32_t aWhichFrame
) {
242 return mInnerImage
->GetFrameIndex(aWhichFrame
);
245 NS_IMETHODIMP_(int32_t)
246 ImageWrapper::GetFirstFrameDelay() { return mInnerImage
->GetFirstFrameDelay(); }
249 ImageWrapper::SetAnimationStartTime(const TimeStamp
& aTime
) {
250 mInnerImage
->SetAnimationStartTime(aTime
);
253 void ImageWrapper::PropagateUseCounters(Document
* aParentDocument
) {
254 mInnerImage
->PropagateUseCounters(aParentDocument
);
257 nsIntSize
ImageWrapper::OptimalImageSizeForDest(const gfxSize
& aDest
,
258 uint32_t aWhichFrame
,
259 SamplingFilter aSamplingFilter
,
261 return mInnerImage
->OptimalImageSizeForDest(aDest
, aWhichFrame
,
262 aSamplingFilter
, aFlags
);
265 NS_IMETHODIMP_(nsIntRect
)
266 ImageWrapper::GetImageSpaceInvalidationRect(const nsIntRect
& aRect
) {
267 return mInnerImage
->GetImageSpaceInvalidationRect(aRect
);
270 already_AddRefed
<imgIContainer
> ImageWrapper::Unwrap() {
271 return mInnerImage
->Unwrap();
275 } // namespace mozilla