diff options
author | pontscho <pontscho@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2002-05-28 11:55:17 +0000 |
---|---|---|
committer | pontscho <pontscho@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2002-05-28 11:55:17 +0000 |
commit | d2a4ecd87009f2c301382847a9c7785467af6938 (patch) | |
tree | 9030304d76f00ea7423edadb2412fe17bad34383 /Gui/skin | |
parent | 2eee0cefb01b149c86d2ca58df69c3f29c3af971 (diff) |
fix text render chrash ...
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@6219 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'Gui/skin')
-rw-r--r-- | Gui/skin/font.c | 77 | ||||
-rw-r--r-- | Gui/skin/font.h | 9 | ||||
-rw-r--r-- | Gui/skin/skin.c | 15 |
3 files changed, 53 insertions, 48 deletions
diff --git a/Gui/skin/font.c b/Gui/skin/font.c index f5c44c8232..7db2d6ea30 100644 --- a/Gui/skin/font.c +++ b/Gui/skin/font.c @@ -12,22 +12,31 @@ int items; -bmpFont * Fonts[25] = { NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL }; +bmpFont * Fonts[26] = { NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL }; int fntAddNewFont( char * name ) { int id; - for( id=0;id<25;id++ ) if ( !Fonts[id] ) break; - if ( ( Fonts[id]=malloc( sizeof( bmpFont ) ) ) == NULL ) return -1; + int i; + + for( id=0;id<26;id++ ) + if ( !Fonts[id] ) break; + + if ( id == 25 ) return -2; + + if ( ( Fonts[id]=calloc( 1,sizeof( bmpFont ) ) ) == NULL ) return -1; + strcpy( Fonts[id]->name,name ); - memset( Fonts[id]->Fnt,-1,256 * sizeof( fntChar ) ); + for ( i=0;i<256;i++ ) + Fonts[id]->Fnt[i].x=Fonts[id]->Fnt[i].y=Fonts[id]->Fnt[i].sx=Fonts[id]->Fnt[i].sy=-1; + return id; } void fntFreeFont( void ) { int i; - for( i=0;i<25;i++ ) + for( i=0;i < 25;i++ ) { if ( Fonts[i] ) { @@ -38,7 +47,7 @@ void fntFreeFont( void ) } } -int fntRead( char * path,char * fname,int id ) +int fntRead( char * path,char * fname ) { FILE * f; unsigned char tmp[512]; @@ -46,9 +55,14 @@ int fntRead( char * path,char * fname,int id ) unsigned char command[32]; unsigned char param[256]; int c,linenumber = 0; + int id = fntAddNewFont( fname ); + + if ( id < 0 ) return id; strcpy( tmp,path ); strcat( tmp,fname ); strcat( tmp,".fnt" ); - if ( ( f=fopen( tmp,"rt" ) ) == NULL ) return -1; + if ( ( f=fopen( tmp,"rt" ) ) == NULL ) + { free( Fonts[id] ); return -3; } + while ( !feof( f ) ) { fgets( tmp,255,f ); linenumber++; @@ -56,14 +70,10 @@ int fntRead( char * path,char * fname,int id ) c=tmp[ strlen( tmp ) - 1 ]; if ( ( c == '\n' )||( c == '\r' ) ) tmp[ strlen( tmp ) - 1 ]=0; c=tmp[ strlen( tmp ) - 1 ]; if ( ( c == '\n' )||( c == '\r' ) ) tmp[ strlen( tmp ) - 1 ]=0; for ( c=0;c < (int)strlen( tmp );c++ ) - if ( tmp[c] == ';' ) - { - tmp[c]=0; - break; - } - if ( strlen( tmp ) == 0 ) continue; + if ( tmp[c] == ';' ) { tmp[c]=0; break; } + if ( !tmp[0] ) continue; ptmp=strdelspacesbeforecommand( tmp ); - if ( strlen( ptmp ) == 0 ) continue; + if ( !tmp[0] ) continue; ptmp=strswap( ptmp,'\t',' ' ); ptmp=strdelspaces( ptmp ); cutItem( ptmp,command,'=',0 ); cutItem( ptmp,param,'=',1 ); @@ -84,10 +94,11 @@ int fntRead( char * path,char * fname,int id ) { strcpy( tmp,path ); strcat( tmp,param ); mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"[font] font imagefile: %s\n",tmp ); - if ( skinBPRead( tmp,&Fonts[id]->Bitmap ) ) return -2; + if ( skinBPRead( tmp,&Fonts[id]->Bitmap ) ) return -4; } } - } + } + return 0; } @@ -95,8 +106,8 @@ int fntFindID( char * name ) { int i; for ( i=0;i < 25;i++ ) - if ( Fonts[i] ) - if ( !strcmp( name,Fonts[i]->name ) ) return i; + if ( Fonts[i] ) + if ( !strcmp( name,Fonts[i]->name ) ) return i; return -1; } @@ -104,18 +115,25 @@ int fntTextWidth( int id,char * str ) { int size = 0; int i; - if ( !Fonts[id] ) return 0; - for ( i=0;i < (int)strlen( str );i++ ) - if ( Fonts[id]->Fnt[ (int)str[i] ].sx != -1 ) size+=Fonts[id]->Fnt[ (int)str[i] ].sx; + + if ( ( !Fonts[id] )||( !str[0] ) ) return 0; + + for ( i=0;i < (unsigned int)strlen( str );i++ ) + size+=( Fonts[id]->Fnt[ (unsigned char)str[i] ].sx == -1? Fonts[id]->Fnt[ 32 ].sx : Fonts[id]->Fnt[ (unsigned char)str[i] ].sx ); return size; } int fntTextHeight( int id,char * str ) { int max = 0,i; - if ( !Fonts[id] ) return 0; + + if ( ( !Fonts[id] )||( !str[0] ) ) return 0; + for ( i=0;i < (int)strlen( str );i++ ) - if ( Fonts[id]->Fnt[ (int)str[i] ].sy > max ) max=Fonts[id]->Fnt[ (int)str[i] ].sy; + { + int h = Fonts[id]->Fnt[ (unsigned char)str[i] ].sy; + if ( h > max ) max=h; + } return max; } @@ -138,24 +156,21 @@ txSample * fntRender( int id,int px,int sx,char * fmt,... ) ( !strlen( p ) )|| ( !fntTextWidth( id,p ) )|| ( (tmp=malloc( sizeof( txSample ) )) == NULL ) ) return NULL; - + tmp->Width=fntTextWidth( id,p ); tmp->Height=fntTextHeight( id,p ); tmp->BPP=32; tmp->ImageSize=tmp->Width * tmp->Height * 4; if ( ( tmp->Image=malloc( tmp->ImageSize ) ) == NULL ) return NULL; - obuf=(uint32_t *)tmp->Image; ibuf=(uint32_t *)Fonts[id]->Bitmap.Image; for ( i=0;i < (int)strlen( p );i++ ) { - char c = p[i]; - if ( Fonts[id]->Fnt[c].x == -1 ) c=32; + unsigned int c = (unsigned char)p[i]; + if ( Fonts[id]->Fnt[c].sx == -1 ) c=32; for ( oy=0,y=Fonts[id]->Fnt[c].y;y < Fonts[id]->Fnt[c].y + Fonts[id]->Fnt[c].sy; y++,oy++ ) - for ( ox=0,x=Fonts[id]->Fnt[c].x;x < Fonts[id]->Fnt[c].x + Fonts[id]->Fnt[c].sx; x++,ox++ ) - { - obuf[ oy * tmp->Width + dx + ox ]=ibuf[ y * Fonts[id]->Bitmap.Width + x ]; - } + for ( ox=0,x=Fonts[id]->Fnt[c].x;x < Fonts[id]->Fnt[c].x + Fonts[id]->Fnt[c].sx; x++,ox++ ) + obuf[ oy * tmp->Width + dx + ox ]=ibuf[ y * Fonts[id]->Bitmap.Width + x ]; dx+=Fonts[id]->Fnt[c].sx; } diff --git a/Gui/skin/font.h b/Gui/skin/font.h index 0b082bf8a1..8effa4acf1 100644 --- a/Gui/skin/font.h +++ b/Gui/skin/font.h @@ -1,6 +1,6 @@ -#ifndef _MYFONT -#define _MYFONT +#ifndef _FONT_H +#define _FONT_H #include "../bitmap/bitmap.h" @@ -17,15 +17,14 @@ typedef struct char name[128]; } bmpFont; -extern fntChar Fnt[256]; extern txSample Bitmap; -extern bmpFont * Fonts[25]; +extern bmpFont * Fonts[26]; extern int fntAddNewFont( char * name ); extern void fntFreeFont( void ); extern int fntFindID( char * name ); -extern int fntRead( char * path,char * fname,int id ); +extern int fntRead( char * path,char * fname ); extern txSample * fntRender( int id,int px,int sx,char * fmt,... ); #endif diff --git a/Gui/skin/skin.c b/Gui/skin/skin.c index 9021bd9bd2..fc27cb3878 100644 --- a/Gui/skin/skin.c +++ b/Gui/skin/skin.c @@ -29,8 +29,6 @@ void ERRORMESSAGE( const char * format, ... ) va_start( ap,format ); vsnprintf( p,512,format,ap ); va_end( ap ); -// message( False,"[skin] error in skin config file on line %d: %s",linenumber,p ); -// message( False,MSGTR_SKIN_ERRORMESSAGE,linenumber,p ); mp_msg( MSGT_GPLAYER,MSGL_STATUS,MSGTR_SKIN_ERRORMESSAGE,linenumber,p ); } @@ -414,21 +412,14 @@ int __font( char * in ) defList->NumberOfItems++; item=&defList->Items[ defList->NumberOfItems ]; item->type=itFont; - item->fontid=fntAddNewFont( name ); + item->fontid=fntRead( path,name ); switch ( item->fontid ) { case -1: ERRORMESSAGE( MSGTR_SKIN_FONT_NotEnoughtMemory ); return 1; case -2: ERRORMESSAGE( MSGTR_SKIN_FONT_TooManyFontsDeclared ); return 1; + case -3: ERRORMESSAGE( MSGTR_SKIN_FONT_FontFileNotFound ); return 1; + case -4: ERRORMESSAGE( MSGTR_SKIN_FONT_FontImageNotFound ); return 1; } - - mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"[skin] id: %s ( %d )\n",id,item->fontid ); - - switch ( fntRead( path,name,item->fontid ) ) - { - case -1: ERRORMESSAGE( MSGTR_SKIN_FONT_FontFileNotFound ); return 1; - case -2: ERRORMESSAGE( MSGTR_SKIN_FONT_FontImageNotFound ); return 1; - } - return 0; } |