OLD | NEW |
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 <algorithm> |
| 8 |
7 #include "base/auto_reset.h" | 9 #include "base/auto_reset.h" |
8 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
9 #include "base/trace_event/trace_event.h" | 11 #include "base/trace_event/trace_event.h" |
| 12 #include "cc/base/math_util.h" |
10 #include "cc/layers/painted_scrollbar_layer_impl.h" | 13 #include "cc/layers/painted_scrollbar_layer_impl.h" |
11 #include "cc/resources/ui_resource_bitmap.h" | 14 #include "cc/resources/ui_resource_bitmap.h" |
12 #include "cc/trees/layer_tree_host.h" | 15 #include "cc/trees/layer_tree_host.h" |
13 #include "cc/trees/layer_tree_impl.h" | 16 #include "cc/trees/layer_tree_impl.h" |
14 #include "skia/ext/platform_canvas.h" | 17 #include "skia/ext/platform_canvas.h" |
15 #include "skia/ext/refptr.h" | 18 #include "skia/ext/refptr.h" |
16 #include "third_party/skia/include/core/SkBitmap.h" | 19 #include "third_party/skia/include/core/SkBitmap.h" |
17 #include "third_party/skia/include/core/SkCanvas.h" | 20 #include "third_party/skia/include/core/SkCanvas.h" |
18 #include "third_party/skia/include/core/SkSize.h" | 21 #include "third_party/skia/include/core/SkSize.h" |
| 22 #include "ui/gfx/geometry/size_conversions.h" |
19 #include "ui/gfx/skia_util.h" | 23 #include "ui/gfx/skia_util.h" |
20 | 24 |
21 namespace cc { | 25 namespace cc { |
22 | 26 |
23 scoped_ptr<LayerImpl> PaintedScrollbarLayer::CreateLayerImpl( | 27 scoped_ptr<LayerImpl> PaintedScrollbarLayer::CreateLayerImpl( |
24 LayerTreeImpl* tree_impl) { | 28 LayerTreeImpl* tree_impl) { |
25 return PaintedScrollbarLayerImpl::Create( | 29 return PaintedScrollbarLayerImpl::Create( |
26 tree_impl, id(), scrollbar_->Orientation()); | 30 tree_impl, id(), scrollbar_->Orientation()); |
27 } | 31 } |
28 | 32 |
29 scoped_refptr<PaintedScrollbarLayer> PaintedScrollbarLayer::Create( | 33 scoped_refptr<PaintedScrollbarLayer> PaintedScrollbarLayer::Create( |
30 scoped_ptr<Scrollbar> scrollbar, | 34 scoped_ptr<Scrollbar> scrollbar, |
31 int scroll_layer_id) { | 35 int scroll_layer_id) { |
32 return make_scoped_refptr( | 36 return make_scoped_refptr( |
33 new PaintedScrollbarLayer(scrollbar.Pass(), scroll_layer_id)); | 37 new PaintedScrollbarLayer(scrollbar.Pass(), scroll_layer_id)); |
34 } | 38 } |
35 | 39 |
36 PaintedScrollbarLayer::PaintedScrollbarLayer(scoped_ptr<Scrollbar> scrollbar, | 40 PaintedScrollbarLayer::PaintedScrollbarLayer(scoped_ptr<Scrollbar> scrollbar, |
37 int scroll_layer_id) | 41 int scroll_layer_id) |
38 : scrollbar_(scrollbar.Pass()), | 42 : scrollbar_(scrollbar.Pass()), |
39 scroll_layer_id_(scroll_layer_id), | 43 scroll_layer_id_(scroll_layer_id), |
40 clip_layer_id_(Layer::INVALID_ID), | 44 clip_layer_id_(Layer::INVALID_ID), |
| 45 internal_contents_scale_(0.f), |
41 thumb_thickness_(scrollbar_->ThumbThickness()), | 46 thumb_thickness_(scrollbar_->ThumbThickness()), |
42 thumb_length_(scrollbar_->ThumbLength()), | 47 thumb_length_(scrollbar_->ThumbLength()), |
43 is_overlay_(scrollbar_->IsOverlay()), | 48 is_overlay_(scrollbar_->IsOverlay()), |
44 has_thumb_(scrollbar_->HasThumb()) { | 49 has_thumb_(scrollbar_->HasThumb()) { |
45 if (!scrollbar_->IsOverlay()) | 50 if (!scrollbar_->IsOverlay()) |
46 SetShouldScrollOnMainThread(true); | 51 SetShouldScrollOnMainThread(true); |
47 } | 52 } |
48 | 53 |
49 PaintedScrollbarLayer::~PaintedScrollbarLayer() {} | 54 PaintedScrollbarLayer::~PaintedScrollbarLayer() {} |
50 | 55 |
(...skipping 24 matching lines...) Expand all Loading... |
75 ScrollbarOrientation PaintedScrollbarLayer::orientation() const { | 80 ScrollbarOrientation PaintedScrollbarLayer::orientation() const { |
76 return scrollbar_->Orientation(); | 81 return scrollbar_->Orientation(); |
77 } | 82 } |
78 | 83 |
79 int PaintedScrollbarLayer::MaxTextureSize() { | 84 int PaintedScrollbarLayer::MaxTextureSize() { |
80 DCHECK(layer_tree_host()); | 85 DCHECK(layer_tree_host()); |
81 return layer_tree_host()->GetRendererCapabilities().max_texture_size; | 86 return layer_tree_host()->GetRendererCapabilities().max_texture_size; |
82 } | 87 } |
83 | 88 |
84 float PaintedScrollbarLayer::ClampScaleToMaxTextureSize(float scale) { | 89 float PaintedScrollbarLayer::ClampScaleToMaxTextureSize(float scale) { |
85 // If the scaled content_bounds() is bigger than the max texture size of the | 90 // If the scaled bounds() is bigger than the max texture size of the |
86 // device, we need to clamp it by rescaling, since content_bounds() is used | 91 // device, we need to clamp it by rescaling, since this is used |
87 // below to set the texture size. | 92 // below to set the texture size. |
88 gfx::Size scaled_bounds = ComputeContentBoundsForScale(scale, scale); | 93 gfx::Size scaled_bounds = gfx::ToCeiledSize(gfx::ScaleSize(bounds(), scale)); |
89 if (scaled_bounds.width() > MaxTextureSize() || | 94 if (scaled_bounds.width() > MaxTextureSize() || |
90 scaled_bounds.height() > MaxTextureSize()) { | 95 scaled_bounds.height() > MaxTextureSize()) { |
91 if (scaled_bounds.width() > scaled_bounds.height()) | 96 if (scaled_bounds.width() > scaled_bounds.height()) |
92 return (MaxTextureSize() - 1) / static_cast<float>(bounds().width()); | 97 return (MaxTextureSize() - 1) / static_cast<float>(bounds().width()); |
93 else | 98 else |
94 return (MaxTextureSize() - 1) / static_cast<float>(bounds().height()); | 99 return (MaxTextureSize() - 1) / static_cast<float>(bounds().height()); |
95 } | 100 } |
96 return scale; | 101 return scale; |
97 } | 102 } |
98 | 103 |
99 void PaintedScrollbarLayer::CalculateContentsScale( | |
100 float ideal_contents_scale, | |
101 float* contents_scale_x, | |
102 float* contents_scale_y, | |
103 gfx::Size* content_bounds) { | |
104 ContentsScalingLayer::CalculateContentsScale( | |
105 ClampScaleToMaxTextureSize(ideal_contents_scale), | |
106 contents_scale_x, | |
107 contents_scale_y, | |
108 content_bounds); | |
109 } | |
110 | |
111 void PaintedScrollbarLayer::PushPropertiesTo(LayerImpl* layer) { | 104 void PaintedScrollbarLayer::PushPropertiesTo(LayerImpl* layer) { |
112 ContentsScalingLayer::PushPropertiesTo(layer); | 105 Layer::PushPropertiesTo(layer); |
113 | 106 |
114 PushScrollClipPropertiesTo(layer); | 107 PushScrollClipPropertiesTo(layer); |
115 | 108 |
116 PaintedScrollbarLayerImpl* scrollbar_layer = | 109 PaintedScrollbarLayerImpl* scrollbar_layer = |
117 static_cast<PaintedScrollbarLayerImpl*>(layer); | 110 static_cast<PaintedScrollbarLayerImpl*>(layer); |
118 | 111 |
| 112 scrollbar_layer->set_internal_contents_scale_and_bounds( |
| 113 internal_contents_scale_, internal_content_bounds_); |
| 114 |
119 scrollbar_layer->SetThumbThickness(thumb_thickness_); | 115 scrollbar_layer->SetThumbThickness(thumb_thickness_); |
120 scrollbar_layer->SetThumbLength(thumb_length_); | 116 scrollbar_layer->SetThumbLength(thumb_length_); |
121 if (orientation() == HORIZONTAL) { | 117 if (orientation() == HORIZONTAL) { |
122 scrollbar_layer->SetTrackStart( | 118 scrollbar_layer->SetTrackStart( |
123 track_rect_.x() - location_.x()); | 119 track_rect_.x() - location_.x()); |
124 scrollbar_layer->SetTrackLength(track_rect_.width()); | 120 scrollbar_layer->SetTrackLength(track_rect_.width()); |
125 } else { | 121 } else { |
126 scrollbar_layer->SetTrackStart( | 122 scrollbar_layer->SetTrackStart( |
127 track_rect_.y() - location_.y()); | 123 track_rect_.y() - location_.y()); |
128 scrollbar_layer->SetTrackLength(track_rect_.height()); | 124 scrollbar_layer->SetTrackLength(track_rect_.height()); |
(...skipping 24 matching lines...) Expand all Loading... |
153 } | 149 } |
154 | 150 |
155 void PaintedScrollbarLayer::SetLayerTreeHost(LayerTreeHost* host) { | 151 void PaintedScrollbarLayer::SetLayerTreeHost(LayerTreeHost* host) { |
156 // When the LTH is set to null or has changed, then this layer should remove | 152 // When the LTH is set to null or has changed, then this layer should remove |
157 // all of its associated resources. | 153 // all of its associated resources. |
158 if (!host || host != layer_tree_host()) { | 154 if (!host || host != layer_tree_host()) { |
159 track_resource_ = nullptr; | 155 track_resource_ = nullptr; |
160 thumb_resource_ = nullptr; | 156 thumb_resource_ = nullptr; |
161 } | 157 } |
162 | 158 |
163 ContentsScalingLayer::SetLayerTreeHost(host); | 159 Layer::SetLayerTreeHost(host); |
164 } | 160 } |
165 | 161 |
166 gfx::Rect PaintedScrollbarLayer::ScrollbarLayerRectToContentRect( | 162 gfx::Rect PaintedScrollbarLayer::ScrollbarLayerRectToContentRect( |
167 const gfx::Rect& layer_rect) const { | 163 const gfx::Rect& layer_rect) const { |
168 // Don't intersect with the bounds as in LayerRectToContentRect() because | 164 // Don't intersect with the bounds as in LayerRectToContentRect() because |
169 // layer_rect here might be in coordinates of the containing layer. | 165 // layer_rect here might be in coordinates of the containing layer. |
170 gfx::Rect expanded_rect = gfx::ScaleToEnclosingRect( | 166 gfx::Rect expanded_rect = gfx::ScaleToEnclosingRect( |
171 layer_rect, contents_scale_x(), contents_scale_y()); | 167 layer_rect, internal_contents_scale_, internal_contents_scale_); |
172 // We should never return a rect bigger than the content_bounds(). | 168 // We should never return a rect bigger than the content bounds. |
173 gfx::Size clamped_size = expanded_rect.size(); | 169 gfx::Size clamped_size = expanded_rect.size(); |
174 clamped_size.SetToMin(content_bounds()); | 170 clamped_size.SetToMin(internal_content_bounds_); |
175 expanded_rect.set_size(clamped_size); | 171 expanded_rect.set_size(clamped_size); |
176 return expanded_rect; | 172 return expanded_rect; |
177 } | 173 } |
178 | 174 |
179 gfx::Rect PaintedScrollbarLayer::OriginThumbRect() const { | 175 gfx::Rect PaintedScrollbarLayer::OriginThumbRect() const { |
180 gfx::Size thumb_size; | 176 gfx::Size thumb_size; |
181 if (orientation() == HORIZONTAL) { | 177 if (orientation() == HORIZONTAL) { |
182 thumb_size = | 178 thumb_size = |
183 gfx::Size(scrollbar_->ThumbLength(), scrollbar_->ThumbThickness()); | 179 gfx::Size(scrollbar_->ThumbLength(), scrollbar_->ThumbThickness()); |
184 } else { | 180 } else { |
(...skipping 10 matching lines...) Expand all Loading... |
195 UpdateProperty(scrollbar_->HasThumb(), &has_thumb_); | 191 UpdateProperty(scrollbar_->HasThumb(), &has_thumb_); |
196 if (has_thumb_) { | 192 if (has_thumb_) { |
197 UpdateProperty(scrollbar_->ThumbThickness(), &thumb_thickness_); | 193 UpdateProperty(scrollbar_->ThumbThickness(), &thumb_thickness_); |
198 UpdateProperty(scrollbar_->ThumbLength(), &thumb_length_); | 194 UpdateProperty(scrollbar_->ThumbLength(), &thumb_length_); |
199 } else { | 195 } else { |
200 UpdateProperty(0, &thumb_thickness_); | 196 UpdateProperty(0, &thumb_thickness_); |
201 UpdateProperty(0, &thumb_length_); | 197 UpdateProperty(0, &thumb_length_); |
202 } | 198 } |
203 } | 199 } |
204 | 200 |
| 201 void PaintedScrollbarLayer::UpdateInternalContentScale() { |
| 202 float scale = layer_tree_host()->device_scale_factor(); |
| 203 if (layer_tree_host() |
| 204 ->settings() |
| 205 .layer_transforms_should_scale_layer_contents) { |
| 206 gfx::Vector2dF transform_scales = |
| 207 MathUtil::ComputeTransform2dScaleComponents(draw_transform(), scale); |
| 208 scale = std::max(transform_scales.x(), transform_scales.y()); |
| 209 } |
| 210 bool changed = false; |
| 211 changed |= UpdateProperty(ClampScaleToMaxTextureSize(scale), |
| 212 &internal_contents_scale_); |
| 213 changed |= UpdateProperty( |
| 214 gfx::ToCeiledSize(gfx::ScaleSize(bounds(), internal_contents_scale_)), |
| 215 &internal_content_bounds_); |
| 216 if (changed) { |
| 217 // If the content scale or bounds change, repaint. |
| 218 SetNeedsDisplay(); |
| 219 } |
| 220 } |
| 221 |
205 bool PaintedScrollbarLayer::Update(ResourceUpdateQueue* queue, | 222 bool PaintedScrollbarLayer::Update(ResourceUpdateQueue* queue, |
206 const OcclusionTracker<Layer>* occlusion) { | 223 const OcclusionTracker<Layer>* occlusion) { |
| 224 { |
| 225 base::AutoReset<bool> ignore_set_needs_commit(&ignore_set_needs_commit_, |
| 226 true); |
| 227 Layer::Update(queue, occlusion); |
| 228 UpdateInternalContentScale(); |
| 229 } |
| 230 |
207 UpdateThumbAndTrackGeometry(); | 231 UpdateThumbAndTrackGeometry(); |
208 | 232 |
209 gfx::Rect track_layer_rect = gfx::Rect(location_, bounds()); | 233 gfx::Rect track_layer_rect = gfx::Rect(location_, bounds()); |
210 gfx::Rect scaled_track_rect = ScrollbarLayerRectToContentRect( | 234 gfx::Rect scaled_track_rect = ScrollbarLayerRectToContentRect( |
211 track_layer_rect); | 235 track_layer_rect); |
212 | 236 |
213 bool updated = false; | 237 bool updated = false; |
214 | 238 |
215 if (track_rect_.IsEmpty() || scaled_track_rect.IsEmpty()) { | 239 if (track_rect_.IsEmpty() || scaled_track_rect.IsEmpty()) { |
216 if (track_resource_) { | 240 if (track_resource_) { |
217 track_resource_ = nullptr; | 241 track_resource_ = nullptr; |
218 thumb_resource_ = nullptr; | 242 thumb_resource_ = nullptr; |
219 SetNeedsPushProperties(); | 243 SetNeedsPushProperties(); |
220 updated = true; | 244 updated = true; |
221 } | 245 } |
222 return updated; | 246 return updated; |
223 } | 247 } |
224 | 248 |
225 if (!has_thumb_ && thumb_resource_) { | 249 if (!has_thumb_ && thumb_resource_) { |
226 thumb_resource_ = nullptr; | 250 thumb_resource_ = nullptr; |
227 SetNeedsPushProperties(); | 251 SetNeedsPushProperties(); |
228 } | 252 updated = true; |
229 | |
230 { | |
231 base::AutoReset<bool> ignore_set_needs_commit(&ignore_set_needs_commit_, | |
232 true); | |
233 ContentsScalingLayer::Update(queue, occlusion); | |
234 } | 253 } |
235 | 254 |
236 if (update_rect_.IsEmpty() && track_resource_) | 255 if (update_rect_.IsEmpty() && track_resource_) |
237 return updated; | 256 return updated; |
238 | 257 |
239 track_resource_ = ScopedUIResource::Create( | 258 track_resource_ = ScopedUIResource::Create( |
240 layer_tree_host(), | 259 layer_tree_host(), |
241 RasterizeScrollbarPart(track_layer_rect, scaled_track_rect, TRACK)); | 260 RasterizeScrollbarPart(track_layer_rect, scaled_track_rect, TRACK)); |
242 | 261 |
243 gfx::Rect thumb_layer_rect = OriginThumbRect(); | 262 gfx::Rect thumb_layer_rect = OriginThumbRect(); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
285 | 304 |
286 scrollbar_->PaintPart(&skcanvas, part, layer_rect); | 305 scrollbar_->PaintPart(&skcanvas, part, layer_rect); |
287 // Make sure that the pixels are no longer mutable to unavoid unnecessary | 306 // Make sure that the pixels are no longer mutable to unavoid unnecessary |
288 // allocation and copying. | 307 // allocation and copying. |
289 skbitmap.setImmutable(); | 308 skbitmap.setImmutable(); |
290 | 309 |
291 return UIResourceBitmap(skbitmap); | 310 return UIResourceBitmap(skbitmap); |
292 } | 311 } |
293 | 312 |
294 } // namespace cc | 313 } // namespace cc |
OLD | NEW |