[Bf-blender-cvs] [21a3dd756ab] soc-2021-vse-strip-thumbnails: Combined caching and thumbnail drawing code

Aditya Y Jeppu noreply at git.blender.org
Mon Jun 28 15:26:02 CEST 2021


Commit: 21a3dd756abda33746bd5ef57a3cc37cf5494009
Author: Aditya Y Jeppu
Date:   Sun Jun 27 18:39:06 2021 +0530
Branches: soc-2021-vse-strip-thumbnails
https://developer.blender.org/rB21a3dd756abda33746bd5ef57a3cc37cf5494009

Combined caching and thumbnail drawing code

Involves modification to the image rendering, caching and drawing. The
thumbs are fixed to 256 max size, the caching is limited in number
and the overall look of the thumbnails is proper (no incorrect clipping).

Maniphest task : T89143

Differential Revision: https://developer.blender.org/D11718

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

M	source/blender/editors/space_sequencer/sequencer_draw.c
M	source/blender/sequencer/SEQ_render.h
M	source/blender/sequencer/intern/image_cache.c
M	source/blender/sequencer/intern/image_cache.h
M	source/blender/sequencer/intern/render.c

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

diff --git a/source/blender/editors/space_sequencer/sequencer_draw.c b/source/blender/editors/space_sequencer/sequencer_draw.c
index 30b1d68f9a2..03ef414d9e6 100644
--- a/source/blender/editors/space_sequencer/sequencer_draw.c
+++ b/source/blender/editors/space_sequencer/sequencer_draw.c
@@ -1099,8 +1099,11 @@ static void draw_seq_strip_thumbnail(View2D *v2d,
   SeqRenderData context = {0};
   ImBuf *ibuf;
   bool min_size, clipped = false;
-  float aspect_ratio, image_x, image_y, cropx_min, cropx_max;
-  rctf crop;
+  float aspect_ratio, image_y, cropx_min, cropx_max;
+  rcti crop;
+
+  /* Not sending v2d directly to have Drawing and Internal code separation */
+  float cache_limits[4] = {v2d->tot.xmin, v2d->tot.xmax, v2d->cur.xmin, v2d->cur.xmax};
 
   /* if thumbs too small ignore */
   min_size = ((y2 - y1) / pixely) > 40 * U.dpi_fac;
@@ -1115,8 +1118,7 @@ static void draw_seq_strip_thumbnail(View2D *v2d,
   context.is_proxy_render = false;
   context.is_thumb = true;
 
-  ibuf = SEQ_render_thumbnail(&context, seq, seq->startdisp, v2d, &crop, clipped);
-  image_x = ibuf->x;
+  ibuf = SEQ_render_thumbnail(&context, seq, seq->startdisp, cache_limits, &crop, false);
   image_y = ibuf->y;
 
   /*Calculate thumb dimensions */
@@ -1133,7 +1135,7 @@ static void draw_seq_strip_thumbnail(View2D *v2d,
   x1 = seq->start;
 
   float cut_off = 0;
-  float upper_thumb_bound = seq->endstill ? seq->enddisp - seq->endstill : seq->enddisp;
+  float upper_thumb_bound = (seq->endstill) ? (seq->start + seq->len) : seq->enddisp;
 
   while (x1 < upper_thumb_bound) {
     x2 = x1 + thumb_w;
@@ -1162,7 +1164,6 @@ static void draw_seq_strip_thumbnail(View2D *v2d,
     }
 
     /* clip if full thumbnail cannot be displayed */
-
     if (x2 > (upper_thumb_bound)) {
       x2 = upper_thumb_bound;
       clipped = true;
@@ -1172,19 +1173,17 @@ static void draw_seq_strip_thumbnail(View2D *v2d,
 
     cropx_min = (cut_off / pixelx) / (zoom_y / pixely);
     cropx_max = ((x2 - x1) / pixelx) / (zoom_y / pixely);
-    BLI_rctf_init(&crop, cropx_min, cropx_max, 0, image_y);
-    /* Get the image */
+    BLI_rcti_init(&crop, (int)(cropx_min), (int)(cropx_max)-1, 0, (int)(image_y)-1);
 
-    ibuf = SEQ_render_thumbnail(&context, seq, x1 + (int)(cut_off), v2d, &crop, clipped);
+    /* Get the image */
+    ibuf = SEQ_render_thumbnail(&context, seq, x1 + (int)(cut_off), cache_limits, &crop, clipped);
 
-    GPU_blend(GPU_BLEND_ALPHA);
     if (ibuf) {
-      ED_draw_imbuf_ctx_clipping(C, ibuf, x1, y1, false, x1 + cut_off, y1, x2, y2, zoom_x, zoom_y);
+      ED_draw_imbuf_ctx_clipping(
+          C, ibuf, x1 + cut_off, y1, true, x1 + cut_off, y1, x2, y2, zoom_x, zoom_y);
       IMB_freeImBuf(ibuf);
     }
 
-    GPU_blend(GPU_BLEND_NONE);
-
     cut_off = 0;
     x1 = x2;
   }
diff --git a/source/blender/sequencer/SEQ_render.h b/source/blender/sequencer/SEQ_render.h
index 06ebbfac36d..6860b2c15d2 100644
--- a/source/blender/sequencer/SEQ_render.h
+++ b/source/blender/sequencer/SEQ_render.h
@@ -71,8 +71,8 @@ struct ImBuf *SEQ_render_give_ibuf_direct(const SeqRenderData *context,
 struct ImBuf *SEQ_render_thumbnail(SeqRenderData *context,
                                    struct Sequence *seq,
                                    float timeline_frame,
-                                   View2D *v2d,
-                                   rctf *crop,
+                                   float *cache_limits,
+                                   rcti *crop,
                                    bool clipped);
 void SEQ_render_init_colorspace(struct Sequence *seq);
 void SEQ_render_new_render_data(struct Main *bmain,
diff --git a/source/blender/sequencer/intern/image_cache.c b/source/blender/sequencer/intern/image_cache.c
index 06c081c1ba1..8d0d6a28941 100644
--- a/source/blender/sequencer/intern/image_cache.c
+++ b/source/blender/sequencer/intern/image_cache.c
@@ -1339,7 +1339,7 @@ void seq_cache_cleanup_sequence(Scene *scene,
   seq_cache_unlock(scene);
 }
 
-void seq_cache_thumbnail_cleanup(Scene *scene, Sequence *seq, Sequence *seq_changed)
+void seq_cache_thumbnail_cleanup(Scene *scene, Sequence *seq_changed)
 {
   SeqCache *cache = seq_cache_get_from_scene(scene);
   if (!cache) {
@@ -1465,7 +1465,7 @@ void seq_cache_thumbnail_put(const SeqRenderData *context,
                              float timeline_frame,
                              int type,
                              ImBuf *i,
-                             View2D *v2d)
+                             float *cache_limits)
 {
   if (i == NULL || context->skip_cache || context->is_proxy_render || !seq) {
     return;
@@ -1495,22 +1495,22 @@ void seq_cache_thumbnail_put(const SeqRenderData *context,
   SeqCache *cache = seq_cache_get_from_scene(scene);
   SeqCacheKey *key = seq_cache_allocate_key(cache, context, seq, timeline_frame, type);
 
-  /* Limit cache to 1000 images stored. */
-  if (cache->count >= 1000) {
-    float safe_ofs = 20;
+  /* Limit cache to 5000 images stored. */
+  if (cache->count >= 5000) {
+    float safe_ofs = 200;
     Sequence cut = *seq;
 
     /* Frames to the left */
-    cut.startdisp = (int)v2d->tot.xmin;
-    cut.enddisp = (int)v2d->cur.xmin - (int)safe_ofs;
+    cut.startdisp = (int)cache_limits[0];
+    cut.enddisp = (int)cache_limits[2] - (int)safe_ofs;
     if (cut.startdisp < cut.enddisp) {
-      seq_cache_thumbnail_cleanup(scene, seq, &cut);
+      seq_cache_thumbnail_cleanup(scene, &cut);
     }
     /* Frames to the right */
-    cut.startdisp = v2d->cur.xmax + safe_ofs;
-    cut.enddisp = v2d->tot.xmax;
+    cut.startdisp = cache_limits[3] + safe_ofs;
+    cut.enddisp = cache_limits[1];
     if (cut.startdisp < cut.enddisp) {
-      seq_cache_thumbnail_cleanup(scene, seq, &cut);
+      seq_cache_thumbnail_cleanup(scene, &cut);
     }
   }
 
diff --git a/source/blender/sequencer/intern/image_cache.h b/source/blender/sequencer/intern/image_cache.h
index fbe47f3edd0..f59a0859c2a 100644
--- a/source/blender/sequencer/intern/image_cache.h
+++ b/source/blender/sequencer/intern/image_cache.h
@@ -51,7 +51,7 @@ void seq_cache_thumbnail_put(const struct SeqRenderData *context,
                              float timeline_frame,
                              int type,
                              struct ImBuf *i,
-                             struct View2D *v2d);
+                             float *cache_limits);
 bool seq_cache_put_if_possible(const struct SeqRenderData *context,
                                struct Sequence *seq,
                                float timeline_frame,
@@ -66,7 +66,7 @@ void seq_cache_cleanup_sequence(struct Scene *scene,
                                 struct Sequence *seq_changed,
                                 int invalidate_types,
                                 bool force_seq_changed_range);
-void seq_cache_thumbnail_cleanup(Scene *scene, Sequence *seq, Sequence *seq_changed);
+void seq_cache_thumbnail_cleanup(Scene *scene, Sequence *seq_changed);
 bool seq_cache_is_full(void);
 
 #ifdef __cplusplus
diff --git a/source/blender/sequencer/intern/render.c b/source/blender/sequencer/intern/render.c
index defefcd7fed..3b4ff5c87d3 100644
--- a/source/blender/sequencer/intern/render.c
+++ b/source/blender/sequencer/intern/render.c
@@ -530,12 +530,6 @@ static void sequencer_image_crop_init(const Sequence *seq,
 
 static void sequencer_thumbnail_transform(ImBuf *in, ImBuf *out, const SeqRenderData *context)
 {
-  const Scene *scene = context->scene;
-  const float preview_scale_factor = context->preview_render_size == SEQ_RENDER_SIZE_SCENE ?
-                                         (float)scene->r.size / 100 :
-                                         SEQ_rendersize_to_scale_factor(
-                                             context->preview_render_size);
-
   float image_scale_factor = (float)out->x / in->x;
   float transform_matrix[3][3];
 
@@ -2029,45 +2023,29 @@ ImBuf *SEQ_render_give_ibuf_direct(const SeqRenderData *context,
 ImBuf *SEQ_render_thumbnail(SeqRenderData *context,
                             Sequence *seq,
                             float timeline_frame,
-                            View2D *v2d,
-                            rctf *crop,
+                            float *cache_limits,
+                            rcti *crop,
                             bool clipped)
 {
   SeqRenderState state;
   seq_render_state_init(&state);
-  ImBuf *ibuf = NULL, *scaled_ibuf = NULL, *cropped_ibuf = NULL;
+  ImBuf *ibuf = NULL, *scaled_ibuf = NULL, *temp = NULL;
   bool is_proxy_image = false;
   float rectx, recty;
 
   ibuf = seq_cache_get(context, seq, timeline_frame, SEQ_CACHE_STORE_THUMBNAIL);
   if (ibuf != NULL) {
-    /* do clipping */  // TODO(AYJ) : Move to separate function
+    /* Do clipping */
     if (clipped) {
-      cropped_ibuf = IMB_allocImBuf(
-          ibuf->x, ibuf->y, 32, ibuf->rect_float ? IB_rectfloat : IB_rect);
-
-      float transform_matrix[3][3];
-      const float scale_x = 1;
-      const float scale_y = 1;
-      const float image_center_offs_x = (cropped_ibuf->x - ibuf->x) / 2;
-      const float image_center_offs_y = (cropped_ibuf->y - ibuf->y) / 2;
-      const float pivot[2] = {ibuf->x / 2, ibuf->y / 2};
-      loc_rot_size_to_mat3(transform_matrix,
-                           (const float[]){image_center_offs_x, image_center_offs_y},
-                           0,
-                           (const float[]){scale_x, scale_y});
-      transform_pivot_set_m3(transform_matrix, pivot);
-      invert_m3(transform_matrix);
-
-      const eIMBInterpolationFilterMode filter = context->for_render ? IMB_FILTER_BILINEAR :
-                                                                       IMB_FILTER_NEAREST;
-      IMB_transform(ibuf, cropped_ibuf, transform_matrix, crop, filter);
-
-      seq_imbuf_assign_spaces(context->scene, cropped_ibuf);
-      IMB_metadata_copy(cropped_ibuf, ibuf);
+      temp = IMB_dupImBuf(ibuf);
+      if (crop->xmin < 0 && crop->ymin < 0) {
+        crop->xmin = 0;
+        crop->ymin = 0;
+      }
+      IMB_rect_crop(temp, crop);
       IMB_freeImBuf(ibuf);
-      if (cropped_ibuf != NULL)
-        return cropped_ibuf;
+      if (temp != NULL)
+        return temp;
     }
     return 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list