// Copyright (c) 2013 The Chromium 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 UI_GL_ANDROID_SCOPED_JAVA_SURFACE_H_
#define UI_GL_ANDROID_SCOPED_JAVA_SURFACE_H_

#include <jni.h>

#include "base/android/scoped_java_ref.h"
#include "base/macros.h"
#include "ui/gl/gl_export.h"

namespace gl {

class SurfaceTexture;

// A helper class for holding a scoped reference to a Java Surface instance.
// When going out of scope, Surface.release() is called on the Java object to
// make sure server-side references (esp. wrt graphics memory) are released.
class GL_EXPORT ScopedJavaSurface {
 public:
  ScopedJavaSurface();

  // Wraps an existing Java Surface object in a ScopedJavaSurface.
  explicit ScopedJavaSurface(const base::android::JavaRef<jobject>& surface);

  // Creates a Java Surface from a SurfaceTexture and wraps it in a
  // ScopedJavaSurface.
  explicit ScopedJavaSurface(const SurfaceTexture* surface_texture);

  // Move constructor. Take the surface from another ScopedJavaSurface object,
  // the latter no longer owns the surface afterwards.
  ScopedJavaSurface(ScopedJavaSurface&& rvalue);
  ScopedJavaSurface& operator=(ScopedJavaSurface&& rhs);

  // Creates a ScopedJavaSurface that is owned externally, i.e.,
  // someone else is responsible to call Surface.release().
  static ScopedJavaSurface AcquireExternalSurface(jobject surface);

  ~ScopedJavaSurface();

  // Checks whether the surface is an empty one.
  bool IsEmpty() const;

  // Checks whether this object references a valid surface.
  bool IsValid() const;

  // Checks whether the surface is hardware protected so that no readback is
  // possible.
  bool is_protected() const { return is_protected_; }

  const base::android::JavaRef<jobject>& j_surface() const {
    return j_surface_;
  }

 private:
  // Performs destructive move from |other| to this.
  void MoveFrom(ScopedJavaSurface& other);
  void ReleaseSurfaceIfNeeded();

  bool auto_release_ = true;
  bool is_protected_ = false;

  base::android::ScopedJavaGlobalRef<jobject> j_surface_;

  DISALLOW_COPY_AND_ASSIGN(ScopedJavaSurface);
};

}  // namespace gl

#endif  // UI_GL_ANDROID_SCOPED_JAVA_SURFACE_H_
