Xcos scopes: use a coordinates array to one shot push XYZ data 29/10029/2
Clément DAVID [Thu, 13 Dec 2012 19:34:39 +0000 (20:34 +0100)]
Change-Id: I41fb59b95feb9b81d4ff4d2a84151099218d8751

scilab/modules/scicos_blocks/src/c/canimxy.c
scilab/modules/scicos_blocks/src/c/canimxy3d.c
scilab/modules/scicos_blocks/src/c/cfscope.c
scilab/modules/scicos_blocks/src/c/cmscope.c
scilab/modules/scicos_blocks/src/c/cscope.c
scilab/modules/scicos_blocks/src/c/cscopxy.c
scilab/modules/scicos_blocks/src/c/cscopxy3d.c

index 196f23b..d0ce53a 100644 (file)
@@ -50,7 +50,7 @@ typedef struct
     {
         int numberOfPoints;
         int maxNumberOfPoints;
-        double ***data;
+        double **coordinates;
     } internal;
 
     struct
@@ -206,7 +206,7 @@ SCICOS_BLOCKS_IMPEXP void canimxy(scicos_block * block, scicos_flag flag)
 static sco_data *getScoData(scicos_block * block)
 {
     sco_data *sco = (sco_data *) * (block->work);
-    int i, j, k, l;
+    int i, j;
 
     if (sco == NULL)
     {
@@ -216,29 +216,26 @@ static sco_data *getScoData(scicos_block * block)
 
         sco = (sco_data *) MALLOC(sizeof(sco_data));
         if (sco == NULL)
+        {
             goto error_handler_sco;
+        }
 
         sco->internal.numberOfPoints = 0;
         sco->internal.maxNumberOfPoints = block->ipar[2];
 
-        sco->internal.data = (double ***)CALLOC(block->nin, sizeof(double **));
-        if (sco->internal.data == NULL)
-            goto error_handler_data;
-
-        for (i = 0; i < block->nin; i++)
+        sco->internal.coordinates = (double **)CALLOC(block->insz[0], sizeof(double *));
+        if (sco->internal.coordinates == NULL)
         {
-            sco->internal.data[i] = (double **)CALLOC(block->insz[i], sizeof(double *));
-            if (sco->internal.data[i] == NULL)
-                goto error_handler_data_i;
+            goto error_handler_coordinates;
         }
-        for (i = 0; i < block->nin; i++)
+
+        for (i = 0; i < block->insz[0]; i++)
         {
-            for (j = 0; j < block->insz[i]; j++)
-            {
-                sco->internal.data[i][j] = (double *)CALLOC(block->ipar[2], sizeof(double));
+            sco->internal.coordinates[i] = (double *)CALLOC(3 * block->ipar[2], sizeof(double));
 
-                if (sco->internal.data[i][j] == NULL)
-                    goto error_handler_data_ij;
+            if (sco->internal.coordinates[i] == NULL)
+            {
+                goto error_handler_coordinates_i;
             }
         }
 
@@ -256,22 +253,13 @@ static sco_data *getScoData(scicos_block * block)
      * Error management (out of normal flow)
      */
 
-error_handler_data_ij:
-    for (k = 0; k < i; k++)
-    {
-        for (l = 0; l < j; l++)
-        {
-            FREE(sco->internal.data[k][l]);
-        }
-    }
-    i = block->nin - 1;
-error_handler_data_i:
+error_handler_coordinates_i:
     for (j = 0; j < i; j++)
     {
-        FREE(sco->internal.data[i]);
+        FREE(sco->internal.coordinates[i]);
     }
-    FREE(sco->internal.data);
-error_handler_data:
+    FREE(sco->internal.coordinates);
+error_handler_coordinates:
     FREE(sco);
 error_handler_sco:
     // allocation error
@@ -282,20 +270,15 @@ error_handler_sco:
 static void freeScoData(scicos_block * block)
 {
     sco_data *sco = (sco_data *) * (block->work);
-    int i, j;
+    int i;
 
     if (sco != NULL)
     {
-        for (i = 0; i < block->nin; i++)
+        for (i = 0; i < block->insz[0]; i++)
         {
-            for (j = 0; j < block->insz[i]; j++)
-            {
-                FREE(sco->internal.data[i][j]);
-            }
-            FREE(sco->internal.data[i]);
+            FREE(sco->internal.coordinates[i]);
         }
-
-        FREE(sco->internal.data);
+        FREE(sco->internal.coordinates);
 
         for (i = 0; i < block->insz[0]; i++)
         {
@@ -328,11 +311,11 @@ static void appendData(scicos_block * block, double *x, double *y)
         // on a full scope, push data
         for (i = 0; i < block->insz[0]; i++)
         {
-            memmove(sco->internal.data[0][i], &sco->internal.data[0][i][1], setLen * sizeof(double));
-            sco->internal.data[0][i][setLen] = x[i];
+            memmove(sco->internal.coordinates[i], sco->internal.coordinates[i] + 1, setLen * sizeof(double));
+            sco->internal.coordinates[i][setLen] = x[i];
 
-            memmove(sco->internal.data[1][i], &sco->internal.data[1][i][1], setLen * sizeof(double));
-            sco->internal.data[1][i][setLen] = y[i];
+            memmove(sco->internal.coordinates[i] + maxNumberOfPoints, sco->internal.coordinates[i] + maxNumberOfPoints + 1, setLen * sizeof(double));
+            sco->internal.coordinates[i][maxNumberOfPoints + setLen] = y[i];
         }
 
         // then return
@@ -350,8 +333,12 @@ static void appendData(scicos_block * block, double *x, double *y)
         {
             for (setLen = maxNumberOfPoints - numberOfPoints - 1; setLen >= 0; setLen--)
             {
-                sco->internal.data[0][i][numberOfPoints + setLen] = x[i];
-                sco->internal.data[1][i][numberOfPoints + setLen] = y[i];
+                sco->internal.coordinates[i][numberOfPoints + setLen] = x[i];
+            }
+
+            for (setLen = maxNumberOfPoints - numberOfPoints - 1; setLen >= 0; setLen--)
+            {
+                sco->internal.coordinates[i][maxNumberOfPoints + numberOfPoints + setLen] = y[i];
             }
         }
 
@@ -365,8 +352,7 @@ static BOOL pushData(scicos_block * block, int row)
     char *pAxeUID;
     char *pPolylineUID;
 
-    double *x;
-    double *y;
+    double *coordinates;
     sco_data *sco;
 
     BOOL result = TRUE;
@@ -377,15 +363,14 @@ static BOOL pushData(scicos_block * block, int row)
 
     sco = getScoData(block);
     if (sco == NULL)
+    {
         return FALSE;
+    }
 
     // select the right input and row
-    x = sco->internal.data[0][row];
-    y = sco->internal.data[1][row];
-
-    result &= setGraphicObjectProperty(pPolylineUID, __GO_DATA_MODEL_X__, x, jni_double_vector, sco->internal.maxNumberOfPoints);
-    result &= setGraphicObjectProperty(pPolylineUID, __GO_DATA_MODEL_Y__, y, jni_double_vector, sco->internal.maxNumberOfPoints);
+    coordinates = sco->internal.coordinates[row];
 
+    return setGraphicObjectProperty(pPolylineUID, __GO_DATA_MODEL_COORDINATES__, coordinates, jni_double_vector, sco->internal.maxNumberOfPoints);
     return result;
 }
 
index 217a4bb..0375a20 100644 (file)
@@ -50,7 +50,7 @@ typedef struct
     {
         int numberOfPoints;
         int maxNumberOfPoints;
-        double ***data;
+        double **coordinates;
     } internal;
 
     struct
@@ -210,7 +210,7 @@ SCICOS_BLOCKS_IMPEXP void canimxy3d(scicos_block * block, scicos_flag flag)
 static sco_data *getScoData(scicos_block * block)
 {
     sco_data *sco = (sco_data *) * (block->work);
-    int i, j, k, l;
+    int i, j;
 
     if (sco == NULL)
     {
@@ -220,29 +220,26 @@ static sco_data *getScoData(scicos_block * block)
 
         sco = (sco_data *) MALLOC(sizeof(sco_data));
         if (sco == NULL)
+        {
             goto error_handler_sco;
+        }
 
         sco->internal.numberOfPoints = 0;
         sco->internal.maxNumberOfPoints = block->ipar[2];
 
-        sco->internal.data = (double ***)CALLOC(block->nin, sizeof(double **));
-        if (sco->internal.data == NULL)
-            goto error_handler_data;
-
-        for (i = 0; i < block->nin; i++)
+        sco->internal.coordinates = (double **)CALLOC(block->insz[0], sizeof(double *));
+        if (sco->internal.coordinates == NULL)
         {
-            sco->internal.data[i] = (double **)CALLOC(block->insz[i], sizeof(double *));
-            if (sco->internal.data[i] == NULL)
-                goto error_handler_data_i;
+            goto error_handler_coordinates;
         }
-        for (i = 0; i < block->nin; i++)
+
+        for (i = 0; i < block->insz[0]; i++)
         {
-            for (j = 0; j < block->insz[i]; j++)
-            {
-                sco->internal.data[i][j] = (double *)CALLOC(block->ipar[2], sizeof(double));
+            sco->internal.coordinates[i] = (double *)CALLOC(3 * block->ipar[2], sizeof(double));
 
-                if (sco->internal.data[i][j] == NULL)
-                    goto error_handler_data_ij;
+            if (sco->internal.coordinates[i] == NULL)
+            {
+                goto error_handler_coordinates_i;
             }
         }
 
@@ -260,22 +257,13 @@ static sco_data *getScoData(scicos_block * block)
      * Error management (out of normal flow)
      */
 
-error_handler_data_ij:
-    for (k = 0; k < i; k++)
-    {
-        for (l = 0; l < j; l++)
-        {
-            FREE(sco->internal.data[k][l]);
-        }
-    }
-    i = block->nin - 1;
-error_handler_data_i:
+error_handler_coordinates_i:
     for (j = 0; j < i; j++)
     {
-        FREE(sco->internal.data[i]);
+        FREE(sco->internal.coordinates[i]);
     }
-    FREE(sco->internal.data);
-error_handler_data:
+    FREE(sco->internal.coordinates);
+error_handler_coordinates:
     FREE(sco);
 error_handler_sco:
     // allocation error
@@ -286,20 +274,15 @@ error_handler_sco:
 static void freeScoData(scicos_block * block)
 {
     sco_data *sco = (sco_data *) * (block->work);
-    int i, j;
+    int i;
 
     if (sco != NULL)
     {
-        for (i = 0; i < block->nin; i++)
+        for (i = 0; i < block->insz[0]; i++)
         {
-            for (j = 0; j < block->insz[i]; j++)
-            {
-                FREE(sco->internal.data[i][j]);
-            }
-            FREE(sco->internal.data[i]);
+            FREE(sco->internal.coordinates[i]);
         }
-
-        FREE(sco->internal.data);
+        FREE(sco->internal.coordinates);
 
         for (i = 0; i < block->insz[0]; i++)
         {
@@ -327,19 +310,19 @@ static void appendData(scicos_block * block, double *x, double *y, double *z)
      */
     if (sco != NULL && numberOfPoints >= maxNumberOfPoints)
     {
-        unsigned int setLen = (unsigned int)maxNumberOfPoints - 1;
+        int setLen = maxNumberOfPoints - 1;
 
         // on a full scope, push data
         for (i = 0; i < block->insz[0]; i++)
         {
-            memmove(sco->internal.data[0][i], &sco->internal.data[0][i][1], setLen * sizeof(double));
-            sco->internal.data[0][i][setLen] = x[i];
+            memmove(sco->internal.coordinates[i], sco->internal.coordinates[i] + 1, setLen * sizeof(double));
+            sco->internal.coordinates[i][setLen] = x[i];
 
-            memmove(sco->internal.data[1][i], &sco->internal.data[1][i][1], setLen * sizeof(double));
-            sco->internal.data[1][i][setLen] = y[i];
+            memmove(sco->internal.coordinates[i] + maxNumberOfPoints, sco->internal.coordinates[i] + maxNumberOfPoints + 1, setLen * sizeof(double));
+            sco->internal.coordinates[i][maxNumberOfPoints + setLen] = y[i];
 
-            memmove(sco->internal.data[2][i], &sco->internal.data[2][i][1], setLen * sizeof(double));
-            sco->internal.data[2][i][setLen] = z[i];
+            memmove(sco->internal.coordinates[i] + 2 * maxNumberOfPoints, sco->internal.coordinates[i] + 2 * maxNumberOfPoints + 1, setLen * sizeof(double));
+            sco->internal.coordinates[i][2 * maxNumberOfPoints + setLen] = z[i];
         }
 
         // then return
@@ -357,9 +340,17 @@ static void appendData(scicos_block * block, double *x, double *y, double *z)
         {
             for (setLen = maxNumberOfPoints - numberOfPoints - 1; setLen >= 0; setLen--)
             {
-                sco->internal.data[0][i][numberOfPoints + setLen] = x[i];
-                sco->internal.data[1][i][numberOfPoints + setLen] = y[i];
-                sco->internal.data[2][i][numberOfPoints + setLen] = z[i];
+                sco->internal.coordinates[i][numberOfPoints + setLen] = x[i];
+            }
+
+            for (setLen = maxNumberOfPoints - numberOfPoints - 1; setLen >= 0; setLen--)
+            {
+                sco->internal.coordinates[i][maxNumberOfPoints + numberOfPoints + setLen] = y[i];
+            }
+
+            for (setLen = maxNumberOfPoints - numberOfPoints - 1; setLen >= 0; setLen--)
+            {
+                sco->internal.coordinates[i][2 * maxNumberOfPoints + numberOfPoints + setLen] = z[i];
             }
         }
 
@@ -373,31 +364,23 @@ static BOOL pushData(scicos_block * block, int row)
     char *pAxeUID;
     char *pPolylineUID;
 
-    double *x;
-    double *y;
-    double *z;
+    double *coordinates;
     sco_data *sco;
 
-    BOOL result = TRUE;
-
     pFigureUID = getFigure(block);
     pAxeUID = getAxe(pFigureUID, block);
     pPolylineUID = getPolyline(pAxeUID, block, row);
 
     sco = getScoData(block);
     if (sco == NULL)
+    {
         return FALSE;
+    }
 
     // select the right input and row
-    x = sco->internal.data[0][row];
-    y = sco->internal.data[1][row];
-    z = sco->internal.data[2][row];
-
-    result &= setGraphicObjectProperty(pPolylineUID, __GO_DATA_MODEL_X__, x, jni_double_vector, sco->internal.maxNumberOfPoints);
-    result &= setGraphicObjectProperty(pPolylineUID, __GO_DATA_MODEL_Y__, y, jni_double_vector, sco->internal.maxNumberOfPoints);
-    result &= setGraphicObjectProperty(pPolylineUID, __GO_DATA_MODEL_Z__, z, jni_double_vector, sco->internal.maxNumberOfPoints);
+    coordinates = sco->internal.coordinates[row];
 
-    return result;
+    return setGraphicObjectProperty(pPolylineUID, __GO_DATA_MODEL_COORDINATES__, coordinates, jni_double_vector, sco->internal.maxNumberOfPoints);
 }
 
 /*****************************************************************************
index 3caa266..fd41298 100644 (file)
@@ -51,8 +51,7 @@ typedef struct
     {
         int numberOfPoints;
         int maxNumberOfPoints;
-        double *time;
-        double ***data;
+        double ***coordinates;
     } internal;
 
     struct
@@ -196,7 +195,7 @@ SCICOS_BLOCKS_IMPEXP void cfscope(scicos_block * block, scicos_flag flag)
             {
                 // allocation error
                 set_block_error(-5);
-                return;
+                break;
             }
 
             t = get_scicos_time();
@@ -263,38 +262,40 @@ static sco_data *getScoData(scicos_block * block)
 
         sco = (sco_data *) MALLOC(sizeof(sco_data));
         if (sco == NULL)
+        {
             goto error_handler_sco;
+        }
 
         sco->internal.numberOfPoints = 0;
         sco->internal.maxNumberOfPoints = block->ipar[2];
 
-        sco->internal.data = (double ***)CALLOC(1, sizeof(double **));
-        if (sco->internal.data == NULL)
-            goto error_handler_data;
+        sco->internal.coordinates = (double ***)CALLOC(1, sizeof(double **));
+        if (sco->internal.coordinates == NULL)
+        {
+            goto error_handler_coordinates;
+        }
 
         for (i = 0; i < 1; i++)
         {
-            sco->internal.data[i] = (double **)CALLOC(links_count, sizeof(double *));
-            if (sco->internal.data[i] == NULL)
-                goto error_handler_data_i;
+            sco->internal.coordinates[i] = (double **)CALLOC(links_count, sizeof(double *));
+            if (sco->internal.coordinates[i] == NULL)
+            {
+                goto error_handler_coordinates_i;
+            }
         }
         for (i = 0; i < 1; i++)
         {
             for (j = 0; j < links_count; j++)
             {
-                sco->internal.data[i][j] = (double *)CALLOC(block->ipar[2], sizeof(double));
+                sco->internal.coordinates[i][j] = (double *)CALLOC(3 * block->ipar[2], sizeof(double));
 
-                if (sco->internal.data[i][j] == NULL)
-                    goto error_handler_data_ij;
+                if (sco->internal.coordinates[i][j] == NULL)
+                {
+                    goto error_handler_coordinates_ij;
+                }
             }
         }
 
-        sco->internal.time = (double *)CALLOC(block->ipar[2], sizeof(double));
-        if (sco->internal.time == NULL)
-        {
-            goto error_handler_time;
-        }
-
         sco->scope.periodCounter = 0;
         sco->scope.cachedFigureUID = NULL;
         sco->scope.cachedAxeUID = NULL;
@@ -309,23 +310,22 @@ static sco_data *getScoData(scicos_block * block)
      * Error management (out of normal flow)
      */
 
-error_handler_time:
-error_handler_data_ij:
+error_handler_coordinates_ij:
     for (k = 0; k < i; k++)
     {
         for (l = 0; l < j; l++)
         {
-            FREE(sco->internal.data[k][l]);
+            FREE(sco->internal.coordinates[k][l]);
         }
     }
     i = 1;
-error_handler_data_i:
+error_handler_coordinates_i:
     for (j = 0; j < i; j++)
     {
-        FREE(sco->internal.data[i]);
+        FREE(sco->internal.coordinates[i]);
     }
-    FREE(sco->internal.data);
-error_handler_data:
+    FREE(sco->internal.coordinates);
+error_handler_coordinates:
     FREE(sco);
 error_handler_sco:
     // allocation error
@@ -345,13 +345,11 @@ static void freeScoData(scicos_block * block)
         {
             for (j = 0; j < links_count; j++)
             {
-                FREE(sco->internal.data[i][j]);
+                FREE(sco->internal.coordinates[i][j]);
             }
-            FREE(sco->internal.data[i]);
+            FREE(sco->internal.coordinates[i]);
         }
-
-        FREE(sco->internal.data);
-        FREE(sco->internal.time);
+        FREE(sco->internal.coordinates);
 
         for (i = 0; i < links_count; i++)
         {
@@ -373,29 +371,38 @@ static sco_data *reallocScoData(scicos_block * block, int numberOfPoints)
     int setLen;
     int links_count = block->ipar[15];
     int previousNumberOfPoints = sco->internal.maxNumberOfPoints;
+    int newPoints = numberOfPoints - previousNumberOfPoints;
 
     for (i = 0; i < 1; i++)
     {
         for (j = 0; j < links_count; j++)
         {
-            ptr = (double *)REALLOC(sco->internal.data[i][j], numberOfPoints * sizeof(double));
+            ptr = (double *)REALLOC(sco->internal.coordinates[i][j], 3 * numberOfPoints * sizeof(double));
             if (ptr == NULL)
+            {
                 goto error_handler;
+            }
 
-            for (setLen = numberOfPoints - previousNumberOfPoints - 1; setLen >= 0; setLen--)
+            // clear the last points, the Z-axis values
+            memset(ptr + 2 * numberOfPoints, 0, numberOfPoints * sizeof(double));
+
+            // memcpy existing Y-axis values (use memmove to handle memory overlapping)
+            memmove(ptr + numberOfPoints, ptr + previousNumberOfPoints, previousNumberOfPoints * sizeof(double));
+
+            // then set the last points to the last values for Y-axis and X-axis values
+            for (setLen = newPoints - 1; setLen >= 0; setLen--)
+            {
+                ptr[numberOfPoints + previousNumberOfPoints + setLen] = ptr[numberOfPoints + previousNumberOfPoints - 1];
+            }
+            for (setLen = newPoints - 1; setLen >= 0; setLen--)
+            {
                 ptr[previousNumberOfPoints + setLen] = ptr[previousNumberOfPoints - 1];
-            sco->internal.data[i][j] = ptr;
+            }
+
+            sco->internal.coordinates[i][j] = ptr;
         }
     }
 
-    ptr = (double *)REALLOC(sco->internal.time, numberOfPoints * sizeof(double));
-    if (ptr == NULL)
-        goto error_handler;
-
-    for (setLen = numberOfPoints - previousNumberOfPoints - 1; setLen >= 0; setLen--)
-        ptr[previousNumberOfPoints + setLen] = ptr[previousNumberOfPoints - 1];
-    sco->internal.time = ptr;
-
     sco->internal.maxNumberOfPoints = numberOfPoints;
     return sco;
 
@@ -459,12 +466,20 @@ static void appendData(scicos_block * block, int input, double t, double *data)
 
         for (i = 0; i < links_count; i++)
         {
+            // X-axis values first
             for (setLen = maxNumberOfPoints - numberOfPoints - 1; setLen >= 0; setLen--)
-                sco->internal.data[input][i][numberOfPoints + setLen] = data[i];
-        }
+            {
+                sco->internal.coordinates[input][i][numberOfPoints + setLen] = t;
+            }
 
-        for (setLen = maxNumberOfPoints - numberOfPoints - 1; setLen >= 0; setLen--)
-            sco->internal.time[numberOfPoints + setLen] = t;
+            // then Y-axis values
+            for (setLen = maxNumberOfPoints - numberOfPoints - 1; setLen >= 0; setLen--)
+            {
+                sco->internal.coordinates[input][i][maxNumberOfPoints + numberOfPoints + setLen] = data[i];
+            }
+
+            // do not update Z-axis values, always cleared
+        }
 
         sco->internal.numberOfPoints++;
     }
@@ -479,23 +494,20 @@ static BOOL pushData(scicos_block * block, int input, int row)
     double *data;
     sco_data *sco;
 
-    BOOL result = TRUE;
-
     pFigureUID = getFigure(block);
     pAxeUID = getAxe(pFigureUID, block, input);
     pPolylineUID = getPolyline(pAxeUID, block, row);
 
     sco = getScoData(block);
     if (sco == NULL)
+    {
         return FALSE;
+    }
 
     // select the right input and row
-    data = sco->internal.data[input][row];
+    data = sco->internal.coordinates[input][row];
 
-    result &= setGraphicObjectProperty(pPolylineUID, __GO_DATA_MODEL_X__, sco->internal.time, jni_double_vector, sco->internal.maxNumberOfPoints);
-    result &= setGraphicObjectProperty(pPolylineUID, __GO_DATA_MODEL_Y__, data, jni_double_vector, sco->internal.maxNumberOfPoints);
-
-    return result;
+    return setGraphicObjectProperty(pPolylineUID, __GO_DATA_MODEL_COORDINATES__, data, jni_double_vector, sco->internal.maxNumberOfPoints);
 }
 
 /*****************************************************************************
@@ -651,7 +663,7 @@ static char *getAxe(char const* pFigureUID, scicos_block * block, int input)
     }
 
     /*
-     * then cache with a local storage
+     * then cache with local storage
      */
     if (pAxe != NULL && sco->scope.cachedAxeUID == NULL)
     {
@@ -664,7 +676,6 @@ static char *getAxe(char const* pFigureUID, scicos_block * block, int input)
 static char *getPolyline(char *pAxeUID, scicos_block * block, int row)
 {
     char *pPolyline;
-    double d__0 = 0.0;
     BOOL b__true = TRUE;
 
     int color;
@@ -696,7 +707,6 @@ static char *getPolyline(char *pAxeUID, scicos_block * block, int row)
         {
             createDataObject(pPolyline, __GO_POLYLINE__);
             setGraphicObjectRelationship(pAxeUID, pPolyline);
-
         }
     }
 
@@ -714,9 +724,6 @@ static char *getPolyline(char *pAxeUID, scicos_block * block, int row)
             setGraphicObjectProperty(pPolyline, __GO_DATA_MODEL_NUM_ELEMENTS_ARRAY__, polylineSize, jni_int_vector, 2);
         }
 
-        setGraphicObjectProperty(pPolyline, __GO_DATA_MODEL_X__, &d__0, jni_double_vector, 1);
-        setGraphicObjectProperty(pPolyline, __GO_DATA_MODEL_Y__, &d__0, jni_double_vector, 1);
-
         color = block->ipar[3 + row];
         if (color > 0)
         {
index bb000d0..e154dc3 100644 (file)
@@ -55,8 +55,7 @@ typedef struct
     {
         int *numberOfPoints;
         int *maxNumberOfPoints;
-        double **time;
-        double ***data;
+        double ***coordinates;
     } internal;
 
     struct
@@ -259,14 +258,20 @@ static sco_data *getScoData(scicos_block * block)
 
         sco = (sco_data *) MALLOC(sizeof(sco_data));
         if (sco == NULL)
+        {
             goto error_handler_sco;
+        }
 
         sco->internal.numberOfPoints = (int *) MALLOC(block->nin * sizeof(int));
         if (sco->internal.numberOfPoints == NULL)
+        {
             goto error_handler_numberOfPoints;
+        }
         sco->internal.maxNumberOfPoints = (int *) MALLOC(block->nin * sizeof(int));
         if (sco->internal.maxNumberOfPoints == NULL)
+        {
             goto error_handler_maxNumberOfPoints;
+        }
 
         for (i = 0; i < block->nin; i++)
         {
@@ -274,44 +279,38 @@ static sco_data *getScoData(scicos_block * block)
             sco->internal.maxNumberOfPoints[i] = block->ipar[2];
         }
 
-        sco->internal.data = (double ***)CALLOC(block->nin, sizeof(double **));
-        if (sco->internal.data == NULL)
-            goto error_handler_data;
-
-        for (i = 0; i < block->nin; i++)
+        sco->internal.coordinates = (double ***)CALLOC(block->nin, sizeof(double **));
+        if (sco->internal.coordinates == NULL)
         {
-            sco->internal.data[i] = (double **)CALLOC(block->insz[i], sizeof(double *));
-            if (sco->internal.data[i] == NULL)
-                goto error_handler_data_i;
+            goto error_handler_coordinates;
         }
+
         for (i = 0; i < block->nin; i++)
         {
-            for (j = 0; j < block->insz[i]; j++)
+            sco->internal.coordinates[i] = (double **)CALLOC(block->insz[i], sizeof(double *));
+            if (sco->internal.coordinates[i] == NULL)
             {
-                sco->internal.data[i][j] = (double *)CALLOC(block->ipar[2], sizeof(double));
-
-                if (sco->internal.data[i][j] == NULL)
-                    goto error_handler_data_ij;
+                goto error_handler_coordinates_i;
             }
         }
-
-        sco->internal.time = (double **) MALLOC(block->nin * sizeof(double));
-        if (sco->internal.time == NULL)
-        {
-            goto error_handler_time;
-        }
         for (i = 0; i < block->nin; i++)
         {
-            sco->internal.time[i] = (double *)CALLOC(block->ipar[2], sizeof(double));
-            if (sco->internal.time[i] == NULL)
+            for (j = 0; j < block->insz[i]; j++)
             {
-                goto error_handler_time_i;
+                sco->internal.coordinates[i][j] = (double *)CALLOC(3 * block->ipar[2], sizeof(double));
+
+                if (sco->internal.coordinates[i][j] == NULL)
+                {
+                    goto error_handler_coordinates_ij;
+                }
             }
         }
 
         sco->scope.periodCounter = (int *) CALLOC(block->nin, sizeof(int));
         if (sco->scope.periodCounter == NULL)
+        {
             goto error_handler_periodCounter;
+        }
 
         sco->scope.cachedFigureUID = NULL;
         sco->scope.cachedAxeUID = (char **)CALLOC(block->nin, sizeof(char *));
@@ -331,31 +330,24 @@ static sco_data *getScoData(scicos_block * block)
      * Error management (out of normal flow)
      */
 error_handler_periodCounter:
-error_handler_time_i:
-    for (k = 0; k < i; k++)
-    {
-        FREE(sco->internal.time[i]);
-    }
     i = block->nin - 1;
     j = 2 ^ 31;
-    FREE(sco->internal.time);
-error_handler_time:
-error_handler_data_ij:
+error_handler_coordinates_ij:
     for (k = 0; k < i; k++)
     {
         for (l = 0; l < j && l < block->insz[i]; l++)
         {
-            FREE(sco->internal.data[k][l]);
+            FREE(sco->internal.coordinates[k][l]);
         }
     }
     i = block->nin - 1;
-error_handler_data_i:
+error_handler_coordinates_i:
     for (j = 0; j < i; j++)
     {
-        FREE(sco->internal.data[i]);
+        FREE(sco->internal.coordinates[i]);
     }
-    FREE(sco->internal.data);
-error_handler_data:
+    FREE(sco->internal.coordinates);
+error_handler_coordinates:
     FREE(sco->internal.maxNumberOfPoints);
 error_handler_maxNumberOfPoints:
     FREE(sco->internal.numberOfPoints);
@@ -378,17 +370,11 @@ static void freeScoData(scicos_block * block)
         {
             for (j = 0; j < block->insz[i]; j++)
             {
-                FREE(sco->internal.data[i][j]);
+                FREE(sco->internal.coordinates[i][j]);
             }
-            FREE(sco->internal.data[i]);
+            FREE(sco->internal.coordinates[i]);
         }
-        FREE(sco->internal.data);
-
-        for (i = 0; i < block->nin; i++)
-        {
-            FREE(sco->internal.time[i]);
-        }
-        FREE(sco->internal.time);
+        FREE(sco->internal.coordinates);
 
         for (i = 0; i < block->nin; i++)
         {
@@ -407,39 +393,41 @@ static void freeScoData(scicos_block * block)
 static sco_data *reallocScoData(scicos_block * block, int input, int numberOfPoints)
 {
     sco_data *sco = (sco_data *) * (block->work);
-    int i, j;
+    int i;
 
     double *ptr;
     int setLen;
     int previousNumberOfPoints = sco->internal.maxNumberOfPoints[input];
+    int newPoints = numberOfPoints - previousNumberOfPoints;
 
     LOG("%s: %s at %d to %d\n", "cmscope", "reallocScoData", input, numberOfPoints);
 
-    for (i = 0; i < block->nin; i++)
+    for (i = 0; i < block->insz[input]; i++)
     {
-        for (j = 0; j < block->insz[i]; j++)
+        ptr = (double *)REALLOC(sco->internal.coordinates[input][i], 3 * numberOfPoints * sizeof(double));
+        if (ptr == NULL)
         {
-            ptr = (double *)REALLOC(sco->internal.data[i][j], numberOfPoints * sizeof(double));
-            if (ptr == NULL)
-                goto error_handler;
-
-            for (setLen = numberOfPoints - previousNumberOfPoints - 1; setLen >= 0; setLen--)
-            {
-                ptr[previousNumberOfPoints + setLen] = ptr[previousNumberOfPoints - 1];
-            }
-            sco->internal.data[i][j] = ptr;
+            goto error_handler;
         }
-    }
 
-    ptr = (double *)REALLOC(sco->internal.time[input], numberOfPoints * sizeof(double));
-    if (ptr == NULL)
-        goto error_handler;
+        // clear the last points, the Z-axis values
+        memset(ptr + 2 * numberOfPoints, 0, numberOfPoints * sizeof(double));
 
-    for (setLen = numberOfPoints - previousNumberOfPoints - 1; setLen >= 0; setLen--)
-    {
-        ptr[previousNumberOfPoints + setLen] = ptr[previousNumberOfPoints - 1];
+        // memcpy existing Y-axis values (use memmove to handle memory overlapping)
+        memmove(ptr + numberOfPoints, ptr + previousNumberOfPoints, previousNumberOfPoints * sizeof(double));
+
+        // then set the last points to the last values for Y-axis and X-axis values
+        for (setLen = newPoints - 1; setLen >= 0; setLen--)
+        {
+            ptr[numberOfPoints + previousNumberOfPoints + setLen] = ptr[numberOfPoints + previousNumberOfPoints - 1];
+        }
+        for (setLen = newPoints - 1; setLen >= 0; setLen--)
+        {
+            ptr[previousNumberOfPoints + setLen] = ptr[previousNumberOfPoints - 1];
+        }
+
+        sco->internal.coordinates[input][i] = ptr;
     }
-    sco->internal.time[input] = ptr;
 
     sco->internal.maxNumberOfPoints[input] = numberOfPoints;
     return sco;
@@ -504,15 +492,19 @@ static void appendData(scicos_block * block, int input, double t, double *data)
 
         for (i = 0; i < block->insz[input]; i++)
         {
+            // X-axis values first
             for (setLen = maxNumberOfPoints - numberOfPoints - 1; setLen >= 0; setLen--)
             {
-                sco->internal.data[input][i][numberOfPoints + setLen] = data[i];
+                sco->internal.coordinates[input][i][numberOfPoints + setLen] = t;
             }
-        }
 
-        for (setLen = maxNumberOfPoints - numberOfPoints - 1; setLen >= 0; setLen--)
-        {
-            sco->internal.time[input][numberOfPoints + setLen] = t;
+            // then Y-axis values
+            for (setLen = maxNumberOfPoints - numberOfPoints - 1; setLen >= 0; setLen--)
+            {
+                sco->internal.coordinates[input][i][maxNumberOfPoints + numberOfPoints + setLen] = data[i];
+            }
+
+            // do not update Z-axis values, always cleared
         }
 
         sco->internal.numberOfPoints[input]++;
@@ -528,24 +520,20 @@ static BOOL pushData(scicos_block * block, int input, int row)
     double *data;
     sco_data *sco;
 
-    BOOL result = TRUE;
-
     pFigureUID = getFigure(block);
     pAxeUID = getAxe(pFigureUID, block, input);
     pPolylineUID = getPolyline(pAxeUID, block, input, row);
 
     sco = getScoData(block);
     if (sco == NULL)
+    {
         return FALSE;
-
+    }
 
     // select the right input and row
-    data = sco->internal.data[input][row];
-
-    result &= setGraphicObjectProperty(pPolylineUID, __GO_DATA_MODEL_X__, sco->internal.time[input], jni_double_vector, sco->internal.maxNumberOfPoints[input]);
-    result &= setGraphicObjectProperty(pPolylineUID, __GO_DATA_MODEL_Y__, data, jni_double_vector, sco->internal.maxNumberOfPoints[input]);
+    data = sco->internal.coordinates[input][row];
 
-    return result;
+    return setGraphicObjectProperty(pPolylineUID, __GO_DATA_MODEL_COORDINATES__, data, jni_double_vector, sco->internal.maxNumberOfPoints[input]);
 }
 
 /*****************************************************************************
@@ -743,7 +731,6 @@ static char *getAxe(char const* pFigureUID, scicos_block * block, int input)
 static char *getPolyline(char *pAxeUID, scicos_block * block, int input, int row)
 {
     char *pPolyline;
-    double d__0 = 0.0;
     BOOL b__true = TRUE;
 
     int color;
@@ -792,9 +779,6 @@ static char *getPolyline(char *pAxeUID, scicos_block * block, int input, int row
             setGraphicObjectProperty(pPolyline, __GO_DATA_MODEL_NUM_ELEMENTS_ARRAY__, polylineSize, jni_int_vector, 2);
         }
 
-        setGraphicObjectProperty(pPolyline, __GO_DATA_MODEL_X__, &d__0, jni_double_vector, 1);
-        setGraphicObjectProperty(pPolyline, __GO_DATA_MODEL_Y__, &d__0, jni_double_vector, 1);
-
         // ipar=[win;size(in,'*');N;wpos(:);wdim(:);in(:);clrs(:);heritance]
         //        1     1         1   2       2      nin   nin       1
         color = block->ipar[7 + block->nin + input + row];
@@ -877,6 +861,5 @@ static BOOL setPolylinesBounds(scicos_block * block, int input, int periodCounte
 
     pFigureUID = getFigure(block);
     pAxeUID = getAxe(pFigureUID, block, input);
-
     return setGraphicObjectProperty(pAxeUID, __GO_DATA_BOUNDS__, dataBounds, jni_double_vector, 6);
 }
index f70079b..d847337 100644 (file)
@@ -51,8 +51,7 @@ typedef struct
     {
         int numberOfPoints;
         int maxNumberOfPoints;
-        double *time;
-        double ***data;
+        double ***coordinates;
     } internal;
 
     struct
@@ -80,6 +79,15 @@ static sco_data *getScoData(scicos_block * block);
 static void freeScoData(scicos_block * block);
 
 /**
+ * Realloc any internal data
+ *
+ * \param block the block
+ * \param input the selected input
+ * \param numberOfPoints realloc to store this number of points
+ */
+static sco_data *reallocScoData(scicos_block * block, int numberOfPoints);
+
+/**
  * Append the data to the current data
  *
  * \param block the block
@@ -243,38 +251,40 @@ static sco_data *getScoData(scicos_block * block)
 
         sco = (sco_data *) MALLOC(sizeof(sco_data));
         if (sco == NULL)
+        {
             goto error_handler_sco;
+        }
 
         sco->internal.numberOfPoints = 0;
         sco->internal.maxNumberOfPoints = block->ipar[2];
 
-        sco->internal.data = (double ***)CALLOC(block->nin, sizeof(double **));
-        if (sco->internal.data == NULL)
-            goto error_handler_data;
+        sco->internal.coordinates = (double ***)CALLOC(block->nin, sizeof(double **));
+        if (sco->internal.coordinates == NULL)
+        {
+            goto error_handler_coordinates;
+        }
 
         for (i = 0; i < block->nin; i++)
         {
-            sco->internal.data[i] = (double **)CALLOC(block->insz[i], sizeof(double *));
-            if (sco->internal.data[i] == NULL)
-                goto error_handler_data_i;
+            sco->internal.coordinates[i] = (double **)CALLOC(block->insz[i], sizeof(double *));
+            if (sco->internal.coordinates[i] == NULL)
+            {
+                goto error_handler_coordinates_i;
+            }
         }
         for (i = 0; i < block->nin; i++)
         {
             for (j = 0; j < block->insz[i]; j++)
             {
-                sco->internal.data[i][j] = (double *)CALLOC(block->ipar[2], sizeof(double));
+                sco->internal.coordinates[i][j] = (double *)CALLOC(3 * block->ipar[2], sizeof(double));
 
-                if (sco->internal.data[i][j] == NULL)
-                    goto error_handler_data_ij;
+                if (sco->internal.coordinates[i][j] == NULL)
+                {
+                    goto error_handler_coordinates_ij;
+                }
             }
         }
 
-        sco->internal.time = (double *)CALLOC(block->ipar[2], sizeof(double));
-        if (sco->internal.time == NULL)
-        {
-            goto error_handler_time;
-        }
-
         sco->scope.periodCounter = 0;
         sco->scope.cachedFigureUID = NULL;
         sco->scope.cachedAxeUID = NULL;
@@ -289,23 +299,22 @@ static sco_data *getScoData(scicos_block * block)
      * Error management (out of normal flow)
      */
 
-error_handler_time:
-error_handler_data_ij:
+error_handler_coordinates_ij:
     for (k = 0; k < i; k++)
     {
         for (l = 0; l < j; l++)
         {
-            FREE(sco->internal.data[k][l]);
+            FREE(sco->internal.coordinates[k][l]);
         }
     }
     i = block->nin - 1;
-error_handler_data_i:
+error_handler_coordinates_i:
     for (j = 0; j < i; j++)
     {
-        FREE(sco->internal.data[i]);
+        FREE(sco->internal.coordinates[i]);
     }
-    FREE(sco->internal.data);
-error_handler_data:
+    FREE(sco->internal.coordinates);
+error_handler_coordinates:
     FREE(sco);
 error_handler_sco:
     // allocation error
@@ -324,13 +333,11 @@ static void freeScoData(scicos_block * block)
         {
             for (j = 0; j < block->insz[i]; j++)
             {
-                FREE(sco->internal.data[i][j]);
+                FREE(sco->internal.coordinates[i][j]);
             }
-            FREE(sco->internal.data[i]);
+            FREE(sco->internal.coordinates[i]);
         }
-
-        FREE(sco->internal.data);
-        FREE(sco->internal.time);
+        FREE(sco->internal.coordinates);
 
         for (i = 0; i < block->insz[0]; i++)
         {
@@ -351,29 +358,38 @@ static sco_data *reallocScoData(scicos_block * block, int numberOfPoints)
     double *ptr;
     int setLen;
     int previousNumberOfPoints = sco->internal.maxNumberOfPoints;
+    int newPoints = numberOfPoints - previousNumberOfPoints;
 
     for (i = 0; i < block->nin; i++)
     {
         for (j = 0; j < block->insz[i]; j++)
         {
-            ptr = (double *)REALLOC(sco->internal.data[i][j], numberOfPoints * sizeof(double));
+            ptr = (double *)REALLOC(sco->internal.coordinates[i][j], 3 * numberOfPoints * sizeof(double));
             if (ptr == NULL)
+            {
                 goto error_handler;
+            }
+
+            // clear the last points, the Z-axis values
+            memset(ptr + 2 * numberOfPoints, 0, numberOfPoints * sizeof(double));
+
+            // memcpy existing Y-axis values (use memmove to handle memory overlapping)
+            memmove(ptr + numberOfPoints, ptr + previousNumberOfPoints, previousNumberOfPoints * sizeof(double));
 
-            for (setLen = numberOfPoints - previousNumberOfPoints - 1; setLen >= 0; setLen--)
+            // then set the last points to the last values for Y-axis and X-axis values
+            for (setLen = newPoints - 1; setLen >= 0; setLen--)
+            {
+                ptr[numberOfPoints + previousNumberOfPoints + setLen] = ptr[numberOfPoints + previousNumberOfPoints - 1];
+            }
+            for (setLen = newPoints - 1; setLen >= 0; setLen--)
+            {
                 ptr[previousNumberOfPoints + setLen] = ptr[previousNumberOfPoints - 1];
-            sco->internal.data[i][j] = ptr;
+            }
+
+            sco->internal.coordinates[i][j] = ptr;
         }
     }
 
-    ptr = (double *)REALLOC(sco->internal.time, numberOfPoints * sizeof(double));
-    if (ptr == NULL)
-        goto error_handler;
-
-    for (setLen = numberOfPoints - previousNumberOfPoints - 1; setLen >= 0; setLen--)
-        ptr[previousNumberOfPoints + setLen] = ptr[previousNumberOfPoints - 1];
-    sco->internal.time = ptr;
-
     sco->internal.maxNumberOfPoints = numberOfPoints;
     return sco;
 
@@ -436,12 +452,20 @@ static void appendData(scicos_block * block, int input, double t, double *data)
 
         for (i = 0; i < block->insz[input]; i++)
         {
+            // X-axis values first
             for (setLen = maxNumberOfPoints - numberOfPoints - 1; setLen >= 0; setLen--)
-                sco->internal.data[input][i][numberOfPoints + setLen] = data[i];
-        }
+            {
+                sco->internal.coordinates[input][i][numberOfPoints + setLen] = t;
+            }
+
+            // then Y-axis values
+            for (setLen = maxNumberOfPoints - numberOfPoints - 1; setLen >= 0; setLen--)
+            {
+                sco->internal.coordinates[input][i][maxNumberOfPoints + numberOfPoints + setLen] = data[i];
+            }
 
-        for (setLen = maxNumberOfPoints - numberOfPoints - 1; setLen >= 0; setLen--)
-            sco->internal.time[numberOfPoints + setLen] = t;
+            // do not update Z-axis values, always cleared
+        }
 
         sco->internal.numberOfPoints++;
     }
@@ -456,23 +480,20 @@ static BOOL pushData(scicos_block * block, int input, int row)
     double *data;
     sco_data *sco;
 
-    BOOL result = TRUE;
-
     pFigureUID = getFigure(block);
     pAxeUID = getAxe(pFigureUID, block, input);
     pPolylineUID = getPolyline(pAxeUID, block, row);
 
     sco = getScoData(block);
     if (sco == NULL)
+    {
         return FALSE;
+    }
 
     // select the right input and row
-    data = sco->internal.data[input][row];
-
-    result &= setGraphicObjectProperty(pPolylineUID, __GO_DATA_MODEL_X__, sco->internal.time, jni_double_vector, sco->internal.maxNumberOfPoints);
-    result &= setGraphicObjectProperty(pPolylineUID, __GO_DATA_MODEL_Y__, data, jni_double_vector, sco->internal.maxNumberOfPoints);
+    data = sco->internal.coordinates[input][row];
 
-    return result;
+    return setGraphicObjectProperty(pPolylineUID, __GO_DATA_MODEL_COORDINATES__, data, jni_double_vector, sco->internal.maxNumberOfPoints);
 }
 
 /*****************************************************************************
@@ -652,7 +673,6 @@ static char *getAxe(char const* pFigureUID, scicos_block * block, int input)
 static char *getPolyline(char *pAxeUID, scicos_block * block, int row)
 {
     char *pPolyline;
-    double d__0 = 0.0;
     BOOL b__true = TRUE;
 
     int color;
@@ -701,9 +721,6 @@ static char *getPolyline(char *pAxeUID, scicos_block * block, int row)
             setGraphicObjectProperty(pPolyline, __GO_DATA_MODEL_NUM_ELEMENTS_ARRAY__, polylineSize, jni_int_vector, 2);
         }
 
-        setGraphicObjectProperty(pPolyline, __GO_DATA_MODEL_X__, &d__0, jni_double_vector, 1);
-        setGraphicObjectProperty(pPolyline, __GO_DATA_MODEL_Y__, &d__0, jni_double_vector, 1);
-
         color = block->ipar[3 + row];
         if (color > 0)
         {
index 2d4cda0..df1f76f 100644 (file)
@@ -50,7 +50,7 @@ typedef struct
     {
         int numberOfPoints;
         int maxNumberOfPoints;
-        double ***data;
+        double **coordinates;
     } internal;
 
     struct
@@ -213,7 +213,7 @@ SCICOS_BLOCKS_IMPEXP void cscopxy(scicos_block * block, scicos_flag flag)
 static sco_data *getScoData(scicos_block * block)
 {
     sco_data *sco = (sco_data *) * (block->work);
-    int i, j, k, l;
+    int i, j;
 
     if (sco == NULL)
     {
@@ -223,36 +223,32 @@ static sco_data *getScoData(scicos_block * block)
 
         sco = (sco_data *) MALLOC(sizeof(sco_data));
         if (sco == NULL)
+        {
             goto error_handler_sco;
+        }
 
         sco->internal.numberOfPoints = 0;
         sco->internal.maxNumberOfPoints = block->ipar[2];
 
-        sco->internal.data = (double ***)CALLOC(block->nin, sizeof(double **));
-        if (sco->internal.data == NULL)
-            goto error_handler_data;
-
-        for (i = 0; i < block->nin; i++)
+        sco->internal.coordinates = (double **)CALLOC(block->insz[0], sizeof(double *));
+        if (sco->internal.coordinates == NULL)
         {
-            sco->internal.data[i] = (double **)CALLOC(block->insz[i], sizeof(double *));
-            if (sco->internal.data[i] == NULL)
-                goto error_handler_data_i;
+            goto error_handler_coordinates;
         }
-        for (i = 0; i < block->nin; i++)
+
+        for (i = 0; i < block->insz[0]; i++)
         {
-            for (j = 0; j < block->insz[i]; j++)
+            sco->internal.coordinates[i] = (double *)CALLOC(3 * block->ipar[2], sizeof(double));
+            if (sco->internal.coordinates[i] == NULL)
             {
-                sco->internal.data[i][j] = (double *)CALLOC(block->ipar[2], sizeof(double));
-
-                if (sco->internal.data[i][j] == NULL)
-                    goto error_handler_data_ij;
+                goto error_handler_coordinates_i;
             }
         }
 
         sco->scope.cachedFigureUID = NULL;
         sco->scope.cachedAxeUID = NULL;
 
-        sco->scope.cachedPolylinesUIDs = (char **)CALLOC(block->insz[0], sizeof(char **));
+        sco->scope.cachedPolylinesUIDs = (char **)CALLOC(block->insz[0], sizeof(char *));
 
         *(block->work) = sco;
     }
@@ -263,22 +259,13 @@ static sco_data *getScoData(scicos_block * block)
      * Error management (out of normal flow)
      */
 
-error_handler_data_ij:
-    for (k = 0; k < i; k++)
-    {
-        for (l = 0; l < j; l++)
-        {
-            FREE(sco->internal.data[k][l]);
-        }
-    }
-    i = block->nin - 1;
-error_handler_data_i:
+error_handler_coordinates_i:
     for (j = 0; j < i; j++)
     {
-        FREE(sco->internal.data[i]);
+        FREE(sco->internal.coordinates[i]);
     }
-    FREE(sco->internal.data);
-error_handler_data:
+    FREE(sco->internal.coordinates);
+error_handler_coordinates:
     FREE(sco);
 error_handler_sco:
     // allocation error
@@ -289,20 +276,15 @@ error_handler_sco:
 static void freeScoData(scicos_block * block)
 {
     sco_data *sco = (sco_data *) * (block->work);
-    int i, j;
+    int i;
 
     if (sco != NULL)
     {
-        for (i = 0; i < block->nin; i++)
+        for (i = 0; i < block->insz[0]; i++)
         {
-            for (j = 0; j < block->insz[i]; j++)
-            {
-                FREE(sco->internal.data[i][j]);
-            }
-            FREE(sco->internal.data[i]);
+            FREE(sco->internal.coordinates[i]);
         }
-
-        FREE(sco->internal.data);
+        FREE(sco->internal.coordinates);
 
         for (i = 0; i < block->insz[0]; i++)
         {
@@ -318,26 +300,38 @@ static void freeScoData(scicos_block * block)
 static sco_data *reallocScoData(scicos_block * block, int numberOfPoints)
 {
     sco_data *sco = (sco_data *) * (block->work);
-    int i, j;
+    int i;
 
     double *ptr;
     int setLen;
     int previousNumberOfPoints = sco->internal.maxNumberOfPoints;
+    int newPoints = numberOfPoints - previousNumberOfPoints;
 
-    for (i = 0; i < block->nin; i++)
+    for (i = 0; i < block->insz[0]; i++)
     {
-        for (j = 0; j < block->insz[i]; j++)
+        ptr = (double *)REALLOC(sco->internal.coordinates[i], 3 * numberOfPoints * sizeof(double));
+        if (ptr == NULL)
         {
-            ptr = (double *)REALLOC(sco->internal.data[i][j], numberOfPoints * sizeof(double));
-            if (ptr == NULL)
-                goto error_handler;
+            goto error_handler;
+        }
 
-            for (setLen = numberOfPoints - previousNumberOfPoints - 1; setLen >= 0; setLen--)
-            {
-                ptr[previousNumberOfPoints + setLen] = ptr[previousNumberOfPoints - 1];
-            }
-            sco->internal.data[i][j] = ptr;
+        // clear the last points, the Z-axis values
+        memset(ptr + 2 * numberOfPoints, 0, numberOfPoints * sizeof(double));
+
+        // memcpy existing Y-axis values (use memmove to handle memory overlapping)
+        memmove(ptr + numberOfPoints, ptr + previousNumberOfPoints, previousNumberOfPoints * sizeof(double));
+
+        // then set the last points to the last values for Y-axis and X-axis values
+        for (setLen = newPoints - 1; setLen >= 0; setLen--)
+        {
+            ptr[numberOfPoints + previousNumberOfPoints + setLen] = ptr[numberOfPoints + previousNumberOfPoints - 1];
+        }
+        for (setLen = newPoints - 1; setLen >= 0; setLen--)
+        {
+            ptr[previousNumberOfPoints + setLen] = ptr[previousNumberOfPoints - 1];
         }
+
+        sco->internal.coordinates[i] = ptr;
     }
 
     sco->internal.maxNumberOfPoints = numberOfPoints;
@@ -387,8 +381,12 @@ static void appendData(scicos_block * block, double *x, double *y)
         {
             for (setLen = maxNumberOfPoints - numberOfPoints - 1; setLen >= 0; setLen--)
             {
-                sco->internal.data[0][i][numberOfPoints + setLen] = x[i];
-                sco->internal.data[1][i][numberOfPoints + setLen] = y[i];
+                sco->internal.coordinates[i][numberOfPoints + setLen] = x[i];
+            }
+
+            for (setLen = maxNumberOfPoints - numberOfPoints - 1; setLen >= 0; setLen--)
+            {
+                sco->internal.coordinates[i][maxNumberOfPoints + numberOfPoints + setLen] = y[i];
             }
         }
 
@@ -402,28 +400,23 @@ static BOOL pushData(scicos_block * block, int row)
     char *pAxeUID;
     char *pPolylineUID;
 
-    double *x;
-    double *y;
+    double *coordinates;
     sco_data *sco;
 
-    BOOL result = TRUE;
-
     pFigureUID = getFigure(block);
     pAxeUID = getAxe(pFigureUID, block);
     pPolylineUID = getPolyline(pAxeUID, block, row);
 
     sco = getScoData(block);
     if (sco == NULL)
+    {
         return FALSE;
+    }
 
-    // select the right input and row
-    x = sco->internal.data[0][row];
-    y = sco->internal.data[1][row];
-
-    result &= setGraphicObjectProperty(pPolylineUID, __GO_DATA_MODEL_X__, x, jni_double_vector, sco->internal.maxNumberOfPoints);
-    result &= setGraphicObjectProperty(pPolylineUID, __GO_DATA_MODEL_Y__, y, jni_double_vector, sco->internal.maxNumberOfPoints);
+    // select the right row
+    coordinates = sco->internal.coordinates[row];
 
-    return result;
+    return setGraphicObjectProperty(pPolylineUID, __GO_DATA_MODEL_COORDINATES__, coordinates, jni_double_vector, sco->internal.maxNumberOfPoints);
 }
 
 /*****************************************************************************
index 1026777..96ee42c 100644 (file)
@@ -50,7 +50,7 @@ typedef struct
     {
         int numberOfPoints;
         int maxNumberOfPoints;
-        double ***data;
+        double **coordinates;
     } internal;
 
     struct
@@ -216,7 +216,7 @@ SCICOS_BLOCKS_IMPEXP void cscopxy3d(scicos_block * block, scicos_flag flag)
 static sco_data *getScoData(scicos_block * block)
 {
     sco_data *sco = (sco_data *) * (block->work);
-    int i, j, k, l;
+    int i, j;
 
     if (sco == NULL)
     {
@@ -226,29 +226,26 @@ static sco_data *getScoData(scicos_block * block)
 
         sco = (sco_data *) MALLOC(sizeof(sco_data));
         if (sco == NULL)
+        {
             goto error_handler_sco;
+        }
 
         sco->internal.numberOfPoints = 0;
         sco->internal.maxNumberOfPoints = block->ipar[2];
 
-        sco->internal.data = (double ***)CALLOC(block->nin, sizeof(double **));
-        if (sco->internal.data == NULL)
-            goto error_handler_data;
-
-        for (i = 0; i < block->nin; i++)
+        sco->internal.coordinates = (double **)CALLOC(block->nin, sizeof(double *));
+        if (sco->internal.coordinates == NULL)
         {
-            sco->internal.data[i] = (double **)CALLOC(block->insz[i], sizeof(double *));
-            if (sco->internal.data[i] == NULL)
-                goto error_handler_data_i;
+            goto error_handler_coordinates;
         }
-        for (i = 0; i < block->nin; i++)
+
+        for (i = 0; i < block->insz[0]; i++)
         {
-            for (j = 0; j < block->insz[i]; j++)
-            {
-                sco->internal.data[i][j] = (double *)CALLOC(block->ipar[2], sizeof(double));
+            sco->internal.coordinates[i] = (double *)CALLOC(3 * block->ipar[2], sizeof(double));
 
-                if (sco->internal.data[i][j] == NULL)
-                    goto error_handler_data_ij;
+            if (sco->internal.coordinates[i] == NULL)
+            {
+                goto error_handler_coordinates_i;
             }
         }
 
@@ -266,22 +263,13 @@ static sco_data *getScoData(scicos_block * block)
      * Error management (out of normal flow)
      */
 
-error_handler_data_ij:
-    for (k = 0; k < i; k++)
-    {
-        for (l = 0; l < j; l++)
-        {
-            FREE(sco->internal.data[k][l]);
-        }
-    }
-    i = block->nin - 1;
-error_handler_data_i:
+error_handler_coordinates_i:
     for (j = 0; j < i; j++)
     {
-        FREE(sco->internal.data[i]);
+        FREE(sco->internal.coordinates[i]);
     }
-    FREE(sco->internal.data);
-error_handler_data:
+    FREE(sco->internal.coordinates);
+error_handler_coordinates:
     FREE(sco);
 error_handler_sco:
     // allocation error
@@ -292,20 +280,15 @@ error_handler_sco:
 static void freeScoData(scicos_block * block)
 {
     sco_data *sco = (sco_data *) * (block->work);
-    int i, j;
+    int i;
 
     if (sco != NULL)
     {
-        for (i = 0; i < block->nin; i++)
+        for (i = 0; i < block->insz[0]; i++)
         {
-            for (j = 0; j < block->insz[i]; j++)
-            {
-                FREE(sco->internal.data[i][j]);
-            }
-            FREE(sco->internal.data[i]);
+            FREE(sco->internal.coordinates[i]);
         }
-
-        FREE(sco->internal.data);
+        FREE(sco->internal.coordinates);
 
         for (i = 0; i < block->insz[0]; i++)
         {
@@ -321,26 +304,42 @@ static void freeScoData(scicos_block * block)
 static sco_data *reallocScoData(scicos_block * block, int numberOfPoints)
 {
     sco_data *sco = (sco_data *) * (block->work);
-    int i, j;
+    int i;
 
     double *ptr;
     int setLen;
     int previousNumberOfPoints = sco->internal.maxNumberOfPoints;
+    int newPoints = numberOfPoints - previousNumberOfPoints;
 
-    for (i = 0; i < block->nin; i++)
+    for (i = 0; i < block->insz[0]; i++)
     {
-        for (j = 0; j < block->insz[i]; j++)
+        ptr = (double *)REALLOC(sco->internal.coordinates[i], 3 * numberOfPoints * sizeof(double));
+        if (ptr == NULL)
         {
-            ptr = (double *)REALLOC(sco->internal.data[i][j], numberOfPoints * sizeof(double));
-            if (ptr == NULL)
-                goto error_handler;
+            goto error_handler;
+        }
 
-            for (setLen = numberOfPoints - previousNumberOfPoints - 1; setLen >= 0; setLen--)
-            {
-                ptr[previousNumberOfPoints + setLen] = ptr[previousNumberOfPoints - 1];
-            }
-            sco->internal.data[i][j] = ptr;
+        // memcpy existing Z-axis values (use memmove to handle memory overlapping)
+        memmove(ptr + 2 * numberOfPoints, ptr + 2 * previousNumberOfPoints, previousNumberOfPoints * sizeof(double));
+
+        // memcpy existing Y-axis values (use memmove to handle memory overlapping)
+        memmove(ptr + numberOfPoints, ptr + previousNumberOfPoints, previousNumberOfPoints * sizeof(double));
+
+        // then set the last points to the last values for Z-axis, Y-axis and X-axis values
+        for (setLen = newPoints - 1; setLen >= 0; setLen--)
+        {
+            ptr[2 * numberOfPoints + previousNumberOfPoints + setLen] = ptr[2 * numberOfPoints + previousNumberOfPoints - 1];
+        }
+        for (setLen = newPoints - 1; setLen >= 0; setLen--)
+        {
+            ptr[numberOfPoints + previousNumberOfPoints + setLen] = ptr[numberOfPoints + previousNumberOfPoints - 1];
+        }
+        for (setLen = newPoints - 1; setLen >= 0; setLen--)
+        {
+            ptr[previousNumberOfPoints + setLen] = ptr[previousNumberOfPoints - 1];
         }
+
+        sco->internal.coordinates[i] = ptr;
     }
 
     sco->internal.maxNumberOfPoints = numberOfPoints;
@@ -388,11 +387,20 @@ static void appendData(scicos_block * block, double *x, double *y, double *z)
 
         for (i = 0; i < block->insz[0]; i++)
         {
+
             for (setLen = maxNumberOfPoints - numberOfPoints - 1; setLen >= 0; setLen--)
             {
-                sco->internal.data[0][i][numberOfPoints + setLen] = x[i];
-                sco->internal.data[1][i][numberOfPoints + setLen] = y[i];
-                sco->internal.data[2][i][numberOfPoints + setLen] = z[i];
+                sco->internal.coordinates[i][numberOfPoints + setLen] = x[i];
+            }
+
+            for (setLen = maxNumberOfPoints - numberOfPoints - 1; setLen >= 0; setLen--)
+            {
+                sco->internal.coordinates[i][maxNumberOfPoints + numberOfPoints + setLen] = y[i];
+            }
+
+            for (setLen = maxNumberOfPoints - numberOfPoints - 1; setLen >= 0; setLen--)
+            {
+                sco->internal.coordinates[i][2 * maxNumberOfPoints + numberOfPoints + setLen] = z[i];
             }
         }
 
@@ -406,31 +414,23 @@ static BOOL pushData(scicos_block * block, int row)
     char *pAxeUID;
     char *pPolylineUID;
 
-    double *x;
-    double *y;
-    double *z;
+    double *coordinates;
     sco_data *sco;
 
-    BOOL result = TRUE;
-
     pFigureUID = getFigure(block);
     pAxeUID = getAxe(pFigureUID, block);
     pPolylineUID = getPolyline(pAxeUID, block, row);
 
     sco = getScoData(block);
     if (sco == NULL)
+    {
         return FALSE;
+    }
 
-    // select the right input and row
-    x = sco->internal.data[0][row];
-    y = sco->internal.data[1][row];
-    z = sco->internal.data[2][row];
-
-    result &= setGraphicObjectProperty(pPolylineUID, __GO_DATA_MODEL_X__, x, jni_double_vector, sco->internal.maxNumberOfPoints);
-    result &= setGraphicObjectProperty(pPolylineUID, __GO_DATA_MODEL_Y__, y, jni_double_vector, sco->internal.maxNumberOfPoints);
-    result &= setGraphicObjectProperty(pPolylineUID, __GO_DATA_MODEL_Z__, z, jni_double_vector, sco->internal.maxNumberOfPoints);
+    // select the right row
+    coordinates = sco->internal.coordinates[row];
 
-    return result;
+    return setGraphicObjectProperty(pPolylineUID, __GO_DATA_MODEL_COORDINATES__, coordinates, jni_double_vector, sco->internal.maxNumberOfPoints);
 }
 
 /*****************************************************************************