diff options
Diffstat (limited to 'image/Image.cpp')
-rw-r--r-- | image/Image.cpp | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/image/Image.cpp b/image/Image.cpp new file mode 100644 index 0000000000..b757a60f71 --- /dev/null +++ b/image/Image.cpp @@ -0,0 +1,150 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "Image.h" +#include "nsRefreshDriver.h" +#include "mozilla/TimeStamp.h" + +namespace mozilla { +namespace image { + +/////////////////////////////////////////////////////////////////////////////// +// Memory Reporting +/////////////////////////////////////////////////////////////////////////////// + +ImageMemoryCounter::ImageMemoryCounter(Image* aImage, + MallocSizeOf aMallocSizeOf, + bool aIsUsed) + : mIsUsed(aIsUsed) +{ + MOZ_ASSERT(aImage); + + // Extract metadata about the image. + RefPtr<ImageURL> imageURL(aImage->GetURI()); + if (imageURL) { + imageURL->GetSpec(mURI); + } + + int32_t width = 0; + int32_t height = 0; + aImage->GetWidth(&width); + aImage->GetHeight(&height); + mIntrinsicSize.SizeTo(width, height); + + mType = aImage->GetType(); + + // Populate memory counters for source and decoded data. + mValues.SetSource(aImage->SizeOfSourceWithComputedFallback(aMallocSizeOf)); + aImage->CollectSizeOfSurfaces(mSurfaces, aMallocSizeOf); + + // Compute totals. + for (const SurfaceMemoryCounter& surfaceCounter : mSurfaces) { + mValues += surfaceCounter.Values(); + } +} + + +/////////////////////////////////////////////////////////////////////////////// +// Image Base Types +/////////////////////////////////////////////////////////////////////////////// + +// Constructor +ImageResource::ImageResource(ImageURL* aURI) : + mURI(aURI), + mInnerWindowId(0), + mAnimationConsumers(0), + mAnimationMode(kNormalAnimMode), + mInitialized(false), + mAnimating(false), + mError(false) +{ } + +ImageResource::~ImageResource() +{ + // Ask our ProgressTracker to drop its weak reference to us. + mProgressTracker->ResetImage(); +} + +void +ImageResource::IncrementAnimationConsumers() +{ + MOZ_ASSERT(NS_IsMainThread(), "Main thread only to encourage serialization " + "with DecrementAnimationConsumers"); + mAnimationConsumers++; +} + +void +ImageResource::DecrementAnimationConsumers() +{ + MOZ_ASSERT(NS_IsMainThread(), "Main thread only to encourage serialization " + "with IncrementAnimationConsumers"); + MOZ_ASSERT(mAnimationConsumers >= 1, + "Invalid no. of animation consumers!"); + mAnimationConsumers--; +} + +nsresult +ImageResource::GetAnimationModeInternal(uint16_t* aAnimationMode) +{ + if (mError) { + return NS_ERROR_FAILURE; + } + + NS_ENSURE_ARG_POINTER(aAnimationMode); + + *aAnimationMode = mAnimationMode; + return NS_OK; +} + +nsresult +ImageResource::SetAnimationModeInternal(uint16_t aAnimationMode) +{ + if (mError) { + return NS_ERROR_FAILURE; + } + + NS_ASSERTION(aAnimationMode == kNormalAnimMode || + aAnimationMode == kDontAnimMode || + aAnimationMode == kLoopOnceAnimMode, + "Wrong Animation Mode is being set!"); + + mAnimationMode = aAnimationMode; + + return NS_OK; +} + +bool +ImageResource::HadRecentRefresh(const TimeStamp& aTime) +{ + // Our threshold for "recent" is 1/2 of the default refresh-driver interval. + // This ensures that we allow for frame rates at least as fast as the + // refresh driver's default rate. + static TimeDuration recentThreshold = + TimeDuration::FromMilliseconds(nsRefreshDriver::DefaultInterval() / 2.0); + + if (!mLastRefreshTime.IsNull() && + aTime - mLastRefreshTime < recentThreshold) { + return true; + } + + // else, we can proceed with a refresh. + // But first, update our last refresh time: + mLastRefreshTime = aTime; + return false; +} + +void +ImageResource::EvaluateAnimation() +{ + if (!mAnimating && ShouldAnimate()) { + nsresult rv = StartAnimation(); + mAnimating = NS_SUCCEEDED(rv); + } else if (mAnimating && !ShouldAnimate()) { + StopAnimation(); + } +} + +} // namespace image +} // namespace mozilla |