// GENERATED FILE - DO NOT EDIT.
// Generated by generate_entry_points.py using data from gl.xml.
//
// Copyright 2019 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// entry_points_gl_1_4_autogen.h:
//   Defines the GL 1.4 entry points.

#ifndef LIBGL_ENTRY_POINTS_GL_1_4_AUTOGEN_H_
#define LIBGL_ENTRY_POINTS_GL_1_4_AUTOGEN_H_

#include <export.h>
#include "angle_gl.h"

namespace gl
{
ANGLE_EXPORT void GL_APIENTRY BlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
ANGLE_EXPORT void GL_APIENTRY BlendEquation(GLenum mode);
ANGLE_EXPORT void GL_APIENTRY BlendFuncSeparate(GLenum sfactorRGB,
                                                GLenum dfactorRGB,
                                                GLenum sfactorAlpha,
                                                GLenum dfactorAlpha);
ANGLE_EXPORT void GL_APIENTRY FogCoordPointer(GLenum type, GLsizei stride, const void *pointer);
ANGLE_EXPORT void GL_APIENTRY FogCoordd(GLdouble coord);
ANGLE_EXPORT void GL_APIENTRY FogCoorddv(const GLdouble *coord);
ANGLE_EXPORT void GL_APIENTRY FogCoordf(GLfloat coord);
ANGLE_EXPORT void GL_APIENTRY FogCoordfv(const GLfloat *coord);
ANGLE_EXPORT void GL_APIENTRY MultiDrawArrays(GLenum mode,
                                              const GLint *first,
                                              const GLsizei *count,
                                              GLsizei drawcount);
ANGLE_EXPORT void GL_APIENTRY MultiDrawElements(GLenum mode,
                                                const GLsizei *count,
                                                GLenum type,
                                                const void *const *indices,
                                                GLsizei drawcount);
ANGLE_EXPORT void GL_APIENTRY PointParameterf(GLenum pname, GLfloat param);
ANGLE_EXPORT void GL_APIENTRY PointParameterfv(GLenum pname, const GLfloat *params);
ANGLE_EXPORT void GL_APIENTRY PointParameteri(GLenum pname, GLint param);
ANGLE_EXPORT void GL_APIENTRY PointParameteriv(GLenum pname, const GLint *params);
ANGLE_EXPORT void GL_APIENTRY SecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue);
ANGLE_EXPORT void GL_APIENTRY SecondaryColor3bv(const GLbyte *v);
ANGLE_EXPORT void GL_APIENTRY SecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue);
ANGLE_EXPORT void GL_APIENTRY SecondaryColor3dv(const GLdouble *v);
ANGLE_EXPORT void GL_APIENTRY SecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue);
ANGLE_EXPORT void GL_APIENTRY SecondaryColor3fv(const GLfloat *v);
ANGLE_EXPORT void GL_APIENTRY SecondaryColor3i(GLint red, GLint green, GLint blue);
ANGLE_EXPORT void GL_APIENTRY SecondaryColor3iv(const GLint *v);
ANGLE_EXPORT void GL_APIENTRY SecondaryColor3s(GLshort red, GLshort green, GLshort blue);
ANGLE_EXPORT void GL_APIENTRY SecondaryColor3sv(const GLshort *v);
ANGLE_EXPORT void GL_APIENTRY SecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue);
ANGLE_EXPORT void GL_APIENTRY SecondaryColor3ubv(const GLubyte *v);
ANGLE_EXPORT void GL_APIENTRY SecondaryColor3ui(GLuint red, GLuint green, GLuint blue);
ANGLE_EXPORT void GL_APIENTRY SecondaryColor3uiv(const GLuint *v);
ANGLE_EXPORT void GL_APIENTRY SecondaryColor3us(GLushort red, GLushort green, GLushort blue);
ANGLE_EXPORT void GL_APIENTRY SecondaryColor3usv(const GLushort *v);
ANGLE_EXPORT void GL_APIENTRY SecondaryColorPointer(GLint size,
                                                    GLenum type,
                                                    GLsizei stride,
                                                    const void *pointer);
ANGLE_EXPORT void GL_APIENTRY WindowPos2d(GLdouble x, GLdouble y);
ANGLE_EXPORT void GL_APIENTRY WindowPos2dv(const GLdouble *v);
ANGLE_EXPORT void GL_APIENTRY WindowPos2f(GLfloat x, GLfloat y);
ANGLE_EXPORT void GL_APIENTRY WindowPos2fv(const GLfloat *v);
ANGLE_EXPORT void GL_APIENTRY WindowPos2i(GLint x, GLint y);
ANGLE_EXPORT void GL_APIENTRY WindowPos2iv(const GLint *v);
ANGLE_EXPORT void GL_APIENTRY WindowPos2s(GLshort x, GLshort y);
ANGLE_EXPORT void GL_APIENTRY WindowPos2sv(const GLshort *v);
ANGLE_EXPORT void GL_APIENTRY WindowPos3d(GLdouble x, GLdouble y, GLdouble z);
ANGLE_EXPORT void GL_APIENTRY WindowPos3dv(const GLdouble *v);
ANGLE_EXPORT void GL_APIENTRY WindowPos3f(GLfloat x, GLfloat y, GLfloat z);
ANGLE_EXPORT void GL_APIENTRY WindowPos3fv(const GLfloat *v);
ANGLE_EXPORT void GL_APIENTRY WindowPos3i(GLint x, GLint y, GLint z);
ANGLE_EXPORT void GL_APIENTRY WindowPos3iv(const GLint *v);
ANGLE_EXPORT void GL_APIENTRY WindowPos3s(GLshort x, GLshort y, GLshort z);
ANGLE_EXPORT void GL_APIENTRY WindowPos3sv(const GLshort *v);
}  // namespace gl

#endif  // LIBGL_ENTRY_POINTS_GL_1_4_AUTOGEN_H_
