Xcall1.c

Go to the documentation of this file.
00001 #include "ObjectStructure.h"
00002 #include "GetProperty.h"
00003 #include "SetProperty.h"
00004 #include "Xcall1.h"
00005 #include "CurrentObjectsManagement.h"
00006 #include "ObjectSelection.h"
00007 
00008 #include "MALLOC.h" /* MALLOC */
00009 
00010 /*------------------------------------------------------------------------
00011  *   Graphic library for 2D and 3D plotting 
00012  *   Copyright (C) 1998-2001 Chancelier Jean-Philippe 
00013  *   jpc@cereve.enpc.fr 
00014  *--------------------------------------------------------------------------*/
00015 
00016 #include <string.h>
00017 #include <stdio.h>
00018 #include "math_graphics.h"
00019 #include "PloEch.h"
00020 #include "sciprint.h"
00021 #include "clipping.h"
00022 
00023 typedef void (f_xcall1) (char *,char *,integer *,integer *,integer *,integer *,integer *,integer *,
00024                                double *,double *,double *,double *,integer,integer );
00025 typedef void (*func) (char *,char *,integer *,integer *,integer *,integer *,integer *,integer *,
00026                                double *,double *,double *,double *,integer,integer );
00027 extern int C2F(sciwin) (void);
00028 extern int scilab_shade(integer *polyx, integer *polyy, integer *fill, integer polysize, integer flag);
00029 
00030 static void GSciString (int,integer *x,integer *y,char *StrMat,integer *w,integer *h);
00031 static void Myalloc1 (integer **xm,integer n,integer *err);
00032 static void Myalloc (integer **xm,integer **ym, integer n, integer *err);
00033 
00034 static f_xcall1 xset_1, drawarc_1, fillarcs_1  ,drawarcs_1  ,fillpolyline_1  ,drawarrows_1  ;
00035 static f_xcall1 drawaxis_1  ,cleararea_1  ,xclick_1  ,xclick_any_1  ,xgetmouse_1  ,fillarc_1  ;
00036 static f_xcall1 fillrectangle_1  ,drawpolyline_1  ,fillpolylines_1  ,drawpolymark_1  ,displaynumbers_1  ;
00037 static f_xcall1 drawpolylines_1  ,drawrectangle_1  ,drawrectangles_1  ,drawsegments_1  ,displaystring_1  ;
00038 static f_xcall1 boundingbox_1  ,xstringb_1 ;
00039 static f_xcall1 xinit_1;
00040 
00041 
00042 #ifndef __STDC__ 
00043 #define const 
00044 #endif 
00045 
00046 
00047 #ifdef _MSC_VER
00048 extern int scilab_shade(integer *polyx, integer *polyy, integer *fill, integer polysize, integer flag);
00049 #endif
00050 
00051 const struct funreplace * in_word_set (register const char *str, register unsigned int len);
00052 void xclick_2(char *fname, char *str, integer *ibutton, integer *iflag, integer *istr, integer *x1, integer *yy1, integer *x7, double *x, double *y, double *dx3, double *dx4, integer lx0, integer lx1);
00053 void xgetmouse2(char *fname, char *str, integer *ibutton, integer *iflag, integer *x1, integer *yy1, integer *x6, integer *x7, double *x, double *y, double *dx3, double *dx4, integer lx0, integer lx1);
00054 
00055 
00056 
00057 struct funreplace { char *name; f_xcall1 *action; };
00058 
00059 #define TOTAL_KEYWORDS 39
00060 #define MIN_WORD_LENGTH 4
00061 #define MAX_WORD_LENGTH 9
00062 #define MIN_HASH_VALUE 10
00063 #define MAX_HASH_VALUE 114
00064 /* maximum key range = 105, duplicates = 0 */
00065 
00066 #ifdef __GNUC__
00067 __inline
00068 #else
00069 #ifdef __cplusplus
00070 inline
00071 #endif
00072 #endif
00073 static unsigned int
00074 hash (str, len)
00075      register const char *str;
00076      register unsigned int len;
00077 {
00078   static const unsigned char asso_values[] =
00079     {
00080       115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
00081       115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
00082       115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
00083       115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
00084       115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
00085       115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
00086       115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
00087       115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
00088       115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
00089       115, 115, 115, 115, 115, 115, 115,   0,   5,   5,
00090        10,   0,  20,  25, 115,   0, 115,  35,  35,  35,
00091        15,  10,  15, 115,   5,  10,   0,  25, 115,   1,
00092        15,   0, 115, 115, 115, 115, 115, 115, 115, 115,
00093       115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
00094       115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
00095       115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
00096       115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
00097       115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
00098       115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
00099       115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
00100       115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
00101       115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
00102       115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
00103       115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
00104       115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
00105       115, 115, 115, 115, 115, 115
00106     };
00107   return len + asso_values[(unsigned char)str[3]] + asso_values[(unsigned char)str[2]] + asso_values[(unsigned char)str[1]] + asso_values[(unsigned char)str[len - 1]];
00108 }
00109 
00110 #ifdef __GNUC__
00111 __inline
00112 #endif
00113 const struct funreplace *
00114 in_word_set (register const char *str, register unsigned int len)
00115 {
00116   static const struct funreplace wordlist[] =
00117     {
00118       {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
00119       {""},
00120       {"xarea",         fillpolyline_1},
00121       {""}, {""}, {""},
00122       {"xset",          xset_1},
00123       {"xrect",         drawrectangle_1},
00124       {"xstart",                (func) C2F(dr)},
00125       {"xarrow",                drawarrows_1},
00126       {""},
00127       {"xarc",          drawarc_1},
00128       {"xinit",         xinit_1},
00129       {"xsetdr",                (func) C2F(dr)},
00130       {""},
00131       {""},
00132       {""},
00133       {"xarcs",         drawarcs_1},
00134       {"xrects",                drawrectangles_1},
00135       {"xreplay",       (func) C2F(dr)},
00136       {"xstringb",      xstringb_1},
00137       {"xget",          (func) C2F(dr)},
00138       {"xaxis",         drawaxis_1},
00139       {"xfrect",                fillrectangle_1},
00140       {""}, {""},
00141       {"xgetmouse",     xgetmouse_1},
00142       {"xfarc",         fillarc_1},
00143       {"xgetdr",                (func) C2F(dr)},
00144       {""}, {""},
00145       {"xend",          (func) C2F(dr)},
00146       {""},
00147       {"xfarcs",                fillarcs_1},
00148       {""}, {""}, {""},
00149       {"xclea",         cleararea_1},
00150       {""},
00151       {"xstring",       displaystring_1},
00152       {""},
00153       {"xclickany",     xclick_any_1},
00154       {"xsegs",         drawsegments_1},
00155       {"xclear",                (func) C2F(dr)},
00156       {"xselect",       (func) C2F(dr)},
00157       {""}, {""},
00158       {"xname",         (func) C2F(dr)},
00159       {"xmarks",                drawpolymark_1},
00160       {""},
00161       {"xstringl",      boundingbox_1},
00162       {""}, {""},
00163       {"xgfont",                (func) C2F(dr)},
00164       {""}, {""}, {""}, {""},
00165       {"xlines",                drawpolyline_1},
00166       {"xliness",       fillpolylines_1},
00167       {""}, {""}, {""},
00168       {"xlfont",                (func) C2F(dr)},
00169       {""}, {""}, {""}, {""},
00170       {"xpolys",                drawpolylines_1},
00171       {""}, {""}, {""}, {""},
00172       {"xclick",                xclick_1},
00173       {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
00174       {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
00175       {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
00176       {""}, {""}, {""}, {""}, {""},
00177       {"xnum",          displaynumbers_1}
00178     };
00179 
00180   if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
00181     {
00182       register int key = hash (str, len);
00183 
00184       if (key <= MAX_HASH_VALUE && key >= 0)
00185         {
00186           register const char *s = wordlist[key].name;
00187 
00188           if (*str == *s && !strcmp (str + 1, s + 1))
00189             return &wordlist[key];
00190         }
00191     }
00192   return 0;
00193 }
00194 
00195 
00196 int C2F(dr1)( char x0[],char x1[],integer *x2,integer *x3,integer *x4,integer *x5,integer *x6,
00197                     integer *x7,double *dx1,double *dx2,double *dx3,double *dx4,
00198                     integer lx0, integer lx1)
00199 { 
00200   const struct funreplace *fr;
00201   fr=in_word_set(x0,strlen(x0));
00202   if ( fr != NULL ) 
00203     {
00204       (*(fr->action))(x0,x1,x2,x3,x4,x5,x6,x7,dx1,dx2,dx3,dx4,lx0,lx1);
00205     }
00206   else 
00207     {
00208       sciprint("\n Unknow X operator <%s>\r\n",x0);
00209     }
00210   return(0);
00211 }
00212 
00213 /**************************************************
00214  * Global values which are set at this level and 
00215  * not redirected to each driver
00216  **************************************************/
00217 
00218 static char FPF[32]={'\0'};
00219 
00220 char * getFPF(void)
00221 {
00222   return(FPF);
00223 }
00224 
00225 int C2F(xsetg)(char * str,char * str1,integer lx0,integer lx1)
00226 {
00227   if ( strcmp(str,"fpf") == 0) 
00228     {
00229       strncpy(FPF,str1,32);
00230     }
00231   else if ( strcmp(str,"auto clear")==0) 
00232     {
00233       sciPointObj * subwin = sciGetFirstTypedSelectedSon(sciGetCurrentFigure(), SCI_SUBWIN);
00234       if (strcmp(str1,"on")==0 )
00235       {
00236         sciSetAddPlot( subwin,FALSE);
00237       }
00238       else{
00239         sciSetAddPlot( subwin,TRUE);
00240       }
00241     }
00242   else if ( strcmp(str,"default")==0)
00243     {
00244       FPF[0]='\0';
00245     }
00246   else 
00247     {
00248       sciprint("xset(arg,<string>): Unrecognized arg: %s\r\n",str);
00249     }
00250   return 0;
00251 }
00252 
00253 int C2F(xgetg)( char * str, char * str1, integer * len,integer  lx0,integer lx1)
00254 {
00255   if ( strcmp(str,"fpf") == 0) 
00256   {
00257     strncpy(str1,FPF,32);
00258     *len= strlen(str1);
00259   }
00260   else if ( strcmp(str,"auto clear")==0) 
00261   {
00262     int autoclear;
00263     sciPointObj * subwin = sciGetFirstTypedSelectedSon( sciGetCurrentFigure(), SCI_SUBWIN ) ;
00264     autoclear = !(sciGetAddPlot(subwin));
00265     if (autoclear == 1) 
00266     {
00267       strncpy(str1,"on",2);
00268       *len=2;
00269     }
00270     else 
00271     {
00272       strncpy(str1,"off",3);
00273       *len=3;
00274     }
00275   }
00276   return 0;
00277 }
00278 
00279 /*-----------------------------------------------------------------------------
00280  *  xset_1 
00281  *-----------------------------------------------------------------------------*/
00282 
00283 void xinit_1(char *fname, char *str, integer *x1, integer *x2, integer *x3, integer *x4, integer *x5, integer *x6, double *dx1, double *dx2, double *dx3, double *dx4, integer lx0, integer lx1)
00284 {
00285    C2F(dr)(fname,str,x1,x2,x3,x4,x5,x6,dx1,dx2,dx3,dx4,lx0,lx1);
00286 }
00287 
00288 
00289 /*-----------------------------------------------------------------------------
00290  *  xset_1 
00291  *-----------------------------------------------------------------------------*/
00292 
00293 void xset_1(char *fname, char *str, integer *x1, integer *x2, integer *x3, integer *x4, integer *x5, integer *x6, double *dx1, double *dx2, double *dx3, double *dx4, integer lx0, integer lx1)
00294 {
00295 
00296   if (strcmp(str,"clipping")==0)
00297     {
00299       integer xx1,yy1,w1,h1,n=1;
00300       C2F(echelle2d)(dx1,dx2,&xx1,&yy1,&n,&n,"f2i",3L);
00301       C2F(echelle2dl)(dx3,dx4,&w1,&h1,&n,&n,"f2i");
00302       C2F(dr)(fname,str,&xx1,&yy1,&w1,&h1,x5,x6,dx1,dx2,dx3,dx4,lx0,lx1);
00303     }
00304   else if (strcmp(str,"clipping-p")==0) 
00305     {
00306       /* clip given in pixel */
00307       C2F(dr)(fname,"clipping",x1,x2,x3,x4,x5,x6,dx1,dx2,dx3,dx4,lx0,lx1);
00308     }
00309   else if (strcmp(str,"clipgrf")==0)
00310     {
00312       frame_clip_on();
00313     }
00314   else
00315     {
00316       C2F(dr)(fname,str,x1,x2,x3,x4,x5,x6,dx1,dx2,dx3,dx4,lx0,lx1);
00317     }
00318 }
00319 
00320 /*-----------------------------------------------------------------------------
00321  *  drawarc_1
00322  *-----------------------------------------------------------------------------*/
00323 
00324 void drawarc_1(char *fname, char *str, integer *v1, integer *v2, integer *v3, integer *v4, integer *angle1, integer *angle2, double *x, double *y, double *width, double *height, integer lx0, integer lx1)
00325 { 
00326   integer x1,yy1,w1,h1,n=1;
00327   x1 = XDouble2Pixel(*x);
00328   yy1 = YDouble2Pixel(*y);
00329   C2F(echelle2dl)(width,height,&w1,&h1,&n,&n,"f2i"); 
00330   C2F(dr)(fname,str,&x1,&yy1,&w1,&h1,angle1,angle2,PD0,PD0,PD0,PD0,lx0,lx1);
00331 }
00332 
00333 /*-----------------------------------------------------------------------------
00334  * 
00335  *-----------------------------------------------------------------------------*/
00336 
00337 void fillarcs_1(char *fname, char *str, integer *v1, integer *fillvect, integer *n, integer *x6, integer *x7, integer *x8, double *vects, double *dx2, double *dx3, double *dx4, integer lx0, integer lx1)
00338 {
00339   integer *xm,err=0,n2;
00340   Myalloc1(&xm,6*(*n),&err);
00341   if (err ==  1) return;
00342   C2F(ellipse2d)(vects,xm,(n2=6*(*n),&n2),"f2i");
00343   C2F(dr)(fname,str,xm,fillvect,n,x6,x7,x8,PD0,dx2,dx3,dx4,lx0,lx1);
00344   FREE(xm) ;
00345 }
00346 
00347 /*-----------------------------------------------------------------------------
00348  *  
00349  *-----------------------------------------------------------------------------*/
00350 
00351 void drawarcs_1(char *fname, char *str, integer *v1, integer *style, integer *n, integer *x6, integer *x7, integer *x8, double *vects, double *dx2, double *dx3, double *dx4, integer lx0, integer lx1)
00352 {
00353   integer *xm,err=0,n2;
00354   Myalloc1(&xm,6*(*n),&err);
00355   if (err ==  1) return;
00356   C2F(ellipse2d)(vects,xm,(n2=6*(*n),&n2),"f2i");
00357   C2F(dr)(fname,str,xm,style,n,x6,x7,x8,PD0,dx2,dx3,dx4,lx0,lx1);
00358   FREE(xm) ;
00359 }
00360 /*-----------------------------------------------------------------------------
00361  *  
00362  *-----------------------------------------------------------------------------*/
00363 
00364 void fillpolyline_1(char *fname, char *str, integer *n, integer *v1, integer *v2, integer *closeflag, integer *x7, integer *x8, double *vx, double *vy, double *dx3, double *dx4, integer lx0, integer lx1)
00365 {
00366   integer *xm,*ym,err=0,n2=1;
00367   Myalloc(&xm,&ym,*n,&err);
00368   if (err ==  1) return;
00369   C2F(echelle2d)(vx,vy,xm,ym,n,&n2,"f2i",3L);
00370   C2F(dr)(fname,str,n,xm,ym,closeflag,x7,x8,PD0,PD0,dx3,dx4,lx0,lx1);
00371   FREE(xm) ;
00372   FREE(ym) ;
00373 }
00374 
00375 /*-----------------------------------------------------------------------------
00376  *  arrows
00377  *-----------------------------------------------------------------------------*/
00378 
00379 void drawarrows_1(char *fname, char *str, integer *style, integer *iflag, integer *n, integer *v3, integer *x7, integer *x8, double *vx, double *vy, double *as, double *dx4, integer lx0, integer lx1)
00380 { 
00381   integer *xm,*ym,err=0,n2=1,n1=1,ias,ias1;
00382   Myalloc(&xm,&ym,*n,&err);
00383   if (err ==  1) return;
00384   C2F(echelle2d)(vx,vy,xm,ym,n,&n2,"f2i",3L);
00385   /* is as < 0 --> not set */
00386   if ( *as < 0.0 ) 
00387     {
00388       int i;
00389       double Mnorm=0.0;
00390       for (i=0 ; i < *n/2 ; i++)
00391         { 
00392           double dx,dy;
00393           dx=( vx[2*i+1]-vx[2*i]);
00394           dy=( vy[2*i+1]-vy[2*i]);
00395           Mnorm += sqrt(dx*dx+dy*dy);
00396         }
00397       if ( *n != 0) 
00398         Mnorm /= (*n/2);
00399       *as = Mnorm/5.0;
00400     }
00401   C2F(echelle2dl)(as,as,&ias,&ias1,&n1,&n1,"f2i"); 
00402   ias=10*ias;
00403   C2F(dr)(fname,str,xm,ym,n,&ias,style,iflag,PD0,PD0,PD0,dx4,lx0,lx1);
00404   FREE(xm) ;
00405   FREE(ym) ;
00406 }
00407 
00408 /*-----------------------------------------------------------------------------
00409  * axis 
00410  *-----------------------------------------------------------------------------*/
00411 
00412 void drawaxis_1(char *fname, char *str, integer *v1, integer *nsteps, integer *v2, integer *v3, integer *x7, integer *x8, double *alpha, double *size, double *initpoint, double *dx4, integer lx0, integer lx1)
00413 {
00414   integer initpoint1[2],alpha1;
00415   double size1[3];
00416   alpha1=inint( *alpha);
00417   C2F(axis2d)(alpha,initpoint,size,initpoint1,size1);
00418 
00419   C2F(dr)(fname,str,&alpha1,nsteps,PI0,initpoint1,x7,x8,size1,PD0,PD0,PD0,lx0,lx1);
00420 }
00421 /*-----------------------------------------------------------------------------
00422  *  cleararea
00423  *-----------------------------------------------------------------------------*/
00424 
00425 void cleararea_1(char *fname, char *str, integer *v1, integer *v2, integer *v3, integer *v4, integer *x7, integer *x8, double *x, double *y, double *w, double *h, integer lx0, integer lx1)
00426 {
00427   integer x1,yy1,w1,h1,n=1;
00428   x1 = XDouble2Pixel(*x);
00429   yy1 = YDouble2Pixel(*y);
00430   C2F(echelle2dl)(w,h,&w1,&h1,&n,&n,"f2i"); 
00431   C2F(dr)(fname,str,&x1,&yy1,&w1,&h1,x7,x8,PD0,PD0,PD0,PD0,lx0,lx1);
00432 }
00433 /*-----------------------------------------------------------------------------
00434  * click 
00435  *-----------------------------------------------------------------------------*/
00436 void xclick_1(char *fname, char *str, integer *ibutton, integer *iflag, integer *istr, integer *x5, integer *x6, integer *x7, double *x, double *y, double *dx3, double *dx4, integer lx0, integer lx1)
00437 { 
00438   integer x1,yy1,n=1;
00439   C2F(dr)(fname,str,ibutton,&x1,&yy1,iflag,istr,x7,PD0,PD0,dx3,dx4,lx0,lx1);
00440   if (*ibutton != -100) C2F(echelle2d)(x,y,&x1,&yy1,&n,&n,"i2f",3L);
00441 }
00442 /*-----------------------------------------------------------------------------
00443  * click2  returns also the value in pixels (usefull for 3d zoom)
00444  *-----------------------------------------------------------------------------*/
00445 void xclick_2(char *fname, char *str, integer *ibutton, integer *iflag, integer *istr, integer *x1, integer *yy1, integer *x7, double *x, double *y, double *dx3, double *dx4, integer lx0, integer lx1)
00446 { 
00447   integer n=1;
00448   C2F(dr)(fname,str,ibutton,x1,yy1,iflag,istr,x7,PD0,PD0,dx3,dx4,lx0,lx1);
00449   if (*ibutton != -100) C2F(echelle2d)(x,y,x1,yy1,&n,&n,"i2f",3L);
00450 }
00451 /*-----------------------------------------------------------------------------
00452  *  click_any
00453  *-----------------------------------------------------------------------------*/
00454 void xclick_any_1(char *fname, char *str, integer *ibutton, integer *iwin, integer *iflag, integer *x5, integer *x6, integer *x7, double *x, double *y, double *dx3, double *dx4, integer lx0, integer lx1)
00455 { 
00456   integer x1,y1_,n=1;
00457   integer verb=0,cur,na;
00458   C2F(dr)(fname,str,ibutton,&x1,&y1_,iwin,iflag,x7,PD0,PD0,PD0,PD0,lx0,lx1);
00459   if (*ibutton>=0){
00460     C2F(dr)("xget","window",&verb,&cur,&na,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
00461     C2F(dr)("xset","window",iwin,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
00462     C2F(echelle2d)(x,y,&x1,&y1_,&n,&n,"i2f",3L);
00463     C2F(dr)("xset","window",&cur,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
00464   }
00465 }
00466 
00467 /*-----------------------------------------------------------------------------
00468  *   xgetmouse
00469  *-----------------------------------------------------------------------------*/
00470 void xgetmouse_1(char *fname, char *str, integer *ibutton, integer *iflag, integer *v2, integer *x5, integer *x6, integer *x7, double *x, double *y, double *dx3, double *dx4, integer lx0, integer lx1)
00471 { 
00472   integer x1,yy1,n=1;
00473   C2F(dr)(fname,str,ibutton,&x1,&yy1,iflag,x6,x7,PD0,PD0,dx3,dx4,lx0,lx1);
00474   if (*ibutton != -100) C2F(echelle2d)(x,y,&x1,&yy1,&n,&n,"i2f",3L);
00475 }
00476 
00477 /*-----------------------------------------------------------------------------
00478  *   xgetmouse2 returns also the value in pixels (usefull for 3d zoom)
00479  *-----------------------------------------------------------------------------*/
00480 void xgetmouse2(char *fname, char *str, integer *ibutton, integer *iflag, integer *x1, integer *yy1, integer *x6, integer *x7, double *x, double *y, double *dx3, double *dx4, integer lx0, integer lx1)
00481 {
00482   integer n=1;
00483   C2F(dr)(fname,str,ibutton,x1,yy1,iflag,x6,x7,PD0,PD0,dx3,dx4,lx0,lx1);
00484   
00485   if (*ibutton != -100) C2F(echelle2d)(x,y,x1,yy1,&n,&n,"i2f",3L);
00486 }
00487 
00488 /*-----------------------------------------------------------------------------
00489  *   fillarc
00490  *-----------------------------------------------------------------------------*/
00491 
00492 void fillarc_1(char *fname, char *str, integer *v1, integer *v2, integer *v3, integer *v4, integer *angle1, integer *angle2, double *x, double *y, double *width, double *height, integer lx0, integer lx1)
00493 { 
00494   integer x1,yy1,w1,h1,n=1;
00495   x1 = XDouble2Pixel(*x);
00496   yy1 = YDouble2Pixel(*y);
00497   C2F(echelle2dl)(width,height,&w1,&h1,&n,&n,"f2i"); 
00498   C2F(dr)(fname,str,&x1,&yy1,&w1,&h1,angle1,angle2,PD0,PD0,PD0,PD0,lx0,lx1);
00499 }
00500 /*-----------------------------------------------------------------------------
00501  *  fillrectangle
00502  *-----------------------------------------------------------------------------*/
00503 
00504 void fillrectangle_1(char *fname, char *str, integer *v1, integer *v2, integer *v3, integer *v4, integer *x7, integer *x8, double *x, double *y, double *width, double *height, integer lx0, integer lx1)
00505 { 
00506   integer x1,yy1,w1,h1,n=1;
00507   x1 = XDouble2Pixel(*x);
00508   yy1 = YDouble2Pixel(*y);
00509   C2F(echelle2dl)(width,height,&w1,&h1,&n,&n,"f2i"); 
00510   C2F(dr)(fname,str,&x1,&yy1,&w1,&h1,x7,x8,PD0,PD0,PD0,PD0,lx0,lx1);
00511 }
00512 
00513 
00514 /*-----------------------------------------------------------------------------
00515  *  drawpolyline
00516  *-----------------------------------------------------------------------------*/
00517 void drawpolyline_1(char *fname, char *str, integer *n, integer *v1, integer *v2, integer *closeflag, integer *x7, integer *x8, double *vx, double *vy, double *dx3, double *dx4, integer lx0, integer lx1)
00518 {
00519   integer *xm,*ym,err=0,n2=1;
00520   Myalloc(&xm,&ym,*n,&err);
00521   if (err ==  1) return;
00522   C2F(echelle2d)(vx,vy,xm,ym,n,&n2,"f2i",3L);
00523   C2F(dr)(fname,str,n,xm,ym,closeflag,x7,x8,PD0,PD0,dx3,dx4,lx0,lx1);
00524   FREE(xm) ;
00525   FREE(ym) ;
00526 }
00527 
00528 /*-----------------------------------------------------------------------------
00529  *  fillpolylines
00530  *-----------------------------------------------------------------------------*/
00531 
00532 void fillpolylines_1(char *fname, char *str, integer *v1, integer *v2, integer *fillvect, integer *n, integer *p, integer *x8, double *vx, double *vy, double *dx3, double *dx4, integer lx0, integer lx1)
00533 {
00534   integer *xm,*ym,err=0,i,j;
00535   integer *px,*py;
00536   Myalloc(&xm,&ym,(*n)*(*p),&err);
00537   if (err ==  1) return;
00538   C2F(echelle2d)(vx,vy,xm,ym,n,p,"f2i",3L);
00539 
00540 
00541   if (*v1==2) {
00542     px=(integer *)MALLOC(((*p)+1)*sizeof(integer));
00543     py=(integer *)MALLOC(((*p)+1)*sizeof(integer));
00544         if (px==NULL || py==NULL) {
00545                 sciprint("fillpolylines_1 : malloc No more Place\n");
00546                 return;
00547         }    
00548     for (i=0 ; i< (*n) ;i++) {
00549         for (j=0; j<(*p); j++) {
00550                 px[j]=xm[(*p)*i+j];
00551                 py[j]=ym[(*p)*i+j];
00552                 }
00553         px[*p]=px[0];                    
00554         py[*p]=py[0];            
00555         scilab_shade(px,py,&fillvect[(*p)*i],*p,(fillvect[(*p)*i]));
00556      }
00557      FREE(px);
00558      FREE(py);
00559   }
00560   else C2F(dr)(fname,str,xm,ym,fillvect,n,p,x8,PD0,PD0,dx3,dx4,lx0,lx1);
00561 
00562   /* end of code modified by polpoth 11/7/2000 */
00563 
00564 
00565 }
00566 /*-----------------------------------------------------------------------------
00567  *  drawpolymark
00568  *-----------------------------------------------------------------------------*/
00569 void drawpolymark_1(char *fname, char *str, integer *n, integer *v1, integer *v2, integer *x6, integer *x7, integer *x8, double *vx, double *vy, double *dx3, double *dx4, integer lx0, integer lx1)
00570 {
00571   integer *xm,*ym,err=0,n2=1;
00572   Myalloc(&xm,&ym,*n,&err);
00573   if (err ==  1) return;
00574   C2F(echelle2d)(vx,vy,xm,ym,n,&n2,"f2i",3L);
00575   C2F(dr)(fname,str,n,xm,ym,x6,x7,x8,PD0,PD0,dx3,dx4,lx0,lx1);
00576   FREE(xm) ;
00577   FREE(ym) ;
00578 }
00579 
00580 /*-----------------------------------------------------------------------------
00581  *  displaynumbers
00582  *-----------------------------------------------------------------------------*/
00583 
00584 void displaynumbers_1(char *fname, char *str, integer *v1, integer *v2, integer *v3, integer *v4, integer *n, integer *flag, double *x, double *y, double *z, double *alpha, integer lx0, integer lx1)
00585 {
00586   integer *xm,*ym,err=0,n2=1;
00587   Myalloc(&xm,&ym,*n,&err);
00588   if (err ==  1) return;
00589   C2F(echelle2d)(x,y,xm,ym,n,&n2,"f2i",3L);
00590   C2F(dr)(fname,str,xm,ym,PI0,PI0,n,flag,z,alpha,PD0,PD0,lx0,lx1);
00591   FREE(xm) ;
00592   FREE(ym) ;
00593 }
00594 
00595 /*-----------------------------------------------------------------------------
00596  *   drawpolylines
00597  *-----------------------------------------------------------------------------*/
00598 
00599 void drawpolylines_1(char *fname, char *str, integer *v1, integer *v2, integer *drawvect, integer *n, integer *p, integer *x8, double *vx, double *vy, double *dx3, double *dx4, integer lx0, integer lx1)
00600 {
00601   integer *xm,*ym,err=0;
00602   Myalloc(&xm,&ym,(*n)*(*p),&err);
00603   if (err ==  1) return;
00604   C2F(echelle2d)(vx,vy,xm,ym,n,p,"f2i",3L);
00605   C2F(dr)(fname,str,xm,ym,drawvect,n,p,x8,PD0,PD0,dx3,dx4,lx0,lx1);
00606   FREE(xm) ;
00607   FREE(ym) ;
00608 }
00609 /*-----------------------------------------------------------------------------
00610  *   drawrectangle
00611  *-----------------------------------------------------------------------------*/
00612 void drawrectangle_1(char *fname, char *str, integer *v1, integer *v2, integer *v3, integer *v4, integer *x7, integer *x8, double *x, double *y, double *w, double *h, integer lx0, integer lx1)
00613 {
00614   integer xm[4],n2=4;
00615   double vect[4];
00616   vect[0]=*x;vect[1]=*y;vect[2]=*w;vect[3]=*h;
00617   C2F(rect2d)(vect,xm,&n2,"f2i");
00618   C2F(dr)(fname,str,xm,xm+1,xm+2,xm+3,x7,x8,PD0,PD0,PD0,PD0,lx0,lx1);
00619 }
00620 /*-----------------------------------------------------------------------------
00621  *   drawrectangles
00622  *-----------------------------------------------------------------------------*/
00623 void drawrectangles_1(char *fname, char *str, integer *v1, integer *fillvect, integer *n, integer *x6, integer *x7, integer *x8, double *vects, double *dx2, double *dx3, double *dx4, integer lx0, integer lx1)
00624 {
00625   integer *xm,err=0,n2;
00626   Myalloc1(&xm,4*(*n),&err);
00627   if (err ==  1) return;
00628   C2F(rect2d)(vects,xm,(n2=4*(*n),&n2),"f2i");
00629   C2F(dr)(fname,str,xm,fillvect,n,x6,x7,x8,PD0,dx2,dx3,dx4,lx0,lx1);
00630   FREE(xm) ;
00631 }
00632 /*-----------------------------------------------------------------------------
00633  *  drawsegments
00634  *-----------------------------------------------------------------------------*/
00635 void drawsegments_1(char *fname, char *str, integer *style, integer *iflag, integer *n, integer *x6, integer *x7, integer *x8, double *vx, double *vy, double *dx3, double *dx4, integer lx0, integer lx1)
00636 { 
00637   integer *xm,*ym,err=0,n2=1;
00638   Myalloc(&xm,&ym,*n,&err);
00639   if (err ==  1) return;
00640   C2F(echelle2d)(vx,vy,xm,ym,n,&n2,"f2i",3L);
00641   C2F(dr)(fname,str,xm,ym,n,style,iflag,x8,PD0,PD0,dx3,dx4,lx0,lx1);
00642   FREE(xm) ;
00643   FREE(ym) ;
00644 }
00645 /*-----------------------------------------------------------------------------
00646  *  displaystring
00647  *-----------------------------------------------------------------------------*/
00648 void displaystring_1(char *fname, char *string, integer *v1, integer *v2, integer *v3, integer *flag, integer *x7, integer *x8, double *x, double *y, double *angle, double *dx4, integer lx0, integer lx1)
00649 {
00650   integer x1,yy1;
00651   x1 = XDouble2Pixel(*x);
00652   yy1 = YDouble2Pixel(*y);
00653   C2F(dr)(fname,string,&x1,&yy1,PI0,flag,x7,x8,angle,PD0,PD0,dx4,lx0,lx1);
00654 }
00655 
00656 /*-----------------------------------------------------------------------------
00657  *  boundingbox_1
00658  *  To get the bounding rectangle of a string
00659  *-----------------------------------------------------------------------------*/
00660 
00661 void boundingbox_1(char *fname, char *string, integer *v1, integer *v2, integer *v3, integer *x6, integer *x7, integer *x8, double *x, double *y, double *rect, double *dx4, integer lx0, integer lx1)
00662 { 
00663   integer x1,yy1,n=1,rect1[4];
00664 
00665   x1 = XDouble2Pixel(*x);
00666   yy1 = YDouble2Pixel(*y);
00667 
00668   C2F(dr)(fname,string,&x1,&yy1,rect1,x6,x7,x8,PD0,PD0,PD0,dx4,lx0,lx1);
00669   
00670 
00671   C2F(echelle2d)(rect,rect+1,rect1,rect1+1,&n,&n,"i2f",3L);
00672   C2F(echelle2dl)(rect+2,rect+3,rect1+2,rect1+3,&n,&n,"i2f");
00673 
00674 }
00675 
00676 /*-----------------------------------------------------------------------------
00677  * a string in a bounded box : with font size change to fit into the 
00678  * specified box (only works with driver which properly estimate string sizes)
00679  *-----------------------------------------------------------------------------*/
00680 
00681 #define FONTMAXSIZE 6
00682 
00683 void xstringb_1(char *fname, char *str, integer *fflag, integer *v2, integer *v3, integer *v4, integer *x7, integer *x8, double *xd, double *yd, double *wd, double *hd, integer lx0, integer lx1)
00684 {
00685   integer x,y,w,h,wbox,hbox,size,n=1;
00686   integer fontid[2],narg,verbose=0;
00687   x = XDouble2Pixel(*xd);
00688   y = YDouble2Pixel(*yd);
00689   C2F(echelle2dl)(wd,hd,&wbox,&hbox,&n,&n,"f2i"); 
00690   C2F(sciwin)();
00691   C2F(dr)("xget","font",&verbose,fontid,&narg,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
00692   size = FONTMAXSIZE;
00693   w = wbox + 1;
00694   h = hbox + 1;
00695 
00696   if ( *fflag == 1 ) 
00697     {
00698       while ( (w > wbox || h > hbox) && size >=0  ) 
00699         {
00700           size--;
00701           C2F(dr)("xset","font",fontid,&size,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
00702           GSciString(0,&x,&y,str,&w,&h);
00703         }
00704     }
00705   else 
00706     GSciString(0,&x,&y,str,&w,&h);
00707   x = (int) (x +  (wbox - w)/2.0);
00708   y = (int) (y -  (hbox - h)/2.0); 
00709   GSciString(1,&x,&y,str,&w,&h);
00710   C2F(dr)("xset","font",fontid,fontid+1,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
00711 }
00712 
00713 
00714 /**********************************
00715  * StrMat = 'xxxxZxxxxZxxx....' Z = \n 
00716  * find the enclosing rectangle for drawing 
00717  * the string StrMat 
00718  * and the string is Drawn if Dflag ==1 ;
00719  **********************************/
00720 
00721 void GSciString(int Dflag, integer *x, integer *y, char *StrMat, integer *w, integer *h)
00722 {
00723   char *p = StrMat,*p1,*p2,*plast;
00724   integer yi=*y;
00725   integer wc =0;
00726   char name[4];
00727   GetDriver1(name,PI0,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0);
00728   p1 = plast = p+ strlen(p);
00729   while (1) 
00730     {
00731       integer logrect[4];
00732       double angle=0.0;
00733       /* integer flag=1; SS 10/1/03*/
00734       integer flag=0;
00735       p2 =p1 ; *p1 = '\0';
00736       while ( p1 != p && *p1 != '\n' ) 
00737         p1--;
00738       if ( Dflag == 1) 
00739         C2F(dr)("xstring",( p1 == p ) ? p1 : p1 +1,
00740                 x,&yi,PI0,&flag,PI0,PI0,&angle,PD0,PD0,PD0,0L,0L);
00741       C2F(dr)("xstringl",
00742               ( p1 == p ) ? p1 : p1 +1,
00743               x,&yi,logrect,PI0,PI0,PI0,
00744               PD0,PD0,PD0,PD0,0L,0L);   
00745       if ( p2 != plast)         *p2 = '\n';
00746       wc = Max( wc , logrect[2]);
00747       if ( p == p1 ) 
00748         {
00749           yi=yi- logrect[3];
00750           break;
00751         }       
00752       else 
00753         {
00754           yi=(int) (yi-1.2*logrect[3]);
00755         }
00756     }
00757   *w = wc ;
00758   *h = *y - yi;
00759 }
00760 
00761 /*-----------------------------------------------------------------------------
00762  * Utilities : Allocation 
00763  *-----------------------------------------------------------------------------*/
00764 
00765 static void Myalloc(integer **xm, integer **ym, integer n, integer *err)
00766 {
00767   if ( n != 0) 
00768     {
00769       *xm= MALLOC( n * sizeof(integer) ) ;
00770       *ym= MALLOC( n * sizeof(integer) ) ;
00771       if ( *xm == 0 || *ym == 0 )
00772         {
00773           sciprint("malloc: Running out of memory\n");
00774           *err=1;
00775         }
00776     }
00777 }
00778 
00779 static void Myalloc1(integer **xm, integer n, integer *err)
00780 {
00781   if ( n != 0) 
00782     {
00783       if (( *xm= MALLOC( n * sizeof(integer)))  == 0  )
00784         {
00785           sciprint("malloc: Running out of memory\n");
00786           *err=1;
00787         }
00788     }
00789 }
00790 
00791 
00792 
00793 
00794 
00795 
00796 
00797 
00798 
00799 
00800 
00801 
00802 

Generated on Sun Mar 4 15:03:54 2007 for Scilab [trunk] by  doxygen 1.5.1