static void ft2_source_render(void *data, gs_effect_t effect) { struct ft2_source *srcdata = data; if (srcdata == NULL) return; if (srcdata->tex == NULL || srcdata->vbuf == NULL) return; gs_reset_blend_state(); if (srcdata->outline_text) draw_outlines(srcdata); if (srcdata->drop_shadow) draw_drop_shadow(srcdata); draw_uv_vbuffer(srcdata->vbuf, srcdata->tex, srcdata->draw_effect, (uint32_t)wcslen(srcdata->text) * 6); UNUSED_PARAMETER(effect); }
static void draw_image (ModeInfo *mi, int i, GLfloat t, GLfloat s, GLfloat z) { int wire = MI_IS_WIREFRAME(mi); photopile_state *ss = &sss[MI_SCREEN(mi)]; image *frame = ss->frames + i; position pos = interpolate(t, frame->pos); GLfloat w = frame->geom.width * 0.5; GLfloat h = frame->geom.height * 0.5; GLfloat z1 = z - 0.25 / (MI_COUNT(mi) + 1); GLfloat z2 = z - 0.5 / (MI_COUNT(mi) + 1); GLfloat w1 = w; GLfloat h1 = h; GLfloat h2 = h; if (polaroid_p) { GLfloat minSize = MIN(w, h); GLfloat maxSize = MAX(w, h); /* Clip or scale image to fit in the frame. */ if (clip_p) { w = h = minSize; } else { GLfloat scale = minSize / maxSize; w *= scale; h *= scale; } w1 = minSize * 1.16; /* enlarge frame border */ h1 = minSize * 1.5; h2 = w1; s /= 1.5; /* compensate for border size */ } glPushMatrix(); /* Position and scale this image. */ glTranslatef (pos.x, pos.y, 0); glRotatef (pos.angle, 0, 0, 1); glScalef (s, s, 1); /* Draw the drop shadow. */ if (shadows_p && !wire) { glColor3f (0, 0, 0); draw_drop_shadow(ss->shadow, -w1, -h1, z2, 2.0 * w1, h1 + h2, 20.0); glDisable (GL_BLEND); } glDisable (GL_LIGHTING); glEnable (GL_DEPTH_TEST); glDisable (GL_CULL_FACE); /* Draw the retro instant-film frame. */ if (polaroid_p) { if (! wire) { glShadeModel (GL_SMOOTH); glEnable (GL_LINE_SMOOTH); glHint (GL_LINE_SMOOTH_HINT, GL_NICEST); glColor3f (1, 1, 1); glBegin (GL_QUADS); glVertex3f (-w1, -h1, z2); glVertex3f ( w1, -h1, z2); glVertex3f ( w1, h2, z2); glVertex3f (-w1, h2, z2); glEnd(); } glLineWidth (1.0); glColor3f (0.5, 0.5, 0.5); glBegin (GL_LINE_LOOP); glVertex3f (-w1, -h1, z); glVertex3f ( w1, -h1, z); glVertex3f ( w1, h2, z); glVertex3f (-w1, h2, z); glEnd(); } /* Draw the image quad. */ if (! wire) { GLfloat texw = w / frame->tw; GLfloat texh = h / frame->th; GLfloat texx = (frame->geom.x + 0.5 * frame->geom.width) / frame->tw; GLfloat texy = (frame->geom.y + 0.5 * frame->geom.height) / frame->th; glBindTexture (GL_TEXTURE_2D, frame->texid); glEnable (GL_TEXTURE_2D); glColor3f (1, 1, 1); glBegin (GL_QUADS); glTexCoord2f (texx - texw, texy + texh); glVertex3f (-w, -h, z1); glTexCoord2f (texx + texw, texy + texh); glVertex3f ( w, -h, z1); glTexCoord2f (texx + texw, texy - texh); glVertex3f ( w, h, z1); glTexCoord2f (texx - texw, texy - texh); glVertex3f (-w, h, z1); glEnd(); glDisable (GL_TEXTURE_2D); } /* Draw a box around it. */ if (! wire) { glShadeModel (GL_SMOOTH); glEnable (GL_LINE_SMOOTH); glHint (GL_LINE_SMOOTH_HINT, GL_NICEST); } glLineWidth (1.0); glColor3f (0.5, 0.5, 0.5); glBegin (GL_LINE_LOOP); glVertex3f (-w, -h, z); glVertex3f ( w, -h, z); glVertex3f ( w, h, z); glVertex3f (-w, h, z); glEnd(); /* Draw a title under the image. */ if (titles_p) { int sw, sh, ascent, descent; GLfloat scale = 1; const char *title = frame->title ? frame->title : "(untitled)"; XCharStruct e; /* #### Highly approximate, but doing real clipping is harder... */ int max = 35; if (strlen(title) > max) title += strlen(title) - max; texture_string_metrics (ss->texfont, title, &e, &ascent, &descent); sw = e.width; sh = ascent + descent; /* Scale the text to match the pixel size of the photo */ scale *= w / 300.0; /* Move to below photo */ glTranslatef (0, -h - sh * (polaroid_p ? 2.2 : 0.5), 0); glTranslatef (-sw*scale/2, sh*scale/2, z); glScalef (scale, scale, 1); if (wire || !polaroid_p) { glColor3f (1, 1, 1); } else { glColor3f (0, 0, 0); } if (!wire) { glEnable (GL_TEXTURE_2D); glEnable (GL_BLEND); print_texture_string (ss->texfont, title); } else { glBegin (GL_LINE_LOOP); glVertex3f (0, 0, 0); glVertex3f (sw, 0, 0); glVertex3f (sw, sh, 0); glVertex3f (0, sh, 0); glEnd(); } } glPopMatrix(); }