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