painted_scrollbar_layer_impl.cc revision 010d83a9304c5a91596085d917d248abff47903a
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/painted_scrollbar_layer_impl.h" 6 7#include <algorithm> 8 9#include "cc/animation/scrollbar_animation_controller.h" 10#include "cc/layers/layer.h" 11#include "cc/layers/quad_sink.h" 12#include "cc/quads/solid_color_draw_quad.h" 13#include "cc/quads/texture_draw_quad.h" 14#include "cc/trees/layer_tree_impl.h" 15#include "cc/trees/layer_tree_settings.h" 16#include "ui/gfx/rect_conversions.h" 17 18namespace cc { 19 20scoped_ptr<PaintedScrollbarLayerImpl> PaintedScrollbarLayerImpl::Create( 21 LayerTreeImpl* tree_impl, 22 int id, 23 ScrollbarOrientation orientation) { 24 return make_scoped_ptr( 25 new PaintedScrollbarLayerImpl(tree_impl, id, orientation)); 26} 27 28PaintedScrollbarLayerImpl::PaintedScrollbarLayerImpl( 29 LayerTreeImpl* tree_impl, 30 int id, 31 ScrollbarOrientation orientation) 32 : ScrollbarLayerImplBase(tree_impl, id, orientation, false, false), 33 track_ui_resource_id_(0), 34 thumb_ui_resource_id_(0), 35 thumb_thickness_(0), 36 thumb_length_(0), 37 track_start_(0), 38 track_length_(0), 39 vertical_adjust_(0.f), 40 scroll_layer_id_(Layer::INVALID_ID) {} 41 42PaintedScrollbarLayerImpl::~PaintedScrollbarLayerImpl() {} 43 44scoped_ptr<LayerImpl> PaintedScrollbarLayerImpl::CreateLayerImpl( 45 LayerTreeImpl* tree_impl) { 46 return PaintedScrollbarLayerImpl::Create(tree_impl, id(), orientation()) 47 .PassAs<LayerImpl>(); 48} 49 50void PaintedScrollbarLayerImpl::PushPropertiesTo(LayerImpl* layer) { 51 ScrollbarLayerImplBase::PushPropertiesTo(layer); 52 53 PaintedScrollbarLayerImpl* scrollbar_layer = 54 static_cast<PaintedScrollbarLayerImpl*>(layer); 55 56 scrollbar_layer->SetThumbThickness(thumb_thickness_); 57 scrollbar_layer->SetThumbLength(thumb_length_); 58 scrollbar_layer->SetTrackStart(track_start_); 59 scrollbar_layer->SetTrackLength(track_length_); 60 61 scrollbar_layer->set_track_ui_resource_id(track_ui_resource_id_); 62 scrollbar_layer->set_thumb_ui_resource_id(thumb_ui_resource_id_); 63} 64 65bool PaintedScrollbarLayerImpl::WillDraw(DrawMode draw_mode, 66 ResourceProvider* resource_provider) { 67 DCHECK(draw_mode != DRAW_MODE_RESOURCELESS_SOFTWARE); 68 return LayerImpl::WillDraw(draw_mode, resource_provider); 69} 70 71void PaintedScrollbarLayerImpl::AppendQuads( 72 QuadSink* quad_sink, 73 AppendQuadsData* append_quads_data) { 74 bool premultipled_alpha = true; 75 bool flipped = false; 76 gfx::PointF uv_top_left(0.f, 0.f); 77 gfx::PointF uv_bottom_right(1.f, 1.f); 78 gfx::Rect bounds_rect(bounds()); 79 gfx::Rect content_bounds_rect(content_bounds()); 80 81 SharedQuadState* shared_quad_state = quad_sink->CreateSharedQuadState(); 82 PopulateSharedQuadState(shared_quad_state); 83 84 AppendDebugBorderQuad(quad_sink, shared_quad_state, append_quads_data); 85 86 gfx::Rect thumb_quad_rect = ComputeThumbQuadRect(); 87 gfx::Rect visible_thumb_quad_rect = 88 quad_sink->UnoccludedContentRect(thumb_quad_rect, draw_transform()); 89 90 ResourceProvider::ResourceId thumb_resource_id = 91 layer_tree_impl()->ResourceIdForUIResource(thumb_ui_resource_id_); 92 ResourceProvider::ResourceId track_resource_id = 93 layer_tree_impl()->ResourceIdForUIResource(track_ui_resource_id_); 94 95 if (thumb_resource_id && !visible_thumb_quad_rect.IsEmpty()) { 96 gfx::Rect opaque_rect; 97 const float opacity[] = {1.0f, 1.0f, 1.0f, 1.0f}; 98 scoped_ptr<TextureDrawQuad> quad = TextureDrawQuad::Create(); 99 quad->SetNew(shared_quad_state, 100 thumb_quad_rect, 101 opaque_rect, 102 visible_thumb_quad_rect, 103 thumb_resource_id, 104 premultipled_alpha, 105 uv_top_left, 106 uv_bottom_right, 107 SK_ColorTRANSPARENT, 108 opacity, 109 flipped); 110 quad_sink->Append(quad.PassAs<DrawQuad>()); 111 } 112 113 gfx::Rect track_quad_rect = content_bounds_rect; 114 gfx::Rect visible_track_quad_rect = 115 quad_sink->UnoccludedContentRect(track_quad_rect, draw_transform()); 116 if (track_resource_id && !visible_track_quad_rect.IsEmpty()) { 117 gfx::Rect opaque_rect(contents_opaque() ? track_quad_rect : gfx::Rect()); 118 const float opacity[] = {1.0f, 1.0f, 1.0f, 1.0f}; 119 scoped_ptr<TextureDrawQuad> quad = TextureDrawQuad::Create(); 120 quad->SetNew(shared_quad_state, 121 track_quad_rect, 122 opaque_rect, 123 visible_track_quad_rect, 124 track_resource_id, 125 premultipled_alpha, 126 uv_top_left, 127 uv_bottom_right, 128 SK_ColorTRANSPARENT, 129 opacity, 130 flipped); 131 quad_sink->Append(quad.PassAs<DrawQuad>()); 132 } 133} 134 135void PaintedScrollbarLayerImpl::SetThumbThickness(int thumb_thickness) { 136 if (thumb_thickness_ == thumb_thickness) 137 return; 138 thumb_thickness_ = thumb_thickness; 139 NoteLayerPropertyChanged(); 140} 141 142int PaintedScrollbarLayerImpl::ThumbThickness() const { 143 return thumb_thickness_; 144} 145 146void PaintedScrollbarLayerImpl::SetThumbLength(int thumb_length) { 147 if (thumb_length_ == thumb_length) 148 return; 149 thumb_length_ = thumb_length; 150 NoteLayerPropertyChanged(); 151} 152 153int PaintedScrollbarLayerImpl::ThumbLength() const { 154 return thumb_length_; 155} 156 157void PaintedScrollbarLayerImpl::SetTrackStart(int track_start) { 158 if (track_start_ == track_start) 159 return; 160 track_start_ = track_start; 161 NoteLayerPropertyChanged(); 162} 163 164int PaintedScrollbarLayerImpl::TrackStart() const { 165 return track_start_; 166} 167 168void PaintedScrollbarLayerImpl::SetTrackLength(int track_length) { 169 if (track_length_ == track_length) 170 return; 171 track_length_ = track_length; 172 NoteLayerPropertyChanged(); 173} 174 175float PaintedScrollbarLayerImpl::TrackLength() const { 176 return track_length_ + (orientation() == VERTICAL ? vertical_adjust() : 0); 177} 178 179bool PaintedScrollbarLayerImpl::IsThumbResizable() const { 180 return false; 181} 182 183const char* PaintedScrollbarLayerImpl::LayerTypeAsString() const { 184 return "cc::PaintedScrollbarLayerImpl"; 185} 186 187} // namespace cc 188