2009-04-16 14:14:13 +03:00
# ifndef __SDL_EXTENSIONS_H__
# define __SDL_EXTENSIONS_H__
2009-08-07 01:36:51 +03:00
# include "../global.h"
2009-04-16 14:14:13 +03:00
# include "SDL.h"
# include "SDL_ttf.h"
2009-05-19 21:23:04 +03:00
# include <string>
# include <vector>
2009-06-26 18:41:19 +03:00
# include <sstream>
2009-08-18 04:57:39 +03:00
# include "FontBase.h"
2009-04-16 14:14:13 +03:00
2009-04-15 17:03:31 +03:00
/*
* SDL_Extensions . h , part of VCMI engine
*
* Authors : listed in file AUTHORS in main folder
*
* License : GNU General Public License v2 .0 or later
* Full text of license available in license . txt file , in main folder
*
2009-04-16 14:14:13 +03:00
*/
2009-05-25 02:21:55 +03:00
extern SDL_Surface * screen , * screen2 , * screenBuf ;
2009-04-16 14:14:13 +03:00
extern SDL_Color tytulowy , tlo , zwykly ;
extern TTF_Font * TNRB16 , * TNR , * GEOR13 , * GEORXX , * GEORM ;
void blitAtWR ( SDL_Surface * src , int x , int y , SDL_Surface * dst = screen ) ;
void blitAt ( SDL_Surface * src , int x , int y , SDL_Surface * dst = screen ) ;
2009-06-17 12:38:03 +03:00
void blitAtWR ( SDL_Surface * src , const SDL_Rect & pos , SDL_Surface * dst = screen ) ;
void blitAt ( SDL_Surface * src , const SDL_Rect & pos , SDL_Surface * dst = screen ) ;
2009-04-16 14:14:13 +03:00
void updateRect ( SDL_Rect * rect , SDL_Surface * scr = screen ) ;
bool isItIn ( const SDL_Rect * rect , int x , int y ) ;
2009-04-17 17:01:22 +03:00
2009-06-26 18:41:19 +03:00
template < typename IntType >
std : : string makeNumberShort ( IntType number ) //the output is a string containing at most 5 characters [4 if positive] (eg. intead 10000 it gives 10k)
{
int initialLength ;
bool negative = ( number < 0 ) ;
std : : ostringstream ost , rets ;
ost < < number ;
initialLength = ost . str ( ) . size ( ) ;
if ( negative )
{
if ( initialLength < = 4 )
return ost . str ( ) ;
}
else
{
if ( initialLength < = 5 )
return ost . str ( ) ;
}
//make the number short
char symbol [ ] = { ' G ' , ' M ' , ' k ' } ;
if ( negative ) number = ( - number ) ; //absolute value
for ( int divisor = 1000000000 , it = 0 ; divisor > 1 ; divisor / = 1000 , + + it )
{
if ( number > = divisor )
{
if ( negative ) rets < < ' - ' ;
rets < < ( number / divisor ) < < symbol [ it ] ;
return rets . str ( ) ;
}
}
throw std : : string ( " We shouldn't be here - makeNumberShort " ) ;
}
2009-04-16 14:14:13 +03:00
inline SDL_Rect genRect ( const int & hh , const int & ww , const int & xx , const int & yy )
{
SDL_Rect ret ;
ret . h = hh ;
ret . w = ww ;
ret . x = xx ;
ret . y = yy ;
return ret ;
}
namespace CSDL_Ext
{
extern SDL_Surface * std32bppSurface ;
2009-06-23 11:14:49 +03:00
void SDL_PutPixel ( SDL_Surface * ekran , const int & x , const int & y , const Uint8 & R , const Uint8 & G , const Uint8 & B , Uint8 A = 255 ) ; //myC influences the start of reading pixels
2009-04-16 14:14:13 +03:00
//inline void SDL_PutPixelWithoutRefresh(SDL_Surface *ekran, const int & x, const int & y, const Uint8 & R, const Uint8 & G, const Uint8 & B, Uint8 A = 255); //myC influences the start of reading pixels ; without refreshing
inline void SDL_PutPixelWithoutRefresh ( SDL_Surface * ekran , const int & x , const int & y , const Uint8 & R , const Uint8 & G , const Uint8 & B , Uint8 A = 255 )
{
Uint8 * p = ( Uint8 * ) ekran - > pixels + y * ekran - > pitch + x * ekran - > format - > BytesPerPixel ;
p [ 0 ] = B ;
p [ 1 ] = G ;
p [ 2 ] = R ;
if ( ekran - > format - > BytesPerPixel = = 4 )
p [ 3 ] = A ;
}
SDL_Surface * rotate01 ( SDL_Surface * toRot ) ; //vertical flip
SDL_Surface * hFlip ( SDL_Surface * toRot ) ; //horizontal flip
SDL_Surface * rotate02 ( SDL_Surface * toRot ) ; //rotate 90 degrees left
SDL_Surface * rotate03 ( SDL_Surface * toRot ) ; //rotate 180 degrees
2009-04-17 17:01:22 +03:00
SDL_Cursor * SurfaceToCursor ( SDL_Surface * image , int hx , int hy ) ; //creates cursor from bitmap
2009-04-16 14:14:13 +03:00
Uint32 SDL_GetPixel ( SDL_Surface * surface , const int & x , const int & y , bool colorByte = false ) ;
2009-04-17 17:01:22 +03:00
SDL_Color SDL_GetPixelColor ( SDL_Surface * surface , int x , int y ) ; //returns color of pixel at given position
2009-06-07 01:47:23 +03:00
void alphaTransform ( SDL_Surface * src ) ; //adds transparency and shadows (partial handling only; see examples of using for details)
2009-06-14 02:25:15 +03:00
void blitWithRotate1 ( const SDL_Surface * src , const SDL_Rect * srcRect , SDL_Surface * dst , const SDL_Rect * dstRect ) ; //srcRect is not used, works with 8bpp sources and 24bpp dests
2009-05-28 02:21:34 +03:00
void blitWithRotate2 ( const SDL_Surface * src , const SDL_Rect * srcRect , SDL_Surface * dst , const SDL_Rect * dstRect ) ; //srcRect is not used, works with 8bpp sources and 24bpp dests
2009-05-28 02:43:47 +03:00
void blitWithRotate3 ( const SDL_Surface * src , const SDL_Rect * srcRect , SDL_Surface * dst , const SDL_Rect * dstRect ) ; //srcRect is not used, works with 8bpp sources and 24bpp dests
2009-04-16 14:14:13 +03:00
void blitWithRotate1clip ( SDL_Surface * src , SDL_Rect * srcRect , SDL_Surface * dst , SDL_Rect * dstRect ) ; //srcRect is not used, works with 8bpp sources and 24bpp dests preserving clip_rect
2009-05-28 02:21:34 +03:00
void blitWithRotate2clip ( const SDL_Surface * src , const SDL_Rect * srcRect , SDL_Surface * dst , const SDL_Rect * dstRect ) ; //srcRect is not used, works with 8bpp sources and 24bpp dests preserving clip_rect
2009-04-16 14:14:13 +03:00
void blitWithRotate3clip ( SDL_Surface * src , SDL_Rect * srcRect , SDL_Surface * dst , SDL_Rect * dstRect ) ; //srcRect is not used, works with 8bpp sources and 24bpp dests preserving clip_rect
2009-05-28 05:58:29 +03:00
int blit8bppAlphaTo24bpp ( const SDL_Surface * src , const SDL_Rect * srcRect , SDL_Surface * dst , SDL_Rect * dstRect ) ; //blits 8 bpp surface with alpha channel to 24 bpp surface
2009-04-16 14:14:13 +03:00
Uint32 colorToUint32 ( const SDL_Color * color ) ; //little endian only
2009-08-17 11:50:31 +03:00
2009-04-16 14:14:13 +03:00
void printTo ( const std : : string & text , int x , int y , TTF_Font * font , SDL_Color kolor = tytulowy , SDL_Surface * dst = screen , unsigned char quality = 2 ) ; // quality: 0 - lowest, 1 - medium, 2 - highest; prints at right bottom corner of specific area. position of corner indicated by (x, y)
void printToWR ( const std : : string & text , int x , int y , TTF_Font * font , SDL_Color kolor = tytulowy , SDL_Surface * dst = screen , unsigned char quality = 2 ) ; // quality: 0 - lowest, 1 - medium, 2 - highest; prints at right bottom corner of specific area. position of corner indicated by (x, y)
void printAtMiddle ( const std : : string & text , int x , int y , TTF_Font * font , SDL_Color kolor = tytulowy , SDL_Surface * dst = screen , unsigned char quality = 2 , bool refresh = false ) ; // quality: 0 - lowest, 1 - medium, 2 - highest
void printAtMiddleWB ( const std : : string & text , int x , int y , TTF_Font * font , int charpr , SDL_Color kolor = tytulowy , SDL_Surface * dst = screen ) ;
void printAtWB ( const std : : string & text , int x , int y , TTF_Font * font , int charpr , SDL_Color kolor = tytulowy , SDL_Surface * dst = screen ) ;
void printAt ( const std : : string & text , int x , int y , TTF_Font * font , SDL_Color kolor = tytulowy , SDL_Surface * dst = screen , unsigned char quality = 2 , bool refresh = false ) ; // quality: 0 - lowest, 1 - medium, 2 - highest
void printAtWR ( const std : : string & text , int x , int y , TTF_Font * font , SDL_Color kolor = tytulowy , SDL_Surface * dst = screen , unsigned char quality = 2 ) ; // quality: 0 - lowest, 1 - medium, 2 - highest
2009-08-17 11:50:31 +03:00
void printAt ( const std : : string & text , int x , int y , EFonts font , SDL_Color kolor = zwykly , SDL_Surface * dst = screen , bool refresh = false ) ;
void printTo ( const std : : string & text , int x , int y , EFonts font , SDL_Color kolor = zwykly , SDL_Surface * dst = screen , bool refresh = false ) ;
void printAtMiddle ( const std : : string & text , int x , int y , EFonts font , SDL_Color kolor = zwykly , SDL_Surface * dst = screen , bool refresh = false ) ;
void printAtMiddleWB ( const std : : string & text , int x , int y , EFonts font , int charpr , SDL_Color kolor = tytulowy , SDL_Surface * dst = screen , bool refrsh = false ) ;
2009-04-16 14:14:13 +03:00
void update ( SDL_Surface * what = screen ) ; //updates whole surface (default - main screen)
2009-09-20 15:47:40 +03:00
void drawBorder ( SDL_Surface * sur , int x , int y , int w , int h , const int3 & color ) ;
void drawBorder ( SDL_Surface * sur , const SDL_Rect & r , const int3 & color ) ;
2009-04-16 14:14:13 +03:00
void setPlayerColor ( SDL_Surface * sur , unsigned char player ) ; //sets correct color of flags; -1 for neutral
std : : string processStr ( std : : string str , std : : vector < std : : string > & tor ) ; //replaces %s in string
SDL_Surface * newSurface ( int w , int h , SDL_Surface * mod = screen ) ; //creates new surface, with flags/format same as in surface given
SDL_Surface * copySurface ( SDL_Surface * mod ) ; //returns copy of given surface
} ;
# endif // __SDL_EXTENSIONS_H__