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

#pragma once

#include "flutter/fml/unique_object.h"
#include "flutter/impeller/toolkit/egl/egl.h"

namespace impeller {

// Simple holder of an EGLImage and the owning EGLDisplay.
struct EGLImageWithDisplay {
  EGLImage image = EGL_NO_IMAGE;
  EGLDisplay display = EGL_NO_DISPLAY;

  constexpr bool operator==(const EGLImageWithDisplay& other) const {
    return image == other.image && display == other.display;
  }

  constexpr bool operator!=(const EGLImageWithDisplay& other) const {
    return !(*this == other);
  }
};

struct EGLImageWithDisplayTraits {
  static EGLImageWithDisplay InvalidValue() {
    return {EGL_NO_IMAGE, EGL_NO_DISPLAY};
  }

  static bool IsValid(const EGLImageWithDisplay& value) {
    return value != InvalidValue();
  }

  static void Free(EGLImageWithDisplay image) {
    eglDestroyImage(image.display, image.image);
  }
};

using UniqueEGLImage =
    fml::UniqueObject<EGLImageWithDisplay, EGLImageWithDisplayTraits>;

// Simple holder of an EGLImageKHR and the owning EGLDisplay.
struct EGLImageKHRWithDisplay {
  EGLImageKHR image = EGL_NO_IMAGE_KHR;
  EGLDisplay display = EGL_NO_DISPLAY;

  constexpr bool operator==(const EGLImageKHRWithDisplay& other) const {
    return image == other.image && display == other.display;
  }

  constexpr bool operator!=(const EGLImageKHRWithDisplay& other) const {
    return !(*this == other);
  }
};

struct EGLImageKHRWithDisplayTraits {
  static EGLImageKHRWithDisplay InvalidValue() {
    return {EGL_NO_IMAGE_KHR, EGL_NO_DISPLAY};
  }

  static bool IsValid(const EGLImageKHRWithDisplay& value) {
    return value != InvalidValue();
  }

  static void Free(EGLImageKHRWithDisplay image) {
    eglDestroyImageKHR(image.display, image.image);
  }
};

using UniqueEGLImageKHR =
    fml::UniqueObject<EGLImageKHRWithDisplay, EGLImageKHRWithDisplayTraits>;

}  // namespace impeller
