OLD | NEW |
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 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
63 for (size_t i = 0; i < numFrames; ++i) | 63 for (size_t i = 0; i < numFrames; ++i) |
64 m_frameBufferCache[i].setOriginalFrameRect(IntRect(0, 0, width, height)); | 64 m_frameBufferCache[i].setOriginalFrameRect(IntRect(0, 0, width, height)); |
65 } | 65 } |
66 | 66 |
67 private: | 67 private: |
68 void decodeSize() override {} | 68 void decodeSize() override {} |
69 void decode(size_t index) override {} | 69 void decode(size_t index) override {} |
70 }; | 70 }; |
71 | 71 |
72 TEST(ImageDecoderTest, sizeCalculationMayOverflow) { | 72 TEST(ImageDecoderTest, sizeCalculationMayOverflow) { |
73 std::unique_ptr<TestImageDecoder> decoder(makeUnique<TestImageDecoder>()); | 73 std::unique_ptr<TestImageDecoder> decoder( |
| 74 WTF::makeUnique<TestImageDecoder>()); |
74 EXPECT_FALSE(decoder->setSize(1 << 29, 1)); | 75 EXPECT_FALSE(decoder->setSize(1 << 29, 1)); |
75 EXPECT_FALSE(decoder->setSize(1, 1 << 29)); | 76 EXPECT_FALSE(decoder->setSize(1, 1 << 29)); |
76 EXPECT_FALSE(decoder->setSize(1 << 15, 1 << 15)); | 77 EXPECT_FALSE(decoder->setSize(1 << 15, 1 << 15)); |
77 EXPECT_TRUE(decoder->setSize(1 << 28, 1)); | 78 EXPECT_TRUE(decoder->setSize(1 << 28, 1)); |
78 EXPECT_TRUE(decoder->setSize(1, 1 << 28)); | 79 EXPECT_TRUE(decoder->setSize(1, 1 << 28)); |
79 EXPECT_TRUE(decoder->setSize(1 << 14, 1 << 14)); | 80 EXPECT_TRUE(decoder->setSize(1 << 14, 1 << 14)); |
80 } | 81 } |
81 | 82 |
82 TEST(ImageDecoderTest, requiredPreviousFrameIndex) { | 83 TEST(ImageDecoderTest, requiredPreviousFrameIndex) { |
83 std::unique_ptr<TestImageDecoder> decoder(makeUnique<TestImageDecoder>()); | 84 std::unique_ptr<TestImageDecoder> decoder( |
| 85 WTF::makeUnique<TestImageDecoder>()); |
84 decoder->initFrames(6); | 86 decoder->initFrames(6); |
85 Vector<ImageFrame, 1>& frameBuffers = decoder->frameBufferCache(); | 87 Vector<ImageFrame, 1>& frameBuffers = decoder->frameBufferCache(); |
86 | 88 |
87 frameBuffers[1].setDisposalMethod(ImageFrame::DisposeKeep); | 89 frameBuffers[1].setDisposalMethod(ImageFrame::DisposeKeep); |
88 frameBuffers[2].setDisposalMethod(ImageFrame::DisposeOverwritePrevious); | 90 frameBuffers[2].setDisposalMethod(ImageFrame::DisposeOverwritePrevious); |
89 frameBuffers[3].setDisposalMethod(ImageFrame::DisposeOverwritePrevious); | 91 frameBuffers[3].setDisposalMethod(ImageFrame::DisposeOverwritePrevious); |
90 frameBuffers[4].setDisposalMethod(ImageFrame::DisposeKeep); | 92 frameBuffers[4].setDisposalMethod(ImageFrame::DisposeKeep); |
91 | 93 |
92 decoder->resetRequiredPreviousFrames(); | 94 decoder->resetRequiredPreviousFrames(); |
93 | 95 |
94 // The first frame doesn't require any previous frame. | 96 // The first frame doesn't require any previous frame. |
95 EXPECT_EQ(kNotFound, frameBuffers[0].requiredPreviousFrameIndex()); | 97 EXPECT_EQ(kNotFound, frameBuffers[0].requiredPreviousFrameIndex()); |
96 // The previous DisposeNotSpecified frame is required. | 98 // The previous DisposeNotSpecified frame is required. |
97 EXPECT_EQ(0u, frameBuffers[1].requiredPreviousFrameIndex()); | 99 EXPECT_EQ(0u, frameBuffers[1].requiredPreviousFrameIndex()); |
98 // DisposeKeep is treated as DisposeNotSpecified. | 100 // DisposeKeep is treated as DisposeNotSpecified. |
99 EXPECT_EQ(1u, frameBuffers[2].requiredPreviousFrameIndex()); | 101 EXPECT_EQ(1u, frameBuffers[2].requiredPreviousFrameIndex()); |
100 // Previous DisposeOverwritePrevious frames are skipped. | 102 // Previous DisposeOverwritePrevious frames are skipped. |
101 EXPECT_EQ(1u, frameBuffers[3].requiredPreviousFrameIndex()); | 103 EXPECT_EQ(1u, frameBuffers[3].requiredPreviousFrameIndex()); |
102 EXPECT_EQ(1u, frameBuffers[4].requiredPreviousFrameIndex()); | 104 EXPECT_EQ(1u, frameBuffers[4].requiredPreviousFrameIndex()); |
103 EXPECT_EQ(4u, frameBuffers[5].requiredPreviousFrameIndex()); | 105 EXPECT_EQ(4u, frameBuffers[5].requiredPreviousFrameIndex()); |
104 } | 106 } |
105 | 107 |
106 TEST(ImageDecoderTest, requiredPreviousFrameIndexDisposeOverwriteBgcolor) { | 108 TEST(ImageDecoderTest, requiredPreviousFrameIndexDisposeOverwriteBgcolor) { |
107 std::unique_ptr<TestImageDecoder> decoder(makeUnique<TestImageDecoder>()); | 109 std::unique_ptr<TestImageDecoder> decoder( |
| 110 WTF::makeUnique<TestImageDecoder>()); |
108 decoder->initFrames(3); | 111 decoder->initFrames(3); |
109 Vector<ImageFrame, 1>& frameBuffers = decoder->frameBufferCache(); | 112 Vector<ImageFrame, 1>& frameBuffers = decoder->frameBufferCache(); |
110 | 113 |
111 // Fully covering DisposeOverwriteBgcolor previous frame resets the starting | 114 // Fully covering DisposeOverwriteBgcolor previous frame resets the starting |
112 // state. | 115 // state. |
113 frameBuffers[1].setDisposalMethod(ImageFrame::DisposeOverwriteBgcolor); | 116 frameBuffers[1].setDisposalMethod(ImageFrame::DisposeOverwriteBgcolor); |
114 decoder->resetRequiredPreviousFrames(); | 117 decoder->resetRequiredPreviousFrames(); |
115 EXPECT_EQ(kNotFound, frameBuffers[2].requiredPreviousFrameIndex()); | 118 EXPECT_EQ(kNotFound, frameBuffers[2].requiredPreviousFrameIndex()); |
116 | 119 |
117 // Partially covering DisposeOverwriteBgcolor previous frame is required by | 120 // Partially covering DisposeOverwriteBgcolor previous frame is required by |
118 // this frame. | 121 // this frame. |
119 frameBuffers[1].setOriginalFrameRect(IntRect(50, 50, 50, 50)); | 122 frameBuffers[1].setOriginalFrameRect(IntRect(50, 50, 50, 50)); |
120 decoder->resetRequiredPreviousFrames(); | 123 decoder->resetRequiredPreviousFrames(); |
121 EXPECT_EQ(1u, frameBuffers[2].requiredPreviousFrameIndex()); | 124 EXPECT_EQ(1u, frameBuffers[2].requiredPreviousFrameIndex()); |
122 } | 125 } |
123 | 126 |
124 TEST(ImageDecoderTest, requiredPreviousFrameIndexForFrame1) { | 127 TEST(ImageDecoderTest, requiredPreviousFrameIndexForFrame1) { |
125 std::unique_ptr<TestImageDecoder> decoder(makeUnique<TestImageDecoder>()); | 128 std::unique_ptr<TestImageDecoder> decoder( |
| 129 WTF::makeUnique<TestImageDecoder>()); |
126 decoder->initFrames(2); | 130 decoder->initFrames(2); |
127 Vector<ImageFrame, 1>& frameBuffers = decoder->frameBufferCache(); | 131 Vector<ImageFrame, 1>& frameBuffers = decoder->frameBufferCache(); |
128 | 132 |
129 decoder->resetRequiredPreviousFrames(); | 133 decoder->resetRequiredPreviousFrames(); |
130 EXPECT_EQ(0u, frameBuffers[1].requiredPreviousFrameIndex()); | 134 EXPECT_EQ(0u, frameBuffers[1].requiredPreviousFrameIndex()); |
131 | 135 |
132 // The first frame with DisposeOverwritePrevious or DisposeOverwriteBgcolor | 136 // The first frame with DisposeOverwritePrevious or DisposeOverwriteBgcolor |
133 // resets the starting state. | 137 // resets the starting state. |
134 frameBuffers[0].setDisposalMethod(ImageFrame::DisposeOverwritePrevious); | 138 frameBuffers[0].setDisposalMethod(ImageFrame::DisposeOverwritePrevious); |
135 decoder->resetRequiredPreviousFrames(); | 139 decoder->resetRequiredPreviousFrames(); |
136 EXPECT_EQ(kNotFound, frameBuffers[1].requiredPreviousFrameIndex()); | 140 EXPECT_EQ(kNotFound, frameBuffers[1].requiredPreviousFrameIndex()); |
137 frameBuffers[0].setDisposalMethod(ImageFrame::DisposeOverwriteBgcolor); | 141 frameBuffers[0].setDisposalMethod(ImageFrame::DisposeOverwriteBgcolor); |
138 decoder->resetRequiredPreviousFrames(); | 142 decoder->resetRequiredPreviousFrames(); |
139 EXPECT_EQ(kNotFound, frameBuffers[1].requiredPreviousFrameIndex()); | 143 EXPECT_EQ(kNotFound, frameBuffers[1].requiredPreviousFrameIndex()); |
140 | 144 |
141 // ... even if it partially covers. | 145 // ... even if it partially covers. |
142 frameBuffers[0].setOriginalFrameRect(IntRect(50, 50, 50, 50)); | 146 frameBuffers[0].setOriginalFrameRect(IntRect(50, 50, 50, 50)); |
143 | 147 |
144 frameBuffers[0].setDisposalMethod(ImageFrame::DisposeOverwritePrevious); | 148 frameBuffers[0].setDisposalMethod(ImageFrame::DisposeOverwritePrevious); |
145 decoder->resetRequiredPreviousFrames(); | 149 decoder->resetRequiredPreviousFrames(); |
146 EXPECT_EQ(kNotFound, frameBuffers[1].requiredPreviousFrameIndex()); | 150 EXPECT_EQ(kNotFound, frameBuffers[1].requiredPreviousFrameIndex()); |
147 frameBuffers[0].setDisposalMethod(ImageFrame::DisposeOverwriteBgcolor); | 151 frameBuffers[0].setDisposalMethod(ImageFrame::DisposeOverwriteBgcolor); |
148 decoder->resetRequiredPreviousFrames(); | 152 decoder->resetRequiredPreviousFrames(); |
149 EXPECT_EQ(kNotFound, frameBuffers[1].requiredPreviousFrameIndex()); | 153 EXPECT_EQ(kNotFound, frameBuffers[1].requiredPreviousFrameIndex()); |
150 } | 154 } |
151 | 155 |
152 TEST(ImageDecoderTest, requiredPreviousFrameIndexBlendAtopBgcolor) { | 156 TEST(ImageDecoderTest, requiredPreviousFrameIndexBlendAtopBgcolor) { |
153 std::unique_ptr<TestImageDecoder> decoder(makeUnique<TestImageDecoder>()); | 157 std::unique_ptr<TestImageDecoder> decoder( |
| 158 WTF::makeUnique<TestImageDecoder>()); |
154 decoder->initFrames(3); | 159 decoder->initFrames(3); |
155 Vector<ImageFrame, 1>& frameBuffers = decoder->frameBufferCache(); | 160 Vector<ImageFrame, 1>& frameBuffers = decoder->frameBufferCache(); |
156 | 161 |
157 frameBuffers[1].setOriginalFrameRect(IntRect(25, 25, 50, 50)); | 162 frameBuffers[1].setOriginalFrameRect(IntRect(25, 25, 50, 50)); |
158 frameBuffers[2].setAlphaBlendSource(ImageFrame::BlendAtopBgcolor); | 163 frameBuffers[2].setAlphaBlendSource(ImageFrame::BlendAtopBgcolor); |
159 | 164 |
160 // A full frame with 'blending method == BlendAtopBgcolor' doesn't depend on | 165 // A full frame with 'blending method == BlendAtopBgcolor' doesn't depend on |
161 // any prior frames. | 166 // any prior frames. |
162 for (int disposeMethod = ImageFrame::DisposeNotSpecified; | 167 for (int disposeMethod = ImageFrame::DisposeNotSpecified; |
163 disposeMethod <= ImageFrame::DisposeOverwritePrevious; ++disposeMethod) { | 168 disposeMethod <= ImageFrame::DisposeOverwritePrevious; ++disposeMethod) { |
164 frameBuffers[1].setDisposalMethod( | 169 frameBuffers[1].setDisposalMethod( |
165 static_cast<ImageFrame::DisposalMethod>(disposeMethod)); | 170 static_cast<ImageFrame::DisposalMethod>(disposeMethod)); |
166 decoder->resetRequiredPreviousFrames(); | 171 decoder->resetRequiredPreviousFrames(); |
167 EXPECT_EQ(kNotFound, frameBuffers[2].requiredPreviousFrameIndex()); | 172 EXPECT_EQ(kNotFound, frameBuffers[2].requiredPreviousFrameIndex()); |
168 } | 173 } |
169 | 174 |
170 // A non-full frame with 'blending method == BlendAtopBgcolor' does depend on | 175 // A non-full frame with 'blending method == BlendAtopBgcolor' does depend on |
171 // a prior frame. | 176 // a prior frame. |
172 frameBuffers[2].setOriginalFrameRect(IntRect(50, 50, 50, 50)); | 177 frameBuffers[2].setOriginalFrameRect(IntRect(50, 50, 50, 50)); |
173 for (int disposeMethod = ImageFrame::DisposeNotSpecified; | 178 for (int disposeMethod = ImageFrame::DisposeNotSpecified; |
174 disposeMethod <= ImageFrame::DisposeOverwritePrevious; ++disposeMethod) { | 179 disposeMethod <= ImageFrame::DisposeOverwritePrevious; ++disposeMethod) { |
175 frameBuffers[1].setDisposalMethod( | 180 frameBuffers[1].setDisposalMethod( |
176 static_cast<ImageFrame::DisposalMethod>(disposeMethod)); | 181 static_cast<ImageFrame::DisposalMethod>(disposeMethod)); |
177 decoder->resetRequiredPreviousFrames(); | 182 decoder->resetRequiredPreviousFrames(); |
178 EXPECT_NE(kNotFound, frameBuffers[2].requiredPreviousFrameIndex()); | 183 EXPECT_NE(kNotFound, frameBuffers[2].requiredPreviousFrameIndex()); |
179 } | 184 } |
180 } | 185 } |
181 | 186 |
182 TEST(ImageDecoderTest, requiredPreviousFrameIndexKnownOpaque) { | 187 TEST(ImageDecoderTest, requiredPreviousFrameIndexKnownOpaque) { |
183 std::unique_ptr<TestImageDecoder> decoder(makeUnique<TestImageDecoder>()); | 188 std::unique_ptr<TestImageDecoder> decoder( |
| 189 WTF::makeUnique<TestImageDecoder>()); |
184 decoder->initFrames(3); | 190 decoder->initFrames(3); |
185 Vector<ImageFrame, 1>& frameBuffers = decoder->frameBufferCache(); | 191 Vector<ImageFrame, 1>& frameBuffers = decoder->frameBufferCache(); |
186 | 192 |
187 frameBuffers[1].setOriginalFrameRect(IntRect(25, 25, 50, 50)); | 193 frameBuffers[1].setOriginalFrameRect(IntRect(25, 25, 50, 50)); |
188 | 194 |
189 // A full frame that is known to be opaque doesn't depend on any prior frames. | 195 // A full frame that is known to be opaque doesn't depend on any prior frames. |
190 for (int disposeMethod = ImageFrame::DisposeNotSpecified; | 196 for (int disposeMethod = ImageFrame::DisposeNotSpecified; |
191 disposeMethod <= ImageFrame::DisposeOverwritePrevious; ++disposeMethod) { | 197 disposeMethod <= ImageFrame::DisposeOverwritePrevious; ++disposeMethod) { |
192 frameBuffers[1].setDisposalMethod( | 198 frameBuffers[1].setDisposalMethod( |
193 static_cast<ImageFrame::DisposalMethod>(disposeMethod)); | 199 static_cast<ImageFrame::DisposalMethod>(disposeMethod)); |
194 decoder->resetRequiredPreviousFrames(true); | 200 decoder->resetRequiredPreviousFrames(true); |
195 EXPECT_EQ(kNotFound, frameBuffers[2].requiredPreviousFrameIndex()); | 201 EXPECT_EQ(kNotFound, frameBuffers[2].requiredPreviousFrameIndex()); |
196 } | 202 } |
197 | 203 |
198 // A non-full frame that is known to be opaque does depend on a prior frame. | 204 // A non-full frame that is known to be opaque does depend on a prior frame. |
199 frameBuffers[2].setOriginalFrameRect(IntRect(50, 50, 50, 50)); | 205 frameBuffers[2].setOriginalFrameRect(IntRect(50, 50, 50, 50)); |
200 for (int disposeMethod = ImageFrame::DisposeNotSpecified; | 206 for (int disposeMethod = ImageFrame::DisposeNotSpecified; |
201 disposeMethod <= ImageFrame::DisposeOverwritePrevious; ++disposeMethod) { | 207 disposeMethod <= ImageFrame::DisposeOverwritePrevious; ++disposeMethod) { |
202 frameBuffers[1].setDisposalMethod( | 208 frameBuffers[1].setDisposalMethod( |
203 static_cast<ImageFrame::DisposalMethod>(disposeMethod)); | 209 static_cast<ImageFrame::DisposalMethod>(disposeMethod)); |
204 decoder->resetRequiredPreviousFrames(true); | 210 decoder->resetRequiredPreviousFrames(true); |
205 EXPECT_NE(kNotFound, frameBuffers[2].requiredPreviousFrameIndex()); | 211 EXPECT_NE(kNotFound, frameBuffers[2].requiredPreviousFrameIndex()); |
206 } | 212 } |
207 } | 213 } |
208 | 214 |
209 TEST(ImageDecoderTest, clearCacheExceptFrameDoNothing) { | 215 TEST(ImageDecoderTest, clearCacheExceptFrameDoNothing) { |
210 std::unique_ptr<TestImageDecoder> decoder(makeUnique<TestImageDecoder>()); | 216 std::unique_ptr<TestImageDecoder> decoder( |
| 217 WTF::makeUnique<TestImageDecoder>()); |
211 decoder->clearCacheExceptFrame(0); | 218 decoder->clearCacheExceptFrame(0); |
212 | 219 |
213 // This should not crash. | 220 // This should not crash. |
214 decoder->initFrames(20); | 221 decoder->initFrames(20); |
215 decoder->clearCacheExceptFrame(kNotFound); | 222 decoder->clearCacheExceptFrame(kNotFound); |
216 } | 223 } |
217 | 224 |
218 TEST(ImageDecoderTest, clearCacheExceptFrameAll) { | 225 TEST(ImageDecoderTest, clearCacheExceptFrameAll) { |
219 const size_t numFrames = 10; | 226 const size_t numFrames = 10; |
220 std::unique_ptr<TestImageDecoder> decoder(makeUnique<TestImageDecoder>()); | 227 std::unique_ptr<TestImageDecoder> decoder( |
| 228 WTF::makeUnique<TestImageDecoder>()); |
221 decoder->initFrames(numFrames); | 229 decoder->initFrames(numFrames); |
222 Vector<ImageFrame, 1>& frameBuffers = decoder->frameBufferCache(); | 230 Vector<ImageFrame, 1>& frameBuffers = decoder->frameBufferCache(); |
223 for (size_t i = 0; i < numFrames; ++i) | 231 for (size_t i = 0; i < numFrames; ++i) |
224 frameBuffers[i].setStatus(i % 2 ? ImageFrame::FramePartial | 232 frameBuffers[i].setStatus(i % 2 ? ImageFrame::FramePartial |
225 : ImageFrame::FrameComplete); | 233 : ImageFrame::FrameComplete); |
226 | 234 |
227 decoder->clearCacheExceptFrame(kNotFound); | 235 decoder->clearCacheExceptFrame(kNotFound); |
228 | 236 |
229 for (size_t i = 0; i < numFrames; ++i) { | 237 for (size_t i = 0; i < numFrames; ++i) { |
230 SCOPED_TRACE(testing::Message() << i); | 238 SCOPED_TRACE(testing::Message() << i); |
231 EXPECT_EQ(ImageFrame::FrameEmpty, frameBuffers[i].getStatus()); | 239 EXPECT_EQ(ImageFrame::FrameEmpty, frameBuffers[i].getStatus()); |
232 } | 240 } |
233 } | 241 } |
234 | 242 |
235 TEST(ImageDecoderTest, clearCacheExceptFramePreverveClearExceptFrame) { | 243 TEST(ImageDecoderTest, clearCacheExceptFramePreverveClearExceptFrame) { |
236 const size_t numFrames = 10; | 244 const size_t numFrames = 10; |
237 std::unique_ptr<TestImageDecoder> decoder(makeUnique<TestImageDecoder>()); | 245 std::unique_ptr<TestImageDecoder> decoder( |
| 246 WTF::makeUnique<TestImageDecoder>()); |
238 decoder->initFrames(numFrames); | 247 decoder->initFrames(numFrames); |
239 Vector<ImageFrame, 1>& frameBuffers = decoder->frameBufferCache(); | 248 Vector<ImageFrame, 1>& frameBuffers = decoder->frameBufferCache(); |
240 for (size_t i = 0; i < numFrames; ++i) | 249 for (size_t i = 0; i < numFrames; ++i) |
241 frameBuffers[i].setStatus(ImageFrame::FrameComplete); | 250 frameBuffers[i].setStatus(ImageFrame::FrameComplete); |
242 | 251 |
243 decoder->resetRequiredPreviousFrames(); | 252 decoder->resetRequiredPreviousFrames(); |
244 decoder->clearCacheExceptFrame(5); | 253 decoder->clearCacheExceptFrame(5); |
245 for (size_t i = 0; i < numFrames; ++i) { | 254 for (size_t i = 0; i < numFrames; ++i) { |
246 SCOPED_TRACE(testing::Message() << i); | 255 SCOPED_TRACE(testing::Message() << i); |
247 if (i == 5) | 256 if (i == 5) |
248 EXPECT_EQ(ImageFrame::FrameComplete, frameBuffers[i].getStatus()); | 257 EXPECT_EQ(ImageFrame::FrameComplete, frameBuffers[i].getStatus()); |
249 else | 258 else |
250 EXPECT_EQ(ImageFrame::FrameEmpty, frameBuffers[i].getStatus()); | 259 EXPECT_EQ(ImageFrame::FrameEmpty, frameBuffers[i].getStatus()); |
251 } | 260 } |
252 } | 261 } |
253 | 262 |
254 } // namespace blink | 263 } // namespace blink |
OLD | NEW |