static unsigned int load_shader (GLuint type, const char *filename) { unsigned int shader_num = 0; char program_data [8000]; FILE *f; unsigned int len; f = fopen (filename, "r"); len = fread (program_data, 1, 8000, f); program_data [len] = '\0'; fclose (f); glEnable (type); _glGenProgramsARB (1, &shader_num); _glBindProgramARB (type, shader_num); _glProgramStringARB (type, GL_PROGRAM_FORMAT_ASCII_ARB, strlen (program_data), (const GLbyte *) program_data); glDisable(type); return shader_num; }
static void draw_video_plane (gdouble center_x, gdouble center_y, gdouble start_alpha, gdouble stop_alpha, gboolean reversed) { glEnable (GL_FRAGMENT_PROGRAM_ARB); _glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, yuv_shader); gdouble topy; gdouble bottomy; if (! reversed) { topy = center_y - 1.0; bottomy = center_y + 1.0; } else { topy = center_y + 1.0; bottomy = center_y - 1.0; } glBegin (GL_QUADS); glColor4f (1.0, 1.0, 1.0, start_alpha); _glMultiTexCoord2fARB (GL_TEXTURE0_ARB, 0, VIDEO_HEIGHT); _glMultiTexCoord2fARB (GL_TEXTURE1_ARB, 0, VIDEO_HEIGHT / 2); _glMultiTexCoord2fARB (GL_TEXTURE2_ARB, 0, VIDEO_HEIGHT / 2); glVertex2f (center_x - 1.6, topy); _glMultiTexCoord2fARB (GL_TEXTURE0_ARB, VIDEO_WIDTH, VIDEO_HEIGHT); _glMultiTexCoord2fARB (GL_TEXTURE1_ARB, VIDEO_WIDTH / 2, VIDEO_HEIGHT / 2); _glMultiTexCoord2fARB (GL_TEXTURE2_ARB, VIDEO_WIDTH / 2, VIDEO_HEIGHT / 2); glVertex2f (center_x + 1.6, topy); glColor4f (1.0, 1.0, 1.0, stop_alpha); _glMultiTexCoord2fARB (GL_TEXTURE0_ARB, VIDEO_WIDTH, 0); _glMultiTexCoord2fARB (GL_TEXTURE1_ARB, VIDEO_WIDTH / 2, 0); _glMultiTexCoord2fARB (GL_TEXTURE2_ARB, VIDEO_WIDTH / 2, 0); glVertex2f (center_x + 1.6, bottomy); _glMultiTexCoord2fARB (GL_TEXTURE0_ARB, 0, 0); _glMultiTexCoord2fARB (GL_TEXTURE1_ARB, 0, 0); _glMultiTexCoord2fARB (GL_TEXTURE2_ARB, 0, 0); glVertex2f (center_x - 1.6, bottomy); glEnd (); glDisable (GL_FRAGMENT_PROGRAM_ARB); }