drawLegendEntity.c

Go to the documentation of this file.
00001 /*------------------------------------------------------------------------*/
00002 /* file: drawLegendEntity.c                                               */
00003 /* Copyright INRIA 2006                                                   */
00004 /* Authors : Jean-Baptiste Silvy                                          */
00005 /* desc : Contains functions needed to draw a legend handle               */
00006 /*------------------------------------------------------------------------*/
00007 
00008 #include "drawLegendEntity.h"
00009 #include "GetProperty.h"
00010 #include "Xcall1.h"
00011 #include "periScreen.h"
00012 #include "MALLOC.h"
00013 #include "sciprint.h"
00014 #include "PloEch.h"
00015 
00016 
00017 /*----------------------------------------------------------------------------------------*/
00024 void Legends( integer * style, integer * n1, char * legend )
00025 {
00026   int rect[4] ;
00027   int xx = 0  ;
00028   int yy = 0  ;
00029   char *leg,*loc;
00030   double xi,xi1,yi,yi1,xoffset,yoffset;  
00031   int i;
00032   integer verbose=0,narg,xz[10],fg;
00033 
00034   loc = MALLOC( (strlen(legend)+1)*sizeof(char));
00035   if ( loc == NULL )
00036   {
00037     sciprint( "Impossible to draw legends, memory full.\n" ) ;
00038     return ;
00039   }
00040 
00041 
00042   C2F(dr)("xstringl","pl",&xx,&yy,rect,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);      
00043 
00044   C2F(dr)("xget","foreground",&verbose,&fg,&narg,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
00045   C2F(dr)("xget","line style",&verbose,xz,&narg,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
00046   C2F(dr)("xset","line style",(i=1,&i),PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
00047 
00048   C2F(dr)("xget","color",&verbose,xz+6,&narg,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
00049   C2F(dr)("xset","color",&fg,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
00050 
00051   strcpy(loc,legend);
00052 
00053   /* length for the tick zone associated to the legend */
00054   xoffset= (Cscale.wdim[0]*Cscale.subwin_rect[2]*(1- Cscale.axis[0] - Cscale.axis[1]))/12.0;
00055   /* y offset between legends */
00056   yoffset= (Cscale.wdim[1]*Cscale.subwin_rect[3]*Cscale.axis[3])/5.0;
00057 
00058   /* x position of the legends in pixel if n <= 3 */ 
00059   xi = Cscale.wdim[0]*Cscale.subwin_rect[2]*Cscale.axis[0]
00060   + Cscale.subwin_rect[0]*Cscale.wdim[0];
00061   /* x position of the legends in pixel if n > 3 */ 
00062   xi1 = xi + Cscale.wdim[0]*Cscale.subwin_rect[2]*(1.0 - (Cscale.axis[0]+Cscale.axis[1]))/2.0 ;
00063 
00064   /* y position of x-axis in pixel */
00065   yi1 = Cscale.wdim[1]*Cscale.subwin_rect[3]*Cscale.axis[2]
00066   + Cscale.subwin_rect[1]*Cscale.wdim[1] 
00067   + Cscale.subwin_rect[3]*Cscale.wdim[1]*(1.0 - (Cscale.axis[2]+Cscale.axis[3])) ; /* ouf !! */
00068 
00069   for ( i = 0 ; i < *n1 && i < 6 ; i++)
00070   {  
00071     integer xs,ys,flag=0,polyx[2],polyy[2],lstyle[1];
00072     double angle=0.0;
00073 
00074     if (i >= 3)
00075     { 
00076       /* down left point for string display */
00077       xi= xi1;
00078       yi= yi1 +(i-3)*yoffset+3.0*yoffset;}
00079     else
00080     { 
00081       yi= yi1 + (i)*yoffset+3.0*yoffset;
00082     }
00083     xs=inint(xi+1.2*xoffset);
00084     ys=inint(yi);
00085 
00086     if ( i==0) leg=strtok(loc,"@"); else leg=strtok((char *)0,"@");
00087     if (leg != 0) 
00088     {
00089       C2F(dr)("xset","color",&fg,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
00090       C2F(dr)("xstring",leg,&xs,&ys,PI0,&flag,PI0,PI0,&angle,PD0,PD0,PD0,0L,0L);
00091       C2F(dr)("xset","color",xz+6,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
00092       if (style[i] > 0)
00093       { 
00094         integer n=1,p=2;
00095         polyx[0]=inint(xi);polyx[1]=inint(xi+xoffset);
00096         polyy[0]=inint(yi - rect[3]/2.0);polyy[1]=polyy[0];
00097         lstyle[0]=style[i];
00098         C2F(dr)("xpolys","v",polyx,polyy,lstyle,&n,&p
00099           ,PI0,PD0,PD0,PD0,PD0,0L,0L);
00100       }
00101       else
00102       { 
00103         integer n=1,p=1;
00104         polyx[0]=inint(xi+xoffset);
00105         polyy[0]=inint(yi- rect[3]/2.0);
00106         lstyle[0]=style[i];
00107         C2F(dr)("xpolys","v",polyx,polyy,lstyle,&n,&p
00108           ,PI0,PD0,PD0,PD0,PD0,0L,0L);
00109       }
00110     }
00111   }
00112   FREE(loc);
00113   C2F(dr)("xset","line style",xz,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
00114 
00115 }
00116 
00117 
00118 /*----------------------------------------------------------------------------------------*/
00119 int drawLegendEntity( sciPointObj * pObj )
00120 {
00121   sciLegend * ppLegend = pLEGEND_FEATURE(pObj) ;
00122 
00123   int verbose = 0 ;
00124   int foreground = sciGetForeground( pObj ) ;
00125   int fontWidth = sciGetFontDeciWidth( pObj ) / 100 ;
00126   int fontStyle = sciGetFontStyle( pObj ) ;
00127   int oldForeground = 0 ;
00128   int oldDashStyle = 0 ;
00129   int v = 0 ;
00130   double dv = 0.0 ;
00131   int i ;
00132 
00133   if ( !sciGetVisibility(pObj) ) { return 0 ; }
00134 
00135   C2F(dr1)("xget", "dashes", &verbose, &oldDashStyle, &v, &v, &v,&v, &dv, &dv, &dv, &dv, 5L, 4096);
00136   C2F(dr1)("xget", "foreground", &verbose, &oldForeground, &v, &v, &v, &v, &dv, &dv, &dv, &dv, 5L, 4096);
00137 
00138 
00139 #ifdef _MSC_VER 
00140   flag_DO=MaybeSetWinhdc();
00141 #endif
00142   C2F (dr1) ("xset", "dashes", &foreground, &foreground, &v, &v, &v, &v, &dv,
00143     &dv, &dv, &dv, 5L, 4096);
00144   C2F (dr1) ("xset", "foreground", &foreground, &foreground, &v, &v, &v, &v,
00145     &dv, &dv, &dv, &dv, 5L, 4096);
00146 
00147   C2F(dr)("xset","font",&fontStyle,&fontWidth,&v, &v, &v, &v,&dv, &dv, &dv, &dv, 5L, 4L);
00148 
00149 
00150   /*permet la mise a jour des legendes correspondantes aux entites associees */
00151   for ( i = 0; i < ppLegend->nblegends; i++ )
00152   {
00153     sciPointObj * curObj = ppLegend->pptabofpointobj[i] ;
00154     if ( sciGetIsMark( curObj ) )
00155     {
00156       ppLegend->pstyle[i] = -sciGetMarkStyle( curObj );
00157     }
00158     else
00159     {
00160       ppLegend->pstyle[i] = sciGetForeground( curObj );
00161     }
00162   }
00163   Legends( ppLegend->pstyle, &(ppLegend->nblegends), getStrMatElement(sciGetText(pObj),0,0) ) ;
00164 
00165 
00166   /* restore the graphic context */
00167 
00168   C2F (dr1) ("xset", "dashes", &oldDashStyle, &v, &v, &v, &v, &v, &dv, &dv, &dv, &dv, 5L, 6L);
00169   C2F (dr1) ("xset", "foreground", &oldForeground, &v, &v, &v, &v, &v, &dv, &dv, &dv, &dv, 5L, 10L);
00170 #ifdef _MSC_VER 
00171   if ( flag_DO == 1) ReleaseWinHdc ();
00172 #endif
00173 
00174   return 0 ;
00175 
00176 }
00177 /*----------------------------------------------------------------------------------------*/

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