// Copyright 2013 The Flutter 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_CHILD_SCENE_LAYER_H_
#define FLUTTER_FLOW_LAYERS_CHILD_SCENE_LAYER_H_

#include <third_party/skia/include/core/SkMatrix.h>
#include <third_party/skia/include/core/SkPoint.h>
#include <third_party/skia/include/core/SkSize.h>

#include "flutter/flow/layers/layer.h"
#include "flutter/flow/scene_update_context.h"

namespace flutter {

// Layer that represents an embedded child.
class ChildSceneLayer : public Layer {
 public:
  ChildSceneLayer(zx_koid_t layer_id,
                  const SkPoint& offset,
                  const SkSize& size,
                  bool hit_testable);
  ~ChildSceneLayer() override = default;

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

  void Paint(PaintContext& context) const override;

  void UpdateScene(SceneUpdateContext& context) override;

 private:
  zx_koid_t layer_id_ = ZX_KOID_INVALID;
  SkPoint offset_;
  SkSize size_;
  bool hit_testable_ = true;

  FML_DISALLOW_COPY_AND_ASSIGN(ChildSceneLayer);
};

}  // namespace flutter

#endif  // FLUTTER_FLOW_LAYERS_CHILD_SCENE_LAYER_H_
