d31fd8175efd69f9f12185317ae1b0f80362560f
[scilab.git] / scilab / modules / graphic_objects / src / cpp / NgonGeneralData.cpp
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2010 - 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.1-en.txt
10  *
11  */
12
13 #include <iostream>
14
15 #include "NgonGeneralData.hxx"
16 #include "DataProperties.hxx"
17
18 extern "C" {
19 #include "BOOL.h"
20
21 #include <string.h>
22
23 #include "graphicObjectProperties.h"
24 }
25
26 NgonGeneralData::NgonGeneralData(void)
27 {
28     numGons = 0;
29     numVerticesPerGon = 0;
30
31     coordinates = NULL;
32
33     colorValues = NULL;
34     numColors = 0;
35 }
36
37 NgonGeneralData::~NgonGeneralData(void)
38 {
39     if (numGons * numVerticesPerGon > 0)
40     {
41         delete [] coordinates;
42     }
43
44     if (numColors > 0)
45     {
46         delete [] colorValues;
47     }
48 }
49
50 int NgonGeneralData::getPropertyFromName(int propertyName)
51 {
52     switch (propertyName)
53     {
54         case __GO_DATA_MODEL_NUM_ELEMENTS_ARRAY__ :
55             return NUM_ELEMENTS_ARRAY;
56         case __GO_DATA_MODEL_COORDINATES__ :
57             return COORDINATES;
58         case __GO_DATA_MODEL_X__ :
59             return X_COORDINATES;
60         case __GO_DATA_MODEL_Y__ :
61             return Y_COORDINATES;
62         case __GO_DATA_MODEL_Z__ :
63             return Z_COORDINATES;
64         case __GO_DATA_MODEL_COLORS__ :
65             return COLORS;
66         case __GO_DATA_MODEL_NUM_COLORS__ :
67             return NUM_COLORS;
68         default :
69             return NgonData::getPropertyFromName(propertyName);
70     }
71 }
72
73 int NgonGeneralData::setDataProperty(int property, void const* value, int numElements)
74 {
75     switch (property)
76     {
77         case NUM_ELEMENTS_ARRAY :
78             return setNumElementsArray((int const*) value);
79         case COORDINATES :
80             setData((double const*) value, numElements);
81             break;
82         case X_COORDINATES :
83             setDataX((double const*) value, numElements);
84             break;
85         case Y_COORDINATES :
86             setDataY((double const*) value, numElements);
87             break;
88         case Z_COORDINATES :
89             setDataZ((double const*) value, numElements);
90             break;
91         case COLORS :
92             setColors((double const*) value, numElements);
93             break;
94         default :
95             return NgonData::setDataProperty(property, value, numElements);
96     }
97
98     return 1;
99 }
100
101 void NgonGeneralData::getDataProperty(int property, void **_pvData)
102 {
103     switch (property)
104     {
105         case NUM_ELEMENTS_ARRAY :
106             /* Not implemented yet */
107             //    getNumElementsArray();
108             break;
109         case COORDINATES :
110             *_pvData = getData();
111             break;
112         case X_COORDINATES :
113             *_pvData = getDataX();
114             break;
115         case Y_COORDINATES :
116             *_pvData = getDataY();
117             break;
118         case Z_COORDINATES :
119             *_pvData = getDataZ();
120             break;
121         case COLORS :
122             *_pvData = getColors();
123             break;
124         case NUM_COLORS :
125             ((int *) *_pvData)[0] = getNumColors();
126             break;
127         default :
128             NgonData::getDataProperty(property, _pvData);
129     }
130 }
131
132 double* NgonGeneralData::getData()
133 {
134     return coordinates;
135 }
136
137 double* NgonGeneralData::getDataX(void)
138 {
139     return coordinates;
140 }
141
142 double* NgonGeneralData::getDataY(void)
143 {
144     return &coordinates[numGons * numVerticesPerGon];
145 }
146
147 double* NgonGeneralData::getDataZ(void)
148 {
149     return &coordinates[2 * numGons * numVerticesPerGon];
150 }
151
152 /*
153  * Only partially implemented
154  * Must be made consistent with setNumElementsArray
155  */
156 void NgonGeneralData::setData(double const* data, int numElements)
157 {
158     if (numElements != numGons * numVerticesPerGon)
159     {
160         delete [] coordinates;
161
162         numVerticesPerGon = numElements / numGons;
163         coordinates = new double[3 * numElements];
164     }
165
166     memcpy(coordinates, data, 3 * numElements * sizeof(double));
167 }
168
169 void NgonGeneralData::setDataX(double const* data, int numElements)
170 {
171     double* xCoordinates = NULL;
172
173     xCoordinates = coordinates;
174     memcpy(xCoordinates, data, numElements * sizeof(double));
175 }
176
177 void NgonGeneralData::setDataY(double const* data, int numElements)
178 {
179     double* yCoordinates;
180
181     yCoordinates = &coordinates[numGons * numVerticesPerGon];
182     memcpy(yCoordinates, data, numElements * sizeof(double));
183 }
184
185 void NgonGeneralData::setDataZ(double const* data, int numElements)
186 {
187     double* zCoordinates = NULL;
188
189     zCoordinates = &coordinates[2 * numGons * numVerticesPerGon];
190     memcpy(zCoordinates, data, numElements * sizeof(double));
191 }
192
193 int NgonGeneralData::getNumElements(void)
194 {
195     return numGons;
196 }
197
198 int NgonGeneralData::setNumElementsArray(int const* numElementsArray)
199 {
200     double* newCoordinates = NULL;
201     double* newColorValues = NULL;
202     int result = 1;
203
204     /* Test whether the number of colors is valid */
205     if ((numElementsArray[2] != numElementsArray[0]*numElementsArray[1]) &&
206             (numElementsArray[2] != numElementsArray[0]) &&
207             (numElementsArray[2] != 0))
208     {
209         return 0;
210     }
211
212     if (numGons * numVerticesPerGon != numElementsArray[0]*numElementsArray[1])
213     {
214         try
215         {
216             newCoordinates = new double[3 * numElementsArray[0]*numElementsArray[1]];
217         }
218         catch (const std::exception& e)
219         {
220             e.what();
221             return 0;
222         }
223
224         result = 1;
225     }
226
227     if (numElementsArray[2] != this->numColors)
228     {
229         if (numElementsArray[2] > 0)
230         {
231             try
232             {
233                 newColorValues = new double[numElementsArray[2]];
234             }
235             catch (const std::exception& e)
236             {
237                 e.what();
238                 result = 0;
239             }
240         }
241
242     }
243
244     if (result == 1)
245     {
246         if (newCoordinates != NULL)
247         {
248             if (numGons * numVerticesPerGon > 0)
249             {
250                 delete [] coordinates;
251             }
252
253             coordinates = newCoordinates;
254
255             numGons = numElementsArray[0];
256             numVerticesPerGon = numElementsArray[1];
257         }
258
259         if (newColorValues != NULL || numElementsArray[2] == 0)
260         {
261             if (this->numColors > 0)
262             {
263                 delete [] colorValues;
264             }
265
266             colorValues = newColorValues;
267             this->numColors = numElementsArray[2];
268         }
269     }
270     else
271     {
272         if (newCoordinates != NULL)
273         {
274             delete [] newCoordinates;
275         }
276
277         if (newColorValues != NULL)
278         {
279             delete [] newColorValues;
280         }
281     }
282
283     return result;
284 }
285
286 double* NgonGeneralData::getColors(void)
287 {
288     return colorValues;
289 }
290
291 void NgonGeneralData::setColors(double const* colors, int numElements)
292 {
293     if (numElements > numColors)
294     {
295         return;
296     }
297     memcpy(colorValues, colors, numElements * sizeof(double));
298 }
299
300 int NgonGeneralData::getNumColors(void)
301 {
302     return numColors;
303 }