aboutsummaryrefslogtreecommitdiffhomepage
path: root/Gui/skin
diff options
context:
space:
mode:
authorGravatar pontscho <pontscho@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-05-28 11:55:17 +0000
committerGravatar pontscho <pontscho@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-05-28 11:55:17 +0000
commitd2a4ecd87009f2c301382847a9c7785467af6938 (patch)
tree9030304d76f00ea7423edadb2412fe17bad34383 /Gui/skin
parent2eee0cefb01b149c86d2ca58df69c3f29c3af971 (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.c77
-rw-r--r--Gui/skin/font.h9
-rw-r--r--Gui/skin/skin.c15
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;
}