static void set_widget_positions() { button_t **button_list[] = { &enter_event_btn, &practice_btn, //&rankings_btn, &preference_btn, &credits_btn, &help_btn, &quit_btn }; int w = getparam_x_resolution(); int h = getparam_y_resolution(); int box_height; int box_max_y; int top_y; int bottom_y; int num_buttons = sizeof( button_list ) / sizeof( button_list[0] ); int i; int tot_button_height = 0; int button_sep =0; int cur_y_pos; box_height = 200 * mHeight / 320; box_max_y = h - 150 * mHeight / 320; bottom_y = 0.4*h - box_height/2 + 30 * mHeight / 320; if ( bottom_y + box_height > box_max_y ) { bottom_y = box_max_y - box_height + 30 * mHeight / 320; } top_y = bottom_y + box_height; for (i=0; i<num_buttons; i++) { tot_button_height += button_get_height( *button_list[i] ); } if ( num_buttons > 1 ) { button_sep = ( top_y - bottom_y - tot_button_height ) / ( num_buttons - 1 ); button_sep = max( 0, button_sep ); } cur_y_pos = top_y; for (i=0; i<num_buttons; i+=2) { cur_y_pos -= button_get_height( *button_list[i] ); button_set_position( *button_list[i], make_point2d( w/4.0 - button_get_width( *button_list[i] )/2.0, cur_y_pos ) ); button_set_position( *button_list[i+1], make_point2d( w/4.0*3.0 - button_get_width( *button_list[i+1] )/2.0, cur_y_pos ) ); cur_y_pos -= button_sep; } }
static void make_particle( int i, scalar_t x, scalar_t y ) { scalar_t p_dist; int type; particles[i].pt.x = x; particles[i].pt.y = y; p_dist = frand(); particles[i].size = PARTICLE_MIN_SIZE + (1.0 - p_dist)*PARTICLE_SIZE_RANGE; particles[i].vel.x = 0; particles[i].vel.y = -BASE_VELOCITY-p_dist*VELOCITY_RANGE; type = (int) (frand() * (4.0 - EPS)); if (type == 0) { particles[i].tex_min = make_point2d( 0.0, 0.0 ); particles[i].tex_max = make_point2d( 0.5, 0.5 ); } else if (type == 1) { particles[i].tex_min = make_point2d( 0.5, 0.0 ); particles[i].tex_max = make_point2d( 1.0, 0.5 ); } else if (type == 2) { particles[i].tex_min = make_point2d( 0.5, 0.5 ); particles[i].tex_max = make_point2d( 1.0, 1.0 ); } else { particles[i].tex_min = make_point2d( 0.0, 0.5 ); particles[i].tex_max = make_point2d( 0.5, 1.0 ); } }
void init_ui_snow( void ) { int i; num_particles=orig_num_particles=PARTICLE_DENSITY*getparam_x_resolution()*getparam_y_resolution(); for( i=0; i<num_particles; i++) { make_particle( i, frand(), frand() ); } push_position = make_point2d( 0.0, 0.0 ); }
void reset_ui_snow_cursor_pos( point2d_t pos ) { scalar_t xres, yres; xres = getparam_x_resolution(); yres = getparam_y_resolution(); push_position = make_point2d( pos.x/(scalar_t)xres, pos.y/(scalar_t)yres ); last_push_position = push_position; push_position_initialized = True; }
/*! Updates positions of buttons \return None \author jfpatry \date Created: 2000-09-17 \date Modified: 2000-09-17 */ static void update_button_positions( listbox_t *listbox ) { check_assertion( listbox != NULL, "listbox is NULL" ); button_set_position( listbox->up_button, make_point2d( listbox->pos.x + listbox->w - button_get_width( listbox->up_button ), listbox->pos.y + listbox->h / 2.0 + listbox->arrow_vert_separation / 2.0 ) ); button_set_position( listbox->down_button, make_point2d( listbox->pos.x + listbox->w - button_get_width( listbox->down_button ), listbox->pos.y + listbox->h / 2.0 - listbox->arrow_vert_separation / 2.0 - button_get_height( listbox->up_button ) ) ); }
void push_ui_snow( point2d_t pos ) { scalar_t xres, yres; return; xres = getparam_x_resolution(); yres = getparam_y_resolution(); push_position = make_point2d( pos.x/(scalar_t)xres, pos.y/(scalar_t)yres ); if ( !push_position_initialized ) { last_push_position = push_position; } push_position_initialized = True; }
/*! callback for mouse motion events \return None \author jfpatry \date Created: 2000-09-16 \date Modified: 2000-09-16 */ void ui_event_motion_func( int x, int y ) { point2d_t old_pos; if ( is_mode_change_pending() ) { /* Don't process events until mode change occurs */ return; } /* Reverse y coordinate */ y = getparam_y_resolution() - y; trigger_mouse_motion_cbs( mouse_motion_cbs, x, y ); old_pos = cursor_pos; cursor_pos = make_point2d( x, y ); if ( old_pos.x != x || old_pos.y != y ) { /* Update UI snow */ if ( getparam_ui_snow() ) { if ( right_mouse_button_down ) { make_ui_snow( cursor_pos ); reset_ui_snow_cursor_pos( cursor_pos ); } else if ( middle_mouse_button_down ) { make_ui_snow( cursor_pos ); push_ui_snow( cursor_pos ); } else { push_ui_snow( cursor_pos ); } } /* Need to redraw cursor */ ui_set_dirty(); ui_check_dirty(); } }
static void draw_preference() { int h = getparam_y_resolution(); int box_width, box_height, box_max_y; int x_org, y_org; char *string; font_t *font; int text_width, asc, desc; list_t cup_list; GLuint texobj; box_width = getparam_x_resolution(); box_height = 310 * mHeight / 320; box_max_y = h - 128 * mHeight / 320; x_org = 0; y_org = h/2 - box_height/2 + 30 * mHeight / 320; if ( y_org + box_height > box_max_y ) { y_org = box_max_y - box_height; } button_set_position( chancel_btn, make_point2d( 0, 0 ) ); button_set_position( save_btn, make_point2d( box_width - button_get_width( save_btn ), 0 ) ); listbox_set_position( sound_listbox, make_point2d( box_width - 140 * mHeight / 320, y_org + 290 * mHeight / 320 ) ); listbox_set_position( video_listbox, make_point2d( box_width - 140 * mHeight / 320, y_org + 190 * mHeight / 320 ) ); if ( !get_font_binding( "menu_label", &font ) ) { print_warning( IMPORTANT_WARNING, "Couldn't get font for binding menu_label" ); } else { bind_font_texture( font ); string = "Audio enabled"; glPushMatrix(); { glTranslatef( x_org + 70 * mHeight / 320, y_org + 300 * mHeight / 320, 0 ); draw_string( font, string ); } glPopMatrix(); string = "Video quality"; glPushMatrix(); { glTranslatef( x_org + 70 * mHeight / 320, y_org + 200 * mHeight / 320, 0 ); draw_string( font, string ); } glPopMatrix(); } }
static void set_widget_positions_and_draw_decorations() { int h = getparam_y_resolution(); int box_width, box_height, box_max_y; int x_org, y_org; char *string; font_t *font; int text_width, asc, desc; list_t cup_list; GLuint texobj; #ifdef __APPLE__ /* set the dimensions of the box in which all widgets should fit */ box_width = 300; box_height = 310; box_max_y = h - 128; x_org = 10; y_org = h/2 - box_height/2; if ( y_org + box_height > box_max_y ) { y_org = box_max_y - box_height; } button_set_position( back_btn, make_point2d( x_org + 40 - button_get_width( back_btn )/2.0, 12 ) ); button_set_position( continue_btn, make_point2d( x_org + 232 - button_get_width( continue_btn )/2.0, 12 ) ); button_set_position( howToPlay_btn, make_point2d( x_org + 160 - button_get_width( continue_btn )/2.0, 100 ) ); //Out of the field of view //in Tux Rider World Challenge, there is no more events and cup, just training //I'm adapting from The Tux Racer system by selecting the first and only event //I hide its list box out of the field of view //and each cup for this event is a training listbox_set_position( event_listbox, make_point2d( x_org+500, y_org + 500 ) ); listbox_set_position( cup_listbox, make_point2d( x_org+50, y_org + 193 ) ); #else int w = getparam_x_resolution(); /* set the dimensions of the box in which all widgets should fit */ box_width = 460; box_height = 310; box_max_y = h - 128; x_org = w/2 - box_width/2; y_org = h/2 - box_height/2; if ( y_org + box_height > box_max_y ) { y_org = box_max_y - box_height; } button_set_position( back_btn, make_point2d( x_org + 131 - button_get_width( back_btn )/2.0, 42 ) ); button_set_position( continue_btn, make_point2d( x_org + 329 - button_get_width( continue_btn )/2.0, 42 ) ); listbox_set_position( cup_listbox, make_point2d( x_org + 52, y_org + 103 ) ); listbox_set_position( event_listbox, make_point2d( x_org + 52, y_org + 193 ) ); #endif /* * Draw other stuff */ /* Event & cup icons */ if ( !get_texture_binding( get_event_icon_texture_binding( event_data ), &texobj ) ) { texobj = 0; } glBindTexture( GL_TEXTURE_2D, texobj ); glBegin( GL_QUADS ); { point2d_t tll, tur; point2d_t ll, ur; #ifdef __APPLE__ //out of the field of view ll = make_point2d( x_org, y_org + 500 ); ur = make_point2d( x_org + 44, y_org + 500 + 44 ); tll = make_point2d( 0, 0 ); tur = make_point2d( 44.0/64.0, 44.0/64.0 ); #else ll = make_point2d( x_org, y_org + 193 ); ur = make_point2d( x_org + 44, y_org + 193 + 44 ); tll = make_point2d( 0, 0 ); tur = make_point2d( 44.0/64.0, 44.0/64.0 ); #endif glTexCoord2f( tll.x, tll.y ); glVertex2f( ll.x, ll.y ); glTexCoord2f( tur.x, tll.y ); glVertex2f( ur.x, ll.y ); glTexCoord2f( tur.x, tur.y ); glVertex2f( ur.x, ur.y ); glTexCoord2f( tll.x, tur.y ); glVertex2f( ll.x, ur.y ); } glEnd(); if ( !get_texture_binding( get_cup_icon_texture_binding( (cup_data_t*) get_list_elem_data( cur_cup ) ), &texobj ) ) { texobj = 0; } glBindTexture( GL_TEXTURE_2D, texobj ); #ifdef __APPLE__DISABLED__ { point2d_t tll, tur; point2d_t ll, ur; ll = make_point2d( x_org, y_org + 103 ); ur = make_point2d( x_org + 44, y_org + 103 + 44 ); tll = make_point2d( 0, 0 ); tur = make_point2d( 44.0/64.0, 44.0/64.0 ); const GLfloat vertices []= { ll.x, ll.y, ur.x, ll.y, ur.x, ur.y, ll.x, ur.y }; const GLfloat texCoords []= { tll.x, tll.y, tur.x, tll.y, tur.x, tur.y, tll.x, tur.y, }; glEnableClientState (GL_VERTEX_ARRAY); glVertexPointer (2, GL_FLOAT , 0, vertices); glTexCoordPointer(2, GL_FLOAT, 0, texCoords); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); } #else glBegin( GL_QUADS ); { point2d_t tll, tur; point2d_t ll, ur; #ifdef __APPLE__ ll = make_point2d( x_org, y_org + 193 ); ur = make_point2d( x_org + 44, y_org + 193 + 44 ); tll = make_point2d( 0, 0 ); tur = make_point2d( 44.0/64.0, 44.0/64.0 ); #else ll = make_point2d( x_org, y_org + 103 ); ur = make_point2d( x_org + 44, y_org + 103 + 44 ); tll = make_point2d( 0, 0 ); tur = make_point2d( 44.0/64.0, 44.0/64.0 ); #endif glTexCoord2f( tll.x, tll.y ); glVertex2f( ll.x, ll.y ); glTexCoord2f( tur.x, tll.y ); glVertex2f( ur.x, ll.y ); glTexCoord2f( tur.x, tur.y ); glVertex2f( ur.x, ur.y ); glTexCoord2f( tll.x, tur.y ); glVertex2f( ll.x, ur.y ); } glEnd(); #endif if ( !get_font_binding( "menu_label", &font ) ) { print_warning( IMPORTANT_WARNING, "Couldn't get font for binding menu_label" ); } else { bind_font_texture( font ); #ifdef __APPLE__ string = "Select a training"; #else string = "Select event and cup"; #endif get_font_metrics( font, string, &text_width, &asc, &desc ); glPushMatrix(); { glTranslatef( x_org + box_width/2.0 - text_width/2.0, y_org + 310 - asc, 0 ); draw_string( font, string ); } glPopMatrix(); } if ( !get_font_binding( "event_and_cup_label", &font ) ) { print_warning( IMPORTANT_WARNING, "Couldn't get font for binding menu_label" ); } #ifdef __APPLE__ cur_event = listbox_get_current_item( event_listbox ); event_data = (event_data_t*) get_list_elem_data( cur_event ); cup_list = get_event_cup_list( event_data ); cur_cup = listbox_get_current_item( cup_listbox ); if ( is_cup_complete( event_data, cur_cup ) ) { string = "You've won this Training !"; } else if ( is_cup_first_incomplete_cup( event_data, cur_cup ) ) { string = "You must complete this training first"; } else { string = "You cannot enter this training yet"; } if ( !get_font_binding( "cup_status", &font ) ) { print_warning( IMPORTANT_WARNING, "Couldn't get font for binding cup_status" ); } else { bind_font_texture( font ); get_font_metrics( font, string, &text_width, &asc, &desc ); glPushMatrix(); { glTranslatef( x_org + box_width/2.0 - text_width/2.0, y_org+140, 0 ); draw_string( font, string ); } glPopMatrix(); } #else else {
/*! Sets the widget positions and draws other on-screen goo \author jfpatry \date Created: 2000-09-24 \date Modified: 2000-09-24 */ static void set_widget_positions_and_draw_decorations() { int w = getparam_x_resolution(); int h = getparam_y_resolution(); int box_width, box_height, box_max_y; int x_org, y_org; char *string; font_t *font; char *current_course; int text_width, asc, desc; GLuint texobj; /* set the dimensions of the box in which all widgets should fit */ #ifdef __APPLE__ box_width = w; box_height = 200 * mHeight / 320; box_max_y = h - 128 * mHeight / 320; x_org = 10 * mHeight / 320; y_org = box_height/2 * mHeight / 320; if ( y_org + box_height > box_max_y ) { y_org = box_max_y - box_height + 50 * mHeight / 320; } button_set_position( back_btn, make_point2d( 0, 0 ) ); button_set_position( start_btn, make_point2d( box_width - button_get_width( start_btn ), 0 ) ); listbox_set_position( race_listbox, make_point2d( 160 * mHeight / 320, box_height/2.0+40 * mHeight / 320 ) ); #ifdef __APPLE__ textarea_set_position( desc_ta, make_point2d( 1000, 1000 ) ); #else textarea_set_position( desc_ta, make_point2d( x_org, y_org + 66 * mHeight / 320 ) ); #endif if ( g_game.practicing || ( cup_complete && conditions_ssbtn && wind_ssbtn && snow_ssbtn && mirror_ssbtn ) ) { ssbutton_set_position( conditions_ssbtn, make_point2d( x_org + box_width - 4*36 + 4, y_org + 151 ) ); ssbutton_set_position( wind_ssbtn, make_point2d( x_org + box_width - 3*36 + 4 , y_org + 151 ) ); ssbutton_set_position( snow_ssbtn, make_point2d( x_org + box_width - 2*36 + 4, y_org + 151 ) ); ssbutton_set_position( mirror_ssbtn, make_point2d( x_org + box_width - 1*36 + 4, y_org + 151 ) ); #else box_width = 460; box_height = 310; box_max_y = h - 128; x_org = w/2 - box_width/2; y_org = h/2 - box_height/2; if ( y_org + box_height > box_max_y ) { y_org = box_max_y - box_height; } button_set_position( back_btn, make_point2d( x_org + 131 - button_get_width( back_btn )/2.0, 42 ) ); button_set_position( start_btn, make_point2d( x_org + 343 - button_get_width( start_btn )/2.0, 42 ) ); listbox_set_position( race_listbox, make_point2d( x_org, y_org + 221 ) ); textarea_set_position( desc_ta, make_point2d( x_org, y_org + 66 ) ); if ( g_game.practicing || ( cup_complete && conditions_ssbtn && wind_ssbtn && snow_ssbtn && mirror_ssbtn ) ) { ssbutton_set_position( conditions_ssbtn, make_point2d( x_org + box_width - 4*36 + 4, y_org + 181 ) ); ssbutton_set_position( wind_ssbtn, make_point2d( x_org + box_width - 3*36 + 4 , y_org + 181 ) ); ssbutton_set_position( snow_ssbtn, make_point2d( x_org + box_width - 2*36 + 4, y_org + 181 ) ); ssbutton_set_position( mirror_ssbtn, make_point2d( x_org + box_width - 1*36 + 4, y_org + 181 ) ); #endif } else { /* Draw tux life icons */ GLuint texobj; int i; glPushMatrix(); { #ifdef __APPLE__ glTranslatef( 10 * mHeight / 320, 60 * mHeight / 320, 0 ); #else glTranslatef( x_org + box_width - 4*36 + 4, y_org + 181, 0 ); #endif check_assertion( INIT_NUM_LIVES == 4, "Assumption about number of lives invalid -- " "need to recode this part" ); if ( !get_texture_binding( "tux_life", &texobj ) ) { texobj = 0; } glBindTexture( GL_TEXTURE_2D, texobj ); for ( i=0; i<4; i++ ) { point2d_t ll, ur; if ( plyr->lives > i ) { ll = make_point2d( 0, 0.5 ); ur = make_point2d( 1, 1 ); } else { ll = make_point2d( 0, 0 ); ur = make_point2d( 1, 0.5 ); } glBegin( GL_QUADS ); { glTexCoord2f( ll.x, ll.y ); glVertex2f( 0, 0 ); glTexCoord2f( ur.x, ll.y ); glVertex2f( 32 * mHeight / 320, 0 ); glTexCoord2f( ur.x, ur.y ); glVertex2f( 32 * mHeight / 320, 32 * mHeight / 320 ); glTexCoord2f( ll.x, ur.y ); glVertex2f( 0, 32 * mHeight / 320 ); } glEnd(); glTranslatef( 36 * mHeight / 320, 0, 0 ); } } glPopMatrix(); } #ifndef __APPLE__ // We don't care about that stuff /* Draw other stuff */ if ( !get_font_binding( "menu_label", &font ) ) { print_warning( IMPORTANT_WARNING, "Couldn't get font for binding menu_label" ); } else { bind_font_texture( font ); string = "Select a race"; get_font_metrics( font, string, &text_width, &asc, &desc ); glPushMatrix(); { glTranslatef( x_org + box_width/2.0 - text_width/2.0, y_org + 310 - asc, 0 ); draw_string( font, string ); } glPopMatrix(); } /* Draw text indicating race requirements (if race not completed), or results in race if race completed. */ draw_status_msg( x_org, y_org, box_width, box_height ); #else /* Draw text indicating race requirements (if race not completed), or results in race if race completed. */ draw_status_msg( x_org, y_org, box_width, box_height ); #endif /* Draw preview */ if ( g_game.practicing ) { list_elem_t elem; open_course_data_t *data; elem = listbox_get_current_item( race_listbox ); data = (open_course_data_t*) get_list_elem_data( elem ); current_course = data->course; } else { list_elem_t elem; race_data_t *data; elem = listbox_get_current_item( race_listbox ); data = (race_data_t*) get_list_elem_data( elem ); current_course = data->course; } glDisable( GL_TEXTURE_2D ); glColor4f( 0.0, 0.0, 0.0, 0.3 ); #ifdef __APPLE__ float margin = 4.f * mHeight / 320; float yoffset = 26 * mHeight / 320 + 30 * mHeight / 320; glBegin( GL_QUADS ); { glVertex2f( x_org, y_org + yoffset ); glVertex2f( x_org + 140 * mHeight / 320, y_org + yoffset ); glVertex2f( x_org + 140 * mHeight / 320, y_org + yoffset+107 * mHeight / 320 ); glVertex2f( x_org, y_org + yoffset+107 * mHeight / 320 ); } glEnd(); #else glBegin( GL_QUADS ); { glVertex2f( x_org+box_width-140, y_org+66 ); glVertex2f( x_org+box_width, y_org+66 ); glVertex2f( x_org+box_width, y_org+66+107 ); glVertex2f( x_org+box_width-140, y_org+66+107 ); } glEnd(); #endif glColor4f( 1.0, 1.0, 1.0, 1.0 ); glEnable( GL_TEXTURE_2D ); if ( !get_texture_binding( current_course, &texobj ) ) { if ( !get_texture_binding( "no_preview", &texobj ) ) { texobj = 0; } } glBindTexture( GL_TEXTURE_2D, texobj ); #ifdef __APPLE__ glBegin( GL_QUADS ); { glTexCoord2d( 0, 0); glVertex2f( x_org + margin, y_org + yoffset+margin ); glTexCoord2d( 1, 0); glVertex2f( x_org + 140 * mHeight / 320 - margin, y_org + yoffset+margin ); glTexCoord2d( 1, 1); glVertex2f( x_org + 140 * mHeight / 320 - margin, y_org + yoffset+margin+99 * mHeight / 320 ); glTexCoord2d( 0, 1); glVertex2f( x_org + margin, y_org + yoffset+margin+99 * mHeight / 320 ); } glEnd(); #else glBegin( GL_QUADS ); { glTexCoord2d( 0, 0); glVertex2f( x_org+box_width-136, y_org+70 ); glTexCoord2d( 1, 0); glVertex2f( x_org+box_width-4, y_org+70 ); glTexCoord2d( 1, 1); glVertex2f( x_org+box_width-4, y_org+70+99 ); glTexCoord2d( 0, 1); glVertex2f( x_org+box_width-136, y_org+70+99 ); } glEnd(); #endif } /*---------------------------------------------------------------------------*/ /*! Mode initialization function \author jfpatry \date Created: 2000-09-24 \date Modified: 2000-09-24 */ static void race_select_init(void) { listbox_list_elem_to_string_fptr_t conv_func = NULL; point2d_t dummy_pos = {0, 0}; int i; winsys_set_display_func( main_loop ); winsys_set_idle_func( main_loop ); winsys_set_reshape_func( reshape ); winsys_set_mouse_func( ui_event_mouse_func ); winsys_set_motion_func( ui_event_motion_func ); winsys_set_passive_motion_func( ui_event_motion_func ); plyr = get_player_data( local_player() ); /* Setup the race list */ if ( g_game.practicing ) { g_game.current_event = "__Practice_Event__"; g_game.current_cup = "__Practice_Cup__"; race_list = get_open_courses_list(); conv_func = get_name_from_open_course_data; cup_data = NULL; last_completed_race = NULL; event_data = NULL; } else { event_data = (event_data_t*) get_list_elem_data( get_event_by_name( g_game.current_event ) ); check_assertion( event_data != NULL, "Couldn't find current event." ); cup_data = (cup_data_t*) get_list_elem_data( get_event_cup_by_name( event_data, g_game.current_cup ) ); check_assertion( cup_data != NULL, "Couldn't find current cup." ); race_list = get_cup_race_list( cup_data ); conv_func = get_name_from_race_data; } /* Unless we're coming back from a race, initialize the race data to defaults. */ if ( g_game.prev_mode != GAME_OVER ) { /* Make sure we don't play previously loaded course */ cup_complete = False; /* Initialize the race data */ cur_elem = get_list_head( race_list ); if ( g_game.practicing ) { g_game.race.course = NULL; g_game.race.name = NULL; g_game.race.description = NULL; for (i=0; i<DIFFICULTY_NUM_LEVELS; i++) { g_game.race.herring_req[i] = 0; g_game.race.time_req[i] = 0; g_game.race.score_req[i] = 0; } g_game.race.mirrored = False; g_game.race.conditions = RACE_CONDITIONS_SUNNY; g_game.race.windy = False; g_game.race.snowing = False; } else { /* Not practicing */ race_data_t *data; data = (race_data_t*) get_list_elem_data( cur_elem ); g_game.race = *data; if ( is_cup_complete( event_data, get_event_cup_by_name( event_data, g_game.current_cup ) ) ) { cup_complete = True; last_completed_race = get_list_tail( race_list ); } else { cup_complete = False; last_completed_race = NULL; } } } else { /* Back from a race */ if ( !g_game.race_aborted ) { update_race_results(); } if (!g_game.practicing && !cup_complete) { if ( was_current_race_won() ) { update_for_won_race(); /* Advance to next race */ if ( cur_elem != get_list_tail( race_list ) ) { cur_elem = get_next_list_elem( race_list, cur_elem ); } } else { /* lost race */ plyr->lives -= 1; } print_debug( DEBUG_GAME_LOGIC, "Current lives: %d", plyr->lives ); } } back_btn = button_create( dummy_pos, 80 * mWidth / 480, 48 * mHeight / 320, "button_label", (mWidth>320)?"Back":"<< " ); button_set_hilit_font_binding( back_btn, "button_label_hilit" ); button_set_visible( back_btn, True ); button_set_click_event_cb( back_btn, back_click_cb, NULL ); start_btn = button_create( dummy_pos, 80 * mWidth / 480, 48 * mHeight / 320, "button_label", (mWidth>320)?"Race":" >>" ); button_set_hilit_font_binding( start_btn, "button_label_hilit" ); button_set_disabled_font_binding( start_btn, "button_label_disabled" ); button_set_visible( start_btn, True ); button_set_click_event_cb( start_btn, start_click_cb, NULL ); #ifdef __APPLE__ race_listbox = listbox_create( dummy_pos, mWidth - 170 * mHeight / 320, 44 * mHeight / 320, "course_name_label", race_list, conv_func ); #else race_listbox = listbox_create( dummy_pos, 460 * mHeight / 320, 44 * mHeight / 320, "listbox_item", race_list, conv_func ); #endif listbox_set_current_item( race_listbox, cur_elem ); listbox_set_item_change_event_cb( race_listbox, race_listbox_item_change_cb, NULL ); listbox_set_visible( race_listbox, True ); /* * Create text area */ #ifdef __APPLE__ desc_ta = textarea_create( dummy_pos, 150, 147, "race_description", "" ); #else desc_ta = textarea_create( dummy_pos, 312, 107, "race_description", "" ); #endif if ( g_game.practicing ) { open_course_data_t *data; data = (open_course_data_t*) get_list_elem_data( cur_elem ); textarea_set_text( desc_ta, data->description ); } else { race_data_t *data; data = (race_data_t*) get_list_elem_data( cur_elem ); textarea_set_text( desc_ta, data->description ); } textarea_set_visible( desc_ta, True ); /* * Create state buttons - only if practicing or if cup_complete */ if ( g_game.practicing || cup_complete ) { /* mirror */ mirror_ssbtn = ssbutton_create( dummy_pos, 32, 32, 2 ); ssbutton_set_state_image( mirror_ssbtn, 0, "mirror_button", make_point2d( 0.0/64.0, 32.0/64.0 ), make_point2d( 32.0/64.0, 64.0/64.0 ), white ); ssbutton_set_state_image( mirror_ssbtn, 1, "mirror_button", make_point2d( 32.0/64.0, 32.0/64.0 ), make_point2d( 64.0/64.0, 64.0/64.0 ), white ); ssbutton_set_state( mirror_ssbtn, (int)g_game.race.mirrored ); #ifdef __APPLE__ ssbutton_set_visible( mirror_ssbtn, False ); #else ssbutton_set_visible( mirror_ssbtn, True ); #endif /* conditions */ conditions_ssbtn = ssbutton_create( dummy_pos, 32, 32, 4 ); float border = 2.0; ssbutton_set_state_image( conditions_ssbtn, 0, "conditions_button", make_point2d( (0.0 + border)/64.0, (32.0 + border)/64.0 ), make_point2d( (32.0 - border)/64.0, (64.0 - border)/64.0 ), white ); ssbutton_set_state_image( conditions_ssbtn, 1, "conditions_button", make_point2d( (32.0 + border)/64.0, (0.0 + border)/64.0 ), make_point2d( (64.0 - border)/64.0, (32.0 - border)/64.0 ), white ); ssbutton_set_state_image( conditions_ssbtn, 2, "conditions_button", make_point2d( (32.0 + border)/64.0, (32.0 + border)/64.0 ), make_point2d( (64.0 - border)/64.0, (64.0 - border)/64.0 ), white ); ssbutton_set_state_image( conditions_ssbtn, 3, "conditions_button", make_point2d( (0.0 + border)/64.0, (0.0 + border)/64.0 ), make_point2d( (32.0 - border)/64.0, (32.0 - border)/64.0 ), white ); ssbutton_set_state( conditions_ssbtn, (int)g_game.race.conditions ); ssbutton_set_visible( conditions_ssbtn, True ); #ifdef __APPLE__ ssbutton_set_visible( conditions_ssbtn, False ); #else ssbutton_set_visible( conditions_ssbtn, True ); #endif /* wind */ wind_ssbtn = ssbutton_create( dummy_pos, 32, 32, 2 ); ssbutton_set_state_image( wind_ssbtn, 0, "wind_button", make_point2d( 0.0/64.0, 32.0/64.0 ), make_point2d( 32.0/64.0, 64.0/64.0 ), white ); ssbutton_set_state_image( wind_ssbtn, 1, "wind_button", make_point2d( 32.0/64.0, 32.0/64.0 ), make_point2d( 64.0/64.0, 64.0/64.0 ), white ); ssbutton_set_state( wind_ssbtn, (int)g_game.race.windy ); #ifdef __APPLE__ ssbutton_set_visible( wind_ssbtn, False ); #else ssbutton_set_visible( wind_ssbtn, True ); #endif /* snow */ snow_ssbtn = ssbutton_create( dummy_pos, 32, 32, 2 ); ssbutton_set_state_image( snow_ssbtn, 0, "snow_button", make_point2d( 0.0/64.0, 32.0/64.0 ), make_point2d( 32.0/64.0, 64.0/64.0 ), white ); ssbutton_set_state_image( snow_ssbtn, 1, "snow_button", make_point2d( 32.0/64.0, 32.0/64.0 ), make_point2d( 64.0/64.0, 64.0/64.0 ), white ); ssbutton_set_state( snow_ssbtn, (int)g_game.race.snowing ); #ifdef __APPLE__ ssbutton_set_visible( snow_ssbtn, False ); #else ssbutton_set_visible( snow_ssbtn, True ); #endif /* XXX snow button doesn't do anything, so disable for now */ ssbutton_set_enabled( snow_ssbtn, False ); /* Can't change conditions if in cup mode */ if ( !g_game.practicing ) { ssbutton_set_enabled( conditions_ssbtn, False ); ssbutton_set_enabled( wind_ssbtn, False ); ssbutton_set_enabled( snow_ssbtn, False ); ssbutton_set_enabled( mirror_ssbtn, False ); } } else { conditions_ssbtn = NULL; wind_ssbtn = NULL; snow_ssbtn = NULL; mirror_ssbtn = NULL; } update_race_data(); update_button_enabled_states(); play_music( "start_screen" ); }
/*! Mode initialization function \author jfpatry \date Created: 2000-09-24 \date Modified: 2000-09-24 */ static void race_select_init(void) { listbox_list_elem_to_string_fptr_t conv_func = NULL; point2d_t dummy_pos = {0, 0}; int i; winsys_set_display_func( main_loop ); winsys_set_idle_func( main_loop ); winsys_set_reshape_func( reshape ); winsys_set_mouse_func( ui_event_mouse_func ); winsys_set_motion_func( ui_event_motion_func ); winsys_set_passive_motion_func( ui_event_motion_func ); plyr = get_player_data( local_player() ); /* Setup the race list */ if ( g_game.practicing ) { g_game.current_event = "__Practice_Event__"; g_game.current_cup = "__Practice_Cup__"; if(g_game.is_speed_only_mode) race_list = get_speed_courses_list(); else race_list = get_score_courses_list(); conv_func = get_name_from_open_course_data; cup_data = NULL; last_completed_race = NULL; event_data = NULL; } else { event_data = (event_data_t*) get_list_elem_data( get_event_by_name( g_game.current_event ) ); check_assertion( event_data != NULL, "Couldn't find current event." ); cup_data = (cup_data_t*) get_list_elem_data( get_event_cup_by_name( event_data, g_game.current_cup ) ); check_assertion( cup_data != NULL, "Couldn't find current cup." ); race_list = get_cup_race_list( cup_data ); conv_func = get_name_from_race_data; } /* Unless we're coming back from a race, initialize the race data to defaults. */ if ( g_game.prev_mode != GAME_OVER ) { /* Make sure we don't play previously loaded course */ cup_complete = False; /* Initialize the race data */ cur_elem = get_list_head( race_list ); if ( g_game.practicing ) { g_game.race.course = NULL; g_game.race.name = NULL; g_game.race.description = NULL; for (i=0; i<DIFFICULTY_NUM_LEVELS; i++) { g_game.race.herring_req[i] = 0; g_game.race.time_req[i] = 0; g_game.race.score_req[i] = 0; } g_game.race.mirrored = False; g_game.race.conditions = RACE_CONDITIONS_SUNNY; g_game.race.windy = False; g_game.race.snowing = False; } else { /* Not practicing */ race_data_t *data; data = (race_data_t*) get_list_elem_data( cur_elem ); g_game.race = *data; if ( is_cup_complete( event_data, get_event_cup_by_name( event_data, g_game.current_cup ) ) ) { cup_complete = True; last_completed_race = get_list_tail( race_list ); } else { cup_complete = False; last_completed_race = NULL; } } } else { /* Back from a race */ if ( !g_game.race_aborted ) { update_race_results(); } } back_btn = button_create( dummy_pos, 150, 40, "button_label", Localize("Back","") ); button_set_hilit_font_binding( back_btn, "button_label_hilit" ); button_set_visible( back_btn, True ); button_set_click_event_cb( back_btn, back_click_cb, NULL ); start_btn = button_create( dummy_pos, 150, 40, "button_label", Localize("Race!","") ); button_set_hilit_font_binding( start_btn, "button_label_hilit" ); button_set_disabled_font_binding( start_btn, "button_label_disabled" ); button_set_visible( start_btn, True ); button_set_click_event_cb( start_btn, start_click_cb, NULL ); #ifdef __APPLE__ race_listbox = listbox_create( dummy_pos, 300, 44, "course_name_label", race_list, conv_func ); #else race_listbox = listbox_create( dummy_pos, 460, 44, "listbox_item", race_list, conv_func ); #endif listbox_set_current_item( race_listbox, cur_elem ); listbox_set_item_change_event_cb( race_listbox, race_listbox_item_change_cb, NULL ); listbox_set_visible( race_listbox, True ); /* * Create text area */ #ifdef __APPLE__ desc_ta = textarea_create( dummy_pos, 170, 147, "race_description", "" ); #else desc_ta = textarea_create( dummy_pos, 312, 107, "race_description", "" ); #endif if ( g_game.practicing ) { open_course_data_t *data; data = (open_course_data_t*) get_list_elem_data( cur_elem ); textarea_set_text( desc_ta, data->description ); } else { race_data_t *data; data = (race_data_t*) get_list_elem_data( cur_elem ); textarea_set_text( desc_ta, data->description ); } textarea_set_visible( desc_ta, True ); /* * Create state buttons - only if practicing or if cup_complete */ if ( g_game.practicing || cup_complete ) { /* mirror */ mirror_ssbtn = ssbutton_create( dummy_pos, 32, 32, 2 ); ssbutton_set_state_image( mirror_ssbtn, 0, "mirror_button", make_point2d( 0.0/64.0, 32.0/64.0 ), make_point2d( 32.0/64.0, 64.0/64.0 ), white ); ssbutton_set_state_image( mirror_ssbtn, 1, "mirror_button", make_point2d( 32.0/64.0, 32.0/64.0 ), make_point2d( 64.0/64.0, 64.0/64.0 ), white ); ssbutton_set_state( mirror_ssbtn, (int)g_game.race.mirrored ); #ifdef __APPLE__ ssbutton_set_visible( mirror_ssbtn, False ); #else ssbutton_set_visible( mirror_ssbtn, True ); #endif /* conditions */ conditions_ssbtn = ssbutton_create( dummy_pos, 32, 32, 4 ); float border = 2.0; ssbutton_set_state_image( conditions_ssbtn, 0, "conditions_button", make_point2d( (0.0 + border)/64.0, (32.0 + border)/64.0 ), make_point2d( (32.0 - border)/64.0, (64.0 - border)/64.0 ), white ); ssbutton_set_state_image( conditions_ssbtn, 1, "conditions_button", make_point2d( (32.0 + border)/64.0, (0.0 + border)/64.0 ), make_point2d( (64.0 - border)/64.0, (32.0 - border)/64.0 ), white ); ssbutton_set_state_image( conditions_ssbtn, 2, "conditions_button", make_point2d( (32.0 + border)/64.0, (32.0 + border)/64.0 ), make_point2d( (64.0 - border)/64.0, (64.0 - border)/64.0 ), white ); ssbutton_set_state_image( conditions_ssbtn, 3, "conditions_button", make_point2d( (0.0 + border)/64.0, (0.0 + border)/64.0 ), make_point2d( (32.0 - border)/64.0, (32.0 - border)/64.0 ), white ); ssbutton_set_state( conditions_ssbtn, (int)g_game.race.conditions ); ssbutton_set_visible( conditions_ssbtn, True ); #ifdef __APPLE__ ssbutton_set_visible( conditions_ssbtn, False ); #else ssbutton_set_visible( conditions_ssbtn, True ); #endif /* wind */ wind_ssbtn = ssbutton_create( dummy_pos, 32, 32, 2 ); ssbutton_set_state_image( wind_ssbtn, 0, "wind_button", make_point2d( 0.0/64.0, 32.0/64.0 ), make_point2d( 32.0/64.0, 64.0/64.0 ), white ); ssbutton_set_state_image( wind_ssbtn, 1, "wind_button", make_point2d( 32.0/64.0, 32.0/64.0 ), make_point2d( 64.0/64.0, 64.0/64.0 ), white ); ssbutton_set_state( wind_ssbtn, (int)g_game.race.windy ); #ifdef __APPLE__ ssbutton_set_visible( wind_ssbtn, False ); #else ssbutton_set_visible( wind_ssbtn, True ); #endif /* snow */ snow_ssbtn = ssbutton_create( dummy_pos, 32, 32, 2 ); ssbutton_set_state_image( snow_ssbtn, 0, "snow_button", make_point2d( 0.0/64.0, 32.0/64.0 ), make_point2d( 32.0/64.0, 64.0/64.0 ), white ); ssbutton_set_state_image( snow_ssbtn, 1, "snow_button", make_point2d( 32.0/64.0, 32.0/64.0 ), make_point2d( 64.0/64.0, 64.0/64.0 ), white ); ssbutton_set_state( snow_ssbtn, (int)g_game.race.snowing ); #ifdef __APPLE__ ssbutton_set_visible( snow_ssbtn, False ); #else ssbutton_set_visible( snow_ssbtn, True ); #endif /* XXX snow button doesn't do anything, so disable for now */ ssbutton_set_enabled( snow_ssbtn, False ); /* Can't change conditions if in cup mode */ if ( !g_game.practicing ) { ssbutton_set_enabled( conditions_ssbtn, False ); ssbutton_set_enabled( wind_ssbtn, False ); ssbutton_set_enabled( snow_ssbtn, False ); ssbutton_set_enabled( mirror_ssbtn, False ); } } else { conditions_ssbtn = NULL; wind_ssbtn = NULL; snow_ssbtn = NULL; mirror_ssbtn = NULL; } update_race_data(); update_button_enabled_states(); play_music( "start_screen" ); }
/*! Sets the widget positions and draws other on-screen goo \author jfpatry \date Created: 2000-09-24 \date Modified: 2000-09-24 */ static void set_widget_positions_and_draw_decorations() { int w = getparam_x_resolution(); int h = getparam_y_resolution(); int box_width, box_height, box_max_y; int x_org, y_org; char *current_course; GLuint texobj; /* set the dimensions of the box in which all widgets should fit */ box_width = 300; box_height = 310; box_max_y = h - 128; x_org = 10; y_org = h/2 - box_height/2; if ( y_org + box_height > box_max_y ) { y_org = box_max_y - box_height; } button_set_position( back_btn, make_point2d(MARGIN_WIDTH, MARGIN_HEIGHT ) ); button_set_position( start_btn, make_point2d(w - button_get_width( start_btn ) - MARGIN_WIDTH, MARGIN_HEIGHT ) ); listbox_set_position( race_listbox, make_point2d( x_org, y_org + 235 ) ); textarea_set_position( desc_ta, make_point2d( x_org + w - textarea_get_width(desc_ta) - 10, y_org + 26)); if ( g_game.practicing || ( cup_complete && conditions_ssbtn && wind_ssbtn && snow_ssbtn && mirror_ssbtn ) ) { ssbutton_set_position( conditions_ssbtn, make_point2d( x_org + box_width - 4*36 + 4, y_org + 151 ) ); ssbutton_set_position( wind_ssbtn, make_point2d( x_org + box_width - 3*36 + 4 , y_org + 151 ) ); ssbutton_set_position( snow_ssbtn, make_point2d( x_org + box_width - 2*36 + 4, y_org + 151 ) ); ssbutton_set_position( mirror_ssbtn, make_point2d( x_org + box_width - 1*36 + 4, y_org + 151 ) ); } /* Draw text indicating race requirements (if race not completed), or results in race if race completed. */ draw_status_msg( x_org, y_org, box_width, box_height ); /* Draw preview */ if ( g_game.practicing ) { list_elem_t elem; open_course_data_t *data; elem = listbox_get_current_item( race_listbox ); data = (open_course_data_t*) get_list_elem_data( elem ); current_course = data->course; } else { list_elem_t elem; race_data_t *data; elem = listbox_get_current_item( race_listbox ); data = (race_data_t*) get_list_elem_data( elem ); current_course = data->course; } glDisable( GL_TEXTURE_2D ); glColor4f( 0.0, 0.0, 0.0, 0.3 ); #ifdef __APPLE__ float margin = 4.f; float yoffset = 26 + 30; glBegin( GL_QUADS ); { glVertex2f( x_org, y_org + yoffset ); glVertex2f( x_org + 140, y_org + yoffset ); glVertex2f( x_org + 140, y_org + yoffset+107 ); glVertex2f( x_org, y_org + yoffset+107 ); } glEnd(); #else glBegin( GL_QUADS ); { glVertex2f( x_org+box_width-140, y_org+66 ); glVertex2f( x_org+box_width, y_org+66 ); glVertex2f( x_org+box_width, y_org+66+107 ); glVertex2f( x_org+box_width-140, y_org+66+107 ); } glEnd(); #endif glColor4f( 1.0, 1.0, 1.0, 1.0 ); glEnable( GL_TEXTURE_2D ); if ( !get_texture_binding( current_course, &texobj ) ) { if ( !get_texture_binding( "no_preview", &texobj ) ) { texobj = 0; } } glBindTexture( GL_TEXTURE_2D, texobj ); #ifdef __APPLE__ glBegin( GL_QUADS ); { glTexCoord2d( 0, 0); glVertex2f( x_org + margin, y_org + yoffset+margin ); glTexCoord2d( 1, 0); glVertex2f( x_org + 140 - margin, y_org + yoffset+margin ); glTexCoord2d( 1, 1); glVertex2f( x_org + 140 - margin, y_org + yoffset+margin+99 ); glTexCoord2d( 0, 1); glVertex2f( x_org + margin, y_org + yoffset+margin+99 ); } glEnd(); #else glBegin( GL_QUADS ); { glTexCoord2d( 0, 0); glVertex2f( x_org+box_width-136, y_org+70 ); glTexCoord2d( 1, 0); glVertex2f( x_org+box_width-4, y_org+70 ); glTexCoord2d( 1, 1); glVertex2f( x_org+box_width-4, y_org+70+99 ); glTexCoord2d( 0, 1); glVertex2f( x_org+box_width-136, y_org+70+99 ); } glEnd(); #endif }
static void race_select_init(void) { point2d_t dummy_pos = {0, 0}; coord_t button_coord; list_elem_t tmp; int i; scoreboard_open=True; winsys_set_display_func( main_loop ); winsys_set_idle_func( main_loop ); winsys_set_reshape_func( reshape ); winsys_set_mouse_func( GameMenu_mouse_func ); winsys_set_motion_func( GameMenu_motion_func ); winsys_set_passive_motion_func( GameMenu_motion_func ); winsys_set_joystick_func( NULL ); winsys_set_joystick_button_func( NULL ); winsys_reset_js_bindings(); winsys_add_js_axis_bindings(); winsys_add_js_button_binding(SDL_CONTROLLER_BUTTON_A, SDLK_RETURN); winsys_add_js_button_binding(SDL_CONTROLLER_BUTTON_B, SDLK_ESCAPE); winsys_add_js_button_binding(SDL_CONTROLLER_BUTTON_DPAD_LEFT, SDLK_LEFT); winsys_add_js_button_binding(SDL_CONTROLLER_BUTTON_DPAD_RIGHT, SDLK_RIGHT); GameMenu_init(); setup_gui(); plyr = get_player_data( local_player() ); /* Setup the race list */ if ( g_game.practicing ) { g_game.current_event = "__Practice_Event__"; g_game.current_cup = "__Practice_Cup__"; #ifdef SPEED_MODE if(g_game.is_speed_only_mode) race_list = get_speed_courses_list(); else race_list = get_score_courses_list(); #else race_list = get_score_courses_list(); #endif cup_data = NULL; last_completed_race = NULL; event_data = NULL; } /* Unless we're coming back from a race, initialize the race data to defaults. */ if ( g_game.prev_mode != GAME_OVER ) { /* Make sure we don't play previously loaded course */ cup_complete = False; /* Initialize the race data */ if (cur_elem==NULL) { cur_elem = get_list_head( race_list ); } else { bool_t needs_changing=False; tmp=get_list_head(race_list); while (tmp!=cur_elem && tmp!=NULL) { tmp=get_next_list_elem(race_list, tmp); } if (!tmp) { cur_elem = get_list_head( race_list ); } } if ( g_game.practicing ) { g_game.race.course = NULL; g_game.race.name = NULL; g_game.race.description = NULL; for (i=0; i<DIFFICULTY_NUM_LEVELS; i++) { g_game.race.herring_req[i] = 0; g_game.race.time_req[i] = 0; g_game.race.score_req[i] = 0; } g_game.race.mirrored = False; g_game.race.conditions = RACE_CONDITIONS_SUNNY; g_game.race.windy = False; g_game.race.snowing = False; } else { /* Not practicing */ race_data_t *data; data = (race_data_t*) get_list_elem_data( cur_elem ); g_game.race = *data; if ( is_cup_complete( event_data, get_event_cup_by_name( event_data, g_game.current_cup ) ) ) { cup_complete = True; last_completed_race = get_list_tail( race_list ); } else { cup_complete = False; last_completed_race = NULL; } } } else { /* Back from a race */ if ( !g_game.race_aborted ) { update_race_results(); } } /* * Create text area */ desc_ta = textarea_create( make_point2d( 0.1*getparam_x_resolution(), 0.2*getparam_y_resolution()), 0.4*getparam_x_resolution(), 0.23*getparam_y_resolution(), "race_description", "" ); textarea_set_visible( desc_ta, True ); update_race_data(); button_coord.x_coord_type=button_coord.y_coord_type=NORMALIZED_COORD; button_coord.x=0.50; button_coord.y=0.85; button_coord.x_just=CENTER_JUST; button_coord.y_just=CENTER_JUST; gui_add_widget(course_title_label=create_label(""), &button_coord); button_coord.x=0.1; button_coord.x_just=LEFT_JUST; gui_add_widget(prev_course_btn=create_button(LEFT_ARROW, prev_cb), &button_coord); button_coord.x=0.9; button_coord.x_just=RIGHT_JUST; gui_add_widget(next_course_btn=create_button(RIGHT_ARROW, next_cb), &button_coord); course_title_label->font_binding="race_selection_title"; prev_course_btn->font_binding="race_selection_title"; next_course_btn->font_binding="race_selection_title"; button_coord.x=0.30; button_coord.y=0.09; button_coord.x_just=CENTER_JUST; gui_add_widget(back_button=create_button(get_back_text(), back_cb), &button_coord); button_coord.x=0.70; gui_add_widget(play_button=create_button(get_race_text(), play_cb), &button_coord); init_scoreboard_labels(); init_scoreboard(); play_music( "start_screen" ); }
tex_font_metrics_t* load_tex_font_metrics( char *filename ) { tex_font_metrics_t *tfm = NULL; FILE *tfm_file = NULL; int i; char magic[4]; char *err_msg; int endian_check; bool_t swap_bytes; struct char_dims ch_dims; int num_chars; int texture_width, texture_height; char dummy; check_assertion( sizeof(int) == 4, "This architecture's integer size is != 4" ); check_assertion( sizeof(short) == 2, "This architecture's short integer size is != 2" ); check_assertion( sizeof(char) == 1, "This architecture's char size is != 1" ); /* Open file */ tfm_file = fopen( filename, "rb" ); if ( tfm_file == NULL ) { print_warning( MISSING_FILE_WARNING, "Couldn't open font metrics file %s", filename ); return NULL; } tfm = (tex_font_metrics_t*)malloc( sizeof(tex_font_metrics_t) ); check_assertion( tfm != NULL, "out of memory" ); /* Initialize tfm */ for (i=0; i<MAX_TEX_FONT_CHARS; i++) { tfm->char_data[i] = NULL; } /* Check magic number */ READ_BYTES( tfm_file, magic, sizeof(magic), False ); if ( strncmp( magic, "\377tfm", 4 ) != 0 ) { err_msg = "File is not a valid tfm file"; goto bail; } /* Check endian-ness */ READ_BYTES( tfm_file, &endian_check, sizeof(int), False ); if ( endian_check == 0x12345678 ) { swap_bytes = False; } else if ( endian_check == 0x78563412 ) { swap_bytes = True; } else { err_msg = "File is not a valid tfm file"; goto bail; } /* Read in texture_width, texture_height, max_ascent, max_descent */ READ_BYTES( tfm_file, &texture_width, sizeof(int), swap_bytes ); READ_BYTES( tfm_file, &texture_height, sizeof(int), swap_bytes ); READ_BYTES( tfm_file, &tfm->max_ascent, sizeof(int), swap_bytes ); READ_BYTES( tfm_file, &tfm->max_descent, sizeof(int), swap_bytes ); READ_BYTES( tfm_file, &num_chars, sizeof(int), swap_bytes ); for (i=0; i<num_chars; i++) { tfm_char_data_t *cd; scalar_t sstep = 0.5/texture_width; scalar_t tstep = 0.5/texture_height; READ_BYTES( tfm_file, &ch_dims.ch, sizeof(unsigned short), swap_bytes ); READ_BYTES( tfm_file, &ch_dims.w, sizeof(unsigned char), False ); READ_BYTES( tfm_file, &ch_dims.h, sizeof(unsigned char), False ); READ_BYTES( tfm_file, &ch_dims.x_offset, sizeof(char), False ); READ_BYTES( tfm_file, &ch_dims.y_offset, sizeof(char), False ); READ_BYTES( tfm_file, &ch_dims.kern_width, sizeof(char), False ); READ_BYTES( tfm_file, &dummy, sizeof(char), False ); READ_BYTES( tfm_file, &ch_dims.x_pixel, sizeof(short), swap_bytes ); READ_BYTES( tfm_file, &ch_dims.y_pixel, sizeof(short), swap_bytes ); if ( ch_dims.ch >= MAX_TEX_FONT_CHARS ) { err_msg = "Two-byte characters are not supported"; goto bail; } cd = ( tfm_char_data_t * ) malloc( sizeof( tfm_char_data_t ) ); check_assertion( cd != NULL, "out of memory" ); cd->ll = make_point2d( ch_dims.x_offset, ch_dims.y_offset ); cd->lr = make_point2d( cd->ll.x + ch_dims.w, cd->ll.y ); cd->ur = make_point2d( cd->lr.x, cd->lr.y + ch_dims.h ); cd->ul = make_point2d( cd->ur.x - ch_dims.w, cd->ur.y ); cd->tex_ll = make_point2d( ch_dims.x_pixel / (scalar_t)texture_width + sstep, ch_dims.y_pixel / (scalar_t)texture_height + tstep ); cd->tex_lr = make_point2d( cd->tex_ll.x + sstep + ch_dims.w / (scalar_t)texture_width, cd->tex_ll.y + tstep ); cd->tex_ur = make_point2d( cd->tex_lr.x + sstep, cd->tex_lr.y + tstep + ch_dims.h / (scalar_t)texture_height ); cd->tex_ul = make_point2d( cd->tex_ur.x + sstep - ch_dims.w / (scalar_t)texture_width, cd->tex_ur.y + tstep ); cd->kern_width = ch_dims.kern_width; tfm->char_data[ch_dims.ch] = cd; } fclose( tfm_file ); return tfm; bail: if ( tfm != NULL ) { for (i=0; i<MAX_TEX_FONT_CHARS; i++) { if ( tfm->char_data[i] != NULL ) { free( tfm->char_data[i] ); } } free( tfm ); } if ( tfm_file != NULL ) { fclose( tfm_file ); } print_warning( IMPORTANT_WARNING, "Error opening font metrics file `%s': %s\n", filename, err_msg ); return NULL; }
/*! Creates a new listbox \return The new listbox object \author jfpatry \date Created: 2000-09-17 \date Modified: 2000-09-17 */ listbox_t* listbox_create( point2d_t pos, scalar_t w, scalar_t h, char *font_binding, list_t item_list, listbox_list_elem_to_string_fptr_t func ) { listbox_t *listbox; char *binding; point2d_t ll; point2d_t ur; listbox = (listbox_t*)malloc( sizeof(listbox_t) ); check_assertion( listbox != NULL, "out of memory" ); listbox->pos = pos; listbox->w = w; listbox->h = h; listbox->arrow_width = DEFAULT_ARROW_REGION_WIDTH; listbox->border_width = DEFAULT_BORDER_WIDTH; listbox->text_pad = DEFAULT_TEXT_PAD; listbox->arrow_vert_separation = DEFAULT_ARROW_VERT_SEPARATION; listbox->font_binding = font_binding; listbox->border_colour = ui_foreground_colour; listbox->background_colour = ui_background_colour; /* Create up arrow button */ listbox->up_button = button_create( make_point2d( 0, 0 ), /* position will be set later */ DEFAULT_ARROW_BUTTON_WIDTH, (mWidth>320)?DEFAULT_ARROW_BUTTON_HEIGHT:DEFAULT_ARROW_BUTTON_HEIGHT/2, NULL, NULL ); binding = "listbox_arrows"; ll = make_point2d( 0.0/64.0, 16.0/64.0 ); ur = make_point2d( 32.0/64.0, 32.0/64.0 ); button_set_image( listbox->up_button, binding, ll, ur, white ); ll = make_point2d( 32.0/64.0, 16.0/64.0 ); ur = make_point2d( 64.0/64.0, 32.0/64.0 ); button_set_disabled_image( listbox->up_button, binding, ll, ur, white ); ll = make_point2d( 32.0/64.0, 48.0/64.0 ); ur = make_point2d( 64.0/64.0, 64.0/64.0 ); button_set_hilit_image( listbox->up_button, binding, ll, ur, white ); ll = make_point2d( 0.0/64.0, 48.0/64.0 ); ur = make_point2d( 32.0/64.0, 64.0/64.0 ); button_set_clicked_image( listbox->up_button, binding, ll, ur, white ); button_set_click_event_cb( listbox->up_button, listbox_arrow_click_cb, listbox ); /* Create down arrow button */ listbox->down_button = button_create( make_point2d( 0, 0 ), /* position will be set later */ DEFAULT_ARROW_BUTTON_WIDTH, (mWidth>320)?DEFAULT_ARROW_BUTTON_HEIGHT:DEFAULT_ARROW_BUTTON_HEIGHT/2, NULL, NULL ); binding = "listbox_arrows"; ll = make_point2d( 0.0/64.0, 0.0/64.0 ); ur = make_point2d( 32.0/64.0, 16.0/64.0 ); button_set_image( listbox->down_button, binding, ll, ur, white ); ll = make_point2d( 32.0/64.0, 0.0/64.0 ); ur = make_point2d( 64.0/64.0, 16.0/64.0 ); button_set_disabled_image( listbox->down_button, binding, ll, ur, white ); ll = make_point2d( 32.0/64.0, 32.0/64.0 ); ur = make_point2d( 64.0/64.0, 48.0/64.0 ); button_set_hilit_image( listbox->down_button, binding, ll, ur, white ); ll = make_point2d( 0.0/64.0, 32.0/64.0 ); ur = make_point2d( 32.0/64.0, 48.0/64.0 ); button_set_clicked_image( listbox->down_button, binding, ll, ur, white ); button_set_click_event_cb( listbox->down_button, listbox_arrow_click_cb, listbox ); button_set_click_event_cb( listbox->down_button, listbox_arrow_click_cb, listbox ); listbox->item_change_cb = NULL; listbox->item_change_cb_userdata = NULL; listbox->item_list = item_list; listbox->cur_item = get_list_head( listbox->item_list ); listbox->label_gen_func = func; listbox->visible = False; listbox->active = False; update_button_enabled_states( listbox ); update_button_positions( listbox ); return listbox; }