9fbf77b6b1ce6dc0946de6325cf81c6e7241b6ab
[scilab.git] / scilab / modules / graphics / sci_gateway / c / sci_xset.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2006 - INRIA - Fabrice Leray
4  * Copyright (C) 2006 - INRIA - Jean-Baptiste Silvy
5  * 
6  * This file must be used under the terms of the CeCILL.
7  * This source file is licensed as described in the file COPYING, which
8  * you should have received as part of this distribution.  The terms
9  * are also available at    
10  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
11  *
12  */
13
14 /*------------------------------------------------------------------------*/
15 /* file: sci_xset.c                                                       */
16 /* desc : interface for xset routine                                      */
17 /*------------------------------------------------------------------------*/
18
19 #include <string.h>
20
21 #include "sci_xset.h"
22 #include "stack-c.h"
23 #include "GetProperty.h"
24 #include "SetProperty.h"
25 #include "ObjectStructure.h"
26 #include "sci_demo.h"
27 #include "BuildObjects.h"
28 #include "gw_graphics.h"
29 #include "DrawObjects.h"
30 #include "InitObjects.h"
31 #include "XsetXgetParameters.h"
32 #include "CurrentObjectsManagement.h"
33 #include "sciprint.h"
34 #include "Format.h"
35 #include "ObjectSelection.h"
36 #include "msgs.h"
37 #include "localization.h"
38 #include "Scierror.h"
39 #include "DrawingBridge.h"
40 /*--------------------------------------------------------------------------*/
41 int C2F(xsetg)(char * str,char * str1,int lx0,int lx1) ;
42 /*--------------------------------------------------------------------------*/
43 int sci_xset( char *fname, unsigned long fname_len )
44 {
45   int m1,n1,l1,m2,n2,l2, xm[5],xn[5],x[5], i, v;
46   int lr;
47   double  xx[5];
48   sciPointObj *subwin = NULL; 
49   BOOL keyFound = FALSE ;
50
51   if (Rhs <= 0) {int zero=0; sci_demo(fname,"xsetm();",&zero); return 0; }
52
53   CheckRhs(1,6);
54   CheckLhs(0,1);
55
56   GetRhsVar(1,STRING_DATATYPE,&m1,&n1,&l1);
57
58   for ( i = 0 ; i < NUMSETFONC ; i++ )
59   {
60     if ( strcmp(cstk(l1),KeyTab_[i]) == 0 )
61     {
62       keyFound = TRUE ;
63       break ;
64     }
65   }
66
67   if ( !keyFound )
68   {
69     i = 105;v=m1*n1;
70     strncpy(C2F(cha1).buf,cstk(l1),v);
71     C2F(msgs)(&i,&v);
72     LhsVar(1)=0;
73     return 0;
74   }
75
76   /* Allan CORNET Avril 2004 */
77   /* Bloque la commande xset('window') sans numero de fenetre */
78   if (Rhs == 1 && (strcmp(cstk(l1),"window") == 0) )
79   {
80     sciprint(_("%s : '%s' must be set\n"),fname, "window-number");
81     LhsVar(1)=0; return 0;
82   }
83
84   if (Rhs == 2 && VarType(2) != sci_matrix) 
85   {
86     /* second argument is not a scalar it must be a string */ 
87     GetRhsVar(2,STRING_DATATYPE,&m2,&n2,&l2);
88     C2F(xsetg)(cstk(l1),cstk(l2),m1,m2);
89     LhsVar(1)=0; return 0;
90   }
91
92   if (Rhs == 1 && strcmp(cstk(l1),"default") == 0) 
93   {
94     /* first treatment for xsetg : then we continue */
95     C2F(xsetg)(cstk(l1),"void",m1,4L);
96   }
97
98   for ( i = 2 ; i <= Rhs ; i++ ) 
99   {
100     GetRhsVar(i,MATRIX_OF_DOUBLE_DATATYPE,&xm[i-2],&xn[i-2],&lr);
101     x[i - 2] = (int)  *stk(lr); xx[i - 2] = *stk(lr);
102   }
103   if (strcmp(cstk(l1),"wdim") == 0 || strcmp(cstk(l1),"wpdim") == 0) {
104     /* Xwindows limits dimensions to 2^16 */
105     if ( (x[0]>65535)||(x[1]>65535)) {
106       x[0]=Min(x[0],65535);
107       x[1]=Min(x[1],65535);
108       i = 106;v=0;
109       C2F(msgs)(&i,&v);
110     }
111   }
112
113   if (strcmp(cstk(l1),"clipping") == 0)
114   {
115     subwin = sciGetCurrentSubWin() ;
116     sciSetClipping(subwin,xx);
117     sciSetIsClipping(subwin, 1);
118     forceRedraw(subwin);
119   }
120   else if ( strcmp(cstk(l1),"colormap") == 0)
121   {
122     sciSetColormap (sciGetCurrentFigure(), stk(lr), *xm, *xn);
123     sciRedrawFigure();
124   }
125   else if ( strcmp(cstk(l1),"mark size") == 0)
126   {
127
128     subwin = sciGetCurrentSubWin() ;
129     sciSetMarkSizeUnit(subwin,2); /* force switch to tabulated mode : old syntax */
130     subwin = sciGetCurrentSubWin();
131     sciSetMarkSize(subwin,(int)xx[0]);
132     forceRedraw(subwin);
133   }
134   else if ( strcmp(cstk(l1),"mark") == 0)
135   {
136     subwin = sciGetCurrentSubWin();
137     sciSetMarkSizeUnit(subwin,2); /* force switch to tabulated mode : old syntax */
138     sciSetMarkStyle(subwin,(int) xx[0]);
139     sciSetMarkSize(subwin,(int) xx[1]);
140
141     // force mark drawing
142     sciSetIsMark(subwin, TRUE);
143     forceRedraw(subwin);
144   }
145   else if ( strcmp(cstk(l1),"font size") == 0) {
146     double defaultSubwinFontSize = sciGetFontSize(getAxesModel());
147     double fontSize = xx[0];
148     // set also the default subwin font size in order
149     // to have the right font size for labels if they are created
150     sciSetFontSize(getAxesModel(), fontSize);
151     subwin = sciGetCurrentSubWin();
152
153     // restore previous font size
154     sciSetFontSize(getAxesModel(), defaultSubwinFontSize);
155
156     sciSetFontSize(subwin, fontSize);
157     sciSetFontSize(sciGetParent(subwin), fontSize);
158     forceRedraw(subwin);
159   }
160   /* NG beg */
161   else if ( strcmp(cstk(l1),"old_style") == 0)
162   {
163     if (*stk(lr) == 1)
164     {
165       sciprint(_("%s: Old graphic mode is no longer available. Please refer to the set help page.\n"),"xset");
166     }
167     else
168     {
169       Scierror(999,"%s: Wrong value for input argument: %d or %d expected.\n",fname,0, 1);
170     }
171   }/* NG end */
172   else if( strcmp(cstk(l1),"default") == 0 )
173   {
174     sciPointObj * pfigure = sciGetCurrentFigure();
175     
176
177     /*special treatement for xset default and old_style off F.Leray 23.09.04 */
178     /* mimic clf(gcf(),'reset') behaviour here */
179     sciXbasc();
180
181                 ResetFigureToDefaultValues(pfigure);
182   }
183   else if( strcmp(cstk(l1),"clipgrf") == 0 ) {
184     /* special treatement for xset("cligrf") */
185     sciPointObj * psubwin = sciGetCurrentSubWin();
186     sciSetIsClipping(psubwin,0);
187     forceRedraw(psubwin);
188   }
189   else if( strcmp(cstk(l1),"clipoff") == 0 ) {
190     /* special treatement for xset("clipoff") */
191     sciPointObj * psubwin = sciGetCurrentSubWin();
192     sciSetIsClipping(psubwin,-1);
193     forceRedraw(psubwin);
194   }
195   else if( strcmp(cstk(l1),"hidden3d") == 0 ) {
196     /* special treatement for xset("hidden3d") */
197     sciPointObj * psubwin = sciGetCurrentSubWin();
198     pSUBWIN_FEATURE(psubwin)->hiddencolor = x[0];
199     forceRedraw(psubwin);
200   }
201   else if ( strcmp(cstk(l1),"font") == 0) {
202     int defaultSubwinFontStyle = sciGetFontStyle(getAxesModel());
203     double defaultSubwinFontSize = sciGetFontSize(getAxesModel());
204     int fontStyle = x[0];
205     double fontSize = x[1];
206
207     // set also the default subwin font size in order
208     // to have the right font size for labels if they are created
209     sciSetFontStyle(getAxesModel(), fontStyle);
210     sciSetFontSize(getAxesModel(), fontSize);
211     subwin = sciGetCurrentSubWin();
212
213     // restore previous font size
214     sciSetFontStyle(getAxesModel(), defaultSubwinFontStyle);
215     sciSetFontSize(getAxesModel(), defaultSubwinFontSize);
216
217     sciSetFontStyle(subwin, fontStyle); 
218     sciSetFontSize(subwin,  fontSize);  
219     sciSetFontStyle(sciGetParent(subwin), fontStyle); 
220     sciSetFontSize(sciGetParent(subwin), fontSize);
221     forceRedraw(subwin);
222   } 
223   else if ( strcmp(cstk(l1),"window") == 0 || strcmp(cstk(l1),"figure") == 0 )
224   {
225     if (sciSwitchWindow(x[0]) != 0){
226       Scierror(999,_("%s: Unable to create requested figure: No more memory.\n"), fname);
227     }
228   }
229   else
230   {
231     subwin = sciGetCurrentSubWin();
232     if (( strcmp(cstk(l1),"foreground") == 0) || (strcmp(cstk(l1),"color") == 0) ||( strcmp(cstk(l1),"pattern") == 0) ) {
233       sciSetForeground(subwin, x[0]); 
234       if (sciGetSons((sciPointObj *) subwin) == (sciSons *)NULL) {/* added SS 20.04.04 */
235         /* if subwin is empty, set also the ticscolor and fontforeground */
236         pSUBWIN_FEATURE (subwin)->axes.ticscolor= x[0];
237         sciSetFontForeground(subwin,x[0]); 
238       }
239       forceRedraw(subwin);
240     } 
241     else if ( strcmp(cstk(l1),"background") == 0) {
242       sciSetBackground(subwin, x[0]);
243       forceRedraw(subwin);
244     }  
245     else if ( strcmp(cstk(l1),"thickness") == 0) {
246       sciSetLineWidth(subwin, x[0]); 
247       sciSetLineWidth(sciGetParent(subwin), x[0]);
248       forceRedraw(subwin);
249     } 
250     else if ( strcmp(cstk(l1),"line style") == 0) {
251       sciSetLineStyle(subwin, x[0]); 
252       sciSetLineStyle(sciGetParent(subwin), x[0]);   
253       forceRedraw(subwin);
254     }  
255     else if ( strcmp(cstk(l1),"mark") == 0) {
256       sciSetIsMark(subwin,1);                  /* A REVOIR F.Leray 21.01.05 */
257       sciSetIsMark(sciGetParent(subwin),1);
258       sciSetMarkStyle(subwin,x[0]); 
259       sciSetMarkStyle(sciGetParent(subwin),x[0]);   
260       forceRedraw(subwin);
261     } 
262     else if ( strcmp(cstk(l1),"colormap") == 0) {
263       sciSetColormap(sciGetParent(subwin), stk(lr),xm[0], xn[0]);
264     }
265     else if ( strcmp(cstk(l1),"dashes") == 0) {
266       sciSetLineStyle(subwin, x[0]); 
267       sciSetLineStyle(sciGetParent(subwin), x[0]);
268       forceRedraw(subwin);
269     }
270     else if ( strcmp(cstk(l1),"alufunction") == 0) {
271       sciSetXorMode(subwin, x[0]); 
272       sciSetXorMode(sciGetParent(subwin), x[0]);
273     }
274     else if ( strcmp(cstk(l1),"auto clear") == 0) {
275       if ( x[0] == 1 )
276       {
277         sciSetAddPlot(subwin, TRUE); 
278         sciSetAddPlot(sciGetParent(subwin), TRUE);  
279       }
280       else  
281       {
282         sciSetAddPlot(subwin, FALSE); 
283         sciSetAddPlot(sciGetParent(subwin), FALSE);  
284       }
285       forceRedraw(subwin);
286     } 
287     else if ( strcmp(cstk(l1),"auto scale") == 0) {
288       if ( x[0] == 1 )
289       {
290         sciSetAutoScale(subwin, TRUE); 
291         sciSetAutoScale(sciGetParent(subwin), TRUE);  
292       }
293       else  
294       {
295         sciSetAutoScale(subwin, FALSE); 
296         sciSetAutoScale(sciGetParent(subwin), FALSE);  
297       }
298       forceRedraw(subwin);
299     }
300     else if ( strcmp(cstk(l1),"wresize") == 0) {
301       if ( x[0] == 1 )
302       {
303         sciSetResize(subwin, TRUE); 
304         sciSetResize(sciGetParent(subwin), TRUE);  
305       }
306       else  
307       {
308         sciSetResize(subwin, FALSE); 
309         sciSetResize(sciGetParent(subwin), FALSE);  
310       }
311       forceRedraw(subwin);
312     }
313     else if ( strcmp(cstk(l1),"wpos") == 0) {
314       sciSetScreenPosition(sciGetParent(subwin), x[0], x[1]);
315     }
316     else if ( strcmp(cstk(l1),"wpdim") == 0) {
317       sciSetWindowDim(sciGetParent(subwin), x[0], x[1] ) ;
318     } 
319     else if ( strcmp(cstk(l1),"wdim") == 0) {
320       sciSetDimension(sciGetParent(subwin), x[0], x[1] ) ;
321
322     } /*Ajout A.Djalel le 10/11/03 */
323     else if ( strcmp(cstk(l1),"pixmap") == 0) {
324       sciSetPixmapMode(sciGetParent(subwin), x[0]);
325     }
326     else if ( strcmp(cstk(l1),"wshow") == 0) { /* a supprimer ce n'est pas une propriete mais une action */
327       showPixmap(sciGetParentFigure(subwin));
328     }
329     else if (strcmp(cstk(l1),"viewport") == 0) {
330       int viewport[4] = {x[0], x[1], 0, 0};
331       sciSetViewport(sciGetParentFigure(subwin), viewport);
332     }
333     else if (strcmp(cstk(l1),"wwpc") == 0) {
334       // clear pixmap
335       clearPixmap(sciGetParentFigure(subwin));
336     }
337     else if(strcmp(cstk(l1),"line mode") == 0)
338     {
339       if (x[0] == 0)
340       {
341         sciSetIsLine(subwin, FALSE);
342       }
343       else
344       {
345         sciSetIsLine(subwin, TRUE);
346       }
347       forceRedraw(subwin);
348     }
349     else
350     {
351       sciprint(_("%s: Unrecognized input argument: '%s'.\n"), fname, cstk(l1));
352     }
353
354     if(strcmp(cstk(l1),"window") != 0 && strcmp(cstk(l1),"wshow") != 0)
355     {
356       // for wshow redraw already done
357       sciRedrawFigure();
358     }
359   }
360    
361   LhsVar(1)=0;
362   return 0;
363 }
364 /*--------------------------------------------------------------------------*/
365 int C2F(xsetg)(char * str,char * str1,int lx0,int lx1)
366 {
367   if ( strcmp(str,"fpf") == 0) 
368   {
369     strcpy(getFPF(),str1);
370   }
371   else if ( strcmp(str,"auto clear")==0) 
372   {
373     sciPointObj * subwin = sciGetFirstTypedSelectedSon(sciGetCurrentFigure(), SCI_SUBWIN);
374     if (strcmp(str1,"on")==0 )
375     {
376       sciSetAddPlot( subwin,FALSE);
377     }
378     else{
379       sciSetAddPlot( subwin,TRUE);
380     }
381     forceRedraw(subwin);
382   }
383   else if ( strcmp(str,"default")==0)
384   {
385     getFPF()[0]='\0';
386   }
387   else 
388   {
389     sciprint(_("%s: Unrecognized input argument '%s'.\n"),"xset(arg,<string>)",str);
390   }
391   return 0;
392 }
393 /*--------------------------------------------------------------------------*/