+static WIN_W : u32 = 800;
+static WIN_H : u32 = 800;
+
+static VERTEX_DATA : [GLfloat; 12] = [
+ -0.5, -0.5,
+ 0.5, -0.5,
+ 0.5, 0.5,
+
+ -0.5, -0.5,
+ 0.5, 0.5,
+ -0.5, 0.5
+];
+
+static TEX_DATA : [GLfloat; 12] = [
+ 0.0, 1.0,
+ 1.0, 1.0,
+ 1.0, 0.0,
+
+ 0.0, 1.0,
+ 1.0, 0.0,
+ 0.0, 0.0
+];
+
+static NUM_VERTICES : GLint = 6;
+static VERTEX_LOC : u32 = 0;
+static TEX_LOC : u32 = 1;
+
+static VS : &'static str =
+"#version 130\n\
+ in vec4 pos;\n\
+ in vec2 in_tex_coord;\n\
+ out vec2 tex_coord;\n\
+ void main() {\n\
+ gl_Position = pos;\n\
+ tex_coord = in_tex_coord;\n\
+ }";
+
+static FS : &'static str =
+"#version 130\n\
+ uniform sampler2D tex;\n\
+ in vec2 tex_coord;\n\
+ out vec4 color;\n\
+ void main() {\n\
+ color = texture2D(tex, tex_coord);\n\
+ }";
+
+fn compile_sdr(src: &str, stage:GLenum) -> GLuint {
+ let shader;
+ unsafe {
+ shader = gl::CreateShader(stage);
+
+ let s = std::ffi::CString::new(src).expect("CString::new failed");;
+
+ gl::ShaderSource(shader, 1, &s.as_ptr(), std::ptr::null());
+ gl::CompileShader(shader);
+ // status
+ let mut status = gl::FALSE as GLint;
+ gl::GetShaderiv(shader, gl::COMPILE_STATUS, &mut status);
+
+ // error handling
+ if status != (gl::TRUE as GLint) {
+ let mut len = 0;
+ gl::GetShaderiv(shader, gl::INFO_LOG_LENGTH, &mut len);
+
+ let mut buf: Vec<u8> = Vec::with_capacity((len + 1) as usize);
+ buf.extend([b' '].iter().cycle().take(len as usize));
+ let err: std::ffi::CString = std::ffi::CString::from_vec_unchecked(buf);
+
+ gl::GetShaderInfoLog(shader, len, std::ptr::null_mut(),
+ err.as_ptr() as *mut GLchar);
+ println!("{}", err.to_str().unwrap());
+
+ }
+ }
+ shader
+}
+
+fn link_sdr_prog(vs: GLuint, fs: GLuint) -> GLuint {
+ unsafe {
+ let sdr_prog = gl::CreateProgram();
+ gl::AttachShader(sdr_prog, vs);
+ gl::AttachShader(sdr_prog, fs);
+ gl::LinkProgram(sdr_prog);
+
+ let mut status = gl::FALSE as GLint;
+ gl::GetProgramiv(sdr_prog, gl::LINK_STATUS, &mut status);
+ if status != (gl::TRUE as GLint) {
+ let mut len: GLint = 0;
+ gl::GetProgramiv(sdr_prog, gl::INFO_LOG_LENGTH, &mut len);
+
+
+ let mut buf: Vec<u8> = Vec::with_capacity((len + 1) as usize);
+ buf.extend([b' '].iter().cycle().take(len as usize));
+ let err: std::ffi::CString = std::ffi::CString::from_vec_unchecked(buf);
+
+ gl::GetProgramInfoLog(sdr_prog, len, std::ptr::null_mut(), err.as_ptr() as *mut GLchar);
+ println!("{}", err.to_str().unwrap());
+ }
+ sdr_prog
+ }
+}
+
+fn gen_tex(fname : String, _id : &mut GLuint) {
+ let img : image::DynamicImage = image::open(&std::path::Path::new(&fname)).ok().expect("Can't open image.\n");
+ let (_w, _h) = img.dimensions();
+
+ unsafe {
+ gl::GenTextures(1, _id);
+ gl::BindTexture(gl::TEXTURE_2D, *_id);
+ gl::TexParameteri(gl::TEXTURE_2D, gl::TEXTURE_WRAP_S, gl::REPEAT as i32);
+ gl::TexParameteri(gl::TEXTURE_2D, gl::TEXTURE_WRAP_T, gl::REPEAT as i32);
+ gl::TexParameteri(gl::TEXTURE_2D, gl::TEXTURE_MIN_FILTER, gl::LINEAR as i32);
+ gl::TexParameteri(gl::TEXTURE_2D, gl::TEXTURE_MAG_FILTER, gl::LINEAR as i32);
+ gl::TexImage2D(gl::TEXTURE_2D, 0, gl::RGBA as i32,
+ _w as i32, _h as i32, 0,
+ gl::RGBA, gl::UNSIGNED_BYTE,
+ img.to_rgba().into_raw().as_ptr() as *const std::ffi::c_void);
+ gl::BindTexture(gl::TEXTURE_2D, 0);
+ }
+}