| 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 |