195 lines
6.3 KiB
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;
|
|
}
|