Index: chrome/browser/android/compositor/scene_layer/tab_strip_scene_layer.cc |
diff --git a/chrome/browser/android/compositor/scene_layer/tab_strip_scene_layer.cc b/chrome/browser/android/compositor/scene_layer/tab_strip_scene_layer.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3a997a1b68578e5e80759e0b978fb3e4086d0a3c |
--- /dev/null |
+++ b/chrome/browser/android/compositor/scene_layer/tab_strip_scene_layer.cc |
@@ -0,0 +1,192 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chrome/browser/android/compositor/scene_layer/tab_strip_scene_layer.h" |
+ |
+#include "base/android/jni_android.h" |
+#include "chrome/browser/android/compositor/layer/tab_handle_layer.h" |
+#include "chrome/browser/android/compositor/layer_title_cache.h" |
+#include "jni/TabStripSceneLayer_jni.h" |
+#include "ui/android/resources/resource_manager_impl.h" |
+#include "ui/android/resources/ui_resource_android.h" |
+ |
+namespace chrome { |
+namespace android { |
+ |
+TabStripSceneLayer::TabStripSceneLayer(JNIEnv* env, jobject jobj) |
+ : SceneLayer(env, jobj), |
+ background_layer_(cc::SolidColorLayer::Create()), |
+ new_tab_button_(cc::UIResourceLayer::Create()), |
+ model_selector_button_(cc::UIResourceLayer::Create()), |
+ strip_brightness_(1.f), |
+ write_index_(0), |
+ content_tree_(nullptr) { |
+ background_layer_->SetBackgroundColor(SK_ColorBLACK); |
+ background_layer_->SetIsDrawable(true); |
+ new_tab_button_->SetIsDrawable(true); |
+ model_selector_button_->SetIsDrawable(true); |
+ layer()->AddChild(background_layer_); |
+ layer()->AddChild(new_tab_button_); |
+ layer()->AddChild(model_selector_button_); |
+} |
+ |
+TabStripSceneLayer::~TabStripSceneLayer() { |
+} |
+ |
+void TabStripSceneLayer::SetContentTree(JNIEnv* env, |
+ jobject jobj, |
+ jobject jcontent_tree) { |
+ SceneLayer* content_tree = FromJavaObject(env, jcontent_tree); |
+ if (content_tree_ && |
+ (!content_tree_->layer()->parent() || |
+ content_tree_->layer()->parent()->id() != layer()->id())) |
+ content_tree_ = nullptr; |
+ |
+ if (content_tree != content_tree_) { |
+ if (content_tree_) |
+ content_tree_->layer()->RemoveFromParent(); |
+ content_tree_ = content_tree; |
+ if (content_tree) { |
+ layer()->InsertChild(content_tree->layer(), 0); |
+ content_tree->layer()->SetPosition( |
+ gfx::PointF(0, -layer()->position().y())); |
+ } |
+ } |
+} |
+ |
+void TabStripSceneLayer::BeginBuildingFrame(JNIEnv* env, jobject jobj) { |
+ write_index_ = 0; |
+} |
+ |
+void TabStripSceneLayer::FinishBuildingFrame(JNIEnv* env, jobject jobj) { |
+ for (unsigned i = write_index_; i < tab_handle_layers_.size(); ++i) |
+ tab_handle_layers_[i]->layer()->RemoveFromParent(); |
+ |
+ tab_handle_layers_.erase(tab_handle_layers_.begin() + write_index_, |
+ tab_handle_layers_.end()); |
+} |
+ |
+void TabStripSceneLayer::UpdateTabStripLayer(JNIEnv* env, |
+ jobject jobj, |
+ jfloat width, |
+ jfloat height, |
+ jfloat y_offset, |
+ jfloat strip_brightness) { |
+ strip_brightness_ = strip_brightness; |
+ gfx::RectF content(0, y_offset, width, height); |
+ layer()->SetPosition(gfx::PointF(0, y_offset)); |
+ background_layer_->SetBounds(gfx::Size(width, height)); |
+ if (content_tree_) |
+ content_tree_->layer()->SetPosition(gfx::PointF(0, -y_offset)); |
+} |
+ |
+void TabStripSceneLayer::UpdateNewTabButton(JNIEnv* env, |
+ jobject jobj, |
+ jint resource_id, |
+ jfloat x, |
+ jfloat y, |
+ jfloat width, |
+ jfloat height, |
+ jboolean visible, |
+ jobject jresource_manager) { |
+ ui::ResourceManager* resource_manager = |
+ ui::ResourceManagerImpl::FromJavaObject(jresource_manager); |
+ ui::ResourceManager::Resource* button_resource = |
+ resource_manager->GetResource(ui::ANDROID_RESOURCE_TYPE_STATIC, |
+ resource_id); |
+ |
+ new_tab_button_->SetUIResourceId(button_resource->ui_resource->id()); |
+ float left_offset = (width - button_resource->size.width()) / 2; |
+ float top_offset = (height - button_resource->size.height()) / 2; |
+ new_tab_button_->SetPosition(gfx::PointF(x + left_offset, y + top_offset)); |
+ new_tab_button_->SetBounds(button_resource->size); |
+ new_tab_button_->SetHideLayerAndSubtree(!visible); |
+} |
+ |
+void TabStripSceneLayer::UpdateModelSelectorButton(JNIEnv* env, |
+ jobject jobj, |
+ jint resource_id, |
+ jfloat x, |
+ jfloat y, |
+ jfloat width, |
+ jfloat height, |
+ jboolean incognito, |
+ jboolean visible, |
+ jobject jresource_manager) { |
+ ui::ResourceManager* resource_manager = |
+ ui::ResourceManagerImpl::FromJavaObject(jresource_manager); |
+ ui::ResourceManager::Resource* button_resource = |
+ resource_manager->GetResource(ui::ANDROID_RESOURCE_TYPE_STATIC, |
+ resource_id); |
+ |
+ model_selector_button_->SetUIResourceId(button_resource->ui_resource->id()); |
+ float left_offset = (width - button_resource->size.width()) / 2; |
+ float top_offset = (height - button_resource->size.height()) / 2; |
+ model_selector_button_->SetPosition( |
+ gfx::PointF(x + left_offset, y + top_offset)); |
+ model_selector_button_->SetBounds(button_resource->size); |
+ model_selector_button_->SetHideLayerAndSubtree(!visible); |
+} |
+ |
+void TabStripSceneLayer::PutStripTabLayer(JNIEnv* env, |
+ jobject jobj, |
+ jint id, |
+ jint close_resource_id, |
+ jint handle_resource_id, |
+ jboolean foreground, |
+ jboolean close_pressed, |
+ jfloat toolbar_width, |
+ jfloat x, |
+ jfloat y, |
+ jfloat width, |
+ jfloat height, |
+ jfloat content_offset_x, |
+ jfloat close_button_alpha, |
+ jboolean is_loading, |
+ jfloat spinner_rotation, |
+ jfloat border_opacity, |
+ jobject jlayer_title_cache, |
+ jobject jresource_manager) { |
+ LayerTitleCache* layer_title_cache = |
+ LayerTitleCache::FromJavaObject(jlayer_title_cache); |
+ ui::ResourceManager* resource_manager = |
+ ui::ResourceManagerImpl::FromJavaObject(jresource_manager); |
+ scoped_refptr<TabHandleLayer> layer = GetNextLayer(layer_title_cache); |
+ ui::ResourceManager::Resource* tab_handle_resource = |
+ resource_manager->GetResource(ui::ANDROID_RESOURCE_TYPE_STATIC, |
+ handle_resource_id); |
+ ui::ResourceManager::Resource* close_button_resource = |
+ resource_manager->GetResource(ui::ANDROID_RESOURCE_TYPE_STATIC, |
+ close_resource_id); |
+ layer->SetProperties(id, close_button_resource, tab_handle_resource, |
+ foreground, close_pressed, toolbar_width, x, y, width, |
+ height, content_offset_x, close_button_alpha, is_loading, |
+ spinner_rotation, strip_brightness_, border_opacity); |
+} |
+ |
+scoped_refptr<TabHandleLayer> TabStripSceneLayer::GetNextLayer( |
+ LayerTitleCache* layer_title_cache) { |
+ if (write_index_ < tab_handle_layers_.size()) |
+ return tab_handle_layers_[write_index_++]; |
+ |
+ scoped_refptr<TabHandleLayer> layer_tree = |
+ TabHandleLayer::Create(layer_title_cache); |
+ tab_handle_layers_.push_back(layer_tree); |
+ this->layer()->AddChild(layer_tree->layer()); |
+ write_index_++; |
+ return layer_tree; |
+} |
+ |
+static jlong Init(JNIEnv* env, jobject jobj) { |
+ // This will automatically bind to the Java object and pass ownership there. |
+ TabStripSceneLayer* scene_layer = new TabStripSceneLayer(env, jobj); |
+ return reinterpret_cast<intptr_t>(scene_layer); |
+} |
+ |
+bool RegisterTabStripSceneLayer(JNIEnv* env) { |
+ return RegisterNativesImpl(env); |
+} |
+ |
+} // namespace android |
+} // namespace chrome |