annotate libass/ass_font.c @ 28992:947ef23ba798

Test if create_vdp_decoder() might succeed by calling it from config() with a small value for max_reference_frames. This does not make automatic recovery by using software decoder possible, but lets MPlayer fail more graciously on - actually existing - buggy hardware that does not support certain H264 widths when using hardware accelerated decoding (784, 864, 944, 1024, 1808, 1888 pixels on NVIDIA G98) and if the user tries to hardware-decode more samples at the same time than supported. Might break playback of H264 Intra-Only samples on hardware with very little video memory.
author cehoyos
date Sat, 21 Mar 2009 20:11:05 +0000
parents 7fcc0bf5b27a
children 0f1b5b68af32
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
21277
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
1 // -*- c-basic-offset: 8; indent-tabs-mode: t -*-
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
2 // vim:ts=8:sw=8:noet:ai:
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
3 /*
26723
0f892cd714b2 Use standard license header.
diego
parents: 25660
diff changeset
4 * Copyright (C) 2006 Evgeniy Stepanov <eugeni.stepanov@gmail.com>
0f892cd714b2 Use standard license header.
diego
parents: 25660
diff changeset
5 *
26738
588ce97b44f2 Speak of libass instead of MPlayer in the libass license headers.
diego
parents: 26723
diff changeset
6 * This file is part of libass.
26723
0f892cd714b2 Use standard license header.
diego
parents: 25660
diff changeset
7 *
26738
588ce97b44f2 Speak of libass instead of MPlayer in the libass license headers.
diego
parents: 26723
diff changeset
8 * libass is free software; you can redistribute it and/or modify
26723
0f892cd714b2 Use standard license header.
diego
parents: 25660
diff changeset
9 * it under the terms of the GNU General Public License as published by
0f892cd714b2 Use standard license header.
diego
parents: 25660
diff changeset
10 * the Free Software Foundation; either version 2 of the License, or
0f892cd714b2 Use standard license header.
diego
parents: 25660
diff changeset
11 * (at your option) any later version.
0f892cd714b2 Use standard license header.
diego
parents: 25660
diff changeset
12 *
26738
588ce97b44f2 Speak of libass instead of MPlayer in the libass license headers.
diego
parents: 26723
diff changeset
13 * libass is distributed in the hope that it will be useful,
26723
0f892cd714b2 Use standard license header.
diego
parents: 25660
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
0f892cd714b2 Use standard license header.
diego
parents: 25660
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
0f892cd714b2 Use standard license header.
diego
parents: 25660
diff changeset
16 * GNU General Public License for more details.
0f892cd714b2 Use standard license header.
diego
parents: 25660
diff changeset
17 *
0f892cd714b2 Use standard license header.
diego
parents: 25660
diff changeset
18 * You should have received a copy of the GNU General Public License along
26738
588ce97b44f2 Speak of libass instead of MPlayer in the libass license headers.
diego
parents: 26723
diff changeset
19 * with libass; if not, write to the Free Software Foundation, Inc.,
26723
0f892cd714b2 Use standard license header.
diego
parents: 25660
diff changeset
20 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
0f892cd714b2 Use standard license header.
diego
parents: 25660
diff changeset
21 */
21277
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
22
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
23 #include "config.h"
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
24
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
25 #include <inttypes.h>
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
26 #include <ft2build.h>
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
27 #include FT_FREETYPE_H
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
28 #include FT_SYNTHESIS_H
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
29 #include FT_GLYPH_H
23328
99ac5d381aed Correct font size in libass.
eugeni
parents: 23300
diff changeset
30 #include FT_TRUETYPE_TABLES_H
21277
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
31
21458
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
32 #include "ass.h"
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 21351
diff changeset
33 #include "ass_library.h"
21277
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
34 #include "ass_font.h"
21321
7b7627ff1937 Move ass_font_desc_t and ass_font_t declarations to ass_font.h.
eugeni
parents: 21320
diff changeset
35 #include "ass_bitmap.h"
7b7627ff1937 Move ass_font_desc_t and ass_font_t declarations to ass_font.h.
eugeni
parents: 21320
diff changeset
36 #include "ass_cache.h"
21277
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
37 #include "ass_fontconfig.h"
23299
0ee56ec36a40 Limit ass_font_set_transform to nonrotating transformations.
eugeni
parents: 23212
diff changeset
38 #include "ass_utils.h"
21277
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
39 #include "mputils.h"
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
40
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
41 /**
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
42 * Select Microfost Unicode CharMap, if the font has one.
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
43 * Otherwise, let FreeType decide.
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
44 */
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
45 static void charmap_magic(FT_Face face)
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
46 {
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
47 int i;
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
48 for (i = 0; i < face->num_charmaps; ++i) {
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
49 FT_CharMap cmap = face->charmaps[i];
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
50 unsigned pid = cmap->platform_id;
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
51 unsigned eid = cmap->encoding_id;
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
52 if (pid == 3 /*microsoft*/ && (eid == 1 /*unicode bmp*/ || eid == 10 /*full unicode*/)) {
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
53 FT_Set_Charmap(face, cmap);
22210
4a958bd08920 Select the first charmap in the font, if FreeType did not autoselect any.
eugeni
parents: 21630
diff changeset
54 return;
21277
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
55 }
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
56 }
22210
4a958bd08920 Select the first charmap in the font, if FreeType did not autoselect any.
eugeni
parents: 21630
diff changeset
57
4a958bd08920 Select the first charmap in the font, if FreeType did not autoselect any.
eugeni
parents: 21630
diff changeset
58 if (!face->charmap) {
4a958bd08920 Select the first charmap in the font, if FreeType did not autoselect any.
eugeni
parents: 21630
diff changeset
59 if (face->num_charmaps == 0) {
4a958bd08920 Select the first charmap in the font, if FreeType did not autoselect any.
eugeni
parents: 21630
diff changeset
60 mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_NoCharmaps);
4a958bd08920 Select the first charmap in the font, if FreeType did not autoselect any.
eugeni
parents: 21630
diff changeset
61 return;
4a958bd08920 Select the first charmap in the font, if FreeType did not autoselect any.
eugeni
parents: 21630
diff changeset
62 }
4a958bd08920 Select the first charmap in the font, if FreeType did not autoselect any.
eugeni
parents: 21630
diff changeset
63 mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_NoCharmapAutodetected);
4a958bd08920 Select the first charmap in the font, if FreeType did not autoselect any.
eugeni
parents: 21630
diff changeset
64 FT_Set_Charmap(face, face->charmaps[0]);
4a958bd08920 Select the first charmap in the font, if FreeType did not autoselect any.
eugeni
parents: 21630
diff changeset
65 return;
4a958bd08920 Select the first charmap in the font, if FreeType did not autoselect any.
eugeni
parents: 21630
diff changeset
66 }
21277
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
67 }
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
68
23299
0ee56ec36a40 Limit ass_font_set_transform to nonrotating transformations.
eugeni
parents: 23212
diff changeset
69 static void update_transform(ass_font_t* font)
0ee56ec36a40 Limit ass_font_set_transform to nonrotating transformations.
eugeni
parents: 23212
diff changeset
70 {
0ee56ec36a40 Limit ass_font_set_transform to nonrotating transformations.
eugeni
parents: 23212
diff changeset
71 int i;
0ee56ec36a40 Limit ass_font_set_transform to nonrotating transformations.
eugeni
parents: 23212
diff changeset
72 FT_Matrix m;
23328
99ac5d381aed Correct font size in libass.
eugeni
parents: 23300
diff changeset
73 m.xx = double_to_d16(font->scale_x);
99ac5d381aed Correct font size in libass.
eugeni
parents: 23300
diff changeset
74 m.yy = double_to_d16(font->scale_y);
23299
0ee56ec36a40 Limit ass_font_set_transform to nonrotating transformations.
eugeni
parents: 23212
diff changeset
75 m.xy = m.yx = 0;
0ee56ec36a40 Limit ass_font_set_transform to nonrotating transformations.
eugeni
parents: 23212
diff changeset
76 for (i = 0; i < font->n_faces; ++i)
0ee56ec36a40 Limit ass_font_set_transform to nonrotating transformations.
eugeni
parents: 23212
diff changeset
77 FT_Set_Transform(font->faces[i], &m, &font->v);
0ee56ec36a40 Limit ass_font_set_transform to nonrotating transformations.
eugeni
parents: 23212
diff changeset
78 }
0ee56ec36a40 Limit ass_font_set_transform to nonrotating transformations.
eugeni
parents: 23212
diff changeset
79
21630
0d8005d2fe5c Update some comments.
eugeni
parents: 21620
diff changeset
80 /**
0d8005d2fe5c Update some comments.
eugeni
parents: 21620
diff changeset
81 * \brief find a memory font by name
0d8005d2fe5c Update some comments.
eugeni
parents: 21620
diff changeset
82 */
21460
62bd8e0d3a0f Open embedded fonts directly from memory.
eugeni
parents: 21458
diff changeset
83 static int find_font(ass_library_t* library, char* name)
62bd8e0d3a0f Open embedded fonts directly from memory.
eugeni
parents: 21458
diff changeset
84 {
62bd8e0d3a0f Open embedded fonts directly from memory.
eugeni
parents: 21458
diff changeset
85 int i;
62bd8e0d3a0f Open embedded fonts directly from memory.
eugeni
parents: 21458
diff changeset
86 for (i = 0; i < library->num_fontdata; ++i)
62bd8e0d3a0f Open embedded fonts directly from memory.
eugeni
parents: 21458
diff changeset
87 if (strcasecmp(name, library->fontdata[i].name) == 0)
62bd8e0d3a0f Open embedded fonts directly from memory.
eugeni
parents: 21458
diff changeset
88 return i;
62bd8e0d3a0f Open embedded fonts directly from memory.
eugeni
parents: 21458
diff changeset
89 return -1;
62bd8e0d3a0f Open embedded fonts directly from memory.
eugeni
parents: 21458
diff changeset
90 }
62bd8e0d3a0f Open embedded fonts directly from memory.
eugeni
parents: 21458
diff changeset
91
23981
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
92 static void face_set_size(FT_Face face, double size);
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
93
23982
17b5fa69243c Workaround for fonts with zero ascender/descender in horizontal header.
eugeni
parents: 23981
diff changeset
94 static void buggy_font_workaround(FT_Face face)
17b5fa69243c Workaround for fonts with zero ascender/descender in horizontal header.
eugeni
parents: 23981
diff changeset
95 {
17b5fa69243c Workaround for fonts with zero ascender/descender in horizontal header.
eugeni
parents: 23981
diff changeset
96 // Some fonts have zero Ascender/Descender fields in 'hhea' table.
17b5fa69243c Workaround for fonts with zero ascender/descender in horizontal header.
eugeni
parents: 23981
diff changeset
97 // In this case, get the information from 'os2' table or, as
17b5fa69243c Workaround for fonts with zero ascender/descender in horizontal header.
eugeni
parents: 23981
diff changeset
98 // a last resort, from face.bbox.
17b5fa69243c Workaround for fonts with zero ascender/descender in horizontal header.
eugeni
parents: 23981
diff changeset
99 if (face->ascender + face->descender == 0 || face->height == 0) {
17b5fa69243c Workaround for fonts with zero ascender/descender in horizontal header.
eugeni
parents: 23981
diff changeset
100 TT_OS2 *os2 = FT_Get_Sfnt_Table(face, ft_sfnt_os2);
17b5fa69243c Workaround for fonts with zero ascender/descender in horizontal header.
eugeni
parents: 23981
diff changeset
101 if (os2) {
17b5fa69243c Workaround for fonts with zero ascender/descender in horizontal header.
eugeni
parents: 23981
diff changeset
102 face->ascender = os2->sTypoAscender;
17b5fa69243c Workaround for fonts with zero ascender/descender in horizontal header.
eugeni
parents: 23981
diff changeset
103 face->descender = os2->sTypoDescender;
17b5fa69243c Workaround for fonts with zero ascender/descender in horizontal header.
eugeni
parents: 23981
diff changeset
104 face->height = face->ascender - face->descender;
17b5fa69243c Workaround for fonts with zero ascender/descender in horizontal header.
eugeni
parents: 23981
diff changeset
105 } else {
17b5fa69243c Workaround for fonts with zero ascender/descender in horizontal header.
eugeni
parents: 23981
diff changeset
106 face->ascender = face->bbox.yMax;
17b5fa69243c Workaround for fonts with zero ascender/descender in horizontal header.
eugeni
parents: 23981
diff changeset
107 face->descender = face->bbox.yMin;
17b5fa69243c Workaround for fonts with zero ascender/descender in horizontal header.
eugeni
parents: 23981
diff changeset
108 face->height = face->ascender - face->descender;
17b5fa69243c Workaround for fonts with zero ascender/descender in horizontal header.
eugeni
parents: 23981
diff changeset
109 }
17b5fa69243c Workaround for fonts with zero ascender/descender in horizontal header.
eugeni
parents: 23981
diff changeset
110 }
17b5fa69243c Workaround for fonts with zero ascender/descender in horizontal header.
eugeni
parents: 23981
diff changeset
111 }
17b5fa69243c Workaround for fonts with zero ascender/descender in horizontal header.
eugeni
parents: 23981
diff changeset
112
23981
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
113 /**
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
114 * \brief Select a face with the given charcode and add it to ass_font_t
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
115 * \return index of the new face in font->faces, -1 if failed
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
116 */
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
117 static int add_face(void* fc_priv, ass_font_t* font, uint32_t ch)
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
118 {
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
119 char* path;
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
120 int index;
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
121 FT_Face face;
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
122 int error;
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
123 int mem_idx;
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
124
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
125 if (font->n_faces == ASS_FONT_MAX_FACES)
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
126 return -1;
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
127
28860
7fcc0bf5b27a Treat -font/-subfont as Fontconfig pattern in libass.
eugeni
parents: 27393
diff changeset
128 path = fontconfig_select(fc_priv, font->desc.family, font->desc.treat_family_as_pattern, font->desc.bold,
23981
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
129 font->desc.italic, &index, ch);
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
130
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
131 mem_idx = find_font(font->library, path);
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
132 if (mem_idx >= 0) {
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
133 error = FT_New_Memory_Face(font->ftlibrary, (unsigned char*)font->library->fontdata[mem_idx].data,
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
134 font->library->fontdata[mem_idx].size, 0, &face);
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
135 if (error) {
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
136 mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_ErrorOpeningMemoryFont, path);
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
137 return -1;
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
138 }
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
139 } else {
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
140 error = FT_New_Face(font->ftlibrary, path, index, &face);
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
141 if (error) {
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
142 mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_ErrorOpeningFont, path, index);
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
143 return -1;
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
144 }
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
145 }
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
146 charmap_magic(face);
23982
17b5fa69243c Workaround for fonts with zero ascender/descender in horizontal header.
eugeni
parents: 23981
diff changeset
147 buggy_font_workaround(face);
23981
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
148
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
149 font->faces[font->n_faces++] = face;
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
150 update_transform(font);
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
151 face_set_size(face, font->size);
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
152 return font->n_faces - 1;
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
153 }
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
154
21630
0d8005d2fe5c Update some comments.
eugeni
parents: 21620
diff changeset
155 /**
0d8005d2fe5c Update some comments.
eugeni
parents: 21620
diff changeset
156 * \brief Create a new ass_font_t according to "desc" argument
0d8005d2fe5c Update some comments.
eugeni
parents: 21620
diff changeset
157 */
21460
62bd8e0d3a0f Open embedded fonts directly from memory.
eugeni
parents: 21458
diff changeset
158 ass_font_t* ass_font_new(ass_library_t* library, FT_Library ftlibrary, void* fc_priv, ass_font_desc_t* desc)
21277
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
159 {
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
160 int error;
23212
c932f521344d In ass_font_new, allocate temporary ass_font_t on stack and return the pointer
eugeni
parents: 23134
diff changeset
161 ass_font_t* fontp;
c932f521344d In ass_font_new, allocate temporary ass_font_t on stack and return the pointer
eugeni
parents: 23134
diff changeset
162 ass_font_t font;
21317
dcfd069efd8f Move ass_font_t allocation to ass_font.h.
eugeni
parents: 21314
diff changeset
163
23212
c932f521344d In ass_font_new, allocate temporary ass_font_t on stack and return the pointer
eugeni
parents: 23134
diff changeset
164 fontp = ass_font_cache_find(desc);
c932f521344d In ass_font_new, allocate temporary ass_font_t on stack and return the pointer
eugeni
parents: 23134
diff changeset
165 if (fontp)
c932f521344d In ass_font_new, allocate temporary ass_font_t on stack and return the pointer
eugeni
parents: 23134
diff changeset
166 return fontp;
21277
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
167
23981
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
168 font.library = library;
23212
c932f521344d In ass_font_new, allocate temporary ass_font_t on stack and return the pointer
eugeni
parents: 23134
diff changeset
169 font.ftlibrary = ftlibrary;
23981
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
170 font.n_faces = 0;
23212
c932f521344d In ass_font_new, allocate temporary ass_font_t on stack and return the pointer
eugeni
parents: 23134
diff changeset
171 font.desc.family = strdup(desc->family);
28860
7fcc0bf5b27a Treat -font/-subfont as Fontconfig pattern in libass.
eugeni
parents: 27393
diff changeset
172 font.desc.treat_family_as_pattern = desc->treat_family_as_pattern;
23212
c932f521344d In ass_font_new, allocate temporary ass_font_t on stack and return the pointer
eugeni
parents: 23134
diff changeset
173 font.desc.bold = desc->bold;
c932f521344d In ass_font_new, allocate temporary ass_font_t on stack and return the pointer
eugeni
parents: 23134
diff changeset
174 font.desc.italic = desc->italic;
21277
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
175
23299
0ee56ec36a40 Limit ass_font_set_transform to nonrotating transformations.
eugeni
parents: 23212
diff changeset
176 font.scale_x = font.scale_y = 1.;
23212
c932f521344d In ass_font_new, allocate temporary ass_font_t on stack and return the pointer
eugeni
parents: 23134
diff changeset
177 font.v.x = font.v.y = 0;
23300
04dbd42b3962 Support fractional font sizes.
eugeni
parents: 23299
diff changeset
178 font.size = 0.;
21277
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
179
23981
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
180 error = add_face(fc_priv, &font, 0);
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
181 if (error == -1) {
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
182 free(font.desc.family);
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
183 return 0;
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
184 } else
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
185 return ass_font_cache_add(&font);
21277
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
186 }
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
187
21630
0d8005d2fe5c Update some comments.
eugeni
parents: 21620
diff changeset
188 /**
0d8005d2fe5c Update some comments.
eugeni
parents: 21620
diff changeset
189 * \brief Set font transformation matrix and shift vector
0d8005d2fe5c Update some comments.
eugeni
parents: 21620
diff changeset
190 **/
23299
0ee56ec36a40 Limit ass_font_set_transform to nonrotating transformations.
eugeni
parents: 23212
diff changeset
191 void ass_font_set_transform(ass_font_t* font, double scale_x, double scale_y, FT_Vector* v)
21277
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
192 {
23299
0ee56ec36a40 Limit ass_font_set_transform to nonrotating transformations.
eugeni
parents: 23212
diff changeset
193 font->scale_x = scale_x;
0ee56ec36a40 Limit ass_font_set_transform to nonrotating transformations.
eugeni
parents: 23212
diff changeset
194 font->scale_y = scale_y;
21616
2704273f398d FT_Set_Transform is fast enough to be called once for each glyph.
eugeni
parents: 21615
diff changeset
195 font->v.x = v->x;
2704273f398d FT_Set_Transform is fast enough to be called once for each glyph.
eugeni
parents: 21615
diff changeset
196 font->v.y = v->y;
23299
0ee56ec36a40 Limit ass_font_set_transform to nonrotating transformations.
eugeni
parents: 23212
diff changeset
197 update_transform(font);
21277
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
198 }
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
199
23328
99ac5d381aed Correct font size in libass.
eugeni
parents: 23300
diff changeset
200 static void face_set_size(FT_Face face, double size)
99ac5d381aed Correct font size in libass.
eugeni
parents: 23300
diff changeset
201 {
23340
15b2b1e8a568 Fix #if condition.
eugeni
parents: 23339
diff changeset
202 #if (FREETYPE_MAJOR > 2) || ((FREETYPE_MAJOR == 2) && (FREETYPE_MINOR > 1))
23328
99ac5d381aed Correct font size in libass.
eugeni
parents: 23300
diff changeset
203 TT_HoriHeader *hori = FT_Get_Sfnt_Table(face, ft_sfnt_hhea);
99ac5d381aed Correct font size in libass.
eugeni
parents: 23300
diff changeset
204 TT_OS2 *os2 = FT_Get_Sfnt_Table(face, ft_sfnt_os2);
99ac5d381aed Correct font size in libass.
eugeni
parents: 23300
diff changeset
205 double mscale = 1.;
99ac5d381aed Correct font size in libass.
eugeni
parents: 23300
diff changeset
206 FT_Size_RequestRec rq;
99ac5d381aed Correct font size in libass.
eugeni
parents: 23300
diff changeset
207 FT_Size_Metrics *m = &face->size->metrics;
99ac5d381aed Correct font size in libass.
eugeni
parents: 23300
diff changeset
208 // VSFilter uses metrics from TrueType OS/2 table
99ac5d381aed Correct font size in libass.
eugeni
parents: 23300
diff changeset
209 // The idea was borrowed from asa (http://asa.diac24.net)
23983
90038c72d69e Don't apply windows-like font scaling if hhea or os2 tables contain invalid
eugeni
parents: 23982
diff changeset
210 if (hori && os2) {
90038c72d69e Don't apply windows-like font scaling if hhea or os2 tables contain invalid
eugeni
parents: 23982
diff changeset
211 int hori_height = hori->Ascender - hori->Descender;
90038c72d69e Don't apply windows-like font scaling if hhea or os2 tables contain invalid
eugeni
parents: 23982
diff changeset
212 int os2_height = os2->usWinAscent + os2->usWinDescent;
90038c72d69e Don't apply windows-like font scaling if hhea or os2 tables contain invalid
eugeni
parents: 23982
diff changeset
213 if (hori_height && os2_height)
90038c72d69e Don't apply windows-like font scaling if hhea or os2 tables contain invalid
eugeni
parents: 23982
diff changeset
214 mscale = (double)hori_height / os2_height;
90038c72d69e Don't apply windows-like font scaling if hhea or os2 tables contain invalid
eugeni
parents: 23982
diff changeset
215 }
23328
99ac5d381aed Correct font size in libass.
eugeni
parents: 23300
diff changeset
216 memset(&rq, 0, sizeof(rq));
99ac5d381aed Correct font size in libass.
eugeni
parents: 23300
diff changeset
217 rq.type = FT_SIZE_REQUEST_TYPE_REAL_DIM;
99ac5d381aed Correct font size in libass.
eugeni
parents: 23300
diff changeset
218 rq.width = 0;
99ac5d381aed Correct font size in libass.
eugeni
parents: 23300
diff changeset
219 rq.height = double_to_d6(size * mscale);
99ac5d381aed Correct font size in libass.
eugeni
parents: 23300
diff changeset
220 rq.horiResolution = rq.vertResolution = 0;
99ac5d381aed Correct font size in libass.
eugeni
parents: 23300
diff changeset
221 FT_Request_Size(face, &rq);
99ac5d381aed Correct font size in libass.
eugeni
parents: 23300
diff changeset
222 m->ascender /= mscale;
99ac5d381aed Correct font size in libass.
eugeni
parents: 23300
diff changeset
223 m->descender /= mscale;
99ac5d381aed Correct font size in libass.
eugeni
parents: 23300
diff changeset
224 m->height /= mscale;
23339
95bc9f4905f8 FT_Request_Size does not exist in FreeType 2.1.*. Fallback to FT_Set_Char_Size.
eugeni
parents: 23328
diff changeset
225 #else
95bc9f4905f8 FT_Request_Size does not exist in FreeType 2.1.*. Fallback to FT_Set_Char_Size.
eugeni
parents: 23328
diff changeset
226 FT_Set_Char_Size(face, 0, double_to_d6(size), 0, 0);
95bc9f4905f8 FT_Request_Size does not exist in FreeType 2.1.*. Fallback to FT_Set_Char_Size.
eugeni
parents: 23328
diff changeset
227 #endif
23328
99ac5d381aed Correct font size in libass.
eugeni
parents: 23300
diff changeset
228 }
99ac5d381aed Correct font size in libass.
eugeni
parents: 23300
diff changeset
229
21630
0d8005d2fe5c Update some comments.
eugeni
parents: 21620
diff changeset
230 /**
0d8005d2fe5c Update some comments.
eugeni
parents: 21620
diff changeset
231 * \brief Set font size
0d8005d2fe5c Update some comments.
eugeni
parents: 21620
diff changeset
232 **/
23300
04dbd42b3962 Support fractional font sizes.
eugeni
parents: 23299
diff changeset
233 void ass_font_set_size(ass_font_t* font, double size)
21277
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
234 {
21619
b4b51eb2904f Keep reselected fonts in an array, adding new ones to the end. Glyph
eugeni
parents: 21618
diff changeset
235 int i;
21319
415e2119e91c Don't call FT_Set_Transform/FT_Set_Pixel_Sizes if values have not changed.
eugeni
parents: 21317
diff changeset
236 if (font->size != size) {
21320
4a7e96f1eebf Cosmetics: reindent.
eugeni
parents: 21319
diff changeset
237 font->size = size;
21619
b4b51eb2904f Keep reselected fonts in an array, adding new ones to the end. Glyph
eugeni
parents: 21618
diff changeset
238 for (i = 0; i < font->n_faces; ++i)
23328
99ac5d381aed Correct font size in libass.
eugeni
parents: 23300
diff changeset
239 face_set_size(font->faces[i], size);
21319
415e2119e91c Don't call FT_Set_Transform/FT_Set_Pixel_Sizes if values have not changed.
eugeni
parents: 21317
diff changeset
240 }
21277
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
241 }
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
242
21630
0d8005d2fe5c Update some comments.
eugeni
parents: 21620
diff changeset
243 /**
0d8005d2fe5c Update some comments.
eugeni
parents: 21620
diff changeset
244 * \brief Get maximal font ascender and descender.
0d8005d2fe5c Update some comments.
eugeni
parents: 21620
diff changeset
245 * \param ch character code
0d8005d2fe5c Update some comments.
eugeni
parents: 21620
diff changeset
246 * The values are extracted from the font face that provides glyphs for the given character
0d8005d2fe5c Update some comments.
eugeni
parents: 21620
diff changeset
247 **/
21614
5d2ca7ca18b5 Move ascender, descender, and kerning computation to ass_font.c.
eugeni
parents: 21460
diff changeset
248 void ass_font_get_asc_desc(ass_font_t* font, uint32_t ch, int* asc, int* desc)
5d2ca7ca18b5 Move ascender, descender, and kerning computation to ass_font.c.
eugeni
parents: 21460
diff changeset
249 {
21619
b4b51eb2904f Keep reselected fonts in an array, adding new ones to the end. Glyph
eugeni
parents: 21618
diff changeset
250 int i;
b4b51eb2904f Keep reselected fonts in an array, adding new ones to the end. Glyph
eugeni
parents: 21618
diff changeset
251 for (i = 0; i < font->n_faces; ++i) {
21620
ef93ebaef504 Cosmetics: fix indentation.
eugeni
parents: 21619
diff changeset
252 FT_Face face = font->faces[i];
ef93ebaef504 Cosmetics: fix indentation.
eugeni
parents: 21619
diff changeset
253 if (FT_Get_Char_Index(face, ch)) {
25660
3993c96eaa95 Do not try to guess font metrics based on its bounding box.
eugeni
parents: 24828
diff changeset
254 *asc = face->size->metrics.ascender;
3993c96eaa95 Do not try to guess font metrics based on its bounding box.
eugeni
parents: 24828
diff changeset
255 *desc = - face->size->metrics.descender;
21620
ef93ebaef504 Cosmetics: fix indentation.
eugeni
parents: 21619
diff changeset
256 return;
21619
b4b51eb2904f Keep reselected fonts in an array, adding new ones to the end. Glyph
eugeni
parents: 21618
diff changeset
257 }
21614
5d2ca7ca18b5 Move ascender, descender, and kerning computation to ass_font.c.
eugeni
parents: 21460
diff changeset
258 }
5d2ca7ca18b5 Move ascender, descender, and kerning computation to ass_font.c.
eugeni
parents: 21460
diff changeset
259
5d2ca7ca18b5 Move ascender, descender, and kerning computation to ass_font.c.
eugeni
parents: 21460
diff changeset
260 *asc = *desc = 0;
5d2ca7ca18b5 Move ascender, descender, and kerning computation to ass_font.c.
eugeni
parents: 21460
diff changeset
261 }
5d2ca7ca18b5 Move ascender, descender, and kerning computation to ass_font.c.
eugeni
parents: 21460
diff changeset
262
21630
0d8005d2fe5c Update some comments.
eugeni
parents: 21620
diff changeset
263 /**
0d8005d2fe5c Update some comments.
eugeni
parents: 21620
diff changeset
264 * \brief Get a glyph
0d8005d2fe5c Update some comments.
eugeni
parents: 21620
diff changeset
265 * \param ch character code
0d8005d2fe5c Update some comments.
eugeni
parents: 21620
diff changeset
266 **/
23134
1de2a46a0987 Add -ass-hinting option for setting font hinting method.
eugeni
parents: 22210
diff changeset
267 FT_Glyph ass_font_get_glyph(void* fontconfig_priv, ass_font_t* font, uint32_t ch, ass_hinting_t hinting)
21277
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
268 {
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
269 int error;
21619
b4b51eb2904f Keep reselected fonts in an array, adding new ones to the end. Glyph
eugeni
parents: 21618
diff changeset
270 int index = 0;
b4b51eb2904f Keep reselected fonts in an array, adding new ones to the end. Glyph
eugeni
parents: 21618
diff changeset
271 int i;
21277
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
272 FT_Glyph glyph;
21619
b4b51eb2904f Keep reselected fonts in an array, adding new ones to the end. Glyph
eugeni
parents: 21618
diff changeset
273 FT_Face face = 0;
23134
1de2a46a0987 Add -ass-hinting option for setting font hinting method.
eugeni
parents: 22210
diff changeset
274 int flags = 0;
21350
5337cdeec169 Skip glyphs with char code < 0x20.
eugeni
parents: 21349
diff changeset
275
5337cdeec169 Skip glyphs with char code < 0x20.
eugeni
parents: 21349
diff changeset
276 if (ch < 0x20)
5337cdeec169 Skip glyphs with char code < 0x20.
eugeni
parents: 21349
diff changeset
277 return 0;
21619
b4b51eb2904f Keep reselected fonts in an array, adding new ones to the end. Glyph
eugeni
parents: 21618
diff changeset
278 if (font->n_faces == 0)
b4b51eb2904f Keep reselected fonts in an array, adding new ones to the end. Glyph
eugeni
parents: 21618
diff changeset
279 return 0;
b4b51eb2904f Keep reselected fonts in an array, adding new ones to the end. Glyph
eugeni
parents: 21618
diff changeset
280
b4b51eb2904f Keep reselected fonts in an array, adding new ones to the end. Glyph
eugeni
parents: 21618
diff changeset
281 for (i = 0; i < font->n_faces; ++i) {
b4b51eb2904f Keep reselected fonts in an array, adding new ones to the end. Glyph
eugeni
parents: 21618
diff changeset
282 face = font->faces[i];
b4b51eb2904f Keep reselected fonts in an array, adding new ones to the end. Glyph
eugeni
parents: 21618
diff changeset
283 index = FT_Get_Char_Index(face, ch);
b4b51eb2904f Keep reselected fonts in an array, adding new ones to the end. Glyph
eugeni
parents: 21618
diff changeset
284 if (index)
b4b51eb2904f Keep reselected fonts in an array, adding new ones to the end. Glyph
eugeni
parents: 21618
diff changeset
285 break;
b4b51eb2904f Keep reselected fonts in an array, adding new ones to the end. Glyph
eugeni
parents: 21618
diff changeset
286 }
b4b51eb2904f Keep reselected fonts in an array, adding new ones to the end. Glyph
eugeni
parents: 21618
diff changeset
287
27393
4876c89bafdd Rename font-related preprocessor directives.
diego
parents: 26738
diff changeset
288 #ifdef CONFIG_FONTCONFIG
21351
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21350
diff changeset
289 if (index == 0) {
23981
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
290 int face_idx;
21351
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21350
diff changeset
291 mp_msg(MSGT_ASS, MSGL_INFO, MSGTR_LIBASS_GlyphNotFoundReselectingFont,
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21350
diff changeset
292 ch, font->desc.family, font->desc.bold, font->desc.italic);
23981
705628816d98 Factor out common code from ass_font_new and ass_font_reselect.
eugeni
parents: 23980
diff changeset
293 face_idx = add_face(fontconfig_priv, font, ch);
24827
4ec67a66ef54 Check return value of add_face.
eugeni
parents: 23983
diff changeset
294 if (face_idx >= 0) {
24828
810982c2bfb4 Cosmetics: fix indentation after last commit.
eugeni
parents: 24827
diff changeset
295 face = font->faces[face_idx];
810982c2bfb4 Cosmetics: fix indentation after last commit.
eugeni
parents: 24827
diff changeset
296 index = FT_Get_Char_Index(face, ch);
810982c2bfb4 Cosmetics: fix indentation after last commit.
eugeni
parents: 24827
diff changeset
297 if (index == 0) {
810982c2bfb4 Cosmetics: fix indentation after last commit.
eugeni
parents: 24827
diff changeset
298 mp_msg(MSGT_ASS, MSGL_ERR, MSGTR_LIBASS_GlyphNotFound,
810982c2bfb4 Cosmetics: fix indentation after last commit.
eugeni
parents: 24827
diff changeset
299 ch, font->desc.family, font->desc.bold, font->desc.italic);
810982c2bfb4 Cosmetics: fix indentation after last commit.
eugeni
parents: 24827
diff changeset
300 }
24827
4ec67a66ef54 Check return value of add_face.
eugeni
parents: 23983
diff changeset
301 }
21351
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21350
diff changeset
302 }
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21350
diff changeset
303 #endif
c611dfc4cb85 If a glyph is not found in the current font, switch to another one.
eugeni
parents: 21350
diff changeset
304
23134
1de2a46a0987 Add -ass-hinting option for setting font hinting method.
eugeni
parents: 22210
diff changeset
305 switch (hinting) {
1de2a46a0987 Add -ass-hinting option for setting font hinting method.
eugeni
parents: 22210
diff changeset
306 case ASS_HINTING_NONE: flags = FT_LOAD_NO_HINTING; break;
1de2a46a0987 Add -ass-hinting option for setting font hinting method.
eugeni
parents: 22210
diff changeset
307 case ASS_HINTING_LIGHT: flags = FT_LOAD_FORCE_AUTOHINT | FT_LOAD_TARGET_LIGHT; break;
1de2a46a0987 Add -ass-hinting option for setting font hinting method.
eugeni
parents: 22210
diff changeset
308 case ASS_HINTING_NORMAL: flags = FT_LOAD_FORCE_AUTOHINT; break;
1de2a46a0987 Add -ass-hinting option for setting font hinting method.
eugeni
parents: 22210
diff changeset
309 case ASS_HINTING_NATIVE: flags = 0; break;
1de2a46a0987 Add -ass-hinting option for setting font hinting method.
eugeni
parents: 22210
diff changeset
310 }
1de2a46a0987 Add -ass-hinting option for setting font hinting method.
eugeni
parents: 22210
diff changeset
311
1de2a46a0987 Add -ass-hinting option for setting font hinting method.
eugeni
parents: 22210
diff changeset
312 error = FT_Load_Glyph(face, index, FT_LOAD_NO_BITMAP | flags);
21277
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
313 if (error) {
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
314 mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_ErrorLoadingGlyph);
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
315 return 0;
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
316 }
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
317
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
318 #if (FREETYPE_MAJOR > 2) || \
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
319 ((FREETYPE_MAJOR == 2) && (FREETYPE_MINOR >= 2)) || \
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
320 ((FREETYPE_MAJOR == 2) && (FREETYPE_MINOR == 1) && (FREETYPE_PATCH >= 10))
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
321 // FreeType >= 2.1.10 required
21619
b4b51eb2904f Keep reselected fonts in an array, adding new ones to the end. Glyph
eugeni
parents: 21618
diff changeset
322 if (!(face->style_flags & FT_STYLE_FLAG_ITALIC) &&
21277
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
323 (font->desc.italic > 55)) {
21619
b4b51eb2904f Keep reselected fonts in an array, adding new ones to the end. Glyph
eugeni
parents: 21618
diff changeset
324 FT_GlyphSlot_Oblique(face->glyph);
21277
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
325 }
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
326 #endif
21619
b4b51eb2904f Keep reselected fonts in an array, adding new ones to the end. Glyph
eugeni
parents: 21618
diff changeset
327 error = FT_Get_Glyph(face->glyph, &glyph);
21277
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
328 if (error) {
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
329 mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_ErrorLoadingGlyph);
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
330 return 0;
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
331 }
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
332
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
333 return glyph;
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
334 }
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
335
21630
0d8005d2fe5c Update some comments.
eugeni
parents: 21620
diff changeset
336 /**
0d8005d2fe5c Update some comments.
eugeni
parents: 21620
diff changeset
337 * \brief Get kerning for the pair of glyphs.
0d8005d2fe5c Update some comments.
eugeni
parents: 21620
diff changeset
338 **/
21614
5d2ca7ca18b5 Move ascender, descender, and kerning computation to ass_font.c.
eugeni
parents: 21460
diff changeset
339 FT_Vector ass_font_get_kerning(ass_font_t* font, uint32_t c1, uint32_t c2)
5d2ca7ca18b5 Move ascender, descender, and kerning computation to ass_font.c.
eugeni
parents: 21460
diff changeset
340 {
5d2ca7ca18b5 Move ascender, descender, and kerning computation to ass_font.c.
eugeni
parents: 21460
diff changeset
341 FT_Vector v = {0, 0};
21619
b4b51eb2904f Keep reselected fonts in an array, adding new ones to the end. Glyph
eugeni
parents: 21618
diff changeset
342 int i;
b4b51eb2904f Keep reselected fonts in an array, adding new ones to the end. Glyph
eugeni
parents: 21618
diff changeset
343
b4b51eb2904f Keep reselected fonts in an array, adding new ones to the end. Glyph
eugeni
parents: 21618
diff changeset
344 for (i = 0; i < font->n_faces; ++i) {
b4b51eb2904f Keep reselected fonts in an array, adding new ones to the end. Glyph
eugeni
parents: 21618
diff changeset
345 FT_Face face = font->faces[i];
b4b51eb2904f Keep reselected fonts in an array, adding new ones to the end. Glyph
eugeni
parents: 21618
diff changeset
346 int i1 = FT_Get_Char_Index(face, c1);
b4b51eb2904f Keep reselected fonts in an array, adding new ones to the end. Glyph
eugeni
parents: 21618
diff changeset
347 int i2 = FT_Get_Char_Index(face, c2);
b4b51eb2904f Keep reselected fonts in an array, adding new ones to the end. Glyph
eugeni
parents: 21618
diff changeset
348 if (i1 && i2) {
b4b51eb2904f Keep reselected fonts in an array, adding new ones to the end. Glyph
eugeni
parents: 21618
diff changeset
349 if (FT_HAS_KERNING(face))
b4b51eb2904f Keep reselected fonts in an array, adding new ones to the end. Glyph
eugeni
parents: 21618
diff changeset
350 FT_Get_Kerning(face, i1, i2, FT_KERNING_DEFAULT, &v);
b4b51eb2904f Keep reselected fonts in an array, adding new ones to the end. Glyph
eugeni
parents: 21618
diff changeset
351 return v;
b4b51eb2904f Keep reselected fonts in an array, adding new ones to the end. Glyph
eugeni
parents: 21618
diff changeset
352 }
b4b51eb2904f Keep reselected fonts in an array, adding new ones to the end. Glyph
eugeni
parents: 21618
diff changeset
353 if (i1 || i2) // these glyphs are from different font faces, no kerning information
b4b51eb2904f Keep reselected fonts in an array, adding new ones to the end. Glyph
eugeni
parents: 21618
diff changeset
354 return v;
b4b51eb2904f Keep reselected fonts in an array, adding new ones to the end. Glyph
eugeni
parents: 21618
diff changeset
355 }
21614
5d2ca7ca18b5 Move ascender, descender, and kerning computation to ass_font.c.
eugeni
parents: 21460
diff changeset
356 return v;
5d2ca7ca18b5 Move ascender, descender, and kerning computation to ass_font.c.
eugeni
parents: 21460
diff changeset
357 }
5d2ca7ca18b5 Move ascender, descender, and kerning computation to ass_font.c.
eugeni
parents: 21460
diff changeset
358
21630
0d8005d2fe5c Update some comments.
eugeni
parents: 21620
diff changeset
359 /**
0d8005d2fe5c Update some comments.
eugeni
parents: 21620
diff changeset
360 * \brief Deallocate ass_font_t
0d8005d2fe5c Update some comments.
eugeni
parents: 21620
diff changeset
361 **/
21277
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
362 void ass_font_free(ass_font_t* font)
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
363 {
21619
b4b51eb2904f Keep reselected fonts in an array, adding new ones to the end. Glyph
eugeni
parents: 21618
diff changeset
364 int i;
b4b51eb2904f Keep reselected fonts in an array, adding new ones to the end. Glyph
eugeni
parents: 21618
diff changeset
365 for (i = 0; i < font->n_faces; ++i)
b4b51eb2904f Keep reselected fonts in an array, adding new ones to the end. Glyph
eugeni
parents: 21618
diff changeset
366 if (font->faces[i]) FT_Done_Face(font->faces[i]);
21277
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
367 if (font->desc.family) free(font->desc.family);
21317
dcfd069efd8f Move ass_font_t allocation to ass_font.h.
eugeni
parents: 21314
diff changeset
368 free(font);
21277
0603972f083c Move fonts-related code to a separate file.
eugeni
parents:
diff changeset
369 }