OLD | NEW |
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 Loading... |
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 |
OLD | NEW |