Mercurial > mplayer.hg
annotate libvo/font_load.c @ 9278:caea8ed36b48
The reason why mplayer crashes (in some cases) when using x11
output and -wid (>0) parameter is this:
Mplayer by default creates a colormap using DirectColor visual. If the
window given to mplayer uses TrueColor visual there will be an error
when mplayer sets the colormap for the window. This patch
modifies mplayer to use TrueColor visual if the window given to mplayer
uses TrueColor. Another solution is to make sure that the window given to
mplayer is created using DirectColor visual if it is supported by the
display.
Jouni Tulkki <jitulkki@cc.hut.fi>
author | arpi |
---|---|
date | Tue, 04 Feb 2003 18:31:44 +0000 |
parents | 81dbd28ef7c0 |
children | 7b0bc557987b |
rev | line source |
---|---|
7122
0dc9cb756b68
freetype 2.0/2.1+ support - disabled by default until bugs fixed
arpi
parents:
5928
diff
changeset
|
1 #include "config.h" |
0dc9cb756b68
freetype 2.0/2.1+ support - disabled by default until bugs fixed
arpi
parents:
5928
diff
changeset
|
2 |
213 | 3 #include <stdio.h> |
4 #include <stdlib.h> | |
5 #include <string.h> | |
1446 | 6 #include <sys/types.h> |
7 #include <sys/stat.h> | |
8 #include <unistd.h> | |
213 | 9 |
10 #include "font_load.h" | |
11 | |
2476 | 12 extern char *get_path ( char * ); |
216
338b5664ea13
Search font files in ~/.mplayer/font/ instead of current dir
lgb
parents:
215
diff
changeset
|
13 |
339 | 14 raw_file* load_raw(char *name,int verbose){ |
213 | 15 int bpp; |
16 raw_file* raw=malloc(sizeof(raw_file)); | |
17 unsigned char head[32]; | |
18 FILE *f=fopen(name,"rb"); | |
19 if(!f) return NULL; // can't open | |
20 if(fread(head,32,1,f)<1) return NULL; // too small | |
21 if(memcmp(head,"mhwanh",6)) return NULL; // not raw file | |
22 raw->w=head[8]*256+head[9]; | |
23 raw->h=head[10]*256+head[11]; | |
24 raw->c=head[12]*256+head[13]; | |
5928
48e91dc9534b
.raw width>=65536 support by Georgi Georgiev <chutz@chubaka.homeip.net>
arpi
parents:
2476
diff
changeset
|
25 if(raw->w == 0) // 2 bytes were not enough for the width... read 4 bytes from the end of the header |
48e91dc9534b
.raw width>=65536 support by Georgi Georgiev <chutz@chubaka.homeip.net>
arpi
parents:
2476
diff
changeset
|
26 raw->w = ((head[28]*0x100 + head[29])*0x100 + head[30])*0x100 + head[31]; |
213 | 27 if(raw->c>256) return NULL; // too many colors!? |
339 | 28 if(verbose) printf("RAW: %s %d x %d, %d colors\n",name,raw->w,raw->h,raw->c); |
213 | 29 if(raw->c){ |
30 raw->pal=malloc(raw->c*3); | |
31 fread(raw->pal,3,raw->c,f); | |
32 bpp=1; | |
33 } else { | |
34 raw->pal=NULL; | |
35 bpp=3; | |
36 } | |
37 raw->bmp=malloc(raw->h*raw->w*bpp); | |
38 fread(raw->bmp,raw->h*raw->w*bpp,1,f); | |
39 fclose(f); | |
40 return raw; | |
41 } | |
42 | |
728 | 43 extern int sub_unicode; |
44 | |
339 | 45 font_desc_t* read_font_desc(char* fname,float factor,int verbose){ |
213 | 46 unsigned char sor[1024]; |
47 unsigned char sor2[1024]; | |
48 font_desc_t *desc; | |
49 FILE *f; | |
2222
ddf897c38fb1
read font files from the same dir as font.desc or as specified in font.desc
atlka
parents:
1446
diff
changeset
|
50 char *dn; |
1446 | 51 struct stat fstate; |
213 | 52 char section[64]; |
53 int i,j; | |
54 int chardb=0; | |
55 int fontdb=-1; | |
214 | 56 int version=0; |
8635
81dbd28ef7c0
these patches let ,,oldstyle'' and freetype subtitle renderers live
arpi
parents:
7122
diff
changeset
|
57 int first=1; |
213 | 58 |
59 desc=malloc(sizeof(font_desc_t));if(!desc) return NULL; | |
60 memset(desc,0,sizeof(font_desc_t)); | |
61 | |
62 f=fopen(fname,"rt");if(!f){ printf("font: can't open file: %s\n",fname); return NULL;} | |
63 | |
2222
ddf897c38fb1
read font files from the same dir as font.desc or as specified in font.desc
atlka
parents:
1446
diff
changeset
|
64 i = strlen (fname) - 9; |
2223 | 65 if ((dn = malloc(i+1))){ |
2222
ddf897c38fb1
read font files from the same dir as font.desc or as specified in font.desc
atlka
parents:
1446
diff
changeset
|
66 strncpy (dn, fname, i); |
ddf897c38fb1
read font files from the same dir as font.desc or as specified in font.desc
atlka
parents:
1446
diff
changeset
|
67 dn[i]='\0'; |
ddf897c38fb1
read font files from the same dir as font.desc or as specified in font.desc
atlka
parents:
1446
diff
changeset
|
68 } |
ddf897c38fb1
read font files from the same dir as font.desc or as specified in font.desc
atlka
parents:
1446
diff
changeset
|
69 |
ddf897c38fb1
read font files from the same dir as font.desc or as specified in font.desc
atlka
parents:
1446
diff
changeset
|
70 desc->fpath = dn; // search in the same dir as fonts.desc |
1446 | 71 |
2222
ddf897c38fb1
read font files from the same dir as font.desc or as specified in font.desc
atlka
parents:
1446
diff
changeset
|
72 // desc->fpath=get_path("font/"); |
ddf897c38fb1
read font files from the same dir as font.desc or as specified in font.desc
atlka
parents:
1446
diff
changeset
|
73 // if (stat(desc->fpath, &fstate)!=0) desc->fpath=DATADIR"/font"; |
ddf897c38fb1
read font files from the same dir as font.desc or as specified in font.desc
atlka
parents:
1446
diff
changeset
|
74 |
ddf897c38fb1
read font files from the same dir as font.desc or as specified in font.desc
atlka
parents:
1446
diff
changeset
|
75 |
ddf897c38fb1
read font files from the same dir as font.desc or as specified in font.desc
atlka
parents:
1446
diff
changeset
|
76 |
1446 | 77 |
213 | 78 // set up some defaults, and erase table |
79 desc->charspace=2; | |
80 desc->spacewidth=12; | |
81 desc->height=0; | |
82 for(i=0;i<512;i++) desc->start[i]=desc->width[i]=desc->font[i]=-1; | |
83 | |
84 section[0]=0; | |
85 | |
86 while(fgets(sor,1020,f)){ | |
87 unsigned char* p[8]; | |
88 int pdb=0; | |
89 unsigned char *s=sor; | |
90 unsigned char *d=sor2; | |
91 int ec=' '; | |
92 int id=0; | |
93 sor[1020]=0; | |
8635
81dbd28ef7c0
these patches let ,,oldstyle'' and freetype subtitle renderers live
arpi
parents:
7122
diff
changeset
|
94 |
81dbd28ef7c0
these patches let ,,oldstyle'' and freetype subtitle renderers live
arpi
parents:
7122
diff
changeset
|
95 /* skip files that look like: TTF (0x00, 0x01), PFM (0x00, 0x01), PFB |
81dbd28ef7c0
these patches let ,,oldstyle'' and freetype subtitle renderers live
arpi
parents:
7122
diff
changeset
|
96 * (0x80, 0x01), PCF (0x01, 0x66), fon ("MZ"), gzipped (0x1f, 0x8b) */ |
81dbd28ef7c0
these patches let ,,oldstyle'' and freetype subtitle renderers live
arpi
parents:
7122
diff
changeset
|
97 |
81dbd28ef7c0
these patches let ,,oldstyle'' and freetype subtitle renderers live
arpi
parents:
7122
diff
changeset
|
98 if (first) { |
81dbd28ef7c0
these patches let ,,oldstyle'' and freetype subtitle renderers live
arpi
parents:
7122
diff
changeset
|
99 if (!sor[0] || sor[1] == 1 || (sor[0] == 'M' && sor[1] == 'Z') || (sor[0] == 0x1f && sor[1] == 0x8b) || (sor[0] == 1 && sor[1] == 0x66)) { |
81dbd28ef7c0
these patches let ,,oldstyle'' and freetype subtitle renderers live
arpi
parents:
7122
diff
changeset
|
100 printf("%s doesn't look like a font description, ignoring\n", fname); |
81dbd28ef7c0
these patches let ,,oldstyle'' and freetype subtitle renderers live
arpi
parents:
7122
diff
changeset
|
101 fclose(f); |
81dbd28ef7c0
these patches let ,,oldstyle'' and freetype subtitle renderers live
arpi
parents:
7122
diff
changeset
|
102 free(desc); |
81dbd28ef7c0
these patches let ,,oldstyle'' and freetype subtitle renderers live
arpi
parents:
7122
diff
changeset
|
103 free(dn); |
81dbd28ef7c0
these patches let ,,oldstyle'' and freetype subtitle renderers live
arpi
parents:
7122
diff
changeset
|
104 return NULL; |
81dbd28ef7c0
these patches let ,,oldstyle'' and freetype subtitle renderers live
arpi
parents:
7122
diff
changeset
|
105 } |
81dbd28ef7c0
these patches let ,,oldstyle'' and freetype subtitle renderers live
arpi
parents:
7122
diff
changeset
|
106 first = 0; |
81dbd28ef7c0
these patches let ,,oldstyle'' and freetype subtitle renderers live
arpi
parents:
7122
diff
changeset
|
107 } |
81dbd28ef7c0
these patches let ,,oldstyle'' and freetype subtitle renderers live
arpi
parents:
7122
diff
changeset
|
108 |
213 | 109 p[0]=d;++pdb; |
110 while(1){ | |
111 int c=*s++; | |
112 if(c==0 || c==13 || c==10) break; | |
113 if(!id){ | |
114 if(c==39 || c==34){ id=c;continue;} // idezojel | |
115 if(c==';' || c=='#') break; | |
116 if(c==9) c=' '; | |
117 if(c==' '){ | |
118 if(ec==' ') continue; | |
119 *d=0; ++d; | |
120 p[pdb]=d;++pdb; | |
121 if(pdb>=8) break; | |
122 continue; | |
123 } | |
124 } else { | |
125 if(id==c){ id=0;continue;} // idezojel | |
126 | |
127 } | |
128 *d=c;d++; | |
129 ec=c; | |
130 } | |
131 if(d==sor2) continue; // skip empty lines | |
132 *d=0; | |
133 | |
134 // printf("params=%d sor=%s\n",pdb,sor); | |
135 // for(i=0;i<pdb;i++) printf(" param %d = '%s'\n",i,p[i]); | |
136 | |
137 if(pdb==1 && p[0][0]=='['){ | |
138 int len=strlen(p[0]); | |
139 if(len && len<63 && p[0][len-1]==']'){ | |
140 strcpy(section,p[0]); | |
339 | 141 if(verbose) printf("font: Reading section: %s\n",section); |
213 | 142 if(strcmp(section,"[files]")==0){ |
143 ++fontdb; | |
144 if(fontdb>=16){ printf("font: Too many bitmaps defined!\n");return NULL;} | |
145 } | |
146 continue; | |
147 } | |
148 } | |
149 | |
1353 | 150 if(strcmp(section,"[fpath]")==0){ |
151 if(pdb==1){ | |
2222
ddf897c38fb1
read font files from the same dir as font.desc or as specified in font.desc
atlka
parents:
1446
diff
changeset
|
152 if (desc->fpath) |
ddf897c38fb1
read font files from the same dir as font.desc or as specified in font.desc
atlka
parents:
1446
diff
changeset
|
153 free (desc->fpath); // release previously allocated memory |
1353 | 154 desc->fpath=strdup(p[0]); |
155 continue; | |
156 } | |
157 } else | |
158 | |
213 | 159 if(strcmp(section,"[files]")==0){ |
2238
be4160d7db48
if not found using fpath try to load font bitmaps from default dir
atlka
parents:
2223
diff
changeset
|
160 char *default_dir=DATADIR"/font"; |
213 | 161 if(pdb==2 && strcmp(p[0],"alpha")==0){ |
1353 | 162 char *cp; |
163 if (!(cp=malloc(strlen(desc->fpath)+strlen(p[1])+2))) return NULL; | |
164 | |
165 snprintf(cp,strlen(desc->fpath)+strlen(p[1])+2,"%s/%s", | |
166 desc->fpath,p[1]); | |
167 if(!((desc->pic_a[fontdb]=load_raw(cp,verbose)))){ | |
216
338b5664ea13
Search font files in ~/.mplayer/font/ instead of current dir
lgb
parents:
215
diff
changeset
|
168 free(cp); |
2238
be4160d7db48
if not found using fpath try to load font bitmaps from default dir
atlka
parents:
2223
diff
changeset
|
169 if (!(cp=malloc(strlen(default_dir)+strlen(p[1])+2))) |
be4160d7db48
if not found using fpath try to load font bitmaps from default dir
atlka
parents:
2223
diff
changeset
|
170 return NULL; |
be4160d7db48
if not found using fpath try to load font bitmaps from default dir
atlka
parents:
2223
diff
changeset
|
171 snprintf(cp,strlen(default_dir)+strlen(p[1])+2,"%s/%s", |
be4160d7db48
if not found using fpath try to load font bitmaps from default dir
atlka
parents:
2223
diff
changeset
|
172 default_dir,p[1]); |
be4160d7db48
if not found using fpath try to load font bitmaps from default dir
atlka
parents:
2223
diff
changeset
|
173 if (!((desc->pic_a[fontdb]=load_raw(cp,verbose)))){ |
be4160d7db48
if not found using fpath try to load font bitmaps from default dir
atlka
parents:
2223
diff
changeset
|
174 printf("Can't load font bitmap: %s\n",p[1]); |
be4160d7db48
if not found using fpath try to load font bitmaps from default dir
atlka
parents:
2223
diff
changeset
|
175 free(cp); |
be4160d7db48
if not found using fpath try to load font bitmaps from default dir
atlka
parents:
2223
diff
changeset
|
176 return NULL; |
be4160d7db48
if not found using fpath try to load font bitmaps from default dir
atlka
parents:
2223
diff
changeset
|
177 } |
213 | 178 } |
216
338b5664ea13
Search font files in ~/.mplayer/font/ instead of current dir
lgb
parents:
215
diff
changeset
|
179 free(cp); |
213 | 180 continue; |
181 } | |
182 if(pdb==2 && strcmp(p[0],"bitmap")==0){ | |
1353 | 183 char *cp; |
184 if (!(cp=malloc(strlen(desc->fpath)+strlen(p[1])+2))) return NULL; | |
185 | |
186 snprintf(cp,strlen(desc->fpath)+strlen(p[1])+2,"%s/%s", | |
187 desc->fpath,p[1]); | |
188 if(!((desc->pic_b[fontdb]=load_raw(cp,verbose)))){ | |
216
338b5664ea13
Search font files in ~/.mplayer/font/ instead of current dir
lgb
parents:
215
diff
changeset
|
189 free(cp); |
2238
be4160d7db48
if not found using fpath try to load font bitmaps from default dir
atlka
parents:
2223
diff
changeset
|
190 if (!(cp=malloc(strlen(default_dir)+strlen(p[1])+2))) |
be4160d7db48
if not found using fpath try to load font bitmaps from default dir
atlka
parents:
2223
diff
changeset
|
191 return NULL; |
be4160d7db48
if not found using fpath try to load font bitmaps from default dir
atlka
parents:
2223
diff
changeset
|
192 snprintf(cp,strlen(default_dir)+strlen(p[1])+2,"%s/%s", |
be4160d7db48
if not found using fpath try to load font bitmaps from default dir
atlka
parents:
2223
diff
changeset
|
193 default_dir,p[1]); |
be4160d7db48
if not found using fpath try to load font bitmaps from default dir
atlka
parents:
2223
diff
changeset
|
194 if (!((desc->pic_b[fontdb]=load_raw(cp,verbose)))){ |
be4160d7db48
if not found using fpath try to load font bitmaps from default dir
atlka
parents:
2223
diff
changeset
|
195 printf("Can't load font bitmap: %s\n",p[1]); |
be4160d7db48
if not found using fpath try to load font bitmaps from default dir
atlka
parents:
2223
diff
changeset
|
196 free(cp); |
be4160d7db48
if not found using fpath try to load font bitmaps from default dir
atlka
parents:
2223
diff
changeset
|
197 return NULL; |
be4160d7db48
if not found using fpath try to load font bitmaps from default dir
atlka
parents:
2223
diff
changeset
|
198 } |
213 | 199 } |
216
338b5664ea13
Search font files in ~/.mplayer/font/ instead of current dir
lgb
parents:
215
diff
changeset
|
200 free(cp); |
213 | 201 continue; |
202 } | |
203 } else | |
204 | |
205 if(strcmp(section,"[info]")==0){ | |
214 | 206 if(pdb==2 && strcmp(p[0],"name")==0){ |
207 desc->name=strdup(p[1]); | |
208 continue; | |
209 } | |
210 if(pdb==2 && strcmp(p[0],"descversion")==0){ | |
211 version=atoi(p[1]); | |
212 continue; | |
213 } | |
213 | 214 if(pdb==2 && strcmp(p[0],"spacewidth")==0){ |
215 desc->spacewidth=atoi(p[1]); | |
216 continue; | |
217 } | |
218 if(pdb==2 && strcmp(p[0],"charspace")==0){ | |
219 desc->charspace=atoi(p[1]); | |
220 continue; | |
221 } | |
222 if(pdb==2 && strcmp(p[0],"height")==0){ | |
223 desc->height=atoi(p[1]); | |
224 continue; | |
225 } | |
226 } else | |
214 | 227 |
213 | 228 if(strcmp(section,"[characters]")==0){ |
219 | 229 if(pdb==3){ |
213 | 230 int chr=p[0][0]; |
231 int start=atoi(p[1]); | |
232 int end=atoi(p[2]); | |
727 | 233 if(sub_unicode && (chr>=0x80)) chr=(chr<<8)+p[0][1]; |
706
8a7666a78f83
better .smi support and display two-byte characters- patch by Sunjin Yang
arpi_esp
parents:
340
diff
changeset
|
234 else if(strlen(p[0])!=1) chr=strtol(p[0],NULL,0); |
213 | 235 if(end<start) { |
236 printf("error in font desc: end<start for char '%c'\n",chr); | |
237 } else { | |
238 desc->start[chr]=start; | |
239 desc->width[chr]=end-start+1; | |
240 desc->font[chr]=fontdb; | |
241 // printf("char %d '%c' start=%d width=%d\n",chr,chr,desc->start[chr],desc->width[chr]); | |
242 ++chardb; | |
243 } | |
244 continue; | |
245 } | |
246 } | |
247 printf("Syntax error in font desc: %s\n",sor); | |
248 | |
249 } | |
250 fclose(f); | |
251 | |
252 //printf("font: pos of U = %d\n",desc->start[218]); | |
253 | |
254 for(i=0;i<=fontdb;i++){ | |
255 if(!desc->pic_a[i] || !desc->pic_b[i]){ | |
256 printf("font: Missing bitmap(s) for sub-font #%d\n",i); | |
257 return NULL; | |
258 } | |
249 | 259 //if(factor!=1.0f) |
260 { | |
215 | 261 // re-sample alpha |
262 int f=factor*256.0f; | |
263 int size=desc->pic_a[i]->w*desc->pic_a[i]->h; | |
264 int j; | |
339 | 265 if(verbose) printf("font: resampling alpha by factor %5.3f (%d) ",factor,f);fflush(stdout); |
215 | 266 for(j=0;j<size;j++){ |
947
76fd9463b9d3
FAST_OSD option to disable font outline antialiasing
arpi_esp
parents:
728
diff
changeset
|
267 int x=desc->pic_a[i]->bmp[j]; // alpha |
76fd9463b9d3
FAST_OSD option to disable font outline antialiasing
arpi_esp
parents:
728
diff
changeset
|
268 int y=desc->pic_b[i]->bmp[j]; // bitmap |
76fd9463b9d3
FAST_OSD option to disable font outline antialiasing
arpi_esp
parents:
728
diff
changeset
|
269 |
76fd9463b9d3
FAST_OSD option to disable font outline antialiasing
arpi_esp
parents:
728
diff
changeset
|
270 #ifdef FAST_OSD |
76fd9463b9d3
FAST_OSD option to disable font outline antialiasing
arpi_esp
parents:
728
diff
changeset
|
271 x=(x<(255-f))?0:1; |
76fd9463b9d3
FAST_OSD option to disable font outline antialiasing
arpi_esp
parents:
728
diff
changeset
|
272 #else |
249 | 273 |
250 | 274 x=255-((x*f)>>8); // scale |
275 //if(x<0) x=0; else if(x>255) x=255; | |
276 //x^=255; // invert | |
277 | |
249 | 278 if(x+y>255) x=255-y; // to avoid overflows |
279 | |
280 //x=0; | |
281 //x=((x*f*(255-y))>>16); | |
282 //x=((x*f*(255-y))>>16)+y; | |
215 | 283 //x=(x*f)>>8;if(x<y) x=y; |
250 | 284 |
249 | 285 if(x<1) x=1; else |
286 if(x>=252) x=0; | |
947
76fd9463b9d3
FAST_OSD option to disable font outline antialiasing
arpi_esp
parents:
728
diff
changeset
|
287 #endif |
250 | 288 |
215 | 289 desc->pic_a[i]->bmp[j]=x; |
250 | 290 // desc->pic_b[i]->bmp[j]=0; // hack |
215 | 291 } |
339 | 292 if(verbose) printf("DONE!\n"); |
215 | 293 } |
213 | 294 if(!desc->height) desc->height=desc->pic_a[i]->h; |
295 } | |
296 | |
297 j='_';if(desc->font[j]<0) j='?'; | |
298 for(i=0;i<512;i++) | |
299 if(desc->font[i]<0){ | |
300 desc->start[i]=desc->start[j]; | |
301 desc->width[i]=desc->width[j]; | |
302 desc->font[i]=desc->font[j]; | |
303 } | |
304 desc->font[' ']=-1; | |
305 desc->width[' ']=desc->spacewidth; | |
306 | |
340 | 307 printf("Font %s loaded successfully! (%d chars)\n",fname,chardb); |
213 | 308 |
309 return desc; | |
310 } | |
311 | |
312 #if 0 | |
313 int main(){ | |
314 | |
339 | 315 read_font_desc("high_arpi.desc",1); |
213 | 316 |
317 } | |
318 #endif | |
7122
0dc9cb756b68
freetype 2.0/2.1+ support - disabled by default until bugs fixed
arpi
parents:
5928
diff
changeset
|
319 |