OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "core/layout/ImageQualityController.h" | 5 #include "core/layout/ImageQualityController.h" |
6 | 6 |
7 #include "core/layout/LayoutImage.h" | 7 #include "core/layout/LayoutImage.h" |
8 #include "core/layout/LayoutTestHelper.h" | 8 #include "core/layout/LayoutTestHelper.h" |
9 #include "platform/graphics/GraphicsContext.h" | 9 #include "platform/graphics/GraphicsContext.h" |
10 #include "platform/graphics/paint/PaintController.h" | 10 #include "platform/graphics/paint/PaintController.h" |
11 #include "testing/gtest/include/gtest/gtest.h" | 11 #include "testing/gtest/include/gtest/gtest.h" |
| 12 #include <memory> |
12 | 13 |
13 namespace blink { | 14 namespace blink { |
14 | 15 |
15 class ImageQualityControllerTest : public RenderingTest { | 16 class ImageQualityControllerTest : public RenderingTest { |
16 protected: | 17 protected: |
17 ImageQualityController* controller() { return m_controller; } | 18 ImageQualityController* controller() { return m_controller; } |
18 | 19 |
19 private: | 20 private: |
20 void SetUp() override | 21 void SetUp() override |
21 { | 22 { |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
163 }; | 164 }; |
164 | 165 |
165 TEST_F(ImageQualityControllerTest, LowQualityFilterForResizingImage) | 166 TEST_F(ImageQualityControllerTest, LowQualityFilterForResizingImage) |
166 { | 167 { |
167 MockTimer* mockTimer = new MockTimer(controller(), &ImageQualityController::
highQualityRepaintTimerFired); | 168 MockTimer* mockTimer = new MockTimer(controller(), &ImageQualityController::
highQualityRepaintTimerFired); |
168 controller()->setTimer(mockTimer); | 169 controller()->setTimer(mockTimer); |
169 setBodyInnerHTML("<img src='myimage'></img>"); | 170 setBodyInnerHTML("<img src='myimage'></img>"); |
170 LayoutImage* img = toLayoutImage(document().body()->firstChild()->layoutObje
ct()); | 171 LayoutImage* img = toLayoutImage(document().body()->firstChild()->layoutObje
ct()); |
171 | 172 |
172 RefPtr<TestImageLowQuality> testImage = adoptRef(new TestImageLowQuality); | 173 RefPtr<TestImageLowQuality> testImage = adoptRef(new TestImageLowQuality); |
173 OwnPtr<PaintController> paintController = PaintController::create(); | 174 std::unique_ptr<PaintController> paintController = PaintController::create()
; |
174 GraphicsContext context(*paintController); | 175 GraphicsContext context(*paintController); |
175 | 176 |
176 // Paint once. This will kick off a timer to see if we resize it during that
timer's execution. | 177 // Paint once. This will kick off a timer to see if we resize it during that
timer's execution. |
177 EXPECT_EQ(InterpolationMedium, controller()->chooseInterpolationQuality(*img
, testImage.get(), testImage.get(), LayoutSize(2, 2))); | 178 EXPECT_EQ(InterpolationMedium, controller()->chooseInterpolationQuality(*img
, testImage.get(), testImage.get(), LayoutSize(2, 2))); |
178 | 179 |
179 // Go into low-quality mode now that the size changed. | 180 // Go into low-quality mode now that the size changed. |
180 EXPECT_EQ(InterpolationLow, controller()->chooseInterpolationQuality(*img, t
estImage.get(), testImage.get(), LayoutSize(3, 3))); | 181 EXPECT_EQ(InterpolationLow, controller()->chooseInterpolationQuality(*img, t
estImage.get(), testImage.get(), LayoutSize(3, 3))); |
181 | 182 |
182 // Stay in low-quality mode since the size changed again. | 183 // Stay in low-quality mode since the size changed again. |
183 EXPECT_EQ(InterpolationLow, controller()->chooseInterpolationQuality(*img, t
estImage.get(), testImage.get(), LayoutSize(4, 4))); | 184 EXPECT_EQ(InterpolationLow, controller()->chooseInterpolationQuality(*img, t
estImage.get(), testImage.get(), LayoutSize(4, 4))); |
184 | 185 |
185 mockTimer->fire(); | 186 mockTimer->fire(); |
186 // The timer fired before painting at another size, so this doesn't count as
animation. Therefore not painting at low quality. | 187 // The timer fired before painting at another size, so this doesn't count as
animation. Therefore not painting at low quality. |
187 EXPECT_EQ(InterpolationMedium, controller()->chooseInterpolationQuality(*img
, testImage.get(), testImage.get(), LayoutSize(4, 4))); | 188 EXPECT_EQ(InterpolationMedium, controller()->chooseInterpolationQuality(*img
, testImage.get(), testImage.get(), LayoutSize(4, 4))); |
188 } | 189 } |
189 | 190 |
190 TEST_F(ImageQualityControllerTest, MediumQualityFilterForNotAnimatedWhileAnother
Animates) | 191 TEST_F(ImageQualityControllerTest, MediumQualityFilterForNotAnimatedWhileAnother
Animates) |
191 { | 192 { |
192 MockTimer* mockTimer = new MockTimer(controller(), &ImageQualityController::
highQualityRepaintTimerFired); | 193 MockTimer* mockTimer = new MockTimer(controller(), &ImageQualityController::
highQualityRepaintTimerFired); |
193 controller()->setTimer(mockTimer); | 194 controller()->setTimer(mockTimer); |
194 setBodyInnerHTML("<img id='myAnimatingImage' src='myimage'></img> <img id='m
yNonAnimatingImage' src='myimage2'></img>"); | 195 setBodyInnerHTML("<img id='myAnimatingImage' src='myimage'></img> <img id='m
yNonAnimatingImage' src='myimage2'></img>"); |
195 LayoutImage* animatingImage = toLayoutImage(document().getElementById("myAni
matingImage")->layoutObject()); | 196 LayoutImage* animatingImage = toLayoutImage(document().getElementById("myAni
matingImage")->layoutObject()); |
196 LayoutImage* nonAnimatingImage = toLayoutImage(document().getElementById("my
NonAnimatingImage")->layoutObject()); | 197 LayoutImage* nonAnimatingImage = toLayoutImage(document().getElementById("my
NonAnimatingImage")->layoutObject()); |
197 | 198 |
198 RefPtr<TestImageLowQuality> testImage = adoptRef(new TestImageLowQuality); | 199 RefPtr<TestImageLowQuality> testImage = adoptRef(new TestImageLowQuality); |
199 OwnPtr<PaintController> paintController = PaintController::create(); | 200 std::unique_ptr<PaintController> paintController = PaintController::create()
; |
200 GraphicsContext context(*paintController); | 201 GraphicsContext context(*paintController); |
201 | 202 |
202 // Paint once. This will kick off a timer to see if we resize it during that
timer's execution. | 203 // Paint once. This will kick off a timer to see if we resize it during that
timer's execution. |
203 EXPECT_EQ(InterpolationMedium, controller()->chooseInterpolationQuality(*ani
matingImage, testImage.get(), testImage.get(), LayoutSize(2, 2))); | 204 EXPECT_EQ(InterpolationMedium, controller()->chooseInterpolationQuality(*ani
matingImage, testImage.get(), testImage.get(), LayoutSize(2, 2))); |
204 | 205 |
205 // Go into low-quality mode now that the size changed. | 206 // Go into low-quality mode now that the size changed. |
206 EXPECT_EQ(InterpolationLow, controller()->chooseInterpolationQuality(*animat
ingImage, testImage.get(), testImage.get(), LayoutSize(3, 3))); | 207 EXPECT_EQ(InterpolationLow, controller()->chooseInterpolationQuality(*animat
ingImage, testImage.get(), testImage.get(), LayoutSize(3, 3))); |
207 | 208 |
208 // The non-animating image receives a medium-quality filter, even though the
other one is animating. | 209 // The non-animating image receives a medium-quality filter, even though the
other one is animating. |
209 EXPECT_EQ(InterpolationMedium, controller()->chooseInterpolationQuality(*non
AnimatingImage, testImage.get(), testImage.get(), LayoutSize(4, 4))); | 210 EXPECT_EQ(InterpolationMedium, controller()->chooseInterpolationQuality(*non
AnimatingImage, testImage.get(), testImage.get(), LayoutSize(4, 4))); |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
267 // This animation is far enough in the future to make the timer restart, sin
ce it is half over. | 268 // This animation is far enough in the future to make the timer restart, sin
ce it is half over. |
268 nextTime = 0.1 + ImageQualityController::cTimerRestartThreshold + 0.01; | 269 nextTime = 0.1 + ImageQualityController::cTimerRestartThreshold + 0.01; |
269 EXPECT_EQ(true, controller()->shouldPaintAtLowQuality(*img, testImage.get(),
testImage.get(), LayoutSize(4, 4), nextTime)); | 270 EXPECT_EQ(true, controller()->shouldPaintAtLowQuality(*img, testImage.get(),
testImage.get(), LayoutSize(4, 4), nextTime)); |
270 // Now the timer has restarted, leading to a larger fire interval. | 271 // Now the timer has restarted, leading to a larger fire interval. |
271 EXPECT_EQ(ImageQualityController::cLowQualityTimeThreshold, mockTimer->nextF
ireInterval()); | 272 EXPECT_EQ(ImageQualityController::cLowQualityTimeThreshold, mockTimer->nextF
ireInterval()); |
272 } | 273 } |
273 | 274 |
274 #endif | 275 #endif |
275 | 276 |
276 } // namespace blink | 277 } // namespace blink |
OLD | NEW |