[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [30722] trunk/blender/source/blender/ blenkernel: == Sequencer ==

Peter Schlaile peter at schlaile.de
Sun Jul 25 19:19:57 CEST 2010


Revision: 30722
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=30722
Author:   schlaile
Date:     2010-07-25 19:19:55 +0200 (Sun, 25 Jul 2010)

Log Message:
-----------
== Sequencer ==

Some cleanup on effects:

- converted interface to float cfra
- made effects return their own ImBufs, which has the following 
  advantages:
  * code in sequencer.c is a lot more readable.
  * multicam saves one memcpy of an image
  * prepares things for GPU-rendering

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_sequencer.h
    trunk/blender/source/blender/blenkernel/intern/seqeffects.c
    trunk/blender/source/blender/blenkernel/intern/sequencer.c

Modified: trunk/blender/source/blender/blenkernel/BKE_sequencer.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_sequencer.h	2010-07-25 14:40:18 UTC (rev 30721)
+++ trunk/blender/source/blender/blenkernel/BKE_sequencer.h	2010-07-25 17:19:55 UTC (rev 30722)
@@ -107,15 +107,14 @@
 	0: no early out, 
 	1: out = ibuf1, 
 	2: out = ibuf2 */
-	int (*early_out)(struct Sequence *seq,
-					 float facf0, float facf1); 
+	int (*early_out)(struct Sequence *seq, float facf0, float facf1); 
 	
 	/* stores the y-range of the effect IPO */
 	void (*store_icu_yrange)(struct Sequence * seq,
                                  short adrcode, float *ymin, float *ymax);
 	
 	/* stores the default facf0 and facf1 if no IPO is present */
-	void (*get_default_fac)(struct Sequence *seq, int cfra,
+	void (*get_default_fac)(struct Sequence *seq, float cfra,
                                 float * facf0, float * facf1);
 	
 	/* execute the effect
@@ -123,11 +122,12 @@
            float-rects or byte-rects 
            (mixed cases are handled one layer up...) */
 	
-	void (*execute)(struct Scene *scene, struct Sequence *seq, int cfra,
-                        float facf0, float facf1,
-                        int x, int y, int preview_render_size,
-                        struct ImBuf *ibuf1, struct ImBuf *ibuf2,
-                        struct ImBuf *ibuf3, struct ImBuf *out);
+	struct ImBuf* (*execute)(
+		struct Scene *scene, struct Sequence *seq, float cfra,
+		float facf0, float facf1,
+		int x, int y, int preview_render_size,
+		struct ImBuf *ibuf1, struct ImBuf *ibuf2,
+		struct ImBuf *ibuf3);
 };
 
 /* ********************* prototypes *************** */
@@ -164,6 +164,10 @@
 // intern?
 void update_changed_seq_and_deps(struct Scene *scene, struct Sequence *changed_seq, int len_change, int ibuf_change);
 
+int input_have_to_preprocess(
+	struct Scene *scene, struct Sequence * seq, 
+	float cfra, int seqrectx, int seqrecty);
+
 /* seqcache.c */
 
 typedef enum {

Modified: trunk/blender/source/blender/blenkernel/intern/seqeffects.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/seqeffects.c	2010-07-25 14:40:18 UTC (rev 30721)
+++ trunk/blender/source/blender/blenkernel/intern/seqeffects.c	2010-07-25 17:19:55 UTC (rev 30722)
@@ -67,7 +67,49 @@
 	GlowA=3
 };
 
+static struct ImBuf * prepare_effect_imbufs(
+	int x, int y,
+	struct ImBuf *ibuf1, struct ImBuf *ibuf2,
+	struct ImBuf *ibuf3)
+{
+	struct ImBuf * out;
 
+	if (!ibuf1 && !ibuf2 && !ibuf3) {
+		/* hmmm, global float option ? */
+		out = IMB_allocImBuf((short)x, (short)y, 32, IB_rect, 0);
+	} else if ((ibuf1 && ibuf1->rect_float) || 
+		   (ibuf2 && ibuf2->rect_float) || 
+		   (ibuf3 && ibuf3->rect_float)) {
+		/* if any inputs are rectfloat, output is float too */
+
+		out = IMB_allocImBuf((short)x, (short)y, 32, IB_rectfloat, 0);
+	} else {
+		out = IMB_allocImBuf((short)x, (short)y, 32, IB_rect, 0);
+	}
+	
+	if (ibuf1 && !ibuf1->rect_float && out->rect_float) {
+		IMB_float_from_rect_simple(ibuf1);
+	}
+	if (ibuf2 && !ibuf2->rect_float && out->rect_float) {
+		IMB_float_from_rect_simple(ibuf2);
+	}
+	if (ibuf3 && !ibuf3->rect_float && out->rect_float) {
+		IMB_float_from_rect_simple(ibuf3);
+	}
+	
+	if (ibuf1 && !ibuf1->rect && !out->rect_float) {
+		IMB_rect_from_float(ibuf1);
+	}
+	if (ibuf2 && !ibuf2->rect && !out->rect_float) {
+		IMB_rect_from_float(ibuf2);
+	}
+	if (ibuf3 && !ibuf3->rect && !out->rect_float) {
+		IMB_rect_from_float(ibuf3);
+	}
+			
+	return out;
+}
+
 /* **********************************************************************
    PLUGINS
    ********************************************************************** */
@@ -229,11 +271,12 @@
 	return (ImBuf*) (((void**) i) + 2);
 }
 
-static void do_plugin_effect(Scene *scene, Sequence *seq, int cfra,
-			     float facf0, float facf1, int x, int y, 
-			     int preview_render_size,
-			     struct ImBuf *ibuf1, struct ImBuf *ibuf2, 
-			     struct ImBuf *ibuf3, struct ImBuf *out)
+static struct ImBuf * do_plugin_effect(
+	Scene *scene, Sequence *seq, float cfra,
+	float facf0, float facf1, int x, int y, 
+	int preview_render_size,
+	struct ImBuf *ibuf1, struct ImBuf *ibuf2, 
+	struct ImBuf *ibuf3)
 {
 	char *cp;
 	int float_rendering;
@@ -241,6 +284,8 @@
 				  old plugins) do very bad stuff
 				  with imbuf-internals */
 
+	struct ImBuf * out = prepare_effect_imbufs(x, y, ibuf1, ibuf2, ibuf3);
+
 	if(seq->plugin && seq->plugin->doit) {
 		
 		if(seq->plugin->cfra) 
@@ -321,6 +366,7 @@
 			if (ibuf3) IMB_freeImBuf(ibuf3);
 		}
 	}
+	return out;
 }
 
 static int do_plugin_early_out(struct Sequence *seq,
@@ -476,12 +522,15 @@
 	}
 }
 
-static void do_alphaover_effect(Scene *scene, Sequence *seq, int cfra,
-				float facf0, float facf1, int x, int y, 
-				int preview_render_size,
-				struct ImBuf *ibuf1, struct ImBuf *ibuf2, 
-				struct ImBuf *ibuf3, struct ImBuf *out)
+static struct ImBuf * do_alphaover_effect(
+	Scene *scene, Sequence *seq, float cfra,
+	float facf0, float facf1, int x, int y, 
+	int preview_render_size,
+	struct ImBuf *ibuf1, struct ImBuf *ibuf2, 
+	struct ImBuf *ibuf3)
 {
+	struct ImBuf * out = prepare_effect_imbufs(x, y, ibuf1, ibuf2, ibuf3);
+
 	if (out->rect_float) {
 		do_alphaover_effect_float(
 			facf0, facf1, x, y,
@@ -493,6 +542,7 @@
 			(char*) ibuf1->rect, (char*) ibuf2->rect,
 			(char*) out->rect);
 	}
+	return out;
 }
 
 
@@ -644,12 +694,15 @@
 	}
 }
 
-static void do_alphaunder_effect(Scene *scene, Sequence *seq, int cfra,
-				float facf0, float facf1, int x, int y, 
-				 int preview_render_size,
-				struct ImBuf *ibuf1, struct ImBuf *ibuf2, 
-				struct ImBuf *ibuf3, struct ImBuf *out)
+static struct ImBuf* do_alphaunder_effect(
+	Scene *scene, Sequence *seq, float cfra,
+	float facf0, float facf1, int x, int y, 
+	int preview_render_size,
+	struct ImBuf *ibuf1, struct ImBuf *ibuf2, 
+	struct ImBuf *ibuf3)
 {
+	struct ImBuf * out = prepare_effect_imbufs(x, y, ibuf1, ibuf2, ibuf3);
+
 	if (out->rect_float) {
 		do_alphaunder_effect_float(
 			facf0, facf1, x, y,
@@ -661,6 +714,7 @@
 			(char*) ibuf1->rect, (char*) ibuf2->rect,
 			(char*) out->rect);
 	}
+	return out;
 }
 
 
@@ -765,12 +819,15 @@
 
 /* carefull: also used by speed effect! */
 
-static void do_cross_effect(Scene *scene, Sequence *seq, int cfra,
-			    float facf0, float facf1, int x, int y, 
-			    int preview_render_size,
-			    struct ImBuf *ibuf1, struct ImBuf *ibuf2, 
-			    struct ImBuf *ibuf3, struct ImBuf *out)
+static struct ImBuf* do_cross_effect(
+	Scene *scene, Sequence *seq, float cfra,
+	float facf0, float facf1, int x, int y, 
+	int preview_render_size,
+	struct ImBuf *ibuf1, struct ImBuf *ibuf2, 
+	struct ImBuf *ibuf3)
 {
+	struct ImBuf * out = prepare_effect_imbufs(x, y, ibuf1, ibuf2, ibuf3);
+
 	if (out->rect_float) {
 		do_cross_effect_float(
 			facf0, facf1, x, y,
@@ -782,6 +839,7 @@
 			(char*) ibuf1->rect, (char*) ibuf2->rect,
 			(char*) out->rect);
 	}
+	return out;
 }
 
 
@@ -1028,12 +1086,15 @@
 	}
 }
 
-static void do_gammacross_effect(Scene *scene, Sequence *seq, int cfra,
-				 float facf0, float facf1, int x, int y, 
-				 int preview_render_size,
-				 struct ImBuf *ibuf1, struct ImBuf *ibuf2, 
-				 struct ImBuf *ibuf3, struct ImBuf *out)
+static struct ImBuf * do_gammacross_effect(
+	Scene *scene, Sequence *seq, float cfra,
+	float facf0, float facf1, int x, int y, 
+	int preview_render_size,
+	struct ImBuf *ibuf1, struct ImBuf *ibuf2, 
+	struct ImBuf *ibuf3)
 {
+	struct ImBuf * out = prepare_effect_imbufs(x, y, ibuf1, ibuf2, ibuf3);
+
 	build_gammatabs();
 
 	if (out->rect_float) {
@@ -1047,6 +1108,7 @@
 			(unsigned char*) ibuf1->rect, (unsigned char*) ibuf2->rect,
 			(unsigned char*) out->rect);
 	}
+	return out;
 }
 
 
@@ -1143,12 +1205,14 @@
 	}
 }
 
-static void do_add_effect(Scene *scene, Sequence *seq, int cfra,
-			  float facf0, float facf1, int x, int y, 
-			  int preview_render_size,
-			  struct ImBuf *ibuf1, struct ImBuf *ibuf2, 
-			  struct ImBuf *ibuf3, struct ImBuf *out)
+static struct ImBuf * do_add_effect(Scene *scene, Sequence *seq, float cfra,
+				    float facf0, float facf1, int x, int y, 
+				    int preview_render_size,
+				    struct ImBuf *ibuf1, struct ImBuf *ibuf2, 
+				    struct ImBuf *ibuf3)
 {
+	struct ImBuf * out = prepare_effect_imbufs(x, y, ibuf1, ibuf2, ibuf3);
+
 	if (out->rect_float) {
 		do_add_effect_float(
 			facf0, facf1, x, y,
@@ -1160,6 +1224,7 @@
 			(unsigned char*) ibuf1->rect, (unsigned char*) ibuf2->rect,
 			(unsigned char*) out->rect);
 	}
+	return out;
 }
 
 
@@ -1256,12 +1321,15 @@
 	}
 }
 
-static void do_sub_effect(Scene *scene, Sequence *seq, int cfra,
-			  float facf0, float facf1, int x, int y,
-			  int preview_render_size,
-			  struct ImBuf *ibuf1, struct ImBuf *ibuf2, 
-			  struct ImBuf *ibuf3, struct ImBuf *out)
+static struct ImBuf * do_sub_effect(
+	Scene *scene, Sequence *seq, float cfra,
+	float facf0, float facf1, int x, int y,
+	int preview_render_size,
+	struct ImBuf *ibuf1, struct ImBuf *ibuf2, 
+	struct ImBuf *ibuf3)
 {
+	struct ImBuf * out = prepare_effect_imbufs(x, y, ibuf1, ibuf2, ibuf3);
+
 	if (out->rect_float) {
 		do_sub_effect_float(
 			facf0, facf1, x, y,
@@ -1273,6 +1341,7 @@
 			(char*) ibuf1->rect, (char*) ibuf2->rect,
 			(char*) out->rect);
 	}
+	return out;
 }
 
 /* **********************************************************************
@@ -1284,8 +1353,8 @@
 #define YOFF	8
 
 static void do_drop_effect_byte(float facf0, float facf1, int x, int y, 
-				unsigned char *rect2i, unsigned char *rect1i, 
-				unsigned char *outi)
+				char *rect2i, char *rect1i, 
+				char *outi)
 {
 	int height, width, temp, fac, fac1, fac2;
 	char *rt1, *rt2, *out;
@@ -1364,27 +1433,6 @@
 	memcpy(out, rt1, 4 * sizeof(float)*YOFF*width);
 }
 
-
-static void do_drop_effect(Scene *scene, Sequence *seq, int cfra,
-			   float facf0, float facf1, int x, int y, 
-			   int preview_render_size,
-			   struct ImBuf *ibuf1, struct ImBuf *ibuf2, 
-			   struct ImBuf * ibuf3,
-			   struct ImBuf *out)
-{
-	if (out->rect_float) {
-		do_drop_effect_float(
-			facf0, facf1, x, y,
-			ibuf1->rect_float, ibuf2->rect_float,
-			out->rect_float);
-	} else {
-		do_drop_effect_byte(
-			facf0, facf1, x, y,
-			(unsigned char*) ibuf1->rect, (unsigned char*) ibuf2->rect,
-			(unsigned char*) out->rect);
-	}
-}
-
 /* **********************************************************************
    MUL

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list