Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(14)

Side by Side Diff: Source/core/platform/image-decoders/gif/GIFImageDecoderTest.cpp

Issue 15969015: Reland again "Decode GIF image frames on demand". (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: For landing Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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
OLDNEW
« no previous file with comments | « Source/core/platform/image-decoders/gif/GIFImageDecoder.cpp ('k') | Source/core/platform/image-decoders/gif/GIFImageReader.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698