return start + position * o;
}
-static void mlt_geometry_virtual_refresh( mlt_geometry self )
+void mlt_geometry_interpolate( mlt_geometry self )
{
geometry g = self->local;
static void mlt_geometry_clean( mlt_geometry self )
{
geometry g = self->local;
- free( g->data );
+ if ( g->data )
+ free( g->data );
g->data = NULL;
while( g->item )
mlt_geometry_drop( self, g->item );
// Now insert into place
mlt_geometry_insert( self, &item );
}
+ mlt_geometry_interpolate( self );
// Remove the tokeniser
mlt_tokeniser_close( tokens );
g->item->data.f[4] = 1;
}
- // Refresh all geometries
- mlt_geometry_virtual_refresh( self );
-
// TODO: Error checking
return 0;
}
if ( place != NULL && position == place->data.frame )
ret = mlt_geometry_drop( self, place );
- // Refresh all geometries
- mlt_geometry_virtual_refresh( self );
-
return ret;
}
return place == NULL;
}
+#define ISINT(x) ( (x) == (int64_t) (x) )
+#define PICKFMT(x) ( ISINT(x) ? "%.0f" : "%f" )
+
char *mlt_geometry_serialise_cut( mlt_geometry self, int in, int out )
{
geometry g = self->local;
if ( item.frame - in != 0 )
sprintf( temp, "%d=", item.frame - in );
- if ( item.f[0] )
- sprintf( temp + strlen( temp ), "%.0f", item.x );
- strcat( temp, "/" );
- if ( item.f[1] )
- sprintf( temp + strlen( temp ), "%.0f", item.y );
- strcat( temp, ":" );
- if ( item.f[2] )
- sprintf( temp + strlen( temp ), "%.0f", item.w );
- strcat( temp, "x" );
- if ( item.f[3] )
- sprintf( temp + strlen( temp ), "%.0f", item.h );
- if ( item.f[4] )
- sprintf( temp + strlen( temp ), ":%.0f", item.mix );
-
- if ( used + strlen( temp ) > size )
+ if ( item.f[0] )
+ sprintf( temp + strlen( temp ), PICKFMT( item.x ), item.x );
+ if ( item.f[1] ) {
+ strcat( temp, "/" );
+ sprintf( temp + strlen( temp ), PICKFMT( item.y ), item.y );
+ }
+ if ( item.f[2] ) {
+ strcat( temp, ":" );
+ sprintf( temp + strlen( temp ), PICKFMT( item.w ), item.w );
+ }
+ if ( item.f[3] ) {
+ strcat( temp, "x" );
+ sprintf( temp + strlen( temp ), PICKFMT( item.h ), item.h );
+ }
+ if ( item.f[4] ) {
+ strcat( temp, ":" );
+ sprintf( temp + strlen( temp ), PICKFMT( item.mix ), item.mix );
+ }
+
+ if ( used + strlen( temp ) + 2 > size ) // +2 for ';' and NULL
{
size += 1000;
ret = realloc( ret, size );
char *ret = mlt_geometry_serialise_cut( self, 0, g->length );
if ( ret )
{
- free( g->data );
+ if ( g->data )
+ free( g->data );
g->data = ret;
}
return ret;