double* simulatePlant(double *state_vect, double *input_vect, double *state_op_vect, double sampling_time)
{
	double input_op_vect[4] = {0.0, 0.0, 0.0, 0.0};
	Eigen::Map<Eigen::VectorXd> x(state_vect, num_states_);
	Eigen::Map<Eigen::VectorXd> x_bar(state_op_vect, num_states_);
	Eigen::Map<Eigen::VectorXd> u(input_vect, num_inputs_);
	Eigen::Map<Eigen::VectorXd> u_bar(&input_op_vect[0], num_inputs_);
	
	Eigen::MatrixXd A = Eigen::MatrixXd::Identity(num_states_, num_states_);
	Eigen::MatrixXd B = Eigen::MatrixXd::Zero(num_states_, num_inputs_);
	
	Eigen::MatrixXd M = Eigen::MatrixXd::Zero(num_inputs_, num_inputs_);
	Eigen::VectorXd f_bar = Eigen::MatrixXd::Zero(num_inputs_, 1);
	
	double phi = x_bar(6);
	double theta = x_bar(7);
	double p = x_bar(9);
	double q = x_bar(10);
	double r = x_bar(11);
	
	M << 1., 1., 1., 1., 0., -1., 0., 1., 1., 0., -1., 0., -1., 1., -1., 1.;
	f_bar(0) = g_ * m_ / (Ct_ * cos(phi) * cos(theta));
	f_bar(1) = (Izz_ - Iyy_) * q * r / (Ct_ * d_);
	f_bar(2) = (Izz_ - Ixx_) * p * r / (Ct_ * d_);
	f_bar(3) = (Iyy_ - Ixx_) * p * q / Cq_;
	u_bar = M.inverse() * f_bar;
	u_bar = u_bar.cwiseSqrt();
	
	// Compute the matrices of the linear dynamic model	
	computeLTIModel(A, B, state_op_vect, input_op_vect);
	
	x = x_bar + A * (x - x_bar) + B * (u - u_bar);
		
	return state_vect;
}
Exemplo n.º 2
0
void draw_time_online(void)
{
    char str[10];
    long t=time(NULL)-ppplogtime;

    if(fullscreen)
        return;

// Box3D(x_maxx()-58,x_maxy()-15,x_maxx()-1,x_maxy());
    x_setfill(0,7); //light gray
    x_bar(x_maxx()-56,x_maxy()-13,x_maxx()-3,x_maxy()-2);
    sprintf(str,"%2d:%02d:%02d", (int)t/3600, (int)(t/60)%60 , (int)t%60 );
    x_settextjusty(2,2);
    x_setcolor(2); //red
    htmlfont(1,0);
    x_text_ib(x_maxx()-4,x_maxy()-15,(unsigned char *)str);
    x_settextjusty(0,2);        // always write text from upper left corner
}
Exemplo n.º 3
0
void outs( char far *s)        /* print a ASCIIZ string to stdio */
{
#ifdef CAV
 if (GLOBAL.clipdel == CLIPBOARD_DEFER_ADD
     || GLOBAL.clipdel == CLIPBOARD_ADDHOT)
return;
#endif

 if(fullscreen)
  return;

#ifndef TEXTONLY
 {
  char str[105], *ptr;
  int l;

//!!glennmcc: Aug 22, 2005 -- maintain size independant of fontshift
 htmlfont(1-user_interface.fontshift,0);
//  htmlfont(1,0);
  l=x_charmax((unsigned char *)s,x_maxx()-200);
  if(l>100)
   l=100;


 x_setfill(0,7);
#ifndef AGB

#ifdef CUSTOMER
  x_setcolor(15);
  x_line(2,x_maxy()-14,x_maxx()-2,x_maxy()-14);
  x_setcolor(8);
  x_line(2,x_maxy()-1,x_maxx()-2,x_maxy()-1);
  x_bar(2,x_maxy()-13,x_maxx()-2,x_maxy()-2);
#else
  x_setcolor(15);
  x_line(2,x_maxy()-14,x_maxx()-154,x_maxy()-14);
  x_setcolor(8);
  x_line(2,x_maxy()-1,x_maxx()-154,x_maxy()-1);
  x_bar(2,x_maxy()-13,x_maxx()-154,x_maxy()-2);
#endif // CUSTOMER

#else
  x_setcolor(15);
  x_line(2,x_maxy()-14,x_maxx()-2,x_maxy()-14);
  x_setcolor(8);
  x_line(2,x_maxy()-1,x_maxx()-2,x_maxy()-1);
  x_bar(2,x_maxy()-13,x_maxx()-2,x_maxy()-2);
#endif // AGB

  if(strlen(s)>l && l>3)
  {
   l-=3;
   makestr(str,s,l);
   strcat(str,"...");
   ptr=str;
  }
  else
   ptr=s;

  x_setcolor(0);
  x_text_ib(4,x_maxy()-15,(unsigned char *)ptr);

  //redraw time!
  lasttime[0]='\0';

 }
#else
  puts(s);
#endif
}
Exemplo n.º 4
0
//Draw time
void clock_and_timer(char *wait) //kresleni casu a screensaver
{
#ifndef POSIX
 struct  time t;
#endif 
 char cas2[32];

 timestr(cas2);
 if (strcmp(lasttime,cas2) == 0 ) return;

#ifndef CLEMTEST
#ifndef AGB
 if((ScreenSaver>0l||lasttime[0]=='*') && SecondsSleeping>(long)ScreenSaver*60l)
 {
 /*
 if(1)
 {
  mouseoff();
//  strcpy(buf,"system\\scrnsvrs\\stin.exe");
//  closebat(buf,RESTART_REDRAW);
//  GLOBAL.willexecute=willexecute(buf);
//  GLOBAL.gotolocation=1;

  execl("system\\scrnsvrs\\stin.exe","system\\scrnsvrs\\stin.exe",NULL);
  graphicsinit(arachne.graphics); // XLOPIF SVGA GRAPHICS
 }
 else
 */
 {
  int j;
  int fullscr[4]={0,0,0,0};
  int x,y,px,py,done=0;

  fullscr[2]=x_maxx();
  fullscr[3]=x_maxy();
  {
#define MAX_CERFS 20
#define MAX_TRACK 100
   int xx[MAX_CERFS],yy[MAX_CERFS],xs[MAX_CERFS],ys[MAX_CERFS],col[MAX_CERFS];
   int x2[MAX_CERFS],y2[MAX_CERFS],xs2[MAX_CERFS],ys2[MAX_CERFS];
   int tracklen[MAX_CERFS];
   int trackcnt[MAX_CERFS];
   int trackbuf[MAX_CERFS];
   int xtr[MAX_CERFS][MAX_TRACK],ytr[MAX_CERFS][MAX_TRACK];
   int xt2[MAX_CERFS][MAX_TRACK],yt2[MAX_CERFS][MAX_TRACK];
   int pom;
   int cerfs=MAX_CERFS/2;
   char barva0[6]={1,3,9,11,7,8};
   char barva1[6]={1,2,3,6,10,14};
   char *barva;
   char *value;
#ifdef HICOLOR
   int dc=1,p=0;
#endif

   //----------------------------screensaver
   mouseoff();
   x_cleardev();
#ifdef LINUX

#define RND(X) (random()*X)

   srandom(time(NULL));
#else

#define RND(X) random(X)

   randomize();
#endif

   value=configvariable(&ARACHNEcfg,"ScreenSaverColors",NULL);
   if(value && *value=='1')
    barva=barva1;
   else
    barva=barva0;

   value=configvariable(&ARACHNEcfg,"ScreenSaverMess",NULL);
   if(value)
   {
    cerfs=atoi(value);
    if(cerfs<1)
     cerfs=1;
    if(cerfs>MAX_CERFS)
     cerfs=MAX_CERFS;
   }

   value=configvariable(&ARACHNEcfg,"ScreenSaverStyle",NULL);

   j=0;
   while(j<cerfs) //deklarace car
   {
    xx[j]=100+RND(fullscr[2]-200);
    yy[j]=100+RND(fullscr[3]-200);

    if(*value=='C')
     x2[j]=10+RND(fullscr[3]/3);
    else
    {
     x2[j]=120+RND(fullscr[2]-240);
     y2[j]=120+RND(fullscr[3]-240);
    }

    if(*value=='R')
     {xs[j]=RND(2);if(xs[j]==0)xs[j]=-1;}
    else
     {xs[j]=RND(3);if(xs[j]==2)xs[j]=-1;}
    ys[j]=RND(2);if(ys[j]==0)ys[j]=-1;

    xs2[j]=RND(2);if(xs2[j]==0)xs2[j]=-1;
    if(*value=='R')
     {ys2[j]=RND(2);if(ys2[j]==0)ys2[j]=-1;}
    else
     {ys2[j]=RND(3);if(ys2[j]==2)ys2[j]=-1;}
    col[j]=barva[RND(6)];
    pom=RND(MAX_TRACK-10)+10;
    tracklen[j]=pom;
    trackcnt[j]=1; //odsud se bude cist
    trackbuf[j]=0; //sem se bude zapisovat
    while(pom>=0)
    {
     xtr[j][pom]=0;
     ytr[j][pom]=0;
     xt2[j][pom]=0;
     yt2[j][pom]=0;
     pom--;
    }
    j+=1;
   }//loop
   j=0;

   ImouseRead( &x, &y );
   ImouseWait();
   px=x;py=y;
   while(!done) //animace
   {
    if(wait!=NULL)
    {
#ifdef POSIX
     time_t t=time(NULL);
     struct tm *gt=gmtime(&t);
    
     sprintf(cas2,"%2d:%02d:%02d",
      gt->tm_hour, gt->tm_min, gt->tm_sec );
#else
     gettime(&t);
     sprintf(cas2,"%2d:%02d:%02d", t.ti_hour, t.ti_min, t.ti_sec );
#endif
     if(strstr(wait,cas2)!=NULL)break;
    }//endif

#ifndef LINUX
    if(g_PrtScr)
    {
     g_PrtScr = 0;
     PrintScreen2BMP(0);
     goto out;
    }
#endif
    
    //mazani stopy
    x_setcolor(0);
#ifndef LINUX    
    if(*value=='C')
     x_circle(xtr[j][trackcnt[j]],ytr[j][trackcnt[j]],xt2[j][trackcnt[j]]);
    else
#endif    
    if(*value=='R')
     x_rect(xtr[j][trackcnt[j]],ytr[j][trackcnt[j]],xt2[j][trackcnt[j]],yt2[j][trackcnt[j]]);
    else
     x_line(xtr[j][trackcnt[j]],ytr[j][trackcnt[j]],xt2[j][trackcnt[j]],yt2[j][trackcnt[j]]);
    if(++trackcnt[j]>tracklen[j])trackcnt[j]=0;
    xtr[j][trackbuf[j]]=xx[j];
    ytr[j][trackbuf[j]]=yy[j];
    xt2[j][trackbuf[j]]=x2[j];
    yt2[j][trackbuf[j]]=y2[j];
    if(++trackbuf[j]>tracklen[j])trackbuf[j]=0;

    //kresleni nove cary
    x_setcolor(col[j]);
#ifndef LINUX
    if(*value=='C')
     x_circle(xx[j],yy[j],x2[j]);
    else 
#endif
    if(*value=='R')
     x_rect(xx[j],yy[j],x2[j],y2[j]);
    else
     x_line(xx[j],yy[j],x2[j],y2[j]);
    xx[j]+=xs[j];
    yy[j]+=ys[j];
    x2[j]+=xs2[j];
    y2[j]+=ys2[j];
    if(xx[j]>=fullscr[2]||xx[j]<=0)xs[j]=-xs[j];
    if(yy[j]>=fullscr[3]||yy[j]<=0)ys[j]=-ys[j];
    if(x2[j]>=fullscr[2]||x2[j]<=0)xs2[j]=-xs2[j];
    if(y2[j]>=fullscr[3]||y2[j]<=0)ys2[j]=-ys2[j];
    j++;
    if(j==cerfs)
     j=0;

    if(*value=='C' || j%10==0)
    {
//!!RAY: Sep 30, 2006 -- CTRL key will now deactivate the screensaver
     if((bioskey(1) || bioskey(2) &4) || ImouseRead( &x, &y ) || x!=px || y!=py)
//     if(bioskey(1) || ImouseRead( &x, &y ) || x!=px || y!=py)
      done=1;
    }
    px=x;py=y;

#ifdef HICOLOR
   if(xg_256 == MM_Hic)
   {
    if(p>20*cerfs)
    {
     dc=-dc;
     p=0;
    }
    p++;
    if(p%cerfs==0)
    {
     int c=1;
     while(c<16)
     {
      if(c%2)
       dc=-dc;
      Iipal[c*3]+=dc;
      if(Iipal[c*3]>63)
       Iipal[c*3]=63;
      if(Iipal[c*3]<0)
       Iipal[c*3]=0;
      Iipal[c*3+1]+=dc;
      if(Iipal[c*3+1]>63)
       Iipal[c*3+1]=63;
      if(Iipal[c*3+1]<0)
       Iipal[c*3+1]=0;
      Iipal[c*3+2]+=dc;
      if(Iipal[c*3+2]>63)
       Iipal[c*3+2]=63;
      if(Iipal[c*3+2]<0)
       Iipal[c*3+2]=0;
      c++;
     }//loop
    }
    x_palett( 16, Iipal);
   }
#endif

   }//loop
   if(bioskey(1))bioskey(0);
   ImouseWait();
   out:
#ifdef HICOLOR
   if(xg_256 == MM_Hic)
    initpalette();
#endif
   x_cleardev();
   RedrawALL();
   DrawTitle(1);
   if(lasttime[1]=='*')
    redraw=4;
   else
    redraw=3;
  }
 }
  SecondsSleeping=0l;
 }//endif screensaver
#endif// AGB
#endif// CLEMTEST

#ifndef GGI //it doesn't make sense to show time in X11 app..
 if(!fullscreen)
 {
  x_setfill(0,7); //sediva
  if(mousey>x_maxy()-30 && mousex>x_maxx()-230)
   mouseoff();
 #ifdef CUSTOMER
  x_bar(x_maxx()-56,x_maxy()-13,x_maxx()-2,x_maxy()-2);
  x_setcolor(0); //cerna
  htmlfont(1,0);
  x_text_ib( x_maxx()-56,x_maxy()-15,(unsigned char *)cas2);

 #elif AGB

  x_bar(x_maxx()-56,x_maxy()-13,x_maxx()-2,x_maxy()-2);
  x_setcolor(0); //cerna
  htmlfont(1,0);
  x_text_ib( x_maxx()-56,x_maxy()-15,(unsigned char *)cas2);

 #else

  x_bar(x_maxx()-206,x_maxy()-13,x_maxx()-156,x_maxy()-2);
  x_setcolor(0); //cerna
//!!glennmcc: Aug 22, 2005
//prevent fontshift >0 from causing the clock to go 'off the right'
  htmlfont(0-user_interface.fontshift,0);
//  htmlfont(1,0);
  x_text_ib( x_maxx()-206,x_maxy()-15,(unsigned char *)cas2);

 #endif
  if(mousey>x_maxy()-30 && mousex>x_maxx()-230)
   mouseon();
 }
#endif

 if(lasttime[0]) //not if time redraw was forced!
 {
  SecondsSleeping++;
  if(GLOBAL.timeout)
   GLOBAL.secondsleft--;
  if(ppplogtime && tcpip)
   draw_time_online();
 }

 strcpy(lasttime,cas2);
}//end sub
void computeLTIModel(Eigen::MatrixXd &A, Eigen::MatrixXd &B, double* state_op_vect, double* input_op_vect)
{
	Eigen::Map<Eigen::VectorXd> x_bar(state_op_vect, num_states_);
	Eigen::Map<Eigen::VectorXd> u_bar(input_op_vect, num_inputs_);
	Eigen::MatrixXd U = Eigen::MatrixXd::Zero(num_inputs_, num_inputs_);

	double phi = x_bar(6);
	double theta = x_bar(7);
	double psi = x_bar(8);
	double p = x_bar(9);
	double q = x_bar(10);
	double r = x_bar(11);
	double U1 = Ct_ * (pow(u_bar(0),2) + pow(u_bar(1),2) + pow(u_bar(2),2) + pow(u_bar(3),2));
	
	
	A(0,3) = ts_;
	A(1,4) = ts_;
	A(2,5) = ts_;
	A(3,6) = ts_ * (sin(psi) * cos(phi) - cos(psi) * sin(theta) * sin(phi)) * U1 / m_;
	A(3,7) = ts_ * (cos(psi) * cos(theta) * cos(phi)) * U1 / m_;
	A(3,8) = ts_ * (cos(psi) * sin(phi) - sin(psi) * sin(theta) * cos(psi)) * U1 / m_;
	A(4,6) = - ts_ * (sin(psi) * sin(theta) * sin(phi) + cos(psi) * cos(phi)) * U1 / m_;
	A(4,7) = ts_ * (sin(psi) * cos(theta) * cos(psi)) * U1 / m_;
	A(4,8) = ts_ * (cos(psi) * sin(theta) * cos(phi) + sin(psi) * sin(phi)) * U1 / m_;
	A(5,6) = - ts_ * (cos(theta) * sin(phi)) * U1 / m_;
	A(5,7) = - ts_ * (sin(theta) * cos(phi)) * U1 / m_;	
	A(6,6) = ts_ * (q * cos(phi) - r * sin(phi)) * tan(theta);
	A(6,7) = ts_ * (q * sin(phi) + r * cos(phi)) / (cos(theta) * cos(theta));
	A(6,9) = ts_;
	A(6,10) = ts_ * sin(phi) * tan(theta);
	A(6,11) = ts_ * cos(phi) * tan(theta);
	A(7,6) = - ts_ * (q * sin(phi) + r * cos(phi));
	A(7,10) = ts_ * cos(phi);
	A(7,11) = - ts_ * sin(phi);
	A(8,6) = ts_ * (q * cos(phi) - r * sin(phi)) / cos(theta);
	A(8,7) = ts_ * (q * sin(phi) + r * cos(phi)) * tan(theta) / cos(theta);
	A(8,10) = ts_ * sin(phi) / cos(theta);
	A(8,11) = ts_ * cos(phi) / cos(theta);
	A(9,10) = ts_ * r * (Iyy_ - Izz_) / Ixx_;
	A(9,11) = ts_ * q * (Iyy_ - Izz_) / Ixx_;
	A(10,9) = ts_ * r * (Izz_ - Ixx_) / Iyy_;
	A(10,11) = ts_ * p * (Izz_ - Ixx_) / Iyy_;
	A(11,9) = ts_ * q * (Ixx_ - Iyy_) / Izz_;
	A(11,10) = ts_ * p * (Ixx_ - Iyy_) / Izz_;
	
	B(3,0) = ts_ * (cos(psi) * sin(theta) * cos(phi) + sin(psi) * sin(phi)) / m_;		
	B(4,0) = ts_ * (sin(psi) * sin(theta) * cos(phi) - cos(psi) * sin(phi)) / m_;	
	B(5,0) = ts_ * cos(theta) * cos(phi) / m_;
	B(9,1) = ts_ * d_ / Ixx_;
	B(10,2) = ts_ * d_ / Iyy_;
	B(11,3) = ts_ / Izz_;
	
	U(0,0) = 2 * Ct_ * u_bar(0);
	U(0,1) = 2 * Ct_ * u_bar(1);
	U(0,2) = 2 * Ct_ * u_bar(2);
	U(0,3) = 2 * Ct_ * u_bar(3);
	U(1,1) = - 2 * Ct_ * u_bar(1);
	U(1,3) = 2 * Ct_ * u_bar(3);
	U(2,0) = 2 * Ct_ * u_bar(0);
	U(2,2) = - 2 * Ct_ * u_bar(2);
	U(3,0) = - 2 * Cq_ * u_bar(0);
	U(3,1) = 2 * Cq_ * u_bar(1);
	U(3,2) = - 2 * Cq_ * u_bar(2);
	U(3,3) = 2 * Cq_ * u_bar(3);
	
	B = B * U; 
}
Exemplo n.º 6
0
void  x_ellipse(int x1, int y1, int rx, int ry )
{
   int    x, y, istyle = 0;
   long   p, n, test, pa, na;
   int    xz,xk,loc_style;
#if HI_COLOR
   int    SaveMode;
   SaveMode = xg_hipalmod;
   xg_hipalmod = 1;
#endif

   loc_style = xg_style;
   if((xg_flag & 0x0004) != 0)  // Vyplnene kolecko (ne carkovane)
     { xg_style = 0xFFFF;
     }

   xg_notview = 1;    // Zadny posun v X_BAR

   rx = (int) ((long)rx * 10000L / (long)xg_xr); /* prepocet    */
   ry = (int) ((long)ry * 10000L / (long)xg_yr); /* aspectratio */

   x1 += xg_view[0];                             /* posunuti    */
   y1 += xg_view[1];                             /* viewportu   */

   if( rx < 1 || ry < 1 )
   {
     x_rect( x1-rx, y1-ry, x1+rx, y1+ry );
     goto Ok;
   }

   pa = (long) rx * (long) rx;                   /* inicializace */
   test = (long) ( -2 * ry + 1 ) * pa;
   pa *= 4L;
   p = pa * (long) (1 - ry);
   n = 2L * (long) ry * (long) ry;
   na = 2L * n;
   x = 0;
   y = ry;

   if ( ( x1-rx ) >= xg_view[0] && ( x1+rx ) <= xg_view[2] &&
	( y1-ry ) >= xg_view[1] && ( y1+ry ) <= xg_view[3] )
   {
     for ( ; ; )   /* elipsa uvnitr viewportu - rychly cyklus */
     {
       if ( xg_style & ( 1 << (istyle++ % 16)))
       {
	 if((xg_flag & 0x0004) == 0)    // NEVYPLNENA
	 {
	 x_putpix( x1+x, y1+y, xg_color );
	 x_putpix( x1+x, y1-y, xg_color );
	 x_putpix( x1-x, y1+y, xg_color );
	 x_putpix( x1-x, y1-y, xg_color );
	 }
	 else                           // VYPLNENA
	 {
	 x_bar(x1-x,y1+y,x1+x,y1+y);
	 x_bar(x1-x,y1-y,x1+x,y1-y);
	 }
       }
       if ( ry < 0 ) break;
       if ( test < 0L )
	 {  x++ ; test += n; n += na; }
       else
	 {  y--; test += p; p += pa; if ( p > 0L) ry = -1; }
     }
   }
   else
   {
     for ( ; ; )   /* elipsa vne viewportu - pomaly cyklus */
     {
       if ( xg_style & ( 1 << (istyle++ % 16)))
       {
	 if((xg_flag & 0x0004) == 0)    // NEVYPLNENA
	 {
	 if INVIEW(x1+x, y1+y) x_putpix( x1+x, y1+y, xg_color );
	 if INVIEW(x1+x, y1-y) x_putpix( x1+x, y1-y, xg_color );
	 if INVIEW(x1-x, y1+y) x_putpix( x1-x, y1+y, xg_color );
	 if INVIEW(x1-x, y1-y) x_putpix( x1-x, y1-y, xg_color );
	 }
	 else
	 {
	 xz = max(x1-x,xg_view[0]);
	 if(xz < xg_view[2])
	  {
	  xk = min(x1+x,xg_view[2]);
	  if((y1-y) >= xg_view[1] && (y1-y) <= xg_view[3])
	   x_bar(xz,y1-y,xk,y1-y);
	  if((y1+y) >= xg_view[1] && (y1+y) <= xg_view[3])
	   x_bar(xz,y1+y,xk,y1+y);
	  }
	 }
       }
       if ( ry < 0 ) break;
       if ( test < 0L )
	 {  x++ ; test += n; n += na; }
       else
	 {  y--; test += p; p += pa; if ( p > 0L) ry = -1; }
     }
   }
Exemplo n.º 7
0
//REDRAW SCROLL BARS
void ScrollDraw(struct ScrollBar *scroll,int fromx,long fromy)
{
 long pom;
 int zblo=0;

 if(user_interface.scrollbarstyle == 'C') //C = Clarence ;)
  return;

 if(!scroll->onscrollx)
 {
  if(scroll->total_y<=scroll->ysize || scroll->total_y==0)
  {
   scroll->yscrsz=scroll->max_yscrsz;
   scroll->yscr=0;
  }
  else
  {
   pom=(long)scroll->ysize*(long)scroll->max_yscrsz;
   scroll->yscrsz=(int)(pom/scroll->total_y)+1;
   if(scroll->yscrsz<8)
   {
    scroll->yscrsz=8;
    if(scroll->yscrsz>scroll->max_yscrsz)scroll->yscrsz=scroll->max_yscrsz;
   }

   pom=fromy*(long)scroll->max_yscrsz;
   scroll->yscr=(int)(pom/scroll->total_y);

//!!Ray: Dec 17, 2007 -- fix BSOD
// Return if overflow:
if(scroll->yscr < 0) return;
//!!Ray: end

   if(scroll->yscr+scroll->yscrsz>scroll->max_yscrsz)scroll->yscr=scroll->max_yscrsz-scroll->yscrsz;
  }

  if(!scroll->yvisible)
   return;

  x_setfill(0,0);
  if(scroll->scrollbarstyle)
   zblo=1;

  scroll->yscr+=scroll->gap;

  if(scroll->yscr>0)
   x_bar(scroll->xtop+scroll->xsize+1,scroll->ytop+scroll->gap,
         scroll->xtop+scroll->xsize+user_interface.scrollbarsize,scroll->ytop+scroll->yscr-1);
  if(scroll->yscr+scroll->yscrsz<scroll->max_yscrsz+scroll->gap)
   x_bar(scroll->xtop+scroll->xsize+1,scroll->ytop+scroll->yscr+scroll->yscrsz+1,
         scroll->xtop+scroll->xsize+user_interface.scrollbarsize,scroll->ytop+scroll->max_yscrsz+scroll->gap+zblo);

  Box3Dv(scroll->xtop+scroll->xsize+1,scroll->ytop+scroll->yscr,
        scroll->xtop+scroll->xsize+user_interface.scrollbarsize,scroll->ytop+scroll->yscr+scroll->yscrsz+zblo);

  //ozdobicky (tr.: ornaments)
  if(scroll->yscrsz>24)
  {
   int ymid=scroll->yscrsz/2;
   int xleft=scroll->xtop+scroll->xsize+3;
   int xright=scroll->xtop+scroll->xsize+user_interface.scrollbarsize-3;
   int yyy=scroll->ytop+scroll->yscr+ymid;

   x_setcolor(15);
   x_line(xleft,yyy,
          xright,yyy);
   x_line(xleft,yyy-4,
          xright,yyy-4);
   x_line(xleft,yyy+4,
          xright,yyy+4);
   x_line(xleft,yyy-8,
	  xright,yyy-8);
   x_line(xleft,yyy+8,
	  xright,yyy+8);
   x_setcolor(8);
   x_line(xleft,yyy-1,
	  xright,yyy-1);
   x_line(xleft,yyy-5,
	  xright,yyy-5);
   x_line(xleft,yyy+3,
	       xright,yyy+3);
   x_line(xleft,yyy-9,
	  xright,yyy-9);
   x_line(xleft,yyy+7,
	  xright,yyy+7);
  }
 }

 if(scroll->onscrolly)
 {
#ifdef GGI
  Smart_ggiFlush();
#endif 
  return;
 }
 
 if(!scroll->xvisible || scroll->total_x<=scroll->xsize || scroll->total_x==0)
 {
  scroll->xscrsz=scroll->max_xscrsz;
  scroll->xscr=0;
  if(!scroll->xvisible)
   return;
 }
 else
 {
  pom=(long)scroll->xsize*(long)scroll->max_xscrsz;
  scroll->xscrsz=(int)(pom/scroll->total_x)+1;
  if(scroll->xscrsz<8)
  {
   scroll->xscrsz=8;
   if(scroll->xscrsz>scroll->max_xscrsz)scroll->xscrsz=scroll->max_xscrsz;
  }

  pom=fromx*(long)scroll->max_xscrsz;
  scroll->xscr=(int)(pom/scroll->total_x);
  if(scroll->xscr+scroll->xscrsz>scroll->max_xscrsz)scroll->xscr=scroll->max_xscrsz-scroll->xscrsz;
 }

 x_setfill(0,0);
 if(scroll->scrollbarstyle!='N')
  zblo=0;

 scroll->xscr+=scroll->gap+zblo;
 if(scroll->xscr>0)
   x_bar(scroll->xtop+scroll->gap+zblo,scroll->ytop+scroll->ysize+1,
         scroll->xtop+scroll->xscr-1,scroll->ytop+scroll->ysize+user_interface.scrollbarsize);
 if(scroll->xscr+scroll->xscrsz<scroll->max_xscrsz+scroll->gap+zblo)
   x_bar(scroll->xtop+scroll->xscr+scroll->xscrsz+1,scroll->ytop+scroll->ysize+1,
         scroll->xtop+scroll->max_xscrsz+scroll->gap+zblo,scroll->ytop+scroll->ysize+user_interface.scrollbarsize);

 Box3Dh(scroll->xtop+scroll->xscr,scroll->ytop+scroll->ysize+1,
       scroll->xtop+scroll->xscr+scroll->xscrsz,scroll->ytop+scroll->ysize+user_interface.scrollbarsize);

 if(scroll->xscrsz>24)//ozdobicky...  (tr.: ornaments...)
 {
  int xmid=scroll->xscrsz/2;
  int yend=scroll->ytop+scroll->ysize+3;
  int ystart=scroll->ytop+scroll->ysize+user_interface.scrollbarsize-3;
  int xxx=scroll->xtop+scroll->xscr+xmid;

  x_setcolor(15);

  x_line(xxx,yend,
         xxx,ystart);
  x_line(xxx-4,yend,
         xxx-4,ystart);
  x_line(xxx+4,yend,
         xxx+4,ystart);
  x_line(xxx-8,yend,
         xxx-8,ystart);
  x_line(xxx+8,yend,
         xxx+8,ystart);
  x_setcolor(8);
  x_line(xxx-1,yend,
         xxx-1,ystart);
  x_line(xxx-5,yend,
         xxx-5,ystart);
  x_line(xxx+3,yend,
         xxx+3,ystart);
  x_line(xxx-9,yend,
         xxx-9,ystart);
  x_line(xxx+7,yend,
         xxx+7,ystart);
 }
#ifdef GGI
  Smart_ggiFlush();
#endif 

}