1 // Copyright 2013 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/quad_sink.h"
6 #include "cc/layers/solid_color_scrollbar_layer_impl.h"
7 #include "cc/quads/solid_color_draw_quad.h"
8 #include "cc/trees/layer_tree_impl.h"
9 #include "cc/trees/layer_tree_settings.h"
10
11 namespace cc {
12
Create(LayerTreeImpl * tree_impl,int id,ScrollbarOrientation orientation,int thumb_thickness,int track_start,bool is_left_side_vertical_scrollbar,bool is_overlay)13 scoped_ptr<SolidColorScrollbarLayerImpl> SolidColorScrollbarLayerImpl::Create(
14 LayerTreeImpl* tree_impl,
15 int id,
16 ScrollbarOrientation orientation,
17 int thumb_thickness,
18 int track_start,
19 bool is_left_side_vertical_scrollbar,
20 bool is_overlay) {
21 return make_scoped_ptr(
22 new SolidColorScrollbarLayerImpl(tree_impl,
23 id,
24 orientation,
25 thumb_thickness,
26 track_start,
27 is_left_side_vertical_scrollbar,
28 is_overlay));
29 }
30
~SolidColorScrollbarLayerImpl()31 SolidColorScrollbarLayerImpl::~SolidColorScrollbarLayerImpl() {}
32
CreateLayerImpl(LayerTreeImpl * tree_impl)33 scoped_ptr<LayerImpl> SolidColorScrollbarLayerImpl::CreateLayerImpl(
34 LayerTreeImpl* tree_impl) {
35 return SolidColorScrollbarLayerImpl::Create(tree_impl,
36 id(),
37 orientation(),
38 thumb_thickness_,
39 track_start_,
40 is_left_side_vertical_scrollbar(),
41 is_overlay_scrollbar())
42 .PassAs<LayerImpl>();
43 }
44
SolidColorScrollbarLayerImpl(LayerTreeImpl * tree_impl,int id,ScrollbarOrientation orientation,int thumb_thickness,int track_start,bool is_left_side_vertical_scrollbar,bool is_overlay)45 SolidColorScrollbarLayerImpl::SolidColorScrollbarLayerImpl(
46 LayerTreeImpl* tree_impl,
47 int id,
48 ScrollbarOrientation orientation,
49 int thumb_thickness,
50 int track_start,
51 bool is_left_side_vertical_scrollbar,
52 bool is_overlay)
53 : ScrollbarLayerImplBase(tree_impl,
54 id,
55 orientation,
56 is_left_side_vertical_scrollbar,
57 is_overlay),
58 thumb_thickness_(thumb_thickness),
59 track_start_(track_start),
60 color_(tree_impl->settings().solid_color_scrollbar_color) {
61 SetOpacity(0.f);
62 }
63
PushPropertiesTo(LayerImpl * layer)64 void SolidColorScrollbarLayerImpl::PushPropertiesTo(LayerImpl* layer) {
65 ScrollbarLayerImplBase::PushPropertiesTo(layer);
66 }
67
ThumbThickness() const68 int SolidColorScrollbarLayerImpl::ThumbThickness() const {
69 if (thumb_thickness_ != -1)
70 return thumb_thickness_;
71
72 if (orientation() == HORIZONTAL)
73 return bounds().height();
74 else
75 return bounds().width();
76 }
77
ThumbLength() const78 int SolidColorScrollbarLayerImpl::ThumbLength() const {
79 return std::max(
80 static_cast<int>(visible_to_total_length_ratio() * TrackLength()),
81 ThumbThickness());
82 }
83
TrackLength() const84 float SolidColorScrollbarLayerImpl::TrackLength() const {
85 if (orientation() == HORIZONTAL)
86 return bounds().width() - TrackStart() * 2;
87 else
88 return bounds().height() + vertical_adjust() - TrackStart() * 2;
89 }
90
TrackStart() const91 int SolidColorScrollbarLayerImpl::TrackStart() const { return track_start_; }
92
IsThumbResizable() const93 bool SolidColorScrollbarLayerImpl::IsThumbResizable() const {
94 return true;
95 }
96
AppendQuads(QuadSink * quad_sink,AppendQuadsData * append_quads_data)97 void SolidColorScrollbarLayerImpl::AppendQuads(QuadSink* quad_sink,
98 AppendQuadsData* append_quads_data) {
99 SharedQuadState* shared_quad_state = quad_sink->CreateSharedQuadState();
100 PopulateSharedQuadState(shared_quad_state);
101
102 AppendDebugBorderQuad(
103 quad_sink, content_bounds(), shared_quad_state, append_quads_data);
104
105 gfx::Rect thumb_quad_rect(ComputeThumbQuadRect());
106 gfx::Rect visible_quad_rect = quad_sink->UnoccludedContentRect(
107 thumb_quad_rect, draw_properties().target_space_transform);
108 if (visible_quad_rect.IsEmpty())
109 return;
110
111 scoped_ptr<SolidColorDrawQuad> quad = SolidColorDrawQuad::Create();
112 quad->SetNew(
113 shared_quad_state, thumb_quad_rect, visible_quad_rect, color_, false);
114 quad_sink->Append(quad.PassAs<DrawQuad>());
115 }
116
117 } // namespace cc
118