diff --git a/image/src/Image.cpp b/image/src/Image.cpp index 83359a1b5193..b3532c336ea3 100644 --- a/image/src/Image.cpp +++ b/image/src/Image.cpp @@ -9,9 +9,9 @@ namespace mozilla { namespace image { // Constructor -Image::Image(imgStatusTracker* aStatusTracker, nsIURI* aURI) : - mInnerWindowId(0), +ImageResource::ImageResource(imgStatusTracker* aStatusTracker, nsIURI* aURI) : mURI(aURI), + mInnerWindowId(0), mAnimationConsumers(0), mAnimationMode(kNormalAnimMode), mInitialized(false), @@ -27,7 +27,7 @@ Image::Image(imgStatusTracker* aStatusTracker, nsIURI* aURI) : } uint32_t -Image::SizeOfData() +ImageResource::SizeOfData() { if (mError) return 0; @@ -88,14 +88,14 @@ Image::GetDecoderType(const char *aMimeType) } void -Image::IncrementAnimationConsumers() +ImageResource::IncrementAnimationConsumers() { mAnimationConsumers++; EvaluateAnimation(); } void -Image::DecrementAnimationConsumers() +ImageResource::DecrementAnimationConsumers() { NS_ABORT_IF_FALSE(mAnimationConsumers >= 1, "Invalid no. of animation consumers!"); mAnimationConsumers--; @@ -103,7 +103,7 @@ Image::DecrementAnimationConsumers() } nsresult -Image::GetAnimationModeInternal(uint16_t* aAnimationMode) +ImageResource::GetAnimationModeInternal(uint16_t* aAnimationMode) { if (mError) return NS_ERROR_FAILURE; @@ -115,7 +115,7 @@ Image::GetAnimationModeInternal(uint16_t* aAnimationMode) } nsresult -Image::SetAnimationModeInternal(uint16_t aAnimationMode) +ImageResource::SetAnimationModeInternal(uint16_t aAnimationMode) { if (mError) return NS_ERROR_FAILURE; @@ -133,7 +133,7 @@ Image::SetAnimationModeInternal(uint16_t aAnimationMode) } void -Image::EvaluateAnimation() +ImageResource::EvaluateAnimation() { if (!mAnimating && ShouldAnimate()) { nsresult rv = StartAnimation(); diff --git a/image/src/Image.h b/image/src/Image.h index d1831dad5c97..d76660701ed3 100644 --- a/image/src/Image.h +++ b/image/src/Image.h @@ -18,7 +18,17 @@ namespace image { class Image : public imgIContainer { public: - imgStatusTracker& GetStatusTracker() { return *mStatusTracker; } + // Mimetype translation + enum eDecoderType { + eDecoderType_png = 0, + eDecoderType_gif = 1, + eDecoderType_jpeg = 2, + eDecoderType_bmp = 3, + eDecoderType_ico = 4, + eDecoderType_icon = 5, + eDecoderType_unknown = 6 + }; + static eDecoderType GetDecoderType(const char *aMimeType); /** * Flags for Image initialization. @@ -52,6 +62,8 @@ public: const char* aMimeType, uint32_t aFlags) = 0; + virtual imgStatusTracker& GetStatusTracker() = 0; + /** * The rectangle defining the location and size of the currently displayed * frame. @@ -62,7 +74,7 @@ public: * The size, in bytes, occupied by the significant data portions of the image. * This includes both compressed source data and decoded frames. */ - uint32_t SizeOfData(); + virtual uint32_t SizeOfData() = 0; /** * The components that make up SizeOfData(). @@ -72,22 +84,10 @@ public: virtual size_t NonHeapSizeOfDecoded() const = 0; virtual size_t OutOfProcessSizeOfDecoded() const = 0; - // Mimetype translation - enum eDecoderType { - eDecoderType_png = 0, - eDecoderType_gif = 1, - eDecoderType_jpeg = 2, - eDecoderType_bmp = 3, - eDecoderType_ico = 4, - eDecoderType_icon = 5, - eDecoderType_unknown = 6 - }; - static eDecoderType GetDecoderType(const char *aMimeType); - - void IncrementAnimationConsumers(); - void DecrementAnimationConsumers(); + virtual void IncrementAnimationConsumers() = 0; + virtual void DecrementAnimationConsumers() = 0; #ifdef DEBUG - uint32_t GetAnimationConsumers() { return mAnimationConsumers; } + virtual uint32_t GetAnimationConsumers() = 0; #endif /** @@ -123,21 +123,42 @@ public: */ virtual nsresult OnNewSourceData() = 0; - void SetInnerWindowID(uint64_t aInnerWindowId) { + virtual void SetInnerWindowID(uint64_t aInnerWindowId) = 0; + virtual uint64_t InnerWindowID() const = 0; + + virtual bool HasError() = 0; + virtual void SetHasError() = 0; + + virtual nsIURI* GetURI() = 0; +}; + +class ImageResource : public Image +{ +public: + virtual imgStatusTracker& GetStatusTracker() MOZ_OVERRIDE { return *mStatusTracker; } + virtual uint32_t SizeOfData() MOZ_OVERRIDE; + + virtual void IncrementAnimationConsumers() MOZ_OVERRIDE; + virtual void DecrementAnimationConsumers() MOZ_OVERRIDE; +#ifdef DEBUG + virtual uint32_t GetAnimationConsumers() MOZ_OVERRIDE { return mAnimationConsumers; } +#endif + + virtual void SetInnerWindowID(uint64_t aInnerWindowId) MOZ_OVERRIDE { mInnerWindowId = aInnerWindowId; } - uint64_t InnerWindowID() const { return mInnerWindowId; } + virtual uint64_t InnerWindowID() const MOZ_OVERRIDE { return mInnerWindowId; } - bool HasError() { return mError; } - void SetHasError() { mError = true; } + virtual bool HasError() MOZ_OVERRIDE { return mError; } + virtual void SetHasError() MOZ_OVERRIDE { mError = true; } /* * Returns a non-AddRefed pointer to the URI associated with this image. */ - nsIURI* GetURI() { return mURI; } + virtual nsIURI* GetURI() MOZ_OVERRIDE { return mURI; } protected: - Image(imgStatusTracker* aStatusTracker, nsIURI* aURI); + ImageResource(imgStatusTracker* aStatusTracker, nsIURI* aURI); // Shared functionality for implementors of imgIContainer. Every // implementation of attribute animationMode should forward here. @@ -150,27 +171,26 @@ protected: */ virtual void EvaluateAnimation(); + /** + * Extended by child classes, if they have additional + * conditions for being able to animate. + */ + virtual bool ShouldAnimate() { + return mAnimationConsumers > 0 && mAnimationMode != kDontAnimMode; + } + virtual nsresult StartAnimation() = 0; virtual nsresult StopAnimation() = 0; - uint64_t mInnerWindowId; - // Member data shared by all implementations of this abstract class nsRefPtr mStatusTracker; nsCOMPtr mURI; + uint64_t mInnerWindowId; uint32_t mAnimationConsumers; uint16_t mAnimationMode; // Enum values in imgIContainer bool mInitialized:1; // Have we been initalized? bool mAnimating:1; // Are we currently animating? bool mError:1; // Error handling - - /** - * Extended by child classes, if they have additional - * conditions for being able to animate - */ - virtual bool ShouldAnimate() { - return mAnimationConsumers > 0 && mAnimationMode != kDontAnimMode; - } }; } // namespace image diff --git a/image/src/RasterImage.cpp b/image/src/RasterImage.cpp index 4c73b35b036d..ba5074592cab 100644 --- a/image/src/RasterImage.cpp +++ b/image/src/RasterImage.cpp @@ -353,7 +353,7 @@ NS_IMPL_ISUPPORTS3(RasterImage, imgIContainer, nsIProperties, //****************************************************************************** RasterImage::RasterImage(imgStatusTracker* aStatusTracker, nsIURI* aURI /* = nullptr */) : - Image(aStatusTracker, aURI), // invoke superclass's constructor + ImageResource(aStatusTracker, aURI), // invoke superclass's constructor mSize(0,0), mFrameDecodeFlags(DECODE_FLAGS_DEFAULT), mAnim(nullptr), @@ -3268,7 +3268,7 @@ RasterImage::WriteToRasterImage(nsIInputStream* /* unused */, bool RasterImage::ShouldAnimate() { - return Image::ShouldAnimate() && mFrames.Length() >= 2 && + return ImageResource::ShouldAnimate() && mFrames.Length() >= 2 && !mAnimationFinished; } diff --git a/image/src/RasterImage.h b/image/src/RasterImage.h index ac9bafc3ef59..b704ba60ed49 100644 --- a/image/src/RasterImage.h +++ b/image/src/RasterImage.h @@ -135,7 +135,7 @@ namespace image { class Decoder; -class RasterImage : public Image +class RasterImage : public ImageResource , public nsIProperties , public SupportsWeakPtr #ifdef DEBUG diff --git a/image/src/VectorImage.cpp b/image/src/VectorImage.cpp index 3f20c8bfd77d..cb2bfddda237 100644 --- a/image/src/VectorImage.cpp +++ b/image/src/VectorImage.cpp @@ -171,7 +171,7 @@ NS_IMPL_ISUPPORTS3(VectorImage, VectorImage::VectorImage(imgStatusTracker* aStatusTracker, nsIURI* aURI /* = nullptr */) : - Image(aStatusTracker, aURI), // invoke superclass's constructor + ImageResource(aStatusTracker, aURI), // invoke superclass's constructor mRestrictedRegion(0, 0, 0, 0), mIsInitialized(false), mIsFullyLoaded(false), @@ -297,7 +297,7 @@ VectorImage::StopAnimation() bool VectorImage::ShouldAnimate() { - return Image::ShouldAnimate() && mIsFullyLoaded && mHaveAnimations; + return ImageResource::ShouldAnimate() && mIsFullyLoaded && mHaveAnimations; } //------------------------------------------------------------------------------ diff --git a/image/src/VectorImage.h b/image/src/VectorImage.h index c50bfc3b9706..8479a1d8956b 100644 --- a/image/src/VectorImage.h +++ b/image/src/VectorImage.h @@ -24,7 +24,7 @@ namespace image { class SVGDocumentWrapper; class SVGRootRenderingObserver; -class VectorImage : public Image, +class VectorImage : public ImageResource, public nsIStreamListener { public: