#pragma once

#include "gskgpuimageprivate.h"

#include "gskgldeviceprivate.h"

G_BEGIN_DECLS

#define GSK_TYPE_GL_IMAGE (gsk_gl_image_get_type ())

G_DECLARE_FINAL_TYPE (GskGLImage, gsk_gl_image, GSK, GL_IMAGE, GskGpuImage)

GskGpuImage *           gsk_gl_image_new_backbuffer                     (GskGLDevice            *device,
                                                                         GdkGLContext           *context,
                                                                         GdkMemoryFormat         format,
                                                                         gboolean                is_srgb,
                                                                         gsize                   width,
                                                                         gsize                   height);
GskGpuImage *           gsk_gl_image_new                                (GskGLDevice            *device,
                                                                         GdkMemoryFormat         format,
                                                                         gboolean                try_srgb,
                                                                         GskGpuImageFlags        required_flags,
                                                                         gsize                   width,
                                                                         gsize                   height);
GskGpuImage *           gsk_gl_image_new_for_texture                    (GskGLDevice            *device,
                                                                         GdkTexture             *owner,
                                                                         GLuint                  tex_id,
                                                                         gboolean                take_ownership,
                                                                         GskGpuImageFlags        extra_flags);
                                                                         

void                    gsk_gl_image_bind_texture                       (GskGLImage             *self);
void                    gsk_gl_image_bind_framebuffer                   (GskGLImage             *self);
void                    gsk_gl_image_bind_framebuffer_target            (GskGLImage             *self,
                                                                         GLenum                  target);

gboolean                gsk_gl_image_is_flipped                         (GskGLImage             *self);
GLint                   gsk_gl_image_get_gl_internal_format             (GskGLImage             *self);
GLenum                  gsk_gl_image_get_gl_format                      (GskGLImage             *self);
GLenum                  gsk_gl_image_get_gl_type                        (GskGLImage             *self);

GLuint                  gsk_gl_image_get_texture_id                     (GskGLImage             *self);
void                    gsk_gl_image_steal_texture_ownership            (GskGLImage             *self);

G_END_DECLS
