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

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

Issue 1812273003: Eliminate copies of encoded image data (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 9 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
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 14 matching lines...) Expand all
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */ 29 */
30 30
31 #include "platform/image-decoders/gif/GIFImageDecoder.h" 31 #include "platform/image-decoders/gif/GIFImageDecoder.h"
32 32
33 #include "platform/SharedBuffer.h" 33 #include "platform/SharedBuffer.h"
34 #include "platform/image-decoders/ImageDecoderTestHelpers.h" 34 #include "platform/image-decoders/ImageDecoderTestHelpers.h"
35 #include "platform/image-decoders/SharedBufferSegmentReader.h"
35 #include "public/platform/WebData.h" 36 #include "public/platform/WebData.h"
36 #include "public/platform/WebSize.h" 37 #include "public/platform/WebSize.h"
37 #include "testing/gtest/include/gtest/gtest.h" 38 #include "testing/gtest/include/gtest/gtest.h"
38 #include "wtf/OwnPtr.h" 39 #include "wtf/OwnPtr.h"
39 #include "wtf/PassOwnPtr.h" 40 #include "wtf/PassOwnPtr.h"
40 #include "wtf/Vector.h" 41 #include "wtf/Vector.h"
41 42
42 namespace blink { 43 namespace blink {
43 44
44 namespace { 45 namespace {
(...skipping 12 matching lines...) Expand all
57 SCOPED_TRACE(gifFile); 58 SCOPED_TRACE(gifFile);
58 59
59 RefPtr<SharedBuffer> fullData = readFile(dir, gifFile); 60 RefPtr<SharedBuffer> fullData = readFile(dir, gifFile);
60 ASSERT_TRUE(fullData.get()); 61 ASSERT_TRUE(fullData.get());
61 Vector<unsigned> baselineHashes; 62 Vector<unsigned> baselineHashes;
62 createDecodingBaseline(&createDecoder, fullData.get(), &baselineHashes); 63 createDecodingBaseline(&createDecoder, fullData.get(), &baselineHashes);
63 size_t frameCount = baselineHashes.size(); 64 size_t frameCount = baselineHashes.size();
64 65
65 // Random decoding should get the same results as sequential decoding. 66 // Random decoding should get the same results as sequential decoding.
66 OwnPtr<ImageDecoder> decoder = createDecoder(); 67 OwnPtr<ImageDecoder> decoder = createDecoder();
67 decoder->setData(fullData.get(), true); 68 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS egmentReader(fullData));
69 decoder->setData(segmentReader.get(), true);
68 const size_t skippingStep = 5; 70 const size_t skippingStep = 5;
69 for (size_t i = 0; i < skippingStep; ++i) { 71 for (size_t i = 0; i < skippingStep; ++i) {
70 for (size_t j = i; j < frameCount; j += skippingStep) { 72 for (size_t j = i; j < frameCount; j += skippingStep) {
71 SCOPED_TRACE(testing::Message() << "Random i:" << i << " j:" << j); 73 SCOPED_TRACE(testing::Message() << "Random i:" << i << " j:" << j);
72 ImageFrame* frame = decoder->frameBufferAtIndex(j); 74 ImageFrame* frame = decoder->frameBufferAtIndex(j);
73 EXPECT_EQ(baselineHashes[j], hashBitmap(frame->getSkBitmap())); 75 EXPECT_EQ(baselineHashes[j], hashBitmap(frame->getSkBitmap()));
74 } 76 }
75 } 77 }
76 78
77 // Decoding in reverse order. 79 // Decoding in reverse order.
78 decoder = createDecoder(); 80 decoder = createDecoder();
79 decoder->setData(fullData.get(), true); 81 decoder->setData(segmentReader.get(), true);
80 for (size_t i = frameCount; i; --i) { 82 for (size_t i = frameCount; i; --i) {
81 SCOPED_TRACE(testing::Message() << "Reverse i:" << i); 83 SCOPED_TRACE(testing::Message() << "Reverse i:" << i);
82 ImageFrame* frame = decoder->frameBufferAtIndex(i - 1); 84 ImageFrame* frame = decoder->frameBufferAtIndex(i - 1);
83 EXPECT_EQ(baselineHashes[i - 1], hashBitmap(frame->getSkBitmap())); 85 EXPECT_EQ(baselineHashes[i - 1], hashBitmap(frame->getSkBitmap()));
84 } 86 }
85 } 87 }
86 88
87 void testRandomDecodeAfterClearFrameBufferCache(const char* dir, const char* gif File) 89 void testRandomDecodeAfterClearFrameBufferCache(const char* dir, const char* gif File)
88 { 90 {
89 SCOPED_TRACE(gifFile); 91 SCOPED_TRACE(gifFile);
90 92
91 RefPtr<SharedBuffer> data = readFile(dir, gifFile); 93 RefPtr<SharedBuffer> data = readFile(dir, gifFile);
92 ASSERT_TRUE(data.get()); 94 ASSERT_TRUE(data.get());
93 Vector<unsigned> baselineHashes; 95 Vector<unsigned> baselineHashes;
94 createDecodingBaseline(&createDecoder, data.get(), &baselineHashes); 96 createDecodingBaseline(&createDecoder, data.get(), &baselineHashes);
95 size_t frameCount = baselineHashes.size(); 97 size_t frameCount = baselineHashes.size();
96 98
97 OwnPtr<ImageDecoder> decoder = createDecoder(); 99 OwnPtr<ImageDecoder> decoder = createDecoder();
98 decoder->setData(data.get(), true); 100 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS egmentReader(data));
101 decoder->setData(segmentReader.get(), true);
99 for (size_t clearExceptFrame = 0; clearExceptFrame < frameCount; ++clearExce ptFrame) { 102 for (size_t clearExceptFrame = 0; clearExceptFrame < frameCount; ++clearExce ptFrame) {
100 decoder->clearCacheExceptFrame(clearExceptFrame); 103 decoder->clearCacheExceptFrame(clearExceptFrame);
101 const size_t skippingStep = 5; 104 const size_t skippingStep = 5;
102 for (size_t i = 0; i < skippingStep; ++i) { 105 for (size_t i = 0; i < skippingStep; ++i) {
103 for (size_t j = 0; j < frameCount; j += skippingStep) { 106 for (size_t j = 0; j < frameCount; j += skippingStep) {
104 SCOPED_TRACE(testing::Message() << "Random i:" << i << " j:" << j); 107 SCOPED_TRACE(testing::Message() << "Random i:" << i << " j:" << j);
105 ImageFrame* frame = decoder->frameBufferAtIndex(j); 108 ImageFrame* frame = decoder->frameBufferAtIndex(j);
106 EXPECT_EQ(baselineHashes[j], hashBitmap(frame->getSkBitmap())); 109 EXPECT_EQ(baselineHashes[j], hashBitmap(frame->getSkBitmap()));
107 } 110 }
108 } 111 }
109 } 112 }
110 } 113 }
111 114
112 } // anonymous namespace 115 } // anonymous namespace
113 116
114 TEST(GIFImageDecoderTest, decodeTwoFrames) 117 TEST(GIFImageDecoderTest, decodeTwoFrames)
115 { 118 {
116 OwnPtr<ImageDecoder> decoder = createDecoder(); 119 OwnPtr<ImageDecoder> decoder = createDecoder();
117 120
118 RefPtr<SharedBuffer> data = readFile(layoutTestResourcesDir, "animated.gif") ; 121 RefPtr<SharedBuffer> data = readFile(layoutTestResourcesDir, "animated.gif") ;
119 ASSERT_TRUE(data.get()); 122 ASSERT_TRUE(data.get());
120 decoder->setData(data.get(), true); 123 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS egmentReader(data));
124 decoder->setData(segmentReader.get(), true);
121 EXPECT_EQ(cAnimationLoopOnce, decoder->repetitionCount()); 125 EXPECT_EQ(cAnimationLoopOnce, decoder->repetitionCount());
122 126
123 ImageFrame* frame = decoder->frameBufferAtIndex(0); 127 ImageFrame* frame = decoder->frameBufferAtIndex(0);
124 uint32_t generationID0 = frame->getSkBitmap().getGenerationID(); 128 uint32_t generationID0 = frame->getSkBitmap().getGenerationID();
125 EXPECT_EQ(ImageFrame::FrameComplete, frame->status()); 129 EXPECT_EQ(ImageFrame::FrameComplete, frame->status());
126 EXPECT_EQ(16, frame->getSkBitmap().width()); 130 EXPECT_EQ(16, frame->getSkBitmap().width());
127 EXPECT_EQ(16, frame->getSkBitmap().height()); 131 EXPECT_EQ(16, frame->getSkBitmap().height());
128 132
129 frame = decoder->frameBufferAtIndex(1); 133 frame = decoder->frameBufferAtIndex(1);
130 uint32_t generationID1 = frame->getSkBitmap().getGenerationID(); 134 uint32_t generationID1 = frame->getSkBitmap().getGenerationID();
131 EXPECT_EQ(ImageFrame::FrameComplete, frame->status()); 135 EXPECT_EQ(ImageFrame::FrameComplete, frame->status());
132 EXPECT_EQ(16, frame->getSkBitmap().width()); 136 EXPECT_EQ(16, frame->getSkBitmap().width());
133 EXPECT_EQ(16, frame->getSkBitmap().height()); 137 EXPECT_EQ(16, frame->getSkBitmap().height());
134 EXPECT_TRUE(generationID0 != generationID1); 138 EXPECT_TRUE(generationID0 != generationID1);
135 139
136 EXPECT_EQ(2u, decoder->frameCount()); 140 EXPECT_EQ(2u, decoder->frameCount());
137 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount()); 141 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount());
138 } 142 }
139 143
140 TEST(GIFImageDecoderTest, parseAndDecode) 144 TEST(GIFImageDecoderTest, parseAndDecode)
141 { 145 {
142 OwnPtr<ImageDecoder> decoder = createDecoder(); 146 OwnPtr<ImageDecoder> decoder = createDecoder();
143 147
144 RefPtr<SharedBuffer> data = readFile(layoutTestResourcesDir, "animated.gif") ; 148 RefPtr<SharedBuffer> data = readFile(layoutTestResourcesDir, "animated.gif") ;
145 ASSERT_TRUE(data.get()); 149 ASSERT_TRUE(data.get());
146 decoder->setData(data.get(), true); 150 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS egmentReader(data));
151 decoder->setData(segmentReader.get(), true);
147 EXPECT_EQ(cAnimationLoopOnce, decoder->repetitionCount()); 152 EXPECT_EQ(cAnimationLoopOnce, decoder->repetitionCount());
148 153
149 // This call will parse the entire file. 154 // This call will parse the entire file.
150 EXPECT_EQ(2u, decoder->frameCount()); 155 EXPECT_EQ(2u, decoder->frameCount());
151 156
152 ImageFrame* frame = decoder->frameBufferAtIndex(0); 157 ImageFrame* frame = decoder->frameBufferAtIndex(0);
153 EXPECT_EQ(ImageFrame::FrameComplete, frame->status()); 158 EXPECT_EQ(ImageFrame::FrameComplete, frame->status());
154 EXPECT_EQ(16, frame->getSkBitmap().width()); 159 EXPECT_EQ(16, frame->getSkBitmap().width());
155 EXPECT_EQ(16, frame->getSkBitmap().height()); 160 EXPECT_EQ(16, frame->getSkBitmap().height());
156 161
157 frame = decoder->frameBufferAtIndex(1); 162 frame = decoder->frameBufferAtIndex(1);
158 EXPECT_EQ(ImageFrame::FrameComplete, frame->status()); 163 EXPECT_EQ(ImageFrame::FrameComplete, frame->status());
159 EXPECT_EQ(16, frame->getSkBitmap().width()); 164 EXPECT_EQ(16, frame->getSkBitmap().width());
160 EXPECT_EQ(16, frame->getSkBitmap().height()); 165 EXPECT_EQ(16, frame->getSkBitmap().height());
161 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount()); 166 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount());
162 } 167 }
163 168
169 // FIXME: Call ImageDecoderTestHelpers' testByteByByteDecode
164 TEST(GIFImageDecoderTest, parseByteByByte) 170 TEST(GIFImageDecoderTest, parseByteByByte)
165 { 171 {
166 OwnPtr<ImageDecoder> decoder = createDecoder(); 172 OwnPtr<ImageDecoder> decoder = createDecoder();
167 173
168 RefPtr<SharedBuffer> data = readFile(layoutTestResourcesDir, "animated.gif") ; 174 RefPtr<SharedBuffer> data = readFile(layoutTestResourcesDir, "animated.gif") ;
169 ASSERT_TRUE(data.get()); 175 ASSERT_TRUE(data.get());
170 176
171 size_t frameCount = 0; 177 size_t frameCount = 0;
172 178
173 // Pass data to decoder byte by byte. 179 // Pass data to decoder byte by byte.
174 for (size_t length = 1; length <= data->size(); ++length) { 180 for (size_t length = 1; length <= data->size(); ++length) {
175 RefPtr<SharedBuffer> tempData = SharedBuffer::create(data->data(), lengt h); 181 RefPtr<SharedBuffer> tempData = SharedBuffer::create(data->data(), lengt h);
176 decoder->setData(tempData.get(), length == data->size()); 182 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBuf ferSegmentReader(tempData));
183 decoder->setData(segmentReader.get(), length == data->size());
177 184
178 EXPECT_LE(frameCount, decoder->frameCount()); 185 EXPECT_LE(frameCount, decoder->frameCount());
179 frameCount = decoder->frameCount(); 186 frameCount = decoder->frameCount();
180 } 187 }
181 188
182 EXPECT_EQ(2u, decoder->frameCount()); 189 EXPECT_EQ(2u, decoder->frameCount());
183 190
184 decoder->frameBufferAtIndex(0); 191 decoder->frameBufferAtIndex(0);
185 decoder->frameBufferAtIndex(1); 192 decoder->frameBufferAtIndex(1);
186 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount()); 193 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount());
187 } 194 }
188 195
189 TEST(GIFImageDecoderTest, parseAndDecodeByteByByte) 196 TEST(GIFImageDecoderTest, parseAndDecodeByteByByte)
190 { 197 {
191 OwnPtr<ImageDecoder> decoder = createDecoder(); 198 OwnPtr<ImageDecoder> decoder = createDecoder();
192 199
193 RefPtr<SharedBuffer> data = readFile(layoutTestResourcesDir, "animated-gif-w ith-offsets.gif"); 200 RefPtr<SharedBuffer> data = readFile(layoutTestResourcesDir, "animated-gif-w ith-offsets.gif");
194 ASSERT_TRUE(data.get()); 201 ASSERT_TRUE(data.get());
195 202
196 size_t frameCount = 0; 203 size_t frameCount = 0;
197 size_t framesDecoded = 0; 204 size_t framesDecoded = 0;
198 205
199 // Pass data to decoder byte by byte. 206 // Pass data to decoder byte by byte.
200 for (size_t length = 1; length <= data->size(); ++length) { 207 for (size_t length = 1; length <= data->size(); ++length) {
201 RefPtr<SharedBuffer> tempData = SharedBuffer::create(data->data(), lengt h); 208 RefPtr<SharedBuffer> tempData = SharedBuffer::create(data->data(), lengt h);
202 decoder->setData(tempData.get(), length == data->size()); 209 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBuf ferSegmentReader(data));
210 decoder->setData(segmentReader.get(), length == data->size());
203 211
204 EXPECT_LE(frameCount, decoder->frameCount()); 212 EXPECT_LE(frameCount, decoder->frameCount());
205 frameCount = decoder->frameCount(); 213 frameCount = decoder->frameCount();
206 214
207 ImageFrame* frame = decoder->frameBufferAtIndex(frameCount - 1); 215 ImageFrame* frame = decoder->frameBufferAtIndex(frameCount - 1);
208 if (frame && frame->status() == ImageFrame::FrameComplete && framesDecod ed < frameCount) 216 if (frame && frame->status() == ImageFrame::FrameComplete && framesDecod ed < frameCount)
209 ++framesDecoded; 217 ++framesDecoded;
210 } 218 }
211 219
212 EXPECT_EQ(5u, decoder->frameCount()); 220 EXPECT_EQ(5u, decoder->frameCount());
213 EXPECT_EQ(5u, framesDecoded); 221 EXPECT_EQ(5u, framesDecoded);
214 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount()); 222 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount());
215 } 223 }
216 224
217 TEST(GIFImageDecoderTest, brokenSecondFrame) 225 TEST(GIFImageDecoderTest, brokenSecondFrame)
218 { 226 {
219 OwnPtr<ImageDecoder> decoder = createDecoder(); 227 OwnPtr<ImageDecoder> decoder = createDecoder();
220 228
221 RefPtr<SharedBuffer> data = readFile(webTestsDataDir, "broken.gif"); 229 RefPtr<SharedBuffer> data = readFile(webTestsDataDir, "broken.gif");
222 ASSERT_TRUE(data.get()); 230 ASSERT_TRUE(data.get());
223 decoder->setData(data.get(), true); 231 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS egmentReader(data));
232 decoder->setData(segmentReader.get(), true);
224 233
225 // One frame is detected but cannot be decoded. 234 // One frame is detected but cannot be decoded.
226 EXPECT_EQ(1u, decoder->frameCount()); 235 EXPECT_EQ(1u, decoder->frameCount());
227 ImageFrame* frame = decoder->frameBufferAtIndex(1); 236 ImageFrame* frame = decoder->frameBufferAtIndex(1);
228 EXPECT_FALSE(frame); 237 EXPECT_FALSE(frame);
229 } 238 }
230 239
231 TEST(GIFImageDecoderTest, progressiveDecode) 240 TEST(GIFImageDecoderTest, progressiveDecode)
232 { 241 {
233 RefPtr<SharedBuffer> fullData = readFile(webTestsDataDir, "radient.gif"); 242 RefPtr<SharedBuffer> fullData = readFile(webTestsDataDir, "radient.gif");
234 ASSERT_TRUE(fullData.get()); 243 ASSERT_TRUE(fullData.get());
235 const size_t fullLength = fullData->size(); 244 const size_t fullLength = fullData->size();
236 245
237 OwnPtr<ImageDecoder> decoder; 246 OwnPtr<ImageDecoder> decoder;
238 ImageFrame* frame; 247 ImageFrame* frame;
239 248
240 Vector<unsigned> truncatedHashes; 249 Vector<unsigned> truncatedHashes;
241 Vector<unsigned> progressiveHashes; 250 Vector<unsigned> progressiveHashes;
242 251
243 // Compute hashes when the file is truncated. 252 // Compute hashes when the file is truncated.
244 const size_t increment = 1; 253 const size_t increment = 1;
245 for (size_t i = 1; i <= fullLength; i += increment) { 254 for (size_t i = 1; i <= fullLength; i += increment) {
246 decoder = createDecoder(); 255 decoder = createDecoder();
247 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), i); 256 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), i);
248 decoder->setData(data.get(), i == fullLength); 257 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBuf ferSegmentReader(data));
258 decoder->setData(segmentReader.get(), i == fullLength);
249 frame = decoder->frameBufferAtIndex(0); 259 frame = decoder->frameBufferAtIndex(0);
250 if (!frame) { 260 if (!frame) {
251 truncatedHashes.append(0); 261 truncatedHashes.append(0);
252 continue; 262 continue;
253 } 263 }
254 truncatedHashes.append(hashBitmap(frame->getSkBitmap())); 264 truncatedHashes.append(hashBitmap(frame->getSkBitmap()));
255 } 265 }
256 266
257 // Compute hashes when the file is progressively decoded. 267 // Compute hashes when the file is progressively decoded.
258 decoder = createDecoder(); 268 decoder = createDecoder();
259 EXPECT_EQ(cAnimationLoopOnce, decoder->repetitionCount()); 269 EXPECT_EQ(cAnimationLoopOnce, decoder->repetitionCount());
260 for (size_t i = 1; i <= fullLength; i += increment) { 270 for (size_t i = 1; i <= fullLength; i += increment) {
261 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), i); 271 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), i);
262 decoder->setData(data.get(), i == fullLength); 272 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBuf ferSegmentReader(data));
273 decoder->setData(segmentReader.get(), i == fullLength);
263 frame = decoder->frameBufferAtIndex(0); 274 frame = decoder->frameBufferAtIndex(0);
264 if (!frame) { 275 if (!frame) {
265 progressiveHashes.append(0); 276 progressiveHashes.append(0);
266 continue; 277 continue;
267 } 278 }
268 progressiveHashes.append(hashBitmap(frame->getSkBitmap())); 279 progressiveHashes.append(hashBitmap(frame->getSkBitmap()));
269 } 280 }
270 EXPECT_EQ(cAnimationNone, decoder->repetitionCount()); 281 EXPECT_EQ(cAnimationNone, decoder->repetitionCount());
271 282
272 bool match = true; 283 bool match = true;
273 for (size_t i = 0; i < truncatedHashes.size(); ++i) { 284 for (size_t i = 0; i < truncatedHashes.size(); ++i) {
274 if (truncatedHashes[i] != progressiveHashes[i]) { 285 if (truncatedHashes[i] != progressiveHashes[i]) {
275 match = false; 286 match = false;
276 break; 287 break;
277 } 288 }
278 } 289 }
279 EXPECT_TRUE(match); 290 EXPECT_TRUE(match);
280 } 291 }
281 292
282 TEST(GIFImageDecoderTest, allDataReceivedTruncation) 293 TEST(GIFImageDecoderTest, allDataReceivedTruncation)
283 { 294 {
284 OwnPtr<ImageDecoder> decoder = createDecoder(); 295 OwnPtr<ImageDecoder> decoder = createDecoder();
285 296
286 RefPtr<SharedBuffer> data = readFile(layoutTestResourcesDir, "animated.gif") ; 297 RefPtr<SharedBuffer> data = readFile(layoutTestResourcesDir, "animated.gif") ;
287 ASSERT_TRUE(data.get()); 298 ASSERT_TRUE(data.get());
288 299
289 ASSERT_GE(data->size(), 10u); 300 ASSERT_GE(data->size(), 10u);
290 RefPtr<SharedBuffer> tempData = SharedBuffer::create(data->data(), data->siz e() - 10); 301 RefPtr<SharedBuffer> tempData = SharedBuffer::create(data->data(), data->siz e() - 10);
291 decoder->setData(tempData.get(), true); 302 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS egmentReader(tempData));
303 decoder->setData(segmentReader.get(), true);
292 304
293 EXPECT_EQ(2u, decoder->frameCount()); 305 EXPECT_EQ(2u, decoder->frameCount());
294 EXPECT_FALSE(decoder->failed()); 306 EXPECT_FALSE(decoder->failed());
295 307
296 decoder->frameBufferAtIndex(0); 308 decoder->frameBufferAtIndex(0);
297 EXPECT_FALSE(decoder->failed()); 309 EXPECT_FALSE(decoder->failed());
298 decoder->frameBufferAtIndex(1); 310 decoder->frameBufferAtIndex(1);
299 EXPECT_TRUE(decoder->failed()); 311 EXPECT_TRUE(decoder->failed());
300 } 312 }
301 313
302 TEST(GIFImageDecoderTest, frameIsComplete) 314 TEST(GIFImageDecoderTest, frameIsComplete)
303 { 315 {
304 OwnPtr<ImageDecoder> decoder = createDecoder(); 316 OwnPtr<ImageDecoder> decoder = createDecoder();
305 317
306 RefPtr<SharedBuffer> data = readFile(layoutTestResourcesDir, "animated.gif") ; 318 RefPtr<SharedBuffer> data = readFile(layoutTestResourcesDir, "animated.gif") ;
307 ASSERT_TRUE(data.get()); 319 ASSERT_TRUE(data.get());
308 decoder->setData(data.get(), true); 320 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS egmentReader(data));
321 decoder->setData(segmentReader.get(), true);
309 322
310 EXPECT_EQ(2u, decoder->frameCount()); 323 EXPECT_EQ(2u, decoder->frameCount());
311 EXPECT_FALSE(decoder->failed()); 324 EXPECT_FALSE(decoder->failed());
312 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(0)); 325 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(0));
313 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(1)); 326 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(1));
314 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount()); 327 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount());
315 } 328 }
316 329
317 TEST(GIFImageDecoderTest, frameIsCompleteLoading) 330 TEST(GIFImageDecoderTest, frameIsCompleteLoading)
318 { 331 {
319 OwnPtr<ImageDecoder> decoder = createDecoder(); 332 OwnPtr<ImageDecoder> decoder = createDecoder();
320 333
321 RefPtr<SharedBuffer> data = readFile(layoutTestResourcesDir, "animated.gif") ; 334 RefPtr<SharedBuffer> data = readFile(layoutTestResourcesDir, "animated.gif") ;
322 ASSERT_TRUE(data.get()); 335 ASSERT_TRUE(data.get());
323 336
324 ASSERT_GE(data->size(), 10u); 337 ASSERT_GE(data->size(), 10u);
325 RefPtr<SharedBuffer> tempData = SharedBuffer::create(data->data(), data->siz e() - 10); 338 RefPtr<SharedBuffer> tempData = SharedBuffer::create(data->data(), data->siz e() - 10);
326 decoder->setData(tempData.get(), false); 339 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS egmentReader(tempData));
340 decoder->setData(segmentReader.get(), false);
327 341
328 EXPECT_EQ(2u, decoder->frameCount()); 342 EXPECT_EQ(2u, decoder->frameCount());
329 EXPECT_FALSE(decoder->failed()); 343 EXPECT_FALSE(decoder->failed());
330 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(0)); 344 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(0));
331 EXPECT_FALSE(decoder->frameIsCompleteAtIndex(1)); 345 EXPECT_FALSE(decoder->frameIsCompleteAtIndex(1));
332 346
333 decoder->setData(data.get(), true); 347 segmentReader = adoptRef(new SharedBufferSegmentReader(data));
348 decoder->setData(segmentReader.get(), true);
334 EXPECT_EQ(2u, decoder->frameCount()); 349 EXPECT_EQ(2u, decoder->frameCount());
335 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(0)); 350 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(0));
336 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(1)); 351 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(1));
337 } 352 }
338 353
339 TEST(GIFImageDecoderTest, badTerminator) 354 TEST(GIFImageDecoderTest, badTerminator)
340 { 355 {
341 RefPtr<SharedBuffer> referenceData = readFile(webTestsDataDir, "radient.gif" ); 356 RefPtr<SharedBuffer> referenceData = readFile(webTestsDataDir, "radient.gif" );
342 RefPtr<SharedBuffer> testData = readFile(webTestsDataDir, "radient-bad-termi nator.gif"); 357 RefPtr<SharedBuffer> testData = readFile(webTestsDataDir, "radient-bad-termi nator.gif");
343 ASSERT_TRUE(referenceData.get()); 358 ASSERT_TRUE(referenceData.get());
344 ASSERT_TRUE(testData.get()); 359 ASSERT_TRUE(testData.get());
345 360
346 OwnPtr<ImageDecoder> referenceDecoder = createDecoder(); 361 OwnPtr<ImageDecoder> referenceDecoder = createDecoder();
347 referenceDecoder->setData(referenceData.get(), true); 362 RefPtr<SharedBufferSegmentReader> referenceSharedBufferSegmentReader = adopt Ref(new SharedBufferSegmentReader(referenceData));
363 referenceDecoder->setData(referenceSharedBufferSegmentReader.get(), true);
348 EXPECT_EQ(1u, referenceDecoder->frameCount()); 364 EXPECT_EQ(1u, referenceDecoder->frameCount());
349 ImageFrame* referenceFrame = referenceDecoder->frameBufferAtIndex(0); 365 ImageFrame* referenceFrame = referenceDecoder->frameBufferAtIndex(0);
350 ASSERT(referenceFrame); 366 ASSERT(referenceFrame);
351 367
352 OwnPtr<ImageDecoder> testDecoder = createDecoder(); 368 OwnPtr<ImageDecoder> testDecoder = createDecoder();
353 testDecoder->setData(testData.get(), true); 369 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS egmentReader(testData));
370 testDecoder->setData(segmentReader.get(), true);
354 EXPECT_EQ(1u, testDecoder->frameCount()); 371 EXPECT_EQ(1u, testDecoder->frameCount());
355 ImageFrame* testFrame = testDecoder->frameBufferAtIndex(0); 372 ImageFrame* testFrame = testDecoder->frameBufferAtIndex(0);
356 ASSERT(testFrame); 373 ASSERT(testFrame);
357 374
358 EXPECT_EQ(hashBitmap(referenceFrame->getSkBitmap()), hashBitmap(testFrame->g etSkBitmap())); 375 EXPECT_EQ(hashBitmap(referenceFrame->getSkBitmap()), hashBitmap(testFrame->g etSkBitmap()));
359 } 376 }
360 377
361 TEST(GIFImageDecoderTest, updateRequiredPreviousFrameAfterFirstDecode) 378 TEST(GIFImageDecoderTest, updateRequiredPreviousFrameAfterFirstDecode)
362 { 379 {
363 OwnPtr<ImageDecoder> decoder = createDecoder(); 380 OwnPtr<ImageDecoder> decoder = createDecoder();
364 381
365 RefPtr<SharedBuffer> fullData = readFile(layoutTestResourcesDir, "animated-1 0color.gif"); 382 RefPtr<SharedBuffer> fullData = readFile(layoutTestResourcesDir, "animated-1 0color.gif");
366 ASSERT_TRUE(fullData.get()); 383 ASSERT_TRUE(fullData.get());
367 384
368 // Give it data that is enough to parse but not decode in order to check the status 385 // Give it data that is enough to parse but not decode in order to check the status
369 // of requiredPreviousFrameIndex before decoding. 386 // of requiredPreviousFrameIndex before decoding.
370 size_t partialSize = 1; 387 size_t partialSize = 1;
371 do { 388 do {
372 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), parti alSize); 389 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), parti alSize);
373 decoder->setData(data.get(), false); 390 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBuf ferSegmentReader(data));
391 decoder->setData(segmentReader.get(), false);
374 ++partialSize; 392 ++partialSize;
375 } while (!decoder->frameCount() || decoder->frameBufferAtIndex(0)->status() == ImageFrame::FrameEmpty); 393 } while (!decoder->frameCount() || decoder->frameBufferAtIndex(0)->status() == ImageFrame::FrameEmpty);
376 394
377 EXPECT_EQ(kNotFound, decoder->frameBufferAtIndex(0)->requiredPreviousFrameIn dex()); 395 EXPECT_EQ(kNotFound, decoder->frameBufferAtIndex(0)->requiredPreviousFrameIn dex());
378 unsigned frameCount = decoder->frameCount(); 396 unsigned frameCount = decoder->frameCount();
379 for (size_t i = 1; i < frameCount; ++i) 397 for (size_t i = 1; i < frameCount; ++i)
380 EXPECT_EQ(i - 1, decoder->frameBufferAtIndex(i)->requiredPreviousFrameIn dex()); 398 EXPECT_EQ(i - 1, decoder->frameBufferAtIndex(i)->requiredPreviousFrameIn dex());
381 399
382 decoder->setData(fullData.get(), true); 400 RefPtr<SegmentReader> fullSegmentReader = adoptRef(new SharedBufferSegmentRe ader(fullData));
401 decoder->setData(fullSegmentReader.get(), true);
383 for (size_t i = 0; i < frameCount; ++i) 402 for (size_t i = 0; i < frameCount; ++i)
384 EXPECT_EQ(kNotFound, decoder->frameBufferAtIndex(i)->requiredPreviousFra meIndex()); 403 EXPECT_EQ(kNotFound, decoder->frameBufferAtIndex(i)->requiredPreviousFra meIndex());
385 } 404 }
386 405
387 TEST(GIFImageDecoderTest, randomFrameDecode) 406 TEST(GIFImageDecoderTest, randomFrameDecode)
388 { 407 {
389 // Single frame image. 408 // Single frame image.
390 testRandomFrameDecode(webTestsDataDir, "radient.gif"); 409 testRandomFrameDecode(webTestsDataDir, "radient.gif");
391 // Multiple frame images. 410 // Multiple frame images.
392 testRandomFrameDecode(layoutTestResourcesDir, "animated-gif-with-offsets.gif "); 411 testRandomFrameDecode(layoutTestResourcesDir, "animated-gif-with-offsets.gif ");
(...skipping 16 matching lines...) Expand all
409 Vector<unsigned> baselineHashes; 428 Vector<unsigned> baselineHashes;
410 createDecodingBaseline(&createDecoder, fullData.get(), &baselineHashes); 429 createDecodingBaseline(&createDecoder, fullData.get(), &baselineHashes);
411 size_t frameCount = baselineHashes.size(); 430 size_t frameCount = baselineHashes.size();
412 431
413 OwnPtr<ImageDecoder> decoder = createDecoder(); 432 OwnPtr<ImageDecoder> decoder = createDecoder();
414 433
415 // Let frame 0 be partially decoded. 434 // Let frame 0 be partially decoded.
416 size_t partialSize = 1; 435 size_t partialSize = 1;
417 do { 436 do {
418 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), parti alSize); 437 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), parti alSize);
419 decoder->setData(data.get(), false); 438 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBuf ferSegmentReader(data));
439 decoder->setData(segmentReader.get(), false);
420 ++partialSize; 440 ++partialSize;
421 } while (!decoder->frameCount() || decoder->frameBufferAtIndex(0)->status() == ImageFrame::FrameEmpty); 441 } while (!decoder->frameCount() || decoder->frameBufferAtIndex(0)->status() == ImageFrame::FrameEmpty);
422 442
423 // Skip to the last frame and clear. 443 // Skip to the last frame and clear.
424 decoder->setData(fullData.get(), true); 444 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS egmentReader(fullData));
445 decoder->setData(segmentReader.get(), true);
425 EXPECT_EQ(frameCount, decoder->frameCount()); 446 EXPECT_EQ(frameCount, decoder->frameCount());
426 ImageFrame* lastFrame = decoder->frameBufferAtIndex(frameCount - 1); 447 ImageFrame* lastFrame = decoder->frameBufferAtIndex(frameCount - 1);
427 EXPECT_EQ(baselineHashes[frameCount - 1], hashBitmap(lastFrame->getSkBitmap( ))); 448 EXPECT_EQ(baselineHashes[frameCount - 1], hashBitmap(lastFrame->getSkBitmap( )));
428 decoder->clearCacheExceptFrame(kNotFound); 449 decoder->clearCacheExceptFrame(kNotFound);
429 450
430 // Resume decoding of the first frame. 451 // Resume decoding of the first frame.
431 ImageFrame* firstFrame = decoder->frameBufferAtIndex(0); 452 ImageFrame* firstFrame = decoder->frameBufferAtIndex(0);
432 EXPECT_EQ(ImageFrame::FrameComplete, firstFrame->status()); 453 EXPECT_EQ(ImageFrame::FrameComplete, firstFrame->status());
433 EXPECT_EQ(baselineHashes[0], hashBitmap(firstFrame->getSkBitmap())); 454 EXPECT_EQ(baselineHashes[0], hashBitmap(firstFrame->getSkBitmap()));
434 } 455 }
435 456
436 // The first LZW codes in the image are invalid values that try to create a loop 457 // The first LZW codes in the image are invalid values that try to create a loop
437 // in the dictionary. Decoding should fail, but not infinitely loop or corrupt m emory. 458 // in the dictionary. Decoding should fail, but not infinitely loop or corrupt m emory.
438 TEST(GIFImageDecoderTest, badInitialCode) 459 TEST(GIFImageDecoderTest, badInitialCode)
439 { 460 {
440 RefPtr<SharedBuffer> testData = readFile(decodersTestingDir, "bad-initial-co de.gif"); 461 RefPtr<SharedBuffer> testData = readFile(decodersTestingDir, "bad-initial-co de.gif");
441 ASSERT_TRUE(testData.get()); 462 ASSERT_TRUE(testData.get());
442 463
443 OwnPtr<ImageDecoder> testDecoder = createDecoder(); 464 OwnPtr<ImageDecoder> testDecoder = createDecoder();
444 testDecoder->setData(testData.get(), true); 465 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS egmentReader(testData));
466 testDecoder->setData(segmentReader.get(), true);
445 EXPECT_EQ(1u, testDecoder->frameCount()); 467 EXPECT_EQ(1u, testDecoder->frameCount());
446 ASSERT_TRUE(testDecoder->frameBufferAtIndex(0)); 468 ASSERT_TRUE(testDecoder->frameBufferAtIndex(0));
447 EXPECT_TRUE(testDecoder->failed()); 469 EXPECT_TRUE(testDecoder->failed());
448 } 470 }
449 471
450 // The image has an invalid LZW code that exceeds dictionary size. Decoding shou ld fail. 472 // The image has an invalid LZW code that exceeds dictionary size. Decoding shou ld fail.
451 TEST(GIFImageDecoderTest, badCode) 473 TEST(GIFImageDecoderTest, badCode)
452 { 474 {
453 RefPtr<SharedBuffer> testData = readFile(decodersTestingDir, "bad-code.gif") ; 475 RefPtr<SharedBuffer> testData = readFile(decodersTestingDir, "bad-code.gif") ;
454 ASSERT_TRUE(testData.get()); 476 ASSERT_TRUE(testData.get());
455 477
456 OwnPtr<ImageDecoder> testDecoder = createDecoder(); 478 OwnPtr<ImageDecoder> testDecoder = createDecoder();
457 testDecoder->setData(testData.get(), true); 479 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS egmentReader(testData));
480 testDecoder->setData(segmentReader.get(), true);
458 EXPECT_EQ(1u, testDecoder->frameCount()); 481 EXPECT_EQ(1u, testDecoder->frameCount());
459 ASSERT_TRUE(testDecoder->frameBufferAtIndex(0)); 482 ASSERT_TRUE(testDecoder->frameBufferAtIndex(0));
460 EXPECT_TRUE(testDecoder->failed()); 483 EXPECT_TRUE(testDecoder->failed());
461 } 484 }
462 485
463 TEST(GIFImageDecoderTest, invalidDisposalMethod) 486 TEST(GIFImageDecoderTest, invalidDisposalMethod)
464 { 487 {
465 OwnPtr<ImageDecoder> decoder = createDecoder(); 488 OwnPtr<ImageDecoder> decoder = createDecoder();
466 489
467 // The image has 2 frames, with disposal method 4 and 5, respectively. 490 // The image has 2 frames, with disposal method 4 and 5, respectively.
468 RefPtr<SharedBuffer> data = readFile(webTestsDataDir, "invalid-disposal-meth od.gif"); 491 RefPtr<SharedBuffer> data = readFile(webTestsDataDir, "invalid-disposal-meth od.gif");
469 ASSERT_TRUE(data.get()); 492 ASSERT_TRUE(data.get());
470 decoder->setData(data.get(), true); 493 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS egmentReader(data));
494 decoder->setData(segmentReader.get(), true);
471 495
472 EXPECT_EQ(2u, decoder->frameCount()); 496 EXPECT_EQ(2u, decoder->frameCount());
473 // Disposal method 4 is converted to ImageFrame::DisposeOverwritePrevious. 497 // Disposal method 4 is converted to ImageFrame::DisposeOverwritePrevious.
474 EXPECT_EQ(ImageFrame::DisposeOverwritePrevious, decoder->frameBufferAtIndex( 0)->disposalMethod()); 498 EXPECT_EQ(ImageFrame::DisposeOverwritePrevious, decoder->frameBufferAtIndex( 0)->disposalMethod());
475 // Disposal method 5 is ignored. 499 // Disposal method 5 is ignored.
476 EXPECT_EQ(ImageFrame::DisposeNotSpecified, decoder->frameBufferAtIndex(1)->d isposalMethod()); 500 EXPECT_EQ(ImageFrame::DisposeNotSpecified, decoder->frameBufferAtIndex(1)->d isposalMethod());
477 } 501 }
478 502
479 TEST(GIFImageDecoderTest, firstFrameHasGreaterSizeThanScreenSize) 503 TEST(GIFImageDecoderTest, firstFrameHasGreaterSizeThanScreenSize)
480 { 504 {
481 RefPtr<SharedBuffer> fullData = readFile(decodersTestingDir, "first-frame-ha s-greater-size-than-screen-size.gif"); 505 RefPtr<SharedBuffer> fullData = readFile(decodersTestingDir, "first-frame-ha s-greater-size-than-screen-size.gif");
482 ASSERT_TRUE(fullData.get()); 506 ASSERT_TRUE(fullData.get());
483 507
484 OwnPtr<ImageDecoder> decoder; 508 OwnPtr<ImageDecoder> decoder;
485 IntSize frameSize; 509 IntSize frameSize;
486 510
487 // Compute hashes when the file is truncated. 511 // Compute hashes when the file is truncated.
488 for (size_t i = 1; i <= fullData->size(); ++i) { 512 for (size_t i = 1; i <= fullData->size(); ++i) {
489 decoder = createDecoder(); 513 decoder = createDecoder();
490 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), i); 514 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), i);
491 decoder->setData(data.get(), i == fullData->size()); 515 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBuf ferSegmentReader(data));
516 decoder->setData(segmentReader.get(), i == fullData->size());
492 517
493 if (decoder->isSizeAvailable() && !frameSize.width() && !frameSize.heigh t()) { 518 if (decoder->isSizeAvailable() && !frameSize.width() && !frameSize.heigh t()) {
494 frameSize = decoder->decodedSize(); 519 frameSize = decoder->decodedSize();
495 continue; 520 continue;
496 } 521 }
497 522
498 ASSERT_EQ(frameSize.width(), decoder->decodedSize().width()); 523 ASSERT_EQ(frameSize.width(), decoder->decodedSize().width());
499 ASSERT_EQ(frameSize.height(), decoder->decodedSize().height()); 524 ASSERT_EQ(frameSize.height(), decoder->decodedSize().height());
500 } 525 }
501 } 526 }
502 527
503 } // namespace blink 528 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698