/*************************************************************************** stk.h - description ------------------- begin : Thu Oct 12 2002 copyright : (C) 2002 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. * * * ***************************************************************************/ #ifndef __STK_H #define __STK_H #include #ifdef AUDIO_ENABLED #include #endif /* GENERAL */ #define SDL_NONFATAL 0x10000000 #define STK_ABORT( msg ) \ { fprintf( stderr, "Fatal STK Error!\n%s\n", msg ); exit( 1 ); } #define STK_IN_RECT( rect, mx, my ) \ ( mx >= (rect).x && my >= (rect).y && \ mx < (rect).x + (rect).w && my < (rect).y + (rect).h ) #define STK_OPAQUE SDL_ALPHA_OPAQUE #define STK_TRANSPARENT SDL_ALPHA_TRANSPARENT enum { STK_BUTTON_LEFT = 1, STK_BUTTON_MIDDLE, STK_BUTTON_RIGHT, STK_WHEEL_UP, STK_WHEEL_DOWN, STK_BUTTON_COUNT }; /* ==================================================================== Initiate SDL, build a default cursor and install the clean up function stk_quit(). ==================================================================== */ void stk_init( int flags ); /* ==================================================================== Block until either a key or button was pressed. If SDL_QUIT was received this will set stk_quit_request True. ==================================================================== */ void stk_wait_for_input( void ); /* SCREEN */ /* ==================================================================== Open a display with the passed settings. Depth may be modified due to Xserver settings and if the resolution is completely unavailable 640 x 480 x 16 x SDL_SWSURFACE is opened. If the display is already open it is closed and re-opened. There is no function to close the display as this is handled by the stk_quit() function installed by stk_init(). The display can be accessed by extern SDL_Surface *stk_display; This funtion returns True if the wanted width and height are available, False if not and it aborts when no display is found. ==================================================================== */ int stk_display_open( int flags, int width, int height, int depth ); /* ==================================================================== Add an update rectangle that will be updated by stk_display_update(). Regardless of clipping the rectangles must fit the screen else it'll raise an X error. If NULL is passed as 'rect' the whole screen is stored for update. ==================================================================== */ void stk_display_store_rect( SDL_Rect *rect ); /* ==================================================================== Store the destination rectangle of the last blit operation. SDL modified this rectangle to the actually updated clipping region. ==================================================================== */ void stk_display_store_drect( void ); /* ==================================================================== Either update all gathered rects or simply the full screen. In any case the stored regions are cleared. ==================================================================== */ enum { STK_UPDATE_ALL = 0, STK_UPDATE_RECTS }; void stk_display_update( int type ); /* ==================================================================== Fade the current contents of the display either in or out. 'time' is the time in milliseconds the fading is supposed to take. ==================================================================== */ enum { STK_FADE_IN = 0, STK_FADE_OUT, STK_FADE_DEFAULT_TIME = 350 }; void stk_display_fade( int type, int time ); /* ==================================================================== Take a screenshot and save it to screenshot[index].bmp in the current directory. ==================================================================== */ void stk_display_take_screenshot(); /* ==================================================================== Switch fullscreen/windowed for current resolution. ==================================================================== */ void stk_display_apply_fullscreen( int fullscreen ); /* SURFACE */ /* ==================================================================== If stk_surface_load() is called with a relative path this prefix is added. Default is '.'; 'path' is copied. ==================================================================== */ void stk_surface_set_path( char *path ); /* ==================================================================== Load a surface from a path. If it's not an absolute directory (starting with '/') the prefix passed in stk_surface_set_path() is prepended. If a video mode was set the surface will be converted to its format to speed up blitting. As resource either BMP or PNG may be provided. If SDL_NONFATAL is passed a warning is displayed and the function returns NULL else it will exit the program with an error. The default color key of the surface is black and no alpha. ==================================================================== */ SDL_Surface* stk_surface_load( int flags, char *format, ... ); /* ==================================================================== Create a surface with the given size and the format of the video mode which must be set. The default color key of the surface is black and no alpha. ==================================================================== */ SDL_Surface* stk_surface_create( int flags, int width, int height ); /* ==================================================================== Free the memory of a surface if not NULL and reset the pointer to NULL. ==================================================================== */ void stk_surface_free( SDL_Surface **surface ); /* ==================================================================== Blit retangle from 'src' to 'dest' with current alpha of 'src'. If 'sw' is -1 the full source width is used, 'sh' analogue. stk_display_store_drect() can be used to store the update rect of the blitted surface. ==================================================================== */ void stk_surface_blit( SDL_Surface *src, int sx, int sy, int sw, int sh, SDL_Surface *dest, int dx, int dy ); /* ==================================================================== Different from stk_surface_blit() this function temporarily overwrites 'src's alpha value. It is not recommended to use this function if performance is important as it is 10 times slower than an SDL_SetAlpha() combined with stk_surface_blit(). ==================================================================== */ void stk_surface_alpha_blit( SDL_Surface *src, int sx, int sy, int sw, int sh, SDL_Surface *dest, int dx, int dy, int alpha ); /* ==================================================================== Fill a rectangle of the surface with a given color of the format 0xRRGGBB. 'dw' == -1 and 'dh' == -1 have the same effect as in stk_surface_blit(). ==================================================================== */ void stk_surface_fill( SDL_Surface *dest, int dx, int dy, int dw, int dh, int color ); /* ==================================================================== Set the clipping region of a surface. All blit operations into this surface will only have effect within the clipping region. 'dw' == -1 and 'dh' == -1 have the same effect as in stk_surface_blit(). ==================================================================== */ void stk_surface_clip( SDL_Surface *dest, int dx, int dy, int dw, int dh ); /* ==================================================================== Lock/unlock surface for direct access. ==================================================================== */ #define stk_surface_lock( surface ) \ if (SDL_MUSTLOCK((surface))) SDL_LockSurface((surface)) #define stk_surface_unlock( surface ) \ if (SDL_MUSTLOCK((surface))) SDL_UnlockSurface((surface)) /* ==================================================================== Get or set a pixel from/to a surface. This time the pixel must already be in SDL format. ==================================================================== */ void stk_surface_set_pixel( SDL_Surface *dest, int dx, int dy, Uint32 pixel ); Uint32 stk_surface_get_pixel( SDL_Surface *src, int sx, int sy ); /* ==================================================================== Convert part of the surface to gray and if 'dark' is set cut the brightness in half. 'dw' == -1 and 'dh' == -1 have the same effect as in tk_surface_blit(). ==================================================================== */ void stk_surface_gray( SDL_Surface *dest, int dx, int dy, int dw, int dh, int dark ); /* ==================================================================== Add a 3D frame to surface and dark to contents. The frame border is 'border' thick. ==================================================================== */ void stk_surface_add_3dframe( SDL_Surface *dest, int dx, int dy, int dw, int dh, int border ); /* ==================================================================== Fill the surface with the wallpaper (clipped) ==================================================================== */ void stk_surface_apply_wallpaper( SDL_Surface *dest, int dx, int dy, int dw, int dh, SDL_Surface *wallpaper, int alpha ); /* ==================================================================== Apply a frame to the surface. The frame resource provides the eight square-like parts for the frame composed as a little frame: corners and sides. 'dw' == -1 and 'dh' == -1 have the same effect as in stk_surface_blit(). Returns the size of the border. ==================================================================== */ int stk_surface_apply_frame( SDL_Surface *dest, int dx, int dy, int dw, int dh, SDL_Surface *frame ); /* FIXED FONT */ enum { STK_FONT_ALIGN_LEFT = (1L << 1), STK_FONT_ALIGN_RIGHT = (1L << 2), STK_FONT_ALIGN_TOP = (1L << 3), STK_FONT_ALIGN_BOTTOM = (1L << 4), STK_FONT_ALIGN_CENTER_X = (1L << 5), STK_FONT_ALIGN_CENTER_Y = (1L << 6) }; typedef struct { SDL_Surface *surface; int align; /* text aligment */ int width; /* of a single character */ int height; /* of a single character */ } StkFont; /* ==================================================================== Load a fixed font which is simply a surface containing the ASCII characters from 32 (blank) to 96 (whatever) where all characters have the same width. ==================================================================== */ StkFont* stk_font_load( int flags, char *format, ... ); /* ==================================================================== Free a font if not NULL and reset pointer to NULL. ==================================================================== */ void stk_font_free( StkFont **font ); /* ==================================================================== Write string to surface. If 'alpha' is -1 the font is displayed with the current alpha value else the new alpha is used and kept. stk_display_store_drect() can be used to store the update rect of the written string. ==================================================================== */ void stk_font_write( StkFont *font, SDL_Surface *dest, int dx, int dy, int alpha, char *string ); /* ==================================================================== Query the length of the string in pixels. ==================================================================== */ #define stk_font_string_width( font, string ) \ (strlen(string) * font->width) /* CURSOR */ /* ==================================================================== Build an SDL cursor with the given hotspot. The resource mask contains 'b' for black 'w' for white and ' ' for transparent. There are two cursors provided: extern SDL_Cursor *empty_cursor (all transparent) extern SDL_Cursor *std_cursor (SDL standard cursor) ==================================================================== */ SDL_Cursor* stk_cursor_create( int width, int height, int hot_x, int hot_y, char *src ); /* ==================================================================== Free a cursor if not NULL and reset pointer to NULL. ==================================================================== */ void stk_cursor_free( SDL_Cursor **cursor ); /* TIMER */ /* ==================================================================== Reset the timer. ==================================================================== */ void stk_timer_reset( void ); /* ==================================================================== Get the time since last call or reset. ==================================================================== */ int stk_timer_get_time( void ); /* AUDIO */ /* ==================================================================== Open mixer. If this fails an error message is displayed (program doesn't abort) and all stk_audio and stk_sound functions have no effect. 'frequency': 11025, 22050, 44100 ... 'format': MIX_DEFAULT_FORMAT is recommended 'channels': mono(1) or stereo(2) 'chunksize': mix buffer size (1024 Bytes recommended) Passing 0 for an argument means to use the SDL default: 22050Hz in format AUDIO_S16LSB stereo with 1024 bytes chunksize stk_audio_open() installs stk_audio_close() as exit function. There are 8 channels available for mixing. ==================================================================== */ int stk_audio_open( int frequency, Uint16 format, int channels, int chunksize ); /* ==================================================================== Close mixer if previously opened. ==================================================================== */ void stk_audio_close( void ); /* ==================================================================== If stk_sound_load() is called with a relative path this prefix is added. Default is '.'; 'path' is copied. ==================================================================== */ void stk_audio_set_path( char *path ); /* ==================================================================== Enable/disable sound. If disabled stk_sound_play () has no effect. ==================================================================== */ void stk_audio_enable_sound( int enable ); /* ==================================================================== Set default volume of all sounds: 0 - 128 ==================================================================== */ void stk_audio_set_sound_volume( int volume ); /* ==================================================================== Fade out a specific sound channel. If 'channel is -1 all channels fade out. 'ms' is the time the fading shall take. ==================================================================== */ void stk_audio_fade_out( int channel, int ms ); /* SOUND */ typedef struct { #ifdef AUDIO_ENABLED Mix_Chunk *chunk; /* SDL_Mixer's sound buffer */ #endif int channel; int volume; } StkSound; /* ==================================================================== Load a sound from a path. If it's not an absolute directory (starting with '/') the prefix passed in stk_sound_set_path() is prepended. Loading sounds is non-fatal thus if a sound cannot be found it is created but empty. In this case a warning is displayed. The volume is set to the default set by stk_audio_set_sound_volume(). Sounds with an equal 'channel' will share it so if a new sound is played the old one breaks up thus channel should be used to group sounds. If channel is -1 the first available channel is used to play sound. ==================================================================== */ StkSound *stk_sound_load( int channel, char *format, ... ); /* ==================================================================== Free the memory of a sound if not NULL and reset the pointer to NULL. ==================================================================== */ void stk_sound_free( StkSound **sound ); /* ==================================================================== Set channel/volume of sound. ==================================================================== */ void stk_sound_set_volume( StkSound *sound, int volume ); void stk_sound_set_channel( StkSound *sound, int channel ); /* ==================================================================== Play a sound. ==================================================================== */ void stk_sound_play( StkSound *sound ); /* ==================================================================== Play a sound at horizontal position x.. ==================================================================== */ void stk_sound_play_x( int x, StkSound *sound ); /* ==================================================================== Fade out the channel of this sound. ==================================================================== */ void stk_sound_fade_out( StkSound *sound, int ms ); #endif