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

Side by Side Diff: third_party/WebKit/Source/platform/graphics/ImageFrameGeneratorTest.cpp

Issue 2787053004: Respect colorSpace in DecodingImageGenerator::onGetPixels() (Closed)
Patch Set: Moving xform back to image generator Created 3 years, 8 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) 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 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
126 ImageFrame::Status m_nextFrameStatus; 126 ImageFrame::Status m_nextFrameStatus;
127 size_t m_frameCount; 127 size_t m_frameCount;
128 size_t m_requestedClearExceptFrame; 128 size_t m_requestedClearExceptFrame;
129 }; 129 };
130 130
131 TEST_F(ImageFrameGeneratorTest, incompleteDecode) { 131 TEST_F(ImageFrameGeneratorTest, incompleteDecode) {
132 setFrameStatus(ImageFrame::FramePartial); 132 setFrameStatus(ImageFrame::FramePartial);
133 133
134 char buffer[100 * 100 * 4]; 134 char buffer[100 * 100 * 4];
135 m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), 135 m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(),
136 buffer, 100 * 4); 136 buffer, 100 * 4,
137 ImageDecoder::AlphaPremultiplied);
137 EXPECT_EQ(1, m_decodeRequestCount); 138 EXPECT_EQ(1, m_decodeRequestCount);
138 139
139 addNewData(); 140 addNewData();
140 m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), 141 m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(),
141 buffer, 100 * 4); 142 buffer, 100 * 4,
143 ImageDecoder::AlphaPremultiplied);
142 EXPECT_EQ(2, m_decodeRequestCount); 144 EXPECT_EQ(2, m_decodeRequestCount);
143 EXPECT_EQ(0, m_decodersDestroyed); 145 EXPECT_EQ(0, m_decodersDestroyed);
144 } 146 }
145 147
146 TEST_F(ImageFrameGeneratorTest, incompleteDecodeBecomesComplete) { 148 TEST_F(ImageFrameGeneratorTest, incompleteDecodeBecomesComplete) {
147 setFrameStatus(ImageFrame::FramePartial); 149 setFrameStatus(ImageFrame::FramePartial);
148 150
149 char buffer[100 * 100 * 4]; 151 char buffer[100 * 100 * 4];
150 m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), 152 m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(),
151 buffer, 100 * 4); 153 buffer, 100 * 4,
154 ImageDecoder::AlphaPremultiplied);
152 EXPECT_EQ(1, m_decodeRequestCount); 155 EXPECT_EQ(1, m_decodeRequestCount);
153 EXPECT_EQ(0, m_decodersDestroyed); 156 EXPECT_EQ(0, m_decodersDestroyed);
154 157
155 setFrameStatus(ImageFrame::FrameComplete); 158 setFrameStatus(ImageFrame::FrameComplete);
156 addNewData(); 159 addNewData();
157 160
158 m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), 161 m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(),
159 buffer, 100 * 4); 162 buffer, 100 * 4,
163 ImageDecoder::AlphaPremultiplied);
160 EXPECT_EQ(2, m_decodeRequestCount); 164 EXPECT_EQ(2, m_decodeRequestCount);
161 EXPECT_EQ(1, m_decodersDestroyed); 165 EXPECT_EQ(1, m_decodersDestroyed);
162 166
163 // Decoder created again. 167 // Decoder created again.
164 m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), 168 m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(),
165 buffer, 100 * 4); 169 buffer, 100 * 4,
170 ImageDecoder::AlphaPremultiplied);
166 EXPECT_EQ(3, m_decodeRequestCount); 171 EXPECT_EQ(3, m_decodeRequestCount);
167 } 172 }
168 173
169 static void decodeThreadMain(ImageFrameGenerator* generator, 174 static void decodeThreadMain(ImageFrameGenerator* generator,
170 SegmentReader* segmentReader) { 175 SegmentReader* segmentReader) {
171 char buffer[100 * 100 * 4]; 176 char buffer[100 * 100 * 4];
172 generator->decodeAndScale(segmentReader, false, 0, imageInfo(), buffer, 177 generator->decodeAndScale(segmentReader, false, 0, imageInfo(), buffer,
173 100 * 4); 178 100 * 4, ImageDecoder::AlphaPremultiplied);
174 } 179 }
175 180
176 TEST_F(ImageFrameGeneratorTest, incompleteDecodeBecomesCompleteMultiThreaded) { 181 TEST_F(ImageFrameGeneratorTest, incompleteDecodeBecomesCompleteMultiThreaded) {
177 setFrameStatus(ImageFrame::FramePartial); 182 setFrameStatus(ImageFrame::FramePartial);
178 183
179 char buffer[100 * 100 * 4]; 184 char buffer[100 * 100 * 4];
180 m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), 185 m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(),
181 buffer, 100 * 4); 186 buffer, 100 * 4,
187 ImageDecoder::AlphaPremultiplied);
182 EXPECT_EQ(1, m_decodeRequestCount); 188 EXPECT_EQ(1, m_decodeRequestCount);
183 EXPECT_EQ(0, m_decodersDestroyed); 189 EXPECT_EQ(0, m_decodersDestroyed);
184 190
185 // LocalFrame can now be decoded completely. 191 // LocalFrame can now be decoded completely.
186 setFrameStatus(ImageFrame::FrameComplete); 192 setFrameStatus(ImageFrame::FrameComplete);
187 addNewData(); 193 addNewData();
188 std::unique_ptr<WebThread> thread = 194 std::unique_ptr<WebThread> thread =
189 WTF::wrapUnique(Platform::current()->createThread("DecodeThread")); 195 WTF::wrapUnique(Platform::current()->createThread("DecodeThread"));
190 thread->getWebTaskRunner()->postTask( 196 thread->getWebTaskRunner()->postTask(
191 BLINK_FROM_HERE, 197 BLINK_FROM_HERE,
192 crossThreadBind(&decodeThreadMain, m_generator, m_segmentReader)); 198 crossThreadBind(&decodeThreadMain, m_generator, m_segmentReader));
193 thread.reset(); 199 thread.reset();
194 EXPECT_EQ(2, m_decodeRequestCount); 200 EXPECT_EQ(2, m_decodeRequestCount);
195 EXPECT_EQ(1, m_decodersDestroyed); 201 EXPECT_EQ(1, m_decodersDestroyed);
196 202
197 // Decoder created again. 203 // Decoder created again.
198 m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), 204 m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(),
199 buffer, 100 * 4); 205 buffer, 100 * 4,
206 ImageDecoder::AlphaPremultiplied);
200 EXPECT_EQ(3, m_decodeRequestCount); 207 EXPECT_EQ(3, m_decodeRequestCount);
201 208
202 addNewData(); 209 addNewData();
203 210
204 // Delete generator. 211 // Delete generator.
205 m_generator = nullptr; 212 m_generator = nullptr;
206 } 213 }
207 214
208 TEST_F(ImageFrameGeneratorTest, frameHasAlpha) { 215 TEST_F(ImageFrameGeneratorTest, frameHasAlpha) {
209 setFrameStatus(ImageFrame::FramePartial); 216 setFrameStatus(ImageFrame::FramePartial);
210 217
211 char buffer[100 * 100 * 4]; 218 char buffer[100 * 100 * 4];
212 m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), 219 m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(),
213 buffer, 100 * 4); 220 buffer, 100 * 4,
221 ImageDecoder::AlphaPremultiplied);
214 EXPECT_TRUE(m_generator->hasAlpha(0)); 222 EXPECT_TRUE(m_generator->hasAlpha(0));
215 EXPECT_EQ(1, m_decodeRequestCount); 223 EXPECT_EQ(1, m_decodeRequestCount);
216 224
217 ImageDecoder* tempDecoder = 0; 225 ImageDecoder* tempDecoder = 0;
218 EXPECT_TRUE(ImageDecodingStore::instance().lockDecoder( 226 EXPECT_TRUE(ImageDecodingStore::instance().lockDecoder(
219 m_generator.get(), fullSize(), &tempDecoder)); 227 m_generator.get(), fullSize(), ImageDecoder::AlphaPremultiplied,
228 &tempDecoder));
220 ASSERT_TRUE(tempDecoder); 229 ASSERT_TRUE(tempDecoder);
221 tempDecoder->frameBufferAtIndex(0)->setHasAlpha(false); 230 tempDecoder->frameBufferAtIndex(0)->setHasAlpha(false);
222 ImageDecodingStore::instance().unlockDecoder(m_generator.get(), tempDecoder); 231 ImageDecodingStore::instance().unlockDecoder(m_generator.get(), tempDecoder);
223 EXPECT_EQ(2, m_decodeRequestCount); 232 EXPECT_EQ(2, m_decodeRequestCount);
224 233
225 setFrameStatus(ImageFrame::FrameComplete); 234 setFrameStatus(ImageFrame::FrameComplete);
226 m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), 235 m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(),
227 buffer, 100 * 4); 236 buffer, 100 * 4,
237 ImageDecoder::AlphaPremultiplied);
228 EXPECT_EQ(3, m_decodeRequestCount); 238 EXPECT_EQ(3, m_decodeRequestCount);
229 EXPECT_FALSE(m_generator->hasAlpha(0)); 239 EXPECT_FALSE(m_generator->hasAlpha(0));
230 } 240 }
231 241
232 TEST_F(ImageFrameGeneratorTest, clearMultiFrameDecoder) { 242 TEST_F(ImageFrameGeneratorTest, clearMultiFrameDecoder) {
233 setFrameCount(3); 243 setFrameCount(3);
234 setFrameStatus(ImageFrame::FrameComplete); 244 setFrameStatus(ImageFrame::FrameComplete);
235 245
236 char buffer[100 * 100 * 4]; 246 char buffer[100 * 100 * 4];
237 m_generator->decodeAndScale(m_segmentReader.get(), true, 0, imageInfo(), 247 m_generator->decodeAndScale(m_segmentReader.get(), true, 0, imageInfo(),
238 buffer, 100 * 4); 248 buffer, 100 * 4,
249 ImageDecoder::AlphaPremultiplied);
239 EXPECT_EQ(1, m_decodeRequestCount); 250 EXPECT_EQ(1, m_decodeRequestCount);
240 EXPECT_EQ(0, m_decodersDestroyed); 251 EXPECT_EQ(0, m_decodersDestroyed);
241 EXPECT_EQ(0U, m_requestedClearExceptFrame); 252 EXPECT_EQ(0U, m_requestedClearExceptFrame);
242 253
243 setFrameStatus(ImageFrame::FrameComplete); 254 setFrameStatus(ImageFrame::FrameComplete);
244 255
245 m_generator->decodeAndScale(m_segmentReader.get(), true, 1, imageInfo(), 256 m_generator->decodeAndScale(m_segmentReader.get(), true, 1, imageInfo(),
246 buffer, 100 * 4); 257 buffer, 100 * 4,
258 ImageDecoder::AlphaPremultiplied);
247 EXPECT_EQ(2, m_decodeRequestCount); 259 EXPECT_EQ(2, m_decodeRequestCount);
248 EXPECT_EQ(0, m_decodersDestroyed); 260 EXPECT_EQ(0, m_decodersDestroyed);
249 EXPECT_EQ(1U, m_requestedClearExceptFrame); 261 EXPECT_EQ(1U, m_requestedClearExceptFrame);
250 262
251 setFrameStatus(ImageFrame::FrameComplete); 263 setFrameStatus(ImageFrame::FrameComplete);
252 264
253 // Decoding the last frame of a multi-frame images should trigger clearing 265 // Decoding the last frame of a multi-frame images should trigger clearing
254 // all the frame data, but not destroying the decoder. See comments in 266 // all the frame data, but not destroying the decoder. See comments in
255 // ImageFrameGenerator::tryToResumeDecode(). 267 // ImageFrameGenerator::tryToResumeDecode().
256 m_generator->decodeAndScale(m_segmentReader.get(), true, 2, imageInfo(), 268 m_generator->decodeAndScale(m_segmentReader.get(), true, 2, imageInfo(),
257 buffer, 100 * 4); 269 buffer, 100 * 4,
270 ImageDecoder::AlphaPremultiplied);
258 EXPECT_EQ(3, m_decodeRequestCount); 271 EXPECT_EQ(3, m_decodeRequestCount);
259 EXPECT_EQ(0, m_decodersDestroyed); 272 EXPECT_EQ(0, m_decodersDestroyed);
260 EXPECT_EQ(kNotFound, m_requestedClearExceptFrame); 273 EXPECT_EQ(kNotFound, m_requestedClearExceptFrame);
261 } 274 }
262 275
263 } // namespace blink 276 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698