summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDr.Smile <vabnick@gmail.com>2018-12-02 22:20:25 +0300
committerDr.Smile <vabnick@gmail.com>2019-05-19 20:21:29 +0300
commit5d03af99c6d8f43be973cb6dacb5d6dd0ada33b1 (patch)
tree9ffefbc692053d7a1c953040dbcc210819a9f959
parente8d98dafb8d4d1fd80e9d398cfbef7db1e2ccb73 (diff)
downloadlibass-5d03af99c6d8f43be973cb6dacb5d6dd0ada33b1.tar.bz2
libass-5d03af99c6d8f43be973cb6dacb5d6dd0ada33b1.tar.xz
renderer: rewrite measure_text() to correctly account for leading newlines
-rw-r--r--libass/ass_render.c53
1 files changed, 22 insertions, 31 deletions
diff --git a/libass/ass_render.c b/libass/ass_render.c
index 0a7cd77..e1cdb4f 100644
--- a/libass/ass_render.c
+++ b/libass/ass_render.c
@@ -1285,40 +1285,31 @@ get_bitmap_glyph(ASS_Renderer *render_priv, GlyphInfo *info)
static void measure_text(ASS_Renderer *render_priv)
{
TextInfo *text_info = &render_priv->text_info;
+ text_info->height = 0;
+
int cur_line = 0;
- double max_asc = 0., max_desc = 0.;
- GlyphInfo *last = NULL;
- int i;
- int empty_line = 1;
- text_info->height = 0.;
- for (i = 0; i < text_info->length + 1; ++i) {
- if ((i == text_info->length) || text_info->glyphs[i].linebreak) {
- if (empty_line && cur_line > 0 && last) {
- max_asc = d6_to_double(last->asc) / 2.0;
- max_desc = d6_to_double(last->desc) / 2.0;
- }
- text_info->lines[cur_line].asc = max_asc;
- text_info->lines[cur_line].desc = max_desc;
- text_info->height += max_asc + max_desc;
+ double scale = 0.5 / 64;
+ int max_asc = 0, max_desc = 0;
+ for (int i = 0; i < text_info->length; i++) {
+ if (text_info->glyphs[i].linebreak) {
+ text_info->lines[cur_line].asc = scale * max_asc;
+ text_info->lines[cur_line].desc = scale * max_desc;
+ text_info->height += scale * max_asc + scale * max_desc;
+ max_asc = max_desc = 0;
+ scale = 0.5 / 64;
cur_line++;
- max_asc = max_desc = 0.;
- empty_line = 1;
- }
- if (i < text_info->length) {
- GlyphInfo *cur = text_info->glyphs + i;
- if (d6_to_double(cur->asc) > max_asc)
- max_asc = d6_to_double(cur->asc);
- if (d6_to_double(cur->desc) > max_desc)
- max_desc = d6_to_double(cur->desc);
- if (cur->symbol != '\n' && cur->symbol != 0) {
- empty_line = 0;
- last = cur;
- }
}
- }
- text_info->height +=
- (text_info->n_lines -
- 1) * render_priv->settings.line_spacing;
+ GlyphInfo *cur = text_info->glyphs + i;
+ max_asc = FFMAX(max_asc, cur->asc);
+ max_desc = FFMAX(max_desc, cur->desc);
+ if (cur->symbol != '\n' && cur->symbol != 0)
+ scale = 1.0 / 64;
+ }
+ assert(cur_line == text_info->n_lines - 1);
+ text_info->lines[cur_line].asc = scale * max_asc;
+ text_info->lines[cur_line].desc = scale * max_desc;
+ text_info->height += scale * max_asc + scale * max_desc;
+ text_info->height += cur_line * render_priv->settings.line_spacing;
}
/**