// Copyright 2013 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.

#ifndef CC_LAYERS_UI_RESOURCE_LAYER_H_
#define CC_LAYERS_UI_RESOURCE_LAYER_H_

#include "base/memory/scoped_ptr.h"
#include "cc/base/cc_export.h"
#include "cc/layers/layer.h"
#include "cc/resources/ui_resource_client.h"
#include "ui/gfx/geometry/rect.h"

namespace cc {

class LayerTreeHost;
class ScopedUIResource;

class CC_EXPORT UIResourceLayer : public Layer {
 public:
  static scoped_refptr<UIResourceLayer> Create(const LayerSettings& settings);

  void PushPropertiesTo(LayerImpl* layer) override;

  void SetLayerTreeHost(LayerTreeHost* host) override;

  void SetBitmap(const SkBitmap& skbitmap);

  // An alternative way of setting the resource to allow for sharing. If you use
  // this method, you are responsible for updating the ID if the layer moves
  // between compositors.
  void SetUIResourceId(UIResourceId resource_id);

  // Sets a UV transform to be used at draw time. Defaults to (0, 0) and (1, 1).
  void SetUV(const gfx::PointF& top_left, const gfx::PointF& bottom_right);

  // Sets an opacity value per vertex. It will be multiplied by the layer
  // opacity value.
  void SetVertexOpacity(float bottom_left,
                        float top_left,
                        float top_right,
                        float bottom_right);

  class UIResourceHolder {
   public:
    virtual UIResourceId id() = 0;
    virtual ~UIResourceHolder();
  };

 protected:
  explicit UIResourceLayer(const LayerSettings& settings);
  ~UIResourceLayer() override;

  bool HasDrawableContent() const override;

  scoped_ptr<UIResourceHolder> ui_resource_holder_;
  SkBitmap bitmap_;

  gfx::PointF uv_top_left_;
  gfx::PointF uv_bottom_right_;
  float vertex_opacity_[4];

 private:
  scoped_ptr<LayerImpl> CreateLayerImpl(LayerTreeImpl* tree_impl) override;
  void RecreateUIResourceHolder();

  DISALLOW_COPY_AND_ASSIGN(UIResourceLayer);
};

}  // namespace cc

#endif  // CC_LAYERS_UI_RESOURCE_LAYER_H_
