| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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 "ui/snapshot/snapshot.h" | 5 #include "ui/snapshot/snapshot.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/test/test_simple_task_runner.h" | 8 #include "base/test/test_simple_task_runner.h" |
| 9 #include "testing/gtest/include/gtest/gtest.h" | 9 #include "testing/gtest/include/gtest/gtest.h" |
| 10 #include "ui/aura/root_window.h" | 10 #include "ui/aura/root_window.h" |
| 11 #include "ui/aura/test/aura_test_helper.h" | 11 #include "ui/aura/test/aura_test_helper.h" |
| 12 #include "ui/aura/test/test_screen.h" | 12 #include "ui/aura/test/test_screen.h" |
| 13 #include "ui/aura/test/test_window_delegate.h" | 13 #include "ui/aura/test/test_window_delegate.h" |
| 14 #include "ui/aura/test/test_windows.h" | 14 #include "ui/aura/test/test_windows.h" |
| 15 #include "ui/aura/window.h" | 15 #include "ui/aura/window.h" |
| 16 #include "ui/compositor/layer.h" | 16 #include "ui/compositor/layer.h" |
| 17 #include "ui/gfx/canvas.h" | 17 #include "ui/gfx/canvas.h" |
| 18 #include "ui/gfx/gfx_paths.h" | 18 #include "ui/gfx/gfx_paths.h" |
| 19 #include "ui/gfx/image/image.h" | 19 #include "ui/gfx/image/image.h" |
| 20 #include "ui/gfx/rect.h" | 20 #include "ui/gfx/rect.h" |
| 21 #include "ui/gfx/size_conversions.h" | 21 #include "ui/gfx/size_conversions.h" |
| 22 #include "ui/gfx/transform.h" | 22 #include "ui/gfx/transform.h" |
| 23 #include "ui/gl/gl_implementation.h" | 23 #include "ui/gl/gl_implementation.h" |
| 24 | 24 |
| 25 namespace ui { | 25 namespace ui { |
| 26 namespace { | 26 namespace { |
| 27 const SkColor kPaintColor = SK_ColorRED; | 27 |
| 28 SkColor GetExpectedColorForPoint(int x, int y) { |
| 29 return SkColorSetRGB(std::min(x, 255), std::min(y, 255), 0); |
| 30 } |
| 28 | 31 |
| 29 // Paint simple rectangle on the specified aura window. | 32 // Paint simple rectangle on the specified aura window. |
| 30 class TestPaintingWindowDelegate : public aura::test::TestWindowDelegate { | 33 class TestPaintingWindowDelegate : public aura::test::TestWindowDelegate { |
| 31 public: | 34 public: |
| 32 explicit TestPaintingWindowDelegate(const gfx::Size& window_size) | 35 explicit TestPaintingWindowDelegate(const gfx::Size& window_size) |
| 33 : window_size_(window_size) { | 36 : window_size_(window_size) { |
| 34 } | 37 } |
| 35 | 38 |
| 36 virtual ~TestPaintingWindowDelegate() { | 39 virtual ~TestPaintingWindowDelegate() { |
| 37 } | 40 } |
| 38 | 41 |
| 39 virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE { | 42 virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE { |
| 40 canvas->FillRect(gfx::Rect(window_size_), kPaintColor); | 43 for (int y = 0; y < window_size_.height(); ++y) { |
| 44 for (int x = 0; x < window_size_.width(); ++x) |
| 45 canvas->FillRect(gfx::Rect(x, y, 1, 1), GetExpectedColorForPoint(x, y)); |
| 46 } |
| 41 } | 47 } |
| 42 | 48 |
| 43 private: | 49 private: |
| 44 gfx::Size window_size_; | 50 gfx::Size window_size_; |
| 45 | 51 |
| 46 DISALLOW_COPY_AND_ASSIGN(TestPaintingWindowDelegate); | 52 DISALLOW_COPY_AND_ASSIGN(TestPaintingWindowDelegate); |
| 47 }; | 53 }; |
| 48 | 54 |
| 49 size_t GetFailedPixelsCount(const gfx::Image& image) { | 55 size_t GetFailedPixelsCountWithScaleFactor(const gfx::Image& image, |
| 56 int scale_factor) { |
| 50 const SkBitmap* bitmap = image.ToSkBitmap(); | 57 const SkBitmap* bitmap = image.ToSkBitmap(); |
| 51 uint32* bitmap_data = reinterpret_cast<uint32*>( | 58 uint32* bitmap_data = reinterpret_cast<uint32*>( |
| 52 bitmap->pixelRef()->pixels()); | 59 bitmap->pixelRef()->pixels()); |
| 53 size_t result = 0; | 60 size_t result = 0; |
| 54 for (int i = 0; i < bitmap->width() * bitmap->height(); ++i) { | 61 for (int y = 0; y < bitmap->height(); y += scale_factor) { |
| 55 if (static_cast<SkColor>(bitmap_data[i]) != kPaintColor) | 62 for (int x = 0; x < bitmap->width(); x += scale_factor) { |
| 56 ++result; | 63 if (static_cast<SkColor>(bitmap_data[x + y * bitmap->width()]) != |
| 64 GetExpectedColorForPoint(x / scale_factor, y / scale_factor)) { |
| 65 ++result; |
| 66 } |
| 67 } |
| 57 } | 68 } |
| 58 return result; | 69 return result; |
| 59 } | 70 } |
| 60 | 71 |
| 72 size_t GetFailedPixelsCount(const gfx::Image& image) { |
| 73 return GetFailedPixelsCountWithScaleFactor(image, 1); |
| 74 } |
| 75 |
| 61 } // namespace | 76 } // namespace |
| 62 | 77 |
| 63 class SnapshotAuraTest : public testing::Test { | 78 class SnapshotAuraTest : public testing::Test { |
| 64 public: | 79 public: |
| 65 SnapshotAuraTest() {} | 80 SnapshotAuraTest() {} |
| 66 virtual ~SnapshotAuraTest() {} | 81 virtual ~SnapshotAuraTest() {} |
| 67 | 82 |
| 68 virtual void SetUp() OVERRIDE { | 83 virtual void SetUp() OVERRIDE { |
| 69 testing::Test::SetUp(); | 84 testing::Test::SetUp(); |
| 70 helper_.reset( | 85 helper_.reset( |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 168 snapshot.Size().ToString()); | 183 snapshot.Size().ToString()); |
| 169 EXPECT_EQ(0u, GetFailedPixelsCount(snapshot)); | 184 EXPECT_EQ(0u, GetFailedPixelsCount(snapshot)); |
| 170 } | 185 } |
| 171 | 186 |
| 172 TEST_F(SnapshotAuraTest, PartialBounds) { | 187 TEST_F(SnapshotAuraTest, PartialBounds) { |
| 173 gfx::Rect test_bounds(100, 100, 300, 200); | 188 gfx::Rect test_bounds(100, 100, 300, 200); |
| 174 SetupTestWindow(test_bounds); | 189 SetupTestWindow(test_bounds); |
| 175 WaitForDraw(); | 190 WaitForDraw(); |
| 176 | 191 |
| 177 gfx::Image snapshot = GrabSnapshotForTestWindow(); | 192 gfx::Image snapshot = GrabSnapshotForTestWindow(); |
| 178 EXPECT_EQ(test_bounds.size().ToString(), | 193 EXPECT_EQ(test_bounds.size().ToString(), snapshot.Size().ToString()); |
| 179 snapshot.Size().ToString()); | |
| 180 EXPECT_EQ(0u, GetFailedPixelsCount(snapshot)); | 194 EXPECT_EQ(0u, GetFailedPixelsCount(snapshot)); |
| 181 } | 195 } |
| 182 | 196 |
| 183 TEST_F(SnapshotAuraTest, Rotated) { | 197 TEST_F(SnapshotAuraTest, Rotated) { |
| 184 test_screen()->SetDisplayRotation(gfx::Display::ROTATE_90); | 198 test_screen()->SetDisplayRotation(gfx::Display::ROTATE_90); |
| 185 | 199 |
| 186 gfx::Rect test_bounds(100, 100, 300, 200); | 200 gfx::Rect test_bounds(100, 100, 300, 200); |
| 187 SetupTestWindow(test_bounds); | 201 SetupTestWindow(test_bounds); |
| 188 WaitForDraw(); | 202 WaitForDraw(); |
| 189 | 203 |
| 190 gfx::Image snapshot = GrabSnapshotForTestWindow(); | 204 gfx::Image snapshot = GrabSnapshotForTestWindow(); |
| 191 EXPECT_EQ(test_bounds.size().ToString(), | 205 EXPECT_EQ(test_bounds.size().ToString(), snapshot.Size().ToString()); |
| 192 snapshot.Size().ToString()); | |
| 193 EXPECT_EQ(0u, GetFailedPixelsCount(snapshot)); | 206 EXPECT_EQ(0u, GetFailedPixelsCount(snapshot)); |
| 194 } | 207 } |
| 195 | 208 |
| 196 TEST_F(SnapshotAuraTest, UIScale) { | 209 TEST_F(SnapshotAuraTest, UIScale) { |
| 197 const float kUIScale = 1.25f; | 210 const float kUIScale = 1.25f; |
| 198 test_screen()->SetUIScale(kUIScale); | 211 test_screen()->SetUIScale(kUIScale); |
| 199 | 212 |
| 200 gfx::Rect test_bounds(100, 100, 300, 200); | 213 gfx::Rect test_bounds(100, 100, 300, 200); |
| 201 SetupTestWindow(test_bounds); | 214 SetupTestWindow(test_bounds); |
| 202 WaitForDraw(); | 215 WaitForDraw(); |
| 203 | 216 |
| 204 // Snapshot always captures the physical pixels. | 217 // Snapshot always captures the physical pixels. |
| 205 gfx::SizeF snapshot_size(test_bounds.size()); | 218 gfx::SizeF snapshot_size(test_bounds.size()); |
| 206 snapshot_size.Scale(1.0f / kUIScale); | |
| 207 | 219 |
| 208 gfx::Image snapshot = GrabSnapshotForTestWindow(); | 220 gfx::Image snapshot = GrabSnapshotForTestWindow(); |
| 209 EXPECT_EQ(gfx::ToRoundedSize(snapshot_size).ToString(), | 221 EXPECT_EQ(gfx::ToRoundedSize(snapshot_size).ToString(), |
| 210 snapshot.Size().ToString()); | 222 snapshot.Size().ToString()); |
| 211 EXPECT_EQ(0u, GetFailedPixelsCount(snapshot)); | 223 EXPECT_EQ(0u, GetFailedPixelsCount(snapshot)); |
| 212 } | 224 } |
| 213 | 225 |
| 214 TEST_F(SnapshotAuraTest, DeviceScaleFactor) { | 226 TEST_F(SnapshotAuraTest, DeviceScaleFactor) { |
| 215 test_screen()->SetDeviceScaleFactor(2.0f); | 227 test_screen()->SetDeviceScaleFactor(2.0f); |
| 216 | 228 |
| 217 gfx::Rect test_bounds(100, 100, 150, 100); | 229 gfx::Rect test_bounds(100, 100, 150, 100); |
| 218 SetupTestWindow(test_bounds); | 230 SetupTestWindow(test_bounds); |
| 219 WaitForDraw(); | 231 WaitForDraw(); |
| 220 | 232 |
| 221 // Snapshot always captures the physical pixels. | 233 // Snapshot always captures the physical pixels. |
| 222 gfx::SizeF snapshot_size(test_bounds.size()); | 234 gfx::SizeF snapshot_size(test_bounds.size()); |
| 223 snapshot_size.Scale(2.0f); | 235 snapshot_size.Scale(2.0f); |
| 224 | 236 |
| 225 gfx::Image snapshot = GrabSnapshotForTestWindow(); | 237 gfx::Image snapshot = GrabSnapshotForTestWindow(); |
| 226 EXPECT_EQ(gfx::ToRoundedSize(snapshot_size).ToString(), | 238 EXPECT_EQ(gfx::ToRoundedSize(snapshot_size).ToString(), |
| 227 snapshot.Size().ToString()); | 239 snapshot.Size().ToString()); |
| 228 EXPECT_EQ(0u, GetFailedPixelsCount(snapshot)); | 240 EXPECT_EQ(0u, GetFailedPixelsCountWithScaleFactor(snapshot, 2)); |
| 229 } | 241 } |
| 230 | 242 |
| 231 TEST_F(SnapshotAuraTest, RotateAndUIScale) { | 243 TEST_F(SnapshotAuraTest, RotateAndUIScale) { |
| 232 const float kUIScale = 1.25f; | 244 const float kUIScale = 1.25f; |
| 233 test_screen()->SetUIScale(kUIScale); | 245 test_screen()->SetUIScale(kUIScale); |
| 234 test_screen()->SetDisplayRotation(gfx::Display::ROTATE_90); | 246 test_screen()->SetDisplayRotation(gfx::Display::ROTATE_90); |
| 235 | 247 |
| 236 gfx::Rect test_bounds(100, 100, 300, 200); | 248 gfx::Rect test_bounds(100, 100, 300, 200); |
| 237 SetupTestWindow(test_bounds); | 249 SetupTestWindow(test_bounds); |
| 238 WaitForDraw(); | 250 WaitForDraw(); |
| 239 | 251 |
| 240 // Snapshot always captures the physical pixels. | 252 // Snapshot always captures the physical pixels. |
| 241 gfx::SizeF snapshot_size(test_bounds.size()); | 253 gfx::SizeF snapshot_size(test_bounds.size()); |
| 242 snapshot_size.Scale(1.0f / kUIScale); | |
| 243 | 254 |
| 244 gfx::Image snapshot = GrabSnapshotForTestWindow(); | 255 gfx::Image snapshot = GrabSnapshotForTestWindow(); |
| 245 EXPECT_EQ(gfx::ToRoundedSize(snapshot_size).ToString(), | 256 EXPECT_EQ(gfx::ToRoundedSize(snapshot_size).ToString(), |
| 246 snapshot.Size().ToString()); | 257 snapshot.Size().ToString()); |
| 247 EXPECT_EQ(0u, GetFailedPixelsCount(snapshot)); | 258 EXPECT_EQ(0u, GetFailedPixelsCount(snapshot)); |
| 248 } | 259 } |
| 249 | 260 |
| 250 TEST_F(SnapshotAuraTest, RotateAndUIScaleAndScaleFactor) { | 261 TEST_F(SnapshotAuraTest, RotateAndUIScaleAndScaleFactor) { |
| 251 test_screen()->SetDeviceScaleFactor(2.0f); | 262 test_screen()->SetDeviceScaleFactor(2.0f); |
| 252 const float kUIScale = 1.25f; | 263 const float kUIScale = 1.25f; |
| 253 test_screen()->SetUIScale(kUIScale); | 264 test_screen()->SetUIScale(kUIScale); |
| 254 test_screen()->SetDisplayRotation(gfx::Display::ROTATE_90); | 265 test_screen()->SetDisplayRotation(gfx::Display::ROTATE_90); |
| 255 | 266 |
| 256 gfx::Rect test_bounds(20, 30, 150, 100); | 267 gfx::Rect test_bounds(20, 30, 150, 100); |
| 257 SetupTestWindow(test_bounds); | 268 SetupTestWindow(test_bounds); |
| 258 WaitForDraw(); | 269 WaitForDraw(); |
| 259 | 270 |
| 260 // Snapshot always captures the physical pixels. | 271 // Snapshot always captures the physical pixels. |
| 261 gfx::SizeF snapshot_size(test_bounds.size()); | 272 gfx::SizeF snapshot_size(test_bounds.size()); |
| 262 snapshot_size.Scale(2.0f / kUIScale); | 273 snapshot_size.Scale(2.0f); |
| 263 | 274 |
| 264 gfx::Image snapshot = GrabSnapshotForTestWindow(); | 275 gfx::Image snapshot = GrabSnapshotForTestWindow(); |
| 265 EXPECT_EQ(gfx::ToRoundedSize(snapshot_size).ToString(), | 276 EXPECT_EQ(gfx::ToRoundedSize(snapshot_size).ToString(), |
| 266 snapshot.Size().ToString()); | 277 snapshot.Size().ToString()); |
| 267 EXPECT_EQ(0u, GetFailedPixelsCount(snapshot)); | 278 EXPECT_EQ(0u, GetFailedPixelsCountWithScaleFactor(snapshot, 2)); |
| 268 } | 279 } |
| 269 | 280 |
| 270 } // namespace ui | 281 } // namespace ui |
| OLD | NEW |