// Copyright 2014 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_RESOURCES_TRANSFORM_DISPLAY_ITEM_H_
#define CC_RESOURCES_TRANSFORM_DISPLAY_ITEM_H_

#include "base/memory/scoped_ptr.h"
#include "cc/base/cc_export.h"
#include "cc/resources/display_item.h"
#include "ui/gfx/transform.h"

class SkCanvas;
class SkDrawPictureCallback;

namespace cc {

class CC_EXPORT TransformDisplayItem : public DisplayItem {
 public:
  virtual ~TransformDisplayItem();

  static scoped_ptr<TransformDisplayItem> Create(
      const gfx::Transform& transform) {
    return make_scoped_ptr(new TransformDisplayItem(transform));
  }

  void Raster(SkCanvas* canvas, SkDrawPictureCallback* callback) const override;

  bool IsSuitableForGpuRasterization() const override;
  int ApproximateOpCount() const override;
  size_t PictureMemoryUsage() const override;

 protected:
  explicit TransformDisplayItem(const gfx::Transform& transform);

 private:
  gfx::Transform transform_;
};

class CC_EXPORT EndTransformDisplayItem : public DisplayItem {
 public:
  virtual ~EndTransformDisplayItem();

  static scoped_ptr<EndTransformDisplayItem> Create() {
    return make_scoped_ptr(new EndTransformDisplayItem());
  }

  void Raster(SkCanvas* canvas, SkDrawPictureCallback* callback) const override;

  bool IsSuitableForGpuRasterization() const override;
  int ApproximateOpCount() const override;
  size_t PictureMemoryUsage() const override;

 protected:
  EndTransformDisplayItem();
};

}  // namespace cc

#endif  // CC_RESOURCES_TRANSFORM_DISPLAY_ITEM_H_
