| 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 15 matching lines...) Expand all Loading... |
| 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/webp/WEBPImageDecoder.h" | 31 #include "platform/image-decoders/webp/WEBPImageDecoder.h" |
| 32 | 32 |
| 33 #include "platform/RuntimeEnabledFeatures.h" | 33 #include "platform/RuntimeEnabledFeatures.h" |
| 34 #include "platform/SharedBuffer.h" | 34 #include "platform/SharedBuffer.h" |
| 35 #include "platform/image-decoders/ImageDecoderTestHelpers.h" | 35 #include "platform/image-decoders/ImageDecoderTestHelpers.h" |
| 36 #include "platform/image-decoders/SharedBufferSegmentReader.h" |
| 36 #include "public/platform/WebData.h" | 37 #include "public/platform/WebData.h" |
| 37 #include "public/platform/WebSize.h" | 38 #include "public/platform/WebSize.h" |
| 38 #include "testing/gtest/include/gtest/gtest.h" | 39 #include "testing/gtest/include/gtest/gtest.h" |
| 39 #include "wtf/OwnPtr.h" | 40 #include "wtf/OwnPtr.h" |
| 40 #include "wtf/PassOwnPtr.h" | 41 #include "wtf/PassOwnPtr.h" |
| 41 #include "wtf/Vector.h" | 42 #include "wtf/Vector.h" |
| 42 #include "wtf/dtoa/utils.h" | 43 #include "wtf/dtoa/utils.h" |
| 43 | 44 |
| 44 namespace blink { | 45 namespace blink { |
| 45 | 46 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 60 SCOPED_TRACE(webpFile); | 61 SCOPED_TRACE(webpFile); |
| 61 | 62 |
| 62 RefPtr<SharedBuffer> fullData = readFile(webpFile); | 63 RefPtr<SharedBuffer> fullData = readFile(webpFile); |
| 63 ASSERT_TRUE(fullData.get()); | 64 ASSERT_TRUE(fullData.get()); |
| 64 Vector<unsigned> baselineHashes; | 65 Vector<unsigned> baselineHashes; |
| 65 createDecodingBaseline(&createDecoder, fullData.get(), &baselineHashes); | 66 createDecodingBaseline(&createDecoder, fullData.get(), &baselineHashes); |
| 66 size_t frameCount = baselineHashes.size(); | 67 size_t frameCount = baselineHashes.size(); |
| 67 | 68 |
| 68 // Random decoding should get the same results as sequential decoding. | 69 // Random decoding should get the same results as sequential decoding. |
| 69 OwnPtr<ImageDecoder> decoder = createDecoder(); | 70 OwnPtr<ImageDecoder> decoder = createDecoder(); |
| 70 decoder->setData(fullData.get(), true); | 71 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS
egmentReader(fullData)); |
| 72 decoder->setData(segmentReader.get(), true); |
| 71 const size_t skippingStep = 5; | 73 const size_t skippingStep = 5; |
| 72 for (size_t i = 0; i < skippingStep; ++i) { | 74 for (size_t i = 0; i < skippingStep; ++i) { |
| 73 for (size_t j = i; j < frameCount; j += skippingStep) { | 75 for (size_t j = i; j < frameCount; j += skippingStep) { |
| 74 SCOPED_TRACE(testing::Message() << "Random i:" << i << " j:" << j); | 76 SCOPED_TRACE(testing::Message() << "Random i:" << i << " j:" << j); |
| 75 ImageFrame* frame = decoder->frameBufferAtIndex(j); | 77 ImageFrame* frame = decoder->frameBufferAtIndex(j); |
| 76 EXPECT_EQ(baselineHashes[j], hashBitmap(frame->getSkBitmap())); | 78 EXPECT_EQ(baselineHashes[j], hashBitmap(frame->getSkBitmap())); |
| 77 } | 79 } |
| 78 } | 80 } |
| 79 | 81 |
| 80 // Decoding in reverse order. | 82 // Decoding in reverse order. |
| 81 decoder = createDecoder(); | 83 decoder = createDecoder(); |
| 82 decoder->setData(fullData.get(), true); | 84 decoder->setData(segmentReader.get(), true); |
| 83 for (size_t i = frameCount; i; --i) { | 85 for (size_t i = frameCount; i; --i) { |
| 84 SCOPED_TRACE(testing::Message() << "Reverse i:" << i); | 86 SCOPED_TRACE(testing::Message() << "Reverse i:" << i); |
| 85 ImageFrame* frame = decoder->frameBufferAtIndex(i - 1); | 87 ImageFrame* frame = decoder->frameBufferAtIndex(i - 1); |
| 86 EXPECT_EQ(baselineHashes[i - 1], hashBitmap(frame->getSkBitmap())); | 88 EXPECT_EQ(baselineHashes[i - 1], hashBitmap(frame->getSkBitmap())); |
| 87 } | 89 } |
| 88 } | 90 } |
| 89 | 91 |
| 90 void testRandomDecodeAfterClearFrameBufferCache(const char* webpFile) | 92 void testRandomDecodeAfterClearFrameBufferCache(const char* webpFile) |
| 91 { | 93 { |
| 92 SCOPED_TRACE(webpFile); | 94 SCOPED_TRACE(webpFile); |
| 93 | 95 |
| 94 RefPtr<SharedBuffer> data = readFile(webpFile); | 96 RefPtr<SharedBuffer> data = readFile(webpFile); |
| 95 ASSERT_TRUE(data.get()); | 97 ASSERT_TRUE(data.get()); |
| 96 Vector<unsigned> baselineHashes; | 98 Vector<unsigned> baselineHashes; |
| 97 createDecodingBaseline(&createDecoder, data.get(), &baselineHashes); | 99 createDecodingBaseline(&createDecoder, data.get(), &baselineHashes); |
| 98 size_t frameCount = baselineHashes.size(); | 100 size_t frameCount = baselineHashes.size(); |
| 99 | 101 |
| 100 OwnPtr<ImageDecoder> decoder = createDecoder(); | 102 OwnPtr<ImageDecoder> decoder = createDecoder(); |
| 101 decoder->setData(data.get(), true); | 103 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS
egmentReader(data)); |
| 104 decoder->setData(segmentReader.get(), true); |
| 102 for (size_t clearExceptFrame = 0; clearExceptFrame < frameCount; ++clearExce
ptFrame) { | 105 for (size_t clearExceptFrame = 0; clearExceptFrame < frameCount; ++clearExce
ptFrame) { |
| 103 decoder->clearCacheExceptFrame(clearExceptFrame); | 106 decoder->clearCacheExceptFrame(clearExceptFrame); |
| 104 const size_t skippingStep = 5; | 107 const size_t skippingStep = 5; |
| 105 for (size_t i = 0; i < skippingStep; ++i) { | 108 for (size_t i = 0; i < skippingStep; ++i) { |
| 106 for (size_t j = 0; j < frameCount; j += skippingStep) { | 109 for (size_t j = 0; j < frameCount; j += skippingStep) { |
| 107 SCOPED_TRACE(testing::Message() << "Random i:" << i << " j:" <<
j); | 110 SCOPED_TRACE(testing::Message() << "Random i:" << i << " j:" <<
j); |
| 108 ImageFrame* frame = decoder->frameBufferAtIndex(j); | 111 ImageFrame* frame = decoder->frameBufferAtIndex(j); |
| 109 EXPECT_EQ(baselineHashes[j], hashBitmap(frame->getSkBitmap())); | 112 EXPECT_EQ(baselineHashes[j], hashBitmap(frame->getSkBitmap())); |
| 110 } | 113 } |
| 111 } | 114 } |
| 112 } | 115 } |
| 113 } | 116 } |
| 114 | 117 |
| 115 void testDecodeAfterReallocatingData(const char* webpFile) | 118 void testDecodeAfterReallocatingData(const char* webpFile) |
| 116 { | 119 { |
| 117 OwnPtr<ImageDecoder> decoder = createDecoder(); | 120 OwnPtr<ImageDecoder> decoder = createDecoder(); |
| 118 RefPtr<SharedBuffer> data = readFile(webpFile); | 121 RefPtr<SharedBuffer> data = readFile(webpFile); |
| 119 ASSERT_TRUE(data.get()); | 122 ASSERT_TRUE(data.get()); |
| 120 | 123 |
| 121 // Parse from 'data'. | 124 // Parse from 'data'. |
| 122 decoder->setData(data.get(), true); | 125 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS
egmentReader(data)); |
| 126 decoder->setData(segmentReader.get(), true); |
| 123 size_t frameCount = decoder->frameCount(); | 127 size_t frameCount = decoder->frameCount(); |
| 124 | 128 |
| 125 // ... and then decode frames from 'reallocatedData'. | 129 // ... and then decode frames from 'reallocatedData'. |
| 126 RefPtr<SharedBuffer> reallocatedData = data.get()->copy(); | 130 RefPtr<SharedBuffer> reallocatedData = data.get()->copy(); |
| 127 ASSERT_TRUE(reallocatedData.get()); | 131 ASSERT_TRUE(reallocatedData.get()); |
| 128 data.clear(); | 132 data.clear(); |
| 129 decoder->setData(reallocatedData.get(), true); | 133 segmentReader = adoptRef(new SharedBufferSegmentReader(reallocatedData)); |
| 134 decoder->setData(segmentReader.get(), true); |
| 130 | 135 |
| 131 for (size_t i = 0; i < frameCount; ++i) { | 136 for (size_t i = 0; i < frameCount; ++i) { |
| 132 const ImageFrame* const frame = decoder->frameBufferAtIndex(i); | 137 const ImageFrame* const frame = decoder->frameBufferAtIndex(i); |
| 133 EXPECT_EQ(ImageFrame::FrameComplete, frame->status()); | 138 EXPECT_EQ(ImageFrame::FrameComplete, frame->status()); |
| 134 } | 139 } |
| 135 } | 140 } |
| 136 | 141 |
| 137 void testByteByByteSizeAvailable(const char* webpFile, size_t frameOffset, bool
hasColorProfile, int expectedRepetitionCount) | 142 void testByteByByteSizeAvailable(const char* webpFile, size_t frameOffset, bool
hasColorProfile, int expectedRepetitionCount) |
| 138 { | 143 { |
| 139 OwnPtr<ImageDecoder> decoder = createDecoder(); | 144 OwnPtr<ImageDecoder> decoder = createDecoder(); |
| 140 RefPtr<SharedBuffer> data = readFile(webpFile); | 145 RefPtr<SharedBuffer> data = readFile(webpFile); |
| 141 ASSERT_TRUE(data.get()); | 146 ASSERT_TRUE(data.get()); |
| 142 EXPECT_LT(frameOffset, data->size()); | 147 EXPECT_LT(frameOffset, data->size()); |
| 143 | 148 |
| 144 // Send data to the decoder byte-by-byte and use the provided frame offset i
n the data to check | 149 // Send data to the decoder byte-by-byte and use the provided frame offset i
n the data to check |
| 145 // isSizeAvailable() changes state only when that offset is reached, and the
associated decoder | 150 // isSizeAvailable() changes state only when that offset is reached, and the
associated decoder |
| 146 // state also: size, colorProfile, frameCount, repetitionCount ... | 151 // state also: size, colorProfile, frameCount, repetitionCount ... |
| 147 | 152 |
| 148 for (size_t length = 1; length <= frameOffset; ++length) { | 153 for (size_t length = 1; length <= frameOffset; ++length) { |
| 149 RefPtr<SharedBuffer> tempData = SharedBuffer::create(data->data(), lengt
h); | 154 RefPtr<SharedBuffer> tempData = SharedBuffer::create(data->data(), lengt
h); |
| 150 decoder->setData(tempData.get(), false); | 155 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBuf
ferSegmentReader(tempData)); |
| 156 decoder->setData(segmentReader.get(), false); |
| 151 | 157 |
| 152 if (length < frameOffset) { | 158 if (length < frameOffset) { |
| 153 EXPECT_FALSE(decoder->isSizeAvailable()); | 159 EXPECT_FALSE(decoder->isSizeAvailable()); |
| 154 EXPECT_TRUE(decoder->size().isEmpty()); | 160 EXPECT_TRUE(decoder->size().isEmpty()); |
| 155 EXPECT_FALSE(decoder->hasColorProfile()); | 161 EXPECT_FALSE(decoder->hasColorProfile()); |
| 156 EXPECT_EQ(0u, decoder->frameCount()); | 162 EXPECT_EQ(0u, decoder->frameCount()); |
| 157 EXPECT_EQ(cAnimationLoopOnce, decoder->repetitionCount()); | 163 EXPECT_EQ(cAnimationLoopOnce, decoder->repetitionCount()); |
| 158 EXPECT_FALSE(decoder->frameBufferAtIndex(0)); | 164 EXPECT_FALSE(decoder->frameBufferAtIndex(0)); |
| 159 } else { | 165 } else { |
| 160 EXPECT_TRUE(decoder->isSizeAvailable()); | 166 EXPECT_TRUE(decoder->isSizeAvailable()); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 178 } | 184 } |
| 179 | 185 |
| 180 // If 'parseErrorExpected' is true, error is expected during parse (frameCount() | 186 // If 'parseErrorExpected' is true, error is expected during parse (frameCount() |
| 181 // call); else error is expected during decode (frameBufferAtIndex() call). | 187 // call); else error is expected during decode (frameBufferAtIndex() call). |
| 182 void testInvalidImage(const char* webpFile, bool parseErrorExpected) | 188 void testInvalidImage(const char* webpFile, bool parseErrorExpected) |
| 183 { | 189 { |
| 184 OwnPtr<ImageDecoder> decoder = createDecoder(); | 190 OwnPtr<ImageDecoder> decoder = createDecoder(); |
| 185 | 191 |
| 186 RefPtr<SharedBuffer> data = readFile(webpFile); | 192 RefPtr<SharedBuffer> data = readFile(webpFile); |
| 187 ASSERT_TRUE(data.get()); | 193 ASSERT_TRUE(data.get()); |
| 188 decoder->setData(data.get(), true); | 194 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS
egmentReader(data)); |
| 195 decoder->setData(segmentReader.get(), true); |
| 189 | 196 |
| 190 if (parseErrorExpected) { | 197 if (parseErrorExpected) { |
| 191 EXPECT_EQ(0u, decoder->frameCount()); | 198 EXPECT_EQ(0u, decoder->frameCount()); |
| 192 EXPECT_FALSE(decoder->frameBufferAtIndex(0)); | 199 EXPECT_FALSE(decoder->frameBufferAtIndex(0)); |
| 193 } else { | 200 } else { |
| 194 EXPECT_GT(decoder->frameCount(), 0u); | 201 EXPECT_GT(decoder->frameCount(), 0u); |
| 195 ImageFrame* frame = decoder->frameBufferAtIndex(0); | 202 ImageFrame* frame = decoder->frameBufferAtIndex(0); |
| 196 ASSERT_TRUE(frame); | 203 ASSERT_TRUE(frame); |
| 197 EXPECT_EQ(ImageFrame::FramePartial, frame->status()); | 204 EXPECT_EQ(ImageFrame::FramePartial, frame->status()); |
| 198 } | 205 } |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 234 // Pre-multiplication could round the RGBA channel values. So, we declare | 241 // Pre-multiplication could round the RGBA channel values. So, we declare |
| 235 // that the frames match if the RGBA channel values differ by at most 2. | 242 // that the frames match if the RGBA channel values differ by at most 2. |
| 236 EXPECT_GE(2, maxDifference) << webpFile; | 243 EXPECT_GE(2, maxDifference) << webpFile; |
| 237 } | 244 } |
| 238 | 245 |
| 239 // Verify that result of alpha blending is similar for AlphaPremultiplied and Al
phaNotPremultiplied cases. | 246 // Verify that result of alpha blending is similar for AlphaPremultiplied and Al
phaNotPremultiplied cases. |
| 240 void testAlphaBlending(const char* webpFile) | 247 void testAlphaBlending(const char* webpFile) |
| 241 { | 248 { |
| 242 RefPtr<SharedBuffer> data = readFile(webpFile); | 249 RefPtr<SharedBuffer> data = readFile(webpFile); |
| 243 ASSERT_TRUE(data.get()); | 250 ASSERT_TRUE(data.get()); |
| 251 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS
egmentReader(data)); |
| 244 | 252 |
| 245 OwnPtr<ImageDecoder> decoderA = createDecoder(ImageDecoder::AlphaPremultipli
ed); | 253 OwnPtr<ImageDecoder> decoderA = createDecoder(ImageDecoder::AlphaPremultipli
ed); |
| 246 decoderA->setData(data.get(), true); | 254 decoderA->setData(segmentReader.get(), true); |
| 247 | 255 |
| 248 OwnPtr<ImageDecoder> decoderB = createDecoder(ImageDecoder::AlphaNotPremulti
plied); | 256 OwnPtr<ImageDecoder> decoderB = createDecoder(ImageDecoder::AlphaNotPremulti
plied); |
| 249 decoderB->setData(data.get(), true); | 257 decoderB->setData(segmentReader.get(), true); |
| 250 | 258 |
| 251 size_t frameCount = decoderA->frameCount(); | 259 size_t frameCount = decoderA->frameCount(); |
| 252 ASSERT_EQ(frameCount, decoderB->frameCount()); | 260 ASSERT_EQ(frameCount, decoderB->frameCount()); |
| 253 | 261 |
| 254 for (size_t i = 0; i < frameCount; ++i) | 262 for (size_t i = 0; i < frameCount; ++i) |
| 255 verifyFramesMatch(webpFile, decoderA->frameBufferAtIndex(i), decoderB->f
rameBufferAtIndex(i)); | 263 verifyFramesMatch(webpFile, decoderA->frameBufferAtIndex(i), decoderB->f
rameBufferAtIndex(i)); |
| 256 } | 264 } |
| 257 | 265 |
| 258 } // anonymous namespace | 266 } // anonymous namespace |
| 259 | 267 |
| 260 TEST(AnimatedWebPTests, uniqueGenerationIDs) | 268 TEST(AnimatedWebPTests, uniqueGenerationIDs) |
| 261 { | 269 { |
| 262 OwnPtr<ImageDecoder> decoder = createDecoder(); | 270 OwnPtr<ImageDecoder> decoder = createDecoder(); |
| 263 | 271 |
| 264 RefPtr<SharedBuffer> data = readFile("/LayoutTests/fast/images/resources/web
p-animated.webp"); | 272 RefPtr<SharedBuffer> data = readFile("/LayoutTests/fast/images/resources/web
p-animated.webp"); |
| 265 ASSERT_TRUE(data.get()); | 273 ASSERT_TRUE(data.get()); |
| 266 decoder->setData(data.get(), true); | 274 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS
egmentReader(data)); |
| 275 decoder->setData(segmentReader.get(), true); |
| 267 | 276 |
| 268 ImageFrame* frame = decoder->frameBufferAtIndex(0); | 277 ImageFrame* frame = decoder->frameBufferAtIndex(0); |
| 269 uint32_t generationID0 = frame->getSkBitmap().getGenerationID(); | 278 uint32_t generationID0 = frame->getSkBitmap().getGenerationID(); |
| 270 frame = decoder->frameBufferAtIndex(1); | 279 frame = decoder->frameBufferAtIndex(1); |
| 271 uint32_t generationID1 = frame->getSkBitmap().getGenerationID(); | 280 uint32_t generationID1 = frame->getSkBitmap().getGenerationID(); |
| 272 | 281 |
| 273 EXPECT_TRUE(generationID0 != generationID1); | 282 EXPECT_TRUE(generationID0 != generationID1); |
| 274 } | 283 } |
| 275 | 284 |
| 276 TEST(AnimatedWebPTests, verifyAnimationParametersTransparentImage) | 285 TEST(AnimatedWebPTests, verifyAnimationParametersTransparentImage) |
| 277 { | 286 { |
| 278 OwnPtr<ImageDecoder> decoder = createDecoder(); | 287 OwnPtr<ImageDecoder> decoder = createDecoder(); |
| 279 EXPECT_EQ(cAnimationLoopOnce, decoder->repetitionCount()); | 288 EXPECT_EQ(cAnimationLoopOnce, decoder->repetitionCount()); |
| 280 | 289 |
| 281 RefPtr<SharedBuffer> data = readFile("/LayoutTests/fast/images/resources/web
p-animated.webp"); | 290 RefPtr<SharedBuffer> data = readFile("/LayoutTests/fast/images/resources/web
p-animated.webp"); |
| 282 ASSERT_TRUE(data.get()); | 291 ASSERT_TRUE(data.get()); |
| 283 decoder->setData(data.get(), true); | 292 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS
egmentReader(data)); |
| 293 decoder->setData(segmentReader.get(), true); |
| 284 | 294 |
| 285 const int canvasWidth = 11; | 295 const int canvasWidth = 11; |
| 286 const int canvasHeight = 29; | 296 const int canvasHeight = 29; |
| 287 const struct AnimParam { | 297 const struct AnimParam { |
| 288 int xOffset, yOffset, width, height; | 298 int xOffset, yOffset, width, height; |
| 289 ImageFrame::DisposalMethod disposalMethod; | 299 ImageFrame::DisposalMethod disposalMethod; |
| 290 ImageFrame::AlphaBlendSource alphaBlendSource; | 300 ImageFrame::AlphaBlendSource alphaBlendSource; |
| 291 unsigned duration; | 301 unsigned duration; |
| 292 bool hasAlpha; | 302 bool hasAlpha; |
| 293 } frameParameters[] = { | 303 } frameParameters[] = { |
| (...skipping 21 matching lines...) Expand all Loading... |
| 315 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount()); | 325 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount()); |
| 316 } | 326 } |
| 317 | 327 |
| 318 TEST(AnimatedWebPTests, verifyAnimationParametersOpaqueFramesTransparentBackgrou
nd) | 328 TEST(AnimatedWebPTests, verifyAnimationParametersOpaqueFramesTransparentBackgrou
nd) |
| 319 { | 329 { |
| 320 OwnPtr<ImageDecoder> decoder = createDecoder(); | 330 OwnPtr<ImageDecoder> decoder = createDecoder(); |
| 321 EXPECT_EQ(cAnimationLoopOnce, decoder->repetitionCount()); | 331 EXPECT_EQ(cAnimationLoopOnce, decoder->repetitionCount()); |
| 322 | 332 |
| 323 RefPtr<SharedBuffer> data = readFile("/LayoutTests/fast/images/resources/web
p-animated-opaque.webp"); | 333 RefPtr<SharedBuffer> data = readFile("/LayoutTests/fast/images/resources/web
p-animated-opaque.webp"); |
| 324 ASSERT_TRUE(data.get()); | 334 ASSERT_TRUE(data.get()); |
| 325 decoder->setData(data.get(), true); | 335 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS
egmentReader(data)); |
| 336 decoder->setData(segmentReader.get(), true); |
| 326 | 337 |
| 327 const int canvasWidth = 94; | 338 const int canvasWidth = 94; |
| 328 const int canvasHeight = 87; | 339 const int canvasHeight = 87; |
| 329 const struct AnimParam { | 340 const struct AnimParam { |
| 330 int xOffset, yOffset, width, height; | 341 int xOffset, yOffset, width, height; |
| 331 ImageFrame::DisposalMethod disposalMethod; | 342 ImageFrame::DisposalMethod disposalMethod; |
| 332 ImageFrame::AlphaBlendSource alphaBlendSource; | 343 ImageFrame::AlphaBlendSource alphaBlendSource; |
| 333 unsigned duration; | 344 unsigned duration; |
| 334 bool hasAlpha; | 345 bool hasAlpha; |
| 335 } frameParameters[] = { | 346 } frameParameters[] = { |
| (...skipping 22 matching lines...) Expand all Loading... |
| 358 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount()); | 369 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount()); |
| 359 } | 370 } |
| 360 | 371 |
| 361 TEST(AnimatedWebPTests, verifyAnimationParametersBlendOverwrite) | 372 TEST(AnimatedWebPTests, verifyAnimationParametersBlendOverwrite) |
| 362 { | 373 { |
| 363 OwnPtr<ImageDecoder> decoder = createDecoder(); | 374 OwnPtr<ImageDecoder> decoder = createDecoder(); |
| 364 EXPECT_EQ(cAnimationLoopOnce, decoder->repetitionCount()); | 375 EXPECT_EQ(cAnimationLoopOnce, decoder->repetitionCount()); |
| 365 | 376 |
| 366 RefPtr<SharedBuffer> data = readFile("/LayoutTests/fast/images/resources/web
p-animated-no-blend.webp"); | 377 RefPtr<SharedBuffer> data = readFile("/LayoutTests/fast/images/resources/web
p-animated-no-blend.webp"); |
| 367 ASSERT_TRUE(data.get()); | 378 ASSERT_TRUE(data.get()); |
| 368 decoder->setData(data.get(), true); | 379 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS
egmentReader(data)); |
| 380 decoder->setData(segmentReader.get(), true); |
| 369 | 381 |
| 370 const int canvasWidth = 94; | 382 const int canvasWidth = 94; |
| 371 const int canvasHeight = 87; | 383 const int canvasHeight = 87; |
| 372 const struct AnimParam { | 384 const struct AnimParam { |
| 373 int xOffset, yOffset, width, height; | 385 int xOffset, yOffset, width, height; |
| 374 ImageFrame::DisposalMethod disposalMethod; | 386 ImageFrame::DisposalMethod disposalMethod; |
| 375 ImageFrame::AlphaBlendSource alphaBlendSource; | 387 ImageFrame::AlphaBlendSource alphaBlendSource; |
| 376 unsigned duration; | 388 unsigned duration; |
| 377 bool hasAlpha; | 389 bool hasAlpha; |
| 378 } frameParameters[] = { | 390 } frameParameters[] = { |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 414 // One of the frame rectangles extends outside the image boundary. | 426 // One of the frame rectangles extends outside the image boundary. |
| 415 testInvalidImage("/LayoutTests/fast/images/resources/invalid-animated-webp3.
webp", true); | 427 testInvalidImage("/LayoutTests/fast/images/resources/invalid-animated-webp3.
webp", true); |
| 416 } | 428 } |
| 417 | 429 |
| 418 TEST(AnimatedWebPTests, truncatedLastFrame) | 430 TEST(AnimatedWebPTests, truncatedLastFrame) |
| 419 { | 431 { |
| 420 OwnPtr<ImageDecoder> decoder = createDecoder(); | 432 OwnPtr<ImageDecoder> decoder = createDecoder(); |
| 421 | 433 |
| 422 RefPtr<SharedBuffer> data = readFile("/LayoutTests/fast/images/resources/inv
alid-animated-webp2.webp"); | 434 RefPtr<SharedBuffer> data = readFile("/LayoutTests/fast/images/resources/inv
alid-animated-webp2.webp"); |
| 423 ASSERT_TRUE(data.get()); | 435 ASSERT_TRUE(data.get()); |
| 424 decoder->setData(data.get(), true); | 436 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS
egmentReader(data)); |
| 437 decoder->setData(segmentReader.get(), true); |
| 425 | 438 |
| 426 size_t frameCount = 8; | 439 size_t frameCount = 8; |
| 427 EXPECT_EQ(frameCount, decoder->frameCount()); | 440 EXPECT_EQ(frameCount, decoder->frameCount()); |
| 428 ImageFrame* frame = decoder->frameBufferAtIndex(0); | 441 ImageFrame* frame = decoder->frameBufferAtIndex(0); |
| 429 ASSERT_TRUE(frame); | 442 ASSERT_TRUE(frame); |
| 430 EXPECT_EQ(ImageFrame::FrameComplete, frame->status()); | 443 EXPECT_EQ(ImageFrame::FrameComplete, frame->status()); |
| 431 EXPECT_FALSE(decoder->failed()); | 444 EXPECT_FALSE(decoder->failed()); |
| 432 frame = decoder->frameBufferAtIndex(frameCount - 1); | 445 frame = decoder->frameBufferAtIndex(frameCount - 1); |
| 433 ASSERT_TRUE(frame); | 446 ASSERT_TRUE(frame); |
| 434 EXPECT_EQ(ImageFrame::FramePartial, frame->status()); | 447 EXPECT_EQ(ImageFrame::FramePartial, frame->status()); |
| 435 EXPECT_TRUE(decoder->failed()); | 448 EXPECT_TRUE(decoder->failed()); |
| 436 frame = decoder->frameBufferAtIndex(0); | 449 frame = decoder->frameBufferAtIndex(0); |
| 437 ASSERT_TRUE(frame); | 450 ASSERT_TRUE(frame); |
| 438 EXPECT_EQ(ImageFrame::FrameComplete, frame->status()); | 451 EXPECT_EQ(ImageFrame::FrameComplete, frame->status()); |
| 439 } | 452 } |
| 440 | 453 |
| 441 TEST(AnimatedWebPTests, truncatedInBetweenFrame) | 454 TEST(AnimatedWebPTests, truncatedInBetweenFrame) |
| 442 { | 455 { |
| 443 OwnPtr<ImageDecoder> decoder = createDecoder(); | 456 OwnPtr<ImageDecoder> decoder = createDecoder(); |
| 444 | 457 |
| 445 RefPtr<SharedBuffer> fullData = readFile("/LayoutTests/fast/images/resources
/invalid-animated-webp4.webp"); | 458 RefPtr<SharedBuffer> fullData = readFile("/LayoutTests/fast/images/resources
/invalid-animated-webp4.webp"); |
| 446 ASSERT_TRUE(fullData.get()); | 459 ASSERT_TRUE(fullData.get()); |
| 447 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), fullData-
>size() - 1); | 460 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), fullData-
>size() - 1); |
| 448 decoder->setData(data.get(), false); | 461 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS
egmentReader(data)); |
| 462 decoder->setData(segmentReader.get(), false); |
| 449 | 463 |
| 450 ImageFrame* frame = decoder->frameBufferAtIndex(1); | 464 ImageFrame* frame = decoder->frameBufferAtIndex(1); |
| 451 ASSERT_TRUE(frame); | 465 ASSERT_TRUE(frame); |
| 452 EXPECT_EQ(ImageFrame::FrameComplete, frame->status()); | 466 EXPECT_EQ(ImageFrame::FrameComplete, frame->status()); |
| 453 frame = decoder->frameBufferAtIndex(2); | 467 frame = decoder->frameBufferAtIndex(2); |
| 454 ASSERT_TRUE(frame); | 468 ASSERT_TRUE(frame); |
| 455 EXPECT_EQ(ImageFrame::FramePartial, frame->status()); | 469 EXPECT_EQ(ImageFrame::FramePartial, frame->status()); |
| 456 EXPECT_TRUE(decoder->failed()); | 470 EXPECT_TRUE(decoder->failed()); |
| 457 } | 471 } |
| 458 | 472 |
| 459 // Reproduce a crash that used to happen for a specific file with specific seque
nce of method calls. | 473 // Reproduce a crash that used to happen for a specific file with specific seque
nce of method calls. |
| 460 TEST(AnimatedWebPTests, reproCrash) | 474 TEST(AnimatedWebPTests, reproCrash) |
| 461 { | 475 { |
| 462 OwnPtr<ImageDecoder> decoder = createDecoder(); | 476 OwnPtr<ImageDecoder> decoder = createDecoder(); |
| 463 | 477 |
| 464 RefPtr<SharedBuffer> fullData = readFile("/LayoutTests/fast/images/resources
/invalid_vp8_vp8x.webp"); | 478 RefPtr<SharedBuffer> fullData = readFile("/LayoutTests/fast/images/resources
/invalid_vp8_vp8x.webp"); |
| 465 ASSERT_TRUE(fullData.get()); | 479 ASSERT_TRUE(fullData.get()); |
| 466 | 480 |
| 467 // Parse partial data up to which error in bitstream is not detected. | 481 // Parse partial data up to which error in bitstream is not detected. |
| 468 const size_t partialSize = 32768; | 482 const size_t partialSize = 32768; |
| 469 ASSERT_GT(fullData->size(), partialSize); | 483 ASSERT_GT(fullData->size(), partialSize); |
| 470 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), partialSi
ze); | 484 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), partialSi
ze); |
| 471 decoder->setData(data.get(), false); | 485 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS
egmentReader(data)); |
| 486 decoder->setData(segmentReader.get(), false); |
| 472 EXPECT_EQ(1u, decoder->frameCount()); | 487 EXPECT_EQ(1u, decoder->frameCount()); |
| 473 ImageFrame* frame = decoder->frameBufferAtIndex(0); | 488 ImageFrame* frame = decoder->frameBufferAtIndex(0); |
| 474 ASSERT_TRUE(frame); | 489 ASSERT_TRUE(frame); |
| 475 EXPECT_EQ(ImageFrame::FramePartial, frame->status()); | 490 EXPECT_EQ(ImageFrame::FramePartial, frame->status()); |
| 476 EXPECT_FALSE(decoder->failed()); | 491 EXPECT_FALSE(decoder->failed()); |
| 477 | 492 |
| 478 // Parse full data now. The error in bitstream should now be detected. | 493 // Parse full data now. The error in bitstream should now be detected. |
| 479 decoder->setData(fullData.get(), true); | 494 segmentReader = adoptRef(new SharedBufferSegmentReader(fullData)); |
| 495 decoder->setData(segmentReader.get(), true); |
| 480 EXPECT_EQ(1u, decoder->frameCount()); | 496 EXPECT_EQ(1u, decoder->frameCount()); |
| 481 frame = decoder->frameBufferAtIndex(0); | 497 frame = decoder->frameBufferAtIndex(0); |
| 482 ASSERT_TRUE(frame); | 498 ASSERT_TRUE(frame); |
| 483 EXPECT_EQ(ImageFrame::FramePartial, frame->status()); | 499 EXPECT_EQ(ImageFrame::FramePartial, frame->status()); |
| 484 EXPECT_EQ(cAnimationLoopOnce, decoder->repetitionCount()); | 500 EXPECT_EQ(cAnimationLoopOnce, decoder->repetitionCount()); |
| 485 EXPECT_TRUE(decoder->failed()); | 501 EXPECT_TRUE(decoder->failed()); |
| 486 } | 502 } |
| 487 | 503 |
| 488 TEST(AnimatedWebPTests, progressiveDecode) | 504 TEST(AnimatedWebPTests, progressiveDecode) |
| 489 { | 505 { |
| 490 RefPtr<SharedBuffer> fullData = readFile("/LayoutTests/fast/images/resources
/webp-animated.webp"); | 506 RefPtr<SharedBuffer> fullData = readFile("/LayoutTests/fast/images/resources
/webp-animated.webp"); |
| 491 ASSERT_TRUE(fullData.get()); | 507 ASSERT_TRUE(fullData.get()); |
| 492 const size_t fullLength = fullData->size(); | 508 const size_t fullLength = fullData->size(); |
| 493 | 509 |
| 494 OwnPtr<ImageDecoder> decoder; | 510 OwnPtr<ImageDecoder> decoder; |
| 495 ImageFrame* frame; | 511 ImageFrame* frame; |
| 496 | 512 |
| 497 Vector<unsigned> truncatedHashes; | 513 Vector<unsigned> truncatedHashes; |
| 498 Vector<unsigned> progressiveHashes; | 514 Vector<unsigned> progressiveHashes; |
| 499 | 515 |
| 500 // Compute hashes when the file is truncated. | 516 // Compute hashes when the file is truncated. |
| 501 const size_t increment = 1; | 517 const size_t increment = 1; |
| 502 for (size_t i = 1; i <= fullLength; i += increment) { | 518 for (size_t i = 1; i <= fullLength; i += increment) { |
| 503 decoder = createDecoder(); | 519 decoder = createDecoder(); |
| 504 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), i); | 520 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), i); |
| 505 decoder->setData(data.get(), i == fullLength); | 521 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBuf
ferSegmentReader(data)); |
| 522 decoder->setData(segmentReader.get(), i == fullLength); |
| 506 frame = decoder->frameBufferAtIndex(0); | 523 frame = decoder->frameBufferAtIndex(0); |
| 507 if (!frame) { | 524 if (!frame) { |
| 508 truncatedHashes.append(0); | 525 truncatedHashes.append(0); |
| 509 continue; | 526 continue; |
| 510 } | 527 } |
| 511 truncatedHashes.append(hashBitmap(frame->getSkBitmap())); | 528 truncatedHashes.append(hashBitmap(frame->getSkBitmap())); |
| 512 } | 529 } |
| 513 | 530 |
| 514 // Compute hashes when the file is progressively decoded. | 531 // Compute hashes when the file is progressively decoded. |
| 515 decoder = createDecoder(); | 532 decoder = createDecoder(); |
| 516 for (size_t i = 1; i <= fullLength; i += increment) { | 533 for (size_t i = 1; i <= fullLength; i += increment) { |
| 517 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), i); | 534 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), i); |
| 518 decoder->setData(data.get(), i == fullLength); | 535 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBuf
ferSegmentReader(data)); |
| 536 decoder->setData(segmentReader.get(), i == fullLength); |
| 519 frame = decoder->frameBufferAtIndex(0); | 537 frame = decoder->frameBufferAtIndex(0); |
| 520 if (!frame) { | 538 if (!frame) { |
| 521 progressiveHashes.append(0); | 539 progressiveHashes.append(0); |
| 522 continue; | 540 continue; |
| 523 } | 541 } |
| 524 progressiveHashes.append(hashBitmap(frame->getSkBitmap())); | 542 progressiveHashes.append(hashBitmap(frame->getSkBitmap())); |
| 525 } | 543 } |
| 526 | 544 |
| 527 bool match = true; | 545 bool match = true; |
| 528 for (size_t i = 0; i < truncatedHashes.size(); ++i) { | 546 for (size_t i = 0; i < truncatedHashes.size(); ++i) { |
| 529 if (truncatedHashes[i] != progressiveHashes[i]) { | 547 if (truncatedHashes[i] != progressiveHashes[i]) { |
| 530 match = false; | 548 match = false; |
| 531 break; | 549 break; |
| 532 } | 550 } |
| 533 } | 551 } |
| 534 EXPECT_TRUE(match); | 552 EXPECT_TRUE(match); |
| 535 } | 553 } |
| 536 | 554 |
| 537 TEST(AnimatedWebPTests, frameIsCompleteAndDuration) | 555 TEST(AnimatedWebPTests, frameIsCompleteAndDuration) |
| 538 { | 556 { |
| 539 OwnPtr<ImageDecoder> decoder = createDecoder(); | 557 OwnPtr<ImageDecoder> decoder = createDecoder(); |
| 540 | 558 |
| 541 RefPtr<SharedBuffer> data = readFile("/LayoutTests/fast/images/resources/web
p-animated.webp"); | 559 RefPtr<SharedBuffer> data = readFile("/LayoutTests/fast/images/resources/web
p-animated.webp"); |
| 542 ASSERT_TRUE(data.get()); | 560 ASSERT_TRUE(data.get()); |
| 543 | 561 |
| 544 ASSERT_GE(data->size(), 10u); | 562 ASSERT_GE(data->size(), 10u); |
| 545 RefPtr<SharedBuffer> tempData = SharedBuffer::create(data->data(), data->siz
e() - 10); | 563 RefPtr<SharedBuffer> tempData = SharedBuffer::create(data->data(), data->siz
e() - 10); |
| 546 decoder->setData(tempData.get(), false); | 564 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS
egmentReader(tempData)); |
| 565 decoder->setData(segmentReader.get(), false); |
| 547 | 566 |
| 548 EXPECT_EQ(2u, decoder->frameCount()); | 567 EXPECT_EQ(2u, decoder->frameCount()); |
| 549 EXPECT_FALSE(decoder->failed()); | 568 EXPECT_FALSE(decoder->failed()); |
| 550 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(0)); | 569 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(0)); |
| 551 EXPECT_EQ(1000, decoder->frameDurationAtIndex(0)); | 570 EXPECT_EQ(1000, decoder->frameDurationAtIndex(0)); |
| 552 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(1)); | 571 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(1)); |
| 553 EXPECT_EQ(500, decoder->frameDurationAtIndex(1)); | 572 EXPECT_EQ(500, decoder->frameDurationAtIndex(1)); |
| 554 | 573 |
| 555 decoder->setData(data.get(), true); | 574 segmentReader = adoptRef(new SharedBufferSegmentReader(data)); |
| 575 decoder->setData(segmentReader.get(), true); |
| 556 EXPECT_EQ(3u, decoder->frameCount()); | 576 EXPECT_EQ(3u, decoder->frameCount()); |
| 557 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(0)); | 577 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(0)); |
| 558 EXPECT_EQ(1000, decoder->frameDurationAtIndex(0)); | 578 EXPECT_EQ(1000, decoder->frameDurationAtIndex(0)); |
| 559 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(1)); | 579 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(1)); |
| 560 EXPECT_EQ(500, decoder->frameDurationAtIndex(1)); | 580 EXPECT_EQ(500, decoder->frameDurationAtIndex(1)); |
| 561 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(2)); | 581 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(2)); |
| 562 EXPECT_EQ(1000.0, decoder->frameDurationAtIndex(2)); | 582 EXPECT_EQ(1000.0, decoder->frameDurationAtIndex(2)); |
| 563 } | 583 } |
| 564 | 584 |
| 565 TEST(AnimatedWebPTests, updateRequiredPreviousFrameAfterFirstDecode) | 585 TEST(AnimatedWebPTests, updateRequiredPreviousFrameAfterFirstDecode) |
| 566 { | 586 { |
| 567 OwnPtr<ImageDecoder> decoder = createDecoder(); | 587 OwnPtr<ImageDecoder> decoder = createDecoder(); |
| 568 | 588 |
| 569 RefPtr<SharedBuffer> fullData = readFile("/LayoutTests/fast/images/resources
/webp-animated.webp"); | 589 RefPtr<SharedBuffer> fullData = readFile("/LayoutTests/fast/images/resources
/webp-animated.webp"); |
| 570 ASSERT_TRUE(fullData.get()); | 590 ASSERT_TRUE(fullData.get()); |
| 571 | 591 |
| 572 // Give it data that is enough to parse but not decode in order to check the
status | 592 // Give it data that is enough to parse but not decode in order to check the
status |
| 573 // of requiredPreviousFrameIndex before decoding. | 593 // of requiredPreviousFrameIndex before decoding. |
| 574 size_t partialSize = 1; | 594 size_t partialSize = 1; |
| 575 do { | 595 do { |
| 576 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), parti
alSize); | 596 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), parti
alSize); |
| 577 decoder->setData(data.get(), false); | 597 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBuf
ferSegmentReader(data)); |
| 598 decoder->setData(segmentReader.get(), false); |
| 578 ++partialSize; | 599 ++partialSize; |
| 579 } while (!decoder->frameCount() || decoder->frameBufferAtIndex(0)->status()
== ImageFrame::FrameEmpty); | 600 } while (!decoder->frameCount() || decoder->frameBufferAtIndex(0)->status()
== ImageFrame::FrameEmpty); |
| 580 | 601 |
| 581 EXPECT_EQ(kNotFound, decoder->frameBufferAtIndex(0)->requiredPreviousFrameIn
dex()); | 602 EXPECT_EQ(kNotFound, decoder->frameBufferAtIndex(0)->requiredPreviousFrameIn
dex()); |
| 582 size_t frameCount = decoder->frameCount(); | 603 size_t frameCount = decoder->frameCount(); |
| 583 for (size_t i = 1; i < frameCount; ++i) | 604 for (size_t i = 1; i < frameCount; ++i) |
| 584 EXPECT_EQ(i - 1, decoder->frameBufferAtIndex(i)->requiredPreviousFrameIn
dex()); | 605 EXPECT_EQ(i - 1, decoder->frameBufferAtIndex(i)->requiredPreviousFrameIn
dex()); |
| 585 | 606 |
| 586 decoder->setData(fullData.get(), true); | 607 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS
egmentReader(fullData)); |
| 608 decoder->setData(segmentReader.get(), true); |
| 587 for (size_t i = 0; i < frameCount; ++i) | 609 for (size_t i = 0; i < frameCount; ++i) |
| 588 EXPECT_EQ(kNotFound, decoder->frameBufferAtIndex(i)->requiredPreviousFra
meIndex()); | 610 EXPECT_EQ(kNotFound, decoder->frameBufferAtIndex(i)->requiredPreviousFra
meIndex()); |
| 589 } | 611 } |
| 590 | 612 |
| 591 TEST(AnimatedWebPTests, randomFrameDecode) | 613 TEST(AnimatedWebPTests, randomFrameDecode) |
| 592 { | 614 { |
| 593 testRandomFrameDecode("/LayoutTests/fast/images/resources/webp-animated.webp
"); | 615 testRandomFrameDecode("/LayoutTests/fast/images/resources/webp-animated.webp
"); |
| 594 testRandomFrameDecode("/LayoutTests/fast/images/resources/webp-animated-opaq
ue.webp"); | 616 testRandomFrameDecode("/LayoutTests/fast/images/resources/webp-animated-opaq
ue.webp"); |
| 595 testRandomFrameDecode("/LayoutTests/fast/images/resources/webp-animated-larg
e.webp"); | 617 testRandomFrameDecode("/LayoutTests/fast/images/resources/webp-animated-larg
e.webp"); |
| 596 testRandomFrameDecode("/LayoutTests/fast/images/resources/webp-animated-icc-
xmp.webp"); | 618 testRandomFrameDecode("/LayoutTests/fast/images/resources/webp-animated-icc-
xmp.webp"); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 611 Vector<unsigned> baselineHashes; | 633 Vector<unsigned> baselineHashes; |
| 612 createDecodingBaseline(&createDecoder, fullData.get(), &baselineHashes); | 634 createDecodingBaseline(&createDecoder, fullData.get(), &baselineHashes); |
| 613 size_t frameCount = baselineHashes.size(); | 635 size_t frameCount = baselineHashes.size(); |
| 614 | 636 |
| 615 OwnPtr<ImageDecoder> decoder = createDecoder(); | 637 OwnPtr<ImageDecoder> decoder = createDecoder(); |
| 616 | 638 |
| 617 // Let frame 0 be partially decoded. | 639 // Let frame 0 be partially decoded. |
| 618 size_t partialSize = 1; | 640 size_t partialSize = 1; |
| 619 do { | 641 do { |
| 620 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), parti
alSize); | 642 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), parti
alSize); |
| 621 decoder->setData(data.get(), false); | 643 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBuf
ferSegmentReader(data)); |
| 644 decoder->setData(segmentReader.get(), false); |
| 622 ++partialSize; | 645 ++partialSize; |
| 623 } while (!decoder->frameCount() || decoder->frameBufferAtIndex(0)->status()
== ImageFrame::FrameEmpty); | 646 } while (!decoder->frameCount() || decoder->frameBufferAtIndex(0)->status()
== ImageFrame::FrameEmpty); |
| 624 | 647 |
| 625 // Skip to the last frame and clear. | 648 // Skip to the last frame and clear. |
| 626 decoder->setData(fullData.get(), true); | 649 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS
egmentReader(fullData)); |
| 650 decoder->setData(segmentReader.get(), true); |
| 627 EXPECT_EQ(frameCount, decoder->frameCount()); | 651 EXPECT_EQ(frameCount, decoder->frameCount()); |
| 628 ImageFrame* lastFrame = decoder->frameBufferAtIndex(frameCount - 1); | 652 ImageFrame* lastFrame = decoder->frameBufferAtIndex(frameCount - 1); |
| 629 EXPECT_EQ(baselineHashes[frameCount - 1], hashBitmap(lastFrame->getSkBitmap(
))); | 653 EXPECT_EQ(baselineHashes[frameCount - 1], hashBitmap(lastFrame->getSkBitmap(
))); |
| 630 decoder->clearCacheExceptFrame(kNotFound); | 654 decoder->clearCacheExceptFrame(kNotFound); |
| 631 | 655 |
| 632 // Resume decoding of the first frame. | 656 // Resume decoding of the first frame. |
| 633 ImageFrame* firstFrame = decoder->frameBufferAtIndex(0); | 657 ImageFrame* firstFrame = decoder->frameBufferAtIndex(0); |
| 634 EXPECT_EQ(ImageFrame::FrameComplete, firstFrame->status()); | 658 EXPECT_EQ(ImageFrame::FrameComplete, firstFrame->status()); |
| 635 EXPECT_EQ(baselineHashes[0], hashBitmap(firstFrame->getSkBitmap())); | 659 EXPECT_EQ(baselineHashes[0], hashBitmap(firstFrame->getSkBitmap())); |
| 636 } | 660 } |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 675 { | 699 { |
| 676 testByteByByteSizeAvailable("/LayoutTests/fast/images/resources/webp-color-p
rofile-lossy.webp", 520u, true, cAnimationNone); | 700 testByteByByteSizeAvailable("/LayoutTests/fast/images/resources/webp-color-p
rofile-lossy.webp", 520u, true, cAnimationNone); |
| 677 testByteByByteSizeAvailable("/LayoutTests/fast/images/resources/test.webp",
30u, false, cAnimationNone); | 701 testByteByByteSizeAvailable("/LayoutTests/fast/images/resources/test.webp",
30u, false, cAnimationNone); |
| 678 } | 702 } |
| 679 | 703 |
| 680 TEST(StaticWebPTests, notAnimated) | 704 TEST(StaticWebPTests, notAnimated) |
| 681 { | 705 { |
| 682 OwnPtr<ImageDecoder> decoder = createDecoder(); | 706 OwnPtr<ImageDecoder> decoder = createDecoder(); |
| 683 RefPtr<SharedBuffer> data = readFile("/LayoutTests/fast/images/resources/web
p-color-profile-lossy.webp"); | 707 RefPtr<SharedBuffer> data = readFile("/LayoutTests/fast/images/resources/web
p-color-profile-lossy.webp"); |
| 684 ASSERT_TRUE(data.get()); | 708 ASSERT_TRUE(data.get()); |
| 685 decoder->setData(data.get(), true); | 709 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS
egmentReader(data)); |
| 710 decoder->setData(segmentReader.get(), true); |
| 686 EXPECT_EQ(1u, decoder->frameCount()); | 711 EXPECT_EQ(1u, decoder->frameCount()); |
| 687 EXPECT_EQ(cAnimationNone, decoder->repetitionCount()); | 712 EXPECT_EQ(cAnimationNone, decoder->repetitionCount()); |
| 688 } | 713 } |
| 689 | 714 |
| 690 } // namespace blink | 715 } // namespace blink |
| OLD | NEW |