Home | History | Annotate | Download | only in trees
      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
      3 // found in the LICENSE file.
      4 
      5 #include "cc/trees/layer_tree_host_common.h"
      6 
      7 #include <set>
      8 
      9 #include "cc/animation/layer_animation_controller.h"
     10 #include "cc/animation/transform_operations.h"
     11 #include "cc/base/math_util.h"
     12 #include "cc/layers/content_layer.h"
     13 #include "cc/layers/content_layer_client.h"
     14 #include "cc/layers/layer.h"
     15 #include "cc/layers/layer_client.h"
     16 #include "cc/layers/layer_impl.h"
     17 #include "cc/layers/layer_iterator.h"
     18 #include "cc/layers/render_surface.h"
     19 #include "cc/layers/render_surface_impl.h"
     20 #include "cc/output/copy_output_request.h"
     21 #include "cc/output/copy_output_result.h"
     22 #include "cc/test/animation_test_common.h"
     23 #include "cc/test/fake_impl_proxy.h"
     24 #include "cc/test/fake_layer_tree_host.h"
     25 #include "cc/test/fake_layer_tree_host_impl.h"
     26 #include "cc/test/geometry_test_utils.h"
     27 #include "cc/test/layer_tree_host_common_test.h"
     28 #include "cc/trees/layer_tree_impl.h"
     29 #include "cc/trees/proxy.h"
     30 #include "cc/trees/single_thread_proxy.h"
     31 #include "testing/gmock/include/gmock/gmock.h"
     32 #include "testing/gtest/include/gtest/gtest.h"
     33 #include "ui/gfx/quad_f.h"
     34 #include "ui/gfx/transform.h"
     35 
     36 namespace cc {
     37 namespace {
     38 
     39 class LayerWithForcedDrawsContent : public Layer {
     40  public:
     41   LayerWithForcedDrawsContent() {}
     42 
     43   virtual bool DrawsContent() const OVERRIDE;
     44 
     45  private:
     46   virtual ~LayerWithForcedDrawsContent() {}
     47 };
     48 
     49 bool LayerWithForcedDrawsContent::DrawsContent() const { return true; }
     50 
     51 class MockContentLayerClient : public ContentLayerClient {
     52  public:
     53   MockContentLayerClient() {}
     54   virtual ~MockContentLayerClient() {}
     55   virtual void PaintContents(
     56       SkCanvas* canvas,
     57       const gfx::Rect& clip,
     58       ContentLayerClient::GraphicsContextStatus gc_status) OVERRIDE {}
     59   virtual void DidChangeLayerCanUseLCDText() OVERRIDE {}
     60   virtual bool FillsBoundsCompletely() const OVERRIDE { return false; }
     61 };
     62 
     63 scoped_refptr<ContentLayer> CreateDrawableContentLayer(
     64     ContentLayerClient* delegate) {
     65   scoped_refptr<ContentLayer> to_return = ContentLayer::Create(delegate);
     66   to_return->SetIsDrawable(true);
     67   return to_return;
     68 }
     69 
     70 #define EXPECT_CONTENTS_SCALE_EQ(expected, layer)         \
     71   do {                                                    \
     72     EXPECT_FLOAT_EQ(expected, layer->contents_scale_x()); \
     73     EXPECT_FLOAT_EQ(expected, layer->contents_scale_y()); \
     74   } while (false)
     75 
     76 TEST_F(LayerTreeHostCommonTest, TransformsForNoOpLayer) {
     77   // Sanity check: For layers positioned at zero, with zero size,
     78   // and with identity transforms, then the draw transform,
     79   // screen space transform, and the hierarchy passed on to children
     80   // layers should also be identity transforms.
     81 
     82   scoped_refptr<Layer> parent = Layer::Create();
     83   scoped_refptr<Layer> child = Layer::Create();
     84   scoped_refptr<Layer> grand_child = Layer::Create();
     85   parent->AddChild(child);
     86   child->AddChild(grand_child);
     87 
     88   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
     89   host->SetRootLayer(parent);
     90 
     91   gfx::Transform identity_matrix;
     92   SetLayerPropertiesForTesting(parent.get(),
     93                                identity_matrix,
     94                                gfx::Point3F(),
     95                                gfx::PointF(),
     96                                gfx::Size(100, 100),
     97                                true,
     98                                false);
     99   SetLayerPropertiesForTesting(child.get(),
    100                                identity_matrix,
    101                                gfx::Point3F(),
    102                                gfx::PointF(),
    103                                gfx::Size(),
    104                                true,
    105                                false);
    106   SetLayerPropertiesForTesting(grand_child.get(),
    107                                identity_matrix,
    108                                gfx::Point3F(),
    109                                gfx::PointF(),
    110                                gfx::Size(),
    111                                true,
    112                                false);
    113 
    114   ExecuteCalculateDrawProperties(parent.get());
    115 
    116   EXPECT_TRANSFORMATION_MATRIX_EQ(identity_matrix, child->draw_transform());
    117   EXPECT_TRANSFORMATION_MATRIX_EQ(identity_matrix,
    118                                   child->screen_space_transform());
    119   EXPECT_TRANSFORMATION_MATRIX_EQ(identity_matrix,
    120                                   grand_child->draw_transform());
    121   EXPECT_TRANSFORMATION_MATRIX_EQ(identity_matrix,
    122                                   grand_child->screen_space_transform());
    123 }
    124 
    125 TEST_F(LayerTreeHostCommonTest, DoNotSkipLayersWithHandlers) {
    126   scoped_refptr<Layer> parent = Layer::Create();
    127   scoped_refptr<Layer> child = Layer::Create();
    128   scoped_refptr<Layer> grand_child = Layer::Create();
    129   parent->AddChild(child);
    130   child->AddChild(grand_child);
    131 
    132   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
    133   host->SetRootLayer(parent);
    134 
    135   gfx::Transform identity_matrix;
    136   SetLayerPropertiesForTesting(parent.get(),
    137                                identity_matrix,
    138                                gfx::Point3F(),
    139                                gfx::PointF(),
    140                                gfx::Size(100, 100),
    141                                true,
    142                                false);
    143   SetLayerPropertiesForTesting(child.get(),
    144                                identity_matrix,
    145                                gfx::Point3F(),
    146                                gfx::PointF(10, 10),
    147                                gfx::Size(100, 100),
    148                                true,
    149                                false);
    150   // This would have previously caused us to skip our subtree, but this would be
    151   // wrong; we need up-to-date draw properties to do hit testing on the layers
    152   // with handlers.
    153   child->SetOpacity(0.f);
    154   SetLayerPropertiesForTesting(grand_child.get(),
    155                                identity_matrix,
    156                                gfx::Point3F(),
    157                                gfx::PointF(10, 10),
    158                                gfx::Size(100, 100),
    159                                true,
    160                                false);
    161   grand_child->SetTouchEventHandlerRegion(gfx::Rect(0, 0, 100, 100));
    162 
    163   ExecuteCalculateDrawProperties(parent.get());
    164 
    165   // Check that we've computed draw properties for the subtree rooted at
    166   // |child|.
    167   EXPECT_FALSE(child->draw_transform().IsIdentity());
    168   EXPECT_FALSE(grand_child->draw_transform().IsIdentity());
    169 }
    170 
    171 TEST_F(LayerTreeHostCommonTest, TransformsForSingleLayer) {
    172   gfx::Transform identity_matrix;
    173   scoped_refptr<Layer> layer = Layer::Create();
    174 
    175   scoped_refptr<Layer> root = Layer::Create();
    176   SetLayerPropertiesForTesting(root.get(),
    177                                identity_matrix,
    178                                gfx::Point3F(),
    179                                gfx::PointF(),
    180                                gfx::Size(1, 2),
    181                                true,
    182                                false);
    183   root->AddChild(layer);
    184 
    185   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
    186   host->SetRootLayer(root);
    187 
    188   // Case 2: Setting the bounds of the layer should not affect either the draw
    189   // transform or the screenspace transform.
    190   gfx::Transform translation_to_center;
    191   translation_to_center.Translate(5.0, 6.0);
    192   SetLayerPropertiesForTesting(layer.get(),
    193                                identity_matrix,
    194                                gfx::Point3F(),
    195                                gfx::PointF(),
    196                                gfx::Size(10, 12),
    197                                true,
    198                                false);
    199   ExecuteCalculateDrawProperties(root.get());
    200   EXPECT_TRANSFORMATION_MATRIX_EQ(identity_matrix, layer->draw_transform());
    201   EXPECT_TRANSFORMATION_MATRIX_EQ(identity_matrix,
    202                                   layer->screen_space_transform());
    203 
    204   // Case 3: The anchor point by itself (without a layer transform) should have
    205   // no effect on the transforms.
    206   SetLayerPropertiesForTesting(layer.get(),
    207                                identity_matrix,
    208                                gfx::Point3F(2.5f, 3.0f, 0.f),
    209                                gfx::PointF(),
    210                                gfx::Size(10, 12),
    211                                true,
    212                                false);
    213   ExecuteCalculateDrawProperties(root.get());
    214   EXPECT_TRANSFORMATION_MATRIX_EQ(identity_matrix, layer->draw_transform());
    215   EXPECT_TRANSFORMATION_MATRIX_EQ(identity_matrix,
    216                                   layer->screen_space_transform());
    217 
    218   // Case 4: A change in actual position affects both the draw transform and
    219   // screen space transform.
    220   gfx::Transform position_transform;
    221   position_transform.Translate(0.f, 1.2f);
    222   SetLayerPropertiesForTesting(layer.get(),
    223                                identity_matrix,
    224                                gfx::Point3F(2.5f, 3.0f, 0.f),
    225                                gfx::PointF(0.f, 1.2f),
    226                                gfx::Size(10, 12),
    227                                true,
    228                                false);
    229   ExecuteCalculateDrawProperties(root.get());
    230   EXPECT_TRANSFORMATION_MATRIX_EQ(position_transform, layer->draw_transform());
    231   EXPECT_TRANSFORMATION_MATRIX_EQ(position_transform,
    232                                   layer->screen_space_transform());
    233 
    234   // Case 5: In the correct sequence of transforms, the layer transform should
    235   // pre-multiply the translation_to_center. This is easily tested by using a
    236   // scale transform, because scale and translation are not commutative.
    237   gfx::Transform layer_transform;
    238   layer_transform.Scale3d(2.0, 2.0, 1.0);
    239   SetLayerPropertiesForTesting(layer.get(),
    240                                layer_transform,
    241                                gfx::Point3F(),
    242                                gfx::PointF(),
    243                                gfx::Size(10, 12),
    244                                true,
    245                                false);
    246   ExecuteCalculateDrawProperties(root.get());
    247   EXPECT_TRANSFORMATION_MATRIX_EQ(layer_transform, layer->draw_transform());
    248   EXPECT_TRANSFORMATION_MATRIX_EQ(layer_transform,
    249                                   layer->screen_space_transform());
    250 
    251   // Case 6: The layer transform should occur with respect to the anchor point.
    252   gfx::Transform translation_to_anchor;
    253   translation_to_anchor.Translate(5.0, 0.0);
    254   gfx::Transform expected_result =
    255       translation_to_anchor * layer_transform * Inverse(translation_to_anchor);
    256   SetLayerPropertiesForTesting(layer.get(),
    257                                layer_transform,
    258                                gfx::Point3F(5.0f, 0.f, 0.f),
    259                                gfx::PointF(),
    260                                gfx::Size(10, 12),
    261                                true,
    262                                false);
    263   ExecuteCalculateDrawProperties(root.get());
    264   EXPECT_TRANSFORMATION_MATRIX_EQ(expected_result, layer->draw_transform());
    265   EXPECT_TRANSFORMATION_MATRIX_EQ(expected_result,
    266                                   layer->screen_space_transform());
    267 
    268   // Case 7: Verify that position pre-multiplies the layer transform.  The
    269   // current implementation of CalculateDrawProperties does this implicitly, but
    270   // it is still worth testing to detect accidental regressions.
    271   expected_result = position_transform * translation_to_anchor *
    272                     layer_transform * Inverse(translation_to_anchor);
    273   SetLayerPropertiesForTesting(layer.get(),
    274                                layer_transform,
    275                                gfx::Point3F(5.0f, 0.f, 0.f),
    276                                gfx::PointF(0.f, 1.2f),
    277                                gfx::Size(10, 12),
    278                                true,
    279                                false);
    280   ExecuteCalculateDrawProperties(root.get());
    281   EXPECT_TRANSFORMATION_MATRIX_EQ(expected_result, layer->draw_transform());
    282   EXPECT_TRANSFORMATION_MATRIX_EQ(expected_result,
    283                                   layer->screen_space_transform());
    284 }
    285 
    286 TEST_F(LayerTreeHostCommonTest, TransformsAboutScrollOffset) {
    287   const gfx::Vector2d kScrollOffset(50, 100);
    288   const gfx::Vector2dF kScrollDelta(2.34f, 5.67f);
    289   const gfx::Vector2d kMaxScrollOffset(200, 200);
    290   const gfx::PointF kScrollLayerPosition(-kScrollOffset.x(),
    291                                          -kScrollOffset.y());
    292   const float kPageScale = 0.888f;
    293   const float kDeviceScale = 1.666f;
    294 
    295   FakeImplProxy proxy;
    296   TestSharedBitmapManager shared_bitmap_manager;
    297   FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager);
    298 
    299   gfx::Transform identity_matrix;
    300   scoped_ptr<LayerImpl> sublayer_scoped_ptr(
    301       LayerImpl::Create(host_impl.active_tree(), 1));
    302   LayerImpl* sublayer = sublayer_scoped_ptr.get();
    303   sublayer->SetContentsScale(kPageScale * kDeviceScale,
    304                              kPageScale * kDeviceScale);
    305   SetLayerPropertiesForTesting(sublayer,
    306                                identity_matrix,
    307                                gfx::Point3F(),
    308                                gfx::PointF(),
    309                                gfx::Size(500, 500),
    310                                true,
    311                                false);
    312 
    313   scoped_ptr<LayerImpl> scroll_layer_scoped_ptr(
    314       LayerImpl::Create(host_impl.active_tree(), 2));
    315   LayerImpl* scroll_layer = scroll_layer_scoped_ptr.get();
    316   SetLayerPropertiesForTesting(scroll_layer,
    317                                identity_matrix,
    318                                gfx::Point3F(),
    319                                gfx::PointF(),
    320                                gfx::Size(10, 20),
    321                                true,
    322                                false);
    323   scoped_ptr<LayerImpl> clip_layer_scoped_ptr(
    324       LayerImpl::Create(host_impl.active_tree(), 4));
    325   LayerImpl* clip_layer = clip_layer_scoped_ptr.get();
    326 
    327   scroll_layer->SetScrollClipLayer(clip_layer->id());
    328   clip_layer->SetBounds(
    329       gfx::Size(scroll_layer->bounds().width() + kMaxScrollOffset.x(),
    330                 scroll_layer->bounds().height() + kMaxScrollOffset.y()));
    331   scroll_layer->SetScrollClipLayer(clip_layer->id());
    332   scroll_layer->SetScrollDelta(kScrollDelta);
    333   gfx::Transform impl_transform;
    334   scroll_layer->AddChild(sublayer_scoped_ptr.Pass());
    335   LayerImpl* scroll_layer_raw_ptr = scroll_layer_scoped_ptr.get();
    336   clip_layer->AddChild(scroll_layer_scoped_ptr.Pass());
    337   scroll_layer_raw_ptr->SetScrollOffset(kScrollOffset);
    338 
    339   scoped_ptr<LayerImpl> root(LayerImpl::Create(host_impl.active_tree(), 3));
    340   SetLayerPropertiesForTesting(root.get(),
    341                                identity_matrix,
    342                                gfx::Point3F(),
    343                                gfx::PointF(),
    344                                gfx::Size(3, 4),
    345                                true,
    346                                false);
    347   root->AddChild(clip_layer_scoped_ptr.Pass());
    348 
    349   ExecuteCalculateDrawProperties(
    350       root.get(), kDeviceScale, kPageScale, scroll_layer->parent());
    351   gfx::Transform expected_transform = identity_matrix;
    352   gfx::PointF sub_layer_screen_position = kScrollLayerPosition - kScrollDelta;
    353   sub_layer_screen_position.Scale(kPageScale * kDeviceScale);
    354   expected_transform.Translate(MathUtil::Round(sub_layer_screen_position.x()),
    355                                MathUtil::Round(sub_layer_screen_position.y()));
    356   EXPECT_TRANSFORMATION_MATRIX_EQ(expected_transform,
    357                                   sublayer->draw_transform());
    358   EXPECT_TRANSFORMATION_MATRIX_EQ(expected_transform,
    359                                   sublayer->screen_space_transform());
    360 
    361   gfx::Transform arbitrary_translate;
    362   const float kTranslateX = 10.6f;
    363   const float kTranslateY = 20.6f;
    364   arbitrary_translate.Translate(kTranslateX, kTranslateY);
    365   SetLayerPropertiesForTesting(scroll_layer,
    366                                arbitrary_translate,
    367                                gfx::Point3F(),
    368                                gfx::PointF(),
    369                                gfx::Size(10, 20),
    370                                true,
    371                                false);
    372   ExecuteCalculateDrawProperties(
    373       root.get(), kDeviceScale, kPageScale, scroll_layer->parent());
    374   expected_transform.MakeIdentity();
    375   expected_transform.Translate(
    376       MathUtil::Round(kTranslateX * kPageScale * kDeviceScale +
    377                       sub_layer_screen_position.x()),
    378       MathUtil::Round(kTranslateY * kPageScale * kDeviceScale +
    379                       sub_layer_screen_position.y()));
    380   EXPECT_TRANSFORMATION_MATRIX_EQ(expected_transform,
    381                                   sublayer->draw_transform());
    382 }
    383 
    384 TEST_F(LayerTreeHostCommonTest, TransformsForSimpleHierarchy) {
    385   gfx::Transform identity_matrix;
    386   scoped_refptr<Layer> root = Layer::Create();
    387   scoped_refptr<Layer> parent = Layer::Create();
    388   scoped_refptr<Layer> child = Layer::Create();
    389   scoped_refptr<Layer> grand_child = Layer::Create();
    390   root->AddChild(parent);
    391   parent->AddChild(child);
    392   child->AddChild(grand_child);
    393 
    394   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
    395   host->SetRootLayer(root);
    396 
    397   // One-time setup of root layer
    398   SetLayerPropertiesForTesting(root.get(),
    399                                identity_matrix,
    400                                gfx::Point3F(),
    401                                gfx::PointF(),
    402                                gfx::Size(1, 2),
    403                                true,
    404                                false);
    405 
    406   // Case 1: parent's anchor point should not affect child or grand_child.
    407   SetLayerPropertiesForTesting(parent.get(),
    408                                identity_matrix,
    409                                gfx::Point3F(2.5f, 3.0f, 0.f),
    410                                gfx::PointF(),
    411                                gfx::Size(10, 12),
    412                                true,
    413                                false);
    414   SetLayerPropertiesForTesting(child.get(),
    415                                identity_matrix,
    416                                gfx::Point3F(),
    417                                gfx::PointF(),
    418                                gfx::Size(16, 18),
    419                                true,
    420                                false);
    421   SetLayerPropertiesForTesting(grand_child.get(),
    422                                identity_matrix,
    423                                gfx::Point3F(),
    424                                gfx::PointF(),
    425                                gfx::Size(76, 78),
    426                                true,
    427                                false);
    428   ExecuteCalculateDrawProperties(root.get());
    429   EXPECT_TRANSFORMATION_MATRIX_EQ(identity_matrix, child->draw_transform());
    430   EXPECT_TRANSFORMATION_MATRIX_EQ(identity_matrix,
    431                                   child->screen_space_transform());
    432   EXPECT_TRANSFORMATION_MATRIX_EQ(identity_matrix,
    433                                   grand_child->draw_transform());
    434   EXPECT_TRANSFORMATION_MATRIX_EQ(identity_matrix,
    435                                   grand_child->screen_space_transform());
    436 
    437   // Case 2: parent's position affects child and grand_child.
    438   gfx::Transform parent_position_transform;
    439   parent_position_transform.Translate(0.f, 1.2f);
    440   SetLayerPropertiesForTesting(parent.get(),
    441                                identity_matrix,
    442                                gfx::Point3F(2.5f, 3.0f, 0.f),
    443                                gfx::PointF(0.f, 1.2f),
    444                                gfx::Size(10, 12),
    445                                true,
    446                                false);
    447   SetLayerPropertiesForTesting(child.get(),
    448                                identity_matrix,
    449                                gfx::Point3F(),
    450                                gfx::PointF(),
    451                                gfx::Size(16, 18),
    452                                true,
    453                                false);
    454   SetLayerPropertiesForTesting(grand_child.get(),
    455                                identity_matrix,
    456                                gfx::Point3F(),
    457                                gfx::PointF(),
    458                                gfx::Size(76, 78),
    459                                true,
    460                                false);
    461   ExecuteCalculateDrawProperties(root.get());
    462   EXPECT_TRANSFORMATION_MATRIX_EQ(parent_position_transform,
    463                                   child->draw_transform());
    464   EXPECT_TRANSFORMATION_MATRIX_EQ(parent_position_transform,
    465                                   child->screen_space_transform());
    466   EXPECT_TRANSFORMATION_MATRIX_EQ(parent_position_transform,
    467                                   grand_child->draw_transform());
    468   EXPECT_TRANSFORMATION_MATRIX_EQ(parent_position_transform,
    469                                   grand_child->screen_space_transform());
    470 
    471   // Case 3: parent's local transform affects child and grandchild
    472   gfx::Transform parent_layer_transform;
    473   parent_layer_transform.Scale3d(2.0, 2.0, 1.0);
    474   gfx::Transform parent_translation_to_anchor;
    475   parent_translation_to_anchor.Translate(2.5, 3.0);
    476   gfx::Transform parent_composite_transform =
    477       parent_translation_to_anchor * parent_layer_transform *
    478       Inverse(parent_translation_to_anchor);
    479   SetLayerPropertiesForTesting(parent.get(),
    480                                parent_layer_transform,
    481                                gfx::Point3F(2.5f, 3.0f, 0.f),
    482                                gfx::PointF(),
    483                                gfx::Size(10, 12),
    484                                true,
    485                                false);
    486   SetLayerPropertiesForTesting(child.get(),
    487                                identity_matrix,
    488                                gfx::Point3F(),
    489                                gfx::PointF(),
    490                                gfx::Size(16, 18),
    491                                true,
    492                                false);
    493   SetLayerPropertiesForTesting(grand_child.get(),
    494                                identity_matrix,
    495                                gfx::Point3F(),
    496                                gfx::PointF(),
    497                                gfx::Size(76, 78),
    498                                true,
    499                                false);
    500   ExecuteCalculateDrawProperties(root.get());
    501   EXPECT_TRANSFORMATION_MATRIX_EQ(parent_composite_transform,
    502                                   child->draw_transform());
    503   EXPECT_TRANSFORMATION_MATRIX_EQ(parent_composite_transform,
    504                                   child->screen_space_transform());
    505   EXPECT_TRANSFORMATION_MATRIX_EQ(parent_composite_transform,
    506                                   grand_child->draw_transform());
    507   EXPECT_TRANSFORMATION_MATRIX_EQ(parent_composite_transform,
    508                                   grand_child->screen_space_transform());
    509 }
    510 
    511 TEST_F(LayerTreeHostCommonTest, TransformsForSingleRenderSurface) {
    512   scoped_refptr<Layer> root = Layer::Create();
    513   scoped_refptr<Layer> parent = Layer::Create();
    514   scoped_refptr<Layer> child = Layer::Create();
    515   scoped_refptr<LayerWithForcedDrawsContent> grand_child =
    516       make_scoped_refptr(new LayerWithForcedDrawsContent());
    517   root->AddChild(parent);
    518   parent->AddChild(child);
    519   child->AddChild(grand_child);
    520 
    521   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
    522   host->SetRootLayer(root);
    523 
    524   // One-time setup of root layer
    525   gfx::Transform identity_matrix;
    526   SetLayerPropertiesForTesting(root.get(),
    527                                identity_matrix,
    528                                gfx::Point3F(),
    529                                gfx::PointF(),
    530                                gfx::Size(1, 2),
    531                                true,
    532                                false);
    533 
    534   // Child is set up so that a new render surface should be created.
    535   child->SetOpacity(0.5f);
    536   child->SetForceRenderSurface(true);
    537 
    538   gfx::Transform parent_layer_transform;
    539   parent_layer_transform.Scale3d(1.f, 0.9f, 1.f);
    540   gfx::Transform parent_translation_to_anchor;
    541   parent_translation_to_anchor.Translate(25.0, 30.0);
    542 
    543   gfx::Transform parent_composite_transform =
    544       parent_translation_to_anchor * parent_layer_transform *
    545       Inverse(parent_translation_to_anchor);
    546   gfx::Vector2dF parent_composite_scale =
    547       MathUtil::ComputeTransform2dScaleComponents(parent_composite_transform,
    548                                                   1.f);
    549   gfx::Transform surface_sublayer_transform;
    550   surface_sublayer_transform.Scale(parent_composite_scale.x(),
    551                                    parent_composite_scale.y());
    552   gfx::Transform surface_sublayer_composite_transform =
    553       parent_composite_transform * Inverse(surface_sublayer_transform);
    554 
    555   // Child's render surface should not exist yet.
    556   ASSERT_FALSE(child->render_surface());
    557 
    558   SetLayerPropertiesForTesting(parent.get(),
    559                                parent_layer_transform,
    560                                gfx::Point3F(25.0f, 30.0f, 0.f),
    561                                gfx::PointF(),
    562                                gfx::Size(100, 120),
    563                                true,
    564                                false);
    565   SetLayerPropertiesForTesting(child.get(),
    566                                identity_matrix,
    567                                gfx::Point3F(),
    568                                gfx::PointF(),
    569                                gfx::Size(16, 18),
    570                                true,
    571                                false);
    572   SetLayerPropertiesForTesting(grand_child.get(),
    573                                identity_matrix,
    574                                gfx::Point3F(),
    575                                gfx::PointF(),
    576                                gfx::Size(8, 10),
    577                                true,
    578                                false);
    579   ExecuteCalculateDrawProperties(root.get());
    580 
    581   // Render surface should have been created now.
    582   ASSERT_TRUE(child->render_surface());
    583   ASSERT_EQ(child.get(), child->render_target());
    584 
    585   // The child layer's draw transform should refer to its new render surface.
    586   // The screen-space transform, however, should still refer to the root.
    587   EXPECT_TRANSFORMATION_MATRIX_EQ(surface_sublayer_transform,
    588                                   child->draw_transform());
    589   EXPECT_TRANSFORMATION_MATRIX_EQ(parent_composite_transform,
    590                                   child->screen_space_transform());
    591 
    592   // Because the grand_child is the only drawable content, the child's render
    593   // surface will tighten its bounds to the grand_child.  The scale at which the
    594   // surface's subtree is drawn must be removed from the composite transform.
    595   EXPECT_TRANSFORMATION_MATRIX_EQ(
    596       surface_sublayer_composite_transform,
    597       child->render_target()->render_surface()->draw_transform());
    598 
    599   // The screen space is the same as the target since the child surface draws
    600   // into the root.
    601   EXPECT_TRANSFORMATION_MATRIX_EQ(
    602       surface_sublayer_composite_transform,
    603       child->render_target()->render_surface()->screen_space_transform());
    604 }
    605 
    606 TEST_F(LayerTreeHostCommonTest, TransformsForReplica) {
    607   scoped_refptr<Layer> root = Layer::Create();
    608   scoped_refptr<Layer> parent = Layer::Create();
    609   scoped_refptr<Layer> child = Layer::Create();
    610   scoped_refptr<Layer> child_replica = Layer::Create();
    611   scoped_refptr<LayerWithForcedDrawsContent> grand_child =
    612       make_scoped_refptr(new LayerWithForcedDrawsContent());
    613   root->AddChild(parent);
    614   parent->AddChild(child);
    615   child->AddChild(grand_child);
    616   child->SetReplicaLayer(child_replica.get());
    617 
    618   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
    619   host->SetRootLayer(root);
    620 
    621   // One-time setup of root layer
    622   gfx::Transform identity_matrix;
    623   SetLayerPropertiesForTesting(root.get(),
    624                                identity_matrix,
    625                                gfx::Point3F(),
    626                                gfx::PointF(),
    627                                gfx::Size(1, 2),
    628                                true,
    629                                false);
    630 
    631   // Child is set up so that a new render surface should be created.
    632   child->SetOpacity(0.5f);
    633 
    634   gfx::Transform parent_layer_transform;
    635   parent_layer_transform.Scale3d(2.0, 2.0, 1.0);
    636   gfx::Transform parent_translation_to_anchor;
    637   parent_translation_to_anchor.Translate(2.5, 3.0);
    638   gfx::Transform parent_composite_transform =
    639       parent_translation_to_anchor * parent_layer_transform *
    640       Inverse(parent_translation_to_anchor);
    641   gfx::Transform replica_layer_transform;
    642   replica_layer_transform.Scale3d(3.0, 3.0, 1.0);
    643   gfx::Vector2dF parent_composite_scale =
    644       MathUtil::ComputeTransform2dScaleComponents(parent_composite_transform,
    645                                                   1.f);
    646   gfx::Transform surface_sublayer_transform;
    647   surface_sublayer_transform.Scale(parent_composite_scale.x(),
    648                                    parent_composite_scale.y());
    649   gfx::Transform replica_composite_transform =
    650       parent_composite_transform * replica_layer_transform *
    651       Inverse(surface_sublayer_transform);
    652 
    653   // Child's render surface should not exist yet.
    654   ASSERT_FALSE(child->render_surface());
    655 
    656   SetLayerPropertiesForTesting(parent.get(),
    657                                parent_layer_transform,
    658                                gfx::Point3F(2.5f, 3.0f, 0.f),
    659                                gfx::PointF(),
    660                                gfx::Size(10, 12),
    661                                true,
    662                                false);
    663   SetLayerPropertiesForTesting(child.get(),
    664                                identity_matrix,
    665                                gfx::Point3F(),
    666                                gfx::PointF(),
    667                                gfx::Size(16, 18),
    668                                true,
    669                                false);
    670   SetLayerPropertiesForTesting(grand_child.get(),
    671                                identity_matrix,
    672                                gfx::Point3F(),
    673                                gfx::PointF(-0.5f, -0.5f),
    674                                gfx::Size(1, 1),
    675                                true,
    676                                false);
    677   SetLayerPropertiesForTesting(child_replica.get(),
    678                                replica_layer_transform,
    679                                gfx::Point3F(),
    680                                gfx::PointF(),
    681                                gfx::Size(),
    682                                true,
    683                                false);
    684   ExecuteCalculateDrawProperties(root.get());
    685 
    686   // Render surface should have been created now.
    687   ASSERT_TRUE(child->render_surface());
    688   ASSERT_EQ(child.get(), child->render_target());
    689 
    690   EXPECT_TRANSFORMATION_MATRIX_EQ(
    691       replica_composite_transform,
    692       child->render_target()->render_surface()->replica_draw_transform());
    693   EXPECT_TRANSFORMATION_MATRIX_EQ(replica_composite_transform,
    694                                   child->render_target()
    695                                       ->render_surface()
    696                                       ->replica_screen_space_transform());
    697 }
    698 
    699 TEST_F(LayerTreeHostCommonTest, TransformsForRenderSurfaceHierarchy) {
    700   // This test creates a more complex tree and verifies it all at once. This
    701   // covers the following cases:
    702   //   - layers that are described w.r.t. a render surface: should have draw
    703   //   transforms described w.r.t. that surface
    704   //   - A render surface described w.r.t. an ancestor render surface: should
    705   //   have a draw transform described w.r.t. that ancestor surface
    706   //   - Replicas of a render surface are described w.r.t. the replica's
    707   //   transform around its anchor, along with the surface itself.
    708   //   - Sanity check on recursion: verify transforms of layers described w.r.t.
    709   //   a render surface that is described w.r.t. an ancestor render surface.
    710   //   - verifying that each layer has a reference to the correct render surface
    711   //   and render target values.
    712 
    713   scoped_refptr<Layer> root = Layer::Create();
    714   scoped_refptr<Layer> parent = Layer::Create();
    715   scoped_refptr<Layer> render_surface1 = Layer::Create();
    716   scoped_refptr<Layer> render_surface2 = Layer::Create();
    717   scoped_refptr<Layer> child_of_root = Layer::Create();
    718   scoped_refptr<Layer> child_of_rs1 = Layer::Create();
    719   scoped_refptr<Layer> child_of_rs2 = Layer::Create();
    720   scoped_refptr<Layer> replica_of_rs1 = Layer::Create();
    721   scoped_refptr<Layer> replica_of_rs2 = Layer::Create();
    722   scoped_refptr<Layer> grand_child_of_root = Layer::Create();
    723   scoped_refptr<LayerWithForcedDrawsContent> grand_child_of_rs1 =
    724       make_scoped_refptr(new LayerWithForcedDrawsContent());
    725   scoped_refptr<LayerWithForcedDrawsContent> grand_child_of_rs2 =
    726       make_scoped_refptr(new LayerWithForcedDrawsContent());
    727   root->AddChild(parent);
    728   parent->AddChild(render_surface1);
    729   parent->AddChild(child_of_root);
    730   render_surface1->AddChild(child_of_rs1);
    731   render_surface1->AddChild(render_surface2);
    732   render_surface2->AddChild(child_of_rs2);
    733   child_of_root->AddChild(grand_child_of_root);
    734   child_of_rs1->AddChild(grand_child_of_rs1);
    735   child_of_rs2->AddChild(grand_child_of_rs2);
    736   render_surface1->SetReplicaLayer(replica_of_rs1.get());
    737   render_surface2->SetReplicaLayer(replica_of_rs2.get());
    738 
    739   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
    740   host->SetRootLayer(root);
    741 
    742   // In combination with descendant draws content, opacity != 1 forces the layer
    743   // to have a new render surface.
    744   render_surface1->SetOpacity(0.5f);
    745   render_surface2->SetOpacity(0.33f);
    746 
    747   // One-time setup of root layer
    748   gfx::Transform identity_matrix;
    749   SetLayerPropertiesForTesting(root.get(),
    750                                identity_matrix,
    751                                gfx::Point3F(),
    752                                gfx::PointF(),
    753                                gfx::Size(1, 2),
    754                                true,
    755                                false);
    756 
    757   // All layers in the tree are initialized with an anchor at .25 and a size of
    758   // (10,10).  matrix "A" is the composite layer transform used in all layers,
    759   // Matrix "R" is the composite replica transform used in all replica layers.
    760   gfx::Transform translation_to_anchor;
    761   translation_to_anchor.Translate(2.5, 0.0);
    762   gfx::Transform layer_transform;
    763   layer_transform.Translate(1.0, 1.0);
    764   gfx::Transform replica_layer_transform;
    765   replica_layer_transform.Scale3d(-2.0, 5.0, 1.0);
    766 
    767   gfx::Transform A =
    768       translation_to_anchor * layer_transform * Inverse(translation_to_anchor);
    769   gfx::Transform R = A * translation_to_anchor * replica_layer_transform *
    770                      Inverse(translation_to_anchor);
    771 
    772   gfx::Vector2dF surface1_parent_transform_scale =
    773       MathUtil::ComputeTransform2dScaleComponents(A, 1.f);
    774   gfx::Transform surface1_sublayer_transform;
    775   surface1_sublayer_transform.Scale(surface1_parent_transform_scale.x(),
    776                                     surface1_parent_transform_scale.y());
    777 
    778   // SS1 = transform given to the subtree of render_surface1
    779   gfx::Transform SS1 = surface1_sublayer_transform;
    780   // S1 = transform to move from render_surface1 pixels to the layer space of
    781   // the owning layer
    782   gfx::Transform S1 = Inverse(surface1_sublayer_transform);
    783 
    784   gfx::Vector2dF surface2_parent_transform_scale =
    785       MathUtil::ComputeTransform2dScaleComponents(SS1 * A, 1.f);
    786   gfx::Transform surface2_sublayer_transform;
    787   surface2_sublayer_transform.Scale(surface2_parent_transform_scale.x(),
    788                                     surface2_parent_transform_scale.y());
    789 
    790   // SS2 = transform given to the subtree of render_surface2
    791   gfx::Transform SS2 = surface2_sublayer_transform;
    792   // S2 = transform to move from render_surface2 pixels to the layer space of
    793   // the owning layer
    794   gfx::Transform S2 = Inverse(surface2_sublayer_transform);
    795 
    796   SetLayerPropertiesForTesting(parent.get(),
    797                                layer_transform,
    798                                gfx::Point3F(2.5f, 0.f, 0.f),
    799                                gfx::PointF(),
    800                                gfx::Size(10, 10),
    801                                true,
    802                                false);
    803   SetLayerPropertiesForTesting(render_surface1.get(),
    804                                layer_transform,
    805                                gfx::Point3F(2.5f, 0.f, 0.f),
    806                                gfx::PointF(),
    807                                gfx::Size(10, 10),
    808                                true,
    809                                false);
    810   SetLayerPropertiesForTesting(render_surface2.get(),
    811                                layer_transform,
    812                                gfx::Point3F(2.5f, 0.f, 0.f),
    813                                gfx::PointF(),
    814                                gfx::Size(10, 10),
    815                                true,
    816                                false);
    817   SetLayerPropertiesForTesting(child_of_root.get(),
    818                                layer_transform,
    819                                gfx::Point3F(2.5f, 0.f, 0.f),
    820                                gfx::PointF(),
    821                                gfx::Size(10, 10),
    822                                true,
    823                                false);
    824   SetLayerPropertiesForTesting(child_of_rs1.get(),
    825                                layer_transform,
    826                                gfx::Point3F(2.5f, 0.f, 0.f),
    827                                gfx::PointF(),
    828                                gfx::Size(10, 10),
    829                                true,
    830                                false);
    831   SetLayerPropertiesForTesting(child_of_rs2.get(),
    832                                layer_transform,
    833                                gfx::Point3F(2.5f, 0.f, 0.f),
    834                                gfx::PointF(),
    835                                gfx::Size(10, 10),
    836                                true,
    837                                false);
    838   SetLayerPropertiesForTesting(grand_child_of_root.get(),
    839                                layer_transform,
    840                                gfx::Point3F(2.5f, 0.f, 0.f),
    841                                gfx::PointF(),
    842                                gfx::Size(10, 10),
    843                                true,
    844                                false);
    845   SetLayerPropertiesForTesting(grand_child_of_rs1.get(),
    846                                layer_transform,
    847                                gfx::Point3F(2.5f, 0.f, 0.f),
    848                                gfx::PointF(),
    849                                gfx::Size(10, 10),
    850                                true,
    851                                false);
    852   SetLayerPropertiesForTesting(grand_child_of_rs2.get(),
    853                                layer_transform,
    854                                gfx::Point3F(2.5f, 0.f, 0.f),
    855                                gfx::PointF(),
    856                                gfx::Size(10, 10),
    857                                true,
    858                                false);
    859   SetLayerPropertiesForTesting(replica_of_rs1.get(),
    860                                replica_layer_transform,
    861                                gfx::Point3F(2.5f, 0.f, 0.f),
    862                                gfx::PointF(),
    863                                gfx::Size(),
    864                                true,
    865                                false);
    866   SetLayerPropertiesForTesting(replica_of_rs2.get(),
    867                                replica_layer_transform,
    868                                gfx::Point3F(2.5f, 0.f, 0.f),
    869                                gfx::PointF(),
    870                                gfx::Size(),
    871                                true,
    872                                false);
    873 
    874   ExecuteCalculateDrawProperties(root.get());
    875 
    876   // Only layers that are associated with render surfaces should have an actual
    877   // RenderSurface() value.
    878   ASSERT_TRUE(root->render_surface());
    879   ASSERT_FALSE(child_of_root->render_surface());
    880   ASSERT_FALSE(grand_child_of_root->render_surface());
    881 
    882   ASSERT_TRUE(render_surface1->render_surface());
    883   ASSERT_FALSE(child_of_rs1->render_surface());
    884   ASSERT_FALSE(grand_child_of_rs1->render_surface());
    885 
    886   ASSERT_TRUE(render_surface2->render_surface());
    887   ASSERT_FALSE(child_of_rs2->render_surface());
    888   ASSERT_FALSE(grand_child_of_rs2->render_surface());
    889 
    890   // Verify all render target accessors
    891   EXPECT_EQ(root.get(), parent->render_target());
    892   EXPECT_EQ(root.get(), child_of_root->render_target());
    893   EXPECT_EQ(root.get(), grand_child_of_root->render_target());
    894 
    895   EXPECT_EQ(render_surface1.get(), render_surface1->render_target());
    896   EXPECT_EQ(render_surface1.get(), child_of_rs1->render_target());
    897   EXPECT_EQ(render_surface1.get(), grand_child_of_rs1->render_target());
    898 
    899   EXPECT_EQ(render_surface2.get(), render_surface2->render_target());
    900   EXPECT_EQ(render_surface2.get(), child_of_rs2->render_target());
    901   EXPECT_EQ(render_surface2.get(), grand_child_of_rs2->render_target());
    902 
    903   // Verify layer draw transforms note that draw transforms are described with
    904   // respect to the nearest ancestor render surface but screen space transforms
    905   // are described with respect to the root.
    906   EXPECT_TRANSFORMATION_MATRIX_EQ(A, parent->draw_transform());
    907   EXPECT_TRANSFORMATION_MATRIX_EQ(A * A, child_of_root->draw_transform());
    908   EXPECT_TRANSFORMATION_MATRIX_EQ(A * A * A,
    909                                   grand_child_of_root->draw_transform());
    910 
    911   EXPECT_TRANSFORMATION_MATRIX_EQ(SS1, render_surface1->draw_transform());
    912   EXPECT_TRANSFORMATION_MATRIX_EQ(SS1 * A, child_of_rs1->draw_transform());
    913   EXPECT_TRANSFORMATION_MATRIX_EQ(SS1 * A * A,
    914                                   grand_child_of_rs1->draw_transform());
    915 
    916   EXPECT_TRANSFORMATION_MATRIX_EQ(SS2, render_surface2->draw_transform());
    917   EXPECT_TRANSFORMATION_MATRIX_EQ(SS2 * A, child_of_rs2->draw_transform());
    918   EXPECT_TRANSFORMATION_MATRIX_EQ(SS2 * A * A,
    919                                   grand_child_of_rs2->draw_transform());
    920 
    921   // Verify layer screen-space transforms
    922   //
    923   EXPECT_TRANSFORMATION_MATRIX_EQ(A, parent->screen_space_transform());
    924   EXPECT_TRANSFORMATION_MATRIX_EQ(A * A,
    925                                   child_of_root->screen_space_transform());
    926   EXPECT_TRANSFORMATION_MATRIX_EQ(
    927       A * A * A, grand_child_of_root->screen_space_transform());
    928 
    929   EXPECT_TRANSFORMATION_MATRIX_EQ(A * A,
    930                                   render_surface1->screen_space_transform());
    931   EXPECT_TRANSFORMATION_MATRIX_EQ(A * A * A,
    932                                   child_of_rs1->screen_space_transform());
    933   EXPECT_TRANSFORMATION_MATRIX_EQ(A * A * A * A,
    934                                   grand_child_of_rs1->screen_space_transform());
    935 
    936   EXPECT_TRANSFORMATION_MATRIX_EQ(A * A * A,
    937                                   render_surface2->screen_space_transform());
    938   EXPECT_TRANSFORMATION_MATRIX_EQ(A * A * A * A,
    939                                   child_of_rs2->screen_space_transform());
    940   EXPECT_TRANSFORMATION_MATRIX_EQ(A * A * A * A * A,
    941                                   grand_child_of_rs2->screen_space_transform());
    942 
    943   // Verify render surface transforms.
    944   //
    945   // Draw transform of render surface 1 is described with respect to root.
    946   EXPECT_TRANSFORMATION_MATRIX_EQ(
    947       A * A * S1, render_surface1->render_surface()->draw_transform());
    948   EXPECT_TRANSFORMATION_MATRIX_EQ(
    949       A * R * S1, render_surface1->render_surface()->replica_draw_transform());
    950   EXPECT_TRANSFORMATION_MATRIX_EQ(
    951       A * A * S1, render_surface1->render_surface()->screen_space_transform());
    952   EXPECT_TRANSFORMATION_MATRIX_EQ(
    953       A * R * S1,
    954       render_surface1->render_surface()->replica_screen_space_transform());
    955   // Draw transform of render surface 2 is described with respect to render
    956   // surface 1.
    957   EXPECT_TRANSFORMATION_MATRIX_EQ(
    958       SS1 * A * S2, render_surface2->render_surface()->draw_transform());
    959   EXPECT_TRANSFORMATION_MATRIX_EQ(
    960       SS1 * R * S2,
    961       render_surface2->render_surface()->replica_draw_transform());
    962   EXPECT_TRANSFORMATION_MATRIX_EQ(
    963       A * A * A * S2,
    964       render_surface2->render_surface()->screen_space_transform());
    965   EXPECT_TRANSFORMATION_MATRIX_EQ(
    966       A * A * R * S2,
    967       render_surface2->render_surface()->replica_screen_space_transform());
    968 
    969   // Sanity check. If these fail there is probably a bug in the test itself.  It
    970   // is expected that we correctly set up transforms so that the y-component of
    971   // the screen-space transform encodes the "depth" of the layer in the tree.
    972   EXPECT_FLOAT_EQ(1.0, parent->screen_space_transform().matrix().get(1, 3));
    973   EXPECT_FLOAT_EQ(2.0,
    974                   child_of_root->screen_space_transform().matrix().get(1, 3));
    975   EXPECT_FLOAT_EQ(
    976       3.0, grand_child_of_root->screen_space_transform().matrix().get(1, 3));
    977 
    978   EXPECT_FLOAT_EQ(2.0,
    979                   render_surface1->screen_space_transform().matrix().get(1, 3));
    980   EXPECT_FLOAT_EQ(3.0,
    981                   child_of_rs1->screen_space_transform().matrix().get(1, 3));
    982   EXPECT_FLOAT_EQ(
    983       4.0, grand_child_of_rs1->screen_space_transform().matrix().get(1, 3));
    984 
    985   EXPECT_FLOAT_EQ(3.0,
    986                   render_surface2->screen_space_transform().matrix().get(1, 3));
    987   EXPECT_FLOAT_EQ(4.0,
    988                   child_of_rs2->screen_space_transform().matrix().get(1, 3));
    989   EXPECT_FLOAT_EQ(
    990       5.0, grand_child_of_rs2->screen_space_transform().matrix().get(1, 3));
    991 }
    992 
    993 TEST_F(LayerTreeHostCommonTest, TransformsForFlatteningLayer) {
    994   // For layers that flatten their subtree, there should be an orthographic
    995   // projection (for x and y values) in the middle of the transform sequence.
    996   // Note that the way the code is currently implemented, it is not expected to
    997   // use a canonical orthographic projection.
    998 
    999   scoped_refptr<Layer> root = Layer::Create();
   1000   scoped_refptr<Layer> child = Layer::Create();
   1001   scoped_refptr<LayerWithForcedDrawsContent> grand_child =
   1002       make_scoped_refptr(new LayerWithForcedDrawsContent());
   1003 
   1004   gfx::Transform rotation_about_y_axis;
   1005   rotation_about_y_axis.RotateAboutYAxis(30.0);
   1006 
   1007   const gfx::Transform identity_matrix;
   1008   SetLayerPropertiesForTesting(root.get(),
   1009                                identity_matrix,
   1010                                gfx::Point3F(),
   1011                                gfx::PointF(),
   1012                                gfx::Size(100, 100),
   1013                                true,
   1014                                false);
   1015   SetLayerPropertiesForTesting(child.get(),
   1016                                rotation_about_y_axis,
   1017                                gfx::Point3F(),
   1018                                gfx::PointF(),
   1019                                gfx::Size(10, 10),
   1020                                true,
   1021                                false);
   1022   SetLayerPropertiesForTesting(grand_child.get(),
   1023                                rotation_about_y_axis,
   1024                                gfx::Point3F(),
   1025                                gfx::PointF(),
   1026                                gfx::Size(10, 10),
   1027                                true,
   1028                                false);
   1029 
   1030   root->AddChild(child);
   1031   child->AddChild(grand_child);
   1032   child->SetForceRenderSurface(true);
   1033 
   1034   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   1035   host->SetRootLayer(root);
   1036 
   1037   // No layers in this test should preserve 3d.
   1038   ASSERT_TRUE(root->should_flatten_transform());
   1039   ASSERT_TRUE(child->should_flatten_transform());
   1040   ASSERT_TRUE(grand_child->should_flatten_transform());
   1041 
   1042   gfx::Transform expected_child_draw_transform = rotation_about_y_axis;
   1043   gfx::Transform expected_child_screen_space_transform = rotation_about_y_axis;
   1044   gfx::Transform expected_grand_child_draw_transform =
   1045       rotation_about_y_axis;  // draws onto child's render surface
   1046   gfx::Transform flattened_rotation_about_y = rotation_about_y_axis;
   1047   flattened_rotation_about_y.FlattenTo2d();
   1048   gfx::Transform expected_grand_child_screen_space_transform =
   1049       flattened_rotation_about_y * rotation_about_y_axis;
   1050 
   1051   ExecuteCalculateDrawProperties(root.get());
   1052 
   1053   // The child's draw transform should have been taken by its surface.
   1054   ASSERT_TRUE(child->render_surface());
   1055   EXPECT_TRANSFORMATION_MATRIX_EQ(expected_child_draw_transform,
   1056                                   child->render_surface()->draw_transform());
   1057   EXPECT_TRANSFORMATION_MATRIX_EQ(
   1058       expected_child_screen_space_transform,
   1059       child->render_surface()->screen_space_transform());
   1060   EXPECT_TRANSFORMATION_MATRIX_EQ(identity_matrix, child->draw_transform());
   1061   EXPECT_TRANSFORMATION_MATRIX_EQ(expected_child_screen_space_transform,
   1062                                   child->screen_space_transform());
   1063   EXPECT_TRANSFORMATION_MATRIX_EQ(expected_grand_child_draw_transform,
   1064                                   grand_child->draw_transform());
   1065   EXPECT_TRANSFORMATION_MATRIX_EQ(expected_grand_child_screen_space_transform,
   1066                                   grand_child->screen_space_transform());
   1067 }
   1068 
   1069 TEST_F(LayerTreeHostCommonTest, TransformsForDegenerateIntermediateLayer) {
   1070   // A layer that is empty in one axis, but not the other, was accidentally
   1071   // skipping a necessary translation.  Without that translation, the coordinate
   1072   // space of the layer's draw transform is incorrect.
   1073   //
   1074   // Normally this isn't a problem, because the layer wouldn't be drawn anyway,
   1075   // but if that layer becomes a render surface, then its draw transform is
   1076   // implicitly inherited by the rest of the subtree, which then is positioned
   1077   // incorrectly as a result.
   1078 
   1079   scoped_refptr<Layer> root = Layer::Create();
   1080   scoped_refptr<Layer> child = Layer::Create();
   1081   scoped_refptr<LayerWithForcedDrawsContent> grand_child =
   1082       make_scoped_refptr(new LayerWithForcedDrawsContent());
   1083 
   1084   // The child height is zero, but has non-zero width that should be accounted
   1085   // for while computing draw transforms.
   1086   const gfx::Transform identity_matrix;
   1087   SetLayerPropertiesForTesting(root.get(),
   1088                                identity_matrix,
   1089                                gfx::Point3F(),
   1090                                gfx::PointF(),
   1091                                gfx::Size(100, 100),
   1092                                true,
   1093                                false);
   1094   SetLayerPropertiesForTesting(child.get(),
   1095                                identity_matrix,
   1096                                gfx::Point3F(),
   1097                                gfx::PointF(),
   1098                                gfx::Size(10, 0),
   1099                                true,
   1100                                false);
   1101   SetLayerPropertiesForTesting(grand_child.get(),
   1102                                identity_matrix,
   1103                                gfx::Point3F(),
   1104                                gfx::PointF(),
   1105                                gfx::Size(10, 10),
   1106                                true,
   1107                                false);
   1108 
   1109   root->AddChild(child);
   1110   child->AddChild(grand_child);
   1111   child->SetForceRenderSurface(true);
   1112 
   1113   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   1114   host->SetRootLayer(root);
   1115 
   1116   ExecuteCalculateDrawProperties(root.get());
   1117 
   1118   ASSERT_TRUE(child->render_surface());
   1119   // This is the real test, the rest are sanity checks.
   1120   EXPECT_TRANSFORMATION_MATRIX_EQ(identity_matrix,
   1121                                   child->render_surface()->draw_transform());
   1122   EXPECT_TRANSFORMATION_MATRIX_EQ(identity_matrix, child->draw_transform());
   1123   EXPECT_TRANSFORMATION_MATRIX_EQ(identity_matrix,
   1124                                   grand_child->draw_transform());
   1125 }
   1126 
   1127 TEST_F(LayerTreeHostCommonTest, TransformAboveRootLayer) {
   1128   // Transformations applied at the root of the tree should be forwarded
   1129   // to child layers instead of applied to the root RenderSurface.
   1130   const gfx::Transform identity_matrix;
   1131   scoped_refptr<LayerWithForcedDrawsContent> root =
   1132       new LayerWithForcedDrawsContent;
   1133   scoped_refptr<LayerWithForcedDrawsContent> child =
   1134       new LayerWithForcedDrawsContent;
   1135   child->SetScrollClipLayerId(root->id());
   1136   root->AddChild(child);
   1137 
   1138   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   1139   host->SetRootLayer(root);
   1140 
   1141   SetLayerPropertiesForTesting(root.get(),
   1142                                identity_matrix,
   1143                                gfx::Point3F(),
   1144                                gfx::PointF(),
   1145                                gfx::Size(20, 20),
   1146                                true,
   1147                                false);
   1148   SetLayerPropertiesForTesting(child.get(),
   1149                                identity_matrix,
   1150                                gfx::Point3F(),
   1151                                gfx::PointF(),
   1152                                gfx::Size(20, 20),
   1153                                true,
   1154                                false);
   1155 
   1156   gfx::Transform translate;
   1157   translate.Translate(50, 50);
   1158   {
   1159     RenderSurfaceLayerList render_surface_layer_list;
   1160     LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
   1161         root.get(), root->bounds(), translate, &render_surface_layer_list);
   1162     inputs.can_adjust_raster_scales = true;
   1163     LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   1164     EXPECT_EQ(translate, root->draw_properties().target_space_transform);
   1165     EXPECT_EQ(translate, child->draw_properties().target_space_transform);
   1166     EXPECT_EQ(identity_matrix, root->render_surface()->draw_transform());
   1167     EXPECT_EQ(1.f, root->draw_properties().device_scale_factor);
   1168     EXPECT_EQ(1.f, child->draw_properties().device_scale_factor);
   1169   }
   1170 
   1171   gfx::Transform scale;
   1172   scale.Scale(2, 2);
   1173   {
   1174     RenderSurfaceLayerList render_surface_layer_list;
   1175     LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
   1176         root.get(), root->bounds(), scale, &render_surface_layer_list);
   1177     inputs.can_adjust_raster_scales = true;
   1178     LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   1179     EXPECT_EQ(scale, root->draw_properties().target_space_transform);
   1180     EXPECT_EQ(scale, child->draw_properties().target_space_transform);
   1181     EXPECT_EQ(identity_matrix, root->render_surface()->draw_transform());
   1182     EXPECT_EQ(2.f, root->draw_properties().device_scale_factor);
   1183     EXPECT_EQ(2.f, child->draw_properties().device_scale_factor);
   1184   }
   1185 
   1186   gfx::Transform rotate;
   1187   rotate.Rotate(2);
   1188   {
   1189     RenderSurfaceLayerList render_surface_layer_list;
   1190     LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
   1191         root.get(), root->bounds(), rotate, &render_surface_layer_list);
   1192     inputs.can_adjust_raster_scales = true;
   1193     LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   1194     EXPECT_EQ(rotate, root->draw_properties().target_space_transform);
   1195     EXPECT_EQ(rotate, child->draw_properties().target_space_transform);
   1196     EXPECT_EQ(identity_matrix, root->render_surface()->draw_transform());
   1197     EXPECT_EQ(1.f, root->draw_properties().device_scale_factor);
   1198     EXPECT_EQ(1.f, child->draw_properties().device_scale_factor);
   1199   }
   1200 
   1201   gfx::Transform composite;
   1202   composite.ConcatTransform(translate);
   1203   composite.ConcatTransform(scale);
   1204   composite.ConcatTransform(rotate);
   1205   {
   1206     RenderSurfaceLayerList render_surface_layer_list;
   1207     LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
   1208         root.get(), root->bounds(), composite, &render_surface_layer_list);
   1209     inputs.can_adjust_raster_scales = true;
   1210     LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   1211     EXPECT_EQ(composite, root->draw_properties().target_space_transform);
   1212     EXPECT_EQ(composite, child->draw_properties().target_space_transform);
   1213     EXPECT_EQ(identity_matrix, root->render_surface()->draw_transform());
   1214   }
   1215 
   1216   // Verify it composes correctly with device scale.
   1217   float device_scale_factor = 1.5f;
   1218 
   1219   {
   1220     RenderSurfaceLayerList render_surface_layer_list;
   1221     LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
   1222         root.get(), root->bounds(), translate, &render_surface_layer_list);
   1223     inputs.device_scale_factor = device_scale_factor;
   1224     inputs.can_adjust_raster_scales = true;
   1225     LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   1226     gfx::Transform device_scaled_translate = translate;
   1227     device_scaled_translate.Scale(device_scale_factor, device_scale_factor);
   1228     EXPECT_EQ(device_scaled_translate,
   1229               root->draw_properties().target_space_transform);
   1230     EXPECT_EQ(device_scaled_translate,
   1231               child->draw_properties().target_space_transform);
   1232     EXPECT_EQ(identity_matrix, root->render_surface()->draw_transform());
   1233     EXPECT_EQ(device_scale_factor, root->draw_properties().device_scale_factor);
   1234     EXPECT_EQ(device_scale_factor,
   1235               child->draw_properties().device_scale_factor);
   1236   }
   1237 
   1238   // Verify it composes correctly with page scale.
   1239   float page_scale_factor = 2.f;
   1240 
   1241   {
   1242     RenderSurfaceLayerList render_surface_layer_list;
   1243     LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
   1244         root.get(), root->bounds(), translate, &render_surface_layer_list);
   1245     inputs.page_scale_factor = page_scale_factor;
   1246     inputs.page_scale_application_layer = root.get();
   1247     inputs.can_adjust_raster_scales = true;
   1248     LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   1249     gfx::Transform page_scaled_translate = translate;
   1250     page_scaled_translate.Scale(page_scale_factor, page_scale_factor);
   1251     EXPECT_EQ(translate, root->draw_properties().target_space_transform);
   1252     EXPECT_EQ(page_scaled_translate,
   1253               child->draw_properties().target_space_transform);
   1254     EXPECT_EQ(identity_matrix, root->render_surface()->draw_transform());
   1255     EXPECT_EQ(1.f, root->draw_properties().device_scale_factor);
   1256     EXPECT_EQ(1.f, child->draw_properties().device_scale_factor);
   1257   }
   1258 
   1259   // Verify that it composes correctly with transforms directly on root layer.
   1260   root->SetTransform(composite);
   1261 
   1262   {
   1263     RenderSurfaceLayerList render_surface_layer_list;
   1264     LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
   1265         root.get(), root->bounds(), composite, &render_surface_layer_list);
   1266     inputs.can_adjust_raster_scales = true;
   1267     LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   1268     gfx::Transform compositeSquared = composite;
   1269     compositeSquared.ConcatTransform(composite);
   1270     EXPECT_TRANSFORMATION_MATRIX_EQ(
   1271         compositeSquared, root->draw_properties().target_space_transform);
   1272     EXPECT_TRANSFORMATION_MATRIX_EQ(
   1273         compositeSquared, child->draw_properties().target_space_transform);
   1274     EXPECT_EQ(identity_matrix, root->render_surface()->draw_transform());
   1275   }
   1276 }
   1277 
   1278 TEST_F(LayerTreeHostCommonTest,
   1279        RenderSurfaceListForRenderSurfaceWithClippedLayer) {
   1280   scoped_refptr<Layer> parent = Layer::Create();
   1281   scoped_refptr<Layer> render_surface1 = Layer::Create();
   1282   scoped_refptr<LayerWithForcedDrawsContent> child =
   1283       make_scoped_refptr(new LayerWithForcedDrawsContent());
   1284 
   1285   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   1286   host->SetRootLayer(parent);
   1287 
   1288   const gfx::Transform identity_matrix;
   1289   SetLayerPropertiesForTesting(parent.get(),
   1290                                identity_matrix,
   1291                                gfx::Point3F(),
   1292                                gfx::PointF(),
   1293                                gfx::Size(10, 10),
   1294                                true,
   1295                                false);
   1296   SetLayerPropertiesForTesting(render_surface1.get(),
   1297                                identity_matrix,
   1298                                gfx::Point3F(),
   1299                                gfx::PointF(),
   1300                                gfx::Size(10, 10),
   1301                                true,
   1302                                false);
   1303   SetLayerPropertiesForTesting(child.get(),
   1304                                identity_matrix,
   1305                                gfx::Point3F(),
   1306                                gfx::PointF(30.f, 30.f),
   1307                                gfx::Size(10, 10),
   1308                                true,
   1309                                false);
   1310 
   1311   parent->AddChild(render_surface1);
   1312   parent->SetMasksToBounds(true);
   1313   render_surface1->AddChild(child);
   1314   render_surface1->SetForceRenderSurface(true);
   1315 
   1316   RenderSurfaceLayerList render_surface_layer_list;
   1317   LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
   1318       parent.get(),
   1319       parent->bounds(),
   1320       gfx::Transform(),
   1321       &render_surface_layer_list);
   1322   LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   1323 
   1324   // The child layer's content is entirely outside the parent's clip rect, so
   1325   // the intermediate render surface should not be listed here, even if it was
   1326   // forced to be created. Render surfaces without children or visible content
   1327   // are unexpected at draw time (e.g. we might try to create a content texture
   1328   // of size 0).
   1329   ASSERT_TRUE(parent->render_surface());
   1330   EXPECT_EQ(1U, render_surface_layer_list.size());
   1331 }
   1332 
   1333 TEST_F(LayerTreeHostCommonTest, RenderSurfaceListForTransparentChild) {
   1334   scoped_refptr<Layer> parent = Layer::Create();
   1335   scoped_refptr<Layer> render_surface1 = Layer::Create();
   1336   scoped_refptr<LayerWithForcedDrawsContent> child =
   1337       make_scoped_refptr(new LayerWithForcedDrawsContent());
   1338 
   1339   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   1340   host->SetRootLayer(parent);
   1341 
   1342   const gfx::Transform identity_matrix;
   1343   SetLayerPropertiesForTesting(render_surface1.get(),
   1344                                identity_matrix,
   1345                                gfx::Point3F(),
   1346                                gfx::PointF(),
   1347                                gfx::Size(10, 10),
   1348                                true,
   1349                                false);
   1350   SetLayerPropertiesForTesting(child.get(),
   1351                                identity_matrix,
   1352                                gfx::Point3F(),
   1353                                gfx::PointF(),
   1354                                gfx::Size(10, 10),
   1355                                true,
   1356                                false);
   1357 
   1358   parent->AddChild(render_surface1);
   1359   render_surface1->AddChild(child);
   1360   render_surface1->SetForceRenderSurface(true);
   1361   render_surface1->SetOpacity(0.f);
   1362 
   1363   RenderSurfaceLayerList render_surface_layer_list;
   1364   LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
   1365       parent.get(), parent->bounds(), &render_surface_layer_list);
   1366   inputs.can_adjust_raster_scales = true;
   1367   LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   1368 
   1369   // Since the layer is transparent, render_surface1->render_surface() should
   1370   // not have gotten added anywhere.  Also, the drawable content rect should not
   1371   // have been extended by the children.
   1372   ASSERT_TRUE(parent->render_surface());
   1373   EXPECT_EQ(0U, parent->render_surface()->layer_list().size());
   1374   EXPECT_EQ(1U, render_surface_layer_list.size());
   1375   EXPECT_EQ(parent->id(), render_surface_layer_list.at(0)->id());
   1376   EXPECT_EQ(gfx::Rect(), parent->drawable_content_rect());
   1377 }
   1378 
   1379 TEST_F(LayerTreeHostCommonTest, ForceRenderSurface) {
   1380   scoped_refptr<Layer> parent = Layer::Create();
   1381   scoped_refptr<Layer> render_surface1 = Layer::Create();
   1382   scoped_refptr<LayerWithForcedDrawsContent> child =
   1383       make_scoped_refptr(new LayerWithForcedDrawsContent());
   1384   render_surface1->SetForceRenderSurface(true);
   1385 
   1386   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   1387   host->SetRootLayer(parent);
   1388 
   1389   const gfx::Transform identity_matrix;
   1390   SetLayerPropertiesForTesting(parent.get(),
   1391                                identity_matrix,
   1392                                gfx::Point3F(),
   1393                                gfx::PointF(),
   1394                                gfx::Size(10, 10),
   1395                                true,
   1396                                false);
   1397   SetLayerPropertiesForTesting(render_surface1.get(),
   1398                                identity_matrix,
   1399                                gfx::Point3F(),
   1400                                gfx::PointF(),
   1401                                gfx::Size(10, 10),
   1402                                true,
   1403                                false);
   1404   SetLayerPropertiesForTesting(child.get(),
   1405                                identity_matrix,
   1406                                gfx::Point3F(),
   1407                                gfx::PointF(),
   1408                                gfx::Size(10, 10),
   1409                                true,
   1410                                false);
   1411 
   1412   parent->AddChild(render_surface1);
   1413   render_surface1->AddChild(child);
   1414 
   1415   // Sanity check before the actual test
   1416   EXPECT_FALSE(parent->render_surface());
   1417   EXPECT_FALSE(render_surface1->render_surface());
   1418 
   1419   {
   1420     RenderSurfaceLayerList render_surface_layer_list;
   1421     LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
   1422         parent.get(), parent->bounds(), &render_surface_layer_list);
   1423     inputs.can_adjust_raster_scales = true;
   1424     LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   1425 
   1426     // The root layer always creates a render surface
   1427     EXPECT_TRUE(parent->render_surface());
   1428     EXPECT_TRUE(render_surface1->render_surface());
   1429     EXPECT_EQ(2U, render_surface_layer_list.size());
   1430   }
   1431 
   1432   {
   1433     RenderSurfaceLayerList render_surface_layer_list;
   1434     render_surface1->SetForceRenderSurface(false);
   1435     LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
   1436         parent.get(), parent->bounds(), &render_surface_layer_list);
   1437     inputs.can_adjust_raster_scales = true;
   1438     LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   1439     EXPECT_TRUE(parent->render_surface());
   1440     EXPECT_FALSE(render_surface1->render_surface());
   1441     EXPECT_EQ(1U, render_surface_layer_list.size());
   1442   }
   1443 }
   1444 
   1445 TEST_F(LayerTreeHostCommonTest, ClipRectCullsRenderSurfaces) {
   1446   // The entire subtree of layers that are outside the clip rect should be
   1447   // culled away, and should not affect the render_surface_layer_list.
   1448   //
   1449   // The test tree is set up as follows:
   1450   //  - all layers except the leaf_nodes are forced to be a new render surface
   1451   //  that have something to draw.
   1452   //  - parent is a large container layer.
   1453   //  - child has masksToBounds=true to cause clipping.
   1454   //  - grand_child is positioned outside of the child's bounds
   1455   //  - great_grand_child is also kept outside child's bounds.
   1456   //
   1457   // In this configuration, grand_child and great_grand_child are completely
   1458   // outside the clip rect, and they should never get scheduled on the list of
   1459   // render surfaces.
   1460   //
   1461 
   1462   const gfx::Transform identity_matrix;
   1463   scoped_refptr<Layer> parent = Layer::Create();
   1464   scoped_refptr<Layer> child = Layer::Create();
   1465   scoped_refptr<Layer> grand_child = Layer::Create();
   1466   scoped_refptr<Layer> great_grand_child = Layer::Create();
   1467   scoped_refptr<LayerWithForcedDrawsContent> leaf_node1 =
   1468       make_scoped_refptr(new LayerWithForcedDrawsContent());
   1469   scoped_refptr<LayerWithForcedDrawsContent> leaf_node2 =
   1470       make_scoped_refptr(new LayerWithForcedDrawsContent());
   1471   parent->AddChild(child);
   1472   child->AddChild(grand_child);
   1473   grand_child->AddChild(great_grand_child);
   1474 
   1475   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   1476   host->SetRootLayer(parent);
   1477 
   1478   // leaf_node1 ensures that parent and child are kept on the
   1479   // render_surface_layer_list, even though grand_child and great_grand_child
   1480   // should be clipped.
   1481   child->AddChild(leaf_node1);
   1482   great_grand_child->AddChild(leaf_node2);
   1483 
   1484   SetLayerPropertiesForTesting(parent.get(),
   1485                                identity_matrix,
   1486                                gfx::Point3F(),
   1487                                gfx::PointF(),
   1488                                gfx::Size(500, 500),
   1489                                true,
   1490                                false);
   1491   SetLayerPropertiesForTesting(child.get(),
   1492                                identity_matrix,
   1493                                gfx::Point3F(),
   1494                                gfx::PointF(),
   1495                                gfx::Size(20, 20),
   1496                                true,
   1497                                false);
   1498   SetLayerPropertiesForTesting(grand_child.get(),
   1499                                identity_matrix,
   1500                                gfx::Point3F(),
   1501                                gfx::PointF(45.f, 45.f),
   1502                                gfx::Size(10, 10),
   1503                                true,
   1504                                false);
   1505   SetLayerPropertiesForTesting(great_grand_child.get(),
   1506                                identity_matrix,
   1507                                gfx::Point3F(),
   1508                                gfx::PointF(),
   1509                                gfx::Size(10, 10),
   1510                                true,
   1511                                false);
   1512   SetLayerPropertiesForTesting(leaf_node1.get(),
   1513                                identity_matrix,
   1514                                gfx::Point3F(),
   1515                                gfx::PointF(),
   1516                                gfx::Size(500, 500),
   1517                                true,
   1518                                false);
   1519   SetLayerPropertiesForTesting(leaf_node2.get(),
   1520                                identity_matrix,
   1521                                gfx::Point3F(),
   1522                                gfx::PointF(),
   1523                                gfx::Size(20, 20),
   1524                                true,
   1525                                false);
   1526 
   1527   child->SetMasksToBounds(true);
   1528   child->SetOpacity(0.4f);
   1529   child->SetForceRenderSurface(true);
   1530   grand_child->SetOpacity(0.5f);
   1531   great_grand_child->SetOpacity(0.4f);
   1532 
   1533   RenderSurfaceLayerList render_surface_layer_list;
   1534   LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
   1535       parent.get(), parent->bounds(), &render_surface_layer_list);
   1536   inputs.can_adjust_raster_scales = true;
   1537   LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   1538 
   1539   ASSERT_EQ(2U, render_surface_layer_list.size());
   1540   EXPECT_EQ(parent->id(), render_surface_layer_list.at(0)->id());
   1541   EXPECT_EQ(child->id(), render_surface_layer_list.at(1)->id());
   1542 }
   1543 
   1544 TEST_F(LayerTreeHostCommonTest, ClipRectCullsSurfaceWithoutVisibleContent) {
   1545   // When a render surface has a clip rect, it is used to clip the content rect
   1546   // of the surface. When the render surface is animating its transforms, then
   1547   // the content rect's position in the clip rect is not defined on the main
   1548   // thread, and its content rect should not be clipped.
   1549 
   1550   // The test tree is set up as follows:
   1551   //  - parent is a container layer that masksToBounds=true to cause clipping.
   1552   //  - child is a render surface, which has a clip rect set to the bounds of
   1553   //  the parent.
   1554   //  - grand_child is a render surface, and the only visible content in child.
   1555   //  It is positioned outside of the clip rect from parent.
   1556 
   1557   // In this configuration, grand_child should be outside the clipped
   1558   // content rect of the child, making grand_child not appear in the
   1559   // render_surface_layer_list. However, when we place an animation on the
   1560   // child, this clipping should be avoided and we should keep the grand_child
   1561   // in the render_surface_layer_list.
   1562 
   1563   const gfx::Transform identity_matrix;
   1564   scoped_refptr<Layer> parent = Layer::Create();
   1565   scoped_refptr<Layer> child = Layer::Create();
   1566   scoped_refptr<Layer> grand_child = Layer::Create();
   1567   scoped_refptr<LayerWithForcedDrawsContent> leaf_node =
   1568       make_scoped_refptr(new LayerWithForcedDrawsContent());
   1569   parent->AddChild(child);
   1570   child->AddChild(grand_child);
   1571   grand_child->AddChild(leaf_node);
   1572 
   1573   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   1574   host->SetRootLayer(parent);
   1575 
   1576   SetLayerPropertiesForTesting(parent.get(),
   1577                                identity_matrix,
   1578                                gfx::Point3F(),
   1579                                gfx::PointF(),
   1580                                gfx::Size(100, 100),
   1581                                true,
   1582                                false);
   1583   SetLayerPropertiesForTesting(child.get(),
   1584                                identity_matrix,
   1585                                gfx::Point3F(),
   1586                                gfx::PointF(),
   1587                                gfx::Size(20, 20),
   1588                                true,
   1589                                false);
   1590   SetLayerPropertiesForTesting(grand_child.get(),
   1591                                identity_matrix,
   1592                                gfx::Point3F(),
   1593                                gfx::PointF(200.f, 200.f),
   1594                                gfx::Size(10, 10),
   1595                                true,
   1596                                false);
   1597   SetLayerPropertiesForTesting(leaf_node.get(),
   1598                                identity_matrix,
   1599                                gfx::Point3F(),
   1600                                gfx::PointF(),
   1601                                gfx::Size(10, 10),
   1602                                true,
   1603                                false);
   1604 
   1605   parent->SetMasksToBounds(true);
   1606   child->SetOpacity(0.4f);
   1607   child->SetForceRenderSurface(true);
   1608   grand_child->SetOpacity(0.4f);
   1609   grand_child->SetForceRenderSurface(true);
   1610 
   1611   {
   1612     RenderSurfaceLayerList render_surface_layer_list;
   1613     LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
   1614         parent.get(), parent->bounds(), &render_surface_layer_list);
   1615     inputs.can_adjust_raster_scales = true;
   1616     LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   1617 
   1618     // Without an animation, we should cull child and grand_child from the
   1619     // render_surface_layer_list.
   1620     ASSERT_EQ(1U, render_surface_layer_list.size());
   1621     EXPECT_EQ(parent->id(), render_surface_layer_list.at(0)->id());
   1622   }
   1623 
   1624   // Now put an animating transform on child.
   1625   AddAnimatedTransformToController(
   1626       child->layer_animation_controller(), 10.0, 30, 0);
   1627 
   1628   {
   1629     RenderSurfaceLayerList render_surface_layer_list;
   1630     LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
   1631         parent.get(), parent->bounds(), &render_surface_layer_list);
   1632     inputs.can_adjust_raster_scales = true;
   1633     LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   1634 
   1635     // With an animating transform, we should keep child and grand_child in the
   1636     // render_surface_layer_list.
   1637     ASSERT_EQ(3U, render_surface_layer_list.size());
   1638     EXPECT_EQ(parent->id(), render_surface_layer_list.at(0)->id());
   1639     EXPECT_EQ(child->id(), render_surface_layer_list.at(1)->id());
   1640     EXPECT_EQ(grand_child->id(), render_surface_layer_list.at(2)->id());
   1641   }
   1642 }
   1643 
   1644 TEST_F(LayerTreeHostCommonTest, IsClippedIsSetCorrectly) {
   1645   // Layer's IsClipped() property is set to true when:
   1646   //  - the layer clips its subtree, e.g. masks to bounds,
   1647   //  - the layer is clipped by an ancestor that contributes to the same
   1648   //    render target,
   1649   //  - a surface is clipped by an ancestor that contributes to the same
   1650   //    render target.
   1651   //
   1652   // In particular, for a layer that owns a render surface:
   1653   //  - the render surface inherits any clip from ancestors, and does NOT
   1654   //    pass that clipped status to the layer itself.
   1655   //  - but if the layer itself masks to bounds, it is considered clipped
   1656   //    and propagates the clip to the subtree.
   1657 
   1658   const gfx::Transform identity_matrix;
   1659   scoped_refptr<Layer> root = Layer::Create();
   1660   scoped_refptr<Layer> parent = Layer::Create();
   1661   scoped_refptr<Layer> child1 = Layer::Create();
   1662   scoped_refptr<Layer> child2 = Layer::Create();
   1663   scoped_refptr<Layer> grand_child = Layer::Create();
   1664   scoped_refptr<LayerWithForcedDrawsContent> leaf_node1 =
   1665       make_scoped_refptr(new LayerWithForcedDrawsContent());
   1666   scoped_refptr<LayerWithForcedDrawsContent> leaf_node2 =
   1667       make_scoped_refptr(new LayerWithForcedDrawsContent());
   1668   root->AddChild(parent);
   1669   parent->AddChild(child1);
   1670   parent->AddChild(child2);
   1671   child1->AddChild(grand_child);
   1672   child2->AddChild(leaf_node2);
   1673   grand_child->AddChild(leaf_node1);
   1674 
   1675   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   1676   host->SetRootLayer(root);
   1677 
   1678   child2->SetForceRenderSurface(true);
   1679 
   1680   SetLayerPropertiesForTesting(root.get(),
   1681                                identity_matrix,
   1682                                gfx::Point3F(),
   1683                                gfx::PointF(),
   1684                                gfx::Size(100, 100),
   1685                                true,
   1686                                false);
   1687   SetLayerPropertiesForTesting(parent.get(),
   1688                                identity_matrix,
   1689                                gfx::Point3F(),
   1690                                gfx::PointF(),
   1691                                gfx::Size(100, 100),
   1692                                true,
   1693                                false);
   1694   SetLayerPropertiesForTesting(child1.get(),
   1695                                identity_matrix,
   1696                                gfx::Point3F(),
   1697                                gfx::PointF(),
   1698                                gfx::Size(100, 100),
   1699                                true,
   1700                                false);
   1701   SetLayerPropertiesForTesting(child2.get(),
   1702                                identity_matrix,
   1703                                gfx::Point3F(),
   1704                                gfx::PointF(),
   1705                                gfx::Size(100, 100),
   1706                                true,
   1707                                false);
   1708   SetLayerPropertiesForTesting(grand_child.get(),
   1709                                identity_matrix,
   1710                                gfx::Point3F(),
   1711                                gfx::PointF(),
   1712                                gfx::Size(100, 100),
   1713                                true,
   1714                                false);
   1715   SetLayerPropertiesForTesting(leaf_node1.get(),
   1716                                identity_matrix,
   1717                                gfx::Point3F(),
   1718                                gfx::PointF(),
   1719                                gfx::Size(100, 100),
   1720                                true,
   1721                                false);
   1722   SetLayerPropertiesForTesting(leaf_node2.get(),
   1723                                identity_matrix,
   1724                                gfx::Point3F(),
   1725                                gfx::PointF(),
   1726                                gfx::Size(100, 100),
   1727                                true,
   1728                                false);
   1729 
   1730   // Case 1: nothing is clipped except the root render surface.
   1731   {
   1732     RenderSurfaceLayerList render_surface_layer_list;
   1733     LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
   1734         root.get(), parent->bounds(), &render_surface_layer_list);
   1735     inputs.can_adjust_raster_scales = true;
   1736     LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   1737 
   1738     ASSERT_TRUE(root->render_surface());
   1739     ASSERT_TRUE(child2->render_surface());
   1740 
   1741     EXPECT_FALSE(root->is_clipped());
   1742     EXPECT_TRUE(root->render_surface()->is_clipped());
   1743     EXPECT_FALSE(parent->is_clipped());
   1744     EXPECT_FALSE(child1->is_clipped());
   1745     EXPECT_FALSE(child2->is_clipped());
   1746     EXPECT_FALSE(child2->render_surface()->is_clipped());
   1747     EXPECT_FALSE(grand_child->is_clipped());
   1748     EXPECT_FALSE(leaf_node1->is_clipped());
   1749     EXPECT_FALSE(leaf_node2->is_clipped());
   1750   }
   1751 
   1752   // Case 2: parent masksToBounds, so the parent, child1, and child2's
   1753   // surface are clipped. But layers that contribute to child2's surface are
   1754   // not clipped explicitly because child2's surface already accounts for
   1755   // that clip.
   1756   {
   1757     RenderSurfaceLayerList render_surface_layer_list;
   1758     parent->SetMasksToBounds(true);
   1759     LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
   1760         root.get(), parent->bounds(), &render_surface_layer_list);
   1761     inputs.can_adjust_raster_scales = true;
   1762     LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   1763 
   1764     ASSERT_TRUE(root->render_surface());
   1765     ASSERT_TRUE(child2->render_surface());
   1766 
   1767     EXPECT_FALSE(root->is_clipped());
   1768     EXPECT_TRUE(root->render_surface()->is_clipped());
   1769     EXPECT_TRUE(parent->is_clipped());
   1770     EXPECT_TRUE(child1->is_clipped());
   1771     EXPECT_FALSE(child2->is_clipped());
   1772     EXPECT_TRUE(child2->render_surface()->is_clipped());
   1773     EXPECT_TRUE(grand_child->is_clipped());
   1774     EXPECT_TRUE(leaf_node1->is_clipped());
   1775     EXPECT_FALSE(leaf_node2->is_clipped());
   1776   }
   1777 
   1778   // Case 3: child2 masksToBounds. The layer and subtree are clipped, and
   1779   // child2's render surface is not clipped.
   1780   {
   1781     RenderSurfaceLayerList render_surface_layer_list;
   1782     parent->SetMasksToBounds(false);
   1783     child2->SetMasksToBounds(true);
   1784     LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
   1785         root.get(), parent->bounds(), &render_surface_layer_list);
   1786     inputs.can_adjust_raster_scales = true;
   1787     LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   1788 
   1789     ASSERT_TRUE(root->render_surface());
   1790     ASSERT_TRUE(child2->render_surface());
   1791 
   1792     EXPECT_FALSE(root->is_clipped());
   1793     EXPECT_TRUE(root->render_surface()->is_clipped());
   1794     EXPECT_FALSE(parent->is_clipped());
   1795     EXPECT_FALSE(child1->is_clipped());
   1796     EXPECT_TRUE(child2->is_clipped());
   1797     EXPECT_FALSE(child2->render_surface()->is_clipped());
   1798     EXPECT_FALSE(grand_child->is_clipped());
   1799     EXPECT_FALSE(leaf_node1->is_clipped());
   1800     EXPECT_TRUE(leaf_node2->is_clipped());
   1801   }
   1802 }
   1803 
   1804 TEST_F(LayerTreeHostCommonTest, DrawableContentRectForLayers) {
   1805   // Verify that layers get the appropriate DrawableContentRect when their
   1806   // parent masksToBounds is true.
   1807   //
   1808   //   grand_child1 - completely inside the region; DrawableContentRect should
   1809   //   be the layer rect expressed in target space.
   1810   //   grand_child2 - partially clipped but NOT masksToBounds; the clip rect
   1811   //   will be the intersection of layer bounds and the mask region.
   1812   //   grand_child3 - partially clipped and masksToBounds; the
   1813   //   DrawableContentRect will still be the intersection of layer bounds and
   1814   //   the mask region.
   1815   //   grand_child4 - outside parent's clip rect; the DrawableContentRect should
   1816   //   be empty.
   1817   //
   1818 
   1819   const gfx::Transform identity_matrix;
   1820   scoped_refptr<Layer> parent = Layer::Create();
   1821   scoped_refptr<Layer> child = Layer::Create();
   1822   scoped_refptr<Layer> grand_child1 = Layer::Create();
   1823   scoped_refptr<Layer> grand_child2 = Layer::Create();
   1824   scoped_refptr<Layer> grand_child3 = Layer::Create();
   1825   scoped_refptr<Layer> grand_child4 = Layer::Create();
   1826 
   1827   parent->AddChild(child);
   1828   child->AddChild(grand_child1);
   1829   child->AddChild(grand_child2);
   1830   child->AddChild(grand_child3);
   1831   child->AddChild(grand_child4);
   1832 
   1833   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   1834   host->SetRootLayer(parent);
   1835 
   1836   SetLayerPropertiesForTesting(parent.get(),
   1837                                identity_matrix,
   1838                                gfx::Point3F(),
   1839                                gfx::PointF(),
   1840                                gfx::Size(500, 500),
   1841                                true,
   1842                                false);
   1843   SetLayerPropertiesForTesting(child.get(),
   1844                                identity_matrix,
   1845                                gfx::Point3F(),
   1846                                gfx::PointF(),
   1847                                gfx::Size(20, 20),
   1848                                true,
   1849                                false);
   1850   SetLayerPropertiesForTesting(grand_child1.get(),
   1851                                identity_matrix,
   1852                                gfx::Point3F(),
   1853                                gfx::PointF(5.f, 5.f),
   1854                                gfx::Size(10, 10),
   1855                                true,
   1856                                false);
   1857   SetLayerPropertiesForTesting(grand_child2.get(),
   1858                                identity_matrix,
   1859                                gfx::Point3F(),
   1860                                gfx::PointF(15.f, 15.f),
   1861                                gfx::Size(10, 10),
   1862                                true,
   1863                                false);
   1864   SetLayerPropertiesForTesting(grand_child3.get(),
   1865                                identity_matrix,
   1866                                gfx::Point3F(),
   1867                                gfx::PointF(15.f, 15.f),
   1868                                gfx::Size(10, 10),
   1869                                true,
   1870                                false);
   1871   SetLayerPropertiesForTesting(grand_child4.get(),
   1872                                identity_matrix,
   1873                                gfx::Point3F(),
   1874                                gfx::PointF(45.f, 45.f),
   1875                                gfx::Size(10, 10),
   1876                                true,
   1877                                false);
   1878 
   1879   child->SetMasksToBounds(true);
   1880   grand_child3->SetMasksToBounds(true);
   1881 
   1882   // Force everyone to be a render surface.
   1883   child->SetOpacity(0.4f);
   1884   grand_child1->SetOpacity(0.5f);
   1885   grand_child2->SetOpacity(0.5f);
   1886   grand_child3->SetOpacity(0.5f);
   1887   grand_child4->SetOpacity(0.5f);
   1888 
   1889   RenderSurfaceLayerList render_surface_layer_list;
   1890   LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
   1891       parent.get(), parent->bounds(), &render_surface_layer_list);
   1892   inputs.can_adjust_raster_scales = true;
   1893   LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   1894 
   1895   EXPECT_RECT_EQ(gfx::Rect(5, 5, 10, 10),
   1896                  grand_child1->drawable_content_rect());
   1897   EXPECT_RECT_EQ(gfx::Rect(15, 15, 5, 5),
   1898                  grand_child3->drawable_content_rect());
   1899   EXPECT_RECT_EQ(gfx::Rect(15, 15, 5, 5),
   1900                  grand_child3->drawable_content_rect());
   1901   EXPECT_TRUE(grand_child4->drawable_content_rect().IsEmpty());
   1902 }
   1903 
   1904 TEST_F(LayerTreeHostCommonTest, ClipRectIsPropagatedCorrectlyToSurfaces) {
   1905   // Verify that render surfaces (and their layers) get the appropriate
   1906   // clip rects when their parent masksToBounds is true.
   1907   //
   1908   // Layers that own render surfaces (at least for now) do not inherit any
   1909   // clipping; instead the surface will enforce the clip for the entire subtree.
   1910   // They may still have a clip rect of their own layer bounds, however, if
   1911   // masksToBounds was true.
   1912   const gfx::Transform identity_matrix;
   1913   scoped_refptr<Layer> parent = Layer::Create();
   1914   scoped_refptr<Layer> child = Layer::Create();
   1915   scoped_refptr<Layer> grand_child1 = Layer::Create();
   1916   scoped_refptr<Layer> grand_child2 = Layer::Create();
   1917   scoped_refptr<Layer> grand_child3 = Layer::Create();
   1918   scoped_refptr<Layer> grand_child4 = Layer::Create();
   1919   scoped_refptr<LayerWithForcedDrawsContent> leaf_node1 =
   1920       make_scoped_refptr(new LayerWithForcedDrawsContent());
   1921   scoped_refptr<LayerWithForcedDrawsContent> leaf_node2 =
   1922       make_scoped_refptr(new LayerWithForcedDrawsContent());
   1923   scoped_refptr<LayerWithForcedDrawsContent> leaf_node3 =
   1924       make_scoped_refptr(new LayerWithForcedDrawsContent());
   1925   scoped_refptr<LayerWithForcedDrawsContent> leaf_node4 =
   1926       make_scoped_refptr(new LayerWithForcedDrawsContent());
   1927 
   1928   parent->AddChild(child);
   1929   child->AddChild(grand_child1);
   1930   child->AddChild(grand_child2);
   1931   child->AddChild(grand_child3);
   1932   child->AddChild(grand_child4);
   1933 
   1934   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   1935   host->SetRootLayer(parent);
   1936 
   1937   // the leaf nodes ensure that these grand_children become render surfaces for
   1938   // this test.
   1939   grand_child1->AddChild(leaf_node1);
   1940   grand_child2->AddChild(leaf_node2);
   1941   grand_child3->AddChild(leaf_node3);
   1942   grand_child4->AddChild(leaf_node4);
   1943 
   1944   SetLayerPropertiesForTesting(parent.get(),
   1945                                identity_matrix,
   1946                                gfx::Point3F(),
   1947                                gfx::PointF(),
   1948                                gfx::Size(500, 500),
   1949                                true,
   1950                                false);
   1951   SetLayerPropertiesForTesting(child.get(),
   1952                                identity_matrix,
   1953                                gfx::Point3F(),
   1954                                gfx::PointF(),
   1955                                gfx::Size(20, 20),
   1956                                true,
   1957                                false);
   1958   SetLayerPropertiesForTesting(grand_child1.get(),
   1959                                identity_matrix,
   1960                                gfx::Point3F(),
   1961                                gfx::PointF(5.f, 5.f),
   1962                                gfx::Size(10, 10),
   1963                                true,
   1964                                false);
   1965   SetLayerPropertiesForTesting(grand_child2.get(),
   1966                                identity_matrix,
   1967                                gfx::Point3F(),
   1968                                gfx::PointF(15.f, 15.f),
   1969                                gfx::Size(10, 10),
   1970                                true,
   1971                                false);
   1972   SetLayerPropertiesForTesting(grand_child3.get(),
   1973                                identity_matrix,
   1974                                gfx::Point3F(),
   1975                                gfx::PointF(15.f, 15.f),
   1976                                gfx::Size(10, 10),
   1977                                true,
   1978                                false);
   1979   SetLayerPropertiesForTesting(grand_child4.get(),
   1980                                identity_matrix,
   1981                                gfx::Point3F(),
   1982                                gfx::PointF(45.f, 45.f),
   1983                                gfx::Size(10, 10),
   1984                                true,
   1985                                false);
   1986   SetLayerPropertiesForTesting(leaf_node1.get(),
   1987                                identity_matrix,
   1988                                gfx::Point3F(),
   1989                                gfx::PointF(),
   1990                                gfx::Size(10, 10),
   1991                                true,
   1992                                false);
   1993   SetLayerPropertiesForTesting(leaf_node2.get(),
   1994                                identity_matrix,
   1995                                gfx::Point3F(),
   1996                                gfx::PointF(),
   1997                                gfx::Size(10, 10),
   1998                                true,
   1999                                false);
   2000   SetLayerPropertiesForTesting(leaf_node3.get(),
   2001                                identity_matrix,
   2002                                gfx::Point3F(),
   2003                                gfx::PointF(),
   2004                                gfx::Size(10, 10),
   2005                                true,
   2006                                false);
   2007   SetLayerPropertiesForTesting(leaf_node4.get(),
   2008                                identity_matrix,
   2009                                gfx::Point3F(),
   2010                                gfx::PointF(),
   2011                                gfx::Size(10, 10),
   2012                                true,
   2013                                false);
   2014 
   2015   child->SetMasksToBounds(true);
   2016   grand_child3->SetMasksToBounds(true);
   2017   grand_child4->SetMasksToBounds(true);
   2018 
   2019   // Force everyone to be a render surface.
   2020   child->SetOpacity(0.4f);
   2021   child->SetForceRenderSurface(true);
   2022   grand_child1->SetOpacity(0.5f);
   2023   grand_child1->SetForceRenderSurface(true);
   2024   grand_child2->SetOpacity(0.5f);
   2025   grand_child2->SetForceRenderSurface(true);
   2026   grand_child3->SetOpacity(0.5f);
   2027   grand_child3->SetForceRenderSurface(true);
   2028   grand_child4->SetOpacity(0.5f);
   2029   grand_child4->SetForceRenderSurface(true);
   2030 
   2031   RenderSurfaceLayerList render_surface_layer_list;
   2032   LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
   2033       parent.get(), parent->bounds(), &render_surface_layer_list);
   2034   inputs.can_adjust_raster_scales = true;
   2035   LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   2036   ASSERT_TRUE(grand_child1->render_surface());
   2037   ASSERT_TRUE(grand_child2->render_surface());
   2038   ASSERT_TRUE(grand_child3->render_surface());
   2039 
   2040   // Surfaces are clipped by their parent, but un-affected by the owning layer's
   2041   // masksToBounds.
   2042   EXPECT_RECT_EQ(gfx::Rect(0, 0, 20, 20),
   2043                  grand_child1->render_surface()->clip_rect());
   2044   EXPECT_RECT_EQ(gfx::Rect(0, 0, 20, 20),
   2045                  grand_child2->render_surface()->clip_rect());
   2046   EXPECT_RECT_EQ(gfx::Rect(0, 0, 20, 20),
   2047                  grand_child3->render_surface()->clip_rect());
   2048 }
   2049 
   2050 TEST_F(LayerTreeHostCommonTest, AnimationsForRenderSurfaceHierarchy) {
   2051   scoped_refptr<Layer> parent = Layer::Create();
   2052   scoped_refptr<Layer> render_surface1 = Layer::Create();
   2053   scoped_refptr<Layer> render_surface2 = Layer::Create();
   2054   scoped_refptr<Layer> child_of_root = Layer::Create();
   2055   scoped_refptr<Layer> child_of_rs1 = Layer::Create();
   2056   scoped_refptr<Layer> child_of_rs2 = Layer::Create();
   2057   scoped_refptr<Layer> grand_child_of_root = Layer::Create();
   2058   scoped_refptr<LayerWithForcedDrawsContent> grand_child_of_rs1 =
   2059       make_scoped_refptr(new LayerWithForcedDrawsContent());
   2060   scoped_refptr<LayerWithForcedDrawsContent> grand_child_of_rs2 =
   2061       make_scoped_refptr(new LayerWithForcedDrawsContent());
   2062   parent->AddChild(render_surface1);
   2063   parent->AddChild(child_of_root);
   2064   render_surface1->AddChild(child_of_rs1);
   2065   render_surface1->AddChild(render_surface2);
   2066   render_surface2->AddChild(child_of_rs2);
   2067   child_of_root->AddChild(grand_child_of_root);
   2068   child_of_rs1->AddChild(grand_child_of_rs1);
   2069   child_of_rs2->AddChild(grand_child_of_rs2);
   2070 
   2071   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   2072   host->SetRootLayer(parent);
   2073 
   2074   // Make our render surfaces.
   2075   render_surface1->SetForceRenderSurface(true);
   2076   render_surface2->SetForceRenderSurface(true);
   2077 
   2078   gfx::Transform layer_transform;
   2079   layer_transform.Translate(1.0, 1.0);
   2080 
   2081   SetLayerPropertiesForTesting(parent.get(),
   2082                                layer_transform,
   2083                                gfx::Point3F(0.25f, 0.f, 0.f),
   2084                                gfx::PointF(2.5f, 0.f),
   2085                                gfx::Size(10, 10),
   2086                                true,
   2087                                false);
   2088   SetLayerPropertiesForTesting(render_surface1.get(),
   2089                                layer_transform,
   2090                                gfx::Point3F(0.25f, 0.f, 0.f),
   2091                                gfx::PointF(2.5f, 0.f),
   2092                                gfx::Size(10, 10),
   2093                                true,
   2094                                false);
   2095   SetLayerPropertiesForTesting(render_surface2.get(),
   2096                                layer_transform,
   2097                                gfx::Point3F(0.25f, 0.f, 0.f),
   2098                                gfx::PointF(2.5f, 0.f),
   2099                                gfx::Size(10, 10),
   2100                                true,
   2101                                false);
   2102   SetLayerPropertiesForTesting(child_of_root.get(),
   2103                                layer_transform,
   2104                                gfx::Point3F(0.25f, 0.f, 0.f),
   2105                                gfx::PointF(2.5f, 0.f),
   2106                                gfx::Size(10, 10),
   2107                                true,
   2108                                false);
   2109   SetLayerPropertiesForTesting(child_of_rs1.get(),
   2110                                layer_transform,
   2111                                gfx::Point3F(0.25f, 0.f, 0.f),
   2112                                gfx::PointF(2.5f, 0.f),
   2113                                gfx::Size(10, 10),
   2114                                true,
   2115                                false);
   2116   SetLayerPropertiesForTesting(child_of_rs2.get(),
   2117                                layer_transform,
   2118                                gfx::Point3F(0.25f, 0.f, 0.f),
   2119                                gfx::PointF(2.5f, 0.f),
   2120                                gfx::Size(10, 10),
   2121                                true,
   2122                                false);
   2123   SetLayerPropertiesForTesting(grand_child_of_root.get(),
   2124                                layer_transform,
   2125                                gfx::Point3F(0.25f, 0.f, 0.f),
   2126                                gfx::PointF(2.5f, 0.f),
   2127                                gfx::Size(10, 10),
   2128                                true,
   2129                                false);
   2130   SetLayerPropertiesForTesting(grand_child_of_rs1.get(),
   2131                                layer_transform,
   2132                                gfx::Point3F(0.25f, 0.f, 0.f),
   2133                                gfx::PointF(2.5f, 0.f),
   2134                                gfx::Size(10, 10),
   2135                                true,
   2136                                false);
   2137   SetLayerPropertiesForTesting(grand_child_of_rs2.get(),
   2138                                layer_transform,
   2139                                gfx::Point3F(0.25f, 0.f, 0.f),
   2140                                gfx::PointF(2.5f, 0.f),
   2141                                gfx::Size(10, 10),
   2142                                true,
   2143                                false);
   2144 
   2145   // Put an animated opacity on the render surface.
   2146   AddOpacityTransitionToController(
   2147       render_surface1->layer_animation_controller(), 10.0, 1.f, 0.f, false);
   2148 
   2149   // Also put an animated opacity on a layer without descendants.
   2150   AddOpacityTransitionToController(
   2151       grand_child_of_root->layer_animation_controller(), 10.0, 1.f, 0.f, false);
   2152 
   2153   // Put a transform animation on the render surface.
   2154   AddAnimatedTransformToController(
   2155       render_surface2->layer_animation_controller(), 10.0, 30, 0);
   2156 
   2157   // Also put transform animations on grand_child_of_root, and
   2158   // grand_child_of_rs2
   2159   AddAnimatedTransformToController(
   2160       grand_child_of_root->layer_animation_controller(), 10.0, 30, 0);
   2161   AddAnimatedTransformToController(
   2162       grand_child_of_rs2->layer_animation_controller(), 10.0, 30, 0);
   2163 
   2164   ExecuteCalculateDrawProperties(parent.get());
   2165 
   2166   // Only layers that are associated with render surfaces should have an actual
   2167   // RenderSurface() value.
   2168   ASSERT_TRUE(parent->render_surface());
   2169   ASSERT_FALSE(child_of_root->render_surface());
   2170   ASSERT_FALSE(grand_child_of_root->render_surface());
   2171 
   2172   ASSERT_TRUE(render_surface1->render_surface());
   2173   ASSERT_FALSE(child_of_rs1->render_surface());
   2174   ASSERT_FALSE(grand_child_of_rs1->render_surface());
   2175 
   2176   ASSERT_TRUE(render_surface2->render_surface());
   2177   ASSERT_FALSE(child_of_rs2->render_surface());
   2178   ASSERT_FALSE(grand_child_of_rs2->render_surface());
   2179 
   2180   // Verify all render target accessors
   2181   EXPECT_EQ(parent.get(), parent->render_target());
   2182   EXPECT_EQ(parent.get(), child_of_root->render_target());
   2183   EXPECT_EQ(parent.get(), grand_child_of_root->render_target());
   2184 
   2185   EXPECT_EQ(render_surface1.get(), render_surface1->render_target());
   2186   EXPECT_EQ(render_surface1.get(), child_of_rs1->render_target());
   2187   EXPECT_EQ(render_surface1.get(), grand_child_of_rs1->render_target());
   2188 
   2189   EXPECT_EQ(render_surface2.get(), render_surface2->render_target());
   2190   EXPECT_EQ(render_surface2.get(), child_of_rs2->render_target());
   2191   EXPECT_EQ(render_surface2.get(), grand_child_of_rs2->render_target());
   2192 
   2193   // Verify draw_opacity_is_animating values
   2194   EXPECT_FALSE(parent->draw_opacity_is_animating());
   2195   EXPECT_FALSE(child_of_root->draw_opacity_is_animating());
   2196   EXPECT_TRUE(grand_child_of_root->draw_opacity_is_animating());
   2197   EXPECT_FALSE(render_surface1->draw_opacity_is_animating());
   2198   EXPECT_TRUE(render_surface1->render_surface()->draw_opacity_is_animating());
   2199   EXPECT_FALSE(child_of_rs1->draw_opacity_is_animating());
   2200   EXPECT_FALSE(grand_child_of_rs1->draw_opacity_is_animating());
   2201   EXPECT_FALSE(render_surface2->draw_opacity_is_animating());
   2202   EXPECT_FALSE(render_surface2->render_surface()->draw_opacity_is_animating());
   2203   EXPECT_FALSE(child_of_rs2->draw_opacity_is_animating());
   2204   EXPECT_FALSE(grand_child_of_rs2->draw_opacity_is_animating());
   2205 
   2206   // Verify draw_transform_is_animating values
   2207   EXPECT_FALSE(parent->draw_transform_is_animating());
   2208   EXPECT_FALSE(child_of_root->draw_transform_is_animating());
   2209   EXPECT_TRUE(grand_child_of_root->draw_transform_is_animating());
   2210   EXPECT_FALSE(render_surface1->draw_transform_is_animating());
   2211   EXPECT_FALSE(render_surface1->render_surface()
   2212                    ->target_surface_transforms_are_animating());
   2213   EXPECT_FALSE(child_of_rs1->draw_transform_is_animating());
   2214   EXPECT_FALSE(grand_child_of_rs1->draw_transform_is_animating());
   2215   EXPECT_FALSE(render_surface2->draw_transform_is_animating());
   2216   EXPECT_TRUE(render_surface2->render_surface()
   2217                   ->target_surface_transforms_are_animating());
   2218   EXPECT_FALSE(child_of_rs2->draw_transform_is_animating());
   2219   EXPECT_TRUE(grand_child_of_rs2->draw_transform_is_animating());
   2220 
   2221   // Verify screen_space_transform_is_animating values
   2222   EXPECT_FALSE(parent->screen_space_transform_is_animating());
   2223   EXPECT_FALSE(child_of_root->screen_space_transform_is_animating());
   2224   EXPECT_TRUE(grand_child_of_root->screen_space_transform_is_animating());
   2225   EXPECT_FALSE(render_surface1->screen_space_transform_is_animating());
   2226   EXPECT_FALSE(render_surface1->render_surface()
   2227                    ->screen_space_transforms_are_animating());
   2228   EXPECT_FALSE(child_of_rs1->screen_space_transform_is_animating());
   2229   EXPECT_FALSE(grand_child_of_rs1->screen_space_transform_is_animating());
   2230   EXPECT_TRUE(render_surface2->screen_space_transform_is_animating());
   2231   EXPECT_TRUE(render_surface2->render_surface()
   2232                   ->screen_space_transforms_are_animating());
   2233   EXPECT_TRUE(child_of_rs2->screen_space_transform_is_animating());
   2234   EXPECT_TRUE(grand_child_of_rs2->screen_space_transform_is_animating());
   2235 
   2236   // Sanity check. If these fail there is probably a bug in the test itself.
   2237   // It is expected that we correctly set up transforms so that the y-component
   2238   // of the screen-space transform encodes the "depth" of the layer in the tree.
   2239   EXPECT_FLOAT_EQ(1.0, parent->screen_space_transform().matrix().get(1, 3));
   2240   EXPECT_FLOAT_EQ(2.0,
   2241                   child_of_root->screen_space_transform().matrix().get(1, 3));
   2242   EXPECT_FLOAT_EQ(
   2243       3.0, grand_child_of_root->screen_space_transform().matrix().get(1, 3));
   2244 
   2245   EXPECT_FLOAT_EQ(2.0,
   2246                   render_surface1->screen_space_transform().matrix().get(1, 3));
   2247   EXPECT_FLOAT_EQ(3.0,
   2248                   child_of_rs1->screen_space_transform().matrix().get(1, 3));
   2249   EXPECT_FLOAT_EQ(
   2250       4.0, grand_child_of_rs1->screen_space_transform().matrix().get(1, 3));
   2251 
   2252   EXPECT_FLOAT_EQ(3.0,
   2253                   render_surface2->screen_space_transform().matrix().get(1, 3));
   2254   EXPECT_FLOAT_EQ(4.0,
   2255                   child_of_rs2->screen_space_transform().matrix().get(1, 3));
   2256   EXPECT_FLOAT_EQ(
   2257       5.0, grand_child_of_rs2->screen_space_transform().matrix().get(1, 3));
   2258 }
   2259 
   2260 TEST_F(LayerTreeHostCommonTest, VisibleRectForIdentityTransform) {
   2261   // Test the calculateVisibleRect() function works correctly for identity
   2262   // transforms.
   2263 
   2264   gfx::Rect target_surface_rect = gfx::Rect(0, 0, 100, 100);
   2265   gfx::Transform layer_to_surface_transform;
   2266 
   2267   // Case 1: Layer is contained within the surface.
   2268   gfx::Rect layer_content_rect = gfx::Rect(10, 10, 30, 30);
   2269   gfx::Rect expected = gfx::Rect(10, 10, 30, 30);
   2270   gfx::Rect actual = LayerTreeHostCommon::CalculateVisibleRect(
   2271       target_surface_rect, layer_content_rect, layer_to_surface_transform);
   2272   EXPECT_RECT_EQ(expected, actual);
   2273 
   2274   // Case 2: Layer is outside the surface rect.
   2275   layer_content_rect = gfx::Rect(120, 120, 30, 30);
   2276   actual = LayerTreeHostCommon::CalculateVisibleRect(
   2277       target_surface_rect, layer_content_rect, layer_to_surface_transform);
   2278   EXPECT_TRUE(actual.IsEmpty());
   2279 
   2280   // Case 3: Layer is partially overlapping the surface rect.
   2281   layer_content_rect = gfx::Rect(80, 80, 30, 30);
   2282   expected = gfx::Rect(80, 80, 20, 20);
   2283   actual = LayerTreeHostCommon::CalculateVisibleRect(
   2284       target_surface_rect, layer_content_rect, layer_to_surface_transform);
   2285   EXPECT_RECT_EQ(expected, actual);
   2286 }
   2287 
   2288 TEST_F(LayerTreeHostCommonTest, VisibleRectForTranslations) {
   2289   // Test the calculateVisibleRect() function works correctly for scaling
   2290   // transforms.
   2291 
   2292   gfx::Rect target_surface_rect = gfx::Rect(0, 0, 100, 100);
   2293   gfx::Rect layer_content_rect = gfx::Rect(0, 0, 30, 30);
   2294   gfx::Transform layer_to_surface_transform;
   2295 
   2296   // Case 1: Layer is contained within the surface.
   2297   layer_to_surface_transform.MakeIdentity();
   2298   layer_to_surface_transform.Translate(10.0, 10.0);
   2299   gfx::Rect expected = gfx::Rect(0, 0, 30, 30);
   2300   gfx::Rect actual = LayerTreeHostCommon::CalculateVisibleRect(
   2301       target_surface_rect, layer_content_rect, layer_to_surface_transform);
   2302   EXPECT_RECT_EQ(expected, actual);
   2303 
   2304   // Case 2: Layer is outside the surface rect.
   2305   layer_to_surface_transform.MakeIdentity();
   2306   layer_to_surface_transform.Translate(120.0, 120.0);
   2307   actual = LayerTreeHostCommon::CalculateVisibleRect(
   2308       target_surface_rect, layer_content_rect, layer_to_surface_transform);
   2309   EXPECT_TRUE(actual.IsEmpty());
   2310 
   2311   // Case 3: Layer is partially overlapping the surface rect.
   2312   layer_to_surface_transform.MakeIdentity();
   2313   layer_to_surface_transform.Translate(80.0, 80.0);
   2314   expected = gfx::Rect(0, 0, 20, 20);
   2315   actual = LayerTreeHostCommon::CalculateVisibleRect(
   2316       target_surface_rect, layer_content_rect, layer_to_surface_transform);
   2317   EXPECT_RECT_EQ(expected, actual);
   2318 }
   2319 
   2320 TEST_F(LayerTreeHostCommonTest, VisibleRectFor2DRotations) {
   2321   // Test the calculateVisibleRect() function works correctly for rotations
   2322   // about z-axis (i.e. 2D rotations).  Remember that calculateVisibleRect()
   2323   // should return the g in the layer's space.
   2324 
   2325   gfx::Rect target_surface_rect = gfx::Rect(0, 0, 100, 100);
   2326   gfx::Rect layer_content_rect = gfx::Rect(0, 0, 30, 30);
   2327   gfx::Transform layer_to_surface_transform;
   2328 
   2329   // Case 1: Layer is contained within the surface.
   2330   layer_to_surface_transform.MakeIdentity();
   2331   layer_to_surface_transform.Translate(50.0, 50.0);
   2332   layer_to_surface_transform.Rotate(45.0);
   2333   gfx::Rect expected = gfx::Rect(0, 0, 30, 30);
   2334   gfx::Rect actual = LayerTreeHostCommon::CalculateVisibleRect(
   2335       target_surface_rect, layer_content_rect, layer_to_surface_transform);
   2336   EXPECT_RECT_EQ(expected, actual);
   2337 
   2338   // Case 2: Layer is outside the surface rect.
   2339   layer_to_surface_transform.MakeIdentity();
   2340   layer_to_surface_transform.Translate(-50.0, 0.0);
   2341   layer_to_surface_transform.Rotate(45.0);
   2342   actual = LayerTreeHostCommon::CalculateVisibleRect(
   2343       target_surface_rect, layer_content_rect, layer_to_surface_transform);
   2344   EXPECT_TRUE(actual.IsEmpty());
   2345 
   2346   // Case 3: The layer is rotated about its top-left corner. In surface space,
   2347   // the layer is oriented diagonally, with the left half outside of the render
   2348   // surface. In this case, the g should still be the entire layer
   2349   // (remember the g is computed in layer space); both the top-left
   2350   // and bottom-right corners of the layer are still visible.
   2351   layer_to_surface_transform.MakeIdentity();
   2352   layer_to_surface_transform.Rotate(45.0);
   2353   expected = gfx::Rect(0, 0, 30, 30);
   2354   actual = LayerTreeHostCommon::CalculateVisibleRect(
   2355       target_surface_rect, layer_content_rect, layer_to_surface_transform);
   2356   EXPECT_RECT_EQ(expected, actual);
   2357 
   2358   // Case 4: The layer is rotated about its top-left corner, and translated
   2359   // upwards. In surface space, the layer is oriented diagonally, with only the
   2360   // top corner of the surface overlapping the layer. In layer space, the render
   2361   // surface overlaps the right side of the layer. The g should be
   2362   // the layer's right half.
   2363   layer_to_surface_transform.MakeIdentity();
   2364   layer_to_surface_transform.Translate(0.0, -sqrt(2.0) * 15.0);
   2365   layer_to_surface_transform.Rotate(45.0);
   2366   expected = gfx::Rect(15, 0, 15, 30);  // Right half of layer bounds.
   2367   actual = LayerTreeHostCommon::CalculateVisibleRect(
   2368       target_surface_rect, layer_content_rect, layer_to_surface_transform);
   2369   EXPECT_RECT_EQ(expected, actual);
   2370 }
   2371 
   2372 TEST_F(LayerTreeHostCommonTest, VisibleRectFor3dOrthographicTransform) {
   2373   // Test that the calculateVisibleRect() function works correctly for 3d
   2374   // transforms.
   2375 
   2376   gfx::Rect target_surface_rect = gfx::Rect(0, 0, 100, 100);
   2377   gfx::Rect layer_content_rect = gfx::Rect(0, 0, 100, 100);
   2378   gfx::Transform layer_to_surface_transform;
   2379 
   2380   // Case 1: Orthographic projection of a layer rotated about y-axis by 45
   2381   // degrees, should be fully contained in the render surface.
   2382   layer_to_surface_transform.MakeIdentity();
   2383   layer_to_surface_transform.RotateAboutYAxis(45.0);
   2384   gfx::Rect expected = gfx::Rect(0, 0, 100, 100);
   2385   gfx::Rect actual = LayerTreeHostCommon::CalculateVisibleRect(
   2386       target_surface_rect, layer_content_rect, layer_to_surface_transform);
   2387   EXPECT_RECT_EQ(expected, actual);
   2388 
   2389   // Case 2: Orthographic projection of a layer rotated about y-axis by 45
   2390   // degrees, but shifted to the side so only the right-half the layer would be
   2391   // visible on the surface.
   2392   // 100 is the un-rotated layer width; divided by sqrt(2) is the rotated width.
   2393   SkMScalar half_width_of_rotated_layer =
   2394       SkDoubleToMScalar((100.0 / sqrt(2.0)) * 0.5);
   2395   layer_to_surface_transform.MakeIdentity();
   2396   layer_to_surface_transform.Translate(-half_width_of_rotated_layer, 0.0);
   2397   layer_to_surface_transform.RotateAboutYAxis(45.0);  // Rotates about the left
   2398                                                       // edge of the layer.
   2399   expected = gfx::Rect(50, 0, 50, 100);  // Tight half of the layer.
   2400   actual = LayerTreeHostCommon::CalculateVisibleRect(
   2401       target_surface_rect, layer_content_rect, layer_to_surface_transform);
   2402   EXPECT_RECT_EQ(expected, actual);
   2403 }
   2404 
   2405 TEST_F(LayerTreeHostCommonTest, VisibleRectFor3dPerspectiveTransform) {
   2406   // Test the calculateVisibleRect() function works correctly when the layer has
   2407   // a perspective projection onto the target surface.
   2408 
   2409   gfx::Rect target_surface_rect = gfx::Rect(0, 0, 100, 100);
   2410   gfx::Rect layer_content_rect = gfx::Rect(-50, -50, 200, 200);
   2411   gfx::Transform layer_to_surface_transform;
   2412 
   2413   // Case 1: Even though the layer is twice as large as the surface, due to
   2414   // perspective foreshortening, the layer will fit fully in the surface when
   2415   // its translated more than the perspective amount.
   2416   layer_to_surface_transform.MakeIdentity();
   2417 
   2418   // The following sequence of transforms applies the perspective about the
   2419   // center of the surface.
   2420   layer_to_surface_transform.Translate(50.0, 50.0);
   2421   layer_to_surface_transform.ApplyPerspectiveDepth(9.0);
   2422   layer_to_surface_transform.Translate(-50.0, -50.0);
   2423 
   2424   // This translate places the layer in front of the surface's projection plane.
   2425   layer_to_surface_transform.Translate3d(0.0, 0.0, -27.0);
   2426 
   2427   gfx::Rect expected = gfx::Rect(-50, -50, 200, 200);
   2428   gfx::Rect actual = LayerTreeHostCommon::CalculateVisibleRect(
   2429       target_surface_rect, layer_content_rect, layer_to_surface_transform);
   2430   EXPECT_RECT_EQ(expected, actual);
   2431 
   2432   // Case 2: same projection as before, except that the layer is also translated
   2433   // to the side, so that only the right half of the layer should be visible.
   2434   //
   2435   // Explanation of expected result: The perspective ratio is (z distance
   2436   // between layer and camera origin) / (z distance between projection plane and
   2437   // camera origin) == ((-27 - 9) / 9) Then, by similar triangles, if we want to
   2438   // move a layer by translating -50 units in projected surface units (so that
   2439   // only half of it is visible), then we would need to translate by (-36 / 9) *
   2440   // -50 == -200 in the layer's units.
   2441   layer_to_surface_transform.Translate3d(-200.0, 0.0, 0.0);
   2442   expected = gfx::Rect(gfx::Point(50, -50),
   2443                        gfx::Size(100, 200));  // The right half of the layer's
   2444                                               // bounding rect.
   2445   actual = LayerTreeHostCommon::CalculateVisibleRect(
   2446       target_surface_rect, layer_content_rect, layer_to_surface_transform);
   2447   EXPECT_RECT_EQ(expected, actual);
   2448 }
   2449 
   2450 TEST_F(LayerTreeHostCommonTest,
   2451        VisibleRectFor3dOrthographicIsNotClippedBehindSurface) {
   2452   // There is currently no explicit concept of an orthographic projection plane
   2453   // in our code (nor in the CSS spec to my knowledge). Therefore, layers that
   2454   // are technically behind the surface in an orthographic world should not be
   2455   // clipped when they are flattened to the surface.
   2456 
   2457   gfx::Rect target_surface_rect = gfx::Rect(0, 0, 100, 100);
   2458   gfx::Rect layer_content_rect = gfx::Rect(0, 0, 100, 100);
   2459   gfx::Transform layer_to_surface_transform;
   2460 
   2461   // This sequence of transforms effectively rotates the layer about the y-axis
   2462   // at the center of the layer.
   2463   layer_to_surface_transform.MakeIdentity();
   2464   layer_to_surface_transform.Translate(50.0, 0.0);
   2465   layer_to_surface_transform.RotateAboutYAxis(45.0);
   2466   layer_to_surface_transform.Translate(-50.0, 0.0);
   2467 
   2468   gfx::Rect expected = gfx::Rect(0, 0, 100, 100);
   2469   gfx::Rect actual = LayerTreeHostCommon::CalculateVisibleRect(
   2470       target_surface_rect, layer_content_rect, layer_to_surface_transform);
   2471   EXPECT_RECT_EQ(expected, actual);
   2472 }
   2473 
   2474 TEST_F(LayerTreeHostCommonTest, VisibleRectFor3dPerspectiveWhenClippedByW) {
   2475   // Test the calculateVisibleRect() function works correctly when projecting a
   2476   // surface onto a layer, but the layer is partially behind the camera (not
   2477   // just behind the projection plane). In this case, the cartesian coordinates
   2478   // may seem to be valid, but actually they are not. The visible rect needs to
   2479   // be properly clipped by the w = 0 plane in homogeneous coordinates before
   2480   // converting to cartesian coordinates.
   2481 
   2482   gfx::Rect target_surface_rect = gfx::Rect(-50, -50, 100, 100);
   2483   gfx::Rect layer_content_rect = gfx::Rect(-10, -1, 20, 2);
   2484   gfx::Transform layer_to_surface_transform;
   2485 
   2486   // The layer is positioned so that the right half of the layer should be in
   2487   // front of the camera, while the other half is behind the surface's
   2488   // projection plane. The following sequence of transforms applies the
   2489   // perspective and rotation about the center of the layer.
   2490   layer_to_surface_transform.MakeIdentity();
   2491   layer_to_surface_transform.ApplyPerspectiveDepth(1.0);
   2492   layer_to_surface_transform.Translate3d(-2.0, 0.0, 1.0);
   2493   layer_to_surface_transform.RotateAboutYAxis(45.0);
   2494 
   2495   // Sanity check that this transform does indeed cause w < 0 when applying the
   2496   // transform, otherwise this code is not testing the intended scenario.
   2497   bool clipped;
   2498   MathUtil::MapQuad(layer_to_surface_transform,
   2499                     gfx::QuadF(gfx::RectF(layer_content_rect)),
   2500                     &clipped);
   2501   ASSERT_TRUE(clipped);
   2502 
   2503   int expected_x_position = 0;
   2504   int expected_width = 10;
   2505   gfx::Rect actual = LayerTreeHostCommon::CalculateVisibleRect(
   2506       target_surface_rect, layer_content_rect, layer_to_surface_transform);
   2507   EXPECT_EQ(expected_x_position, actual.x());
   2508   EXPECT_EQ(expected_width, actual.width());
   2509 }
   2510 
   2511 TEST_F(LayerTreeHostCommonTest, VisibleRectForPerspectiveUnprojection) {
   2512   // To determine visible rect in layer space, there needs to be an
   2513   // un-projection from surface space to layer space. When the original
   2514   // transform was a perspective projection that was clipped, it returns a rect
   2515   // that encloses the clipped bounds.  Un-projecting this new rect may require
   2516   // clipping again.
   2517 
   2518   // This sequence of transforms causes one corner of the layer to protrude
   2519   // across the w = 0 plane, and should be clipped.
   2520   gfx::Rect target_surface_rect = gfx::Rect(-50, -50, 100, 100);
   2521   gfx::Rect layer_content_rect = gfx::Rect(-10, -10, 20, 20);
   2522   gfx::Transform layer_to_surface_transform;
   2523   layer_to_surface_transform.MakeIdentity();
   2524   layer_to_surface_transform.ApplyPerspectiveDepth(1.0);
   2525   layer_to_surface_transform.Translate3d(0.0, 0.0, -5.0);
   2526   layer_to_surface_transform.RotateAboutYAxis(45.0);
   2527   layer_to_surface_transform.RotateAboutXAxis(80.0);
   2528 
   2529   // Sanity check that un-projection does indeed cause w < 0, otherwise this
   2530   // code is not testing the intended scenario.
   2531   bool clipped;
   2532   gfx::RectF clipped_rect =
   2533       MathUtil::MapClippedRect(layer_to_surface_transform, layer_content_rect);
   2534   MathUtil::ProjectQuad(
   2535       Inverse(layer_to_surface_transform), gfx::QuadF(clipped_rect), &clipped);
   2536   ASSERT_TRUE(clipped);
   2537 
   2538   // Only the corner of the layer is not visible on the surface because of being
   2539   // clipped. But, the net result of rounding visible region to an axis-aligned
   2540   // rect is that the entire layer should still be considered visible.
   2541   gfx::Rect expected = gfx::Rect(-10, -10, 20, 20);
   2542   gfx::Rect actual = LayerTreeHostCommon::CalculateVisibleRect(
   2543       target_surface_rect, layer_content_rect, layer_to_surface_transform);
   2544   EXPECT_RECT_EQ(expected, actual);
   2545 }
   2546 
   2547 TEST_F(LayerTreeHostCommonTest, DrawableAndVisibleContentRectsForSimpleLayers) {
   2548   scoped_refptr<Layer> root = Layer::Create();
   2549   scoped_refptr<LayerWithForcedDrawsContent> child1 =
   2550       make_scoped_refptr(new LayerWithForcedDrawsContent());
   2551   scoped_refptr<LayerWithForcedDrawsContent> child2 =
   2552       make_scoped_refptr(new LayerWithForcedDrawsContent());
   2553   scoped_refptr<LayerWithForcedDrawsContent> child3 =
   2554       make_scoped_refptr(new LayerWithForcedDrawsContent());
   2555   root->AddChild(child1);
   2556   root->AddChild(child2);
   2557   root->AddChild(child3);
   2558 
   2559   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   2560   host->SetRootLayer(root);
   2561 
   2562   gfx::Transform identity_matrix;
   2563   SetLayerPropertiesForTesting(root.get(),
   2564                                identity_matrix,
   2565                                gfx::Point3F(),
   2566                                gfx::PointF(),
   2567                                gfx::Size(100, 100),
   2568                                true,
   2569                                false);
   2570   SetLayerPropertiesForTesting(child1.get(),
   2571                                identity_matrix,
   2572                                gfx::Point3F(),
   2573                                gfx::PointF(),
   2574                                gfx::Size(50, 50),
   2575                                true,
   2576                                false);
   2577   SetLayerPropertiesForTesting(child2.get(),
   2578                                identity_matrix,
   2579                                gfx::Point3F(),
   2580                                gfx::PointF(75.f, 75.f),
   2581                                gfx::Size(50, 50),
   2582                                true,
   2583                                false);
   2584   SetLayerPropertiesForTesting(child3.get(),
   2585                                identity_matrix,
   2586                                gfx::Point3F(),
   2587                                gfx::PointF(125.f, 125.f),
   2588                                gfx::Size(50, 50),
   2589                                true,
   2590                                false);
   2591 
   2592   ExecuteCalculateDrawProperties(root.get());
   2593 
   2594   EXPECT_RECT_EQ(gfx::Rect(0, 0, 100, 100),
   2595                  root->render_surface()->DrawableContentRect());
   2596   EXPECT_RECT_EQ(gfx::Rect(0, 0, 100, 100), root->drawable_content_rect());
   2597 
   2598   // Layers that do not draw content should have empty visible_content_rects.
   2599   EXPECT_RECT_EQ(gfx::Rect(0, 0, 0, 0), root->visible_content_rect());
   2600 
   2601   // layer visible_content_rects are clipped by their target surface.
   2602   EXPECT_RECT_EQ(gfx::Rect(0, 0, 50, 50), child1->visible_content_rect());
   2603   EXPECT_RECT_EQ(gfx::Rect(0, 0, 25, 25), child2->visible_content_rect());
   2604   EXPECT_TRUE(child3->visible_content_rect().IsEmpty());
   2605 
   2606   // layer drawable_content_rects are not clipped.
   2607   EXPECT_RECT_EQ(gfx::Rect(0, 0, 50, 50), child1->drawable_content_rect());
   2608   EXPECT_RECT_EQ(gfx::Rect(75, 75, 50, 50), child2->drawable_content_rect());
   2609   EXPECT_RECT_EQ(gfx::Rect(125, 125, 50, 50), child3->drawable_content_rect());
   2610 }
   2611 
   2612 TEST_F(LayerTreeHostCommonTest,
   2613        DrawableAndVisibleContentRectsForLayersClippedByLayer) {
   2614   scoped_refptr<Layer> root = Layer::Create();
   2615   scoped_refptr<Layer> child = Layer::Create();
   2616   scoped_refptr<LayerWithForcedDrawsContent> grand_child1 =
   2617       make_scoped_refptr(new LayerWithForcedDrawsContent());
   2618   scoped_refptr<LayerWithForcedDrawsContent> grand_child2 =
   2619       make_scoped_refptr(new LayerWithForcedDrawsContent());
   2620   scoped_refptr<LayerWithForcedDrawsContent> grand_child3 =
   2621       make_scoped_refptr(new LayerWithForcedDrawsContent());
   2622   root->AddChild(child);
   2623   child->AddChild(grand_child1);
   2624   child->AddChild(grand_child2);
   2625   child->AddChild(grand_child3);
   2626 
   2627   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   2628   host->SetRootLayer(root);
   2629 
   2630   gfx::Transform identity_matrix;
   2631   SetLayerPropertiesForTesting(root.get(),
   2632                                identity_matrix,
   2633                                gfx::Point3F(),
   2634                                gfx::PointF(),
   2635                                gfx::Size(100, 100),
   2636                                true,
   2637                                false);
   2638   SetLayerPropertiesForTesting(child.get(),
   2639                                identity_matrix,
   2640                                gfx::Point3F(),
   2641                                gfx::PointF(),
   2642                                gfx::Size(100, 100),
   2643                                true,
   2644                                false);
   2645   SetLayerPropertiesForTesting(grand_child1.get(),
   2646                                identity_matrix,
   2647                                gfx::Point3F(),
   2648                                gfx::PointF(5.f, 5.f),
   2649                                gfx::Size(50, 50),
   2650                                true,
   2651                                false);
   2652   SetLayerPropertiesForTesting(grand_child2.get(),
   2653                                identity_matrix,
   2654                                gfx::Point3F(),
   2655                                gfx::PointF(75.f, 75.f),
   2656                                gfx::Size(50, 50),
   2657                                true,
   2658                                false);
   2659   SetLayerPropertiesForTesting(grand_child3.get(),
   2660                                identity_matrix,
   2661                                gfx::Point3F(),
   2662                                gfx::PointF(125.f, 125.f),
   2663                                gfx::Size(50, 50),
   2664                                true,
   2665                                false);
   2666 
   2667   child->SetMasksToBounds(true);
   2668   ExecuteCalculateDrawProperties(root.get());
   2669 
   2670   ASSERT_FALSE(child->render_surface());
   2671 
   2672   EXPECT_RECT_EQ(gfx::Rect(0, 0, 100, 100),
   2673                  root->render_surface()->DrawableContentRect());
   2674   EXPECT_RECT_EQ(gfx::Rect(0, 0, 100, 100), root->drawable_content_rect());
   2675 
   2676   // Layers that do not draw content should have empty visible content rects.
   2677   EXPECT_RECT_EQ(gfx::Rect(0, 0, 0, 0), root->visible_content_rect());
   2678   EXPECT_RECT_EQ(gfx::Rect(0, 0, 0, 0), child->visible_content_rect());
   2679 
   2680   // All grandchild visible content rects should be clipped by child.
   2681   EXPECT_RECT_EQ(gfx::Rect(0, 0, 50, 50), grand_child1->visible_content_rect());
   2682   EXPECT_RECT_EQ(gfx::Rect(0, 0, 25, 25), grand_child2->visible_content_rect());
   2683   EXPECT_TRUE(grand_child3->visible_content_rect().IsEmpty());
   2684 
   2685   // All grandchild DrawableContentRects should also be clipped by child.
   2686   EXPECT_RECT_EQ(gfx::Rect(5, 5, 50, 50),
   2687                  grand_child1->drawable_content_rect());
   2688   EXPECT_RECT_EQ(gfx::Rect(75, 75, 25, 25),
   2689                  grand_child2->drawable_content_rect());
   2690   EXPECT_TRUE(grand_child3->drawable_content_rect().IsEmpty());
   2691 }
   2692 
   2693 TEST_F(LayerTreeHostCommonTest,
   2694        DrawableAndVisibleContentRectsForLayersInUnclippedRenderSurface) {
   2695   scoped_refptr<Layer> root = Layer::Create();
   2696   scoped_refptr<Layer> render_surface1 = Layer::Create();
   2697   scoped_refptr<LayerWithForcedDrawsContent> child1 =
   2698       make_scoped_refptr(new LayerWithForcedDrawsContent());
   2699   scoped_refptr<LayerWithForcedDrawsContent> child2 =
   2700       make_scoped_refptr(new LayerWithForcedDrawsContent());
   2701   scoped_refptr<LayerWithForcedDrawsContent> child3 =
   2702       make_scoped_refptr(new LayerWithForcedDrawsContent());
   2703   root->AddChild(render_surface1);
   2704   render_surface1->AddChild(child1);
   2705   render_surface1->AddChild(child2);
   2706   render_surface1->AddChild(child3);
   2707 
   2708   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   2709   host->SetRootLayer(root);
   2710 
   2711   gfx::Transform identity_matrix;
   2712   SetLayerPropertiesForTesting(root.get(),
   2713                                identity_matrix,
   2714                                gfx::Point3F(),
   2715                                gfx::PointF(),
   2716                                gfx::Size(100, 100),
   2717                                true,
   2718                                false);
   2719   SetLayerPropertiesForTesting(render_surface1.get(),
   2720                                identity_matrix,
   2721                                gfx::Point3F(),
   2722                                gfx::PointF(),
   2723                                gfx::Size(3, 4),
   2724                                true,
   2725                                false);
   2726   SetLayerPropertiesForTesting(child1.get(),
   2727                                identity_matrix,
   2728                                gfx::Point3F(),
   2729                                gfx::PointF(5.f, 5.f),
   2730                                gfx::Size(50, 50),
   2731                                true,
   2732                                false);
   2733   SetLayerPropertiesForTesting(child2.get(),
   2734                                identity_matrix,
   2735                                gfx::Point3F(),
   2736                                gfx::PointF(75.f, 75.f),
   2737                                gfx::Size(50, 50),
   2738                                true,
   2739                                false);
   2740   SetLayerPropertiesForTesting(child3.get(),
   2741                                identity_matrix,
   2742                                gfx::Point3F(),
   2743                                gfx::PointF(125.f, 125.f),
   2744                                gfx::Size(50, 50),
   2745                                true,
   2746                                false);
   2747 
   2748   render_surface1->SetForceRenderSurface(true);
   2749   ExecuteCalculateDrawProperties(root.get());
   2750 
   2751   ASSERT_TRUE(render_surface1->render_surface());
   2752 
   2753   EXPECT_RECT_EQ(gfx::Rect(0, 0, 100, 100),
   2754                  root->render_surface()->DrawableContentRect());
   2755   EXPECT_RECT_EQ(gfx::Rect(0, 0, 100, 100), root->drawable_content_rect());
   2756 
   2757   // Layers that do not draw content should have empty visible content rects.
   2758   EXPECT_RECT_EQ(gfx::Rect(0, 0, 0, 0), root->visible_content_rect());
   2759   EXPECT_RECT_EQ(gfx::Rect(0, 0, 0, 0),
   2760                  render_surface1->visible_content_rect());
   2761 
   2762   // An unclipped surface grows its DrawableContentRect to include all drawable
   2763   // regions of the subtree.
   2764   EXPECT_RECT_EQ(gfx::Rect(5, 5, 170, 170),
   2765                  render_surface1->render_surface()->DrawableContentRect());
   2766 
   2767   // All layers that draw content into the unclipped surface are also unclipped.
   2768   EXPECT_RECT_EQ(gfx::Rect(0, 0, 50, 50), child1->visible_content_rect());
   2769   EXPECT_RECT_EQ(gfx::Rect(0, 0, 50, 50), child2->visible_content_rect());
   2770   EXPECT_RECT_EQ(gfx::Rect(0, 0, 50, 50), child3->visible_content_rect());
   2771 
   2772   EXPECT_RECT_EQ(gfx::Rect(5, 5, 50, 50), child1->drawable_content_rect());
   2773   EXPECT_RECT_EQ(gfx::Rect(75, 75, 50, 50), child2->drawable_content_rect());
   2774   EXPECT_RECT_EQ(gfx::Rect(125, 125, 50, 50), child3->drawable_content_rect());
   2775 }
   2776 
   2777 TEST_F(LayerTreeHostCommonTest,
   2778        DrawableAndVisibleContentRectsForLayersWithUninvertibleTransform) {
   2779   scoped_refptr<Layer> root = Layer::Create();
   2780   scoped_refptr<LayerWithForcedDrawsContent> child =
   2781       make_scoped_refptr(new LayerWithForcedDrawsContent());
   2782   root->AddChild(child);
   2783 
   2784   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   2785   host->SetRootLayer(root);
   2786 
   2787   // Case 1: a truly degenerate matrix
   2788   gfx::Transform identity_matrix;
   2789   gfx::Transform uninvertible_matrix(0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
   2790   ASSERT_FALSE(uninvertible_matrix.IsInvertible());
   2791 
   2792   SetLayerPropertiesForTesting(root.get(),
   2793                                identity_matrix,
   2794                                gfx::Point3F(),
   2795                                gfx::PointF(),
   2796                                gfx::Size(100, 100),
   2797                                true,
   2798                                false);
   2799   SetLayerPropertiesForTesting(child.get(),
   2800                                uninvertible_matrix,
   2801                                gfx::Point3F(),
   2802                                gfx::PointF(5.f, 5.f),
   2803                                gfx::Size(50, 50),
   2804                                true,
   2805                                false);
   2806 
   2807   ExecuteCalculateDrawProperties(root.get());
   2808 
   2809   EXPECT_TRUE(child->visible_content_rect().IsEmpty());
   2810   EXPECT_TRUE(child->drawable_content_rect().IsEmpty());
   2811 
   2812   // Case 2: a matrix with flattened z, uninvertible and not visible according
   2813   // to the CSS spec.
   2814   uninvertible_matrix.MakeIdentity();
   2815   uninvertible_matrix.matrix().set(2, 2, 0.0);
   2816   ASSERT_FALSE(uninvertible_matrix.IsInvertible());
   2817 
   2818   SetLayerPropertiesForTesting(child.get(),
   2819                                uninvertible_matrix,
   2820                                gfx::Point3F(),
   2821                                gfx::PointF(5.f, 5.f),
   2822                                gfx::Size(50, 50),
   2823                                true,
   2824                                false);
   2825 
   2826   ExecuteCalculateDrawProperties(root.get());
   2827 
   2828   EXPECT_TRUE(child->visible_content_rect().IsEmpty());
   2829   EXPECT_TRUE(child->drawable_content_rect().IsEmpty());
   2830 
   2831   // Case 3: a matrix with flattened z, also uninvertible and not visible.
   2832   uninvertible_matrix.MakeIdentity();
   2833   uninvertible_matrix.Translate(500.0, 0.0);
   2834   uninvertible_matrix.matrix().set(2, 2, 0.0);
   2835   ASSERT_FALSE(uninvertible_matrix.IsInvertible());
   2836 
   2837   SetLayerPropertiesForTesting(child.get(),
   2838                                uninvertible_matrix,
   2839                                gfx::Point3F(),
   2840                                gfx::PointF(5.f, 5.f),
   2841                                gfx::Size(50, 50),
   2842                                true,
   2843                                false);
   2844 
   2845   ExecuteCalculateDrawProperties(root.get());
   2846 
   2847   EXPECT_TRUE(child->visible_content_rect().IsEmpty());
   2848   EXPECT_TRUE(child->drawable_content_rect().IsEmpty());
   2849 }
   2850 
   2851 TEST_F(LayerTreeHostCommonTest,
   2852        SingularTransformDoesNotPreventClearingDrawProperties) {
   2853   scoped_refptr<Layer> root = Layer::Create();
   2854   scoped_refptr<LayerWithForcedDrawsContent> child =
   2855       make_scoped_refptr(new LayerWithForcedDrawsContent());
   2856   root->AddChild(child);
   2857 
   2858   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   2859   host->SetRootLayer(root);
   2860 
   2861   gfx::Transform identity_matrix;
   2862   gfx::Transform uninvertible_matrix(0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
   2863   ASSERT_FALSE(uninvertible_matrix.IsInvertible());
   2864 
   2865   SetLayerPropertiesForTesting(root.get(),
   2866                                uninvertible_matrix,
   2867                                gfx::Point3F(),
   2868                                gfx::PointF(),
   2869                                gfx::Size(100, 100),
   2870                                true,
   2871                                false);
   2872   SetLayerPropertiesForTesting(child.get(),
   2873                                identity_matrix,
   2874                                gfx::Point3F(),
   2875                                gfx::PointF(5.f, 5.f),
   2876                                gfx::Size(50, 50),
   2877                                true,
   2878                                false);
   2879 
   2880   child->draw_properties().sorted_for_recursion = true;
   2881 
   2882   TransformOperations start_transform_operations;
   2883   start_transform_operations.AppendScale(1.f, 0.f, 0.f);
   2884 
   2885   TransformOperations end_transform_operations;
   2886   end_transform_operations.AppendScale(1.f, 1.f, 0.f);
   2887 
   2888   AddAnimatedTransformToLayer(
   2889       root.get(), 10.0, start_transform_operations, end_transform_operations);
   2890 
   2891   EXPECT_TRUE(root->TransformIsAnimating());
   2892 
   2893   ExecuteCalculateDrawProperties(root.get());
   2894 
   2895   EXPECT_FALSE(child->draw_properties().sorted_for_recursion);
   2896 }
   2897 
   2898 TEST_F(LayerTreeHostCommonTest,
   2899        SingularNonAnimatingTransformDoesNotPreventClearingDrawProperties) {
   2900   scoped_refptr<Layer> root = Layer::Create();
   2901 
   2902   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   2903   host->SetRootLayer(root);
   2904 
   2905   gfx::Transform identity_matrix;
   2906   gfx::Transform uninvertible_matrix(0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
   2907   ASSERT_FALSE(uninvertible_matrix.IsInvertible());
   2908 
   2909   SetLayerPropertiesForTesting(root.get(),
   2910                                uninvertible_matrix,
   2911                                gfx::Point3F(),
   2912                                gfx::PointF(),
   2913                                gfx::Size(100, 100),
   2914                                true,
   2915                                false);
   2916 
   2917   root->draw_properties().sorted_for_recursion = true;
   2918 
   2919   EXPECT_FALSE(root->TransformIsAnimating());
   2920 
   2921   ExecuteCalculateDrawProperties(root.get());
   2922 
   2923   EXPECT_FALSE(root->draw_properties().sorted_for_recursion);
   2924 }
   2925 
   2926 TEST_F(LayerTreeHostCommonTest,
   2927        DrawableAndVisibleContentRectsForLayersInClippedRenderSurface) {
   2928   scoped_refptr<Layer> root = Layer::Create();
   2929   scoped_refptr<Layer> render_surface1 = Layer::Create();
   2930   scoped_refptr<LayerWithForcedDrawsContent> child1 =
   2931       make_scoped_refptr(new LayerWithForcedDrawsContent());
   2932   scoped_refptr<LayerWithForcedDrawsContent> child2 =
   2933       make_scoped_refptr(new LayerWithForcedDrawsContent());
   2934   scoped_refptr<LayerWithForcedDrawsContent> child3 =
   2935       make_scoped_refptr(new LayerWithForcedDrawsContent());
   2936   root->AddChild(render_surface1);
   2937   render_surface1->AddChild(child1);
   2938   render_surface1->AddChild(child2);
   2939   render_surface1->AddChild(child3);
   2940 
   2941   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   2942   host->SetRootLayer(root);
   2943 
   2944   gfx::Transform identity_matrix;
   2945   SetLayerPropertiesForTesting(root.get(),
   2946                                identity_matrix,
   2947                                gfx::Point3F(),
   2948                                gfx::PointF(),
   2949                                gfx::Size(100, 100),
   2950                                true,
   2951                                false);
   2952   SetLayerPropertiesForTesting(render_surface1.get(),
   2953                                identity_matrix,
   2954                                gfx::Point3F(),
   2955                                gfx::PointF(),
   2956                                gfx::Size(3, 4),
   2957                                true,
   2958                                false);
   2959   SetLayerPropertiesForTesting(child1.get(),
   2960                                identity_matrix,
   2961                                gfx::Point3F(),
   2962                                gfx::PointF(5.f, 5.f),
   2963                                gfx::Size(50, 50),
   2964                                true,
   2965                                false);
   2966   SetLayerPropertiesForTesting(child2.get(),
   2967                                identity_matrix,
   2968                                gfx::Point3F(),
   2969                                gfx::PointF(75.f, 75.f),
   2970                                gfx::Size(50, 50),
   2971                                true,
   2972                                false);
   2973   SetLayerPropertiesForTesting(child3.get(),
   2974                                identity_matrix,
   2975                                gfx::Point3F(),
   2976                                gfx::PointF(125.f, 125.f),
   2977                                gfx::Size(50, 50),
   2978                                true,
   2979                                false);
   2980 
   2981   root->SetMasksToBounds(true);
   2982   render_surface1->SetForceRenderSurface(true);
   2983   ExecuteCalculateDrawProperties(root.get());
   2984 
   2985   ASSERT_TRUE(render_surface1->render_surface());
   2986 
   2987   EXPECT_RECT_EQ(gfx::Rect(0, 0, 100, 100),
   2988                  root->render_surface()->DrawableContentRect());
   2989   EXPECT_RECT_EQ(gfx::Rect(0, 0, 100, 100), root->drawable_content_rect());
   2990 
   2991   // Layers that do not draw content should have empty visible content rects.
   2992   EXPECT_RECT_EQ(gfx::Rect(0, 0, 0, 0), root->visible_content_rect());
   2993   EXPECT_RECT_EQ(gfx::Rect(0, 0, 0, 0),
   2994                  render_surface1->visible_content_rect());
   2995 
   2996   // A clipped surface grows its DrawableContentRect to include all drawable
   2997   // regions of the subtree, but also gets clamped by the ancestor's clip.
   2998   EXPECT_RECT_EQ(gfx::Rect(5, 5, 95, 95),
   2999                  render_surface1->render_surface()->DrawableContentRect());
   3000 
   3001   // All layers that draw content into the surface have their visible content
   3002   // rect clipped by the surface clip rect.
   3003   EXPECT_RECT_EQ(gfx::Rect(0, 0, 50, 50), child1->visible_content_rect());
   3004   EXPECT_RECT_EQ(gfx::Rect(0, 0, 25, 25), child2->visible_content_rect());
   3005   EXPECT_TRUE(child3->visible_content_rect().IsEmpty());
   3006 
   3007   // But the DrawableContentRects are unclipped.
   3008   EXPECT_RECT_EQ(gfx::Rect(5, 5, 50, 50), child1->drawable_content_rect());
   3009   EXPECT_RECT_EQ(gfx::Rect(75, 75, 50, 50), child2->drawable_content_rect());
   3010   EXPECT_RECT_EQ(gfx::Rect(125, 125, 50, 50), child3->drawable_content_rect());
   3011 }
   3012 
   3013 TEST_F(LayerTreeHostCommonTest,
   3014        DrawableAndVisibleContentRectsForSurfaceHierarchy) {
   3015   // Check that clipping does not propagate down surfaces.
   3016   scoped_refptr<Layer> root = Layer::Create();
   3017   scoped_refptr<Layer> render_surface1 = Layer::Create();
   3018   scoped_refptr<Layer> render_surface2 = Layer::Create();
   3019   scoped_refptr<LayerWithForcedDrawsContent> child1 =
   3020       make_scoped_refptr(new LayerWithForcedDrawsContent());
   3021   scoped_refptr<LayerWithForcedDrawsContent> child2 =
   3022       make_scoped_refptr(new LayerWithForcedDrawsContent());
   3023   scoped_refptr<LayerWithForcedDrawsContent> child3 =
   3024       make_scoped_refptr(new LayerWithForcedDrawsContent());
   3025   root->AddChild(render_surface1);
   3026   render_surface1->AddChild(render_surface2);
   3027   render_surface2->AddChild(child1);
   3028   render_surface2->AddChild(child2);
   3029   render_surface2->AddChild(child3);
   3030 
   3031   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   3032   host->SetRootLayer(root);
   3033 
   3034   gfx::Transform identity_matrix;
   3035   SetLayerPropertiesForTesting(root.get(),
   3036                                identity_matrix,
   3037                                gfx::Point3F(),
   3038                                gfx::PointF(),
   3039                                gfx::Size(100, 100),
   3040                                true,
   3041                                false);
   3042   SetLayerPropertiesForTesting(render_surface1.get(),
   3043                                identity_matrix,
   3044                                gfx::Point3F(),
   3045                                gfx::PointF(),
   3046                                gfx::Size(3, 4),
   3047                                true,
   3048                                false);
   3049   SetLayerPropertiesForTesting(render_surface2.get(),
   3050                                identity_matrix,
   3051                                gfx::Point3F(),
   3052                                gfx::PointF(),
   3053                                gfx::Size(7, 13),
   3054                                true,
   3055                                false);
   3056   SetLayerPropertiesForTesting(child1.get(),
   3057                                identity_matrix,
   3058                                gfx::Point3F(),
   3059                                gfx::PointF(5.f, 5.f),
   3060                                gfx::Size(50, 50),
   3061                                true,
   3062                                false);
   3063   SetLayerPropertiesForTesting(child2.get(),
   3064                                identity_matrix,
   3065                                gfx::Point3F(),
   3066                                gfx::PointF(75.f, 75.f),
   3067                                gfx::Size(50, 50),
   3068                                true,
   3069                                false);
   3070   SetLayerPropertiesForTesting(child3.get(),
   3071                                identity_matrix,
   3072                                gfx::Point3F(),
   3073                                gfx::PointF(125.f, 125.f),
   3074                                gfx::Size(50, 50),
   3075                                true,
   3076                                false);
   3077 
   3078   root->SetMasksToBounds(true);
   3079   render_surface1->SetForceRenderSurface(true);
   3080   render_surface2->SetForceRenderSurface(true);
   3081   ExecuteCalculateDrawProperties(root.get());
   3082 
   3083   ASSERT_TRUE(render_surface1->render_surface());
   3084   ASSERT_TRUE(render_surface2->render_surface());
   3085 
   3086   EXPECT_RECT_EQ(gfx::Rect(0, 0, 100, 100),
   3087                  root->render_surface()->DrawableContentRect());
   3088   EXPECT_RECT_EQ(gfx::Rect(0, 0, 100, 100), root->drawable_content_rect());
   3089 
   3090   // Layers that do not draw content should have empty visible content rects.
   3091   EXPECT_RECT_EQ(gfx::Rect(0, 0, 0, 0), root->visible_content_rect());
   3092   EXPECT_RECT_EQ(gfx::Rect(0, 0, 0, 0),
   3093                  render_surface1->visible_content_rect());
   3094   EXPECT_RECT_EQ(gfx::Rect(0, 0, 0, 0),
   3095                  render_surface2->visible_content_rect());
   3096 
   3097   // A clipped surface grows its DrawableContentRect to include all drawable
   3098   // regions of the subtree, but also gets clamped by the ancestor's clip.
   3099   EXPECT_RECT_EQ(gfx::Rect(5, 5, 95, 95),
   3100                  render_surface1->render_surface()->DrawableContentRect());
   3101 
   3102   // render_surface1 lives in the "unclipped universe" of render_surface1, and
   3103   // is only implicitly clipped by render_surface1's content rect. So,
   3104   // render_surface2 grows to enclose all drawable content of its subtree.
   3105   EXPECT_RECT_EQ(gfx::Rect(5, 5, 170, 170),
   3106                  render_surface2->render_surface()->DrawableContentRect());
   3107 
   3108   // All layers that draw content into render_surface2 think they are unclipped.
   3109   EXPECT_RECT_EQ(gfx::Rect(0, 0, 50, 50), child1->visible_content_rect());
   3110   EXPECT_RECT_EQ(gfx::Rect(0, 0, 50, 50), child2->visible_content_rect());
   3111   EXPECT_RECT_EQ(gfx::Rect(0, 0, 50, 50), child3->visible_content_rect());
   3112 
   3113   // DrawableContentRects are also unclipped.
   3114   EXPECT_RECT_EQ(gfx::Rect(5, 5, 50, 50), child1->drawable_content_rect());
   3115   EXPECT_RECT_EQ(gfx::Rect(75, 75, 50, 50), child2->drawable_content_rect());
   3116   EXPECT_RECT_EQ(gfx::Rect(125, 125, 50, 50), child3->drawable_content_rect());
   3117 }
   3118 
   3119 TEST_F(LayerTreeHostCommonTest,
   3120        DrawableAndVisibleContentRectsWithTransformOnUnclippedSurface) {
   3121   // Layers that have non-axis aligned bounds (due to transforms) have an
   3122   // expanded, axis-aligned DrawableContentRect and visible content rect.
   3123 
   3124   scoped_refptr<Layer> root = Layer::Create();
   3125   scoped_refptr<Layer> render_surface1 = Layer::Create();
   3126   scoped_refptr<LayerWithForcedDrawsContent> child1 =
   3127       make_scoped_refptr(new LayerWithForcedDrawsContent());
   3128   root->AddChild(render_surface1);
   3129   render_surface1->AddChild(child1);
   3130 
   3131   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   3132   host->SetRootLayer(root);
   3133 
   3134   gfx::Transform identity_matrix;
   3135   gfx::Transform child_rotation;
   3136   child_rotation.Rotate(45.0);
   3137   SetLayerPropertiesForTesting(root.get(),
   3138                                identity_matrix,
   3139                                gfx::Point3F(),
   3140                                gfx::PointF(),
   3141                                gfx::Size(100, 100),
   3142                                true,
   3143                                false);
   3144   SetLayerPropertiesForTesting(render_surface1.get(),
   3145                                identity_matrix,
   3146                                gfx::Point3F(),
   3147                                gfx::PointF(),
   3148                                gfx::Size(3, 4),
   3149                                true,
   3150                                false);
   3151   SetLayerPropertiesForTesting(child1.get(),
   3152                                child_rotation,
   3153                                gfx::Point3F(25, 25, 0.f),
   3154                                gfx::PointF(25.f, 25.f),
   3155                                gfx::Size(50, 50),
   3156                                true,
   3157                                false);
   3158 
   3159   render_surface1->SetForceRenderSurface(true);
   3160   ExecuteCalculateDrawProperties(root.get());
   3161 
   3162   ASSERT_TRUE(render_surface1->render_surface());
   3163 
   3164   EXPECT_RECT_EQ(gfx::Rect(0, 0, 100, 100),
   3165                  root->render_surface()->DrawableContentRect());
   3166   EXPECT_RECT_EQ(gfx::Rect(0, 0, 100, 100), root->drawable_content_rect());
   3167 
   3168   // Layers that do not draw content should have empty visible content rects.
   3169   EXPECT_RECT_EQ(gfx::Rect(0, 0, 0, 0), root->visible_content_rect());
   3170   EXPECT_RECT_EQ(gfx::Rect(0, 0, 0, 0),
   3171                  render_surface1->visible_content_rect());
   3172 
   3173   // The unclipped surface grows its DrawableContentRect to include all drawable
   3174   // regions of the subtree.
   3175   int diagonal_radius = ceil(sqrt(2.0) * 25.0);
   3176   gfx::Rect expected_surface_drawable_content =
   3177       gfx::Rect(50 - diagonal_radius,
   3178                 50 - diagonal_radius,
   3179                 diagonal_radius * 2,
   3180                 diagonal_radius * 2);
   3181   EXPECT_RECT_EQ(expected_surface_drawable_content,
   3182                  render_surface1->render_surface()->DrawableContentRect());
   3183 
   3184   // All layers that draw content into the unclipped surface are also unclipped.
   3185   EXPECT_RECT_EQ(gfx::Rect(0, 0, 50, 50), child1->visible_content_rect());
   3186   EXPECT_RECT_EQ(expected_surface_drawable_content,
   3187                  child1->drawable_content_rect());
   3188 }
   3189 
   3190 TEST_F(LayerTreeHostCommonTest,
   3191        DrawableAndVisibleContentRectsWithTransformOnClippedSurface) {
   3192   // Layers that have non-axis aligned bounds (due to transforms) have an
   3193   // expanded, axis-aligned DrawableContentRect and visible content rect.
   3194 
   3195   scoped_refptr<Layer> root = Layer::Create();
   3196   scoped_refptr<Layer> render_surface1 = Layer::Create();
   3197   scoped_refptr<LayerWithForcedDrawsContent> child1 =
   3198       make_scoped_refptr(new LayerWithForcedDrawsContent());
   3199   root->AddChild(render_surface1);
   3200   render_surface1->AddChild(child1);
   3201 
   3202   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   3203   host->SetRootLayer(root);
   3204 
   3205   gfx::Transform identity_matrix;
   3206   gfx::Transform child_rotation;
   3207   child_rotation.Rotate(45.0);
   3208   SetLayerPropertiesForTesting(root.get(),
   3209                                identity_matrix,
   3210                                gfx::Point3F(),
   3211                                gfx::PointF(),
   3212                                gfx::Size(50, 50),
   3213                                true,
   3214                                false);
   3215   SetLayerPropertiesForTesting(render_surface1.get(),
   3216                                identity_matrix,
   3217                                gfx::Point3F(),
   3218                                gfx::PointF(),
   3219                                gfx::Size(3, 4),
   3220                                true,
   3221                                false);
   3222 
   3223   SetLayerPropertiesForTesting(child1.get(),
   3224                                child_rotation,
   3225                                gfx::Point3F(25, 25, 0.f),
   3226                                gfx::PointF(25.f, 25.f),
   3227                                gfx::Size(50, 50),
   3228                                true,
   3229                                false);
   3230 
   3231   root->SetMasksToBounds(true);
   3232   render_surface1->SetForceRenderSurface(true);
   3233   ExecuteCalculateDrawProperties(root.get());
   3234 
   3235   ASSERT_TRUE(render_surface1->render_surface());
   3236 
   3237   // The clipped surface clamps the DrawableContentRect that encloses the
   3238   // rotated layer.
   3239   int diagonal_radius = ceil(sqrt(2.0) * 25.0);
   3240   gfx::Rect unclipped_surface_content = gfx::Rect(50 - diagonal_radius,
   3241                                                   50 - diagonal_radius,
   3242                                                   diagonal_radius * 2,
   3243                                                   diagonal_radius * 2);
   3244   gfx::Rect expected_surface_drawable_content =
   3245       gfx::IntersectRects(unclipped_surface_content, gfx::Rect(0, 0, 50, 50));
   3246   EXPECT_RECT_EQ(expected_surface_drawable_content,
   3247                  render_surface1->render_surface()->DrawableContentRect());
   3248 
   3249   // On the clipped surface, only a quarter  of the child1 is visible, but when
   3250   // rotating it back to  child1's content space, the actual enclosing rect ends
   3251   // up covering the full left half of child1.
   3252   //
   3253   // Given the floating point math, this number is a little bit fuzzy.
   3254   EXPECT_RECT_EQ(gfx::Rect(0, 0, 26, 50), child1->visible_content_rect());
   3255 
   3256   // The child's DrawableContentRect is unclipped.
   3257   EXPECT_RECT_EQ(unclipped_surface_content, child1->drawable_content_rect());
   3258 }
   3259 
   3260 TEST_F(LayerTreeHostCommonTest, DrawableAndVisibleContentRectsInHighDPI) {
   3261   MockContentLayerClient client;
   3262 
   3263   scoped_refptr<Layer> root = Layer::Create();
   3264   scoped_refptr<ContentLayer> render_surface1 =
   3265       CreateDrawableContentLayer(&client);
   3266   scoped_refptr<ContentLayer> render_surface2 =
   3267       CreateDrawableContentLayer(&client);
   3268   scoped_refptr<ContentLayer> child1 = CreateDrawableContentLayer(&client);
   3269   scoped_refptr<ContentLayer> child2 = CreateDrawableContentLayer(&client);
   3270   scoped_refptr<ContentLayer> child3 = CreateDrawableContentLayer(&client);
   3271   root->AddChild(render_surface1);
   3272   render_surface1->AddChild(render_surface2);
   3273   render_surface2->AddChild(child1);
   3274   render_surface2->AddChild(child2);
   3275   render_surface2->AddChild(child3);
   3276 
   3277   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   3278   host->SetRootLayer(root);
   3279 
   3280   gfx::Transform identity_matrix;
   3281   SetLayerPropertiesForTesting(root.get(),
   3282                                identity_matrix,
   3283                                gfx::Point3F(),
   3284                                gfx::PointF(),
   3285                                gfx::Size(100, 100),
   3286                                true,
   3287                                false);
   3288   SetLayerPropertiesForTesting(render_surface1.get(),
   3289                                identity_matrix,
   3290                                gfx::Point3F(),
   3291                                gfx::PointF(5.f, 5.f),
   3292                                gfx::Size(3, 4),
   3293                                true,
   3294                                false);
   3295   SetLayerPropertiesForTesting(render_surface2.get(),
   3296                                identity_matrix,
   3297                                gfx::Point3F(),
   3298                                gfx::PointF(5.f, 5.f),
   3299                                gfx::Size(7, 13),
   3300                                true,
   3301                                false);
   3302   SetLayerPropertiesForTesting(child1.get(),
   3303                                identity_matrix,
   3304                                gfx::Point3F(),
   3305                                gfx::PointF(5.f, 5.f),
   3306                                gfx::Size(50, 50),
   3307                                true,
   3308                                false);
   3309   SetLayerPropertiesForTesting(child2.get(),
   3310                                identity_matrix,
   3311                                gfx::Point3F(),
   3312                                gfx::PointF(75.f, 75.f),
   3313                                gfx::Size(50, 50),
   3314                                true,
   3315                                false);
   3316   SetLayerPropertiesForTesting(child3.get(),
   3317                                identity_matrix,
   3318                                gfx::Point3F(),
   3319                                gfx::PointF(125.f, 125.f),
   3320                                gfx::Size(50, 50),
   3321                                true,
   3322                                false);
   3323 
   3324   float device_scale_factor = 2.f;
   3325 
   3326   root->SetMasksToBounds(true);
   3327   render_surface1->SetForceRenderSurface(true);
   3328   render_surface2->SetForceRenderSurface(true);
   3329   ExecuteCalculateDrawProperties(root.get(), device_scale_factor);
   3330 
   3331   ASSERT_TRUE(render_surface1->render_surface());
   3332   ASSERT_TRUE(render_surface2->render_surface());
   3333 
   3334   // drawable_content_rects for all layers and surfaces are scaled by
   3335   // device_scale_factor.
   3336   EXPECT_RECT_EQ(gfx::Rect(0, 0, 200, 200),
   3337                  root->render_surface()->DrawableContentRect());
   3338   EXPECT_RECT_EQ(gfx::Rect(0, 0, 200, 200), root->drawable_content_rect());
   3339   EXPECT_RECT_EQ(gfx::Rect(10, 10, 190, 190),
   3340                  render_surface1->render_surface()->DrawableContentRect());
   3341 
   3342   // render_surface2 lives in the "unclipped universe" of render_surface1, and
   3343   // is only implicitly clipped by render_surface1.
   3344   EXPECT_RECT_EQ(gfx::Rect(10, 10, 350, 350),
   3345                  render_surface2->render_surface()->DrawableContentRect());
   3346 
   3347   EXPECT_RECT_EQ(gfx::Rect(10, 10, 100, 100), child1->drawable_content_rect());
   3348   EXPECT_RECT_EQ(gfx::Rect(150, 150, 100, 100),
   3349                  child2->drawable_content_rect());
   3350   EXPECT_RECT_EQ(gfx::Rect(250, 250, 100, 100),
   3351                  child3->drawable_content_rect());
   3352 
   3353   // The root layer does not actually draw content of its own.
   3354   EXPECT_RECT_EQ(gfx::Rect(0, 0, 0, 0), root->visible_content_rect());
   3355 
   3356   // All layer visible content rects are expressed in content space of each
   3357   // layer, so they are also scaled by the device_scale_factor.
   3358   EXPECT_RECT_EQ(gfx::Rect(0, 0, 6, 8),
   3359                  render_surface1->visible_content_rect());
   3360   EXPECT_RECT_EQ(gfx::Rect(0, 0, 14, 26),
   3361                  render_surface2->visible_content_rect());
   3362   EXPECT_RECT_EQ(gfx::Rect(0, 0, 100, 100), child1->visible_content_rect());
   3363   EXPECT_RECT_EQ(gfx::Rect(0, 0, 100, 100), child2->visible_content_rect());
   3364   EXPECT_RECT_EQ(gfx::Rect(0, 0, 100, 100), child3->visible_content_rect());
   3365 }
   3366 
   3367 TEST_F(LayerTreeHostCommonTest, BackFaceCullingWithoutPreserves3d) {
   3368   // Verify the behavior of back-face culling when there are no preserve-3d
   3369   // layers. Note that 3d transforms still apply in this case, but they are
   3370   // "flattened" to each parent layer according to current W3C spec.
   3371 
   3372   const gfx::Transform identity_matrix;
   3373   scoped_refptr<Layer> parent = Layer::Create();
   3374   scoped_refptr<LayerWithForcedDrawsContent> front_facing_child =
   3375       make_scoped_refptr(new LayerWithForcedDrawsContent());
   3376   scoped_refptr<LayerWithForcedDrawsContent> back_facing_child =
   3377       make_scoped_refptr(new LayerWithForcedDrawsContent());
   3378   scoped_refptr<LayerWithForcedDrawsContent> front_facing_surface =
   3379       make_scoped_refptr(new LayerWithForcedDrawsContent());
   3380   scoped_refptr<LayerWithForcedDrawsContent> back_facing_surface =
   3381       make_scoped_refptr(new LayerWithForcedDrawsContent());
   3382   scoped_refptr<LayerWithForcedDrawsContent>
   3383       front_facing_child_of_front_facing_surface =
   3384           make_scoped_refptr(new LayerWithForcedDrawsContent());
   3385   scoped_refptr<LayerWithForcedDrawsContent>
   3386       back_facing_child_of_front_facing_surface =
   3387           make_scoped_refptr(new LayerWithForcedDrawsContent());
   3388   scoped_refptr<LayerWithForcedDrawsContent>
   3389       front_facing_child_of_back_facing_surface =
   3390           make_scoped_refptr(new LayerWithForcedDrawsContent());
   3391   scoped_refptr<LayerWithForcedDrawsContent>
   3392       back_facing_child_of_back_facing_surface =
   3393           make_scoped_refptr(new LayerWithForcedDrawsContent());
   3394 
   3395   parent->AddChild(front_facing_child);
   3396   parent->AddChild(back_facing_child);
   3397   parent->AddChild(front_facing_surface);
   3398   parent->AddChild(back_facing_surface);
   3399   front_facing_surface->AddChild(front_facing_child_of_front_facing_surface);
   3400   front_facing_surface->AddChild(back_facing_child_of_front_facing_surface);
   3401   back_facing_surface->AddChild(front_facing_child_of_back_facing_surface);
   3402   back_facing_surface->AddChild(back_facing_child_of_back_facing_surface);
   3403 
   3404   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   3405   host->SetRootLayer(parent);
   3406 
   3407   // Nothing is double-sided
   3408   front_facing_child->SetDoubleSided(false);
   3409   back_facing_child->SetDoubleSided(false);
   3410   front_facing_surface->SetDoubleSided(false);
   3411   back_facing_surface->SetDoubleSided(false);
   3412   front_facing_child_of_front_facing_surface->SetDoubleSided(false);
   3413   back_facing_child_of_front_facing_surface->SetDoubleSided(false);
   3414   front_facing_child_of_back_facing_surface->SetDoubleSided(false);
   3415   back_facing_child_of_back_facing_surface->SetDoubleSided(false);
   3416 
   3417   gfx::Transform backface_matrix;
   3418   backface_matrix.Translate(50.0, 50.0);
   3419   backface_matrix.RotateAboutYAxis(180.0);
   3420   backface_matrix.Translate(-50.0, -50.0);
   3421 
   3422   // Having a descendant and opacity will force these to have render surfaces.
   3423   front_facing_surface->SetOpacity(0.5f);
   3424   back_facing_surface->SetOpacity(0.5f);
   3425 
   3426   // Nothing preserves 3d. According to current W3C CSS gfx::Transforms spec,
   3427   // these layers should blindly use their own local transforms to determine
   3428   // back-face culling.
   3429   SetLayerPropertiesForTesting(parent.get(),
   3430                                identity_matrix,
   3431                                gfx::Point3F(),
   3432                                gfx::PointF(),
   3433                                gfx::Size(100, 100),
   3434                                true,
   3435                                false);
   3436   SetLayerPropertiesForTesting(front_facing_child.get(),
   3437                                identity_matrix,
   3438                                gfx::Point3F(),
   3439                                gfx::PointF(),
   3440                                gfx::Size(100, 100),
   3441                                true,
   3442                                false);
   3443   SetLayerPropertiesForTesting(back_facing_child.get(),
   3444                                backface_matrix,
   3445                                gfx::Point3F(),
   3446                                gfx::PointF(),
   3447                                gfx::Size(100, 100),
   3448                                true,
   3449                                false);
   3450   SetLayerPropertiesForTesting(front_facing_surface.get(),
   3451                                identity_matrix,
   3452                                gfx::Point3F(),
   3453                                gfx::PointF(),
   3454                                gfx::Size(100, 100),
   3455                                true,
   3456                                false);
   3457   SetLayerPropertiesForTesting(back_facing_surface.get(),
   3458                                backface_matrix,
   3459                                gfx::Point3F(),
   3460                                gfx::PointF(),
   3461                                gfx::Size(100, 100),
   3462                                true,
   3463                                false);
   3464   SetLayerPropertiesForTesting(front_facing_child_of_front_facing_surface.get(),
   3465                                identity_matrix,
   3466                                gfx::Point3F(),
   3467                                gfx::PointF(),
   3468                                gfx::Size(100, 100),
   3469                                true,
   3470                                false);
   3471   SetLayerPropertiesForTesting(back_facing_child_of_front_facing_surface.get(),
   3472                                backface_matrix,
   3473                                gfx::Point3F(),
   3474                                gfx::PointF(),
   3475                                gfx::Size(100, 100),
   3476                                true,
   3477                                false);
   3478   SetLayerPropertiesForTesting(front_facing_child_of_back_facing_surface.get(),
   3479                                identity_matrix,
   3480                                gfx::Point3F(),
   3481                                gfx::PointF(),
   3482                                gfx::Size(100, 100),
   3483                                true,
   3484                                false);
   3485   SetLayerPropertiesForTesting(back_facing_child_of_back_facing_surface.get(),
   3486                                backface_matrix,
   3487                                gfx::Point3F(),
   3488                                gfx::PointF(),
   3489                                gfx::Size(100, 100),
   3490                                true,
   3491                                false);
   3492 
   3493   RenderSurfaceLayerList render_surface_layer_list;
   3494   LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
   3495       parent.get(), parent->bounds(), &render_surface_layer_list);
   3496   inputs.can_adjust_raster_scales = true;
   3497   LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   3498 
   3499   // Verify which render surfaces were created.
   3500   EXPECT_FALSE(front_facing_child->render_surface());
   3501   EXPECT_FALSE(back_facing_child->render_surface());
   3502   EXPECT_TRUE(front_facing_surface->render_surface());
   3503   EXPECT_TRUE(back_facing_surface->render_surface());
   3504   EXPECT_FALSE(front_facing_child_of_front_facing_surface->render_surface());
   3505   EXPECT_FALSE(back_facing_child_of_front_facing_surface->render_surface());
   3506   EXPECT_FALSE(front_facing_child_of_back_facing_surface->render_surface());
   3507   EXPECT_FALSE(back_facing_child_of_back_facing_surface->render_surface());
   3508 
   3509   // Verify the render_surface_layer_list.
   3510   ASSERT_EQ(3u, render_surface_layer_list.size());
   3511   EXPECT_EQ(parent->id(), render_surface_layer_list.at(0)->id());
   3512   EXPECT_EQ(front_facing_surface->id(), render_surface_layer_list.at(1)->id());
   3513   // Even though the back facing surface LAYER gets culled, the other
   3514   // descendants should still be added, so the SURFACE should not be culled.
   3515   EXPECT_EQ(back_facing_surface->id(), render_surface_layer_list.at(2)->id());
   3516 
   3517   // Verify root surface's layer list.
   3518   ASSERT_EQ(
   3519       3u,
   3520       render_surface_layer_list.at(0)->render_surface()->layer_list().size());
   3521   EXPECT_EQ(front_facing_child->id(),
   3522             render_surface_layer_list.at(0)
   3523                 ->render_surface()
   3524                 ->layer_list()
   3525                 .at(0)
   3526                 ->id());
   3527   EXPECT_EQ(front_facing_surface->id(),
   3528             render_surface_layer_list.at(0)
   3529                 ->render_surface()
   3530                 ->layer_list()
   3531                 .at(1)
   3532                 ->id());
   3533   EXPECT_EQ(back_facing_surface->id(),
   3534             render_surface_layer_list.at(0)
   3535                 ->render_surface()
   3536                 ->layer_list()
   3537                 .at(2)
   3538                 ->id());
   3539 
   3540   // Verify front_facing_surface's layer list.
   3541   ASSERT_EQ(
   3542       2u,
   3543       render_surface_layer_list.at(1)->render_surface()->layer_list().size());
   3544   EXPECT_EQ(front_facing_surface->id(),
   3545             render_surface_layer_list.at(1)
   3546                 ->render_surface()
   3547                 ->layer_list()
   3548                 .at(0)
   3549                 ->id());
   3550   EXPECT_EQ(front_facing_child_of_front_facing_surface->id(),
   3551             render_surface_layer_list.at(1)
   3552                 ->render_surface()
   3553                 ->layer_list()
   3554                 .at(1)
   3555                 ->id());
   3556 
   3557   // Verify back_facing_surface's layer list; its own layer should be culled
   3558   // from the surface list.
   3559   ASSERT_EQ(
   3560       1u,
   3561       render_surface_layer_list.at(2)->render_surface()->layer_list().size());
   3562   EXPECT_EQ(front_facing_child_of_back_facing_surface->id(),
   3563             render_surface_layer_list.at(2)
   3564                 ->render_surface()
   3565                 ->layer_list()
   3566                 .at(0)
   3567                 ->id());
   3568 }
   3569 
   3570 TEST_F(LayerTreeHostCommonTest, BackFaceCullingWithPreserves3d) {
   3571   // Verify the behavior of back-face culling when preserves-3d transform style
   3572   // is used.
   3573 
   3574   const gfx::Transform identity_matrix;
   3575   scoped_refptr<Layer> parent = Layer::Create();
   3576   scoped_refptr<LayerWithForcedDrawsContent> front_facing_child =
   3577       make_scoped_refptr(new LayerWithForcedDrawsContent());
   3578   scoped_refptr<LayerWithForcedDrawsContent> back_facing_child =
   3579       make_scoped_refptr(new LayerWithForcedDrawsContent());
   3580   scoped_refptr<LayerWithForcedDrawsContent> front_facing_surface =
   3581       make_scoped_refptr(new LayerWithForcedDrawsContent());
   3582   scoped_refptr<LayerWithForcedDrawsContent> back_facing_surface =
   3583       make_scoped_refptr(new LayerWithForcedDrawsContent());
   3584   scoped_refptr<LayerWithForcedDrawsContent>
   3585   front_facing_child_of_front_facing_surface =
   3586       make_scoped_refptr(new LayerWithForcedDrawsContent());
   3587   scoped_refptr<LayerWithForcedDrawsContent>
   3588   back_facing_child_of_front_facing_surface =
   3589       make_scoped_refptr(new LayerWithForcedDrawsContent());
   3590   scoped_refptr<LayerWithForcedDrawsContent>
   3591   front_facing_child_of_back_facing_surface =
   3592       make_scoped_refptr(new LayerWithForcedDrawsContent());
   3593   scoped_refptr<LayerWithForcedDrawsContent>
   3594   back_facing_child_of_back_facing_surface =
   3595       make_scoped_refptr(new LayerWithForcedDrawsContent());
   3596   scoped_refptr<LayerWithForcedDrawsContent> dummy_replica_layer1 =
   3597       make_scoped_refptr(new LayerWithForcedDrawsContent());
   3598   scoped_refptr<LayerWithForcedDrawsContent> dummy_replica_layer2 =
   3599       make_scoped_refptr(new LayerWithForcedDrawsContent());
   3600 
   3601   parent->AddChild(front_facing_child);
   3602   parent->AddChild(back_facing_child);
   3603   parent->AddChild(front_facing_surface);
   3604   parent->AddChild(back_facing_surface);
   3605   front_facing_surface->AddChild(front_facing_child_of_front_facing_surface);
   3606   front_facing_surface->AddChild(back_facing_child_of_front_facing_surface);
   3607   back_facing_surface->AddChild(front_facing_child_of_back_facing_surface);
   3608   back_facing_surface->AddChild(back_facing_child_of_back_facing_surface);
   3609 
   3610   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   3611   host->SetRootLayer(parent);
   3612 
   3613   // Nothing is double-sided
   3614   front_facing_child->SetDoubleSided(false);
   3615   back_facing_child->SetDoubleSided(false);
   3616   front_facing_surface->SetDoubleSided(false);
   3617   back_facing_surface->SetDoubleSided(false);
   3618   front_facing_child_of_front_facing_surface->SetDoubleSided(false);
   3619   back_facing_child_of_front_facing_surface->SetDoubleSided(false);
   3620   front_facing_child_of_back_facing_surface->SetDoubleSided(false);
   3621   back_facing_child_of_back_facing_surface->SetDoubleSided(false);
   3622 
   3623   gfx::Transform backface_matrix;
   3624   backface_matrix.Translate(50.0, 50.0);
   3625   backface_matrix.RotateAboutYAxis(180.0);
   3626   backface_matrix.Translate(-50.0, -50.0);
   3627 
   3628   // Opacity will not force creation of render surfaces in this case because of
   3629   // the preserve-3d transform style. Instead, an example of when a surface
   3630   // would be created with preserve-3d is when there is a replica layer.
   3631   front_facing_surface->SetReplicaLayer(dummy_replica_layer1.get());
   3632   back_facing_surface->SetReplicaLayer(dummy_replica_layer2.get());
   3633 
   3634   // Each surface creates its own new 3d rendering context (as defined by W3C
   3635   // spec).  According to current W3C CSS gfx::Transforms spec, layers in a 3d
   3636   // rendering context should use the transform with respect to that context.
   3637   // This 3d rendering context occurs when (a) parent's transform style is flat
   3638   // and (b) the layer's transform style is preserve-3d.
   3639   SetLayerPropertiesForTesting(parent.get(),
   3640                                identity_matrix,
   3641                                gfx::Point3F(),
   3642                                gfx::PointF(),
   3643                                gfx::Size(100, 100),
   3644                                true,
   3645                                false);  // parent transform style is flat.
   3646   SetLayerPropertiesForTesting(front_facing_child.get(),
   3647                                identity_matrix,
   3648                                gfx::Point3F(),
   3649                                gfx::PointF(),
   3650                                gfx::Size(100, 100),
   3651                                true,
   3652                                false);
   3653   SetLayerPropertiesForTesting(back_facing_child.get(),
   3654                                backface_matrix,
   3655                                gfx::Point3F(),
   3656                                gfx::PointF(),
   3657                                gfx::Size(100, 100),
   3658                                true,
   3659                                false);
   3660   // surface transform style is preserve-3d.
   3661   SetLayerPropertiesForTesting(front_facing_surface.get(),
   3662                                identity_matrix,
   3663                                gfx::Point3F(),
   3664                                gfx::PointF(),
   3665                                gfx::Size(100, 100),
   3666                                false,
   3667                                true);
   3668   // surface transform style is preserve-3d.
   3669   SetLayerPropertiesForTesting(back_facing_surface.get(),
   3670                                backface_matrix,
   3671                                gfx::Point3F(),
   3672                                gfx::PointF(),
   3673                                gfx::Size(100, 100),
   3674                                false,
   3675                                true);
   3676   SetLayerPropertiesForTesting(front_facing_child_of_front_facing_surface.get(),
   3677                                identity_matrix,
   3678                                gfx::Point3F(),
   3679                                gfx::PointF(),
   3680                                gfx::Size(100, 100),
   3681                                true,
   3682                                true);
   3683   SetLayerPropertiesForTesting(back_facing_child_of_front_facing_surface.get(),
   3684                                backface_matrix,
   3685                                gfx::Point3F(),
   3686                                gfx::PointF(),
   3687                                gfx::Size(100, 100),
   3688                                true,
   3689                                true);
   3690   SetLayerPropertiesForTesting(front_facing_child_of_back_facing_surface.get(),
   3691                                identity_matrix,
   3692                                gfx::Point3F(),
   3693                                gfx::PointF(),
   3694                                gfx::Size(100, 100),
   3695                                true,
   3696                                true);
   3697   SetLayerPropertiesForTesting(back_facing_child_of_back_facing_surface.get(),
   3698                                backface_matrix,
   3699                                gfx::Point3F(),
   3700                                gfx::PointF(),
   3701                                gfx::Size(100, 100),
   3702                                true,
   3703                                true);
   3704 
   3705   RenderSurfaceLayerList render_surface_layer_list;
   3706   LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
   3707       parent.get(), parent->bounds(), &render_surface_layer_list);
   3708   inputs.can_adjust_raster_scales = true;
   3709   LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   3710 
   3711   // Verify which render surfaces were created.
   3712   EXPECT_FALSE(front_facing_child->render_surface());
   3713   EXPECT_FALSE(back_facing_child->render_surface());
   3714   EXPECT_TRUE(front_facing_surface->render_surface());
   3715   EXPECT_FALSE(back_facing_surface->render_surface());
   3716   EXPECT_FALSE(front_facing_child_of_front_facing_surface->render_surface());
   3717   EXPECT_FALSE(back_facing_child_of_front_facing_surface->render_surface());
   3718   EXPECT_FALSE(front_facing_child_of_back_facing_surface->render_surface());
   3719   EXPECT_FALSE(back_facing_child_of_back_facing_surface->render_surface());
   3720 
   3721   // Verify the render_surface_layer_list. The back-facing surface should be
   3722   // culled.
   3723   ASSERT_EQ(2u, render_surface_layer_list.size());
   3724   EXPECT_EQ(parent->id(), render_surface_layer_list.at(0)->id());
   3725   EXPECT_EQ(front_facing_surface->id(), render_surface_layer_list.at(1)->id());
   3726 
   3727   // Verify root surface's layer list.
   3728   ASSERT_EQ(
   3729       2u,
   3730       render_surface_layer_list.at(0)->render_surface()->layer_list().size());
   3731   EXPECT_EQ(front_facing_child->id(),
   3732             render_surface_layer_list.at(0)
   3733                 ->render_surface()->layer_list().at(0)->id());
   3734   EXPECT_EQ(front_facing_surface->id(),
   3735             render_surface_layer_list.at(0)
   3736                 ->render_surface()->layer_list().at(1)->id());
   3737 
   3738   // Verify front_facing_surface's layer list.
   3739   ASSERT_EQ(
   3740       2u,
   3741       render_surface_layer_list.at(1)->render_surface()->layer_list().size());
   3742   EXPECT_EQ(front_facing_surface->id(),
   3743             render_surface_layer_list.at(1)
   3744                 ->render_surface()->layer_list().at(0)->id());
   3745   EXPECT_EQ(front_facing_child_of_front_facing_surface->id(),
   3746             render_surface_layer_list.at(1)
   3747                 ->render_surface()->layer_list().at(1)->id());
   3748 }
   3749 
   3750 TEST_F(LayerTreeHostCommonTest, BackFaceCullingWithAnimatingTransforms) {
   3751   // Verify that layers are appropriately culled when their back face is showing
   3752   // and they are not double sided, while animations are going on.
   3753   //
   3754   // Layers that are animating do not get culled on the main thread, as their
   3755   // transforms should be treated as "unknown" so we can not be sure that their
   3756   // back face is really showing.
   3757   const gfx::Transform identity_matrix;
   3758   scoped_refptr<Layer> parent = Layer::Create();
   3759   scoped_refptr<LayerWithForcedDrawsContent> child =
   3760       make_scoped_refptr(new LayerWithForcedDrawsContent());
   3761   scoped_refptr<LayerWithForcedDrawsContent> animating_surface =
   3762       make_scoped_refptr(new LayerWithForcedDrawsContent());
   3763   scoped_refptr<LayerWithForcedDrawsContent> child_of_animating_surface =
   3764       make_scoped_refptr(new LayerWithForcedDrawsContent());
   3765   scoped_refptr<LayerWithForcedDrawsContent> animating_child =
   3766       make_scoped_refptr(new LayerWithForcedDrawsContent());
   3767   scoped_refptr<LayerWithForcedDrawsContent> child2 =
   3768       make_scoped_refptr(new LayerWithForcedDrawsContent());
   3769 
   3770   parent->AddChild(child);
   3771   parent->AddChild(animating_surface);
   3772   animating_surface->AddChild(child_of_animating_surface);
   3773   parent->AddChild(animating_child);
   3774   parent->AddChild(child2);
   3775 
   3776   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   3777   host->SetRootLayer(parent);
   3778 
   3779   // Nothing is double-sided
   3780   child->SetDoubleSided(false);
   3781   child2->SetDoubleSided(false);
   3782   animating_surface->SetDoubleSided(false);
   3783   child_of_animating_surface->SetDoubleSided(false);
   3784   animating_child->SetDoubleSided(false);
   3785 
   3786   gfx::Transform backface_matrix;
   3787   backface_matrix.Translate(50.0, 50.0);
   3788   backface_matrix.RotateAboutYAxis(180.0);
   3789   backface_matrix.Translate(-50.0, -50.0);
   3790 
   3791   // Make our render surface.
   3792   animating_surface->SetForceRenderSurface(true);
   3793 
   3794   // Animate the transform on the render surface.
   3795   AddAnimatedTransformToController(
   3796       animating_surface->layer_animation_controller(), 10.0, 30, 0);
   3797   // This is just an animating layer, not a surface.
   3798   AddAnimatedTransformToController(
   3799       animating_child->layer_animation_controller(), 10.0, 30, 0);
   3800 
   3801   SetLayerPropertiesForTesting(parent.get(),
   3802                                identity_matrix,
   3803                                gfx::Point3F(),
   3804                                gfx::PointF(),
   3805                                gfx::Size(100, 100),
   3806                                true,
   3807                                false);
   3808   SetLayerPropertiesForTesting(child.get(),
   3809                                backface_matrix,
   3810                                gfx::Point3F(),
   3811                                gfx::PointF(),
   3812                                gfx::Size(100, 100),
   3813                                true,
   3814                                false);
   3815   SetLayerPropertiesForTesting(animating_surface.get(),
   3816                                backface_matrix,
   3817                                gfx::Point3F(),
   3818                                gfx::PointF(),
   3819                                gfx::Size(100, 100),
   3820                                true,
   3821                                false);
   3822   SetLayerPropertiesForTesting(child_of_animating_surface.get(),
   3823                                backface_matrix,
   3824                                gfx::Point3F(),
   3825                                gfx::PointF(),
   3826                                gfx::Size(100, 100),
   3827                                true,
   3828                                false);
   3829   SetLayerPropertiesForTesting(animating_child.get(),
   3830                                backface_matrix,
   3831                                gfx::Point3F(),
   3832                                gfx::PointF(),
   3833                                gfx::Size(100, 100),
   3834                                true,
   3835                                false);
   3836   SetLayerPropertiesForTesting(child2.get(),
   3837                                identity_matrix,
   3838                                gfx::Point3F(),
   3839                                gfx::PointF(),
   3840                                gfx::Size(100, 100),
   3841                                true,
   3842                                false);
   3843 
   3844   RenderSurfaceLayerList render_surface_layer_list;
   3845   LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
   3846       parent.get(), parent->bounds(), &render_surface_layer_list);
   3847   inputs.can_adjust_raster_scales = true;
   3848   LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   3849 
   3850   EXPECT_FALSE(child->render_surface());
   3851   EXPECT_TRUE(animating_surface->render_surface());
   3852   EXPECT_FALSE(child_of_animating_surface->render_surface());
   3853   EXPECT_FALSE(animating_child->render_surface());
   3854   EXPECT_FALSE(child2->render_surface());
   3855 
   3856   // Verify that the animating_child and child_of_animating_surface were not
   3857   // culled, but that child was.
   3858   ASSERT_EQ(2u, render_surface_layer_list.size());
   3859   EXPECT_EQ(parent->id(), render_surface_layer_list.at(0)->id());
   3860   EXPECT_EQ(animating_surface->id(), render_surface_layer_list.at(1)->id());
   3861 
   3862   // The non-animating child be culled from the layer list for the parent render
   3863   // surface.
   3864   ASSERT_EQ(
   3865       3u,
   3866       render_surface_layer_list.at(0)->render_surface()->layer_list().size());
   3867   EXPECT_EQ(animating_surface->id(),
   3868             render_surface_layer_list.at(0)
   3869                 ->render_surface()->layer_list().at(0)->id());
   3870   EXPECT_EQ(animating_child->id(),
   3871             render_surface_layer_list.at(0)
   3872                 ->render_surface()->layer_list().at(1)->id());
   3873   EXPECT_EQ(child2->id(),
   3874             render_surface_layer_list.at(0)
   3875                 ->render_surface()->layer_list().at(2)->id());
   3876 
   3877   ASSERT_EQ(
   3878       2u,
   3879       render_surface_layer_list.at(1)->render_surface()->layer_list().size());
   3880   EXPECT_EQ(animating_surface->id(),
   3881             render_surface_layer_list.at(1)
   3882                 ->render_surface()->layer_list().at(0)->id());
   3883   EXPECT_EQ(child_of_animating_surface->id(),
   3884             render_surface_layer_list.at(1)
   3885                 ->render_surface()->layer_list().at(1)->id());
   3886 
   3887   EXPECT_FALSE(child2->visible_content_rect().IsEmpty());
   3888 
   3889   // The animating layers should have a visible content rect that represents the
   3890   // area of the front face that is within the viewport.
   3891   EXPECT_EQ(animating_child->visible_content_rect(),
   3892             gfx::Rect(animating_child->content_bounds()));
   3893   EXPECT_EQ(animating_surface->visible_content_rect(),
   3894             gfx::Rect(animating_surface->content_bounds()));
   3895   // And layers in the subtree of the animating layer should have valid visible
   3896   // content rects also.
   3897   EXPECT_EQ(child_of_animating_surface->visible_content_rect(),
   3898             gfx::Rect(child_of_animating_surface->content_bounds()));
   3899 }
   3900 
   3901 TEST_F(LayerTreeHostCommonTest,
   3902      BackFaceCullingWithPreserves3dForFlatteningSurface) {
   3903   // Verify the behavior of back-face culling for a render surface that is
   3904   // created when it flattens its subtree, and its parent has preserves-3d.
   3905 
   3906   const gfx::Transform identity_matrix;
   3907   scoped_refptr<Layer> parent = Layer::Create();
   3908   scoped_refptr<LayerWithForcedDrawsContent> front_facing_surface =
   3909       make_scoped_refptr(new LayerWithForcedDrawsContent());
   3910   scoped_refptr<LayerWithForcedDrawsContent> back_facing_surface =
   3911       make_scoped_refptr(new LayerWithForcedDrawsContent());
   3912   scoped_refptr<LayerWithForcedDrawsContent> child1 =
   3913       make_scoped_refptr(new LayerWithForcedDrawsContent());
   3914   scoped_refptr<LayerWithForcedDrawsContent> child2 =
   3915       make_scoped_refptr(new LayerWithForcedDrawsContent());
   3916 
   3917   parent->AddChild(front_facing_surface);
   3918   parent->AddChild(back_facing_surface);
   3919   front_facing_surface->AddChild(child1);
   3920   back_facing_surface->AddChild(child2);
   3921 
   3922   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   3923   host->SetRootLayer(parent);
   3924 
   3925   // RenderSurfaces are not double-sided
   3926   front_facing_surface->SetDoubleSided(false);
   3927   back_facing_surface->SetDoubleSided(false);
   3928 
   3929   gfx::Transform backface_matrix;
   3930   backface_matrix.Translate(50.0, 50.0);
   3931   backface_matrix.RotateAboutYAxis(180.0);
   3932   backface_matrix.Translate(-50.0, -50.0);
   3933 
   3934   SetLayerPropertiesForTesting(parent.get(),
   3935                                identity_matrix,
   3936                                gfx::Point3F(),
   3937                                gfx::PointF(),
   3938                                gfx::Size(100, 100),
   3939                                false,
   3940                                true);  // parent transform style is preserve3d.
   3941   SetLayerPropertiesForTesting(front_facing_surface.get(),
   3942                                identity_matrix,
   3943                                gfx::Point3F(),
   3944                                gfx::PointF(),
   3945                                gfx::Size(100, 100),
   3946                                true,
   3947                                true);  // surface transform style is flat.
   3948   SetLayerPropertiesForTesting(back_facing_surface.get(),
   3949                                backface_matrix,
   3950                                gfx::Point3F(),
   3951                                gfx::PointF(),
   3952                                gfx::Size(100, 100),
   3953                                true,
   3954                                true);  // surface transform style is flat.
   3955   SetLayerPropertiesForTesting(child1.get(),
   3956                                identity_matrix,
   3957                                gfx::Point3F(),
   3958                                gfx::PointF(),
   3959                                gfx::Size(100, 100),
   3960                                true,
   3961                                false);
   3962   SetLayerPropertiesForTesting(child2.get(),
   3963                                identity_matrix,
   3964                                gfx::Point3F(),
   3965                                gfx::PointF(),
   3966                                gfx::Size(100, 100),
   3967                                true,
   3968                                false);
   3969 
   3970   front_facing_surface->Set3dSortingContextId(1);
   3971   back_facing_surface->Set3dSortingContextId(1);
   3972 
   3973   RenderSurfaceLayerList render_surface_layer_list;
   3974   LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
   3975       parent.get(), parent->bounds(), &render_surface_layer_list);
   3976   inputs.can_adjust_raster_scales = true;
   3977   LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   3978 
   3979   // Verify which render surfaces were created.
   3980   EXPECT_TRUE(front_facing_surface->render_surface());
   3981   EXPECT_FALSE(
   3982       back_facing_surface->render_surface());  // because it should be culled
   3983   EXPECT_FALSE(child1->render_surface());
   3984   EXPECT_FALSE(child2->render_surface());
   3985 
   3986   // Verify the render_surface_layer_list. The back-facing surface should be
   3987   // culled.
   3988   ASSERT_EQ(2u, render_surface_layer_list.size());
   3989   EXPECT_EQ(parent->id(), render_surface_layer_list.at(0)->id());
   3990   EXPECT_EQ(front_facing_surface->id(), render_surface_layer_list.at(1)->id());
   3991 
   3992   // Verify root surface's layer list.
   3993   ASSERT_EQ(
   3994       1u,
   3995       render_surface_layer_list.at(0)->render_surface()->layer_list().size());
   3996   EXPECT_EQ(front_facing_surface->id(),
   3997             render_surface_layer_list.at(0)
   3998                 ->render_surface()->layer_list().at(0)->id());
   3999 
   4000   // Verify front_facing_surface's layer list.
   4001   ASSERT_EQ(
   4002       2u,
   4003       render_surface_layer_list.at(1)->render_surface()->layer_list().size());
   4004   EXPECT_EQ(front_facing_surface->id(),
   4005             render_surface_layer_list.at(1)
   4006                 ->render_surface()->layer_list().at(0)->id());
   4007   EXPECT_EQ(child1->id(),
   4008             render_surface_layer_list.at(1)
   4009                 ->render_surface()->layer_list().at(1)->id());
   4010 }
   4011 
   4012 class NoScaleContentLayer : public ContentLayer {
   4013  public:
   4014   static scoped_refptr<NoScaleContentLayer> Create(ContentLayerClient* client) {
   4015     return make_scoped_refptr(new NoScaleContentLayer(client));
   4016   }
   4017 
   4018   virtual void CalculateContentsScale(float ideal_contents_scale,
   4019                                       float* contents_scale_x,
   4020                                       float* contents_scale_y,
   4021                                       gfx::Size* content_bounds) OVERRIDE {
   4022     // Skip over the ContentLayer to the base Layer class.
   4023     Layer::CalculateContentsScale(ideal_contents_scale,
   4024                                   contents_scale_x,
   4025                                   contents_scale_y,
   4026                                   content_bounds);
   4027   }
   4028 
   4029  protected:
   4030   explicit NoScaleContentLayer(ContentLayerClient* client)
   4031       : ContentLayer(client) {}
   4032   virtual ~NoScaleContentLayer() {}
   4033 };
   4034 
   4035 scoped_refptr<NoScaleContentLayer> CreateNoScaleDrawableContentLayer(
   4036     ContentLayerClient* delegate) {
   4037   scoped_refptr<NoScaleContentLayer> to_return =
   4038       NoScaleContentLayer::Create(delegate);
   4039   to_return->SetIsDrawable(true);
   4040   return to_return;
   4041 }
   4042 
   4043 TEST_F(LayerTreeHostCommonTest, LayerTransformsInHighDPI) {
   4044   // Verify draw and screen space transforms of layers not in a surface.
   4045   MockContentLayerClient delegate;
   4046   gfx::Transform identity_matrix;
   4047 
   4048   scoped_refptr<ContentLayer> parent = CreateDrawableContentLayer(&delegate);
   4049   SetLayerPropertiesForTesting(parent.get(),
   4050                                identity_matrix,
   4051                                gfx::Point3F(),
   4052                                gfx::PointF(),
   4053                                gfx::Size(100, 100),
   4054                                false,
   4055                                true);
   4056 
   4057   scoped_refptr<ContentLayer> child = CreateDrawableContentLayer(&delegate);
   4058   SetLayerPropertiesForTesting(child.get(),
   4059                                identity_matrix,
   4060                                gfx::Point3F(),
   4061                                gfx::PointF(2.f, 2.f),
   4062                                gfx::Size(10, 10),
   4063                                false,
   4064                                true);
   4065 
   4066   scoped_refptr<ContentLayer> child_empty =
   4067       CreateDrawableContentLayer(&delegate);
   4068   SetLayerPropertiesForTesting(child_empty.get(),
   4069                                identity_matrix,
   4070                                gfx::Point3F(),
   4071                                gfx::PointF(2.f, 2.f),
   4072                                gfx::Size(),
   4073                                false,
   4074                                true);
   4075 
   4076   scoped_refptr<NoScaleContentLayer> child_no_scale =
   4077       CreateNoScaleDrawableContentLayer(&delegate);
   4078   SetLayerPropertiesForTesting(child_no_scale.get(),
   4079                                identity_matrix,
   4080                                gfx::Point3F(),
   4081                                gfx::PointF(2.f, 2.f),
   4082                                gfx::Size(10, 10),
   4083                                false,
   4084                                true);
   4085 
   4086   parent->AddChild(child);
   4087   parent->AddChild(child_empty);
   4088   parent->AddChild(child_no_scale);
   4089 
   4090   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   4091   host->SetRootLayer(parent);
   4092 
   4093   float device_scale_factor = 2.5f;
   4094   float page_scale_factor = 1.f;
   4095 
   4096   RenderSurfaceLayerList render_surface_layer_list;
   4097   LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
   4098       parent.get(), parent->bounds(), &render_surface_layer_list);
   4099   inputs.device_scale_factor = device_scale_factor;
   4100   inputs.page_scale_factor = page_scale_factor;
   4101   inputs.can_adjust_raster_scales = true;
   4102   LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   4103 
   4104   EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor, parent);
   4105   EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor, child);
   4106   EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor,
   4107                            child_empty);
   4108   EXPECT_CONTENTS_SCALE_EQ(1, child_no_scale);
   4109 
   4110   EXPECT_EQ(1u, render_surface_layer_list.size());
   4111 
   4112   // Verify parent transforms
   4113   gfx::Transform expected_parent_transform;
   4114   EXPECT_TRANSFORMATION_MATRIX_EQ(expected_parent_transform,
   4115                                   parent->screen_space_transform());
   4116   EXPECT_TRANSFORMATION_MATRIX_EQ(expected_parent_transform,
   4117                                   parent->draw_transform());
   4118 
   4119   // Verify results of transformed parent rects
   4120   gfx::RectF parent_content_bounds(parent->content_bounds());
   4121 
   4122   gfx::RectF parent_draw_rect =
   4123       MathUtil::MapClippedRect(parent->draw_transform(), parent_content_bounds);
   4124   gfx::RectF parent_screen_space_rect = MathUtil::MapClippedRect(
   4125       parent->screen_space_transform(), parent_content_bounds);
   4126 
   4127   gfx::RectF expected_parent_draw_rect(parent->bounds());
   4128   expected_parent_draw_rect.Scale(device_scale_factor);
   4129   EXPECT_FLOAT_RECT_EQ(expected_parent_draw_rect, parent_draw_rect);
   4130   EXPECT_FLOAT_RECT_EQ(expected_parent_draw_rect, parent_screen_space_rect);
   4131 
   4132   // Verify child and child_empty transforms. They should match.
   4133   gfx::Transform expected_child_transform;
   4134   expected_child_transform.Translate(
   4135       device_scale_factor * child->position().x(),
   4136       device_scale_factor * child->position().y());
   4137   EXPECT_TRANSFORMATION_MATRIX_EQ(expected_child_transform,
   4138                                   child->draw_transform());
   4139   EXPECT_TRANSFORMATION_MATRIX_EQ(expected_child_transform,
   4140                                   child->screen_space_transform());
   4141   EXPECT_TRANSFORMATION_MATRIX_EQ(expected_child_transform,
   4142                                   child_empty->draw_transform());
   4143   EXPECT_TRANSFORMATION_MATRIX_EQ(expected_child_transform,
   4144                                   child_empty->screen_space_transform());
   4145 
   4146   // Verify results of transformed child and child_empty rects. They should
   4147   // match.
   4148   gfx::RectF child_content_bounds(child->content_bounds());
   4149 
   4150   gfx::RectF child_draw_rect =
   4151       MathUtil::MapClippedRect(child->draw_transform(), child_content_bounds);
   4152   gfx::RectF child_screen_space_rect = MathUtil::MapClippedRect(
   4153       child->screen_space_transform(), child_content_bounds);
   4154 
   4155   gfx::RectF child_empty_draw_rect = MathUtil::MapClippedRect(
   4156       child_empty->draw_transform(), child_content_bounds);
   4157   gfx::RectF child_empty_screen_space_rect = MathUtil::MapClippedRect(
   4158       child_empty->screen_space_transform(), child_content_bounds);
   4159 
   4160   gfx::RectF expected_child_draw_rect(child->position(), child->bounds());
   4161   expected_child_draw_rect.Scale(device_scale_factor);
   4162   EXPECT_FLOAT_RECT_EQ(expected_child_draw_rect, child_draw_rect);
   4163   EXPECT_FLOAT_RECT_EQ(expected_child_draw_rect, child_screen_space_rect);
   4164   EXPECT_FLOAT_RECT_EQ(expected_child_draw_rect, child_empty_draw_rect);
   4165   EXPECT_FLOAT_RECT_EQ(expected_child_draw_rect, child_empty_screen_space_rect);
   4166 
   4167   // Verify child_no_scale transforms
   4168   gfx::Transform expected_child_no_scale_transform = child->draw_transform();
   4169   // All transforms operate on content rects. The child's content rect
   4170   // incorporates device scale, but the child_no_scale does not; add it here.
   4171   expected_child_no_scale_transform.Scale(device_scale_factor,
   4172                                           device_scale_factor);
   4173   EXPECT_TRANSFORMATION_MATRIX_EQ(expected_child_no_scale_transform,
   4174                                   child_no_scale->draw_transform());
   4175   EXPECT_TRANSFORMATION_MATRIX_EQ(expected_child_no_scale_transform,
   4176                                   child_no_scale->screen_space_transform());
   4177 }
   4178 
   4179 TEST_F(LayerTreeHostCommonTest, SurfaceLayerTransformsInHighDPI) {
   4180   // Verify draw and screen space transforms of layers in a surface.
   4181   MockContentLayerClient delegate;
   4182   gfx::Transform identity_matrix;
   4183 
   4184   gfx::Transform perspective_matrix;
   4185   perspective_matrix.ApplyPerspectiveDepth(2.0);
   4186 
   4187   gfx::Transform scale_small_matrix;
   4188   scale_small_matrix.Scale(SK_MScalar1 / 10.f, SK_MScalar1 / 12.f);
   4189 
   4190   scoped_refptr<Layer> root = Layer::Create();
   4191 
   4192   scoped_refptr<ContentLayer> parent = CreateDrawableContentLayer(&delegate);
   4193   SetLayerPropertiesForTesting(parent.get(),
   4194                                identity_matrix,
   4195                                gfx::Point3F(),
   4196                                gfx::PointF(),
   4197                                gfx::Size(100, 100),
   4198                                false,
   4199                                true);
   4200 
   4201   scoped_refptr<ContentLayer> perspective_surface =
   4202       CreateDrawableContentLayer(&delegate);
   4203   SetLayerPropertiesForTesting(perspective_surface.get(),
   4204                                perspective_matrix * scale_small_matrix,
   4205                                gfx::Point3F(),
   4206                                gfx::PointF(2.f, 2.f),
   4207                                gfx::Size(10, 10),
   4208                                false,
   4209                                true);
   4210 
   4211   scoped_refptr<ContentLayer> scale_surface =
   4212       CreateDrawableContentLayer(&delegate);
   4213   SetLayerPropertiesForTesting(scale_surface.get(),
   4214                                scale_small_matrix,
   4215                                gfx::Point3F(),
   4216                                gfx::PointF(2.f, 2.f),
   4217                                gfx::Size(10, 10),
   4218                                false,
   4219                                true);
   4220 
   4221   perspective_surface->SetForceRenderSurface(true);
   4222   scale_surface->SetForceRenderSurface(true);
   4223 
   4224   parent->AddChild(perspective_surface);
   4225   parent->AddChild(scale_surface);
   4226   root->AddChild(parent);
   4227 
   4228   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   4229   host->SetRootLayer(root);
   4230 
   4231   float device_scale_factor = 2.5f;
   4232   float page_scale_factor = 3.f;
   4233 
   4234   RenderSurfaceLayerList render_surface_layer_list;
   4235   LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
   4236       root.get(), parent->bounds(), &render_surface_layer_list);
   4237   inputs.device_scale_factor = device_scale_factor;
   4238   inputs.page_scale_factor = page_scale_factor;
   4239   inputs.page_scale_application_layer = root.get();
   4240   inputs.can_adjust_raster_scales = true;
   4241   LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   4242 
   4243   EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor, parent);
   4244   EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor,
   4245                            perspective_surface);
   4246   EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor,
   4247                            scale_surface);
   4248 
   4249   EXPECT_EQ(3u, render_surface_layer_list.size());
   4250 
   4251   gfx::Transform expected_parent_draw_transform;
   4252   EXPECT_TRANSFORMATION_MATRIX_EQ(expected_parent_draw_transform,
   4253                                   parent->draw_transform());
   4254 
   4255   // The scaled surface is rendered at its appropriate scale, and drawn 1:1
   4256   // into its target.
   4257   gfx::Transform expected_scale_surface_draw_transform;
   4258   expected_scale_surface_draw_transform.Translate(
   4259       device_scale_factor * page_scale_factor * scale_surface->position().x(),
   4260       device_scale_factor * page_scale_factor * scale_surface->position().y());
   4261   EXPECT_TRANSFORMATION_MATRIX_EQ(
   4262       expected_scale_surface_draw_transform,
   4263       scale_surface->render_surface()->draw_transform());
   4264   gfx::Transform expected_scale_surface_layer_draw_transform =
   4265       scale_small_matrix;
   4266   EXPECT_TRANSFORMATION_MATRIX_EQ(expected_scale_surface_layer_draw_transform,
   4267                                   scale_surface->draw_transform());
   4268 
   4269   // The scale for the perspective surface is not known, so it is rendered 1:1
   4270   // with the screen, and then scaled during drawing.
   4271   gfx::Transform expected_perspective_surface_draw_transform;
   4272   expected_perspective_surface_draw_transform.Translate(
   4273       device_scale_factor * page_scale_factor *
   4274       perspective_surface->position().x(),
   4275       device_scale_factor * page_scale_factor *
   4276       perspective_surface->position().y());
   4277   expected_perspective_surface_draw_transform.PreconcatTransform(
   4278       perspective_matrix);
   4279   expected_perspective_surface_draw_transform.PreconcatTransform(
   4280       scale_small_matrix);
   4281   gfx::Transform expected_perspective_surface_layer_draw_transform;
   4282   EXPECT_TRANSFORMATION_MATRIX_EQ(
   4283       expected_perspective_surface_draw_transform,
   4284       perspective_surface->render_surface()->draw_transform());
   4285   EXPECT_TRANSFORMATION_MATRIX_EQ(
   4286       expected_perspective_surface_layer_draw_transform,
   4287       perspective_surface->draw_transform());
   4288 }
   4289 
   4290 TEST_F(LayerTreeHostCommonTest,
   4291      LayerTransformsInHighDPIAccurateScaleZeroChildPosition) {
   4292   // Verify draw and screen space transforms of layers not in a surface.
   4293   MockContentLayerClient delegate;
   4294   gfx::Transform identity_matrix;
   4295 
   4296   scoped_refptr<ContentLayer> parent = CreateDrawableContentLayer(&delegate);
   4297   SetLayerPropertiesForTesting(parent.get(),
   4298                                identity_matrix,
   4299                                gfx::Point3F(),
   4300                                gfx::PointF(),
   4301                                gfx::Size(133, 133),
   4302                                false,
   4303                                true);
   4304 
   4305   scoped_refptr<ContentLayer> child = CreateDrawableContentLayer(&delegate);
   4306   SetLayerPropertiesForTesting(child.get(),
   4307                                identity_matrix,
   4308                                gfx::Point3F(),
   4309                                gfx::PointF(),
   4310                                gfx::Size(13, 13),
   4311                                false,
   4312                                true);
   4313 
   4314   scoped_refptr<NoScaleContentLayer> child_no_scale =
   4315       CreateNoScaleDrawableContentLayer(&delegate);
   4316   SetLayerPropertiesForTesting(child_no_scale.get(),
   4317                                identity_matrix,
   4318                                gfx::Point3F(),
   4319                                gfx::PointF(),
   4320                                gfx::Size(13, 13),
   4321                                false,
   4322                                true);
   4323 
   4324   parent->AddChild(child);
   4325   parent->AddChild(child_no_scale);
   4326 
   4327   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   4328   host->SetRootLayer(parent);
   4329 
   4330   float device_scale_factor = 1.7f;
   4331   float page_scale_factor = 1.f;
   4332 
   4333   RenderSurfaceLayerList render_surface_layer_list;
   4334   LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
   4335       parent.get(), parent->bounds(), &render_surface_layer_list);
   4336   inputs.device_scale_factor = device_scale_factor;
   4337   inputs.page_scale_factor = page_scale_factor;
   4338   inputs.page_scale_application_layer = parent.get();
   4339   inputs.can_adjust_raster_scales = true;
   4340   LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   4341 
   4342   EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor, parent);
   4343   EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor, child);
   4344   EXPECT_CONTENTS_SCALE_EQ(1, child_no_scale);
   4345 
   4346   EXPECT_EQ(1u, render_surface_layer_list.size());
   4347 
   4348   // Verify parent transforms
   4349   gfx::Transform expected_parent_transform;
   4350   EXPECT_TRANSFORMATION_MATRIX_EQ(expected_parent_transform,
   4351                                   parent->screen_space_transform());
   4352   EXPECT_TRANSFORMATION_MATRIX_EQ(expected_parent_transform,
   4353                                   parent->draw_transform());
   4354 
   4355   // Verify results of transformed parent rects
   4356   gfx::RectF parent_content_bounds(parent->content_bounds());
   4357 
   4358   gfx::RectF parent_draw_rect =
   4359       MathUtil::MapClippedRect(parent->draw_transform(), parent_content_bounds);
   4360   gfx::RectF parent_screen_space_rect = MathUtil::MapClippedRect(
   4361       parent->screen_space_transform(), parent_content_bounds);
   4362 
   4363   gfx::RectF expected_parent_draw_rect(parent->bounds());
   4364   expected_parent_draw_rect.Scale(device_scale_factor);
   4365   expected_parent_draw_rect.set_width(ceil(expected_parent_draw_rect.width()));
   4366   expected_parent_draw_rect.set_height(
   4367       ceil(expected_parent_draw_rect.height()));
   4368   EXPECT_FLOAT_RECT_EQ(expected_parent_draw_rect, parent_draw_rect);
   4369   EXPECT_FLOAT_RECT_EQ(expected_parent_draw_rect, parent_screen_space_rect);
   4370 
   4371   // Verify child transforms
   4372   gfx::Transform expected_child_transform;
   4373   EXPECT_TRANSFORMATION_MATRIX_EQ(expected_child_transform,
   4374                                   child->draw_transform());
   4375   EXPECT_TRANSFORMATION_MATRIX_EQ(expected_child_transform,
   4376                                   child->screen_space_transform());
   4377 
   4378   // Verify results of transformed child rects
   4379   gfx::RectF child_content_bounds(child->content_bounds());
   4380 
   4381   gfx::RectF child_draw_rect =
   4382       MathUtil::MapClippedRect(child->draw_transform(), child_content_bounds);
   4383   gfx::RectF child_screen_space_rect = MathUtil::MapClippedRect(
   4384       child->screen_space_transform(), child_content_bounds);
   4385 
   4386   gfx::RectF expected_child_draw_rect(child->bounds());
   4387   expected_child_draw_rect.Scale(device_scale_factor);
   4388   expected_child_draw_rect.set_width(ceil(expected_child_draw_rect.width()));
   4389   expected_child_draw_rect.set_height(ceil(expected_child_draw_rect.height()));
   4390   EXPECT_FLOAT_RECT_EQ(expected_child_draw_rect, child_draw_rect);
   4391   EXPECT_FLOAT_RECT_EQ(expected_child_draw_rect, child_screen_space_rect);
   4392 
   4393   // Verify child_no_scale transforms
   4394   gfx::Transform expected_child_no_scale_transform = child->draw_transform();
   4395   // All transforms operate on content rects. The child's content rect
   4396   // incorporates device scale, but the child_no_scale does not; add it here.
   4397   expected_child_no_scale_transform.Scale(device_scale_factor,
   4398                                           device_scale_factor);
   4399   EXPECT_TRANSFORMATION_MATRIX_EQ(expected_child_no_scale_transform,
   4400                                   child_no_scale->draw_transform());
   4401   EXPECT_TRANSFORMATION_MATRIX_EQ(expected_child_no_scale_transform,
   4402                                   child_no_scale->screen_space_transform());
   4403 }
   4404 
   4405 TEST_F(LayerTreeHostCommonTest, ContentsScale) {
   4406   MockContentLayerClient delegate;
   4407   gfx::Transform identity_matrix;
   4408 
   4409   gfx::Transform parent_scale_matrix;
   4410   SkMScalar initial_parent_scale = 1.75;
   4411   parent_scale_matrix.Scale(initial_parent_scale, initial_parent_scale);
   4412 
   4413   gfx::Transform child_scale_matrix;
   4414   SkMScalar initial_child_scale = 1.25;
   4415   child_scale_matrix.Scale(initial_child_scale, initial_child_scale);
   4416 
   4417   scoped_refptr<Layer> root = Layer::Create();
   4418   root->SetBounds(gfx::Size(100, 100));
   4419 
   4420   scoped_refptr<ContentLayer> parent = CreateDrawableContentLayer(&delegate);
   4421   SetLayerPropertiesForTesting(parent.get(),
   4422                                parent_scale_matrix,
   4423                                gfx::Point3F(),
   4424                                gfx::PointF(),
   4425                                gfx::Size(100, 100),
   4426                                false,
   4427                                true);
   4428 
   4429   scoped_refptr<ContentLayer> child_scale =
   4430       CreateDrawableContentLayer(&delegate);
   4431   SetLayerPropertiesForTesting(child_scale.get(),
   4432                                child_scale_matrix,
   4433                                gfx::Point3F(),
   4434                                gfx::PointF(2.f, 2.f),
   4435                                gfx::Size(10, 10),
   4436                                false,
   4437                                true);
   4438 
   4439   scoped_refptr<ContentLayer> child_empty =
   4440       CreateDrawableContentLayer(&delegate);
   4441   SetLayerPropertiesForTesting(child_empty.get(),
   4442                                child_scale_matrix,
   4443                                gfx::Point3F(),
   4444                                gfx::PointF(2.f, 2.f),
   4445                                gfx::Size(),
   4446                                false,
   4447                                true);
   4448 
   4449   scoped_refptr<NoScaleContentLayer> child_no_scale =
   4450       CreateNoScaleDrawableContentLayer(&delegate);
   4451   SetLayerPropertiesForTesting(child_no_scale.get(),
   4452                                child_scale_matrix,
   4453                                gfx::Point3F(),
   4454                                gfx::PointF(12.f, 12.f),
   4455                                gfx::Size(10, 10),
   4456                                false,
   4457                                true);
   4458 
   4459   root->AddChild(parent);
   4460 
   4461   parent->AddChild(child_scale);
   4462   parent->AddChild(child_empty);
   4463   parent->AddChild(child_no_scale);
   4464 
   4465   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   4466   host->SetRootLayer(root);
   4467 
   4468   float device_scale_factor = 2.5f;
   4469   float page_scale_factor = 1.f;
   4470 
   4471   {
   4472     RenderSurfaceLayerList render_surface_layer_list;
   4473     LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
   4474         root.get(), root->bounds(), &render_surface_layer_list);
   4475     inputs.device_scale_factor = device_scale_factor;
   4476     inputs.page_scale_factor = page_scale_factor;
   4477     inputs.page_scale_application_layer = root.get();
   4478     inputs.can_adjust_raster_scales = true;
   4479     LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   4480 
   4481     EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor *
   4482                              initial_parent_scale, parent);
   4483     EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor *
   4484                              initial_parent_scale * initial_child_scale,
   4485                              child_scale);
   4486     EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor *
   4487                              initial_parent_scale * initial_child_scale,
   4488                              child_empty);
   4489     EXPECT_CONTENTS_SCALE_EQ(1, child_no_scale);
   4490 
   4491     // The parent is scaled up and shouldn't need to scale during draw. The
   4492     // child that can scale its contents should also not need to scale during
   4493     // draw. This shouldn't change if the child has empty bounds. The other
   4494     // children should.
   4495     EXPECT_FLOAT_EQ(1.0, parent->draw_transform().matrix().get(0, 0));
   4496     EXPECT_FLOAT_EQ(1.0, parent->draw_transform().matrix().get(1, 1));
   4497     EXPECT_FLOAT_EQ(1.0, child_scale->draw_transform().matrix().get(0, 0));
   4498     EXPECT_FLOAT_EQ(1.0, child_scale->draw_transform().matrix().get(1, 1));
   4499     EXPECT_FLOAT_EQ(1.0, child_empty->draw_transform().matrix().get(0, 0));
   4500     EXPECT_FLOAT_EQ(1.0, child_empty->draw_transform().matrix().get(1, 1));
   4501     EXPECT_FLOAT_EQ(device_scale_factor * page_scale_factor *
   4502                         initial_parent_scale * initial_child_scale,
   4503                     child_no_scale->draw_transform().matrix().get(0, 0));
   4504     EXPECT_FLOAT_EQ(device_scale_factor * page_scale_factor *
   4505                         initial_parent_scale * initial_child_scale,
   4506                     child_no_scale->draw_transform().matrix().get(1, 1));
   4507   }
   4508 
   4509   // If the device_scale_factor or page_scale_factor changes, then it should be
   4510   // updated using the initial transform as the raster scale.
   4511   device_scale_factor = 2.25f;
   4512   page_scale_factor = 1.25f;
   4513 
   4514   {
   4515     RenderSurfaceLayerList render_surface_layer_list;
   4516     LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
   4517         root.get(), root->bounds(), &render_surface_layer_list);
   4518     inputs.device_scale_factor = device_scale_factor;
   4519     inputs.page_scale_factor = page_scale_factor;
   4520     inputs.page_scale_application_layer = root.get();
   4521     inputs.can_adjust_raster_scales = true;
   4522     LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   4523 
   4524     EXPECT_CONTENTS_SCALE_EQ(
   4525         device_scale_factor * page_scale_factor * initial_parent_scale, parent);
   4526     EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor *
   4527                                  initial_parent_scale * initial_child_scale,
   4528                              child_scale);
   4529     EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor *
   4530                              initial_parent_scale * initial_child_scale,
   4531                              child_empty);
   4532     EXPECT_CONTENTS_SCALE_EQ(1, child_no_scale);
   4533   }
   4534 
   4535   // If the transform changes, we expect the raster scale to be reset to 1.0.
   4536   SkMScalar second_child_scale = 1.75;
   4537   child_scale_matrix.Scale(second_child_scale / initial_child_scale,
   4538                            second_child_scale / initial_child_scale);
   4539   child_scale->SetTransform(child_scale_matrix);
   4540   child_empty->SetTransform(child_scale_matrix);
   4541 
   4542   {
   4543     RenderSurfaceLayerList render_surface_layer_list;
   4544     LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
   4545         root.get(), root->bounds(), &render_surface_layer_list);
   4546     inputs.device_scale_factor = device_scale_factor;
   4547     inputs.page_scale_factor = page_scale_factor;
   4548     inputs.page_scale_application_layer = root.get();
   4549     inputs.can_adjust_raster_scales = true;
   4550     LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   4551 
   4552     EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor *
   4553                              initial_parent_scale,
   4554                              parent);
   4555     EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor,
   4556                              child_scale);
   4557     EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor,
   4558                              child_empty);
   4559     EXPECT_CONTENTS_SCALE_EQ(1, child_no_scale);
   4560   }
   4561 
   4562   // If the device_scale_factor or page_scale_factor changes, then it should be
   4563   // updated, but still using 1.0 as the raster scale.
   4564   device_scale_factor = 2.75f;
   4565   page_scale_factor = 1.75f;
   4566 
   4567   {
   4568     RenderSurfaceLayerList render_surface_layer_list;
   4569     LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
   4570         root.get(), root->bounds(), &render_surface_layer_list);
   4571     inputs.device_scale_factor = device_scale_factor;
   4572     inputs.page_scale_factor = page_scale_factor;
   4573     inputs.page_scale_application_layer = root.get();
   4574     inputs.can_adjust_raster_scales = true;
   4575     LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   4576 
   4577     EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor *
   4578                              initial_parent_scale,
   4579                              parent);
   4580     EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor,
   4581                              child_scale);
   4582     EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor,
   4583                              child_empty);
   4584     EXPECT_CONTENTS_SCALE_EQ(1, child_no_scale);
   4585   }
   4586 }
   4587 
   4588 TEST_F(LayerTreeHostCommonTest,
   4589      ContentsScale_LayerTransformsDontAffectContentsScale) {
   4590   MockContentLayerClient delegate;
   4591   gfx::Transform identity_matrix;
   4592 
   4593   gfx::Transform parent_scale_matrix;
   4594   SkMScalar initial_parent_scale = 1.75;
   4595   parent_scale_matrix.Scale(initial_parent_scale, initial_parent_scale);
   4596 
   4597   gfx::Transform child_scale_matrix;
   4598   SkMScalar initial_child_scale = 1.25;
   4599   child_scale_matrix.Scale(initial_child_scale, initial_child_scale);
   4600 
   4601   scoped_refptr<Layer> root = Layer::Create();
   4602   root->SetBounds(gfx::Size(100, 100));
   4603 
   4604   scoped_refptr<ContentLayer> parent = CreateDrawableContentLayer(&delegate);
   4605   SetLayerPropertiesForTesting(parent.get(),
   4606                                parent_scale_matrix,
   4607                                gfx::Point3F(),
   4608                                gfx::PointF(),
   4609                                gfx::Size(100, 100),
   4610                                false,
   4611                                true);
   4612 
   4613   scoped_refptr<ContentLayer> child_scale =
   4614       CreateDrawableContentLayer(&delegate);
   4615   SetLayerPropertiesForTesting(child_scale.get(),
   4616                                child_scale_matrix,
   4617                                gfx::Point3F(),
   4618                                gfx::PointF(2.f, 2.f),
   4619                                gfx::Size(10, 10),
   4620                                false,
   4621                                true);
   4622 
   4623   scoped_refptr<ContentLayer> child_empty =
   4624       CreateDrawableContentLayer(&delegate);
   4625   SetLayerPropertiesForTesting(child_empty.get(),
   4626                                child_scale_matrix,
   4627                                gfx::Point3F(),
   4628                                gfx::PointF(2.f, 2.f),
   4629                                gfx::Size(),
   4630                                false,
   4631                                true);
   4632 
   4633   scoped_refptr<NoScaleContentLayer> child_no_scale =
   4634       CreateNoScaleDrawableContentLayer(&delegate);
   4635   SetLayerPropertiesForTesting(child_no_scale.get(),
   4636                                child_scale_matrix,
   4637                                gfx::Point3F(),
   4638                                gfx::PointF(12.f, 12.f),
   4639                                gfx::Size(10, 10),
   4640                                false,
   4641                                true);
   4642 
   4643   root->AddChild(parent);
   4644 
   4645   parent->AddChild(child_scale);
   4646   parent->AddChild(child_empty);
   4647   parent->AddChild(child_no_scale);
   4648 
   4649   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   4650   host->SetRootLayer(root);
   4651 
   4652   RenderSurfaceLayerList render_surface_layer_list;
   4653 
   4654   float device_scale_factor = 2.5f;
   4655   float page_scale_factor = 1.f;
   4656 
   4657   LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
   4658       root.get(), root->bounds(), &render_surface_layer_list);
   4659   inputs.device_scale_factor = device_scale_factor;
   4660   inputs.page_scale_factor = page_scale_factor;
   4661   inputs.page_scale_application_layer = root.get(),
   4662   LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   4663 
   4664   EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor, parent);
   4665   EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor,
   4666                            child_scale);
   4667   EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor,
   4668                            child_empty);
   4669   EXPECT_CONTENTS_SCALE_EQ(1, child_no_scale);
   4670 
   4671   // Since the transform scale does not affect contents scale, it should affect
   4672   // the draw transform instead.
   4673   EXPECT_FLOAT_EQ(initial_parent_scale,
   4674                   parent->draw_transform().matrix().get(0, 0));
   4675   EXPECT_FLOAT_EQ(initial_parent_scale,
   4676                   parent->draw_transform().matrix().get(1, 1));
   4677   EXPECT_FLOAT_EQ(initial_parent_scale * initial_child_scale,
   4678                   child_scale->draw_transform().matrix().get(0, 0));
   4679   EXPECT_FLOAT_EQ(initial_parent_scale * initial_child_scale,
   4680                   child_scale->draw_transform().matrix().get(1, 1));
   4681   EXPECT_FLOAT_EQ(initial_parent_scale * initial_child_scale,
   4682                   child_empty->draw_transform().matrix().get(0, 0));
   4683   EXPECT_FLOAT_EQ(initial_parent_scale * initial_child_scale,
   4684                   child_empty->draw_transform().matrix().get(1, 1));
   4685   EXPECT_FLOAT_EQ(device_scale_factor * page_scale_factor *
   4686                       initial_parent_scale * initial_child_scale,
   4687                   child_no_scale->draw_transform().matrix().get(0, 0));
   4688   EXPECT_FLOAT_EQ(device_scale_factor * page_scale_factor *
   4689                       initial_parent_scale * initial_child_scale,
   4690                   child_no_scale->draw_transform().matrix().get(1, 1));
   4691 }
   4692 
   4693 TEST_F(LayerTreeHostCommonTest, SmallContentsScale) {
   4694   MockContentLayerClient delegate;
   4695   gfx::Transform identity_matrix;
   4696 
   4697   gfx::Transform parent_scale_matrix;
   4698   SkMScalar initial_parent_scale = 1.75;
   4699   parent_scale_matrix.Scale(initial_parent_scale, initial_parent_scale);
   4700 
   4701   gfx::Transform child_scale_matrix;
   4702   SkMScalar initial_child_scale = 0.25;
   4703   child_scale_matrix.Scale(initial_child_scale, initial_child_scale);
   4704 
   4705   scoped_refptr<Layer> root = Layer::Create();
   4706   root->SetBounds(gfx::Size(100, 100));
   4707 
   4708   scoped_refptr<ContentLayer> parent = CreateDrawableContentLayer(&delegate);
   4709   SetLayerPropertiesForTesting(parent.get(),
   4710                                parent_scale_matrix,
   4711                                gfx::Point3F(),
   4712                                gfx::PointF(),
   4713                                gfx::Size(100, 100),
   4714                                false,
   4715                                true);
   4716 
   4717   scoped_refptr<ContentLayer> child_scale =
   4718       CreateDrawableContentLayer(&delegate);
   4719   SetLayerPropertiesForTesting(child_scale.get(),
   4720                                child_scale_matrix,
   4721                                gfx::Point3F(),
   4722                                gfx::PointF(2.f, 2.f),
   4723                                gfx::Size(10, 10),
   4724                                false,
   4725                                true);
   4726 
   4727   root->AddChild(parent);
   4728 
   4729   parent->AddChild(child_scale);
   4730 
   4731   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   4732   host->SetRootLayer(root);
   4733 
   4734   float device_scale_factor = 2.5f;
   4735   float page_scale_factor = 0.01f;
   4736 
   4737   {
   4738     RenderSurfaceLayerList render_surface_layer_list;
   4739     LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
   4740         root.get(), root->bounds(), &render_surface_layer_list);
   4741     inputs.device_scale_factor = device_scale_factor;
   4742     inputs.page_scale_factor = page_scale_factor;
   4743     inputs.page_scale_application_layer = root.get();
   4744     inputs.can_adjust_raster_scales = true;
   4745     LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   4746 
   4747     EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor *
   4748                              initial_parent_scale,
   4749                              parent);
   4750     // The child's scale is < 1, so we should not save and use that scale
   4751     // factor.
   4752     EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor * 1,
   4753                              child_scale);
   4754   }
   4755 
   4756   // When chilld's total scale becomes >= 1, we should save and use that scale
   4757   // factor.
   4758   child_scale_matrix.MakeIdentity();
   4759   SkMScalar final_child_scale = 0.75;
   4760   child_scale_matrix.Scale(final_child_scale, final_child_scale);
   4761   child_scale->SetTransform(child_scale_matrix);
   4762 
   4763   {
   4764     RenderSurfaceLayerList render_surface_layer_list;
   4765     LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
   4766         root.get(), root->bounds(), &render_surface_layer_list);
   4767     inputs.device_scale_factor = device_scale_factor;
   4768     inputs.page_scale_factor = page_scale_factor;
   4769     inputs.page_scale_application_layer = root.get();
   4770     inputs.can_adjust_raster_scales = true;
   4771     LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   4772 
   4773     EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor *
   4774                              initial_parent_scale,
   4775                              parent);
   4776     EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor *
   4777                              initial_parent_scale * final_child_scale,
   4778                              child_scale);
   4779   }
   4780 }
   4781 
   4782 TEST_F(LayerTreeHostCommonTest, ContentsScaleForSurfaces) {
   4783   MockContentLayerClient delegate;
   4784   gfx::Transform identity_matrix;
   4785 
   4786   gfx::Transform parent_scale_matrix;
   4787   SkMScalar initial_parent_scale = 2.0;
   4788   parent_scale_matrix.Scale(initial_parent_scale, initial_parent_scale);
   4789 
   4790   gfx::Transform child_scale_matrix;
   4791   SkMScalar initial_child_scale = 3.0;
   4792   child_scale_matrix.Scale(initial_child_scale, initial_child_scale);
   4793 
   4794   scoped_refptr<Layer> root = Layer::Create();
   4795   root->SetBounds(gfx::Size(100, 100));
   4796 
   4797   scoped_refptr<ContentLayer> parent = CreateDrawableContentLayer(&delegate);
   4798   SetLayerPropertiesForTesting(parent.get(),
   4799                                parent_scale_matrix,
   4800                                gfx::Point3F(),
   4801                                gfx::PointF(),
   4802                                gfx::Size(100, 100),
   4803                                false,
   4804                                true);
   4805 
   4806   scoped_refptr<ContentLayer> surface_scale =
   4807       CreateDrawableContentLayer(&delegate);
   4808   SetLayerPropertiesForTesting(surface_scale.get(),
   4809                                child_scale_matrix,
   4810                                gfx::Point3F(),
   4811                                gfx::PointF(2.f, 2.f),
   4812                                gfx::Size(10, 10),
   4813                                false,
   4814                                true);
   4815 
   4816   scoped_refptr<ContentLayer> surface_scale_child_scale =
   4817       CreateDrawableContentLayer(&delegate);
   4818   SetLayerPropertiesForTesting(surface_scale_child_scale.get(),
   4819                                child_scale_matrix,
   4820                                gfx::Point3F(),
   4821                                gfx::PointF(),
   4822                                gfx::Size(10, 10),
   4823                                false,
   4824                                true);
   4825 
   4826   scoped_refptr<NoScaleContentLayer> surface_scale_child_no_scale =
   4827       CreateNoScaleDrawableContentLayer(&delegate);
   4828   SetLayerPropertiesForTesting(surface_scale_child_no_scale.get(),
   4829                                child_scale_matrix,
   4830                                gfx::Point3F(),
   4831                                gfx::PointF(),
   4832                                gfx::Size(10, 10),
   4833                                false,
   4834                                true);
   4835 
   4836   scoped_refptr<NoScaleContentLayer> surface_no_scale =
   4837       CreateNoScaleDrawableContentLayer(&delegate);
   4838   SetLayerPropertiesForTesting(surface_no_scale.get(),
   4839                                child_scale_matrix,
   4840                                gfx::Point3F(),
   4841                                gfx::PointF(12.f, 12.f),
   4842                                gfx::Size(10, 10),
   4843                                false,
   4844                                true);
   4845 
   4846   scoped_refptr<ContentLayer> surface_no_scale_child_scale =
   4847       CreateDrawableContentLayer(&delegate);
   4848   SetLayerPropertiesForTesting(surface_no_scale_child_scale.get(),
   4849                                child_scale_matrix,
   4850                                gfx::Point3F(),
   4851                                gfx::PointF(),
   4852                                gfx::Size(10, 10),
   4853                                false,
   4854                                true);
   4855 
   4856   scoped_refptr<NoScaleContentLayer> surface_no_scale_child_no_scale =
   4857       CreateNoScaleDrawableContentLayer(&delegate);
   4858   SetLayerPropertiesForTesting(surface_no_scale_child_no_scale.get(),
   4859                                child_scale_matrix,
   4860                                gfx::Point3F(),
   4861                                gfx::PointF(),
   4862                                gfx::Size(10, 10),
   4863                                false,
   4864                                true);
   4865 
   4866   root->AddChild(parent);
   4867 
   4868   parent->AddChild(surface_scale);
   4869   parent->AddChild(surface_no_scale);
   4870 
   4871   surface_scale->SetForceRenderSurface(true);
   4872   surface_scale->AddChild(surface_scale_child_scale);
   4873   surface_scale->AddChild(surface_scale_child_no_scale);
   4874 
   4875   surface_no_scale->SetForceRenderSurface(true);
   4876   surface_no_scale->AddChild(surface_no_scale_child_scale);
   4877   surface_no_scale->AddChild(surface_no_scale_child_no_scale);
   4878 
   4879   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   4880   host->SetRootLayer(root);
   4881 
   4882   SkMScalar device_scale_factor = 5;
   4883   SkMScalar page_scale_factor = 7;
   4884 
   4885   RenderSurfaceLayerList render_surface_layer_list;
   4886   LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
   4887       root.get(), root->bounds(), &render_surface_layer_list);
   4888   inputs.device_scale_factor = device_scale_factor;
   4889   inputs.page_scale_factor = page_scale_factor;
   4890   inputs.page_scale_application_layer = root.get();
   4891   inputs.can_adjust_raster_scales = true;
   4892   LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   4893 
   4894   EXPECT_CONTENTS_SCALE_EQ(
   4895       device_scale_factor * page_scale_factor * initial_parent_scale, parent);
   4896   EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor *
   4897                                initial_parent_scale * initial_child_scale,
   4898                            surface_scale);
   4899   EXPECT_CONTENTS_SCALE_EQ(1, surface_no_scale);
   4900   EXPECT_CONTENTS_SCALE_EQ(
   4901       device_scale_factor * page_scale_factor * initial_parent_scale *
   4902       initial_child_scale * initial_child_scale,
   4903       surface_scale_child_scale);
   4904   EXPECT_CONTENTS_SCALE_EQ(1, surface_scale_child_no_scale);
   4905   EXPECT_CONTENTS_SCALE_EQ(
   4906       device_scale_factor * page_scale_factor * initial_parent_scale *
   4907       initial_child_scale * initial_child_scale,
   4908       surface_no_scale_child_scale);
   4909   EXPECT_CONTENTS_SCALE_EQ(1, surface_no_scale_child_no_scale);
   4910 
   4911   // The parent is scaled up and shouldn't need to scale during draw.
   4912   EXPECT_FLOAT_EQ(1.0, parent->draw_transform().matrix().get(0, 0));
   4913   EXPECT_FLOAT_EQ(1.0, parent->draw_transform().matrix().get(1, 1));
   4914 
   4915   // RenderSurfaces should always be 1:1 with their target.
   4916   EXPECT_FLOAT_EQ(
   4917       1.0,
   4918       surface_scale->render_surface()->draw_transform().matrix().get(0, 0));
   4919   EXPECT_FLOAT_EQ(
   4920       1.0,
   4921       surface_scale->render_surface()->draw_transform().matrix().get(1, 1));
   4922 
   4923   // The surface_scale can apply contents scale so the layer shouldn't need to
   4924   // scale during draw.
   4925   EXPECT_FLOAT_EQ(1.0, surface_scale->draw_transform().matrix().get(0, 0));
   4926   EXPECT_FLOAT_EQ(1.0, surface_scale->draw_transform().matrix().get(1, 1));
   4927 
   4928   // The surface_scale_child_scale can apply contents scale so it shouldn't need
   4929   // to scale during draw.
   4930   EXPECT_FLOAT_EQ(
   4931       1.0, surface_scale_child_scale->draw_transform().matrix().get(0, 0));
   4932   EXPECT_FLOAT_EQ(
   4933       1.0, surface_scale_child_scale->draw_transform().matrix().get(1, 1));
   4934 
   4935   // The surface_scale_child_no_scale can not apply contents scale, so it needs
   4936   // to be scaled during draw.
   4937   EXPECT_FLOAT_EQ(
   4938       device_scale_factor * page_scale_factor * initial_parent_scale *
   4939           initial_child_scale * initial_child_scale,
   4940       surface_scale_child_no_scale->draw_transform().matrix().get(0, 0));
   4941   EXPECT_FLOAT_EQ(
   4942       device_scale_factor * page_scale_factor * initial_parent_scale *
   4943           initial_child_scale * initial_child_scale,
   4944       surface_scale_child_no_scale->draw_transform().matrix().get(1, 1));
   4945 
   4946   // RenderSurfaces should always be 1:1 with their target.
   4947   EXPECT_FLOAT_EQ(
   4948       1.0,
   4949       surface_no_scale->render_surface()->draw_transform().matrix().get(0, 0));
   4950   EXPECT_FLOAT_EQ(
   4951       1.0,
   4952       surface_no_scale->render_surface()->draw_transform().matrix().get(1, 1));
   4953 
   4954   // The surface_no_scale layer can not apply contents scale, so it needs to be
   4955   // scaled during draw.
   4956   EXPECT_FLOAT_EQ(device_scale_factor * page_scale_factor *
   4957                       initial_parent_scale * initial_child_scale,
   4958                   surface_no_scale->draw_transform().matrix().get(0, 0));
   4959   EXPECT_FLOAT_EQ(device_scale_factor * page_scale_factor *
   4960                       initial_parent_scale * initial_child_scale,
   4961                   surface_no_scale->draw_transform().matrix().get(1, 1));
   4962 
   4963   // The surface_scale_child_scale can apply contents scale so it shouldn't need
   4964   // to scale during draw.
   4965   EXPECT_FLOAT_EQ(
   4966       1.0, surface_no_scale_child_scale->draw_transform().matrix().get(0, 0));
   4967   EXPECT_FLOAT_EQ(
   4968       1.0, surface_no_scale_child_scale->draw_transform().matrix().get(1, 1));
   4969 
   4970   // The surface_scale_child_no_scale can not apply contents scale, so it needs
   4971   // to be scaled during draw.
   4972   EXPECT_FLOAT_EQ(
   4973       device_scale_factor * page_scale_factor * initial_parent_scale *
   4974           initial_child_scale * initial_child_scale,
   4975       surface_no_scale_child_no_scale->draw_transform().matrix().get(0, 0));
   4976   EXPECT_FLOAT_EQ(
   4977       device_scale_factor * page_scale_factor * initial_parent_scale *
   4978           initial_child_scale * initial_child_scale,
   4979       surface_no_scale_child_no_scale->draw_transform().matrix().get(1, 1));
   4980 }
   4981 
   4982 TEST_F(LayerTreeHostCommonTest,
   4983      ContentsScaleForSurfaces_LayerTransformsDontAffectContentsScale) {
   4984   MockContentLayerClient delegate;
   4985   gfx::Transform identity_matrix;
   4986 
   4987   gfx::Transform parent_scale_matrix;
   4988   SkMScalar initial_parent_scale = 2.0;
   4989   parent_scale_matrix.Scale(initial_parent_scale, initial_parent_scale);
   4990 
   4991   gfx::Transform child_scale_matrix;
   4992   SkMScalar initial_child_scale = 3.0;
   4993   child_scale_matrix.Scale(initial_child_scale, initial_child_scale);
   4994 
   4995   scoped_refptr<Layer> root = Layer::Create();
   4996   root->SetBounds(gfx::Size(100, 100));
   4997 
   4998   scoped_refptr<ContentLayer> parent = CreateDrawableContentLayer(&delegate);
   4999   SetLayerPropertiesForTesting(parent.get(),
   5000                                parent_scale_matrix,
   5001                                gfx::Point3F(),
   5002                                gfx::PointF(),
   5003                                gfx::Size(100, 100),
   5004                                false,
   5005                                true);
   5006 
   5007   scoped_refptr<ContentLayer> surface_scale =
   5008       CreateDrawableContentLayer(&delegate);
   5009   SetLayerPropertiesForTesting(surface_scale.get(),
   5010                                child_scale_matrix,
   5011                                gfx::Point3F(),
   5012                                gfx::PointF(2.f, 2.f),
   5013                                gfx::Size(10, 10),
   5014                                false,
   5015                                true);
   5016 
   5017   scoped_refptr<ContentLayer> surface_scale_child_scale =
   5018       CreateDrawableContentLayer(&delegate);
   5019   SetLayerPropertiesForTesting(surface_scale_child_scale.get(),
   5020                                child_scale_matrix,
   5021                                gfx::Point3F(),
   5022                                gfx::PointF(),
   5023                                gfx::Size(10, 10),
   5024                                false,
   5025                                true);
   5026 
   5027   scoped_refptr<NoScaleContentLayer> surface_scale_child_no_scale =
   5028       CreateNoScaleDrawableContentLayer(&delegate);
   5029   SetLayerPropertiesForTesting(surface_scale_child_no_scale.get(),
   5030                                child_scale_matrix,
   5031                                gfx::Point3F(),
   5032                                gfx::PointF(),
   5033                                gfx::Size(10, 10),
   5034                                false,
   5035                                true);
   5036 
   5037   scoped_refptr<NoScaleContentLayer> surface_no_scale =
   5038       CreateNoScaleDrawableContentLayer(&delegate);
   5039   SetLayerPropertiesForTesting(surface_no_scale.get(),
   5040                                child_scale_matrix,
   5041                                gfx::Point3F(),
   5042                                gfx::PointF(12.f, 12.f),
   5043                                gfx::Size(10, 10),
   5044                                false,
   5045                                true);
   5046 
   5047   scoped_refptr<ContentLayer> surface_no_scale_child_scale =
   5048       CreateDrawableContentLayer(&delegate);
   5049   SetLayerPropertiesForTesting(surface_no_scale_child_scale.get(),
   5050                                child_scale_matrix,
   5051                                gfx::Point3F(),
   5052                                gfx::PointF(),
   5053                                gfx::Size(10, 10),
   5054                                false,
   5055                                true);
   5056 
   5057   scoped_refptr<NoScaleContentLayer> surface_no_scale_child_no_scale =
   5058       CreateNoScaleDrawableContentLayer(&delegate);
   5059   SetLayerPropertiesForTesting(surface_no_scale_child_no_scale.get(),
   5060                                child_scale_matrix,
   5061                                gfx::Point3F(),
   5062                                gfx::PointF(),
   5063                                gfx::Size(10, 10),
   5064                                false,
   5065                                true);
   5066 
   5067   root->AddChild(parent);
   5068 
   5069   parent->AddChild(surface_scale);
   5070   parent->AddChild(surface_no_scale);
   5071 
   5072   surface_scale->SetForceRenderSurface(true);
   5073   surface_scale->AddChild(surface_scale_child_scale);
   5074   surface_scale->AddChild(surface_scale_child_no_scale);
   5075 
   5076   surface_no_scale->SetForceRenderSurface(true);
   5077   surface_no_scale->AddChild(surface_no_scale_child_scale);
   5078   surface_no_scale->AddChild(surface_no_scale_child_no_scale);
   5079 
   5080   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   5081   host->SetRootLayer(root);
   5082 
   5083   RenderSurfaceLayerList render_surface_layer_list;
   5084 
   5085   SkMScalar device_scale_factor = 5.0;
   5086   SkMScalar page_scale_factor = 7.0;
   5087   LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
   5088       root.get(), root->bounds(), &render_surface_layer_list);
   5089   inputs.device_scale_factor = device_scale_factor;
   5090   inputs.page_scale_factor = page_scale_factor;
   5091   inputs.page_scale_application_layer = root.get();
   5092   LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   5093 
   5094   EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor,
   5095                            parent);
   5096   EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor,
   5097                            surface_scale);
   5098   EXPECT_CONTENTS_SCALE_EQ(1.f, surface_no_scale);
   5099   EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor,
   5100                            surface_scale_child_scale);
   5101   EXPECT_CONTENTS_SCALE_EQ(1.f, surface_scale_child_no_scale);
   5102   EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor,
   5103                            surface_no_scale_child_scale);
   5104   EXPECT_CONTENTS_SCALE_EQ(1.f, surface_no_scale_child_no_scale);
   5105 
   5106   // The parent is scaled up during draw, since its contents are not scaled by
   5107   // the transform hierarchy.
   5108   EXPECT_FLOAT_EQ(initial_parent_scale,
   5109                   parent->draw_transform().matrix().get(0, 0));
   5110   EXPECT_FLOAT_EQ(initial_parent_scale,
   5111                   parent->draw_transform().matrix().get(1, 1));
   5112 
   5113   // The child surface is scaled up during draw since its subtree is not scaled
   5114   // by the transform hierarchy.
   5115   EXPECT_FLOAT_EQ(
   5116       initial_parent_scale * initial_child_scale,
   5117       surface_scale->render_surface()->draw_transform().matrix().get(0, 0));
   5118   EXPECT_FLOAT_EQ(
   5119       initial_parent_scale * initial_child_scale,
   5120       surface_scale->render_surface()->draw_transform().matrix().get(1, 1));
   5121 
   5122   // The surface_scale's RenderSurface is scaled during draw, so the layer does
   5123   // not need to be scaled when drawing into its surface.
   5124   EXPECT_FLOAT_EQ(1.0, surface_scale->draw_transform().matrix().get(0, 0));
   5125   EXPECT_FLOAT_EQ(1.0, surface_scale->draw_transform().matrix().get(1, 1));
   5126 
   5127   // The surface_scale_child_scale is scaled when drawing into its surface,
   5128   // since its content bounds are not scaled by the transform hierarchy.
   5129   EXPECT_FLOAT_EQ(
   5130       initial_child_scale,
   5131       surface_scale_child_scale->draw_transform().matrix().get(0, 0));
   5132   EXPECT_FLOAT_EQ(
   5133       initial_child_scale,
   5134       surface_scale_child_scale->draw_transform().matrix().get(1, 1));
   5135 
   5136   // The surface_scale_child_no_scale has a fixed contents scale of 1, so it
   5137   // needs to be scaled by the device and page scale factors, along with the
   5138   // transform hierarchy.
   5139   EXPECT_FLOAT_EQ(
   5140       device_scale_factor * page_scale_factor * initial_child_scale,
   5141       surface_scale_child_no_scale->draw_transform().matrix().get(0, 0));
   5142   EXPECT_FLOAT_EQ(
   5143       device_scale_factor * page_scale_factor * initial_child_scale,
   5144       surface_scale_child_no_scale->draw_transform().matrix().get(1, 1));
   5145 
   5146   // The child surface is scaled up during draw since its subtree is not scaled
   5147   // by the transform hierarchy.
   5148   EXPECT_FLOAT_EQ(
   5149       initial_parent_scale * initial_child_scale,
   5150       surface_no_scale->render_surface()->draw_transform().matrix().get(0, 0));
   5151   EXPECT_FLOAT_EQ(
   5152       initial_parent_scale * initial_child_scale,
   5153       surface_no_scale->render_surface()->draw_transform().matrix().get(1, 1));
   5154 
   5155   // The surface_no_scale layer has a fixed contents scale of 1, so it needs to
   5156   // be scaled by the device and page scale factors. Its surface is already
   5157   // scaled by the transform hierarchy so those don't need to scale the layer's
   5158   // drawing.
   5159   EXPECT_FLOAT_EQ(device_scale_factor * page_scale_factor,
   5160                   surface_no_scale->draw_transform().matrix().get(0, 0));
   5161   EXPECT_FLOAT_EQ(device_scale_factor * page_scale_factor,
   5162                   surface_no_scale->draw_transform().matrix().get(1, 1));
   5163 
   5164   // The surface_no_scale_child_scale has its contents scaled by the page and
   5165   // device scale factors, but needs to be scaled by the transform hierarchy
   5166   // when drawing.
   5167   EXPECT_FLOAT_EQ(
   5168       initial_child_scale,
   5169       surface_no_scale_child_scale->draw_transform().matrix().get(0, 0));
   5170   EXPECT_FLOAT_EQ(
   5171       initial_child_scale,
   5172       surface_no_scale_child_scale->draw_transform().matrix().get(1, 1));
   5173 
   5174   // The surface_no_scale_child_no_scale has a fixed contents scale of 1, so it
   5175   // needs to be scaled by the device and page scale factors. It also needs to
   5176   // be scaled by any transform heirarchy below its target surface.
   5177   EXPECT_FLOAT_EQ(
   5178       device_scale_factor * page_scale_factor * initial_child_scale,
   5179       surface_no_scale_child_no_scale->draw_transform().matrix().get(0, 0));
   5180   EXPECT_FLOAT_EQ(
   5181       device_scale_factor * page_scale_factor * initial_child_scale,
   5182       surface_no_scale_child_no_scale->draw_transform().matrix().get(1, 1));
   5183 }
   5184 
   5185 TEST_F(LayerTreeHostCommonTest, ContentsScaleForAnimatingLayer) {
   5186   MockContentLayerClient delegate;
   5187   gfx::Transform identity_matrix;
   5188 
   5189   gfx::Transform parent_scale_matrix;
   5190   SkMScalar initial_parent_scale = 1.75;
   5191   parent_scale_matrix.Scale(initial_parent_scale, initial_parent_scale);
   5192 
   5193   gfx::Transform child_scale_matrix;
   5194   SkMScalar initial_child_scale = 1.25;
   5195   child_scale_matrix.Scale(initial_child_scale, initial_child_scale);
   5196 
   5197   scoped_refptr<Layer> root = Layer::Create();
   5198   root->SetBounds(gfx::Size(100, 100));
   5199 
   5200   scoped_refptr<ContentLayer> parent = CreateDrawableContentLayer(&delegate);
   5201   SetLayerPropertiesForTesting(parent.get(),
   5202                                parent_scale_matrix,
   5203                                gfx::Point3F(),
   5204                                gfx::PointF(),
   5205                                gfx::Size(100, 100),
   5206                                false,
   5207                                true);
   5208 
   5209   scoped_refptr<ContentLayer> child_scale =
   5210       CreateDrawableContentLayer(&delegate);
   5211   SetLayerPropertiesForTesting(child_scale.get(),
   5212                                child_scale_matrix,
   5213                                gfx::Point3F(),
   5214                                gfx::PointF(2.f, 2.f),
   5215                                gfx::Size(10, 10),
   5216                                false,
   5217                                true);
   5218 
   5219   root->AddChild(parent);
   5220 
   5221   parent->AddChild(child_scale);
   5222 
   5223   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   5224   host->SetRootLayer(root);
   5225 
   5226   // Now put an animating transform on child.
   5227   int animation_id = AddAnimatedTransformToController(
   5228       child_scale->layer_animation_controller(), 10.0, 30, 0);
   5229 
   5230   {
   5231     RenderSurfaceLayerList render_surface_layer_list;
   5232     LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
   5233         root.get(), root->bounds(), &render_surface_layer_list);
   5234     inputs.can_adjust_raster_scales = true;
   5235     LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   5236 
   5237     EXPECT_CONTENTS_SCALE_EQ(initial_parent_scale, parent);
   5238     // The layers with animating transforms should not compute a contents scale
   5239     // other than 1 until they finish animating.
   5240     EXPECT_CONTENTS_SCALE_EQ(1, child_scale);
   5241   }
   5242 
   5243   // Remove the animation, now it can save a raster scale.
   5244   child_scale->layer_animation_controller()->RemoveAnimation(animation_id);
   5245 
   5246   {
   5247     RenderSurfaceLayerList render_surface_layer_list;
   5248     LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
   5249         root.get(), root->bounds(), &render_surface_layer_list);
   5250     inputs.can_adjust_raster_scales = true;
   5251     LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   5252 
   5253     EXPECT_CONTENTS_SCALE_EQ(initial_parent_scale, parent);
   5254     // The layers with animating transforms should not compute a contents scale
   5255     // other than 1 until they finish animating.
   5256     EXPECT_CONTENTS_SCALE_EQ(initial_parent_scale * initial_child_scale,
   5257                              child_scale);
   5258   }
   5259 }
   5260 
   5261 TEST_F(LayerTreeHostCommonTest,
   5262        ChangeInContentBoundsOrScaleTriggersPushProperties) {
   5263   MockContentLayerClient delegate;
   5264   scoped_refptr<Layer> root = Layer::Create();
   5265   scoped_refptr<Layer> child = CreateDrawableContentLayer(&delegate);
   5266   root->AddChild(child);
   5267 
   5268   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   5269   host->SetRootLayer(root);
   5270 
   5271   gfx::Transform identity_matrix;
   5272   SetLayerPropertiesForTesting(root.get(),
   5273                                identity_matrix,
   5274                                gfx::Point3F(),
   5275                                gfx::PointF(),
   5276                                gfx::Size(100, 100),
   5277                                true,
   5278                                false);
   5279   SetLayerPropertiesForTesting(child.get(),
   5280                                identity_matrix,
   5281                                gfx::Point3F(),
   5282                                gfx::PointF(),
   5283                                gfx::Size(100, 100),
   5284                                true,
   5285                                false);
   5286 
   5287   root->reset_needs_push_properties_for_testing();
   5288   child->reset_needs_push_properties_for_testing();
   5289 
   5290   // This will change both layers' content bounds.
   5291   ExecuteCalculateDrawProperties(root.get());
   5292   EXPECT_TRUE(root->needs_push_properties());
   5293   EXPECT_TRUE(child->needs_push_properties());
   5294 
   5295   root->reset_needs_push_properties_for_testing();
   5296   child->reset_needs_push_properties_for_testing();
   5297 
   5298   // This will change only the child layer's contents scale and content bounds,
   5299   // since the root layer is not a ContentsScalingLayer.
   5300   ExecuteCalculateDrawProperties(root.get(), 2.f);
   5301   EXPECT_FALSE(root->needs_push_properties());
   5302   EXPECT_TRUE(child->needs_push_properties());
   5303 
   5304   root->reset_needs_push_properties_for_testing();
   5305   child->reset_needs_push_properties_for_testing();
   5306 
   5307   // This will not change either layer's contents scale or content bounds.
   5308   ExecuteCalculateDrawProperties(root.get(), 2.f);
   5309   EXPECT_FALSE(root->needs_push_properties());
   5310   EXPECT_FALSE(child->needs_push_properties());
   5311 }
   5312 
   5313 TEST_F(LayerTreeHostCommonTest, RenderSurfaceTransformsInHighDPI) {
   5314   MockContentLayerClient delegate;
   5315   gfx::Transform identity_matrix;
   5316 
   5317   scoped_refptr<ContentLayer> parent = CreateDrawableContentLayer(&delegate);
   5318   SetLayerPropertiesForTesting(parent.get(),
   5319                                identity_matrix,
   5320                                gfx::Point3F(),
   5321                                gfx::PointF(),
   5322                                gfx::Size(30, 30),
   5323                                false,
   5324                                true);
   5325 
   5326   scoped_refptr<ContentLayer> child = CreateDrawableContentLayer(&delegate);
   5327   SetLayerPropertiesForTesting(child.get(),
   5328                                identity_matrix,
   5329                                gfx::Point3F(),
   5330                                gfx::PointF(2.f, 2.f),
   5331                                gfx::Size(10, 10),
   5332                                false,
   5333                                true);
   5334 
   5335   gfx::Transform replica_transform;
   5336   replica_transform.Scale(1.0, -1.0);
   5337   scoped_refptr<ContentLayer> replica = CreateDrawableContentLayer(&delegate);
   5338   SetLayerPropertiesForTesting(replica.get(),
   5339                                replica_transform,
   5340                                gfx::Point3F(),
   5341                                gfx::PointF(2.f, 2.f),
   5342                                gfx::Size(10, 10),
   5343                                false,
   5344                                true);
   5345 
   5346   // This layer should end up in the same surface as child, with the same draw
   5347   // and screen space transforms.
   5348   scoped_refptr<ContentLayer> duplicate_child_non_owner =
   5349       CreateDrawableContentLayer(&delegate);
   5350   SetLayerPropertiesForTesting(duplicate_child_non_owner.get(),
   5351                                identity_matrix,
   5352                                gfx::Point3F(),
   5353                                gfx::PointF(),
   5354                                gfx::Size(10, 10),
   5355                                false,
   5356                                true);
   5357 
   5358   parent->AddChild(child);
   5359   child->AddChild(duplicate_child_non_owner);
   5360   child->SetReplicaLayer(replica.get());
   5361 
   5362   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   5363   host->SetRootLayer(parent);
   5364 
   5365   RenderSurfaceLayerList render_surface_layer_list;
   5366 
   5367   float device_scale_factor = 1.5f;
   5368   LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
   5369       parent.get(), parent->bounds(), &render_surface_layer_list);
   5370   inputs.device_scale_factor = device_scale_factor;
   5371   inputs.can_adjust_raster_scales = true;
   5372   LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   5373 
   5374   // We should have two render surfaces. The root's render surface and child's
   5375   // render surface (it needs one because it has a replica layer).
   5376   EXPECT_EQ(2u, render_surface_layer_list.size());
   5377 
   5378   gfx::Transform expected_parent_transform;
   5379   EXPECT_TRANSFORMATION_MATRIX_EQ(expected_parent_transform,
   5380                                   parent->screen_space_transform());
   5381   EXPECT_TRANSFORMATION_MATRIX_EQ(expected_parent_transform,
   5382                                   parent->draw_transform());
   5383 
   5384   gfx::Transform expected_draw_transform;
   5385   EXPECT_TRANSFORMATION_MATRIX_EQ(expected_draw_transform,
   5386                                   child->draw_transform());
   5387 
   5388   gfx::Transform expected_screen_space_transform;
   5389   expected_screen_space_transform.Translate(
   5390       device_scale_factor * child->position().x(),
   5391       device_scale_factor * child->position().y());
   5392   EXPECT_TRANSFORMATION_MATRIX_EQ(expected_screen_space_transform,
   5393                                   child->screen_space_transform());
   5394 
   5395   gfx::Transform expected_duplicate_child_draw_transform =
   5396       child->draw_transform();
   5397   EXPECT_TRANSFORMATION_MATRIX_EQ(child->draw_transform(),
   5398                                   duplicate_child_non_owner->draw_transform());
   5399   EXPECT_TRANSFORMATION_MATRIX_EQ(
   5400       child->screen_space_transform(),
   5401       duplicate_child_non_owner->screen_space_transform());
   5402   EXPECT_RECT_EQ(child->drawable_content_rect(),
   5403                  duplicate_child_non_owner->drawable_content_rect());
   5404   EXPECT_EQ(child->content_bounds(),
   5405             duplicate_child_non_owner->content_bounds());
   5406 
   5407   gfx::Transform expected_render_surface_draw_transform;
   5408   expected_render_surface_draw_transform.Translate(
   5409       device_scale_factor * child->position().x(),
   5410       device_scale_factor * child->position().y());
   5411   EXPECT_TRANSFORMATION_MATRIX_EQ(expected_render_surface_draw_transform,
   5412                                   child->render_surface()->draw_transform());
   5413 
   5414   gfx::Transform expected_surface_draw_transform;
   5415   expected_surface_draw_transform.Translate(device_scale_factor * 2.f,
   5416                                             device_scale_factor * 2.f);
   5417   EXPECT_TRANSFORMATION_MATRIX_EQ(expected_surface_draw_transform,
   5418                                   child->render_surface()->draw_transform());
   5419 
   5420   gfx::Transform expected_surface_screen_space_transform;
   5421   expected_surface_screen_space_transform.Translate(device_scale_factor * 2.f,
   5422                                                     device_scale_factor * 2.f);
   5423   EXPECT_TRANSFORMATION_MATRIX_EQ(
   5424       expected_surface_screen_space_transform,
   5425       child->render_surface()->screen_space_transform());
   5426 
   5427   gfx::Transform expected_replica_draw_transform;
   5428   expected_replica_draw_transform.matrix().set(1, 1, -1.0);
   5429   expected_replica_draw_transform.matrix().set(0, 3, 6.0);
   5430   expected_replica_draw_transform.matrix().set(1, 3, 6.0);
   5431   EXPECT_TRANSFORMATION_MATRIX_EQ(
   5432       expected_replica_draw_transform,
   5433       child->render_surface()->replica_draw_transform());
   5434 
   5435   gfx::Transform expected_replica_screen_space_transform;
   5436   expected_replica_screen_space_transform.matrix().set(1, 1, -1.0);
   5437   expected_replica_screen_space_transform.matrix().set(0, 3, 6.0);
   5438   expected_replica_screen_space_transform.matrix().set(1, 3, 6.0);
   5439   EXPECT_TRANSFORMATION_MATRIX_EQ(
   5440       expected_replica_screen_space_transform,
   5441       child->render_surface()->replica_screen_space_transform());
   5442   EXPECT_TRANSFORMATION_MATRIX_EQ(
   5443       expected_replica_screen_space_transform,
   5444       child->render_surface()->replica_screen_space_transform());
   5445 }
   5446 
   5447 TEST_F(LayerTreeHostCommonTest,
   5448      RenderSurfaceTransformsInHighDPIAccurateScaleZeroPosition) {
   5449   MockContentLayerClient delegate;
   5450   gfx::Transform identity_matrix;
   5451 
   5452   scoped_refptr<ContentLayer> parent = CreateDrawableContentLayer(&delegate);
   5453   SetLayerPropertiesForTesting(parent.get(),
   5454                                identity_matrix,
   5455                                gfx::Point3F(),
   5456                                gfx::PointF(),
   5457                                gfx::Size(33, 31),
   5458                                false,
   5459                                true);
   5460 
   5461   scoped_refptr<ContentLayer> child = CreateDrawableContentLayer(&delegate);
   5462   SetLayerPropertiesForTesting(child.get(),
   5463                                identity_matrix,
   5464                                gfx::Point3F(),
   5465                                gfx::PointF(),
   5466                                gfx::Size(13, 11),
   5467                                false,
   5468                                true);
   5469 
   5470   gfx::Transform replica_transform;
   5471   replica_transform.Scale(1.0, -1.0);
   5472   scoped_refptr<ContentLayer> replica = CreateDrawableContentLayer(&delegate);
   5473   SetLayerPropertiesForTesting(replica.get(),
   5474                                replica_transform,
   5475                                gfx::Point3F(),
   5476                                gfx::PointF(),
   5477                                gfx::Size(13, 11),
   5478                                false,
   5479                                true);
   5480 
   5481   // This layer should end up in the same surface as child, with the same draw
   5482   // and screen space transforms.
   5483   scoped_refptr<ContentLayer> duplicate_child_non_owner =
   5484       CreateDrawableContentLayer(&delegate);
   5485   SetLayerPropertiesForTesting(duplicate_child_non_owner.get(),
   5486                                identity_matrix,
   5487                                gfx::Point3F(),
   5488                                gfx::PointF(),
   5489                                gfx::Size(13, 11),
   5490                                false,
   5491                                true);
   5492 
   5493   parent->AddChild(child);
   5494   child->AddChild(duplicate_child_non_owner);
   5495   child->SetReplicaLayer(replica.get());
   5496 
   5497   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   5498   host->SetRootLayer(parent);
   5499 
   5500   float device_scale_factor = 1.7f;
   5501 
   5502   RenderSurfaceLayerList render_surface_layer_list;
   5503   LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
   5504       parent.get(), parent->bounds(), &render_surface_layer_list);
   5505   inputs.device_scale_factor = device_scale_factor;
   5506   inputs.can_adjust_raster_scales = true;
   5507   LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   5508 
   5509   // We should have two render surfaces. The root's render surface and child's
   5510   // render surface (it needs one because it has a replica layer).
   5511   EXPECT_EQ(2u, render_surface_layer_list.size());
   5512 
   5513   gfx::Transform identity_transform;
   5514 
   5515   EXPECT_TRANSFORMATION_MATRIX_EQ(identity_transform,
   5516                                   parent->screen_space_transform());
   5517   EXPECT_TRANSFORMATION_MATRIX_EQ(identity_transform, parent->draw_transform());
   5518   EXPECT_TRANSFORMATION_MATRIX_EQ(identity_transform, child->draw_transform());
   5519   EXPECT_TRANSFORMATION_MATRIX_EQ(identity_transform,
   5520                                   child->screen_space_transform());
   5521   EXPECT_TRANSFORMATION_MATRIX_EQ(identity_transform,
   5522                                   duplicate_child_non_owner->draw_transform());
   5523   EXPECT_TRANSFORMATION_MATRIX_EQ(
   5524       identity_transform, duplicate_child_non_owner->screen_space_transform());
   5525   EXPECT_RECT_EQ(child->drawable_content_rect(),
   5526                  duplicate_child_non_owner->drawable_content_rect());
   5527   EXPECT_EQ(child->content_bounds(),
   5528             duplicate_child_non_owner->content_bounds());
   5529 
   5530   EXPECT_TRANSFORMATION_MATRIX_EQ(identity_transform,
   5531                                   child->render_surface()->draw_transform());
   5532   EXPECT_TRANSFORMATION_MATRIX_EQ(identity_transform,
   5533                                   child->render_surface()->draw_transform());
   5534   EXPECT_TRANSFORMATION_MATRIX_EQ(
   5535       identity_transform, child->render_surface()->screen_space_transform());
   5536 
   5537   gfx::Transform expected_replica_draw_transform;
   5538   expected_replica_draw_transform.matrix().set(1, 1, -1.0);
   5539   EXPECT_TRANSFORMATION_MATRIX_EQ(
   5540       expected_replica_draw_transform,
   5541       child->render_surface()->replica_draw_transform());
   5542 
   5543   gfx::Transform expected_replica_screen_space_transform;
   5544   expected_replica_screen_space_transform.matrix().set(1, 1, -1.0);
   5545   EXPECT_TRANSFORMATION_MATRIX_EQ(
   5546       expected_replica_screen_space_transform,
   5547       child->render_surface()->replica_screen_space_transform());
   5548 }
   5549 
   5550 TEST_F(LayerTreeHostCommonTest, SubtreeSearch) {
   5551   scoped_refptr<Layer> root = Layer::Create();
   5552   scoped_refptr<Layer> child = Layer::Create();
   5553   scoped_refptr<Layer> grand_child = Layer::Create();
   5554   scoped_refptr<Layer> mask_layer = Layer::Create();
   5555   scoped_refptr<Layer> replica_layer = Layer::Create();
   5556 
   5557   grand_child->SetReplicaLayer(replica_layer.get());
   5558   child->AddChild(grand_child.get());
   5559   child->SetMaskLayer(mask_layer.get());
   5560   root->AddChild(child.get());
   5561 
   5562   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   5563   host->SetRootLayer(root);
   5564 
   5565   int nonexistent_id = -1;
   5566   EXPECT_EQ(root.get(),
   5567             LayerTreeHostCommon::FindLayerInSubtree(root.get(), root->id()));
   5568   EXPECT_EQ(child.get(),
   5569             LayerTreeHostCommon::FindLayerInSubtree(root.get(), child->id()));
   5570   EXPECT_EQ(
   5571       grand_child.get(),
   5572       LayerTreeHostCommon::FindLayerInSubtree(root.get(), grand_child->id()));
   5573   EXPECT_EQ(
   5574       mask_layer.get(),
   5575       LayerTreeHostCommon::FindLayerInSubtree(root.get(), mask_layer->id()));
   5576   EXPECT_EQ(
   5577       replica_layer.get(),
   5578       LayerTreeHostCommon::FindLayerInSubtree(root.get(), replica_layer->id()));
   5579   EXPECT_EQ(
   5580       0, LayerTreeHostCommon::FindLayerInSubtree(root.get(), nonexistent_id));
   5581 }
   5582 
   5583 TEST_F(LayerTreeHostCommonTest, TransparentChildRenderSurfaceCreation) {
   5584   scoped_refptr<Layer> root = Layer::Create();
   5585   scoped_refptr<Layer> child = Layer::Create();
   5586   scoped_refptr<LayerWithForcedDrawsContent> grand_child =
   5587       make_scoped_refptr(new LayerWithForcedDrawsContent());
   5588 
   5589   const gfx::Transform identity_matrix;
   5590   SetLayerPropertiesForTesting(root.get(),
   5591                                identity_matrix,
   5592                                gfx::Point3F(),
   5593                                gfx::PointF(),
   5594                                gfx::Size(100, 100),
   5595                                true,
   5596                                false);
   5597   SetLayerPropertiesForTesting(child.get(),
   5598                                identity_matrix,
   5599                                gfx::Point3F(),
   5600                                gfx::PointF(),
   5601                                gfx::Size(10, 10),
   5602                                true,
   5603                                false);
   5604   SetLayerPropertiesForTesting(grand_child.get(),
   5605                                identity_matrix,
   5606                                gfx::Point3F(),
   5607                                gfx::PointF(),
   5608                                gfx::Size(10, 10),
   5609                                true,
   5610                                false);
   5611 
   5612   root->AddChild(child);
   5613   child->AddChild(grand_child);
   5614   child->SetOpacity(0.5f);
   5615 
   5616   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   5617   host->SetRootLayer(root);
   5618 
   5619   ExecuteCalculateDrawProperties(root.get());
   5620 
   5621   EXPECT_FALSE(child->render_surface());
   5622 }
   5623 
   5624 TEST_F(LayerTreeHostCommonTest, OpacityAnimatingOnPendingTree) {
   5625   FakeImplProxy proxy;
   5626   TestSharedBitmapManager shared_bitmap_manager;
   5627   FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager);
   5628   host_impl.CreatePendingTree();
   5629   scoped_ptr<LayerImpl> root = LayerImpl::Create(host_impl.pending_tree(), 1);
   5630 
   5631   const gfx::Transform identity_matrix;
   5632   SetLayerPropertiesForTesting(root.get(),
   5633                                identity_matrix,
   5634                                gfx::Point3F(),
   5635                                gfx::PointF(),
   5636                                gfx::Size(100, 100),
   5637                                true,
   5638                                false);
   5639   root->SetDrawsContent(true);
   5640 
   5641   scoped_ptr<LayerImpl> child = LayerImpl::Create(host_impl.pending_tree(), 2);
   5642   SetLayerPropertiesForTesting(child.get(),
   5643                                identity_matrix,
   5644                                gfx::Point3F(),
   5645                                gfx::PointF(),
   5646                                gfx::Size(50, 50),
   5647                                true,
   5648                                false);
   5649   child->SetDrawsContent(true);
   5650   child->SetOpacity(0.0f);
   5651 
   5652   // Add opacity animation.
   5653   AddOpacityTransitionToController(
   5654       child->layer_animation_controller(), 10.0, 0.0f, 1.0f, false);
   5655 
   5656   root->AddChild(child.Pass());
   5657 
   5658   LayerImplList render_surface_layer_list;
   5659   LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs(
   5660       root.get(), root->bounds(), &render_surface_layer_list);
   5661   inputs.can_adjust_raster_scales = true;
   5662   LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   5663 
   5664   // We should have one render surface and two layers. The child
   5665   // layer should be included even though it is transparent.
   5666   ASSERT_EQ(1u, render_surface_layer_list.size());
   5667   ASSERT_EQ(2u, root->render_surface()->layer_list().size());
   5668 }
   5669 
   5670 typedef std::tr1::tuple<bool, bool> LCDTextTestParam;
   5671 class LCDTextTest
   5672     : public LayerTreeHostCommonTestBase,
   5673       public testing::TestWithParam<LCDTextTestParam> {
   5674  protected:
   5675   virtual void SetUp() {
   5676     can_use_lcd_text_ = std::tr1::get<0>(GetParam());
   5677 
   5678     root_ = Layer::Create();
   5679     child_ = Layer::Create();
   5680     grand_child_ = Layer::Create();
   5681     child_->AddChild(grand_child_.get());
   5682     root_->AddChild(child_.get());
   5683 
   5684     gfx::Transform identity_matrix;
   5685     SetLayerPropertiesForTesting(root_.get(),
   5686                                  identity_matrix,
   5687                                  gfx::Point3F(),
   5688                                  gfx::PointF(),
   5689                                  gfx::Size(1, 1),
   5690                                  true,
   5691                                  false);
   5692     SetLayerPropertiesForTesting(child_.get(),
   5693                                  identity_matrix,
   5694                                  gfx::Point3F(),
   5695                                  gfx::PointF(),
   5696                                  gfx::Size(1, 1),
   5697                                  true,
   5698                                  false);
   5699     SetLayerPropertiesForTesting(grand_child_.get(),
   5700                                  identity_matrix,
   5701                                  gfx::Point3F(),
   5702                                  gfx::PointF(),
   5703                                  gfx::Size(1, 1),
   5704                                  true,
   5705                                  false);
   5706 
   5707     child_->SetForceRenderSurface(std::tr1::get<1>(GetParam()));
   5708 
   5709     host_ = CreateFakeLayerTreeHost();
   5710     host_->SetRootLayer(root_);
   5711   }
   5712 
   5713   bool can_use_lcd_text_;
   5714   scoped_ptr<FakeLayerTreeHost> host_;
   5715   scoped_refptr<Layer> root_;
   5716   scoped_refptr<Layer> child_;
   5717   scoped_refptr<Layer> grand_child_;
   5718 };
   5719 
   5720 TEST_P(LCDTextTest, CanUseLCDText) {
   5721   // Case 1: Identity transform.
   5722   gfx::Transform identity_matrix;
   5723   ExecuteCalculateDrawProperties(
   5724       root_.get(), 1.f, 1.f, NULL, can_use_lcd_text_);
   5725   EXPECT_EQ(can_use_lcd_text_, root_->can_use_lcd_text());
   5726   EXPECT_EQ(can_use_lcd_text_, child_->can_use_lcd_text());
   5727   EXPECT_EQ(can_use_lcd_text_, grand_child_->can_use_lcd_text());
   5728 
   5729   // Case 2: Integral translation.
   5730   gfx::Transform integral_translation;
   5731   integral_translation.Translate(1.0, 2.0);
   5732   child_->SetTransform(integral_translation);
   5733   ExecuteCalculateDrawProperties(
   5734       root_.get(), 1.f, 1.f, NULL, can_use_lcd_text_);
   5735   EXPECT_EQ(can_use_lcd_text_, root_->can_use_lcd_text());
   5736   EXPECT_EQ(can_use_lcd_text_, child_->can_use_lcd_text());
   5737   EXPECT_EQ(can_use_lcd_text_, grand_child_->can_use_lcd_text());
   5738 
   5739   // Case 3: Non-integral translation.
   5740   gfx::Transform non_integral_translation;
   5741   non_integral_translation.Translate(1.5, 2.5);
   5742   child_->SetTransform(non_integral_translation);
   5743   ExecuteCalculateDrawProperties(
   5744       root_.get(), 1.f, 1.f, NULL, can_use_lcd_text_);
   5745   EXPECT_EQ(can_use_lcd_text_, root_->can_use_lcd_text());
   5746   EXPECT_FALSE(child_->can_use_lcd_text());
   5747   EXPECT_FALSE(grand_child_->can_use_lcd_text());
   5748 
   5749   // Case 4: Rotation.
   5750   gfx::Transform rotation;
   5751   rotation.Rotate(10.0);
   5752   child_->SetTransform(rotation);
   5753   ExecuteCalculateDrawProperties(
   5754       root_.get(), 1.f, 1.f, NULL, can_use_lcd_text_);
   5755   EXPECT_EQ(can_use_lcd_text_, root_->can_use_lcd_text());
   5756   EXPECT_FALSE(child_->can_use_lcd_text());
   5757   EXPECT_FALSE(grand_child_->can_use_lcd_text());
   5758 
   5759   // Case 5: Scale.
   5760   gfx::Transform scale;
   5761   scale.Scale(2.0, 2.0);
   5762   child_->SetTransform(scale);
   5763   ExecuteCalculateDrawProperties(
   5764       root_.get(), 1.f, 1.f, NULL, can_use_lcd_text_);
   5765   EXPECT_EQ(can_use_lcd_text_, root_->can_use_lcd_text());
   5766   EXPECT_FALSE(child_->can_use_lcd_text());
   5767   EXPECT_FALSE(grand_child_->can_use_lcd_text());
   5768 
   5769   // Case 6: Skew.
   5770   gfx::Transform skew;
   5771   skew.SkewX(10.0);
   5772   child_->SetTransform(skew);
   5773   ExecuteCalculateDrawProperties(
   5774       root_.get(), 1.f, 1.f, NULL, can_use_lcd_text_);
   5775   EXPECT_EQ(can_use_lcd_text_, root_->can_use_lcd_text());
   5776   EXPECT_FALSE(child_->can_use_lcd_text());
   5777   EXPECT_FALSE(grand_child_->can_use_lcd_text());
   5778 
   5779   // Case 7: Translucent.
   5780   child_->SetTransform(identity_matrix);
   5781   child_->SetOpacity(0.5f);
   5782   ExecuteCalculateDrawProperties(
   5783       root_.get(), 1.f, 1.f, NULL, can_use_lcd_text_);
   5784   EXPECT_EQ(can_use_lcd_text_, root_->can_use_lcd_text());
   5785   EXPECT_FALSE(child_->can_use_lcd_text());
   5786   EXPECT_FALSE(grand_child_->can_use_lcd_text());
   5787 
   5788   // Case 8: Sanity check: restore transform and opacity.
   5789   child_->SetTransform(identity_matrix);
   5790   child_->SetOpacity(1.f);
   5791   ExecuteCalculateDrawProperties(
   5792       root_.get(), 1.f, 1.f, NULL, can_use_lcd_text_);
   5793   EXPECT_EQ(can_use_lcd_text_, root_->can_use_lcd_text());
   5794   EXPECT_EQ(can_use_lcd_text_, child_->can_use_lcd_text());
   5795   EXPECT_EQ(can_use_lcd_text_, grand_child_->can_use_lcd_text());
   5796 }
   5797 
   5798 TEST_P(LCDTextTest, CanUseLCDTextWithAnimation) {
   5799   // Sanity check: Make sure can_use_lcd_text_ is set on each node.
   5800   ExecuteCalculateDrawProperties(
   5801       root_.get(), 1.f, 1.f, NULL, can_use_lcd_text_);
   5802   EXPECT_EQ(can_use_lcd_text_, root_->can_use_lcd_text());
   5803   EXPECT_EQ(can_use_lcd_text_, child_->can_use_lcd_text());
   5804   EXPECT_EQ(can_use_lcd_text_, grand_child_->can_use_lcd_text());
   5805 
   5806   // Add opacity animation.
   5807   child_->SetOpacity(0.9f);
   5808   AddOpacityTransitionToController(
   5809       child_->layer_animation_controller(), 10.0, 0.9f, 0.1f, false);
   5810 
   5811   ExecuteCalculateDrawProperties(
   5812       root_.get(), 1.f, 1.f, NULL, can_use_lcd_text_);
   5813   // Text AA should not be adjusted while animation is active.
   5814   // Make sure LCD text AA setting remains unchanged.
   5815   EXPECT_EQ(can_use_lcd_text_, root_->can_use_lcd_text());
   5816   EXPECT_EQ(can_use_lcd_text_, child_->can_use_lcd_text());
   5817   EXPECT_EQ(can_use_lcd_text_, grand_child_->can_use_lcd_text());
   5818 }
   5819 
   5820 INSTANTIATE_TEST_CASE_P(LayerTreeHostCommonTest,
   5821                         LCDTextTest,
   5822                         testing::Combine(testing::Bool(), testing::Bool()));
   5823 
   5824 TEST_F(LayerTreeHostCommonTest, SubtreeHidden_SingleLayer) {
   5825   FakeImplProxy proxy;
   5826   TestSharedBitmapManager shared_bitmap_manager;
   5827   FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager);
   5828   host_impl.CreatePendingTree();
   5829   const gfx::Transform identity_matrix;
   5830 
   5831   scoped_refptr<Layer> root = Layer::Create();
   5832   SetLayerPropertiesForTesting(root.get(),
   5833                                identity_matrix,
   5834                                gfx::Point3F(),
   5835                                gfx::PointF(),
   5836                                gfx::Size(50, 50),
   5837                                true,
   5838                                false);
   5839   root->SetIsDrawable(true);
   5840 
   5841   scoped_refptr<Layer> child = Layer::Create();
   5842   SetLayerPropertiesForTesting(child.get(),
   5843                                identity_matrix,
   5844                                gfx::Point3F(),
   5845                                gfx::PointF(),
   5846                                gfx::Size(40, 40),
   5847                                true,
   5848                                false);
   5849   child->SetIsDrawable(true);
   5850 
   5851   scoped_refptr<Layer> grand_child = Layer::Create();
   5852   SetLayerPropertiesForTesting(grand_child.get(),
   5853                                identity_matrix,
   5854                                gfx::Point3F(),
   5855                                gfx::PointF(),
   5856                                gfx::Size(30, 30),
   5857                                true,
   5858                                false);
   5859   grand_child->SetIsDrawable(true);
   5860   grand_child->SetHideLayerAndSubtree(true);
   5861 
   5862   child->AddChild(grand_child);
   5863   root->AddChild(child);
   5864 
   5865   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   5866   host->SetRootLayer(root);
   5867 
   5868   RenderSurfaceLayerList render_surface_layer_list;
   5869   LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
   5870       root.get(), root->bounds(), &render_surface_layer_list);
   5871   inputs.can_adjust_raster_scales = true;
   5872   LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   5873 
   5874   // We should have one render surface and two layers. The grand child has
   5875   // hidden itself.
   5876   ASSERT_EQ(1u, render_surface_layer_list.size());
   5877   ASSERT_EQ(2u, root->render_surface()->layer_list().size());
   5878   EXPECT_EQ(root->id(), root->render_surface()->layer_list().at(0)->id());
   5879   EXPECT_EQ(child->id(), root->render_surface()->layer_list().at(1)->id());
   5880 }
   5881 
   5882 TEST_F(LayerTreeHostCommonTest, SubtreeHidden_SingleLayerImpl) {
   5883   FakeImplProxy proxy;
   5884   TestSharedBitmapManager shared_bitmap_manager;
   5885   FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager);
   5886   host_impl.CreatePendingTree();
   5887   const gfx::Transform identity_matrix;
   5888 
   5889   scoped_ptr<LayerImpl> root = LayerImpl::Create(host_impl.pending_tree(), 1);
   5890   SetLayerPropertiesForTesting(root.get(),
   5891                                identity_matrix,
   5892                                gfx::Point3F(),
   5893                                gfx::PointF(),
   5894                                gfx::Size(50, 50),
   5895                                true,
   5896                                false);
   5897   root->SetDrawsContent(true);
   5898 
   5899   scoped_ptr<LayerImpl> child = LayerImpl::Create(host_impl.pending_tree(), 2);
   5900   SetLayerPropertiesForTesting(child.get(),
   5901                                identity_matrix,
   5902                                gfx::Point3F(),
   5903                                gfx::PointF(),
   5904                                gfx::Size(40, 40),
   5905                                true,
   5906                                false);
   5907   child->SetDrawsContent(true);
   5908 
   5909   scoped_ptr<LayerImpl> grand_child =
   5910       LayerImpl::Create(host_impl.pending_tree(), 3);
   5911   SetLayerPropertiesForTesting(grand_child.get(),
   5912                                identity_matrix,
   5913                                gfx::Point3F(),
   5914                                gfx::PointF(),
   5915                                gfx::Size(30, 30),
   5916                                true,
   5917                                false);
   5918   grand_child->SetDrawsContent(true);
   5919   grand_child->SetHideLayerAndSubtree(true);
   5920 
   5921   child->AddChild(grand_child.Pass());
   5922   root->AddChild(child.Pass());
   5923 
   5924   LayerImplList render_surface_layer_list;
   5925   LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs(
   5926       root.get(), root->bounds(), &render_surface_layer_list);
   5927   inputs.can_adjust_raster_scales = true;
   5928   LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   5929 
   5930   // We should have one render surface and two layers. The grand child has
   5931   // hidden itself.
   5932   ASSERT_EQ(1u, render_surface_layer_list.size());
   5933   ASSERT_EQ(2u, root->render_surface()->layer_list().size());
   5934   EXPECT_EQ(1, root->render_surface()->layer_list().at(0)->id());
   5935   EXPECT_EQ(2, root->render_surface()->layer_list().at(1)->id());
   5936 }
   5937 
   5938 TEST_F(LayerTreeHostCommonTest, SubtreeHidden_TwoLayers) {
   5939   FakeImplProxy proxy;
   5940   TestSharedBitmapManager shared_bitmap_manager;
   5941   FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager);
   5942   host_impl.CreatePendingTree();
   5943   const gfx::Transform identity_matrix;
   5944 
   5945   scoped_refptr<Layer> root = Layer::Create();
   5946   SetLayerPropertiesForTesting(root.get(),
   5947                                identity_matrix,
   5948                                gfx::Point3F(),
   5949                                gfx::PointF(),
   5950                                gfx::Size(50, 50),
   5951                                true,
   5952                                false);
   5953   root->SetIsDrawable(true);
   5954 
   5955   scoped_refptr<Layer> child = Layer::Create();
   5956   SetLayerPropertiesForTesting(child.get(),
   5957                                identity_matrix,
   5958                                gfx::Point3F(),
   5959                                gfx::PointF(),
   5960                                gfx::Size(40, 40),
   5961                                true,
   5962                                false);
   5963   child->SetIsDrawable(true);
   5964   child->SetHideLayerAndSubtree(true);
   5965 
   5966   scoped_refptr<Layer> grand_child = Layer::Create();
   5967   SetLayerPropertiesForTesting(grand_child.get(),
   5968                                identity_matrix,
   5969                                gfx::Point3F(),
   5970                                gfx::PointF(),
   5971                                gfx::Size(30, 30),
   5972                                true,
   5973                                false);
   5974   grand_child->SetIsDrawable(true);
   5975 
   5976   child->AddChild(grand_child);
   5977   root->AddChild(child);
   5978 
   5979   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   5980   host->SetRootLayer(root);
   5981 
   5982   RenderSurfaceLayerList render_surface_layer_list;
   5983   LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
   5984       root.get(), root->bounds(), &render_surface_layer_list);
   5985   inputs.can_adjust_raster_scales = true;
   5986   LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   5987 
   5988   // We should have one render surface and one layers. The child has
   5989   // hidden itself and the grand child.
   5990   ASSERT_EQ(1u, render_surface_layer_list.size());
   5991   ASSERT_EQ(1u, root->render_surface()->layer_list().size());
   5992   EXPECT_EQ(root->id(), root->render_surface()->layer_list().at(0)->id());
   5993 }
   5994 
   5995 TEST_F(LayerTreeHostCommonTest, SubtreeHidden_TwoLayersImpl) {
   5996   FakeImplProxy proxy;
   5997   TestSharedBitmapManager shared_bitmap_manager;
   5998   FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager);
   5999   host_impl.CreatePendingTree();
   6000   const gfx::Transform identity_matrix;
   6001 
   6002   scoped_ptr<LayerImpl> root = LayerImpl::Create(host_impl.pending_tree(), 1);
   6003   SetLayerPropertiesForTesting(root.get(),
   6004                                identity_matrix,
   6005                                gfx::Point3F(),
   6006                                gfx::PointF(),
   6007                                gfx::Size(50, 50),
   6008                                true,
   6009                                false);
   6010   root->SetDrawsContent(true);
   6011 
   6012   scoped_ptr<LayerImpl> child = LayerImpl::Create(host_impl.pending_tree(), 2);
   6013   SetLayerPropertiesForTesting(child.get(),
   6014                                identity_matrix,
   6015                                gfx::Point3F(),
   6016                                gfx::PointF(),
   6017                                gfx::Size(40, 40),
   6018                                true,
   6019                                false);
   6020   child->SetDrawsContent(true);
   6021   child->SetHideLayerAndSubtree(true);
   6022 
   6023   scoped_ptr<LayerImpl> grand_child =
   6024       LayerImpl::Create(host_impl.pending_tree(), 3);
   6025   SetLayerPropertiesForTesting(grand_child.get(),
   6026                                identity_matrix,
   6027                                gfx::Point3F(),
   6028                                gfx::PointF(),
   6029                                gfx::Size(30, 30),
   6030                                true,
   6031                                false);
   6032   grand_child->SetDrawsContent(true);
   6033 
   6034   child->AddChild(grand_child.Pass());
   6035   root->AddChild(child.Pass());
   6036 
   6037   LayerImplList render_surface_layer_list;
   6038   LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs(
   6039       root.get(), root->bounds(), &render_surface_layer_list);
   6040   inputs.can_adjust_raster_scales = true;
   6041   LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   6042 
   6043   // We should have one render surface and one layers. The child has
   6044   // hidden itself and the grand child.
   6045   ASSERT_EQ(1u, render_surface_layer_list.size());
   6046   ASSERT_EQ(1u, root->render_surface()->layer_list().size());
   6047   EXPECT_EQ(1, root->render_surface()->layer_list().at(0)->id());
   6048 }
   6049 
   6050 void EmptyCopyOutputCallback(scoped_ptr<CopyOutputResult> result) {}
   6051 
   6052 TEST_F(LayerTreeHostCommonTest, SubtreeHiddenWithCopyRequest) {
   6053   FakeImplProxy proxy;
   6054   TestSharedBitmapManager shared_bitmap_manager;
   6055   FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager);
   6056   host_impl.CreatePendingTree();
   6057   const gfx::Transform identity_matrix;
   6058 
   6059   scoped_refptr<Layer> root = Layer::Create();
   6060   SetLayerPropertiesForTesting(root.get(),
   6061                                identity_matrix,
   6062                                gfx::Point3F(),
   6063                                gfx::PointF(),
   6064                                gfx::Size(50, 50),
   6065                                true,
   6066                                false);
   6067   root->SetIsDrawable(true);
   6068 
   6069   scoped_refptr<Layer> copy_grand_parent = Layer::Create();
   6070   SetLayerPropertiesForTesting(copy_grand_parent.get(),
   6071                                identity_matrix,
   6072                                gfx::Point3F(),
   6073                                gfx::PointF(),
   6074                                gfx::Size(40, 40),
   6075                                true,
   6076                                false);
   6077   copy_grand_parent->SetIsDrawable(true);
   6078 
   6079   scoped_refptr<Layer> copy_parent = Layer::Create();
   6080   SetLayerPropertiesForTesting(copy_parent.get(),
   6081                                identity_matrix,
   6082                                gfx::Point3F(),
   6083                                gfx::PointF(),
   6084                                gfx::Size(30, 30),
   6085                                true,
   6086                                false);
   6087   copy_parent->SetIsDrawable(true);
   6088   copy_parent->SetForceRenderSurface(true);
   6089 
   6090   scoped_refptr<Layer> copy_layer = Layer::Create();
   6091   SetLayerPropertiesForTesting(copy_layer.get(),
   6092                                identity_matrix,
   6093                                gfx::Point3F(),
   6094                                gfx::PointF(),
   6095                                gfx::Size(20, 20),
   6096                                true,
   6097                                false);
   6098   copy_layer->SetIsDrawable(true);
   6099 
   6100   scoped_refptr<Layer> copy_child = Layer::Create();
   6101   SetLayerPropertiesForTesting(copy_child.get(),
   6102                                identity_matrix,
   6103                                gfx::Point3F(),
   6104                                gfx::PointF(),
   6105                                gfx::Size(20, 20),
   6106                                true,
   6107                                false);
   6108   copy_child->SetIsDrawable(true);
   6109 
   6110   scoped_refptr<Layer> copy_grand_parent_sibling_before = Layer::Create();
   6111   SetLayerPropertiesForTesting(copy_grand_parent_sibling_before.get(),
   6112                                identity_matrix,
   6113                                gfx::Point3F(),
   6114                                gfx::PointF(),
   6115                                gfx::Size(40, 40),
   6116                                true,
   6117                                false);
   6118   copy_grand_parent_sibling_before->SetIsDrawable(true);
   6119 
   6120   scoped_refptr<Layer> copy_grand_parent_sibling_after = Layer::Create();
   6121   SetLayerPropertiesForTesting(copy_grand_parent_sibling_after.get(),
   6122                                identity_matrix,
   6123                                gfx::Point3F(),
   6124                                gfx::PointF(),
   6125                                gfx::Size(40, 40),
   6126                                true,
   6127                                false);
   6128   copy_grand_parent_sibling_after->SetIsDrawable(true);
   6129 
   6130   copy_layer->AddChild(copy_child);
   6131   copy_parent->AddChild(copy_layer);
   6132   copy_grand_parent->AddChild(copy_parent);
   6133   root->AddChild(copy_grand_parent_sibling_before);
   6134   root->AddChild(copy_grand_parent);
   6135   root->AddChild(copy_grand_parent_sibling_after);
   6136 
   6137   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   6138   host->SetRootLayer(root);
   6139 
   6140   // Hide the copy_grand_parent and its subtree. But make a copy request in that
   6141   // hidden subtree on copy_layer.
   6142   copy_grand_parent->SetHideLayerAndSubtree(true);
   6143   copy_grand_parent_sibling_before->SetHideLayerAndSubtree(true);
   6144   copy_grand_parent_sibling_after->SetHideLayerAndSubtree(true);
   6145   copy_layer->RequestCopyOfOutput(CopyOutputRequest::CreateRequest(
   6146       base::Bind(&EmptyCopyOutputCallback)));
   6147   EXPECT_TRUE(copy_layer->HasCopyRequest());
   6148 
   6149   RenderSurfaceLayerList render_surface_layer_list;
   6150   LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
   6151       root.get(), root->bounds(), &render_surface_layer_list);
   6152   inputs.can_adjust_raster_scales = true;
   6153   LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   6154 
   6155   EXPECT_TRUE(root->draw_properties().layer_or_descendant_has_copy_request);
   6156   EXPECT_TRUE(copy_grand_parent->draw_properties().
   6157               layer_or_descendant_has_copy_request);
   6158   EXPECT_TRUE(copy_parent->draw_properties().
   6159               layer_or_descendant_has_copy_request);
   6160   EXPECT_TRUE(copy_layer->draw_properties().
   6161               layer_or_descendant_has_copy_request);
   6162   EXPECT_FALSE(copy_child->draw_properties().
   6163                layer_or_descendant_has_copy_request);
   6164   EXPECT_FALSE(copy_grand_parent_sibling_before->draw_properties().
   6165                layer_or_descendant_has_copy_request);
   6166   EXPECT_FALSE(copy_grand_parent_sibling_after->draw_properties().
   6167                layer_or_descendant_has_copy_request);
   6168 
   6169   // We should have three render surfaces, one for the root, one for the parent
   6170   // since it owns a surface, and one for the copy_layer.
   6171   ASSERT_EQ(3u, render_surface_layer_list.size());
   6172   EXPECT_EQ(root->id(), render_surface_layer_list.at(0)->id());
   6173   EXPECT_EQ(copy_parent->id(), render_surface_layer_list.at(1)->id());
   6174   EXPECT_EQ(copy_layer->id(), render_surface_layer_list.at(2)->id());
   6175 
   6176   // The root render surface should have 2 contributing layers. The
   6177   // copy_grand_parent is hidden along with its siblings, but the copy_parent
   6178   // will appear since something in its subtree needs to be drawn for a copy
   6179   // request.
   6180   ASSERT_EQ(2u, root->render_surface()->layer_list().size());
   6181   EXPECT_EQ(root->id(), root->render_surface()->layer_list().at(0)->id());
   6182   EXPECT_EQ(copy_parent->id(),
   6183             root->render_surface()->layer_list().at(1)->id());
   6184 
   6185   // Nothing actually draws into the copy parent, so only the copy_layer will
   6186   // appear in its list, since it needs to be drawn for the copy request.
   6187   ASSERT_EQ(1u, copy_parent->render_surface()->layer_list().size());
   6188   EXPECT_EQ(copy_layer->id(),
   6189             copy_parent->render_surface()->layer_list().at(0)->id());
   6190 
   6191   // The copy_layer's render surface should have two contributing layers.
   6192   ASSERT_EQ(2u, copy_layer->render_surface()->layer_list().size());
   6193   EXPECT_EQ(copy_layer->id(),
   6194             copy_layer->render_surface()->layer_list().at(0)->id());
   6195   EXPECT_EQ(copy_child->id(),
   6196             copy_layer->render_surface()->layer_list().at(1)->id());
   6197 }
   6198 
   6199 TEST_F(LayerTreeHostCommonTest, ClippedOutCopyRequest) {
   6200   FakeImplProxy proxy;
   6201   TestSharedBitmapManager shared_bitmap_manager;
   6202   FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager);
   6203   host_impl.CreatePendingTree();
   6204   const gfx::Transform identity_matrix;
   6205 
   6206   scoped_refptr<Layer> root = Layer::Create();
   6207   SetLayerPropertiesForTesting(root.get(),
   6208                                identity_matrix,
   6209                                gfx::Point3F(),
   6210                                gfx::PointF(),
   6211                                gfx::Size(50, 50),
   6212                                true,
   6213                                false);
   6214   root->SetIsDrawable(true);
   6215 
   6216   scoped_refptr<Layer> copy_parent = Layer::Create();
   6217   SetLayerPropertiesForTesting(copy_parent.get(),
   6218                                identity_matrix,
   6219                                gfx::Point3F(),
   6220                                gfx::PointF(),
   6221                                gfx::Size(),
   6222                                true,
   6223                                false);
   6224   copy_parent->SetIsDrawable(true);
   6225   copy_parent->SetMasksToBounds(true);
   6226 
   6227   scoped_refptr<Layer> copy_layer = Layer::Create();
   6228   SetLayerPropertiesForTesting(copy_layer.get(),
   6229                                identity_matrix,
   6230                                gfx::Point3F(),
   6231                                gfx::PointF(),
   6232                                gfx::Size(30, 30),
   6233                                true,
   6234                                false);
   6235   copy_layer->SetIsDrawable(true);
   6236 
   6237   scoped_refptr<Layer> copy_child = Layer::Create();
   6238   SetLayerPropertiesForTesting(copy_child.get(),
   6239                                identity_matrix,
   6240                                gfx::Point3F(),
   6241                                gfx::PointF(),
   6242                                gfx::Size(20, 20),
   6243                                true,
   6244                                false);
   6245   copy_child->SetIsDrawable(true);
   6246 
   6247   copy_layer->AddChild(copy_child);
   6248   copy_parent->AddChild(copy_layer);
   6249   root->AddChild(copy_parent);
   6250 
   6251   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   6252   host->SetRootLayer(root);
   6253 
   6254   copy_layer->RequestCopyOfOutput(CopyOutputRequest::CreateRequest(
   6255       base::Bind(&EmptyCopyOutputCallback)));
   6256   EXPECT_TRUE(copy_layer->HasCopyRequest());
   6257 
   6258   RenderSurfaceLayerList render_surface_layer_list;
   6259   LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
   6260       root.get(), root->bounds(), &render_surface_layer_list);
   6261   inputs.can_adjust_raster_scales = true;
   6262   LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   6263 
   6264   // We should have one render surface, as the others are clipped out.
   6265   ASSERT_EQ(1u, render_surface_layer_list.size());
   6266   EXPECT_EQ(root->id(), render_surface_layer_list.at(0)->id());
   6267 
   6268   // The root render surface should only have 1 contributing layer, since the
   6269   // other layers are empty/clipped away.
   6270   ASSERT_EQ(1u, root->render_surface()->layer_list().size());
   6271   EXPECT_EQ(root->id(), root->render_surface()->layer_list().at(0)->id());
   6272 }
   6273 
   6274 TEST_F(LayerTreeHostCommonTest, VisibleContentRectInsideSurface) {
   6275   FakeImplProxy proxy;
   6276   TestSharedBitmapManager shared_bitmap_manager;
   6277   FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager);
   6278   host_impl.CreatePendingTree();
   6279   const gfx::Transform identity_matrix;
   6280 
   6281   scoped_refptr<Layer> root = Layer::Create();
   6282   SetLayerPropertiesForTesting(root.get(),
   6283                                identity_matrix,
   6284                                gfx::Point3F(),
   6285                                gfx::PointF(),
   6286                                gfx::Size(50, 50),
   6287                                true,
   6288                                false);
   6289   root->SetIsDrawable(true);
   6290 
   6291   // The surface is moved slightly outside of the viewport.
   6292   scoped_refptr<Layer> surface = Layer::Create();
   6293   SetLayerPropertiesForTesting(surface.get(),
   6294                                identity_matrix,
   6295                                gfx::Point3F(),
   6296                                gfx::PointF(-10, -20),
   6297                                gfx::Size(),
   6298                                true,
   6299                                false);
   6300   surface->SetForceRenderSurface(true);
   6301 
   6302   scoped_refptr<Layer> surface_child = Layer::Create();
   6303   SetLayerPropertiesForTesting(surface_child.get(),
   6304                                identity_matrix,
   6305                                gfx::Point3F(),
   6306                                gfx::PointF(),
   6307                                gfx::Size(50, 50),
   6308                                true,
   6309                                false);
   6310   surface_child->SetIsDrawable(true);
   6311 
   6312   surface->AddChild(surface_child);
   6313   root->AddChild(surface);
   6314 
   6315   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   6316   host->SetRootLayer(root);
   6317 
   6318   RenderSurfaceLayerList render_surface_layer_list;
   6319   LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
   6320       root.get(), root->bounds(), &render_surface_layer_list);
   6321   inputs.can_adjust_raster_scales = true;
   6322   LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   6323 
   6324   // The visible_content_rect for the |surface_child| should not be clipped by
   6325   // the viewport.
   6326   EXPECT_EQ(gfx::Rect(50, 50).ToString(),
   6327             surface_child->visible_content_rect().ToString());
   6328 }
   6329 
   6330 TEST_F(LayerTreeHostCommonTest, TransformedClipParent) {
   6331   // Ensure that a transform between the layer and its render surface is not a
   6332   // problem. Constructs the following layer tree.
   6333   //
   6334   //   root (a render surface)
   6335   //     + render_surface
   6336   //       + clip_parent (scaled)
   6337   //         + intervening_clipping_layer
   6338   //           + clip_child
   6339   //
   6340   // The render surface should be resized correctly and the clip child should
   6341   // inherit the right clip rect.
   6342   scoped_refptr<Layer> root = Layer::Create();
   6343   scoped_refptr<Layer> render_surface = Layer::Create();
   6344   scoped_refptr<Layer> clip_parent = Layer::Create();
   6345   scoped_refptr<Layer> intervening = Layer::Create();
   6346   scoped_refptr<LayerWithForcedDrawsContent> clip_child =
   6347       make_scoped_refptr(new LayerWithForcedDrawsContent);
   6348 
   6349   root->AddChild(render_surface);
   6350   render_surface->AddChild(clip_parent);
   6351   clip_parent->AddChild(intervening);
   6352   intervening->AddChild(clip_child);
   6353 
   6354   clip_child->SetClipParent(clip_parent.get());
   6355 
   6356   intervening->SetMasksToBounds(true);
   6357   clip_parent->SetMasksToBounds(true);
   6358 
   6359   render_surface->SetForceRenderSurface(true);
   6360 
   6361   gfx::Transform scale_transform;
   6362   scale_transform.Scale(2, 2);
   6363 
   6364   gfx::Transform identity_transform;
   6365 
   6366   SetLayerPropertiesForTesting(root.get(),
   6367                                identity_transform,
   6368                                gfx::Point3F(),
   6369                                gfx::PointF(),
   6370                                gfx::Size(50, 50),
   6371                                true,
   6372                                false);
   6373   SetLayerPropertiesForTesting(render_surface.get(),
   6374                                identity_transform,
   6375                                gfx::Point3F(),
   6376                                gfx::PointF(),
   6377                                gfx::Size(10, 10),
   6378                                true,
   6379                                false);
   6380   SetLayerPropertiesForTesting(clip_parent.get(),
   6381                                scale_transform,
   6382                                gfx::Point3F(),
   6383                                gfx::PointF(1.f, 1.f),
   6384                                gfx::Size(10, 10),
   6385                                true,
   6386                                false);
   6387   SetLayerPropertiesForTesting(intervening.get(),
   6388                                identity_transform,
   6389                                gfx::Point3F(),
   6390                                gfx::PointF(1.f, 1.f),
   6391                                gfx::Size(5, 5),
   6392                                true,
   6393                                false);
   6394   SetLayerPropertiesForTesting(clip_child.get(),
   6395                                identity_transform,
   6396                                gfx::Point3F(),
   6397                                gfx::PointF(1.f, 1.f),
   6398                                gfx::Size(10, 10),
   6399                                true,
   6400                                false);
   6401 
   6402   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   6403   host->SetRootLayer(root);
   6404 
   6405   ExecuteCalculateDrawProperties(root.get());
   6406 
   6407   ASSERT_TRUE(root->render_surface());
   6408   ASSERT_TRUE(render_surface->render_surface());
   6409 
   6410   // Ensure that we've inherited our clip parent's clip and weren't affected
   6411   // by the intervening clip layer.
   6412   ASSERT_EQ(gfx::Rect(1, 1, 20, 20).ToString(),
   6413             clip_parent->clip_rect().ToString());
   6414   ASSERT_EQ(clip_parent->clip_rect().ToString(),
   6415             clip_child->clip_rect().ToString());
   6416   ASSERT_EQ(gfx::Rect(3, 3, 10, 10).ToString(),
   6417             intervening->clip_rect().ToString());
   6418 
   6419   // Ensure that the render surface reports a content rect that has been grown
   6420   // to accomodate for the clip child.
   6421   ASSERT_EQ(gfx::Rect(5, 5, 16, 16).ToString(),
   6422             render_surface->render_surface()->content_rect().ToString());
   6423 
   6424   // The above check implies the two below, but they nicely demonstrate that
   6425   // we've grown, despite the intervening layer's clip.
   6426   ASSERT_TRUE(clip_parent->clip_rect().Contains(
   6427       render_surface->render_surface()->content_rect()));
   6428   ASSERT_FALSE(intervening->clip_rect().Contains(
   6429       render_surface->render_surface()->content_rect()));
   6430 }
   6431 
   6432 TEST_F(LayerTreeHostCommonTest, ClipParentWithInterveningRenderSurface) {
   6433   // Ensure that intervening render surfaces are not a problem in the basic
   6434   // case. In the following tree, both render surfaces should be resized to
   6435   // accomodate for the clip child, despite an intervening clip.
   6436   //
   6437   //   root (a render surface)
   6438   //    + clip_parent (masks to bounds)
   6439   //      + render_surface1 (sets opacity)
   6440   //        + intervening (masks to bounds)
   6441   //          + render_surface2 (also sets opacity)
   6442   //            + clip_child
   6443   //
   6444   scoped_refptr<Layer> root = Layer::Create();
   6445   scoped_refptr<Layer> clip_parent = Layer::Create();
   6446   scoped_refptr<Layer> render_surface1 = Layer::Create();
   6447   scoped_refptr<Layer> intervening = Layer::Create();
   6448   scoped_refptr<Layer> render_surface2 = Layer::Create();
   6449   scoped_refptr<LayerWithForcedDrawsContent> clip_child =
   6450       make_scoped_refptr(new LayerWithForcedDrawsContent);
   6451 
   6452   root->AddChild(clip_parent);
   6453   clip_parent->AddChild(render_surface1);
   6454   render_surface1->AddChild(intervening);
   6455   intervening->AddChild(render_surface2);
   6456   render_surface2->AddChild(clip_child);
   6457 
   6458   clip_child->SetClipParent(clip_parent.get());
   6459 
   6460   intervening->SetMasksToBounds(true);
   6461   clip_parent->SetMasksToBounds(true);
   6462 
   6463   render_surface1->SetForceRenderSurface(true);
   6464   render_surface2->SetForceRenderSurface(true);
   6465 
   6466   gfx::Transform translation_transform;
   6467   translation_transform.Translate(2, 2);
   6468 
   6469   gfx::Transform identity_transform;
   6470   SetLayerPropertiesForTesting(root.get(),
   6471                                identity_transform,
   6472                                gfx::Point3F(),
   6473                                gfx::PointF(),
   6474                                gfx::Size(50, 50),
   6475                                true,
   6476                                false);
   6477   SetLayerPropertiesForTesting(clip_parent.get(),
   6478                                translation_transform,
   6479                                gfx::Point3F(),
   6480                                gfx::PointF(1.f, 1.f),
   6481                                gfx::Size(40, 40),
   6482                                true,
   6483                                false);
   6484   SetLayerPropertiesForTesting(render_surface1.get(),
   6485                                identity_transform,
   6486                                gfx::Point3F(),
   6487                                gfx::PointF(),
   6488                                gfx::Size(10, 10),
   6489                                true,
   6490                                false);
   6491   SetLayerPropertiesForTesting(intervening.get(),
   6492                                identity_transform,
   6493                                gfx::Point3F(),
   6494                                gfx::PointF(1.f, 1.f),
   6495                                gfx::Size(5, 5),
   6496                                true,
   6497                                false);
   6498   SetLayerPropertiesForTesting(render_surface2.get(),
   6499                                identity_transform,
   6500                                gfx::Point3F(),
   6501                                gfx::PointF(),
   6502                                gfx::Size(10, 10),
   6503                                true,
   6504                                false);
   6505   SetLayerPropertiesForTesting(clip_child.get(),
   6506                                identity_transform,
   6507                                gfx::Point3F(),
   6508                                gfx::PointF(-10.f, -10.f),
   6509                                gfx::Size(60, 60),
   6510                                true,
   6511                                false);
   6512 
   6513   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   6514   host->SetRootLayer(root);
   6515 
   6516   ExecuteCalculateDrawProperties(root.get());
   6517 
   6518   EXPECT_TRUE(root->render_surface());
   6519   EXPECT_TRUE(render_surface1->render_surface());
   6520   EXPECT_TRUE(render_surface2->render_surface());
   6521 
   6522   // Since the render surfaces could have expanded, they should not clip (their
   6523   // bounds would no longer be reliable). We should resort to layer clipping
   6524   // in this case.
   6525   EXPECT_EQ(gfx::Rect(0, 0, 0, 0).ToString(),
   6526             render_surface1->render_surface()->clip_rect().ToString());
   6527   EXPECT_FALSE(render_surface1->render_surface()->is_clipped());
   6528   EXPECT_EQ(gfx::Rect(0, 0, 0, 0).ToString(),
   6529             render_surface2->render_surface()->clip_rect().ToString());
   6530   EXPECT_FALSE(render_surface2->render_surface()->is_clipped());
   6531 
   6532   // NB: clip rects are in target space.
   6533   EXPECT_EQ(gfx::Rect(0, 0, 40, 40).ToString(),
   6534             render_surface1->clip_rect().ToString());
   6535   EXPECT_TRUE(render_surface1->is_clipped());
   6536 
   6537   // This value is inherited from the clipping ancestor layer, 'intervening'.
   6538   EXPECT_EQ(gfx::Rect(0, 0, 5, 5).ToString(),
   6539             render_surface2->clip_rect().ToString());
   6540   EXPECT_TRUE(render_surface2->is_clipped());
   6541 
   6542   // The content rects of both render surfaces should both have expanded to
   6543   // contain the clip child.
   6544   EXPECT_EQ(gfx::Rect(0, 0, 40, 40).ToString(),
   6545             render_surface1->render_surface()->content_rect().ToString());
   6546   EXPECT_EQ(gfx::Rect(-1, -1, 40, 40).ToString(),
   6547             render_surface2->render_surface()->content_rect().ToString());
   6548 
   6549   // The clip child should have inherited the clip parent's clip (projected to
   6550   // the right space, of course), and should have the correctly sized visible
   6551   // content rect.
   6552   EXPECT_EQ(gfx::Rect(-1, -1, 40, 40).ToString(),
   6553             clip_child->clip_rect().ToString());
   6554   EXPECT_EQ(gfx::Rect(9, 9, 40, 40).ToString(),
   6555             clip_child->visible_content_rect().ToString());
   6556   EXPECT_TRUE(clip_child->is_clipped());
   6557 }
   6558 
   6559 TEST_F(LayerTreeHostCommonTest, ClipParentScrolledInterveningLayer) {
   6560   // Ensure that intervening render surfaces are not a problem, even if there
   6561   // is a scroll involved. Note, we do _not_ have to consider any other sort
   6562   // of transform.
   6563   //
   6564   //   root (a render surface)
   6565   //    + clip_parent (masks to bounds)
   6566   //      + render_surface1 (sets opacity)
   6567   //        + intervening (masks to bounds AND scrolls)
   6568   //          + render_surface2 (also sets opacity)
   6569   //            + clip_child
   6570   //
   6571   scoped_refptr<Layer> root = Layer::Create();
   6572   scoped_refptr<Layer> clip_parent = Layer::Create();
   6573   scoped_refptr<Layer> render_surface1 = Layer::Create();
   6574   scoped_refptr<Layer> intervening = Layer::Create();
   6575   scoped_refptr<Layer> render_surface2 = Layer::Create();
   6576   scoped_refptr<LayerWithForcedDrawsContent> clip_child =
   6577       make_scoped_refptr(new LayerWithForcedDrawsContent);
   6578 
   6579   root->AddChild(clip_parent);
   6580   clip_parent->AddChild(render_surface1);
   6581   render_surface1->AddChild(intervening);
   6582   intervening->AddChild(render_surface2);
   6583   render_surface2->AddChild(clip_child);
   6584 
   6585   clip_child->SetClipParent(clip_parent.get());
   6586 
   6587   intervening->SetMasksToBounds(true);
   6588   clip_parent->SetMasksToBounds(true);
   6589   intervening->SetScrollClipLayerId(clip_parent->id());
   6590   intervening->SetScrollOffset(gfx::Vector2d(3, 3));
   6591 
   6592   render_surface1->SetForceRenderSurface(true);
   6593   render_surface2->SetForceRenderSurface(true);
   6594 
   6595   gfx::Transform translation_transform;
   6596   translation_transform.Translate(2, 2);
   6597 
   6598   gfx::Transform identity_transform;
   6599   SetLayerPropertiesForTesting(root.get(),
   6600                                identity_transform,
   6601                                gfx::Point3F(),
   6602                                gfx::PointF(),
   6603                                gfx::Size(50, 50),
   6604                                true,
   6605                                false);
   6606   SetLayerPropertiesForTesting(clip_parent.get(),
   6607                                translation_transform,
   6608                                gfx::Point3F(),
   6609                                gfx::PointF(1.f, 1.f),
   6610                                gfx::Size(40, 40),
   6611                                true,
   6612                                false);
   6613   SetLayerPropertiesForTesting(render_surface1.get(),
   6614                                identity_transform,
   6615                                gfx::Point3F(),
   6616                                gfx::PointF(),
   6617                                gfx::Size(10, 10),
   6618                                true,
   6619                                false);
   6620   SetLayerPropertiesForTesting(intervening.get(),
   6621                                identity_transform,
   6622                                gfx::Point3F(),
   6623                                gfx::PointF(1.f, 1.f),
   6624                                gfx::Size(5, 5),
   6625                                true,
   6626                                false);
   6627   SetLayerPropertiesForTesting(render_surface2.get(),
   6628                                identity_transform,
   6629                                gfx::Point3F(),
   6630                                gfx::PointF(),
   6631                                gfx::Size(10, 10),
   6632                                true,
   6633                                false);
   6634   SetLayerPropertiesForTesting(clip_child.get(),
   6635                                identity_transform,
   6636                                gfx::Point3F(),
   6637                                gfx::PointF(-10.f, -10.f),
   6638                                gfx::Size(60, 60),
   6639                                true,
   6640                                false);
   6641 
   6642   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   6643   host->SetRootLayer(root);
   6644 
   6645   ExecuteCalculateDrawProperties(root.get());
   6646 
   6647   EXPECT_TRUE(root->render_surface());
   6648   EXPECT_TRUE(render_surface1->render_surface());
   6649   EXPECT_TRUE(render_surface2->render_surface());
   6650 
   6651   // Since the render surfaces could have expanded, they should not clip (their
   6652   // bounds would no longer be reliable). We should resort to layer clipping
   6653   // in this case.
   6654   EXPECT_EQ(gfx::Rect(0, 0, 0, 0).ToString(),
   6655             render_surface1->render_surface()->clip_rect().ToString());
   6656   EXPECT_FALSE(render_surface1->render_surface()->is_clipped());
   6657   EXPECT_EQ(gfx::Rect(0, 0, 0, 0).ToString(),
   6658             render_surface2->render_surface()->clip_rect().ToString());
   6659   EXPECT_FALSE(render_surface2->render_surface()->is_clipped());
   6660 
   6661   // NB: clip rects are in target space.
   6662   EXPECT_EQ(gfx::Rect(0, 0, 40, 40).ToString(),
   6663             render_surface1->clip_rect().ToString());
   6664   EXPECT_TRUE(render_surface1->is_clipped());
   6665 
   6666   // This value is inherited from the clipping ancestor layer, 'intervening'.
   6667   EXPECT_EQ(gfx::Rect(2, 2, 3, 3).ToString(),
   6668             render_surface2->clip_rect().ToString());
   6669   EXPECT_TRUE(render_surface2->is_clipped());
   6670 
   6671   // The content rects of both render surfaces should both have expanded to
   6672   // contain the clip child.
   6673   EXPECT_EQ(gfx::Rect(0, 0, 40, 40).ToString(),
   6674             render_surface1->render_surface()->content_rect().ToString());
   6675   EXPECT_EQ(gfx::Rect(2, 2, 40, 40).ToString(),
   6676             render_surface2->render_surface()->content_rect().ToString());
   6677 
   6678   // The clip child should have inherited the clip parent's clip (projected to
   6679   // the right space, of course), and should have the correctly sized visible
   6680   // content rect.
   6681   EXPECT_EQ(gfx::Rect(2, 2, 40, 40).ToString(),
   6682             clip_child->clip_rect().ToString());
   6683   EXPECT_EQ(gfx::Rect(12, 12, 40, 40).ToString(),
   6684             clip_child->visible_content_rect().ToString());
   6685   EXPECT_TRUE(clip_child->is_clipped());
   6686 }
   6687 
   6688 TEST_F(LayerTreeHostCommonTest, DescendantsOfClipChildren) {
   6689   // Ensures that descendants of the clip child inherit the correct clip.
   6690   //
   6691   //   root (a render surface)
   6692   //    + clip_parent (masks to bounds)
   6693   //      + intervening (masks to bounds)
   6694   //        + clip_child
   6695   //          + child
   6696   //
   6697   scoped_refptr<Layer> root = Layer::Create();
   6698   scoped_refptr<Layer> clip_parent = Layer::Create();
   6699   scoped_refptr<Layer> intervening = Layer::Create();
   6700   scoped_refptr<Layer> clip_child = Layer::Create();
   6701   scoped_refptr<LayerWithForcedDrawsContent> child =
   6702       make_scoped_refptr(new LayerWithForcedDrawsContent);
   6703 
   6704   root->AddChild(clip_parent);
   6705   clip_parent->AddChild(intervening);
   6706   intervening->AddChild(clip_child);
   6707   clip_child->AddChild(child);
   6708 
   6709   clip_child->SetClipParent(clip_parent.get());
   6710 
   6711   intervening->SetMasksToBounds(true);
   6712   clip_parent->SetMasksToBounds(true);
   6713 
   6714   gfx::Transform identity_transform;
   6715   SetLayerPropertiesForTesting(root.get(),
   6716                                identity_transform,
   6717                                gfx::Point3F(),
   6718                                gfx::PointF(),
   6719                                gfx::Size(50, 50),
   6720                                true,
   6721                                false);
   6722   SetLayerPropertiesForTesting(clip_parent.get(),
   6723                                identity_transform,
   6724                                gfx::Point3F(),
   6725                                gfx::PointF(),
   6726                                gfx::Size(40, 40),
   6727                                true,
   6728                                false);
   6729   SetLayerPropertiesForTesting(intervening.get(),
   6730                                identity_transform,
   6731                                gfx::Point3F(),
   6732                                gfx::PointF(),
   6733                                gfx::Size(5, 5),
   6734                                true,
   6735                                false);
   6736   SetLayerPropertiesForTesting(clip_child.get(),
   6737                                identity_transform,
   6738                                gfx::Point3F(),
   6739                                gfx::PointF(),
   6740                                gfx::Size(60, 60),
   6741                                true,
   6742                                false);
   6743   SetLayerPropertiesForTesting(child.get(),
   6744                                identity_transform,
   6745                                gfx::Point3F(),
   6746                                gfx::PointF(),
   6747                                gfx::Size(60, 60),
   6748                                true,
   6749                                false);
   6750 
   6751   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   6752   host->SetRootLayer(root);
   6753 
   6754   ExecuteCalculateDrawProperties(root.get());
   6755 
   6756   EXPECT_TRUE(root->render_surface());
   6757 
   6758   // Neither the clip child nor its descendant should have inherited the clip
   6759   // from |intervening|.
   6760   EXPECT_EQ(gfx::Rect(0, 0, 40, 40).ToString(),
   6761             clip_child->clip_rect().ToString());
   6762   EXPECT_TRUE(clip_child->is_clipped());
   6763   EXPECT_EQ(gfx::Rect(0, 0, 40, 40).ToString(),
   6764             child->visible_content_rect().ToString());
   6765   EXPECT_TRUE(child->is_clipped());
   6766 }
   6767 
   6768 TEST_F(LayerTreeHostCommonTest,
   6769        SurfacesShouldBeUnaffectedByNonDescendantClipChildren) {
   6770   // Ensures that non-descendant clip children in the tree do not affect
   6771   // render surfaces.
   6772   //
   6773   //   root (a render surface)
   6774   //    + clip_parent (masks to bounds)
   6775   //      + render_surface1
   6776   //        + clip_child
   6777   //      + render_surface2
   6778   //        + non_clip_child
   6779   //
   6780   // In this example render_surface2 should be unaffected by clip_child.
   6781   scoped_refptr<Layer> root = Layer::Create();
   6782   scoped_refptr<Layer> clip_parent = Layer::Create();
   6783   scoped_refptr<Layer> render_surface1 = Layer::Create();
   6784   scoped_refptr<LayerWithForcedDrawsContent> clip_child =
   6785       make_scoped_refptr(new LayerWithForcedDrawsContent);
   6786   scoped_refptr<Layer> render_surface2 = Layer::Create();
   6787   scoped_refptr<LayerWithForcedDrawsContent> non_clip_child =
   6788       make_scoped_refptr(new LayerWithForcedDrawsContent);
   6789 
   6790   root->AddChild(clip_parent);
   6791   clip_parent->AddChild(render_surface1);
   6792   render_surface1->AddChild(clip_child);
   6793   clip_parent->AddChild(render_surface2);
   6794   render_surface2->AddChild(non_clip_child);
   6795 
   6796   clip_child->SetClipParent(clip_parent.get());
   6797 
   6798   clip_parent->SetMasksToBounds(true);
   6799   render_surface1->SetMasksToBounds(true);
   6800 
   6801   gfx::Transform identity_transform;
   6802   SetLayerPropertiesForTesting(root.get(),
   6803                                identity_transform,
   6804                                gfx::Point3F(),
   6805                                gfx::PointF(),
   6806                                gfx::Size(15, 15),
   6807                                true,
   6808                                false);
   6809   SetLayerPropertiesForTesting(clip_parent.get(),
   6810                                identity_transform,
   6811                                gfx::Point3F(),
   6812                                gfx::PointF(),
   6813                                gfx::Size(10, 10),
   6814                                true,
   6815                                false);
   6816   SetLayerPropertiesForTesting(render_surface1.get(),
   6817                                identity_transform,
   6818                                gfx::Point3F(),
   6819                                gfx::PointF(5, 5),
   6820                                gfx::Size(5, 5),
   6821                                true,
   6822                                false);
   6823   SetLayerPropertiesForTesting(render_surface2.get(),
   6824                                identity_transform,
   6825                                gfx::Point3F(),
   6826                                gfx::PointF(),
   6827                                gfx::Size(5, 5),
   6828                                true,
   6829                                false);
   6830   SetLayerPropertiesForTesting(clip_child.get(),
   6831                                identity_transform,
   6832                                gfx::Point3F(),
   6833                                gfx::PointF(-1, 1),
   6834                                gfx::Size(10, 10),
   6835                                true,
   6836                                false);
   6837   SetLayerPropertiesForTesting(non_clip_child.get(),
   6838                                identity_transform,
   6839                                gfx::Point3F(),
   6840                                gfx::PointF(),
   6841                                gfx::Size(5, 5),
   6842                                true,
   6843                                false);
   6844 
   6845   render_surface1->SetForceRenderSurface(true);
   6846   render_surface2->SetForceRenderSurface(true);
   6847 
   6848   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   6849   host->SetRootLayer(root);
   6850 
   6851   ExecuteCalculateDrawProperties(root.get());
   6852 
   6853   EXPECT_TRUE(root->render_surface());
   6854   EXPECT_TRUE(render_surface1->render_surface());
   6855   EXPECT_TRUE(render_surface2->render_surface());
   6856 
   6857   EXPECT_EQ(gfx::Rect(0, 0, 5, 5).ToString(),
   6858             render_surface1->clip_rect().ToString());
   6859   EXPECT_TRUE(render_surface1->is_clipped());
   6860 
   6861   // The render surface should not clip (it has unclipped descendants), instead
   6862   // it should rely on layer clipping.
   6863   EXPECT_EQ(gfx::Rect(0, 0, 0, 0).ToString(),
   6864             render_surface1->render_surface()->clip_rect().ToString());
   6865   EXPECT_FALSE(render_surface1->render_surface()->is_clipped());
   6866 
   6867   // That said, it should have grown to accomodate the unclipped descendant.
   6868   EXPECT_EQ(gfx::Rect(-1, 1, 6, 4).ToString(),
   6869             render_surface1->render_surface()->content_rect().ToString());
   6870 
   6871   // This render surface should clip. It has no unclipped descendants.
   6872   EXPECT_EQ(gfx::Rect(0, 0, 5, 5).ToString(),
   6873             render_surface2->clip_rect().ToString());
   6874   EXPECT_TRUE(render_surface2->render_surface()->is_clipped());
   6875 
   6876   // It also shouldn't have grown to accomodate the clip child.
   6877   EXPECT_EQ(gfx::Rect(0, 0, 5, 5).ToString(),
   6878             render_surface2->render_surface()->content_rect().ToString());
   6879 
   6880   // Sanity check our num_unclipped_descendants values.
   6881   EXPECT_EQ(1, render_surface1->num_unclipped_descendants());
   6882   EXPECT_EQ(0, render_surface2->num_unclipped_descendants());
   6883 }
   6884 
   6885 TEST_F(LayerTreeHostCommonTest, CanRenderToSeparateSurface) {
   6886   FakeImplProxy proxy;
   6887   TestSharedBitmapManager shared_bitmap_manager;
   6888   FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager);
   6889   scoped_ptr<LayerImpl> root =
   6890       LayerImpl::Create(host_impl.active_tree(), 12345);
   6891   scoped_ptr<LayerImpl> child1 =
   6892       LayerImpl::Create(host_impl.active_tree(), 123456);
   6893   scoped_ptr<LayerImpl> child2 =
   6894       LayerImpl::Create(host_impl.active_tree(), 1234567);
   6895   scoped_ptr<LayerImpl> child3 =
   6896       LayerImpl::Create(host_impl.active_tree(), 12345678);
   6897 
   6898   gfx::Transform identity_matrix;
   6899   gfx::Point3F transform_origin;
   6900   gfx::PointF position;
   6901   gfx::Size bounds(100, 100);
   6902   SetLayerPropertiesForTesting(root.get(),
   6903                                identity_matrix,
   6904                                transform_origin,
   6905                                position,
   6906                                bounds,
   6907                                true,
   6908                                false);
   6909   root->SetDrawsContent(true);
   6910 
   6911   // This layer structure normally forces render surface due to preserves3d
   6912   // behavior.
   6913   SetLayerPropertiesForTesting(child1.get(),
   6914                                identity_matrix,
   6915                                transform_origin,
   6916                                position,
   6917                                bounds,
   6918                                false,
   6919                                true);
   6920   child1->SetDrawsContent(true);
   6921   SetLayerPropertiesForTesting(child2.get(),
   6922                                identity_matrix,
   6923                                transform_origin,
   6924                                position,
   6925                                bounds,
   6926                                true,
   6927                                false);
   6928   child2->SetDrawsContent(true);
   6929   SetLayerPropertiesForTesting(child3.get(),
   6930                                identity_matrix,
   6931                                transform_origin,
   6932                                position,
   6933                                bounds,
   6934                                true,
   6935                                false);
   6936   child3->SetDrawsContent(true);
   6937 
   6938   child2->Set3dSortingContextId(1);
   6939   child3->Set3dSortingContextId(1);
   6940 
   6941   child2->AddChild(child3.Pass());
   6942   child1->AddChild(child2.Pass());
   6943   root->AddChild(child1.Pass());
   6944 
   6945   {
   6946     LayerImplList render_surface_layer_list;
   6947     FakeLayerTreeHostImpl::RecursiveUpdateNumChildren(root.get());
   6948     LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs(
   6949         root.get(), root->bounds(), &render_surface_layer_list);
   6950     inputs.can_render_to_separate_surface = true;
   6951     LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   6952 
   6953     EXPECT_EQ(2u, render_surface_layer_list.size());
   6954   }
   6955 
   6956   {
   6957     LayerImplList render_surface_layer_list;
   6958     LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs(
   6959         root.get(), root->bounds(), &render_surface_layer_list);
   6960     inputs.can_render_to_separate_surface = false;
   6961     LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   6962 
   6963     EXPECT_EQ(1u, render_surface_layer_list.size());
   6964   }
   6965 }
   6966 
   6967 TEST_F(LayerTreeHostCommonTest, DoNotIncludeBackfaceInvisibleSurfaces) {
   6968   scoped_refptr<Layer> root = Layer::Create();
   6969   scoped_refptr<Layer> render_surface = Layer::Create();
   6970   scoped_refptr<LayerWithForcedDrawsContent> child =
   6971       make_scoped_refptr(new LayerWithForcedDrawsContent);
   6972 
   6973   root->AddChild(render_surface);
   6974   render_surface->AddChild(child);
   6975 
   6976   gfx::Transform identity_transform;
   6977   SetLayerPropertiesForTesting(root.get(),
   6978                                identity_transform,
   6979                                gfx::Point3F(),
   6980                                gfx::PointF(),
   6981                                gfx::Size(50, 50),
   6982                                true,
   6983                                false);
   6984   SetLayerPropertiesForTesting(render_surface.get(),
   6985                                identity_transform,
   6986                                gfx::Point3F(),
   6987                                gfx::PointF(),
   6988                                gfx::Size(30, 30),
   6989                                false,
   6990                                true);
   6991   SetLayerPropertiesForTesting(child.get(),
   6992                                identity_transform,
   6993                                gfx::Point3F(),
   6994                                gfx::PointF(),
   6995                                gfx::Size(20, 20),
   6996                                true,
   6997                                false);
   6998 
   6999   root->SetShouldFlattenTransform(false);
   7000   root->Set3dSortingContextId(1);
   7001   render_surface->SetDoubleSided(false);
   7002   render_surface->SetForceRenderSurface(true);
   7003 
   7004   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   7005   host->SetRootLayer(root);
   7006 
   7007   ExecuteCalculateDrawProperties(root.get());
   7008 
   7009   EXPECT_EQ(2u, render_surface_layer_list()->size());
   7010   EXPECT_EQ(1u,
   7011             render_surface_layer_list()->at(0)
   7012                 ->render_surface()->layer_list().size());
   7013   EXPECT_EQ(1u,
   7014             render_surface_layer_list()->at(1)
   7015                 ->render_surface()->layer_list().size());
   7016 
   7017   gfx::Transform rotation_transform = identity_transform;
   7018   rotation_transform.RotateAboutXAxis(180.0);
   7019 
   7020   render_surface->SetTransform(rotation_transform);
   7021 
   7022   ExecuteCalculateDrawProperties(root.get());
   7023 
   7024   EXPECT_EQ(1u, render_surface_layer_list()->size());
   7025   EXPECT_EQ(0u,
   7026             render_surface_layer_list()->at(0)
   7027                 ->render_surface()->layer_list().size());
   7028 }
   7029 
   7030 TEST_F(LayerTreeHostCommonTest, ClippedByScrollParent) {
   7031   // Checks that the simple case (being clipped by a scroll parent that would
   7032   // have been processed before you anyhow) results in the right clips.
   7033   //
   7034   // + root
   7035   //   + scroll_parent_border
   7036   //   | + scroll_parent_clip
   7037   //   |   + scroll_parent
   7038   //   + scroll_child
   7039   //
   7040   scoped_refptr<Layer> root = Layer::Create();
   7041   scoped_refptr<Layer> scroll_parent_border = Layer::Create();
   7042   scoped_refptr<Layer> scroll_parent_clip = Layer::Create();
   7043   scoped_refptr<LayerWithForcedDrawsContent> scroll_parent =
   7044       make_scoped_refptr(new LayerWithForcedDrawsContent);
   7045   scoped_refptr<LayerWithForcedDrawsContent> scroll_child =
   7046       make_scoped_refptr(new LayerWithForcedDrawsContent);
   7047 
   7048   root->AddChild(scroll_child);
   7049 
   7050   root->AddChild(scroll_parent_border);
   7051   scroll_parent_border->AddChild(scroll_parent_clip);
   7052   scroll_parent_clip->AddChild(scroll_parent);
   7053 
   7054   scroll_parent_clip->SetMasksToBounds(true);
   7055 
   7056   scroll_child->SetScrollParent(scroll_parent.get());
   7057 
   7058   gfx::Transform identity_transform;
   7059   SetLayerPropertiesForTesting(root.get(),
   7060                                identity_transform,
   7061                                gfx::Point3F(),
   7062                                gfx::PointF(),
   7063                                gfx::Size(50, 50),
   7064                                true,
   7065                                false);
   7066   SetLayerPropertiesForTesting(scroll_parent_border.get(),
   7067                                identity_transform,
   7068                                gfx::Point3F(),
   7069                                gfx::PointF(),
   7070                                gfx::Size(40, 40),
   7071                                true,
   7072                                false);
   7073   SetLayerPropertiesForTesting(scroll_parent_clip.get(),
   7074                                identity_transform,
   7075                                gfx::Point3F(),
   7076                                gfx::PointF(),
   7077                                gfx::Size(30, 30),
   7078                                true,
   7079                                false);
   7080   SetLayerPropertiesForTesting(scroll_parent.get(),
   7081                                identity_transform,
   7082                                gfx::Point3F(),
   7083                                gfx::PointF(),
   7084                                gfx::Size(50, 50),
   7085                                true,
   7086                                false);
   7087   SetLayerPropertiesForTesting(scroll_child.get(),
   7088                                identity_transform,
   7089                                gfx::Point3F(),
   7090                                gfx::PointF(),
   7091                                gfx::Size(50, 50),
   7092                                true,
   7093                                false);
   7094 
   7095   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   7096   host->SetRootLayer(root);
   7097 
   7098   ExecuteCalculateDrawProperties(root.get());
   7099 
   7100   EXPECT_TRUE(root->render_surface());
   7101 
   7102   EXPECT_EQ(gfx::Rect(0, 0, 30, 30).ToString(),
   7103             scroll_child->clip_rect().ToString());
   7104   EXPECT_TRUE(scroll_child->is_clipped());
   7105 }
   7106 
   7107 TEST_F(LayerTreeHostCommonTest, SingularTransformSubtreesDoNotDraw) {
   7108   scoped_refptr<LayerWithForcedDrawsContent> root =
   7109       make_scoped_refptr(new LayerWithForcedDrawsContent);
   7110   scoped_refptr<LayerWithForcedDrawsContent> parent =
   7111       make_scoped_refptr(new LayerWithForcedDrawsContent);
   7112   scoped_refptr<LayerWithForcedDrawsContent> child =
   7113       make_scoped_refptr(new LayerWithForcedDrawsContent);
   7114 
   7115   root->AddChild(parent);
   7116   parent->AddChild(child);
   7117 
   7118   gfx::Transform identity_transform;
   7119   SetLayerPropertiesForTesting(root.get(),
   7120                                identity_transform,
   7121                                gfx::Point3F(),
   7122                                gfx::PointF(),
   7123                                gfx::Size(50, 50),
   7124                                true,
   7125                                true);
   7126   root->SetForceRenderSurface(true);
   7127   SetLayerPropertiesForTesting(parent.get(),
   7128                                identity_transform,
   7129                                gfx::Point3F(),
   7130                                gfx::PointF(),
   7131                                gfx::Size(30, 30),
   7132                                true,
   7133                                true);
   7134   parent->SetForceRenderSurface(true);
   7135   SetLayerPropertiesForTesting(child.get(),
   7136                                identity_transform,
   7137                                gfx::Point3F(),
   7138                                gfx::PointF(),
   7139                                gfx::Size(20, 20),
   7140                                true,
   7141                                true);
   7142   child->SetForceRenderSurface(true);
   7143 
   7144   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   7145   host->SetRootLayer(root);
   7146 
   7147   ExecuteCalculateDrawProperties(root.get());
   7148 
   7149   EXPECT_EQ(3u, render_surface_layer_list()->size());
   7150 
   7151   gfx::Transform singular_transform;
   7152   singular_transform.Scale3d(
   7153       SkDoubleToMScalar(1.0), SkDoubleToMScalar(1.0), SkDoubleToMScalar(0.0));
   7154 
   7155   child->SetTransform(singular_transform);
   7156 
   7157   ExecuteCalculateDrawProperties(root.get());
   7158 
   7159   EXPECT_EQ(2u, render_surface_layer_list()->size());
   7160 
   7161   // Ensure that the entire subtree under a layer with singular transform does
   7162   // not get rendered.
   7163   parent->SetTransform(singular_transform);
   7164   child->SetTransform(identity_transform);
   7165 
   7166   ExecuteCalculateDrawProperties(root.get());
   7167 
   7168   EXPECT_EQ(1u, render_surface_layer_list()->size());
   7169 }
   7170 
   7171 TEST_F(LayerTreeHostCommonTest, ClippedByOutOfOrderScrollParent) {
   7172   // Checks that clipping by a scroll parent that follows you in paint order
   7173   // still results in correct clipping.
   7174   //
   7175   // + root
   7176   //   + scroll_child
   7177   //   + scroll_parent_border
   7178   //     + scroll_parent_clip
   7179   //       + scroll_parent
   7180   //
   7181   scoped_refptr<Layer> root = Layer::Create();
   7182   scoped_refptr<Layer> scroll_parent_border = Layer::Create();
   7183   scoped_refptr<Layer> scroll_parent_clip = Layer::Create();
   7184   scoped_refptr<LayerWithForcedDrawsContent> scroll_parent =
   7185       make_scoped_refptr(new LayerWithForcedDrawsContent);
   7186   scoped_refptr<LayerWithForcedDrawsContent> scroll_child =
   7187       make_scoped_refptr(new LayerWithForcedDrawsContent);
   7188 
   7189   root->AddChild(scroll_parent_border);
   7190   scroll_parent_border->AddChild(scroll_parent_clip);
   7191   scroll_parent_clip->AddChild(scroll_parent);
   7192 
   7193   root->AddChild(scroll_child);
   7194 
   7195   scroll_parent_clip->SetMasksToBounds(true);
   7196 
   7197   scroll_child->SetScrollParent(scroll_parent.get());
   7198 
   7199   gfx::Transform identity_transform;
   7200   SetLayerPropertiesForTesting(root.get(),
   7201                                identity_transform,
   7202                                gfx::Point3F(),
   7203                                gfx::PointF(),
   7204                                gfx::Size(50, 50),
   7205                                true,
   7206                                false);
   7207   SetLayerPropertiesForTesting(scroll_parent_border.get(),
   7208                                identity_transform,
   7209                                gfx::Point3F(),
   7210                                gfx::PointF(),
   7211                                gfx::Size(40, 40),
   7212                                true,
   7213                                false);
   7214   SetLayerPropertiesForTesting(scroll_parent_clip.get(),
   7215                                identity_transform,
   7216                                gfx::Point3F(),
   7217                                gfx::PointF(),
   7218                                gfx::Size(30, 30),
   7219                                true,
   7220                                false);
   7221   SetLayerPropertiesForTesting(scroll_parent.get(),
   7222                                identity_transform,
   7223                                gfx::Point3F(),
   7224                                gfx::PointF(),
   7225                                gfx::Size(50, 50),
   7226                                true,
   7227                                false);
   7228   SetLayerPropertiesForTesting(scroll_child.get(),
   7229                                identity_transform,
   7230                                gfx::Point3F(),
   7231                                gfx::PointF(),
   7232                                gfx::Size(50, 50),
   7233                                true,
   7234                                false);
   7235 
   7236   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   7237   host->SetRootLayer(root);
   7238 
   7239   ExecuteCalculateDrawProperties(root.get());
   7240 
   7241   EXPECT_TRUE(root->render_surface());
   7242 
   7243   EXPECT_EQ(gfx::Rect(0, 0, 30, 30).ToString(),
   7244             scroll_child->clip_rect().ToString());
   7245   EXPECT_TRUE(scroll_child->is_clipped());
   7246 }
   7247 
   7248 TEST_F(LayerTreeHostCommonTest, ClippedByOutOfOrderScrollGrandparent) {
   7249   // Checks that clipping by a scroll parent and scroll grandparent that follow
   7250   // you in paint order still results in correct clipping.
   7251   //
   7252   // + root
   7253   //   + scroll_child
   7254   //   + scroll_parent_border
   7255   //   | + scroll_parent_clip
   7256   //   |   + scroll_parent
   7257   //   + scroll_grandparent_border
   7258   //     + scroll_grandparent_clip
   7259   //       + scroll_grandparent
   7260   //
   7261   scoped_refptr<Layer> root = Layer::Create();
   7262   scoped_refptr<Layer> scroll_parent_border = Layer::Create();
   7263   scoped_refptr<Layer> scroll_parent_clip = Layer::Create();
   7264   scoped_refptr<LayerWithForcedDrawsContent> scroll_parent =
   7265       make_scoped_refptr(new LayerWithForcedDrawsContent);
   7266 
   7267   scoped_refptr<Layer> scroll_grandparent_border = Layer::Create();
   7268   scoped_refptr<Layer> scroll_grandparent_clip = Layer::Create();
   7269   scoped_refptr<LayerWithForcedDrawsContent> scroll_grandparent =
   7270       make_scoped_refptr(new LayerWithForcedDrawsContent);
   7271 
   7272   scoped_refptr<LayerWithForcedDrawsContent> scroll_child =
   7273       make_scoped_refptr(new LayerWithForcedDrawsContent);
   7274 
   7275   root->AddChild(scroll_child);
   7276 
   7277   root->AddChild(scroll_parent_border);
   7278   scroll_parent_border->AddChild(scroll_parent_clip);
   7279   scroll_parent_clip->AddChild(scroll_parent);
   7280 
   7281   root->AddChild(scroll_grandparent_border);
   7282   scroll_grandparent_border->AddChild(scroll_grandparent_clip);
   7283   scroll_grandparent_clip->AddChild(scroll_grandparent);
   7284 
   7285   scroll_parent_clip->SetMasksToBounds(true);
   7286   scroll_grandparent_clip->SetMasksToBounds(true);
   7287 
   7288   scroll_child->SetScrollParent(scroll_parent.get());
   7289   scroll_parent_border->SetScrollParent(scroll_grandparent.get());
   7290 
   7291   gfx::Transform identity_transform;
   7292   SetLayerPropertiesForTesting(root.get(),
   7293                                identity_transform,
   7294                                gfx::Point3F(),
   7295                                gfx::PointF(),
   7296                                gfx::Size(50, 50),
   7297                                true,
   7298                                false);
   7299   SetLayerPropertiesForTesting(scroll_grandparent_border.get(),
   7300                                identity_transform,
   7301                                gfx::Point3F(),
   7302                                gfx::PointF(),
   7303                                gfx::Size(40, 40),
   7304                                true,
   7305                                false);
   7306   SetLayerPropertiesForTesting(scroll_grandparent_clip.get(),
   7307                                identity_transform,
   7308                                gfx::Point3F(),
   7309                                gfx::PointF(),
   7310                                gfx::Size(20, 20),
   7311                                true,
   7312                                false);
   7313   SetLayerPropertiesForTesting(scroll_grandparent.get(),
   7314                                identity_transform,
   7315                                gfx::Point3F(),
   7316                                gfx::PointF(),
   7317                                gfx::Size(50, 50),
   7318                                true,
   7319                                false);
   7320   SetLayerPropertiesForTesting(scroll_parent_border.get(),
   7321                                identity_transform,
   7322                                gfx::Point3F(),
   7323                                gfx::PointF(),
   7324                                gfx::Size(40, 40),
   7325                                true,
   7326                                false);
   7327   SetLayerPropertiesForTesting(scroll_parent_clip.get(),
   7328                                identity_transform,
   7329                                gfx::Point3F(),
   7330                                gfx::PointF(),
   7331                                gfx::Size(30, 30),
   7332                                true,
   7333                                false);
   7334   SetLayerPropertiesForTesting(scroll_parent.get(),
   7335                                identity_transform,
   7336                                gfx::Point3F(),
   7337                                gfx::PointF(),
   7338                                gfx::Size(50, 50),
   7339                                true,
   7340                                false);
   7341   SetLayerPropertiesForTesting(scroll_child.get(),
   7342                                identity_transform,
   7343                                gfx::Point3F(),
   7344                                gfx::PointF(),
   7345                                gfx::Size(50, 50),
   7346                                true,
   7347                                false);
   7348 
   7349   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   7350   host->SetRootLayer(root);
   7351 
   7352   ExecuteCalculateDrawProperties(root.get());
   7353 
   7354   EXPECT_TRUE(root->render_surface());
   7355 
   7356   EXPECT_EQ(gfx::Rect(0, 0, 20, 20).ToString(),
   7357             scroll_child->clip_rect().ToString());
   7358   EXPECT_TRUE(scroll_child->is_clipped());
   7359 
   7360   // Despite the fact that we visited the above layers out of order to get the
   7361   // correct clip, the layer lists should be unaffected.
   7362   EXPECT_EQ(3u, root->render_surface()->layer_list().size());
   7363   EXPECT_EQ(scroll_child.get(),
   7364             root->render_surface()->layer_list().at(0).get());
   7365   EXPECT_EQ(scroll_parent.get(),
   7366             root->render_surface()->layer_list().at(1).get());
   7367   EXPECT_EQ(scroll_grandparent.get(),
   7368             root->render_surface()->layer_list().at(2).get());
   7369 }
   7370 
   7371 TEST_F(LayerTreeHostCommonTest, OutOfOrderClippingRequiresRSLLSorting) {
   7372   // Ensures that even if we visit layers out of order, we still produce a
   7373   // correctly ordered render surface layer list.
   7374   // + root
   7375   //   + scroll_child
   7376   //   + scroll_parent_border
   7377   //     + scroll_parent_clip
   7378   //       + scroll_parent
   7379   //         + render_surface1
   7380   //   + scroll_grandparent_border
   7381   //     + scroll_grandparent_clip
   7382   //       + scroll_grandparent
   7383   //         + render_surface2
   7384   //
   7385   scoped_refptr<LayerWithForcedDrawsContent> root =
   7386       make_scoped_refptr(new LayerWithForcedDrawsContent);
   7387 
   7388   scoped_refptr<Layer> scroll_parent_border = Layer::Create();
   7389   scoped_refptr<Layer> scroll_parent_clip = Layer::Create();
   7390   scoped_refptr<LayerWithForcedDrawsContent> scroll_parent =
   7391       make_scoped_refptr(new LayerWithForcedDrawsContent);
   7392   scoped_refptr<LayerWithForcedDrawsContent> render_surface1 =
   7393       make_scoped_refptr(new LayerWithForcedDrawsContent);
   7394 
   7395   scoped_refptr<Layer> scroll_grandparent_border = Layer::Create();
   7396   scoped_refptr<Layer> scroll_grandparent_clip = Layer::Create();
   7397   scoped_refptr<LayerWithForcedDrawsContent> scroll_grandparent =
   7398       make_scoped_refptr(new LayerWithForcedDrawsContent);
   7399   scoped_refptr<LayerWithForcedDrawsContent> render_surface2 =
   7400       make_scoped_refptr(new LayerWithForcedDrawsContent);
   7401 
   7402   scoped_refptr<LayerWithForcedDrawsContent> scroll_child =
   7403       make_scoped_refptr(new LayerWithForcedDrawsContent);
   7404 
   7405   root->AddChild(scroll_child);
   7406 
   7407   root->AddChild(scroll_parent_border);
   7408   scroll_parent_border->AddChild(scroll_parent_clip);
   7409   scroll_parent_clip->AddChild(scroll_parent);
   7410   scroll_parent->AddChild(render_surface2);
   7411 
   7412   root->AddChild(scroll_grandparent_border);
   7413   scroll_grandparent_border->AddChild(scroll_grandparent_clip);
   7414   scroll_grandparent_clip->AddChild(scroll_grandparent);
   7415   scroll_grandparent->AddChild(render_surface1);
   7416 
   7417   scroll_parent_clip->SetMasksToBounds(true);
   7418   scroll_grandparent_clip->SetMasksToBounds(true);
   7419 
   7420   scroll_child->SetScrollParent(scroll_parent.get());
   7421   scroll_parent_border->SetScrollParent(scroll_grandparent.get());
   7422 
   7423   render_surface1->SetForceRenderSurface(true);
   7424   render_surface2->SetForceRenderSurface(true);
   7425 
   7426   gfx::Transform identity_transform;
   7427   SetLayerPropertiesForTesting(root.get(),
   7428                                identity_transform,
   7429                                gfx::Point3F(),
   7430                                gfx::PointF(),
   7431                                gfx::Size(50, 50),
   7432                                true,
   7433                                false);
   7434   SetLayerPropertiesForTesting(scroll_grandparent_border.get(),
   7435                                identity_transform,
   7436                                gfx::Point3F(),
   7437                                gfx::PointF(),
   7438                                gfx::Size(40, 40),
   7439                                true,
   7440                                false);
   7441   SetLayerPropertiesForTesting(scroll_grandparent_clip.get(),
   7442                                identity_transform,
   7443                                gfx::Point3F(),
   7444                                gfx::PointF(),
   7445                                gfx::Size(20, 20),
   7446                                true,
   7447                                false);
   7448   SetLayerPropertiesForTesting(scroll_grandparent.get(),
   7449                                identity_transform,
   7450                                gfx::Point3F(),
   7451                                gfx::PointF(),
   7452                                gfx::Size(50, 50),
   7453                                true,
   7454                                false);
   7455   SetLayerPropertiesForTesting(render_surface1.get(),
   7456                                identity_transform,
   7457                                gfx::Point3F(),
   7458                                gfx::PointF(),
   7459                                gfx::Size(50, 50),
   7460                                true,
   7461                                false);
   7462   SetLayerPropertiesForTesting(scroll_parent_border.get(),
   7463                                identity_transform,
   7464                                gfx::Point3F(),
   7465                                gfx::PointF(),
   7466                                gfx::Size(40, 40),
   7467                                true,
   7468                                false);
   7469   SetLayerPropertiesForTesting(scroll_parent_clip.get(),
   7470                                identity_transform,
   7471                                gfx::Point3F(),
   7472                                gfx::PointF(),
   7473                                gfx::Size(30, 30),
   7474                                true,
   7475                                false);
   7476   SetLayerPropertiesForTesting(scroll_parent.get(),
   7477                                identity_transform,
   7478                                gfx::Point3F(),
   7479                                gfx::PointF(),
   7480                                gfx::Size(50, 50),
   7481                                true,
   7482                                false);
   7483   SetLayerPropertiesForTesting(render_surface2.get(),
   7484                                identity_transform,
   7485                                gfx::Point3F(),
   7486                                gfx::PointF(),
   7487                                gfx::Size(50, 50),
   7488                                true,
   7489                                false);
   7490   SetLayerPropertiesForTesting(scroll_child.get(),
   7491                                identity_transform,
   7492                                gfx::Point3F(),
   7493                                gfx::PointF(),
   7494                                gfx::Size(50, 50),
   7495                                true,
   7496                                false);
   7497 
   7498   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
   7499   host->SetRootLayer(root);
   7500 
   7501   RenderSurfaceLayerList render_surface_layer_list;
   7502   LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
   7503       root.get(),
   7504       root->bounds(),
   7505       identity_transform,
   7506       &render_surface_layer_list);
   7507 
   7508   LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   7509 
   7510   EXPECT_TRUE(root->render_surface());
   7511 
   7512   EXPECT_EQ(gfx::Rect(0, 0, 20, 20).ToString(),
   7513             scroll_child->clip_rect().ToString());
   7514   EXPECT_TRUE(scroll_child->is_clipped());
   7515 
   7516   // Despite the fact that we had to process the layers out of order to get the
   7517   // right clip, our render_surface_layer_list's order should be unaffected.
   7518   EXPECT_EQ(3u, render_surface_layer_list.size());
   7519   EXPECT_EQ(root.get(), render_surface_layer_list.at(0));
   7520   EXPECT_EQ(render_surface2.get(), render_surface_layer_list.at(1));
   7521   EXPECT_EQ(render_surface1.get(), render_surface_layer_list.at(2));
   7522   EXPECT_TRUE(render_surface_layer_list.at(0)->render_surface());
   7523   EXPECT_TRUE(render_surface_layer_list.at(1)->render_surface());
   7524   EXPECT_TRUE(render_surface_layer_list.at(2)->render_surface());
   7525 }
   7526 
   7527 TEST_F(LayerTreeHostCommonTest, DoNotClobberSorting) {
   7528   // We rearrange layer list contributions if we have to visit children out of
   7529   // order, but it should be a 'stable' rearrangement. That is, the layer list
   7530   // additions for a single layer should not be reordered, though their position
   7531   // wrt to the contributions due to a sibling may vary.
   7532   //
   7533   // + root
   7534   //   + scroll_child
   7535   //     + top_content
   7536   //     + bottom_content
   7537   //   + scroll_parent_border
   7538   //     + scroll_parent_clip
   7539   //       + scroll_parent
   7540   //
   7541   FakeImplProxy proxy;
   7542   TestSharedBitmapManager shared_bitmap_manager;
   7543   FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager);
   7544   host_impl.CreatePendingTree();
   7545   scoped_ptr<LayerImpl> root = LayerImpl::Create(host_impl.active_tree(), 1);
   7546   scoped_ptr<LayerImpl> scroll_parent_border =
   7547       LayerImpl::Create(host_impl.active_tree(), 2);
   7548   scoped_ptr<LayerImpl> scroll_parent_clip =
   7549       LayerImpl::Create(host_impl.active_tree(), 3);
   7550   scoped_ptr<LayerImpl> scroll_parent =
   7551       LayerImpl::Create(host_impl.active_tree(), 4);
   7552   scoped_ptr<LayerImpl> scroll_child =
   7553       LayerImpl::Create(host_impl.active_tree(), 5);
   7554   scoped_ptr<LayerImpl> bottom_content =
   7555       LayerImpl::Create(host_impl.active_tree(), 6);
   7556   scoped_ptr<LayerImpl> top_content =
   7557       LayerImpl::Create(host_impl.active_tree(), 7);
   7558 
   7559   scroll_parent_clip->SetMasksToBounds(true);
   7560 
   7561   scroll_child->SetScrollParent(scroll_parent.get());
   7562   scoped_ptr<std::set<LayerImpl*> > scroll_children(new std::set<LayerImpl*>);
   7563   scroll_children->insert(scroll_child.get());
   7564   scroll_parent->SetScrollChildren(scroll_children.release());
   7565 
   7566   scroll_child->SetDrawsContent(true);
   7567   scroll_parent->SetDrawsContent(true);
   7568   top_content->SetDrawsContent(true);
   7569   bottom_content->SetDrawsContent(true);
   7570 
   7571   gfx::Transform identity_transform;
   7572   gfx::Transform top_transform;
   7573   top_transform.Translate3d(0.0, 0.0, 5.0);
   7574   gfx::Transform bottom_transform;
   7575   bottom_transform.Translate3d(0.0, 0.0, 3.0);
   7576 
   7577   SetLayerPropertiesForTesting(root.get(),
   7578                                identity_transform,
   7579                                gfx::Point3F(),
   7580                                gfx::PointF(),
   7581                                gfx::Size(50, 50),
   7582                                true,
   7583                                false);
   7584   SetLayerPropertiesForTesting(scroll_parent_border.get(),
   7585                                identity_transform,
   7586                                gfx::Point3F(),
   7587                                gfx::PointF(),
   7588                                gfx::Size(40, 40),
   7589                                true,
   7590                                false);
   7591   SetLayerPropertiesForTesting(scroll_parent_clip.get(),
   7592                                identity_transform,
   7593                                gfx::Point3F(),
   7594                                gfx::PointF(),
   7595                                gfx::Size(30, 30),
   7596                                true,
   7597                                false);
   7598   SetLayerPropertiesForTesting(scroll_parent.get(),
   7599                                identity_transform,
   7600                                gfx::Point3F(),
   7601                                gfx::PointF(),
   7602                                gfx::Size(50, 50),
   7603                                true,
   7604                                false);
   7605   SetLayerPropertiesForTesting(scroll_child.get(),
   7606                                identity_transform,
   7607                                gfx::Point3F(),
   7608                                gfx::PointF(),
   7609                                gfx::Size(50, 50),
   7610                                true,
   7611                                false);
   7612   SetLayerPropertiesForTesting(top_content.get(),
   7613                                top_transform,
   7614                                gfx::Point3F(),
   7615                                gfx::PointF(),
   7616                                gfx::Size(50, 50),
   7617                                false,
   7618                                true);
   7619   SetLayerPropertiesForTesting(bottom_content.get(),
   7620                                bottom_transform,
   7621                                gfx::Point3F(),
   7622                                gfx::PointF(),
   7623                                gfx::Size(50, 50),
   7624                                false,
   7625                                true);
   7626 
   7627   scroll_child->SetShouldFlattenTransform(false);
   7628   scroll_child->Set3dSortingContextId(1);
   7629 
   7630   scroll_child->AddChild(top_content.Pass());
   7631   scroll_child->AddChild(bottom_content.Pass());
   7632   root->AddChild(scroll_child.Pass());
   7633 
   7634   scroll_parent_clip->AddChild(scroll_parent.Pass());
   7635   scroll_parent_border->AddChild(scroll_parent_clip.Pass());
   7636   root->AddChild(scroll_parent_border.Pass());
   7637 
   7638   LayerImplList render_surface_layer_list;
   7639   LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs(
   7640       root.get(), root->bounds(), &render_surface_layer_list);
   7641 
   7642   LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   7643 
   7644   EXPECT_TRUE(root->render_surface());
   7645 
   7646   // If we don't sort by depth and let the layers get added in the order they
   7647   // would normally be visited in, then layers 6 and 7 will be out of order. In
   7648   // other words, although we've had to shift 5, 6, and 7 to appear before 4
   7649   // in the list (because of the scroll parent relationship), this should not
   7650   // have an effect on the the order of 5, 6, and 7 (which had been reordered
   7651   // due to layer sorting).
   7652   EXPECT_EQ(4u, root->render_surface()->layer_list().size());
   7653   EXPECT_EQ(5, root->render_surface()->layer_list().at(0)->id());
   7654   EXPECT_EQ(6, root->render_surface()->layer_list().at(1)->id());
   7655   EXPECT_EQ(7, root->render_surface()->layer_list().at(2)->id());
   7656   EXPECT_EQ(4, root->render_surface()->layer_list().at(3)->id());
   7657 }
   7658 
   7659 TEST_F(LayerTreeHostCommonTest, ScrollCompensationWithRounding) {
   7660   // This test verifies that a scrolling layer that gets snapped to
   7661   // integer coordinates doesn't move a fixed position child.
   7662   //
   7663   // + root
   7664   //   + container
   7665   //     + scroller
   7666   //       + fixed
   7667   //
   7668   FakeImplProxy proxy;
   7669   TestSharedBitmapManager shared_bitmap_manager;
   7670   FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager);
   7671   host_impl.CreatePendingTree();
   7672   scoped_ptr<LayerImpl> root = LayerImpl::Create(host_impl.active_tree(), 1);
   7673   scoped_ptr<LayerImpl> container =
   7674       LayerImpl::Create(host_impl.active_tree(), 2);
   7675   LayerImpl* container_layer = container.get();
   7676   scoped_ptr<LayerImpl> scroller =
   7677       LayerImpl::Create(host_impl.active_tree(), 3);
   7678   LayerImpl* scroll_layer = scroller.get();
   7679   scoped_ptr<LayerImpl> fixed = LayerImpl::Create(host_impl.active_tree(), 4);
   7680   LayerImpl* fixed_layer = fixed.get();
   7681 
   7682   container->SetIsContainerForFixedPositionLayers(true);
   7683 
   7684   LayerPositionConstraint constraint;
   7685   constraint.set_is_fixed_position(true);
   7686   fixed->SetPositionConstraint(constraint);
   7687 
   7688   scroller->SetScrollClipLayer(container->id());
   7689 
   7690   gfx::Transform identity_transform;
   7691   gfx::Transform container_transform;
   7692   container_transform.Translate3d(10.0, 20.0, 0.0);
   7693   gfx::Vector2dF container_offset = container_transform.To2dTranslation();
   7694 
   7695   SetLayerPropertiesForTesting(root.get(),
   7696                                identity_transform,
   7697                                gfx::Point3F(),
   7698                                gfx::PointF(),
   7699                                gfx::Size(50, 50),
   7700                                true,
   7701                                false);
   7702   SetLayerPropertiesForTesting(container.get(),
   7703                                container_transform,
   7704                                gfx::Point3F(),
   7705                                gfx::PointF(),
   7706                                gfx::Size(40, 40),
   7707                                true,
   7708                                false);
   7709   SetLayerPropertiesForTesting(scroller.get(),
   7710                                identity_transform,
   7711                                gfx::Point3F(),
   7712                                gfx::PointF(),
   7713                                gfx::Size(30, 30),
   7714                                true,
   7715                                false);
   7716   SetLayerPropertiesForTesting(fixed.get(),
   7717                                identity_transform,
   7718                                gfx::Point3F(),
   7719                                gfx::PointF(),
   7720                                gfx::Size(50, 50),
   7721                                true,
   7722                                false);
   7723 
   7724   scroller->AddChild(fixed.Pass());
   7725   container->AddChild(scroller.Pass());
   7726   root->AddChild(container.Pass());
   7727 
   7728   // Rounded to integers already.
   7729   {
   7730     gfx::Vector2dF scroll_delta(3.0, 5.0);
   7731     scroll_layer->SetScrollDelta(scroll_delta);
   7732 
   7733     LayerImplList render_surface_layer_list;
   7734     LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs(
   7735         root.get(), root->bounds(), &render_surface_layer_list);
   7736     LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   7737 
   7738     EXPECT_TRANSFORMATION_MATRIX_EQ(
   7739         container_layer->draw_properties().screen_space_transform,
   7740         fixed_layer->draw_properties().screen_space_transform);
   7741     EXPECT_VECTOR_EQ(
   7742         fixed_layer->draw_properties().screen_space_transform.To2dTranslation(),
   7743         container_offset);
   7744     EXPECT_VECTOR_EQ(scroll_layer->draw_properties()
   7745                          .screen_space_transform.To2dTranslation(),
   7746                      container_offset - scroll_delta);
   7747   }
   7748 
   7749   // Scroll delta requiring rounding.
   7750   {
   7751     gfx::Vector2dF scroll_delta(4.1f, 8.1f);
   7752     scroll_layer->SetScrollDelta(scroll_delta);
   7753 
   7754     gfx::Vector2dF rounded_scroll_delta(4.f, 8.f);
   7755 
   7756     LayerImplList render_surface_layer_list;
   7757     LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs(
   7758         root.get(), root->bounds(), &render_surface_layer_list);
   7759     LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   7760 
   7761     EXPECT_TRANSFORMATION_MATRIX_EQ(
   7762         container_layer->draw_properties().screen_space_transform,
   7763         fixed_layer->draw_properties().screen_space_transform);
   7764     EXPECT_VECTOR_EQ(
   7765         fixed_layer->draw_properties().screen_space_transform.To2dTranslation(),
   7766         container_offset);
   7767     EXPECT_VECTOR_EQ(scroll_layer->draw_properties()
   7768                          .screen_space_transform.To2dTranslation(),
   7769                      container_offset - rounded_scroll_delta);
   7770   }
   7771 
   7772   // Scale is applied earlier in the tree.
   7773   {
   7774     gfx::Transform scaled_container_transform = container_transform;
   7775     scaled_container_transform.Scale3d(3.0, 3.0, 1.0);
   7776     container_layer->SetTransform(scaled_container_transform);
   7777 
   7778     gfx::Vector2dF scroll_delta(4.5f, 8.5f);
   7779     scroll_layer->SetScrollDelta(scroll_delta);
   7780 
   7781     LayerImplList render_surface_layer_list;
   7782     LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs(
   7783         root.get(), root->bounds(), &render_surface_layer_list);
   7784     LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   7785 
   7786     EXPECT_TRANSFORMATION_MATRIX_EQ(
   7787         container_layer->draw_properties().screen_space_transform,
   7788         fixed_layer->draw_properties().screen_space_transform);
   7789     EXPECT_VECTOR_EQ(
   7790         fixed_layer->draw_properties().screen_space_transform.To2dTranslation(),
   7791         container_offset);
   7792 
   7793     container_layer->SetTransform(container_transform);
   7794   }
   7795 
   7796   // Scale is applied on the scroll layer itself.
   7797   {
   7798     gfx::Transform scale_transform;
   7799     scale_transform.Scale3d(3.0, 3.0, 1.0);
   7800     scroll_layer->SetTransform(scale_transform);
   7801 
   7802     gfx::Vector2dF scroll_delta(4.5f, 8.5f);
   7803     scroll_layer->SetScrollDelta(scroll_delta);
   7804 
   7805     LayerImplList render_surface_layer_list;
   7806     LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs(
   7807         root.get(), root->bounds(), &render_surface_layer_list);
   7808     LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   7809 
   7810     EXPECT_VECTOR_EQ(
   7811         fixed_layer->draw_properties().screen_space_transform.To2dTranslation(),
   7812         container_offset);
   7813 
   7814     scroll_layer->SetTransform(identity_transform);
   7815   }
   7816 }
   7817 
   7818 class AnimationScaleFactorTrackingLayerImpl : public LayerImpl {
   7819  public:
   7820   static scoped_ptr<AnimationScaleFactorTrackingLayerImpl> Create(
   7821       LayerTreeImpl* tree_impl,
   7822       int id) {
   7823     return make_scoped_ptr(
   7824         new AnimationScaleFactorTrackingLayerImpl(tree_impl, id));
   7825   }
   7826 
   7827   virtual ~AnimationScaleFactorTrackingLayerImpl() {}
   7828 
   7829  private:
   7830   explicit AnimationScaleFactorTrackingLayerImpl(LayerTreeImpl* tree_impl,
   7831                                                  int id)
   7832       : LayerImpl(tree_impl, id) {
   7833     SetDrawsContent(true);
   7834   }
   7835 };
   7836 
   7837 TEST_F(LayerTreeHostCommonTest, MaximumAnimationScaleFactor) {
   7838   FakeImplProxy proxy;
   7839   TestSharedBitmapManager shared_bitmap_manager;
   7840   FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager);
   7841   gfx::Transform identity_matrix;
   7842   scoped_ptr<AnimationScaleFactorTrackingLayerImpl> grand_parent =
   7843       AnimationScaleFactorTrackingLayerImpl::Create(host_impl.active_tree(), 1);
   7844   scoped_ptr<AnimationScaleFactorTrackingLayerImpl> parent =
   7845       AnimationScaleFactorTrackingLayerImpl::Create(host_impl.active_tree(), 2);
   7846   scoped_ptr<AnimationScaleFactorTrackingLayerImpl> child =
   7847       AnimationScaleFactorTrackingLayerImpl::Create(host_impl.active_tree(), 3);
   7848   scoped_ptr<AnimationScaleFactorTrackingLayerImpl> grand_child =
   7849       AnimationScaleFactorTrackingLayerImpl::Create(host_impl.active_tree(), 4);
   7850 
   7851   AnimationScaleFactorTrackingLayerImpl* parent_raw = parent.get();
   7852   AnimationScaleFactorTrackingLayerImpl* child_raw = child.get();
   7853   AnimationScaleFactorTrackingLayerImpl* grand_child_raw = grand_child.get();
   7854 
   7855   child->AddChild(grand_child.PassAs<LayerImpl>());
   7856   parent->AddChild(child.PassAs<LayerImpl>());
   7857   grand_parent->AddChild(parent.PassAs<LayerImpl>());
   7858 
   7859   SetLayerPropertiesForTesting(grand_parent.get(),
   7860                                identity_matrix,
   7861                                gfx::Point3F(),
   7862                                gfx::PointF(),
   7863                                gfx::Size(1, 2),
   7864                                true,
   7865                                false);
   7866   SetLayerPropertiesForTesting(parent_raw,
   7867                                identity_matrix,
   7868                                gfx::Point3F(),
   7869                                gfx::PointF(),
   7870                                gfx::Size(1, 2),
   7871                                true,
   7872                                false);
   7873   SetLayerPropertiesForTesting(child_raw,
   7874                                identity_matrix,
   7875                                gfx::Point3F(),
   7876                                gfx::PointF(),
   7877                                gfx::Size(1, 2),
   7878                                true,
   7879                                false);
   7880   SetLayerPropertiesForTesting(grand_child_raw,
   7881                                identity_matrix,
   7882                                gfx::Point3F(),
   7883                                gfx::PointF(),
   7884                                gfx::Size(1, 2),
   7885                                true,
   7886                                false);
   7887 
   7888   ExecuteCalculateDrawProperties(grand_parent.get());
   7889 
   7890   // No layers have animations.
   7891   EXPECT_EQ(0.f,
   7892             grand_parent->draw_properties().maximum_animation_contents_scale);
   7893   EXPECT_EQ(0.f,
   7894             parent_raw->draw_properties().maximum_animation_contents_scale);
   7895   EXPECT_EQ(0.f, child_raw->draw_properties().maximum_animation_contents_scale);
   7896   EXPECT_EQ(
   7897       0.f, grand_child_raw->draw_properties().maximum_animation_contents_scale);
   7898 
   7899   TransformOperations translation;
   7900   translation.AppendTranslate(1.f, 2.f, 3.f);
   7901 
   7902   AddAnimatedTransformToLayer(
   7903       parent_raw, 1.0, TransformOperations(), translation);
   7904 
   7905   // No layers have scale-affecting animations.
   7906   EXPECT_EQ(0.f,
   7907             grand_parent->draw_properties().maximum_animation_contents_scale);
   7908   EXPECT_EQ(0.f,
   7909             parent_raw->draw_properties().maximum_animation_contents_scale);
   7910   EXPECT_EQ(0.f, child_raw->draw_properties().maximum_animation_contents_scale);
   7911   EXPECT_EQ(
   7912       0.f, grand_child_raw->draw_properties().maximum_animation_contents_scale);
   7913 
   7914   TransformOperations scale;
   7915   scale.AppendScale(5.f, 4.f, 3.f);
   7916 
   7917   AddAnimatedTransformToLayer(child_raw, 1.0, TransformOperations(), scale);
   7918   ExecuteCalculateDrawProperties(grand_parent.get());
   7919 
   7920   // Only |child| has a scale-affecting animation.
   7921   EXPECT_EQ(0.f,
   7922             grand_parent->draw_properties().maximum_animation_contents_scale);
   7923   EXPECT_EQ(0.f,
   7924             parent_raw->draw_properties().maximum_animation_contents_scale);
   7925   EXPECT_EQ(5.f, child_raw->draw_properties().maximum_animation_contents_scale);
   7926   EXPECT_EQ(
   7927       5.f, grand_child_raw->draw_properties().maximum_animation_contents_scale);
   7928 
   7929   AddAnimatedTransformToLayer(
   7930       grand_parent.get(), 1.0, TransformOperations(), scale);
   7931   ExecuteCalculateDrawProperties(grand_parent.get());
   7932 
   7933   // |grand_parent| and |child| have scale-affecting animations.
   7934   EXPECT_EQ(5.f,
   7935             grand_parent->draw_properties().maximum_animation_contents_scale);
   7936   EXPECT_EQ(5.f,
   7937             parent_raw->draw_properties().maximum_animation_contents_scale);
   7938   // We don't support combining animated scales from two nodes; 0.f means
   7939   // that the maximum scale could not be computed.
   7940   EXPECT_EQ(0.f, child_raw->draw_properties().maximum_animation_contents_scale);
   7941   EXPECT_EQ(
   7942       0.f, grand_child_raw->draw_properties().maximum_animation_contents_scale);
   7943 
   7944   AddAnimatedTransformToLayer(parent_raw, 1.0, TransformOperations(), scale);
   7945   ExecuteCalculateDrawProperties(grand_parent.get());
   7946 
   7947   // |grand_parent|, |parent|, and |child| have scale-affecting animations.
   7948   EXPECT_EQ(5.f,
   7949             grand_parent->draw_properties().maximum_animation_contents_scale);
   7950   EXPECT_EQ(0.f,
   7951             parent_raw->draw_properties().maximum_animation_contents_scale);
   7952   EXPECT_EQ(0.f, child_raw->draw_properties().maximum_animation_contents_scale);
   7953   EXPECT_EQ(
   7954       0.f, grand_child_raw->draw_properties().maximum_animation_contents_scale);
   7955 
   7956   grand_parent->layer_animation_controller()->AbortAnimations(
   7957       Animation::Transform);
   7958   parent_raw->layer_animation_controller()->AbortAnimations(
   7959       Animation::Transform);
   7960   child_raw->layer_animation_controller()->AbortAnimations(
   7961       Animation::Transform);
   7962 
   7963   TransformOperations perspective;
   7964   perspective.AppendPerspective(10.f);
   7965 
   7966   AddAnimatedTransformToLayer(
   7967       child_raw, 1.0, TransformOperations(), perspective);
   7968   ExecuteCalculateDrawProperties(grand_parent.get());
   7969 
   7970   // |child| has a scale-affecting animation but computing the maximum of this
   7971   // animation is not supported.
   7972   EXPECT_EQ(0.f,
   7973             grand_parent->draw_properties().maximum_animation_contents_scale);
   7974   EXPECT_EQ(0.f,
   7975             parent_raw->draw_properties().maximum_animation_contents_scale);
   7976   EXPECT_EQ(0.f, child_raw->draw_properties().maximum_animation_contents_scale);
   7977   EXPECT_EQ(
   7978       0.f, grand_child_raw->draw_properties().maximum_animation_contents_scale);
   7979 
   7980   child_raw->layer_animation_controller()->AbortAnimations(
   7981       Animation::Transform);
   7982 
   7983   gfx::Transform scale_matrix;
   7984   scale_matrix.Scale(1.f, 2.f);
   7985   grand_parent->SetTransform(scale_matrix);
   7986   parent_raw->SetTransform(scale_matrix);
   7987   AddAnimatedTransformToLayer(parent_raw, 1.0, TransformOperations(), scale);
   7988   ExecuteCalculateDrawProperties(grand_parent.get());
   7989 
   7990   // |grand_parent| and |parent| each have scale 2.f. |parent| has a  scale
   7991   // animation with maximum scale 5.f.
   7992   EXPECT_EQ(0.f,
   7993             grand_parent->draw_properties().maximum_animation_contents_scale);
   7994   EXPECT_EQ(10.f,
   7995             parent_raw->draw_properties().maximum_animation_contents_scale);
   7996   EXPECT_EQ(10.f,
   7997             child_raw->draw_properties().maximum_animation_contents_scale);
   7998   EXPECT_EQ(
   7999       10.f,
   8000       grand_child_raw->draw_properties().maximum_animation_contents_scale);
   8001 
   8002   gfx::Transform perspective_matrix;
   8003   perspective_matrix.ApplyPerspectiveDepth(2.f);
   8004   child_raw->SetTransform(perspective_matrix);
   8005   ExecuteCalculateDrawProperties(grand_parent.get());
   8006 
   8007   // |child| has a transform that's neither a translation nor a scale.
   8008   EXPECT_EQ(0.f,
   8009             grand_parent->draw_properties().maximum_animation_contents_scale);
   8010   EXPECT_EQ(10.f,
   8011             parent_raw->draw_properties().maximum_animation_contents_scale);
   8012   EXPECT_EQ(0.f, child_raw->draw_properties().maximum_animation_contents_scale);
   8013   EXPECT_EQ(
   8014       0.f, grand_child_raw->draw_properties().maximum_animation_contents_scale);
   8015 
   8016   parent_raw->SetTransform(perspective_matrix);
   8017   ExecuteCalculateDrawProperties(grand_parent.get());
   8018 
   8019   // |parent| and |child| have transforms that are neither translations nor
   8020   // scales.
   8021   EXPECT_EQ(0.f,
   8022             grand_parent->draw_properties().maximum_animation_contents_scale);
   8023   EXPECT_EQ(0.f,
   8024             parent_raw->draw_properties().maximum_animation_contents_scale);
   8025   EXPECT_EQ(0.f, child_raw->draw_properties().maximum_animation_contents_scale);
   8026   EXPECT_EQ(
   8027       0.f, grand_child_raw->draw_properties().maximum_animation_contents_scale);
   8028 
   8029   parent_raw->SetTransform(identity_matrix);
   8030   child_raw->SetTransform(identity_matrix);
   8031   grand_parent->SetTransform(perspective_matrix);
   8032 
   8033   ExecuteCalculateDrawProperties(grand_parent.get());
   8034 
   8035   // |grand_parent| has a transform that's neither a translation nor a scale.
   8036   EXPECT_EQ(0.f,
   8037             grand_parent->draw_properties().maximum_animation_contents_scale);
   8038   EXPECT_EQ(0.f,
   8039             parent_raw->draw_properties().maximum_animation_contents_scale);
   8040   EXPECT_EQ(0.f, child_raw->draw_properties().maximum_animation_contents_scale);
   8041   EXPECT_EQ(
   8042       0.f, grand_child_raw->draw_properties().maximum_animation_contents_scale);
   8043 }
   8044 
   8045 static int membership_id(LayerImpl* layer) {
   8046   return layer->draw_properties().last_drawn_render_surface_layer_list_id;
   8047 }
   8048 
   8049 static void GatherDrawnLayers(LayerImplList* rsll,
   8050                               std::set<LayerImpl*>* drawn_layers) {
   8051   for (LayerIterator<LayerImpl> it = LayerIterator<LayerImpl>::Begin(rsll),
   8052                                 end = LayerIterator<LayerImpl>::End(rsll);
   8053        it != end;
   8054        ++it) {
   8055     LayerImpl* layer = *it;
   8056     if (it.represents_itself())
   8057       drawn_layers->insert(layer);
   8058 
   8059     if (!it.represents_contributing_render_surface())
   8060       continue;
   8061 
   8062     if (layer->mask_layer())
   8063       drawn_layers->insert(layer->mask_layer());
   8064     if (layer->replica_layer() && layer->replica_layer()->mask_layer())
   8065       drawn_layers->insert(layer->replica_layer()->mask_layer());
   8066   }
   8067 }
   8068 
   8069 TEST_F(LayerTreeHostCommonTest, RenderSurfaceLayerListMembership) {
   8070   FakeImplProxy proxy;
   8071   TestSharedBitmapManager shared_bitmap_manager;
   8072   FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager);
   8073   gfx::Transform identity_matrix;
   8074 
   8075   scoped_ptr<LayerImpl> grand_parent =
   8076       LayerImpl::Create(host_impl.active_tree(), 1);
   8077   scoped_ptr<LayerImpl> parent = LayerImpl::Create(host_impl.active_tree(), 3);
   8078   scoped_ptr<LayerImpl> child = LayerImpl::Create(host_impl.active_tree(), 5);
   8079   scoped_ptr<LayerImpl> grand_child1 =
   8080       LayerImpl::Create(host_impl.active_tree(), 7);
   8081   scoped_ptr<LayerImpl> grand_child2 =
   8082       LayerImpl::Create(host_impl.active_tree(), 9);
   8083 
   8084   LayerImpl* grand_parent_raw = grand_parent.get();
   8085   LayerImpl* parent_raw = parent.get();
   8086   LayerImpl* child_raw = child.get();
   8087   LayerImpl* grand_child1_raw = grand_child1.get();
   8088   LayerImpl* grand_child2_raw = grand_child2.get();
   8089 
   8090   child->AddChild(grand_child1.Pass());
   8091   child->AddChild(grand_child2.Pass());
   8092   parent->AddChild(child.Pass());
   8093   grand_parent->AddChild(parent.Pass());
   8094 
   8095   SetLayerPropertiesForTesting(grand_parent_raw,
   8096                                identity_matrix,
   8097                                gfx::Point3F(),
   8098                                gfx::PointF(),
   8099                                gfx::Size(1, 2),
   8100                                true,
   8101                                false);
   8102   SetLayerPropertiesForTesting(parent_raw,
   8103                                identity_matrix,
   8104                                gfx::Point3F(),
   8105                                gfx::PointF(),
   8106                                gfx::Size(1, 2),
   8107                                true,
   8108                                false);
   8109   SetLayerPropertiesForTesting(child_raw,
   8110                                identity_matrix,
   8111                                gfx::Point3F(),
   8112                                gfx::PointF(),
   8113                                gfx::Size(1, 2),
   8114                                true,
   8115                                false);
   8116   SetLayerPropertiesForTesting(grand_child1_raw,
   8117                                identity_matrix,
   8118                                gfx::Point3F(),
   8119                                gfx::PointF(),
   8120                                gfx::Size(1, 2),
   8121                                true,
   8122                                false);
   8123   SetLayerPropertiesForTesting(grand_child2_raw,
   8124                                identity_matrix,
   8125                                gfx::Point3F(),
   8126                                gfx::PointF(),
   8127                                gfx::Size(1, 2),
   8128                                true,
   8129                                false);
   8130 
   8131   // Start with nothing being drawn.
   8132   ExecuteCalculateDrawProperties(grand_parent_raw);
   8133   int member_id = render_surface_layer_list_count();
   8134 
   8135   EXPECT_NE(member_id, membership_id(grand_parent_raw));
   8136   EXPECT_NE(member_id, membership_id(parent_raw));
   8137   EXPECT_NE(member_id, membership_id(child_raw));
   8138   EXPECT_NE(member_id, membership_id(grand_child1_raw));
   8139   EXPECT_NE(member_id, membership_id(grand_child2_raw));
   8140 
   8141   std::set<LayerImpl*> expected;
   8142   std::set<LayerImpl*> actual;
   8143   GatherDrawnLayers(render_surface_layer_list_impl(), &actual);
   8144   EXPECT_EQ(expected, actual);
   8145 
   8146   // If we force render surface, but none of the layers are in the layer list,
   8147   // then this layer should not appear in RSLL.
   8148   grand_child1_raw->SetForceRenderSurface(true);
   8149 
   8150   ExecuteCalculateDrawProperties(grand_parent_raw);
   8151   member_id = render_surface_layer_list_count();
   8152 
   8153   EXPECT_NE(member_id, membership_id(grand_parent_raw));
   8154   EXPECT_NE(member_id, membership_id(parent_raw));
   8155   EXPECT_NE(member_id, membership_id(child_raw));
   8156   EXPECT_NE(member_id, membership_id(grand_child1_raw));
   8157   EXPECT_NE(member_id, membership_id(grand_child2_raw));
   8158 
   8159   expected.clear();
   8160   actual.clear();
   8161   GatherDrawnLayers(render_surface_layer_list_impl(), &actual);
   8162   EXPECT_EQ(expected, actual);
   8163 
   8164   // However, if we say that this layer also draws content, it will appear in
   8165   // RSLL.
   8166   grand_child1_raw->SetDrawsContent(true);
   8167 
   8168   ExecuteCalculateDrawProperties(grand_parent_raw);
   8169   member_id = render_surface_layer_list_count();
   8170 
   8171   EXPECT_NE(member_id, membership_id(grand_parent_raw));
   8172   EXPECT_NE(member_id, membership_id(parent_raw));
   8173   EXPECT_NE(member_id, membership_id(child_raw));
   8174   EXPECT_EQ(member_id, membership_id(grand_child1_raw));
   8175   EXPECT_NE(member_id, membership_id(grand_child2_raw));
   8176 
   8177   expected.clear();
   8178   expected.insert(grand_child1_raw);
   8179 
   8180   actual.clear();
   8181   GatherDrawnLayers(render_surface_layer_list_impl(), &actual);
   8182   EXPECT_EQ(expected, actual);
   8183 
   8184   // Now child is forced to have a render surface, and one if its children draws
   8185   // content.
   8186   grand_child1_raw->SetDrawsContent(false);
   8187   grand_child1_raw->SetForceRenderSurface(false);
   8188   child_raw->SetForceRenderSurface(true);
   8189   grand_child2_raw->SetDrawsContent(true);
   8190 
   8191   ExecuteCalculateDrawProperties(grand_parent_raw);
   8192   member_id = render_surface_layer_list_count();
   8193 
   8194   EXPECT_NE(member_id, membership_id(grand_parent_raw));
   8195   EXPECT_NE(member_id, membership_id(parent_raw));
   8196   EXPECT_NE(member_id, membership_id(child_raw));
   8197   EXPECT_NE(member_id, membership_id(grand_child1_raw));
   8198   EXPECT_EQ(member_id, membership_id(grand_child2_raw));
   8199 
   8200   expected.clear();
   8201   expected.insert(grand_child2_raw);
   8202 
   8203   actual.clear();
   8204   GatherDrawnLayers(render_surface_layer_list_impl(), &actual);
   8205   EXPECT_EQ(expected, actual);
   8206 
   8207   // Add a mask layer to child.
   8208   child_raw->SetMaskLayer(LayerImpl::Create(host_impl.active_tree(), 6).Pass());
   8209 
   8210   ExecuteCalculateDrawProperties(grand_parent_raw);
   8211   member_id = render_surface_layer_list_count();
   8212 
   8213   EXPECT_NE(member_id, membership_id(grand_parent_raw));
   8214   EXPECT_NE(member_id, membership_id(parent_raw));
   8215   EXPECT_NE(member_id, membership_id(child_raw));
   8216   EXPECT_EQ(member_id, membership_id(child_raw->mask_layer()));
   8217   EXPECT_NE(member_id, membership_id(grand_child1_raw));
   8218   EXPECT_EQ(member_id, membership_id(grand_child2_raw));
   8219 
   8220   expected.clear();
   8221   expected.insert(grand_child2_raw);
   8222   expected.insert(child_raw->mask_layer());
   8223 
   8224   expected.clear();
   8225   expected.insert(grand_child2_raw);
   8226   expected.insert(child_raw->mask_layer());
   8227 
   8228   actual.clear();
   8229   GatherDrawnLayers(render_surface_layer_list_impl(), &actual);
   8230   EXPECT_EQ(expected, actual);
   8231 
   8232   // Add replica mask layer.
   8233   scoped_ptr<LayerImpl> replica_layer =
   8234       LayerImpl::Create(host_impl.active_tree(), 20);
   8235   replica_layer->SetMaskLayer(LayerImpl::Create(host_impl.active_tree(), 21));
   8236   child_raw->SetReplicaLayer(replica_layer.Pass());
   8237 
   8238   ExecuteCalculateDrawProperties(grand_parent_raw);
   8239   member_id = render_surface_layer_list_count();
   8240 
   8241   EXPECT_NE(member_id, membership_id(grand_parent_raw));
   8242   EXPECT_NE(member_id, membership_id(parent_raw));
   8243   EXPECT_NE(member_id, membership_id(child_raw));
   8244   EXPECT_EQ(member_id, membership_id(child_raw->mask_layer()));
   8245   EXPECT_EQ(member_id, membership_id(child_raw->replica_layer()->mask_layer()));
   8246   EXPECT_NE(member_id, membership_id(grand_child1_raw));
   8247   EXPECT_EQ(member_id, membership_id(grand_child2_raw));
   8248 
   8249   expected.clear();
   8250   expected.insert(grand_child2_raw);
   8251   expected.insert(child_raw->mask_layer());
   8252   expected.insert(child_raw->replica_layer()->mask_layer());
   8253 
   8254   actual.clear();
   8255   GatherDrawnLayers(render_surface_layer_list_impl(), &actual);
   8256   EXPECT_EQ(expected, actual);
   8257 
   8258   child_raw->TakeReplicaLayer();
   8259 
   8260   // With nothing drawing, we should have no layers.
   8261   grand_child2_raw->SetDrawsContent(false);
   8262 
   8263   ExecuteCalculateDrawProperties(grand_parent_raw);
   8264   member_id = render_surface_layer_list_count();
   8265 
   8266   EXPECT_NE(member_id, membership_id(grand_parent_raw));
   8267   EXPECT_NE(member_id, membership_id(parent_raw));
   8268   EXPECT_NE(member_id, membership_id(child_raw));
   8269   EXPECT_NE(member_id, membership_id(child_raw->mask_layer()));
   8270   EXPECT_NE(member_id, membership_id(grand_child1_raw));
   8271   EXPECT_NE(member_id, membership_id(grand_child2_raw));
   8272 
   8273   expected.clear();
   8274   actual.clear();
   8275   GatherDrawnLayers(render_surface_layer_list_impl(), &actual);
   8276   EXPECT_EQ(expected, actual);
   8277 
   8278   // Child itself draws means that we should have the child and the mask in the
   8279   // list.
   8280   child_raw->SetDrawsContent(true);
   8281 
   8282   ExecuteCalculateDrawProperties(grand_parent_raw);
   8283   member_id = render_surface_layer_list_count();
   8284 
   8285   EXPECT_NE(member_id, membership_id(grand_parent_raw));
   8286   EXPECT_NE(member_id, membership_id(parent_raw));
   8287   EXPECT_EQ(member_id, membership_id(child_raw));
   8288   EXPECT_EQ(member_id, membership_id(child_raw->mask_layer()));
   8289   EXPECT_NE(member_id, membership_id(grand_child1_raw));
   8290   EXPECT_NE(member_id, membership_id(grand_child2_raw));
   8291 
   8292   expected.clear();
   8293   expected.insert(child_raw);
   8294   expected.insert(child_raw->mask_layer());
   8295   actual.clear();
   8296   GatherDrawnLayers(render_surface_layer_list_impl(), &actual);
   8297   EXPECT_EQ(expected, actual);
   8298 
   8299   child_raw->TakeMaskLayer();
   8300 
   8301   // Now everyone's a member!
   8302   grand_parent_raw->SetDrawsContent(true);
   8303   parent_raw->SetDrawsContent(true);
   8304   child_raw->SetDrawsContent(true);
   8305   grand_child1_raw->SetDrawsContent(true);
   8306   grand_child2_raw->SetDrawsContent(true);
   8307 
   8308   ExecuteCalculateDrawProperties(grand_parent_raw);
   8309   member_id = render_surface_layer_list_count();
   8310 
   8311   EXPECT_EQ(member_id, membership_id(grand_parent_raw));
   8312   EXPECT_EQ(member_id, membership_id(parent_raw));
   8313   EXPECT_EQ(member_id, membership_id(child_raw));
   8314   EXPECT_EQ(member_id, membership_id(grand_child1_raw));
   8315   EXPECT_EQ(member_id, membership_id(grand_child2_raw));
   8316 
   8317   expected.clear();
   8318   expected.insert(grand_parent_raw);
   8319   expected.insert(parent_raw);
   8320   expected.insert(child_raw);
   8321   expected.insert(grand_child1_raw);
   8322   expected.insert(grand_child2_raw);
   8323 
   8324   actual.clear();
   8325   GatherDrawnLayers(render_surface_layer_list_impl(), &actual);
   8326   EXPECT_EQ(expected, actual);
   8327 }
   8328 
   8329 TEST_F(LayerTreeHostCommonTest, DrawPropertyScales) {
   8330   FakeImplProxy proxy;
   8331   TestSharedBitmapManager shared_bitmap_manager;
   8332   FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager);
   8333 
   8334   scoped_ptr<LayerImpl> root = LayerImpl::Create(host_impl.active_tree(), 1);
   8335   LayerImpl* root_layer = root.get();
   8336   scoped_ptr<LayerImpl> child1 = LayerImpl::Create(host_impl.active_tree(), 2);
   8337   LayerImpl* child1_layer = child1.get();
   8338   scoped_ptr<LayerImpl> child2 = LayerImpl::Create(host_impl.active_tree(), 3);
   8339   LayerImpl* child2_layer = child2.get();
   8340 
   8341   root->AddChild(child1.Pass());
   8342   root->AddChild(child2.Pass());
   8343 
   8344   gfx::Transform identity_matrix, scale_transform_child1,
   8345       scale_transform_child2;
   8346   scale_transform_child1.Scale(2, 3);
   8347   scale_transform_child2.Scale(4, 5);
   8348 
   8349   SetLayerPropertiesForTesting(root_layer,
   8350                                identity_matrix,
   8351                                gfx::Point3F(),
   8352                                gfx::PointF(),
   8353                                gfx::Size(1, 1),
   8354                                true,
   8355                                false);
   8356   SetLayerPropertiesForTesting(child1_layer,
   8357                                scale_transform_child1,
   8358                                gfx::Point3F(),
   8359                                gfx::PointF(),
   8360                                gfx::Size(),
   8361                                true,
   8362                                false);
   8363 
   8364   child1_layer->SetMaskLayer(
   8365       LayerImpl::Create(host_impl.active_tree(), 4).Pass());
   8366 
   8367   scoped_ptr<LayerImpl> replica_layer =
   8368       LayerImpl::Create(host_impl.active_tree(), 5);
   8369   replica_layer->SetMaskLayer(LayerImpl::Create(host_impl.active_tree(), 6));
   8370   child1_layer->SetReplicaLayer(replica_layer.Pass());
   8371 
   8372   ExecuteCalculateDrawProperties(root_layer);
   8373 
   8374   TransformOperations scale;
   8375   scale.AppendScale(5.f, 8.f, 3.f);
   8376 
   8377   AddAnimatedTransformToLayer(child2_layer, 1.0, TransformOperations(), scale);
   8378   SetLayerPropertiesForTesting(child2_layer,
   8379                                scale_transform_child2,
   8380                                gfx::Point3F(),
   8381                                gfx::PointF(),
   8382                                gfx::Size(),
   8383                                true,
   8384                                false);
   8385 
   8386   ExecuteCalculateDrawProperties(root_layer);
   8387 
   8388   EXPECT_FLOAT_EQ(1.f, root_layer->draw_properties().ideal_contents_scale);
   8389   EXPECT_FLOAT_EQ(3.f, child1_layer->draw_properties().ideal_contents_scale);
   8390   EXPECT_FLOAT_EQ(
   8391       3.f, child1_layer->mask_layer()->draw_properties().ideal_contents_scale);
   8392   EXPECT_FLOAT_EQ(3.f,
   8393                   child1_layer->replica_layer()
   8394                       ->mask_layer()
   8395                       ->draw_properties()
   8396                       .ideal_contents_scale);
   8397   EXPECT_FLOAT_EQ(5.f, child2_layer->draw_properties().ideal_contents_scale);
   8398 
   8399   EXPECT_FLOAT_EQ(
   8400       0.f, root_layer->draw_properties().maximum_animation_contents_scale);
   8401   EXPECT_FLOAT_EQ(
   8402       0.f, child1_layer->draw_properties().maximum_animation_contents_scale);
   8403   EXPECT_FLOAT_EQ(0.f,
   8404                   child1_layer->mask_layer()
   8405                       ->draw_properties()
   8406                       .maximum_animation_contents_scale);
   8407   EXPECT_FLOAT_EQ(0.f,
   8408                   child1_layer->replica_layer()
   8409                       ->mask_layer()
   8410                       ->draw_properties()
   8411                       .maximum_animation_contents_scale);
   8412   EXPECT_FLOAT_EQ(
   8413       8.f, child2_layer->draw_properties().maximum_animation_contents_scale);
   8414 
   8415   EXPECT_FLOAT_EQ(1.f, root_layer->draw_properties().page_scale_factor);
   8416   EXPECT_FLOAT_EQ(1.f, child1_layer->draw_properties().page_scale_factor);
   8417   EXPECT_FLOAT_EQ(
   8418       1.f, child1_layer->mask_layer()->draw_properties().page_scale_factor);
   8419   EXPECT_FLOAT_EQ(1.f,
   8420                   child1_layer->replica_layer()
   8421                       ->mask_layer()
   8422                       ->draw_properties()
   8423                       .page_scale_factor);
   8424   EXPECT_FLOAT_EQ(1.f, child2_layer->draw_properties().page_scale_factor);
   8425 
   8426   EXPECT_FLOAT_EQ(1.f, root_layer->draw_properties().device_scale_factor);
   8427   EXPECT_FLOAT_EQ(1.f, child1_layer->draw_properties().device_scale_factor);
   8428   EXPECT_FLOAT_EQ(
   8429       1.f, child1_layer->mask_layer()->draw_properties().device_scale_factor);
   8430   EXPECT_FLOAT_EQ(1.f,
   8431                   child1_layer->replica_layer()
   8432                       ->mask_layer()
   8433                       ->draw_properties()
   8434                       .device_scale_factor);
   8435   EXPECT_FLOAT_EQ(1.f, child2_layer->draw_properties().device_scale_factor);
   8436 
   8437   // Changing page-scale would affect ideal_contents_scale and
   8438   // maximum_animation_contents_scale.
   8439 
   8440   float page_scale_factor = 3.f;
   8441   float device_scale_factor = 1.0f;
   8442   std::vector<LayerImpl*> render_surface_layer_list;
   8443   gfx::Size device_viewport_size =
   8444       gfx::Size(root_layer->bounds().width() * device_scale_factor,
   8445                 root_layer->bounds().height() * device_scale_factor);
   8446   LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs(
   8447       root_layer, device_viewport_size, &render_surface_layer_list);
   8448 
   8449   inputs.page_scale_factor = page_scale_factor;
   8450   inputs.can_adjust_raster_scales = true;
   8451   inputs.page_scale_application_layer = root_layer;
   8452   LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   8453 
   8454   EXPECT_FLOAT_EQ(1.f, root_layer->draw_properties().ideal_contents_scale);
   8455   EXPECT_FLOAT_EQ(9.f, child1_layer->draw_properties().ideal_contents_scale);
   8456   EXPECT_FLOAT_EQ(
   8457       9.f, child1_layer->mask_layer()->draw_properties().ideal_contents_scale);
   8458   EXPECT_FLOAT_EQ(9.f,
   8459                   child1_layer->replica_layer()
   8460                       ->mask_layer()
   8461                       ->draw_properties()
   8462                       .ideal_contents_scale);
   8463   EXPECT_FLOAT_EQ(15.f, child2_layer->draw_properties().ideal_contents_scale);
   8464 
   8465   EXPECT_FLOAT_EQ(
   8466       0.f, root_layer->draw_properties().maximum_animation_contents_scale);
   8467   EXPECT_FLOAT_EQ(
   8468       0.f, child1_layer->draw_properties().maximum_animation_contents_scale);
   8469   EXPECT_FLOAT_EQ(0.f,
   8470                   child1_layer->mask_layer()
   8471                       ->draw_properties()
   8472                       .maximum_animation_contents_scale);
   8473   EXPECT_FLOAT_EQ(0.f,
   8474                   child1_layer->replica_layer()
   8475                       ->mask_layer()
   8476                       ->draw_properties()
   8477                       .maximum_animation_contents_scale);
   8478   EXPECT_FLOAT_EQ(
   8479       24.f, child2_layer->draw_properties().maximum_animation_contents_scale);
   8480 
   8481   EXPECT_FLOAT_EQ(1.f, root_layer->draw_properties().page_scale_factor);
   8482   EXPECT_FLOAT_EQ(3.f, child1_layer->draw_properties().page_scale_factor);
   8483   EXPECT_FLOAT_EQ(
   8484       3.f, child1_layer->mask_layer()->draw_properties().page_scale_factor);
   8485   EXPECT_FLOAT_EQ(3.f,
   8486                   child1_layer->replica_layer()
   8487                       ->mask_layer()
   8488                       ->draw_properties()
   8489                       .page_scale_factor);
   8490   EXPECT_FLOAT_EQ(3.f, child2_layer->draw_properties().page_scale_factor);
   8491 
   8492   EXPECT_FLOAT_EQ(1.f, root_layer->draw_properties().device_scale_factor);
   8493   EXPECT_FLOAT_EQ(1.f, child1_layer->draw_properties().device_scale_factor);
   8494   EXPECT_FLOAT_EQ(
   8495       1.f, child1_layer->mask_layer()->draw_properties().device_scale_factor);
   8496   EXPECT_FLOAT_EQ(1.f,
   8497                   child1_layer->replica_layer()
   8498                       ->mask_layer()
   8499                       ->draw_properties()
   8500                       .device_scale_factor);
   8501   EXPECT_FLOAT_EQ(1.f, child2_layer->draw_properties().device_scale_factor);
   8502 
   8503   // Changing device-scale would affect ideal_contents_scale and
   8504   // maximum_animation_contents_scale.
   8505 
   8506   device_scale_factor = 4.0f;
   8507   inputs.device_scale_factor = device_scale_factor;
   8508   inputs.can_adjust_raster_scales = true;
   8509   LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   8510 
   8511   EXPECT_FLOAT_EQ(4.f, root_layer->draw_properties().ideal_contents_scale);
   8512   EXPECT_FLOAT_EQ(36.f, child1_layer->draw_properties().ideal_contents_scale);
   8513   EXPECT_FLOAT_EQ(
   8514       36.f, child1_layer->mask_layer()->draw_properties().ideal_contents_scale);
   8515   EXPECT_FLOAT_EQ(36.f,
   8516                   child1_layer->replica_layer()
   8517                       ->mask_layer()
   8518                       ->draw_properties()
   8519                       .ideal_contents_scale);
   8520   EXPECT_FLOAT_EQ(60.f, child2_layer->draw_properties().ideal_contents_scale);
   8521 
   8522   EXPECT_FLOAT_EQ(
   8523       0.f, root_layer->draw_properties().maximum_animation_contents_scale);
   8524   EXPECT_FLOAT_EQ(
   8525       0.f, child1_layer->draw_properties().maximum_animation_contents_scale);
   8526   EXPECT_FLOAT_EQ(0.f,
   8527                   child1_layer->mask_layer()
   8528                       ->draw_properties()
   8529                       .maximum_animation_contents_scale);
   8530   EXPECT_FLOAT_EQ(0.f,
   8531                   child1_layer->replica_layer()
   8532                       ->mask_layer()
   8533                       ->draw_properties()
   8534                       .maximum_animation_contents_scale);
   8535   EXPECT_FLOAT_EQ(
   8536       96.f, child2_layer->draw_properties().maximum_animation_contents_scale);
   8537 
   8538   EXPECT_FLOAT_EQ(1.f, root_layer->draw_properties().page_scale_factor);
   8539   EXPECT_FLOAT_EQ(3.f, child1_layer->draw_properties().page_scale_factor);
   8540   EXPECT_FLOAT_EQ(
   8541       3.f, child1_layer->mask_layer()->draw_properties().page_scale_factor);
   8542   EXPECT_FLOAT_EQ(3.f,
   8543                   child1_layer->replica_layer()
   8544                       ->mask_layer()
   8545                       ->draw_properties()
   8546                       .page_scale_factor);
   8547   EXPECT_FLOAT_EQ(3.f, child2_layer->draw_properties().page_scale_factor);
   8548 
   8549   EXPECT_FLOAT_EQ(4.f, root_layer->draw_properties().device_scale_factor);
   8550   EXPECT_FLOAT_EQ(4.f, child1_layer->draw_properties().device_scale_factor);
   8551   EXPECT_FLOAT_EQ(
   8552       4.f, child1_layer->mask_layer()->draw_properties().device_scale_factor);
   8553   EXPECT_FLOAT_EQ(4.f,
   8554                   child1_layer->replica_layer()
   8555                       ->mask_layer()
   8556                       ->draw_properties()
   8557                       .device_scale_factor);
   8558   EXPECT_FLOAT_EQ(4.f, child2_layer->draw_properties().device_scale_factor);
   8559 }
   8560 
   8561 TEST_F(LayerTreeHostCommonTest, VisibleContentRectInChildRenderSurface) {
   8562   scoped_refptr<Layer> root = Layer::Create();
   8563   SetLayerPropertiesForTesting(root.get(),
   8564                                gfx::Transform(),
   8565                                gfx::Point3F(),
   8566                                gfx::PointF(),
   8567                                gfx::Size(768 / 2, 3000),
   8568                                true,
   8569                                false);
   8570   root->SetIsDrawable(true);
   8571 
   8572   scoped_refptr<Layer> clip = Layer::Create();
   8573   SetLayerPropertiesForTesting(clip.get(),
   8574                                gfx::Transform(),
   8575                                gfx::Point3F(),
   8576                                gfx::PointF(),
   8577                                gfx::Size(768 / 2, 10000),
   8578                                true,
   8579                                false);
   8580   clip->SetMasksToBounds(true);
   8581 
   8582   scoped_refptr<Layer> content = Layer::Create();
   8583   SetLayerPropertiesForTesting(content.get(),
   8584                                gfx::Transform(),
   8585                                gfx::Point3F(),
   8586                                gfx::PointF(),
   8587                                gfx::Size(768 / 2, 10000),
   8588                                true,
   8589                                false);
   8590   content->SetIsDrawable(true);
   8591   content->SetForceRenderSurface(true);
   8592 
   8593   root->AddChild(clip);
   8594   clip->AddChild(content);
   8595 
   8596   FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_3D);
   8597   scoped_ptr<FakeLayerTreeHost> host = FakeLayerTreeHost::Create(&client);
   8598   host->SetRootLayer(root);
   8599 
   8600   gfx::Size device_viewport_size(768, 582);
   8601   RenderSurfaceLayerList render_surface_layer_list;
   8602   LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
   8603       host->root_layer(), device_viewport_size, &render_surface_layer_list);
   8604   inputs.device_scale_factor = 2.f;
   8605   inputs.page_scale_factor = 1.f;
   8606   inputs.page_scale_application_layer = NULL;
   8607   LayerTreeHostCommon::CalculateDrawProperties(&inputs);
   8608 
   8609   // Layers in the root render surface have their visible content rect clipped
   8610   // by the viewport.
   8611   EXPECT_EQ(gfx::Rect(768 / 2, 582 / 2), root->visible_content_rect());
   8612 
   8613   // Layers drawing to a child render surface should still have their visible
   8614   // content rect clipped by the viewport.
   8615   EXPECT_EQ(gfx::Rect(768 / 2, 582 / 2), content->visible_content_rect());
   8616 }
   8617 
   8618 }  // namespace
   8619 }  // namespace cc
   8620