/*******************************************************************/
// "Меркурий"-"Правда" - open source переводчик
// распространяется в соответсвии с лицензией GNU v 2.0
//
// библиотека интерфейса с текстовым терминалом (OS/2 & M$-Windows)
// Анисимов Д.В. сегодня
/*******************************************************************/
# include <malloc.h>
# include <string.h>
# include <conio.h>
# include <mylib.h>
# include <s_defkey.h>
# include <video.h>
# define max(a,b) (((a) > (b)) ? (a) : (b))
# define min(a,b) (((a) < (b)) ? (a) : (b))
char *Symbol ;
uchar *Color ;
class t_Save_Screen
{ long *stek ; // ╖═╞╝╛╗╜═╜╗╔ ╝║╚═─│╔╘ ▄╙·═╜═
short l_stek ; // ╓╚╗╜╜═ ╛═──╗╒═ Stek
short j_stek ; // √╙═╖═│╔╚▀ ╞╝─╚╔╓╜╔ё╝ ─╒╝║╝╓╜╝ё╝ ║═╘│═
public:
t_Save_Screen( short l );
~t_Save_Screen( void );
void save ( short y1, short x1, short y2, short x2 );
void save_rame( short y1, short x1, short y2, short x2 );
void restore( void );
} ;
short Cur_X=0,Cur_Y=0 ;
short n_Line,n_Col ;
t_Save_Screen Save( 10000 ) ;
void s_rame( short y1, short x1, short y2, short x2, uchar f );
void s_quadro( short y1, short x1, short y2, short x2, uchar f );
/***************************************************************************/
void s_begin_schone( void )
{ short i ;
n_Line=50 ;
n_Col =78 ;
Symbol=(char *)Calloc( n_Line*n_Col,sizeof(char) );
Color =(uchar *)Calloc( n_Line*n_Col,1 );
for( i=0 ; i<n_Line*n_Col ; i++ )
Symbol[i]=' ';
textmode( C4350 );
}
/* ----------------------------------------------------------------------- */
void s_begin_schone( int argc, char *argv[] )
{ s_begin_schone( ); }
/* ----------------------------------------------------------------------- */
void s_end_schone( void )
{ ; }
/* ----------------------------------------------------------------------- */
void s_nacht( void )
{ long i ;
for( i=0 ; i<n_Line*n_Col ; i++ )
{ Symbol[i]=' ' ; Color[i]=0 ; }
}
/* ----------------------------------------------------------------------- */
void s_get_size( short *sx, short *sy )
{
*sx=n_Col ; *sy=n_Line ;
}
/* ----------------------------------------------------------------------- */
void s_text_yxf( short y, short x, uchar f, char *str )
{ short i,r1 ;
r1=n_Col*y+x ;
for( i=0 ; str[i]!=0 && str[i]!='\r' && str[i]!='\n' ; i++ )
{ Symbol[ r1+i ]=str[i] ;
Color [ r1+i ]=f ;
}
}
/* ----------------------------------------------------------------------- */
void s_text_yxf1( short y, short x, uchar f, char *str )
{ short i,r ;
r = n_Col*y+x ;
Symbol[ r ] = '\"' ; Color[ r ] = f ;
for( i=0 ; str[i]!=0 ; i++ )
{ r=n_Col*y+x+i+1 ;
Symbol[ r ] = str[i] ; Color[ r ] = f ;
}
r=r+1 ;
Symbol[ r ] = '\"' ; Color[ r ] = f ;
}
/* ----------------------------------------------------------------------- */
void s_text_yxfl( short y, short x, uchar f, short L, char *str )
{ short i,r1 ;
r1=n_Col*y+x ;
for( i=0 ; str[i]!=0 && i<L ; i++ )
{ Symbol[ r1+i ]=str[i] ;
Color [ r1+i ]=f ;
}
}
/* ----------------------------------------------------------------------- */
void s_text_yx( short y, short x, char *str )
{ short i,r1 ;
r1=n_Col*y+x ;
for( i=0 ; str[i]!=0 ; i++ )
Symbol[ r1+i ]=str[i] ;
}
/* ----------------------------------------------------------------------- */
void s_color_yxt( short y, short x, uchar *t, char *str )
{ short i,r1,r2,f ;
r1=n_Col*y+x ;
for( i=0 ; str[i]!=0 ; i++ )
{ f=0x07 ; r2=str[i] ;
if( '0'<=r2 && r2<= '9' ) f=t[r2-'0'] ;
if( 'a'<=r2 && r2<= 'z' ) f=t[r2-'a'+10] ;
Color[ r1+i ]=f ;
}
}
/* ----------------------------------------------------------------------- */
void s_foreground_yxt( short y, short x, uchar *t, char *str )
{ short i,r1,r2,f ;
r1=max_x*y+x ;
for( i=0 ; str[i]!=0 ; i++ )
{ f=0x07 ; r2=str[i] ;
if( '0'<=r2 && r2<= '9' ) f=t[r2-'0'] ;
if( 'a'<=r2 && r2<= 'z' ) f=t[r2-'a'+10] ;
Color[ r1+i ] = (0xf0 & Color[ r1+i ]) + (0x0f & f) ;
}
}
/* ----------------------------------------------------------------------- */
void s_rame1_f( short y1, short x1, short y2, short x2, uchar f )
{
s_rame( y1, x1, y2, x2, f );
}
/* ----------------------------------------------------------------------- */
void s_rame1_F( short y1, short x1, short y2, short x2, uchar f )
{
s_quadro( y1, x1, y2, x2, f );
s_rame ( y1, x1, y2, x2, f );
}
/* ----------------------------------------------------------------------- */
void s_rame2_f( short y1, short x1, short y2, short x2, uchar f )
{
s_rame ( y1, x1, y2, x2, f );
}
/* ----------------------------------------------------------------------- */
void s_rame2_F( short y1, short x1, short y2, short x2, uchar f )
{
s_quadro( y1, x1, y2, x2, f );
s_rame ( y1, x1, y2, x2, f );
}
/* ----------------------------------------------------------------------- */
void s_rame( short y1, short x1, short y2, short x2, uchar f )
{ short i,r ;
// зд©
// Ё Ё
// юды
for( i=x1+1 ; i<x2 ; i++ )
{ r=n_Col*y1+i ; Symbol[ r ]='д' ; Color[ r ]=f ;
r=n_Col*y2+i ; Symbol[ r ]='д' ; Color[ r ]=f ;
}
for( i=y1+1 ; i<y2 ; i++ )
{ r=n_Col*i+x1 ; Symbol[ r ]='Ё' ; Color[ r ]=f ;
r=n_Col*i+x2 ; Symbol[ r ]='Ё' ; Color[ r ]=f ;
}
r=n_Col*y1+x1 ; Symbol[ r ]='з' ; Color[ r ]=f ;
r=n_Col*y2+x1 ; Symbol[ r ]='ю' ; Color[ r ]=f ;
r=n_Col*y1+x2 ; Symbol[ r ]='©' ; Color[ r ]=f ;
r=n_Col*y2+x2 ; Symbol[ r ]='ы' ; Color[ r ]=f ;
}
/* ----------------------------------------------------------------------- */
void s_quadro( short y1, short x1, short y2, short x2, uchar f )
{ short i,j,r1 ;
for( j=y1+1 ; j<y2 ; j++ )
{ for( i=x1+1 ; i<x2 ; i++ )
{ r1=n_Col*j+i ;
Symbol[ r1 ]=' ' ;
Color [ r1 ]=f ;
}
}
}
/* ----------------------------------------------------------------------- */
void s_save_rame( short s1, short p1, short s2, short p2 )
{ Save.save_rame( s1, p1, s2, p2 ); }
void s_save( short s1, short p1, short s2, short p2 )
{ Save.save( s1, p1, s2, p2 ); }
void s_restore( void )
{ Save.restore( );
}
/* ----------------------------------------------------------------------- */
t_Save_Screen :: t_Save_Screen( short L )
{
stek=(long *)Calloc( L,sizeof(long) );
j_stek=0 ;
l_stek=L ;
}
/* ----------------------------------------------------------------------- */
t_Save_Screen :: ~t_Save_Screen( void )
{
if( stek!=NULL ){ free( stek ); stek=NULL ; }
j_stek=0 ;
l_stek=0 ;
}
/* ----------------------------------------------------------------------- */
void t_Save_Screen :: save( short y1, short x1, short y2, short x2 )
{ short i,j,r ;
for( i=y1 ; i<=y2 ; i++ )
{ for( j=x1 ; j<=x2 ; j++ )
{ r=n_Col*i+j ;
stek[j_stek++] = Color [ r ] ; /* ═│·╗║√│ */
stek[j_stek++] = Symbol[ r ] ; /* ─╗╛╒╝╚ */
}
}
stek[j_stek++]=(uchar )x1 ; stek[j_stek++]=(uchar )y1 ;
stek[j_stek++]=(uchar )x2 ; stek[j_stek++]=(uchar )y2 ;
stek[j_stek++]=0 ;
}
/* ----------------------------------------------------------------------- */
void t_Save_Screen :: save_rame( short s1, short p1, short s2, short p2 )
{ short i,r,r1,r2 ;
r1=n_Col*s1 ; r2=n_Col*s2 ;
for( i=p1 ; i<=p2 ; i++ )
{ r=r1+i ;
stek[j_stek++]=Symbol[ r ] ;
stek[j_stek++]=Color [ r ] ;
r=r2+i ;
stek[j_stek++]=Symbol[ r ] ;
stek[j_stek++]=Color [ r ] ;
}
for( i=s1 ; i<=s2 ; i++ )
{ r1=n_Col*i+p1 ;
stek[j_stek++]=Symbol[ r1 ] ;
stek[j_stek++]=Color [ r1 ] ;
r2=n_Col*i+p2 ;
stek[j_stek++]=Symbol[ r2 ] ;
stek[j_stek++]=Color [ r2 ] ;
}
stek[j_stek++]=(uchar )p1 ; stek[j_stek++]=(uchar )s1 ;
stek[j_stek++]=(uchar )p2 ; stek[j_stek++]=(uchar )s2 ;
stek[j_stek++]=1 ;
}
/* ----------------------------------------------------------------------- */
void t_Save_Screen :: restore( void )
{ short i,j,p1,p2,s1,s2,
r,r1,r2 ;
uchar f ;
f =stek[--j_stek] ;
s2=stek[--j_stek] ; p2=stek[--j_stek] ;
s1=stek[--j_stek] ; p1=stek[--j_stek] ;
if( f==1 )
{ for( i=s2 ; s1<=i ; i-- )
{ r=n_Col*i+p2 ;
Color [ r ] = stek[--j_stek] ;
Symbol[ r ] = stek[--j_stek] ;
r=n_Col*i+p1 ;
Color [ r ] = stek[--j_stek] ;
Symbol[ r ] = stek[--j_stek] ;
}
r1=n_Col*s1 ; r2=n_Col*s2 ;
for( i=p2 ; p1<=i ; i-- )
{ r=r2+i ;
Color [ r ] = stek[--j_stek] ;
Symbol[ r ] = stek[--j_stek] ;
r=r1+i ;
Color [ r ] = stek[--j_stek] ;
Symbol[ r ] = stek[--j_stek] ;
}
}
else
{ for( i=s2 ; s1<=i ; i-- )
for( j=p2 ; p1<=j ; j-- )
{ r=n_Col*i+j ;
Symbol[ r ] = stek[--j_stek] ; /* ─╗╛╒╝╚ */
Color [ r ] = stek[--j_stek] ; /* ═│·╗║√│ */
}
}
}
/* ----------------------------------------------------------------------- */
void s_redraw1( void )
{ short x,y,r ;
uchar f,f1=0 ;
for( y=0 ; y<n_Line ; y++ )
{ r=n_Col*y ;
gotoxy( 1,1+y );
for( x=0 ; x<n_Col ; x++ )
{ f=Color[r+x] ;
if( f!=f1 )
{ textcolor( f );
textbackground( f>>4 );
}
//if( (f&0x80)!=0 ) attr_on ( A_BLINK,NULL );
// else attr_off( A_BLINK,NULL );
//if( (f&0x08)!=0 ) attr_on ( A_BOLD ,NULL );
// else attr_off( A_BOLD ,NULL );
putch( Symbol[r+x] );
f1=f ;
}
}
gotoxy( 1+Cur_X,1+Cur_Y );
}
/* ----------------------------------------------------------------------- */
char Screen[ 16000 ];
void s_redraw( void )
{ short x,y,r,r1 ;
for( y=0 ; y<n_Line ; y++ )
{ r=n_Col*y ;
for( x=0 ; x<n_Col ; x++ )
{ r1=(n_Col*y+x)*2 ;
Screen[r1+1]=Color [r+x] ;
Screen[r1 ]=Symbol[r+x] ;
}
}
// puttext( 1,1,80,50,Screen );
puttext( 1,1,78,50,Screen );
gotoxy( 1+Cur_X,1+Cur_Y );
}
/* ----------------------------------------------------------------------- */
void s_goto_xy( short y, short x )
{
Cur_X=x ; Cur_Y=y ;
}
/* ----------------------------------------------------------------------- */
void s_getch( short *key1, short *key2 )
{
s_redraw( );
*key1=getch();
if( *key1==0 ) *key2=getch();
else *key2=0 ;
}
/***************************************************************************/
int s_shiftstatus( void )
{
return 0 ;
}
/***************************************************************************/
void s_set_size( short sx, short sy ){ ; }
void s_get_size( short &sx, short &sy ){ sx=n_Col ; sy=n_Line ; }
short s_get_sx( void ) { return n_Col ; }
short s_get_sy( void ) { return n_Line ; }
void x_set_fonts( void ){;}
short s_clear_cursor( void ){ return 0;}
void s_refresh(){;}