annotate gui/skin/font.c @ 32734:cc58a1e919d9

Allow character in the font description file to be in UTF-8. A character defined in the font description file can be either an ASCII character, any character in the range of 0x80 to 0xFF or - to avoid character set problems, and that is recommended - a character in UTF-8 encoding now. Non-ASCII characters will be stored in the nonASCIIidx array. The indices 0..127 of this array correspond to the indices 128..255 of the Fnt array. (This also settles the "Translate messages shown in the GUI window(s) from UTF-8" issue.)
author ib
date Thu, 27 Jan 2011 18:04:19 +0000
parents 6ff3cc81d602
children 63844ef43932
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
26458
b0a7b35b78d2 Add standard GPL header to individual files.
diego
parents: 26382
diff changeset
1 /*
b0a7b35b78d2 Add standard GPL header to individual files.
diego
parents: 26382
diff changeset
2 * This file is part of MPlayer.
b0a7b35b78d2 Add standard GPL header to individual files.
diego
parents: 26382
diff changeset
3 *
b0a7b35b78d2 Add standard GPL header to individual files.
diego
parents: 26382
diff changeset
4 * MPlayer is free software; you can redistribute it and/or modify
b0a7b35b78d2 Add standard GPL header to individual files.
diego
parents: 26382
diff changeset
5 * it under the terms of the GNU General Public License as published by
b0a7b35b78d2 Add standard GPL header to individual files.
diego
parents: 26382
diff changeset
6 * the Free Software Foundation; either version 2 of the License, or
b0a7b35b78d2 Add standard GPL header to individual files.
diego
parents: 26382
diff changeset
7 * (at your option) any later version.
b0a7b35b78d2 Add standard GPL header to individual files.
diego
parents: 26382
diff changeset
8 *
b0a7b35b78d2 Add standard GPL header to individual files.
diego
parents: 26382
diff changeset
9 * MPlayer is distributed in the hope that it will be useful,
b0a7b35b78d2 Add standard GPL header to individual files.
diego
parents: 26382
diff changeset
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
b0a7b35b78d2 Add standard GPL header to individual files.
diego
parents: 26382
diff changeset
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
b0a7b35b78d2 Add standard GPL header to individual files.
diego
parents: 26382
diff changeset
12 * GNU General Public License for more details.
b0a7b35b78d2 Add standard GPL header to individual files.
diego
parents: 26382
diff changeset
13 *
b0a7b35b78d2 Add standard GPL header to individual files.
diego
parents: 26382
diff changeset
14 * You should have received a copy of the GNU General Public License along
b0a7b35b78d2 Add standard GPL header to individual files.
diego
parents: 26382
diff changeset
15 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
b0a7b35b78d2 Add standard GPL header to individual files.
diego
parents: 26382
diff changeset
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
b0a7b35b78d2 Add standard GPL header to individual files.
diego
parents: 26382
diff changeset
17 */
23077
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
18
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
19 #include <stdlib.h>
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
20 #include <stdio.h>
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
21 #include <stdarg.h>
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
22 #include <string.h>
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
23 #include <inttypes.h>
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
24
26365
10dfbc523184 Add gui/ prefix to some #include paths so that compilation from the
diego
parents: 23703
diff changeset
25 #include "gui/app.h"
23077
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
26 #include "skin.h"
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
27 #include "font.h"
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
28 #include "cut.h"
26382
b2f4abcf20ed Make include paths consistent; do not use ../ in them.
diego
parents: 26365
diff changeset
29 #include "mp_msg.h"
b2f4abcf20ed Make include paths consistent; do not use ../ in them.
diego
parents: 26365
diff changeset
30 #include "libavutil/avstring.h"
23077
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
31
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
32 int items;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
33
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
34 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 };
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
35
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
36 int fntAddNewFont( char * name )
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
37 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
38 int id;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
39 int i;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
40
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
41 for( id=0;id<26;id++ )
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
42 if ( !Fonts[id] ) break;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
43
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
44 if ( id == 25 ) return -2;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
45
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
46 if ( ( Fonts[id]=calloc( 1,sizeof( bmpFont ) ) ) == NULL ) return -1;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
47
23703
9fb716ab06a3 Avoid code duplication and ugly config.h hack by using av_strlcat/av_strlcpy
reimar
parents: 23077
diff changeset
48 av_strlcpy( Fonts[id]->name,name,128 ); // FIXME: as defined in font.h
32734
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
49 for ( i=0;i<ASCII_CHRS+EXTRA_CHRS;i++ )
23077
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
50 Fonts[id]->Fnt[i].x=Fonts[id]->Fnt[i].y=Fonts[id]->Fnt[i].sx=Fonts[id]->Fnt[i].sy=-1;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
51
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
52 return id;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
53 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
54
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
55 void fntFreeFont( void )
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
56 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
57 int i;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
58 for( i=0;i < 25;i++ )
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
59 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
60 if ( Fonts[i] )
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
61 {
32537
8fa2f43cb760 Remove most of the NULL pointer check before free all over the code
cboesch
parents: 30405
diff changeset
62 free( Fonts[i]->Bitmap.Image );
23077
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
63 free( Fonts[i] );
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
64 Fonts[i]=NULL;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
65 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
66 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
67 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
68
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
69 int fntRead( char * path,char * fname )
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
70 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
71 FILE * f;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
72 unsigned char tmp[512];
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
73 unsigned char * ptmp;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
74 unsigned char command[32];
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
75 unsigned char param[256];
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
76 int c,linenumber = 0;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
77 int id = fntAddNewFont( fname );
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 26458
diff changeset
78
23077
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
79 if ( id < 0 ) return id;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
80
23703
9fb716ab06a3 Avoid code duplication and ugly config.h hack by using av_strlcat/av_strlcpy
reimar
parents: 23077
diff changeset
81 av_strlcpy( tmp,path,sizeof( tmp ) );
9fb716ab06a3 Avoid code duplication and ugly config.h hack by using av_strlcat/av_strlcpy
reimar
parents: 23077
diff changeset
82 av_strlcat( tmp,fname,sizeof( tmp ) ); av_strlcat( tmp,".fnt",sizeof( tmp ) );
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 26458
diff changeset
83 if ( ( f=fopen( tmp,"rt" ) ) == NULL )
23077
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
84 { free( Fonts[id] ); return -3; }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 26458
diff changeset
85
30405
d39acea63f2e Simplify and correct loop condition, also avoids a compiler warning for unused result.
reimar
parents: 30404
diff changeset
86 while ( fgets( tmp,255,f ) )
23077
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
87 {
30405
d39acea63f2e Simplify and correct loop condition, also avoids a compiler warning for unused result.
reimar
parents: 30404
diff changeset
88 linenumber++;
23077
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
89
30404
5fbb30fa62cc Fix newline removal code that might read and write out of bounds.
reimar
parents: 29263
diff changeset
90 // remove any kind of newline, if any
5fbb30fa62cc Fix newline removal code that might read and write out of bounds.
reimar
parents: 29263
diff changeset
91 tmp[strcspn(tmp, "\n\r")] = 0;
23077
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
92 for ( c=0;c < (int)strlen( tmp );c++ )
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
93 if ( tmp[c] == ';' ) { tmp[c]=0; break; }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
94 if ( !tmp[0] ) continue;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
95 ptmp=trimleft( tmp );
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
96 if ( !tmp[0] ) continue;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
97 ptmp=strswap( ptmp,'\t',' ' );
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
98 ptmp=trim( ptmp );
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
99 cutItem( ptmp,command,'=',0 ); cutItem( ptmp,param,'=',1 );
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
100 if ( command[0] == '"' )
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
101 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
102 int i;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
103 cutItem( command,command,'"',1 );
32707
697fd62b65f9 Allow double quote to be defined in the font description file:
ib
parents: 32537
diff changeset
104 if ( !command[0] ) i=(int)'"';
32734
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
105 else if ( command[0] & 0x80 )
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
106 {
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
107 for ( i = 0; i < EXTRA_CHRS; i++ )
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
108 {
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
109 if ( !Fonts[id]->nonASCIIidx[i][0] )
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
110 {
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
111 strncpy( Fonts[id]->nonASCIIidx[i], command, 4 );
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
112 break;
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
113 }
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
114 }
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
115 if ( i == EXTRA_CHRS ) continue;
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
116 i += ASCII_CHRS;
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
117 }
32707
697fd62b65f9 Allow double quote to be defined in the font description file:
ib
parents: 32537
diff changeset
118 else i=(int)command[0];
23077
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
119 cutItem( param,tmp,',',0 ); Fonts[id]->Fnt[i].x=atoi( tmp );
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
120 cutItem( param,tmp,',',1 ); Fonts[id]->Fnt[i].y=atoi( tmp );
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
121 cutItem( param,tmp,',',2 ); Fonts[id]->Fnt[i].sx=atoi( tmp );
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
122 cutItem( param,tmp,',',3 ); Fonts[id]->Fnt[i].sy=atoi( tmp );
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
123 mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"[font] char: '%s' params: %d,%d %dx%d\n",command,Fonts[id]->Fnt[i].x,Fonts[id]->Fnt[i].y,Fonts[id]->Fnt[i].sx,Fonts[id]->Fnt[i].sy );
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
124 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
125 else
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
126 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
127 if ( !strcmp( command,"image" ) )
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
128 {
23703
9fb716ab06a3 Avoid code duplication and ugly config.h hack by using av_strlcat/av_strlcpy
reimar
parents: 23077
diff changeset
129 av_strlcpy( tmp,path,sizeof( tmp ) ); av_strlcat( tmp,param,sizeof( tmp ) );
23077
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
130 mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"[font] font imagefile: %s\n",tmp );
32712
6ff3cc81d602 Fix resource leaks and check for realloc failures
ib
parents: 32707
diff changeset
131 if ( skinBPRead( tmp,&Fonts[id]->Bitmap ) )
6ff3cc81d602 Fix resource leaks and check for realloc failures
ib
parents: 32707
diff changeset
132 {
6ff3cc81d602 Fix resource leaks and check for realloc failures
ib
parents: 32707
diff changeset
133 fclose(f);
6ff3cc81d602 Fix resource leaks and check for realloc failures
ib
parents: 32707
diff changeset
134 return -4;
6ff3cc81d602 Fix resource leaks and check for realloc failures
ib
parents: 32707
diff changeset
135 }
23077
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
136 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
137 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
138 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
139
32712
6ff3cc81d602 Fix resource leaks and check for realloc failures
ib
parents: 32707
diff changeset
140 fclose(f);
23077
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
141 return 0;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
142 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
143
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
144 int fntFindID( char * name )
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
145 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
146 int i;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
147 for ( i=0;i < 25;i++ )
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
148 if ( Fonts[i] )
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
149 if ( !strcmp( name,Fonts[i]->name ) ) return i;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
150 return -1;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
151 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
152
32734
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
153 // get Fnt index of character (utf8 or normal one) *str points to,
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
154 // then move pointer to next/previous character
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
155 int fntGetCharIndex( int id, unsigned char **str, gboolean utf8, int direction )
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
156 {
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
157 unsigned char *p, uchar[4] = { 0, 0, 0, 0 };
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
158 int i, c = -1;
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
159
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
160 if ( **str & 0x80 )
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
161 {
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
162 if ( utf8 )
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
163 {
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
164 p = *str;
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
165 *str = g_utf8_next_char( *str );
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
166 strncpy( uchar, p, *str - p );
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
167
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
168 if ( direction < 0 ) *str = g_utf8_prev_char( p );
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
169 }
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
170 else
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
171 {
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
172 uchar[0] = **str;
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
173 *str += direction;
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
174 }
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
175
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
176 for ( i = 0; ( i < EXTRA_CHRS ) && Fonts[id]->nonASCIIidx[i][0]; i++ )
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
177 {
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
178 if ( strncmp( Fonts[id]->nonASCIIidx[i], uchar, 4 ) == 0 ) return i + ASCII_CHRS;
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
179 if ( !utf8 && ( Fonts[id]->nonASCIIidx[i][0] == (*uchar >> 6 | 0xc0) && Fonts[id]->nonASCIIidx[i][1] == (*uchar & 0x3f | 0x80) && Fonts[id]->nonASCIIidx[i][2] == 0 ) ) c = i + ASCII_CHRS;
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
180 }
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
181 }
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
182 else
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
183 {
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
184 c = **str;
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
185
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
186 if ( utf8 && ( direction < 0 ) ) *str = g_utf8_prev_char( *str );
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
187 else *str += direction;
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
188 }
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
189
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
190 return c;
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
191 }
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
192
23077
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
193 int fntTextWidth( int id,char * str )
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
194 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
195 int size = 0;
32734
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
196 gboolean utf8;
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
197 unsigned char *p;
23077
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
198
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
199 if ( ( !Fonts[id] )||( !str[0] ) ) return 0;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
200
32734
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
201 utf8 = g_utf8_validate( str, -1, NULL);
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
202 p = (unsigned char *) str;
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
203
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
204 while ( *p )
23077
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
205 {
32734
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
206 int c = fntGetCharIndex( id, &p, utf8, 1 );
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
207 if ( c == -1 || Fonts[id]->Fnt[c].sx == -1 ) c = ' ';
23077
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
208 size+= Fonts[id]->Fnt[ c ].sx;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
209 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
210 return size;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
211 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
212
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
213 int fntTextHeight( int id,char * str )
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
214 {
32734
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
215 int max = 0;
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
216 gboolean utf8;
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
217 unsigned char *p;
23077
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
218
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
219 if ( ( !Fonts[id] )||( !str[0] ) ) return 0;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
220
32734
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
221 utf8 = g_utf8_validate( str, -1, NULL);
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
222 p = (unsigned char *) str;
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
223
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
224 while ( *p )
23077
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
225 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
226 int h;
32734
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
227 int c = fntGetCharIndex( id, &p, utf8, 1 );
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
228 if ( c == -1 || Fonts[id]->Fnt[c].sx == -1 ) c = ' ';
23077
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
229 h = Fonts[id]->Fnt[c].sy;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
230 if ( h > max ) max=h;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
231 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
232 return max;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
233 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
234
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
235 txSample * fntRender( wItem * item,int px,const char * fmt,... )
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
236 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
237 va_list ap;
32734
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
238 unsigned char * u, p[512];
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
239 int c, i, dx = 0, tw, fbw, iw, id, ofs;
23077
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
240 int x,y,fh,fw,fyc,yc;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
241 uint32_t * ibuf;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
242 uint32_t * obuf;
32734
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
243 gboolean utf8;
23077
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
244
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
245 va_start( ap,fmt );
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
246 vsnprintf( p,512,fmt,ap );
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
247 va_end( ap );
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
248
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
249 iw=item->width;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
250 id=item->fontid;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
251
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
252 if ( ( !item )||
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
253 ( !Fonts[id] )||
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
254 ( !p[0] )||
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
255 ( !fntTextWidth( id,p ) ) ) return NULL;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
256
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
257 tw=fntTextWidth( id,p );
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
258 fbw=Fonts[id]->Bitmap.Width;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
259
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 26458
diff changeset
260 if ( item->Bitmap.Image == NULL )
23077
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
261 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
262 item->Bitmap.Height=item->height=fntTextHeight( id,p );
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
263 item->Bitmap.Width=item->width=iw;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
264 item->Bitmap.ImageSize=item->height * iw * 4;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
265 if ( !item->Bitmap.ImageSize ) return NULL;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
266 item->Bitmap.BPP=32;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
267 item->Bitmap.Image=malloc( item->Bitmap.ImageSize );
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
268 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
269
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
270 obuf=(uint32_t *)item->Bitmap.Image;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
271 ibuf=(uint32_t *)Fonts[id]->Bitmap.Image;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
272
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
273 for ( i=0;i < item->Bitmap.ImageSize / 4;i++ ) obuf[i]=0xff00ff;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 26458
diff changeset
274
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 26458
diff changeset
275 if ( tw <= iw )
23077
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
276 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
277 switch ( item->align )
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
278 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
279 default:
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
280 case fntAlignLeft: dx=0; break;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
281 case fntAlignCenter: dx=( iw - fntTextWidth( id,p ) ) / 2; break;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
282 case fntAlignRight: dx=iw - fntTextWidth( id,p ); break;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
283 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 26458
diff changeset
284
23077
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
285 } else dx+=px;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
286
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
287 ofs=dx;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 26458
diff changeset
288
32734
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
289 utf8 = g_utf8_validate( p, -1, NULL);
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
290 u = p;
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
291
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
292 while ( *u )
23077
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
293 {
32734
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
294 c = fntGetCharIndex( id, &u, utf8, 1 );
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 26458
diff changeset
295
32734
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
296 if ( c != -1 ) fw=Fonts[id]->Fnt[c].sx;
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
297
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
298 if ( c == -1 || fw == -1 ) { c=32; fw=Fonts[id]->Fnt[c].sx; }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 26458
diff changeset
299
23077
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
300 fh=Fonts[id]->Fnt[c].sy;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
301 fyc=Fonts[id]->Fnt[c].y * fbw + Fonts[id]->Fnt[c].x;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
302 yc=dx;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 26458
diff changeset
303
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 26458
diff changeset
304 if ( dx >= 0 )
23077
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
305 for ( y=0;y < fh;y++ )
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
306 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
307 for ( x=0; x < fw;x++ )
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
308 if ( dx + x >= 0 && dx + x < iw ) obuf[yc + x]=ibuf[ fyc + x ];
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
309 fyc+=fbw;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
310 yc+=iw;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
311 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
312 dx+=fw;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
313 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
314
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
315 if ( ofs > 0 && tw > item->width )
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
316 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
317 dx=ofs;
32734
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
318 u = p + strlen( p );
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
319
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
320 while ( u > p )
23077
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
321 {
32734
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
322 c = fntGetCharIndex( id, &u, utf8, -1 );
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 26458
diff changeset
323
32734
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
324 if ( c != -1) fw=Fonts[id]->Fnt[c].sx;
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
325
cc58a1e919d9 Allow character in the font description file to be in UTF-8.
ib
parents: 32712
diff changeset
326 if ( c == -1 || fw == -1 ) { c=32; fw=Fonts[id]->Fnt[c].sx; }
23077
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
327
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
328 fh=Fonts[id]->Fnt[c].sy;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
329 fyc=Fonts[id]->Fnt[c].y * fbw + Fonts[id]->Fnt[c].x;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
330
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
331 dx-=fw; yc=dx;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 26458
diff changeset
332 if ( dx >= 0 )
23077
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
333 for ( y=0;y < fh;y++ )
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
334 {
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
335 for ( x=fw - 1;x >= 0;x-- )
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
336 if ( dx + x >= 0 && dx + x < iw ) obuf[yc + x]=ibuf[fyc + x];
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
337 fyc+=fbw;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
338 yc+=iw;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
339 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
340 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
341 }
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
342
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
343 return &item->Bitmap;
17bf4f4b0715 Gui --> gui
diego
parents:
diff changeset
344 }