// 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_SURFACE_H_
#define FLUTTER_FLOW_SURFACE_H_

#include <memory>

#include "flutter/common/graphics/gl_context_switch.h"
#include "flutter/flow/embedded_views.h"
#include "flutter/flow/surface_frame.h"
#include "flutter/fml/macros.h"

class GrDirectContext;

namespace impeller {
class AiksContext;
}  // namespace impeller

namespace flutter {

/// Abstract Base Class that represents where we will be rendering content.
class Surface {
 public:
  /// A screenshot of the surface's raw data.
  struct SurfaceData {
    std::string pixel_format;
    sk_sp<SkData> data;
  };

  Surface();

  virtual ~Surface();

  virtual bool IsValid() = 0;

  virtual std::unique_ptr<SurfaceFrame> AcquireFrame(const SkISize& size) = 0;

  virtual SkMatrix GetRootTransformation() const = 0;

  virtual GrDirectContext* GetContext() = 0;

  virtual std::unique_ptr<GLContextResult> MakeRenderContextCurrent();

  virtual bool ClearRenderContext();

  virtual bool AllowsDrawingWhenGpuDisabled() const;

  virtual bool EnableRasterCache() const;

  virtual impeller::AiksContext* GetAiksContext() const;

  /// Capture the `SurfaceData` currently present in the surface.
  ///
  /// Not guaranteed to work on all setups and not intended to be used in
  /// production. The data field will be null if it was unable to work.
  virtual SurfaceData GetSurfaceData() const;

 private:
  FML_DISALLOW_COPY_AND_ASSIGN(Surface);
};

}  // namespace flutter

#endif  // FLUTTER_FLOW_SURFACE_H_
