| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 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/scrollbar_layer.h" | 5 #include "cc/layers/scrollbar_layer.h" |
| 6 | 6 |
| 7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 8 #include "base/debug/trace_event.h" | 8 #include "base/debug/trace_event.h" |
| 9 #include "cc/layers/scrollbar_layer_impl.h" | 9 #include "cc/layers/scrollbar_layer_impl.h" |
| 10 #include "cc/resources/caching_bitmap_content_layer_updater.h" | 10 #include "cc/resources/caching_bitmap_content_layer_updater.h" |
| (...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 262 | 262 |
| 263 texture_format_ = | 263 texture_format_ = |
| 264 layer_tree_host()->GetRendererCapabilities().best_texture_format; | 264 layer_tree_host()->GetRendererCapabilities().best_texture_format; |
| 265 | 265 |
| 266 if (!back_track_updater_) { | 266 if (!back_track_updater_) { |
| 267 back_track_updater_ = CachingBitmapContentLayerUpdater::Create( | 267 back_track_updater_ = CachingBitmapContentLayerUpdater::Create( |
| 268 ScrollbarBackgroundPainter::Create( | 268 ScrollbarBackgroundPainter::Create( |
| 269 scrollbar_.get(), | 269 scrollbar_.get(), |
| 270 painter_.get(), | 270 painter_.get(), |
| 271 geometry_.get(), | 271 geometry_.get(), |
| 272 WebKit::WebScrollbar::BackTrackPart).PassAs<LayerPainter>()); | 272 WebKit::WebScrollbar::BackTrackPart).PassAs<LayerPainter>(), |
| 273 rendering_stats_instrumentation()); |
| 273 } | 274 } |
| 274 if (!back_track_) { | 275 if (!back_track_) { |
| 275 back_track_ = back_track_updater_->CreateResource( | 276 back_track_ = back_track_updater_->CreateResource( |
| 276 layer_tree_host()->contents_texture_manager()); | 277 layer_tree_host()->contents_texture_manager()); |
| 277 } | 278 } |
| 278 | 279 |
| 279 // Only create two-part track if we think the two parts could be different in | 280 // Only create two-part track if we think the two parts could be different in |
| 280 // appearance. | 281 // appearance. |
| 281 if (scrollbar_->isCustomScrollbar()) { | 282 if (scrollbar_->isCustomScrollbar()) { |
| 282 if (!fore_track_updater_) { | 283 if (!fore_track_updater_) { |
| 283 fore_track_updater_ = CachingBitmapContentLayerUpdater::Create( | 284 fore_track_updater_ = CachingBitmapContentLayerUpdater::Create( |
| 284 ScrollbarBackgroundPainter::Create( | 285 ScrollbarBackgroundPainter::Create( |
| 285 scrollbar_.get(), | 286 scrollbar_.get(), |
| 286 painter_.get(), | 287 painter_.get(), |
| 287 geometry_.get(), | 288 geometry_.get(), |
| 288 WebKit::WebScrollbar::ForwardTrackPart).PassAs<LayerPainter>()); | 289 WebKit::WebScrollbar::ForwardTrackPart).PassAs<LayerPainter>(), |
| 290 rendering_stats_instrumentation()); |
| 289 } | 291 } |
| 290 if (!fore_track_) { | 292 if (!fore_track_) { |
| 291 fore_track_ = fore_track_updater_->CreateResource( | 293 fore_track_ = fore_track_updater_->CreateResource( |
| 292 layer_tree_host()->contents_texture_manager()); | 294 layer_tree_host()->contents_texture_manager()); |
| 293 } | 295 } |
| 294 } | 296 } |
| 295 | 297 |
| 296 if (!thumb_updater_) { | 298 if (!thumb_updater_) { |
| 297 thumb_updater_ = CachingBitmapContentLayerUpdater::Create( | 299 thumb_updater_ = CachingBitmapContentLayerUpdater::Create( |
| 298 ScrollbarThumbPainter::Create(scrollbar_.get(), | 300 ScrollbarThumbPainter::Create(scrollbar_.get(), |
| 299 painter_.get(), | 301 painter_.get(), |
| 300 geometry_.get()).PassAs<LayerPainter>()); | 302 geometry_.get()).PassAs<LayerPainter>(), |
| 303 rendering_stats_instrumentation()); |
| 301 } | 304 } |
| 302 if (!thumb_) { | 305 if (!thumb_) { |
| 303 thumb_ = thumb_updater_->CreateResource( | 306 thumb_ = thumb_updater_->CreateResource( |
| 304 layer_tree_host()->contents_texture_manager()); | 307 layer_tree_host()->contents_texture_manager()); |
| 305 } | 308 } |
| 306 } | 309 } |
| 307 | 310 |
| 308 void ScrollbarLayer::UpdatePart(CachingBitmapContentLayerUpdater* painter, | 311 void ScrollbarLayer::UpdatePart(CachingBitmapContentLayerUpdater* painter, |
| 309 LayerUpdater::Resource* resource, | 312 LayerUpdater::Resource* resource, |
| 310 gfx::Rect rect, | 313 gfx::Rect rect, |
| 311 ResourceUpdateQueue* queue, | 314 ResourceUpdateQueue* queue) { |
| 312 RenderingStats* stats) { | |
| 313 if (layer_tree_host()->settings().solid_color_scrollbars) | 315 if (layer_tree_host()->settings().solid_color_scrollbars) |
| 314 return; | 316 return; |
| 315 | 317 |
| 316 // Skip painting and uploading if there are no invalidations and | 318 // Skip painting and uploading if there are no invalidations and |
| 317 // we already have valid texture data. | 319 // we already have valid texture data. |
| 318 if (resource->texture()->have_backing_texture() && | 320 if (resource->texture()->have_backing_texture() && |
| 319 resource->texture()->size() == rect.size() && | 321 resource->texture()->size() == rect.size() && |
| 320 !is_dirty()) | 322 !is_dirty()) |
| 321 return; | 323 return; |
| 322 | 324 |
| 323 // We should always have enough memory for UI. | 325 // We should always have enough memory for UI. |
| 324 DCHECK(resource->texture()->can_acquire_backing_texture()); | 326 DCHECK(resource->texture()->can_acquire_backing_texture()); |
| 325 if (!resource->texture()->can_acquire_backing_texture()) | 327 if (!resource->texture()->can_acquire_backing_texture()) |
| 326 return; | 328 return; |
| 327 | 329 |
| 328 // Paint and upload the entire part. | 330 // Paint and upload the entire part. |
| 329 gfx::Rect painted_opaque_rect; | 331 gfx::Rect painted_opaque_rect; |
| 330 painter->PrepareToUpdate(rect, | 332 painter->PrepareToUpdate(rect, |
| 331 rect.size(), | 333 rect.size(), |
| 332 contents_scale_x(), | 334 contents_scale_x(), |
| 333 contents_scale_y(), | 335 contents_scale_y(), |
| 334 &painted_opaque_rect, | 336 &painted_opaque_rect); |
| 335 stats); | |
| 336 if (!painter->pixels_did_change() && | 337 if (!painter->pixels_did_change() && |
| 337 resource->texture()->have_backing_texture()) { | 338 resource->texture()->have_backing_texture()) { |
| 338 TRACE_EVENT_INSTANT0("cc", | 339 TRACE_EVENT_INSTANT0("cc", |
| 339 "ScrollbarLayer::UpdatePart no texture upload needed", | 340 "ScrollbarLayer::UpdatePart no texture upload needed", |
| 340 TRACE_EVENT_SCOPE_THREAD); | 341 TRACE_EVENT_SCOPE_THREAD); |
| 341 return; | 342 return; |
| 342 } | 343 } |
| 343 | 344 |
| 344 bool partial_updates_allowed = | 345 bool partial_updates_allowed = |
| 345 layer_tree_host()->settings().max_partial_texture_updates > 0; | 346 layer_tree_host()->settings().max_partial_texture_updates > 0; |
| 346 if (!partial_updates_allowed) | 347 if (!partial_updates_allowed) |
| 347 resource->texture()->ReturnBackingTexture(); | 348 resource->texture()->ReturnBackingTexture(); |
| 348 | 349 |
| 349 gfx::Vector2d dest_offset(0, 0); | 350 gfx::Vector2d dest_offset(0, 0); |
| 350 resource->Update(queue, rect, dest_offset, partial_updates_allowed, stats); | 351 resource->Update(queue, rect, dest_offset, partial_updates_allowed); |
| 351 } | 352 } |
| 352 | 353 |
| 353 gfx::Rect ScrollbarLayer::ScrollbarLayerRectToContentRect( | 354 gfx::Rect ScrollbarLayer::ScrollbarLayerRectToContentRect( |
| 354 gfx::Rect layer_rect) const { | 355 gfx::Rect layer_rect) const { |
| 355 // Don't intersect with the bounds as in LayerRectToContentRect() because | 356 // Don't intersect with the bounds as in LayerRectToContentRect() because |
| 356 // layer_rect here might be in coordinates of the containing layer. | 357 // layer_rect here might be in coordinates of the containing layer. |
| 357 gfx::RectF content_rect = gfx::ScaleRect(layer_rect, | 358 gfx::RectF content_rect = gfx::ScaleRect(layer_rect, |
| 358 contents_scale_y(), | 359 contents_scale_y(), |
| 359 contents_scale_y()); | 360 contents_scale_y()); |
| 360 return gfx::ToEnclosingRect(content_rect); | 361 return gfx::ToEnclosingRect(content_rect); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 387 gfx::Rect thumb_layer_rect = geometry_->thumbRect(scrollbar_.get()); | 388 gfx::Rect thumb_layer_rect = geometry_->thumbRect(scrollbar_.get()); |
| 388 gfx::Size thumb_size = | 389 gfx::Size thumb_size = |
| 389 ScrollbarLayerRectToContentRect(thumb_layer_rect).size(); | 390 ScrollbarLayerRectToContentRect(thumb_layer_rect).size(); |
| 390 thumb_->texture()->SetDimensions(thumb_size, texture_format_); | 391 thumb_->texture()->SetDimensions(thumb_size, texture_format_); |
| 391 thumb_->texture()->set_request_priority( | 392 thumb_->texture()->set_request_priority( |
| 392 PriorityCalculator::UIPriority(draws_to_root)); | 393 PriorityCalculator::UIPriority(draws_to_root)); |
| 393 } | 394 } |
| 394 } | 395 } |
| 395 | 396 |
| 396 void ScrollbarLayer::Update(ResourceUpdateQueue* queue, | 397 void ScrollbarLayer::Update(ResourceUpdateQueue* queue, |
| 397 const OcclusionTracker* occlusion, | 398 const OcclusionTracker* occlusion) { |
| 398 RenderingStats* stats) { | 399 ContentsScalingLayer::Update(queue, occlusion); |
| 399 ContentsScalingLayer::Update(queue, occlusion, stats); | |
| 400 | 400 |
| 401 dirty_rect_.Union(update_rect_); | 401 dirty_rect_.Union(update_rect_); |
| 402 if (content_bounds().IsEmpty()) | 402 if (content_bounds().IsEmpty()) |
| 403 return; | 403 return; |
| 404 if (visible_content_rect().IsEmpty()) | 404 if (visible_content_rect().IsEmpty()) |
| 405 return; | 405 return; |
| 406 | 406 |
| 407 CreateUpdaterIfNeeded(); | 407 CreateUpdaterIfNeeded(); |
| 408 | 408 |
| 409 gfx::Rect content_rect = ScrollbarLayerRectToContentRect( | 409 gfx::Rect content_rect = ScrollbarLayerRectToContentRect( |
| 410 gfx::Rect(scrollbar_->location(), bounds())); | 410 gfx::Rect(scrollbar_->location(), bounds())); |
| 411 UpdatePart(back_track_updater_.get(), | 411 UpdatePart(back_track_updater_.get(), |
| 412 back_track_.get(), | 412 back_track_.get(), |
| 413 content_rect, | 413 content_rect, |
| 414 queue, | 414 queue); |
| 415 stats); | |
| 416 if (fore_track_ && fore_track_updater_) { | 415 if (fore_track_ && fore_track_updater_) { |
| 417 UpdatePart(fore_track_updater_.get(), | 416 UpdatePart(fore_track_updater_.get(), |
| 418 fore_track_.get(), | 417 fore_track_.get(), |
| 419 content_rect, | 418 content_rect, |
| 420 queue, | 419 queue); |
| 421 stats); | |
| 422 } | 420 } |
| 423 | 421 |
| 424 // Consider the thumb to be at the origin when painting. | 422 // Consider the thumb to be at the origin when painting. |
| 425 gfx::Rect thumb_rect = geometry_->thumbRect(scrollbar_.get()); | 423 gfx::Rect thumb_rect = geometry_->thumbRect(scrollbar_.get()); |
| 426 thumb_size_ = thumb_rect.size(); | 424 thumb_size_ = thumb_rect.size(); |
| 427 gfx::Rect origin_thumb_rect = | 425 gfx::Rect origin_thumb_rect = |
| 428 ScrollbarLayerRectToContentRect(gfx::Rect(thumb_rect.size())); | 426 ScrollbarLayerRectToContentRect(gfx::Rect(thumb_rect.size())); |
| 429 if (!origin_thumb_rect.IsEmpty()) { | 427 if (!origin_thumb_rect.IsEmpty()) { |
| 430 UpdatePart(thumb_updater_.get(), | 428 UpdatePart(thumb_updater_.get(), |
| 431 thumb_.get(), | 429 thumb_.get(), |
| 432 origin_thumb_rect, | 430 origin_thumb_rect, |
| 433 queue, | 431 queue); |
| 434 stats); | |
| 435 } | 432 } |
| 436 | 433 |
| 437 dirty_rect_ = gfx::RectF(); | 434 dirty_rect_ = gfx::RectF(); |
| 438 } | 435 } |
| 439 | 436 |
| 440 } // namespace cc | 437 } // namespace cc |
| OLD | NEW |