summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--image/decoders/nsBMPDecoder.cpp3
-rw-r--r--image/decoders/nsGIFDecoder2.cpp25
-rw-r--r--image/decoders/nsIconDecoder.cpp3
-rw-r--r--image/decoders/nsJPEGDecoder.cpp4
-rw-r--r--image/decoders/nsPNGDecoder.cpp41
-rw-r--r--image/decoders/nsWebPDecoder.cpp6
6 files changed, 49 insertions, 33 deletions
diff --git a/image/decoders/nsBMPDecoder.cpp b/image/decoders/nsBMPDecoder.cpp
index 1f0449e4e6..42bb3486a8 100644
--- a/image/decoders/nsBMPDecoder.cpp
+++ b/image/decoders/nsBMPDecoder.cpp
@@ -674,8 +674,7 @@ nsBMPDecoder::ReadBitfields(const char* aData, size_t aLength)
}
MOZ_ASSERT(!mImageData, "Already have a buffer allocated?");
- nsresult rv = AllocateFrame(/* aFrameNum = */ 0, OutputSize(),
- FullOutputFrame(),
+ nsresult rv = AllocateFrame(OutputSize(), FullOutputFrame(),
mMayHaveTransparency ? SurfaceFormat::B8G8R8A8
: SurfaceFormat::B8G8R8X8);
if (NS_FAILED(rv)) {
diff --git a/image/decoders/nsGIFDecoder2.cpp b/image/decoders/nsGIFDecoder2.cpp
index 7955438e47..efa1451445 100644
--- a/image/decoders/nsGIFDecoder2.cpp
+++ b/image/decoders/nsGIFDecoder2.cpp
@@ -187,6 +187,14 @@ nsGIFDecoder2::BeginImageFrame(const IntRect& aFrameRect,
// Make sure there's no animation if we're downscaling.
MOZ_ASSERT_IF(Size() != OutputSize(), !GetImageMetadata().HasAnimation());
+ AnimationParams animParams {
+ aFrameRect,
+ FrameTimeout::FromRawMilliseconds(mGIFStruct.delay_time),
+ uint32_t(mGIFStruct.images_decoded),
+ BlendMethod::OVER,
+ DisposalMethod(mGIFStruct.disposal_method)
+ };
+
SurfacePipeFlags pipeFlags = aIsInterlaced
? SurfacePipeFlags::DEINTERLACE
: SurfacePipeFlags();
@@ -198,17 +206,18 @@ nsGIFDecoder2::BeginImageFrame(const IntRect& aFrameRect,
// The first frame is always decoded into an RGB surface.
pipe =
- SurfacePipeFactory::CreateSurfacePipe(this, mGIFStruct.images_decoded,
- Size(), OutputSize(),
- aFrameRect, format, pipeFlags);
+ SurfacePipeFactory::CreateSurfacePipe(this, Size(), OutputSize(),
+ aFrameRect, format,
+ Some(animParams), pipeFlags);
} else {
// This is an animation frame (and not the first). To minimize the memory
// usage of animations, the image data is stored in paletted form.
MOZ_ASSERT(Size() == OutputSize());
pipe =
- SurfacePipeFactory::CreatePalettedSurfacePipe(this, mGIFStruct.images_decoded,
- Size(), aFrameRect, format,
- aDepth, pipeFlags);
+ SurfacePipeFactory::CreatePalettedSurfacePipe(this, Size(), aFrameRect,
+ format,
+ aDepth, Some(animParams),
+ pipeFlags);
}
mCurrentFrameIndex = mGIFStruct.images_decoded;
@@ -249,9 +258,7 @@ nsGIFDecoder2::EndImageFrame()
mGIFStruct.images_decoded++;
// Tell the superclass we finished a frame
- PostFrameStop(opacity,
- DisposalMethod(mGIFStruct.disposal_method),
- FrameTimeout::FromRawMilliseconds(mGIFStruct.delay_time));
+ PostFrameStop(opacity);
// Reset the transparent pixel
if (mOldColor) {
diff --git a/image/decoders/nsIconDecoder.cpp b/image/decoders/nsIconDecoder.cpp
index 9ca63f5adb..b186874c66 100644
--- a/image/decoders/nsIconDecoder.cpp
+++ b/image/decoders/nsIconDecoder.cpp
@@ -70,8 +70,9 @@ nsIconDecoder::ReadHeader(const char* aData)
MOZ_ASSERT(!mImageData, "Already have a buffer allocated?");
Maybe<SurfacePipe> pipe =
- SurfacePipeFactory::CreateSurfacePipe(this, 0, Size(), OutputSize(),
+ SurfacePipeFactory::CreateSurfacePipe(this, Size(), OutputSize(),
FullFrame(), SurfaceFormat::B8G8R8A8,
+ /* aAnimParams */ Nothing(),
SurfacePipeFlags());
if (!pipe) {
return Transition::TerminateFailure();
diff --git a/image/decoders/nsJPEGDecoder.cpp b/image/decoders/nsJPEGDecoder.cpp
index e76ffcbaf8..7dac18e271 100644
--- a/image/decoders/nsJPEGDecoder.cpp
+++ b/image/decoders/nsJPEGDecoder.cpp
@@ -388,8 +388,8 @@ nsJPEGDecoder::ReadJPEGData(const char* aData, size_t aLength)
jpeg_has_multiple_scans(&mInfo);
MOZ_ASSERT(!mImageData, "Already have a buffer allocated?");
- nsresult rv = AllocateFrame(/* aFrameNum = */ 0, OutputSize(),
- FullOutputFrame(), SurfaceFormat::B8G8R8X8);
+ nsresult rv = AllocateFrame(OutputSize(), FullOutputFrame(),
+ SurfaceFormat::B8G8R8X8);
if (NS_FAILED(rv)) {
mState = JPEG_ERROR;
MOZ_LOG(sJPEGDecoderAccountingLog, LogLevel::Debug,
diff --git a/image/decoders/nsPNGDecoder.cpp b/image/decoders/nsPNGDecoder.cpp
index 9596ae7d67..1f19c41bc4 100644
--- a/image/decoders/nsPNGDecoder.cpp
+++ b/image/decoders/nsPNGDecoder.cpp
@@ -208,6 +208,25 @@ nsPNGDecoder::CreateFrame(const FrameInfo& aFrameInfo)
MOZ_ASSERT_IF(Size() != OutputSize(),
transparency != TransparencyType::eFrameRect);
+ Maybe<AnimationParams> animParams;
+#ifdef PNG_APNG_SUPPORTED
+ if (png_get_valid(mPNG, mInfo, PNG_INFO_acTL)) {
+ mAnimInfo = AnimFrameInfo(mPNG, mInfo);
+
+ if (mAnimInfo.mDispose == DisposalMethod::CLEAR) {
+ // We may have to display the background under this image during
+ // animation playback, so we regard it as transparent.
+ PostHasTransparency();
+ }
+
+ animParams.emplace(AnimationParams {
+ aFrameInfo.mFrameRect,
+ FrameTimeout::FromRawMilliseconds(mAnimInfo.mTimeout),
+ mNumFrames, mAnimInfo.mBlend, mAnimInfo.mDispose
+ });
+ }
+#endif
+
// If this image is interlaced, we can display better quality intermediate
// results to the user by post processing them with ADAM7InterpolatingFilter.
SurfacePipeFlags pipeFlags = aFrameInfo.mIsInterlaced
@@ -220,9 +239,9 @@ nsPNGDecoder::CreateFrame(const FrameInfo& aFrameInfo)
}
Maybe<SurfacePipe> pipe =
- SurfacePipeFactory::CreateSurfacePipe(this, mNumFrames, Size(),
- OutputSize(), aFrameInfo.mFrameRect,
- format, pipeFlags);
+ SurfacePipeFactory::CreateSurfacePipe(this, Size(), OutputSize(),
+ aFrameInfo.mFrameRect, format,
+ animParams, pipeFlags);
if (!pipe) {
mPipe = SurfacePipe();
@@ -239,18 +258,6 @@ nsPNGDecoder::CreateFrame(const FrameInfo& aFrameInfo)
"image frame with %dx%d pixels for decoder %p",
mFrameRect.width, mFrameRect.height, this));
-#ifdef PNG_APNG_SUPPORTED
- if (png_get_valid(mPNG, mInfo, PNG_INFO_acTL)) {
- mAnimInfo = AnimFrameInfo(mPNG, mInfo);
-
- if (mAnimInfo.mDispose == DisposalMethod::CLEAR) {
- // We may have to display the background under this image during
- // animation playback, so we regard it as transparent.
- PostHasTransparency();
- }
- }
-#endif
-
return NS_OK;
}
@@ -269,9 +276,7 @@ nsPNGDecoder::EndImageFrame()
opacity = Opacity::FULLY_OPAQUE;
}
- PostFrameStop(opacity, mAnimInfo.mDispose,
- FrameTimeout::FromRawMilliseconds(mAnimInfo.mTimeout),
- mAnimInfo.mBlend, Some(mFrameRect));
+ PostFrameStop(opacity);
}
nsresult
diff --git a/image/decoders/nsWebPDecoder.cpp b/image/decoders/nsWebPDecoder.cpp
index 4d6566486c..4f3cc8b2ad 100644
--- a/image/decoders/nsWebPDecoder.cpp
+++ b/image/decoders/nsWebPDecoder.cpp
@@ -234,8 +234,12 @@ nsWebPDecoder::CreateFrame(const nsIntRect& aFrameRect)
SurfacePipeFlags pipeFlags = SurfacePipeFlags();
+ AnimationParams animParams {
+ aFrameRect, mTimeout, mCurrentFrame, mBlend, mDisposal
+ };
+
Maybe<SurfacePipe> pipe = SurfacePipeFactory::CreateSurfacePipe(this,
- mCurrentFrame, Size(), OutputSize(), aFrameRect, mFormat, pipeFlags);
+ Size(), OutputSize(), aFrameRect, mFormat, Some(animParams), pipeFlags);
if (!pipe) {
MOZ_LOG(sWebPLog, LogLevel::Error,
("[this=%p] nsWebPDecoder::CreateFrame -- no pipe\n", this));