summaryrefslogtreecommitdiffstats
path: root/image/imgFrame.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'image/imgFrame.cpp')
-rw-r--r--image/imgFrame.cpp39
1 files changed, 20 insertions, 19 deletions
diff --git a/image/imgFrame.cpp b/image/imgFrame.cpp
index 5da2ccec5..af84d8cbb 100644
--- a/image/imgFrame.cpp
+++ b/image/imgFrame.cpp
@@ -161,13 +161,13 @@ imgFrame::imgFrame()
: mMonitor("imgFrame")
, mDecoded(0, 0, 0, 0)
, mLockCount(0)
+ , mAborted(false)
+ , mFinished(false)
+ , mOptimizable(false)
, mTimeout(FrameTimeout::FromRawMilliseconds(100))
, mDisposalMethod(DisposalMethod::NOT_SPECIFIED)
, mBlendMethod(BlendMethod::OVER)
, mHasNoAlpha(false)
- , mAborted(false)
- , mFinished(false)
- , mOptimizable(false)
, mPalettedImageData(nullptr)
, mPaletteDepth(0)
, mNonPremult(false)
@@ -192,7 +192,8 @@ imgFrame::InitForDecoder(const nsIntSize& aImageSize,
const nsIntRect& aRect,
SurfaceFormat aFormat,
uint8_t aPaletteDepth /* = 0 */,
- bool aNonPremult /* = false */)
+ bool aNonPremult /* = false */,
+ const Maybe<AnimationParams>& aAnimParams /* = Nothing() */)
{
// Assert for properties that should be verified by decoders,
// warn for properties related to bad content.
@@ -205,6 +206,15 @@ imgFrame::InitForDecoder(const nsIntSize& aImageSize,
mImageSize = aImageSize;
mFrameRect = aRect;
+ if (aAnimParams) {
+ mBlendRect = aAnimParams->mBlendRect;
+ mTimeout = aAnimParams->mTimeout;
+ mBlendMethod = aAnimParams->mBlendMethod;
+ mDisposalMethod = aAnimParams->mDisposalMethod;
+ } else {
+ mBlendRect = aRect;
+ }
+
// We only allow a non-trivial frame rect (i.e., a frame rect that doesn't
// cover the entire image) for paletted animation frames. We never draw those
// frames directly; we just use FrameAnimator to composite them and produce a
@@ -242,13 +252,13 @@ imgFrame::InitForDecoder(const nsIntSize& aImageSize,
} else {
MOZ_ASSERT(!mImageSurface, "Called imgFrame::InitForDecoder() twice?");
- mVBuf = AllocateBufferForImage(mFrameRect.Size(), mFormat);
- if (!mVBuf) {
+ mRawSurface = AllocateBufferForImage(mFrameRect.Size(), mFormat);
+ if (!mRawSurface) {
mAborted = true;
return NS_ERROR_OUT_OF_MEMORY;
}
- mImageSurface = CreateLockedSurface(mVBuf, mFrameRect.Size(), mFormat);
+ mImageSurface = CreateLockedSurface(mRawSurface, mFrameRect.Size(), mFormat);
if (!mImageSurface) {
NS_WARNING("Failed to create ImageSurface");
@@ -256,7 +266,7 @@ imgFrame::InitForDecoder(const nsIntSize& aImageSize,
return NS_ERROR_OUT_OF_MEMORY;
}
- if (!ClearSurface(mVBuf, mFrameRect.Size(), mFormat)) {
+ if (!ClearSurface(mRawSurface, mFrameRect.Size(), mFormat)) {
NS_WARNING("Could not clear allocated buffer");
mAborted = true;
return NS_ERROR_OUT_OF_MEMORY;
@@ -607,12 +617,7 @@ imgFrame::ImageUpdatedInternal(const nsIntRect& aUpdateRect)
}
void
-imgFrame::Finish(Opacity aFrameOpacity /* = Opacity::SOME_TRANSPARENCY */,
- DisposalMethod aDisposalMethod /* = DisposalMethod::KEEP */,
- FrameTimeout aTimeout
- /* = FrameTimeout::FromRawMilliseconds(0) */,
- BlendMethod aBlendMethod /* = BlendMethod::OVER */,
- const Maybe<IntRect>& aBlendRect /* = Nothing() */)
+imgFrame::Finish(Opacity aFrameOpacity /* = Opacity::SOME_TRANSPARENCY */)
{
MonitorAutoLock lock(mMonitor);
MOZ_ASSERT(mLockCount > 0, "Image data should be locked");
@@ -621,10 +626,6 @@ imgFrame::Finish(Opacity aFrameOpacity /* = Opacity::SOME_TRANSPARENCY */,
mHasNoAlpha = true;
}
- mDisposalMethod = aDisposalMethod;
- mTimeout = aTimeout;
- mBlendMethod = aBlendMethod;
- mBlendRect = aBlendRect;
ImageUpdatedInternal(GetRect());
mFinished = true;
@@ -844,7 +845,7 @@ imgFrame::GetAnimationData() const
bool hasAlpha = mFormat == SurfaceFormat::B8G8R8A8;
return AnimationData(data, PaletteDataLength(), mTimeout, GetRect(),
- mBlendMethod, mBlendRect, mDisposalMethod, hasAlpha);
+ mBlendMethod, Some(mBlendRect), mDisposalMethod, hasAlpha);
}
void