// Copyright (c) 2012 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 UI_COMPOSITOR_LAYER_DELEGATE_H_
#define UI_COMPOSITOR_LAYER_DELEGATE_H_

#include "ui/compositor/compositor_export.h"
#include "ui/compositor/property_change_reason.h"

namespace gfx {
class Rect;
class Transform;
}

namespace ui {
class PaintContext;

// A delegate interface implemented by an object that renders to a Layer.
class COMPOSITOR_EXPORT LayerDelegate {
 public:
  // Paint content for the layer to the specified context.
  virtual void OnPaintLayer(const PaintContext& context) = 0;

  // Called when the layer's device scale factor has changed.
  virtual void OnDeviceScaleFactorChanged(float old_device_scale_factor,
                                          float new_device_scale_factor) = 0;

  // Invoked when the bounds are set. |reason| indicates whether the bounds were
  // set directly or by an animation. This will be called at every step of a
  // bounds animation.
  virtual void OnLayerBoundsChanged(const gfx::Rect& old_bounds,
                                    PropertyChangeReason reason);

  // Invoked when the transform or opacity is set. |reason| indicates whether
  // the property was set directly or by an animation. This will be called
  // before the first frame of an animation is rendered and when the animation
  // ends, but not necessarily at every frame of the animation.
  virtual void OnLayerTransformed(const gfx::Transform& old_transform,
                                  PropertyChangeReason reason);
  virtual void OnLayerOpacityChanged(PropertyChangeReason reason);

  // Invoked when the alpha shape is set.
  virtual void OnLayerAlphaShapeChanged();

  // Called when it is a good opportunity for the delegate to update any visual
  // state or schedule any additional regions to be painted. Soon after this is
  // called OnPaintLayer() is called.
  virtual void UpdateVisualState();

 protected:
  virtual ~LayerDelegate() {}
};

}  // namespace ui

#endif  // UI_COMPOSITOR_LAYER_DELEGATE_H_
