Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/makesdna/DNA_sequence_types.h3
-rw-r--r--source/blender/src/buttons_scene.c45
-rw-r--r--source/blender/src/sequence.c118
3 files changed, 126 insertions, 40 deletions
diff --git a/source/blender/makesdna/DNA_sequence_types.h b/source/blender/makesdna/DNA_sequence_types.h
index 066e23ca984..d9e87837f0f 100644
--- a/source/blender/makesdna/DNA_sequence_types.h
+++ b/source/blender/makesdna/DNA_sequence_types.h
@@ -79,6 +79,7 @@ typedef struct StripProxy {
typedef struct Strip {
struct Strip *next, *prev;
int rt, len, us, done;
+ int startstill, endstill;
StripElem *stripdata;
char dir[160];
int orx, ory;
@@ -86,6 +87,8 @@ typedef struct Strip {
StripTransform *transform;
StripProxy *proxy;
TStripElem *tstripdata;
+ TStripElem *tstripdata_startstill;
+ TStripElem *tstripdata_endstill;
} Strip;
diff --git a/source/blender/src/buttons_scene.c b/source/blender/src/buttons_scene.c
index 965893ad344..785855410bb 100644
--- a/source/blender/src/buttons_scene.c
+++ b/source/blender/src/buttons_scene.c
@@ -585,27 +585,24 @@ static void seq_panel_editing()
130, 60, 120, 19, &last_seq->endstill,
0.0, MAXFRAMEF, 0.0, 0.0, "End still");
} else {
- if (last_seq->type == SEQ_IMAGE) {
- uiDefButI(block, NUM,
- B_SEQ_BUT_TRANSFORM, "Start-Still",
- 10, 60, 120, 20, &last_seq->startstill,
- 0.0, MAXFRAMEF, 0.0, 0.0, "Start still");
- uiDefButI(block, NUM,
- B_SEQ_BUT_TRANSFORM, "End-Still",
- 130, 60, 120, 19, &last_seq->endstill,
- 0.0, MAXFRAMEF, 0.0, 0.0, "End still");
- } else {
- uiDefButI(block, NUM,
- B_SEQ_BUT_TRANSFORM, "Start-Ofs",
- 10, 60, 120, 20, &last_seq->startofs,
- 0.0, last_seq->len - last_seq->endofs,
- 0.0, 0.0, "Start offset");
- uiDefButI(block, NUM,
- B_SEQ_BUT_TRANSFORM, "End-Ofs",
- 130, 60, 120, 19, &last_seq->endofs,
- 0.0, last_seq->len - last_seq->startofs,
- 0.0, 0.0, "End offset");
- }
+ uiDefButI(block, NUM,
+ B_SEQ_BUT_TRANSFORM, "Start-Still",
+ 10, 60, 120, 20, &last_seq->startstill,
+ 0.0, MAXFRAMEF, 0.0, 0.0, "Start still");
+ uiDefButI(block, NUM,
+ B_SEQ_BUT_TRANSFORM, "End-Still",
+ 130, 60, 120, 19, &last_seq->endstill,
+ 0.0, MAXFRAMEF, 0.0, 0.0, "End still");
+ uiDefButI(block, NUM,
+ B_SEQ_BUT_TRANSFORM, "Start-Ofs",
+ 10, 40, 120, 20, &last_seq->startofs,
+ 0.0, last_seq->len - last_seq->endofs,
+ 0.0, 0.0, "Start offset");
+ uiDefButI(block, NUM,
+ B_SEQ_BUT_TRANSFORM, "End-Ofs",
+ 130, 40, 120, 19, &last_seq->endofs,
+ 0.0, last_seq->len - last_seq->startofs,
+ 0.0, 0.0, "End offset");
}
}
@@ -683,14 +680,14 @@ static void seq_panel_editing()
}
str = strdata;
- yco = 40;
+ yco = 20;
while ((p = strchr(str, '\n'))) {
*p = 0;
- uiDefBut(block, LABEL, 0, str, 10,yco,240,19, 0,
+ uiDefBut(block, LABEL, 0, str, 10,yco,240,17, 0,
0, 0, 0, 0, "");
str = p+1;
- yco -= 20;
+ yco -= 18;
}
}
diff --git a/source/blender/src/sequence.c b/source/blender/src/sequence.c
index fce967973cd..e10d78abd89 100644
--- a/source/blender/src/sequence.c
+++ b/source/blender/src/sequence.c
@@ -129,6 +129,8 @@ void free_strip(Strip *strip)
}
free_tstripdata(strip->len, strip->tstripdata);
+ free_tstripdata(strip->endstill, strip->tstripdata_endstill);
+ free_tstripdata(strip->startstill, strip->tstripdata_startstill);
MEM_freeN(strip);
}
@@ -136,11 +138,16 @@ void free_strip(Strip *strip)
void new_tstripdata(Sequence *seq)
{
if(seq->strip) {
- if (seq->strip->tstripdata) {
- free_tstripdata(seq->strip->len,
- seq->strip->tstripdata);
- }
+ free_tstripdata(seq->strip->len, seq->strip->tstripdata);
+ free_tstripdata(seq->strip->endstill,
+ seq->strip->tstripdata_endstill);
+ free_tstripdata(seq->strip->startstill,
+ seq->strip->tstripdata_startstill);
+
seq->strip->tstripdata= 0;
+ seq->strip->tstripdata_endstill= 0;
+ seq->strip->tstripdata_startstill= 0;
+
seq->strip->len= seq->len;
}
}
@@ -765,6 +772,16 @@ static int give_stripelem_index(Sequence *seq, int cfra)
return nr;
}
+static TStripElem* alloc_tstripdata(int len, const char * name)
+{
+ int i;
+ TStripElem *se = MEM_callocN(len * sizeof(TStripElem), name);
+ for (i = 0; i < len; i++) {
+ se[i].ok = STRIPELEM_OK;
+ }
+ return se;
+}
+
TStripElem *give_tstripelem(Sequence *seq, int cfra)
{
TStripElem *se;
@@ -772,19 +789,65 @@ TStripElem *give_tstripelem(Sequence *seq, int cfra)
se = seq->strip->tstripdata;
if (se == 0 && seq->len > 0) {
- int i;
- se = seq->strip->tstripdata = MEM_callocN(
- seq->len*sizeof(TStripElem), "tstripelems");
- for (i = 0; i < seq->len; i++) {
- se[i].ok = STRIPELEM_OK;
- }
+ se = seq->strip->tstripdata = alloc_tstripdata(seq->len,
+ "tstripelems");
}
nr = give_stripelem_index(seq, cfra);
if (nr == -1) return 0;
if (se == 0) return 0;
+
+ se += nr;
+
+ /* if there are IPOs with blend modes active, one has to watch out
+ for startstill + endstill area: we can't use the same tstripelem
+ here for all ibufs, since then, blending with IPOs won't work!
+
+ Rather common case, if you use a single image and try to fade
+ it in and out...
+
+ Performance TODO: seperate give_tstripelem for ibuf from
+ give_tstripelem for ibuf_comp, so that caching works here again...
+ */
+ if (seq->ipo && seq->ipo->curve.first && !(seq->type & SEQ_EFFECT)) {
+ Strip * s = seq->strip;
+ if (cfra < seq->start) {
+ se = s->tstripdata_startstill;
+ if (seq->startstill > s->startstill) {
+ free_tstripdata(s->startstill,
+ s->tstripdata_startstill);
+ se = 0;
+ }
+
+ if (se == 0) {
+ s->startstill = seq->startstill;
+ se = seq->strip->tstripdata_startstill
+ = alloc_tstripdata(
+ s->startstill,
+ "tstripelems_startstill");
+ }
+ se += seq->start - cfra - 1;
+
+ } else if (cfra > seq->start + seq->len-1) {
+ se = s->tstripdata_endstill;
+ if (seq->endstill > s->endstill) {
+ free_tstripdata(s->endstill,
+ s->tstripdata_endstill);
+ se = 0;
+ }
+
+ if (se == 0) {
+ s->endstill = seq->endstill;
+ se = seq->strip->tstripdata_endstill
+ = alloc_tstripdata(
+ s->endstill,
+ "tstripelems_endstill");
+ }
+ se += cfra - (seq->start + seq->len-1) - 1;
+ }
+ }
+
- se+= nr;
se->nr= nr;
return se;
@@ -2066,9 +2129,24 @@ void free_imbuf_seq_except(int cfra)
if(seq->strip) {
TStripElem * curelem = give_tstripelem(seq, cfra);
- for(a=0, se= seq->strip->tstripdata; a<seq->len; a++, se++)
- if(se != curelem)
+ for(a = 0, se = seq->strip->tstripdata;
+ a < seq->strip->len && se; a++, se++) {
+ if(se != curelem) {
+ free_imbuf_strip_elem(se);
+ }
+ }
+ for(a = 0, se = seq->strip->tstripdata_startstill;
+ a < seq->strip->startstill && se; a++, se++) {
+ if(se != curelem) {
free_imbuf_strip_elem(se);
+ }
+ }
+ for(a = 0, se = seq->strip->tstripdata_endstill;
+ a < seq->strip->endstill && se; a++, se++) {
+ if(se != curelem) {
+ free_imbuf_strip_elem(se);
+ }
+ }
if(seq->type==SEQ_MOVIE)
if(seq->startdisp > cfra || seq->enddisp < cfra)
@@ -2089,9 +2167,17 @@ void free_imbuf_seq()
WHILE_SEQ(&ed->seqbase) {
if(seq->strip) {
- if (seq->strip->tstripdata) {
- for(a=0, se= seq->strip->tstripdata; a<seq->len; a++, se++)
- free_imbuf_strip_elem(se);
+ for(a = 0, se = seq->strip->tstripdata;
+ a < seq->strip->len && se; a++, se++) {
+ free_imbuf_strip_elem(se);
+ }
+ for(a = 0, se = seq->strip->tstripdata_startstill;
+ a < seq->strip->startstill && se; a++, se++) {
+ free_imbuf_strip_elem(se);
+ }
+ for(a = 0, se = seq->strip->tstripdata_endstill;
+ a < seq->strip->endstill && se; a++, se++) {
+ free_imbuf_strip_elem(se);
}
if(seq->type==SEQ_MOVIE)