]> git.sesse.net Git - mlt/blobdiff - src/framework/mlt_geometry.c
Avoid unnecessary compilation when running "./configure; make; make install" multiple...
[mlt] / src / framework / mlt_geometry.c
index 89230b038023dd3fd8eaa0fba6a6dbbd77b1fdad..6b41d3306e7fd32ff7ac1d7400a53c1f89f33138 100644 (file)
@@ -1,7 +1,10 @@
-/*
- * 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;
@@ -34,6 +41,10 @@ typedef struct geometry_item_s
 }
 *geometry_item;
 
+/** private part of geometry object (deprecated)
+ * \deprecated use mlt_animation_s instead
+ */
+
 typedef struct
 {
        char *data;
@@ -75,7 +86,7 @@ static inline double linearstep( double start, double end, double position, int
        return start + position * o;
 }
 
-static void mlt_geometry_virtual_refresh( mlt_geometry self )
+void mlt_geometry_interpolate( mlt_geometry self )
 {
        geometry g = self->local;
 
@@ -191,7 +202,8 @@ static int mlt_geometry_drop( mlt_geometry self, geometry_item item )
 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 );
@@ -234,6 +246,10 @@ int mlt_geometry_parse( mlt_geometry self, char *data, int length, int nw, int n
                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 ) );
 
@@ -243,6 +259,7 @@ int mlt_geometry_parse( mlt_geometry self, char *data, int length, int nw, int n
                // Now insert into place
                mlt_geometry_insert( self, &item );
        }
+       mlt_geometry_interpolate( self );
 
        // Remove the tokeniser
        mlt_tokeniser_close( tokens );
@@ -504,9 +521,6 @@ int mlt_geometry_insert( mlt_geometry self, mlt_geometry_item item )
                g->item->data.f[4] = 1;
        }
 
-       // Refresh all geometries
-       mlt_geometry_virtual_refresh( self );
-
        // TODO: Error checking
        return 0;
 }
@@ -528,9 +542,6 @@ int mlt_geometry_remove( mlt_geometry self, int position )
        if ( place != NULL && position == place->data.frame )
                ret = mlt_geometry_drop( self, place );
 
-       // Refresh all geometries
-       mlt_geometry_virtual_refresh( self );
-
        return ret;
 }
 
@@ -635,21 +646,26 @@ char *mlt_geometry_serialise_cut( mlt_geometry self, int in, int out )
                        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 );
@@ -680,10 +696,11 @@ char *mlt_geometry_serialise( mlt_geometry self )
        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