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 18 namespace cc { 19 20 scoped_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 28 PaintedScrollbarLayerImpl::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 42 PaintedScrollbarLayerImpl::~PaintedScrollbarLayerImpl() {} 43 44 scoped_ptr<LayerImpl> PaintedScrollbarLayerImpl::CreateLayerImpl( 45 LayerTreeImpl* tree_impl) { 46 return PaintedScrollbarLayerImpl::Create(tree_impl, id(), orientation()) 47 .PassAs<LayerImpl>(); 48 } 49 50 void 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 65 bool 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 71 void 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( 85 quad_sink, content_bounds(), shared_quad_state, append_quads_data); 86 87 gfx::Rect thumb_quad_rect = ComputeThumbQuadRect(); 88 gfx::Rect visible_thumb_quad_rect = 89 quad_sink->UnoccludedContentRect(thumb_quad_rect, draw_transform()); 90 91 ResourceProvider::ResourceId thumb_resource_id = 92 layer_tree_impl()->ResourceIdForUIResource(thumb_ui_resource_id_); 93 ResourceProvider::ResourceId track_resource_id = 94 layer_tree_impl()->ResourceIdForUIResource(track_ui_resource_id_); 95 96 if (thumb_resource_id && !visible_thumb_quad_rect.IsEmpty()) { 97 gfx::Rect opaque_rect; 98 const float opacity[] = {1.0f, 1.0f, 1.0f, 1.0f}; 99 scoped_ptr<TextureDrawQuad> quad = TextureDrawQuad::Create(); 100 quad->SetNew(shared_quad_state, 101 thumb_quad_rect, 102 opaque_rect, 103 visible_thumb_quad_rect, 104 thumb_resource_id, 105 premultipled_alpha, 106 uv_top_left, 107 uv_bottom_right, 108 SK_ColorTRANSPARENT, 109 opacity, 110 flipped); 111 quad_sink->Append(quad.PassAs<DrawQuad>()); 112 } 113 114 gfx::Rect track_quad_rect = content_bounds_rect; 115 gfx::Rect visible_track_quad_rect = 116 quad_sink->UnoccludedContentRect(track_quad_rect, draw_transform()); 117 if (track_resource_id && !visible_track_quad_rect.IsEmpty()) { 118 gfx::Rect opaque_rect(contents_opaque() ? track_quad_rect : gfx::Rect()); 119 const float opacity[] = {1.0f, 1.0f, 1.0f, 1.0f}; 120 scoped_ptr<TextureDrawQuad> quad = TextureDrawQuad::Create(); 121 quad->SetNew(shared_quad_state, 122 track_quad_rect, 123 opaque_rect, 124 visible_track_quad_rect, 125 track_resource_id, 126 premultipled_alpha, 127 uv_top_left, 128 uv_bottom_right, 129 SK_ColorTRANSPARENT, 130 opacity, 131 flipped); 132 quad_sink->Append(quad.PassAs<DrawQuad>()); 133 } 134 } 135 136 void PaintedScrollbarLayerImpl::SetThumbThickness(int thumb_thickness) { 137 if (thumb_thickness_ == thumb_thickness) 138 return; 139 thumb_thickness_ = thumb_thickness; 140 NoteLayerPropertyChanged(); 141 } 142 143 int PaintedScrollbarLayerImpl::ThumbThickness() const { 144 return thumb_thickness_; 145 } 146 147 void PaintedScrollbarLayerImpl::SetThumbLength(int thumb_length) { 148 if (thumb_length_ == thumb_length) 149 return; 150 thumb_length_ = thumb_length; 151 NoteLayerPropertyChanged(); 152 } 153 154 int PaintedScrollbarLayerImpl::ThumbLength() const { 155 return thumb_length_; 156 } 157 158 void PaintedScrollbarLayerImpl::SetTrackStart(int track_start) { 159 if (track_start_ == track_start) 160 return; 161 track_start_ = track_start; 162 NoteLayerPropertyChanged(); 163 } 164 165 int PaintedScrollbarLayerImpl::TrackStart() const { 166 return track_start_; 167 } 168 169 void PaintedScrollbarLayerImpl::SetTrackLength(int track_length) { 170 if (track_length_ == track_length) 171 return; 172 track_length_ = track_length; 173 NoteLayerPropertyChanged(); 174 } 175 176 float PaintedScrollbarLayerImpl::TrackLength() const { 177 return track_length_ + (orientation() == VERTICAL ? vertical_adjust() : 0); 178 } 179 180 bool PaintedScrollbarLayerImpl::IsThumbResizable() const { 181 return false; 182 } 183 184 const char* PaintedScrollbarLayerImpl::LayerTypeAsString() const { 185 return "cc::PaintedScrollbarLayerImpl"; 186 } 187 188 } // namespace cc 189