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 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 31 SolidColorScrollbarLayerImpl::~SolidColorScrollbarLayerImpl() {} 32 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 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 64 void SolidColorScrollbarLayerImpl::PushPropertiesTo(LayerImpl* layer) { 65 ScrollbarLayerImplBase::PushPropertiesTo(layer); 66 } 67 68 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 78 int SolidColorScrollbarLayerImpl::ThumbLength() const { 79 return std::max( 80 static_cast<int>(visible_to_total_length_ratio() * TrackLength()), 81 ThumbThickness()); 82 } 83 84 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 91 int SolidColorScrollbarLayerImpl::TrackStart() const { return track_start_; } 92 93 bool SolidColorScrollbarLayerImpl::IsThumbResizable() const { 94 return true; 95 } 96 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