void subtitle::do_frame(float frametime) { //Figure out how much alpha if(time_displayed < fade_time) { text_color.alpha = (ubyte)fl2i(255.0f*(time_displayed/fade_time)); } else if(time_displayed > time_displayed_end) { //We're finished return; } else if((time_displayed - fade_time) > display_time) { text_color.alpha = (ubyte)fl2i(255.0f*(1-(time_displayed - fade_time - display_time)/fade_time)); } else { text_color.alpha = 255; } gr_set_color_fast(&text_color); // save old font and set new font int old_fontnum; if (text_fontnum >= 0) { old_fontnum = gr_get_current_fontnum(); gr_set_font(text_fontnum); } else { old_fontnum = -1; } int font_height = gr_get_font_height(); int x = text_pos.x; int y = text_pos.y; for(SCP_vector<SCP_string>::iterator line = text_lines.begin(); line != text_lines.end(); ++line) { gr_string(x, y, (char*)line->c_str(), GR_RESIZE_NONE); y += font_height; } // restore old font if (old_fontnum >= 0) { gr_set_font(old_fontnum); } if(image_id >= 0) { gr_set_bitmap(image_id, GR_ALPHABLEND_FILTER, GR_BITBLT_MODE_NORMAL, text_color.alpha/255.0f); // scaling? if (image_pos.w > 0 || image_pos.h > 0) { int orig_w, orig_h; vec3d scale; bm_get_info(image_id, &orig_w, &orig_h); scale.xyz.x = (image_pos.w > 0) ? (image_pos.w / (float) orig_w) : 1.0f; scale.xyz.y = (image_pos.h > 0) ? (image_pos.h / (float) orig_h) : 1.0f; scale.xyz.z = 1.0f; gr_push_scale_matrix(&scale); gr_bitmap(fl2i(image_pos.x / scale.xyz.x), fl2i(image_pos.y / scale.xyz.y), GR_RESIZE_NONE); gr_pop_scale_matrix(); } // no scaling else { gr_bitmap(image_pos.x, image_pos.y, GR_RESIZE_NONE); } } time_displayed += frametime; }
void HudGaugeRadarStd::drawContactImage( int x, int y, int rad, int idx, int clr_idx, int size ) { // this we will move as ships.tbl option (or use for radar scaling etc etc) //int size = 24; int w, h, old_bottom, old_bottom_unscaled, old_right, old_right_unscaled; float scalef, wf, hf, xf, yf; vec3d blip_scaler; if(bm_get_info(idx, &w, &h) < 0) { // Just if something goes terribly wrong drawContactCircle(x, y, rad); return; } // just to make sure the missing casts wont screw the math wf = (float) w; hf = (float) h; xf = (float) x; yf = (float) y; // make sure we use the larger dimension for the scaling // lets go case by case to make sure there are no probs if (size == -1) scalef = 1.0f; else if ((h == w) && (size == h)) scalef = 1.0f; else if ( h > w) scalef = ((float) size) / hf; else scalef = ((float) size) / wf; Assert(scalef != 0); // animate the targeted icon - option 1 of highlighting the targets if ( rad == Radar_blip_radius_target ) { if (radar_target_id_flags & RTIF_PULSATE) { scalef *= 1.3f + (sinf(10 * f2fl(Missiontime)) * 0.3f); } if (radar_target_id_flags & RTIF_BLINK) { if (Missiontime & 8192) return; } if (radar_target_id_flags & RTIF_ENLARGE) { scalef *= 1.3f; } } // setup the scaler blip_scaler.xyz.x = scalef; blip_scaler.xyz.y = scalef; blip_scaler.xyz.z = 1.0f; old_bottom = gr_screen.clip_bottom; old_bottom_unscaled = gr_screen.clip_bottom_unscaled; gr_screen.clip_bottom = (int) (old_bottom/scalef); gr_screen.clip_bottom_unscaled = (int) (old_bottom_unscaled/scalef); old_right = gr_screen.clip_right; old_right_unscaled = gr_screen.clip_right_unscaled; gr_screen.clip_right = (int) (old_right/scalef); gr_screen.clip_right_unscaled = (int) (old_right_unscaled/scalef); // scale the drawing coordinates x = (int) ((xf / scalef) - wf/2.0f); y = (int) ((yf / scalef) - hf/2.0f); gr_push_scale_matrix(&blip_scaler); if ( idx >= 0 ) { gr_set_bitmap(idx,GR_ALPHABLEND_NONE,GR_BITBLT_MODE_NORMAL,1.0f); renderBitmap( x, y ); } if ( clr_idx >= 0 ) { gr_set_screen_scale(base_w, base_h); gr_bitmap(x, y); gr_reset_screen_scale(); } gr_pop_scale_matrix(); gr_screen.clip_bottom = old_bottom; gr_screen.clip_bottom_unscaled = old_bottom_unscaled; gr_screen.clip_right = old_right; gr_screen.clip_right_unscaled = old_right_unscaled; }