home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 1997 March
/
VPR9703A.ISO
/
VPR_DATA
/
DOGA
/
SOURCES
/
POLYEDIT.LZH
/
MODEL
/
TLINE.C
< prev
next >
Wrap
C/C++ Source or Header
|
1996-01-19
|
4KB
|
215 lines
/*
* Line for Text VRAM
*
* 1993.11.21 T.Kobayashi
*/
#include <stdio.h>
#include <stdlib.h>
#include <doslib.h>
#define VRAM ((unsigned short*)0xE20000)
#define HWORD (1024/16)
#define PutMask( p, mask, code ) { \
if ( code == 0 ) *p &= ~( mask ); \
else if ( code == 1 ) *p |= ( mask ); \
else *p ^= ( mask ); \
}
#define swap( a, b ) { int _w ; _w = a ; a = b ; b = _w ; }
/*
* code 0 : clear
* 1 : set
* 2 : xor
*/
#if 0
extern void TextLine( int, int, int, int, int );
void main( argc, argv )
int argc ;
char *argv[] ;
{
TextLine( atoi( argv[1] ), atoi( argv[2] ), atoi( argv[3] ), atoi( argv[4] ),
atoi( argv[5] ) );
}
#endif
static void TextLine1( int, int, int, int, int );
static void TextLine2( int, int, int, int, int );
static void TextLine3( int, int, int, int, int );
/*
3
| /
| / 2
|/
+---1
|\
| \ 2
| \
3
*/
void TextLine( x1, y1, x2, y2, code )
int x1, y1, x2, y2 ;
int code ;
{
int sp ;
if ( x1 > x2 )
{
swap( x1, x2 );
swap( y1, y2 );
}
dummy_label1:
sp = SUPER( 0 );
dummy_label2:
if ( y1 == y2 )
TextLine1( x1, y1, x2, y2, code );
else if ( x2 - x1 > abs( y1 - y2 ) )
TextLine2( x1, y1, x2, y2, code );
else
TextLine3( x1, y1, x2, y2, code );
dummy_label3:
SUPER( sp );
}
void TextFill( x1, y1, x2, y2, code )
int x1, y1, x2, y2 ;
int code ;
{
int y, sp ;
if ( x1 > x2 )
swap( x1, x2 );
if ( y1 > y2 )
swap( y1, y2 );
dummy_label1:
sp = SUPER( 0 );
dummy_label2:
for( y = y1 ; y <= y2 ; y++ )
{
TextLine1( x1, y, x2, y, code );
}
dummy_label3:
SUPER( sp );
}
static void TextLine1( x1, y1, x2, y2, code )
int x1, y1, x2, y2 ;
int code ;
{
unsigned short *p, *p1, *p2 ;
unsigned short mask1, mask2 ;
p1 = VRAM + y1 * HWORD + x1 / 16 ;
p2 = VRAM + y1 * HWORD + x2 / 16 ;
mask1 = 0xffff >> ( x1 % 16 );
mask2 = 0xffff << ( 15 - ( x2 % 16 ) );
if ( p1 == p2 )
{
PutMask( p1, mask1 & mask2, code );
}
else
{
PutMask( p1, mask1, code );
for( p = p1+1 ; p < p2 ; p++ )
PutMask( p, 0xffff, code );
PutMask( p2, mask2, code );
}
}
static void TextLine2( x1, y1, x2, y2, code )
int x1, y1, x2, y2 ;
int code ;
{
int dxdy ;
int x, y, xn ;
int ylen, dy ;
unsigned short *p, *p1, *p2 ;
unsigned short mask1, mask2 ;
if ( y1 < y2 )
{
ylen = y2 - y1 ;
dy = HWORD ;
}
else
{
ylen = y1 - y2 ;
dy = - HWORD ;
}
dxdy = ( ( x2 - x1 ) << 16 ) / ylen ;
x = x1 << 16 ;
p1 = VRAM + y1 * HWORD + x1 / 16 ;
for( y = 0 ; y < ylen ; y++ )
{
xn = x + dxdy ;
p2 = p1 + ( xn >> 20 ) - ( x >> 20 );
mask1 = 0xffff >> ( ( x >> 16 ) % 16 );
mask2 = 0xffff << ( 16 - ( ( xn >> 16 ) % 16 ) );
if ( p1 == p2 )
{
PutMask( p1, mask1 & mask2, code );
}
else
{
PutMask( p1, mask1, code );
for( p = p1+1 ; p < p2 ; p++ )
PutMask( p, 0xffff, code );
PutMask( p2, mask2, code );
}
p1 = p2 + dy ;
x = xn ;
}
PutMask( p1, 0x8000 >> ( x >> 16 ) % 16, code );
}
static void TextLine3( x1, y1, x2, y2, code )
int x1, y1, x2, y2 ;
int code ;
{
int dxdy ;
int x, y ;
int ylen, dy ;
unsigned short *p ;
unsigned short mask ;
if ( y1 < y2 )
{
ylen = y2 - y1 ;
dy = HWORD ;
}
else
{
ylen = y1 - y2 ;
dy = - HWORD ;
}
p = VRAM + y1 * HWORD + x1 / 16 ;
dxdy = ( ( x2 - x1 ) << 16 ) / ylen ;
x = ( x1 << 16 ) + ( 1 << 15 );
for( y = 0 ; y <= ylen ; y++ )
{
mask = 0x8000 >> ( ( x >> 16 ) % 16 );
PutMask( p, mask, code );
p += dy + ( ( x + dxdy ) >> 20 ) - ( x >> 20 );
x += dxdy ;
}
}