// 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/shell/common/surface_frame.h"
#include "flutter/fml/logging.h"

namespace flutter {

SurfaceFrame::SurfaceFrame(sk_sp<SkSurface> surface,
                           bool supports_readback,
                           const SubmitCallback& submit_callback)
    : surface_(surface),
      supports_readback_(supports_readback),
      submit_callback_(submit_callback) {
  FML_DCHECK(submit_callback_);
}

SurfaceFrame::SurfaceFrame(sk_sp<SkSurface> surface,
                           bool supports_readback,
                           const SubmitCallback& submit_callback,
                           std::unique_ptr<GLContextResult> context_result)
    : submitted_(false),
      surface_(surface),
      supports_readback_(supports_readback),
      submit_callback_(submit_callback),
      context_result_(std::move(context_result)) {
  FML_DCHECK(submit_callback_);
}

SurfaceFrame::~SurfaceFrame() {
  if (submit_callback_ && !submitted_) {
    // Dropping without a Submit.
    submit_callback_(*this, nullptr);
  }
}

bool SurfaceFrame::Submit() {
  if (submitted_) {
    return false;
  }

  submitted_ = PerformSubmit();

  return submitted_;
}

bool SurfaceFrame::IsSubmitted() const {
  return submitted_;
}

SkCanvas* SurfaceFrame::SkiaCanvas() {
  return surface_ != nullptr ? surface_->getCanvas() : nullptr;
}

sk_sp<SkSurface> SurfaceFrame::SkiaSurface() const {
  return surface_;
}

bool SurfaceFrame::PerformSubmit() {
  if (submit_callback_ == nullptr) {
    return false;
  }

  if (submit_callback_(*this, SkiaCanvas())) {
    return true;
  }

  return false;
}

}  // namespace flutter
