#include "automation.inc"
#include "clip.h"
#include "edl.h"
+#include "edlsession.h"
#include "localsession.h"
#include "maskauto.h"
#include "maskautos.h"
// Selection is always aligned to frame for masks
// Create new keyframe if auto keyframes or replace entire keyframe.
- if(selection_start == selection_end)
+ if( !edl->session->span_keyframes ||
+ EQUIV(selection_start, selection_end) )
{
// Search for keyframe to write to
MaskAuto *dst = (MaskAuto*)get_auto_for_editing();
-void MaskAutos::get_points(ArrayList<MaskPoint*> *points,
+void MaskAutos::get_points(MaskPoints *points,
int submask,
int64_t position,
int direction)
}
-float MaskAutos::get_feather(int64_t position, int direction)
+double MaskAutos::get_feather(int64_t position, int i, int direction)
{
Auto *begin = 0, *end = 0;
position = (direction == PLAY_FORWARD) ? position : (position - 1);
+ MaskAuto*prev = (MaskAuto*)get_prev_auto(position, PLAY_FORWARD, begin, 1);
+ MaskAuto*next = (MaskAuto*)get_next_auto(position, PLAY_FORWARD, end, 1);
+ SubMask *prev_mask = prev->get_submask(i), *next_mask = next->get_submask(i);
- get_prev_auto(position, PLAY_FORWARD, begin, 1);
- get_next_auto(position, PLAY_FORWARD, end, 1);
+ double weight = end->position == begin->position ? 0.0 :
+ (double)(position - begin->position) / (end->position - begin->position);
- double weight = 0.0;
- if(end->position != begin->position)
- weight = (double)(position - begin->position) / (end->position - begin->position);
-
- return ((MaskAuto*)begin)->feather * (1.0 - weight) + ((MaskAuto*)end)->feather * weight;
+ double result = prev_mask->feather * (1-weight) + next_mask->feather*weight;
+ return result;
}
-int MaskAutos::get_value(int64_t position, int direction)
+double MaskAutos::get_fader(int64_t position, int i, int direction)
{
Auto *begin = 0, *end = 0;
position = (direction == PLAY_FORWARD) ? position : (position - 1);
+ MaskAuto*prev = (MaskAuto*)get_prev_auto(position, PLAY_FORWARD, begin, 1);
+ MaskAuto*next = (MaskAuto*)get_next_auto(position, PLAY_FORWARD, end, 1);
+ SubMask *prev_mask = prev->get_submask(i), *next_mask = next->get_submask(i);
- get_prev_auto(position, PLAY_FORWARD, begin, 1);
- get_next_auto(position, PLAY_FORWARD, end, 1);
+ double weight = end->position == begin->position ? 0.0 :
+ (double)(position - begin->position) / (end->position - begin->position);
- double weight = 0.0;
- if(end->position != begin->position)
- weight = (double)(position - begin->position) / (end->position - begin->position);
-
- int result = (int)((double)((MaskAuto*)begin)->value * (1.0 - weight) +
- (double)((MaskAuto*)end)->value * weight + 0.5);
-// printf("MaskAutos::get_value %d %d %f %d %f %d\n", __LINE__,
-// ((MaskAuto*)begin)->value, 1.0 - weight, ((MaskAuto*)end)->value, weight, result);
+ double result = prev_mask->fader * (1-weight) + next_mask->fader*weight;
+// printf("MaskAutos::get_fader %d %d %d %f %d %f %d\n", __LINE__, i,
+// ((MaskAuto*)begin)->fader, 1.0 - weight, ((MaskAuto*)end)->fader, weight, result);
return result;
}
return new MaskAuto(edl, this);
}
-void MaskAutos::dump()
+void MaskAutos::dump(FILE *fp)
{
- printf(" MaskAutos::dump %p\n", this);
- printf(" Default: position %jd submasks %d\n",
+ fprintf(fp, " MaskAutos::dump %p\n", this);
+ fprintf(fp, " Default: position %jd submasks %d\n",
default_auto->position,
((MaskAuto*)default_auto)->masks.total);
- ((MaskAuto*)default_auto)->dump();
- for(Auto* current = first; current; current = NEXT)
- {
- printf(" position %jd masks %d\n",
+ ((MaskAuto*)default_auto)->dump(fp);
+ for( Auto* current = first; current; current=NEXT ) {
+ fprintf(fp, " position %jd masks %d\n",
current->position,
((MaskAuto*)current)->masks.total);
- ((MaskAuto*)current)->dump();
+ ((MaskAuto*)current)->dump(fp);
}
}
MaskAuto* keyframe = (MaskAuto*)get_prev_auto(position, direction, current);
-
-
- for(int i = 0; i < keyframe->masks.total; i++)
- {
+ for( int i = 0; i < keyframe->masks.total; i++ ) {
SubMask *mask = keyframe->get_submask(i);
if(mask->points.total > 1)
return 1;
int MaskAutos::total_submasks(int64_t position, int direction)
{
position = (direction == PLAY_FORWARD) ? position : (position - 1);
- for(MaskAuto* current = (MaskAuto*)last;
- current;
- current = (MaskAuto*)PREVIOUS)
- {
- if(current->position <= position)
- {
+ for( MaskAuto* current=(MaskAuto*)last; current; current=(MaskAuto*)PREVIOUS ) {
+ if( current->position <= position ) {
return current->masks.total;
}
}
void MaskAutos::translate_masks(float translate_x, float translate_y)
{
((MaskAuto *)default_auto)->translate_submasks(translate_x, translate_y);
- for(MaskAuto* current = (MaskAuto*)first;
- current;
- current = (MaskAuto*)NEXT)
- {
+ for( MaskAuto* current=(MaskAuto*)first; current; current=(MaskAuto*)NEXT ) {
current->translate_submasks(translate_x, translate_y);
}
}