check input argument type in light_create function and clean code
[scilab.git] / scilab / modules / graphics / src / c / Light.c
1 /*\r
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab\r
3  * Copyright (C) 2013 - Pedro SOUZA\r
4  *\r
5  * This file must be used under the terms of the CeCILL.\r
6  * This source file is licensed as described in the file COPYING, which\r
7  * you should have received as part of this distribution.  The terms\r
8  * are also available at\r
9  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt\r
10  *\r
11  */\r
12 \r
13 #include "createGraphicObject.h"\r
14 #include "deleteGraphicObject.h"\r
15 #include "returnType.h"\r
16 #include "getGraphicObjectProperty.h"\r
17 #include "setGraphicObjectProperty.h"\r
18 #include "graphicObjectProperties.h"\r
19 #include "HandleManagement.h"\r
20 #include "CurrentSubwin.h"\r
21 #include "Scierror.h"\r
22 #include "localization.h"\r
23 #include "BuildObjects.h"\r
24 \r
25 BOOL isValidType(int type)\r
26 {\r
27     return type >= 0 && type <= 1;\r
28 }\r
29 \r
30 BOOL isValidColor(double * color)\r
31 {\r
32     if (color != NULL)\r
33     {\r
34         return (color[0] >= 0.0 && color[0] <= 1.0) &&\r
35                (color[1] >= 0.0 && color[1] <= 1.0) &&\r
36                (color[2] >= 0.0 && color[2] <= 1.0);\r
37     }\r
38     return FALSE;\r
39 }\r
40 \r
41 BOOL createLight(char* fname, long long axes_handle, int type, BOOL visible, double * position, double * direction, double * ambient_color, double * diffuse_color, double * specular_color, long long * pLightHandle)\r
42 {\r
43     const char * axes;\r
44     char * light;\r
45     int * piType = &type;\r
46     int hType = 0;\r
47     int * pihType = &hType;\r
48     int * piVisible = &visible;\r
49 \r
50     if (pLightHandle == NULL)\r
51     {\r
52         return FALSE;\r
53     }\r
54 \r
55     axes = getObjectFromHandle(axes_handle);\r
56     if (axes == NULL)\r
57     {\r
58         axes = getOrCreateDefaultSubwin();\r
59         if (axes == NULL)\r
60         {\r
61             Scierror(999, _("%s: The handle is not or no more valid.\n"), fname);\r
62             return FALSE;\r
63         }\r
64     }\r
65 \r
66     //check handle type\r
67     getGraphicObjectProperty(axes, __GO_TYPE__, jni_int, (void **)&pihType);\r
68     if (hType != __GO_AXES__)\r
69     {\r
70         Scierror(999, _("The parent has to be a SUBWIN\n"));\r
71         return FALSE;\r
72     }\r
73 \r
74     light = createGraphicObject(__GO_LIGHT__);\r
75     if (light == NULL)\r
76     {\r
77         return FALSE;\r
78     }\r
79 \r
80     setGraphicObjectProperty(light, __GO_VISIBLE__, piVisible, jni_bool, 1);\r
81 \r
82     if (isValidType(type))\r
83     {\r
84         setGraphicObjectProperty(light, __GO_LIGHT_TYPE__, piType, jni_int, 1);\r
85     }\r
86 \r
87     if (position)\r
88     {\r
89         setGraphicObjectProperty(light, __GO_LIGHT_POSITION__, position, jni_double_vector, 3);\r
90     }\r
91 \r
92     if (direction)\r
93     {\r
94         setGraphicObjectProperty(light, __GO_LIGHT_DIRECTION__, direction, jni_double_vector, 3);\r
95     }\r
96 \r
97     if (isValidColor(ambient_color))\r
98     {\r
99         setGraphicObjectProperty(light, __GO_AMBIENTCOLOR__, ambient_color, jni_double_vector, 3);\r
100     }\r
101 \r
102     if (isValidColor(diffuse_color))\r
103     {\r
104         setGraphicObjectProperty(light, __GO_DIFFUSECOLOR__, diffuse_color, jni_double_vector, 3);\r
105     }\r
106 \r
107     if (isValidColor(specular_color))\r
108     {\r
109         setGraphicObjectProperty(light, __GO_SPECULARCOLOR__, specular_color, jni_double_vector, 3);\r
110     }\r
111 \r
112     //return handle\r
113     *pLightHandle = getHandle(light);\r
114 \r
115     //set light as child of axes\r
116     setGraphicObjectRelationship(axes, light);\r
117 \r
118     //release memory\r
119     releaseGraphicObjectProperty(__GO_PARENT__, light, jni_string, 1);\r
120 \r
121     return TRUE;\r
122 }\r
123 \r
124 \r
125 BOOL deleteLight(long long light_handle)\r
126 {\r
127     int iType;\r
128     int *piType = &iType;\r
129     const char * uid = NULL;\r
130 \r
131     uid = getObjectFromHandle(light_handle);\r
132     if (uid == NULL)\r
133     {\r
134         return FALSE;\r
135     }\r
136 \r
137     getGraphicObjectProperty(uid, __GO_TYPE__, jni_int, (void **)&piType);\r
138 \r
139     if (iType != __GO_LIGHT__)\r
140     {\r
141         return FALSE;\r
142     }\r
143 \r
144     deleteGraphicObject((char*)uid);\r
145 \r
146     return TRUE;\r
147 }\r