-/*
- * mlt_geometry.c -- provides the geometry API
+/**
+ * \file mlt_geometry.c
+ * \brief geometry animation API (deprecated)
+ * \deprecated use mlt_animation_s instead
+ *
* Copyright (C) 2004-2005 Ushodaya Enterprises Limited
- * Author: Charles Yates <charles.yates@pandora.be>
+ * \author Charles Yates <charles.yates@pandora.be>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
#include <stdlib.h>
#include <string.h>
+/** private part of geometry animation item (deprecated)
+ * \deprecated use mlt_animation_s instead
+ */
+
typedef struct geometry_item_s
{
struct mlt_geometry_item_s data;
}
*geometry_item;
+/** private part of geometry object (deprecated)
+ * \deprecated use mlt_animation_s instead
+ */
+
typedef struct
{
char *data;
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 );
struct mlt_geometry_item_s item;
char *value = mlt_tokeniser_get_string( tokens, i );
+ // If no data in keyframe, drop it (trailing semicolon)
+ if ( value == NULL || !strcmp( value, "" ) )
+ continue;
+
// Set item to 0
memset( &item, 0, sizeof( struct mlt_geometry_item_s ) );
// 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;
}
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 ), "%g", item.x );
+ if ( item.f[1] ) {
+ strcat( temp, "/" );
+ sprintf( temp + strlen( temp ), "%g", item.y );
+ }
+ if ( item.f[2] ) {
+ strcat( temp, ":" );
+ sprintf( temp + strlen( temp ), "%g", item.w );
+ }
+ if ( item.f[3] ) {
+ strcat( temp, "x" );
+ sprintf( temp + strlen( temp ), "%g", item.h );
+ }
+ if ( item.f[4] ) {
+ strcat( temp, ":" );
+ sprintf( temp + strlen( temp ), "%g", 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;
+ return strdup( ret );
}
// Close the geometry