Mercurial > mplayer.hg
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 |
rev | line source |
---|---|
26458 | 1 /* |
2 * This file is part of MPlayer. | |
3 * | |
4 * MPlayer is free software; you can redistribute it and/or modify | |
5 * it under the terms of the GNU General Public License as published by | |
6 * the Free Software Foundation; either version 2 of the License, or | |
7 * (at your option) any later version. | |
8 * | |
9 * MPlayer is distributed in the hope that it will be useful, | |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 * GNU General Public License for more details. | |
13 * | |
14 * You should have received a copy of the GNU General Public License along | |
15 * with MPlayer; if not, write to the Free Software Foundation, Inc., | |
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |
17 */ | |
23077 | 18 |
19 #include <stdlib.h> | |
20 #include <stdio.h> | |
21 #include <stdarg.h> | |
22 #include <string.h> | |
23 #include <inttypes.h> | |
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 | 26 #include "skin.h" |
27 #include "font.h" | |
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 | 31 |
32 int items; | |
33 | |
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 }; | |
35 | |
36 int fntAddNewFont( char * name ) | |
37 { | |
38 int id; | |
39 int i; | |
40 | |
41 for( id=0;id<26;id++ ) | |
42 if ( !Fonts[id] ) break; | |
43 | |
44 if ( id == 25 ) return -2; | |
45 | |
46 if ( ( Fonts[id]=calloc( 1,sizeof( bmpFont ) ) ) == NULL ) return -1; | |
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 | 50 Fonts[id]->Fnt[i].x=Fonts[id]->Fnt[i].y=Fonts[id]->Fnt[i].sx=Fonts[id]->Fnt[i].sy=-1; |
51 | |
52 return id; | |
53 } | |
54 | |
55 void fntFreeFont( void ) | |
56 { | |
57 int i; | |
58 for( i=0;i < 25;i++ ) | |
59 { | |
60 if ( Fonts[i] ) | |
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 | 63 free( Fonts[i] ); |
64 Fonts[i]=NULL; | |
65 } | |
66 } | |
67 } | |
68 | |
69 int fntRead( char * path,char * fname ) | |
70 { | |
71 FILE * f; | |
72 unsigned char tmp[512]; | |
73 unsigned char * ptmp; | |
74 unsigned char command[32]; | |
75 unsigned char param[256]; | |
76 int c,linenumber = 0; | |
77 int id = fntAddNewFont( fname ); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26458
diff
changeset
|
78 |
23077 | 79 if ( id < 0 ) return id; |
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 | 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 | 87 { |
30405
d39acea63f2e
Simplify and correct loop condition, also avoids a compiler warning for unused result.
reimar
parents:
30404
diff
changeset
|
88 linenumber++; |
23077 | 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 | 92 for ( c=0;c < (int)strlen( tmp );c++ ) |
93 if ( tmp[c] == ';' ) { tmp[c]=0; break; } | |
94 if ( !tmp[0] ) continue; | |
95 ptmp=trimleft( tmp ); | |
96 if ( !tmp[0] ) continue; | |
97 ptmp=strswap( ptmp,'\t',' ' ); | |
98 ptmp=trim( ptmp ); | |
99 cutItem( ptmp,command,'=',0 ); cutItem( ptmp,param,'=',1 ); | |
100 if ( command[0] == '"' ) | |
101 { | |
102 int i; | |
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 | 119 cutItem( param,tmp,',',0 ); Fonts[id]->Fnt[i].x=atoi( tmp ); |
120 cutItem( param,tmp,',',1 ); Fonts[id]->Fnt[i].y=atoi( tmp ); | |
121 cutItem( param,tmp,',',2 ); Fonts[id]->Fnt[i].sx=atoi( tmp ); | |
122 cutItem( param,tmp,',',3 ); Fonts[id]->Fnt[i].sy=atoi( tmp ); | |
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 ); | |
124 } | |
125 else | |
126 { | |
127 if ( !strcmp( command,"image" ) ) | |
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 | 130 mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"[font] font imagefile: %s\n",tmp ); |
32712 | 131 if ( skinBPRead( tmp,&Fonts[id]->Bitmap ) ) |
132 { | |
133 fclose(f); | |
134 return -4; | |
135 } | |
23077 | 136 } |
137 } | |
138 } | |
139 | |
32712 | 140 fclose(f); |
23077 | 141 return 0; |
142 } | |
143 | |
144 int fntFindID( char * name ) | |
145 { | |
146 int i; | |
147 for ( i=0;i < 25;i++ ) | |
148 if ( Fonts[i] ) | |
149 if ( !strcmp( name,Fonts[i]->name ) ) return i; | |
150 return -1; | |
151 } | |
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 | 193 int fntTextWidth( int id,char * str ) |
194 { | |
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 | 198 |
199 if ( ( !Fonts[id] )||( !str[0] ) ) return 0; | |
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 | 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 | 208 size+= Fonts[id]->Fnt[ c ].sx; |
209 } | |
210 return size; | |
211 } | |
212 | |
213 int fntTextHeight( int id,char * str ) | |
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 | 218 |
219 if ( ( !Fonts[id] )||( !str[0] ) ) return 0; | |
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 | 225 { |
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 | 229 h = Fonts[id]->Fnt[c].sy; |
230 if ( h > max ) max=h; | |
231 } | |
232 return max; | |
233 } | |
234 | |
235 txSample * fntRender( wItem * item,int px,const char * fmt,... ) | |
236 { | |
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 | 240 int x,y,fh,fw,fyc,yc; |
241 uint32_t * ibuf; | |
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 | 244 |
245 va_start( ap,fmt ); | |
246 vsnprintf( p,512,fmt,ap ); | |
247 va_end( ap ); | |
248 | |
249 iw=item->width; | |
250 id=item->fontid; | |
251 | |
252 if ( ( !item )|| | |
253 ( !Fonts[id] )|| | |
254 ( !p[0] )|| | |
255 ( !fntTextWidth( id,p ) ) ) return NULL; | |
256 | |
257 tw=fntTextWidth( id,p ); | |
258 fbw=Fonts[id]->Bitmap.Width; | |
259 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26458
diff
changeset
|
260 if ( item->Bitmap.Image == NULL ) |
23077 | 261 { |
262 item->Bitmap.Height=item->height=fntTextHeight( id,p ); | |
263 item->Bitmap.Width=item->width=iw; | |
264 item->Bitmap.ImageSize=item->height * iw * 4; | |
265 if ( !item->Bitmap.ImageSize ) return NULL; | |
266 item->Bitmap.BPP=32; | |
267 item->Bitmap.Image=malloc( item->Bitmap.ImageSize ); | |
268 } | |
269 | |
270 obuf=(uint32_t *)item->Bitmap.Image; | |
271 ibuf=(uint32_t *)Fonts[id]->Bitmap.Image; | |
272 | |
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 | 276 { |
277 switch ( item->align ) | |
278 { | |
279 default: | |
280 case fntAlignLeft: dx=0; break; | |
281 case fntAlignCenter: dx=( iw - fntTextWidth( id,p ) ) / 2; break; | |
282 case fntAlignRight: dx=iw - fntTextWidth( id,p ); break; | |
283 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26458
diff
changeset
|
284 |
23077 | 285 } else dx+=px; |
286 | |
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 | 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 | 300 fh=Fonts[id]->Fnt[c].sy; |
301 fyc=Fonts[id]->Fnt[c].y * fbw + Fonts[id]->Fnt[c].x; | |
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 | 305 for ( y=0;y < fh;y++ ) |
306 { | |
307 for ( x=0; x < fw;x++ ) | |
308 if ( dx + x >= 0 && dx + x < iw ) obuf[yc + x]=ibuf[ fyc + x ]; | |
309 fyc+=fbw; | |
310 yc+=iw; | |
311 } | |
312 dx+=fw; | |
313 } | |
314 | |
315 if ( ofs > 0 && tw > item->width ) | |
316 { | |
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 | 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 | 327 |
328 fh=Fonts[id]->Fnt[c].sy; | |
329 fyc=Fonts[id]->Fnt[c].y * fbw + Fonts[id]->Fnt[c].x; | |
330 | |
331 dx-=fw; yc=dx; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26458
diff
changeset
|
332 if ( dx >= 0 ) |
23077 | 333 for ( y=0;y < fh;y++ ) |
334 { | |
335 for ( x=fw - 1;x >= 0;x-- ) | |
336 if ( dx + x >= 0 && dx + x < iw ) obuf[yc + x]=ibuf[fyc + x]; | |
337 fyc+=fbw; | |
338 yc+=iw; | |
339 } | |
340 } | |
341 } | |
342 | |
343 return &item->Bitmap; | |
344 } |