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