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_ImageWrapper_h
7 #define mozilla_image_ImageWrapper_h
8 
9 #include "mozilla/MemoryReporting.h"
10 #include "Image.h"
11 
12 namespace mozilla {
13 namespace image {
14 
15 /**
16  * Abstract superclass for Images that wrap other Images.
17  */
18 class ImageWrapper : public Image {
19  public:
20   NS_DECL_ISUPPORTS
21   NS_DECL_IMGICONTAINER
22 
23   // Inherited methods from Image.
24   nsresult GetNativeSizes(nsTArray<gfx::IntSize>& aNativeSizes) const override;
25   size_t GetNativeSizesLength() const override;
26   virtual already_AddRefed<ProgressTracker> GetProgressTracker() override;
27 
28   virtual size_t SizeOfSourceWithComputedFallback(
29       SizeOfState& aState) const override;
30   virtual void CollectSizeOfSurfaces(nsTArray<SurfaceMemoryCounter>& aCounters,
31                                      MallocSizeOf aMallocSizeOf) const override;
32 
33   virtual void IncrementAnimationConsumers() override;
34   virtual void DecrementAnimationConsumers() override;
35 #ifdef DEBUG
36   virtual uint32_t GetAnimationConsumers() override;
37 #endif
38 
39   virtual nsresult OnImageDataAvailable(nsIRequest* aRequest,
40                                         nsIInputStream* aInStr,
41                                         uint64_t aSourceOffset,
42                                         uint32_t aCount) override;
43   virtual nsresult OnImageDataComplete(nsIRequest* aRequest, nsresult aStatus,
44                                        bool aLastPart) override;
45 
46   virtual void OnSurfaceDiscarded(const SurfaceKey& aSurfaceKey) override;
47 
48   virtual void SetInnerWindowID(uint64_t aInnerWindowId) override;
49   virtual uint64_t InnerWindowID() const override;
50 
51   virtual bool HasError() override;
52   virtual void SetHasError() override;
53 
54   nsIURI* GetURI() const override;
55 
56  protected:
ImageWrapper(Image * aInnerImage)57   explicit ImageWrapper(Image* aInnerImage) : mInnerImage(aInnerImage) {
58     MOZ_ASSERT(aInnerImage, "Need an image to wrap");
59   }
60 
~ImageWrapper()61   virtual ~ImageWrapper() {}
62 
63   /**
64    * Returns a weak reference to the inner image wrapped by this ImageWrapper.
65    */
InnerImage()66   Image* InnerImage() const { return mInnerImage.get(); }
67 
SetInnerImage(Image * aInnerImage)68   void SetInnerImage(Image* aInnerImage) {
69     MOZ_ASSERT(aInnerImage, "Need an image to wrap");
70     mInnerImage = aInnerImage;
71   }
72 
73  private:
74   RefPtr<Image> mInnerImage;
75 };
76 
77 }  // namespace image
78 }  // namespace mozilla
79 
80 #endif  // mozilla_image_ImageWrapper_h
81