Graphics: return a null pointer in C when property does not exist
[scilab.git] / scilab / modules / graphics / src / c / getHandleProperty / get_data_property.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2004-2006 - INRIA - Fabrice Leray
4  * Copyright (C) 2006 - INRIA - Allan Cornet
5  * Copyright (C) 2006 - INRIA - Jean-Baptiste Silvy
6  * Copyright (C) 2010-2011 - DIGITEO - Manuel Juliachs
7  * Copyright (C) 2011 - DIGITEO - Vincent Couvert
8  *
9  * This file must be used under the terms of the CeCILL.
10  * This source file is licensed as described in the file COPYING, which
11  * you should have received as part of this distribution.  The terms
12  * are also available at
13  * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
14  *
15  */
16
17 /*------------------------------------------------------------------------*/
18 /* file: get_data_property.c                                              */
19 /* desc : function to retrieve in Scilab the data field of                */
20 /*        a handle                                                        */
21 /*------------------------------------------------------------------------*/
22
23 #include <string.h>
24
25 #include "get_data_property.h"
26 #include "getHandleProperty.h"
27 #include "GetProperty.h"
28 #include "returnPropertyList.h"
29 #include "Scierror.h"
30 #include "localization.h"
31 #include "MALLOC.h"
32 #include "SetPropertyStatus.h"
33
34 #include "getGraphicObjectProperty.h"
35 #include "graphicObjectProperties.h"
36 #include "Matplot.h"
37 #include "returnProperty.h"
38 /*--------------------------------------------------------------------------*/
39 /* the matplot data can have several type */
40 int getmatplotdata(void * _pvCtx, char *pobjUID)
41 {
42     int datatype = 0;
43     int * piDataType = &datatype;
44     int numX = 0;
45     int *piNumX = &numX;
46     int numY = 0;
47     int *piNumY = &numY;
48     void * data = NULL;
49     int imagetype = 0;
50     int * piImagetype = &imagetype;
51     int gltype = 0;
52     int * piGltype = &gltype;
53     int status = SET_PROPERTY_ERROR;
54     getGraphicObjectProperty(pobjUID, __GO_DATA_MODEL_NUM_X__, jni_int, (void **)&piNumX);
55     getGraphicObjectProperty(pobjUID, __GO_DATA_MODEL_NUM_Y__, jni_int, (void **)&piNumY);
56     getGraphicObjectProperty(pobjUID, __GO_DATA_MODEL_MATPLOT_DATA_TYPE__, jni_int, (void **)&piDataType);
57     getGraphicObjectProperty(pobjUID, __GO_DATA_MODEL_Z__, jni_double_vector, &data);
58     getGraphicObjectProperty(pobjUID, __GO_DATA_MODEL_MATPLOT_IMAGE_TYPE__, jni_int, (void **)&piImagetype);
59     getGraphicObjectProperty(pobjUID, __GO_DATA_MODEL_MATPLOT_GL_TYPE__, jni_int, (void **)&piGltype);
60
61     if (!data)
62     {
63         return sciReturnEmptyMatrix(_pvCtx);
64     }
65
66     switch ((DataType)datatype)
67     {
68         case MATPLOT_HM1_Char :
69         {
70             int dims[3] = {numY - 1, numX - 1, 1};
71             status = sciReturnHypermatOfInteger8(_pvCtx, dims, 3, (char*)data);
72             break;
73         }
74         case MATPLOT_HM1_UChar :
75         {
76             int dims[3] = {numY - 1, numX - 1, 1};
77             status = sciReturnHypermatOfUnsignedInteger8(_pvCtx, dims, 3, (unsigned char*)data);
78             break;
79         }
80         case MATPLOT_HM3_Char :
81         {
82             int dims[3] = {numY - 1, numX - 1, 3};
83             status = sciReturnHypermatOfInteger8(_pvCtx, dims, 3, (char*)data);
84             break;
85         }
86         case MATPLOT_HM3_UChar :
87         {
88             int dims[3] = {numY - 1, numX - 1, 3};
89             status = sciReturnHypermatOfUnsignedInteger8(_pvCtx, dims, 3, (unsigned char*)data);
90             break;
91         }
92         case MATPLOT_HM1_Double :
93         {
94             int dims[3] = {numY - 1, numX - 1, 1};
95             status = sciReturnHypermatOfDouble(_pvCtx, dims, 3, (double*)data);
96             break;
97         }
98         case MATPLOT_HM3_Double :
99         {
100             int dims[3] = {numY - 1, numX - 1, 3};
101             status = sciReturnHypermatOfDouble(_pvCtx, dims, 3, (double*)data);
102             break;
103         }
104         case MATPLOT_HM4_Char :
105         {
106             int dims[3] = {numY - 1, numX - 1, 4};
107             status = sciReturnHypermatOfInteger8(_pvCtx, dims, 3, (char*)data);
108             break;
109         }
110         case MATPLOT_HM4_UChar :
111         {
112             int dims[3] = {numY - 1, numX - 1, 4};
113             status = sciReturnHypermatOfUnsignedInteger8(_pvCtx, dims, 3, (unsigned char*)data);
114             break;
115         }
116         case MATPLOT_HM4_Double :
117         {
118             int dims[3] = {numY - 1, numX - 1, 4};
119             status = sciReturnHypermatOfDouble(_pvCtx, dims, 3, (double*)data);
120             break;
121         }
122         case MATPLOT_Char :
123         {
124             status = sciReturnMatrixOfInteger8(_pvCtx, (char*)data, numY - 1, numX - 1);
125             break;
126         }
127         case MATPLOT_UChar :
128         {
129
130             if ((ImageType)imagetype == MATPLOT_RGB)
131             {
132                 status = sciReturnMatrixOfUnsignedInteger8(_pvCtx, (unsigned char*)data, 3 * (numY - 1), numX - 1);
133             }
134             else if ((ImageType)imagetype == MATPLOT_GL_RGBA)
135             {
136                 status = sciReturnMatrixOfUnsignedInteger8(_pvCtx, (unsigned char*)data, 4 * (numY - 1), numX - 1);
137             }
138             else
139             {
140                 status = sciReturnMatrixOfUnsignedInteger8(_pvCtx, (unsigned char*)data, numY - 1, numX - 1);
141             }
142             break;
143         }
144         case MATPLOT_Short :
145         {
146             status = sciReturnMatrixOfInteger16(_pvCtx, (short*)data, numY - 1, numX - 1);
147             break;
148         }
149         case MATPLOT_UShort :
150         {
151             status = sciReturnMatrixOfUnsignedInteger16(_pvCtx, (unsigned short*)data, numY - 1, numX - 1);
152             break;
153         }
154         case MATPLOT_Int :
155         {
156             status = sciReturnMatrixOfInteger32(_pvCtx, (int*)data, numY - 1, numX - 1);
157             break;
158         }
159         case MATPLOT_UInt :
160         {
161             status = sciReturnMatrixOfUnsignedInteger32(_pvCtx, (unsigned int*)data, numY - 1, numX - 1);
162             break;
163         }
164         case MATPLOT_Double :
165         {
166             status = sciReturnMatrix(_pvCtx, (double*)data, numY - 1, numX - 1);
167             break;
168         }
169     }
170
171     return status;
172 }
173 /*--------------------------------------------------------------------------*/
174 /* F.Leray 29.04.05 */
175 /* the grayplot data is now given as a tlist (like for surface and champ objects) */
176 int getgrayplotdata(char *pobjUID)
177 {
178     char * variable_tlist[] = {"grayplotdata", "x", "y", "z"};
179     int numX = 0;
180     int *piNumX = &numX;
181     int numY = 0;
182     int *piNumY = &numY;
183     double* dataX = NULL;
184     double* dataY = NULL;
185     double* dataZ = NULL;
186
187     /* Add 'variable' tlist items to stack */
188     returnedList * tList = createReturnedList(3, variable_tlist);
189
190     if (tList == NULL)
191     {
192         return -1;
193     }
194
195     getGraphicObjectProperty(pobjUID, __GO_DATA_MODEL_NUM_X__, jni_int, (void **)&piNumX);
196     getGraphicObjectProperty(pobjUID, __GO_DATA_MODEL_NUM_Y__, jni_int, (void **)&piNumY);
197
198     getGraphicObjectProperty(pobjUID, __GO_DATA_MODEL_X__, jni_double_vector, (void **)&dataX);
199     getGraphicObjectProperty(pobjUID, __GO_DATA_MODEL_Y__, jni_double_vector, (void **)&dataY);
200     getGraphicObjectProperty(pobjUID, __GO_DATA_MODEL_Z__, jni_double_vector, (void **)&dataZ);
201
202     addColVectorToReturnedList(tList, dataX, numX);
203     addColVectorToReturnedList(tList, dataY, numY);
204     addMatrixToReturnedList(tList, dataZ, numX, numY);
205
206     destroyReturnedList(tList);
207
208     return 0;
209 }
210 /*--------------------------------------------------------------------------*/
211 /* F.Leray 29.04.05 */
212 /* the champ data is now given as a tlist (like for surface objects) */
213 int getchampdata(char *pobjUID)
214 {
215     char * variable_tlist[] = {"champdata", "x", "y", "fx", "fy"};
216     int* dimensions = NULL;
217     double* arrowBasesX = NULL;
218     double* arrowBasesY = NULL;
219     double* arrowDirectionsX = NULL;
220     double* arrowDirectionsY = NULL;
221
222     /* Add 'variable' tlist items to stack */
223
224     returnedList * tList = createReturnedList(4, variable_tlist);
225
226     if (tList == NULL)
227     {
228         return -1;
229     }
230
231     getGraphicObjectProperty(pobjUID, __GO_CHAMP_DIMENSIONS__, jni_int_vector, (void **)&dimensions);
232
233     getGraphicObjectProperty(pobjUID, __GO_BASE_X__, jni_double_vector, (void **)&arrowBasesX);
234     getGraphicObjectProperty(pobjUID, __GO_BASE_Y__, jni_double_vector, (void **)&arrowBasesY);
235     getGraphicObjectProperty(pobjUID, __GO_DIRECTION_X__, jni_double_vector, (void **)&arrowDirectionsX);
236     getGraphicObjectProperty(pobjUID, __GO_DIRECTION_Y__, jni_double_vector, (void **)&arrowDirectionsY);
237
238     addColVectorToReturnedList(tList, arrowBasesX, dimensions[0]);
239     addColVectorToReturnedList(tList, arrowBasesY, dimensions[1]);
240     addMatrixToReturnedList(tList, arrowDirectionsX, dimensions[0], dimensions[1]);
241     addMatrixToReturnedList(tList, arrowDirectionsY, dimensions[0], dimensions[1]);
242
243     destroyReturnedList(tList);
244
245     return 0;
246 }
247 /*--------------------------------------------------------------------------*/
248 int get3ddata(char *pobjUID)
249 {
250     char *variable_tlist_color[] = {"3d", "x", "y", "z", "color"};
251     char *variable_tlist[] = {"3d", "x", "y", "z"};
252     int type = -1;
253     int *piType = &type;
254     double* colors = NULL;
255     double* dataX = NULL;
256     double* dataY = NULL;
257     double* dataZ = NULL;
258     int nbRow = 0;
259     int *piNbRow = &nbRow;
260     int nbCol = 0;
261     int *piNbCol = &nbCol;
262
263     returnedList * tList = NULL;
264
265     getGraphicObjectProperty(pobjUID, __GO_TYPE__, jni_int, (void **)&piType);
266
267     getGraphicObjectProperty(pobjUID, __GO_DATA_MODEL_X__, jni_double_vector, (void **)&dataX);
268     getGraphicObjectProperty(pobjUID, __GO_DATA_MODEL_Y__, jni_double_vector, (void **)&dataY);
269     getGraphicObjectProperty(pobjUID, __GO_DATA_MODEL_Z__, jni_double_vector, (void **)&dataZ);
270
271     getGraphicObjectProperty(pobjUID, __GO_DATA_MODEL_COLORS__, jni_double_vector, (void **)&colors);
272
273     if (colors != NULL)
274     {
275         /* Add 'variable' tlist items to stack */
276         tList = createReturnedList(4, variable_tlist_color);
277
278         if (type == __GO_FAC3D__)
279         {
280             int numColors = 0;
281             int *piNumColors = &numColors;
282
283             getGraphicObjectProperty(pobjUID, __GO_DATA_MODEL_NUM_VERTICES_PER_GON__, jni_int, (void **)&piNbRow);
284             getGraphicObjectProperty(pobjUID, __GO_DATA_MODEL_NUM_GONS__, jni_int, (void **)&piNbCol);
285
286             getGraphicObjectProperty(pobjUID, __GO_DATA_MODEL_NUM_COLORS__, jni_int, (void **)&piNumColors);
287
288             addMatrixToReturnedList(tList, dataX, nbRow, nbCol);
289             addMatrixToReturnedList(tList, dataY, nbRow, nbCol);
290             addMatrixToReturnedList(tList, dataZ, nbRow, nbCol);
291
292             /*
293              * With per-facet colors, the data vector might be either a column one or a row one,
294              * only the row vector case is managed at the moment.
295              */
296             if (numColors == nbCol)
297             {
298                 addMatrixToReturnedList(tList, colors, 1, nbCol);
299             }
300             else
301             {
302                 addMatrixToReturnedList(tList, colors, nbRow, nbCol);
303             }
304
305         }
306         destroyReturnedList(tList);
307     }
308     else /* no color provided in input*/
309     {
310         /* Add 'variable' tlist items to stack */
311         tList = createReturnedList(3, variable_tlist);
312
313         if (type == __GO_FAC3D__)
314         {
315             getGraphicObjectProperty(pobjUID, __GO_DATA_MODEL_NUM_VERTICES_PER_GON__, jni_int, (void **)&piNbRow);
316             getGraphicObjectProperty(pobjUID, __GO_DATA_MODEL_NUM_GONS__, jni_int, (void **)&piNbCol);
317
318             addMatrixToReturnedList(tList, dataX, nbRow, nbCol);
319             addMatrixToReturnedList(tList, dataY, nbRow, nbCol);
320             addMatrixToReturnedList(tList, dataZ, nbRow, nbCol);
321         }
322         else if (type == __GO_PLOT3D__)
323         {
324             int* xDimensions;
325             int* yDimensions;
326
327             getGraphicObjectProperty(pobjUID, __GO_DATA_MODEL_NUM_X__, jni_int, (void **)&piNbRow);
328             getGraphicObjectProperty(pobjUID, __GO_DATA_MODEL_NUM_Y__, jni_int, (void **)&piNbCol);
329
330             getGraphicObjectProperty(pobjUID, __GO_DATA_MODEL_X_DIMENSIONS__, jni_int_vector, (void **)&xDimensions);
331             getGraphicObjectProperty(pobjUID, __GO_DATA_MODEL_Y_DIMENSIONS__, jni_int_vector, (void **)&yDimensions);
332
333             addMatrixToReturnedList(tList, dataX, xDimensions[0], xDimensions[1]);
334             addMatrixToReturnedList(tList, dataY, yDimensions[0], yDimensions[1]);
335             addMatrixToReturnedList(tList, dataZ, nbRow, nbCol);
336         }
337
338         destroyReturnedList(tList);
339     }
340
341     return 0;
342 }
343 /*------------------------------------------------------------------------*/
344 int get_data_property(void* _pvCtx, char* pobjUID)
345 {
346     int type = -1;
347     int *piType = &type;
348
349     getGraphicObjectProperty(pobjUID, __GO_TYPE__, jni_int, (void **)&piType);
350     if (piType == NULL)
351     {
352         Scierror(999, _("'%s' property does not exist for this handle.\n"), "type");
353         return -1;
354     }
355
356     switch (type)
357     {
358         case __GO_FAC3D__ :
359         case __GO_PLOT3D__ :
360             return get3ddata(pobjUID);
361         case __GO_CHAMP__ :
362             return getchampdata(pobjUID);
363         case __GO_GRAYPLOT__ :
364             return getgrayplotdata(pobjUID);
365         case __GO_MATPLOT__ :
366             return getmatplotdata(_pvCtx, pobjUID);
367         default :
368             /* F.Leray 02.05.05 : "data" case for others (using sciGetPoint routine inside GetProperty.c) */
369         {
370             int nbRow  =  0;
371             int nbCol  =  0;
372             int status = SET_PROPERTY_ERROR;
373             /* Warning the following function allocates data */
374             double* data = sciGetPoint(pobjUID, &nbRow, &nbCol);
375
376             if (data == NULL && nbRow == 0 && nbCol == 0)
377             {
378                 /* Empty data */
379                 sciReturnEmptyMatrix(_pvCtx);
380                 status = SET_PROPERTY_SUCCEED;
381             }
382             else if (data == NULL && nbRow == -1 && nbCol == -1)
383             {
384                 /* data allocation failed */
385                 Scierror(999, _("%s: No more memory."), "get_data_property");
386                 status = SET_PROPERTY_ERROR;
387             }
388             else if (data == NULL)
389             {
390                 Scierror(999, _("'%s' property does not exist for this handle.\n"), "data");
391                 return -1;
392             }
393             else
394             {
395                 status = sciReturnMatrix(_pvCtx, data, nbRow, nbCol);
396                 FREE(data);
397             }
398
399             return status;
400         }
401     }
402 }
403 /*------------------------------------------------------------------------*/