Coverity: fix C uninitialized variables
[scilab.git] / scilab / modules / graphics / src / c / Plo2dn.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2002-2004 - INRIA - Djalel Abdemouche
4  * Copyright (C) 2004-2006 - INRIA - Fabrice Leray
5  * Copyright (C) 2010-2011 - DIGITEO - Manuel Juliachs
6  * Copyright (C) 2011 - DIGITEO - Bruno JOFRET
7  * Copyright (C) 2012 - Scilab Enterprises - Cedric Delamarre
8  *
9  * Copyright (C) 2012 - 2016 - Scilab Enterprises
10  *
11  * This file is hereby licensed under the terms of the GNU GPL v2.0,
12  * pursuant to article 5.3.4 of the CeCILL v.2.1.
13  * This file was originally licensed under the terms of the CeCILL v2.1,
14  * and continues to be available under such terms.
15  * For more information, see the COPYING file which you should have received
16  * along with this program.
17  *
18  */
19
20 /*------------------------------------------------------------------------
21  *    Graphic library
22  --------------------------------------------------------------------------*/
23 #include <stdio.h>
24 #include <string.h>
25 #include "math_graphics.h"
26 #include "PloEch.h"
27 #include "Plot2d.h"
28
29 #define spINSIDE_SPARSE
30 #include "../../sparse/includes/spConfig.h"
31 #include "isanan.h"
32
33 #include "SetProperty.h"
34 #include "DrawObjects.h"
35 #include "BuildObjects.h"
36 #include "Axes.h"
37 #include "BasicAlgos.h"
38 #include "sciprint.h"
39 #include "Scierror.h"
40
41 #include "sci_malloc.h"             /* MALLOC */
42 #include "scitokenize.h"
43 #include "localization.h"
44 #include "get_ticks_utils.h"
45 #include "HandleManagement.h"
46 #include "freeArrayOfString.h"
47
48 #include "createGraphicObject.h"
49 #include "getGraphicObjectProperty.h"
50 #include "setGraphicObjectProperty.h"
51 #include "graphicObjectProperties.h"
52 #include "CurrentFigure.h"
53 #include "CurrentSubwin.h"
54 #include "CurrentObject.h"
55 #include "Sciwarning.h"
56
57 /*--------------------------------------------------------------------
58  *  plot2dn(ptype,Logflags,x,y,n1,n2,style,strflag,legend,brect,aaint,lstr1,lstr2)
59  *
60  *  Draw *n1 curves of *n2 points each
61  *
62  *  ptype is an int which gives the polyline drawind mode (0,1,2,3,4)
63  *
64  *  Logflags is a two character string
65  *
66  *  (x[i+(*n2)*j] ,y[i+(*n2)*j]) Double values giving the point
67  *  position of point i of curve j (i=0,*n2-1 j=0,*n1-1)
68  *
69  *  style[*n1]-> give the style to use for each curve
70  *     if style is positive --> a mark is used (mark id = style[i])
71  *     if style is strictly negative --> a dashed line is used
72  *        (dash id = abs(style[i])
73  *     if there's only one curve, style can be of type style[0]=style,
74  *     style[1]=pos (pos in [1,6])
75  *     pos give the legend position (1 to 6) (this can be iteresting
76  *     if you want to superpose curves with different legends by
77  *     calling plot2d more than one time.
78  *
79  *  strflag[3] is a string
80  *
81  *     if strflag[0] == '1' then legends are added
82  *        legend = "leg1@leg2@....@legn"; gives the legend for each curve
83  *      else no legend
84  *
85  *     if strflag[1] == '1' then  the values of brect are used to fix
86  *        the drawing boundaries :  brect[]= <xmin,ymin,xmax,ymax>;
87  *      if strflag[1] == '2' then the values  are computed from data
88  *      else if strflag[1]=='0' the previous values
89  *                (previous call or defaut values) are used
90  *
91  *     if  strflag[2] == '1' ->then an axis is added
92  *        the number of intervals
93  *        is specified by the vector aaint[4] of integers
94  *         <aaint[0],aaint[1]> specifies the x-axis number of  points
95  *         <aaint[2],aaint[3]> same for y-axis
96  *     if  strflag[2] == '2' -> no axis, only a box around the curves
97  *     else no box and no axis
98
99  * lstr* : unused (but used by Fortran)
100  *--------------------------------------------------------------------------*/
101
102 int plot2dn(int ptype, char *logflags, double *x, double *y, int *n1, int *n2, int *style, char *strflag, char *legend, double *brect, int *aaint,
103             BOOL flagNax, int lstr1, int lstr2)
104 {
105     int iSubwinUID = 0;
106     int iCurFigureUID = 0;
107     int closeflag = 0;
108     int jj = 0;
109     long hdl = 0;
110     int *pObj = NULL;
111     int cmpt = 0;
112     int with_leg = 0;
113     double drect[6] = {0};
114     char dataflag = 0;
115
116     BOOL bounds_changed = FALSE;
117     BOOL axes_properties_changed = FALSE;
118
119     double rotationAngles[2];
120     int clipState = 0;
121     int autoScale = 0;
122     int logFlags[3];
123     int iTmp = 0;
124     int *piTmp = &iTmp;
125     char textLogFlags[3];
126     int firstPlot = 0;
127     int newFirstPlot = 0;
128     int autoSubticks = 0;
129
130     iSubwinUID = getOrCreateDefaultSubwin();
131
132     /*
133      * Check if the auto_clear property is on and then erase everything
134      * To be implemented
135      */
136     checkRedrawing();
137
138     rotationAngles[0] = 0.0;
139     rotationAngles[1] = 270.0;
140
141     setGraphicObjectProperty(iSubwinUID, __GO_ROTATION_ANGLES__, rotationAngles, jni_double_vector, 2);
142
143     /* Force logflags to those given by argument */
144
145     getGraphicObjectProperty(iSubwinUID, __GO_FIRST_PLOT__, jni_bool, (void **)&piTmp);
146     firstPlot = iTmp;
147
148     /* Reset x and y logflags */
149     if (firstPlot)
150     {
151         logFlags[0] = getBooleanLogFlag(logflags[1]);
152         logFlags[1] = getBooleanLogFlag(logflags[2]);
153
154         setGraphicObjectProperty(iSubwinUID, __GO_X_AXIS_LOG_FLAG__, &logFlags[0], jni_bool, 1);
155         setGraphicObjectProperty(iSubwinUID, __GO_Y_AXIS_LOG_FLAG__, &logFlags[1], jni_bool, 1);
156     }
157
158     /* Forces "clipgrf" clipping (1) */
159     clipState = 1;
160     setGraphicObjectProperty(iSubwinUID, __GO_CLIP_STATE__, &clipState, jni_int, 1);
161
162     getGraphicObjectProperty(iSubwinUID, __GO_AUTO_SCALE__, jni_bool, (void **)&piTmp);
163     autoScale = iTmp;
164
165     if (autoScale)
166     {
167         /* compute and merge new specified bounds with the data bounds */
168         switch (strflag[1])
169         {
170             case '0':
171                 /* do not change data bounds */
172                 break;
173             case '1':
174             case '3':
175             case '5':
176             case '7':
177                 /* Force data bounds=brect */
178                 re_index_brect(brect, drect);
179                 break;
180             case '2':
181             case '4':
182             case '6':
183             case '8':
184             case '9':
185                 /* Force data bounds to the x and y bounds */
186                 if ((int)strlen(logflags) < 1)
187                 {
188                     dataflag = 'g';
189                 }
190                 else
191                 {
192                     dataflag = logflags[0];
193                 }
194
195                 getGraphicObjectProperty(iSubwinUID, __GO_X_AXIS_LOG_FLAG__, jni_bool, (void **)&piTmp);
196                 logFlags[0] = iTmp;
197                 getGraphicObjectProperty(iSubwinUID, __GO_Y_AXIS_LOG_FLAG__, jni_bool, (void **)&piTmp);
198                 logFlags[1] = iTmp;
199                 getGraphicObjectProperty(iSubwinUID, __GO_Z_AXIS_LOG_FLAG__, jni_bool, (void **)&piTmp);
200                 logFlags[2] = iTmp;
201
202                 /* Conversion required by compute_data_bounds2 */
203                 textLogFlags[0] = getTextLogFlag(logFlags[0]);
204                 textLogFlags[1] = getTextLogFlag(logFlags[1]);
205                 textLogFlags[2] = getTextLogFlag(logFlags[2]);
206
207                 compute_data_bounds2(0, dataflag, textLogFlags, x, y, *n1, *n2, drect);
208
209                 break;
210         }
211
212         /* merge data bounds and drect */
213         if (!firstPlot && (strflag[1] == '5' || strflag[1] == '7' || strflag[1] == '8' || strflag[1] == '9'))
214         {
215             double *dataBounds;
216
217             getGraphicObjectProperty(iSubwinUID, __GO_DATA_BOUNDS__, jni_double_vector, (void **)&dataBounds);
218
219             drect[0] = Min(dataBounds[0], drect[0]);    /*xmin */
220             drect[2] = Min(dataBounds[2], drect[2]);    /*ymin */
221             drect[1] = Max(dataBounds[1], drect[1]);    /*xmax */
222             drect[3] = Max(dataBounds[3], drect[3]);    /*ymax */
223         }
224
225         if (strflag[1] != '0')
226         {
227             bounds_changed = update_specification_bounds(iSubwinUID, drect, 2);
228         }
229     }
230
231     if (firstPlot)
232     {
233         bounds_changed = TRUE;
234     }
235
236     /* Adapted to the MVC */
237     axes_properties_changed = strflag2axes_properties(iSubwinUID, strflag);
238
239     /* just after strflag2axes_properties */
240     newFirstPlot = 0;
241     setGraphicObjectProperty(iSubwinUID, __GO_FIRST_PLOT__, &newFirstPlot, jni_bool, 1);
242
243     with_leg = (strflag[0] == '1');
244
245     /* F.Leray 07.10.04 : trigger algo to init. manual graduation u_xgrads and
246      * u_ygrads if nax (in matdes.c which is == aaint HERE) was specified */
247
248     /* The MVC AUTO_SUBTICKS property corresponds to !flagNax */
249     autoSubticks = !flagNax;
250     setGraphicObjectProperty(iSubwinUID, __GO_AUTO_SUBTICKS__, &autoSubticks, jni_bool, 1);
251
252     if (flagNax == TRUE)
253     {
254         getGraphicObjectProperty(iSubwinUID, __GO_X_AXIS_LOG_FLAG__, jni_bool, (void **)&piTmp);
255         logFlags[0] = iTmp;
256         getGraphicObjectProperty(iSubwinUID, __GO_Y_AXIS_LOG_FLAG__, jni_bool, (void **)&piTmp);
257         logFlags[1] = iTmp;
258
259         if (logFlags[0] == 0 && logFlags[1] == 0)
260         {
261             int autoTicks = 0;
262             int i = 0;
263             int iSize = 0;
264             double dblFabs = 0;
265             char** stringVector = NULL;
266
267             if (aaint[1] == -1)
268             {
269                 autoTicks = 1;
270                 setGraphicObjectProperty(iSubwinUID, __GO_X_AXIS_AUTO_TICKS__, &autoTicks, jni_bool, 1);
271             }
272             else if (aaint[1] == 0)
273             {
274                 setGraphicObjectProperty(iSubwinUID, __GO_X_AXIS_TICKS_LOCATIONS__, NULL, jni_double_vector, 0);
275                 autoTicks = 0;
276                 setGraphicObjectProperty(iSubwinUID, __GO_X_AXIS_AUTO_TICKS__, &autoTicks, jni_bool, 1);
277             }
278             else
279             {
280                 double* dXGrads = (double*) MALLOC(aaint[1] * sizeof(double));
281
282                 // Compute X grads
283                 dXGrads[0] = drect[0];
284                 if (aaint[1] > 1)
285                 {
286                     double pas = (drect[1] - drect[0]) / (aaint[1] - 1);
287                     for (i = 0; i < aaint[1]; i++)
288                     {
289                         dXGrads[i] = drect[0] + pas * i;
290                     }
291                 }
292
293                 autoTicks = 0;
294                 setGraphicObjectProperty(iSubwinUID, __GO_X_AXIS_AUTO_TICKS__, &autoTicks, jni_bool, 1);
295                 setGraphicObjectProperty(iSubwinUID, __GO_X_AXIS_TICKS_LOCATIONS__, dXGrads, jni_double_vector, aaint[1]);
296                 // Create X Labels
297                 stringVector = (char **) MALLOC(aaint[1] * sizeof(char*));
298                 for (i = 0; i < aaint[1]; i++)
299                 {
300                     iSize = 6;
301                     if (dXGrads[i] < 0)
302                     {
303                         iSize += 2;
304                     }
305                     dblFabs = fabs(dXGrads[i]);
306                     if (dblFabs >= 10)
307                     {
308                         iSize = iSize + (int)floor(log10(dblFabs));
309                     }
310
311                     stringVector[i] = (char*) MALLOC(iSize * sizeof(char));
312                     sprintf(stringVector[i], "%.3f", dXGrads[i]);
313                     stringVector[i][iSize - 1] = '\0';
314                 }
315
316                 setGraphicObjectProperty(iSubwinUID, __GO_X_AXIS_TICKS_LABELS__, stringVector, jni_string_vector, aaint[1]);
317
318                 for (i = 0; i < aaint[1]; i++)
319                 {
320                     FREE(stringVector[i]);
321                 }
322
323                 FREE(stringVector);
324                 FREE(dXGrads);
325                 stringVector = NULL;
326             }
327
328             if (aaint[3] == -1)
329             {
330                 autoTicks = 1;
331                 setGraphicObjectProperty(iSubwinUID, __GO_Y_AXIS_AUTO_TICKS__, &autoTicks, jni_bool, 1);
332             }
333             else if (aaint[3] == 0)
334             {
335                 setGraphicObjectProperty(iSubwinUID, __GO_Y_AXIS_TICKS_LOCATIONS__, NULL, jni_double_vector, 0);
336                 autoTicks = 0;
337                 setGraphicObjectProperty(iSubwinUID, __GO_Y_AXIS_AUTO_TICKS__, &autoTicks, jni_bool, 1);
338             }
339             else
340             {
341                 double* dYGrads = (double*) MALLOC(aaint[3] * sizeof(double));
342
343                 // Compute Y grads
344                 dYGrads[0] = drect[2];
345                 if (aaint[3] > 1)
346                 {
347                     double pas = (drect[3] - drect[2]) / (aaint[3] - 1);
348                     for (i = 0; i < aaint[3]; i++)
349                     {
350                         dYGrads[i] = drect[2] + pas * i;
351                     }
352                 }
353
354                 autoTicks = 0;
355                 setGraphicObjectProperty(iSubwinUID, __GO_Y_AXIS_AUTO_TICKS__, &autoTicks, jni_bool, 1);
356                 setGraphicObjectProperty(iSubwinUID, __GO_Y_AXIS_TICKS_LOCATIONS__, dYGrads, jni_double_vector, aaint[3]);
357
358                 // Create Y Labels
359                 stringVector = (char**) MALLOC(aaint[3] * sizeof(char*));
360                 for (i = 0; i < aaint[3]; i++)
361                 {
362                     iSize = 6;
363                     if (dYGrads[i] < 0)
364                     {
365                         iSize += 2;
366                     }
367                     dblFabs = fabs(dYGrads[i]);
368                     if (dblFabs >= 10)
369                     {
370                         iSize = iSize + (int)floor(log10(dblFabs));
371                     }
372                     stringVector[i] = (char*) MALLOC(iSize * sizeof(char));
373                     sprintf(stringVector[i], "%.3f", dYGrads[i]);
374                     stringVector[i][iSize - 1] = '\0';
375                 }
376
377                 setGraphicObjectProperty(iSubwinUID, __GO_Y_AXIS_TICKS_LABELS__, stringVector, jni_string_vector, aaint[3]);
378
379                 for (i = 0; i < aaint[3]; i++)
380                 {
381                     FREE(stringVector[i]);
382                 }
383
384                 FREE(stringVector);
385                 FREE(dYGrads);
386                 stringVector = NULL;
387             }
388
389             // X and Y subticks
390             setGraphicObjectProperty(iSubwinUID, __GO_X_AXIS_SUBTICKS__, aaint, jni_int, 1);
391             setGraphicObjectProperty(iSubwinUID, __GO_Y_AXIS_SUBTICKS__, &aaint[2], jni_int, 1);
392         }
393         else
394         {
395             Sciwarning(_("Warning: Nax does not work with logarithmic scaling.\n"));
396         }
397
398     }
399
400     /*---- Drawing the curves and the legends ----*/
401     if (*n1 != 0)
402     {
403         if ((pObj = (int*)MALLOC((*n1 + 1) * sizeof(int))) == NULL)
404         {
405             Scierror(999, _("%s: No more memory.\n"), "plot2d");
406             return -1;
407         }
408
409         /*A.Djalel 3D axes */
410         for (jj = 0; jj < *n1; jj++)
411         {
412             int iObjUID = 0;
413
414             if (style[jj] > 0)
415             {
416                 BOOL isline = TRUE;
417
418                 if (ptype == 3)
419                 {
420                     isline = FALSE;
421                 }
422                 iObjUID = ConstructPolyline(getCurrentSubWin(), &(x[jj * (*n2)]),
423                                             &(y[jj * (*n2)]), PD0, closeflag, *n2, ptype,
424                                             &style[jj], NULL, NULL, NULL, NULL, isline, FALSE, FALSE, FALSE);
425             }
426             else
427             {
428                 int minusstyle = -style[jj];
429
430                 iObjUID = ConstructPolyline(getCurrentSubWin(), &(x[jj * (*n2)]),
431                                             &(y[jj * (*n2)]), PD0, closeflag, *n2, ptype,
432                                             NULL, NULL, &minusstyle, NULL, NULL, FALSE, FALSE, TRUE, FALSE);
433             }
434             if (iObjUID == 0)
435             {
436                 // skip
437                 Scierror(999, _("%s: No more memory.\n"), "plot2d");
438             }
439             else
440             {
441                 setCurrentObject(iObjUID);
442
443                 pObj[cmpt] = iObjUID;
444                 cmpt++;
445             }
446
447         }
448
449         /*---- Drawing the Legends ----*/
450         if (with_leg)
451         {
452             int iLegUID = 0;
453             char **Str;
454             int nleg;
455
456             if (scitokenize(legend, &Str, &nleg))
457             {
458                 FREE(pObj);
459                 Scierror(999, _("%s: No more memory.\n"), "plot2d");
460                 return 0;
461             }
462
463             iLegUID = ConstructLegend(getCurrentSubWin(), Str, pObj, Min(nleg, cmpt));
464
465             if (iLegUID != 0)
466             {
467                 int legendLocation;
468                 int contourMode;
469
470                 /* 9: LOWER_CAPTION */
471                 legendLocation = 9;
472                 setGraphicObjectProperty(iLegUID, __GO_LEGEND_LOCATION__, &legendLocation, jni_int, 1);
473
474                 contourMode = 0;
475
476                 setGraphicObjectProperty(iLegUID, __GO_FILL_MODE__, &contourMode, jni_bool, 1);
477                 setGraphicObjectProperty(iLegUID, __GO_LINE_MODE__, &contourMode, jni_bool, 1);
478             }
479
480             freeArrayOfString(Str, nleg);
481         }
482
483         /*---- construct Compound ----*/
484         if (cmpt > 0)
485         {
486             int parentVisible = 0;
487             int *piParentVisible = &parentVisible;
488             int iCompoundUID = createCompound(iSubwinUID, pObj, cmpt);
489             setCurrentObject(iCompoundUID);
490         }
491         FREE(pObj);
492
493     }
494     /* End of the curves and legend block */
495
496     return 0;
497 }
498
499 /* Given two set of coordinates x and y this routine computes the corresponding
500  *  data bounds rectangle drect=[xmin,ymin,xmax,ymax] taking into account the logflag
501  *  -> means we have to find among the data the min > 0.
502  */
503 void compute_data_bounds2(int cflag, char dataflag, char *logflags, double *x, double *y, int n1, int n2, double *drect)
504 {
505     int size_x = 0, size_y = 0;
506     double xd[2];
507     double *x1 = NULL;
508
509     switch (dataflag)
510     {
511         case 'e':
512             xd[0] = 1.0;
513             xd[1] = (double)n2;
514             x1 = xd;
515             size_x = (n2 != 0) ? 2 : 0;
516             break;
517         case 'o':
518             x1 = x;
519             size_x = n2;
520             break;
521         case 'g':
522         default:
523             x1 = x;
524             size_x = (cflag == 1) ? n1 : (n1 * n2);
525             break;
526     }
527
528     if (size_x != 0)
529     {
530         if (logflags[0] != 'l')
531         {
532             MiniMaxi(x1, size_x, drect, drect + 1);
533             //drect[0] = Mini(x1, size_x);
534             //drect[1] = Maxi(x1, size_x);
535         }
536         else
537         {
538             /* log. case */
539             drect[0] = sciFindStPosMin(x1, size_x);
540             drect[1] = Maxi(x1, size_x);
541         }
542
543     }
544     else
545     {
546         if (logflags[0] != 'l')
547         {
548             drect[0] = 0.0;
549             drect[1] = 10.0;
550         }
551         else
552         {
553             /* log. case */
554             drect[0] = 1.0;
555             drect[1] = 10.0;
556         }
557     }
558
559     size_y = (cflag == 1) ? n2 : (n1 * n2);
560     if (size_y != 0)
561     {
562         if (logflags[1] != 'l')
563         {
564             MiniMaxi(y, size_y, drect + 2, drect + 3);
565             //drect[2] = Mini(y, size_y);
566             //drect[3] = Maxi(y, size_y);
567         }
568         else
569         {
570             /* log. case */
571             drect[2] = sciFindStPosMin(y, size_y);
572             drect[3] = Maxi(y, size_y);
573         }
574     }
575     else
576     {
577         if (logflags[1] != 'l')
578         {
579             drect[2] = 0.0;
580             drect[3] = 10.0;
581         }
582         else
583         {
584             /* log. case */
585             drect[2] = 1.0;
586             drect[3] = 10.0;
587         }
588     }
589
590     /* back to default values for  x=[] and y = [] */
591     if (drect[2] == LARGEST_REAL || drect[3] == -LARGEST_REAL || C2F(isanan)(&drect[2]) || C2F(isanan)(&drect[3]))
592     {
593         if (logflags[1] != 'l')
594         {
595             drect[2] = 0.0;
596         }
597         else
598         {
599             drect[2] = 1.0;
600         }
601
602         drect[3] = 10.0;
603     }
604
605     if (drect[0] == LARGEST_REAL || drect[1] == -LARGEST_REAL || C2F(isanan)(&drect[0]) || C2F(isanan)(&drect[1]))
606     {
607         if (logflags[0] != 'l')
608         {
609             drect[0] = 0.0;
610         }
611         else
612         {
613             drect[0] = 1.0;
614         }
615
616         drect[1] = 10.0;
617     }
618 }
619
620 BOOL update_specification_bounds(int iSubwinUID, double rect[6], int flag)
621 {
622     double *dataBounds = NULL;
623
624     /*
625      * 2D: keep the existing zmin and zmax
626      * which is why they must be fetched
627      */
628     if (flag != 3)
629     {
630         getGraphicObjectProperty(iSubwinUID, __GO_DATA_BOUNDS__, jni_double_vector, (void **)&dataBounds);
631
632         if (dataBounds)
633         {
634             rect[4] = dataBounds[4];
635             rect[5] = dataBounds[5];
636             releaseGraphicObjectProperty(__GO_DATA_BOUNDS__, dataBounds, jni_double_vector, 6);
637         }
638         else
639         {
640             return FALSE;
641         }
642     }
643
644     setGraphicObjectProperty(iSubwinUID, __GO_DATA_BOUNDS__, rect, jni_double_vector, 6);
645
646     return TRUE;
647 }
648
649 /* F.Leray */
650 /* brect must have the same format as drect i.e.: [xmin,xmax,ymin,ymax] */
651 /* brect = INPUT ; drect = OUTPUT (warning drect is dim 6) */
652 int re_index_brect(double *brect, double *drect)
653 {
654     drect[0] = brect[0];
655     drect[1] = brect[2];
656     drect[2] = brect[1];
657     drect[3] = brect[3];
658
659     return 0;
660 }
661
662 /* F.Leray 07.05.04 */
663 /* Dispatch info contained in strflag to all the flag available in
664    sciSubwin object (tight_limits, isoview, isaxes...) */
665 /*
666  * This function has been adapted to the MVC framework
667  */
668 BOOL strflag2axes_properties(int iSubwinUID, char *strflag)
669 {
670     BOOL haschanged = FALSE;
671     BOOL xTightLimitsPrev = FALSE, yTightLimitsPrev = FALSE, zTightLimitsPrev = FALSE;
672     BOOL isoviewPrev = FALSE;
673     int boxPrev = 0;
674     int tightLimits = 0, xTightLimits = 0, yTightLimits = 0, zTightLimits = 0;
675     int firstPlot = 0;
676     int axisVisible = 0;
677     int boxType = 0;
678     int xLocationPrev = 0;
679     int yLocationPrev = 0;
680     int xLocation = 0;
681     int yLocation = 0;
682     int isoview = 0;
683     int axesVisiblePrev[3];
684     int axesVisible[3];
685
686     int iTmp = 0;
687     int *piTmp = &iTmp;
688
689     getGraphicObjectProperty(iSubwinUID, __GO_X_AXIS_VISIBLE__, jni_bool, (void **)&piTmp);
690     axesVisiblePrev[0] = iTmp;
691     getGraphicObjectProperty(iSubwinUID, __GO_Y_AXIS_VISIBLE__, jni_bool, (void **)&piTmp);
692     axesVisiblePrev[1] = iTmp;
693     getGraphicObjectProperty(iSubwinUID, __GO_Z_AXIS_VISIBLE__, jni_bool, (void **)&piTmp);
694     axesVisiblePrev[2] = iTmp;
695
696     getGraphicObjectProperty(iSubwinUID, __GO_BOX_TYPE__, jni_int, (void**)&piTmp);
697     boxPrev = iTmp;
698
699     getGraphicObjectProperty(iSubwinUID, __GO_X_AXIS_LOCATION__, jni_int, (void**)&piTmp);
700     xLocationPrev = iTmp;
701     getGraphicObjectProperty(iSubwinUID, __GO_Y_AXIS_LOCATION__, jni_int, (void**)&piTmp);
702     yLocationPrev = iTmp;
703
704     getGraphicObjectProperty(iSubwinUID, __GO_X_TIGHT_LIMITS__, jni_bool, (void **)&piTmp);
705     xTightLimitsPrev = iTmp;
706     getGraphicObjectProperty(iSubwinUID, __GO_Y_TIGHT_LIMITS__, jni_bool, (void **)&piTmp);
707     yTightLimitsPrev = iTmp;
708     getGraphicObjectProperty(iSubwinUID, __GO_Z_TIGHT_LIMITS__, jni_bool, (void **)&piTmp);
709     zTightLimitsPrev = iTmp;
710
711     getGraphicObjectProperty(iSubwinUID, __GO_ISOVIEW__, jni_bool, (void **)&piTmp);
712     isoviewPrev = iTmp;
713
714     /* F.Leray 07.05.04 */
715     /* strflag[1] Isoview & tight_limits flags management */
716     switch (strflag[1])
717     {
718         case '0':
719         case '9':
720             /* no changes */
721             break;
722         case '1':
723         case '2':
724         case '7':
725         case '8':
726             tightLimits = 1;
727             setGraphicObjectProperty(iSubwinUID, __GO_X_TIGHT_LIMITS__, &tightLimits, jni_bool, 1);
728             setGraphicObjectProperty(iSubwinUID, __GO_Y_TIGHT_LIMITS__, &tightLimits, jni_bool, 1);
729             setGraphicObjectProperty(iSubwinUID, __GO_Z_TIGHT_LIMITS__, &tightLimits, jni_bool, 1);
730             break;
731         case '3':
732         case '4':
733             isoview = 1;
734             setGraphicObjectProperty(iSubwinUID, __GO_ISOVIEW__, &isoview, jni_bool, 1);
735             break;
736         case '5':
737         case '6':
738             /* pretty axes */
739             tightLimits = 0;
740             setGraphicObjectProperty(iSubwinUID, __GO_X_TIGHT_LIMITS__, &tightLimits, jni_bool, 1);
741             setGraphicObjectProperty(iSubwinUID, __GO_Y_TIGHT_LIMITS__, &tightLimits, jni_bool, 1);
742             setGraphicObjectProperty(iSubwinUID, __GO_Z_TIGHT_LIMITS__, &tightLimits, jni_bool, 1);
743             break;
744     }
745
746     /* F.Leray 07.05.04 */
747     /* strflag[2] */
748     switch (strflag[2])
749     {
750
751         case '0':
752             getGraphicObjectProperty(iSubwinUID, __GO_FIRST_PLOT__, jni_bool, (void **)&piTmp);
753             firstPlot = iTmp;
754
755             if (firstPlot)
756             {
757                 axisVisible = 0;
758                 /* 0: OFF */
759                 boxType = 0;
760
761                 setGraphicObjectProperty(iSubwinUID, __GO_X_AXIS_VISIBLE__, &axisVisible, jni_bool, 1);
762                 setGraphicObjectProperty(iSubwinUID, __GO_Y_AXIS_VISIBLE__, &axisVisible, jni_bool, 1);
763                 /* also trigger z axis */
764                 setGraphicObjectProperty(iSubwinUID, __GO_Z_AXIS_VISIBLE__, &axisVisible, jni_bool, 1);
765                 setGraphicObjectProperty(iSubwinUID, __GO_BOX_TYPE__, &boxType, jni_int, 1);
766             }
767             /*else no changes : the isaxes properties is driven by the previous plot */
768             break;
769         case '1':
770             axisVisible = 1;
771             /* 1: ON */
772             boxType = 1;
773             /* 4: LEFT */
774             yLocation = 4;
775
776             setGraphicObjectProperty(iSubwinUID, __GO_X_AXIS_VISIBLE__, &axisVisible, jni_bool, 1);
777             setGraphicObjectProperty(iSubwinUID, __GO_Y_AXIS_VISIBLE__, &axisVisible, jni_bool, 1);
778             setGraphicObjectProperty(iSubwinUID, __GO_Z_AXIS_VISIBLE__, &axisVisible, jni_bool, 1);
779             setGraphicObjectProperty(iSubwinUID, __GO_Y_AXIS_LOCATION__, &yLocation, jni_int, 1);
780             setGraphicObjectProperty(iSubwinUID, __GO_BOX_TYPE__, &boxType, jni_int, 1);
781
782             break;
783         case '2':
784             axisVisible = 0;
785             boxType = 1;
786
787             setGraphicObjectProperty(iSubwinUID, __GO_X_AXIS_VISIBLE__, &axisVisible, jni_bool, 1);
788             setGraphicObjectProperty(iSubwinUID, __GO_Y_AXIS_VISIBLE__, &axisVisible, jni_bool, 1);
789             /* also trigger z axis */
790             setGraphicObjectProperty(iSubwinUID, __GO_Z_AXIS_VISIBLE__, &axisVisible, jni_bool, 1);
791             setGraphicObjectProperty(iSubwinUID, __GO_BOX_TYPE__, &boxType, jni_int, 1);
792
793             break;
794         case '3':
795             axisVisible = 1;
796             boxType = 0;
797             /* 5: RIGHT */
798             yLocation = 5;
799
800             setGraphicObjectProperty(iSubwinUID, __GO_X_AXIS_VISIBLE__, &axisVisible, jni_bool, 1);
801             setGraphicObjectProperty(iSubwinUID, __GO_Y_AXIS_VISIBLE__, &axisVisible, jni_bool, 1);
802             setGraphicObjectProperty(iSubwinUID, __GO_Z_AXIS_VISIBLE__, &axisVisible, jni_bool, 1);
803             setGraphicObjectProperty(iSubwinUID, __GO_Y_AXIS_LOCATION__, &yLocation, jni_int, 1);
804             setGraphicObjectProperty(iSubwinUID, __GO_BOX_TYPE__, &boxType, jni_int, 1);
805
806             break;
807         case '4':
808             axisVisible = 1;
809             /* 2: MIDDLE */
810             xLocation = 2;
811             yLocation = 2;
812             boxType = 0;
813
814             setGraphicObjectProperty(iSubwinUID, __GO_X_AXIS_VISIBLE__, &axisVisible, jni_bool, 1);
815             setGraphicObjectProperty(iSubwinUID, __GO_Y_AXIS_VISIBLE__, &axisVisible, jni_bool, 1);
816             /* also trigger z axis */
817             setGraphicObjectProperty(iSubwinUID, __GO_Z_AXIS_VISIBLE__, &axisVisible, jni_bool, 1);
818             setGraphicObjectProperty(iSubwinUID, __GO_X_AXIS_LOCATION__, &xLocation, jni_int, 1);
819             setGraphicObjectProperty(iSubwinUID, __GO_Y_AXIS_LOCATION__, &yLocation, jni_int, 1);
820             setGraphicObjectProperty(iSubwinUID, __GO_BOX_TYPE__, &boxType, jni_int, 1);
821
822             break;
823         case '5':
824             axisVisible = 1;
825             xLocation = 2;
826             yLocation = 2;
827             boxType = 1;
828
829             setGraphicObjectProperty(iSubwinUID, __GO_X_AXIS_VISIBLE__, &axisVisible, jni_bool, 1);
830             setGraphicObjectProperty(iSubwinUID, __GO_Y_AXIS_VISIBLE__, &axisVisible, jni_bool, 1);
831             /* also trigger z axis */
832             setGraphicObjectProperty(iSubwinUID, __GO_Z_AXIS_VISIBLE__, &axisVisible, jni_bool, 1);
833             setGraphicObjectProperty(iSubwinUID, __GO_X_AXIS_LOCATION__, &xLocation, jni_int, 1);
834             setGraphicObjectProperty(iSubwinUID, __GO_Y_AXIS_LOCATION__, &yLocation, jni_int, 1);
835             setGraphicObjectProperty(iSubwinUID, __GO_BOX_TYPE__, &boxType, jni_int, 1);
836
837             break;
838         case '9':
839             axisVisible = 1;
840
841             setGraphicObjectProperty(iSubwinUID, __GO_X_AXIS_VISIBLE__, &axisVisible, jni_bool, 1);
842             setGraphicObjectProperty(iSubwinUID, __GO_Y_AXIS_VISIBLE__, &axisVisible, jni_bool, 1);
843             /* also trigger z axis */
844             setGraphicObjectProperty(iSubwinUID, __GO_Z_AXIS_VISIBLE__, &axisVisible, jni_bool, 1);
845     }
846
847     getGraphicObjectProperty(iSubwinUID, __GO_X_AXIS_VISIBLE__, jni_bool, (void **)&piTmp);
848     axesVisible[0] = iTmp;
849     getGraphicObjectProperty(iSubwinUID, __GO_Y_AXIS_VISIBLE__, jni_bool, (void **)&piTmp);
850     axesVisible[1] = iTmp;
851     getGraphicObjectProperty(iSubwinUID, __GO_Z_AXIS_VISIBLE__, jni_bool, (void **)&piTmp);
852     axesVisible[2] = iTmp;
853
854     getGraphicObjectProperty(iSubwinUID, __GO_BOX_TYPE__, jni_int, (void**)&piTmp);
855     boxType = iTmp;
856
857     getGraphicObjectProperty(iSubwinUID, __GO_X_AXIS_LOCATION__, jni_int, (void**)&piTmp);
858     xLocation = iTmp;
859     getGraphicObjectProperty(iSubwinUID, __GO_Y_AXIS_LOCATION__, jni_int, (void**)&piTmp);
860     yLocation = iTmp;
861
862     getGraphicObjectProperty(iSubwinUID, __GO_X_TIGHT_LIMITS__, jni_bool, (void **)&piTmp);
863     xTightLimits = iTmp;
864     getGraphicObjectProperty(iSubwinUID, __GO_Y_TIGHT_LIMITS__, jni_bool, (void **)&piTmp);
865     yTightLimits = iTmp;
866     getGraphicObjectProperty(iSubwinUID, __GO_Z_TIGHT_LIMITS__, jni_bool, (void **)&piTmp);
867     zTightLimits = iTmp;
868
869     getGraphicObjectProperty(iSubwinUID, __GO_ISOVIEW__, jni_bool, (void **)&piTmp);
870     isoview = iTmp;
871
872     /* Find if something has changed */
873     if (axesVisible[0] != axesVisiblePrev[0]
874             || axesVisible[1] != axesVisiblePrev[1]
875             || axesVisible[2] != axesVisiblePrev[2]
876             || xLocation != xLocationPrev || yLocation != yLocationPrev || boxType != boxPrev
877             || xTightLimits != xTightLimitsPrev || yTightLimits != yTightLimitsPrev || zTightLimits != zTightLimitsPrev
878             || isoview != isoviewPrev)
879     {
880         haschanged = TRUE;
881     }
882     else
883     {
884         haschanged = FALSE;
885     }
886
887     return haschanged;
888 }