Index: Source/core/platform/image-decoders/ImageDecoderTest.cpp |
diff --git a/Source/core/platform/image-decoders/ImageDecoderTest.cpp b/Source/core/platform/image-decoders/ImageDecoderTest.cpp |
index 65dfe4d76f810462e5ab3899fdfb28820ce4b7fc..7f6e81d587a44dae9fbf93d7a958c7fbff93da88 100644 |
--- a/Source/core/platform/image-decoders/ImageDecoderTest.cpp |
+++ b/Source/core/platform/image-decoders/ImageDecoderTest.cpp |
@@ -54,10 +54,10 @@ public: |
return m_frameBufferCache; |
} |
- void resetRequiredPreviousFrames() |
+ void resetRequiredPreviousFrames(bool knownOpaque = false) |
{ |
for (size_t i = 0; i < m_frameBufferCache.size(); ++i) |
- m_frameBufferCache[i].setRequiredPreviousFrameIndex(findRequiredPreviousFrame(i)); |
+ m_frameBufferCache[i].setRequiredPreviousFrameIndex(findRequiredPreviousFrame(i, knownOpaque)); |
} |
void initFrames(size_t numFrames, unsigned width = 100, unsigned height = 100) |
@@ -140,6 +140,40 @@ TEST(ImageDecoderTest, requiredPreviousFrameIndexForFrame1) |
EXPECT_EQ(notFound, decoderFrameBufferCache[1].requiredPreviousFrameIndex()); |
} |
+// A full frame with 'blending method == BlendOverwrite' doesn't depend on any prior frames. |
+TEST(ImageDecoderTest, requiredPreviousFrameIndexFullFrameBlendOverwrite) |
+{ |
+ OwnPtr<TestImageDecoder> decoder(adoptPtr(new TestImageDecoder())); |
+ decoder->initFrames(2); |
+ Vector<ImageFrame, 1>& decoderFrameBufferCache = decoder->frameBufferCache(); |
+ |
+ decoderFrameBufferCache[0].setOriginalFrameRect(IntRect(25, 25, 50, 50)); |
+ decoderFrameBufferCache[1].setBlendingMethod(ImageFrame::BlendOverwrite); |
+ |
+ for (int disposeMethod = ImageFrame::DisposeNotSpecified; disposeMethod <= ImageFrame::DisposeOverwritePrevious; ++disposeMethod) { |
+ decoderFrameBufferCache[0].setDisposalMethod(static_cast<ImageFrame::FrameDisposalMethod>(disposeMethod)); |
+ decoder->resetRequiredPreviousFrames(); |
+ EXPECT_EQ(notFound, decoderFrameBufferCache[1].requiredPreviousFrameIndex()); |
+ } |
+} |
+ |
+// A full frame that is known to be opaque doesn't depend on any prior frames. |
+TEST(ImageDecoderTest, requiredPreviousFrameIndexFullFrameOpaque) |
+{ |
+ OwnPtr<TestImageDecoder> decoder(adoptPtr(new TestImageDecoder())); |
+ decoder->initFrames(2); |
+ Vector<ImageFrame, 1>& decoderFrameBufferCache = decoder->frameBufferCache(); |
+ |
+ decoderFrameBufferCache[0].setOriginalFrameRect(IntRect(25, 25, 50, 50)); |
+ decoderFrameBufferCache[1].setBlendingMethod(ImageFrame::BlendOverwrite); |
+ |
+ for (int disposeMethod = ImageFrame::DisposeNotSpecified; disposeMethod <= ImageFrame::DisposeOverwritePrevious; ++disposeMethod) { |
+ decoderFrameBufferCache[0].setDisposalMethod(static_cast<ImageFrame::FrameDisposalMethod>(disposeMethod)); |
+ decoder->resetRequiredPreviousFrames(true); // Opaque. |
+ EXPECT_EQ(notFound, decoderFrameBufferCache[1].requiredPreviousFrameIndex()); |
+ } |
+} |
+ |
TEST(ImageDecoderTest, clearCacheExceptFrameDoNothing) |
{ |
OwnPtr<TestImageDecoder> decoder(adoptPtr(new TestImageDecoder())); |