Fix memleaks and slightly improve perfs
[scilab.git] / scilab / modules / graphics / src / c / CloneObjects.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2001-2002 - INRIA - Mathieu Philippe
4  * Copyright (C) 2002-2004 - INRIA - Djalel Abdemouche
5  * Copyright (C) 2004-2006 - INRIA - Fabrice Leray
6  * Copyright (C) 2005 - INRIA - Jean-Baptiste Silvy
7  * Copyright (C) 2010-2011 - DIGITEO - Manuel Juliachs
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-en.txt
14  *
15  */
16
17 /*------------------------------------------------------------------------
18  *    Graphic library
19  *    newGraph Library header
20  *    Comment:
21  *    This file contains all functions used to CLONE an object, it means make
22  *    a copy of an object under the same subwin.
23  --------------------------------------------------------------------------*/
24
25 #include "CloneObjects.h"
26 #include "GetProperty.h"
27 #include "BuildObjects.h"
28 #include "SetProperty.h"
29 #include "HandleManagement.h"
30
31 #include "MALLOC.h" /* MALLOC */
32 #include "localization.h"
33 #include "Scierror.h"
34 #include "BasicAlgos.h"
35
36 #include "createGraphicObject.h" /* cloneGraphicObject */
37 #include "getGraphicObjectProperty.h"
38 #include "setGraphicObjectProperty.h"
39 #include "graphicObjectProperties.h"
40
41 /*--------------------------------------------------------------------------*/
42 /*
43  * Copies the ContouredObject properties from the source object to the destination object
44  * This code ought to be moved into the Java Model, either in the relevant
45  * constructor (ContouredObject) or into an initialization function.
46  */
47 int cloneGraphicContext(char* sourceIdentifier, char* destIdentifier)
48 {
49     double dblTmp = 0.0;
50     double *pdblTmp = &dblTmp;
51     int iTmp = 0;
52     int *piTmp = &iTmp;
53
54     int lineMode = 0;
55     int foreground = 0;
56     int lineStyle = 0;
57     int background = 0;
58     int markForeground = 0;
59     int markBackground = 0;
60     int markStyle = 0;
61     int markSize = 0;
62     int markSizeUnit = 0;
63     double lineThickness = 0.;
64
65     /*
66      * All these properties are passed by value thus do not care to release them
67      * and do not call releaseGraphicObjectProperty on purpose.
68      */
69
70     getGraphicObjectProperty(sourceIdentifier, __GO_LINE_MODE__, jni_bool, (void **)&piTmp);
71     lineMode = iTmp;
72     getGraphicObjectProperty(sourceIdentifier, __GO_LINE_COLOR__, jni_int, (void **)&piTmp);
73     foreground = iTmp;
74     getGraphicObjectProperty(sourceIdentifier, __GO_LINE_THICKNESS__, jni_double, (void **)&pdblTmp);
75     lineThickness = dblTmp;
76     getGraphicObjectProperty(sourceIdentifier, __GO_LINE_STYLE__, jni_int, (void **)&piTmp);
77     lineStyle = iTmp;
78
79     /*
80      * Commented out since there is a confusion between Axes' FILLED property
81      * and the FILL_MODE ContouredObject property
82      * To be corrected
83      */
84 #if 0
85     tmp = (int*) setGraphicObjectProperty(pobj->UID, __GO_FILL_MODE__, &fillMode, jni_bool, 1);
86     fillMode = *tmp;
87 #endif
88
89     getGraphicObjectProperty(sourceIdentifier, __GO_BACKGROUND__, jni_int, (void **)&piTmp);
90     background = iTmp;
91
92     getGraphicObjectProperty(sourceIdentifier, __GO_MARK_FOREGROUND__, jni_int, (void **)&piTmp);
93     markForeground = iTmp;
94     getGraphicObjectProperty(sourceIdentifier, __GO_MARK_BACKGROUND__, jni_int, (void **)&piTmp);
95     markBackground = iTmp;
96     getGraphicObjectProperty(sourceIdentifier, __GO_MARK_STYLE__, jni_int, (void **)&piTmp);
97     markStyle = iTmp;
98     getGraphicObjectProperty(sourceIdentifier, __GO_MARK_SIZE__, jni_int, (void **)&piTmp);
99     markSize = iTmp;
100     getGraphicObjectProperty(sourceIdentifier, __GO_MARK_SIZE_UNIT__, jni_int, (void **)&piTmp);
101     markSizeUnit = iTmp;
102
103     setGraphicObjectProperty(destIdentifier, __GO_LINE_MODE__, &lineMode, jni_bool, 1);
104     setGraphicObjectProperty(destIdentifier, __GO_LINE_COLOR__, &foreground, jni_int, 1);
105     setGraphicObjectProperty(destIdentifier, __GO_LINE_THICKNESS__, &lineThickness, jni_double, 1);
106     setGraphicObjectProperty(destIdentifier, __GO_LINE_STYLE__, &lineStyle, jni_int, 1);
107
108     /* Commented out due to the confusion between Axes' FILLED and the FILL_MODE Contoured property */
109 #if 0
110     setGraphicObjectProperty(destIdentifier, __GO_FILL_MODE__, &fillMode, jni_bool, 1);
111 #endif
112
113     setGraphicObjectProperty(destIdentifier, __GO_BACKGROUND__, &background, jni_int, 1);
114
115     setGraphicObjectProperty(destIdentifier, __GO_MARK_FOREGROUND__, &markForeground, jni_int, 1);
116     setGraphicObjectProperty(destIdentifier, __GO_MARK_BACKGROUND__, &markBackground, jni_int, 1);
117     setGraphicObjectProperty(destIdentifier, __GO_MARK_STYLE__, &markStyle, jni_int, 1);
118     setGraphicObjectProperty(destIdentifier, __GO_MARK_SIZE__, &markSize, jni_int, 1);
119     setGraphicObjectProperty(destIdentifier, __GO_MARK_SIZE_UNIT__, &markSizeUnit, jni_int, 1);
120
121     return 0;
122 }
123 /*--------------------------------------------------------------------------*/
124 int cloneFontContext(char* sourceIdentifier, char* destIdentifier)
125 {
126     double dblTmp = 0.0;
127     double *pdblTmp = &dblTmp;
128     double fontSize = 0.;
129     int fontColor = 0;
130     int fontStyle = 0;
131     int fontFractional = 0;
132     int iTmp = 0;
133     int *piTmp = &iTmp;
134
135     /*
136      * All these properties are passed by value thus do not care to release them
137      * and do not call releaseGraphicObjectProperty on purpose.
138      */
139
140     getGraphicObjectProperty(sourceIdentifier, __GO_FONT_COLOR__, jni_int, (void **)&piTmp);
141     fontColor = iTmp;
142     getGraphicObjectProperty(sourceIdentifier, __GO_FONT_STYLE__, jni_int, (void **)&piTmp);
143     fontStyle = iTmp;
144     getGraphicObjectProperty(sourceIdentifier, __GO_FONT_SIZE__, jni_double, (void **)&pdblTmp);
145     fontSize = dblTmp;
146     getGraphicObjectProperty(sourceIdentifier, __GO_FONT_FRACTIONAL__, jni_bool, (void **)&piTmp);
147     fontFractional = iTmp;
148
149     setGraphicObjectProperty(destIdentifier, __GO_FONT_COLOR__, &fontColor, jni_int, 1);
150     setGraphicObjectProperty(destIdentifier, __GO_FONT_STYLE__, &fontStyle, jni_int, 1);
151     setGraphicObjectProperty(destIdentifier, __GO_FONT_SIZE__, &fontSize, jni_double, 1);
152     setGraphicObjectProperty(destIdentifier, __GO_FONT_FRACTIONAL__, &fontFractional, jni_bool, 1);
153
154     return 0;
155 }
156
157 char* clonePolyline(char* sourcePolyline)
158 {
159     char *clonedPolylineUID = NULL;
160     char* parentAxes = NULL;
161
162     double* dataX = NULL;
163     double* dataY = NULL;
164     double* dataZ = NULL;
165
166     double lineThickness = 0.0;
167     double* pLineThickness = &lineThickness;
168
169     int nPoints = 0;
170     int* pNPoints = &nPoints;
171
172     int closed = 0;
173     int* pClosed = &closed;
174
175     int polylineStyle = 0;
176     int* pPolylineStyle = &polylineStyle;
177
178     int tmp = 0;
179     int* pTmp = &tmp;
180
181     int lineStyle = 0;
182     int foreground = 0;
183     int background = 0;
184     int markForeground = 0;
185     int markBackground = 0;
186     int markStyle = 0;
187
188     int lineMode = 0;
189     int fillMode = 0;
190     int markMode = 0;
191     int interpShaded = 0;
192
193     getGraphicObjectProperty(sourcePolyline, __GO_PARENT_AXES__, jni_string, (void **)&parentAxes);
194
195     getGraphicObjectProperty(sourcePolyline, __GO_DATA_MODEL_X__, jni_double_vector, (void **)&dataX);
196     getGraphicObjectProperty(sourcePolyline, __GO_DATA_MODEL_Y__, jni_double_vector, (void **)&dataY);
197     getGraphicObjectProperty(sourcePolyline, __GO_DATA_MODEL_Z__, jni_double_vector, (void **)&dataZ);
198
199     getGraphicObjectProperty(sourcePolyline, __GO_DATA_MODEL_NUM_ELEMENTS__, jni_int, (void **)&pNPoints);
200
201     getGraphicObjectProperty(sourcePolyline, __GO_CLOSED__, jni_bool, (void **)&pClosed);
202     getGraphicObjectProperty(sourcePolyline, __GO_POLYLINE_STYLE__, jni_int, (void **)&pPolylineStyle);
203
204     /* ContouredObject properties */
205     getGraphicObjectProperty(sourcePolyline, __GO_LINE_THICKNESS__, jni_double, (void **)&pLineThickness);
206     getGraphicObjectProperty(sourcePolyline, __GO_LINE_STYLE__, jni_int, (void **)&pTmp);
207     lineStyle = tmp;
208     getGraphicObjectProperty(sourcePolyline, __GO_LINE_COLOR__, jni_int, (void **)&pTmp);
209     foreground = tmp;
210     getGraphicObjectProperty(sourcePolyline, __GO_BACKGROUND__, jni_int, (void **)&pTmp);
211     background = tmp;
212     getGraphicObjectProperty(sourcePolyline, __GO_MARK_STYLE__, jni_int, (void **)&pTmp);
213     markStyle = tmp;
214     getGraphicObjectProperty(sourcePolyline, __GO_MARK_FOREGROUND__, jni_int, (void **)&pTmp);
215     markForeground = tmp;
216     getGraphicObjectProperty(sourcePolyline, __GO_MARK_BACKGROUND__, jni_int, (void **)&pTmp);
217     markBackground = tmp;
218
219     getGraphicObjectProperty(sourcePolyline, __GO_LINE_MODE__, jni_bool, (void **)&pTmp);
220     lineMode = tmp;
221     getGraphicObjectProperty(sourcePolyline, __GO_FILL_MODE__, jni_bool, (void **)&pTmp);
222     fillMode = tmp;
223     getGraphicObjectProperty(sourcePolyline, __GO_MARK_MODE__, jni_bool, (void **)&pTmp);
224     markMode = tmp;
225     getGraphicObjectProperty(sourcePolyline, __GO_INTERP_COLOR_MODE__, jni_bool, (void **)&pTmp);
226     interpShaded = tmp;
227
228     clonedPolylineUID = allocatePolyline(parentAxes, dataX, dataY, dataZ, closed, nPoints, polylineStyle,
229                                          &foreground, &background, &markStyle, &markForeground, &markBackground,
230                                          lineMode, fillMode, markMode, interpShaded);
231
232     /* These properties must be aditionally set as this is not done by allocatePolyline */
233     setGraphicObjectProperty(clonedPolylineUID, __GO_LINE_STYLE__, &lineStyle, jni_int, 1);
234     setGraphicObjectProperty(clonedPolylineUID, __GO_LINE_THICKNESS__, &lineThickness, jni_double, 1);
235     releaseGraphicObjectProperty(__GO_POLYLINE__, clonedPolylineUID, jni_string, 1);
236
237     /*
238      * Some these properties are passed by value thus do not care to release them
239      * and do not call releaseGraphicObjectProperty on purpose.
240      *
241      * releaseGraphicObjectProperty has a real impact for the following :
242      *  - jni_string
243      *  - jni_double_vector out of the DATA_MODEL
244      */
245     releaseGraphicObjectProperty(__GO_PARENT_AXES__, parentAxes, jni_string, 1);
246
247
248     return clonedPolylineUID;
249 }
250