[Bf-blender-cvs] [b5ff068a392] temp-vse-thumbnail-mod: Fix flickering when navigation ends

Richard Antalik noreply at git.blender.org
Thu Sep 16 03:08:18 CEST 2021


Commit: b5ff068a3921898df209318c4e92718284f256dc
Author: Richard Antalik
Date:   Thu Sep 16 03:07:34 2021 +0200
Branches: temp-vse-thumbnail-mod
https://developer.blender.org/rBb5ff068a3921898df209318c4e92718284f256dc

Fix flickering when navigation ends

===================================================================

M	source/blender/editors/space_sequencer/sequencer_draw.c

===================================================================

diff --git a/source/blender/editors/space_sequencer/sequencer_draw.c b/source/blender/editors/space_sequencer/sequencer_draw.c
index 45e78bf11cd..7d9e424dc20 100644
--- a/source/blender/editors/space_sequencer/sequencer_draw.c
+++ b/source/blender/editors/space_sequencer/sequencer_draw.c
@@ -1499,6 +1499,26 @@ static void sequencer_thumbnail_init_job(const bContext *C, View2D *v2d, Editing
   ED_area_tag_redraw(area);
 }
 
+
+/* Don't display thumbnails only when zooming. Panning doesn't cause issues. */
+static bool sequencer_thumbnail_v2d_is_navigating(const bContext *C)
+{
+  ARegion *region = CTX_wm_region(C);
+  View2D *v2d = &region->v2d;
+  SpaceSeq *sseq = CTX_wm_space_seq(C);
+
+  if ((v2d->flag & V2D_IS_NAVIGATING) == 0) {
+    return false;
+  }
+  return true;
+
+  double x_diff = fabs(BLI_rctf_size_x(&sseq->runtime.last_thumbnail_area) -
+                       BLI_rctf_size_x(&v2d->cur));
+  double y_diff = fabs(BLI_rctf_size_y(&sseq->runtime.last_thumbnail_area) -
+                       BLI_rctf_size_y(&v2d->cur));
+  return x_diff > 0.01 || y_diff > 0.01;
+}
+
 static void sequencer_thumbnail_start_job_if_necessary(const bContext *C,
                                                        Editing *ed,
                                                        View2D *v2d,
@@ -1506,13 +1526,13 @@ static void sequencer_thumbnail_start_job_if_necessary(const bContext *C,
 {
   SpaceSeq *sseq = CTX_wm_space_seq(C);
 
-  if ((v2d->flag & V2D_IS_NAVIGATING) != 0) {
+  if (sequencer_thumbnail_v2d_is_navigating(C)) {
     WM_event_add_notifier(C, NC_SCENE | ND_SEQUENCER, NULL);
     return;
   }
 
-  /* Leftover is set to true if missing image in strip. False when normal call to all strips done.
-   */
+  /* `thumbnail_is_missing` should be set to true if missing image in strip. False when normal call
+   * to all strips done.  */
   if (v2d->cur.xmax != sseq->runtime.last_thumbnail_area.xmax ||
       v2d->cur.ymax != sseq->runtime.last_thumbnail_area.ymax || thumbnail_is_missing) {
 
@@ -1527,24 +1547,6 @@ static void sequencer_thumbnail_start_job_if_necessary(const bContext *C,
   }
 }
 
-/* Don't display thumbnails only when zooming. Panning doesn't cause issues. */
-static bool sequencer_thumbnail_v2d_is_navigating(const bContext *C)
-{
-  ARegion *region = CTX_wm_region(C);
-  View2D *v2d = &region->v2d;
-  SpaceSeq *sseq = CTX_wm_space_seq(C);
-
-  if ((v2d->flag & V2D_IS_NAVIGATING) == 0) {
-    return false;
-  }
-
-  double x_diff = fabs(BLI_rctf_size_x(&sseq->runtime.last_thumbnail_area) -
-                       BLI_rctf_size_x(&v2d->cur));
-  double y_diff = fabs(BLI_rctf_size_y(&sseq->runtime.last_thumbnail_area) -
-                       BLI_rctf_size_y(&v2d->cur));
-  return x_diff > 0.01 || y_diff > 0.01;
-}
-
 void last_displayed_thumbnails_list_free(void *val)
 {
   BLI_gset_free(val, NULL);
@@ -1563,13 +1565,25 @@ static GSet *last_displayed_thumbnails_list_ensure(const bContext *C, Sequence *
     BLI_ghash_insert(sseq->runtime.last_displayed_thumbnails, seq, displayed_thumbnails);
   }
 
-  if (!sequencer_thumbnail_v2d_is_navigating(C)) {
-    BLI_gset_clear(displayed_thumbnails, NULL);
-  }
-
   return displayed_thumbnails;
 }
 
+static void last_displayed_thumbnails_list_cleanup(GSet *previously_displayed,
+                                                   float range_start,
+                                                   float range_end)
+{
+  GSetIterator gset_iter;
+  BLI_gsetIterator_init(&gset_iter, previously_displayed);
+  while (!BLI_gsetIterator_done(&gset_iter)) {
+    int frame = (float)POINTER_AS_INT(BLI_gsetIterator_getKey(&gset_iter));
+    BLI_gsetIterator_step(&gset_iter);
+
+    if (frame > range_start && frame < range_end) {
+      BLI_gset_remove(previously_displayed, POINTER_FROM_INT(frame), NULL);
+    }
+  }
+}
+
 static int sequencer_thumbnail_closest_guaranteed_frame_get(Sequence *seq,
                                                             int timeline_frame,
                                                             GSet *previously_displayed)
@@ -1632,11 +1646,17 @@ static void draw_seq_strip_thumbnail(View2D *v2d,
     upper_thumb_bound = seq->enddisp;
   }
 
-  GSet *last_displayed_thumbnails = last_displayed_thumbnails_list_ensure(C, seq);
-
   thumb_x_start = seq_thumbnail_get_start_frame(seq, thumb_width, &v2d->cur);
   float thumb_x_end;
 
+  GSet *last_displayed_thumbnails = last_displayed_thumbnails_list_ensure(C, seq);
+
+  /* Cleanup thumbnail list outside of rendered range, which is cleaned up one by one to prevent
+   * flickering after zooming. */
+  if (!sequencer_thumbnail_v2d_is_navigating(C)) {
+    last_displayed_thumbnails_list_cleanup(last_displayed_thumbnails, -FLT_MAX, thumb_x_start);
+  }
+
   /* Start drawing. */
   while (thumb_x_start < upper_thumb_bound) {
     thumb_x_end = thumb_x_start + thumb_width;
@@ -1685,7 +1705,7 @@ static void draw_seq_strip_thumbnail(View2D *v2d,
 
     int timeline_frame = round_fl_to_int(thumb_x_start);
 
-    /* Store displayed thumbnails so they can be reused for zooming. */
+    /* Override timeline frame when zooming with closest that should be kept in memory. */
     if (sequencer_thumbnail_v2d_is_navigating(C)) {
       timeline_frame = sequencer_thumbnail_closest_guaranteed_frame_get(
           seq, timeline_frame, last_displayed_thumbnails);
@@ -1704,12 +1724,17 @@ static void draw_seq_strip_thumbnail(View2D *v2d,
     }
     /* Store recently rendered frames, so they can be reused when zooming. */
     else if (!sequencer_thumbnail_v2d_is_navigating(C)) {
+      /* Clear images in frame range occupied bynew thumbnail. */
+      last_displayed_thumbnails_list_cleanup(
+          last_displayed_thumbnails, thumb_x_start, thumb_x_end);
+      /* Insert new thumbnail frame to list. */
       BLI_gset_add(last_displayed_thumbnails, POINTER_FROM_INT(timeline_frame));
     }
 
     /* If there is no image still, abort. */
     if (!ibuf) {
-      break;
+      last_displayed_thumbnails_list_cleanup(last_displayed_thumbnails, thumb_x_start, FLT_MAX);
+      return;
     }
 
     /* Transparency on overlap. */
@@ -1745,6 +1770,7 @@ static void draw_seq_strip_thumbnail(View2D *v2d,
     cut_off = 0;
     thumb_x_start += thumb_width;
   }
+  last_displayed_thumbnails_list_cleanup(last_displayed_thumbnails, thumb_x_start - thumb_width, FLT_MAX);
 }
 
 /* Draw visible strips. Bounds check are already made. */



More information about the Bf-blender-cvs mailing list