158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// found in the LICENSE file.
458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "cc/layers/solid_color_scrollbar_layer_impl.h"
658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "cc/quads/solid_color_draw_quad.h"
758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "cc/trees/layer_tree_impl.h"
858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "cc/trees/layer_tree_settings.h"
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "cc/trees/occlusion_tracker.h"
1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace cc {
1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)scoped_ptr<SolidColorScrollbarLayerImpl> SolidColorScrollbarLayerImpl::Create(
1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    LayerTreeImpl* tree_impl,
1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    int id,
1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ScrollbarOrientation orientation,
1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    int thumb_thickness,
18a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    int track_start,
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool is_left_side_vertical_scrollbar,
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool is_overlay) {
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return make_scoped_ptr(
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      new SolidColorScrollbarLayerImpl(tree_impl,
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                       id,
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                       orientation,
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                       thumb_thickness,
26a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                       track_start,
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                       is_left_side_vertical_scrollbar,
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                       is_overlay));
2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)SolidColorScrollbarLayerImpl::~SolidColorScrollbarLayerImpl() {}
3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)scoped_ptr<LayerImpl> SolidColorScrollbarLayerImpl::CreateLayerImpl(
3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    LayerTreeImpl* tree_impl) {
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return SolidColorScrollbarLayerImpl::Create(tree_impl,
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                              id(),
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                              orientation(),
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                              thumb_thickness_,
39a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                              track_start_,
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                              is_left_side_vertical_scrollbar(),
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                              is_overlay_scrollbar())
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      .PassAs<LayerImpl>();
4358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)SolidColorScrollbarLayerImpl::SolidColorScrollbarLayerImpl(
4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    LayerTreeImpl* tree_impl,
4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    int id,
4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ScrollbarOrientation orientation,
4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    int thumb_thickness,
50a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    int track_start,
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool is_left_side_vertical_scrollbar,
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool is_overlay)
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : ScrollbarLayerImplBase(tree_impl,
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                             id,
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                             orientation,
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                             is_left_side_vertical_scrollbar,
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                             is_overlay),
5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      thumb_thickness_(thumb_thickness),
59a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      track_start_(track_start),
60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      color_(tree_impl->settings().solid_color_scrollbar_color) {
61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SetOpacity(0.f);
62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void SolidColorScrollbarLayerImpl::PushPropertiesTo(LayerImpl* layer) {
6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ScrollbarLayerImplBase::PushPropertiesTo(layer);
6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)int SolidColorScrollbarLayerImpl::ThumbThickness() const {
6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (thumb_thickness_ != -1)
7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return thumb_thickness_;
7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (orientation() == HORIZONTAL)
7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return bounds().height();
7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  else
7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return bounds().width();
7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)int SolidColorScrollbarLayerImpl::ThumbLength() const {
7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return std::max(
8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      static_cast<int>(visible_to_total_length_ratio() * TrackLength()),
8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      ThumbThickness());
8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)float SolidColorScrollbarLayerImpl::TrackLength() const {
8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (orientation() == HORIZONTAL)
86a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    return bounds().width() - TrackStart() * 2;
8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  else
88a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    return bounds().height() + vertical_adjust() - TrackStart() * 2;
8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
91a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochint SolidColorScrollbarLayerImpl::TrackStart() const { return track_start_; }
9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool SolidColorScrollbarLayerImpl::IsThumbResizable() const {
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return true;
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
97116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid SolidColorScrollbarLayerImpl::AppendQuads(
98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    RenderPass* render_pass,
99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const OcclusionTracker<LayerImpl>& occlusion_tracker,
100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    AppendQuadsData* append_quads_data) {
101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SharedQuadState* shared_quad_state =
102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      render_pass->CreateAndAppendSharedQuadState();
103010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  PopulateSharedQuadState(shared_quad_state);
104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1056d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  AppendDebugBorderQuad(
106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      render_pass, content_bounds(), shared_quad_state, append_quads_data);
10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
10823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  gfx::Rect thumb_quad_rect(ComputeThumbQuadRect());
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  gfx::Rect visible_quad_rect =
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      occlusion_tracker.GetCurrentOcclusionForLayer(
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            draw_properties().target_space_transform)
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          .GetUnoccludedContentRect(thumb_quad_rect);
11323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (visible_quad_rect.IsEmpty())
11423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    return;
11523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SolidColorDrawQuad* quad =
117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      render_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  quad->SetNew(
119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      shared_quad_state, thumb_quad_rect, visible_quad_rect, color_, false);
12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}  // namespace cc
123