// 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.

#include "flutter/display_list/display_list_runtime_effect.h"

#include "third_party/skia/include/core/SkRefCnt.h"

namespace flutter {

//------------------------------------------------------------------------------
/// DlRuntimeEffect
///

DlRuntimeEffect::DlRuntimeEffect() = default;
DlRuntimeEffect::~DlRuntimeEffect() = default;

sk_sp<DlRuntimeEffect> DlRuntimeEffect::MakeSkia(
    const sk_sp<SkRuntimeEffect>& runtime_effect) {
  return sk_make_sp<DlRuntimeEffectSkia>(runtime_effect);
}

sk_sp<DlRuntimeEffect> DlRuntimeEffect::MakeImpeller(
    std::shared_ptr<impeller::RuntimeStage> runtime_stage) {
  return sk_make_sp<DlRuntimeEffectImpeller>(std::move(runtime_stage));
}

//------------------------------------------------------------------------------
/// DlRuntimeEffectSkia
///

DlRuntimeEffectSkia::~DlRuntimeEffectSkia() = default;

DlRuntimeEffectSkia::DlRuntimeEffectSkia(
    const sk_sp<SkRuntimeEffect>& runtime_effect)
    : skia_runtime_effect_(runtime_effect) {}

sk_sp<SkRuntimeEffect> DlRuntimeEffectSkia::skia_runtime_effect() const {
  return skia_runtime_effect_;
}

std::shared_ptr<impeller::RuntimeStage> DlRuntimeEffectSkia::runtime_stage()
    const {
  return nullptr;
}

//------------------------------------------------------------------------------
/// DlRuntimeEffectImpeller
///

DlRuntimeEffectImpeller::~DlRuntimeEffectImpeller() = default;

DlRuntimeEffectImpeller::DlRuntimeEffectImpeller(
    std::shared_ptr<impeller::RuntimeStage> runtime_stage)
    : runtime_stage_(std::move(runtime_stage)){};

sk_sp<SkRuntimeEffect> DlRuntimeEffectImpeller::skia_runtime_effect() const {
  return nullptr;
}

std::shared_ptr<impeller::RuntimeStage> DlRuntimeEffectImpeller::runtime_stage()
    const {
  return runtime_stage_;
}

}  // namespace flutter
