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 24 matching lines...) Expand all Loading... | |
35 #include "core/platform/FileSystem.h" | 35 #include "core/platform/FileSystem.h" |
36 #include "core/platform/SharedBuffer.h" | 36 #include "core/platform/SharedBuffer.h" |
37 #include "public/platform/Platform.h" | 37 #include "public/platform/Platform.h" |
38 #include "public/platform/WebData.h" | 38 #include "public/platform/WebData.h" |
39 #include "public/platform/WebSize.h" | 39 #include "public/platform/WebSize.h" |
40 #include "public/platform/WebUnitTestSupport.h" | 40 #include "public/platform/WebUnitTestSupport.h" |
41 #include "wtf/OwnPtr.h" | 41 #include "wtf/OwnPtr.h" |
42 #include "wtf/PassOwnPtr.h" | 42 #include "wtf/PassOwnPtr.h" |
43 #include "wtf/StringHasher.h" | 43 #include "wtf/StringHasher.h" |
44 #include "wtf/Vector.h" | 44 #include "wtf/Vector.h" |
45 | |
46 #include <gtest/gtest.h> | 45 #include <gtest/gtest.h> |
47 | 46 |
48 using namespace WebCore; | 47 using namespace WebCore; |
49 using namespace WebKit; | 48 using namespace WebKit; |
50 | 49 |
51 namespace { | 50 namespace { |
52 | 51 |
53 #if !OS(ANDROID) | 52 #if !OS(ANDROID) |
54 | 53 |
55 static PassRefPtr<SharedBuffer> readFile(const char* fileName) | 54 static PassRefPtr<SharedBuffer> readFile(const char* fileName) |
(...skipping 16 matching lines...) Expand all Loading... | |
72 static PassOwnPtr<GIFImageDecoder> createDecoder() | 71 static PassOwnPtr<GIFImageDecoder> createDecoder() |
73 { | 72 { |
74 return adoptPtr(new GIFImageDecoder(ImageSource::AlphaNotPremultiplied, Imag eSource::GammaAndColorProfileApplied)); | 73 return adoptPtr(new GIFImageDecoder(ImageSource::AlphaNotPremultiplied, Imag eSource::GammaAndColorProfileApplied)); |
75 } | 74 } |
76 | 75 |
77 static unsigned hashSkBitmap(const SkBitmap& bitmap) | 76 static unsigned hashSkBitmap(const SkBitmap& bitmap) |
78 { | 77 { |
79 return StringHasher::hashMemory(bitmap.getPixels(), bitmap.getSize()); | 78 return StringHasher::hashMemory(bitmap.getPixels(), bitmap.getSize()); |
80 } | 79 } |
81 | 80 |
81 static void createDecodingBaseline(SharedBuffer* data, Vector<unsigned>* baselin eHashes) | |
82 { | |
83 OwnPtr<GIFImageDecoder> decoder = createDecoder(); | |
84 decoder->setData(data, true); | |
85 size_t frameCount = decoder->frameCount(); | |
86 for (size_t i = 0; i < frameCount; ++i) { | |
87 ImageFrame* frame = decoder->frameBufferAtIndex(i); | |
88 baselineHashes->append(hashSkBitmap(frame->getSkBitmap())); | |
89 } | |
90 } | |
91 | |
82 TEST(GIFImageDecoderTest, decodeTwoFrames) | 92 TEST(GIFImageDecoderTest, decodeTwoFrames) |
83 { | 93 { |
84 OwnPtr<GIFImageDecoder> decoder(createDecoder()); | 94 OwnPtr<GIFImageDecoder> decoder = createDecoder(); |
85 | 95 |
86 RefPtr<SharedBuffer> data = readFile("/LayoutTests/fast/images/resources/ani mated.gif"); | 96 RefPtr<SharedBuffer> data = readFile("/LayoutTests/fast/images/resources/ani mated.gif"); |
87 ASSERT_TRUE(data.get()); | 97 ASSERT_TRUE(data.get()); |
88 decoder->setData(data.get(), true); | 98 decoder->setData(data.get(), true); |
89 EXPECT_EQ(cAnimationLoopOnce, decoder->repetitionCount()); | 99 EXPECT_EQ(cAnimationLoopOnce, decoder->repetitionCount()); |
90 | 100 |
91 ImageFrame* frame = decoder->frameBufferAtIndex(0); | 101 ImageFrame* frame = decoder->frameBufferAtIndex(0); |
92 EXPECT_EQ(ImageFrame::FrameComplete, frame->status()); | 102 EXPECT_EQ(ImageFrame::FrameComplete, frame->status()); |
93 EXPECT_EQ(16, frame->getSkBitmap().width()); | 103 EXPECT_EQ(16, frame->getSkBitmap().width()); |
94 EXPECT_EQ(16, frame->getSkBitmap().height()); | 104 EXPECT_EQ(16, frame->getSkBitmap().height()); |
95 | 105 |
96 frame = decoder->frameBufferAtIndex(1); | 106 frame = decoder->frameBufferAtIndex(1); |
97 EXPECT_EQ(ImageFrame::FrameComplete, frame->status()); | 107 EXPECT_EQ(ImageFrame::FrameComplete, frame->status()); |
98 EXPECT_EQ(16, frame->getSkBitmap().width()); | 108 EXPECT_EQ(16, frame->getSkBitmap().width()); |
99 EXPECT_EQ(16, frame->getSkBitmap().height()); | 109 EXPECT_EQ(16, frame->getSkBitmap().height()); |
100 | 110 |
101 EXPECT_EQ(2u, decoder->frameCount()); | 111 EXPECT_EQ(2u, decoder->frameCount()); |
102 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount()); | 112 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount()); |
103 } | 113 } |
104 | 114 |
105 TEST(GIFImageDecoderTest, parseAndDecode) | 115 TEST(GIFImageDecoderTest, parseAndDecode) |
106 { | 116 { |
107 OwnPtr<GIFImageDecoder> decoder(createDecoder()); | 117 OwnPtr<GIFImageDecoder> decoder = createDecoder(); |
108 | 118 |
109 RefPtr<SharedBuffer> data = readFile("/LayoutTests/fast/images/resources/ani mated.gif"); | 119 RefPtr<SharedBuffer> data = readFile("/LayoutTests/fast/images/resources/ani mated.gif"); |
110 ASSERT_TRUE(data.get()); | 120 ASSERT_TRUE(data.get()); |
111 decoder->setData(data.get(), true); | 121 decoder->setData(data.get(), true); |
112 EXPECT_EQ(cAnimationLoopOnce, decoder->repetitionCount()); | 122 EXPECT_EQ(cAnimationLoopOnce, decoder->repetitionCount()); |
113 | 123 |
114 // This call will parse the entire file. | 124 // This call will parse the entire file. |
115 EXPECT_EQ(2u, decoder->frameCount()); | 125 EXPECT_EQ(2u, decoder->frameCount()); |
116 | 126 |
117 ImageFrame* frame = decoder->frameBufferAtIndex(0); | 127 ImageFrame* frame = decoder->frameBufferAtIndex(0); |
118 EXPECT_EQ(ImageFrame::FrameComplete, frame->status()); | 128 EXPECT_EQ(ImageFrame::FrameComplete, frame->status()); |
119 EXPECT_EQ(16, frame->getSkBitmap().width()); | 129 EXPECT_EQ(16, frame->getSkBitmap().width()); |
120 EXPECT_EQ(16, frame->getSkBitmap().height()); | 130 EXPECT_EQ(16, frame->getSkBitmap().height()); |
121 | 131 |
122 frame = decoder->frameBufferAtIndex(1); | 132 frame = decoder->frameBufferAtIndex(1); |
123 EXPECT_EQ(ImageFrame::FrameComplete, frame->status()); | 133 EXPECT_EQ(ImageFrame::FrameComplete, frame->status()); |
124 EXPECT_EQ(16, frame->getSkBitmap().width()); | 134 EXPECT_EQ(16, frame->getSkBitmap().width()); |
125 EXPECT_EQ(16, frame->getSkBitmap().height()); | 135 EXPECT_EQ(16, frame->getSkBitmap().height()); |
126 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount()); | 136 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount()); |
127 } | 137 } |
128 | 138 |
129 TEST(GIFImageDecoderTest, parseByteByByte) | 139 TEST(GIFImageDecoderTest, parseByteByByte) |
130 { | 140 { |
131 OwnPtr<GIFImageDecoder> decoder(createDecoder()); | 141 OwnPtr<GIFImageDecoder> decoder = createDecoder(); |
132 | 142 |
133 RefPtr<SharedBuffer> data = readFile("/LayoutTests/fast/images/resources/ani mated.gif"); | 143 RefPtr<SharedBuffer> data = readFile("/LayoutTests/fast/images/resources/ani mated.gif"); |
134 ASSERT_TRUE(data.get()); | 144 ASSERT_TRUE(data.get()); |
135 | 145 |
136 size_t frameCount = 0; | 146 size_t frameCount = 0; |
137 | 147 |
138 // Pass data to decoder byte by byte. | 148 // Pass data to decoder byte by byte. |
139 for (unsigned length = 1; length <= data->size(); ++length) { | 149 for (size_t length = 1; length <= data->size(); ++length) { |
140 RefPtr<SharedBuffer> tempData = SharedBuffer::create(data->data(), lengt h); | 150 RefPtr<SharedBuffer> tempData = SharedBuffer::create(data->data(), lengt h); |
141 decoder->setData(tempData.get(), length == data->size()); | 151 decoder->setData(tempData.get(), length == data->size()); |
142 | 152 |
143 EXPECT_LE(frameCount, decoder->frameCount()); | 153 EXPECT_LE(frameCount, decoder->frameCount()); |
144 frameCount = decoder->frameCount(); | 154 frameCount = decoder->frameCount(); |
145 } | 155 } |
146 | 156 |
147 EXPECT_EQ(2u, decoder->frameCount()); | 157 EXPECT_EQ(2u, decoder->frameCount()); |
148 | 158 |
149 decoder->frameBufferAtIndex(0); | 159 decoder->frameBufferAtIndex(0); |
150 decoder->frameBufferAtIndex(1); | 160 decoder->frameBufferAtIndex(1); |
151 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount()); | 161 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount()); |
152 } | 162 } |
153 | 163 |
154 TEST(GIFImageDecoderTest, parseAndDecodeByteByByte) | 164 TEST(GIFImageDecoderTest, parseAndDecodeByteByByte) |
155 { | 165 { |
156 OwnPtr<GIFImageDecoder> decoder(createDecoder()); | 166 OwnPtr<GIFImageDecoder> decoder = createDecoder(); |
157 | 167 |
158 RefPtr<SharedBuffer> data = readFile("/LayoutTests/fast/images/resources/ani mated-gif-with-offsets.gif"); | 168 RefPtr<SharedBuffer> data = readFile("/LayoutTests/fast/images/resources/ani mated-gif-with-offsets.gif"); |
159 ASSERT_TRUE(data.get()); | 169 ASSERT_TRUE(data.get()); |
160 | 170 |
161 size_t frameCount = 0; | 171 size_t frameCount = 0; |
162 size_t framesDecoded = 0; | 172 size_t framesDecoded = 0; |
163 | 173 |
164 // Pass data to decoder byte by byte. | 174 // Pass data to decoder byte by byte. |
165 for (unsigned length = 1; length <= data->size(); ++length) { | 175 for (size_t length = 1; length <= data->size(); ++length) { |
166 RefPtr<SharedBuffer> tempData = SharedBuffer::create(data->data(), lengt h); | 176 RefPtr<SharedBuffer> tempData = SharedBuffer::create(data->data(), lengt h); |
167 decoder->setData(tempData.get(), length == data->size()); | 177 decoder->setData(tempData.get(), length == data->size()); |
168 | 178 |
169 EXPECT_LE(frameCount, decoder->frameCount()); | 179 EXPECT_LE(frameCount, decoder->frameCount()); |
170 frameCount = decoder->frameCount(); | 180 frameCount = decoder->frameCount(); |
171 | 181 |
172 ImageFrame* frame = decoder->frameBufferAtIndex(frameCount - 1); | 182 ImageFrame* frame = decoder->frameBufferAtIndex(frameCount - 1); |
173 if (frame && frame->status() == ImageFrame::FrameComplete && framesDecod ed < frameCount) | 183 if (frame && frame->status() == ImageFrame::FrameComplete && framesDecod ed < frameCount) |
174 ++framesDecoded; | 184 ++framesDecoded; |
175 } | 185 } |
176 | 186 |
177 EXPECT_EQ(5u, decoder->frameCount()); | 187 EXPECT_EQ(5u, decoder->frameCount()); |
178 EXPECT_EQ(5u, framesDecoded); | 188 EXPECT_EQ(5u, framesDecoded); |
179 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount()); | 189 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount()); |
180 } | 190 } |
181 | 191 |
182 TEST(GIFImageDecoderTest, brokenSecondFrame) | 192 TEST(GIFImageDecoderTest, brokenSecondFrame) |
183 { | 193 { |
184 OwnPtr<GIFImageDecoder> decoder(createDecoder()); | 194 OwnPtr<GIFImageDecoder> decoder = createDecoder(); |
185 | 195 |
186 RefPtr<SharedBuffer> data = readFile("/Source/WebKit/chromium/tests/data/bro ken.gif"); | 196 RefPtr<SharedBuffer> data = readFile("/Source/WebKit/chromium/tests/data/bro ken.gif"); |
187 ASSERT_TRUE(data.get()); | 197 ASSERT_TRUE(data.get()); |
188 decoder->setData(data.get(), true); | 198 decoder->setData(data.get(), true); |
189 | 199 |
190 // One frame is detected but cannot be decoded. | 200 // One frame is detected but cannot be decoded. |
191 EXPECT_EQ(1u, decoder->frameCount()); | 201 EXPECT_EQ(1u, decoder->frameCount()); |
192 ImageFrame* frame = decoder->frameBufferAtIndex(1); | 202 ImageFrame* frame = decoder->frameBufferAtIndex(1); |
193 EXPECT_FALSE(frame); | 203 EXPECT_FALSE(frame); |
194 } | 204 } |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
237 if (truncatedHashes[i] != progressiveHashes[i]) { | 247 if (truncatedHashes[i] != progressiveHashes[i]) { |
238 match = false; | 248 match = false; |
239 break; | 249 break; |
240 } | 250 } |
241 } | 251 } |
242 EXPECT_TRUE(match); | 252 EXPECT_TRUE(match); |
243 } | 253 } |
244 | 254 |
245 TEST(GIFImageDecoderTest, allDataReceivedTruncation) | 255 TEST(GIFImageDecoderTest, allDataReceivedTruncation) |
246 { | 256 { |
247 OwnPtr<GIFImageDecoder> decoder(createDecoder()); | 257 OwnPtr<GIFImageDecoder> decoder = createDecoder(); |
248 | 258 |
249 RefPtr<SharedBuffer> data = readFile("/LayoutTests/fast/images/resources/ani mated.gif"); | 259 RefPtr<SharedBuffer> data = readFile("/LayoutTests/fast/images/resources/ani mated.gif"); |
250 ASSERT_TRUE(data.get()); | 260 ASSERT_TRUE(data.get()); |
251 | 261 |
252 ASSERT_GE(data->size(), 10u); | 262 ASSERT_GE(data->size(), 10u); |
253 RefPtr<SharedBuffer> tempData = SharedBuffer::create(data->data(), data->siz e() - 10); | 263 RefPtr<SharedBuffer> tempData = SharedBuffer::create(data->data(), data->siz e() - 10); |
254 decoder->setData(tempData.get(), true); | 264 decoder->setData(tempData.get(), true); |
255 | 265 |
256 EXPECT_EQ(2u, decoder->frameCount()); | 266 EXPECT_EQ(2u, decoder->frameCount()); |
257 EXPECT_FALSE(decoder->failed()); | 267 EXPECT_FALSE(decoder->failed()); |
258 | 268 |
259 decoder->frameBufferAtIndex(0); | 269 decoder->frameBufferAtIndex(0); |
260 EXPECT_FALSE(decoder->failed()); | 270 EXPECT_FALSE(decoder->failed()); |
261 decoder->frameBufferAtIndex(1); | 271 decoder->frameBufferAtIndex(1); |
262 EXPECT_TRUE(decoder->failed()); | 272 EXPECT_TRUE(decoder->failed()); |
263 } | 273 } |
264 | 274 |
265 TEST(GIFImageDecoderTest, frameIsComplete) | 275 TEST(GIFImageDecoderTest, frameIsComplete) |
266 { | 276 { |
267 OwnPtr<GIFImageDecoder> decoder(createDecoder()); | 277 OwnPtr<GIFImageDecoder> decoder = createDecoder(); |
268 | 278 |
269 RefPtr<SharedBuffer> data = readFile("/LayoutTests/fast/images/resources/ani mated.gif"); | 279 RefPtr<SharedBuffer> data = readFile("/LayoutTests/fast/images/resources/ani mated.gif"); |
270 ASSERT_TRUE(data.get()); | 280 ASSERT_TRUE(data.get()); |
271 decoder->setData(data.get(), true); | 281 decoder->setData(data.get(), true); |
272 | 282 |
273 EXPECT_EQ(2u, decoder->frameCount()); | 283 EXPECT_EQ(2u, decoder->frameCount()); |
274 EXPECT_FALSE(decoder->failed()); | 284 EXPECT_FALSE(decoder->failed()); |
275 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(0)); | 285 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(0)); |
276 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(1)); | 286 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(1)); |
277 } | 287 } |
278 | 288 |
279 TEST(GIFImageDecoderTest, frameIsCompleteLoading) | 289 TEST(GIFImageDecoderTest, frameIsCompleteLoading) |
280 { | 290 { |
281 OwnPtr<GIFImageDecoder> decoder(createDecoder()); | 291 OwnPtr<GIFImageDecoder> decoder = createDecoder(); |
282 | 292 |
283 RefPtr<SharedBuffer> data = readFile("/LayoutTests/fast/images/resources/ani mated.gif"); | 293 RefPtr<SharedBuffer> data = readFile("/LayoutTests/fast/images/resources/ani mated.gif"); |
284 ASSERT_TRUE(data.get()); | 294 ASSERT_TRUE(data.get()); |
285 | 295 |
286 ASSERT_GE(data->size(), 10u); | 296 ASSERT_GE(data->size(), 10u); |
287 RefPtr<SharedBuffer> tempData = SharedBuffer::create(data->data(), data->siz e() - 10); | 297 RefPtr<SharedBuffer> tempData = SharedBuffer::create(data->data(), data->siz e() - 10); |
288 decoder->setData(tempData.get(), false); | 298 decoder->setData(tempData.get(), false); |
289 | 299 |
290 EXPECT_EQ(2u, decoder->frameCount()); | 300 EXPECT_EQ(2u, decoder->frameCount()); |
291 EXPECT_FALSE(decoder->failed()); | 301 EXPECT_FALSE(decoder->failed()); |
(...skipping 21 matching lines...) Expand all Loading... | |
313 | 323 |
314 OwnPtr<GIFImageDecoder> testDecoder(createDecoder()); | 324 OwnPtr<GIFImageDecoder> testDecoder(createDecoder()); |
315 testDecoder->setData(testData.get(), true); | 325 testDecoder->setData(testData.get(), true); |
316 EXPECT_EQ(1u, testDecoder->frameCount()); | 326 EXPECT_EQ(1u, testDecoder->frameCount()); |
317 ImageFrame* testFrame = testDecoder->frameBufferAtIndex(0); | 327 ImageFrame* testFrame = testDecoder->frameBufferAtIndex(0); |
318 ASSERT(testFrame); | 328 ASSERT(testFrame); |
319 | 329 |
320 EXPECT_EQ(hashSkBitmap(referenceFrame->getSkBitmap()), hashSkBitmap(testFram e->getSkBitmap())); | 330 EXPECT_EQ(hashSkBitmap(referenceFrame->getSkBitmap()), hashSkBitmap(testFram e->getSkBitmap())); |
321 } | 331 } |
322 | 332 |
333 TEST(GIFImageDecoderTest, updateRequiredPreviousFrameAfterFirstDecode) | |
334 { | |
335 OwnPtr<GIFImageDecoder> decoder = createDecoder(); | |
336 | |
337 RefPtr<SharedBuffer> fullData = readFile("/LayoutTests/fast/images/resources /animated-10color.gif"); | |
338 ASSERT_TRUE(fullData.get()); | |
339 | |
340 // Give it data that is enough to parse but not decode in order to check the status | |
341 // of requiredPreviousFrameIndex before decoding. | |
342 size_t partialSize = 1; | |
343 do { | |
344 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), parti alSize); | |
345 decoder->setData(data.get(), false); | |
346 ++partialSize; | |
347 } while (!decoder->frameCount() || decoder->frameBufferAtIndex(0)->status() == ImageFrame::FrameEmpty); | |
348 | |
349 EXPECT_EQ(notFound, decoder->frameBufferAtIndex(0)->requiredPreviousFrameInd ex()); | |
350 unsigned frameCount = decoder->frameCount(); | |
351 for (size_t i = 1; i < frameCount; ++i) | |
352 EXPECT_EQ(i - 1, decoder->frameBufferAtIndex(i)->requiredPreviousFrameIn dex()); | |
353 | |
354 decoder->setData(fullData.get(), true); | |
355 for (size_t i = 0; i < frameCount; ++i) | |
356 EXPECT_EQ(notFound, decoder->frameBufferAtIndex(i)->requiredPreviousFram eIndex()); | |
357 } | |
358 | |
359 void testRandomFrameDecode(const char* gifFile) | |
360 { | |
361 SCOPED_TRACE(gifFile); | |
362 | |
363 RefPtr<SharedBuffer> fullData = readFile(gifFile); | |
364 ASSERT_TRUE(fullData.get()); | |
365 Vector<unsigned> baselineHashes; | |
366 createDecodingBaseline(fullData.get(), &baselineHashes); | |
367 size_t frameCount = baselineHashes.size(); | |
368 | |
369 // Random decoding should get the same results as sequential decoding. | |
370 OwnPtr<GIFImageDecoder> decoder = createDecoder(); | |
371 decoder->setData(fullData.get(), true); | |
372 const size_t skippingStep = 5; | |
373 for (size_t i = 0; i < skippingStep; ++i) { | |
374 for (size_t j = i; j < frameCount; j += skippingStep) { | |
375 SCOPED_TRACE(testing::Message() << "Random i:" << i << " j:" << j); | |
376 ImageFrame* frame = decoder->frameBufferAtIndex(j); | |
377 EXPECT_EQ(baselineHashes[j], hashSkBitmap(frame->getSkBitmap())); | |
378 } | |
379 } | |
380 | |
381 // Decoding in reverse order. | |
382 decoder = createDecoder(); | |
383 decoder->setData(fullData.get(), true); | |
384 for (size_t i = frameCount; i; --i) { | |
385 SCOPED_TRACE(testing::Message() << "Reverse i:" << i); | |
386 ImageFrame* frame = decoder->frameBufferAtIndex(i - 1); | |
387 EXPECT_EQ(baselineHashes[i - 1], hashSkBitmap(frame->getSkBitmap())); | |
388 } | |
389 } | |
390 | |
391 TEST(GIFImageDecoderTest, randomFrameDecode) | |
392 { | |
393 // Single frame image. | |
394 testRandomFrameDecode("/Source/WebKit/chromium/tests/data/radient.gif"); | |
395 // Multiple frame image. | |
396 testRandomFrameDecode("/LayoutTests/fast/images/resources/animated-gif-with- offsets.gif"); | |
397 testRandomFrameDecode("/LayoutTests/fast/images/resources/animated-10color.g if"); | |
398 } | |
399 | |
400 void testRandomDecodeAfterClearFrameBufferCache(const char* gifFile) | |
401 { | |
402 SCOPED_TRACE(gifFile); | |
403 | |
404 RefPtr<SharedBuffer> data = readFile(gifFile); | |
405 ASSERT_TRUE(data.get()); | |
406 Vector<unsigned> baselineHashes; | |
407 createDecodingBaseline(data.get(), &baselineHashes); | |
408 size_t frameCount = baselineHashes.size(); | |
409 | |
410 OwnPtr<GIFImageDecoder> decoder = createDecoder(); | |
urvang (Google)
2013/06/06 18:33:51
Need to do "decoder->setData()" after this.
| |
411 for (size_t clearExceptFrame = 0; clearExceptFrame < frameCount; ++clearExce ptFrame) { | |
412 decoder->clearCacheExceptFrame(clearExceptFrame); | |
413 const size_t skippingStep = 5; | |
414 for (size_t i = 0; i < skippingStep; ++i) { | |
415 for (size_t j = 0; j < frameCount; j += skippingStep) { | |
416 SCOPED_TRACE(testing::Message() << "Random i:" << i << " j:" << j); | |
417 ImageFrame* frame = decoder->frameBufferAtIndex(j); | |
418 EXPECT_EQ(baselineHashes[j], hashSkBitmap(frame->getSkBitmap())) ; | |
419 } | |
420 } | |
421 } | |
422 } | |
423 | |
424 TEST(GIFImageDecoderTest, randomDecodeAfterClearFrameBufferCache) | |
425 { | |
426 // Single frame image. | |
427 testRandomFrameDecode("/Source/WebKit/chromium/tests/data/radient.gif"); | |
urvang (Google)
2013/06/06 18:33:51
All these calls should be "testRandomDecodeAfterCl
| |
428 // Multiple frame image. | |
429 testRandomFrameDecode("/LayoutTests/fast/images/resources/animated-gif-with- offsets.gif"); | |
430 testRandomFrameDecode("/LayoutTests/fast/images/resources/animated-10color.g if"); | |
431 } | |
432 | |
433 TEST(GIFImageDecoderTest, resumePartialDecodeAfterClearFrameBufferCache) | |
434 { | |
435 RefPtr<SharedBuffer> fullData = readFile("/LayoutTests/fast/images/resources /animated-10color.gif"); | |
436 ASSERT_TRUE(fullData.get()); | |
437 Vector<unsigned> baselineHashes; | |
438 createDecodingBaseline(fullData.get(), &baselineHashes); | |
439 size_t frameCount = baselineHashes.size(); | |
440 | |
441 OwnPtr<GIFImageDecoder> decoder = createDecoder(); | |
442 | |
443 // Let frame 0 be partially decoded. | |
444 size_t partialSize = 1; | |
445 do { | |
446 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), parti alSize); | |
447 decoder->setData(data.get(), false); | |
448 ++partialSize; | |
449 } while (!decoder->frameCount() || decoder->frameBufferAtIndex(0)->status() == ImageFrame::FrameEmpty); | |
450 | |
451 // Skip to the last frame and clear. | |
452 decoder->setData(fullData.get(), true); | |
453 EXPECT_EQ(frameCount, decoder->frameCount()); | |
454 ImageFrame* lastFrame = decoder->frameBufferAtIndex(frameCount - 1); | |
455 EXPECT_EQ(baselineHashes[frameCount - 1], hashSkBitmap(lastFrame->getSkBitma p())); | |
456 decoder->clearCacheExceptFrame(notFound); | |
457 | |
458 // Resume decoding of the first frame. | |
459 ImageFrame* firstFrame = decoder->frameBufferAtIndex(0); | |
460 EXPECT_EQ(ImageFrame::FrameComplete, firstFrame->status()); | |
461 EXPECT_EQ(baselineHashes[0], hashSkBitmap(firstFrame->getSkBitmap())); | |
462 } | |
463 | |
323 #endif | 464 #endif |
324 | 465 |
325 } // namespace | 466 } // namespace |
OLD | NEW |