/*
** Copyright 2012, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
**     http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/

// This source file is automatically generated

package android.opengl;

import android.compat.annotation.UnsupportedAppUsage;
import android.graphics.SurfaceTexture;
import android.os.Build;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

/**
 * EGL 1.4
 *
 */
public class EGL14 {

public static final int EGL_DEFAULT_DISPLAY            = 0;
public static EGLContext EGL_NO_CONTEXT                = null;
public static EGLDisplay EGL_NO_DISPLAY                = null;
public static EGLSurface EGL_NO_SURFACE                = null;

public static final int EGL_FALSE                          = 0;
public static final int EGL_TRUE                           = 1;
public static final int EGL_SUCCESS                        = 0x3000;
public static final int EGL_NOT_INITIALIZED                = 0x3001;
public static final int EGL_BAD_ACCESS                     = 0x3002;
public static final int EGL_BAD_ALLOC                      = 0x3003;
public static final int EGL_BAD_ATTRIBUTE                  = 0x3004;
public static final int EGL_BAD_CONFIG                     = 0x3005;
public static final int EGL_BAD_CONTEXT                    = 0x3006;
public static final int EGL_BAD_CURRENT_SURFACE            = 0x3007;
public static final int EGL_BAD_DISPLAY                    = 0x3008;
public static final int EGL_BAD_MATCH                      = 0x3009;
public static final int EGL_BAD_NATIVE_PIXMAP              = 0x300A;
public static final int EGL_BAD_NATIVE_WINDOW              = 0x300B;
public static final int EGL_BAD_PARAMETER                  = 0x300C;
public static final int EGL_BAD_SURFACE                    = 0x300D;
public static final int EGL_CONTEXT_LOST                   = 0x300E;
public static final int EGL_BUFFER_SIZE                    = 0x3020;
public static final int EGL_ALPHA_SIZE                     = 0x3021;
public static final int EGL_BLUE_SIZE                      = 0x3022;
public static final int EGL_GREEN_SIZE                     = 0x3023;
public static final int EGL_RED_SIZE                       = 0x3024;
public static final int EGL_DEPTH_SIZE                     = 0x3025;
public static final int EGL_STENCIL_SIZE                   = 0x3026;
public static final int EGL_CONFIG_CAVEAT                  = 0x3027;
public static final int EGL_CONFIG_ID                      = 0x3028;
public static final int EGL_LEVEL                          = 0x3029;
public static final int EGL_MAX_PBUFFER_HEIGHT             = 0x302A;
public static final int EGL_MAX_PBUFFER_PIXELS             = 0x302B;
public static final int EGL_MAX_PBUFFER_WIDTH              = 0x302C;
public static final int EGL_NATIVE_RENDERABLE              = 0x302D;
public static final int EGL_NATIVE_VISUAL_ID               = 0x302E;
public static final int EGL_NATIVE_VISUAL_TYPE             = 0x302F;
public static final int EGL_SAMPLES                        = 0x3031;
public static final int EGL_SAMPLE_BUFFERS                 = 0x3032;
public static final int EGL_SURFACE_TYPE                   = 0x3033;
public static final int EGL_TRANSPARENT_TYPE               = 0x3034;
public static final int EGL_TRANSPARENT_BLUE_VALUE         = 0x3035;
public static final int EGL_TRANSPARENT_GREEN_VALUE        = 0x3036;
public static final int EGL_TRANSPARENT_RED_VALUE          = 0x3037;
public static final int EGL_NONE                           = 0x3038;
public static final int EGL_BIND_TO_TEXTURE_RGB            = 0x3039;
public static final int EGL_BIND_TO_TEXTURE_RGBA           = 0x303A;
public static final int EGL_MIN_SWAP_INTERVAL              = 0x303B;
public static final int EGL_MAX_SWAP_INTERVAL              = 0x303C;
public static final int EGL_LUMINANCE_SIZE                 = 0x303D;
public static final int EGL_ALPHA_MASK_SIZE                = 0x303E;
public static final int EGL_COLOR_BUFFER_TYPE              = 0x303F;
public static final int EGL_RENDERABLE_TYPE                = 0x3040;
public static final int EGL_MATCH_NATIVE_PIXMAP            = 0x3041;
public static final int EGL_CONFORMANT                     = 0x3042;
public static final int EGL_SLOW_CONFIG                    = 0x3050;
public static final int EGL_NON_CONFORMANT_CONFIG          = 0x3051;
public static final int EGL_TRANSPARENT_RGB                = 0x3052;
public static final int EGL_RGB_BUFFER                     = 0x308E;
public static final int EGL_LUMINANCE_BUFFER               = 0x308F;
public static final int EGL_NO_TEXTURE                     = 0x305C;
public static final int EGL_TEXTURE_RGB                    = 0x305D;
public static final int EGL_TEXTURE_RGBA                   = 0x305E;
public static final int EGL_TEXTURE_2D                     = 0x305F;
public static final int EGL_PBUFFER_BIT                    = 0x0001;
public static final int EGL_PIXMAP_BIT                     = 0x0002;
public static final int EGL_WINDOW_BIT                     = 0x0004;
public static final int EGL_VG_COLORSPACE_LINEAR_BIT       = 0x0020;
public static final int EGL_VG_ALPHA_FORMAT_PRE_BIT        = 0x0040;
public static final int EGL_MULTISAMPLE_RESOLVE_BOX_BIT    = 0x0200;
public static final int EGL_SWAP_BEHAVIOR_PRESERVED_BIT    = 0x0400;
public static final int EGL_OPENGL_ES_BIT                  = 0x0001;
public static final int EGL_OPENVG_BIT                     = 0x0002;
public static final int EGL_OPENGL_ES2_BIT                 = 0x0004;
public static final int EGL_OPENGL_BIT                     = 0x0008;
public static final int EGL_VENDOR                         = 0x3053;
public static final int EGL_VERSION                        = 0x3054;
public static final int EGL_EXTENSIONS                     = 0x3055;
public static final int EGL_CLIENT_APIS                    = 0x308D;
public static final int EGL_HEIGHT                         = 0x3056;
public static final int EGL_WIDTH                          = 0x3057;
public static final int EGL_LARGEST_PBUFFER                = 0x3058;
public static final int EGL_TEXTURE_FORMAT                 = 0x3080;
public static final int EGL_TEXTURE_TARGET                 = 0x3081;
public static final int EGL_MIPMAP_TEXTURE                 = 0x3082;
public static final int EGL_MIPMAP_LEVEL                   = 0x3083;
public static final int EGL_RENDER_BUFFER                  = 0x3086;
public static final int EGL_VG_COLORSPACE                  = 0x3087;
public static final int EGL_VG_ALPHA_FORMAT                = 0x3088;
public static final int EGL_HORIZONTAL_RESOLUTION          = 0x3090;
public static final int EGL_VERTICAL_RESOLUTION            = 0x3091;
public static final int EGL_PIXEL_ASPECT_RATIO             = 0x3092;
public static final int EGL_SWAP_BEHAVIOR                  = 0x3093;
public static final int EGL_MULTISAMPLE_RESOLVE            = 0x3099;
public static final int EGL_BACK_BUFFER                    = 0x3084;
public static final int EGL_SINGLE_BUFFER                  = 0x3085;
public static final int EGL_VG_COLORSPACE_sRGB             = 0x3089;
public static final int EGL_VG_COLORSPACE_LINEAR           = 0x308A;
public static final int EGL_VG_ALPHA_FORMAT_NONPRE         = 0x308B;
public static final int EGL_VG_ALPHA_FORMAT_PRE            = 0x308C;
public static final int EGL_DISPLAY_SCALING                = 10000;
public static final int EGL_BUFFER_PRESERVED               = 0x3094;
public static final int EGL_BUFFER_DESTROYED               = 0x3095;
public static final int EGL_OPENVG_IMAGE                   = 0x3096;
public static final int EGL_CONTEXT_CLIENT_TYPE            = 0x3097;
public static final int EGL_CONTEXT_CLIENT_VERSION         = 0x3098;
public static final int EGL_MULTISAMPLE_RESOLVE_DEFAULT    = 0x309A;
public static final int EGL_MULTISAMPLE_RESOLVE_BOX        = 0x309B;
public static final int EGL_OPENGL_ES_API                  = 0x30A0;
public static final int EGL_OPENVG_API                     = 0x30A1;
public static final int EGL_OPENGL_API                     = 0x30A2;
public static final int EGL_DRAW                           = 0x3059;
public static final int EGL_READ                           = 0x305A;
public static final int EGL_CORE_NATIVE_ENGINE             = 0x305B;

    native private static void _nativeClassInit();
    static {
        _nativeClassInit();
    }
    // C function EGLint eglGetError ( void )

    public static native int eglGetError(
    );

    // C function EGLDisplay eglGetDisplay ( EGLNativeDisplayType display_id )

    public static native EGLDisplay eglGetDisplay(
        int display_id
    );

    /**
     * {@hide}
     */
    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
    public static native EGLDisplay eglGetDisplay(
        long display_id
    );

    // C function EGLBoolean eglInitialize ( EGLDisplay dpy, EGLint *major, EGLint *minor )

    public static native boolean eglInitialize(
        EGLDisplay dpy,
        int[] major,
        int majorOffset,
        int[] minor,
        int minorOffset
    );

    // C function EGLBoolean eglTerminate ( EGLDisplay dpy )

    public static native boolean eglTerminate(
        EGLDisplay dpy
    );

    // C function const char * eglQueryString ( EGLDisplay dpy, EGLint name )

    public static native String eglQueryString(
        EGLDisplay dpy,
        int name
    );
    // C function EGLBoolean eglGetConfigs ( EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config )

    public static native boolean eglGetConfigs(
        EGLDisplay dpy,
        EGLConfig[] configs,
        int configsOffset,
        int config_size,
        int[] num_config,
        int num_configOffset
    );

    // C function EGLBoolean eglChooseConfig ( EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config )

    public static native boolean eglChooseConfig(
        EGLDisplay dpy,
        int[] attrib_list,
        int attrib_listOffset,
        EGLConfig[] configs,
        int configsOffset,
        int config_size,
        int[] num_config,
        int num_configOffset
    );

    // C function EGLBoolean eglGetConfigAttrib ( EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value )

    public static native boolean eglGetConfigAttrib(
        EGLDisplay dpy,
        EGLConfig config,
        int attribute,
        int[] value,
        int offset
    );

    // C function EGLSurface eglCreateWindowSurface ( EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, const EGLint *attrib_list )

    private static native EGLSurface _eglCreateWindowSurface(
        EGLDisplay dpy,
        EGLConfig config,
        Object win,
        int[] attrib_list,
        int offset
    );

    private static native EGLSurface _eglCreateWindowSurfaceTexture(
        EGLDisplay dpy,
        EGLConfig config,
        Object win,
        int[] attrib_list,
        int offset
    );

    public static EGLSurface eglCreateWindowSurface(EGLDisplay dpy,
        EGLConfig config,
        Object win,
        int[] attrib_list,
        int offset
    ){
        Surface sur = null;
        if (win instanceof SurfaceView) {
            SurfaceView surfaceView = (SurfaceView)win;
            sur = surfaceView.getHolder().getSurface();
        } else if (win instanceof SurfaceHolder) {
            SurfaceHolder holder = (SurfaceHolder)win;
            sur = holder.getSurface();
        } else if (win instanceof Surface) {
            sur = (Surface) win;
        }

        EGLSurface surface;
        if (sur != null) {
            surface = _eglCreateWindowSurface(dpy, config, sur, attrib_list, offset);
        } else if (win instanceof SurfaceTexture) {
            surface = _eglCreateWindowSurfaceTexture(dpy, config,
                    win, attrib_list, offset);
        } else {
            throw new java.lang.UnsupportedOperationException(
                "eglCreateWindowSurface() can only be called with an instance of " +
                "Surface, SurfaceView, SurfaceTexture or SurfaceHolder at the moment, " +
                "this will be fixed later.");
        }

        return surface;
    }
    // C function EGLSurface eglCreatePbufferSurface ( EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list )

    public static native EGLSurface eglCreatePbufferSurface(
        EGLDisplay dpy,
        EGLConfig config,
        int[] attrib_list,
        int offset
    );

    // C function EGLSurface eglCreatePixmapSurface ( EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint *attrib_list )

    @Deprecated
    public static native EGLSurface eglCreatePixmapSurface(
        EGLDisplay dpy,
        EGLConfig config,
        int pixmap,
        int[] attrib_list,
        int offset
    );

    // C function EGLBoolean eglDestroySurface ( EGLDisplay dpy, EGLSurface surface )

    public static native boolean eglDestroySurface(
        EGLDisplay dpy,
        EGLSurface surface
    );

    // C function EGLBoolean eglQuerySurface ( EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value )

    public static native boolean eglQuerySurface(
        EGLDisplay dpy,
        EGLSurface surface,
        int attribute,
        int[] value,
        int offset
    );

    // C function EGLBoolean eglBindAPI ( EGLenum api )

    public static native boolean eglBindAPI(
        int api
    );

    // C function EGLenum eglQueryAPI ( void )

    public static native int eglQueryAPI(
    );

    // C function EGLBoolean eglWaitClient ( void )

    public static native boolean eglWaitClient(
    );

    // C function EGLBoolean eglReleaseThread ( void )

    public static native boolean eglReleaseThread(
    );

    // C function EGLSurface eglCreatePbufferFromClientBuffer ( EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint *attrib_list )
    // TODO Deprecate the below method
    public static native EGLSurface eglCreatePbufferFromClientBuffer(
        EGLDisplay dpy,
        int buftype,
        int buffer,
        EGLConfig config,
        int[] attrib_list,
        int offset
    );
    // TODO Unhide the below method
    /**
     * {@hide}
     */
    public static native EGLSurface eglCreatePbufferFromClientBuffer(
        EGLDisplay dpy,
        int buftype,
        long buffer,
        EGLConfig config,
        int[] attrib_list,
        int offset
    );

    // C function EGLBoolean eglSurfaceAttrib ( EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value )

    public static native boolean eglSurfaceAttrib(
        EGLDisplay dpy,
        EGLSurface surface,
        int attribute,
        int value
    );

    // C function EGLBoolean eglBindTexImage ( EGLDisplay dpy, EGLSurface surface, EGLint buffer )

    public static native boolean eglBindTexImage(
        EGLDisplay dpy,
        EGLSurface surface,
        int buffer
    );

    // C function EGLBoolean eglReleaseTexImage ( EGLDisplay dpy, EGLSurface surface, EGLint buffer )

    public static native boolean eglReleaseTexImage(
        EGLDisplay dpy,
        EGLSurface surface,
        int buffer
    );

    // C function EGLBoolean eglSwapInterval ( EGLDisplay dpy, EGLint interval )

    public static native boolean eglSwapInterval(
        EGLDisplay dpy,
        int interval
    );

    // C function EGLContext eglCreateContext ( EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list )

    public static native EGLContext eglCreateContext(
        EGLDisplay dpy,
        EGLConfig config,
        EGLContext share_context,
        int[] attrib_list,
        int offset
    );

    // C function EGLBoolean eglDestroyContext ( EGLDisplay dpy, EGLContext ctx )

    public static native boolean eglDestroyContext(
        EGLDisplay dpy,
        EGLContext ctx
    );

    // C function EGLBoolean eglMakeCurrent ( EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx )

    public static native boolean eglMakeCurrent(
        EGLDisplay dpy,
        EGLSurface draw,
        EGLSurface read,
        EGLContext ctx
    );

    // C function EGLContext eglGetCurrentContext ( void )

    public static native EGLContext eglGetCurrentContext(
    );

    // C function EGLSurface eglGetCurrentSurface ( EGLint readdraw )

    public static native EGLSurface eglGetCurrentSurface(
        int readdraw
    );

    // C function EGLDisplay eglGetCurrentDisplay ( void )

    public static native EGLDisplay eglGetCurrentDisplay(
    );

    // C function EGLBoolean eglQueryContext ( EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *value )

    public static native boolean eglQueryContext(
        EGLDisplay dpy,
        EGLContext ctx,
        int attribute,
        int[] value,
        int offset
    );

    // C function EGLBoolean eglWaitGL ( void )

    public static native boolean eglWaitGL(
    );

    // C function EGLBoolean eglWaitNative ( EGLint engine )

    public static native boolean eglWaitNative(
        int engine
    );

    // C function EGLBoolean eglSwapBuffers ( EGLDisplay dpy, EGLSurface surface )

    public static native boolean eglSwapBuffers(
        EGLDisplay dpy,
        EGLSurface surface
    );

    // C function EGLBoolean eglCopyBuffers ( EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target )

    public static native boolean eglCopyBuffers(
        EGLDisplay dpy,
        EGLSurface surface,
        int target
    );

}
