09ed141911ce4782edfc05035b4c215d161bfb91
[scilab.git] / scilab / modules / graphics / sci_gateway / c / sci_drawaxis.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  * Copyright (C) 2011 - DIGITEO - Manuel Juliachs
6  * 
7  * This file must be used under the terms of the CeCILL.
8  * This source file is licensed as described in the file COPYING, which
9  * you should have received as part of this distribution.  The terms
10  * are also available at    
11  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
12  *
13  */
14
15 /*------------------------------------------------------------------------*/
16 /* file: sci_drawaxis.c                                                   */
17 /* desc : interface for sci_drawaxis routine                              */
18 /*------------------------------------------------------------------------*/
19
20 #include "gw_graphics.h"
21 #include "stack-c.h"
22 #include "GetProperty.h"
23 #include "sciCall.h"
24 #include "Scierror.h"
25 #include "localization.h"
26 #include "CurrentObjectsManagement.h"
27
28 #include "getGraphicObjectProperty.h"
29 #include "graphicObjectProperties.h"
30
31 /*--------------------------------------------------------------------------*/
32 static int check_xy(char *fname, char dir, int mn, int xpos, int xm, int xn, 
33                                         long unsigned int xl, int ypos, int yRow, int yCol, long unsigned int yl, 
34                                         int *ntics);
35
36 /*--------------------------------------------------------------------------*/
37 int sci_drawaxis( char * fname, unsigned long fname_len )
38 {
39   /** XXXXX : un point en suspens c'est le "S" ou une adresse est 
40   *  stockees ds un unsigned long : est ce sufisant ? 
41   */
42   static rhs_opts opts[]= { 
43     {-1,"dir","c",0,0,0},
44     {-1,"fontsize","i",0,0,0},
45     {-1,"format_n","c",0,0,0},
46     {-1,"seg","i",0,0,0},
47     {-1,"sub_int","i",0,0,0},
48     {-1,"textcolor","i",0,0,0},
49     {-1,"tics","c",0,0,0},
50     {-1,"ticscolor","i",0,0,0},
51     {-1,"val","S",0,0,0},
52     {-1,"x","d",0,0,0},
53     {-1,"y","d",0,0,0},
54     {-1,NULL,NULL,0,0}
55   };
56
57   int minrhs = -1,maxrhs = 0,minlhs=0,maxlhs=1,nopt;
58   char dir = 'l', *format = NULL, tics = 'v', **val = NULL;
59   int fontsize = 0, sub_int=2, seg_flag = 1,textcolor = -1,ticscolor=-1;
60   double *x = NULL,*y = NULL;
61   int nx=0,ny=0,ntics;
62   int nb_tics_labels = -1;
63
64   nopt = NumOpt();
65
66   CheckRhs(minrhs,maxrhs+nopt) ;
67   CheckLhs(minlhs,maxlhs) ;
68
69   if ( get_optionals(fname,opts) == 0)
70         {
71                 /* error */
72                 return 0;
73         }
74   if ( opts[0].position != -1 ) 
75   { 
76     CheckLength(opts[0].position,opts[0].m,1);
77     dir = *cstk(opts[0].l);
78   } 
79   if ( opts[1].position != -1 ) 
80   {
81     CheckScalar(opts[1].position,opts[1].m,opts[1].n);
82     fontsize= *istk(opts[1].l);
83   }
84   if ( opts[2].position != -1 ) 
85   { 
86     /* verfier ce que l'on recoit avec "" XXX */
87     format = cstk(opts[2].l);
88   }
89
90   if ( opts[3].position != -1 ) 
91   { 
92     CheckScalar(opts[3].position,opts[3].m,opts[3].n);
93     seg_flag = *istk(opts[3].l);
94   }
95
96   if ( opts[4].position != -1 ) 
97   { 
98     CheckScalar(opts[4].position,opts[4].m,opts[4].n);
99     sub_int= *istk(opts[4].l);
100   }
101
102   if ( opts[5].position != -1 ) 
103   { 
104     CheckScalar(opts[5].position,opts[5].m,opts[5].n);
105     textcolor= *istk(opts[5].l);
106   }
107
108   if ( opts[6].position != -1 ) 
109   { 
110     CheckLength(opts[6].position,opts[6].m,1);
111     tics = *cstk(opts[6].l);
112   } 
113
114   if ( opts[7].position != -1 ) 
115   { 
116     CheckScalar(opts[7].position,opts[7].m,opts[7].n);
117     ticscolor= *istk(opts[7].l);
118   }
119
120   if ( opts[8].position != -1 ) 
121   { 
122     val = (char **) opts[8].l;
123   } 
124
125   if ( opts[9].position != -1 ) 
126   { 
127     x = stk(opts[9].l);
128     nx = opts[9].m * opts[9].n ;  /* F.Leray OK here opts[9].m and opts[9].n are integers.*/
129   }
130   else 
131   {
132     static double x_def[1];
133         double* bounds;
134         sciPointObj * currentSubwin = sciGetCurrentSubWin();
135         getGraphicObjectProperty(currentSubwin->UID, __GO_DATA_BOUNDS__, jni_double_vector, &bounds);
136     nx = 1;
137     x = x_def ;
138     if ( dir == 'l' ) 
139       x_def[0] = bounds[0]; /* xMin */
140     else if ( dir == 'r' ) 
141       x_def[0] = bounds[1]; /* xMax */
142   }
143
144   if ( opts[10].position != -1 ) 
145   { 
146     y = stk(opts[10].l);
147     ny = opts[10].m * opts[10].n ;
148   }
149   else 
150   {
151     static double y_def[1];
152         double* bounds;
153         sciPointObj * currentSubwin = sciGetCurrentSubWin();
154         getGraphicObjectProperty(currentSubwin->UID, __GO_DATA_BOUNDS__, jni_double_vector, &bounds);
155     ny = 1;
156     y = y_def ;
157     if ( dir == 'd' ) 
158       y_def[0] = bounds[2]; /* yMin */
159     else if ( dir == 'u' ) 
160       y_def[0] = bounds[3]; /* yMax */
161  }
162
163   /* compatibility test */
164   switch (tics ) 
165   {
166   case 'r' :
167     if ( check_xy(fname,dir,3,opts[9].position,opts[9].m,opts[9].n,opts[9].l,
168       opts[10].position,opts[10].m,opts[10].n,opts[10].l,&ntics)==0) 
169         {
170           C2F(putlhsvar)();
171       return 0;
172         }
173     break;
174   case 'i' :
175     if ( check_xy(fname,dir,4,opts[9].position,opts[9].m,opts[9].n,opts[9].l,
176       opts[10].position,opts[10].m,opts[10].n,opts[10].l,&ntics)==0) 
177         {
178           C2F(putlhsvar)();
179       return 0;
180         }
181     break;
182   case 'v' :
183     if ( check_xy(fname,dir,-1,opts[9].position,opts[9].m,opts[9].n,opts[9].l,
184       opts[10].position,opts[10].m,opts[10].n,opts[10].l,&ntics)==0) 
185         {
186           C2F(putlhsvar)();
187       return 0;
188         }
189     break;
190   default :
191     Scierror(999,_("%: Wrong value for %s '%c': '%s', '%s' and '%s' expected.\n"), fname,"tics",dir,"r","v","i");
192     return 0;
193   }
194
195   if ( val != NULL ) 
196   {
197     CheckLength( opts[8].position, opts[8].m*opts[8].n,ntics);
198     nb_tics_labels = opts[8].m*opts[8].n;
199   }
200
201   
202   Objdrawaxis(dir,tics,x,&nx,y,&ny,val,sub_int,format,fontsize,textcolor,ticscolor,'n',seg_flag,nb_tics_labels);
203
204
205   LhsVar(1) = 0;
206   C2F(putlhsvar)();
207   return 0;
208 }
209
210 /*--------------------------------------------------------------------------*/
211 static int check_xy(char *fname, char dir, int mn, int xpos, int xm, int xn, 
212              long unsigned int xl, int ypos, int yRow, int yCol, long unsigned int yl, 
213              int *ntics)
214 {
215   switch ( dir ) 
216   {
217   case 'l': case 'r' : 
218     /* x must be scalar */
219     if ( xpos != -1 ) CheckScalar(xpos,xm,xn);
220     /* y must be of size mn */
221     if ( mn != -1 ) CheckDims(ypos,yRow,yCol,1,mn);
222     switch (mn) 
223     {
224     case 3: 
225       *ntics = (int) *stk(yl+2)+1;break;
226     case 4: 
227       *ntics = (int) *stk(yl+3)+1;break;
228     case -1: 
229       *ntics =  yRow*yCol;break;
230     }
231     break;
232   case 'u' : case 'd' : 
233     /* y must be scalar */
234     if ( ypos  != -1 ) CheckScalar(ypos,yRow,yCol);
235     /* x must be of size mn */
236     if (mn != -1 ) CheckDims(xpos,xm,xn,1,mn);
237     switch (mn) 
238     {
239     case 3: 
240       *ntics =  (int) *stk(xl+2)+1;break;
241     case 4: 
242       *ntics =  (int) *stk(xl+3)+1;break;
243     case -1: 
244       *ntics =  xm*xn;break;
245     }
246     break;
247   default :
248     Scierror(999,"%s: Wrong value for %s '%c': '%s','%s','%s' and '%s' expected.\n", 
249       fname,"dir",dir,"u","d","r","l");
250     return 0;
251   }
252   return 1;
253 }
254 /*--------------------------------------------------------------------------*/