Sequencer: refactor clipboard copy to no longer increase user count.
[blender.git] / source / blender / blenkernel / intern / seqcache.c
index 978c1a7c9b024f8833205f41136ceecf213c1edd..435d9369faab2a021c0206b1ea2e4db4d118ec2c 100644 (file)
 
 #include <stddef.h>
 
-#include "BLO_sys_types.h"  /* for intptr_t */
+#include "BLI_sys_types.h"  /* for intptr_t */
 
 #include "MEM_guardedalloc.h"
 
 #include "DNA_sequence_types.h"
+#include "DNA_scene_types.h"
 
 #include "IMB_moviecache.h"
 #include "IMB_imbuf.h"
 #include "BLI_listbase.h"
 
 #include "BKE_sequencer.h"
+#include "BKE_scene.h"
 
 typedef struct SeqCacheKey {
        struct Sequence *seq;
        SeqRenderData context;
        float cfra;
-       seq_stripelem_ibuf_t type;
+       eSeqStripElemIBuf type;
 } SeqCacheKey;
 
 typedef struct SeqPreprocessCacheElem {
@@ -54,7 +56,7 @@ typedef struct SeqPreprocessCacheElem {
 
        struct Sequence *seq;
        SeqRenderData context;
-       seq_stripelem_ibuf_t type;
+       eSeqStripElemIBuf type;
 
        ImBuf *ibuf;
 } SeqPreprocessCacheElem;
@@ -69,58 +71,17 @@ static struct SeqPreprocessCache *preprocess_cache = NULL;
 
 static void preprocessed_cache_destruct(void);
 
-static int seq_cmp_render_data(const SeqRenderData *a, const SeqRenderData *b)
+static bool seq_cmp_render_data(const SeqRenderData *a, const SeqRenderData *b)
 {
-       if (a->preview_render_size < b->preview_render_size) {
-               return -1;
-       }
-       if (a->preview_render_size > b->preview_render_size) {
-               return 1;
-       }
-
-       if (a->rectx < b->rectx) {
-               return -1;
-       }
-       if (a->rectx > b->rectx) {
-               return 1;
-       }
-
-       if (a->recty < b->recty) {
-               return -1;
-       }
-       if (a->recty > b->recty) {
-               return 1;
-       }
-
-       if (a->bmain < b->bmain) {
-               return -1;
-       }
-       if (a->bmain > b->bmain) {
-               return 1;
-       }
-
-       if (a->scene < b->scene) {
-               return -1;
-       }
-       if (a->scene > b->scene) {
-               return 1;
-       }
-
-       if (a->motion_blur_shutter < b->motion_blur_shutter) {
-               return -1;
-       }
-       if (a->motion_blur_shutter > b->motion_blur_shutter) {
-               return 1;
-       }
-
-       if (a->motion_blur_samples < b->motion_blur_samples) {
-               return -1;
-       }
-       if (a->motion_blur_samples > b->motion_blur_samples) {
-               return 1;
-       }
-
-       return 0;
+       return ((a->preview_render_size != b->preview_render_size) ||
+               (a->rectx != b->rectx) ||
+               (a->recty != b->recty) ||
+               (a->bmain != b->bmain) ||
+               (a->scene != b->scene) ||
+               (a->motion_blur_shutter != b->motion_blur_shutter) ||
+               (a->motion_blur_samples != b->motion_blur_samples) ||
+               (a->scene->r.views_format != b->scene->r.views_format) ||
+               (a->view_id != b->view_id));
 }
 
 static unsigned int seq_hash_render_data(const SeqRenderData *a)
@@ -131,50 +92,33 @@ static unsigned int seq_hash_render_data(const SeqRenderData *a)
        rval ^= ((intptr_t) a->bmain) << 6;
        rval ^= ((intptr_t) a->scene) << 6;
        rval ^= (int)(a->motion_blur_shutter * 100.0f) << 10;
-       rval ^= a->motion_blur_samples << 24;
+       rval ^= a->motion_blur_samples << 16;
+       rval ^= ((a->scene->r.views_format * 2) + a->view_id) << 24;
 
        return rval;
 }
 
 static unsigned int seqcache_hashhash(const void *key_)
 {
-       const SeqCacheKey *key = (SeqCacheKey *) key_;
+       const SeqCacheKey *key = key_;
        unsigned int rval = seq_hash_render_data(&key->context);
 
-       rval ^= *(unsigned int *) &key->cfra;
+       rval ^= *(const unsigned int *) &key->cfra;
        rval += key->type;
        rval ^= ((intptr_t) key->seq) << 6;
 
        return rval;
 }
 
-static int seqcache_hashcmp(const void *a_, const void *b_)
+static bool seqcache_hashcmp(const void *a_, const void *b_)
 {
-       const SeqCacheKey *a = (SeqCacheKey *) a_;
-       const SeqCacheKey *b = (SeqCacheKey *) b_;
-
-       if (a->seq < b->seq) {
-               return -1;
-       }
-       if (a->seq > b->seq) {
-               return 1;
-       }
-
-       if (a->cfra < b->cfra) {
-               return -1;
-       }
-       if (a->cfra > b->cfra) {
-               return 1;
-       }
-
-       if (a->type < b->type) {
-               return -1;
-       }
-       if (a->type > b->type) {
-               return 1;
-       }
+       const SeqCacheKey *a = a_;
+       const SeqCacheKey *b = b_;
 
-       return seq_cmp_render_data(&a->context, &b->context);
+       return ((a->seq != b->seq) ||
+               (a->cfra != b->cfra) ||
+               (a->type != b->type) ||
+               seq_cmp_render_data(&a->context, &b->context));
 }
 
 void BKE_sequencer_cache_destruct(void)
@@ -195,7 +139,7 @@ void BKE_sequencer_cache_cleanup(void)
        BKE_sequencer_preprocessed_cache_cleanup();
 }
 
-static int seqcache_key_check_seq(void *userkey, void *userdata)
+static bool seqcache_key_check_seq(ImBuf *UNUSED(ibuf), void *userkey, void *userdata)
 {
        SeqCacheKey *key = (SeqCacheKey *) userkey;
        Sequence *seq = (Sequence *) userdata;
@@ -209,13 +153,13 @@ void BKE_sequencer_cache_cleanup_sequence(Sequence *seq)
                IMB_moviecache_cleanup(moviecache, seqcache_key_check_seq, seq);
 }
 
-struct ImBuf *BKE_sequencer_cache_get(SeqRenderData context, Sequence *seq, float cfra, seq_stripelem_ibuf_t type)
+struct ImBuf *BKE_sequencer_cache_get(const SeqRenderData *context, Sequence *seq, float cfra, eSeqStripElemIBuf type)
 {
        if (moviecache && seq) {
                SeqCacheKey key;
 
                key.seq = seq;
-               key.context = context;
+               key.context = *context;
                key.cfra = cfra - seq->start;
                key.type = type;
 
@@ -225,11 +169,11 @@ struct ImBuf *BKE_sequencer_cache_get(SeqRenderData context, Sequence *seq, floa
        return NULL;
 }
 
-void BKE_sequencer_cache_put(SeqRenderData context, Sequence *seq, float cfra, seq_stripelem_ibuf_t type, ImBuf *i)
+void BKE_sequencer_cache_put(const SeqRenderData *context, Sequence *seq, float cfra, eSeqStripElemIBuf type, ImBuf *i)
 {
        SeqCacheKey key;
 
-       if (!i) {
+       if (i == NULL || context->skip_cache) {
                return;
        }
 
@@ -238,7 +182,7 @@ void BKE_sequencer_cache_put(SeqRenderData context, Sequence *seq, float cfra, s
        }
 
        key.seq = seq;
-       key.context = context;
+       key.context = *context;
        key.cfra = cfra - seq->start;
        key.type = type;
 
@@ -257,7 +201,7 @@ void BKE_sequencer_preprocessed_cache_cleanup(void)
        }
        BLI_freelistN(&preprocess_cache->elems);
 
-       preprocess_cache->elems.first = preprocess_cache->elems.last = NULL;
+       BLI_listbase_clear(&preprocess_cache->elems);
 }
 
 static void preprocessed_cache_destruct(void)
@@ -271,7 +215,7 @@ static void preprocessed_cache_destruct(void)
        preprocess_cache = NULL;
 }
 
-ImBuf *BKE_sequencer_preprocessed_cache_get(SeqRenderData context, Sequence *seq, float cfra, seq_stripelem_ibuf_t type)
+ImBuf *BKE_sequencer_preprocessed_cache_get(const SeqRenderData *context, Sequence *seq, float cfra, eSeqStripElemIBuf type)
 {
        SeqPreprocessCacheElem *elem;
 
@@ -288,7 +232,7 @@ ImBuf *BKE_sequencer_preprocessed_cache_get(SeqRenderData context, Sequence *seq
                if (elem->type != type)
                        continue;
 
-               if (seq_cmp_render_data(&elem->context, &context) != 0)
+               if (seq_cmp_render_data(&elem->context, context) != 0)
                        continue;
 
                IMB_refImBuf(elem->ibuf);
@@ -298,7 +242,7 @@ ImBuf *BKE_sequencer_preprocessed_cache_get(SeqRenderData context, Sequence *seq
        return NULL;
 }
 
-void BKE_sequencer_preprocessed_cache_put(SeqRenderData context, Sequence *seq, float cfra, seq_stripelem_ibuf_t type, ImBuf *ibuf)
+void BKE_sequencer_preprocessed_cache_put(const SeqRenderData *context, Sequence *seq, float cfra, eSeqStripElemIBuf type, ImBuf *ibuf)
 {
        SeqPreprocessCacheElem *elem;
 
@@ -314,7 +258,7 @@ void BKE_sequencer_preprocessed_cache_put(SeqRenderData context, Sequence *seq,
 
        elem->seq = seq;
        elem->type = type;
-       elem->context = context;
+       elem->context = *context;
        elem->ibuf = ibuf;
 
        preprocess_cache->cfra = cfra;