• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2012 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/layers/solid_color_layer_impl.h"
6 
7 #include <algorithm>
8 
9 #include "cc/quads/solid_color_draw_quad.h"
10 #include "cc/trees/occlusion_tracker.h"
11 
12 namespace cc {
13 
14 namespace {
15 const int kSolidQuadTileSize = 256;
16 }
17 
SolidColorLayerImpl(LayerTreeImpl * tree_impl,int id)18 SolidColorLayerImpl::SolidColorLayerImpl(LayerTreeImpl* tree_impl, int id)
19     : LayerImpl(tree_impl, id) {
20 }
21 
~SolidColorLayerImpl()22 SolidColorLayerImpl::~SolidColorLayerImpl() {}
23 
CreateLayerImpl(LayerTreeImpl * tree_impl)24 scoped_ptr<LayerImpl> SolidColorLayerImpl::CreateLayerImpl(
25     LayerTreeImpl* tree_impl) {
26   return SolidColorLayerImpl::Create(tree_impl, id()).PassAs<LayerImpl>();
27 }
28 
AppendSolidQuads(RenderPass * render_pass,const OcclusionTracker<LayerImpl> & occlusion_tracker,SharedQuadState * shared_quad_state,const gfx::Rect & visible_content_rect,const gfx::Transform & target_space_transform,SkColor color)29 void SolidColorLayerImpl::AppendSolidQuads(
30     RenderPass* render_pass,
31     const OcclusionTracker<LayerImpl>& occlusion_tracker,
32     SharedQuadState* shared_quad_state,
33     const gfx::Rect& visible_content_rect,
34     const gfx::Transform& target_space_transform,
35     SkColor color) {
36   Occlusion occlusion =
37       occlusion_tracker.GetCurrentOcclusionForLayer(target_space_transform);
38 
39   // We create a series of smaller quads instead of just one large one so that
40   // the culler can reduce the total pixels drawn.
41   int right = visible_content_rect.right();
42   int bottom = visible_content_rect.bottom();
43   for (int x = visible_content_rect.x(); x < visible_content_rect.right();
44        x += kSolidQuadTileSize) {
45     for (int y = visible_content_rect.y(); y < visible_content_rect.bottom();
46          y += kSolidQuadTileSize) {
47       gfx::Rect quad_rect(x,
48                           y,
49                           std::min(right - x, kSolidQuadTileSize),
50                           std::min(bottom - y, kSolidQuadTileSize));
51       gfx::Rect visible_quad_rect =
52           occlusion.GetUnoccludedContentRect(quad_rect);
53       if (visible_quad_rect.IsEmpty())
54         continue;
55 
56       SolidColorDrawQuad* quad =
57           render_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
58       quad->SetNew(
59           shared_quad_state, quad_rect, visible_quad_rect, color, false);
60     }
61   }
62 }
63 
AppendQuads(RenderPass * render_pass,const OcclusionTracker<LayerImpl> & occlusion_tracker,AppendQuadsData * append_quads_data)64 void SolidColorLayerImpl::AppendQuads(
65     RenderPass* render_pass,
66     const OcclusionTracker<LayerImpl>& occlusion_tracker,
67     AppendQuadsData* append_quads_data) {
68   SharedQuadState* shared_quad_state =
69       render_pass->CreateAndAppendSharedQuadState();
70   PopulateSharedQuadState(shared_quad_state);
71 
72   AppendDebugBorderQuad(
73       render_pass, content_bounds(), shared_quad_state, append_quads_data);
74 
75   // TODO(hendrikw): We need to pass the visible content rect rather than
76   // |content_bounds()| here.
77   AppendSolidQuads(render_pass,
78                    occlusion_tracker,
79                    shared_quad_state,
80                    gfx::Rect(content_bounds()),
81                    draw_properties().target_space_transform,
82                    background_color());
83 }
84 
LayerTypeAsString() const85 const char* SolidColorLayerImpl::LayerTypeAsString() const {
86   return "cc::SolidColorLayerImpl";
87 }
88 
89 }  // namespace cc
90