#ifndef __EMSCRIPTEN__
#define USE_GLEW 1
#endif
#if USE_GLEW
#include "GL/glew.h"
#endif
#include "SDL/SDL.h"
#include "SDL/SDL_image.h"
#if !USE_GLEW
#include "SDL/SDL_opengl.h"
#endif
#include <stdio.h>
#include <string.h>
#include <assert.h>
void shaders() {
#if USE_GLEW
glewInit();
#endif
GLint ok;
const char *vertexShader = "void main(void) \n"
"{ \n"
" gl_Position = ftransform(); \n"
" gl_TexCoord[0] = gl_MultiTexCoord0; \n"
" gl_FrontColor = gl_Color; \n"
"} \n";
const char *fragmentShader = "uniform sampler2D tex0; \n"
"void main(void) \n"
"{ \n"
" gl_FragColor = gl_Color * texture2D(tex0, gl_TexCoord[0].xy); \n"
"} \n";
GLuint vs = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vs, 1, &vertexShader, NULL);
glCompileShader(vs);
glGetShaderiv(vs, GL_COMPILE_STATUS, &ok);
assert(ok);
GLuint fs = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fs, 1, &fragmentShader, NULL);
glCompileShader(fs);
glGetShaderiv(fs, GL_COMPILE_STATUS, &ok);
assert(ok);
GLuint program = glCreateProgram();
glAttachShader(program, vs);
glAttachShader(program, fs);
glLinkProgram(program);
glGetProgramiv(program, GL_LINK_STATUS, &ok);
assert(ok);
assert(glIsProgram(program));
assert(!glIsProgram(0));
assert(!glIsProgram(program+1));
glUseProgram(program);
{
const char *fakeVertexShader = "atbute ve4 blarg; ### AAA\n";
GLuint vs = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vs, 1, &fakeVertexShader, NULL);
glCompileShader(vs);
glGetShaderiv(vs, GL_COMPILE_STATUS, &ok);
assert(!ok);
GLint infoLen = 0;
glGetShaderiv(vs, GL_INFO_LOG_LENGTH, &infoLen);
assert(infoLen > 1);
}
}
int main(int argc, char *argv[]) {
SDL_Surface *screen;
if ( SDL_Init(SDL_INIT_VIDEO) != 0 ) {
printf("Unable to initialize SDL: %s\n", SDL_GetError());
return 1;
}
SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
screen = SDL_SetVideoMode( 640, 480, 16, SDL_OPENGL );
if ( !screen ) {
printf("Unable to set video mode: %s\n", SDL_GetError());
return 1;
}
glClearColor( 0, 0, 0, 0 );
#ifndef __EMSCRIPTEN__
glEnable( GL_TEXTURE_2D );
#endif
glViewport( 0, 0, 640, 480 );
glMatrixMode( GL_PROJECTION );
GLfloat matrixData[] = { 2.0/640, 0, 0, 0,
0, -2.0/480, 0, 0,
0, 0, -1, 0,
-1, 1, 0, 1 };
glLoadMatrixf(matrixData);
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
GLuint texture;
SDL_Surface *surface;
if ( (surface = IMG_Load("screenshot.png")) ) {
if ( (surface->w & (surface->w - 1)) != 0 ) {
printf("warning: image.bmp's width is not a power of 2\n");
}
if ( (surface->h & (surface->h - 1)) != 0 ) {
printf("warning: image.bmp's height is not a power of 2\n");
}
glGenTextures( 1, &texture );
glBindTexture( GL_TEXTURE_2D, texture );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
memset(surface->pixels, 0x66, surface->w*surface->h);
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, surface->w, surface->h, 0,
GL_RGBA, GL_UNSIGNED_BYTE, surface->pixels );
}
else {
printf("SDL could not load image.bmp: %s\n", SDL_GetError());
SDL_Quit();
return 1;
}
if ( surface ) {
SDL_FreeSurface( surface );
}
glClear( GL_COLOR_BUFFER_BIT );
shaders();
glBindTexture( GL_TEXTURE_2D, texture );
GLfloat vertexData[] = { 0, 0, 10, 10,
1, 0, 300, 10,
1, 1, 300, 128,
0, 1, 10, 128,
0, 0.5, 410, 10,
1, 0.5, 600, 10,
1, 1, 630, 200,
0.5, 1, 310, 250,
0, 0, 100, 300,
1, 0, 300, 300,
1, 1, 300, 400,
0, 1, 100, 400 };
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, 4*4, &vertexData[0]);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2, GL_FLOAT, 4*4, &vertexData[2]);
glDrawArrays(GL_QUADS, 0, 12);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
SDL_GL_SwapBuffers();
#ifndef __EMSCRIPTEN__
SDL_Delay(3000);
#endif
glDeleteTextures( 1, &texture );
SDL_Quit();
return 0;
}