annotate libass/ass_render.c @ 31441:6f152da62242

Reorder #includes and drop an unnecessary set of #ifdefs.
author diego
date Mon, 21 Jun 2010 10:20:17 +0000
parents 48d020c5ceca
children e64df5862cea
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: 19965
diff changeset
1 /*
26723
0f892cd714b2 Use standard license header.
diego
parents: 26582
diff changeset
2 * Copyright (C) 2006 Evgeniy Stepanov <eugeni.stepanov@gmail.com>
0f892cd714b2 Use standard license header.
diego
parents: 26582
diff changeset
3 *
26738
588ce97b44f2 Speak of libass instead of MPlayer in the libass license headers.
diego
parents: 26723
diff changeset
4 * This file is part of libass.
26723
0f892cd714b2 Use standard license header.
diego
parents: 26582
diff changeset
5 *
26738
588ce97b44f2 Speak of libass instead of MPlayer in the libass license headers.
diego
parents: 26723
diff changeset
6 * libass is free software; you can redistribute it and/or modify
26723
0f892cd714b2 Use standard license header.
diego
parents: 26582
diff changeset
7 * it under the terms of the GNU General Public License as published by
0f892cd714b2 Use standard license header.
diego
parents: 26582
diff changeset
8 * the Free Software Foundation; either version 2 of the License, or
0f892cd714b2 Use standard license header.
diego
parents: 26582
diff changeset
9 * (at your option) any later version.
0f892cd714b2 Use standard license header.
diego
parents: 26582
diff changeset
10 *
26738
588ce97b44f2 Speak of libass instead of MPlayer in the libass license headers.
diego
parents: 26723
diff changeset
11 * libass is distributed in the hope that it will be useful,
26723
0f892cd714b2 Use standard license header.
diego
parents: 26582
diff changeset
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
0f892cd714b2 Use standard license header.
diego
parents: 26582
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
0f892cd714b2 Use standard license header.
diego
parents: 26582
diff changeset
14 * GNU General Public License for more details.
0f892cd714b2 Use standard license header.
diego
parents: 26582
diff changeset
15 *
0f892cd714b2 Use standard license header.
diego
parents: 26582
diff changeset
16 * 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
17 * with libass; if not, write to the Free Software Foundation, Inc.,
26723
0f892cd714b2 Use standard license header.
diego
parents: 26582
diff changeset
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
0f892cd714b2 Use standard license header.
diego
parents: 26582
diff changeset
19 */
20008
fa122b7c71c6 Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents: 19965
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 <assert.h>
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
24 #include <math.h>
19378
d9d58ba1b833 Replace %lld with PRId64, part 2.
eugeni
parents: 19370
diff changeset
25 #include <inttypes.h>
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
26 #include <ft2build.h>
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
27 #include FT_FREETYPE_H
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
28 #include FT_STROKER_H
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
29 #include FT_GLYPH_H
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
30 #include FT_SYNTHESIS_H
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
31
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
32 #include "ass.h"
21322
bb55f4f7b3cb Fix compilation broken in previous commit.
eugeni
parents: 21317
diff changeset
33 #include "ass_font.h"
19846
bcc792bfa431 Store bitmap glyphs in a separate struct, instead of FreeType's internal buffer.
eugeni
parents: 19825
diff changeset
34 #include "ass_bitmap.h"
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
35 #include "ass_cache.h"
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
36 #include "ass_utils.h"
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
37 #include "ass_fontconfig.h"
20477
de4a66d99f41 Libass interface reworked:
eugeni
parents: 20451
diff changeset
38 #include "ass_library.h"
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
39 #include "ass_drawing.h"
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
40 #include "ass_render.h"
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
41 #include "ass_parse.h"
22258
9c1160622400 Reallocate event_images_t, removing limit on simultanious events count.
eugeni
parents: 22221
diff changeset
42
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
43 #define MAX_GLYPHS_INITIAL 1024
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
44 #define MAX_LINES_INITIAL 64
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
45 #define SUBPIXEL_MASK 63
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
46 #define SUBPIXEL_ACCURACY 7 // d6 mask for subpixel accuracy adjustment
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
47 #define GLYPH_CACHE_MAX 1000
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
48 #define BITMAP_CACHE_MAX_SIZE 50 * 1048576
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
49
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
50 static void ass_lazy_track_init(ASS_Renderer *render_priv)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
51 {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
52 ASS_Track *track = render_priv->track;
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
53
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
54 if (track->PlayResX && track->PlayResY)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
55 return;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
56 if (!track->PlayResX && !track->PlayResY) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
57 ass_msg(render_priv->library, MSGL_WARN,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
58 "Neither PlayResX nor PlayResY defined. Assuming 384x288");
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
59 track->PlayResX = 384;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
60 track->PlayResY = 288;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
61 } else {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
62 if (!track->PlayResY && track->PlayResX == 1280) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
63 track->PlayResY = 1024;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
64 ass_msg(render_priv->library, MSGL_WARN,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
65 "PlayResY undefined, setting to %d", track->PlayResY);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
66 } else if (!track->PlayResY) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
67 track->PlayResY = track->PlayResX * 3 / 4;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
68 ass_msg(render_priv->library, MSGL_WARN,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
69 "PlayResY undefined, setting to %d", track->PlayResY);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
70 } else if (!track->PlayResX && track->PlayResY == 1024) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
71 track->PlayResX = 1280;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
72 ass_msg(render_priv->library, MSGL_WARN,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
73 "PlayResX undefined, setting to %d", track->PlayResX);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
74 } else if (!track->PlayResX) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
75 track->PlayResX = track->PlayResY * 4 / 3;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
76 ass_msg(render_priv->library, MSGL_WARN,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
77 "PlayResX undefined, setting to %d", track->PlayResX);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
78 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
79 }
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
80 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
81
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
82 ASS_Renderer *ass_renderer_init(ASS_Library *library)
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
83 {
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
84 int error;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
85 FT_Library ft;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
86 ASS_Renderer *priv = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
87 int vmajor, vminor, vpatch;
20202
9b67ed06f721 Zerofill libass static variables during initialization.
eugeni
parents: 20201
diff changeset
88
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
89 error = FT_Init_FreeType(&ft);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
90 if (error) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
91 ass_msg(library, MSGL_FATAL, "%s failed", "FT_Init_FreeType");
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
92 goto ass_init_exit;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
93 }
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
94
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
95 FT_Library_Version(ft, &vmajor, &vminor, &vpatch);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
96 ass_msg(library, MSGL_V, "FreeType library version: %d.%d.%d",
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
97 vmajor, vminor, vpatch);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
98 ass_msg(library, MSGL_V, "FreeType headers version: %d.%d.%d",
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
99 FREETYPE_MAJOR, FREETYPE_MINOR, FREETYPE_PATCH);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
100
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
101 priv = calloc(1, sizeof(ASS_Renderer));
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
102 if (!priv) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
103 FT_Done_FreeType(ft);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
104 goto ass_init_exit;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
105 }
26032
93dcb01491cf Print FreeType version in libass init. Makes error logs slightly more helpful.
eugeni
parents: 25513
diff changeset
106
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
107 priv->synth_priv = ass_synth_init(BLUR_MAX_RADIUS);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
108
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
109 priv->library = library;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
110 priv->ftlibrary = ft;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
111 // images_root and related stuff is zero-filled in calloc
19846
bcc792bfa431 Store bitmap glyphs in a separate struct, instead of FreeType's internal buffer.
eugeni
parents: 19825
diff changeset
112
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
113 priv->cache.font_cache = ass_font_cache_init(library);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
114 priv->cache.bitmap_cache = ass_bitmap_cache_init(library);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
115 priv->cache.composite_cache = ass_composite_cache_init(library);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
116 priv->cache.glyph_cache = ass_glyph_cache_init(library);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
117 priv->cache.glyph_max = GLYPH_CACHE_MAX;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
118 priv->cache.bitmap_max_size = BITMAP_CACHE_MAX_SIZE;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29178
diff changeset
119
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
120 priv->text_info.max_glyphs = MAX_GLYPHS_INITIAL;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
121 priv->text_info.max_lines = MAX_LINES_INITIAL;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
122 priv->text_info.glyphs =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
123 calloc(MAX_GLYPHS_INITIAL, sizeof(GlyphInfo));
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
124 priv->text_info.lines = calloc(MAX_LINES_INITIAL, sizeof(LineInfo));
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
125
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
126 ass_init_exit:
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
127 if (priv)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
128 ass_msg(library, MSGL_INFO, "Init");
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
129 else
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
130 ass_msg(library, MSGL_ERR, "Init failed");
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29178
diff changeset
131
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
132 return priv;
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
133 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
134
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
135 void ass_set_cache_limits(ASS_Renderer *render_priv, int glyph_max,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
136 int bitmap_max)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
137 {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
138 render_priv->cache.glyph_max = glyph_max ? glyph_max : GLYPH_CACHE_MAX;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
139 render_priv->cache.bitmap_max_size = bitmap_max ? 1048576 * bitmap_max :
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
140 BITMAP_CACHE_MAX_SIZE;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
141 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
142
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
143 static void free_list_clear(ASS_Renderer *render_priv)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
144 {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
145 if (render_priv->free_head) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
146 FreeList *item = render_priv->free_head;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
147 while(item) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
148 FreeList *oi = item;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
149 free(item->object);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
150 item = item->next;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
151 free(oi);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
152 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
153 render_priv->free_head = NULL;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
154 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
155 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
156
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
157 static void ass_free_images(ASS_Image *img);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
158
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
159 void ass_renderer_done(ASS_Renderer *render_priv)
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
160 {
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
161 ass_font_cache_done(render_priv->cache.font_cache);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
162 ass_bitmap_cache_done(render_priv->cache.bitmap_cache);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
163 ass_composite_cache_done(render_priv->cache.composite_cache);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
164 ass_glyph_cache_done(render_priv->cache.glyph_cache);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
165
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
166 ass_free_images(render_priv->images_root);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
167 ass_free_images(render_priv->prev_images_root);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
168
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
169 if (render_priv->state.stroker) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
170 FT_Stroker_Done(render_priv->state.stroker);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
171 render_priv->state.stroker = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
172 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
173 if (render_priv && render_priv->ftlibrary)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
174 FT_Done_FreeType(render_priv->ftlibrary);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
175 if (render_priv && render_priv->fontconfig_priv)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
176 fontconfig_done(render_priv->fontconfig_priv);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
177 if (render_priv && render_priv->synth_priv)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
178 ass_synth_done(render_priv->synth_priv);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
179 if (render_priv && render_priv->eimg)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
180 free(render_priv->eimg);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
181 free(render_priv->text_info.glyphs);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
182 free(render_priv->text_info.lines);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
183
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
184 free(render_priv->settings.default_font);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
185 free(render_priv->settings.default_family);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
186
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
187 free_list_clear(render_priv);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
188 free(render_priv);
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
189 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
190
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
191 /**
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
192 * \brief Create a new ASS_Image
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
193 * Parameters are the same as ASS_Image fields.
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
194 */
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
195 static ASS_Image *my_draw_bitmap(unsigned char *bitmap, int bitmap_w,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
196 int bitmap_h, int stride, int dst_x,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
197 int dst_y, uint32_t color)
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
198 {
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
199 ASS_Image *img = calloc(1, sizeof(ASS_Image));
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
201 img->w = bitmap_w;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
202 img->h = bitmap_h;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
203 img->stride = stride;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
204 img->bitmap = bitmap;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
205 img->color = color;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
206 img->dst_x = dst_x;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
207 img->dst_y = dst_y;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
208
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
209 return img;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
210 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
211
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
212 static double x2scr_pos(ASS_Renderer *render_priv, double x);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
213 static double y2scr_pos(ASS_Renderer *render_priv, double y);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
214
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
215 /*
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
216 * \brief Convert bitmap glyphs into ASS_Image list with inverse clipping
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
217 *
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
218 * Inverse clipping with the following strategy:
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
219 * - find rectangle from (x0, y0) to (cx0, y1)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
220 * - find rectangle from (cx0, y0) to (cx1, cy0)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
221 * - find rectangle from (cx0, cy1) to (cx1, y1)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
222 * - find rectangle from (cx1, y0) to (x1, y1)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
223 * These rectangles can be invalid and in this case are discarded.
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
224 * Afterwards, they are clipped against the screen coordinates.
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
225 * In an additional pass, the rectangles need to be split up left/right for
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
226 * karaoke effects. This can result in a lot of bitmaps (6 to be exact).
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
227 */
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
228 static ASS_Image **render_glyph_i(ASS_Renderer *render_priv,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
229 Bitmap *bm, int dst_x, int dst_y,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
230 uint32_t color, uint32_t color2, int brk,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
231 ASS_Image **tail)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
232 {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
233 int i, j, x0, y0, x1, y1, cx0, cy0, cx1, cy1, sx, sy, zx, zy;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
234 Rect r[4];
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
235 ASS_Image *img;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
236
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
237 dst_x += bm->left;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
238 dst_y += bm->top;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
239
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
240 // we still need to clip against screen boundaries
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
241 zx = x2scr_pos(render_priv, 0);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
242 zy = y2scr_pos(render_priv, 0);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
243 sx = x2scr_pos(render_priv, render_priv->track->PlayResX);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
244 sy = y2scr_pos(render_priv, render_priv->track->PlayResY);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29178
diff changeset
245
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
246 x0 = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
247 y0 = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
248 x1 = bm->w;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
249 y1 = bm->h;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
250 cx0 = render_priv->state.clip_x0 - dst_x;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
251 cy0 = render_priv->state.clip_y0 - dst_y;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
252 cx1 = render_priv->state.clip_x1 - dst_x;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
253 cy1 = render_priv->state.clip_y1 - dst_y;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
254
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
255 // calculate rectangles and discard invalid ones while we're at it.
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
256 i = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
257 r[i].x0 = x0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
258 r[i].y0 = y0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
259 r[i].x1 = (cx0 > x1) ? x1 : cx0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
260 r[i].y1 = y1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
261 if (r[i].x1 > r[i].x0 && r[i].y1 > r[i].y0) i++;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
262 r[i].x0 = (cx0 < 0) ? x0 : cx0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
263 r[i].y0 = y0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
264 r[i].x1 = (cx1 > x1) ? x1 : cx1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
265 r[i].y1 = (cy0 > y1) ? y1 : cy0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
266 if (r[i].x1 > r[i].x0 && r[i].y1 > r[i].y0) i++;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
267 r[i].x0 = (cx0 < 0) ? x0 : cx0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
268 r[i].y0 = (cy1 < 0) ? y0 : cy1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
269 r[i].x1 = (cx1 > x1) ? x1 : cx1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
270 r[i].y1 = y1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
271 if (r[i].x1 > r[i].x0 && r[i].y1 > r[i].y0) i++;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
272 r[i].x0 = (cx1 < 0) ? x0 : cx1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
273 r[i].y0 = y0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
274 r[i].x1 = x1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
275 r[i].y1 = y1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
276 if (r[i].x1 > r[i].x0 && r[i].y1 > r[i].y0) i++;
29383
e9cab9f6ed62 Make sure clip coordinates are inside the screen area.
eugeni
parents: 29382
diff changeset
277
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
278 // clip each rectangle to screen coordinates
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
279 for (j = 0; j < i; j++) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
280 r[j].x0 = (r[j].x0 + dst_x < zx) ? zx - dst_x : r[j].x0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
281 r[j].y0 = (r[j].y0 + dst_y < zy) ? zy - dst_y : r[j].y0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
282 r[j].x1 = (r[j].x1 + dst_x > sx) ? sx - dst_x : r[j].x1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
283 r[j].y1 = (r[j].y1 + dst_y > sy) ? sy - dst_y : r[j].y1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
284 }
19638
a3473d990fed Better collision detection algorithm. The idea is to keep a subtitle in place
eugeni
parents: 19636
diff changeset
285
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
286 // draw the rectangles
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
287 for (j = 0; j < i; j++) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
288 int lbrk = brk;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
289 // kick out rectangles that are invalid now
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
290 if (r[j].x1 <= r[j].x0 || r[j].y1 <= r[j].y0)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
291 continue;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
292 // split up into left and right for karaoke, if needed
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
293 if (lbrk > r[j].x0) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
294 if (lbrk > r[j].x1) lbrk = r[j].x1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
295 img = my_draw_bitmap(bm->buffer + r[j].y0 * bm->w + r[j].x0,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
296 lbrk - r[j].x0, r[j].y1 - r[j].y0,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
297 bm->w, dst_x + r[j].x0, dst_y + r[j].y0, color);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
298 *tail = img;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
299 tail = &img->next;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
300 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
301 if (lbrk < r[j].x1) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
302 if (lbrk < r[j].x0) lbrk = r[j].x0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
303 img = my_draw_bitmap(bm->buffer + r[j].y0 * bm->w + lbrk,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
304 r[j].x1 - lbrk, r[j].y1 - r[j].y0,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
305 bm->w, dst_x + lbrk, dst_y + r[j].y0, color2);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
306 *tail = img;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
307 tail = &img->next;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
308 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
309 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
310
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
311 return tail;
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
312 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
313
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
314 /**
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
315 * \brief convert bitmap glyph into ASS_Image struct(s)
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
316 * \param bit freetype bitmap glyph, FT_PIXEL_MODE_GRAY
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
317 * \param dst_x bitmap x coordinate in video frame
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
318 * \param dst_y bitmap y coordinate in video frame
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
319 * \param color first color, RGBA
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
320 * \param color2 second color, RGBA
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
321 * \param brk x coordinate relative to glyph origin, color is used to the left of brk, color2 - to the right
19638
a3473d990fed Better collision detection algorithm. The idea is to keep a subtitle in place
eugeni
parents: 19636
diff changeset
322 * \param tail pointer to the last image's next field, head of the generated list should be stored here
a3473d990fed Better collision detection algorithm. The idea is to keep a subtitle in place
eugeni
parents: 19636
diff changeset
323 * \return pointer to the new list tail
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
324 * Performs clipping. Uses my_draw_bitmap for actual bitmap convertion.
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
325 */
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
326 static ASS_Image **
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
327 render_glyph(ASS_Renderer *render_priv, Bitmap *bm, int dst_x, int dst_y,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
328 uint32_t color, uint32_t color2, int brk, ASS_Image **tail)
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
329 {
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
330 // Inverse clipping in use?
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
331 if (render_priv->state.clip_mode)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
332 return render_glyph_i(render_priv, bm, dst_x, dst_y, color, color2,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
333 brk, tail);
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
334
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
335 // brk is relative to dst_x
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
336 // color = color left of brk
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
337 // color2 = color right of brk
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
338 int b_x0, b_y0, b_x1, b_y1; // visible part of the bitmap
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
339 int clip_x0, clip_y0, clip_x1, clip_y1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
340 int tmp;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
341 ASS_Image *img;
29382
363310571aae Cosmetics: make some variables constant to signify their intended use and,
eugeni
parents: 29381
diff changeset
342
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
343 dst_x += bm->left;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
344 dst_y += bm->top;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
345 brk -= bm->left;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29178
diff changeset
346
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
347 // clipping
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
348 clip_x0 = FFMINMAX(render_priv->state.clip_x0, 0, render_priv->width);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
349 clip_y0 = FFMINMAX(render_priv->state.clip_y0, 0, render_priv->height);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
350 clip_x1 = FFMINMAX(render_priv->state.clip_x1, 0, render_priv->width);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
351 clip_y1 = FFMINMAX(render_priv->state.clip_y1, 0, render_priv->height);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
352 b_x0 = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
353 b_y0 = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
354 b_x1 = bm->w;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
355 b_y1 = bm->h;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29178
diff changeset
356
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
357 tmp = dst_x - clip_x0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
358 if (tmp < 0) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
359 ass_msg(render_priv->library, MSGL_DBG2, "clip left");
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
360 b_x0 = -tmp;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
361 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
362 tmp = dst_y - clip_y0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
363 if (tmp < 0) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
364 ass_msg(render_priv->library, MSGL_DBG2, "clip top");
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
365 b_y0 = -tmp;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
366 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
367 tmp = clip_x1 - dst_x - bm->w;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
368 if (tmp < 0) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
369 ass_msg(render_priv->library, MSGL_DBG2, "clip right");
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
370 b_x1 = bm->w + tmp;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
371 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
372 tmp = clip_y1 - dst_y - bm->h;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
373 if (tmp < 0) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
374 ass_msg(render_priv->library, MSGL_DBG2, "clip bottom");
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
375 b_y1 = bm->h + tmp;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
376 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29178
diff changeset
377
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
378 if ((b_y0 >= b_y1) || (b_x0 >= b_x1))
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
379 return tail;
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
380
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
381 if (brk > b_x0) { // draw left part
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
382 if (brk > b_x1)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
383 brk = b_x1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
384 img = my_draw_bitmap(bm->buffer + bm->w * b_y0 + b_x0,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
385 brk - b_x0, b_y1 - b_y0, bm->w,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
386 dst_x + b_x0, dst_y + b_y0, color);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
387 *tail = img;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
388 tail = &img->next;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
389 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
390 if (brk < b_x1) { // draw right part
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
391 if (brk < b_x0)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
392 brk = b_x0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
393 img = my_draw_bitmap(bm->buffer + bm->w * b_y0 + brk,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
394 b_x1 - brk, b_y1 - b_y0, bm->w,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
395 dst_x + brk, dst_y + b_y0, color2);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
396 *tail = img;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
397 tail = &img->next;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
398 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
399 return tail;
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
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
402 /**
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
403 * \brief Replace the bitmap buffer in ASS_Image with a copy
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
404 * \param img ASS_Image to operate on
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
405 * \return pointer to old bitmap buffer
29381
fd2047f3adf6 Fix read after the end of allocated buffer.
eugeni
parents: 29263
diff changeset
406 */
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
407 static unsigned char *clone_bitmap_buffer(ASS_Image *img)
29381
fd2047f3adf6 Fix read after the end of allocated buffer.
eugeni
parents: 29263
diff changeset
408 {
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
409 unsigned char *old_bitmap = img->bitmap;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
410 int size = img->stride * (img->h - 1) + img->w;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
411 img->bitmap = malloc(size);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
412 memcpy(img->bitmap, old_bitmap, size);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
413 return old_bitmap;
29381
fd2047f3adf6 Fix read after the end of allocated buffer.
eugeni
parents: 29263
diff changeset
414 }
fd2047f3adf6 Fix read after the end of allocated buffer.
eugeni
parents: 29263
diff changeset
415
fd2047f3adf6 Fix read after the end of allocated buffer.
eugeni
parents: 29263
diff changeset
416 /**
28789
a0ce88ba2557 Combine adjacent overlapping, translucent glyph borders and shadows to
greg
parents: 28788
diff changeset
417 * \brief Calculate overlapping area of two consecutive bitmaps and in case they
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
418 * overlap, blend them together
28789
a0ce88ba2557 Combine adjacent overlapping, translucent glyph borders and shadows to
greg
parents: 28788
diff changeset
419 * Mainly useful for translucent glyphs and especially borders, to avoid the
a0ce88ba2557 Combine adjacent overlapping, translucent glyph borders and shadows to
greg
parents: 28788
diff changeset
420 * luminance adding up where they overlap (which looks ugly)
a0ce88ba2557 Combine adjacent overlapping, translucent glyph borders and shadows to
greg
parents: 28788
diff changeset
421 */
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
422 static void
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
423 render_overlap(ASS_Renderer *render_priv, ASS_Image **last_tail,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
424 ASS_Image **tail)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
425 {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
426 int left, top, bottom, right;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
427 int old_left, old_top, w, h, cur_left, cur_top;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
428 int x, y, opos, cpos;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
429 char m;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
430 CompositeHashKey hk;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
431 CompositeHashValue *hv;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
432 CompositeHashValue chv;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
433 int ax = (*last_tail)->dst_x;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
434 int ay = (*last_tail)->dst_y;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
435 int aw = (*last_tail)->w;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
436 int as = (*last_tail)->stride;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
437 int ah = (*last_tail)->h;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
438 int bx = (*tail)->dst_x;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
439 int by = (*tail)->dst_y;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
440 int bw = (*tail)->w;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
441 int bs = (*tail)->stride;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
442 int bh = (*tail)->h;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
443 unsigned char *a;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
444 unsigned char *b;
28789
a0ce88ba2557 Combine adjacent overlapping, translucent glyph borders and shadows to
greg
parents: 28788
diff changeset
445
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
446 if ((*last_tail)->bitmap == (*tail)->bitmap)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
447 return;
28789
a0ce88ba2557 Combine adjacent overlapping, translucent glyph borders and shadows to
greg
parents: 28788
diff changeset
448
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
449 if ((*last_tail)->color != (*tail)->color)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
450 return;
28840
7d0ea9013974 Add a proper color check to the overlap compositing.
greg
parents: 28839
diff changeset
451
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
452 // Calculate overlap coordinates
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
453 left = (ax > bx) ? ax : bx;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
454 top = (ay > by) ? ay : by;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
455 right = ((ax + aw) < (bx + bw)) ? (ax + aw) : (bx + bw);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
456 bottom = ((ay + ah) < (by + bh)) ? (ay + ah) : (by + bh);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
457 if ((right <= left) || (bottom <= top))
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
458 return;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
459 old_left = left - ax;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
460 old_top = top - ay;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
461 w = right - left;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
462 h = bottom - top;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
463 cur_left = left - bx;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
464 cur_top = top - by;
28789
a0ce88ba2557 Combine adjacent overlapping, translucent glyph borders and shadows to
greg
parents: 28788
diff changeset
465
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
466 // Query cache
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
467 memset(&hk, 0, sizeof(hk));
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
468 hk.a = (*last_tail)->bitmap;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
469 hk.b = (*tail)->bitmap;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
470 hk.aw = aw;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
471 hk.ah = ah;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
472 hk.bw = bw;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
473 hk.bh = bh;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
474 hk.ax = ax;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
475 hk.ay = ay;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
476 hk.bx = bx;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
477 hk.by = by;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
478 hk.as = as;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
479 hk.bs = bs;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
480 hv = cache_find_composite(render_priv->cache.composite_cache, &hk);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
481 if (hv) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
482 (*last_tail)->bitmap = hv->a;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
483 (*tail)->bitmap = hv->b;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
484 return;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
485 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
486 // Allocate new bitmaps and copy over data
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
487 a = clone_bitmap_buffer(*last_tail);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
488 b = clone_bitmap_buffer(*tail);
28789
a0ce88ba2557 Combine adjacent overlapping, translucent glyph borders and shadows to
greg
parents: 28788
diff changeset
489
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
490 // Blend overlapping area
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
491 for (y = 0; y < h; y++)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
492 for (x = 0; x < w; x++) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
493 opos = (old_top + y) * (as) + (old_left + x);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
494 cpos = (cur_top + y) * (bs) + (cur_left + x);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
495 m = FFMIN(a[opos] + b[cpos], 0xff);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
496 (*last_tail)->bitmap[opos] = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
497 (*tail)->bitmap[cpos] = m;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
498 }
28789
a0ce88ba2557 Combine adjacent overlapping, translucent glyph borders and shadows to
greg
parents: 28788
diff changeset
499
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
500 // Insert bitmaps into the cache
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
501 chv.a = (*last_tail)->bitmap;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
502 chv.b = (*tail)->bitmap;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
503 cache_add_composite(render_priv->cache.composite_cache, &hk, &chv);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
504 }
28789
a0ce88ba2557 Combine adjacent overlapping, translucent glyph borders and shadows to
greg
parents: 28788
diff changeset
505
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
506 static void free_list_add(ASS_Renderer *render_priv, void *object)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
507 {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
508 if (!render_priv->free_head) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
509 render_priv->free_head = calloc(1, sizeof(FreeList));
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
510 render_priv->free_head->object = object;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
511 render_priv->free_tail = render_priv->free_head;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
512 } else {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
513 FreeList *l = calloc(1, sizeof(FreeList));
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
514 l->object = object;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
515 render_priv->free_tail->next = l;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
516 render_priv->free_tail = render_priv->free_tail->next;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
517 }
28789
a0ce88ba2557 Combine adjacent overlapping, translucent glyph borders and shadows to
greg
parents: 28788
diff changeset
518 }
a0ce88ba2557 Combine adjacent overlapping, translucent glyph borders and shadows to
greg
parents: 28788
diff changeset
519
a0ce88ba2557 Combine adjacent overlapping, translucent glyph borders and shadows to
greg
parents: 28788
diff changeset
520 /**
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
521 * Iterate through a list of bitmaps and blend with clip vector, if
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
522 * applicable. The blended bitmaps are added to a free list which is freed
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
523 * at the start of a new frame.
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
524 */
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
525 static void blend_vector_clip(ASS_Renderer *render_priv,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
526 ASS_Image *head)
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
527 {
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
528 FT_Glyph glyph;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
529 FT_BitmapGlyph clip_bm;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
530 ASS_Image *cur;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
531 ASS_Drawing *drawing = render_priv->state.clip_drawing;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
532 int error;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
533
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
534 if (!drawing)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
535 return;
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
536
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
537 // Rasterize it
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
538 FT_Glyph_Copy((FT_Glyph) drawing->glyph, &glyph);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
539 error = FT_Glyph_To_Bitmap(&glyph, FT_RENDER_MODE_NORMAL, 0, 1);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
540 if (error) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
541 ass_msg(render_priv->library, MSGL_V,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
542 "Clip vector rasterization failed: %d. Skipping.", error);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
543 goto blend_vector_exit;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
544 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
545 clip_bm = (FT_BitmapGlyph) glyph;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
546 clip_bm->top = -clip_bm->top;
19965
70352570e9ae Shadow support in libass.
eugeni
parents: 19940
diff changeset
547
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
548 assert(clip_bm->bitmap.pitch >= 0);
19965
70352570e9ae Shadow support in libass.
eugeni
parents: 19940
diff changeset
549
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
550 // Iterate through bitmaps and blend/clip them
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
551 for (cur = head; cur; cur = cur->next) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
552 int left, top, right, bottom, apos, bpos, y, x, w, h;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
553 int ax, ay, aw, ah, as;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
554 int bx, by, bw, bh, bs;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
555 int aleft, atop, bleft, btop;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
556 unsigned char *abuffer, *bbuffer, *nbuffer;
19965
70352570e9ae Shadow support in libass.
eugeni
parents: 19940
diff changeset
557
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
558 abuffer = cur->bitmap;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
559 bbuffer = clip_bm->bitmap.buffer;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
560 ax = cur->dst_x;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
561 ay = cur->dst_y;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
562 aw = cur->w;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
563 ah = cur->h;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
564 as = cur->stride;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
565 bx = clip_bm->left;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
566 by = clip_bm->top;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
567 bw = clip_bm->bitmap.width;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
568 bh = clip_bm->bitmap.rows;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
569 bs = clip_bm->bitmap.pitch;
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
570
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
571 // Calculate overlap coordinates
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
572 left = (ax > bx) ? ax : bx;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
573 top = (ay > by) ? ay : by;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
574 right = ((ax + aw) < (bx + bw)) ? (ax + aw) : (bx + bw);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
575 bottom = ((ay + ah) < (by + bh)) ? (ay + ah) : (by + bh);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
576 aleft = left - ax;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
577 atop = top - ay;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
578 w = right - left;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
579 h = bottom - top;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
580 bleft = left - bx;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
581 btop = top - by;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
582
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
583 if (render_priv->state.clip_drawing_mode) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
584 // Inverse clip
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
585 if (ax + aw < bx || ay + ah < by || ax > bx + bw ||
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
586 ay > by + bh) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
587 continue;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
588 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
589
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
590 // Allocate new buffer and add to free list
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
591 nbuffer = malloc(as * ah);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
592 free_list_add(render_priv, nbuffer);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29178
diff changeset
593
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
594 // Blend together
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
595 memcpy(nbuffer, abuffer, as * (ah - 1) + aw);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
596 for (y = 0; y < h; y++)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
597 for (x = 0; x < w; x++) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
598 apos = (atop + y) * as + aleft + x;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
599 bpos = (btop + y) * bs + bleft + x;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
600 nbuffer[apos] = FFMAX(0, abuffer[apos] - bbuffer[bpos]);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
601 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
602 } else {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
603 // Regular clip
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
604 if (ax + aw < bx || ay + ah < by || ax > bx + bw ||
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
605 ay > by + bh) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
606 cur->w = cur->h = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
607 continue;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
608 }
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
609
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
610 // Allocate new buffer and add to free list
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
611 nbuffer = calloc(as, ah);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
612 free_list_add(render_priv, nbuffer);
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
613
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
614 // Blend together
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
615 for (y = 0; y < h; y++)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
616 for (x = 0; x < w; x++) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
617 apos = (atop + y) * as + aleft + x;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
618 bpos = (btop + y) * bs + bleft + x;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
619 nbuffer[apos] = (abuffer[apos] * bbuffer[bpos] + 255) >> 8;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
620 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
621 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
622 cur->bitmap = nbuffer;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
623 }
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
624
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
625 // Free clip vector and its bitmap, we don't need it anymore
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
626 FT_Done_Glyph(glyph);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
627 blend_vector_exit:
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
628 ass_drawing_free(render_priv->state.clip_drawing);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
629 render_priv->state.clip_drawing = 0;
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
630 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
631
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
632 /**
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
633 * \brief Convert TextInfo struct to ASS_Image list
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
634 * Splits glyphs in halves when needed (for \kf karaoke).
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
635 */
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
636 static ASS_Image *render_text(ASS_Renderer *render_priv, int dst_x,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
637 int dst_y)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
638 {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
639 int pen_x, pen_y;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
640 int i;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
641 Bitmap *bm;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
642 ASS_Image *head;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
643 ASS_Image **tail = &head;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
644 ASS_Image **last_tail = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
645 ASS_Image **here_tail = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
646 TextInfo *text_info = &render_priv->text_info;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
647
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
648 for (i = 0; i < text_info->length; ++i) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
649 GlyphInfo *info = text_info->glyphs + i;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
650 if ((info->symbol == 0) || (info->symbol == '\n') || !info->bm_s
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
651 || (info->shadow_x == 0 && info->shadow_y == 0) || info->skip)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
652 continue;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
653
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
654 pen_x =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
655 dst_x + (info->pos.x >> 6) +
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
656 (int) (info->shadow_x * render_priv->border_scale);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
657 pen_y =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
658 dst_y + (info->pos.y >> 6) +
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
659 (int) (info->shadow_y * render_priv->border_scale);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
660 bm = info->bm_s;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
661
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
662 here_tail = tail;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
663 tail =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
664 render_glyph(render_priv, bm, pen_x, pen_y, info->c[3], 0,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
665 1000000, tail);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
666 if (last_tail && tail != here_tail && ((info->c[3] & 0xff) > 0))
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
667 render_overlap(render_priv, last_tail, here_tail);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
668
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
669 last_tail = here_tail;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
670 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
671
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
672 last_tail = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
673 for (i = 0; i < text_info->length; ++i) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
674 GlyphInfo *info = text_info->glyphs + i;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
675 if ((info->symbol == 0) || (info->symbol == '\n') || !info->bm_o
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
676 || info->skip)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
677 continue;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
678
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
679 pen_x = dst_x + (info->pos.x >> 6);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
680 pen_y = dst_y + (info->pos.y >> 6);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
681 bm = info->bm_o;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
682
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
683 if ((info->effect_type == EF_KARAOKE_KO)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
684 && (info->effect_timing <= (info->bbox.xMax >> 6))) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
685 // do nothing
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
686 } else {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
687 here_tail = tail;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
688 tail =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
689 render_glyph(render_priv, bm, pen_x, pen_y, info->c[2],
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
690 0, 1000000, tail);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
691 if (last_tail && tail != here_tail && ((info->c[2] & 0xff) > 0))
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
692 render_overlap(render_priv, last_tail, here_tail);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
693
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
694 last_tail = here_tail;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
695 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
696 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
697
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
698 for (i = 0; i < text_info->length; ++i) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
699 GlyphInfo *info = text_info->glyphs + i;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
700 if ((info->symbol == 0) || (info->symbol == '\n') || !info->bm
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
701 || info->skip)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
702 continue;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
703
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
704 pen_x = dst_x + (info->pos.x >> 6);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
705 pen_y = dst_y + (info->pos.y >> 6);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
706 bm = info->bm;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
707
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
708 if ((info->effect_type == EF_KARAOKE)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
709 || (info->effect_type == EF_KARAOKE_KO)) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
710 if (info->effect_timing > (info->bbox.xMax >> 6))
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
711 tail =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
712 render_glyph(render_priv, bm, pen_x, pen_y,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
713 info->c[0], 0, 1000000, tail);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
714 else
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
715 tail =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
716 render_glyph(render_priv, bm, pen_x, pen_y,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
717 info->c[1], 0, 1000000, tail);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
718 } else if (info->effect_type == EF_KARAOKE_KF) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
719 tail =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
720 render_glyph(render_priv, bm, pen_x, pen_y, info->c[0],
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
721 info->c[1], info->effect_timing, tail);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
722 } else
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
723 tail =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
724 render_glyph(render_priv, bm, pen_x, pen_y, info->c[0],
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
725 0, 1000000, tail);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
726 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
727
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
728 *tail = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
729 blend_vector_clip(render_priv, head);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
730
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
731 return head;
28748
06983ef189b9 With pan-and-scan, keep positioned events in their original positions
eugeni
parents: 28719
diff changeset
732 }
29383
e9cab9f6ed62 Make sure clip coordinates are inside the screen area.
eugeni
parents: 29382
diff changeset
733
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
734 /**
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
735 * \brief Mapping between script and screen coordinates
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
736 */
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
737 static double x2scr(ASS_Renderer *render_priv, double x)
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
738 {
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
739 return x * render_priv->orig_width_nocrop /
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
740 render_priv->track->PlayResX +
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
741 FFMAX(render_priv->settings.left_margin, 0);
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
742 }
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
743 static double x2scr_pos(ASS_Renderer *render_priv, double x)
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
744 {
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
745 return x * render_priv->orig_width / render_priv->track->PlayResX +
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
746 render_priv->settings.left_margin;
19406
747a5c394a69 Fix wrong handling of transparency in \fad(\fade).
eugeni
parents: 19405
diff changeset
747 }
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
748
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
749 /**
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
750 * \brief Mapping between script and screen coordinates
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
751 */
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
752 static double y2scr(ASS_Renderer *render_priv, double y)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
753 {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
754 return y * render_priv->orig_height_nocrop /
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
755 render_priv->track->PlayResY +
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
756 FFMAX(render_priv->settings.top_margin, 0);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
757 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
758 static double y2scr_pos(ASS_Renderer *render_priv, double y)
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
759 {
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
760 return y * render_priv->orig_height / render_priv->track->PlayResY +
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
761 render_priv->settings.top_margin;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
762 }
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
763
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
764 // the same for toptitles
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
765 static double y2scr_top(ASS_Renderer *render_priv, double y)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
766 {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
767 if (render_priv->settings.use_margins)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
768 return y * render_priv->orig_height_nocrop /
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
769 render_priv->track->PlayResY;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
770 else
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
771 return y * render_priv->orig_height_nocrop /
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
772 render_priv->track->PlayResY +
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
773 FFMAX(render_priv->settings.top_margin, 0);
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
774 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
775
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
776 // the same for subtitles
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
777 static double y2scr_sub(ASS_Renderer *render_priv, double y)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
778 {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
779 if (render_priv->settings.use_margins)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
780 return y * render_priv->orig_height_nocrop /
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
781 render_priv->track->PlayResY +
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
782 FFMAX(render_priv->settings.top_margin,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
783 0) + FFMAX(render_priv->settings.bottom_margin, 0);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
784 else
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
785 return y * render_priv->orig_height_nocrop /
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
786 render_priv->track->PlayResY +
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
787 FFMAX(render_priv->settings.top_margin, 0);
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
788 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
789
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
790 static void compute_string_bbox(TextInfo *info, DBBox *bbox)
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
791 {
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
792 int i;
19556
c7057724ba8c Transition effects support.
eugeni
parents: 19539
diff changeset
793
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
794 if (info->length > 0) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
795 bbox->xMin = 32000;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
796 bbox->xMax = -32000;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
797 bbox->yMin = -1 * info->lines[0].asc + d6_to_double(info->glyphs[0].pos.y);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
798 bbox->yMax = info->height - info->lines[0].asc +
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
799 d6_to_double(info->glyphs[0].pos.y);
19556
c7057724ba8c Transition effects support.
eugeni
parents: 19539
diff changeset
800
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
801 for (i = 0; i < info->length; ++i) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
802 if (info->glyphs[i].skip) continue;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
803 double s = d6_to_double(info->glyphs[i].pos.x);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
804 double e = s + d6_to_double(info->glyphs[i].advance.x);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
805 bbox->xMin = FFMIN(bbox->xMin, s);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
806 bbox->xMax = FFMAX(bbox->xMax, e);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
807 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
808 } else
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
809 bbox->xMin = bbox->xMax = bbox->yMin = bbox->yMax = 0.;
19556
c7057724ba8c Transition effects support.
eugeni
parents: 19539
diff changeset
810 }
c7057724ba8c Transition effects support.
eugeni
parents: 19539
diff changeset
811
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
812 /**
19873
98d32b832c3a Reduce code duplication in init_render_context().
eugeni
parents: 19848
diff changeset
813 * \brief partially reset render_context to style values
98d32b832c3a Reduce code duplication in init_render_context().
eugeni
parents: 19848
diff changeset
814 * Works like {\r}: resets some style overrides
98d32b832c3a Reduce code duplication in init_render_context().
eugeni
parents: 19848
diff changeset
815 */
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
816 void reset_render_context(ASS_Renderer *render_priv)
19873
98d32b832c3a Reduce code duplication in init_render_context().
eugeni
parents: 19848
diff changeset
817 {
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
818 render_priv->state.c[0] = render_priv->state.style->PrimaryColour;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
819 render_priv->state.c[1] = render_priv->state.style->SecondaryColour;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
820 render_priv->state.c[2] = render_priv->state.style->OutlineColour;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
821 render_priv->state.c[3] = render_priv->state.style->BackColour;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
822 render_priv->state.flags =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
823 (render_priv->state.style->Underline ? DECO_UNDERLINE : 0) |
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
824 (render_priv->state.style->StrikeOut ? DECO_STRIKETHROUGH : 0);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
825 render_priv->state.font_size = render_priv->state.style->FontSize;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
826
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
827 free(render_priv->state.family);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
828 render_priv->state.family = NULL;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
829 render_priv->state.family = strdup(render_priv->state.style->FontName);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
830 render_priv->state.treat_family_as_pattern =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
831 render_priv->state.style->treat_fontname_as_pattern;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
832 render_priv->state.bold = render_priv->state.style->Bold;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
833 render_priv->state.italic = render_priv->state.style->Italic;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
834 update_font(render_priv);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
835
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
836 change_border(render_priv, -1., -1.);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
837 render_priv->state.scale_x = render_priv->state.style->ScaleX;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
838 render_priv->state.scale_y = render_priv->state.style->ScaleY;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
839 render_priv->state.hspacing = render_priv->state.style->Spacing;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
840 render_priv->state.be = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
841 render_priv->state.blur = 0.0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
842 render_priv->state.shadow_x = render_priv->state.style->Shadow;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
843 render_priv->state.shadow_y = render_priv->state.style->Shadow;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
844 render_priv->state.frx = render_priv->state.fry = 0.;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
845 render_priv->state.frz = M_PI * render_priv->state.style->Angle / 180.;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
846 render_priv->state.fax = render_priv->state.fay = 0.;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
847 render_priv->state.wrap_style = render_priv->track->WrapStyle;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
848
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
849 // FIXME: does not reset unsupported attributes.
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
850 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
851
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
852 /**
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
853 * \brief Start new event. Reset render_priv->state.
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
854 */
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
855 static void
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
856 init_render_context(ASS_Renderer *render_priv, ASS_Event *event)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
857 {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
858 render_priv->state.event = event;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
859 render_priv->state.style = render_priv->track->styles + event->Style;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
860
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
861 reset_render_context(render_priv);
19873
98d32b832c3a Reduce code duplication in init_render_context().
eugeni
parents: 19848
diff changeset
862
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
863 render_priv->state.evt_type = EVENT_NORMAL;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
864 render_priv->state.alignment = render_priv->state.style->Alignment;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
865 render_priv->state.pos_x = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
866 render_priv->state.pos_y = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
867 render_priv->state.org_x = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
868 render_priv->state.org_y = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
869 render_priv->state.have_origin = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
870 render_priv->state.clip_x0 = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
871 render_priv->state.clip_y0 = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
872 render_priv->state.clip_x1 = render_priv->track->PlayResX;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
873 render_priv->state.clip_y1 = render_priv->track->PlayResY;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
874 render_priv->state.clip_mode = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
875 render_priv->state.detect_collisions = 1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
876 render_priv->state.fade = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
877 render_priv->state.drawing_mode = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
878 render_priv->state.effect_type = EF_NONE;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
879 render_priv->state.effect_timing = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
880 render_priv->state.effect_skip_timing = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
881 render_priv->state.drawing =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
882 ass_drawing_new(render_priv->fontconfig_priv,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
883 render_priv->state.font,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
884 render_priv->settings.hinting,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
885 render_priv->ftlibrary);
19873
98d32b832c3a Reduce code duplication in init_render_context().
eugeni
parents: 19848
diff changeset
886
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
887 apply_transition_effects(render_priv, event);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
888 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
889
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
890 static void free_render_context(ASS_Renderer *render_priv)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
891 {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
892 free(render_priv->state.family);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
893 ass_drawing_free(render_priv->state.drawing);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
894
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
895 render_priv->state.family = NULL;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
896 render_priv->state.drawing = NULL;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
897 }
19873
98d32b832c3a Reduce code duplication in init_render_context().
eugeni
parents: 19848
diff changeset
898
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
899 // Calculate the cbox of a series of points
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
900 static void
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
901 get_contour_cbox(FT_BBox *box, FT_Vector *points, int start, int end)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
902 {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
903 box->xMin = box->yMin = INT_MAX;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
904 box->xMax = box->yMax = INT_MIN;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
905 int i;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
906
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
907 for (i = start; i < end; i++) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
908 box->xMin = (points[i].x < box->xMin) ? points[i].x : box->xMin;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
909 box->xMax = (points[i].x > box->xMax) ? points[i].x : box->xMax;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
910 box->yMin = (points[i].y < box->yMin) ? points[i].y : box->yMin;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
911 box->yMax = (points[i].y > box->yMax) ? points[i].y : box->yMax;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
912 }
19873
98d32b832c3a Reduce code duplication in init_render_context().
eugeni
parents: 19848
diff changeset
913 }
98d32b832c3a Reduce code duplication in init_render_context().
eugeni
parents: 19848
diff changeset
914
98d32b832c3a Reduce code duplication in init_render_context().
eugeni
parents: 19848
diff changeset
915 /**
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
916 * \brief Fix-up stroker result for huge borders by removing the contours from
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
917 * the outline that are harmful.
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
918 */
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
919 static void fix_freetype_stroker(FT_OutlineGlyph glyph, int border_x,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
920 int border_y)
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
921 {
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
922 int nc = glyph->outline.n_contours;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
923 int begin, stop;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
924 char modified = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
925 char *valid_cont;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
926 int start = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
927 int end = -1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
928 FT_BBox *boxes = calloc(nc, sizeof(FT_BBox));
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
929 int i, j;
19873
98d32b832c3a Reduce code duplication in init_render_context().
eugeni
parents: 19848
diff changeset
930
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
931 // Create a list of cboxes of the contours
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
932 for (i = 0; i < nc; i++) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
933 start = end + 1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
934 end = glyph->outline.contours[i];
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
935 get_contour_cbox(&boxes[i], glyph->outline.points, start, end);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
936 }
19873
98d32b832c3a Reduce code duplication in init_render_context().
eugeni
parents: 19848
diff changeset
937
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
938 // if a) contour's cbox is contained in another contours cbox
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
939 // b) contour's height or width is smaller than the border*2
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
940 // the contour can be safely removed.
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
941 valid_cont = calloc(1, nc);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
942 for (i = 0; i < nc; i++) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
943 valid_cont[i] = 1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
944 for (j = 0; j < nc; j++) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
945 if (i == j)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
946 continue;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
947 if (boxes[i].xMin >= boxes[j].xMin &&
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
948 boxes[i].xMax <= boxes[j].xMax &&
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
949 boxes[i].yMin >= boxes[j].yMin &&
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
950 boxes[i].yMax <= boxes[j].yMax) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
951 int width = boxes[i].xMax - boxes[i].xMin;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
952 int height = boxes[i].yMax - boxes[i].yMin;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
953 if (width < border_x * 2 || height < border_y * 2) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
954 valid_cont[i] = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
955 modified = 1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
956 break;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
957 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
958 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
959 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
960 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29178
diff changeset
961
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
962 // Zero-out contours that can be removed; much simpler than copying
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
963 if (modified) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
964 for (i = 0; i < nc; i++) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
965 if (valid_cont[i])
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
966 continue;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
967 begin = (i == 0) ? 0 : glyph->outline.contours[i - 1] + 1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
968 stop = glyph->outline.contours[i];
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
969 for (j = begin; j <= stop; j++) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
970 glyph->outline.points[j].x = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
971 glyph->outline.points[j].y = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
972 glyph->outline.tags[j] = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
973 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
974 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
975 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
976
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
977 free(boxes);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
978 free(valid_cont);
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
979 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
980
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
981 /*
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
982 * Replace the outline of a glyph by a contour which makes up a simple
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
983 * opaque rectangle.
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
984 */
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
985 static void draw_opaque_box(ASS_Renderer *render_priv, uint32_t ch,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
986 FT_Glyph glyph, int sx, int sy)
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
987 {
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
988 int asc = 0, desc = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
989 int i;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
990 int adv = d16_to_d6(glyph->advance.x);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
991 double scale_y = render_priv->state.scale_y;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
992 double scale_x = render_priv->state.scale_x
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
993 * render_priv->font_scale_x;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
994 FT_OutlineGlyph og = (FT_OutlineGlyph) glyph;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
995 FT_Outline *ol;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
996
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
997 // to avoid gaps
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
998 sx = FFMAX(64, sx);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
999 sy = FFMAX(64, sy);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1000
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1001 if (ch == -1) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1002 asc = render_priv->state.drawing->asc;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1003 desc = render_priv->state.drawing->desc;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1004 } else {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1005 ass_font_get_asc_desc(render_priv->state.font, ch, &asc, &desc);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1006 asc *= scale_y;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1007 desc *= scale_y;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1008 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1009
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1010 // Emulate the WTFish behavior of VSFilter, i.e. double-scale
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1011 // the sizes of the opaque box.
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1012 adv += double_to_d6(render_priv->state.hspacing * render_priv->font_scale
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1013 * scale_x);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1014 adv *= scale_x;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1015 sx *= scale_x;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1016 sy *= scale_y;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1017 desc *= scale_y;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1018 desc += asc * (scale_y - 1.0);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1019
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1020 FT_Vector points[4] = {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1021 { .x = -sx, .y = asc + sy },
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1022 { .x = adv + sx, .y = asc + sy },
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1023 { .x = adv + sx, .y = -desc - sy },
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1024 { .x = -sx, .y = -desc - sy },
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1025 };
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1026
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1027 FT_Outline_Done(render_priv->ftlibrary, &og->outline);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1028 FT_Outline_New(render_priv->ftlibrary, 4, 1, &og->outline);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1029
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1030 ol = &og->outline;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1031 ol->n_points = ol->n_contours = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1032 for (i = 0; i < 4; i++) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1033 ol->points[ol->n_points] = points[i];
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1034 ol->tags[ol->n_points++] = 1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1035 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1036 ol->contours[ol->n_contours++] = ol->n_points - 1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1037 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1038
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1039 /*
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1040 * Stroke an outline glyph in x/y direction. Applies various fixups to get
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1041 * around limitations of the FreeType stroker.
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1042 */
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1043 static void stroke_outline_glyph(ASS_Renderer *render_priv,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1044 FT_OutlineGlyph *glyph, int sx, int sy)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1045 {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1046 if (sx <= 0 && sy <= 0)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1047 return;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1048
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1049 fix_freetype_stroker(*glyph, sx, sy);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1050
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1051 // Borders are equal; use the regular stroker
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1052 if (sx == sy && render_priv->state.stroker) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1053 int error;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1054 error = FT_Glyph_StrokeBorder((FT_Glyph *) glyph,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1055 render_priv->state.stroker, 0, 1);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1056 if (error)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1057 ass_msg(render_priv->library, MSGL_WARN,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1058 "FT_Glyph_Stroke error: %d", error);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1059
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1060 // "Stroke" with the outline emboldener in two passes.
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1061 // The outlines look uglier, but the emboldening never adds any points
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1062 } else {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1063 int i;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1064 FT_Outline *ol = &(*glyph)->outline;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1065 FT_Outline nol;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1066 FT_Outline_New(render_priv->ftlibrary, ol->n_points,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1067 ol->n_contours, &nol);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1068 FT_Outline_Copy(ol, &nol);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1069
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1070 FT_Outline_Embolden(ol, sx * 2);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1071 FT_Outline_Translate(ol, -sx, -sx);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1072 FT_Outline_Embolden(&nol, sy * 2);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1073 FT_Outline_Translate(&nol, -sy, -sy);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1074
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1075 for (i = 0; i < ol->n_points; i++)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1076 ol->points[i].y = nol.points[i].y;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1077
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1078 FT_Outline_Done(render_priv->ftlibrary, &nol);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1079 }
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1080 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1081
23179
eaed63bb5078 Update comments.
eugeni
parents: 23178
diff changeset
1082 /**
eaed63bb5078 Update comments.
eugeni
parents: 23178
diff changeset
1083 * \brief Get normal and outline (border) glyphs
eaed63bb5078 Update comments.
eugeni
parents: 23178
diff changeset
1084 * \param symbol ucs4 char
eaed63bb5078 Update comments.
eugeni
parents: 23178
diff changeset
1085 * \param info out: struct filled with extracted data
eaed63bb5078 Update comments.
eugeni
parents: 23178
diff changeset
1086 * Tries to get both glyphs from cache.
eaed63bb5078 Update comments.
eugeni
parents: 23178
diff changeset
1087 * If they can't be found, gets a glyph from font face, generates outline with FT_Stroker,
eaed63bb5078 Update comments.
eugeni
parents: 23178
diff changeset
1088 * and add them to cache.
eaed63bb5078 Update comments.
eugeni
parents: 23178
diff changeset
1089 * The glyphs are returned in info->glyph and info->outline_glyph
eaed63bb5078 Update comments.
eugeni
parents: 23178
diff changeset
1090 */
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1091 static void
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1092 get_outline_glyph(ASS_Renderer *render_priv, int symbol, GlyphInfo *info,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1093 ASS_Drawing *drawing)
23021
a81c390d4a22 Move outline glyph generation to a separate function, using outline glyph
eugeni
parents: 23017
diff changeset
1094 {
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1095 GlyphHashValue *val;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1096 GlyphHashKey key;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1097 memset(&key, 0, sizeof(key));
23021
a81c390d4a22 Move outline glyph generation to a separate function, using outline glyph
eugeni
parents: 23017
diff changeset
1098
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1099 if (drawing->hash) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1100 key.scale_x = double_to_d16(render_priv->state.scale_x);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1101 key.scale_y = double_to_d16(render_priv->state.scale_y);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1102 key.outline.x = render_priv->state.border_x * 0xFFFF;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1103 key.outline.y = render_priv->state.border_y * 0xFFFF;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1104 key.border_style = render_priv->state.style->BorderStyle;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1105 key.drawing_hash = drawing->hash;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1106 } else {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1107 key.font = render_priv->state.font;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1108 key.size = render_priv->state.font_size;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1109 key.ch = symbol;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1110 key.bold = render_priv->state.bold;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1111 key.italic = render_priv->state.italic;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1112 key.scale_x = double_to_d16(render_priv->state.scale_x);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1113 key.scale_y = double_to_d16(render_priv->state.scale_y);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1114 key.outline.x = render_priv->state.border_x * 0xFFFF;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1115 key.outline.y = render_priv->state.border_y * 0xFFFF;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1116 key.flags = render_priv->state.flags;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1117 key.border_style = render_priv->state.style->BorderStyle;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1118 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1119 memset(info, 0, sizeof(GlyphInfo));
23021
a81c390d4a22 Move outline glyph generation to a separate function, using outline glyph
eugeni
parents: 23017
diff changeset
1120
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1121 val = cache_find_glyph(render_priv->cache.glyph_cache, &key);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1122 if (val) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1123 FT_Glyph_Copy(val->glyph, &info->glyph);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1124 if (val->outline_glyph)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1125 FT_Glyph_Copy(val->outline_glyph, &info->outline_glyph);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1126 info->bbox = val->bbox_scaled;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1127 info->advance.x = val->advance.x;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1128 info->advance.y = val->advance.y;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1129 if (drawing->hash) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1130 drawing->asc = val->asc;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1131 drawing->desc = val->desc;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1132 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1133 } else {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1134 GlyphHashValue v;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1135 if (drawing->hash) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1136 if(!ass_drawing_parse(drawing, 0))
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1137 return;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1138 FT_Glyph_Copy((FT_Glyph) drawing->glyph, &info->glyph);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1139 } else {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1140 info->glyph =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1141 ass_font_get_glyph(render_priv->fontconfig_priv,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1142 render_priv->state.font, symbol,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1143 render_priv->settings.hinting,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1144 render_priv->state.flags);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1145 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1146 if (!info->glyph)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1147 return;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1148 info->advance.x = d16_to_d6(info->glyph->advance.x);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1149 info->advance.y = d16_to_d6(info->glyph->advance.y);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1150 FT_Glyph_Get_CBox(info->glyph, FT_GLYPH_BBOX_SUBPIXELS, &info->bbox);
23021
a81c390d4a22 Move outline glyph generation to a separate function, using outline glyph
eugeni
parents: 23017
diff changeset
1151
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1152 if (render_priv->state.style->BorderStyle == 3 &&
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1153 (render_priv->state.border_x > 0||
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1154 render_priv->state.border_y > 0)) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1155 FT_Glyph_Copy(info->glyph, &info->outline_glyph);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1156 draw_opaque_box(render_priv, symbol, info->outline_glyph,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1157 double_to_d6(render_priv->state.border_x *
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1158 render_priv->border_scale),
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1159 double_to_d6(render_priv->state.border_y *
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1160 render_priv->border_scale));
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1161 } else if (render_priv->state.border_x > 0 ||
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1162 render_priv->state.border_y > 0) {
23025
ab0943242d1a Store outline_glyph (glyph border) in glyph cache.
eugeni
parents: 23024
diff changeset
1163
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1164 FT_Glyph_Copy(info->glyph, &info->outline_glyph);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1165 stroke_outline_glyph(render_priv,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1166 (FT_OutlineGlyph *) &info->outline_glyph,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1167 double_to_d6(render_priv->state.border_x *
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1168 render_priv->border_scale),
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1169 double_to_d6(render_priv->state.border_y *
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1170 render_priv->border_scale));
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1171 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1172
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1173 memset(&v, 0, sizeof(v));
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1174 FT_Glyph_Copy(info->glyph, &v.glyph);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1175 if (info->outline_glyph)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1176 FT_Glyph_Copy(info->outline_glyph, &v.outline_glyph);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1177 v.advance = info->advance;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1178 v.bbox_scaled = info->bbox;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1179 if (drawing->hash) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1180 v.asc = drawing->asc;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1181 v.desc = drawing->desc;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1182 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1183 cache_add_glyph(render_priv->cache.glyph_cache, &key, &v);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1184 }
23021
a81c390d4a22 Move outline glyph generation to a separate function, using outline glyph
eugeni
parents: 23017
diff changeset
1185 }
a81c390d4a22 Move outline glyph generation to a separate function, using outline glyph
eugeni
parents: 23017
diff changeset
1186
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1187 static void transform_3d(FT_Vector shift, FT_Glyph *glyph,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1188 FT_Glyph *glyph2, double frx, double fry,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1189 double frz, double fax, double fay, double scale,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1190 int yshift);
23173
1170ac4d7f5b Move transform_3d() call to get_bitmap_glyph().
eugeni
parents: 23172
diff changeset
1191
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1192 /**
23179
eaed63bb5078 Update comments.
eugeni
parents: 23178
diff changeset
1193 * \brief Get bitmaps for a glyph
eaed63bb5078 Update comments.
eugeni
parents: 23178
diff changeset
1194 * \param info glyph info
eaed63bb5078 Update comments.
eugeni
parents: 23178
diff changeset
1195 * Tries to get glyph bitmaps from bitmap cache.
eaed63bb5078 Update comments.
eugeni
parents: 23178
diff changeset
1196 * If they can't be found, they are generated by rotating and rendering the glyph.
eaed63bb5078 Update comments.
eugeni
parents: 23178
diff changeset
1197 * After that, bitmaps are added to the cache.
eaed63bb5078 Update comments.
eugeni
parents: 23178
diff changeset
1198 * They are returned in info->bm (glyph), info->bm_o (outline) and info->bm_s (shadow).
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1199 */
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1200 static void
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1201 get_bitmap_glyph(ASS_Renderer *render_priv, GlyphInfo *info)
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1202 {
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1203 BitmapHashValue *val;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1204 BitmapHashKey *key = &info->hash_key;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1205
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1206 val = cache_find_bitmap(render_priv->cache.bitmap_cache, key);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29178
diff changeset
1207
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1208 if (val) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1209 info->bm = val->bm;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1210 info->bm_o = val->bm_o;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1211 info->bm_s = val->bm_s;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1212 } else {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1213 FT_Vector shift;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1214 BitmapHashValue hash_val;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1215 int error;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1216 double fax_scaled, fay_scaled;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1217 info->bm = info->bm_o = info->bm_s = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1218 if (info->glyph && info->symbol != '\n' && info->symbol != 0
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1219 && !info->skip) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1220 // calculating rotation shift vector (from rotation origin to the glyph basepoint)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1221 shift.x = info->hash_key.shift_x;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1222 shift.y = info->hash_key.shift_y;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1223 fax_scaled = info->fax * render_priv->font_scale_x *
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1224 render_priv->state.scale_x;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1225 fay_scaled = info->fay * render_priv->state.scale_y;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1226 // apply rotation
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1227 transform_3d(shift, &info->glyph, &info->outline_glyph,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1228 info->frx, info->fry, info->frz, fax_scaled,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1229 fay_scaled, render_priv->font_scale, info->asc);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29178
diff changeset
1230
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1231 // subpixel shift
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1232 if (info->glyph)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1233 FT_Outline_Translate(
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1234 &((FT_OutlineGlyph) info->glyph)->outline,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1235 info->hash_key.advance.x,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1236 -info->hash_key.advance.y);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1237 if (info->outline_glyph)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1238 FT_Outline_Translate(
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1239 &((FT_OutlineGlyph) info->outline_glyph)->outline,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1240 info->hash_key.advance.x,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1241 -info->hash_key.advance.y);
23177
134a2baca452 Move glyph_to_bitmap() call and outline glyph deallocation to
eugeni
parents: 23175
diff changeset
1242
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1243 // render glyph
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1244 error = glyph_to_bitmap(render_priv->library,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1245 render_priv->synth_priv,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1246 info->glyph, info->outline_glyph,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1247 &info->bm, &info->bm_o,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1248 &info->bm_s, info->be,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1249 info->blur * render_priv->border_scale,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1250 info->hash_key.shadow_offset,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1251 info->hash_key.border_style);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1252 if (error)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1253 info->symbol = 0;
23177
134a2baca452 Move glyph_to_bitmap() call and outline glyph deallocation to
eugeni
parents: 23175
diff changeset
1254
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1255 // add bitmaps to cache
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1256 hash_val.bm_o = info->bm_o;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1257 hash_val.bm = info->bm;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1258 hash_val.bm_s = info->bm_s;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1259 cache_add_bitmap(render_priv->cache.bitmap_cache,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1260 &(info->hash_key), &hash_val);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1261 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1262 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1263 // deallocate glyphs
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1264 if (info->glyph)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1265 FT_Done_Glyph(info->glyph);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1266 if (info->outline_glyph)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1267 FT_Done_Glyph(info->outline_glyph);
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1268 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1269
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1270 /**
19932
0b5b9cbbc74e Move calculation of text parameters (number of lines, height, etc.) from
eugeni
parents: 19931
diff changeset
1271 * This function goes through text_info and calculates text parameters.
0b5b9cbbc74e Move calculation of text parameters (number of lines, height, etc.) from
eugeni
parents: 19931
diff changeset
1272 * The following text_info fields are filled:
0b5b9cbbc74e Move calculation of text parameters (number of lines, height, etc.) from
eugeni
parents: 19931
diff changeset
1273 * height
0b5b9cbbc74e Move calculation of text parameters (number of lines, height, etc.) from
eugeni
parents: 19931
diff changeset
1274 * lines[].height
0b5b9cbbc74e Move calculation of text parameters (number of lines, height, etc.) from
eugeni
parents: 19931
diff changeset
1275 * lines[].asc
0b5b9cbbc74e Move calculation of text parameters (number of lines, height, etc.) from
eugeni
parents: 19931
diff changeset
1276 * lines[].desc
0b5b9cbbc74e Move calculation of text parameters (number of lines, height, etc.) from
eugeni
parents: 19931
diff changeset
1277 */
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1278 static void measure_text(ASS_Renderer *render_priv)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1279 {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1280 TextInfo *text_info = &render_priv->text_info;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1281 int cur_line = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1282 double max_asc = 0., max_desc = 0.;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1283 GlyphInfo *last = NULL;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1284 int i;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1285 int empty_line = 1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1286 text_info->height = 0.;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1287 for (i = 0; i < text_info->length + 1; ++i) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1288 if ((i == text_info->length) || text_info->glyphs[i].linebreak) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1289 if (empty_line && cur_line > 0 && last && i < text_info->length) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1290 max_asc = d6_to_double(last->asc) / 2.0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1291 max_desc = d6_to_double(last->desc) / 2.0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1292 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1293 text_info->lines[cur_line].asc = max_asc;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1294 text_info->lines[cur_line].desc = max_desc;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1295 text_info->height += max_asc + max_desc;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1296 cur_line++;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1297 max_asc = max_desc = 0.;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1298 empty_line = 1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1299 } else
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1300 empty_line = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1301 if (i < text_info->length) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1302 GlyphInfo *cur = text_info->glyphs + i;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1303 if (d6_to_double(cur->asc) > max_asc)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1304 max_asc = d6_to_double(cur->asc);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1305 if (d6_to_double(cur->desc) > max_desc)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1306 max_desc = d6_to_double(cur->desc);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1307 if (cur->symbol != '\n' && cur->symbol != 0)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1308 last = cur;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1309 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1310 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1311 text_info->height +=
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1312 (text_info->n_lines -
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1313 1) * render_priv->settings.line_spacing;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1314 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1315
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1316 /**
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1317 * Mark extra whitespace for later removal.
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1318 */
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1319 #define IS_WHITESPACE(x) ((x->symbol == ' ' || x->symbol == '\n') \
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1320 && !x->linebreak)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1321 static void trim_whitespace(ASS_Renderer *render_priv)
19932
0b5b9cbbc74e Move calculation of text parameters (number of lines, height, etc.) from
eugeni
parents: 19931
diff changeset
1322 {
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1323 int i, j;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1324 GlyphInfo *cur;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1325 TextInfo *ti = &render_priv->text_info;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1326
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1327 // Mark trailing spaces
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1328 i = ti->length - 1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1329 cur = ti->glyphs + i;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1330 while (i && IS_WHITESPACE(cur)) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1331 cur->skip++;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1332 cur = ti->glyphs + --i;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1333 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1334
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1335 // Mark leading whitespace
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1336 i = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1337 cur = ti->glyphs;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1338 while (i < ti->length && IS_WHITESPACE(cur)) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1339 cur->skip++;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1340 cur = ti->glyphs + ++i;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1341 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1342
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1343 // Mark all extraneous whitespace inbetween
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1344 for (i = 0; i < ti->length; ++i) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1345 cur = ti->glyphs + i;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1346 if (cur->linebreak) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1347 // Mark whitespace before
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1348 j = i - 1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1349 cur = ti->glyphs + j;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1350 while (j && IS_WHITESPACE(cur)) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1351 cur->skip++;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1352 cur = ti->glyphs + --j;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1353 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1354 // A break itself can contain a whitespace, too
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1355 cur = ti->glyphs + i;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1356 if (cur->symbol == ' ')
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1357 cur->skip++;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1358 // Mark whitespace after
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1359 j = i + 1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1360 cur = ti->glyphs + j;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1361 while (j < ti->length && IS_WHITESPACE(cur)) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1362 cur->skip++;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1363 cur = ti->glyphs + ++j;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1364 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1365 i = j - 1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1366 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1367 }
19932
0b5b9cbbc74e Move calculation of text parameters (number of lines, height, etc.) from
eugeni
parents: 19931
diff changeset
1368 }
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1369 #undef IS_WHITESPACE
19932
0b5b9cbbc74e Move calculation of text parameters (number of lines, height, etc.) from
eugeni
parents: 19931
diff changeset
1370
0b5b9cbbc74e Move calculation of text parameters (number of lines, height, etc.) from
eugeni
parents: 19931
diff changeset
1371 /**
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1372 * \brief rearrange text between lines
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1373 * \param max_text_width maximal text line width in pixels
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1374 * The algo is similar to the one in libvo/sub.c:
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1375 * 1. Place text, wrapping it when current line is full
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1376 * 2. Try moving words from the end of a line to the beginning of the next one while it reduces
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1377 * the difference in lengths between this two lines.
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1378 * The result may not be optimal, but usually is good enough.
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1379 *
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1380 * FIXME: implement style 0 and 3 correctly, add support for style 1
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1381 */
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1382 static void
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1383 wrap_lines_smart(ASS_Renderer *render_priv, double max_text_width)
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1384 {
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1385 int i;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1386 GlyphInfo *cur, *s1, *e1, *s2, *s3, *w;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1387 int last_space;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1388 int break_type;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1389 int exit;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1390 double pen_shift_x;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1391 double pen_shift_y;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1392 int cur_line;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1393 TextInfo *text_info = &render_priv->text_info;
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1394
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1395 last_space = -1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1396 text_info->n_lines = 1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1397 break_type = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1398 s1 = text_info->glyphs; // current line start
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1399 for (i = 0; i < text_info->length; ++i) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1400 int break_at;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1401 double s_offset, len;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1402 cur = text_info->glyphs + i;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1403 break_at = -1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1404 s_offset = d6_to_double(s1->bbox.xMin + s1->pos.x);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1405 len = d6_to_double(cur->bbox.xMax + cur->pos.x) - s_offset;
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1406
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1407 if (cur->symbol == '\n') {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1408 break_type = 2;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1409 break_at = i;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1410 ass_msg(render_priv->library, MSGL_DBG2,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1411 "forced line break at %d", break_at);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1412 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29178
diff changeset
1413
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1414 if ((len >= max_text_width)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1415 && (render_priv->state.wrap_style != 2)) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1416 break_type = 1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1417 break_at = last_space;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1418 if (break_at == -1)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1419 break_at = i - 1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1420 if (break_at == -1)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1421 break_at = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1422 ass_msg(render_priv->library, MSGL_DBG2, "overfill at %d", i);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1423 ass_msg(render_priv->library, MSGL_DBG2, "line break at %d",
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1424 break_at);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1425 }
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1426
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1427 if (break_at != -1) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1428 // need to use one more line
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1429 // marking break_at+1 as start of a new line
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1430 int lead = break_at + 1; // the first symbol of the new line
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1431 if (text_info->n_lines >= text_info->max_lines) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1432 // Raise maximum number of lines
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1433 text_info->max_lines *= 2;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1434 text_info->lines = realloc(text_info->lines,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1435 sizeof(LineInfo) *
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1436 text_info->max_lines);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1437 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1438 if (lead < text_info->length)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1439 text_info->glyphs[lead].linebreak = break_type;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1440 last_space = -1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1441 s1 = text_info->glyphs + lead;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1442 s_offset = d6_to_double(s1->bbox.xMin + s1->pos.x);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1443 text_info->n_lines++;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1444 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29178
diff changeset
1445
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1446 if (cur->symbol == ' ')
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1447 last_space = i;
22913
07ecf1d8922e Fix lost hard linebreaks in libass by repeating the loop when both soft and
eugeni
parents: 22886
diff changeset
1448
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1449 // make sure the hard linebreak is not forgotten when
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1450 // there was a new soft linebreak just inserted
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1451 if (cur->symbol == '\n' && break_type == 1)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1452 i--;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1453 }
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1454 #define DIFF(x,y) (((x) < (y)) ? (y - x) : (x - y))
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1455 exit = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1456 while (!exit && render_priv->state.wrap_style != 1) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1457 exit = 1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1458 w = s3 = text_info->glyphs;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1459 s1 = s2 = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1460 for (i = 0; i <= text_info->length; ++i) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1461 cur = text_info->glyphs + i;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1462 if ((i == text_info->length) || cur->linebreak) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1463 s1 = s2;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1464 s2 = s3;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1465 s3 = cur;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1466 if (s1 && (s2->linebreak == 1)) { // have at least 2 lines, and linebreak is 'soft'
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1467 double l1, l2, l1_new, l2_new;
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1468
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1469 w = s2;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1470 do {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1471 --w;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1472 } while ((w > s1) && (w->symbol == ' '));
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1473 while ((w > s1) && (w->symbol != ' ')) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1474 --w;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1475 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1476 e1 = w;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1477 while ((e1 > s1) && (e1->symbol == ' ')) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1478 --e1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1479 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1480 if (w->symbol == ' ')
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1481 ++w;
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1482
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1483 l1 = d6_to_double(((s2 - 1)->bbox.xMax + (s2 - 1)->pos.x) -
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1484 (s1->bbox.xMin + s1->pos.x));
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1485 l2 = d6_to_double(((s3 - 1)->bbox.xMax + (s3 - 1)->pos.x) -
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1486 (s2->bbox.xMin + s2->pos.x));
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1487 l1_new = d6_to_double(
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1488 (e1->bbox.xMax + e1->pos.x) -
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1489 (s1->bbox.xMin + s1->pos.x));
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1490 l2_new = d6_to_double(
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1491 ((s3 - 1)->bbox.xMax + (s3 - 1)->pos.x) -
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1492 (w->bbox.xMin + w->pos.x));
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29178
diff changeset
1493
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1494 if (DIFF(l1_new, l2_new) < DIFF(l1, l2)) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1495 w->linebreak = 1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1496 s2->linebreak = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1497 exit = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1498 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1499 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1500 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1501 if (i == text_info->length)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1502 break;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1503 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1504
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1505 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1506 assert(text_info->n_lines >= 1);
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1507 #undef DIFF
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29178
diff changeset
1508
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1509 measure_text(render_priv);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1510 trim_whitespace(render_priv);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1511
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1512 pen_shift_x = 0.;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1513 pen_shift_y = 0.;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1514 cur_line = 1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1515
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1516 i = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1517 cur = text_info->glyphs + i;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1518 while (i < text_info->length && cur->skip)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1519 cur = text_info->glyphs + ++i;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1520 pen_shift_x = d6_to_double(-cur->pos.x);
19932
0b5b9cbbc74e Move calculation of text parameters (number of lines, height, etc.) from
eugeni
parents: 19931
diff changeset
1521
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1522 for (i = 0; i < text_info->length; ++i) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1523 cur = text_info->glyphs + i;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1524 if (cur->linebreak) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1525 while (i < text_info->length && cur->skip && cur->symbol != '\n')
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1526 cur = text_info->glyphs + ++i;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1527 double height =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1528 text_info->lines[cur_line - 1].desc +
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1529 text_info->lines[cur_line].asc;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1530 cur_line++;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1531 pen_shift_x = d6_to_double(-cur->pos.x);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1532 pen_shift_y += height + render_priv->settings.line_spacing;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1533 ass_msg(render_priv->library, MSGL_DBG2,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1534 "shifting from %d to %d by (%f, %f)", i,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1535 text_info->length - 1, pen_shift_x, pen_shift_y);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1536 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1537 cur->pos.x += double_to_d6(pen_shift_x);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1538 cur->pos.y += double_to_d6(pen_shift_y);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1539 }
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1540 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1541
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1542 /**
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1543 * \brief determine karaoke effects
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1544 * Karaoke effects cannot be calculated during parse stage (get_next_char()),
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1545 * so they are done in a separate step.
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29178
diff changeset
1546 * Parse stage: when karaoke style override is found, its parameters are stored in the next glyph's
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1547 * (the first glyph of the karaoke word)'s effect_type and effect_timing.
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1548 * This function:
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1549 * 1. sets effect_type for all glyphs in the word (_karaoke_ word)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1550 * 2. sets effect_timing for all glyphs to x coordinate of the border line between the left and right karaoke parts
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1551 * (left part is filled with PrimaryColour, right one - with SecondaryColour).
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1552 */
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1553 static void process_karaoke_effects(ASS_Renderer *render_priv)
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1554 {
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1555 GlyphInfo *cur, *cur2;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1556 GlyphInfo *s1, *e1; // start and end of the current word
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1557 GlyphInfo *s2; // start of the next word
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1558 int i;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1559 int timing; // current timing
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1560 int tm_start, tm_end; // timings at start and end of the current word
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1561 int tm_current;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1562 double dt;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1563 int x;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1564 int x_start, x_end;
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1565
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1566 tm_current = render_priv->time - render_priv->state.event->Start;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1567 timing = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1568 s1 = s2 = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1569 for (i = 0; i <= render_priv->text_info.length; ++i) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1570 cur = render_priv->text_info.glyphs + i;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1571 if ((i == render_priv->text_info.length)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1572 || (cur->effect_type != EF_NONE)) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1573 s1 = s2;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1574 s2 = cur;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1575 if (s1) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1576 e1 = s2 - 1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1577 tm_start = timing + s1->effect_skip_timing;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1578 tm_end = tm_start + s1->effect_timing;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1579 timing = tm_end;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1580 x_start = 1000000;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1581 x_end = -1000000;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1582 for (cur2 = s1; cur2 <= e1; ++cur2) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1583 x_start = FFMIN(x_start, d6_to_int(cur2->bbox.xMin + cur2->pos.x));
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1584 x_end = FFMAX(x_end, d6_to_int(cur2->bbox.xMax + cur2->pos.x));
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1585 }
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1586
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1587 dt = (tm_current - tm_start);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1588 if ((s1->effect_type == EF_KARAOKE)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1589 || (s1->effect_type == EF_KARAOKE_KO)) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1590 if (dt > 0)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1591 x = x_end + 1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1592 else
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1593 x = x_start;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1594 } else if (s1->effect_type == EF_KARAOKE_KF) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1595 dt /= (tm_end - tm_start);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1596 x = x_start + (x_end - x_start) * dt;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1597 } else {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1598 ass_msg(render_priv->library, MSGL_ERR,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1599 "Unknown effect type");
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1600 continue;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1601 }
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1602
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1603 for (cur2 = s1; cur2 <= e1; ++cur2) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1604 cur2->effect_type = s1->effect_type;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1605 cur2->effect_timing = x - d6_to_int(cur2->pos.x);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1606 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1607 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1608 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1609 }
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1610 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1611
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1612 /**
20294
4d7c8478e523 Move base point calculation to a separate function. Will be reused soon.
eugeni
parents: 20293
diff changeset
1613 * \brief Calculate base point for positioning and rotation
4d7c8478e523 Move base point calculation to a separate function. Will be reused soon.
eugeni
parents: 20293
diff changeset
1614 * \param bbox text bbox
4d7c8478e523 Move base point calculation to a separate function. Will be reused soon.
eugeni
parents: 20293
diff changeset
1615 * \param alignment alignment
4d7c8478e523 Move base point calculation to a separate function. Will be reused soon.
eugeni
parents: 20293
diff changeset
1616 * \param bx, by out: base point coordinates
4d7c8478e523 Move base point calculation to a separate function. Will be reused soon.
eugeni
parents: 20293
diff changeset
1617 */
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1618 static void get_base_point(DBBox *bbox, int alignment, double *bx, double *by)
20294
4d7c8478e523 Move base point calculation to a separate function. Will be reused soon.
eugeni
parents: 20293
diff changeset
1619 {
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1620 const int halign = alignment & 3;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1621 const int valign = alignment & 12;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1622 if (bx)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1623 switch (halign) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1624 case HALIGN_LEFT:
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1625 *bx = bbox->xMin;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1626 break;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1627 case HALIGN_CENTER:
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1628 *bx = (bbox->xMax + bbox->xMin) / 2.0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1629 break;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1630 case HALIGN_RIGHT:
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1631 *bx = bbox->xMax;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1632 break;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1633 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1634 if (by)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1635 switch (valign) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1636 case VALIGN_TOP:
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1637 *by = bbox->yMin;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1638 break;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1639 case VALIGN_CENTER:
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1640 *by = (bbox->yMax + bbox->yMin) / 2.0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1641 break;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1642 case VALIGN_SUB:
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1643 *by = bbox->yMax;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1644 break;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1645 }
20294
4d7c8478e523 Move base point calculation to a separate function. Will be reused soon.
eugeni
parents: 20293
diff changeset
1646 }
4d7c8478e523 Move base point calculation to a separate function. Will be reused soon.
eugeni
parents: 20293
diff changeset
1647
4d7c8478e523 Move base point calculation to a separate function. Will be reused soon.
eugeni
parents: 20293
diff changeset
1648 /**
28839
fda4cf558544 Replace rotation functions with a simplified version adapted from
greg
parents: 28838
diff changeset
1649 * \brief Apply transformation to outline points of a glyph
fda4cf558544 Replace rotation functions with a simplified version adapted from
greg
parents: 28838
diff changeset
1650 * Applies rotations given by frx, fry and frz and projects the points back
fda4cf558544 Replace rotation functions with a simplified version adapted from
greg
parents: 28838
diff changeset
1651 * onto the screen plane.
22215
fb365c2b3d05 Implement \frx and \fry (and reimplement \frz) as 3d rotations.
eugeni
parents: 22214
diff changeset
1652 */
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1653 static void
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1654 transform_3d_points(FT_Vector shift, FT_Glyph glyph, double frx, double fry,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1655 double frz, double fax, double fay, double scale,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1656 int yshift)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1657 {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1658 double sx = sin(frx);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1659 double sy = sin(fry);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1660 double sz = sin(frz);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1661 double cx = cos(frx);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1662 double cy = cos(fry);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1663 double cz = cos(frz);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1664 FT_Outline *outline = &((FT_OutlineGlyph) glyph)->outline;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1665 FT_Vector *p = outline->points;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1666 double x, y, z, xx, yy, zz;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1667 int i, dist;
28839
fda4cf558544 Replace rotation functions with a simplified version adapted from
greg
parents: 28838
diff changeset
1668
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1669 dist = 20000 * scale;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1670 for (i = 0; i < outline->n_points; i++) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1671 x = (double) p[i].x + shift.x + (fax * (yshift - p[i].y));
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1672 y = (double) p[i].y + shift.y + (-fay * p[i].x);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1673 z = 0.;
28839
fda4cf558544 Replace rotation functions with a simplified version adapted from
greg
parents: 28838
diff changeset
1674
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1675 xx = x * cz + y * sz;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1676 yy = -(x * sz - y * cz);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1677 zz = z;
28839
fda4cf558544 Replace rotation functions with a simplified version adapted from
greg
parents: 28838
diff changeset
1678
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1679 x = xx;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1680 y = yy * cx + zz * sx;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1681 z = yy * sx - zz * cx;
28839
fda4cf558544 Replace rotation functions with a simplified version adapted from
greg
parents: 28838
diff changeset
1682
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1683 xx = x * cy + z * sy;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1684 yy = y;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1685 zz = x * sy - z * cy;
28839
fda4cf558544 Replace rotation functions with a simplified version adapted from
greg
parents: 28838
diff changeset
1686
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1687 zz = FFMAX(zz, 1000 - dist);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1688
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1689 x = (xx * dist) / (zz + dist);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1690 y = (yy * dist) / (zz + dist);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1691 p[i].x = x - shift.x + 0.5;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1692 p[i].y = y - shift.y + 0.5;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1693 }
22215
fb365c2b3d05 Implement \frx and \fry (and reimplement \frz) as 3d rotations.
eugeni
parents: 22214
diff changeset
1694 }
fb365c2b3d05 Implement \frx and \fry (and reimplement \frz) as 3d rotations.
eugeni
parents: 22214
diff changeset
1695
fb365c2b3d05 Implement \frx and \fry (and reimplement \frz) as 3d rotations.
eugeni
parents: 22214
diff changeset
1696 /**
fb365c2b3d05 Implement \frx and \fry (and reimplement \frz) as 3d rotations.
eugeni
parents: 22214
diff changeset
1697 * \brief Apply 3d transformation to several objects
23013
7eb66492a37d Applying transformation matrix to the glyph and the shift vector separately is
eugeni
parents: 23012
diff changeset
1698 * \param shift FreeType vector
22215
fb365c2b3d05 Implement \frx and \fry (and reimplement \frz) as 3d rotations.
eugeni
parents: 22214
diff changeset
1699 * \param glyph FreeType glyph
fb365c2b3d05 Implement \frx and \fry (and reimplement \frz) as 3d rotations.
eugeni
parents: 22214
diff changeset
1700 * \param glyph2 FreeType glyph
fb365c2b3d05 Implement \frx and \fry (and reimplement \frz) as 3d rotations.
eugeni
parents: 22214
diff changeset
1701 * \param frx x-axis rotation angle
fb365c2b3d05 Implement \frx and \fry (and reimplement \frz) as 3d rotations.
eugeni
parents: 22214
diff changeset
1702 * \param fry y-axis rotation angle
fb365c2b3d05 Implement \frx and \fry (and reimplement \frz) as 3d rotations.
eugeni
parents: 22214
diff changeset
1703 * \param frz z-axis rotation angle
23013
7eb66492a37d Applying transformation matrix to the glyph and the shift vector separately is
eugeni
parents: 23012
diff changeset
1704 * Rotates both glyphs by frx, fry and frz. Shift vector is added before rotation and subtracted after it.
22215
fb365c2b3d05 Implement \frx and \fry (and reimplement \frz) as 3d rotations.
eugeni
parents: 22214
diff changeset
1705 */
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1706 static void
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1707 transform_3d(FT_Vector shift, FT_Glyph *glyph, FT_Glyph *glyph2,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1708 double frx, double fry, double frz, double fax, double fay,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1709 double scale, int yshift)
22215
fb365c2b3d05 Implement \frx and \fry (and reimplement \frz) as 3d rotations.
eugeni
parents: 22214
diff changeset
1710 {
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1711 frx = -frx;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1712 frz = -frz;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1713 if (frx != 0. || fry != 0. || frz != 0. || fax != 0. || fay != 0.) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1714 if (glyph && *glyph)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1715 transform_3d_points(shift, *glyph, frx, fry, frz,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1716 fax, fay, scale, yshift);
22215
fb365c2b3d05 Implement \frx and \fry (and reimplement \frz) as 3d rotations.
eugeni
parents: 22214
diff changeset
1717
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1718 if (glyph2 && *glyph2)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1719 transform_3d_points(shift, *glyph2, frx, fry, frz,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1720 fax, fay, scale, yshift);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1721 }
22215
fb365c2b3d05 Implement \frx and \fry (and reimplement \frz) as 3d rotations.
eugeni
parents: 22214
diff changeset
1722 }
fb365c2b3d05 Implement \frx and \fry (and reimplement \frz) as 3d rotations.
eugeni
parents: 22214
diff changeset
1723
28839
fda4cf558544 Replace rotation functions with a simplified version adapted from
greg
parents: 28838
diff changeset
1724
22215
fb365c2b3d05 Implement \frx and \fry (and reimplement \frz) as 3d rotations.
eugeni
parents: 22214
diff changeset
1725 /**
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1726 * \brief Main ass rendering function, glues everything together
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1727 * \param event event to render
29048
584ff003cce9 Document the ass_render_event event_images parameter.
reimar
parents: 29047
diff changeset
1728 * \param event_images struct containing resulting images, will also be initialized
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1729 * Process event, appending resulting ASS_Image's to images_root.
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1730 */
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1731 static int
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1732 ass_render_event(ASS_Renderer *render_priv, ASS_Event *event,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1733 EventImages *event_images)
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1734 {
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1735 char *p;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1736 FT_UInt previous;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1737 FT_UInt num_glyphs;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1738 FT_Vector pen;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1739 unsigned code;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1740 DBBox bbox;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1741 int i, j;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1742 int MarginL, MarginR, MarginV;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1743 int last_break;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1744 int alignment, halign, valign;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1745 int kern = render_priv->track->Kerning;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1746 double device_x = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1747 double device_y = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1748 TextInfo *text_info = &render_priv->text_info;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1749 ASS_Drawing *drawing;
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1750
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1751 if (event->Style >= render_priv->track->n_styles) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1752 ass_msg(render_priv->library, MSGL_WARN, "No style found");
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1753 return 1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1754 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1755 if (!event->Text) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1756 ass_msg(render_priv->library, MSGL_WARN, "Empty event");
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1757 return 1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1758 }
19650
d89179256560 More checks in ass_render_event.
eugeni
parents: 19649
diff changeset
1759
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1760 init_render_context(render_priv, event);
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1761
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1762 drawing = render_priv->state.drawing;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1763 text_info->length = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1764 pen.x = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1765 pen.y = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1766 previous = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1767 num_glyphs = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1768 p = event->Text;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1769 // Event parsing.
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1770 while (1) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1771 // get next char, executing style override
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1772 // this affects render_context
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1773 do {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1774 code = get_next_char(render_priv, &p);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1775 if (render_priv->state.drawing_mode && code)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1776 ass_drawing_add_char(drawing, (char) code);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1777 } while (code && render_priv->state.drawing_mode); // skip everything in drawing mode
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29178
diff changeset
1778
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1779 // Parse drawing
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1780 if (drawing->i) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1781 drawing->scale_x = render_priv->state.scale_x *
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1782 render_priv->font_scale_x *
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1783 render_priv->font_scale;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1784 drawing->scale_y = render_priv->state.scale_y *
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1785 render_priv->font_scale;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1786 ass_drawing_hash(drawing);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1787 p--;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1788 code = -1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1789 }
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1790
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1791 // face could have been changed in get_next_char
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1792 if (!render_priv->state.font) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1793 free_render_context(render_priv);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1794 return 1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1795 }
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1796
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1797 if (code == 0)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1798 break;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1799
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1800 if (text_info->length >= text_info->max_glyphs) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1801 // Raise maximum number of glyphs
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1802 text_info->max_glyphs *= 2;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1803 text_info->glyphs =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1804 realloc(text_info->glyphs,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1805 sizeof(GlyphInfo) * text_info->max_glyphs);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1806 }
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1807
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1808 // Add kerning to pen
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1809 if (kern && previous && code && !drawing->hash) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1810 FT_Vector delta;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1811 delta =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1812 ass_font_get_kerning(render_priv->state.font, previous,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1813 code);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1814 pen.x += delta.x * render_priv->state.scale_x
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1815 * render_priv->font_scale_x;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1816 pen.y += delta.y * render_priv->state.scale_y
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1817 * render_priv->font_scale_x;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1818 }
28787
facfee07c704 Support for subpixel accuracy of 3 bits for \pos and \move.
greg
parents: 28785
diff changeset
1819
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1820 ass_font_set_transform(render_priv->state.font,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1821 render_priv->state.scale_x *
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1822 render_priv->font_scale_x,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1823 render_priv->state.scale_y, NULL);
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1824
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1825 get_outline_glyph(render_priv, code,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1826 text_info->glyphs + text_info->length, drawing);
23021
a81c390d4a22 Move outline glyph generation to a separate function, using outline glyph
eugeni
parents: 23017
diff changeset
1827
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1828 // Add additional space after italic to non-italic style changes
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1829 if (text_info->length &&
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1830 text_info->glyphs[text_info->length - 1].hash_key.italic &&
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1831 !render_priv->state.italic) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1832 int back = text_info->length - 1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1833 GlyphInfo *og = &text_info->glyphs[back];
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1834 while (back && og->bbox.xMax - og->bbox.xMin == 0
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1835 && og->hash_key.italic)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1836 og = &text_info->glyphs[--back];
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1837 if (og->bbox.xMax > og->advance.x) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1838 // The FreeType oblique slants by 6/16
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1839 pen.x += og->bbox.yMax * 0.375;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1840 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1841 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29178
diff changeset
1842
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1843 text_info->glyphs[text_info->length].pos.x = pen.x;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1844 text_info->glyphs[text_info->length].pos.y = pen.y;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29178
diff changeset
1845
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1846 pen.x += text_info->glyphs[text_info->length].advance.x;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1847 pen.x += double_to_d6(render_priv->state.hspacing *
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1848 render_priv->font_scale
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1849 * render_priv->state.scale_x);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1850 pen.y += text_info->glyphs[text_info->length].advance.y;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1851 pen.y += (render_priv->state.fay * render_priv->state.scale_y) *
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1852 text_info->glyphs[text_info->length].advance.x;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1853
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1854 previous = code;
21614
5d2ca7ca18b5 Move ascender, descender, and kerning computation to ass_font.c.
eugeni
parents: 21506
diff changeset
1855
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1856 text_info->glyphs[text_info->length].symbol = code;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1857 text_info->glyphs[text_info->length].linebreak = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1858 for (i = 0; i < 4; ++i) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1859 uint32_t clr = render_priv->state.c[i];
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1860 change_alpha(&clr,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1861 mult_alpha(_a(clr), render_priv->state.fade), 1.);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1862 text_info->glyphs[text_info->length].c[i] = clr;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1863 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1864 text_info->glyphs[text_info->length].effect_type =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1865 render_priv->state.effect_type;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1866 text_info->glyphs[text_info->length].effect_timing =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1867 render_priv->state.effect_timing;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1868 text_info->glyphs[text_info->length].effect_skip_timing =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1869 render_priv->state.effect_skip_timing;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1870 text_info->glyphs[text_info->length].be = render_priv->state.be;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1871 text_info->glyphs[text_info->length].blur = render_priv->state.blur;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1872 text_info->glyphs[text_info->length].shadow_x =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1873 render_priv->state.shadow_x;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1874 text_info->glyphs[text_info->length].shadow_y =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1875 render_priv->state.shadow_y;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1876 text_info->glyphs[text_info->length].frx = render_priv->state.frx;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1877 text_info->glyphs[text_info->length].fry = render_priv->state.fry;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1878 text_info->glyphs[text_info->length].frz = render_priv->state.frz;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1879 text_info->glyphs[text_info->length].fax = render_priv->state.fax;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1880 text_info->glyphs[text_info->length].fay = render_priv->state.fay;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1881 if (drawing->hash) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1882 text_info->glyphs[text_info->length].asc = drawing->asc;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1883 text_info->glyphs[text_info->length].desc = drawing->desc;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1884 } else {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1885 ass_font_get_asc_desc(render_priv->state.font, code,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1886 &text_info->glyphs[text_info->length].asc,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1887 &text_info->glyphs[text_info->length].desc);
21614
5d2ca7ca18b5 Move ascender, descender, and kerning computation to ass_font.c.
eugeni
parents: 21506
diff changeset
1888
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1889 text_info->glyphs[text_info->length].asc *=
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1890 render_priv->state.scale_y;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1891 text_info->glyphs[text_info->length].desc *=
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1892 render_priv->state.scale_y;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1893 }
19716
e4e492fcc2f7 Bugfix: timing for empty karaoke words was lost, resulting
eugeni
parents: 19693
diff changeset
1894
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1895 // fill bitmap_hash_key
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1896 if (!drawing->hash) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1897 text_info->glyphs[text_info->length].hash_key.font =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1898 render_priv->state.font;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1899 text_info->glyphs[text_info->length].hash_key.size =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1900 render_priv->state.font_size;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1901 text_info->glyphs[text_info->length].hash_key.bold =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1902 render_priv->state.bold;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1903 text_info->glyphs[text_info->length].hash_key.italic =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1904 render_priv->state.italic;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1905 } else
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1906 text_info->glyphs[text_info->length].hash_key.drawing_hash =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1907 drawing->hash;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1908 text_info->glyphs[text_info->length].hash_key.ch = code;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1909 text_info->glyphs[text_info->length].hash_key.outline.x =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1910 double_to_d16(render_priv->state.border_x);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1911 text_info->glyphs[text_info->length].hash_key.outline.y =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1912 double_to_d16(render_priv->state.border_y);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1913 text_info->glyphs[text_info->length].hash_key.scale_x =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1914 double_to_d16(render_priv->state.scale_x);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1915 text_info->glyphs[text_info->length].hash_key.scale_y =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1916 double_to_d16(render_priv->state.scale_y);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1917 text_info->glyphs[text_info->length].hash_key.frx =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1918 rot_key(render_priv->state.frx);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1919 text_info->glyphs[text_info->length].hash_key.fry =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1920 rot_key(render_priv->state.fry);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1921 text_info->glyphs[text_info->length].hash_key.frz =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1922 rot_key(render_priv->state.frz);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1923 text_info->glyphs[text_info->length].hash_key.fax =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1924 double_to_d16(render_priv->state.fax);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1925 text_info->glyphs[text_info->length].hash_key.fay =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1926 double_to_d16(render_priv->state.fay);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1927 text_info->glyphs[text_info->length].hash_key.advance.x = pen.x;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1928 text_info->glyphs[text_info->length].hash_key.advance.y = pen.y;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1929 text_info->glyphs[text_info->length].hash_key.be =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1930 render_priv->state.be;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1931 text_info->glyphs[text_info->length].hash_key.blur =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1932 render_priv->state.blur;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1933 text_info->glyphs[text_info->length].hash_key.border_style =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1934 render_priv->state.style->BorderStyle;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1935 text_info->glyphs[text_info->length].hash_key.shadow_offset.x =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1936 double_to_d6(
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1937 render_priv->state.shadow_x * render_priv->border_scale -
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1938 (int) (render_priv->state.shadow_x *
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1939 render_priv->border_scale));
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1940 text_info->glyphs[text_info->length].hash_key.shadow_offset.y =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1941 double_to_d6(
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1942 render_priv->state.shadow_y * render_priv->border_scale -
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1943 (int) (render_priv->state.shadow_y *
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1944 render_priv->border_scale));
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1945 text_info->glyphs[text_info->length].hash_key.flags =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1946 render_priv->state.flags;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29178
diff changeset
1947
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1948 text_info->length++;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29178
diff changeset
1949
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1950 render_priv->state.effect_type = EF_NONE;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1951 render_priv->state.effect_timing = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1952 render_priv->state.effect_skip_timing = 0;
19931
399bb1fcdc94 Move variable declaration to a more deeply nested block. It is not used outside of it.
eugeni
parents: 19919
diff changeset
1953
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1954 if (drawing->hash) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1955 ass_drawing_free(drawing);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1956 drawing = render_priv->state.drawing =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1957 ass_drawing_new(render_priv->fontconfig_priv,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1958 render_priv->state.font,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1959 render_priv->settings.hinting,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1960 render_priv->ftlibrary);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1961 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1962 }
19556
c7057724ba8c Transition effects support.
eugeni
parents: 19539
diff changeset
1963
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1964
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1965 if (text_info->length == 0) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1966 // no valid symbols in the event; this can be smth like {comment}
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1967 free_render_context(render_priv);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1968 return 1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1969 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1970 // depends on glyph x coordinates being monotonous, so it should be done before line wrap
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1971 process_karaoke_effects(render_priv);
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1972
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1973 // alignments
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1974 alignment = render_priv->state.alignment;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1975 halign = alignment & 3;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1976 valign = alignment & 12;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1977
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1978 MarginL =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1979 (event->MarginL) ? event->MarginL : render_priv->state.style->
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1980 MarginL;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1981 MarginR =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1982 (event->MarginR) ? event->MarginR : render_priv->state.style->
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1983 MarginR;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1984 MarginV =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1985 (event->MarginV) ? event->MarginV : render_priv->state.style->
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1986 MarginV;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1987
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1988 if (render_priv->state.evt_type != EVENT_HSCROLL) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1989 double max_text_width;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1990
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1991 // calculate max length of a line
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1992 max_text_width =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1993 x2scr(render_priv,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1994 render_priv->track->PlayResX - MarginR) -
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1995 x2scr(render_priv, MarginL);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29178
diff changeset
1996
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1997 // rearrange text in several lines
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
1998 wrap_lines_smart(render_priv, max_text_width);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29178
diff changeset
1999
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2000 // align text
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2001 last_break = -1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2002 for (i = 1; i < text_info->length + 1; ++i) { // (text_info->length + 1) is the end of the last line
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2003 if ((i == text_info->length)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2004 || text_info->glyphs[i].linebreak) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2005 double width, shift = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2006 GlyphInfo *first_glyph =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2007 text_info->glyphs + last_break + 1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2008 GlyphInfo *last_glyph = text_info->glyphs + i - 1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2009
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2010 while (first_glyph < last_glyph && first_glyph->skip)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2011 first_glyph++;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2012
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2013 while ((last_glyph > first_glyph)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2014 && ((last_glyph->symbol == '\n')
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2015 || (last_glyph->symbol == 0)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2016 || (last_glyph->skip)))
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2017 last_glyph--;
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
2018
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2019 width = d6_to_double(
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2020 last_glyph->pos.x + last_glyph->advance.x -
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2021 first_glyph->pos.x);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2022 if (halign == HALIGN_LEFT) { // left aligned, no action
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2023 shift = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2024 } else if (halign == HALIGN_RIGHT) { // right aligned
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2025 shift = max_text_width - width;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2026 } else if (halign == HALIGN_CENTER) { // centered
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2027 shift = (max_text_width - width) / 2.0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2028 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2029 for (j = last_break + 1; j < i; ++j) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2030 text_info->glyphs[j].pos.x += double_to_d6(shift);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2031 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2032 last_break = i - 1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2033 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2034 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2035 } else { // render_priv->state.evt_type == EVENT_HSCROLL
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2036 measure_text(render_priv);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2037 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2038
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2039 // determing text bounding box
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2040 compute_string_bbox(text_info, &bbox);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2041
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2042 // determine device coordinates for text
19556
c7057724ba8c Transition effects support.
eugeni
parents: 19539
diff changeset
2043
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2044 // x coordinate for everything except positioned events
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2045 if (render_priv->state.evt_type == EVENT_NORMAL ||
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2046 render_priv->state.evt_type == EVENT_VSCROLL) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2047 device_x = x2scr(render_priv, MarginL);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2048 } else if (render_priv->state.evt_type == EVENT_HSCROLL) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2049 if (render_priv->state.scroll_direction == SCROLL_RL)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2050 device_x =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2051 x2scr(render_priv,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2052 render_priv->track->PlayResX -
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2053 render_priv->state.scroll_shift);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2054 else if (render_priv->state.scroll_direction == SCROLL_LR)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2055 device_x =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2056 x2scr(render_priv,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2057 render_priv->state.scroll_shift) - (bbox.xMax -
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2058 bbox.xMin);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2059 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2060 // y coordinate for everything except positioned events
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2061 if (render_priv->state.evt_type == EVENT_NORMAL ||
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2062 render_priv->state.evt_type == EVENT_HSCROLL) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2063 if (valign == VALIGN_TOP) { // toptitle
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2064 device_y =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2065 y2scr_top(render_priv,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2066 MarginV) + text_info->lines[0].asc;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2067 } else if (valign == VALIGN_CENTER) { // midtitle
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2068 double scr_y =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2069 y2scr(render_priv, render_priv->track->PlayResY / 2.0);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2070 device_y = scr_y - (bbox.yMax + bbox.yMin) / 2.0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2071 } else { // subtitle
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2072 double scr_y;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2073 if (valign != VALIGN_SUB)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2074 ass_msg(render_priv->library, MSGL_V,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2075 "Invalid valign, supposing 0 (subtitle)");
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2076 scr_y =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2077 y2scr_sub(render_priv,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2078 render_priv->track->PlayResY - MarginV);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2079 device_y = scr_y;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2080 device_y -= text_info->height;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2081 device_y += text_info->lines[0].asc;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2082 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2083 } else if (render_priv->state.evt_type == EVENT_VSCROLL) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2084 if (render_priv->state.scroll_direction == SCROLL_TB)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2085 device_y =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2086 y2scr(render_priv,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2087 render_priv->state.clip_y0 +
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2088 render_priv->state.scroll_shift) - (bbox.yMax -
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2089 bbox.yMin);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2090 else if (render_priv->state.scroll_direction == SCROLL_BT)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2091 device_y =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2092 y2scr(render_priv,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2093 render_priv->state.clip_y1 -
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2094 render_priv->state.scroll_shift);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2095 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2096 // positioned events are totally different
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2097 if (render_priv->state.evt_type == EVENT_POSITIONED) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2098 double base_x = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2099 double base_y = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2100 ass_msg(render_priv->library, MSGL_DBG2, "positioned event at %f, %f",
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2101 render_priv->state.pos_x, render_priv->state.pos_y);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2102 get_base_point(&bbox, alignment, &base_x, &base_y);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2103 device_x =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2104 x2scr_pos(render_priv, render_priv->state.pos_x) - base_x;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2105 device_y =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2106 y2scr_pos(render_priv, render_priv->state.pos_y) - base_y;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2107 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2108 // fix clip coordinates (they depend on alignment)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2109 if (render_priv->state.evt_type == EVENT_NORMAL ||
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2110 render_priv->state.evt_type == EVENT_HSCROLL ||
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2111 render_priv->state.evt_type == EVENT_VSCROLL) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2112 render_priv->state.clip_x0 =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2113 x2scr(render_priv, render_priv->state.clip_x0);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2114 render_priv->state.clip_x1 =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2115 x2scr(render_priv, render_priv->state.clip_x1);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2116 if (valign == VALIGN_TOP) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2117 render_priv->state.clip_y0 =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2118 y2scr_top(render_priv, render_priv->state.clip_y0);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2119 render_priv->state.clip_y1 =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2120 y2scr_top(render_priv, render_priv->state.clip_y1);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2121 } else if (valign == VALIGN_CENTER) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2122 render_priv->state.clip_y0 =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2123 y2scr(render_priv, render_priv->state.clip_y0);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2124 render_priv->state.clip_y1 =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2125 y2scr(render_priv, render_priv->state.clip_y1);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2126 } else if (valign == VALIGN_SUB) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2127 render_priv->state.clip_y0 =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2128 y2scr_sub(render_priv, render_priv->state.clip_y0);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2129 render_priv->state.clip_y1 =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2130 y2scr_sub(render_priv, render_priv->state.clip_y1);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2131 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2132 } else if (render_priv->state.evt_type == EVENT_POSITIONED) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2133 render_priv->state.clip_x0 =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2134 x2scr_pos(render_priv, render_priv->state.clip_x0);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2135 render_priv->state.clip_x1 =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2136 x2scr_pos(render_priv, render_priv->state.clip_x1);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2137 render_priv->state.clip_y0 =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2138 y2scr_pos(render_priv, render_priv->state.clip_y0);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2139 render_priv->state.clip_y1 =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2140 y2scr_pos(render_priv, render_priv->state.clip_y1);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2141 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2142 // calculate rotation parameters
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2143 {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2144 DVector center;
29383
e9cab9f6ed62 Make sure clip coordinates are inside the screen area.
eugeni
parents: 29382
diff changeset
2145
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2146 if (render_priv->state.have_origin) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2147 center.x = x2scr(render_priv, render_priv->state.org_x);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2148 center.y = y2scr(render_priv, render_priv->state.org_y);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2149 } else {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2150 double bx = 0., by = 0.;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2151 get_base_point(&bbox, alignment, &bx, &by);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2152 center.x = device_x + bx;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2153 center.y = device_y + by;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2154 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2155
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2156 for (i = 0; i < text_info->length; ++i) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2157 GlyphInfo *info = text_info->glyphs + i;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29178
diff changeset
2158
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2159 if (info->hash_key.frx || info->hash_key.fry
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2160 || info->hash_key.frz || info->hash_key.fax
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2161 || info->hash_key.fay) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2162 info->hash_key.shift_x = info->pos.x + double_to_d6(device_x - center.x);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2163 info->hash_key.shift_y =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2164 -(info->pos.y + double_to_d6(device_y - center.y));
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2165 } else {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2166 info->hash_key.shift_x = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2167 info->hash_key.shift_y = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2168 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2169 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2170 }
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
2171
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2172 // convert glyphs to bitmaps
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2173 for (i = 0; i < text_info->length; ++i) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2174 GlyphInfo *g = text_info->glyphs + i;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2175 g->hash_key.advance.x =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2176 double_to_d6(device_x - (int) device_x +
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2177 d6_to_double(g->pos.x & SUBPIXEL_MASK)) & ~SUBPIXEL_ACCURACY;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2178 g->hash_key.advance.y =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2179 double_to_d6(device_y - (int) device_y +
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2180 d6_to_double(g->pos.y & SUBPIXEL_MASK)) & ~SUBPIXEL_ACCURACY;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2181 get_bitmap_glyph(render_priv, text_info->glyphs + i);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2182 }
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
2183
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2184 memset(event_images, 0, sizeof(*event_images));
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2185 event_images->top = device_y - text_info->lines[0].asc;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2186 event_images->height = text_info->height;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2187 event_images->left = device_x + bbox.xMin + 0.5;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2188 event_images->width = bbox.xMax - bbox.xMin + 0.5;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2189 event_images->detect_collisions = render_priv->state.detect_collisions;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2190 event_images->shift_direction = (valign == VALIGN_TOP) ? 1 : -1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2191 event_images->event = event;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2192 event_images->imgs = render_text(render_priv, (int) device_x, (int) device_y);
23174
29b5596adecd Move get_bitmap_glyph() call to a separate loop.
eugeni
parents: 23173
diff changeset
2193
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2194 free_render_context(render_priv);
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
2195
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2196 return 0;
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
2197 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
2198
21506
8174acbf0633 Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents: 21460
diff changeset
2199 /**
8174acbf0633 Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents: 21460
diff changeset
2200 * \brief deallocate image list
8174acbf0633 Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents: 21460
diff changeset
2201 * \param img list pointer
8174acbf0633 Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents: 21460
diff changeset
2202 */
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2203 static void ass_free_images(ASS_Image *img)
21506
8174acbf0633 Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents: 21460
diff changeset
2204 {
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2205 while (img) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2206 ASS_Image *next = img->next;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2207 free(img);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2208 img = next;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2209 }
21506
8174acbf0633 Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents: 21460
diff changeset
2210 }
8174acbf0633 Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents: 21460
diff changeset
2211
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2212 static void ass_reconfigure(ASS_Renderer *priv)
20446
e8adc3778348 Split ass_configure() into several smaller functions.
eugeni
parents: 20320
diff changeset
2213 {
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2214 priv->render_id++;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2215 priv->cache.glyph_cache =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2216 ass_glyph_cache_reset(priv->cache.glyph_cache);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2217 priv->cache.bitmap_cache =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2218 ass_bitmap_cache_reset(priv->cache.bitmap_cache);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2219 priv->cache.composite_cache =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2220 ass_composite_cache_reset(priv->cache.composite_cache);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2221 ass_free_images(priv->prev_images_root);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2222 priv->prev_images_root = 0;
20446
e8adc3778348 Split ass_configure() into several smaller functions.
eugeni
parents: 20320
diff changeset
2223 }
e8adc3778348 Split ass_configure() into several smaller functions.
eugeni
parents: 20320
diff changeset
2224
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2225 void ass_set_frame_size(ASS_Renderer *priv, int w, int h)
20446
e8adc3778348 Split ass_configure() into several smaller functions.
eugeni
parents: 20320
diff changeset
2226 {
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2227 if (priv->settings.frame_width != w || priv->settings.frame_height != h) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2228 priv->settings.frame_width = w;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2229 priv->settings.frame_height = h;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2230 if (priv->settings.aspect == 0.) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2231 priv->settings.aspect = ((double) w) / h;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2232 priv->settings.storage_aspect = ((double) w) / h;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2233 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2234 ass_reconfigure(priv);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2235 }
20446
e8adc3778348 Split ass_configure() into several smaller functions.
eugeni
parents: 20320
diff changeset
2236 }
e8adc3778348 Split ass_configure() into several smaller functions.
eugeni
parents: 20320
diff changeset
2237
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2238 void ass_set_margins(ASS_Renderer *priv, int t, int b, int l, int r)
20446
e8adc3778348 Split ass_configure() into several smaller functions.
eugeni
parents: 20320
diff changeset
2239 {
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2240 if (priv->settings.left_margin != l ||
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2241 priv->settings.right_margin != r ||
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2242 priv->settings.top_margin != t
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2243 || priv->settings.bottom_margin != b) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2244 priv->settings.left_margin = l;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2245 priv->settings.right_margin = r;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2246 priv->settings.top_margin = t;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2247 priv->settings.bottom_margin = b;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2248 ass_reconfigure(priv);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2249 }
20446
e8adc3778348 Split ass_configure() into several smaller functions.
eugeni
parents: 20320
diff changeset
2250 }
e8adc3778348 Split ass_configure() into several smaller functions.
eugeni
parents: 20320
diff changeset
2251
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2252 void ass_set_use_margins(ASS_Renderer *priv, int use)
20446
e8adc3778348 Split ass_configure() into several smaller functions.
eugeni
parents: 20320
diff changeset
2253 {
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2254 priv->settings.use_margins = use;
20446
e8adc3778348 Split ass_configure() into several smaller functions.
eugeni
parents: 20320
diff changeset
2255 }
19638
a3473d990fed Better collision detection algorithm. The idea is to keep a subtitle in place
eugeni
parents: 19636
diff changeset
2256
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2257 void ass_set_aspect_ratio(ASS_Renderer *priv, double dar, double sar)
20446
e8adc3778348 Split ass_configure() into several smaller functions.
eugeni
parents: 20320
diff changeset
2258 {
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2259 if (priv->settings.aspect != dar || priv->settings.storage_aspect != sar) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2260 priv->settings.aspect = dar;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2261 priv->settings.storage_aspect = sar;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2262 ass_reconfigure(priv);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2263 }
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
2264 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
2265
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2266 void ass_set_font_scale(ASS_Renderer *priv, double font_scale)
23134
1de2a46a0987 Add -ass-hinting option for setting font hinting method.
eugeni
parents: 23133
diff changeset
2267 {
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2268 if (priv->settings.font_size_coeff != font_scale) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2269 priv->settings.font_size_coeff = font_scale;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2270 ass_reconfigure(priv);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2271 }
23134
1de2a46a0987 Add -ass-hinting option for setting font hinting method.
eugeni
parents: 23133
diff changeset
2272 }
1de2a46a0987 Add -ass-hinting option for setting font hinting method.
eugeni
parents: 23133
diff changeset
2273
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2274 void ass_set_hinting(ASS_Renderer *priv, ASS_Hinting ht)
24554
ffc2c7164bc0 Enable ass_line_spacing option.
eugeni
parents: 23328
diff changeset
2275 {
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2276 if (priv->settings.hinting != ht) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2277 priv->settings.hinting = ht;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2278 ass_reconfigure(priv);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2279 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2280 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2281
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2282 void ass_set_line_spacing(ASS_Renderer *priv, double line_spacing)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2283 {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2284 priv->settings.line_spacing = line_spacing;
24554
ffc2c7164bc0 Enable ass_line_spacing option.
eugeni
parents: 23328
diff changeset
2285 }
ffc2c7164bc0 Enable ass_line_spacing option.
eugeni
parents: 23328
diff changeset
2286
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2287 void ass_set_fonts(ASS_Renderer *priv, const char *default_font,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2288 const char *default_family, int fc, const char *config,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2289 int update)
20446
e8adc3778348 Split ass_configure() into several smaller functions.
eugeni
parents: 20320
diff changeset
2290 {
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2291 free(priv->settings.default_font);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2292 free(priv->settings.default_family);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2293 priv->settings.default_font = default_font ? strdup(default_font) : 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2294 priv->settings.default_family =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2295 default_family ? strdup(default_family) : 0;
20446
e8adc3778348 Split ass_configure() into several smaller functions.
eugeni
parents: 20320
diff changeset
2296
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2297 if (priv->fontconfig_priv)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2298 fontconfig_done(priv->fontconfig_priv);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2299 priv->fontconfig_priv =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2300 fontconfig_init(priv->library, priv->ftlibrary, default_family,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2301 default_font, fc, config, update);
20446
e8adc3778348 Split ass_configure() into several smaller functions.
eugeni
parents: 20320
diff changeset
2302 }
e8adc3778348 Split ass_configure() into several smaller functions.
eugeni
parents: 20320
diff changeset
2303
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2304 int ass_fonts_update(ASS_Renderer *render_priv)
26582
62ac4f8062ee Remove libass dependency on global font_fontconfig variable.
eugeni
parents: 26033
diff changeset
2305 {
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2306 return fontconfig_update(render_priv->fontconfig_priv);
26582
62ac4f8062ee Remove libass dependency on global font_fontconfig variable.
eugeni
parents: 26033
diff changeset
2307 }
62ac4f8062ee Remove libass dependency on global font_fontconfig variable.
eugeni
parents: 26033
diff changeset
2308
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
2309 /**
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
2310 * \brief Start a new frame
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
2311 */
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2312 static int
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2313 ass_start_frame(ASS_Renderer *render_priv, ASS_Track *track,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2314 long long now)
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
2315 {
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2316 ASS_Settings *settings_priv = &render_priv->settings;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2317 CacheStore *cache = &render_priv->cache;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2318
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2319 if (!render_priv->settings.frame_width
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2320 && !render_priv->settings.frame_height)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2321 return 1; // library not initialized
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2322
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2323 if (render_priv->library != track->library)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2324 return 1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2325
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2326 free_list_clear(render_priv);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2327
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2328 if (track->n_events == 0)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2329 return 1; // nothing to do
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
2330
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2331 render_priv->width = settings_priv->frame_width;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2332 render_priv->height = settings_priv->frame_height;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2333 render_priv->orig_width =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2334 settings_priv->frame_width - settings_priv->left_margin -
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2335 settings_priv->right_margin;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2336 render_priv->orig_height =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2337 settings_priv->frame_height - settings_priv->top_margin -
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2338 settings_priv->bottom_margin;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2339 render_priv->orig_width_nocrop =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2340 settings_priv->frame_width - FFMAX(settings_priv->left_margin,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2341 0) -
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2342 FFMAX(settings_priv->right_margin, 0);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2343 render_priv->orig_height_nocrop =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2344 settings_priv->frame_height - FFMAX(settings_priv->top_margin,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2345 0) -
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2346 FFMAX(settings_priv->bottom_margin, 0);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2347 render_priv->track = track;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2348 render_priv->time = now;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29178
diff changeset
2349
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2350 ass_lazy_track_init(render_priv);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2351
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2352 render_priv->font_scale = settings_priv->font_size_coeff *
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2353 render_priv->orig_height / render_priv->track->PlayResY;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2354 if (render_priv->track->ScaledBorderAndShadow)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2355 render_priv->border_scale =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2356 ((double) render_priv->orig_height) /
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2357 render_priv->track->PlayResY;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2358 else
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2359 render_priv->border_scale = 1.;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2360
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2361 // PAR correction
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2362 render_priv->font_scale_x = render_priv->settings.aspect /
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2363 render_priv->settings.storage_aspect;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2364
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2365 render_priv->prev_images_root = render_priv->images_root;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2366 render_priv->images_root = 0;
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
2367
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2368 if (cache->bitmap_cache->cache_size > cache->bitmap_max_size) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2369 ass_msg(render_priv->library, MSGL_V,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2370 "Hitting hard bitmap cache limit (was: %ld bytes), "
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2371 "resetting.", (long) cache->bitmap_cache->cache_size);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2372 cache->bitmap_cache = ass_bitmap_cache_reset(cache->bitmap_cache);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2373 cache->composite_cache = ass_composite_cache_reset(
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2374 cache->composite_cache);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2375 ass_free_images(render_priv->prev_images_root);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2376 render_priv->prev_images_root = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2377 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29178
diff changeset
2378
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2379 if (cache->glyph_cache->count > cache->glyph_max) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2380 ass_msg(render_priv->library, MSGL_V,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2381 "Hitting hard glyph cache limit (was: %ld glyphs), resetting.",
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2382 (long) cache->glyph_cache->count);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2383 cache->glyph_cache = ass_glyph_cache_reset(cache->glyph_cache);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2384 }
19825
f351a3fc3e42 Make font outline width proportional to movie resolution.
eugeni
parents: 19716
diff changeset
2385
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2386 return 0;
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
2387 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
2388
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2389 static int cmp_event_layer(const void *p1, const void *p2)
19638
a3473d990fed Better collision detection algorithm. The idea is to keep a subtitle in place
eugeni
parents: 19636
diff changeset
2390 {
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2391 ASS_Event *e1 = ((EventImages *) p1)->event;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2392 ASS_Event *e2 = ((EventImages *) p2)->event;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2393 if (e1->Layer < e2->Layer)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2394 return -1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2395 if (e1->Layer > e2->Layer)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2396 return 1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2397 if (e1->ReadOrder < e2->ReadOrder)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2398 return -1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2399 if (e1->ReadOrder > e2->ReadOrder)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2400 return 1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2401 return 0;
19638
a3473d990fed Better collision detection algorithm. The idea is to keep a subtitle in place
eugeni
parents: 19636
diff changeset
2402 }
a3473d990fed Better collision detection algorithm. The idea is to keep a subtitle in place
eugeni
parents: 19636
diff changeset
2403
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2404 static ASS_RenderPriv *get_render_priv(ASS_Renderer *render_priv,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2405 ASS_Event *event)
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
2406 {
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2407 if (!event->render_priv)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2408 event->render_priv = calloc(1, sizeof(ASS_RenderPriv));
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2409 if (render_priv->render_id != event->render_priv->render_id) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2410 memset(event->render_priv, 0, sizeof(ASS_RenderPriv));
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2411 event->render_priv->render_id = render_priv->render_id;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2412 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2413
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2414 return event->render_priv;
19638
a3473d990fed Better collision detection algorithm. The idea is to keep a subtitle in place
eugeni
parents: 19636
diff changeset
2415 }
a3473d990fed Better collision detection algorithm. The idea is to keep a subtitle in place
eugeni
parents: 19636
diff changeset
2416
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2417 static int overlap(Segment *s1, Segment *s2)
19638
a3473d990fed Better collision detection algorithm. The idea is to keep a subtitle in place
eugeni
parents: 19636
diff changeset
2418 {
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2419 if (s1->a >= s2->b || s2->a >= s1->b ||
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2420 s1->ha >= s2->hb || s2->ha >= s1->hb)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2421 return 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2422 return 1;
19638
a3473d990fed Better collision detection algorithm. The idea is to keep a subtitle in place
eugeni
parents: 19636
diff changeset
2423 }
a3473d990fed Better collision detection algorithm. The idea is to keep a subtitle in place
eugeni
parents: 19636
diff changeset
2424
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2425 static int cmp_segment(const void *p1, const void *p2)
19638
a3473d990fed Better collision detection algorithm. The idea is to keep a subtitle in place
eugeni
parents: 19636
diff changeset
2426 {
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2427 return ((Segment *) p1)->a - ((Segment *) p2)->a;
19638
a3473d990fed Better collision detection algorithm. The idea is to keep a subtitle in place
eugeni
parents: 19636
diff changeset
2428 }
a3473d990fed Better collision detection algorithm. The idea is to keep a subtitle in place
eugeni
parents: 19636
diff changeset
2429
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2430 static void
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2431 shift_event(ASS_Renderer *render_priv, EventImages *ei, int shift)
19638
a3473d990fed Better collision detection algorithm. The idea is to keep a subtitle in place
eugeni
parents: 19636
diff changeset
2432 {
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2433 ASS_Image *cur = ei->imgs;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2434 while (cur) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2435 cur->dst_y += shift;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2436 // clip top and bottom
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2437 if (cur->dst_y < 0) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2438 int clip = -cur->dst_y;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2439 cur->h -= clip;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2440 cur->bitmap += clip * cur->stride;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2441 cur->dst_y = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2442 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2443 if (cur->dst_y + cur->h >= render_priv->height) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2444 int clip = cur->dst_y + cur->h - render_priv->height;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2445 cur->h -= clip;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2446 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2447 if (cur->h <= 0) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2448 cur->h = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2449 cur->dst_y = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2450 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2451 cur = cur->next;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2452 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2453 ei->top += shift;
19638
a3473d990fed Better collision detection algorithm. The idea is to keep a subtitle in place
eugeni
parents: 19636
diff changeset
2454 }
a3473d990fed Better collision detection algorithm. The idea is to keep a subtitle in place
eugeni
parents: 19636
diff changeset
2455
a3473d990fed Better collision detection algorithm. The idea is to keep a subtitle in place
eugeni
parents: 19636
diff changeset
2456 // dir: 1 - move down
a3473d990fed Better collision detection algorithm. The idea is to keep a subtitle in place
eugeni
parents: 19636
diff changeset
2457 // -1 - move up
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2458 static int fit_segment(Segment *s, Segment *fixed, int *cnt, int dir)
19638
a3473d990fed Better collision detection algorithm. The idea is to keep a subtitle in place
eugeni
parents: 19636
diff changeset
2459 {
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2460 int i;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2461 int shift = 0;
19638
a3473d990fed Better collision detection algorithm. The idea is to keep a subtitle in place
eugeni
parents: 19636
diff changeset
2462
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2463 if (dir == 1) // move down
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2464 for (i = 0; i < *cnt; ++i) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2465 if (s->b + shift <= fixed[i].a || s->a + shift >= fixed[i].b ||
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2466 s->hb <= fixed[i].ha || s->ha >= fixed[i].hb)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2467 continue;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2468 shift = fixed[i].b - s->a;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2469 } else // dir == -1, move up
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2470 for (i = *cnt - 1; i >= 0; --i) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2471 if (s->b + shift <= fixed[i].a || s->a + shift >= fixed[i].b ||
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2472 s->hb <= fixed[i].ha || s->ha >= fixed[i].hb)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2473 continue;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2474 shift = fixed[i].a - s->b;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2475 }
21097
77316737de63 Fix collision detection. The old method tried to avoid gaps between subtitles
eugeni
parents: 21066
diff changeset
2476
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2477 fixed[*cnt].a = s->a + shift;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2478 fixed[*cnt].b = s->b + shift;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2479 fixed[*cnt].ha = s->ha;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2480 fixed[*cnt].hb = s->hb;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2481 (*cnt)++;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2482 qsort(fixed, *cnt, sizeof(Segment), cmp_segment);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29178
diff changeset
2483
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2484 return shift;
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
2485 }
19638
a3473d990fed Better collision detection algorithm. The idea is to keep a subtitle in place
eugeni
parents: 19636
diff changeset
2486
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2487 static void
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2488 fix_collisions(ASS_Renderer *render_priv, EventImages *imgs, int cnt)
19638
a3473d990fed Better collision detection algorithm. The idea is to keep a subtitle in place
eugeni
parents: 19636
diff changeset
2489 {
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2490 Segment *used = malloc(cnt * sizeof(*used));
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2491 int cnt_used = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2492 int i, j;
19638
a3473d990fed Better collision detection algorithm. The idea is to keep a subtitle in place
eugeni
parents: 19636
diff changeset
2493
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2494 // fill used[] with fixed events
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2495 for (i = 0; i < cnt; ++i) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2496 ASS_RenderPriv *priv;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2497 if (!imgs[i].detect_collisions)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2498 continue;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2499 priv = get_render_priv(render_priv, imgs[i].event);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2500 if (priv->height > 0) { // it's a fixed event
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2501 Segment s;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2502 s.a = priv->top;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2503 s.b = priv->top + priv->height;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2504 s.ha = priv->left;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2505 s.hb = priv->left + priv->width;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2506 if (priv->height != imgs[i].height) { // no, it's not
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2507 ass_msg(render_priv->library, MSGL_WARN,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2508 "Warning! Event height has changed");
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2509 priv->top = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2510 priv->height = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2511 priv->left = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2512 priv->width = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2513 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2514 for (j = 0; j < cnt_used; ++j)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2515 if (overlap(&s, used + j)) { // no, it's not
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2516 priv->top = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2517 priv->height = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2518 priv->left = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2519 priv->width = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2520 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2521 if (priv->height > 0) { // still a fixed event
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2522 used[cnt_used].a = priv->top;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2523 used[cnt_used].b = priv->top + priv->height;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2524 used[cnt_used].ha = priv->left;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2525 used[cnt_used].hb = priv->left + priv->width;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2526 cnt_used++;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2527 shift_event(render_priv, imgs + i, priv->top - imgs[i].top);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2528 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2529 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2530 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2531 qsort(used, cnt_used, sizeof(Segment), cmp_segment);
19638
a3473d990fed Better collision detection algorithm. The idea is to keep a subtitle in place
eugeni
parents: 19636
diff changeset
2532
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2533 // try to fit other events in free spaces
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2534 for (i = 0; i < cnt; ++i) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2535 ASS_RenderPriv *priv;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2536 if (!imgs[i].detect_collisions)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2537 continue;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2538 priv = get_render_priv(render_priv, imgs[i].event);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2539 if (priv->height == 0) { // not a fixed event
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2540 int shift;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2541 Segment s;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2542 s.a = imgs[i].top;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2543 s.b = imgs[i].top + imgs[i].height;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2544 s.ha = imgs[i].left;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2545 s.hb = imgs[i].left + imgs[i].width;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2546 shift = fit_segment(&s, used, &cnt_used, imgs[i].shift_direction);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2547 if (shift)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2548 shift_event(render_priv, imgs + i, shift);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2549 // make it fixed
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2550 priv->top = imgs[i].top;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2551 priv->height = imgs[i].height;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2552 priv->left = imgs[i].left;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2553 priv->width = imgs[i].width;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2554 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29178
diff changeset
2555
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2556 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2557
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2558 free(used);
19638
a3473d990fed Better collision detection algorithm. The idea is to keep a subtitle in place
eugeni
parents: 19636
diff changeset
2559 }
a3473d990fed Better collision detection algorithm. The idea is to keep a subtitle in place
eugeni
parents: 19636
diff changeset
2560
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
2561 /**
21506
8174acbf0633 Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents: 21460
diff changeset
2562 * \brief compare two images
8174acbf0633 Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents: 21460
diff changeset
2563 * \param i1 first image
8174acbf0633 Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents: 21460
diff changeset
2564 * \param i2 second image
8174acbf0633 Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents: 21460
diff changeset
2565 * \return 0 if identical, 1 if different positions, 2 if different content
8174acbf0633 Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents: 21460
diff changeset
2566 */
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2567 static int ass_image_compare(ASS_Image *i1, ASS_Image *i2)
21506
8174acbf0633 Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents: 21460
diff changeset
2568 {
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2569 if (i1->w != i2->w)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2570 return 2;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2571 if (i1->h != i2->h)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2572 return 2;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2573 if (i1->stride != i2->stride)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2574 return 2;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2575 if (i1->color != i2->color)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2576 return 2;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2577 if (i1->bitmap != i2->bitmap)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2578 return 2;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2579 if (i1->dst_x != i2->dst_x)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2580 return 1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2581 if (i1->dst_y != i2->dst_y)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2582 return 1;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2583 return 0;
21506
8174acbf0633 Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents: 21460
diff changeset
2584 }
8174acbf0633 Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents: 21460
diff changeset
2585
8174acbf0633 Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents: 21460
diff changeset
2586 /**
8174acbf0633 Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents: 21460
diff changeset
2587 * \brief compare current and previous image list
8174acbf0633 Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents: 21460
diff changeset
2588 * \param priv library handle
8174acbf0633 Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents: 21460
diff changeset
2589 * \return 0 if identical, 1 if different positions, 2 if different content
8174acbf0633 Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents: 21460
diff changeset
2590 */
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2591 static int ass_detect_change(ASS_Renderer *priv)
21506
8174acbf0633 Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents: 21460
diff changeset
2592 {
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2593 ASS_Image *img, *img2;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2594 int diff;
21506
8174acbf0633 Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents: 21460
diff changeset
2595
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2596 img = priv->prev_images_root;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2597 img2 = priv->images_root;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2598 diff = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2599 while (img && diff < 2) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2600 ASS_Image *next, *next2;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2601 next = img->next;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2602 if (img2) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2603 int d = ass_image_compare(img, img2);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2604 if (d > diff)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2605 diff = d;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2606 next2 = img2->next;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2607 } else {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2608 // previous list is shorter
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2609 diff = 2;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2610 break;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2611 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2612 img = next;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2613 img2 = next2;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2614 }
21506
8174acbf0633 Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents: 21460
diff changeset
2615
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2616 // is the previous list longer?
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2617 if (img2)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2618 diff = 2;
21506
8174acbf0633 Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents: 21460
diff changeset
2619
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2620 return diff;
21506
8174acbf0633 Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents: 21460
diff changeset
2621 }
8174acbf0633 Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents: 21460
diff changeset
2622
8174acbf0633 Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents: 21460
diff changeset
2623 /**
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
2624 * \brief render a frame
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
2625 * \param priv library handle
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
2626 * \param track track
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
2627 * \param now current video timestamp (ms)
21506
8174acbf0633 Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents: 21460
diff changeset
2628 * \param detect_change a value describing how the new images differ from the previous ones will be written here:
8174acbf0633 Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents: 21460
diff changeset
2629 * 0 if identical, 1 if different positions, 2 if different content.
8174acbf0633 Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents: 21460
diff changeset
2630 * Can be NULL, in that case no detection is performed.
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
2631 */
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2632 ASS_Image *ass_render_frame(ASS_Renderer *priv, ASS_Track *track,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2633 long long now, int *detect_change)
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
2634 {
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2635 int i, cnt, rc;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2636 EventImages *last;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2637 ASS_Image **tail;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29178
diff changeset
2638
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2639 // init frame
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2640 rc = ass_start_frame(priv, track, now);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2641 if (rc != 0)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2642 return 0;
19638
a3473d990fed Better collision detection algorithm. The idea is to keep a subtitle in place
eugeni
parents: 19636
diff changeset
2643
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2644 // render events separately
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2645 cnt = 0;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2646 for (i = 0; i < track->n_events; ++i) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2647 ASS_Event *event = track->events + i;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2648 if ((event->Start <= now)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2649 && (now < (event->Start + event->Duration))) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2650 if (cnt >= priv->eimg_size) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2651 priv->eimg_size += 100;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2652 priv->eimg =
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2653 realloc(priv->eimg,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2654 priv->eimg_size * sizeof(EventImages));
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2655 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2656 rc = ass_render_event(priv, event, priv->eimg + cnt);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2657 if (!rc)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2658 ++cnt;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2659 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2660 }
19638
a3473d990fed Better collision detection algorithm. The idea is to keep a subtitle in place
eugeni
parents: 19636
diff changeset
2661
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2662 // sort by layer
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2663 qsort(priv->eimg, cnt, sizeof(EventImages), cmp_event_layer);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2664
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2665 // call fix_collisions for each group of events with the same layer
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2666 last = priv->eimg;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2667 for (i = 1; i < cnt; ++i)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2668 if (last->event->Layer != priv->eimg[i].event->Layer) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2669 fix_collisions(priv, last, priv->eimg + i - last);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2670 last = priv->eimg + i;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2671 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2672 if (cnt > 0)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2673 fix_collisions(priv, last, priv->eimg + cnt - last);
19638
a3473d990fed Better collision detection algorithm. The idea is to keep a subtitle in place
eugeni
parents: 19636
diff changeset
2674
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2675 // concat lists
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2676 tail = &priv->images_root;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2677 for (i = 0; i < cnt; ++i) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2678 ASS_Image *cur = priv->eimg[i].imgs;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2679 while (cur) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2680 *tail = cur;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2681 tail = &cur->next;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2682 cur = cur->next;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2683 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2684 }
21506
8174acbf0633 Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents: 21460
diff changeset
2685
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2686 if (detect_change)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2687 *detect_change = ass_detect_change(priv);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29178
diff changeset
2688
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2689 // free the previous image list
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2690 ass_free_images(priv->prev_images_root);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2691 priv->prev_images_root = 0;
21506
8174acbf0633 Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents: 21460
diff changeset
2692
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 29406
diff changeset
2693 return priv->images_root;
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
2694 }