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