// ---------------------------------------------------------------------------- // OpenGL Anti-Grain Geometry (GL-AGG) - Version 0.1 // A high quality OpenGL rendering engine for C // Copyright (C) 2012 Nicolas P. Rougier. All rights reserved. // Contact: Nicolas.Rougier@gmail.com // http://code.google.com/p/gl-agg/ // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY NICOLAS P. ROUGIER ''AS IS'' AND ANY EXPRESS OR // IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO // EVENT SHALL NICOLAS P. ROUGIER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES // (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; // LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND // ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF // THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // The views and conclusions contained in the software and documentation are // those of the authors and should not be interpreted as representing official // policies, either expressed or implied, of Nicolas P. Rougier. // ---------------------------------------------------------------------------- #include #include #include #include "opengl.h" #include "shader.h" // ------------------------------------------------------------ shader_read --- char * shader_read( const char *filename ) { FILE * file; char * buffer; size_t size; file = fopen( filename, "rb" ); if( !file ) { fprintf( stderr, "Unable to open file \"%s\".\n", filename ); return NULL; } fseek( file, 0, SEEK_END ); size = ftell( file ); fseek(file, 0, SEEK_SET ); buffer = (char *) malloc(size + 1); size_t res = fread( buffer, 1, size, file ); if(res != size) { fprintf( stderr, "Failed to read file \"%s\".\n Res=%zu", filename, res ); return NULL; } buffer[size] = 0; fclose( file ); return buffer; } // --------------------------------------------------------- shader_compile --- GLuint shader_compile( const char* source, const GLenum type ) { GLuint handle = glCreateShader( type ); glShaderSource( handle, 1, &source, 0 ); glCompileShader( handle ); GLint compile_status; glGetShaderiv( handle, GL_COMPILE_STATUS, &compile_status ); if(GL_FALSE == compile_status) { char messages[256]; glGetShaderInfoLog( handle, sizeof messages, 0, messages ); fprintf( stderr, "%s\n", messages ); return (GLuint)-1; } return handle; } // ------------------------------------------------------------ shader_load --- GLuint shader_load( const char * vert_filename, const char * frag_filename ) { GLuint handle = glCreateProgram( ); if( vert_filename && strlen( vert_filename ) ) { char *vert_source = shader_read( vert_filename ); if (!vert_source) return (GLuint)-1; GLuint vert_shader = shader_compile( vert_source, GL_VERTEX_SHADER); glAttachShader( handle, vert_shader); free( vert_source ); } if( frag_filename && strlen( frag_filename ) ) { char *frag_source = shader_read( frag_filename ); if (!frag_source) return (GLuint)-1; GLuint frag_shader = shader_compile( frag_source, GL_FRAGMENT_SHADER); glAttachShader( handle, frag_shader); free( frag_source ); } glLinkProgram( handle ); GLint link_status; glGetProgramiv( handle, GL_LINK_STATUS, &link_status ); if (link_status == GL_FALSE) { char messages[256]; glGetProgramInfoLog( handle, sizeof(messages), 0, &messages[0] ); fprintf( stderr, "%s\n", messages ); return (GLuint)-1; } return handle; } #if defined(_WIN32) || defined(_WIN64) #include "opengl.h" int freetypegl_init() { GLenum err = glewInit(); if (GLEW_OK != err) { fprintf(stderr, "Error: %s\n", glewGetErrorString(err)); return -1; } return 0; } #else int freetypegl_init() { return 0; } #endif