annotate libass/ass_fontconfig.c @ 23935:b4a1d0cf4c11

Test for reserved identifiers. Identifiers with two initial underscores or an initial underscore followed by an uppercase letter are reserved globally for use by the compiler.
author ivo
date Tue, 31 Jul 2007 07:45:06 +0000
parents b863ed752149
children 27bac14b4ce4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
20008
fa122b7c71c6 Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents: 19902
diff changeset
1 // -*- c-basic-offset: 8; indent-tabs-mode: t -*-
fa122b7c71c6 Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents: 19902
diff changeset
2 // vim:ts=8:sw=8:noet:ai:
fa122b7c71c6 Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents: 19902
diff changeset
3 /*
fa122b7c71c6 Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents: 19902
diff changeset
4 Copyright (C) 2006 Evgeniy Stepanov <eugeni.stepanov@gmail.com>
fa122b7c71c6 Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents: 19902
diff changeset
5
fa122b7c71c6 Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents: 19902
diff changeset
6 This program is free software; you can redistribute it and/or modify
fa122b7c71c6 Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents: 19902
diff changeset
7 it under the terms of the GNU General Public License as published by
fa122b7c71c6 Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents: 19902
diff changeset
8 the Free Software Foundation; either version 2 of the License, or
fa122b7c71c6 Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents: 19902
diff changeset
9 (at your option) any later version.
fa122b7c71c6 Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents: 19902
diff changeset
10
fa122b7c71c6 Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents: 19902
diff changeset
11 This program is distributed in the hope that it will be useful,
fa122b7c71c6 Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents: 19902
diff changeset
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
fa122b7c71c6 Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents: 19902
diff changeset
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
fa122b7c71c6 Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents: 19902
diff changeset
14 GNU General Public License for more details.
fa122b7c71c6 Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents: 19902
diff changeset
15
fa122b7c71c6 Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents: 19902
diff changeset
16 You should have received a copy of the GNU General Public License
fa122b7c71c6 Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents: 19902
diff changeset
17 along with this program; if not, write to the Free Software
fa122b7c71c6 Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents: 19902
diff changeset
18 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
fa122b7c71c6 Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents: 19902
diff changeset
19 */
fa122b7c71c6 Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents: 19902
diff changeset
20
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
21 #include "config.h"
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
22
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
23 #include <stdlib.h>
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
24 #include <stdio.h>
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
25 #include <assert.h>
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
26 #include <string.h>
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
27 #include <sys/types.h>
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
28 #include <sys/stat.h>
22292
2f3f27a014ef Add some missing includes.
eugeni
parents: 21630
diff changeset
29 #include <inttypes.h>
2f3f27a014ef Add some missing includes.
eugeni
parents: 21630
diff changeset
30 #include <ft2build.h>
2f3f27a014ef Add some missing includes.
eugeni
parents: 21630
diff changeset
31 #include FT_FREETYPE_H
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
32
21026
d138463e820b Collect all includes of mplayer headers in libass in a single file (mputils.h).
eugeni
parents: 20629
diff changeset
33 #include "mputils.h"
21458
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
34 #include "ass.h"
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
35 #include "ass_library.h"
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
36 #include "ass_fontconfig.h"
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
37
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
38 #ifdef HAVE_FONTCONFIG
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
39 #include <fontconfig/fontconfig.h>
21460
62bd8e0d3a0f Open embedded fonts directly from memory.
eugeni
parents: 21458
diff changeset
40 #include <fontconfig/fcfreetype.h>
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
41 #endif
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
42
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
43 struct fc_instance_s {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
44 #ifdef HAVE_FONTCONFIG
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
45 FcConfig* config;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
46 #endif
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
47 char* family_default;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
48 char* path_default;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
49 int index_default;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
50 };
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
51
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
52 #ifdef HAVE_FONTCONFIG
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
53 /**
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
54 * \brief Low-level font selection.
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
55 * \param priv private data
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
56 * \param family font family
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
57 * \param bold font weight value
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
58 * \param italic font slant value
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
59 * \param index out: font index inside a file
21630
0d8005d2fe5c Update some comments.
eugeni
parents: 21615
diff changeset
60 * \param charset: contains the characters that should be present in the font, can be NULL
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
61 * \return font file path
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
62 */
21351
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21279
diff changeset
63 static char* _select_font(fc_instance_t* priv, const char* family, unsigned bold, unsigned italic, int* index,
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21279
diff changeset
64 FcCharSet* charset)
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
65 {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
66 FcBool rc;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
67 FcResult result;
23215
c52636be7c4b Deallocate FontConfig objects.
eugeni
parents: 22946
diff changeset
68 FcPattern *pat = 0, *rpat;
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
69 int val_i;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
70 FcChar8* val_s;
19001
31b7033c573e Only match outline fonts.
eugeni
parents: 18937
diff changeset
71 FcBool val_b;
21351
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21279
diff changeset
72 FcCharSet* val_cs;
23215
c52636be7c4b Deallocate FontConfig objects.
eugeni
parents: 22946
diff changeset
73 FcFontSet* fset = 0;
21351
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21279
diff changeset
74 int curf, bestf, bestdiff = 0;
23215
c52636be7c4b Deallocate FontConfig objects.
eugeni
parents: 22946
diff changeset
75 char* retval = 0;
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
76
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
77 *index = 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
78
19063
5525af2ee4c7 Use FcPatternAdd-Type instead of FcNameParse. The latter, as it turns out, requires escaping of some characters ('-', maybe more).
eugeni
parents: 19001
diff changeset
79 pat = FcPatternCreate();
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
80 if (!pat)
23215
c52636be7c4b Deallocate FontConfig objects.
eugeni
parents: 22946
diff changeset
81 goto error;
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
82
19063
5525af2ee4c7 Use FcPatternAdd-Type instead of FcNameParse. The latter, as it turns out, requires escaping of some characters ('-', maybe more).
eugeni
parents: 19001
diff changeset
83 FcPatternAddString(pat, FC_FAMILY, (const FcChar8*)family);
5525af2ee4c7 Use FcPatternAdd-Type instead of FcNameParse. The latter, as it turns out, requires escaping of some characters ('-', maybe more).
eugeni
parents: 19001
diff changeset
84 FcPatternAddBool(pat, FC_OUTLINE, FcTrue);
5525af2ee4c7 Use FcPatternAdd-Type instead of FcNameParse. The latter, as it turns out, requires escaping of some characters ('-', maybe more).
eugeni
parents: 19001
diff changeset
85 FcPatternAddInteger(pat, FC_SLANT, italic);
5525af2ee4c7 Use FcPatternAdd-Type instead of FcNameParse. The latter, as it turns out, requires escaping of some characters ('-', maybe more).
eugeni
parents: 19001
diff changeset
86 FcPatternAddInteger(pat, FC_WEIGHT, bold);
5525af2ee4c7 Use FcPatternAdd-Type instead of FcNameParse. The latter, as it turns out, requires escaping of some characters ('-', maybe more).
eugeni
parents: 19001
diff changeset
87
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
88 FcDefaultSubstitute(pat);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
89
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
90 rc = FcConfigSubstitute(priv->config, pat, FcMatchPattern);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
91 if (!rc)
23215
c52636be7c4b Deallocate FontConfig objects.
eugeni
parents: 22946
diff changeset
92 goto error;
21351
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21279
diff changeset
93
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21279
diff changeset
94 fset = FcFontSort(priv->config, pat, FcTrue, NULL, &result);
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21279
diff changeset
95
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21279
diff changeset
96 bestf = -1;
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21279
diff changeset
97 if (charset)
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21279
diff changeset
98 bestdiff = FcCharSetCount(charset) + 1;
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21279
diff changeset
99 for (curf = 0; curf < fset->nfont; ++curf) {
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21279
diff changeset
100 rpat = fset->fonts[curf];
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21279
diff changeset
101
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21279
diff changeset
102 result = FcPatternGetBool(rpat, FC_OUTLINE, 0, &val_b);
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21279
diff changeset
103 if (result != FcResultMatch)
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21279
diff changeset
104 continue;
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21279
diff changeset
105 if (val_b != FcTrue)
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21279
diff changeset
106 continue;
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21279
diff changeset
107
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21279
diff changeset
108 if (charset) {
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21279
diff changeset
109 int diff;
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21279
diff changeset
110 result = FcPatternGetCharSet(rpat, FC_CHARSET, 0, &val_cs);
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21279
diff changeset
111 if (result != FcResultMatch)
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21279
diff changeset
112 continue;
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21279
diff changeset
113 diff = FcCharSetSubtractCount(charset, val_cs);
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21279
diff changeset
114 if (diff < bestdiff) {
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21279
diff changeset
115 bestdiff = diff;
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21279
diff changeset
116 bestf = curf;
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21279
diff changeset
117 }
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21279
diff changeset
118 if (diff == 0)
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21279
diff changeset
119 break;
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21279
diff changeset
120 } else {
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21279
diff changeset
121 bestf = curf;
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21279
diff changeset
122 break;
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21279
diff changeset
123 }
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21279
diff changeset
124 }
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21279
diff changeset
125
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21279
diff changeset
126 if (bestf < 0)
23215
c52636be7c4b Deallocate FontConfig objects.
eugeni
parents: 22946
diff changeset
127 goto error;
21351
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21279
diff changeset
128
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21279
diff changeset
129 rpat = fset->fonts[bestf];
19001
31b7033c573e Only match outline fonts.
eugeni
parents: 18937
diff changeset
130
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
131 result = FcPatternGetInteger(rpat, FC_INDEX, 0, &val_i);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
132 if (result != FcResultMatch)
23215
c52636be7c4b Deallocate FontConfig objects.
eugeni
parents: 22946
diff changeset
133 goto error;
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
134 *index = val_i;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
135
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
136 result = FcPatternGetString(rpat, FC_FAMILY, 0, &val_s);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
137 if (result != FcResultMatch)
23215
c52636be7c4b Deallocate FontConfig objects.
eugeni
parents: 22946
diff changeset
138 goto error;
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
139
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
140 if (strcasecmp((const char*)val_s, family) != 0)
21066
6196ba31e97e MSGTRs for libass
kraymer
parents: 21026
diff changeset
141 mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_SelectedFontFamilyIsNotTheRequestedOne,
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
142 (const char*)val_s, family);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
143
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
144 result = FcPatternGetString(rpat, FC_FILE, 0, &val_s);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
145 if (result != FcResultMatch)
23215
c52636be7c4b Deallocate FontConfig objects.
eugeni
parents: 22946
diff changeset
146 goto error;
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
147
23215
c52636be7c4b Deallocate FontConfig objects.
eugeni
parents: 22946
diff changeset
148 retval = strdup((const char*)val_s);
c52636be7c4b Deallocate FontConfig objects.
eugeni
parents: 22946
diff changeset
149 error:
c52636be7c4b Deallocate FontConfig objects.
eugeni
parents: 22946
diff changeset
150 if (pat) FcPatternDestroy(pat);
c52636be7c4b Deallocate FontConfig objects.
eugeni
parents: 22946
diff changeset
151 if (fset) FcFontSetDestroy(fset);
c52636be7c4b Deallocate FontConfig objects.
eugeni
parents: 22946
diff changeset
152 return retval;
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
153 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
154
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
155 /**
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
156 * \brief Find a font. Use default family or path if necessary.
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
157 * \param priv_ private data
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
158 * \param family font family
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
159 * \param bold font weight value
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
160 * \param italic font slant value
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
161 * \param index out: font index inside a file
21630
0d8005d2fe5c Update some comments.
eugeni
parents: 21615
diff changeset
162 * \param charset: contains the characters that should be present in the font, can be NULL
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
163 * \return font file path
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
164 */
21351
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21279
diff changeset
165 char* fontconfig_select_with_charset(fc_instance_t* priv, const char* family, unsigned bold, unsigned italic, int* index,
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21279
diff changeset
166 FcCharSet* charset)
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
167 {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
168 char* res = 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
169 if (family && *family)
21351
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21279
diff changeset
170 res = _select_font(priv, family, bold, italic, index, charset);
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
171 if (!res && priv->family_default) {
21351
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21279
diff changeset
172 res = _select_font(priv, priv->family_default, bold, italic, index, charset);
21279
9040bce9f768 Remove obsolete "no_more_font_messages" hack.
eugeni
parents: 21066
diff changeset
173 if (res)
21066
6196ba31e97e MSGTRs for libass
kraymer
parents: 21026
diff changeset
174 mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_UsingDefaultFontFamily,
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
175 family, bold, italic, res, *index);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
176 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
177 if (!res && priv->path_default) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
178 res = priv->path_default;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
179 *index = priv->index_default;
21279
9040bce9f768 Remove obsolete "no_more_font_messages" hack.
eugeni
parents: 21066
diff changeset
180 mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_UsingDefaultFont,
9040bce9f768 Remove obsolete "no_more_font_messages" hack.
eugeni
parents: 21066
diff changeset
181 family, bold, italic, res, *index);
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
182 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
183 if (!res) {
21351
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21279
diff changeset
184 res = _select_font(priv, "Arial", bold, italic, index, charset);
21279
9040bce9f768 Remove obsolete "no_more_font_messages" hack.
eugeni
parents: 21066
diff changeset
185 if (res)
21066
6196ba31e97e MSGTRs for libass
kraymer
parents: 21026
diff changeset
186 mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_UsingArialFontFamily,
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
187 family, bold, italic, res, *index);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
188 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
189 if (res)
20629
e8885ec63928 Introduce MSGT_ASS, use it for all libass messages.
eugeni
parents: 20105
diff changeset
190 mp_msg(MSGT_ASS, MSGL_V, "fontconfig_select: (%s, %d, %d) -> %s, %d\n",
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
191 family, bold, italic, res, *index);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
192 return res;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
193 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
194
21351
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21279
diff changeset
195 char* fontconfig_select(fc_instance_t* priv, const char* family, unsigned bold, unsigned italic, int* index)
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21279
diff changeset
196 {
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21279
diff changeset
197 return fontconfig_select_with_charset(priv, family, bold, italic, index, 0);
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21279
diff changeset
198 }
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21279
diff changeset
199
23216
b863ed752149 Move variables and a function under #ifdef FC_VERSION to avoid warnings.
eugeni
parents: 23215
diff changeset
200 #if (FC_VERSION < 20402)
21458
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
201 static char* validate_fname(char* name)
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
202 {
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
203 char* fname;
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
204 char* p;
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
205 char* q;
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
206 unsigned code;
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
207 int sz = strlen(name);
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
208
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
209 q = fname = malloc(sz + 1);
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
210 p = name;
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
211 while (*p) {
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
212 code = utf8_get_char(&p);
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
213 if (code == 0)
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
214 break;
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
215 if ( (code > 0x7F) ||
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
216 (code == '\\') ||
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
217 (code == '/') ||
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
218 (code == ':') ||
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
219 (code == '*') ||
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
220 (code == '?') ||
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
221 (code == '<') ||
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
222 (code == '>') ||
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
223 (code == '|') ||
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
224 (code == 0))
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
225 {
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
226 *q++ = '_';
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
227 } else {
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
228 *q++ = code;
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
229 }
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
230 if (p - name > sz)
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
231 break;
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
232 }
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
233 *q = 0;
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
234 return fname;
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
235 }
23216
b863ed752149 Move variables and a function under #ifdef FC_VERSION to avoid warnings.
eugeni
parents: 23215
diff changeset
236 #endif
21458
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
237
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
238 /**
21630
0d8005d2fe5c Update some comments.
eugeni
parents: 21615
diff changeset
239 * \brief Process memory font.
0d8005d2fe5c Update some comments.
eugeni
parents: 21615
diff changeset
240 * \param priv private data
0d8005d2fe5c Update some comments.
eugeni
parents: 21615
diff changeset
241 * \param library library object
0d8005d2fe5c Update some comments.
eugeni
parents: 21615
diff changeset
242 * \param ftlibrary freetype library object
0d8005d2fe5c Update some comments.
eugeni
parents: 21615
diff changeset
243 * \param idx index of the processed font in library->fontdata
0d8005d2fe5c Update some comments.
eugeni
parents: 21615
diff changeset
244 * With FontConfig >= 2.4.2, builds a font pattern in memory via FT_New_Memory_Face/FcFreeTypeQueryFace.
0d8005d2fe5c Update some comments.
eugeni
parents: 21615
diff changeset
245 * With older FontConfig versions, save the font to ~/.mplayer/fonts.
21458
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
246 */
21460
62bd8e0d3a0f Open embedded fonts directly from memory.
eugeni
parents: 21458
diff changeset
247 static void process_fontdata(fc_instance_t* priv, ass_library_t* library, FT_Library ftlibrary, int idx)
21458
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
248 {
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
249 int rc;
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
250 const char* name = library->fontdata[idx].name;
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
251 const char* data = library->fontdata[idx].data;
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
252 int data_size = library->fontdata[idx].size;
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
253
21460
62bd8e0d3a0f Open embedded fonts directly from memory.
eugeni
parents: 21458
diff changeset
254 #if (FC_VERSION < 20402)
23216
b863ed752149 Move variables and a function under #ifdef FC_VERSION to avoid warnings.
eugeni
parents: 23215
diff changeset
255 struct stat st;
b863ed752149 Move variables and a function under #ifdef FC_VERSION to avoid warnings.
eugeni
parents: 23215
diff changeset
256 char* fname;
b863ed752149 Move variables and a function under #ifdef FC_VERSION to avoid warnings.
eugeni
parents: 23215
diff changeset
257 const char* fonts_dir = library->fonts_dir;
b863ed752149 Move variables and a function under #ifdef FC_VERSION to avoid warnings.
eugeni
parents: 23215
diff changeset
258 char buf[1000];
b863ed752149 Move variables and a function under #ifdef FC_VERSION to avoid warnings.
eugeni
parents: 23215
diff changeset
259 FILE* fp = 0;
b863ed752149 Move variables and a function under #ifdef FC_VERSION to avoid warnings.
eugeni
parents: 23215
diff changeset
260
21458
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
261 if (!fonts_dir)
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
262 return;
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
263 rc = stat(fonts_dir, &st);
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
264 if (rc) {
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
265 int res;
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
266 #ifndef __MINGW32__
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
267 res = mkdir(fonts_dir, 0700);
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
268 #else
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
269 res = mkdir(fonts_dir);
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
270 #endif
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
271 if (res) {
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
272 mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_FailedToCreateDirectory, fonts_dir);
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
273 }
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
274 } else if (!S_ISDIR(st.st_mode)) {
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
275 mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_NotADirectory, fonts_dir);
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
276 }
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
277
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
278 fname = validate_fname((char*)name);
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
279
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
280 snprintf(buf, 1000, "%s/%s", fonts_dir, fname);
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
281 free(fname);
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
282
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
283 fp = fopen(buf, "wb");
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
284 if (!fp) return;
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
285
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
286 fwrite(data, data_size, 1, fp);
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
287 fclose(fp);
21460
62bd8e0d3a0f Open embedded fonts directly from memory.
eugeni
parents: 21458
diff changeset
288
62bd8e0d3a0f Open embedded fonts directly from memory.
eugeni
parents: 21458
diff changeset
289 #else // (FC_VERSION >= 20402)
23216
b863ed752149 Move variables and a function under #ifdef FC_VERSION to avoid warnings.
eugeni
parents: 23215
diff changeset
290 FT_Face face;
b863ed752149 Move variables and a function under #ifdef FC_VERSION to avoid warnings.
eugeni
parents: 23215
diff changeset
291 FcPattern* pattern;
b863ed752149 Move variables and a function under #ifdef FC_VERSION to avoid warnings.
eugeni
parents: 23215
diff changeset
292 FcFontSet* fset;
b863ed752149 Move variables and a function under #ifdef FC_VERSION to avoid warnings.
eugeni
parents: 23215
diff changeset
293 FcBool res;
21460
62bd8e0d3a0f Open embedded fonts directly from memory.
eugeni
parents: 21458
diff changeset
294
21615
62989854d340 Avoid "pointer targets differ in signedness" warnings.
eugeni
parents: 21460
diff changeset
295 rc = FT_New_Memory_Face(ftlibrary, (unsigned char*)data, data_size, 0, &face);
21460
62bd8e0d3a0f Open embedded fonts directly from memory.
eugeni
parents: 21458
diff changeset
296 if (rc) {
62bd8e0d3a0f Open embedded fonts directly from memory.
eugeni
parents: 21458
diff changeset
297 mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_ErrorOpeningMemoryFont, name);
62bd8e0d3a0f Open embedded fonts directly from memory.
eugeni
parents: 21458
diff changeset
298 return;
62bd8e0d3a0f Open embedded fonts directly from memory.
eugeni
parents: 21458
diff changeset
299 }
62bd8e0d3a0f Open embedded fonts directly from memory.
eugeni
parents: 21458
diff changeset
300
21615
62989854d340 Avoid "pointer targets differ in signedness" warnings.
eugeni
parents: 21460
diff changeset
301 pattern = FcFreeTypeQueryFace(face, (unsigned char*)name, 0, FcConfigGetBlanks(priv->config));
21460
62bd8e0d3a0f Open embedded fonts directly from memory.
eugeni
parents: 21458
diff changeset
302 if (!pattern) {
62bd8e0d3a0f Open embedded fonts directly from memory.
eugeni
parents: 21458
diff changeset
303 mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_FunctionCallFailed, "FcFreeTypeQueryFace");
62bd8e0d3a0f Open embedded fonts directly from memory.
eugeni
parents: 21458
diff changeset
304 FT_Done_Face(face);
62bd8e0d3a0f Open embedded fonts directly from memory.
eugeni
parents: 21458
diff changeset
305 return;
62bd8e0d3a0f Open embedded fonts directly from memory.
eugeni
parents: 21458
diff changeset
306 }
62bd8e0d3a0f Open embedded fonts directly from memory.
eugeni
parents: 21458
diff changeset
307
62bd8e0d3a0f Open embedded fonts directly from memory.
eugeni
parents: 21458
diff changeset
308 fset = FcConfigGetFonts(priv->config, FcSetSystem); // somehow it failes when asked for FcSetApplication
62bd8e0d3a0f Open embedded fonts directly from memory.
eugeni
parents: 21458
diff changeset
309 if (!fset) {
62bd8e0d3a0f Open embedded fonts directly from memory.
eugeni
parents: 21458
diff changeset
310 mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_FunctionCallFailed, "FcConfigGetFonts");
62bd8e0d3a0f Open embedded fonts directly from memory.
eugeni
parents: 21458
diff changeset
311 FT_Done_Face(face);
62bd8e0d3a0f Open embedded fonts directly from memory.
eugeni
parents: 21458
diff changeset
312 return;
62bd8e0d3a0f Open embedded fonts directly from memory.
eugeni
parents: 21458
diff changeset
313 }
62bd8e0d3a0f Open embedded fonts directly from memory.
eugeni
parents: 21458
diff changeset
314
62bd8e0d3a0f Open embedded fonts directly from memory.
eugeni
parents: 21458
diff changeset
315 res = FcFontSetAdd(fset, pattern);
62bd8e0d3a0f Open embedded fonts directly from memory.
eugeni
parents: 21458
diff changeset
316 if (!res) {
62bd8e0d3a0f Open embedded fonts directly from memory.
eugeni
parents: 21458
diff changeset
317 mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_FunctionCallFailed, "FcFontSetAdd");
62bd8e0d3a0f Open embedded fonts directly from memory.
eugeni
parents: 21458
diff changeset
318 FT_Done_Face(face);
62bd8e0d3a0f Open embedded fonts directly from memory.
eugeni
parents: 21458
diff changeset
319 return;
62bd8e0d3a0f Open embedded fonts directly from memory.
eugeni
parents: 21458
diff changeset
320 }
62bd8e0d3a0f Open embedded fonts directly from memory.
eugeni
parents: 21458
diff changeset
321
62bd8e0d3a0f Open embedded fonts directly from memory.
eugeni
parents: 21458
diff changeset
322 FT_Done_Face(face);
62bd8e0d3a0f Open embedded fonts directly from memory.
eugeni
parents: 21458
diff changeset
323 #endif
21458
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
324 }
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
325
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
326 /**
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
327 * \brief Init fontconfig.
21630
0d8005d2fe5c Update some comments.
eugeni
parents: 21615
diff changeset
328 * \param library libass library object
0d8005d2fe5c Update some comments.
eugeni
parents: 21615
diff changeset
329 * \param ftlibrary freetype library object
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
330 * \param family default font family
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
331 * \param path default font path
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
332 * \return pointer to fontconfig private data
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
333 */
21460
62bd8e0d3a0f Open embedded fonts directly from memory.
eugeni
parents: 21458
diff changeset
334 fc_instance_t* fontconfig_init(ass_library_t* library, FT_Library ftlibrary, const char* family, const char* path)
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
335 {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
336 int rc;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
337 fc_instance_t* priv = calloc(1, sizeof(fc_instance_t));
21458
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
338 const char* dir = library->fonts_dir;
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
339 int i;
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
340
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
341 rc = FcInit();
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
342 assert(rc);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
343
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
344 priv->config = FcConfigGetCurrent();
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
345 if (!priv->config) {
21066
6196ba31e97e MSGTRs for libass
kraymer
parents: 21026
diff changeset
346 mp_msg(MSGT_ASS, MSGL_FATAL, MSGTR_LIBASS_FcInitLoadConfigAndFontsFailed);
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
347 return 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
348 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
349
21458
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
350 for (i = 0; i < library->num_fontdata; ++i)
21460
62bd8e0d3a0f Open embedded fonts directly from memory.
eugeni
parents: 21458
diff changeset
351 process_fontdata(priv, library, ftlibrary, i);
21458
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
352
19340
f0d49f38ce97 Use FontConfig cache to speedup mplayer startup.
eugeni
parents: 19064
diff changeset
353 if (FcDirCacheValid((const FcChar8 *)dir) == FcFalse)
f0d49f38ce97 Use FontConfig cache to speedup mplayer startup.
eugeni
parents: 19064
diff changeset
354 {
21066
6196ba31e97e MSGTRs for libass
kraymer
parents: 21026
diff changeset
355 mp_msg(MSGT_ASS, MSGL_INFO, MSGTR_LIBASS_UpdatingFontCache);
20105
bcb586a0800c Avoid crash with fontconfig 2.3.9x (as shipped with SuSE 10.1, FcDirScan is broken)
reimar
parents: 20008
diff changeset
356 if (FcGetVersion() >= 20390 && FcGetVersion() < 20400)
20629
e8885ec63928 Introduce MSGT_ASS, use it for all libass messages.
eugeni
parents: 20105
diff changeset
357 mp_msg(MSGT_ASS, MSGL_WARN,
21066
6196ba31e97e MSGTRs for libass
kraymer
parents: 21026
diff changeset
358 MSGTR_LIBASS_BetaVersionsOfFontconfigAreNotSupported);
19901
27b87a9dc19a Don't call FcDirScan/FcDirSave with FontConfig >= 2.4.
eugeni
parents: 19481
diff changeset
359 // FontConfig >= 2.4.0 updates cache automatically in FcConfigAppFontAddDir()
20105
bcb586a0800c Avoid crash with fontconfig 2.3.9x (as shipped with SuSE 10.1, FcDirScan is broken)
reimar
parents: 20008
diff changeset
360 if (FcGetVersion() < 20390) {
19902
2c43912bb46a Cosmetics: fix indentation after last commit.
eugeni
parents: 19901
diff changeset
361 FcFontSet* fcs;
2c43912bb46a Cosmetics: fix indentation after last commit.
eugeni
parents: 19901
diff changeset
362 FcStrSet* fss;
2c43912bb46a Cosmetics: fix indentation after last commit.
eugeni
parents: 19901
diff changeset
363 fcs = FcFontSetCreate();
2c43912bb46a Cosmetics: fix indentation after last commit.
eugeni
parents: 19901
diff changeset
364 fss = FcStrSetCreate();
2c43912bb46a Cosmetics: fix indentation after last commit.
eugeni
parents: 19901
diff changeset
365 rc = FcStrSetAdd(fss, (const FcChar8*)dir);
2c43912bb46a Cosmetics: fix indentation after last commit.
eugeni
parents: 19901
diff changeset
366 if (!rc) {
21066
6196ba31e97e MSGTRs for libass
kraymer
parents: 21026
diff changeset
367 mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_FcStrSetAddFailed);
19902
2c43912bb46a Cosmetics: fix indentation after last commit.
eugeni
parents: 19901
diff changeset
368 goto ErrorFontCache;
2c43912bb46a Cosmetics: fix indentation after last commit.
eugeni
parents: 19901
diff changeset
369 }
19340
f0d49f38ce97 Use FontConfig cache to speedup mplayer startup.
eugeni
parents: 19064
diff changeset
370
19902
2c43912bb46a Cosmetics: fix indentation after last commit.
eugeni
parents: 19901
diff changeset
371 rc = FcDirScan(fcs, fss, NULL, FcConfigGetBlanks(priv->config), (const FcChar8 *)dir, FcFalse);
2c43912bb46a Cosmetics: fix indentation after last commit.
eugeni
parents: 19901
diff changeset
372 if (!rc) {
21066
6196ba31e97e MSGTRs for libass
kraymer
parents: 21026
diff changeset
373 mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_FcDirScanFailed);
19902
2c43912bb46a Cosmetics: fix indentation after last commit.
eugeni
parents: 19901
diff changeset
374 goto ErrorFontCache;
2c43912bb46a Cosmetics: fix indentation after last commit.
eugeni
parents: 19901
diff changeset
375 }
19340
f0d49f38ce97 Use FontConfig cache to speedup mplayer startup.
eugeni
parents: 19064
diff changeset
376
19902
2c43912bb46a Cosmetics: fix indentation after last commit.
eugeni
parents: 19901
diff changeset
377 rc = FcDirSave(fcs, fss, (const FcChar8 *)dir);
2c43912bb46a Cosmetics: fix indentation after last commit.
eugeni
parents: 19901
diff changeset
378 if (!rc) {
21066
6196ba31e97e MSGTRs for libass
kraymer
parents: 21026
diff changeset
379 mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_FcDirSave);
19902
2c43912bb46a Cosmetics: fix indentation after last commit.
eugeni
parents: 19901
diff changeset
380 goto ErrorFontCache;
2c43912bb46a Cosmetics: fix indentation after last commit.
eugeni
parents: 19901
diff changeset
381 }
2c43912bb46a Cosmetics: fix indentation after last commit.
eugeni
parents: 19901
diff changeset
382 ErrorFontCache:
2c43912bb46a Cosmetics: fix indentation after last commit.
eugeni
parents: 19901
diff changeset
383 ;
19901
27b87a9dc19a Don't call FcDirScan/FcDirSave with FontConfig >= 2.4.
eugeni
parents: 19481
diff changeset
384 }
19340
f0d49f38ce97 Use FontConfig cache to speedup mplayer startup.
eugeni
parents: 19064
diff changeset
385 }
f0d49f38ce97 Use FontConfig cache to speedup mplayer startup.
eugeni
parents: 19064
diff changeset
386
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
387 rc = FcConfigAppFontAddDir(priv->config, (const FcChar8*)dir);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
388 if (!rc) {
21066
6196ba31e97e MSGTRs for libass
kraymer
parents: 21026
diff changeset
389 mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_FcConfigAppFontAddDirFailed);
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
390 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
391
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
392 priv->family_default = family ? strdup(family) : 0;
22946
e7f1374cac88 Don't check if user-supplied default font path exists.
eugeni
parents: 22292
diff changeset
393 priv->path_default = path ? strdup(path) : 0;
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
394 priv->index_default = 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
395
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
396 return priv;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
397 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
398
21630
0d8005d2fe5c Update some comments.
eugeni
parents: 21615
diff changeset
399 #else // HAVE_FONTCONFIG
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
400
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
401 char* fontconfig_select(fc_instance_t* priv, const char* family, unsigned bold, unsigned italic, int* index)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
402 {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
403 *index = priv->index_default;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
404 return priv->path_default;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
405 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
406
21460
62bd8e0d3a0f Open embedded fonts directly from memory.
eugeni
parents: 21458
diff changeset
407 fc_instance_t* fontconfig_init(ass_library_t* library, FT_Library ftlibrary, const char* family, const char* path)
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
408 {
19481
5890c54b755c no c++ decls!
rfelker
parents: 19340
diff changeset
409 fc_instance_t* priv;
5890c54b755c no c++ decls!
rfelker
parents: 19340
diff changeset
410
21066
6196ba31e97e MSGTRs for libass
kraymer
parents: 21026
diff changeset
411 mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_FontconfigDisabledDefaultFontWillBeUsed);
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
412
19481
5890c54b755c no c++ decls!
rfelker
parents: 19340
diff changeset
413 priv = calloc(1, sizeof(fc_instance_t));
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
414
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
415 priv->path_default = strdup(path);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
416 priv->index_default = 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
417 return priv;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
418 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
419
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
420 #endif
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
421
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
422 void fontconfig_done(fc_instance_t* priv)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
423 {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
424 // don't call FcFini() here, library can still be used by some code
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
425 if (priv && priv->path_default) free(priv->path_default);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
426 if (priv && priv->family_default) free(priv->family_default);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
427 if (priv) free(priv);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
428 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
429
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
430