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/solid_color_scrollbar_layer_impl.h" 6#include "cc/quads/solid_color_draw_quad.h" 7#include "cc/trees/layer_tree_impl.h" 8#include "cc/trees/layer_tree_settings.h" 9#include "cc/trees/occlusion_tracker.h" 10 11namespace cc { 12 13scoped_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 31SolidColorScrollbarLayerImpl::~SolidColorScrollbarLayerImpl() {} 32 33scoped_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 45SolidColorScrollbarLayerImpl::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 64void SolidColorScrollbarLayerImpl::PushPropertiesTo(LayerImpl* layer) { 65 ScrollbarLayerImplBase::PushPropertiesTo(layer); 66} 67 68int 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 78int SolidColorScrollbarLayerImpl::ThumbLength() const { 79 return std::max( 80 static_cast<int>(visible_to_total_length_ratio() * TrackLength()), 81 ThumbThickness()); 82} 83 84float 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 91int SolidColorScrollbarLayerImpl::TrackStart() const { return track_start_; } 92 93bool SolidColorScrollbarLayerImpl::IsThumbResizable() const { 94 return true; 95} 96 97void SolidColorScrollbarLayerImpl::AppendQuads( 98 RenderPass* render_pass, 99 const OcclusionTracker<LayerImpl>& occlusion_tracker, 100 AppendQuadsData* append_quads_data) { 101 SharedQuadState* shared_quad_state = 102 render_pass->CreateAndAppendSharedQuadState(); 103 PopulateSharedQuadState(shared_quad_state); 104 105 AppendDebugBorderQuad( 106 render_pass, content_bounds(), shared_quad_state, append_quads_data); 107 108 gfx::Rect thumb_quad_rect(ComputeThumbQuadRect()); 109 gfx::Rect visible_quad_rect = 110 occlusion_tracker.GetCurrentOcclusionForLayer( 111 draw_properties().target_space_transform) 112 .GetUnoccludedContentRect(thumb_quad_rect); 113 if (visible_quad_rect.IsEmpty()) 114 return; 115 116 SolidColorDrawQuad* quad = 117 render_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); 118 quad->SetNew( 119 shared_quad_state, thumb_quad_rect, visible_quad_rect, color_, false); 120} 121 122} // namespace cc 123