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

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

Issue 1460523002: GIF decoding to Index8, unit tests and misusing unit test as benchmark (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Skia:onGetColorType related implementation. Fix part of Leon's review comments. Created 5 years 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
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 30 matching lines...) Expand all
41 #include "wtf/Vector.h" 41 #include "wtf/Vector.h"
42 42
43 namespace blink { 43 namespace blink {
44 44
45 namespace { 45 namespace {
46 46
47 const char decodersTestingDir[] = "Source/platform/image-decoders/testing"; 47 const char decodersTestingDir[] = "Source/platform/image-decoders/testing";
48 const char layoutTestResourcesDir[] = "LayoutTests/fast/images/resources"; 48 const char layoutTestResourcesDir[] = "LayoutTests/fast/images/resources";
49 const char webTestsDataDir[] = "Source/web/tests/data"; 49 const char webTestsDataDir[] = "Source/web/tests/data";
50 50
51 PassOwnPtr<ImageDecoder> createDecoder() 51 #define LOOP_DECODERS_BEGIN \
52 DecoderCreator decoderCreators[2] = { &createDecoderN32, &createDecoderIndex 8 }; \
53 for (DecoderCreator createDecoder : decoderCreators) {
54
55 #define LOOP_DECODERS_END \
56 }
57
58 PassOwnPtr<ImageDecoder> createDecoderN32()
52 { 59 {
53 return adoptPtr(new GIFImageDecoder(ImageDecoder::AlphaNotPremultiplied, Ima geDecoder::GammaAndColorProfileApplied, ImageDecoder::noDecodedImageByteLimit)); 60 return adoptPtr(new GIFImageDecoder(ImageDecoder::AlphaNotPremultiplied, Ima geDecoder::GammaAndColorProfileApplied, ImageDecoder::noDecodedImageByteLimit, I mageFrame::N32));
61 }
62
63 PassOwnPtr<ImageDecoder> createDecoderIndex8()
64 {
65 return adoptPtr(new GIFImageDecoder(ImageDecoder::AlphaNotPremultiplied, Ima geDecoder::GammaAndColorProfileApplied, ImageDecoder::noDecodedImageByteLimit, I mageFrame::Index8));
66 }
67
68 static bool areFramesColorsEqual(ImageFrame* b1, ImageFrame* b2)
69 {
70 // The same premultiply alpha should be set.
71 if (b1->premultiplyAlpha() != b2->premultiplyAlpha())
72 return false;
73 if (b1->getSkBitmap().width() != b2->getSkBitmap().width()
74 || b1->getSkBitmap().height() != b2->getSkBitmap().height())
75 return false;
76
77 int width = b1->getSkBitmap().width();
78 int height = b1->getSkBitmap().height();
79 for (int j = 0; j < height; ++j) {
80 for (int i = 0; i < width; ++i) {
81 uint32_t c1 = b1->getSkBitmap().getColor(i, j);
82 uint32_t c2 = b2->getSkBitmap().getColor(i, j);
83 if (c1 != c2) {
84 return false;
85 }
86 }
87 }
88 return true;
54 } 89 }
55 90
56 void testRandomFrameDecode(const char* dir, const char* gifFile) 91 void testRandomFrameDecode(const char* dir, const char* gifFile)
57 { 92 {
93 LOOP_DECODERS_BEGIN
58 SCOPED_TRACE(gifFile); 94 SCOPED_TRACE(gifFile);
59 95
60 RefPtr<SharedBuffer> fullData = readFile(dir, gifFile); 96 RefPtr<SharedBuffer> fullData = readFile(dir, gifFile);
61 ASSERT_TRUE(fullData.get()); 97 ASSERT_TRUE(fullData.get());
62 Vector<unsigned> baselineHashes; 98 Vector<unsigned> baselineHashes;
63 createDecodingBaseline(&createDecoder, fullData.get(), &baselineHashes); 99 createDecodingBaseline(createDecoder, fullData.get(), &baselineHashes);
64 size_t frameCount = baselineHashes.size(); 100 size_t frameCount = baselineHashes.size();
65 101
66 // Random decoding should get the same results as sequential decoding. 102 // Random decoding should get the same results as sequential decoding.
67 OwnPtr<ImageDecoder> decoder = createDecoder(); 103 OwnPtr<ImageDecoder> decoder = createDecoder();
68 decoder->setData(fullData.get(), true); 104 decoder->setData(fullData.get(), true);
69 const size_t skippingStep = 5; 105 const size_t skippingStep = 5;
70 for (size_t i = 0; i < skippingStep; ++i) { 106 for (size_t i = 0; i < skippingStep; ++i) {
71 for (size_t j = i; j < frameCount; j += skippingStep) { 107 for (size_t j = i; j < frameCount; j += skippingStep) {
72 SCOPED_TRACE(testing::Message() << "Random i:" << i << " j:" << j); 108 SCOPED_TRACE(testing::Message() << "Random i:" << i << " j:" << j);
73 ImageFrame* frame = decoder->frameBufferAtIndex(j); 109 ImageFrame* frame = decoder->frameBufferAtIndex(j);
74 EXPECT_EQ(baselineHashes[j], hashBitmap(frame->getSkBitmap())); 110 EXPECT_EQ(baselineHashes[j], hashBitmap(frame->getSkBitmap()));
75 } 111 }
76 } 112 }
77 113
78 // Decoding in reverse order. 114 // Decoding in reverse order.
79 decoder = createDecoder(); 115 decoder = createDecoder();
80 decoder->setData(fullData.get(), true); 116 decoder->setData(fullData.get(), true);
81 for (size_t i = frameCount; i; --i) { 117 for (size_t i = frameCount; i; --i) {
82 SCOPED_TRACE(testing::Message() << "Reverse i:" << i); 118 SCOPED_TRACE(testing::Message() << "Reverse i:" << i);
83 ImageFrame* frame = decoder->frameBufferAtIndex(i - 1); 119 ImageFrame* frame = decoder->frameBufferAtIndex(i - 1);
84 EXPECT_EQ(baselineHashes[i - 1], hashBitmap(frame->getSkBitmap())); 120 EXPECT_EQ(baselineHashes[i - 1], hashBitmap(frame->getSkBitmap()));
85 } 121 }
122 LOOP_DECODERS_END
86 } 123 }
87 124
88 void testRandomDecodeAfterClearFrameBufferCache(const char* dir, const char* gif File) 125 void testRandomDecodeAfterClearFrameBufferCache(const char* dir, const char* gif File, ImageFrame::ColorType targetType = ImageFrame::N32)
89 { 126 {
90 SCOPED_TRACE(gifFile); 127 SCOPED_TRACE(gifFile);
91 128
92 RefPtr<SharedBuffer> data = readFile(dir, gifFile); 129 RefPtr<SharedBuffer> data = readFile(dir, gifFile);
93 ASSERT_TRUE(data.get()); 130 ASSERT_TRUE(data.get());
94 Vector<unsigned> baselineHashes; 131 Vector<unsigned> baselineHashes;
95 createDecodingBaseline(&createDecoder, data.get(), &baselineHashes); 132 DecoderCreator decoderCreator = &createDecoderIndex8;
133 if (targetType == ImageFrame::N32) {
134 decoderCreator = &createDecoderN32;
135 }
136 createDecodingBaseline(decoderCreator, data.get(), &baselineHashes);
137
96 size_t frameCount = baselineHashes.size(); 138 size_t frameCount = baselineHashes.size();
97 139
98 OwnPtr<ImageDecoder> decoder = createDecoder(); 140 OwnPtr<ImageDecoder> decoder = decoderCreator();
99 decoder->setData(data.get(), true); 141 decoder->setData(data.get(), true);
100 for (size_t clearExceptFrame = 0; clearExceptFrame < frameCount; ++clearExce ptFrame) { 142 for (size_t clearExceptFrame = 0; clearExceptFrame < frameCount; ++clearExce ptFrame) {
101 decoder->clearCacheExceptFrame(clearExceptFrame); 143 decoder->clearCacheExceptFrame(clearExceptFrame);
102 const size_t skippingStep = 5; 144 const size_t skippingStep = 5;
103 for (size_t i = 0; i < skippingStep; ++i) { 145 for (size_t i = 0; i < skippingStep; ++i) {
104 for (size_t j = 0; j < frameCount; j += skippingStep) { 146 for (size_t j = 0; j < frameCount; j += skippingStep) {
105 SCOPED_TRACE(testing::Message() << "Random i:" << i << " j:" << j); 147 SCOPED_TRACE(testing::Message() << "Random i:" << i << " j:" << j);
148 bool canDecodeToIndex8 = decoder->canDecodeTo(j, ImageFrame::Ind ex8);
106 ImageFrame* frame = decoder->frameBufferAtIndex(j); 149 ImageFrame* frame = decoder->frameBufferAtIndex(j);
107 EXPECT_EQ(baselineHashes[j], hashBitmap(frame->getSkBitmap())); 150 EXPECT_EQ(baselineHashes[j], hashBitmap(frame->getSkBitmap()));
151 EXPECT_EQ(canDecodeToIndex8, frame->getSkBitmap().colorType() == kIndex_8_SkColorType);
108 } 152 }
109 } 153 }
110 } 154 }
155 }
156
157 void testRandomFrameDecodeCompare(const char* dir, const char* gifFile)
158 {
159 SCOPED_TRACE(gifFile);
160
161 RefPtr<SharedBuffer> fullData = readFile(dir, gifFile);
162 ASSERT_TRUE(fullData.get());
163 Vector<unsigned> baselineHashes;
164 createDecodingBaseline(&createDecoderN32, fullData.get(), &baselineHashes);
165 size_t frameCount = baselineHashes.size();
166
167 // Random decoding should get the same results as sequential decoding.
168 OwnPtr<ImageDecoder> decoder = createDecoderN32();
169 // Test Index8 and RGBA through the same scenario.
170 OwnPtr<ImageDecoder> decoderI8 = createDecoderIndex8();
171
172 decoder->setData(fullData.get(), true);
173 decoderI8->setData(fullData.get(), true);
174 const size_t skippingStep = 5;
175 for (size_t i = 0; i < skippingStep; ++i) {
176 for (size_t j = i; j < frameCount; j += skippingStep) {
177 SCOPED_TRACE(testing::Message() << "Random i:" << i << " j:" << j);
178 ImageFrame* frame = decoder->frameBufferAtIndex(j);
179 EXPECT_EQ(baselineHashes[j], hashBitmap(frame->getSkBitmap()));
180 ImageFrame* frameI8 = decoderI8->frameBufferAtIndex(j);
181 ASSERT_TRUE(areFramesColorsEqual(frame, frameI8));
182 }
183 }
184
185 // Decoding in reverse order.
186 decoder = createDecoderN32();
187 decoderI8 = createDecoderIndex8();
188 decoder->setData(fullData.get(), true);
189 decoderI8->setData(fullData.get(), true);
190 for (size_t i = frameCount; i; --i) {
191 SCOPED_TRACE(testing::Message() << "Reverse i:" << i);
192 ImageFrame* frame = decoder->frameBufferAtIndex(i - 1);
193 EXPECT_EQ(baselineHashes[i - 1], hashBitmap(frame->getSkBitmap()));
194 ImageFrame* frameI8 = decoderI8->frameBufferAtIndex(i - 1);
195 ASSERT_TRUE(areFramesColorsEqual(frame, frameI8));
196 }
197 }
198
199 void testRandomDecodeAfterClearFrameBufferCacheCompare(const char* dir, const ch ar* gifFile)
200 {
201 SCOPED_TRACE(gifFile);
202
203 RefPtr<SharedBuffer> data = readFile(dir, gifFile);
204 ASSERT_TRUE(data.get());
205 Vector<unsigned> baselineHashes;
206 createDecodingBaseline(&createDecoderN32, data.get(), &baselineHashes);
207 size_t frameCount = baselineHashes.size();
208
209 OwnPtr<ImageDecoder> decoder = createDecoderN32();
210 // Test Index8 and RGBA through the same scenario and compare pixels.
211 OwnPtr<ImageDecoder> decoderI8 = createDecoderIndex8();
212
213 decoder->setData(data.get(), true);
214 decoderI8->setData(data.get(), true);
215 for (size_t clearExceptFrame = 0; clearExceptFrame < frameCount; ++clearExce ptFrame) {
216 decoder->clearCacheExceptFrame(clearExceptFrame);
217 decoderI8->clearCacheExceptFrame(clearExceptFrame);
218 const size_t skippingStep = 5;
219 for (size_t i = 0; i < skippingStep; ++i) {
220 for (size_t j = 0; j < frameCount; j += (i + 2)) {
221 SCOPED_TRACE(testing::Message() << "Random i:" << i << " j:" << j);
222 ImageFrame* frame = decoder->frameBufferAtIndex(j);
223 EXPECT_EQ(baselineHashes[j], hashBitmap(frame->getSkBitmap()));
224 ImageFrame* frameI8 = decoderI8->frameBufferAtIndex(j);
225 ASSERT_TRUE(areFramesColorsEqual(frame, frameI8));
226 }
227 }
228 }
111 } 229 }
112 230
113 } // anonymous namespace 231 } // anonymous namespace
114 232
115 TEST(GIFImageDecoderTest, decodeTwoFrames) 233 TEST(GIFImageDecoderTest, decodeTwoFrames)
116 { 234 {
117 OwnPtr<ImageDecoder> decoder = createDecoder(); 235 OwnPtr<ImageDecoder> decoder = createDecoderN32();
236 OwnPtr<ImageDecoder> decoderI8 = createDecoderIndex8();
118 237
119 RefPtr<SharedBuffer> data = readFile(layoutTestResourcesDir, "animated.gif") ; 238 RefPtr<SharedBuffer> data = readFile(layoutTestResourcesDir, "animated.gif") ;
120 ASSERT_TRUE(data.get()); 239 ASSERT_TRUE(data.get());
121 decoder->setData(data.get(), true); 240 decoder->setData(data.get(), true);
241 decoderI8->setData(data.get(), true);
122 EXPECT_EQ(cAnimationLoopOnce, decoder->repetitionCount()); 242 EXPECT_EQ(cAnimationLoopOnce, decoder->repetitionCount());
123 243
124 ImageFrame* frame = decoder->frameBufferAtIndex(0); 244 ImageFrame* frame = decoder->frameBufferAtIndex(0);
125 uint32_t generationID0 = frame->getSkBitmap().getGenerationID(); 245 uint32_t generationID0 = frame->getSkBitmap().getGenerationID();
126 EXPECT_EQ(ImageFrame::FrameComplete, frame->status()); 246 EXPECT_EQ(ImageFrame::FrameComplete, frame->status());
127 EXPECT_EQ(16, frame->getSkBitmap().width()); 247 EXPECT_EQ(16, frame->getSkBitmap().width());
128 EXPECT_EQ(16, frame->getSkBitmap().height()); 248 EXPECT_EQ(16, frame->getSkBitmap().height());
129 249
250 ImageFrame* frameI8 = decoderI8->frameBufferAtIndex(0);
251 generationID0 = frameI8->getSkBitmap().getGenerationID();
252 EXPECT_EQ(ImageFrame::FrameComplete, frameI8->status());
253 EXPECT_EQ(16, frameI8->getSkBitmap().width());
254 EXPECT_EQ(16, frameI8->getSkBitmap().height());
255
256 ASSERT_TRUE(areFramesColorsEqual(frame, frameI8));
257
130 frame = decoder->frameBufferAtIndex(1); 258 frame = decoder->frameBufferAtIndex(1);
131 uint32_t generationID1 = frame->getSkBitmap().getGenerationID(); 259 uint32_t generationID1 = frame->getSkBitmap().getGenerationID();
132 EXPECT_EQ(ImageFrame::FrameComplete, frame->status()); 260 EXPECT_EQ(ImageFrame::FrameComplete, frame->status());
133 EXPECT_EQ(16, frame->getSkBitmap().width()); 261 EXPECT_EQ(16, frame->getSkBitmap().width());
134 EXPECT_EQ(16, frame->getSkBitmap().height()); 262 EXPECT_EQ(16, frame->getSkBitmap().height());
135 EXPECT_TRUE(generationID0 != generationID1); 263 EXPECT_TRUE(generationID0 != generationID1);
136 264
137 EXPECT_EQ(2u, decoder->frameCount()); 265 EXPECT_EQ(2u, decoder->frameCount());
138 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount()); 266 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount());
267
268 frameI8 = decoderI8->frameBufferAtIndex(1);
269 ASSERT_TRUE(areFramesColorsEqual(frame, frameI8));
270 EXPECT_EQ(2u, decoderI8->frameCount());
271 EXPECT_EQ(cAnimationLoopInfinite, decoderI8->repetitionCount());
139 } 272 }
140 273
141 TEST(GIFImageDecoderTest, parseAndDecode) 274 TEST(GIFImageDecoderTest, parseAndDecode)
142 { 275 {
276 LOOP_DECODERS_BEGIN
143 OwnPtr<ImageDecoder> decoder = createDecoder(); 277 OwnPtr<ImageDecoder> decoder = createDecoder();
144 278
145 RefPtr<SharedBuffer> data = readFile(layoutTestResourcesDir, "animated.gif") ; 279 RefPtr<SharedBuffer> data = readFile(layoutTestResourcesDir, "animated.gif") ;
146 ASSERT_TRUE(data.get()); 280 ASSERT_TRUE(data.get());
147 decoder->setData(data.get(), true); 281 decoder->setData(data.get(), true);
148 EXPECT_EQ(cAnimationLoopOnce, decoder->repetitionCount()); 282 EXPECT_EQ(cAnimationLoopOnce, decoder->repetitionCount());
149 283
150 // This call will parse the entire file. 284 // This call will parse the entire file.
151 EXPECT_EQ(2u, decoder->frameCount()); 285 EXPECT_EQ(2u, decoder->frameCount());
152 286
153 ImageFrame* frame = decoder->frameBufferAtIndex(0); 287 ImageFrame* frame = decoder->frameBufferAtIndex(0);
154 EXPECT_EQ(ImageFrame::FrameComplete, frame->status()); 288 EXPECT_EQ(ImageFrame::FrameComplete, frame->status());
155 EXPECT_EQ(16, frame->getSkBitmap().width()); 289 EXPECT_EQ(16, frame->getSkBitmap().width());
156 EXPECT_EQ(16, frame->getSkBitmap().height()); 290 EXPECT_EQ(16, frame->getSkBitmap().height());
157 291
158 frame = decoder->frameBufferAtIndex(1); 292 frame = decoder->frameBufferAtIndex(1);
159 EXPECT_EQ(ImageFrame::FrameComplete, frame->status()); 293 EXPECT_EQ(ImageFrame::FrameComplete, frame->status());
160 EXPECT_EQ(16, frame->getSkBitmap().width()); 294 EXPECT_EQ(16, frame->getSkBitmap().width());
161 EXPECT_EQ(16, frame->getSkBitmap().height()); 295 EXPECT_EQ(16, frame->getSkBitmap().height());
162 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount()); 296 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount());
297 LOOP_DECODERS_END
163 } 298 }
164 299
165 TEST(GIFImageDecoderTest, parseByteByByte) 300 TEST(GIFImageDecoderTest, parseByteByByte)
166 { 301 {
167 OwnPtr<ImageDecoder> decoder = createDecoder(); 302 OwnPtr<ImageDecoder> decoder = createDecoderN32();
303 OwnPtr<ImageDecoder> decoderI8 = createDecoderIndex8();
168 304
169 RefPtr<SharedBuffer> data = readFile(layoutTestResourcesDir, "animated.gif") ; 305 RefPtr<SharedBuffer> data = readFile(layoutTestResourcesDir, "animated.gif") ;
170 ASSERT_TRUE(data.get()); 306 ASSERT_TRUE(data.get());
171 307
172 size_t frameCount = 0; 308 size_t frameCount = 0;
173 309
174 // Pass data to decoder byte by byte. 310 // Pass data to decoder byte by byte.
175 for (size_t length = 1; length <= data->size(); ++length) { 311 for (size_t length = 1; length <= data->size(); ++length) {
176 RefPtr<SharedBuffer> tempData = SharedBuffer::create(data->data(), lengt h); 312 RefPtr<SharedBuffer> tempData = SharedBuffer::create(data->data(), lengt h);
177 decoder->setData(tempData.get(), length == data->size()); 313 decoder->setData(tempData.get(), length == data->size());
314 decoderI8->setData(tempData.get(), length == data->size());
178 315
179 EXPECT_LE(frameCount, decoder->frameCount()); 316 EXPECT_LE(frameCount, decoder->frameCount());
317 EXPECT_LE(frameCount, decoderI8->frameCount());
318 EXPECT_EQ(decoder->frameCount(), decoderI8->frameCount());
180 frameCount = decoder->frameCount(); 319 frameCount = decoder->frameCount();
181 } 320 }
182 321
183 EXPECT_EQ(2u, decoder->frameCount()); 322 EXPECT_EQ(2u, decoder->frameCount());
184 323
185 decoder->frameBufferAtIndex(0); 324 decoder->frameBufferAtIndex(0);
186 decoder->frameBufferAtIndex(1); 325 decoder->frameBufferAtIndex(1);
187 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount()); 326 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount());
188 } 327 }
189 328
190 TEST(GIFImageDecoderTest, parseAndDecodeByteByByte) 329 TEST(GIFImageDecoderTest, parseAndDecodeByteByByte)
191 { 330 {
192 OwnPtr<ImageDecoder> decoder = createDecoder(); 331 OwnPtr<ImageDecoder> decoder = createDecoderN32();
332 OwnPtr<ImageDecoder> decoderI8 = createDecoderIndex8();
193 333
194 RefPtr<SharedBuffer> data = readFile(layoutTestResourcesDir, "animated-gif-w ith-offsets.gif"); 334 RefPtr<SharedBuffer> data = readFile(layoutTestResourcesDir, "animated-gif-w ith-offsets.gif");
195 ASSERT_TRUE(data.get()); 335 ASSERT_TRUE(data.get());
196 336
197 size_t frameCount = 0; 337 size_t frameCount = 0;
198 size_t framesDecoded = 0; 338 size_t framesDecoded = 0;
199 339
200 // Pass data to decoder byte by byte. 340 // Pass data to decoder byte by byte.
201 for (size_t length = 1; length <= data->size(); ++length) { 341 for (size_t length = 1; length <= data->size(); ++length) {
202 RefPtr<SharedBuffer> tempData = SharedBuffer::create(data->data(), lengt h); 342 RefPtr<SharedBuffer> tempData = SharedBuffer::create(data->data(), lengt h);
203 decoder->setData(tempData.get(), length == data->size()); 343 decoder->setData(tempData.get(), length == data->size());
344 decoderI8->setData(tempData.get(), length == data->size());
204 345
205 EXPECT_LE(frameCount, decoder->frameCount()); 346 EXPECT_LE(frameCount, decoder->frameCount());
206 frameCount = decoder->frameCount(); 347 frameCount = decoder->frameCount();
348 EXPECT_EQ(frameCount, decoderI8->frameCount());
207 349
208 ImageFrame* frame = decoder->frameBufferAtIndex(frameCount - 1); 350 ImageFrame* frame = decoder->frameBufferAtIndex(frameCount - 1);
209 if (frame && frame->status() == ImageFrame::FrameComplete && framesDecod ed < frameCount) 351 if (frame && frame->status() == ImageFrame::FrameComplete && framesDecod ed < frameCount)
210 ++framesDecoded; 352 ++framesDecoded;
353
354 ImageFrame* frameI8 = decoderI8->frameBufferAtIndex(frameCount - 1);
355 ASSERT_TRUE(!(frame || frameI8) || areFramesColorsEqual(frame, frameI8)) ;
211 } 356 }
212 357
213 EXPECT_EQ(5u, decoder->frameCount()); 358 EXPECT_EQ(5u, decoder->frameCount());
214 EXPECT_EQ(5u, framesDecoded); 359 EXPECT_EQ(5u, framesDecoded);
215 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount()); 360 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount());
216 } 361 }
217 362
218 TEST(GIFImageDecoderTest, brokenSecondFrame) 363 TEST(GIFImageDecoderTest, brokenSecondFrame)
219 { 364 {
365 LOOP_DECODERS_BEGIN
220 OwnPtr<ImageDecoder> decoder = createDecoder(); 366 OwnPtr<ImageDecoder> decoder = createDecoder();
221 367
222 RefPtr<SharedBuffer> data = readFile(webTestsDataDir, "broken.gif"); 368 RefPtr<SharedBuffer> data = readFile(webTestsDataDir, "broken.gif");
223 ASSERT_TRUE(data.get()); 369 ASSERT_TRUE(data.get());
224 decoder->setData(data.get(), true); 370 decoder->setData(data.get(), true);
225 371
226 // One frame is detected but cannot be decoded. 372 // One frame is detected but cannot be decoded.
227 EXPECT_EQ(1u, decoder->frameCount()); 373 EXPECT_EQ(1u, decoder->frameCount());
228 ImageFrame* frame = decoder->frameBufferAtIndex(1); 374 ImageFrame* frame = decoder->frameBufferAtIndex(1);
229 EXPECT_FALSE(frame); 375 EXPECT_FALSE(frame);
376 LOOP_DECODERS_END
230 } 377 }
231 378
232 TEST(GIFImageDecoderTest, progressiveDecode) 379 TEST(GIFImageDecoderTest, progressiveDecode)
233 { 380 {
381 LOOP_DECODERS_BEGIN
234 RefPtr<SharedBuffer> fullData = readFile(webTestsDataDir, "radient.gif"); 382 RefPtr<SharedBuffer> fullData = readFile(webTestsDataDir, "radient.gif");
235 ASSERT_TRUE(fullData.get()); 383 ASSERT_TRUE(fullData.get());
236 const size_t fullLength = fullData->size(); 384 const size_t fullLength = fullData->size();
237 385
238 OwnPtr<ImageDecoder> decoder; 386 OwnPtr<ImageDecoder> decoder;
239 ImageFrame* frame; 387 ImageFrame* frame;
240 388
241 Vector<unsigned> truncatedHashes; 389 Vector<unsigned> truncatedHashes;
242 Vector<unsigned> progressiveHashes; 390 Vector<unsigned> progressiveHashes;
243 391
(...skipping 27 matching lines...) Expand all
271 EXPECT_EQ(cAnimationNone, decoder->repetitionCount()); 419 EXPECT_EQ(cAnimationNone, decoder->repetitionCount());
272 420
273 bool match = true; 421 bool match = true;
274 for (size_t i = 0; i < truncatedHashes.size(); ++i) { 422 for (size_t i = 0; i < truncatedHashes.size(); ++i) {
275 if (truncatedHashes[i] != progressiveHashes[i]) { 423 if (truncatedHashes[i] != progressiveHashes[i]) {
276 match = false; 424 match = false;
277 break; 425 break;
278 } 426 }
279 } 427 }
280 EXPECT_TRUE(match); 428 EXPECT_TRUE(match);
429 LOOP_DECODERS_END
281 } 430 }
282 431
283 TEST(GIFImageDecoderTest, allDataReceivedTruncation) 432 TEST(GIFImageDecoderTest, allDataReceivedTruncation)
284 { 433 {
434 LOOP_DECODERS_BEGIN
285 OwnPtr<ImageDecoder> decoder = createDecoder(); 435 OwnPtr<ImageDecoder> decoder = createDecoder();
286 436
287 RefPtr<SharedBuffer> data = readFile(layoutTestResourcesDir, "animated.gif") ; 437 RefPtr<SharedBuffer> data = readFile(layoutTestResourcesDir, "animated.gif") ;
288 ASSERT_TRUE(data.get()); 438 ASSERT_TRUE(data.get());
289 439
290 ASSERT_GE(data->size(), 10u); 440 ASSERT_GE(data->size(), 10u);
291 RefPtr<SharedBuffer> tempData = SharedBuffer::create(data->data(), data->siz e() - 10); 441 RefPtr<SharedBuffer> tempData = SharedBuffer::create(data->data(), data->siz e() - 10);
292 decoder->setData(tempData.get(), true); 442 decoder->setData(tempData.get(), true);
293 443
294 EXPECT_EQ(2u, decoder->frameCount()); 444 EXPECT_EQ(2u, decoder->frameCount());
295 EXPECT_FALSE(decoder->failed()); 445 EXPECT_FALSE(decoder->failed());
296 446
297 decoder->frameBufferAtIndex(0); 447 decoder->frameBufferAtIndex(0);
298 EXPECT_FALSE(decoder->failed()); 448 EXPECT_FALSE(decoder->failed());
299 decoder->frameBufferAtIndex(1); 449 decoder->frameBufferAtIndex(1);
300 EXPECT_TRUE(decoder->failed()); 450 EXPECT_TRUE(decoder->failed());
451 LOOP_DECODERS_END
301 } 452 }
302 453
303 TEST(GIFImageDecoderTest, frameIsComplete) 454 TEST(GIFImageDecoderTest, frameIsComplete)
304 { 455 {
456 LOOP_DECODERS_BEGIN
305 OwnPtr<ImageDecoder> decoder = createDecoder(); 457 OwnPtr<ImageDecoder> decoder = createDecoder();
306 458
307 RefPtr<SharedBuffer> data = readFile(layoutTestResourcesDir, "animated.gif") ; 459 RefPtr<SharedBuffer> data = readFile(layoutTestResourcesDir, "animated.gif") ;
308 ASSERT_TRUE(data.get()); 460 ASSERT_TRUE(data.get());
309 decoder->setData(data.get(), true); 461 decoder->setData(data.get(), true);
310 462
311 EXPECT_EQ(2u, decoder->frameCount()); 463 EXPECT_EQ(2u, decoder->frameCount());
312 EXPECT_FALSE(decoder->failed()); 464 EXPECT_FALSE(decoder->failed());
313 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(0)); 465 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(0));
314 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(1)); 466 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(1));
315 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount()); 467 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount());
468 LOOP_DECODERS_END
316 } 469 }
317 470
318 TEST(GIFImageDecoderTest, frameIsCompleteLoading) 471 TEST(GIFImageDecoderTest, frameIsCompleteLoading)
319 { 472 {
473 LOOP_DECODERS_BEGIN
320 OwnPtr<ImageDecoder> decoder = createDecoder(); 474 OwnPtr<ImageDecoder> decoder = createDecoder();
321 475
322 RefPtr<SharedBuffer> data = readFile(layoutTestResourcesDir, "animated.gif") ; 476 RefPtr<SharedBuffer> data = readFile(layoutTestResourcesDir, "animated.gif") ;
323 ASSERT_TRUE(data.get()); 477 ASSERT_TRUE(data.get());
324 478
325 ASSERT_GE(data->size(), 10u); 479 ASSERT_GE(data->size(), 10u);
326 RefPtr<SharedBuffer> tempData = SharedBuffer::create(data->data(), data->siz e() - 10); 480 RefPtr<SharedBuffer> tempData = SharedBuffer::create(data->data(), data->siz e() - 10);
327 decoder->setData(tempData.get(), false); 481 decoder->setData(tempData.get(), false);
328 482
329 EXPECT_EQ(2u, decoder->frameCount()); 483 EXPECT_EQ(2u, decoder->frameCount());
330 EXPECT_FALSE(decoder->failed()); 484 EXPECT_FALSE(decoder->failed());
331 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(0)); 485 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(0));
332 EXPECT_FALSE(decoder->frameIsCompleteAtIndex(1)); 486 EXPECT_FALSE(decoder->frameIsCompleteAtIndex(1));
333 487
334 decoder->setData(data.get(), true); 488 decoder->setData(data.get(), true);
335 EXPECT_EQ(2u, decoder->frameCount()); 489 EXPECT_EQ(2u, decoder->frameCount());
336 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(0)); 490 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(0));
337 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(1)); 491 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(1));
492 LOOP_DECODERS_END
338 } 493 }
339 494
340 TEST(GIFImageDecoderTest, badTerminator) 495 TEST(GIFImageDecoderTest, badTerminator)
341 { 496 {
497 LOOP_DECODERS_BEGIN
342 RefPtr<SharedBuffer> referenceData = readFile(webTestsDataDir, "radient.gif" ); 498 RefPtr<SharedBuffer> referenceData = readFile(webTestsDataDir, "radient.gif" );
343 RefPtr<SharedBuffer> testData = readFile(webTestsDataDir, "radient-bad-termi nator.gif"); 499 RefPtr<SharedBuffer> testData = readFile(webTestsDataDir, "radient-bad-termi nator.gif");
344 ASSERT_TRUE(referenceData.get()); 500 ASSERT_TRUE(referenceData.get());
345 ASSERT_TRUE(testData.get()); 501 ASSERT_TRUE(testData.get());
346 502
347 OwnPtr<ImageDecoder> referenceDecoder = createDecoder(); 503 OwnPtr<ImageDecoder> referenceDecoder = createDecoder();
348 referenceDecoder->setData(referenceData.get(), true); 504 referenceDecoder->setData(referenceData.get(), true);
349 EXPECT_EQ(1u, referenceDecoder->frameCount()); 505 EXPECT_EQ(1u, referenceDecoder->frameCount());
350 ImageFrame* referenceFrame = referenceDecoder->frameBufferAtIndex(0); 506 ImageFrame* referenceFrame = referenceDecoder->frameBufferAtIndex(0);
351 ASSERT(referenceFrame); 507 ASSERT(referenceFrame);
352 508
353 OwnPtr<ImageDecoder> testDecoder = createDecoder(); 509 OwnPtr<ImageDecoder> testDecoder = createDecoder();
354 testDecoder->setData(testData.get(), true); 510 testDecoder->setData(testData.get(), true);
355 EXPECT_EQ(1u, testDecoder->frameCount()); 511 EXPECT_EQ(1u, testDecoder->frameCount());
356 ImageFrame* testFrame = testDecoder->frameBufferAtIndex(0); 512 ImageFrame* testFrame = testDecoder->frameBufferAtIndex(0);
357 ASSERT(testFrame); 513 ASSERT(testFrame);
358 514
359 EXPECT_EQ(hashBitmap(referenceFrame->getSkBitmap()), hashBitmap(testFrame->g etSkBitmap())); 515 EXPECT_EQ(hashBitmap(referenceFrame->getSkBitmap()), hashBitmap(testFrame->g etSkBitmap()));
516 LOOP_DECODERS_END
360 } 517 }
361 518
362 TEST(GIFImageDecoderTest, updateRequiredPreviousFrameAfterFirstDecode) 519 TEST(GIFImageDecoderTest, updateRequiredPreviousFrameAfterFirstDecode)
363 { 520 {
521 LOOP_DECODERS_BEGIN
364 OwnPtr<ImageDecoder> decoder = createDecoder(); 522 OwnPtr<ImageDecoder> decoder = createDecoder();
365 523
366 RefPtr<SharedBuffer> fullData = readFile(layoutTestResourcesDir, "animated-1 0color.gif"); 524 RefPtr<SharedBuffer> fullData = readFile(layoutTestResourcesDir, "animated-1 0color.gif");
367 ASSERT_TRUE(fullData.get()); 525 ASSERT_TRUE(fullData.get());
368 526
369 // Give it data that is enough to parse but not decode in order to check the status 527 // Give it data that is enough to parse but not decode in order to check the status
370 // of requiredPreviousFrameIndex before decoding. 528 // of requiredPreviousFrameIndex before decoding.
371 size_t partialSize = 1; 529 size_t partialSize = 1;
372 do { 530 do {
373 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), parti alSize); 531 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), parti alSize);
374 decoder->setData(data.get(), false); 532 decoder->setData(data.get(), false);
375 ++partialSize; 533 ++partialSize;
376 } while (!decoder->frameCount() || decoder->frameBufferAtIndex(0)->status() == ImageFrame::FrameEmpty); 534 } while (!decoder->frameCount() || decoder->frameBufferAtIndex(0)->status() == ImageFrame::FrameEmpty);
377 535
378 EXPECT_EQ(kNotFound, decoder->frameBufferAtIndex(0)->requiredPreviousFrameIn dex()); 536 EXPECT_EQ(kNotFound, decoder->frameBufferAtIndex(0)->requiredPreviousFrameIn dex());
379 unsigned frameCount = decoder->frameCount(); 537 unsigned frameCount = decoder->frameCount();
380 for (size_t i = 1; i < frameCount; ++i) 538 for (size_t i = 1; i < frameCount; ++i)
381 EXPECT_EQ(i - 1, decoder->frameBufferAtIndex(i)->requiredPreviousFrameIn dex()); 539 EXPECT_EQ(i - 1, decoder->frameBufferAtIndex(i)->requiredPreviousFrameIn dex());
382 540
383 decoder->setData(fullData.get(), true); 541 decoder->setData(fullData.get(), true);
384 for (size_t i = 0; i < frameCount; ++i) 542 for (size_t i = 0; i < frameCount; ++i)
385 EXPECT_EQ(kNotFound, decoder->frameBufferAtIndex(i)->requiredPreviousFra meIndex()); 543 EXPECT_EQ(kNotFound, decoder->frameBufferAtIndex(i)->requiredPreviousFra meIndex());
544 LOOP_DECODERS_END
386 } 545 }
387 546
388 TEST(GIFImageDecoderTest, randomFrameDecode) 547 TEST(GIFImageDecoderTest, randomFrameDecode)
389 { 548 {
390 // Single frame image. 549 // Single frame image.
391 testRandomFrameDecode(webTestsDataDir, "radient.gif"); 550 testRandomFrameDecode(webTestsDataDir, "radient.gif");
392 // Multiple frame images. 551 // Multiple frame images.
393 testRandomFrameDecode(layoutTestResourcesDir, "animated-gif-with-offsets.gif "); 552 testRandomFrameDecode(layoutTestResourcesDir, "animated-gif-with-offsets.gif ");
394 testRandomFrameDecode(layoutTestResourcesDir, "animated-10color.gif"); 553 testRandomFrameDecode(layoutTestResourcesDir, "animated-10color.gif");
395 } 554 }
396 555
556 TEST(GIFImageDecoderTest, randomFrameDecodeCompare)
557 {
558 // Single frame image.
559 testRandomFrameDecodeCompare(webTestsDataDir, "radient.gif");
560 // Multiple frame images.
561 testRandomFrameDecodeCompare(layoutTestResourcesDir, "animated-gif-with-offs ets.gif");
562 testRandomFrameDecodeCompare(layoutTestResourcesDir, "animated-10color.gif") ;
563 }
564
397 TEST(GIFImageDecoderTest, randomDecodeAfterClearFrameBufferCache) 565 TEST(GIFImageDecoderTest, randomDecodeAfterClearFrameBufferCache)
398 { 566 {
399 // Single frame image. 567 // Single frame image.
400 testRandomDecodeAfterClearFrameBufferCache(webTestsDataDir, "radient.gif"); 568 testRandomDecodeAfterClearFrameBufferCache(webTestsDataDir, "radient.gif");
401 // Multiple frame images. 569 // Multiple frame images.
402 testRandomDecodeAfterClearFrameBufferCache(layoutTestResourcesDir, "animated -gif-with-offsets.gif"); 570 testRandomDecodeAfterClearFrameBufferCache(layoutTestResourcesDir, "animated -gif-with-offsets.gif");
403 testRandomDecodeAfterClearFrameBufferCache(layoutTestResourcesDir, "animated -10color.gif"); 571 testRandomDecodeAfterClearFrameBufferCache(layoutTestResourcesDir, "animated -10color.gif");
404 } 572 }
405 573
574 TEST(GIFImageDecoderTest, randomDecodeAfterClearFrameBufferCacheCompare)
575 {
576 // Single frame image.
577 testRandomDecodeAfterClearFrameBufferCacheCompare(webTestsDataDir, "radient. gif");
578 // Multiple frame images with offset. All frames depend to frame 0.
579 testRandomDecodeAfterClearFrameBufferCacheCompare(layoutTestResourcesDir, "a nimated-gif-with-offsets.gif");
580 testRandomDecodeAfterClearFrameBufferCacheCompare(layoutTestResourcesDir, "a nimated-10color.gif");
581 }
582
406 TEST(GIFImageDecoderTest, resumePartialDecodeAfterClearFrameBufferCache) 583 TEST(GIFImageDecoderTest, resumePartialDecodeAfterClearFrameBufferCache)
407 { 584 {
408 RefPtr<SharedBuffer> fullData = readFile(layoutTestResourcesDir, "animated-1 0color.gif"); 585 RefPtr<SharedBuffer> fullData = readFile(layoutTestResourcesDir, "animated-1 0color.gif");
409 ASSERT_TRUE(fullData.get()); 586 ASSERT_TRUE(fullData.get());
587
588 LOOP_DECODERS_BEGIN
410 Vector<unsigned> baselineHashes; 589 Vector<unsigned> baselineHashes;
411 createDecodingBaseline(&createDecoder, fullData.get(), &baselineHashes); 590 createDecodingBaseline(createDecoder, fullData.get(), &baselineHashes);
412 size_t frameCount = baselineHashes.size(); 591 size_t frameCount = baselineHashes.size();
413 592
414 OwnPtr<ImageDecoder> decoder = createDecoder(); 593 OwnPtr<ImageDecoder> decoder = createDecoder();
415 594
416 // Let frame 0 be partially decoded. 595 // Let frame 0 be partially decoded.
417 size_t partialSize = 1; 596 size_t partialSize = 1;
418 do { 597 do {
419 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), parti alSize); 598 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), parti alSize);
420 decoder->setData(data.get(), false); 599 decoder->setData(data.get(), false);
421 ++partialSize; 600 ++partialSize;
422 } while (!decoder->frameCount() || decoder->frameBufferAtIndex(0)->status() == ImageFrame::FrameEmpty); 601 } while (!decoder->frameCount() || decoder->frameBufferAtIndex(0)->status() == ImageFrame::FrameEmpty);
423 602
424 // Skip to the last frame and clear. 603 // Skip to the last frame and clear.
425 decoder->setData(fullData.get(), true); 604 decoder->setData(fullData.get(), true);
426 EXPECT_EQ(frameCount, decoder->frameCount()); 605 EXPECT_EQ(frameCount, decoder->frameCount());
427 ImageFrame* lastFrame = decoder->frameBufferAtIndex(frameCount - 1); 606 ImageFrame* lastFrame = decoder->frameBufferAtIndex(frameCount - 1);
428 EXPECT_EQ(baselineHashes[frameCount - 1], hashBitmap(lastFrame->getSkBitmap( ))); 607 EXPECT_EQ(baselineHashes[frameCount - 1], hashBitmap(lastFrame->getSkBitmap( )));
429 decoder->clearCacheExceptFrame(kNotFound); 608 decoder->clearCacheExceptFrame(kNotFound);
430 609
431 // Resume decoding of the first frame. 610 // Resume decoding of the first frame.
432 ImageFrame* firstFrame = decoder->frameBufferAtIndex(0); 611 ImageFrame* firstFrame = decoder->frameBufferAtIndex(0);
433 EXPECT_EQ(ImageFrame::FrameComplete, firstFrame->status()); 612 EXPECT_EQ(ImageFrame::FrameComplete, firstFrame->status());
434 EXPECT_EQ(baselineHashes[0], hashBitmap(firstFrame->getSkBitmap())); 613 EXPECT_EQ(baselineHashes[0], hashBitmap(firstFrame->getSkBitmap()));
614 LOOP_DECODERS_END
435 } 615 }
436 616
437 // The first LZW codes in the image are invalid values that try to create a loop 617 // The first LZW codes in the image are invalid values that try to create a loop
438 // in the dictionary. Decoding should fail, but not infinitely loop or corrupt m emory. 618 // in the dictionary. Decoding should fail, but not infinitely loop or corrupt m emory.
439 TEST(GIFImageDecoderTest, badInitialCode) 619 TEST(GIFImageDecoderTest, badInitialCode)
440 { 620 {
441 RefPtr<SharedBuffer> testData = readFile(decodersTestingDir, "bad-initial-co de.gif"); 621 RefPtr<SharedBuffer> testData = readFile(decodersTestingDir, "bad-initial-co de.gif");
442 ASSERT_TRUE(testData.get()); 622 ASSERT_TRUE(testData.get());
443 623
624 LOOP_DECODERS_BEGIN
444 OwnPtr<ImageDecoder> testDecoder = createDecoder(); 625 OwnPtr<ImageDecoder> testDecoder = createDecoder();
445 testDecoder->setData(testData.get(), true); 626 testDecoder->setData(testData.get(), true);
446 EXPECT_EQ(1u, testDecoder->frameCount()); 627 EXPECT_EQ(1u, testDecoder->frameCount());
447 ASSERT_TRUE(testDecoder->frameBufferAtIndex(0)); 628 ASSERT_TRUE(testDecoder->frameBufferAtIndex(0));
448 EXPECT_TRUE(testDecoder->failed()); 629 EXPECT_TRUE(testDecoder->failed());
630 LOOP_DECODERS_END
449 } 631 }
450 632
451 // The image has an invalid LZW code that exceeds dictionary size. Decoding shou ld fail. 633 // The image has an invalid LZW code that exceeds dictionary size. Decoding shou ld fail.
452 TEST(GIFImageDecoderTest, badCode) 634 TEST(GIFImageDecoderTest, badCode)
453 { 635 {
454 RefPtr<SharedBuffer> testData = readFile(decodersTestingDir, "bad-code.gif") ; 636 RefPtr<SharedBuffer> testData = readFile(decodersTestingDir, "bad-code.gif") ;
455 ASSERT_TRUE(testData.get()); 637 ASSERT_TRUE(testData.get());
456 638
639 LOOP_DECODERS_BEGIN
457 OwnPtr<ImageDecoder> testDecoder = createDecoder(); 640 OwnPtr<ImageDecoder> testDecoder = createDecoder();
458 testDecoder->setData(testData.get(), true); 641 testDecoder->setData(testData.get(), true);
459 EXPECT_EQ(1u, testDecoder->frameCount()); 642 EXPECT_EQ(1u, testDecoder->frameCount());
460 ASSERT_TRUE(testDecoder->frameBufferAtIndex(0)); 643 ASSERT_TRUE(testDecoder->frameBufferAtIndex(0));
461 EXPECT_TRUE(testDecoder->failed()); 644 EXPECT_TRUE(testDecoder->failed());
645 LOOP_DECODERS_END
462 } 646 }
463 647
464 TEST(GIFImageDecoderTest, invalidDisposalMethod) 648 TEST(GIFImageDecoderTest, invalidDisposalMethod)
465 { 649 {
650 LOOP_DECODERS_BEGIN
466 OwnPtr<ImageDecoder> decoder = createDecoder(); 651 OwnPtr<ImageDecoder> decoder = createDecoder();
467 652
468 // The image has 2 frames, with disposal method 4 and 5, respectively. 653 // The image has 2 frames, with disposal method 4 and 5, respectively.
469 RefPtr<SharedBuffer> data = readFile(webTestsDataDir, "invalid-disposal-meth od.gif"); 654 RefPtr<SharedBuffer> data = readFile(webTestsDataDir, "invalid-disposal-meth od.gif");
470 ASSERT_TRUE(data.get()); 655 ASSERT_TRUE(data.get());
471 decoder->setData(data.get(), true); 656 decoder->setData(data.get(), true);
472 657
473 EXPECT_EQ(2u, decoder->frameCount()); 658 EXPECT_EQ(2u, decoder->frameCount());
474 // Disposal method 4 is converted to ImageFrame::DisposeOverwritePrevious. 659 // Disposal method 4 is converted to ImageFrame::DisposeOverwritePrevious.
475 EXPECT_EQ(ImageFrame::DisposeOverwritePrevious, decoder->frameBufferAtIndex( 0)->disposalMethod()); 660 EXPECT_EQ(ImageFrame::DisposeOverwritePrevious, decoder->frameBufferAtIndex( 0)->disposalMethod());
476 // Disposal method 5 is ignored. 661 // Disposal method 5 is ignored.
477 EXPECT_EQ(ImageFrame::DisposeNotSpecified, decoder->frameBufferAtIndex(1)->d isposalMethod()); 662 EXPECT_EQ(ImageFrame::DisposeNotSpecified, decoder->frameBufferAtIndex(1)->d isposalMethod());
663 LOOP_DECODERS_END
478 } 664 }
479 665
480 TEST(GIFImageDecoderTest, firstFrameHasGreaterSizeThanScreenSize) 666 TEST(GIFImageDecoderTest, firstFrameHasGreaterSizeThanScreenSize)
481 { 667 {
482 RefPtr<SharedBuffer> fullData = readFile(decodersTestingDir, "first-frame-ha s-greater-size-than-screen-size.gif"); 668 RefPtr<SharedBuffer> fullData = readFile(decodersTestingDir, "first-frame-ha s-greater-size-than-screen-size.gif");
483 ASSERT_TRUE(fullData.get()); 669 ASSERT_TRUE(fullData.get());
484 670 LOOP_DECODERS_BEGIN
485 OwnPtr<ImageDecoder> decoder; 671 OwnPtr<ImageDecoder> decoder;
486 IntSize frameSize; 672 IntSize frameSize;
487 673
488 // Compute hashes when the file is truncated. 674 // Compute hashes when the file is truncated.
489 for (size_t i = 1; i <= fullData->size(); ++i) { 675 for (size_t i = 1; i <= fullData->size(); ++i) {
490 decoder = createDecoder(); 676 decoder = createDecoder();
491 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), i); 677 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), i);
492 decoder->setData(data.get(), i == fullData->size()); 678 decoder->setData(data.get(), i == fullData->size());
493 679
494 if (decoder->isSizeAvailable() && !frameSize.width() && !frameSize.heigh t()) { 680 if (decoder->isSizeAvailable() && !frameSize.width() && !frameSize.heigh t()) {
495 frameSize = decoder->decodedSize(); 681 frameSize = decoder->decodedSize();
496 continue; 682 continue;
497 } 683 }
498 684
499 ASSERT_EQ(frameSize.width(), decoder->decodedSize().width()); 685 ASSERT_EQ(frameSize.width(), decoder->decodedSize().width());
500 ASSERT_EQ(frameSize.height(), decoder->decodedSize().height()); 686 ASSERT_EQ(frameSize.height(), decoder->decodedSize().height());
501 } 687 }
688 LOOP_DECODERS_END
502 } 689 }
503 690
691 // FIXME following benchmarks need to be removed before submitting.
692 #define BENCHMARK_DECODE(dir, file, title, count)\
693 TEST(GIFImageDecoderTest, tempBench_decodeIndex8##title##warmuprun)\
694 {\
695 testRandomDecodeAfterClearFrameBufferCache(dir, file);\
696 }\
697 TEST(GIFImageDecoderTest, tempBench_decodeN32##title##_x##count) \
698 {\
699 for (int i = 0; i < count; ++i)\
700 testRandomDecodeAfterClearFrameBufferCache(dir, file);\
701 }\
702 \
703 TEST(GIFImageDecoderTest, tempBench_decodeIndex8##title##_x##count)\
704 {\
705 for (int i = 0; i < count; ++i)\
706 testRandomDecodeAfterClearFrameBufferCache(dir, file, ImageFrame::Index8 );\
707 }\
708
709 BENCHMARK_DECODE(layoutTestResourcesDir, "animated-10color.gif", animated_10colo r_gif, 5)
710 BENCHMARK_DECODE(webTestsDataDir, "radient.gif", radient_gif, 10)
711 BENCHMARK_DECODE(layoutTestResourcesDir, "animated-gif-with-offsets.gif", animat ed_gif_with_offsets_gif, 5)
712 BENCHMARK_DECODE(layoutTestResourcesDir, "animated.gif", animated_gif, 10)
713 BENCHMARK_DECODE(layoutTestResourcesDir, "quicksort.gif", quicksort_gif, 5)
714 BENCHMARK_DECODE(layoutTestResourcesDir, "large-gif-checkerboard.gif", large_gif _checkerboard_gif, 5)
715 BENCHMARK_DECODE(layoutTestResourcesDir, "3dolph.gif", 3dolph_gif, 5)
716 // BENCHMARK_DECODE(layoutTestResourcesDir, "disneypixar-disney-pixar-jTXvL4Ljak YI8.gif", disneypixar_disney_pixar_jTXvL4LjakYI8_gif, 1)
504 } // namespace blink 717 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698