Home | History | Annotate | Download | only in layers
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "cc/layers/ui_resource_layer.h"
      6 
      7 #include "cc/layers/ui_resource_layer_impl.h"
      8 #include "cc/resources/prioritized_resource.h"
      9 #include "cc/resources/resource_update.h"
     10 #include "cc/resources/resource_update_queue.h"
     11 #include "cc/resources/scoped_ui_resource.h"
     12 #include "cc/resources/ui_resource_bitmap.h"
     13 #include "cc/trees/layer_tree_host.h"
     14 
     15 namespace cc {
     16 
     17 
     18 namespace {
     19 
     20 class ScopedUIResourceHolder : public UIResourceLayer::UIResourceHolder {
     21  public:
     22   static scoped_ptr<ScopedUIResourceHolder> Create(LayerTreeHost* host,
     23                                             const SkBitmap& skbitmap) {
     24     return make_scoped_ptr(new ScopedUIResourceHolder(host, skbitmap));
     25   }
     26   virtual UIResourceId id() OVERRIDE { return resource_->id(); }
     27 
     28  private:
     29   ScopedUIResourceHolder(LayerTreeHost* host, const SkBitmap& skbitmap) {
     30     resource_ = ScopedUIResource::Create(host, UIResourceBitmap(skbitmap));
     31   }
     32 
     33   scoped_ptr<ScopedUIResource> resource_;
     34 };
     35 
     36 class SharedUIResourceHolder : public UIResourceLayer::UIResourceHolder {
     37  public:
     38   static scoped_ptr<SharedUIResourceHolder> Create(UIResourceId id) {
     39     return make_scoped_ptr(new SharedUIResourceHolder(id));
     40   }
     41 
     42   virtual UIResourceId id() OVERRIDE { return id_; }
     43 
     44  private:
     45   explicit SharedUIResourceHolder(UIResourceId id) : id_(id) {}
     46 
     47   UIResourceId id_;
     48 };
     49 
     50 }  // anonymous namespace
     51 
     52 UIResourceLayer::UIResourceHolder::~UIResourceHolder() {}
     53 
     54 scoped_refptr<UIResourceLayer> UIResourceLayer::Create() {
     55   return make_scoped_refptr(new UIResourceLayer());
     56 }
     57 
     58 UIResourceLayer::UIResourceLayer()
     59     : Layer(),
     60       uv_top_left_(0.f, 0.f),
     61       uv_bottom_right_(1.f, 1.f) {
     62   vertex_opacity_[0] = 1.0f;
     63   vertex_opacity_[1] = 1.0f;
     64   vertex_opacity_[2] = 1.0f;
     65   vertex_opacity_[3] = 1.0f;
     66 }
     67 
     68 UIResourceLayer::~UIResourceLayer() {}
     69 
     70 scoped_ptr<LayerImpl> UIResourceLayer::CreateLayerImpl(
     71     LayerTreeImpl* tree_impl) {
     72   return UIResourceLayerImpl::Create(tree_impl, id()).PassAs<LayerImpl>();
     73 }
     74 
     75 void UIResourceLayer::SetUV(const gfx::PointF& top_left,
     76                             const gfx::PointF& bottom_right) {
     77   if (uv_top_left_ == top_left && uv_bottom_right_ == bottom_right)
     78     return;
     79   uv_top_left_ = top_left;
     80   uv_bottom_right_ = bottom_right;
     81   SetNeedsCommit();
     82 }
     83 
     84 void UIResourceLayer::SetVertexOpacity(float bottom_left,
     85                                        float top_left,
     86                                        float top_right,
     87                                        float bottom_right) {
     88   // Indexing according to the quad vertex generation:
     89   // 1--2
     90   // |  |
     91   // 0--3
     92   if (vertex_opacity_[0] == bottom_left &&
     93       vertex_opacity_[1] == top_left &&
     94       vertex_opacity_[2] == top_right &&
     95       vertex_opacity_[3] == bottom_right)
     96     return;
     97   vertex_opacity_[0] = bottom_left;
     98   vertex_opacity_[1] = top_left;
     99   vertex_opacity_[2] = top_right;
    100   vertex_opacity_[3] = bottom_right;
    101   SetNeedsCommit();
    102 }
    103 
    104 void UIResourceLayer::SetLayerTreeHost(LayerTreeHost* host) {
    105   if (host == layer_tree_host())
    106     return;
    107 
    108   Layer::SetLayerTreeHost(host);
    109 
    110   // Recreate the resource hold against the new LTH.
    111   RecreateUIResourceHolder();
    112 }
    113 
    114 void UIResourceLayer::RecreateUIResourceHolder() {
    115   ui_resource_holder_.reset();
    116   if (layer_tree_host() && !bitmap_.empty()) {
    117     ui_resource_holder_ =
    118         ScopedUIResourceHolder::Create(layer_tree_host(), bitmap_);
    119   }
    120   UpdateDrawsContent(HasDrawableContent());
    121 }
    122 
    123 void UIResourceLayer::SetBitmap(const SkBitmap& skbitmap) {
    124   bitmap_ = skbitmap;
    125 
    126   RecreateUIResourceHolder();
    127   SetNeedsCommit();
    128 }
    129 
    130 void UIResourceLayer::SetUIResourceId(UIResourceId resource_id) {
    131   if (ui_resource_holder_ && ui_resource_holder_->id() == resource_id)
    132     return;
    133 
    134   if (resource_id) {
    135     ui_resource_holder_ = SharedUIResourceHolder::Create(resource_id);
    136   } else {
    137     ui_resource_holder_.reset();
    138   }
    139 
    140   UpdateDrawsContent(HasDrawableContent());
    141   SetNeedsCommit();
    142 }
    143 
    144 bool UIResourceLayer::HasDrawableContent() const {
    145   return ui_resource_holder_ && ui_resource_holder_->id() &&
    146          Layer::HasDrawableContent();
    147 }
    148 
    149 void UIResourceLayer::PushPropertiesTo(LayerImpl* layer) {
    150   Layer::PushPropertiesTo(layer);
    151   UIResourceLayerImpl* layer_impl = static_cast<UIResourceLayerImpl*>(layer);
    152 
    153   if (!ui_resource_holder_) {
    154     layer_impl->SetUIResourceId(0);
    155   } else {
    156     DCHECK(layer_tree_host());
    157 
    158     gfx::Size image_size =
    159         layer_tree_host()->GetUIResourceSize(ui_resource_holder_->id());
    160     layer_impl->SetUIResourceId(ui_resource_holder_->id());
    161     layer_impl->SetImageBounds(image_size);
    162     layer_impl->SetUV(uv_top_left_, uv_bottom_right_);
    163     layer_impl->SetVertexOpacity(vertex_opacity_);
    164   }
    165 }
    166 
    167 }  // namespace cc
    168