Bug 12232 fixed: fix several memleaks in various filler
[scilab.git] / scilab / modules / graphic_objects / src / cpp / NgonGridGrayplotDataDecomposer.cpp
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2011-2012 - DIGITEO - Manuel Juliachs
4  *
5  *  This file must be used under the terms of the CeCILL.
6  *  This source file is licensed as described in the file COPYING, which
7  *  you should have received as part of this distribution.  The terms
8  *  are also available at
9  *  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13 #include "ColorComputer.hxx"
14 #include "DecompositionUtils.hxx"
15 #include "NgonGridGrayplotDataDecomposer.hxx"
16
17 extern "C"
18 {
19 #include <stdlib.h>
20 #include <string.h>
21
22 #include "getGraphicObjectProperty.h"
23 #include "graphicObjectProperties.h"
24 }
25
26 NgonGridGrayplotDataDecomposer* NgonGridGrayplotDataDecomposer::decomposer = NULL;
27
28 /*
29  * To do: allowing either per-vertex or per-facet colors
30  */
31 void NgonGridGrayplotDataDecomposer::fillColors(char* id, float* buffer, int bufferLength, int elementsSize)
32 {
33     char* parentFigure = NULL;
34     char* parent = NULL;
35
36     double* z = NULL;
37     double* colormap = NULL;
38
39     int numX = 0;
40     int* piNumX = &numX;
41     int numY = 0;
42     int* piNumY = &numY;
43     int colormapSize = 0;
44     int* piColormapSize = &colormapSize;
45     int dataMapping = 0;
46     int* piDataMapping = &dataMapping;
47
48     NgonGridGrayplotDataDecomposer* decomposer = get();
49
50     getGraphicObjectProperty(id, __GO_DATA_MODEL_NUM_X__, jni_int, (void**) &piNumX);
51     getGraphicObjectProperty(id, __GO_DATA_MODEL_NUM_Y__, jni_int, (void**) &piNumY);
52
53     getGraphicObjectProperty(id, __GO_DATA_MODEL_Z__, jni_double_vector, (void**) &z);
54
55     getGraphicObjectProperty(id, __GO_PARENT__, jni_string, (void**) &parent);
56
57     /* Temporary: to avoid getting a null parent_figure property when the object is built */
58     if (strcmp(parent, "") == 0)
59     {
60         return;
61     }
62
63     getGraphicObjectProperty(id, __GO_PARENT_FIGURE__, jni_string, (void**) &parentFigure);
64
65     if (parentFigure == NULL)
66     {
67         return;
68     }
69
70     getGraphicObjectProperty(parentFigure, __GO_COLORMAP__, jni_double_vector, (void**) &colormap);
71     getGraphicObjectProperty(parentFigure, __GO_COLORMAP_SIZE__, jni_int, (void**) &piColormapSize);
72
73     getGraphicObjectProperty(id, __GO_DATA_MAPPING__, jni_int, (void**) &piDataMapping);
74
75     if (dataMapping == 0)
76     {
77         decomposer->fillNormalizedZGridColors(buffer, bufferLength, elementsSize, colormap, colormapSize, z, numX, numY);
78     }
79     else if (dataMapping == 1)
80     {
81         decomposer->fillDirectGridColors(buffer, bufferLength, elementsSize, colormap, colormapSize, z, numX, numY);
82     }
83
84     releaseGraphicObjectProperty(__GO_COLORMAP__, colormap, jni_double_vector, colormapSize);
85 }
86
87 int NgonGridGrayplotDataDecomposer::fillIndices(char* id, int* buffer, int bufferLength, int logMask)
88 {
89     double* x = NULL;
90     double* y = NULL;
91     double* z = NULL;
92     double zShift = 0.0;
93     double* pdZShift = &zShift;
94
95     int numX = 0;
96     int* piNumX = &numX;
97     int numY = 0;
98     int* piNumY = &numY;
99     int dataMapping = 0;
100     int* piDataMapping = &dataMapping;
101
102     int perNodeValues = 1;
103
104     int numberIndices = 0;
105
106     NgonGridGrayplotDataDecomposer* decomposer = get();
107
108     getGraphicObjectProperty(id, __GO_DATA_MODEL_NUM_X__, jni_int, (void**) &piNumX);
109     getGraphicObjectProperty(id, __GO_DATA_MODEL_NUM_Y__, jni_int, (void**) &piNumY);
110
111     /* 0 indices if 0 points */
112     if (numX == 0 || numY == 0)
113     {
114         return 0;
115     }
116
117     getGraphicObjectProperty(id, __GO_DATA_MAPPING__, jni_int, (void**) &piDataMapping);
118
119     getGraphicObjectProperty(id, __GO_DATA_MODEL_X__, jni_double_vector, (void**) &x);
120     getGraphicObjectProperty(id, __GO_DATA_MODEL_Y__, jni_double_vector, (void**) &y);
121     getGraphicObjectProperty(id, __GO_DATA_MODEL_Z__, jni_double_vector, (void**) &z);
122
123     getGraphicObjectProperty(id, __GO_DATA_MODEL_Z_COORDINATES_SHIFT__, jni_double, (void**) &pdZShift);
124
125     /*
126      * Data mapping values 0 and 1 respectively correspond to scaled and direct colors, for which per-node
127      * and per-facet values are respectively used.
128      */
129     perNodeValues = !dataMapping;
130
131     numberIndices = decomposer->fillTriangleIndices(buffer, bufferLength, logMask, x, y, &zShift, z, perNodeValues, numX, numY);
132
133     return numberIndices;
134 }
135
136 int NgonGridGrayplotDataDecomposer::isFacetValid(double* z, double* values, int perNodeValues, int numX, int numY, int i, int j, int logUsed, int currentEdgeValid, int* nextEdgeValid)
137 {
138     *nextEdgeValid = isFacetEdgeValid(z, values, perNodeValues, numX, numY, i+1, j, logUsed);
139
140     if (!perNodeValues)
141     {
142         /*
143          * Grid values are defined per facet.
144          * In addition to edge validity, which in this case is determined only by z coordinates, the
145          * facet's (i,j) value must also be read in order to determine its overall validity.
146          */
147         double zij = getValue(values, numX, numY, i, j);
148
149         if (DecompositionUtils::isValid(zij) && currentEdgeValid && *nextEdgeValid)
150         {
151             return 1;
152         }
153         else
154         {
155             return 0;
156         }
157     }
158     else
159     {
160         /*
161          * Grid values are defined per node, and have therefore been already used
162          * to determine edge validity
163          */
164         if (currentEdgeValid && *nextEdgeValid)
165         {
166             return 1;
167         }
168         else
169         {
170             return 0;
171         }
172     }
173 }
174
175 /*
176  * To be merged with its parent's isFacetEdgeValid function.
177  */
178 int NgonGridGrayplotDataDecomposer::isFacetEdgeValid(double* z, double* values, int perNodeValues, int numX, int numY, int i, int j, int logUsed)
179 {
180     double zij = 0.;
181     double zijp1 = 0.;
182
183     int lowerZValid = 0;
184     int upperZValid = 0;
185
186     /* First, z-coordinate values are tested */
187     zij = getZCoordinate(z, numX, numY, i, j, logUsed);
188     zijp1 = getZCoordinate(z, numX, numY, i, j+1, logUsed);
189
190     lowerZValid = DecompositionUtils::isValid(zij);
191     upperZValid = DecompositionUtils::isValid(zijp1);
192
193     if (logUsed)
194     {
195         lowerZValid &= DecompositionUtils::isLogValid(zij);
196         upperZValid &= DecompositionUtils::isLogValid(zijp1);
197     }
198
199     /*
200      * If values are defined per node, edge validity must also
201      * take into account grid values at the edge's nodes.
202      */
203     if (perNodeValues)
204     {
205         zij = getValue(values, numX, numY, i, j);
206         zijp1 = getValue(values, numX, numY, i, j+1);
207
208         lowerZValid &= DecompositionUtils::isValid(zij);
209         upperZValid &= DecompositionUtils::isValid(zijp1);
210     }
211
212     if (lowerZValid && upperZValid)
213     {
214         return 1;
215     }
216     else
217     {
218         return 0;
219     }
220 }
221