]> granicus.if.org Git - libass/commitdiff
Fix change detection when text is clipped to screen
authorwm4 <wm4@nowhere>
Sat, 31 May 2014 21:19:45 +0000 (23:19 +0200)
committerwm4 <wm4@nowhere>
Sun, 1 Jun 2014 14:43:57 +0000 (16:43 +0200)
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
libass/ass_render.h

index 85c6aec0277392662e53b04a8d93a7beab898f03..8e590e839421d5c3a6eac955e34a74c26a7fdeb7 100644 (file)
@@ -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;
index 2cb2210c71a29410e75df967fc7541c6f807eed4..8e15ad5df2654b04d1f6d817efd33ddd57eca728 100644 (file)
@@ -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;