diff options
-rw-r--r-- | libass/ass_cache.h | 3 | ||||
-rw-r--r-- | libass/ass_render.c | 12 |
2 files changed, 12 insertions, 3 deletions
diff --git a/libass/ass_cache.h b/libass/ass_cache.h index a0403d03fb..7ff75885b8 100644 --- a/libass/ass_cache.h +++ b/libass/ass_cache.h @@ -39,6 +39,9 @@ typedef struct bitmap_hash_key_s { unsigned scale_x, scale_y; // 16.16 int frx, fry, frz; // signed 16.16 + int shift_x, shift_y; // shift vector that was added to glyph before applying rotation + // = 0, if frx = fry = frx = 0 + // = (glyph base point) - (rotation origin), otherwise FT_Vector advance; // subpixel shift vector } bitmap_hash_key_t; diff --git a/libass/ass_render.c b/libass/ass_render.c index 44cc272ecb..d139c2e109 100644 --- a/libass/ass_render.c +++ b/libass/ass_render.c @@ -1926,9 +1926,6 @@ static int ass_render_event(ass_event_t* event, event_images_t* event_images) render_context.clip_y1 = y2scr(render_context.clip_y1); } - for (i = 0; i < text_info.length; ++i) - get_bitmap_glyph(text_info.glyphs + i); - // rotate glyphs if needed { FT_Vector center; @@ -1949,6 +1946,15 @@ static int ass_render_event(ass_event_t* event, event_images_t* event_images) FT_Vector shift; glyph_info_t* info = text_info.glyphs + i; + if (info->hash_key.frx || info->hash_key.fry || info->hash_key.frz) { + info->hash_key.shift_x = info->pos.x + device_x - center.x; + info->hash_key.shift_y = - (info->pos.y + device_y - center.y); + } else { + info->hash_key.shift_x = 0; + info->hash_key.shift_y = 0; + } + get_bitmap_glyph(info); + if (info->bm == 0) { // calculating shift vector shift.x = int_to_d6(info->pos.x + device_x - center.x); |