14e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 24e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 34e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// found in the LICENSE file. 44e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 54e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/layers/ui_resource_layer.h" 64e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 74e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/layers/ui_resource_layer_impl.h" 84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/resources/prioritized_resource.h" 94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/resources/resource_update.h" 104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/resources/resource_update_queue.h" 114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/resources/scoped_ui_resource.h" 124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/resources/ui_resource_bitmap.h" 134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/trees/layer_tree_host.h" 144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace cc { 164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace { 194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class ScopedUIResourceHolder : public UIResourceLayer::UIResourceHolder { 214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public: 224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) static scoped_ptr<ScopedUIResourceHolder> Create(LayerTreeHost* host, 234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const SkBitmap& skbitmap) { 244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return make_scoped_ptr(new ScopedUIResourceHolder(host, skbitmap)); 254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual UIResourceId id() OVERRIDE { return resource_->id(); } 274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private: 294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ScopedUIResourceHolder(LayerTreeHost* host, const SkBitmap& skbitmap) { 304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_ = ScopedUIResource::Create(host, UIResourceBitmap(skbitmap)); 314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_ptr<ScopedUIResource> resource_; 344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class SharedUIResourceHolder : public UIResourceLayer::UIResourceHolder { 374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public: 384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) static scoped_ptr<SharedUIResourceHolder> Create(UIResourceId id) { 394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return make_scoped_ptr(new SharedUIResourceHolder(id)); 404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual UIResourceId id() OVERRIDE { return id_; } 434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private: 454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) explicit SharedUIResourceHolder(UIResourceId id) : id_(id) {} 464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) UIResourceId id_; 484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} // anonymous namespace 514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)UIResourceLayer::UIResourceHolder::~UIResourceHolder() {} 534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)scoped_refptr<UIResourceLayer> UIResourceLayer::Create() { 554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return make_scoped_refptr(new UIResourceLayer()); 564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)UIResourceLayer::UIResourceLayer() 594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : Layer(), 604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) uv_top_left_(0.f, 0.f), 614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) uv_bottom_right_(1.f, 1.f) { 624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) vertex_opacity_[0] = 1.0f; 634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) vertex_opacity_[1] = 1.0f; 644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) vertex_opacity_[2] = 1.0f; 654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) vertex_opacity_[3] = 1.0f; 664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)UIResourceLayer::~UIResourceLayer() {} 694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)scoped_ptr<LayerImpl> UIResourceLayer::CreateLayerImpl( 714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LayerTreeImpl* tree_impl) { 724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return UIResourceLayerImpl::Create(tree_impl, id()).PassAs<LayerImpl>(); 734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void UIResourceLayer::SetUV(const gfx::PointF& top_left, 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::PointF& bottom_right) { 774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (uv_top_left_ == top_left && uv_bottom_right_ == bottom_right) 784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return; 794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) uv_top_left_ = top_left; 804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) uv_bottom_right_ = bottom_right; 814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetNeedsCommit(); 824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void UIResourceLayer::SetVertexOpacity(float bottom_left, 854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) float top_left, 864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) float top_right, 874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) float bottom_right) { 884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Indexing according to the quad vertex generation: 894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // 1--2 904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // | | 914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // 0--3 924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (vertex_opacity_[0] == bottom_left && 934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) vertex_opacity_[1] == top_left && 944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) vertex_opacity_[2] == top_right && 954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) vertex_opacity_[3] == bottom_right) 964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return; 974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) vertex_opacity_[0] = bottom_left; 984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) vertex_opacity_[1] = top_left; 994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) vertex_opacity_[2] = top_right; 1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) vertex_opacity_[3] = bottom_right; 1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetNeedsCommit(); 1024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void UIResourceLayer::SetLayerTreeHost(LayerTreeHost* host) { 1054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (host == layer_tree_host()) 1064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return; 1074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Layer::SetLayerTreeHost(host); 1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Recreate the resource hold against the new LTH. 1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RecreateUIResourceHolder(); 1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void UIResourceLayer::RecreateUIResourceHolder() { 1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ui_resource_holder_.reset(); 1166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (layer_tree_host() && !bitmap_.empty()) { 1176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ui_resource_holder_ = 1186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ScopedUIResourceHolder::Create(layer_tree_host(), bitmap_); 1196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 1206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) UpdateDrawsContent(HasDrawableContent()); 1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void UIResourceLayer::SetBitmap(const SkBitmap& skbitmap) { 1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bitmap_ = skbitmap; 1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RecreateUIResourceHolder(); 1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetNeedsCommit(); 1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void UIResourceLayer::SetUIResourceId(UIResourceId resource_id) { 1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (ui_resource_holder_ && ui_resource_holder_->id() == resource_id) 1324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return; 1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (resource_id) { 1354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ui_resource_holder_ = SharedUIResourceHolder::Create(resource_id); 1364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } else { 1374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ui_resource_holder_.reset(); 1384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) UpdateDrawsContent(HasDrawableContent()); 1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetNeedsCommit(); 1424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)bool UIResourceLayer::HasDrawableContent() const { 1454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return ui_resource_holder_ && ui_resource_holder_->id() && 1466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) Layer::HasDrawableContent(); 1474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void UIResourceLayer::PushPropertiesTo(LayerImpl* layer) { 1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Layer::PushPropertiesTo(layer); 1514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) UIResourceLayerImpl* layer_impl = static_cast<UIResourceLayerImpl*>(layer); 1524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!ui_resource_holder_) { 1544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_impl->SetUIResourceId(0); 1554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } else { 1564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(layer_tree_host()); 1574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::Size image_size = 1594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_tree_host()->GetUIResourceSize(ui_resource_holder_->id()); 1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_impl->SetUIResourceId(ui_resource_holder_->id()); 1614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_impl->SetImageBounds(image_size); 1624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_impl->SetUV(uv_top_left_, uv_bottom_right_); 1634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_impl->SetVertexOpacity(vertex_opacity_); 1644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} // namespace cc 168