| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "chrome/browser/android/compositor/layer/contextual_search_layer.h" | 5 #include "chrome/browser/android/compositor/layer/contextual_search_layer.h" |
| 6 | 6 |
| 7 #include "cc/layers/layer.h" | 7 #include "cc/layers/layer.h" |
| 8 #include "cc/layers/nine_patch_layer.h" | 8 #include "cc/layers/nine_patch_layer.h" |
| 9 #include "cc/layers/solid_color_layer.h" | 9 #include "cc/layers/solid_color_layer.h" |
| 10 #include "cc/layers/ui_resource_layer.h" | 10 #include "cc/layers/ui_resource_layer.h" |
| (...skipping 20 matching lines...) Expand all Loading... |
| 31 | 31 |
| 32 namespace chrome { | 32 namespace chrome { |
| 33 namespace android { | 33 namespace android { |
| 34 | 34 |
| 35 // static | 35 // static |
| 36 scoped_refptr<ContextualSearchLayer> ContextualSearchLayer::Create( | 36 scoped_refptr<ContextualSearchLayer> ContextualSearchLayer::Create( |
| 37 ui::ResourceManager* resource_manager) { | 37 ui::ResourceManager* resource_manager) { |
| 38 return make_scoped_refptr(new ContextualSearchLayer(resource_manager)); | 38 return make_scoped_refptr(new ContextualSearchLayer(resource_manager)); |
| 39 } | 39 } |
| 40 | 40 |
| 41 scoped_refptr<cc::Layer> ContextualSearchLayer::GetIconLayer() { | |
| 42 scoped_refptr<cc::Layer> icon = nullptr; | |
| 43 | |
| 44 // Thumbnail. | |
| 45 if (thumbnail_visible_) { | |
| 46 if (thumbnail_layer_->parent() != layer_) | |
| 47 layer_->AddChild(thumbnail_layer_); | |
| 48 | |
| 49 icon = thumbnail_layer_; | |
| 50 } else if (thumbnail_layer_->parent()) { | |
| 51 thumbnail_layer_->RemoveFromParent(); | |
| 52 } | |
| 53 | |
| 54 // Search Provider Icon Sprite (Animated). | |
| 55 if (search_provider_icon_sprite_visible_) { | |
| 56 if (search_provider_icon_sprite_->layer()->parent() != layer_) | |
| 57 layer_->AddChild(search_provider_icon_sprite_->layer().get()); | |
| 58 | |
| 59 search_provider_icon_sprite_->DrawSpriteFrame( | |
| 60 resource_manager_, | |
| 61 panel_icon_resource_id_, | |
| 62 search_provider_icon_sprite_metadata_resource_id_, | |
| 63 search_provider_icon_sprite_completion_percentage_); | |
| 64 icon = search_provider_icon_sprite_->layer(); | |
| 65 } else if (search_provider_icon_sprite_->layer().get() && | |
| 66 search_provider_icon_sprite_->layer()->parent()) { | |
| 67 search_provider_icon_sprite_->layer()->RemoveFromParent(); | |
| 68 } | |
| 69 | |
| 70 return icon; | |
| 71 } | |
| 72 | |
| 73 void ContextualSearchLayer::SetProperties( | 41 void ContextualSearchLayer::SetProperties( |
| 74 int panel_shadow_resource_id, | 42 int panel_shadow_resource_id, |
| 75 int search_context_resource_id, | 43 int search_context_resource_id, |
| 76 int search_term_resource_id, | 44 int search_term_resource_id, |
| 77 int search_caption_resource_id, | 45 int search_caption_resource_id, |
| 78 int search_bar_shadow_resource_id, | 46 int search_bar_shadow_resource_id, |
| 79 int panel_icon_resource_id, | 47 int panel_icon_resource_id, |
| 80 int search_provider_icon_sprite_metadata_resource_id, | 48 int search_provider_icon_sprite_metadata_resource_id, |
| 81 int arrow_up_resource_id, | 49 int arrow_up_resource_id, |
| 82 int close_icon_resource_id, | 50 int close_icon_resource_id, |
| (...skipping 23 matching lines...) Expand all Loading... |
| 106 float search_term_opacity, | 74 float search_term_opacity, |
| 107 float search_caption_animation_percentage, | 75 float search_caption_animation_percentage, |
| 108 bool search_caption_visible, | 76 bool search_caption_visible, |
| 109 bool search_bar_border_visible, | 77 bool search_bar_border_visible, |
| 110 float search_bar_border_height, | 78 float search_bar_border_height, |
| 111 bool search_bar_shadow_visible, | 79 bool search_bar_shadow_visible, |
| 112 float search_bar_shadow_opacity, | 80 float search_bar_shadow_opacity, |
| 113 bool search_provider_icon_sprite_visible, | 81 bool search_provider_icon_sprite_visible, |
| 114 float search_provider_icon_sprite_completion_percentage, | 82 float search_provider_icon_sprite_completion_percentage, |
| 115 bool thumbnail_visible, | 83 bool thumbnail_visible, |
| 84 float thumbnail_visibility_percentage, |
| 116 int thumbnail_size, | 85 int thumbnail_size, |
| 117 float arrow_icon_opacity, | 86 float arrow_icon_opacity, |
| 118 float arrow_icon_rotation, | 87 float arrow_icon_rotation, |
| 119 float close_icon_opacity, | 88 float close_icon_opacity, |
| 120 bool progress_bar_visible, | 89 bool progress_bar_visible, |
| 121 float progress_bar_height, | 90 float progress_bar_height, |
| 122 float progress_bar_opacity, | 91 float progress_bar_opacity, |
| 123 int progress_bar_completion) { | 92 int progress_bar_completion) { |
| 124 | 93 |
| 125 search_provider_icon_sprite_visible_ = search_provider_icon_sprite_visible; | |
| 126 search_provider_icon_sprite_metadata_resource_id_ = | |
| 127 search_provider_icon_sprite_metadata_resource_id; | |
| 128 search_provider_icon_sprite_completion_percentage_ = | |
| 129 search_provider_icon_sprite_completion_percentage; | |
| 130 | |
| 131 thumbnail_visible_ = thumbnail_visible; | |
| 132 thumbnail_size_ = thumbnail_size; | |
| 133 | |
| 134 // Grabs the dynamic Search Context resource. | 94 // Grabs the dynamic Search Context resource. |
| 135 ui::ResourceManager::Resource* search_context_resource = | 95 ui::ResourceManager::Resource* search_context_resource = |
| 136 resource_manager_->GetResource(ui::ANDROID_RESOURCE_TYPE_DYNAMIC, | 96 resource_manager_->GetResource(ui::ANDROID_RESOURCE_TYPE_DYNAMIC, |
| 137 search_context_resource_id); | 97 search_context_resource_id); |
| 138 | 98 |
| 139 // Round values to avoid pixel gap between layers. | 99 // Round values to avoid pixel gap between layers. |
| 140 search_bar_height = floor(search_bar_height); | 100 search_bar_height = floor(search_bar_height); |
| 141 | 101 |
| 142 float search_bar_top = search_peek_promo_height; | 102 float search_bar_top = search_peek_promo_height; |
| 143 float search_bar_bottom = search_bar_top + search_bar_height; | 103 float search_bar_bottom = search_bar_top + search_bar_height; |
| (...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 462 progress_bar_->SetPosition(gfx::PointF(0.f, progress_bar_y)); | 422 progress_bar_->SetPosition(gfx::PointF(0.f, progress_bar_y)); |
| 463 progress_bar_->SetOpacity(progress_bar_opacity); | 423 progress_bar_->SetOpacity(progress_bar_opacity); |
| 464 } else { | 424 } else { |
| 465 // Removes Progress Bar and its Background from the Layer Tree. | 425 // Removes Progress Bar and its Background from the Layer Tree. |
| 466 if (progress_bar_background_.get() && progress_bar_background_->parent()) | 426 if (progress_bar_background_.get() && progress_bar_background_->parent()) |
| 467 progress_bar_background_->RemoveFromParent(); | 427 progress_bar_background_->RemoveFromParent(); |
| 468 | 428 |
| 469 if (progress_bar_.get() && progress_bar_->parent()) | 429 if (progress_bar_.get() && progress_bar_->parent()) |
| 470 progress_bar_->RemoveFromParent(); | 430 progress_bar_->RemoveFromParent(); |
| 471 } | 431 } |
| 432 |
| 433 // --------------------------------------------------------------------------- |
| 434 // Icon Layer |
| 435 // --------------------------------------------------------------------------- |
| 436 thumbnail_size_ = thumbnail_size; |
| 437 SetupIconLayer(search_provider_icon_sprite_visible, |
| 438 search_provider_icon_sprite_metadata_resource_id, |
| 439 search_provider_icon_sprite_completion_percentage, |
| 440 thumbnail_visible, |
| 441 thumbnail_visibility_percentage); |
| 442 } |
| 443 |
| 444 scoped_refptr<cc::Layer> ContextualSearchLayer::GetIconLayer() { |
| 445 return icon_layer_; |
| 446 } |
| 447 |
| 448 void ContextualSearchLayer::SetupIconLayer( |
| 449 bool search_provider_icon_sprite_visible, |
| 450 int search_provider_icon_sprite_metadata_resource_id, |
| 451 float search_provider_icon_sprite_completion_percentage, |
| 452 bool thumbnail_visible, |
| 453 float thumbnail_visibility_percentage) { |
| 454 icon_layer_->SetBounds(gfx::Size(thumbnail_size_, thumbnail_size_)); |
| 455 icon_layer_->SetMasksToBounds(true); |
| 456 |
| 457 // Thumbnail |
| 458 if (thumbnail_visible) { |
| 459 if (thumbnail_layer_->parent() != icon_layer_) |
| 460 icon_layer_->AddChild(thumbnail_layer_); |
| 461 |
| 462 thumbnail_layer_->SetOpacity(thumbnail_visibility_percentage); |
| 463 |
| 464 // When animating, the thumbnail and icon sprite slide through |
| 465 // |icon_layer_|. This effect is achieved by changing the y-offset |
| 466 // for each child layer. |
| 467 // If the thumbnail has a height less than |thumbnail_size_|, it will have |
| 468 // a top margin that needs to be accounted for while running the |
| 469 // animation. The final |thumbnail_y_offset| should be equal to |
| 470 // |thumbnail_top_margin_|. |
| 471 float thumbnail_y_offset = |
| 472 (thumbnail_size_ * (1.f - thumbnail_visibility_percentage)) |
| 473 + thumbnail_top_margin_; |
| 474 thumbnail_layer_->SetPosition( |
| 475 gfx::PointF(thumbnail_side_margin_, thumbnail_y_offset)); |
| 476 } else if (thumbnail_layer_->parent()) { |
| 477 thumbnail_layer_->RemoveFromParent(); |
| 478 } |
| 479 |
| 480 // Search Provider Icon Sprite |
| 481 if (search_provider_icon_sprite_visible) { |
| 482 if (search_provider_icon_sprite_->layer()->parent() != icon_layer_) |
| 483 icon_layer_->AddChild(search_provider_icon_sprite_->layer().get()); |
| 484 |
| 485 search_provider_icon_sprite_->DrawSpriteFrame( |
| 486 resource_manager_, |
| 487 panel_icon_resource_id_, |
| 488 search_provider_icon_sprite_metadata_resource_id, |
| 489 search_provider_icon_sprite_completion_percentage); |
| 490 |
| 491 search_provider_icon_sprite_->layer()->SetOpacity( |
| 492 1.f - thumbnail_visibility_percentage); |
| 493 |
| 494 float icon_y_offset = |
| 495 -(thumbnail_size_ * thumbnail_visibility_percentage); |
| 496 search_provider_icon_sprite_->layer()->SetPosition( |
| 497 gfx::PointF(0.f, icon_y_offset)); |
| 498 |
| 499 } else if (search_provider_icon_sprite_->layer().get() && |
| 500 search_provider_icon_sprite_->layer()->parent()) { |
| 501 search_provider_icon_sprite_->layer()->RemoveFromParent(); |
| 502 } |
| 472 } | 503 } |
| 473 | 504 |
| 474 void ContextualSearchLayer::SetThumbnail(const SkBitmap* thumbnail) { | 505 void ContextualSearchLayer::SetThumbnail(const SkBitmap* thumbnail) { |
| 475 // Determine the scaled thumbnail width and height. If both the height and | 506 // Determine the scaled thumbnail width and height. If both the height and |
| 476 // width of |thumbnail| are larger than |thumbnail_size_|, the thumbnail will | 507 // width of |thumbnail| are larger than |thumbnail_size_|, the thumbnail will |
| 477 // be scaled down by a call to Layer::SetBounds() below. | 508 // be scaled down by a call to Layer::SetBounds() below. |
| 478 int min_dimension = std::min(thumbnail->width(), thumbnail->height()); | 509 int min_dimension = std::min(thumbnail->width(), thumbnail->height()); |
| 479 int scaled_thumbnail_width = thumbnail->width(); | 510 int scaled_thumbnail_width = thumbnail->width(); |
| 480 int scaled_thumbnail_height = thumbnail->height(); | 511 int scaled_thumbnail_height = thumbnail->height(); |
| 481 if (min_dimension > thumbnail_size_) { | 512 if (min_dimension > thumbnail_size_) { |
| (...skipping 21 matching lines...) Expand all Loading... |
| 503 } else if (scaled_thumbnail_height > thumbnail_size_) { | 534 } else if (scaled_thumbnail_height > thumbnail_size_) { |
| 504 // Crop an even amount on the top and bottom of the thumbnail. | 535 // Crop an even amount on the top and bottom of the thumbnail. |
| 505 float top_left_y_px = (scaled_thumbnail_height - thumbnail_size_) / 2.f; | 536 float top_left_y_px = (scaled_thumbnail_height - thumbnail_size_) / 2.f; |
| 506 float bottom_right_y_px = top_left_y_px + thumbnail_size_; | 537 float bottom_right_y_px = top_left_y_px + thumbnail_size_; |
| 507 | 538 |
| 508 top_left_y = top_left_y_px / scaled_thumbnail_height; | 539 top_left_y = top_left_y_px / scaled_thumbnail_height; |
| 509 bottom_right_y = bottom_right_y_px / scaled_thumbnail_height; | 540 bottom_right_y = bottom_right_y_px / scaled_thumbnail_height; |
| 510 } | 541 } |
| 511 | 542 |
| 512 // If the original |thumbnail| height or width is smaller than | 543 // If the original |thumbnail| height or width is smaller than |
| 513 // |thumbnail_size_| determine the x, y offset needed to center | 544 // |thumbnail_size_| determine the side and top margins needed to center |
| 514 // the thumbnail. | 545 // the thumbnail. |
| 515 float x_pos = 0; | 546 thumbnail_side_margin_ = 0; |
| 516 float y_pos = 0; | 547 thumbnail_top_margin_ = 0; |
| 517 | 548 |
| 518 if (scaled_thumbnail_width < thumbnail_size_) { | 549 if (scaled_thumbnail_width < thumbnail_size_) { |
| 519 x_pos = (thumbnail_size_ - scaled_thumbnail_width) / 2.f; | 550 thumbnail_side_margin_ = (thumbnail_size_ - scaled_thumbnail_width) / 2.f; |
| 520 } | 551 } |
| 521 | 552 |
| 522 if (scaled_thumbnail_height < thumbnail_size_) { | 553 if (scaled_thumbnail_height < thumbnail_size_) { |
| 523 y_pos = (thumbnail_size_ - scaled_thumbnail_height) / 2.f; | 554 thumbnail_top_margin_ = (thumbnail_size_ - scaled_thumbnail_height) / 2.f; |
| 524 } | 555 } |
| 525 | 556 |
| 526 // Determine the layer bounds. This will down scale the thumbnail if | 557 // Determine the layer bounds. This will down scale the thumbnail if |
| 527 // necessary and ensure it is displayed at |thumbnail_size_|. If | 558 // necessary and ensure it is displayed at |thumbnail_size_|. If |
| 528 // either the original |thumbnail| height or width is smaller than | 559 // either the original |thumbnail| height or width is smaller than |
| 529 // |thumbnail_size_|, the thumbnail will not be scaled. | 560 // |thumbnail_size_|, the thumbnail will not be scaled. |
| 530 int layer_width = std::min(thumbnail_size_, scaled_thumbnail_width); | 561 int layer_width = std::min(thumbnail_size_, scaled_thumbnail_width); |
| 531 int layer_height = std::min(thumbnail_size_, scaled_thumbnail_height); | 562 int layer_height = std::min(thumbnail_size_, scaled_thumbnail_height); |
| 532 | 563 |
| 533 // UIResourceLayer requires an immutable copy of the input |thumbnail|. | 564 // UIResourceLayer requires an immutable copy of the input |thumbnail|. |
| 534 SkBitmap thumbnail_copy; | 565 SkBitmap thumbnail_copy; |
| 535 if (thumbnail->isImmutable()) { | 566 if (thumbnail->isImmutable()) { |
| 536 thumbnail_copy = *thumbnail; | 567 thumbnail_copy = *thumbnail; |
| 537 } else { | 568 } else { |
| 538 thumbnail->copyTo(&thumbnail_copy); | 569 thumbnail->copyTo(&thumbnail_copy); |
| 539 thumbnail_copy.setImmutable(); | 570 thumbnail_copy.setImmutable(); |
| 540 } | 571 } |
| 541 | 572 |
| 542 thumbnail_layer_->SetBitmap(thumbnail_copy); | 573 thumbnail_layer_->SetBitmap(thumbnail_copy); |
| 543 thumbnail_layer_->SetBounds(gfx::Size(layer_width, layer_height)); | 574 thumbnail_layer_->SetBounds(gfx::Size(layer_width, layer_height)); |
| 544 thumbnail_layer_->SetPosition(gfx::PointF(x_pos, y_pos)); | 575 thumbnail_layer_->SetPosition( |
| 576 gfx::PointF(thumbnail_side_margin_, thumbnail_top_margin_)); |
| 545 thumbnail_layer_->SetUV(gfx::PointF(top_left_x, top_left_y), | 577 thumbnail_layer_->SetUV(gfx::PointF(top_left_x, top_left_y), |
| 546 gfx::PointF(bottom_right_x, bottom_right_y)); | 578 gfx::PointF(bottom_right_x, bottom_right_y)); |
| 547 } | 579 } |
| 548 | 580 |
| 549 ContextualSearchLayer::ContextualSearchLayer( | 581 ContextualSearchLayer::ContextualSearchLayer( |
| 550 ui::ResourceManager* resource_manager) | 582 ui::ResourceManager* resource_manager) |
| 551 : OverlayPanelLayer(resource_manager), | 583 : OverlayPanelLayer(resource_manager), |
| 552 search_context_(cc::UIResourceLayer::Create()), | 584 search_context_(cc::UIResourceLayer::Create()), |
| 585 icon_layer_(cc::Layer::Create()), |
| 553 search_provider_icon_sprite_(CrushedSpriteLayer::Create()), | 586 search_provider_icon_sprite_(CrushedSpriteLayer::Create()), |
| 554 thumbnail_layer_(cc::UIResourceLayer::Create()), | 587 thumbnail_layer_(cc::UIResourceLayer::Create()), |
| 555 arrow_icon_(cc::UIResourceLayer::Create()), | 588 arrow_icon_(cc::UIResourceLayer::Create()), |
| 556 search_promo_(cc::UIResourceLayer::Create()), | 589 search_promo_(cc::UIResourceLayer::Create()), |
| 557 search_promo_container_(cc::SolidColorLayer::Create()), | 590 search_promo_container_(cc::SolidColorLayer::Create()), |
| 558 peek_promo_container_(cc::SolidColorLayer::Create()), | 591 peek_promo_container_(cc::SolidColorLayer::Create()), |
| 559 peek_promo_ripple_(cc::NinePatchLayer::Create()), | 592 peek_promo_ripple_(cc::NinePatchLayer::Create()), |
| 560 peek_promo_text_(cc::UIResourceLayer::Create()), | 593 peek_promo_text_(cc::UIResourceLayer::Create()), |
| 561 progress_bar_(cc::NinePatchLayer::Create()), | 594 progress_bar_(cc::NinePatchLayer::Create()), |
| 562 progress_bar_background_(cc::NinePatchLayer::Create()), | 595 progress_bar_background_(cc::NinePatchLayer::Create()), |
| (...skipping 25 matching lines...) Expand all Loading... |
| 588 search_promo_->SetIsDrawable(true); | 621 search_promo_->SetIsDrawable(true); |
| 589 | 622 |
| 590 // Progress Bar Background | 623 // Progress Bar Background |
| 591 progress_bar_background_->SetIsDrawable(true); | 624 progress_bar_background_->SetIsDrawable(true); |
| 592 progress_bar_background_->SetFillCenter(true); | 625 progress_bar_background_->SetFillCenter(true); |
| 593 | 626 |
| 594 // Progress Bar | 627 // Progress Bar |
| 595 progress_bar_->SetIsDrawable(true); | 628 progress_bar_->SetIsDrawable(true); |
| 596 progress_bar_->SetFillCenter(true); | 629 progress_bar_->SetFillCenter(true); |
| 597 | 630 |
| 631 // Icon |
| 632 icon_layer_->SetIsDrawable(true); |
| 633 layer_->AddChild(icon_layer_); |
| 634 |
| 598 // Thumbnail | 635 // Thumbnail |
| 599 thumbnail_layer_->SetIsDrawable(true); | 636 thumbnail_layer_->SetIsDrawable(true); |
| 600 } | 637 } |
| 601 | 638 |
| 602 ContextualSearchLayer::~ContextualSearchLayer() { | 639 ContextualSearchLayer::~ContextualSearchLayer() { |
| 603 } | 640 } |
| 604 | 641 |
| 605 } // namespace android | 642 } // namespace android |
| 606 } // namespace chrome | 643 } // namespace chrome |
| OLD | NEW |