Coverity: fix C uninitialized variables
[scilab.git] / scilab / modules / graphics / src / c / Gray.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 1998-2001 - ENPC - Jean-Philippe Chancelier
4  * Copyright (C) 2002-2004 - INRIA - Djalel Abdemouche
5  * Copyright (C) 2004-2005 - INRIA - Fabrice Leray
6  * Copyright (C) 2010-2011 - DIGITEO - Manuel Juliachs
7  *
8  * Copyright (C) 2012 - 2016 - Scilab Enterprises
9  *
10  * This file is hereby licensed under the terms of the GNU GPL v2.0,
11  * pursuant to article 5.3.4 of the CeCILL v.2.1.
12  * This file was originally licensed under the terms of the CeCILL v2.1,
13  * and continues to be available under such terms.
14  * For more information, see the COPYING file which you should have received
15  * along with this program.
16  *
17  */
18
19 /*------------------------------------------------------------------------
20  *    Graphic library
21  --------------------------------------------------------------------------*/
22 #include <string.h>
23 #include "math_graphics.h"
24 #include "PloEch.h"
25
26 #include "GetProperty.h"
27 #include "SetProperty.h"
28 #include "DrawObjects.h"
29 #include "BuildObjects.h"
30 #include "Axes.h"
31 #include "Scierror.h"
32 #include "sciprint.h"
33 #include "GrayPlot.h"
34
35 #include "sci_malloc.h" /* MALLOC */
36 #include "localization.h"
37 #include "Plot2d.h"
38 #include "get_ticks_utils.h"
39
40 #include "getGraphicObjectProperty.h"
41 #include "setGraphicObjectProperty.h"
42 #include "graphicObjectProperties.h"
43 #include "CurrentSubwin.h"
44 #include "CurrentObject.h"
45 #include "Sciwarning.h"
46
47 int C2F(xgray)(double *x, double *y, double *z, int *n1, int *n2, char *strflag, double *brect, int *aaint, BOOL flagNax, char *logflags, long int l1)
48 {
49     int iSubwinUID = 0;
50     int iGrayplotUID = 0;
51     double xx[2], yy[2];
52     int nn1 = 1, nn2 = 2;
53     double drect[6];
54     BOOL bounds_changed = FALSE;
55     BOOL isRedrawn = FALSE;
56     BOOL axes_properties_changed = FALSE;
57
58     char textLogFlags[3];
59     double rotationAngles[2];
60     int clipState = 0;
61     int autoScale = 0;
62     int firstPlot = 0;
63     int logFlags[3] = {0};
64     char dataflag = 0;
65     int autoSubticks = 0;
66
67     int iTmp = 0;
68     int* piTmp = &iTmp;
69
70     xx[0] = Mini(x, *n1);
71     xx[1] = Maxi(x, *n1);
72     yy[0] = Mini(y, *n2);
73     yy[1] = Maxi(y, *n2);
74
75     /* Adding F.Leray 22.04.04 */
76     iSubwinUID = getCurrentSubWin();
77
78     isRedrawn = checkRedrawing();
79
80     rotationAngles[0] = 0.0;
81     rotationAngles[1] = 270.0;
82
83     setGraphicObjectProperty(iSubwinUID, __GO_ROTATION_ANGLES__, rotationAngles, jni_double_vector, 2);
84
85     /* Force "cligrf" clipping (1) */
86     clipState = 1;
87     setGraphicObjectProperty(iSubwinUID, __GO_CLIP_STATE__, &clipState, jni_int, 1);
88
89     getGraphicObjectProperty(iSubwinUID, __GO_FIRST_PLOT__, jni_bool, (void **)&piTmp);
90     firstPlot = iTmp;
91
92     getGraphicObjectProperty(iSubwinUID, __GO_AUTO_SCALE__, jni_bool, (void **)&piTmp);
93     autoScale = iTmp;
94
95     /* Reset x and y logflags */
96     if (firstPlot)
97     {
98         logFlags[0] = getBooleanLogFlag(logflags[1]);
99         logFlags[1] = getBooleanLogFlag(logflags[2]);
100
101         setGraphicObjectProperty(iSubwinUID, __GO_X_AXIS_LOG_FLAG__, &logFlags[0], jni_bool, 1);
102         setGraphicObjectProperty(iSubwinUID, __GO_Y_AXIS_LOG_FLAG__, &logFlags[1], jni_bool, 1);
103     }
104
105     if (autoScale)
106     {
107         /* compute and merge new specified bounds with the data bounds */
108         switch (strflag[1])
109         {
110             case '0':
111                 /* do not change data bounds */
112                 break;
113             case '1' :
114             case '3' :
115             case '5' :
116             case '7':
117                 /* Force data bounds=brect */
118                 re_index_brect(brect, drect);
119                 break;
120             case '2' :
121             case '4' :
122             case '6' :
123             case '8':
124             case '9':
125                 /* Force data bounds to the x and y bounds */
126                 if ((int)strlen(logflags) < 1)
127                 {
128                     dataflag = 'g';
129                 }
130                 else
131                 {
132                     dataflag = logflags[0];
133                 }
134
135                 getGraphicObjectProperty(iSubwinUID, __GO_X_AXIS_LOG_FLAG__, jni_bool, (void **)&piTmp);
136                 logFlags[0] = iTmp;
137                 getGraphicObjectProperty(iSubwinUID, __GO_Y_AXIS_LOG_FLAG__, jni_bool, (void **)&piTmp);
138                 logFlags[1] = iTmp;
139                 getGraphicObjectProperty(iSubwinUID, __GO_Z_AXIS_LOG_FLAG__, jni_bool, (void **)&piTmp);
140                 logFlags[2] = iTmp;
141
142                 /* Conversion required by compute_data_bounds2 */
143                 textLogFlags[0] = getTextLogFlag(logFlags[0]);
144                 textLogFlags[1] = getTextLogFlag(logFlags[1]);
145                 textLogFlags[2] = getTextLogFlag(logFlags[2]);
146
147                 /* Force data bounds to the x and y bounds */
148                 compute_data_bounds2(0, dataflag, textLogFlags, xx, yy, nn1, nn2, drect);
149                 break;
150         }
151
152         /* merge data bounds and drect */
153         if (!firstPlot && (strflag[1] == '7' || strflag[1] == '8'))
154         {
155             double* dataBounds;
156             getGraphicObjectProperty(iSubwinUID, __GO_DATA_BOUNDS__, jni_double_vector, (void **)&dataBounds);
157
158             drect[0] = Min(dataBounds[0], drect[0]); /*xmin*/
159             drect[2] = Min(dataBounds[2], drect[2]); /*ymin*/
160             drect[1] = Max(dataBounds[1], drect[1]); /*xmax*/
161             drect[3] = Max(dataBounds[3], drect[3]); /*ymax*/
162         }
163
164         if (strflag[1] != '0')
165         {
166             bounds_changed = update_specification_bounds(iSubwinUID, drect, 2);
167         }
168     }
169
170     if (firstPlot)
171     {
172         bounds_changed = TRUE;
173     }
174
175     axes_properties_changed = strflag2axes_properties(iSubwinUID, strflag);
176
177     firstPlot = 0;
178     setGraphicObjectProperty(iSubwinUID, __GO_FIRST_PLOT__, &firstPlot, jni_bool, 1);
179
180     /* F.Leray 07.10.04 : trigger algo to init. manual graduation u_xgrads and
181     u_ygrads if nax (in matdes.c which is == aaint HERE) was specified */
182
183     /* The MVC AUTO_SUBTICKS property corresponds to !flagNax */
184     autoSubticks = !flagNax;
185     setGraphicObjectProperty(iSubwinUID, __GO_AUTO_SUBTICKS__, &autoSubticks, jni_bool, 1);
186
187     if (flagNax == TRUE)
188     {
189         if (logFlags[0] == 0 && logFlags[1] == 0)
190         {
191             int autoTicks;
192
193             autoTicks = 0;
194             setGraphicObjectProperty(iSubwinUID, __GO_X_AXIS_AUTO_TICKS__, &autoTicks, jni_bool, 1);
195             setGraphicObjectProperty(iSubwinUID, __GO_Y_AXIS_AUTO_TICKS__, &autoTicks, jni_bool, 1);
196         }
197         else
198         {
199             Sciwarning(_("Warning: Nax does not work with logarithmic scaling.\n"));
200         }
201     }
202
203     /* Constructs the object */
204     iGrayplotUID = ConstructGrayplot(getCurrentSubWin(), x, y, z, *n1, *n2, 0);
205
206     /* Failed allocation */
207     if (iGrayplotUID == 0)
208     {
209         Scierror(999, _("%s: No more memory.\n"), "grayplot");
210         return -1;
211     }
212
213     /* Sets the grayplot as current */
214     setCurrentObject(iGrayplotUID);
215
216     return (0);
217 }
218
219 int C2F(implot)(unsigned char *z, int *n1, int *n2, char *strflag, double *brect, int *aaint, BOOL flagNax, long int l1, int plottype)
220 {
221     int iSubwinUID = 0;
222     int iGrayplotUID = 0;
223     double xx[2], yy[2];
224     static int nn1 = 1, nn2 = 2;
225     double drect[6];
226     BOOL bounds_changed = FALSE;
227     BOOL axes_properties_changed = FALSE;
228
229     char textLogFlags[3];
230     double rotationAngles[2];
231     int clipState = 0;
232     int autoScale = 0;
233     int firstPlot = 0;
234     int logFlags[3];
235     int autoSubticks = 0;
236
237     int iTmp = 0;
238     int* piTmp = &iTmp;
239
240     xx[0] = 0.5;
241     xx[1] = *n2 + 0.5;
242     yy[0] = 0.5;
243     yy[1] = *n1 + 0.5;
244
245     /* Adding F.Leray 22.04.04 */
246     iSubwinUID = getCurrentSubWin();
247
248     checkRedrawing();
249
250     rotationAngles[0] = 0.0;
251     rotationAngles[1] = 270.0;
252
253     setGraphicObjectProperty(iSubwinUID, __GO_ROTATION_ANGLES__, rotationAngles, jni_double_vector, 2);
254
255     /* Force "cligrf" clipping (1) */
256     clipState = 1;
257     setGraphicObjectProperty(iSubwinUID, __GO_CLIP_STATE__, &clipState, jni_int, 1);
258
259     getGraphicObjectProperty(iSubwinUID, __GO_FIRST_PLOT__, jni_bool, (void **)&piTmp);
260     firstPlot = iTmp;
261
262     getGraphicObjectProperty(iSubwinUID, __GO_AUTO_SCALE__, jni_bool, (void **)&piTmp);
263     autoScale = iTmp;
264
265     /*---- Boundaries of the frame ----*/
266     if (autoScale)
267     {
268         /* compute and merge new specified bounds with the data bounds */
269         switch (strflag[1])
270         {
271             case '0':
272                 /* do not change data bounds */
273                 break;
274             case '1' :
275             case '3' :
276             case '5' :
277             case '7':
278                 /* Force data bounds=brect */
279                 re_index_brect(brect, drect);
280                 break;
281             case '2' :
282             case '4' :
283             case '6' :
284             case '8':
285             case '9':
286                 getGraphicObjectProperty(iSubwinUID, __GO_X_AXIS_LOG_FLAG__, jni_bool, (void **)&piTmp);
287                 logFlags[0] = iTmp;
288                 getGraphicObjectProperty(iSubwinUID, __GO_Y_AXIS_LOG_FLAG__, jni_bool, (void **)&piTmp);
289                 logFlags[1] = iTmp;
290                 getGraphicObjectProperty(iSubwinUID, __GO_Z_AXIS_LOG_FLAG__, jni_bool, (void **)&piTmp);
291                 logFlags[2] = iTmp;
292
293                 /* Conversion required by compute_data_bounds2 */
294                 textLogFlags[0] = getTextLogFlag(logFlags[0]);
295                 textLogFlags[1] = getTextLogFlag(logFlags[1]);
296                 textLogFlags[2] = getTextLogFlag(logFlags[2]);
297
298                 compute_data_bounds2(0, 'g', textLogFlags, xx, yy, nn1, nn2, drect);
299                 break;
300         }
301
302         /* merge data bounds and drect */
303         if (!firstPlot &&
304                 (strflag[1] == '7' || strflag[1] == '8' || strflag[1] == '9'))
305         {
306             double* dataBounds;
307             getGraphicObjectProperty(iSubwinUID, __GO_DATA_BOUNDS__, jni_double_vector, (void **)&dataBounds);
308
309             drect[0] = Min(dataBounds[0], drect[0]); /*xmin*/
310             drect[2] = Min(dataBounds[2], drect[2]); /*ymin*/
311             drect[1] = Max(dataBounds[1], drect[1]); /*xmax*/
312             drect[3] = Max(dataBounds[3], drect[3]); /*ymax*/
313         }
314
315         if (strflag[1] != '0')
316         {
317             bounds_changed = update_specification_bounds(iSubwinUID, drect, 2);
318         }
319     }
320
321     if (firstPlot)
322     {
323         bounds_changed = TRUE;
324     }
325
326     axes_properties_changed = strflag2axes_properties(iSubwinUID, strflag);
327
328     firstPlot = 0;
329     setGraphicObjectProperty(iSubwinUID, __GO_FIRST_PLOT__, &firstPlot, jni_bool, 1);
330
331     /* F.Leray 07.10.04 : trigger algo to init. manual graduation u_xgrads and
332     u_ygrads if nax (in matdes.c which is == aaint HERE) was specified */
333
334     /* The MVC AUTO_SUBTICKS property corresponds to !flagNax */
335     autoSubticks = !flagNax;
336     setGraphicObjectProperty(iSubwinUID, __GO_AUTO_SUBTICKS__, &autoSubticks, jni_bool, 1);
337
338     if (flagNax == TRUE)
339     {
340         if (logFlags[0] == 0 && logFlags[1] == 0)
341         {
342             int autoTicks;
343
344             autoTicks = 0;
345             setGraphicObjectProperty(iSubwinUID, __GO_X_AXIS_AUTO_TICKS__, &autoTicks, jni_bool, 1);
346             setGraphicObjectProperty(iSubwinUID, __GO_Y_AXIS_AUTO_TICKS__, &autoTicks, jni_bool, 1);
347         }
348         else
349         {
350             Sciwarning(_("Warning: Nax does not work with logarithmic scaling.\n"));
351         }
352     }
353
354     /* Construct the grayplot object */
355     iGrayplotUID = ConstructImplot(iSubwinUID, NULL, z, *n1 + 1, *n2 + 1, plottype);
356
357     if (iGrayplotUID == 0)
358     {
359         // allocation error
360         Scierror(999, _("%s: No more memory.\n"), "grayplot");
361         return -1;
362     }
363
364     setCurrentObject(iGrayplotUID);
365     /* if the auto_clear is on we must redraw everything */
366
367     return 0;
368 }
369
370 int C2F(xgray1)(double *z, int *n1, int *n2, char *strflag, double *brect, int *aaint, BOOL flagNax, long int l1)
371 {
372     int iSubwinUID = 0;
373     int iGrayplotUID = 0;
374     double xx[2], yy[2];
375     static int nn1 = 1, nn2 = 2;
376     double drect[6];
377     BOOL bounds_changed = FALSE;
378     BOOL axes_properties_changed = FALSE;
379
380     char textLogFlags[3];
381     double rotationAngles[2];
382     int clipState = 0;
383     int autoScale = 0;
384     int firstPlot = 0;
385     int logFlags[3];
386     int autoSubticks = 0;
387
388     int iTmp = 0;
389     int* piTmp = &iTmp;
390
391     xx[0] = 0.5;
392     xx[1] = *n2 + 0.5;
393     yy[0] = 0.5;
394     yy[1] = *n1 + 0.5;
395
396     /* Adding F.Leray 22.04.04 */
397     iSubwinUID = getCurrentSubWin();
398
399     checkRedrawing();
400
401     rotationAngles[0] = 0.0;
402     rotationAngles[1] = 270.0;
403
404     setGraphicObjectProperty(iSubwinUID, __GO_ROTATION_ANGLES__, rotationAngles, jni_double_vector, 2);
405
406     /* Force "cligrf" clipping (1) */
407     clipState = 1;
408     setGraphicObjectProperty(iSubwinUID, __GO_CLIP_STATE__, &clipState, jni_int, 1);
409
410     getGraphicObjectProperty(iSubwinUID, __GO_FIRST_PLOT__, jni_bool, (void **)&piTmp);
411     firstPlot = iTmp;
412
413     getGraphicObjectProperty(iSubwinUID, __GO_AUTO_SCALE__, jni_bool, (void **)&piTmp);
414     autoScale = iTmp;
415
416     /*---- Boundaries of the frame ----*/
417     if (autoScale)
418     {
419         /* compute and merge new specified bounds with the data bounds */
420         switch (strflag[1])
421         {
422             case '0':
423                 /* do not change data bounds */
424                 break;
425             case '1' :
426             case '3' :
427             case '5' :
428             case '7':
429                 /* Force data bounds=brect */
430                 re_index_brect(brect, drect);
431                 break;
432             case '2' :
433             case '4' :
434             case '6' :
435             case '8':
436             case '9':
437                 getGraphicObjectProperty(iSubwinUID, __GO_X_AXIS_LOG_FLAG__, jni_bool, (void **)&piTmp);
438                 logFlags[0] = iTmp;
439                 getGraphicObjectProperty(iSubwinUID, __GO_Y_AXIS_LOG_FLAG__, jni_bool, (void **)&piTmp);
440                 logFlags[1] = iTmp;
441                 getGraphicObjectProperty(iSubwinUID, __GO_Z_AXIS_LOG_FLAG__, jni_bool, (void **)&piTmp);
442                 logFlags[2] = iTmp;
443
444                 /* Conversion required by compute_data_bounds2 */
445                 textLogFlags[0] = getTextLogFlag(logFlags[0]);
446                 textLogFlags[1] = getTextLogFlag(logFlags[1]);
447                 textLogFlags[2] = getTextLogFlag(logFlags[2]);
448
449                 compute_data_bounds2(0, 'g', textLogFlags, xx, yy, nn1, nn2, drect);
450                 break;
451         }
452
453         /* merge data bounds and drect */
454         if (!firstPlot &&
455                 (strflag[1] == '7' || strflag[1] == '8' || strflag[1] == '9'))
456         {
457             double* dataBounds;
458             getGraphicObjectProperty(iSubwinUID, __GO_DATA_BOUNDS__, jni_double_vector, (void **)&dataBounds);
459
460             drect[0] = Min(dataBounds[0], drect[0]); /*xmin*/
461             drect[2] = Min(dataBounds[2], drect[2]); /*ymin*/
462             drect[1] = Max(dataBounds[1], drect[1]); /*xmax*/
463             drect[3] = Max(dataBounds[3], drect[3]); /*ymax*/
464         }
465
466         if (strflag[1] != '0')
467         {
468             bounds_changed = update_specification_bounds(iSubwinUID, drect, 2);
469         }
470     }
471
472     if (firstPlot)
473     {
474         bounds_changed = TRUE;
475     }
476
477     axes_properties_changed = strflag2axes_properties(iSubwinUID, strflag);
478
479     firstPlot = 0;
480     setGraphicObjectProperty(iSubwinUID, __GO_FIRST_PLOT__, &firstPlot, jni_bool, 1);
481
482     /* F.Leray 07.10.04 : trigger algo to init. manual graduation u_xgrads and
483     u_ygrads if nax (in matdes.c which is == aaint HERE) was specified */
484
485     /* The MVC AUTO_SUBTICKS property corresponds to !flagNax */
486     autoSubticks = !flagNax;
487     setGraphicObjectProperty(iSubwinUID, __GO_AUTO_SUBTICKS__, &autoSubticks, jni_bool, 1);
488
489
490
491     if (flagNax == TRUE)
492     {
493         if (logFlags[0] == 0 && logFlags[1] == 0)
494         {
495             int autoTicks;
496
497             autoTicks = 0;
498             setGraphicObjectProperty(iSubwinUID, __GO_X_AXIS_AUTO_TICKS__, &autoTicks, jni_bool, 1);
499             setGraphicObjectProperty(iSubwinUID, __GO_Y_AXIS_AUTO_TICKS__, &autoTicks, jni_bool, 1);
500         }
501         else
502         {
503             Sciwarning(_("Warning: Nax does not work with logarithmic scaling.\n"));
504         }
505     }
506
507     /* Construct the grayplot object */
508     iGrayplotUID = ConstructGrayplot(iSubwinUID, NULL, NULL, z, *n1 + 1, *n2 + 1, 1);
509
510     if (iGrayplotUID == 0)
511     {
512         // allocation error
513         Scierror(999, _("%s: No more memory.\n"), "grayplot");
514         return -1;
515     }
516
517     setCurrentObject(iGrayplotUID);
518     /* if the auto_clear is on we must redraw everything */
519
520     return 0;
521 }
522
523
524 /*-------------------------------------------------------
525  * like xgray1 :
526  * but xrect here give the rectangle in which the
527  * grayplot is to be drawn using the current scale
528  -------------------------------------------------------*/
529
530 int C2F(xgray2)(double *z, int *n1, int *n2, double *xrect)
531 {
532     int iSubwinUID = 0;
533     int iGrayplotUID = 0;
534     BOOL isRedrawn = FALSE;
535     double y; /* void for ConstructGrayplot */
536     int clipState = 0;
537     int firstPlot = 0;
538
539     isRedrawn = checkRedrawing();
540
541     /*---- Boundaries of the frame ----*/
542     iSubwinUID = getCurrentSubWin();
543
544     /* Force "cligrf" clipping (1) */
545     clipState = 1;
546     setGraphicObjectProperty(iSubwinUID, __GO_CLIP_STATE__, &clipState, jni_int, 1);
547
548     iGrayplotUID = ConstructGrayplot(iSubwinUID, xrect, &y, z, *n1 + 1, *n2 + 1, 2);
549
550     if (iGrayplotUID == 0)
551     {
552         // allocation error
553         Scierror(999, _("%s: No more memory.\n"), "grayplot");
554         return -1;
555     }
556
557     setCurrentObject(iGrayplotUID);
558     setGraphicObjectProperty(iSubwinUID, __GO_FIRST_PLOT__, &firstPlot, jni_bool, 1);
559
560     return (0);
561 }
562
563 /*
564   For matplot1
565 */
566 int C2F(implot1)(unsigned char *z, int *n1, int *n2, double *xrect, int plottype)
567 {
568     int iSubwinUID = 0;
569     int iGrayplotUID = 0;
570     BOOL isRedrawn = FALSE;
571     double y = 0; /* void for ConstructGrayplot */
572     int clipState = 0;
573     int firstPlot = 0;
574
575     isRedrawn = checkRedrawing();
576
577     /*---- Boundaries of the frame ----*/
578     iSubwinUID = getCurrentSubWin();
579
580     /* Force "cligrf" clipping (1) */
581     clipState = 1;
582     setGraphicObjectProperty(iSubwinUID, __GO_CLIP_STATE__, &clipState, jni_int, 1);
583
584     iGrayplotUID = ConstructImplot(iSubwinUID, xrect, z, *n1 + 1, *n2 + 1, plottype);
585     if (iGrayplotUID == 0)
586     {
587         // allocation error
588         Scierror(999, _("%s: No more memory.\n"), "grayplot");
589         return -1;
590     }
591
592     setCurrentObject(iGrayplotUID);
593     setGraphicObjectProperty(iSubwinUID, __GO_FIRST_PLOT__, &firstPlot, jni_bool, 1);
594
595     return (0);
596 }