Files
commandergenius/project/jni/application/lbreakout2/client/display.c

195 lines
6.3 KiB
C

/***************************************************************************
display.c - description
-------------------
begin : Thu Sep 6 2001
copyright : (C) 2001 by Michael Speck
email : kulkanie@gmx.net
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include "lbreakout.h"
#include "display.h"
extern SDL_Surface *offscreen;
extern SDL_Surface *stk_display;
extern StkFont *display_font;
extern StkFont *display_highlight_font;
List *displays = 0;
/*
====================================================================
Locals
====================================================================
*/
/*
====================================================================
Delete a display
====================================================================
*/
void display_delete( void *ptr )
{
Display *display = ptr;
if ( display ) {
stk_surface_free( &display->surf );
free( display );
}
}
/*
====================================================================
Publics
====================================================================
*/
/*
====================================================================
Add a display. The display is cleared by displays_clear() so
the returned display is just a pointer.
The contents of the display is 'text'+'value'. Both may be changed
with the display_set_text/value() functions.
'digits' is the maxium size of 'value'
====================================================================
*/
Display* displays_add( int x, int y, int w, int h, char *text, int value, int digits )
{
Display *display = 0;
if ( displays == 0 )
displays = list_create( LIST_AUTO_DELETE, display_delete );
display = calloc( 1, sizeof( Display ) );
if ( display == 0 ) return 0;
if ( ( display->surf = stk_surface_create( SDL_SWSURFACE,w,h ) ) == 0 ) {
free( display );
return 0;
}
SDL_SetColorKey( display->surf, 0, 0 );
display->use_alpha = 1;
display->x = x;
display->y = y;
display->w = w;
display->h = h;
display->digits = digits;
strcpy( display->text, text );
display->value = value;
display->cur_value = value;
list_add( displays, display );
return display;
}
/*
====================================================================
Remove all displays
====================================================================
*/
void displays_clear()
{
if ( displays ) {
list_delete( displays );
displays = 0;
}
}
/*
====================================================================
Draw displays
====================================================================
*/
void displays_hide()
{
Display *display;
if ( displays == 0 ) return;
list_reset( displays );
while ( ( display = list_next( displays ) ) ) {
stk_surface_blit(offscreen, display->x, display->y,
display->w, display->h,
stk_display, display->x, display->y );
stk_display_store_drect();
}
}
void displays_show()
{
int i;
char str[64], numstr[10];
StkFont *font;
Display *display;
if ( displays == 0 ) return;
list_reset( displays );
display_font->align = STK_FONT_ALIGN_LEFT | STK_FONT_ALIGN_TOP;
display_highlight_font->align = STK_FONT_ALIGN_LEFT | STK_FONT_ALIGN_TOP;
while ( ( display = list_next( displays ) ) ) {
if (display->is_highlighted)
font = display_highlight_font;
else
font = display_font;
strcpy( str, display->text );
if ( display->digits > 0 ) {
sprintf( numstr, "%i", (int)display->cur_value );
for ( i = 0; i < display->digits - strlen( numstr ); i++ )
strcat( str, " " );
strcat( str, numstr );
}
if ( display->use_alpha ) {
stk_surface_alpha_blit( display->surf, 0,0,
display->w, display->h,
stk_display, display->x, display->y, 128 );
}
stk_font_write( font, stk_display,
display->x + 2, display->y + 1, -1, str );
}
}
/*
====================================================================
Update displays
====================================================================
*/
void displays_update( int ms )
{
float change;
Display *display;
if ( displays == 0 ) return;
list_reset( displays );
while ( ( display = list_next( displays ) ) ) {
if ( (int)display->cur_value == display->value ) continue;
/* change relative as for big display->cur_values we must count faster */
change = ( display->value - display->cur_value ) / 200;
if ( change > 0 && change < 0.6 ) change = 0.6;
if ( change < 0 && change > -0.6 ) change = -0.6;
display->cur_value += change * ms;
if ( change > 0 && display->cur_value > display->value )
display->cur_value = display->value;
if ( change < 0 && display->cur_value < display->value )
display->cur_value = display->value;
}
}
/*
====================================================================
Modify display
====================================================================
*/
void display_set_text( Display *display, char *text )
{
strcpy( display->text, text );
}
void display_set_value( Display *display, int value )
{
display->value = value;
}
void display_set_value_directly( Display *display, int value )
{
display->cur_value = value; /* no smooth approaching of the dest value */
display->value = value;
}
void display_set_highlight( Display *display, int on )
{
display->is_highlighted = on;
}