| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 14 matching lines...) Expand all Loading... |
| 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 29 */ | 29 */ |
| 30 | 30 |
| 31 #include "platform/image-decoders/gif/GIFImageDecoder.h" | 31 #include "platform/image-decoders/gif/GIFImageDecoder.h" |
| 32 | 32 |
| 33 #include "platform/SharedBuffer.h" | 33 #include "platform/SharedBuffer.h" |
| 34 #include "platform/image-decoders/ImageDecoderTestHelpers.h" | 34 #include "platform/image-decoders/ImageDecoderTestHelpers.h" |
| 35 #include "platform/image-decoders/SharedBufferSegmentReader.h" |
| 35 #include "public/platform/WebData.h" | 36 #include "public/platform/WebData.h" |
| 36 #include "public/platform/WebSize.h" | 37 #include "public/platform/WebSize.h" |
| 37 #include "testing/gtest/include/gtest/gtest.h" | 38 #include "testing/gtest/include/gtest/gtest.h" |
| 38 #include "wtf/OwnPtr.h" | 39 #include "wtf/OwnPtr.h" |
| 39 #include "wtf/PassOwnPtr.h" | 40 #include "wtf/PassOwnPtr.h" |
| 40 #include "wtf/Vector.h" | 41 #include "wtf/Vector.h" |
| 41 | 42 |
| 42 namespace blink { | 43 namespace blink { |
| 43 | 44 |
| 44 namespace { | 45 namespace { |
| (...skipping 12 matching lines...) Expand all Loading... |
| 57 SCOPED_TRACE(gifFile); | 58 SCOPED_TRACE(gifFile); |
| 58 | 59 |
| 59 RefPtr<SharedBuffer> fullData = readFile(dir, gifFile); | 60 RefPtr<SharedBuffer> fullData = readFile(dir, gifFile); |
| 60 ASSERT_TRUE(fullData.get()); | 61 ASSERT_TRUE(fullData.get()); |
| 61 Vector<unsigned> baselineHashes; | 62 Vector<unsigned> baselineHashes; |
| 62 createDecodingBaseline(&createDecoder, fullData.get(), &baselineHashes); | 63 createDecodingBaseline(&createDecoder, fullData.get(), &baselineHashes); |
| 63 size_t frameCount = baselineHashes.size(); | 64 size_t frameCount = baselineHashes.size(); |
| 64 | 65 |
| 65 // Random decoding should get the same results as sequential decoding. | 66 // Random decoding should get the same results as sequential decoding. |
| 66 OwnPtr<ImageDecoder> decoder = createDecoder(); | 67 OwnPtr<ImageDecoder> decoder = createDecoder(); |
| 67 decoder->setData(fullData.get(), true); | 68 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS
egmentReader(fullData)); |
| 69 decoder->setData(segmentReader.get(), true); |
| 68 const size_t skippingStep = 5; | 70 const size_t skippingStep = 5; |
| 69 for (size_t i = 0; i < skippingStep; ++i) { | 71 for (size_t i = 0; i < skippingStep; ++i) { |
| 70 for (size_t j = i; j < frameCount; j += skippingStep) { | 72 for (size_t j = i; j < frameCount; j += skippingStep) { |
| 71 SCOPED_TRACE(testing::Message() << "Random i:" << i << " j:" << j); | 73 SCOPED_TRACE(testing::Message() << "Random i:" << i << " j:" << j); |
| 72 ImageFrame* frame = decoder->frameBufferAtIndex(j); | 74 ImageFrame* frame = decoder->frameBufferAtIndex(j); |
| 73 EXPECT_EQ(baselineHashes[j], hashBitmap(frame->getSkBitmap())); | 75 EXPECT_EQ(baselineHashes[j], hashBitmap(frame->getSkBitmap())); |
| 74 } | 76 } |
| 75 } | 77 } |
| 76 | 78 |
| 77 // Decoding in reverse order. | 79 // Decoding in reverse order. |
| 78 decoder = createDecoder(); | 80 decoder = createDecoder(); |
| 79 decoder->setData(fullData.get(), true); | 81 decoder->setData(segmentReader.get(), true); |
| 80 for (size_t i = frameCount; i; --i) { | 82 for (size_t i = frameCount; i; --i) { |
| 81 SCOPED_TRACE(testing::Message() << "Reverse i:" << i); | 83 SCOPED_TRACE(testing::Message() << "Reverse i:" << i); |
| 82 ImageFrame* frame = decoder->frameBufferAtIndex(i - 1); | 84 ImageFrame* frame = decoder->frameBufferAtIndex(i - 1); |
| 83 EXPECT_EQ(baselineHashes[i - 1], hashBitmap(frame->getSkBitmap())); | 85 EXPECT_EQ(baselineHashes[i - 1], hashBitmap(frame->getSkBitmap())); |
| 84 } | 86 } |
| 85 } | 87 } |
| 86 | 88 |
| 87 void testRandomDecodeAfterClearFrameBufferCache(const char* dir, const char* gif
File) | 89 void testRandomDecodeAfterClearFrameBufferCache(const char* dir, const char* gif
File) |
| 88 { | 90 { |
| 89 SCOPED_TRACE(gifFile); | 91 SCOPED_TRACE(gifFile); |
| 90 | 92 |
| 91 RefPtr<SharedBuffer> data = readFile(dir, gifFile); | 93 RefPtr<SharedBuffer> data = readFile(dir, gifFile); |
| 92 ASSERT_TRUE(data.get()); | 94 ASSERT_TRUE(data.get()); |
| 93 Vector<unsigned> baselineHashes; | 95 Vector<unsigned> baselineHashes; |
| 94 createDecodingBaseline(&createDecoder, data.get(), &baselineHashes); | 96 createDecodingBaseline(&createDecoder, data.get(), &baselineHashes); |
| 95 size_t frameCount = baselineHashes.size(); | 97 size_t frameCount = baselineHashes.size(); |
| 96 | 98 |
| 97 OwnPtr<ImageDecoder> decoder = createDecoder(); | 99 OwnPtr<ImageDecoder> decoder = createDecoder(); |
| 98 decoder->setData(data.get(), true); | 100 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS
egmentReader(data)); |
| 101 decoder->setData(segmentReader.get(), true); |
| 99 for (size_t clearExceptFrame = 0; clearExceptFrame < frameCount; ++clearExce
ptFrame) { | 102 for (size_t clearExceptFrame = 0; clearExceptFrame < frameCount; ++clearExce
ptFrame) { |
| 100 decoder->clearCacheExceptFrame(clearExceptFrame); | 103 decoder->clearCacheExceptFrame(clearExceptFrame); |
| 101 const size_t skippingStep = 5; | 104 const size_t skippingStep = 5; |
| 102 for (size_t i = 0; i < skippingStep; ++i) { | 105 for (size_t i = 0; i < skippingStep; ++i) { |
| 103 for (size_t j = 0; j < frameCount; j += skippingStep) { | 106 for (size_t j = 0; j < frameCount; j += skippingStep) { |
| 104 SCOPED_TRACE(testing::Message() << "Random i:" << i << " j:" <<
j); | 107 SCOPED_TRACE(testing::Message() << "Random i:" << i << " j:" <<
j); |
| 105 ImageFrame* frame = decoder->frameBufferAtIndex(j); | 108 ImageFrame* frame = decoder->frameBufferAtIndex(j); |
| 106 EXPECT_EQ(baselineHashes[j], hashBitmap(frame->getSkBitmap())); | 109 EXPECT_EQ(baselineHashes[j], hashBitmap(frame->getSkBitmap())); |
| 107 } | 110 } |
| 108 } | 111 } |
| 109 } | 112 } |
| 110 } | 113 } |
| 111 | 114 |
| 112 } // anonymous namespace | 115 } // anonymous namespace |
| 113 | 116 |
| 114 TEST(GIFImageDecoderTest, decodeTwoFrames) | 117 TEST(GIFImageDecoderTest, decodeTwoFrames) |
| 115 { | 118 { |
| 116 OwnPtr<ImageDecoder> decoder = createDecoder(); | 119 OwnPtr<ImageDecoder> decoder = createDecoder(); |
| 117 | 120 |
| 118 RefPtr<SharedBuffer> data = readFile(layoutTestResourcesDir, "animated.gif")
; | 121 RefPtr<SharedBuffer> data = readFile(layoutTestResourcesDir, "animated.gif")
; |
| 119 ASSERT_TRUE(data.get()); | 122 ASSERT_TRUE(data.get()); |
| 120 decoder->setData(data.get(), true); | 123 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS
egmentReader(data)); |
| 124 decoder->setData(segmentReader.get(), true); |
| 121 EXPECT_EQ(cAnimationLoopOnce, decoder->repetitionCount()); | 125 EXPECT_EQ(cAnimationLoopOnce, decoder->repetitionCount()); |
| 122 | 126 |
| 123 ImageFrame* frame = decoder->frameBufferAtIndex(0); | 127 ImageFrame* frame = decoder->frameBufferAtIndex(0); |
| 124 uint32_t generationID0 = frame->getSkBitmap().getGenerationID(); | 128 uint32_t generationID0 = frame->getSkBitmap().getGenerationID(); |
| 125 EXPECT_EQ(ImageFrame::FrameComplete, frame->status()); | 129 EXPECT_EQ(ImageFrame::FrameComplete, frame->status()); |
| 126 EXPECT_EQ(16, frame->getSkBitmap().width()); | 130 EXPECT_EQ(16, frame->getSkBitmap().width()); |
| 127 EXPECT_EQ(16, frame->getSkBitmap().height()); | 131 EXPECT_EQ(16, frame->getSkBitmap().height()); |
| 128 | 132 |
| 129 frame = decoder->frameBufferAtIndex(1); | 133 frame = decoder->frameBufferAtIndex(1); |
| 130 uint32_t generationID1 = frame->getSkBitmap().getGenerationID(); | 134 uint32_t generationID1 = frame->getSkBitmap().getGenerationID(); |
| 131 EXPECT_EQ(ImageFrame::FrameComplete, frame->status()); | 135 EXPECT_EQ(ImageFrame::FrameComplete, frame->status()); |
| 132 EXPECT_EQ(16, frame->getSkBitmap().width()); | 136 EXPECT_EQ(16, frame->getSkBitmap().width()); |
| 133 EXPECT_EQ(16, frame->getSkBitmap().height()); | 137 EXPECT_EQ(16, frame->getSkBitmap().height()); |
| 134 EXPECT_TRUE(generationID0 != generationID1); | 138 EXPECT_TRUE(generationID0 != generationID1); |
| 135 | 139 |
| 136 EXPECT_EQ(2u, decoder->frameCount()); | 140 EXPECT_EQ(2u, decoder->frameCount()); |
| 137 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount()); | 141 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount()); |
| 138 } | 142 } |
| 139 | 143 |
| 140 TEST(GIFImageDecoderTest, parseAndDecode) | 144 TEST(GIFImageDecoderTest, parseAndDecode) |
| 141 { | 145 { |
| 142 OwnPtr<ImageDecoder> decoder = createDecoder(); | 146 OwnPtr<ImageDecoder> decoder = createDecoder(); |
| 143 | 147 |
| 144 RefPtr<SharedBuffer> data = readFile(layoutTestResourcesDir, "animated.gif")
; | 148 RefPtr<SharedBuffer> data = readFile(layoutTestResourcesDir, "animated.gif")
; |
| 145 ASSERT_TRUE(data.get()); | 149 ASSERT_TRUE(data.get()); |
| 146 decoder->setData(data.get(), true); | 150 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS
egmentReader(data)); |
| 151 decoder->setData(segmentReader.get(), true); |
| 147 EXPECT_EQ(cAnimationLoopOnce, decoder->repetitionCount()); | 152 EXPECT_EQ(cAnimationLoopOnce, decoder->repetitionCount()); |
| 148 | 153 |
| 149 // This call will parse the entire file. | 154 // This call will parse the entire file. |
| 150 EXPECT_EQ(2u, decoder->frameCount()); | 155 EXPECT_EQ(2u, decoder->frameCount()); |
| 151 | 156 |
| 152 ImageFrame* frame = decoder->frameBufferAtIndex(0); | 157 ImageFrame* frame = decoder->frameBufferAtIndex(0); |
| 153 EXPECT_EQ(ImageFrame::FrameComplete, frame->status()); | 158 EXPECT_EQ(ImageFrame::FrameComplete, frame->status()); |
| 154 EXPECT_EQ(16, frame->getSkBitmap().width()); | 159 EXPECT_EQ(16, frame->getSkBitmap().width()); |
| 155 EXPECT_EQ(16, frame->getSkBitmap().height()); | 160 EXPECT_EQ(16, frame->getSkBitmap().height()); |
| 156 | 161 |
| 157 frame = decoder->frameBufferAtIndex(1); | 162 frame = decoder->frameBufferAtIndex(1); |
| 158 EXPECT_EQ(ImageFrame::FrameComplete, frame->status()); | 163 EXPECT_EQ(ImageFrame::FrameComplete, frame->status()); |
| 159 EXPECT_EQ(16, frame->getSkBitmap().width()); | 164 EXPECT_EQ(16, frame->getSkBitmap().width()); |
| 160 EXPECT_EQ(16, frame->getSkBitmap().height()); | 165 EXPECT_EQ(16, frame->getSkBitmap().height()); |
| 161 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount()); | 166 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount()); |
| 162 } | 167 } |
| 163 | 168 |
| 169 // FIXME: Call ImageDecoderTestHelpers' testByteByByteDecode |
| 164 TEST(GIFImageDecoderTest, parseByteByByte) | 170 TEST(GIFImageDecoderTest, parseByteByByte) |
| 165 { | 171 { |
| 166 OwnPtr<ImageDecoder> decoder = createDecoder(); | 172 OwnPtr<ImageDecoder> decoder = createDecoder(); |
| 167 | 173 |
| 168 RefPtr<SharedBuffer> data = readFile(layoutTestResourcesDir, "animated.gif")
; | 174 RefPtr<SharedBuffer> data = readFile(layoutTestResourcesDir, "animated.gif")
; |
| 169 ASSERT_TRUE(data.get()); | 175 ASSERT_TRUE(data.get()); |
| 170 | 176 |
| 171 size_t frameCount = 0; | 177 size_t frameCount = 0; |
| 172 | 178 |
| 173 // Pass data to decoder byte by byte. | 179 // Pass data to decoder byte by byte. |
| 174 for (size_t length = 1; length <= data->size(); ++length) { | 180 for (size_t length = 1; length <= data->size(); ++length) { |
| 175 RefPtr<SharedBuffer> tempData = SharedBuffer::create(data->data(), lengt
h); | 181 RefPtr<SharedBuffer> tempData = SharedBuffer::create(data->data(), lengt
h); |
| 176 decoder->setData(tempData.get(), length == data->size()); | 182 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBuf
ferSegmentReader(tempData)); |
| 183 decoder->setData(segmentReader.get(), length == data->size()); |
| 177 | 184 |
| 178 EXPECT_LE(frameCount, decoder->frameCount()); | 185 EXPECT_LE(frameCount, decoder->frameCount()); |
| 179 frameCount = decoder->frameCount(); | 186 frameCount = decoder->frameCount(); |
| 180 } | 187 } |
| 181 | 188 |
| 182 EXPECT_EQ(2u, decoder->frameCount()); | 189 EXPECT_EQ(2u, decoder->frameCount()); |
| 183 | 190 |
| 184 decoder->frameBufferAtIndex(0); | 191 decoder->frameBufferAtIndex(0); |
| 185 decoder->frameBufferAtIndex(1); | 192 decoder->frameBufferAtIndex(1); |
| 186 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount()); | 193 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount()); |
| 187 } | 194 } |
| 188 | 195 |
| 189 TEST(GIFImageDecoderTest, parseAndDecodeByteByByte) | 196 TEST(GIFImageDecoderTest, parseAndDecodeByteByByte) |
| 190 { | 197 { |
| 191 OwnPtr<ImageDecoder> decoder = createDecoder(); | 198 OwnPtr<ImageDecoder> decoder = createDecoder(); |
| 192 | 199 |
| 193 RefPtr<SharedBuffer> data = readFile(layoutTestResourcesDir, "animated-gif-w
ith-offsets.gif"); | 200 RefPtr<SharedBuffer> data = readFile(layoutTestResourcesDir, "animated-gif-w
ith-offsets.gif"); |
| 194 ASSERT_TRUE(data.get()); | 201 ASSERT_TRUE(data.get()); |
| 195 | 202 |
| 196 size_t frameCount = 0; | 203 size_t frameCount = 0; |
| 197 size_t framesDecoded = 0; | 204 size_t framesDecoded = 0; |
| 198 | 205 |
| 199 // Pass data to decoder byte by byte. | 206 // Pass data to decoder byte by byte. |
| 200 for (size_t length = 1; length <= data->size(); ++length) { | 207 for (size_t length = 1; length <= data->size(); ++length) { |
| 201 RefPtr<SharedBuffer> tempData = SharedBuffer::create(data->data(), lengt
h); | 208 RefPtr<SharedBuffer> tempData = SharedBuffer::create(data->data(), lengt
h); |
| 202 decoder->setData(tempData.get(), length == data->size()); | 209 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBuf
ferSegmentReader(data)); |
| 210 decoder->setData(segmentReader.get(), length == data->size()); |
| 203 | 211 |
| 204 EXPECT_LE(frameCount, decoder->frameCount()); | 212 EXPECT_LE(frameCount, decoder->frameCount()); |
| 205 frameCount = decoder->frameCount(); | 213 frameCount = decoder->frameCount(); |
| 206 | 214 |
| 207 ImageFrame* frame = decoder->frameBufferAtIndex(frameCount - 1); | 215 ImageFrame* frame = decoder->frameBufferAtIndex(frameCount - 1); |
| 208 if (frame && frame->status() == ImageFrame::FrameComplete && framesDecod
ed < frameCount) | 216 if (frame && frame->status() == ImageFrame::FrameComplete && framesDecod
ed < frameCount) |
| 209 ++framesDecoded; | 217 ++framesDecoded; |
| 210 } | 218 } |
| 211 | 219 |
| 212 EXPECT_EQ(5u, decoder->frameCount()); | 220 EXPECT_EQ(5u, decoder->frameCount()); |
| 213 EXPECT_EQ(5u, framesDecoded); | 221 EXPECT_EQ(5u, framesDecoded); |
| 214 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount()); | 222 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount()); |
| 215 } | 223 } |
| 216 | 224 |
| 217 TEST(GIFImageDecoderTest, brokenSecondFrame) | 225 TEST(GIFImageDecoderTest, brokenSecondFrame) |
| 218 { | 226 { |
| 219 OwnPtr<ImageDecoder> decoder = createDecoder(); | 227 OwnPtr<ImageDecoder> decoder = createDecoder(); |
| 220 | 228 |
| 221 RefPtr<SharedBuffer> data = readFile(webTestsDataDir, "broken.gif"); | 229 RefPtr<SharedBuffer> data = readFile(webTestsDataDir, "broken.gif"); |
| 222 ASSERT_TRUE(data.get()); | 230 ASSERT_TRUE(data.get()); |
| 223 decoder->setData(data.get(), true); | 231 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS
egmentReader(data)); |
| 232 decoder->setData(segmentReader.get(), true); |
| 224 | 233 |
| 225 // One frame is detected but cannot be decoded. | 234 // One frame is detected but cannot be decoded. |
| 226 EXPECT_EQ(1u, decoder->frameCount()); | 235 EXPECT_EQ(1u, decoder->frameCount()); |
| 227 ImageFrame* frame = decoder->frameBufferAtIndex(1); | 236 ImageFrame* frame = decoder->frameBufferAtIndex(1); |
| 228 EXPECT_FALSE(frame); | 237 EXPECT_FALSE(frame); |
| 229 } | 238 } |
| 230 | 239 |
| 231 TEST(GIFImageDecoderTest, progressiveDecode) | 240 TEST(GIFImageDecoderTest, progressiveDecode) |
| 232 { | 241 { |
| 233 RefPtr<SharedBuffer> fullData = readFile(webTestsDataDir, "radient.gif"); | 242 RefPtr<SharedBuffer> fullData = readFile(webTestsDataDir, "radient.gif"); |
| 234 ASSERT_TRUE(fullData.get()); | 243 ASSERT_TRUE(fullData.get()); |
| 235 const size_t fullLength = fullData->size(); | 244 const size_t fullLength = fullData->size(); |
| 236 | 245 |
| 237 OwnPtr<ImageDecoder> decoder; | 246 OwnPtr<ImageDecoder> decoder; |
| 238 ImageFrame* frame; | 247 ImageFrame* frame; |
| 239 | 248 |
| 240 Vector<unsigned> truncatedHashes; | 249 Vector<unsigned> truncatedHashes; |
| 241 Vector<unsigned> progressiveHashes; | 250 Vector<unsigned> progressiveHashes; |
| 242 | 251 |
| 243 // Compute hashes when the file is truncated. | 252 // Compute hashes when the file is truncated. |
| 244 const size_t increment = 1; | 253 const size_t increment = 1; |
| 245 for (size_t i = 1; i <= fullLength; i += increment) { | 254 for (size_t i = 1; i <= fullLength; i += increment) { |
| 246 decoder = createDecoder(); | 255 decoder = createDecoder(); |
| 247 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), i); | 256 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), i); |
| 248 decoder->setData(data.get(), i == fullLength); | 257 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBuf
ferSegmentReader(data)); |
| 258 decoder->setData(segmentReader.get(), i == fullLength); |
| 249 frame = decoder->frameBufferAtIndex(0); | 259 frame = decoder->frameBufferAtIndex(0); |
| 250 if (!frame) { | 260 if (!frame) { |
| 251 truncatedHashes.append(0); | 261 truncatedHashes.append(0); |
| 252 continue; | 262 continue; |
| 253 } | 263 } |
| 254 truncatedHashes.append(hashBitmap(frame->getSkBitmap())); | 264 truncatedHashes.append(hashBitmap(frame->getSkBitmap())); |
| 255 } | 265 } |
| 256 | 266 |
| 257 // Compute hashes when the file is progressively decoded. | 267 // Compute hashes when the file is progressively decoded. |
| 258 decoder = createDecoder(); | 268 decoder = createDecoder(); |
| 259 EXPECT_EQ(cAnimationLoopOnce, decoder->repetitionCount()); | 269 EXPECT_EQ(cAnimationLoopOnce, decoder->repetitionCount()); |
| 260 for (size_t i = 1; i <= fullLength; i += increment) { | 270 for (size_t i = 1; i <= fullLength; i += increment) { |
| 261 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), i); | 271 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), i); |
| 262 decoder->setData(data.get(), i == fullLength); | 272 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBuf
ferSegmentReader(data)); |
| 273 decoder->setData(segmentReader.get(), i == fullLength); |
| 263 frame = decoder->frameBufferAtIndex(0); | 274 frame = decoder->frameBufferAtIndex(0); |
| 264 if (!frame) { | 275 if (!frame) { |
| 265 progressiveHashes.append(0); | 276 progressiveHashes.append(0); |
| 266 continue; | 277 continue; |
| 267 } | 278 } |
| 268 progressiveHashes.append(hashBitmap(frame->getSkBitmap())); | 279 progressiveHashes.append(hashBitmap(frame->getSkBitmap())); |
| 269 } | 280 } |
| 270 EXPECT_EQ(cAnimationNone, decoder->repetitionCount()); | 281 EXPECT_EQ(cAnimationNone, decoder->repetitionCount()); |
| 271 | 282 |
| 272 bool match = true; | 283 bool match = true; |
| 273 for (size_t i = 0; i < truncatedHashes.size(); ++i) { | 284 for (size_t i = 0; i < truncatedHashes.size(); ++i) { |
| 274 if (truncatedHashes[i] != progressiveHashes[i]) { | 285 if (truncatedHashes[i] != progressiveHashes[i]) { |
| 275 match = false; | 286 match = false; |
| 276 break; | 287 break; |
| 277 } | 288 } |
| 278 } | 289 } |
| 279 EXPECT_TRUE(match); | 290 EXPECT_TRUE(match); |
| 280 } | 291 } |
| 281 | 292 |
| 282 TEST(GIFImageDecoderTest, allDataReceivedTruncation) | 293 TEST(GIFImageDecoderTest, allDataReceivedTruncation) |
| 283 { | 294 { |
| 284 OwnPtr<ImageDecoder> decoder = createDecoder(); | 295 OwnPtr<ImageDecoder> decoder = createDecoder(); |
| 285 | 296 |
| 286 RefPtr<SharedBuffer> data = readFile(layoutTestResourcesDir, "animated.gif")
; | 297 RefPtr<SharedBuffer> data = readFile(layoutTestResourcesDir, "animated.gif")
; |
| 287 ASSERT_TRUE(data.get()); | 298 ASSERT_TRUE(data.get()); |
| 288 | 299 |
| 289 ASSERT_GE(data->size(), 10u); | 300 ASSERT_GE(data->size(), 10u); |
| 290 RefPtr<SharedBuffer> tempData = SharedBuffer::create(data->data(), data->siz
e() - 10); | 301 RefPtr<SharedBuffer> tempData = SharedBuffer::create(data->data(), data->siz
e() - 10); |
| 291 decoder->setData(tempData.get(), true); | 302 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS
egmentReader(tempData)); |
| 303 decoder->setData(segmentReader.get(), true); |
| 292 | 304 |
| 293 EXPECT_EQ(2u, decoder->frameCount()); | 305 EXPECT_EQ(2u, decoder->frameCount()); |
| 294 EXPECT_FALSE(decoder->failed()); | 306 EXPECT_FALSE(decoder->failed()); |
| 295 | 307 |
| 296 decoder->frameBufferAtIndex(0); | 308 decoder->frameBufferAtIndex(0); |
| 297 EXPECT_FALSE(decoder->failed()); | 309 EXPECT_FALSE(decoder->failed()); |
| 298 decoder->frameBufferAtIndex(1); | 310 decoder->frameBufferAtIndex(1); |
| 299 EXPECT_TRUE(decoder->failed()); | 311 EXPECT_TRUE(decoder->failed()); |
| 300 } | 312 } |
| 301 | 313 |
| 302 TEST(GIFImageDecoderTest, frameIsComplete) | 314 TEST(GIFImageDecoderTest, frameIsComplete) |
| 303 { | 315 { |
| 304 OwnPtr<ImageDecoder> decoder = createDecoder(); | 316 OwnPtr<ImageDecoder> decoder = createDecoder(); |
| 305 | 317 |
| 306 RefPtr<SharedBuffer> data = readFile(layoutTestResourcesDir, "animated.gif")
; | 318 RefPtr<SharedBuffer> data = readFile(layoutTestResourcesDir, "animated.gif")
; |
| 307 ASSERT_TRUE(data.get()); | 319 ASSERT_TRUE(data.get()); |
| 308 decoder->setData(data.get(), true); | 320 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS
egmentReader(data)); |
| 321 decoder->setData(segmentReader.get(), true); |
| 309 | 322 |
| 310 EXPECT_EQ(2u, decoder->frameCount()); | 323 EXPECT_EQ(2u, decoder->frameCount()); |
| 311 EXPECT_FALSE(decoder->failed()); | 324 EXPECT_FALSE(decoder->failed()); |
| 312 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(0)); | 325 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(0)); |
| 313 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(1)); | 326 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(1)); |
| 314 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount()); | 327 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount()); |
| 315 } | 328 } |
| 316 | 329 |
| 317 TEST(GIFImageDecoderTest, frameIsCompleteLoading) | 330 TEST(GIFImageDecoderTest, frameIsCompleteLoading) |
| 318 { | 331 { |
| 319 OwnPtr<ImageDecoder> decoder = createDecoder(); | 332 OwnPtr<ImageDecoder> decoder = createDecoder(); |
| 320 | 333 |
| 321 RefPtr<SharedBuffer> data = readFile(layoutTestResourcesDir, "animated.gif")
; | 334 RefPtr<SharedBuffer> data = readFile(layoutTestResourcesDir, "animated.gif")
; |
| 322 ASSERT_TRUE(data.get()); | 335 ASSERT_TRUE(data.get()); |
| 323 | 336 |
| 324 ASSERT_GE(data->size(), 10u); | 337 ASSERT_GE(data->size(), 10u); |
| 325 RefPtr<SharedBuffer> tempData = SharedBuffer::create(data->data(), data->siz
e() - 10); | 338 RefPtr<SharedBuffer> tempData = SharedBuffer::create(data->data(), data->siz
e() - 10); |
| 326 decoder->setData(tempData.get(), false); | 339 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS
egmentReader(tempData)); |
| 340 decoder->setData(segmentReader.get(), false); |
| 327 | 341 |
| 328 EXPECT_EQ(2u, decoder->frameCount()); | 342 EXPECT_EQ(2u, decoder->frameCount()); |
| 329 EXPECT_FALSE(decoder->failed()); | 343 EXPECT_FALSE(decoder->failed()); |
| 330 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(0)); | 344 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(0)); |
| 331 EXPECT_FALSE(decoder->frameIsCompleteAtIndex(1)); | 345 EXPECT_FALSE(decoder->frameIsCompleteAtIndex(1)); |
| 332 | 346 |
| 333 decoder->setData(data.get(), true); | 347 segmentReader = adoptRef(new SharedBufferSegmentReader(data)); |
| 348 decoder->setData(segmentReader.get(), true); |
| 334 EXPECT_EQ(2u, decoder->frameCount()); | 349 EXPECT_EQ(2u, decoder->frameCount()); |
| 335 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(0)); | 350 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(0)); |
| 336 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(1)); | 351 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(1)); |
| 337 } | 352 } |
| 338 | 353 |
| 339 TEST(GIFImageDecoderTest, badTerminator) | 354 TEST(GIFImageDecoderTest, badTerminator) |
| 340 { | 355 { |
| 341 RefPtr<SharedBuffer> referenceData = readFile(webTestsDataDir, "radient.gif"
); | 356 RefPtr<SharedBuffer> referenceData = readFile(webTestsDataDir, "radient.gif"
); |
| 342 RefPtr<SharedBuffer> testData = readFile(webTestsDataDir, "radient-bad-termi
nator.gif"); | 357 RefPtr<SharedBuffer> testData = readFile(webTestsDataDir, "radient-bad-termi
nator.gif"); |
| 343 ASSERT_TRUE(referenceData.get()); | 358 ASSERT_TRUE(referenceData.get()); |
| 344 ASSERT_TRUE(testData.get()); | 359 ASSERT_TRUE(testData.get()); |
| 345 | 360 |
| 346 OwnPtr<ImageDecoder> referenceDecoder = createDecoder(); | 361 OwnPtr<ImageDecoder> referenceDecoder = createDecoder(); |
| 347 referenceDecoder->setData(referenceData.get(), true); | 362 RefPtr<SharedBufferSegmentReader> referenceSharedBufferSegmentReader = adopt
Ref(new SharedBufferSegmentReader(referenceData)); |
| 363 referenceDecoder->setData(referenceSharedBufferSegmentReader.get(), true); |
| 348 EXPECT_EQ(1u, referenceDecoder->frameCount()); | 364 EXPECT_EQ(1u, referenceDecoder->frameCount()); |
| 349 ImageFrame* referenceFrame = referenceDecoder->frameBufferAtIndex(0); | 365 ImageFrame* referenceFrame = referenceDecoder->frameBufferAtIndex(0); |
| 350 ASSERT(referenceFrame); | 366 ASSERT(referenceFrame); |
| 351 | 367 |
| 352 OwnPtr<ImageDecoder> testDecoder = createDecoder(); | 368 OwnPtr<ImageDecoder> testDecoder = createDecoder(); |
| 353 testDecoder->setData(testData.get(), true); | 369 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS
egmentReader(testData)); |
| 370 testDecoder->setData(segmentReader.get(), true); |
| 354 EXPECT_EQ(1u, testDecoder->frameCount()); | 371 EXPECT_EQ(1u, testDecoder->frameCount()); |
| 355 ImageFrame* testFrame = testDecoder->frameBufferAtIndex(0); | 372 ImageFrame* testFrame = testDecoder->frameBufferAtIndex(0); |
| 356 ASSERT(testFrame); | 373 ASSERT(testFrame); |
| 357 | 374 |
| 358 EXPECT_EQ(hashBitmap(referenceFrame->getSkBitmap()), hashBitmap(testFrame->g
etSkBitmap())); | 375 EXPECT_EQ(hashBitmap(referenceFrame->getSkBitmap()), hashBitmap(testFrame->g
etSkBitmap())); |
| 359 } | 376 } |
| 360 | 377 |
| 361 TEST(GIFImageDecoderTest, updateRequiredPreviousFrameAfterFirstDecode) | 378 TEST(GIFImageDecoderTest, updateRequiredPreviousFrameAfterFirstDecode) |
| 362 { | 379 { |
| 363 OwnPtr<ImageDecoder> decoder = createDecoder(); | 380 OwnPtr<ImageDecoder> decoder = createDecoder(); |
| 364 | 381 |
| 365 RefPtr<SharedBuffer> fullData = readFile(layoutTestResourcesDir, "animated-1
0color.gif"); | 382 RefPtr<SharedBuffer> fullData = readFile(layoutTestResourcesDir, "animated-1
0color.gif"); |
| 366 ASSERT_TRUE(fullData.get()); | 383 ASSERT_TRUE(fullData.get()); |
| 367 | 384 |
| 368 // Give it data that is enough to parse but not decode in order to check the
status | 385 // Give it data that is enough to parse but not decode in order to check the
status |
| 369 // of requiredPreviousFrameIndex before decoding. | 386 // of requiredPreviousFrameIndex before decoding. |
| 370 size_t partialSize = 1; | 387 size_t partialSize = 1; |
| 371 do { | 388 do { |
| 372 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), parti
alSize); | 389 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), parti
alSize); |
| 373 decoder->setData(data.get(), false); | 390 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBuf
ferSegmentReader(data)); |
| 391 decoder->setData(segmentReader.get(), false); |
| 374 ++partialSize; | 392 ++partialSize; |
| 375 } while (!decoder->frameCount() || decoder->frameBufferAtIndex(0)->status()
== ImageFrame::FrameEmpty); | 393 } while (!decoder->frameCount() || decoder->frameBufferAtIndex(0)->status()
== ImageFrame::FrameEmpty); |
| 376 | 394 |
| 377 EXPECT_EQ(kNotFound, decoder->frameBufferAtIndex(0)->requiredPreviousFrameIn
dex()); | 395 EXPECT_EQ(kNotFound, decoder->frameBufferAtIndex(0)->requiredPreviousFrameIn
dex()); |
| 378 unsigned frameCount = decoder->frameCount(); | 396 unsigned frameCount = decoder->frameCount(); |
| 379 for (size_t i = 1; i < frameCount; ++i) | 397 for (size_t i = 1; i < frameCount; ++i) |
| 380 EXPECT_EQ(i - 1, decoder->frameBufferAtIndex(i)->requiredPreviousFrameIn
dex()); | 398 EXPECT_EQ(i - 1, decoder->frameBufferAtIndex(i)->requiredPreviousFrameIn
dex()); |
| 381 | 399 |
| 382 decoder->setData(fullData.get(), true); | 400 RefPtr<SegmentReader> fullSegmentReader = adoptRef(new SharedBufferSegmentRe
ader(fullData)); |
| 401 decoder->setData(fullSegmentReader.get(), true); |
| 383 for (size_t i = 0; i < frameCount; ++i) | 402 for (size_t i = 0; i < frameCount; ++i) |
| 384 EXPECT_EQ(kNotFound, decoder->frameBufferAtIndex(i)->requiredPreviousFra
meIndex()); | 403 EXPECT_EQ(kNotFound, decoder->frameBufferAtIndex(i)->requiredPreviousFra
meIndex()); |
| 385 } | 404 } |
| 386 | 405 |
| 387 TEST(GIFImageDecoderTest, randomFrameDecode) | 406 TEST(GIFImageDecoderTest, randomFrameDecode) |
| 388 { | 407 { |
| 389 // Single frame image. | 408 // Single frame image. |
| 390 testRandomFrameDecode(webTestsDataDir, "radient.gif"); | 409 testRandomFrameDecode(webTestsDataDir, "radient.gif"); |
| 391 // Multiple frame images. | 410 // Multiple frame images. |
| 392 testRandomFrameDecode(layoutTestResourcesDir, "animated-gif-with-offsets.gif
"); | 411 testRandomFrameDecode(layoutTestResourcesDir, "animated-gif-with-offsets.gif
"); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 409 Vector<unsigned> baselineHashes; | 428 Vector<unsigned> baselineHashes; |
| 410 createDecodingBaseline(&createDecoder, fullData.get(), &baselineHashes); | 429 createDecodingBaseline(&createDecoder, fullData.get(), &baselineHashes); |
| 411 size_t frameCount = baselineHashes.size(); | 430 size_t frameCount = baselineHashes.size(); |
| 412 | 431 |
| 413 OwnPtr<ImageDecoder> decoder = createDecoder(); | 432 OwnPtr<ImageDecoder> decoder = createDecoder(); |
| 414 | 433 |
| 415 // Let frame 0 be partially decoded. | 434 // Let frame 0 be partially decoded. |
| 416 size_t partialSize = 1; | 435 size_t partialSize = 1; |
| 417 do { | 436 do { |
| 418 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), parti
alSize); | 437 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), parti
alSize); |
| 419 decoder->setData(data.get(), false); | 438 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBuf
ferSegmentReader(data)); |
| 439 decoder->setData(segmentReader.get(), false); |
| 420 ++partialSize; | 440 ++partialSize; |
| 421 } while (!decoder->frameCount() || decoder->frameBufferAtIndex(0)->status()
== ImageFrame::FrameEmpty); | 441 } while (!decoder->frameCount() || decoder->frameBufferAtIndex(0)->status()
== ImageFrame::FrameEmpty); |
| 422 | 442 |
| 423 // Skip to the last frame and clear. | 443 // Skip to the last frame and clear. |
| 424 decoder->setData(fullData.get(), true); | 444 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS
egmentReader(fullData)); |
| 445 decoder->setData(segmentReader.get(), true); |
| 425 EXPECT_EQ(frameCount, decoder->frameCount()); | 446 EXPECT_EQ(frameCount, decoder->frameCount()); |
| 426 ImageFrame* lastFrame = decoder->frameBufferAtIndex(frameCount - 1); | 447 ImageFrame* lastFrame = decoder->frameBufferAtIndex(frameCount - 1); |
| 427 EXPECT_EQ(baselineHashes[frameCount - 1], hashBitmap(lastFrame->getSkBitmap(
))); | 448 EXPECT_EQ(baselineHashes[frameCount - 1], hashBitmap(lastFrame->getSkBitmap(
))); |
| 428 decoder->clearCacheExceptFrame(kNotFound); | 449 decoder->clearCacheExceptFrame(kNotFound); |
| 429 | 450 |
| 430 // Resume decoding of the first frame. | 451 // Resume decoding of the first frame. |
| 431 ImageFrame* firstFrame = decoder->frameBufferAtIndex(0); | 452 ImageFrame* firstFrame = decoder->frameBufferAtIndex(0); |
| 432 EXPECT_EQ(ImageFrame::FrameComplete, firstFrame->status()); | 453 EXPECT_EQ(ImageFrame::FrameComplete, firstFrame->status()); |
| 433 EXPECT_EQ(baselineHashes[0], hashBitmap(firstFrame->getSkBitmap())); | 454 EXPECT_EQ(baselineHashes[0], hashBitmap(firstFrame->getSkBitmap())); |
| 434 } | 455 } |
| 435 | 456 |
| 436 // The first LZW codes in the image are invalid values that try to create a loop | 457 // The first LZW codes in the image are invalid values that try to create a loop |
| 437 // in the dictionary. Decoding should fail, but not infinitely loop or corrupt m
emory. | 458 // in the dictionary. Decoding should fail, but not infinitely loop or corrupt m
emory. |
| 438 TEST(GIFImageDecoderTest, badInitialCode) | 459 TEST(GIFImageDecoderTest, badInitialCode) |
| 439 { | 460 { |
| 440 RefPtr<SharedBuffer> testData = readFile(decodersTestingDir, "bad-initial-co
de.gif"); | 461 RefPtr<SharedBuffer> testData = readFile(decodersTestingDir, "bad-initial-co
de.gif"); |
| 441 ASSERT_TRUE(testData.get()); | 462 ASSERT_TRUE(testData.get()); |
| 442 | 463 |
| 443 OwnPtr<ImageDecoder> testDecoder = createDecoder(); | 464 OwnPtr<ImageDecoder> testDecoder = createDecoder(); |
| 444 testDecoder->setData(testData.get(), true); | 465 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS
egmentReader(testData)); |
| 466 testDecoder->setData(segmentReader.get(), true); |
| 445 EXPECT_EQ(1u, testDecoder->frameCount()); | 467 EXPECT_EQ(1u, testDecoder->frameCount()); |
| 446 ASSERT_TRUE(testDecoder->frameBufferAtIndex(0)); | 468 ASSERT_TRUE(testDecoder->frameBufferAtIndex(0)); |
| 447 EXPECT_TRUE(testDecoder->failed()); | 469 EXPECT_TRUE(testDecoder->failed()); |
| 448 } | 470 } |
| 449 | 471 |
| 450 // The image has an invalid LZW code that exceeds dictionary size. Decoding shou
ld fail. | 472 // The image has an invalid LZW code that exceeds dictionary size. Decoding shou
ld fail. |
| 451 TEST(GIFImageDecoderTest, badCode) | 473 TEST(GIFImageDecoderTest, badCode) |
| 452 { | 474 { |
| 453 RefPtr<SharedBuffer> testData = readFile(decodersTestingDir, "bad-code.gif")
; | 475 RefPtr<SharedBuffer> testData = readFile(decodersTestingDir, "bad-code.gif")
; |
| 454 ASSERT_TRUE(testData.get()); | 476 ASSERT_TRUE(testData.get()); |
| 455 | 477 |
| 456 OwnPtr<ImageDecoder> testDecoder = createDecoder(); | 478 OwnPtr<ImageDecoder> testDecoder = createDecoder(); |
| 457 testDecoder->setData(testData.get(), true); | 479 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS
egmentReader(testData)); |
| 480 testDecoder->setData(segmentReader.get(), true); |
| 458 EXPECT_EQ(1u, testDecoder->frameCount()); | 481 EXPECT_EQ(1u, testDecoder->frameCount()); |
| 459 ASSERT_TRUE(testDecoder->frameBufferAtIndex(0)); | 482 ASSERT_TRUE(testDecoder->frameBufferAtIndex(0)); |
| 460 EXPECT_TRUE(testDecoder->failed()); | 483 EXPECT_TRUE(testDecoder->failed()); |
| 461 } | 484 } |
| 462 | 485 |
| 463 TEST(GIFImageDecoderTest, invalidDisposalMethod) | 486 TEST(GIFImageDecoderTest, invalidDisposalMethod) |
| 464 { | 487 { |
| 465 OwnPtr<ImageDecoder> decoder = createDecoder(); | 488 OwnPtr<ImageDecoder> decoder = createDecoder(); |
| 466 | 489 |
| 467 // The image has 2 frames, with disposal method 4 and 5, respectively. | 490 // The image has 2 frames, with disposal method 4 and 5, respectively. |
| 468 RefPtr<SharedBuffer> data = readFile(webTestsDataDir, "invalid-disposal-meth
od.gif"); | 491 RefPtr<SharedBuffer> data = readFile(webTestsDataDir, "invalid-disposal-meth
od.gif"); |
| 469 ASSERT_TRUE(data.get()); | 492 ASSERT_TRUE(data.get()); |
| 470 decoder->setData(data.get(), true); | 493 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS
egmentReader(data)); |
| 494 decoder->setData(segmentReader.get(), true); |
| 471 | 495 |
| 472 EXPECT_EQ(2u, decoder->frameCount()); | 496 EXPECT_EQ(2u, decoder->frameCount()); |
| 473 // Disposal method 4 is converted to ImageFrame::DisposeOverwritePrevious. | 497 // Disposal method 4 is converted to ImageFrame::DisposeOverwritePrevious. |
| 474 EXPECT_EQ(ImageFrame::DisposeOverwritePrevious, decoder->frameBufferAtIndex(
0)->disposalMethod()); | 498 EXPECT_EQ(ImageFrame::DisposeOverwritePrevious, decoder->frameBufferAtIndex(
0)->disposalMethod()); |
| 475 // Disposal method 5 is ignored. | 499 // Disposal method 5 is ignored. |
| 476 EXPECT_EQ(ImageFrame::DisposeNotSpecified, decoder->frameBufferAtIndex(1)->d
isposalMethod()); | 500 EXPECT_EQ(ImageFrame::DisposeNotSpecified, decoder->frameBufferAtIndex(1)->d
isposalMethod()); |
| 477 } | 501 } |
| 478 | 502 |
| 479 TEST(GIFImageDecoderTest, firstFrameHasGreaterSizeThanScreenSize) | 503 TEST(GIFImageDecoderTest, firstFrameHasGreaterSizeThanScreenSize) |
| 480 { | 504 { |
| 481 RefPtr<SharedBuffer> fullData = readFile(decodersTestingDir, "first-frame-ha
s-greater-size-than-screen-size.gif"); | 505 RefPtr<SharedBuffer> fullData = readFile(decodersTestingDir, "first-frame-ha
s-greater-size-than-screen-size.gif"); |
| 482 ASSERT_TRUE(fullData.get()); | 506 ASSERT_TRUE(fullData.get()); |
| 483 | 507 |
| 484 OwnPtr<ImageDecoder> decoder; | 508 OwnPtr<ImageDecoder> decoder; |
| 485 IntSize frameSize; | 509 IntSize frameSize; |
| 486 | 510 |
| 487 // Compute hashes when the file is truncated. | 511 // Compute hashes when the file is truncated. |
| 488 for (size_t i = 1; i <= fullData->size(); ++i) { | 512 for (size_t i = 1; i <= fullData->size(); ++i) { |
| 489 decoder = createDecoder(); | 513 decoder = createDecoder(); |
| 490 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), i); | 514 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), i); |
| 491 decoder->setData(data.get(), i == fullData->size()); | 515 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBuf
ferSegmentReader(data)); |
| 516 decoder->setData(segmentReader.get(), i == fullData->size()); |
| 492 | 517 |
| 493 if (decoder->isSizeAvailable() && !frameSize.width() && !frameSize.heigh
t()) { | 518 if (decoder->isSizeAvailable() && !frameSize.width() && !frameSize.heigh
t()) { |
| 494 frameSize = decoder->decodedSize(); | 519 frameSize = decoder->decodedSize(); |
| 495 continue; | 520 continue; |
| 496 } | 521 } |
| 497 | 522 |
| 498 ASSERT_EQ(frameSize.width(), decoder->decodedSize().width()); | 523 ASSERT_EQ(frameSize.width(), decoder->decodedSize().width()); |
| 499 ASSERT_EQ(frameSize.height(), decoder->decodedSize().height()); | 524 ASSERT_EQ(frameSize.height(), decoder->decodedSize().height()); |
| 500 } | 525 } |
| 501 } | 526 } |
| 502 | 527 |
| 503 } // namespace blink | 528 } // namespace blink |
| OLD | NEW |