// Copyright 2015 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 FLUTTER_FLOW_LAYERS_LAYER_H_
#define FLUTTER_FLOW_LAYERS_LAYER_H_

#include <memory>
#include <vector>

#include "flutter/flow/instrumentation.h"
#include "flutter/flow/raster_cache.h"
#include "flutter/glue/trace_event.h"
#include "lib/ftl/logging.h"
#include "lib/ftl/macros.h"
#include "third_party/skia/include/core/SkCanvas.h"
#include "third_party/skia/include/core/SkColor.h"
#include "third_party/skia/include/core/SkColorFilter.h"
#include "third_party/skia/include/core/SkMatrix.h"
#include "third_party/skia/include/core/SkPath.h"
#include "third_party/skia/include/core/SkPicture.h"
#include "third_party/skia/include/core/SkRect.h"
#include "third_party/skia/include/core/SkRRect.h"
#include "third_party/skia/include/core/SkXfermode.h"

namespace mojo {
namespace gfx {
namespace composition {
class SceneUpdate;
class Node;
}  // composition
}  // namespace gfx
}  // namespace mojo

namespace flow {

class ContainerLayer;
class Layer {
 public:
  Layer();
  virtual ~Layer();

  struct PrerollContext {
    RasterCache& raster_cache;
    GrContext* gr_context;
    SkRect child_paint_bounds;
  };

  virtual void Preroll(PrerollContext* context, const SkMatrix& matrix);

  struct PaintContext {
    SkCanvas& canvas;
    const Stopwatch& frame_time;
    const Stopwatch& engine_time;
  };

  virtual void Paint(PaintContext& context) = 0;
  virtual void UpdateScene(mojo::gfx::composition::SceneUpdate* update,
                           mojo::gfx::composition::Node* container);

  ContainerLayer* parent() const { return parent_; }

  void set_parent(ContainerLayer* parent) { parent_ = parent; }

  // subclasses should assume this will be true by the time Paint() is called
  bool has_paint_bounds() const { return has_paint_bounds_; }

  const SkRect& paint_bounds() const {
    FTL_DCHECK(has_paint_bounds_);
    return paint_bounds_;
  }

  void set_paint_bounds(const SkRect& paint_bounds) {
    has_paint_bounds_ = true;
    paint_bounds_ = paint_bounds;
  }

 private:
  ContainerLayer* parent_;
  bool has_paint_bounds_;  // if false, paint_bounds_ is not valid
  SkRect paint_bounds_;

  FTL_DISALLOW_COPY_AND_ASSIGN(Layer);
};

}  // namespace flow

#endif  // FLUTTER_FLOW_LAYERS_LAYER_H_
