[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