// 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_TESTING_TEST_GL_SURFACE_H_
#define FLUTTER_TESTING_TEST_GL_SURFACE_H_

#include <cstdint>

#include "flutter/fml/macros.h"

#include "third_party/skia/include/core/SkSurface.h"
#include "third_party/skia/include/gpu/GrDirectContext.h"

namespace flutter {
namespace testing {

class TestGLSurface {
 public:
  explicit TestGLSurface(SkISize surface_size);

  ~TestGLSurface();

  const SkISize& GetSurfaceSize() const;

  bool MakeCurrent();

  bool ClearCurrent();

  bool Present();

  uint32_t GetFramebuffer(uint32_t width, uint32_t height) const;

  bool MakeResourceCurrent();

  void* GetProcAddress(const char* name) const;

  sk_sp<SkSurface> GetOnscreenSurface();

  sk_sp<GrDirectContext> GetGrContext();

  sk_sp<GrDirectContext> CreateGrContext();

  sk_sp<SkImage> GetRasterSurfaceSnapshot();

  uint32_t GetWindowFBOId() const;

 private:
  // Importing the EGL.h pulls in platform headers which are problematic
  // (especially X11 which #defineds types like Bool). Any TUs importing
  // this header then become susceptible to failures because of platform
  // specific craziness. Don't expose EGL internals via this header.
  using EGLDisplay = void*;
  using EGLContext = void*;
  using EGLSurface = void*;

  const SkISize surface_size_;
  EGLDisplay display_;
  EGLContext onscreen_context_;
  EGLContext offscreen_context_;
  EGLSurface onscreen_surface_;
  EGLSurface offscreen_surface_;
  sk_sp<GrDirectContext> context_;

  FML_DISALLOW_COPY_AND_ASSIGN(TestGLSurface);
};

}  // namespace testing
}  // namespace flutter

#endif  // FLUTTER_TESTING_TEST_GL_SURFACE_H_
