From dc0a14e61a1c454d593db5a91de0819921a2ddc9 Mon Sep 17 00:00:00 2001 From: wm4 Date: Sat, 31 May 2014 23:19:45 +0200 Subject: Fix change detection when text is clipped to screen The glyphs are clipped before combining, so the combined bitmap can always have the same position, size, and address. This breaks the change detection. Or at least I think that's what happens. --- libass/ass_render.c | 10 +++++++--- libass/ass_render.h | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/libass/ass_render.c b/libass/ass_render.c index 85c6aec..8e590e8 100644 --- a/libass/ass_render.c +++ b/libass/ass_render.c @@ -449,18 +449,22 @@ render_glyph(ASS_Renderer *render_priv, Bitmap *bm, int dst_x, int dst_y, tmp = dst_x - clip_x0; if (tmp < 0) { b_x0 = -tmp; + render_priv->state.has_clips = 1; } tmp = dst_y - clip_y0; if (tmp < 0) { b_y0 = -tmp; + render_priv->state.has_clips = 1; } tmp = clip_x1 - dst_x - bm->w; if (tmp < 0) { b_x1 = bm->w + tmp; + render_priv->state.has_clips = 1; } tmp = clip_y1 - dst_y - bm->h; if (tmp < 0) { b_y1 = bm->h + tmp; + render_priv->state.has_clips = 1; } if ((b_y0 >= b_y1) || (b_x0 >= b_x1)) @@ -571,7 +575,7 @@ static void blend_vector_clip(ASS_Renderer *render_priv, int aleft, atop, bleft, btop; unsigned char *abuffer, *bbuffer, *nbuffer; - render_priv->state.has_vector_clip = 1; + render_priv->state.has_clips = 1; abuffer = cur->bitmap; bbuffer = clip_bm->buffer; @@ -810,7 +814,7 @@ init_render_context(ASS_Renderer *render_priv, ASS_Event *event) render_priv->state.event = event; render_priv->state.style = render_priv->track->styles + event->Style; render_priv->state.parsed_tags = 0; - render_priv->state.has_vector_clip = 0; + render_priv->state.has_clips = 0; reset_render_context(render_priv, render_priv->state.style); render_priv->state.wrap_style = render_priv->track->WrapStyle; @@ -2856,7 +2860,7 @@ static int ass_detect_change(ASS_Renderer *priv) ASS_Image *img, *img2; int diff; - if (priv->cache_cleared || priv->state.has_vector_clip) + if (priv->cache_cleared || priv->state.has_clips) return 2; img = priv->prev_images_root; diff --git a/libass/ass_render.h b/libass/ass_render.h index 2cb2210..8e15ad5 100644 --- a/libass/ass_render.h +++ b/libass/ass_render.h @@ -232,7 +232,7 @@ typedef struct { ASS_Event *event; ASS_Style *style; int parsed_tags; - int has_vector_clip; + int has_clips; // clips that conflict with cache change detection ASS_Font *font; double font_size; -- cgit v1.2.3