home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 1997 March
/
VPR9703A.ISO
/
VPR_DATA
/
DOGA
/
SOURCES
/
POLYEDIT.LZH
/
MODEL
/
GRAPHPC.C
< prev
next >
Wrap
C/C++ Source or Header
|
1995-06-11
|
6KB
|
377 lines
#include <stdio.h>
#include <string.h>
#include <dos.h>
#include <graphics.h>
#include "graph.h"
#define iskanji( c ) ( ( c & 0x80 ) == 0x80 )
#define FRAME_ADR 0xd0000000
#define swap( a, b ) { int _w ; _w = a ; a = b ; b = _w ; }
void FontInit();
void FontPuts( int, int, unsigned char*, int, int );
int Cols, Lines ;
static int hsize ;
static int video_mode ;
static int font_init = 0 ;
static void Line1( int, int, int, int, int );
static void Line2( int, int, int, int, int );
static void Line3( int, int, int, int, int );
static void Line4( int, int, int, int, int );
void graph_init()
{
int i ;
Cols = 80 ;
Lines = 25 ;
video_mode = *(char*)( 0xE0000000 | 0x449 );
if ( font_init == 0 )
{
FontInit();
font_init = 1 ;
}
GrSetMode( GR_default_graphics );
hsize = GrSizeX();
#if 1
for( i = 16 ; i < 32 ; i++ )
GrSetColor( i, 127, 127, 255 );
#endif
Cols = GrSizeX() / 8 ;
Lines = GrSizeY() / 16 ;
for (i = 0; i < 8; ++i) {
GrSetColor( i, (i&4) ? 255 : 0, (i&2) ? 255 : 0, (i&1) ? 255 : 0 );
}
}
void graph_exit()
{
union REGS regs ;
regs.h.ah = 0 ;
regs.h.al = video_mode ;
int86( 0x10, ®s, ®s );
}
void graph_line( x1, y1, x2, y2, color )
int x1 ;
int y1 ;
int x2 ;
int y2 ;
int color ;
{
if ( color < 16 )
{
if ( y1 > y2 )
{
swap( x1, x2 );
swap( y1, y2 );
}
if ( x2 - x1 < - ( y2 - y1 ) )
Line1( x1, y1, x2, y2, color );
else if ( x2 - x1 < 0 )
Line2( x1, y1, x2, y2, color );
else if ( x2 - x1 < y2 - y1 )
Line3( x1, y1, x2, y2, color );
else
Line4( x1, y1, x2, y2, color );
}
else if ( color == 18 )
GrLine( x1, y1, x2, y2, GrXOR | 0x1f );
}
static void Line1( x1, y1, x2, y2, color )
int x1, y1, x2, y2 ;
int color ;
{
char *adr ;
int add, over, total ;
int x ;
add = y2 - y1 ;
over = x1 - x2 ;
total = over / 2 ;
adr = (char*)( FRAME_ADR + y1 * hsize + x1 );
for( x = x1 ; x >= x2 ; x-- )
{
*adr-- = color ;
total += add ;
if ( total > over )
{
total -= over ;
adr += hsize ;
}
}
}
static void Line2( x1, y1, x2, y2, color )
int x1, y1, x2, y2 ;
int color ;
{
char *adr ;
int add, over, total ;
int y ;
add = x1 - x2 ;
over = y2 - y1 ;
total = over / 2 ;
adr = (char*)( FRAME_ADR + y1 * hsize + x1 );
for( y = y1 ; y <= y2 ; y++ )
{
*adr = color ;
adr += hsize ;
total += add ;
if ( total > over )
{
total -= over ;
adr -- ;
}
}
}
static void Line3( x1, y1, x2, y2, color )
int x1, y1, x2, y2 ;
int color ;
{
char *adr ;
int add, over, total ;
int y ;
add = x2 - x1 ;
over = y2 - y1 ;
total = over / 2 ;
adr = (char*)( FRAME_ADR + y1 * hsize + x1 );
for( y = y1 ; y <= y2 ; y++ )
{
*adr = color ;
adr += hsize ;
total += add ;
if ( total > over )
{
total -= over ;
adr ++ ;
}
}
}
static void Line4( x1, y1, x2, y2, color )
int x1, y1, x2, y2 ;
int color ;
{
char *adr ;
int add, over, total ;
int x ;
add = y2 - y1 ;
over = x2 - x1 ;
total = over / 2 ;
adr = (char*)( FRAME_ADR + y1 * hsize + x1 );
for( x = x1 ; x <= x2 ; x++ )
{
*adr++ = color ;
total += add ;
if ( total > over )
{
total -= over ;
adr += hsize ;
}
}
}
void graph_cls( color )
int color ;
{
graph_fill( 0, 0, Cols*8, Lines*16, color );
}
void graph_fill( x1, y1, x2, y2, color )
int x1 ;
int y1 ;
int x2 ;
int y2 ;
int color ;
{
int x, y ;
char *top, *adr ;
int *iadr ;
if ( color >= 16 )
return ;
if ( x1 > x2 )
swap( x1, x2 );
if ( y1 > y2 )
swap( y1, y2 );
top = (char*)( FRAME_ADR + y1 * hsize + x1 );
color |= ( color << 24 ) | ( color << 16 ) | ( color << 8 );
for( y = y1 ; y <= y2 ; y++ )
{
adr = top ;
for( x = x1 ; x <= x2 && ( x & 3 ) != 0 ; x++ )
*adr++ = color ;
iadr = (int*)adr ;
for( ; x < x2 - 3 ; x += 4 )
*iadr++ = color ;
adr = (char*)iadr ;
for( ; x <= x2 ; x++ )
*adr++ = color ;
top += hsize ;
}
}
void graph_palet( paletmode, g, r, b )
int paletmode ;
int g, r, b ;
{
GrSetColor( paletmode, r, g, b );
}
void graph_puts( str, x, y, atr )
char *str ;
int x, y ;
int atr ;
{
FontPuts( x, y, str, atr & 15, atr >> 4 );
}
void graph_pattern( x, y, color, pat, h, v )
int x, y ;
int color ;
short *pat ;
int h, v ;
{
char *adr ;
int i, j, k ;
int a, hh, hword ;
int fg, bg ;
fg = ( color & 0x0f );
bg = ( color >> 4 ) & 0x0f ;
hword = ( h + 15 ) / 16 ;
for( i = 0 ; i < v ; i++ )
{
adr = (char*)( FRAME_ADR + ( y + i ) * hsize + x );
hh = h ;
for( j = 0 ; j < hword ; j++ )
{
a = *pat++ & 0xffff ;
for( k = 0 ; k < 15 && k < hh ; k++ )
{
if ( a & 0x8000 )
*adr++ = fg ;
else
*adr++ = bg ;
a <<= 1 ;
}
hh -= 16 ;
}
}
}
void graph_pattern2( x, y, color, buf, h, v )
int x, y ;
int color ;
char *buf ;
int h, v ;
{
char *adr ;
int i, j, k, c ;
int fg, bg ;
fg = color & 0xf ;
bg = ( color >> 4 ) & 0x0f ;
adr = (char*)( FRAME_ADR + y * hsize + x );
h /= 8 ;
for( i = 0 ; i < v ; i++ )
{
for( j = 0 ; j < h ; j++ )
{
c = *buf++ ;
for( k = 0 ; k < 8 ; k++ )
{
if ( c & 0x80 )
*adr++ = fg ;
else
*adr++ = bg ;
c <<= 1 ;
}
}
adr += hsize - h * 8 ;
}
}
void graph_pattern_xor( x, y, color, pat, h, v )
int x, y ;
int color ;
short *pat ;
int h, v ;
{
char *adr ;
int i, j, k ;
int a, hh, hword ;
hword = ( h + 15 ) / 16 ;
for( i = 0 ; i < v ; i++ )
{
adr = (char*)( FRAME_ADR + ( y + i ) * hsize + x );
hh = h ;
for( j = 0 ; j < hword ; j++ )
{
a = *pat++ & 0xffff ;
for( k = 0 ; k < 15 && k < hh ; k++ )
{
if ( a & 0x8000 )
*adr ^= color ;
adr++ ;
a <<= 1 ;
}
hh -= 16 ;
}
}
}
/* ボタン表示 */
void graph_box( x1, y1, x2, y2, sw )
int x1, y1, x2, y2 ;
int sw ;
{
if ( sw )
{
graph_line( x1, y1, x2, y1, 7 );
graph_fill( x1, y1, x1+1, y2, 7 );
graph_line( x1, y2, x2, y2, 0 );
graph_line( x2, y1, x2, y2, 0 );
}
else
{
graph_line( x1, y1, x2, y1, 0 );
graph_line( x1, y1, x1, y2, 0 );
graph_line( x1, y2, x2, y2, 7 );
graph_fill( x2, y1, x2+1, y2, 7 );
}
}