Index: chrome/browser/android/compositor/layer/contextual_search_layer.cc |
diff --git a/chrome/browser/android/compositor/layer/contextual_search_layer.cc b/chrome/browser/android/compositor/layer/contextual_search_layer.cc |
index 15f2b6f977cdf5e5ac241682d169b6cf434eee3c..f392da3b9da82aa8c87ac7892c371640e8b49df1 100644 |
--- a/chrome/browser/android/compositor/layer/contextual_search_layer.cc |
+++ b/chrome/browser/android/compositor/layer/contextual_search_layer.cc |
@@ -8,6 +8,7 @@ |
#include "cc/layers/nine_patch_layer.h" |
#include "cc/layers/solid_color_layer.h" |
#include "cc/layers/ui_resource_layer.h" |
+#include "chrome/browser/android/compositor/layer/crushed_sprite_layer.h" |
#include "content/public/browser/android/compositor.h" |
#include "content/public/browser/android/content_view_core.h" |
#include "third_party/skia/include/core/SkColor.h" |
@@ -60,6 +61,10 @@ void ContextualSearchLayer::SetProperties( |
float search_bar_border_height, |
bool search_bar_shadow_visible, |
float search_bar_shadow_opacity, |
+ bool search_provider_icon_sprite_visible, |
+ float search_provider_icon_sprite_size, |
+ std::vector<int> search_provider_icon_sprite_rects, |
+ bool search_provider_icon_sprite_paint_previous_frames, |
float arrow_icon_opacity, |
float arrow_icon_rotation, |
bool close_icon_visible, |
@@ -81,12 +86,12 @@ void ContextualSearchLayer::SetProperties( |
ui::ResourceManager::Resource* panel_shadow_resource = |
resource_manager_->GetResource(ui::ANDROID_RESOURCE_TYPE_STATIC, |
panel_shadow_resource_id); |
- ui::ResourceManager::Resource* search_provider_icon_resource = |
+ ui::ResourceManager::Resource* search_provider_icon_sprite_resource = |
resource_manager_->GetResource(ui::ANDROID_RESOURCE_TYPE_STATIC, |
search_provider_icon_resource_id); |
DCHECK(panel_shadow_resource); |
- DCHECK(search_provider_icon_resource); |
+ DCHECK(search_provider_icon_sprite_resource); |
// Round values to avoid pixel gap between layers. |
search_bar_height = floor(search_bar_height); |
@@ -148,25 +153,56 @@ void ContextualSearchLayer::SetProperties( |
// --------------------------------------------------------------------------- |
// Search Provider Icon |
// --------------------------------------------------------------------------- |
- // Positions the Search Provider Icon at the start of the Search Bar. |
- float search_provider_icon_left; |
- if (is_rtl) { |
- search_provider_icon_left = search_panel_width - |
- search_provider_icon_resource->size.width() - search_bar_margin_side; |
- } else { |
- search_provider_icon_left = search_bar_margin_side; |
- } |
+ if (search_provider_icon_sprite_visible) { |
+ if (search_provider_icon_sprite_->layer()->parent() != layer_) { |
+ layer_->AddChild(search_provider_icon_sprite_->layer()); |
+ } |
- // Centers the Search Provider Icon vertically in the Search Bar. |
- float search_provider_icon_top = |
- search_bar_height / 2 - |
- search_provider_icon_resource->size.height() / 2; |
+ // Positions the Search Provider Icon at the start of the Search Bar. |
+ float icon_x; |
+ if (is_rtl) { |
+ icon_x = search_panel_width - search_provider_icon_sprite_size - |
+ search_bar_margin_side; |
+ } else { |
+ icon_x = search_bar_margin_side; |
+ } |
- search_provider_icon_->SetUIResourceId( |
- search_provider_icon_resource->ui_resource->id()); |
- search_provider_icon_->SetBounds(search_provider_icon_resource->size); |
- search_provider_icon_->SetPosition( |
- gfx::PointF(search_provider_icon_left, search_provider_icon_top)); |
+ // Centers the Search Provider Icon vertically in the Search Bar. |
+ float icon_y = search_bar_height / 2 - search_provider_icon_sprite_size / 2; |
+ search_provider_icon_sprite_->layer()->SetBounds( |
+ gfx::Size(search_provider_icon_sprite_size, |
+ search_provider_icon_sprite_size)); |
+ search_provider_icon_sprite_->layer()->SetPosition( |
+ gfx::PointF(icon_x, icon_y)); |
+ |
+ // Create source and destination gfx::Rect's for each rectangle in |
+ // |search_provider_icon_sprite_rects|. Each rectangle consists of 6 values: |
+ // i: destination x i+1: destination y i+2: source x i+3: source y |
+ // i+4: width i+5: height |
+ std::vector<std::pair<gfx::Rect, gfx::Rect>> rects; |
+ for (size_t i = 0; i < search_provider_icon_sprite_rects.size();) { |
+ gfx::Rect sprite_rect_destination(search_provider_icon_sprite_rects[i], |
+ search_provider_icon_sprite_rects[i+1], |
+ search_provider_icon_sprite_rects[i+4], |
+ search_provider_icon_sprite_rects[i+5]); |
+ gfx::Rect sprite_rect_source(search_provider_icon_sprite_rects[i+2], |
+ search_provider_icon_sprite_rects[i+3], |
+ search_provider_icon_sprite_rects[i+4], |
+ search_provider_icon_sprite_rects[i+5]); |
+ rects.push_back(std::pair<gfx::Rect, gfx::Rect>(sprite_rect_source, |
+ sprite_rect_destination)); |
+ i += 6; |
+ } |
+ |
+ search_provider_icon_sprite_->UpdateCrushedSprite( |
+ search_provider_icon_sprite_resource->ui_resource->GetSkBitmap(), rects, |
+ search_provider_icon_sprite_paint_previous_frames); |
+ } else { |
+ if (search_provider_icon_sprite_.get() && |
+ search_provider_icon_sprite_->layer()->parent()) { |
+ search_provider_icon_sprite_->layer()->RemoveFromParent(); |
+ } |
+ } |
// --------------------------------------------------------------------------- |
// Arrow Icon |
@@ -413,8 +449,7 @@ ContextualSearchLayer::ContextualSearchLayer( |
cc::UIResourceLayer::Create(content::Compositor::LayerSettings())), |
search_bar_shadow_( |
cc::UIResourceLayer::Create(content::Compositor::LayerSettings())), |
- search_provider_icon_( |
- cc::UIResourceLayer::Create(content::Compositor::LayerSettings())), |
+ search_provider_icon_sprite_(CrushedSpriteLayer::Create()), |
arrow_icon_( |
cc::UIResourceLayer::Create(content::Compositor::LayerSettings())), |
close_icon_( |
@@ -451,8 +486,7 @@ ContextualSearchLayer::ContextualSearchLayer( |
layer_->AddChild(search_term_); |
// Search Provider Icon |
- search_provider_icon_->SetIsDrawable(true); |
- layer_->AddChild(search_provider_icon_); |
+ search_provider_icon_sprite_->layer()->SetIsDrawable(true); |
// Arrow Icon |
arrow_icon_->SetIsDrawable(true); |