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

Side by Side Diff: Source/core/platform/graphics/chromium/ImageFrameGeneratorTest.cpp

Issue 19838002: Reland change to enable deferred image decoding for animated GIFs (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: merved Created 7 years, 5 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) 2012 Google Inc. All rights reserved. 2 * Copyright (C) 2012 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 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 7 *
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. 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 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
88 virtual void frameBufferRequested() 88 virtual void frameBufferRequested()
89 { 89 {
90 ++m_frameBufferRequestCount; 90 ++m_frameBufferRequestCount;
91 } 91 }
92 92
93 virtual ImageFrame::FrameStatus frameStatus() 93 virtual ImageFrame::FrameStatus frameStatus()
94 { 94 {
95 return m_frameStatus; 95 return m_frameStatus;
96 } 96 }
97 97
98 virtual size_t frameCount() { return 1; }
99 virtual int repetitionCount() const { return cAnimationNone; }
100 virtual float frameDuration() const { return 0; }
101
98 protected: 102 protected:
99 PassOwnPtr<ScaledImageFragment> createCompleteImage(const SkISize& size) 103 PassOwnPtr<ScaledImageFragment> createCompleteImage(const SkISize& size)
100 { 104 {
101 SkBitmap bitmap; 105 SkBitmap bitmap;
102 bitmap.setConfig(SkBitmap::kARGB_8888_Config, size.width(), size.height( )); 106 bitmap.setConfig(SkBitmap::kARGB_8888_Config, size.width(), size.height( ));
103 bitmap.allocPixels(); 107 bitmap.allocPixels();
104 return ScaledImageFragment::createComplete(size, 0, bitmap); 108 return ScaledImageFragment::createComplete(size, 0, bitmap);
105 } 109 }
106 110
107 void addNewData() 111 void addNewData()
(...skipping 22 matching lines...) Expand all
130 TEST_F(ImageFrameGeneratorTest, cacheHit) 134 TEST_F(ImageFrameGeneratorTest, cacheHit)
131 { 135 {
132 const ScaledImageFragment* fullImage = ImageDecodingStore::instance()->inser tAndLockCache( 136 const ScaledImageFragment* fullImage = ImageDecodingStore::instance()->inser tAndLockCache(
133 m_generator.get(), createCompleteImage(fullSize())); 137 m_generator.get(), createCompleteImage(fullSize()));
134 EXPECT_EQ(fullSize(), fullImage->scaledSize()); 138 EXPECT_EQ(fullSize(), fullImage->scaledSize());
135 ImageDecodingStore::instance()->unlockCache(m_generator.get(), fullImage); 139 ImageDecodingStore::instance()->unlockCache(m_generator.get(), fullImage);
136 140
137 const ScaledImageFragment* tempImage = m_generator->decodeAndScale(fullSize( )); 141 const ScaledImageFragment* tempImage = m_generator->decodeAndScale(fullSize( ));
138 EXPECT_EQ(fullImage, tempImage); 142 EXPECT_EQ(fullImage, tempImage);
139 EXPECT_EQ(fullSize(), tempImage->scaledSize()); 143 EXPECT_EQ(fullSize(), tempImage->scaledSize());
140 EXPECT_TRUE(m_generator->hasAlpha()); 144 EXPECT_TRUE(m_generator->hasAlpha(0));
141 ImageDecodingStore::instance()->unlockCache(m_generator.get(), tempImage); 145 ImageDecodingStore::instance()->unlockCache(m_generator.get(), tempImage);
142 EXPECT_EQ(0, m_frameBufferRequestCount); 146 EXPECT_EQ(0, m_frameBufferRequestCount);
143 } 147 }
144 148
145 TEST_F(ImageFrameGeneratorTest, cacheMissWithScale) 149 TEST_F(ImageFrameGeneratorTest, cacheMissWithScale)
146 { 150 {
147 const ScaledImageFragment* fullImage = ImageDecodingStore::instance()->inser tAndLockCache( 151 const ScaledImageFragment* fullImage = ImageDecodingStore::instance()->inser tAndLockCache(
148 m_generator.get(), createCompleteImage(fullSize())); 152 m_generator.get(), createCompleteImage(fullSize()));
149 EXPECT_EQ(fullSize(), fullImage->scaledSize()); 153 EXPECT_EQ(fullSize(), fullImage->scaledSize());
150 ImageDecodingStore::instance()->unlockCache(m_generator.get(), fullImage); 154 ImageDecodingStore::instance()->unlockCache(m_generator.get(), fullImage);
151 155
152 // Cache miss because of scaled size not found. 156 // Cache miss because of scaled size not found.
153 const ScaledImageFragment* scaledImage = m_generator->decodeAndScale(scaledS ize()); 157 const ScaledImageFragment* scaledImage = m_generator->decodeAndScale(scaledS ize());
154 EXPECT_NE(fullImage, scaledImage); 158 EXPECT_NE(fullImage, scaledImage);
155 EXPECT_EQ(scaledSize(), scaledImage->scaledSize()); 159 EXPECT_EQ(scaledSize(), scaledImage->scaledSize());
156 EXPECT_TRUE(m_generator->hasAlpha()); 160 EXPECT_TRUE(m_generator->hasAlpha(0));
157 ImageDecodingStore::instance()->unlockCache(m_generator.get(), scaledImage); 161 ImageDecodingStore::instance()->unlockCache(m_generator.get(), scaledImage);
158 162
159 // Cache hit. 163 // Cache hit.
160 const ScaledImageFragment* tempImage = m_generator->decodeAndScale(scaledSiz e()); 164 const ScaledImageFragment* tempImage = m_generator->decodeAndScale(scaledSiz e());
161 EXPECT_EQ(scaledImage, tempImage); 165 EXPECT_EQ(scaledImage, tempImage);
162 EXPECT_EQ(scaledSize(), tempImage->scaledSize()); 166 EXPECT_EQ(scaledSize(), tempImage->scaledSize());
163 EXPECT_TRUE(m_generator->hasAlpha()); 167 EXPECT_TRUE(m_generator->hasAlpha(0));
164 ImageDecodingStore::instance()->unlockCache(m_generator.get(), tempImage); 168 ImageDecodingStore::instance()->unlockCache(m_generator.get(), tempImage);
165 EXPECT_EQ(0, m_frameBufferRequestCount); 169 EXPECT_EQ(0, m_frameBufferRequestCount);
166 } 170 }
167 171
168 TEST_F(ImageFrameGeneratorTest, cacheMissWithDecodeAndScale) 172 TEST_F(ImageFrameGeneratorTest, cacheMissWithDecodeAndScale)
169 { 173 {
170 setFrameStatus(ImageFrame::FrameComplete); 174 setFrameStatus(ImageFrame::FrameComplete);
171 175
172 // Cache miss. 176 // Cache miss.
173 const ScaledImageFragment* scaledImage = m_generator->decodeAndScale(scaledS ize()); 177 const ScaledImageFragment* scaledImage = m_generator->decodeAndScale(scaledS ize());
174 EXPECT_EQ(1, m_frameBufferRequestCount); 178 EXPECT_EQ(1, m_frameBufferRequestCount);
175 EXPECT_EQ(scaledSize(), scaledImage->scaledSize()); 179 EXPECT_EQ(scaledSize(), scaledImage->scaledSize());
176 EXPECT_FALSE(m_generator->hasAlpha()); 180 EXPECT_FALSE(m_generator->hasAlpha(0));
177 ImageDecodingStore::instance()->unlockCache(m_generator.get(), scaledImage); 181 ImageDecodingStore::instance()->unlockCache(m_generator.get(), scaledImage);
178 EXPECT_EQ(1, m_decodersDestroyed); 182 EXPECT_EQ(1, m_decodersDestroyed);
179 183
180 // Cache hit. 184 // Cache hit.
181 const ScaledImageFragment* fullImage = m_generator->decodeAndScale(fullSize( )); 185 const ScaledImageFragment* fullImage = m_generator->decodeAndScale(fullSize( ));
182 EXPECT_NE(scaledImage, fullImage); 186 EXPECT_NE(scaledImage, fullImage);
183 EXPECT_EQ(fullSize(), fullImage->scaledSize()); 187 EXPECT_EQ(fullSize(), fullImage->scaledSize());
184 EXPECT_FALSE(m_generator->hasAlpha()); 188 EXPECT_FALSE(m_generator->hasAlpha(0));
185 ImageDecodingStore::instance()->unlockCache(m_generator.get(), fullImage); 189 ImageDecodingStore::instance()->unlockCache(m_generator.get(), fullImage);
186 190
187 // Cache hit. 191 // Cache hit.
188 const ScaledImageFragment* tempImage = m_generator->decodeAndScale(scaledSiz e()); 192 const ScaledImageFragment* tempImage = m_generator->decodeAndScale(scaledSiz e());
189 EXPECT_EQ(scaledImage, tempImage); 193 EXPECT_EQ(scaledImage, tempImage);
190 EXPECT_EQ(scaledSize(), tempImage->scaledSize()); 194 EXPECT_EQ(scaledSize(), tempImage->scaledSize());
191 EXPECT_FALSE(m_generator->hasAlpha()); 195 EXPECT_FALSE(m_generator->hasAlpha(0));
192 ImageDecodingStore::instance()->unlockCache(m_generator.get(), tempImage); 196 ImageDecodingStore::instance()->unlockCache(m_generator.get(), tempImage);
193 EXPECT_EQ(1, m_frameBufferRequestCount); 197 EXPECT_EQ(1, m_frameBufferRequestCount);
194 } 198 }
195 199
196 TEST_F(ImageFrameGeneratorTest, cacheMissWithIncompleteDecode) 200 TEST_F(ImageFrameGeneratorTest, cacheMissWithIncompleteDecode)
197 { 201 {
198 setFrameStatus(ImageFrame::FramePartial); 202 setFrameStatus(ImageFrame::FramePartial);
199 203
200 const ScaledImageFragment* tempImage= m_generator->decodeAndScale(fullSize() ); 204 const ScaledImageFragment* tempImage= m_generator->decodeAndScale(fullSize() );
201 EXPECT_FALSE(tempImage->isComplete()); 205 EXPECT_FALSE(tempImage->isComplete());
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
381 EXPECT_EQ(1, m_frameBufferRequestCount); 385 EXPECT_EQ(1, m_frameBufferRequestCount);
382 386
383 ImageDecoder* tempDecoder = 0; 387 ImageDecoder* tempDecoder = 0;
384 EXPECT_TRUE(ImageDecodingStore::instance()->lockDecoder(m_generator.get(), f ullSize(), &tempDecoder)); 388 EXPECT_TRUE(ImageDecodingStore::instance()->lockDecoder(m_generator.get(), f ullSize(), &tempDecoder));
385 ASSERT_TRUE(tempDecoder); 389 ASSERT_TRUE(tempDecoder);
386 EXPECT_NE(tempDecoder->frameBufferAtIndex(0)->getSkBitmap().getPixels(), tem pImage->bitmap().getPixels()); 390 EXPECT_NE(tempDecoder->frameBufferAtIndex(0)->getSkBitmap().getPixels(), tem pImage->bitmap().getPixels());
387 ImageDecodingStore::instance()->unlockCache(m_generator.get(), tempImage); 391 ImageDecodingStore::instance()->unlockCache(m_generator.get(), tempImage);
388 ImageDecodingStore::instance()->unlockDecoder(m_generator.get(), tempDecoder ); 392 ImageDecodingStore::instance()->unlockDecoder(m_generator.get(), tempDecoder );
389 } 393 }
390 394
395 TEST_F(ImageFrameGeneratorTest, resumeDecodeEmptyFrame)
396 {
397 m_generator = ImageFrameGenerator::create(fullSize(), m_data, false, true);
398 m_generator->setImageDecoderFactoryForTesting(MockImageDecoderFactory::creat e(this));
399 setFrameStatus(ImageFrame::FrameComplete);
400
401 const ScaledImageFragment* tempImage = m_generator->decodeAndScale(fullSize( ), 0);
402 EXPECT_TRUE(tempImage->isComplete());
403 ImageDecodingStore::instance()->unlockCache(m_generator.get(), tempImage);
404
405 setFrameStatus(ImageFrame::FrameEmpty);
406 EXPECT_FALSE(m_generator->decodeAndScale(fullSize(), 1));
407 }
408
409 TEST_F(ImageFrameGeneratorTest, frameHasAlpha)
410 {
411 setFrameStatus(ImageFrame::FramePartial);
412 ImageDecodingStore::instance()->unlockCache(m_generator.get(), m_generator-> decodeAndScale(fullSize(), 1));
413 EXPECT_TRUE(m_generator->hasAlpha(1));
414
415 ImageDecoder* tempDecoder = 0;
416 EXPECT_TRUE(ImageDecodingStore::instance()->lockDecoder(m_generator.get(), f ullSize(), &tempDecoder));
417 ASSERT_TRUE(tempDecoder);
418 static_cast<MockImageDecoder*>(tempDecoder)->setFrameHasAlpha(false);
419 ImageDecodingStore::instance()->unlockDecoder(m_generator.get(), tempDecoder );
420
421 setFrameStatus(ImageFrame::FrameComplete);
422 ImageDecodingStore::instance()->unlockCache(m_generator.get(), m_generator-> decodeAndScale(fullSize(), 1));
423 EXPECT_FALSE(m_generator->hasAlpha(1));
424 }
425
391 } // namespace 426 } // namespace
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698