| OLD | NEW |
| 1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 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 "cc/trees/damage_tracker.h" | 5 #include "cc/trees/damage_tracker.h" |
| 6 | 6 |
| 7 #include "cc/base/math_util.h" | 7 #include "cc/base/math_util.h" |
| 8 #include "cc/layers/layer_impl.h" | 8 #include "cc/layers/layer_impl.h" |
| 9 #include "cc/output/filter_operation.h" | 9 #include "cc/output/filter_operation.h" |
| 10 #include "cc/output/filter_operations.h" | 10 #include "cc/output/filter_operations.h" |
| (...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 222 EXPECT_EQ(gfx::Rect(500, 500).ToString(), root_damage_rect.ToString()); | 222 EXPECT_EQ(gfx::Rect(500, 500).ToString(), root_damage_rect.ToString()); |
| 223 } | 223 } |
| 224 | 224 |
| 225 TEST_F(DamageTrackerTest, VerifyDamageForUpdateRects) { | 225 TEST_F(DamageTrackerTest, VerifyDamageForUpdateRects) { |
| 226 scoped_ptr<LayerImpl> root = CreateAndSetUpTestTreeWithOneSurface(); | 226 scoped_ptr<LayerImpl> root = CreateAndSetUpTestTreeWithOneSurface(); |
| 227 LayerImpl* child = root->children()[0]; | 227 LayerImpl* child = root->children()[0]; |
| 228 | 228 |
| 229 // CASE 1: Setting the update rect should cause the corresponding damage to | 229 // CASE 1: Setting the update rect should cause the corresponding damage to |
| 230 // the surface. | 230 // the surface. |
| 231 ClearDamageForAllSurfaces(root.get()); | 231 ClearDamageForAllSurfaces(root.get()); |
| 232 child->SetUpdateRect(gfx::RectF(10.f, 11.f, 12.f, 13.f)); | 232 child->SetUpdateRect(gfx::Rect(10, 11, 12, 13)); |
| 233 EmulateDrawingOneFrame(root.get()); | 233 EmulateDrawingOneFrame(root.get()); |
| 234 | 234 |
| 235 // Damage position on the surface should be: position of update_rect (10, 11) | 235 // Damage position on the surface should be: position of update_rect (10, 11) |
| 236 // relative to the child (100, 100). | 236 // relative to the child (100, 100). |
| 237 gfx::Rect root_damage_rect = | 237 gfx::Rect root_damage_rect = |
| 238 root->render_surface()->damage_tracker()->current_damage_rect(); | 238 root->render_surface()->damage_tracker()->current_damage_rect(); |
| 239 EXPECT_EQ(gfx::Rect(110, 111, 12, 13).ToString(), | 239 EXPECT_EQ(gfx::Rect(110, 111, 12, 13).ToString(), |
| 240 root_damage_rect.ToString()); | 240 root_damage_rect.ToString()); |
| 241 | 241 |
| 242 // CASE 2: The same update rect twice in a row still produces the same | 242 // CASE 2: The same update rect twice in a row still produces the same |
| 243 // damage. | 243 // damage. |
| 244 ClearDamageForAllSurfaces(root.get()); | 244 ClearDamageForAllSurfaces(root.get()); |
| 245 child->SetUpdateRect(gfx::RectF(10.f, 11.f, 12.f, 13.f)); | 245 child->SetUpdateRect(gfx::Rect(10, 11, 12, 13)); |
| 246 EmulateDrawingOneFrame(root.get()); | 246 EmulateDrawingOneFrame(root.get()); |
| 247 root_damage_rect = | 247 root_damage_rect = |
| 248 root->render_surface()->damage_tracker()->current_damage_rect(); | 248 root->render_surface()->damage_tracker()->current_damage_rect(); |
| 249 EXPECT_EQ(gfx::Rect(110, 111, 12, 13).ToString(), | 249 EXPECT_EQ(gfx::Rect(110, 111, 12, 13).ToString(), |
| 250 root_damage_rect.ToString()); | 250 root_damage_rect.ToString()); |
| 251 | 251 |
| 252 // CASE 3: Setting a different update rect should cause damage on the new | 252 // CASE 3: Setting a different update rect should cause damage on the new |
| 253 // update region, but no additional exposed old region. | 253 // update region, but no additional exposed old region. |
| 254 ClearDamageForAllSurfaces(root.get()); | 254 ClearDamageForAllSurfaces(root.get()); |
| 255 child->SetUpdateRect(gfx::RectF(20.f, 25.f, 1.f, 2.f)); | 255 child->SetUpdateRect(gfx::Rect(20, 25, 1, 2)); |
| 256 EmulateDrawingOneFrame(root.get()); | 256 EmulateDrawingOneFrame(root.get()); |
| 257 | 257 |
| 258 // Damage position on the surface should be: position of update_rect (20, 25) | 258 // Damage position on the surface should be: position of update_rect (20, 25) |
| 259 // relative to the child (100, 100). | 259 // relative to the child (100, 100). |
| 260 root_damage_rect = | 260 root_damage_rect = |
| 261 root->render_surface()->damage_tracker()->current_damage_rect(); | 261 root->render_surface()->damage_tracker()->current_damage_rect(); |
| 262 EXPECT_EQ(gfx::Rect(120, 125, 1, 2).ToString(), root_damage_rect.ToString()); | 262 EXPECT_EQ(gfx::Rect(120, 125, 1, 2).ToString(), root_damage_rect.ToString()); |
| 263 } | 263 } |
| 264 | 264 |
| 265 TEST_F(DamageTrackerTest, VerifyDamageForLayerDamageRects) { | 265 TEST_F(DamageTrackerTest, VerifyDamageForLayerDamageRects) { |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 315 } | 315 } |
| 316 | 316 |
| 317 TEST_F(DamageTrackerTest, VerifyDamageForLayerUpdateAndDamageRects) { | 317 TEST_F(DamageTrackerTest, VerifyDamageForLayerUpdateAndDamageRects) { |
| 318 scoped_ptr<LayerImpl> root = CreateAndSetUpTestTreeWithOneSurface(); | 318 scoped_ptr<LayerImpl> root = CreateAndSetUpTestTreeWithOneSurface(); |
| 319 LayerImpl* child = root->children()[0]; | 319 LayerImpl* child = root->children()[0]; |
| 320 | 320 |
| 321 // CASE 1: Adding the layer damage rect and update rect should cause the | 321 // CASE 1: Adding the layer damage rect and update rect should cause the |
| 322 // corresponding damage to the surface. | 322 // corresponding damage to the surface. |
| 323 ClearDamageForAllSurfaces(root.get()); | 323 ClearDamageForAllSurfaces(root.get()); |
| 324 child->AddDamageRect(gfx::RectF(5.f, 6.f, 12.f, 13.f)); | 324 child->AddDamageRect(gfx::RectF(5.f, 6.f, 12.f, 13.f)); |
| 325 child->SetUpdateRect(gfx::RectF(15.f, 16.f, 14.f, 10.f)); | 325 child->SetUpdateRect(gfx::Rect(15, 16, 14, 10)); |
| 326 EmulateDrawingOneFrame(root.get()); | 326 EmulateDrawingOneFrame(root.get()); |
| 327 | 327 |
| 328 // Damage position on the surface should be: position of unified layer | 328 // Damage position on the surface should be: position of unified layer |
| 329 // damage_rect and update rect (5, 6) | 329 // damage_rect and update rect (5, 6) |
| 330 // relative to the child (100, 100). | 330 // relative to the child (100, 100). |
| 331 gfx::Rect root_damage_rect = | 331 gfx::Rect root_damage_rect = |
| 332 root->render_surface()->damage_tracker()->current_damage_rect(); | 332 root->render_surface()->damage_tracker()->current_damage_rect(); |
| 333 EXPECT_EQ(true, root_damage_rect.Contains(gfx::Rect(105, 106, 24, 20))); | 333 EXPECT_EQ(true, root_damage_rect.Contains(gfx::Rect(105, 106, 24, 20))); |
| 334 | 334 |
| 335 // CASE 2: The same layer damage rect and update rect twice in a row still | 335 // CASE 2: The same layer damage rect and update rect twice in a row still |
| 336 // produces the same damage. | 336 // produces the same damage. |
| 337 ClearDamageForAllSurfaces(root.get()); | 337 ClearDamageForAllSurfaces(root.get()); |
| 338 child->AddDamageRect(gfx::RectF(10.f, 11.f, 12.f, 13.f)); | 338 child->AddDamageRect(gfx::RectF(10.f, 11.f, 12.f, 13.f)); |
| 339 child->SetUpdateRect(gfx::RectF(10.f, 11.f, 14.f, 15.f)); | 339 child->SetUpdateRect(gfx::Rect(10, 11, 14, 15)); |
| 340 EmulateDrawingOneFrame(root.get()); | 340 EmulateDrawingOneFrame(root.get()); |
| 341 root_damage_rect = | 341 root_damage_rect = |
| 342 root->render_surface()->damage_tracker()->current_damage_rect(); | 342 root->render_surface()->damage_tracker()->current_damage_rect(); |
| 343 EXPECT_EQ(true, root_damage_rect.Contains(gfx::Rect(110, 111, 14, 15))); | 343 EXPECT_EQ(true, root_damage_rect.Contains(gfx::Rect(110, 111, 14, 15))); |
| 344 | 344 |
| 345 // CASE 3: Adding a different layer damage rect and update rect should cause | 345 // CASE 3: Adding a different layer damage rect and update rect should cause |
| 346 // damage on the new damaged region, but no additional exposed old region. | 346 // damage on the new damaged region, but no additional exposed old region. |
| 347 ClearDamageForAllSurfaces(root.get()); | 347 ClearDamageForAllSurfaces(root.get()); |
| 348 child->AddDamageRect(gfx::RectF(20.f, 25.f, 2.f, 3.f)); | 348 child->AddDamageRect(gfx::RectF(20.f, 25.f, 2.f, 3.f)); |
| 349 child->SetUpdateRect(gfx::RectF(5.f, 10.f, 7.f, 8.f)); | 349 child->SetUpdateRect(gfx::Rect(5, 10, 7, 8)); |
| 350 EmulateDrawingOneFrame(root.get()); | 350 EmulateDrawingOneFrame(root.get()); |
| 351 | 351 |
| 352 // Damage position on the surface should be: position of unified layer damage | 352 // Damage position on the surface should be: position of unified layer damage |
| 353 // rect and update rect (5, 10) relative to the child (100, 100). | 353 // rect and update rect (5, 10) relative to the child (100, 100). |
| 354 root_damage_rect = | 354 root_damage_rect = |
| 355 root->render_surface()->damage_tracker()->current_damage_rect(); | 355 root->render_surface()->damage_tracker()->current_damage_rect(); |
| 356 EXPECT_EQ(true, root_damage_rect.Contains(gfx::Rect(105, 110, 17, 18))); | 356 EXPECT_EQ(true, root_damage_rect.Contains(gfx::Rect(105, 110, 17, 18))); |
| 357 } | 357 } |
| 358 | 358 |
| 359 TEST_F(DamageTrackerTest, VerifyDamageForPropertyChanges) { | 359 TEST_F(DamageTrackerTest, VerifyDamageForPropertyChanges) { |
| 360 scoped_ptr<LayerImpl> root = CreateAndSetUpTestTreeWithOneSurface(); | 360 scoped_ptr<LayerImpl> root = CreateAndSetUpTestTreeWithOneSurface(); |
| 361 LayerImpl* child = root->children()[0]; | 361 LayerImpl* child = root->children()[0]; |
| 362 | 362 |
| 363 // CASE 1: The layer's property changed flag takes priority over update rect. | 363 // CASE 1: The layer's property changed flag takes priority over update rect. |
| 364 // | 364 // |
| 365 ClearDamageForAllSurfaces(root.get()); | 365 ClearDamageForAllSurfaces(root.get()); |
| 366 child->SetUpdateRect(gfx::RectF(10.f, 11.f, 12.f, 13.f)); | 366 child->SetUpdateRect(gfx::Rect(10, 11, 12, 13)); |
| 367 child->SetOpacity(0.5f); | 367 child->SetOpacity(0.5f); |
| 368 EmulateDrawingOneFrame(root.get()); | 368 EmulateDrawingOneFrame(root.get()); |
| 369 | 369 |
| 370 // Sanity check - we should not have accidentally created a separate render | 370 // Sanity check - we should not have accidentally created a separate render |
| 371 // surface for the translucent layer. | 371 // surface for the translucent layer. |
| 372 ASSERT_FALSE(child->render_surface()); | 372 ASSERT_FALSE(child->render_surface()); |
| 373 ASSERT_EQ(2u, root->render_surface()->layer_list().size()); | 373 ASSERT_EQ(2u, root->render_surface()->layer_list().size()); |
| 374 | 374 |
| 375 // Damage should be the entire child layer in target_surface space. | 375 // Damage should be the entire child layer in target_surface space. |
| 376 gfx::Rect expected_rect = gfx::Rect(100, 100, 30, 30); | 376 gfx::Rect expected_rect = gfx::Rect(100, 100, 30, 30); |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 504 filters.GetOutsets(&outset_top, &outset_right, &outset_bottom, &outset_left); | 504 filters.GetOutsets(&outset_top, &outset_right, &outset_bottom, &outset_left); |
| 505 | 505 |
| 506 // Setting the filter will damage the whole surface. | 506 // Setting the filter will damage the whole surface. |
| 507 ClearDamageForAllSurfaces(root.get()); | 507 ClearDamageForAllSurfaces(root.get()); |
| 508 surface->SetFilters(filters); | 508 surface->SetFilters(filters); |
| 509 EmulateDrawingOneFrame(root.get()); | 509 EmulateDrawingOneFrame(root.get()); |
| 510 | 510 |
| 511 // Setting the update rect should cause the corresponding damage to the | 511 // Setting the update rect should cause the corresponding damage to the |
| 512 // surface, blurred based on the size of the blur filter. | 512 // surface, blurred based on the size of the blur filter. |
| 513 ClearDamageForAllSurfaces(root.get()); | 513 ClearDamageForAllSurfaces(root.get()); |
| 514 child->SetUpdateRect(gfx::RectF(1.f, 2.f, 3.f, 4.f)); | 514 child->SetUpdateRect(gfx::Rect(1, 2, 3, 4)); |
| 515 EmulateDrawingOneFrame(root.get()); | 515 EmulateDrawingOneFrame(root.get()); |
| 516 | 516 |
| 517 // Damage position on the surface should be: position of update_rect (1, 2) | 517 // Damage position on the surface should be: position of update_rect (1, 2) |
| 518 // relative to the child (300, 300), but expanded by the blur outsets. | 518 // relative to the child (300, 300), but expanded by the blur outsets. |
| 519 gfx::Rect root_damage_rect = | 519 gfx::Rect root_damage_rect = |
| 520 root->render_surface()->damage_tracker()->current_damage_rect(); | 520 root->render_surface()->damage_tracker()->current_damage_rect(); |
| 521 gfx::Rect expected_damage_rect = gfx::Rect(301, 302, 3, 4); | 521 gfx::Rect expected_damage_rect = gfx::Rect(301, 302, 3, 4); |
| 522 | 522 |
| 523 expected_damage_rect.Inset(-outset_left, | 523 expected_damage_rect.Inset(-outset_left, |
| 524 -outset_top, | 524 -outset_top, |
| (...skipping 22 matching lines...) Expand all Loading... |
| 547 root_damage_rect = | 547 root_damage_rect = |
| 548 root->render_surface()->damage_tracker()->current_damage_rect(); | 548 root->render_surface()->damage_tracker()->current_damage_rect(); |
| 549 child_damage_rect = | 549 child_damage_rect = |
| 550 child->render_surface()->damage_tracker()->current_damage_rect(); | 550 child->render_surface()->damage_tracker()->current_damage_rect(); |
| 551 EXPECT_EQ(gfx::Rect(100, 100, 30, 30).ToString(), | 551 EXPECT_EQ(gfx::Rect(100, 100, 30, 30).ToString(), |
| 552 root_damage_rect.ToString()); | 552 root_damage_rect.ToString()); |
| 553 EXPECT_EQ(gfx::Rect(30, 30).ToString(), child_damage_rect.ToString()); | 553 EXPECT_EQ(gfx::Rect(30, 30).ToString(), child_damage_rect.ToString()); |
| 554 | 554 |
| 555 // CASE 1: Setting the update rect should damage the whole surface (for now) | 555 // CASE 1: Setting the update rect should damage the whole surface (for now) |
| 556 ClearDamageForAllSurfaces(root.get()); | 556 ClearDamageForAllSurfaces(root.get()); |
| 557 child->SetUpdateRect(gfx::RectF(1.f, 1.f)); | 557 child->SetUpdateRect(gfx::Rect(1, 1)); |
| 558 EmulateDrawingOneFrame(root.get()); | 558 EmulateDrawingOneFrame(root.get()); |
| 559 | 559 |
| 560 root_damage_rect = | 560 root_damage_rect = |
| 561 root->render_surface()->damage_tracker()->current_damage_rect(); | 561 root->render_surface()->damage_tracker()->current_damage_rect(); |
| 562 child_damage_rect = | 562 child_damage_rect = |
| 563 child->render_surface()->damage_tracker()->current_damage_rect(); | 563 child->render_surface()->damage_tracker()->current_damage_rect(); |
| 564 EXPECT_EQ(gfx::Rect(100, 100, 30, 30).ToString(), | 564 EXPECT_EQ(gfx::Rect(100, 100, 30, 30).ToString(), |
| 565 root_damage_rect.ToString()); | 565 root_damage_rect.ToString()); |
| 566 EXPECT_EQ(gfx::Rect(30.f, 30.f).ToString(), child_damage_rect.ToString()); | 566 EXPECT_EQ(gfx::Rect(30.f, 30.f).ToString(), child_damage_rect.ToString()); |
| 567 } | 567 } |
| (...skipping 13 matching lines...) Expand all Loading... |
| 581 | 581 |
| 582 // Setting the filter will damage the whole surface. | 582 // Setting the filter will damage the whole surface. |
| 583 ClearDamageForAllSurfaces(root.get()); | 583 ClearDamageForAllSurfaces(root.get()); |
| 584 child1->SetBackgroundFilters(filters); | 584 child1->SetBackgroundFilters(filters); |
| 585 EmulateDrawingOneFrame(root.get()); | 585 EmulateDrawingOneFrame(root.get()); |
| 586 | 586 |
| 587 // CASE 1: Setting the update rect should cause the corresponding damage to | 587 // CASE 1: Setting the update rect should cause the corresponding damage to |
| 588 // the surface, blurred based on the size of the child's background | 588 // the surface, blurred based on the size of the child's background |
| 589 // blur filter. | 589 // blur filter. |
| 590 ClearDamageForAllSurfaces(root.get()); | 590 ClearDamageForAllSurfaces(root.get()); |
| 591 root->SetUpdateRect(gfx::RectF(297.f, 297.f, 2.f, 2.f)); | 591 root->SetUpdateRect(gfx::Rect(297, 297, 2, 2)); |
| 592 EmulateDrawingOneFrame(root.get()); | 592 EmulateDrawingOneFrame(root.get()); |
| 593 | 593 |
| 594 gfx::Rect root_damage_rect = | 594 gfx::Rect root_damage_rect = |
| 595 root->render_surface()->damage_tracker()->current_damage_rect(); | 595 root->render_surface()->damage_tracker()->current_damage_rect(); |
| 596 // Damage position on the surface should be a composition of the damage on | 596 // Damage position on the surface should be a composition of the damage on |
| 597 // the root and on child2. Damage on the root should be: position of | 597 // the root and on child2. Damage on the root should be: position of |
| 598 // update_rect (297, 297), but expanded by the blur outsets. | 598 // update_rect (297, 297), but expanded by the blur outsets. |
| 599 gfx::Rect expected_damage_rect = gfx::Rect(297, 297, 2, 2); | 599 gfx::Rect expected_damage_rect = gfx::Rect(297, 297, 2, 2); |
| 600 | 600 |
| 601 expected_damage_rect.Inset(-outset_left, | 601 expected_damage_rect.Inset(-outset_left, |
| 602 -outset_top, | 602 -outset_top, |
| 603 -outset_right, | 603 -outset_right, |
| 604 -outset_bottom); | 604 -outset_bottom); |
| 605 EXPECT_EQ(expected_damage_rect.ToString(), root_damage_rect.ToString()); | 605 EXPECT_EQ(expected_damage_rect.ToString(), root_damage_rect.ToString()); |
| 606 | 606 |
| 607 // CASE 2: Setting the update rect should cause the corresponding damage to | 607 // CASE 2: Setting the update rect should cause the corresponding damage to |
| 608 // the surface, blurred based on the size of the child's background | 608 // the surface, blurred based on the size of the child's background |
| 609 // blur filter. Since the damage extends to the right/bottom outside | 609 // blur filter. Since the damage extends to the right/bottom outside |
| 610 // of the blurred layer, only the left/top should end up expanded. | 610 // of the blurred layer, only the left/top should end up expanded. |
| 611 ClearDamageForAllSurfaces(root.get()); | 611 ClearDamageForAllSurfaces(root.get()); |
| 612 root->SetUpdateRect(gfx::RectF(297.f, 297.f, 30.f, 30.f)); | 612 root->SetUpdateRect(gfx::Rect(297, 297, 30, 30)); |
| 613 EmulateDrawingOneFrame(root.get()); | 613 EmulateDrawingOneFrame(root.get()); |
| 614 | 614 |
| 615 root_damage_rect = | 615 root_damage_rect = |
| 616 root->render_surface()->damage_tracker()->current_damage_rect(); | 616 root->render_surface()->damage_tracker()->current_damage_rect(); |
| 617 // Damage position on the surface should be a composition of the damage on | 617 // Damage position on the surface should be a composition of the damage on |
| 618 // the root and on child2. Damage on the root should be: position of | 618 // the root and on child2. Damage on the root should be: position of |
| 619 // update_rect (297, 297), but expanded on the left/top by the blur outsets. | 619 // update_rect (297, 297), but expanded on the left/top by the blur outsets. |
| 620 expected_damage_rect = gfx::Rect(297, 297, 30, 30); | 620 expected_damage_rect = gfx::Rect(297, 297, 30, 30); |
| 621 | 621 |
| 622 expected_damage_rect.Inset(-outset_left, | 622 expected_damage_rect.Inset(-outset_left, |
| 623 -outset_top, | 623 -outset_top, |
| 624 0, | 624 0, |
| 625 0); | 625 0); |
| 626 EXPECT_EQ(expected_damage_rect.ToString(), root_damage_rect.ToString()); | 626 EXPECT_EQ(expected_damage_rect.ToString(), root_damage_rect.ToString()); |
| 627 | 627 |
| 628 // CASE 3: Setting this update rect outside the blurred content_bounds of the | 628 // CASE 3: Setting this update rect outside the blurred content_bounds of the |
| 629 // blurred child1 will not cause it to be expanded. | 629 // blurred child1 will not cause it to be expanded. |
| 630 ClearDamageForAllSurfaces(root.get()); | 630 ClearDamageForAllSurfaces(root.get()); |
| 631 root->SetUpdateRect(gfx::RectF(30.f, 30.f, 2.f, 2.f)); | 631 root->SetUpdateRect(gfx::Rect(30, 30, 2, 2)); |
| 632 EmulateDrawingOneFrame(root.get()); | 632 EmulateDrawingOneFrame(root.get()); |
| 633 | 633 |
| 634 root_damage_rect = | 634 root_damage_rect = |
| 635 root->render_surface()->damage_tracker()->current_damage_rect(); | 635 root->render_surface()->damage_tracker()->current_damage_rect(); |
| 636 // Damage on the root should be: position of update_rect (30, 30), not | 636 // Damage on the root should be: position of update_rect (30, 30), not |
| 637 // expanded. | 637 // expanded. |
| 638 expected_damage_rect = gfx::Rect(30, 30, 2, 2); | 638 expected_damage_rect = gfx::Rect(30, 30, 2, 2); |
| 639 | 639 |
| 640 EXPECT_EQ(expected_damage_rect.ToString(), root_damage_rect.ToString()); | 640 EXPECT_EQ(expected_damage_rect.ToString(), root_damage_rect.ToString()); |
| 641 | 641 |
| 642 // CASE 4: Setting this update rect inside the blurred content_bounds but | 642 // CASE 4: Setting this update rect inside the blurred content_bounds but |
| 643 // outside the original content_bounds of the blurred child1 will | 643 // outside the original content_bounds of the blurred child1 will |
| 644 // cause it to be expanded. | 644 // cause it to be expanded. |
| 645 ClearDamageForAllSurfaces(root.get()); | 645 ClearDamageForAllSurfaces(root.get()); |
| 646 root->SetUpdateRect(gfx::RectF(99.f, 99.f, 1.f, 1.f)); | 646 root->SetUpdateRect(gfx::Rect(99, 99, 1, 1)); |
| 647 EmulateDrawingOneFrame(root.get()); | 647 EmulateDrawingOneFrame(root.get()); |
| 648 | 648 |
| 649 root_damage_rect = | 649 root_damage_rect = |
| 650 root->render_surface()->damage_tracker()->current_damage_rect(); | 650 root->render_surface()->damage_tracker()->current_damage_rect(); |
| 651 // Damage on the root should be: position of update_rect (99, 99), expanded by | 651 // Damage on the root should be: position of update_rect (99, 99), expanded by |
| 652 // the blurring on child1, but since it is 1 pixel outside the layer, the | 652 // the blurring on child1, but since it is 1 pixel outside the layer, the |
| 653 // expanding should be reduced by 1. | 653 // expanding should be reduced by 1. |
| 654 expected_damage_rect = gfx::Rect(99, 99, 1, 1); | 654 expected_damage_rect = gfx::Rect(99, 99, 1, 1); |
| 655 | 655 |
| 656 expected_damage_rect.Inset(-outset_left + 1, | 656 expected_damage_rect.Inset(-outset_left + 1, |
| 657 -outset_top + 1, | 657 -outset_top + 1, |
| 658 -outset_right, | 658 -outset_right, |
| 659 -outset_bottom); | 659 -outset_bottom); |
| 660 EXPECT_EQ(expected_damage_rect.ToString(), root_damage_rect.ToString()); | 660 EXPECT_EQ(expected_damage_rect.ToString(), root_damage_rect.ToString()); |
| 661 | 661 |
| 662 // CASE 5: Setting the update rect on child2, which is above child1, will | 662 // CASE 5: Setting the update rect on child2, which is above child1, will |
| 663 // not get blurred by child1, so it does not need to get expanded. | 663 // not get blurred by child1, so it does not need to get expanded. |
| 664 ClearDamageForAllSurfaces(root.get()); | 664 ClearDamageForAllSurfaces(root.get()); |
| 665 child2->SetUpdateRect(gfx::RectF(0.f, 0.f, 1.f, 1.f)); | 665 child2->SetUpdateRect(gfx::Rect(1, 1)); |
| 666 EmulateDrawingOneFrame(root.get()); | 666 EmulateDrawingOneFrame(root.get()); |
| 667 | 667 |
| 668 root_damage_rect = | 668 root_damage_rect = |
| 669 root->render_surface()->damage_tracker()->current_damage_rect(); | 669 root->render_surface()->damage_tracker()->current_damage_rect(); |
| 670 // Damage on child2 should be: position of update_rect offset by the child's | 670 // Damage on child2 should be: position of update_rect offset by the child's |
| 671 // position (11, 11), and not expanded by anything. | 671 // position (11, 11), and not expanded by anything. |
| 672 expected_damage_rect = gfx::Rect(11, 11, 1, 1); | 672 expected_damage_rect = gfx::Rect(11, 11, 1, 1); |
| 673 | 673 |
| 674 EXPECT_EQ(expected_damage_rect.ToString(), root_damage_rect.ToString()); | 674 EXPECT_EQ(expected_damage_rect.ToString(), root_damage_rect.ToString()); |
| 675 | 675 |
| 676 // CASE 6: Setting the update rect on child1 will also blur the damage, so | 676 // CASE 6: Setting the update rect on child1 will also blur the damage, so |
| 677 // that any pixels needed for the blur are redrawn in the current | 677 // that any pixels needed for the blur are redrawn in the current |
| 678 // frame. | 678 // frame. |
| 679 ClearDamageForAllSurfaces(root.get()); | 679 ClearDamageForAllSurfaces(root.get()); |
| 680 child1->SetUpdateRect(gfx::RectF(0.f, 0.f, 1.f, 1.f)); | 680 child1->SetUpdateRect(gfx::Rect(1, 1)); |
| 681 EmulateDrawingOneFrame(root.get()); | 681 EmulateDrawingOneFrame(root.get()); |
| 682 | 682 |
| 683 root_damage_rect = | 683 root_damage_rect = |
| 684 root->render_surface()->damage_tracker()->current_damage_rect(); | 684 root->render_surface()->damage_tracker()->current_damage_rect(); |
| 685 // Damage on child1 should be: position of update_rect offset by the child's | 685 // Damage on child1 should be: position of update_rect offset by the child's |
| 686 // position (100, 100), and expanded by the damage. | 686 // position (100, 100), and expanded by the damage. |
| 687 expected_damage_rect = gfx::Rect(100, 100, 1, 1); | 687 expected_damage_rect = gfx::Rect(100, 100, 1, 1); |
| 688 | 688 |
| 689 expected_damage_rect.Inset(-outset_left, | 689 expected_damage_rect.Inset(-outset_left, |
| 690 -outset_top, | 690 -outset_top, |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 791 child2->SetDrawsContent(true); | 791 child2->SetDrawsContent(true); |
| 792 root->AddChild(child2.Pass()); | 792 root->AddChild(child2.Pass()); |
| 793 } | 793 } |
| 794 LayerImpl* child2 = root->children()[1]; | 794 LayerImpl* child2 = root->children()[1]; |
| 795 EmulateDrawingOneFrame(root.get()); | 795 EmulateDrawingOneFrame(root.get()); |
| 796 | 796 |
| 797 // Damaging two layers simultaneously should cause combined damage. | 797 // Damaging two layers simultaneously should cause combined damage. |
| 798 // - child1 update rect in surface space: gfx::Rect(100, 100, 1, 2); | 798 // - child1 update rect in surface space: gfx::Rect(100, 100, 1, 2); |
| 799 // - child2 update rect in surface space: gfx::Rect(400, 380, 3, 4); | 799 // - child2 update rect in surface space: gfx::Rect(400, 380, 3, 4); |
| 800 ClearDamageForAllSurfaces(root.get()); | 800 ClearDamageForAllSurfaces(root.get()); |
| 801 child1->SetUpdateRect(gfx::RectF(0.f, 0.f, 1.f, 2.f)); | 801 child1->SetUpdateRect(gfx::Rect(1, 2)); |
| 802 child2->SetUpdateRect(gfx::RectF(0.f, 0.f, 3.f, 4.f)); | 802 child2->SetUpdateRect(gfx::Rect(3, 4)); |
| 803 EmulateDrawingOneFrame(root.get()); | 803 EmulateDrawingOneFrame(root.get()); |
| 804 gfx::Rect root_damage_rect = | 804 gfx::Rect root_damage_rect = |
| 805 root->render_surface()->damage_tracker()->current_damage_rect(); | 805 root->render_surface()->damage_tracker()->current_damage_rect(); |
| 806 EXPECT_EQ(gfx::Rect(100, 100, 303, 284).ToString(), | 806 EXPECT_EQ(gfx::Rect(100, 100, 303, 284).ToString(), |
| 807 root_damage_rect.ToString()); | 807 root_damage_rect.ToString()); |
| 808 } | 808 } |
| 809 | 809 |
| 810 TEST_F(DamageTrackerTest, VerifyDamageForNestedSurfaces) { | 810 TEST_F(DamageTrackerTest, VerifyDamageForNestedSurfaces) { |
| 811 scoped_ptr<LayerImpl> root = CreateAndSetUpTestTreeWithTwoSurfaces(); | 811 scoped_ptr<LayerImpl> root = CreateAndSetUpTestTreeWithTwoSurfaces(); |
| 812 LayerImpl* child1 = root->children()[0]; | 812 LayerImpl* child1 = root->children()[0]; |
| (...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1003 | 1003 |
| 1004 TEST_F(DamageTrackerTest, VerifyNoDamageForUpdateRectThatDoesNotDrawContent) { | 1004 TEST_F(DamageTrackerTest, VerifyNoDamageForUpdateRectThatDoesNotDrawContent) { |
| 1005 scoped_ptr<LayerImpl> root = CreateAndSetUpTestTreeWithTwoSurfaces(); | 1005 scoped_ptr<LayerImpl> root = CreateAndSetUpTestTreeWithTwoSurfaces(); |
| 1006 LayerImpl* child1 = root->children()[0]; | 1006 LayerImpl* child1 = root->children()[0]; |
| 1007 gfx::Rect child_damage_rect; | 1007 gfx::Rect child_damage_rect; |
| 1008 gfx::Rect root_damage_rect; | 1008 gfx::Rect root_damage_rect; |
| 1009 | 1009 |
| 1010 // In our specific tree, the update rect of child1 should not cause any | 1010 // In our specific tree, the update rect of child1 should not cause any |
| 1011 // damage to any surface because it does not actually draw content. | 1011 // damage to any surface because it does not actually draw content. |
| 1012 ClearDamageForAllSurfaces(root.get()); | 1012 ClearDamageForAllSurfaces(root.get()); |
| 1013 child1->SetUpdateRect(gfx::RectF(0.f, 0.f, 1.f, 2.f)); | 1013 child1->SetUpdateRect(gfx::Rect(1, 2)); |
| 1014 EmulateDrawingOneFrame(root.get()); | 1014 EmulateDrawingOneFrame(root.get()); |
| 1015 child_damage_rect = | 1015 child_damage_rect = |
| 1016 child1->render_surface()->damage_tracker()->current_damage_rect(); | 1016 child1->render_surface()->damage_tracker()->current_damage_rect(); |
| 1017 root_damage_rect = | 1017 root_damage_rect = |
| 1018 root->render_surface()->damage_tracker()->current_damage_rect(); | 1018 root->render_surface()->damage_tracker()->current_damage_rect(); |
| 1019 EXPECT_TRUE(child_damage_rect.IsEmpty()); | 1019 EXPECT_TRUE(child_damage_rect.IsEmpty()); |
| 1020 EXPECT_TRUE(root_damage_rect.IsEmpty()); | 1020 EXPECT_TRUE(root_damage_rect.IsEmpty()); |
| 1021 } | 1021 } |
| 1022 | 1022 |
| 1023 TEST_F(DamageTrackerTest, VerifyDamageForReplica) { | 1023 TEST_F(DamageTrackerTest, VerifyDamageForReplica) { |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1156 child->AddChild(grand_child.Pass()); | 1156 child->AddChild(grand_child.Pass()); |
| 1157 } | 1157 } |
| 1158 EmulateDrawingOneFrame(root.get()); | 1158 EmulateDrawingOneFrame(root.get()); |
| 1159 | 1159 |
| 1160 // Sanity check that a new surface was created for the child. | 1160 // Sanity check that a new surface was created for the child. |
| 1161 ASSERT_TRUE(child->render_surface()); | 1161 ASSERT_TRUE(child->render_surface()); |
| 1162 | 1162 |
| 1163 // CASE 1: the update_rect on a mask layer should damage the entire target | 1163 // CASE 1: the update_rect on a mask layer should damage the entire target |
| 1164 // surface. | 1164 // surface. |
| 1165 ClearDamageForAllSurfaces(root.get()); | 1165 ClearDamageForAllSurfaces(root.get()); |
| 1166 mask_layer->SetUpdateRect(gfx::RectF(1.f, 2.f, 3.f, 4.f)); | 1166 mask_layer->SetUpdateRect(gfx::Rect(1, 2, 3, 4)); |
| 1167 EmulateDrawingOneFrame(root.get()); | 1167 EmulateDrawingOneFrame(root.get()); |
| 1168 gfx::Rect child_damage_rect = | 1168 gfx::Rect child_damage_rect = |
| 1169 child->render_surface()->damage_tracker()->current_damage_rect(); | 1169 child->render_surface()->damage_tracker()->current_damage_rect(); |
| 1170 EXPECT_EQ(gfx::Rect(30, 30).ToString(), child_damage_rect.ToString()); | 1170 EXPECT_EQ(gfx::Rect(30, 30).ToString(), child_damage_rect.ToString()); |
| 1171 | 1171 |
| 1172 // CASE 2: a property change on the mask layer should damage the entire | 1172 // CASE 2: a property change on the mask layer should damage the entire |
| 1173 // target surface. | 1173 // target surface. |
| 1174 | 1174 |
| 1175 // Advance one frame without damage so that we know the damage rect is not | 1175 // Advance one frame without damage so that we know the damage rect is not |
| 1176 // leftover from the previous case. | 1176 // leftover from the previous case. |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1343 } | 1343 } |
| 1344 | 1344 |
| 1345 TEST_F(DamageTrackerTest, DamageWhenAddedExternally) { | 1345 TEST_F(DamageTrackerTest, DamageWhenAddedExternally) { |
| 1346 scoped_ptr<LayerImpl> root = CreateAndSetUpTestTreeWithOneSurface(); | 1346 scoped_ptr<LayerImpl> root = CreateAndSetUpTestTreeWithOneSurface(); |
| 1347 LayerImpl* child = root->children()[0]; | 1347 LayerImpl* child = root->children()[0]; |
| 1348 | 1348 |
| 1349 // Case 1: This test ensures that when the tracker is given damage, that | 1349 // Case 1: This test ensures that when the tracker is given damage, that |
| 1350 // it is included with any other partial damage. | 1350 // it is included with any other partial damage. |
| 1351 // | 1351 // |
| 1352 ClearDamageForAllSurfaces(root.get()); | 1352 ClearDamageForAllSurfaces(root.get()); |
| 1353 child->SetUpdateRect(gfx::RectF(10, 11, 12, 13)); | 1353 child->SetUpdateRect(gfx::Rect(10, 11, 12, 13)); |
| 1354 root->render_surface()->damage_tracker()->AddDamageNextUpdate( | 1354 root->render_surface()->damage_tracker()->AddDamageNextUpdate( |
| 1355 gfx::Rect(15, 16, 32, 33)); | 1355 gfx::Rect(15, 16, 32, 33)); |
| 1356 EmulateDrawingOneFrame(root.get()); | 1356 EmulateDrawingOneFrame(root.get()); |
| 1357 gfx::Rect root_damage_rect = | 1357 gfx::Rect root_damage_rect = |
| 1358 root->render_surface()->damage_tracker()->current_damage_rect(); | 1358 root->render_surface()->damage_tracker()->current_damage_rect(); |
| 1359 EXPECT_EQ(gfx::UnionRects(gfx::Rect(15, 16, 32, 33), | 1359 EXPECT_EQ(gfx::UnionRects(gfx::Rect(15, 16, 32, 33), |
| 1360 gfx::Rect(100 + 10, 100 + 11, 12, 13)).ToString(), | 1360 gfx::Rect(100 + 10, 100 + 11, 12, 13)).ToString(), |
| 1361 root_damage_rect.ToString()); | 1361 root_damage_rect.ToString()); |
| 1362 | 1362 |
| 1363 // Case 2: An additional sanity check that adding damage works even when | 1363 // Case 2: An additional sanity check that adding damage works even when |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1406 child->SetUpdateRect(gfx::Rect(10.f, 11.f, 1.f, 2.f)); | 1406 child->SetUpdateRect(gfx::Rect(10.f, 11.f, 1.f, 2.f)); |
| 1407 EmulateDrawingOneFrame(root.get()); | 1407 EmulateDrawingOneFrame(root.get()); |
| 1408 | 1408 |
| 1409 // Sanity check damage after the first frame; this isnt the actual test yet. | 1409 // Sanity check damage after the first frame; this isnt the actual test yet. |
| 1410 gfx::Rect root_damage_rect = | 1410 gfx::Rect root_damage_rect = |
| 1411 root->render_surface()->damage_tracker()->current_damage_rect(); | 1411 root->render_surface()->damage_tracker()->current_damage_rect(); |
| 1412 EXPECT_EQ(gfx::Rect(110, 111, 1, 2).ToString(), root_damage_rect.ToString()); | 1412 EXPECT_EQ(gfx::Rect(110, 111, 1, 2).ToString(), root_damage_rect.ToString()); |
| 1413 | 1413 |
| 1414 // New damage, without having cleared the previous damage, should be unioned | 1414 // New damage, without having cleared the previous damage, should be unioned |
| 1415 // to the previous one. | 1415 // to the previous one. |
| 1416 child->SetUpdateRect(gfx::RectF(20.f, 25.f, 1.f, 2.f)); | 1416 child->SetUpdateRect(gfx::Rect(20, 25, 1, 2)); |
| 1417 EmulateDrawingOneFrame(root.get()); | 1417 EmulateDrawingOneFrame(root.get()); |
| 1418 root_damage_rect = | 1418 root_damage_rect = |
| 1419 root->render_surface()->damage_tracker()->current_damage_rect(); | 1419 root->render_surface()->damage_tracker()->current_damage_rect(); |
| 1420 EXPECT_EQ(gfx::Rect(110, 111, 11, 16).ToString(), | 1420 EXPECT_EQ(gfx::Rect(110, 111, 11, 16).ToString(), |
| 1421 root_damage_rect.ToString()); | 1421 root_damage_rect.ToString()); |
| 1422 | 1422 |
| 1423 // If we notify the damage tracker that we drew the damaged area, then damage | 1423 // If we notify the damage tracker that we drew the damaged area, then damage |
| 1424 // should be emptied. | 1424 // should be emptied. |
| 1425 root->render_surface()->damage_tracker()->DidDrawDamagedArea(); | 1425 root->render_surface()->damage_tracker()->DidDrawDamagedArea(); |
| 1426 root_damage_rect = | 1426 root_damage_rect = |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1462 gfx::Rect root_damage_rect = | 1462 gfx::Rect root_damage_rect = |
| 1463 root->render_surface()->damage_tracker()->current_damage_rect(); | 1463 root->render_surface()->damage_tracker()->current_damage_rect(); |
| 1464 gfx::Rect damage_we_care_about = gfx::Rect(i, i); | 1464 gfx::Rect damage_we_care_about = gfx::Rect(i, i); |
| 1465 EXPECT_LE(damage_we_care_about.right(), root_damage_rect.right()); | 1465 EXPECT_LE(damage_we_care_about.right(), root_damage_rect.right()); |
| 1466 EXPECT_LE(damage_we_care_about.bottom(), root_damage_rect.bottom()); | 1466 EXPECT_LE(damage_we_care_about.bottom(), root_damage_rect.bottom()); |
| 1467 } | 1467 } |
| 1468 } | 1468 } |
| 1469 | 1469 |
| 1470 } // namespace | 1470 } // namespace |
| 1471 } // namespace cc | 1471 } // namespace cc |
| OLD | NEW |