Index: Source/core/platform/image-decoders/webp/WEBPImageDecoderTest.cpp |
diff --git a/Source/core/platform/image-decoders/webp/WEBPImageDecoderTest.cpp b/Source/core/platform/image-decoders/webp/WEBPImageDecoderTest.cpp |
index 6c1e9a7e9b4177bee277a8466958dae592ed77c9..033d97029ddb752257f95b05e7f1aa5b3d8a1439 100644 |
--- a/Source/core/platform/image-decoders/webp/WEBPImageDecoderTest.cpp |
+++ b/Source/core/platform/image-decoders/webp/WEBPImageDecoderTest.cpp |
@@ -182,13 +182,14 @@ TEST_F(AnimatedWebPTests, verifyAnimationParametersTransparentImage) |
const int canvasHeight = 29; |
const struct AnimParam { |
int xOffset, yOffset, width, height; |
- ImageFrame::FrameDisposalMethod dispose; |
+ ImageFrame::DisposalMethod disposalMethod; |
+ ImageFrame::AlphaBlendSource alphaBlendSource; |
unsigned duration; |
bool hasAlpha; |
} frameParameters[] = { |
- { 0, 0, 11, 29, ImageFrame::DisposeKeep, 1000u, true }, |
- { 2, 10, 7, 17, ImageFrame::DisposeKeep, 500u, true }, |
- { 2, 2, 7, 16, ImageFrame::DisposeKeep, 1000u, true }, |
+ { 0, 0, 11, 29, ImageFrame::DisposeKeep, ImageFrame::BlendAtopPreviousFrame, 1000u, true }, |
+ { 2, 10, 7, 17, ImageFrame::DisposeKeep, ImageFrame::BlendAtopPreviousFrame, 500u, true }, |
+ { 2, 2, 7, 16, ImageFrame::DisposeKeep, ImageFrame::BlendAtopPreviousFrame, 1000u, true }, |
}; |
for (size_t i = 0; i < ARRAY_SIZE(frameParameters); ++i) { |
@@ -200,7 +201,8 @@ TEST_F(AnimatedWebPTests, verifyAnimationParametersTransparentImage) |
EXPECT_EQ(frameParameters[i].yOffset, frame->originalFrameRect().y()); |
EXPECT_EQ(frameParameters[i].width, frame->originalFrameRect().width()); |
EXPECT_EQ(frameParameters[i].height, frame->originalFrameRect().height()); |
- EXPECT_EQ(frameParameters[i].dispose, frame->disposalMethod()); |
+ EXPECT_EQ(frameParameters[i].disposalMethod, frame->disposalMethod()); |
+ EXPECT_EQ(frameParameters[i].alphaBlendSource, frame->alphaBlendSource()); |
EXPECT_EQ(frameParameters[i].duration, frame->duration()); |
EXPECT_EQ(frameParameters[i].hasAlpha, frame->hasAlpha()); |
} |
@@ -222,14 +224,15 @@ TEST_F(AnimatedWebPTests, verifyAnimationParametersOpaqueFramesTransparentBackgr |
const int canvasHeight = 87; |
const struct AnimParam { |
int xOffset, yOffset, width, height; |
- ImageFrame::FrameDisposalMethod dispose; |
+ ImageFrame::DisposalMethod disposalMethod; |
+ ImageFrame::AlphaBlendSource alphaBlendSource; |
unsigned duration; |
bool hasAlpha; |
} frameParameters[] = { |
- { 4, 10, 33, 32, ImageFrame::DisposeOverwriteBgcolor, 1000u, true }, |
- { 34, 30, 33, 32, ImageFrame::DisposeOverwriteBgcolor, 1000u, true }, |
- { 62, 50, 32, 32, ImageFrame::DisposeOverwriteBgcolor, 1000u, true }, |
- { 10, 54, 32, 33, ImageFrame::DisposeOverwriteBgcolor, 1000u, true }, |
+ { 4, 10, 33, 32, ImageFrame::DisposeOverwriteBgcolor, ImageFrame::BlendAtopPreviousFrame, 1000u, true }, |
+ { 34, 30, 33, 32, ImageFrame::DisposeOverwriteBgcolor, ImageFrame::BlendAtopPreviousFrame, 1000u, true }, |
+ { 62, 50, 32, 32, ImageFrame::DisposeOverwriteBgcolor, ImageFrame::BlendAtopPreviousFrame, 1000u, true }, |
+ { 10, 54, 32, 33, ImageFrame::DisposeOverwriteBgcolor, ImageFrame::BlendAtopPreviousFrame, 1000u, true }, |
}; |
for (size_t i = 0; i < ARRAY_SIZE(frameParameters); ++i) { |
@@ -241,7 +244,51 @@ TEST_F(AnimatedWebPTests, verifyAnimationParametersOpaqueFramesTransparentBackgr |
EXPECT_EQ(frameParameters[i].yOffset, frame->originalFrameRect().y()); |
EXPECT_EQ(frameParameters[i].width, frame->originalFrameRect().width()); |
EXPECT_EQ(frameParameters[i].height, frame->originalFrameRect().height()); |
- EXPECT_EQ(frameParameters[i].dispose, frame->disposalMethod()); |
+ EXPECT_EQ(frameParameters[i].disposalMethod, frame->disposalMethod()); |
+ EXPECT_EQ(frameParameters[i].alphaBlendSource, frame->alphaBlendSource()); |
+ EXPECT_EQ(frameParameters[i].duration, frame->duration()); |
+ EXPECT_EQ(frameParameters[i].hasAlpha, frame->hasAlpha()); |
+ } |
+ |
+ EXPECT_EQ(ARRAY_SIZE(frameParameters), decoder->frameCount()); |
+ EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount()); |
+} |
+ |
+TEST_F(AnimatedWebPTests, verifyAnimationParametersBlendOverwrite) |
+{ |
+ OwnPtr<WEBPImageDecoder> decoder = createDecoder(); |
+ EXPECT_EQ(cAnimationLoopOnce, decoder->repetitionCount()); |
+ |
+ RefPtr<SharedBuffer> data = readFile("/LayoutTests/fast/images/resources/webp-animated-no-blend.webp"); |
+ ASSERT_TRUE(data.get()); |
+ decoder->setData(data.get(), true); |
+ |
+ const int canvasWidth = 94; |
+ const int canvasHeight = 87; |
+ const struct AnimParam { |
+ int xOffset, yOffset, width, height; |
+ ImageFrame::DisposalMethod disposalMethod; |
+ ImageFrame::AlphaBlendSource alphaBlendSource; |
+ unsigned duration; |
+ bool hasAlpha; |
+ } frameParameters[] = { |
+ { 4, 10, 33, 32, ImageFrame::DisposeOverwriteBgcolor, ImageFrame::BlendAtopBgcolor, 1000u, true }, |
+ { 34, 30, 33, 32, ImageFrame::DisposeOverwriteBgcolor, ImageFrame::BlendAtopBgcolor, 1000u, true }, |
+ { 62, 50, 32, 32, ImageFrame::DisposeOverwriteBgcolor, ImageFrame::BlendAtopBgcolor, 1000u, true }, |
+ { 10, 54, 32, 33, ImageFrame::DisposeOverwriteBgcolor, ImageFrame::BlendAtopBgcolor, 1000u, true }, |
+ }; |
+ |
+ for (size_t i = 0; i < ARRAY_SIZE(frameParameters); ++i) { |
+ const ImageFrame* const frame = decoder->frameBufferAtIndex(i); |
+ EXPECT_EQ(ImageFrame::FrameComplete, frame->status()); |
+ EXPECT_EQ(canvasWidth, frame->getSkBitmap().width()); |
+ EXPECT_EQ(canvasHeight, frame->getSkBitmap().height()); |
+ EXPECT_EQ(frameParameters[i].xOffset, frame->originalFrameRect().x()); |
+ EXPECT_EQ(frameParameters[i].yOffset, frame->originalFrameRect().y()); |
+ EXPECT_EQ(frameParameters[i].width, frame->originalFrameRect().width()); |
+ EXPECT_EQ(frameParameters[i].height, frame->originalFrameRect().height()); |
+ EXPECT_EQ(frameParameters[i].disposalMethod, frame->disposalMethod()); |
+ EXPECT_EQ(frameParameters[i].alphaBlendSource, frame->alphaBlendSource()); |
EXPECT_EQ(frameParameters[i].duration, frame->duration()); |
EXPECT_EQ(frameParameters[i].hasAlpha, frame->hasAlpha()); |
} |