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