Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(199)

Side by Side Diff: cc/layers/painted_scrollbar_layer.cc

Issue 18341009: Refactor cc scrollbar layers to separate solid-color vs desktop. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix Windows compile. Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « cc/layers/painted_scrollbar_layer.h ('k') | cc/layers/painted_scrollbar_layer_impl.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/layers/painted_scrollbar_layer.h" 5 #include "cc/layers/painted_scrollbar_layer.h"
6 6
7 #include "base/auto_reset.h" 7 #include "base/auto_reset.h"
8 #include "base/basictypes.h" 8 #include "base/basictypes.h"
9 #include "base/debug/trace_event.h" 9 #include "base/debug/trace_event.h"
10 #include "cc/layers/painted_scrollbar_layer_impl.h" 10 #include "cc/layers/painted_scrollbar_layer_impl.h"
(...skipping 19 matching lines...) Expand all
30 scoped_ptr<Scrollbar> scrollbar, 30 scoped_ptr<Scrollbar> scrollbar,
31 int scroll_layer_id) { 31 int scroll_layer_id) {
32 return make_scoped_refptr( 32 return make_scoped_refptr(
33 new PaintedScrollbarLayer(scrollbar.Pass(), scroll_layer_id)); 33 new PaintedScrollbarLayer(scrollbar.Pass(), scroll_layer_id));
34 } 34 }
35 35
36 PaintedScrollbarLayer::PaintedScrollbarLayer( 36 PaintedScrollbarLayer::PaintedScrollbarLayer(
37 scoped_ptr<Scrollbar> scrollbar, 37 scoped_ptr<Scrollbar> scrollbar,
38 int scroll_layer_id) 38 int scroll_layer_id)
39 : scrollbar_(scrollbar.Pass()), 39 : scrollbar_(scrollbar.Pass()),
40 scroll_layer_id_(scroll_layer_id) { 40 scroll_layer_id_(scroll_layer_id),
41 thumb_thickness_(scrollbar_->ThumbThickness()),
42 thumb_length_(scrollbar_->ThumbLength()) {
41 if (!scrollbar_->IsOverlay()) 43 if (!scrollbar_->IsOverlay())
42 SetShouldScrollOnMainThread(true); 44 SetShouldScrollOnMainThread(true);
43 } 45 }
44 46
45 PaintedScrollbarLayer::~PaintedScrollbarLayer() {} 47 PaintedScrollbarLayer::~PaintedScrollbarLayer() {}
46 48
49 int PaintedScrollbarLayer::ScrollLayerId() const {
50 return scroll_layer_id_;
51 }
52
47 void PaintedScrollbarLayer::SetScrollLayerId(int id) { 53 void PaintedScrollbarLayer::SetScrollLayerId(int id) {
48 if (id == scroll_layer_id_) 54 if (id == scroll_layer_id_)
49 return; 55 return;
50 56
51 scroll_layer_id_ = id; 57 scroll_layer_id_ = id;
52 SetNeedsFullTreeSync(); 58 SetNeedsFullTreeSync();
53 } 59 }
54 60
55 bool PaintedScrollbarLayer::OpacityCanAnimateOnImplThread() const { 61 bool PaintedScrollbarLayer::OpacityCanAnimateOnImplThread() const {
56 return scrollbar_->IsOverlay(); 62 return scrollbar_->IsOverlay();
57 } 63 }
58 64
59 ScrollbarOrientation PaintedScrollbarLayer::Orientation() const { 65 ScrollbarOrientation PaintedScrollbarLayer::orientation() const {
60 return scrollbar_->Orientation(); 66 return scrollbar_->Orientation();
61 } 67 }
62 68
63 int PaintedScrollbarLayer::MaxTextureSize() { 69 int PaintedScrollbarLayer::MaxTextureSize() {
64 DCHECK(layer_tree_host()); 70 DCHECK(layer_tree_host());
65 return layer_tree_host()->GetRendererCapabilities().max_texture_size; 71 return layer_tree_host()->GetRendererCapabilities().max_texture_size;
66 } 72 }
67 73
68 float PaintedScrollbarLayer::ClampScaleToMaxTextureSize(float scale) { 74 float PaintedScrollbarLayer::ClampScaleToMaxTextureSize(float scale) {
69 if (layer_tree_host()->settings().solid_color_scrollbars)
70 return scale;
71
72 // If the scaled content_bounds() is bigger than the max texture size of the 75 // If the scaled content_bounds() is bigger than the max texture size of the
73 // device, we need to clamp it by rescaling, since content_bounds() is used 76 // device, we need to clamp it by rescaling, since content_bounds() is used
74 // below to set the texture size. 77 // below to set the texture size.
75 gfx::Size scaled_bounds = ComputeContentBoundsForScale(scale, scale); 78 gfx::Size scaled_bounds = ComputeContentBoundsForScale(scale, scale);
76 if (scaled_bounds.width() > MaxTextureSize() || 79 if (scaled_bounds.width() > MaxTextureSize() ||
77 scaled_bounds.height() > MaxTextureSize()) { 80 scaled_bounds.height() > MaxTextureSize()) {
78 if (scaled_bounds.width() > scaled_bounds.height()) 81 if (scaled_bounds.width() > scaled_bounds.height())
79 return (MaxTextureSize() - 1) / static_cast<float>(bounds().width()); 82 return (MaxTextureSize() - 1) / static_cast<float>(bounds().width());
80 else 83 else
81 return (MaxTextureSize() - 1) / static_cast<float>(bounds().height()); 84 return (MaxTextureSize() - 1) / static_cast<float>(bounds().height());
(...skipping 18 matching lines...) Expand all
100 contents_scale_y, 103 contents_scale_y,
101 content_bounds); 104 content_bounds);
102 } 105 }
103 106
104 void PaintedScrollbarLayer::PushPropertiesTo(LayerImpl* layer) { 107 void PaintedScrollbarLayer::PushPropertiesTo(LayerImpl* layer) {
105 ContentsScalingLayer::PushPropertiesTo(layer); 108 ContentsScalingLayer::PushPropertiesTo(layer);
106 109
107 PaintedScrollbarLayerImpl* scrollbar_layer = 110 PaintedScrollbarLayerImpl* scrollbar_layer =
108 static_cast<PaintedScrollbarLayerImpl*>(layer); 111 static_cast<PaintedScrollbarLayerImpl*>(layer);
109 112
110 if (layer_tree_host() && 113 scrollbar_layer->SetThumbThickness(thumb_thickness_);
111 layer_tree_host()->settings().solid_color_scrollbars) {
112 int thickness_override =
113 layer_tree_host()->settings().solid_color_scrollbar_thickness_dip;
114 if (thickness_override != -1) {
115 scrollbar_layer->SetThumbThickness(thickness_override);
116 } else {
117 if (Orientation() == HORIZONTAL)
118 scrollbar_layer->SetThumbThickness(bounds().height());
119 else
120 scrollbar_layer->SetThumbThickness(bounds().width());
121 }
122 } else {
123 scrollbar_layer->SetThumbThickness(thumb_thickness_);
124 }
125 scrollbar_layer->SetThumbLength(thumb_length_); 114 scrollbar_layer->SetThumbLength(thumb_length_);
126 if (Orientation() == HORIZONTAL) { 115 if (orientation() == HORIZONTAL) {
127 scrollbar_layer->SetTrackStart( 116 scrollbar_layer->SetTrackStart(
128 track_rect_.x() - location_.x()); 117 track_rect_.x() - location_.x());
129 scrollbar_layer->SetTrackLength(track_rect_.width()); 118 scrollbar_layer->SetTrackLength(track_rect_.width());
130 } else { 119 } else {
131 scrollbar_layer->SetTrackStart( 120 scrollbar_layer->SetTrackStart(
132 track_rect_.y() - location_.y()); 121 track_rect_.y() - location_.y());
133 scrollbar_layer->SetTrackLength(track_rect_.height()); 122 scrollbar_layer->SetTrackLength(track_rect_.height());
134 } 123 }
135 124
136 if (track_resource_.get()) 125 if (track_resource_.get())
137 scrollbar_layer->set_track_ui_resource_id(track_resource_->id()); 126 scrollbar_layer->set_track_ui_resource_id(track_resource_->id());
138 if (thumb_resource_.get()) 127 if (thumb_resource_.get())
139 scrollbar_layer->set_thumb_ui_resource_id(thumb_resource_->id()); 128 scrollbar_layer->set_thumb_ui_resource_id(thumb_resource_->id());
140 129
141 scrollbar_layer->set_is_overlay_scrollbar(scrollbar_->IsOverlay()); 130 scrollbar_layer->set_is_overlay_scrollbar(scrollbar_->IsOverlay());
142 131
143 // PaintedScrollbarLayer must push properties every frame. crbug.com/259095 132 // PaintedScrollbarLayer must push properties every frame. crbug.com/259095
144 needs_push_properties_ = true; 133 needs_push_properties_ = true;
145 } 134 }
146 135
147 PaintedScrollbarLayer* PaintedScrollbarLayer::ToScrollbarLayer() { 136 ScrollbarLayerInterface* PaintedScrollbarLayer::ToScrollbarLayer() {
148 return this; 137 return this;
149 } 138 }
150 139
151 void PaintedScrollbarLayer::SetLayerTreeHost(LayerTreeHost* host) { 140 void PaintedScrollbarLayer::SetLayerTreeHost(LayerTreeHost* host) {
152 // When the LTH is set to null or has changed, then this layer should remove 141 // When the LTH is set to null or has changed, then this layer should remove
153 // all of its associated resources. 142 // all of its associated resources.
154 if (!host || host != layer_tree_host()) { 143 if (!host || host != layer_tree_host()) {
155 track_resource_.reset(); 144 track_resource_.reset();
156 thumb_resource_.reset(); 145 thumb_resource_.reset();
157 } 146 }
158 147
159 ContentsScalingLayer::SetLayerTreeHost(host); 148 ContentsScalingLayer::SetLayerTreeHost(host);
160 } 149 }
161 150
162 gfx::Rect PaintedScrollbarLayer::ScrollbarLayerRectToContentRect( 151 gfx::Rect PaintedScrollbarLayer::ScrollbarLayerRectToContentRect(
163 gfx::Rect layer_rect) const { 152 gfx::Rect layer_rect) const {
164 // Don't intersect with the bounds as in LayerRectToContentRect() because 153 // Don't intersect with the bounds as in LayerRectToContentRect() because
165 // layer_rect here might be in coordinates of the containing layer. 154 // layer_rect here might be in coordinates of the containing layer.
166 gfx::Rect expanded_rect = gfx::ScaleToEnclosingRect( 155 gfx::Rect expanded_rect = gfx::ScaleToEnclosingRect(
167 layer_rect, contents_scale_y(), contents_scale_y()); 156 layer_rect, contents_scale_y(), contents_scale_y());
168 // We should never return a rect bigger than the content_bounds(). 157 // We should never return a rect bigger than the content_bounds().
169 gfx::Size clamped_size = expanded_rect.size(); 158 gfx::Size clamped_size = expanded_rect.size();
170 clamped_size.SetToMin(content_bounds()); 159 clamped_size.SetToMin(content_bounds());
171 expanded_rect.set_size(clamped_size); 160 expanded_rect.set_size(clamped_size);
172 return expanded_rect; 161 return expanded_rect;
173 } 162 }
174 163
175 gfx::Rect PaintedScrollbarLayer::OriginThumbRect() const { 164 gfx::Rect PaintedScrollbarLayer::OriginThumbRect() const {
176 gfx::Size thumb_size; 165 gfx::Size thumb_size;
177 if (Orientation() == HORIZONTAL) { 166 if (orientation() == HORIZONTAL) {
178 thumb_size = 167 thumb_size =
179 gfx::Size(scrollbar_->ThumbLength(), scrollbar_->ThumbThickness()); 168 gfx::Size(scrollbar_->ThumbLength(), scrollbar_->ThumbThickness());
180 } else { 169 } else {
181 thumb_size = 170 thumb_size =
182 gfx::Size(scrollbar_->ThumbThickness(), scrollbar_->ThumbLength()); 171 gfx::Size(scrollbar_->ThumbThickness(), scrollbar_->ThumbLength());
183 } 172 }
184 return ScrollbarLayerRectToContentRect(gfx::Rect(thumb_size)); 173 return ScrollbarLayerRectToContentRect(gfx::Rect(thumb_size));
185 } 174 }
186 175
187 void PaintedScrollbarLayer::UpdateThumbAndTrackGeometry() { 176 void PaintedScrollbarLayer::UpdateThumbAndTrackGeometry() {
188 track_rect_ = scrollbar_->TrackRect(); 177 track_rect_ = scrollbar_->TrackRect();
189 location_ = scrollbar_->Location(); 178 location_ = scrollbar_->Location();
190 if (scrollbar_->HasThumb()) { 179 if (scrollbar_->HasThumb()) {
191 thumb_thickness_ = scrollbar_->ThumbThickness(); 180 thumb_thickness_ = scrollbar_->ThumbThickness();
192 thumb_length_ = scrollbar_->ThumbLength(); 181 thumb_length_ = scrollbar_->ThumbLength();
193 } 182 }
194 } 183 }
195 184
196 bool PaintedScrollbarLayer::Update(ResourceUpdateQueue* queue, 185 bool PaintedScrollbarLayer::Update(ResourceUpdateQueue* queue,
197 const OcclusionTracker* occlusion) { 186 const OcclusionTracker* occlusion) {
198 UpdateThumbAndTrackGeometry(); 187 UpdateThumbAndTrackGeometry();
199 188
200 gfx::Rect scaled_track_rect = ScrollbarLayerRectToContentRect( 189 gfx::Rect scaled_track_rect = ScrollbarLayerRectToContentRect(
201 gfx::Rect(location_, bounds())); 190 gfx::Rect(location_, bounds()));
202 191
203 if (layer_tree_host()->settings().solid_color_scrollbars || 192 if (track_rect_.IsEmpty() || scaled_track_rect.IsEmpty())
204 track_rect_.IsEmpty() || scaled_track_rect.IsEmpty())
205 return false; 193 return false;
206 194
207 { 195 {
208 base::AutoReset<bool> ignore_set_needs_commit(&ignore_set_needs_commit_, 196 base::AutoReset<bool> ignore_set_needs_commit(&ignore_set_needs_commit_,
209 true); 197 true);
210 ContentsScalingLayer::Update(queue, occlusion); 198 ContentsScalingLayer::Update(queue, occlusion);
211 } 199 }
212 200
213 track_resource_ = ScopedUIResource::Create( 201 track_resource_ = ScopedUIResource::Create(
214 layer_tree_host(), RasterizeScrollbarPart(scaled_track_rect, TRACK)); 202 layer_tree_host(), RasterizeScrollbarPart(scaled_track_rect, TRACK));
215 gfx::Rect thumb_rect = OriginThumbRect(); 203 gfx::Rect thumb_rect = OriginThumbRect();
216 204
217 if (scrollbar_->HasThumb() && !thumb_rect.IsEmpty()) { 205 if (scrollbar_->HasThumb() && !thumb_rect.IsEmpty()) {
218 thumb_resource_ = ScopedUIResource::Create( 206 thumb_resource_ = ScopedUIResource::Create(
219 layer_tree_host(), RasterizeScrollbarPart(thumb_rect, THUMB)); 207 layer_tree_host(), RasterizeScrollbarPart(thumb_rect, THUMB));
220 } 208 }
221 209
222 return true; 210 return true;
223 } 211 }
224 212
225 scoped_refptr<UIResourceBitmap> PaintedScrollbarLayer::RasterizeScrollbarPart( 213 scoped_refptr<UIResourceBitmap> PaintedScrollbarLayer::RasterizeScrollbarPart(
226 gfx::Rect rect, 214 gfx::Rect rect,
227 ScrollbarPart part) { 215 ScrollbarPart part) {
228 DCHECK(!layer_tree_host()->settings().solid_color_scrollbars);
229 DCHECK(!rect.size().IsEmpty()); 216 DCHECK(!rect.size().IsEmpty());
230 217
231 scoped_refptr<UIResourceBitmap> bitmap = 218 scoped_refptr<UIResourceBitmap> bitmap =
232 UIResourceBitmap::Create(new uint8_t[rect.width() * rect.height() * 4], 219 UIResourceBitmap::Create(new uint8_t[rect.width() * rect.height() * 4],
233 UIResourceBitmap::RGBA8, 220 UIResourceBitmap::RGBA8,
234 rect.size()); 221 rect.size());
235 222
236 SkBitmap skbitmap; 223 SkBitmap skbitmap;
237 skbitmap.setConfig(SkBitmap::kARGB_8888_Config, rect.width(), rect.height()); 224 skbitmap.setConfig(SkBitmap::kARGB_8888_Config, rect.width(), rect.height());
238 skbitmap.setPixels(bitmap->GetPixels()); 225 skbitmap.setPixels(bitmap->GetPixels());
(...skipping 11 matching lines...) Expand all
250 paint.setXfermodeMode(SkXfermode::kClear_Mode); 237 paint.setXfermodeMode(SkXfermode::kClear_Mode);
251 skcanvas.drawRect(layer_skrect, paint); 238 skcanvas.drawRect(layer_skrect, paint);
252 skcanvas.clipRect(layer_skrect); 239 skcanvas.clipRect(layer_skrect);
253 240
254 scrollbar_->PaintPart(&skcanvas, part, layer_rect); 241 scrollbar_->PaintPart(&skcanvas, part, layer_rect);
255 242
256 return bitmap; 243 return bitmap;
257 } 244 }
258 245
259 } // namespace cc 246 } // namespace cc
OLDNEW
« no previous file with comments | « cc/layers/painted_scrollbar_layer.h ('k') | cc/layers/painted_scrollbar_layer_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698