// 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,
                  bool use_view_holder,
                  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;
  bool use_view_holder_ = true;

  FML_DISALLOW_COPY_AND_ASSIGN(ChildSceneLayer);
};

}  // namespace flutter

#endif  // FLUTTER_FLOW_LAYERS_CHILD_SCENE_LAYER_H_
