| 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 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 52 public: | 52 public: |
| 53 virtual void SetUp() override | 53 virtual void SetUp() override |
| 54 { | 54 { |
| 55 ImageDecodingStore::instance()->setCacheLimitInBytes(1024 * 1024); | 55 ImageDecodingStore::instance()->setCacheLimitInBytes(1024 * 1024); |
| 56 m_data = SharedBuffer::create(); | 56 m_data = SharedBuffer::create(); |
| 57 m_generator = ImageFrameGenerator::create(fullSize(), m_data, false); | 57 m_generator = ImageFrameGenerator::create(fullSize(), m_data, false); |
| 58 useMockImageDecoderFactory(); | 58 useMockImageDecoderFactory(); |
| 59 m_decodersDestroyed = 0; | 59 m_decodersDestroyed = 0; |
| 60 m_frameBufferRequestCount = 0; | 60 m_frameBufferRequestCount = 0; |
| 61 m_status = ImageFrame::FrameEmpty; | 61 m_status = ImageFrame::FrameEmpty; |
| 62 m_frameCount = 1; |
| 62 } | 63 } |
| 63 | 64 |
| 64 virtual void TearDown() override | 65 virtual void TearDown() override |
| 65 { | 66 { |
| 66 ImageDecodingStore::instance()->clear(); | 67 ImageDecodingStore::instance()->clear(); |
| 67 } | 68 } |
| 68 | 69 |
| 69 virtual void decoderBeingDestroyed() override | 70 virtual void decoderBeingDestroyed() override |
| 70 { | 71 { |
| 71 ++m_decodersDestroyed; | 72 ++m_decodersDestroyed; |
| 72 } | 73 } |
| 73 | 74 |
| 74 virtual void frameBufferRequested() override | 75 virtual void frameBufferRequested() override |
| 75 { | 76 { |
| 76 ++m_frameBufferRequestCount; | 77 ++m_frameBufferRequestCount; |
| 77 } | 78 } |
| 78 | 79 |
| 79 virtual ImageFrame::Status status() override | 80 virtual ImageFrame::Status status() override |
| 80 { | 81 { |
| 81 ImageFrame::Status currentStatus = m_status; | 82 ImageFrame::Status currentStatus = m_status; |
| 82 m_status = m_nextFrameStatus; | 83 m_status = m_nextFrameStatus; |
| 83 return currentStatus; | 84 return currentStatus; |
| 84 } | 85 } |
| 85 | 86 |
| 86 virtual size_t frameCount() override { return 1; } | 87 virtual size_t frameCount() override { return m_frameCount; } |
| 87 virtual int repetitionCount() const override { return cAnimationNone; } | 88 virtual int repetitionCount() const override { return m_frameCount == 1 ? cA
nimationNone:cAnimationLoopOnce; } |
| 88 virtual float frameDuration() const override { return 0; } | 89 virtual float frameDuration() const override { return 0; } |
| 89 | 90 |
| 90 protected: | 91 protected: |
| 91 void useMockImageDecoderFactory() | 92 void useMockImageDecoderFactory() |
| 92 { | 93 { |
| 93 m_generator->setImageDecoderFactory(MockImageDecoderFactory::create(this
, fullSize())); | 94 m_generator->setImageDecoderFactory(MockImageDecoderFactory::create(this
, fullSize())); |
| 94 } | 95 } |
| 95 | 96 |
| 96 void addNewData() | 97 void addNewData() |
| 97 { | 98 { |
| 98 m_data->append("g", 1); | 99 m_data->append("g", 1); |
| 99 m_generator->setData(m_data, false); | 100 m_generator->setData(m_data, false); |
| 100 } | 101 } |
| 101 | 102 |
| 102 void setFrameStatus(ImageFrame::Status status) { m_status = m_nextFrameStat
us = status; } | 103 void setFrameStatus(ImageFrame::Status status) { m_status = m_nextFrameStat
us = status; } |
| 103 void setNextFrameStatus(ImageFrame::Status status) { m_nextFrameStatus = st
atus; } | 104 void setNextFrameStatus(ImageFrame::Status status) { m_nextFrameStatus = st
atus; } |
| 105 void setFrameCount(size_t count) |
| 106 { |
| 107 m_frameCount = count; |
| 108 if (count > 1) { |
| 109 m_generator.clear(); |
| 110 m_generator = ImageFrameGenerator::create(fullSize(), m_data, true,
true); |
| 111 useMockImageDecoderFactory(); |
| 112 } |
| 113 } |
| 104 | 114 |
| 105 RefPtr<SharedBuffer> m_data; | 115 RefPtr<SharedBuffer> m_data; |
| 106 RefPtr<ImageFrameGenerator> m_generator; | 116 RefPtr<ImageFrameGenerator> m_generator; |
| 107 int m_decodersDestroyed; | 117 int m_decodersDestroyed; |
| 108 int m_frameBufferRequestCount; | 118 int m_frameBufferRequestCount; |
| 109 ImageFrame::Status m_status; | 119 ImageFrame::Status m_status; |
| 110 ImageFrame::Status m_nextFrameStatus; | 120 ImageFrame::Status m_nextFrameStatus; |
| 121 size_t m_frameCount; |
| 111 }; | 122 }; |
| 112 | 123 |
| 113 TEST_F(ImageFrameGeneratorTest, incompleteDecode) | 124 TEST_F(ImageFrameGeneratorTest, incompleteDecode) |
| 114 { | 125 { |
| 115 setFrameStatus(ImageFrame::FramePartial); | 126 setFrameStatus(ImageFrame::FramePartial); |
| 116 | 127 |
| 117 char buffer[100 * 100 * 4]; | 128 char buffer[100 * 100 * 4]; |
| 118 m_generator->decodeAndScale(imageInfo(), 0, buffer, 100 * 4); | 129 m_generator->decodeAndScale(imageInfo(), 0, buffer, 100 * 4); |
| 119 EXPECT_EQ(1, m_frameBufferRequestCount); | 130 EXPECT_EQ(1, m_frameBufferRequestCount); |
| 120 | 131 |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 172 // Decoder created again. | 183 // Decoder created again. |
| 173 m_generator->decodeAndScale(imageInfo(), 0, buffer, 100 * 4); | 184 m_generator->decodeAndScale(imageInfo(), 0, buffer, 100 * 4); |
| 174 EXPECT_EQ(3, m_frameBufferRequestCount); | 185 EXPECT_EQ(3, m_frameBufferRequestCount); |
| 175 } | 186 } |
| 176 | 187 |
| 177 TEST_F(ImageFrameGeneratorTest, frameHasAlpha) | 188 TEST_F(ImageFrameGeneratorTest, frameHasAlpha) |
| 178 { | 189 { |
| 179 setFrameStatus(ImageFrame::FramePartial); | 190 setFrameStatus(ImageFrame::FramePartial); |
| 180 | 191 |
| 181 char buffer[100 * 100 * 4]; | 192 char buffer[100 * 100 * 4]; |
| 182 m_generator->decodeAndScale(imageInfo(), 1, buffer, 100 * 4); | 193 m_generator->decodeAndScale(imageInfo(), 0, buffer, 100 * 4); |
| 183 EXPECT_TRUE(m_generator->hasAlpha(1)); | 194 EXPECT_TRUE(m_generator->hasAlpha(0)); |
| 184 EXPECT_EQ(1, m_frameBufferRequestCount); | 195 EXPECT_EQ(1, m_frameBufferRequestCount); |
| 185 | 196 |
| 186 ImageDecoder* tempDecoder = 0; | 197 ImageDecoder* tempDecoder = 0; |
| 187 EXPECT_TRUE(ImageDecodingStore::instance()->lockDecoder(m_generator.get(), f
ullSize(), &tempDecoder)); | 198 EXPECT_TRUE(ImageDecodingStore::instance()->lockDecoder(m_generator.get(), f
ullSize(), &tempDecoder)); |
| 188 ASSERT_TRUE(tempDecoder); | 199 ASSERT_TRUE(tempDecoder); |
| 189 static_cast<MockImageDecoder*>(tempDecoder)->setFrameHasAlpha(false); | 200 static_cast<MockImageDecoder*>(tempDecoder)->setFrameHasAlpha(false); |
| 190 ImageDecodingStore::instance()->unlockDecoder(m_generator.get(), tempDecoder
); | 201 ImageDecodingStore::instance()->unlockDecoder(m_generator.get(), tempDecoder
); |
| 191 | 202 |
| 192 setFrameStatus(ImageFrame::FrameComplete); | 203 setFrameStatus(ImageFrame::FrameComplete); |
| 204 m_generator->decodeAndScale(imageInfo(), 0, buffer, 100 * 4); |
| 205 EXPECT_EQ(2, m_frameBufferRequestCount); |
| 206 EXPECT_FALSE(m_generator->hasAlpha(0)); |
| 207 } |
| 208 |
| 209 TEST_F(ImageFrameGeneratorTest, removeMultiFrameDecoder) |
| 210 { |
| 211 setFrameCount(3); |
| 212 setFrameStatus(ImageFrame::FrameComplete); |
| 213 |
| 214 char buffer[100 * 100 * 4]; |
| 215 m_generator->decodeAndScale(imageInfo(), 0, buffer, 100 * 4); |
| 216 EXPECT_EQ(1, m_frameBufferRequestCount); |
| 217 EXPECT_EQ(0, m_decodersDestroyed); |
| 218 |
| 219 setFrameStatus(ImageFrame::FrameComplete); |
| 220 |
| 193 m_generator->decodeAndScale(imageInfo(), 1, buffer, 100 * 4); | 221 m_generator->decodeAndScale(imageInfo(), 1, buffer, 100 * 4); |
| 194 EXPECT_EQ(2, m_frameBufferRequestCount); | 222 EXPECT_EQ(2, m_frameBufferRequestCount); |
| 195 EXPECT_FALSE(m_generator->hasAlpha(1)); | 223 EXPECT_EQ(0, m_decodersDestroyed); |
| 224 |
| 225 setFrameStatus(ImageFrame::FrameComplete); |
| 226 |
| 227 // Multi frame decoder should be removed. |
| 228 m_generator->decodeAndScale(imageInfo(), 2, buffer, 100 * 4); |
| 229 EXPECT_EQ(3, m_frameBufferRequestCount); |
| 230 EXPECT_EQ(1, m_decodersDestroyed); |
| 196 } | 231 } |
| 197 | 232 |
| 198 } // namespace blink | 233 } // namespace blink |
| OLD | NEW |