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