[Mplayer-cvslog] CVS: main/Gui/skin font.c,1.9,1.10 font.h,1.3,1.4 skin.c,1.15,1.16

Zoltan Ponekker pontscho at mplayerhq.hu
Tue May 28 13:55:20 CEST 2002


Update of /cvsroot/mplayer/main/Gui/skin
In directory mail:/var/tmp.root/cvs-serv4488/Gui/skin

Modified Files:
	font.c font.h skin.c 
Log Message:
fix text render chrash ...

Index: font.c
===================================================================
RCS file: /cvsroot/mplayer/main/Gui/skin/font.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- font.c	23 May 2002 19:15:32 -0000	1.9
+++ font.c	28 May 2002 11:55:17 -0000	1.10
@@ -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 @@
   }
 }
 
-int fntRead( char * path,char * fname,int id )
+int fntRead( char * path,char * fname )
 {
  FILE * f;
  unsigned char   tmp[512];
@@ -46,9 +55,14 @@
  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 @@
    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 @@
        {
         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 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 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 @@
       ( !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;
   }
 

Index: font.h
===================================================================
RCS file: /cvsroot/mplayer/main/Gui/skin/font.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- font.h	4 Oct 2001 20:33:29 -0000	1.3
+++ font.h	28 May 2002 11:55:17 -0000	1.4
@@ -1,6 +1,6 @@
 
-#ifndef _MYFONT
-#define _MYFONT
+#ifndef _FONT_H
+#define _FONT_H
 
 #include "../bitmap/bitmap.h"
 
@@ -17,15 +17,14 @@
  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

Index: skin.c
===================================================================
RCS file: /cvsroot/mplayer/main/Gui/skin/skin.c,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- skin.c	18 Apr 2002 21:24:42 -0000	1.15
+++ skin.c	28 May 2002 11:55:17 -0000	1.16
@@ -29,8 +29,6 @@
  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 @@
  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;
 }
 




More information about the MPlayer-cvslog mailing list