Category : Files from Magazines
Archive   : MAR91.ZIP
Filename : 2N03033A

 
Output of file : 2N03033A contained in archive : MAR91.ZIP
/*--------------------------------------------------------------*/
/*- This file is the sample C program to draw Lines, Squares -*/
/*- and Ovals randomly in SuperVGA mode. It calls the assembly -*/
/*- language routines contained in the svgalib.asm file. -*/
/*- Compiler: Microsoft C 6.0 -*/
/*--------------------------------------------------------------*/

#include /** Standard MSC libraries **/
#include
#include

#include "svgalib.h" /** Prototypes for svga assembly routines **/

#define XRES 800
#define YRES 600
#define NUM_OF_COLOR 256
#define NUM_OF_RANDOM_RECTS 50
#define NUM_OF_RANDOM_LINES 100
#define NUM_OF_RANDOM_OVALS 100
#define ASPECT_RATIO 5

typedef struct POINT_STRUCT
{
int x;
int y;
} POINT;
typedef POINT * PPOINT;


/************* Function Prototypes **************/

void Square(PPOINT pPoint1,PPOINT pPoint2,int Color);
void Line(PPOINT pP1,PPOINT pP2,int Color);
void Oval(PPOINT pP1,int Radius,int Color,float Aspect);
void RandomLines(int x);
void RandomSquares(int x);
void RandomOvals(int x);



/*** This is rudimentary square drawing function ***/
/*** It is not intended to be anything put an example ***/
/*** on using the SVGA assembly routines from C ***/

void Square(PPOINT pPoint1,PPOINT pPoint2,int Color)
{
POINT TopRight,BottomLeft; /** For Rectangle **/

TopRight.x = pPoint2->x;
TopRight.y = pPoint1->y;
BottomLeft.x = pPoint1->x;
BottomLeft.y = pPoint2->y;

Line(pPoint1,&TopRight,Color);
Line(&BottomLeft,pPoint2,Color);
Line(pPoint1,&BottomLeft,Color);
Line(&TopRight,pPoint2,Color);
}


/** This function will draw a line using the "Bresenham's Algorithm **/
/** Algorithm taken from the "Graphics Programming in C Book" **/
void Line(PPOINT pP1,PPOINT pP2,int Color)
{
#define sign(x) ((x) > 0 ? 1 : ((x) == 0 ? 0 : (-1)))

int xSlope,ySlope,xAbs,yAbs,i,px,py,signX,signY,x,y;

xSlope = pP2->x - pP1->x;
ySlope = pP2->y - pP1->y;

signX = sign(xSlope);
signY = sign(ySlope);

xAbs = abs(xSlope);
yAbs = abs(ySlope);

x=0;
y=0;

px = pP1->x;
py = pP1->y;

if(xAbs >= yAbs)
{
for(i=0;i <= xAbs; i++)
{
y += yAbs;
if( y >= xAbs)
{
y -= xAbs;
py += signY;
}
SetPixel(px,py,Color);
px += signX;
}

}
else
{
for(i=0;i <= yAbs;i++)
{
x += xAbs;
if(x >= yAbs)
{
x-= yAbs;
px += signX;
}
SetPixel(px,py,Color);
py += signY;
}
}

}

/** This function will draw a Oval using the "Bresenham's Algorithm **/
/** Algorithm taken from the "Graphics Programming in C Book" **/

void Oval(PPOINT pP1,int Radius,int Color,float Aspect)

{
int col,i,row;
float Aspect_Sqr;
long d,a_Square,b_Square;
long Two_a_Square,Two_b_Square,Four_a_Square,Four_b_Square;

int LINEWIDTH = 1;

Aspect_Sqr = Aspect * Aspect;
Radius -=LINEWIDTH / 2;

for(i=1;i <= LINEWIDTH; i++)
{
b_Square = Radius * Radius;
a_Square = b_Square / Aspect_Sqr;
row = Radius;
col = 0;
Two_a_Square = a_Square << 1;
Four_a_Square = a_Square << 2;
Two_b_Square = b_Square << 1;
Four_b_Square = b_Square << 2;

d = Two_a_Square * ((row - 1) * (row)) +
a_Square + Two_b_Square * (1 - a_Square);

while(a_Square * (row) > b_Square * (col))
{
SetPixel(col + pP1->x, row + pP1->y, Color);
SetPixel(col + pP1->x, pP1->y - row, Color);
SetPixel(pP1->x - col, row + pP1->y, Color);
SetPixel(pP1->x - col, pP1->y - row, Color);
if(d >= 0)
{
row--;
d -= Four_a_Square * (row);
}
d+= Two_b_Square * (3 + (col << 1));
col++;
}

d = Two_b_Square * (col + 1) * col +
Two_a_Square * (row * (row - 2) + 1) +
(1 - Two_a_Square) * b_Square;

while((row) + 1)
{
SetPixel(col + pP1->x, row + pP1->y,Color);
SetPixel(col + pP1->x, pP1->y - row,Color);
SetPixel(pP1->x - col, row + pP1->y,Color);
SetPixel(pP1->x - col, pP1->y - row,Color);
if(d <= 0)
{
col++;
d+= Four_b_Square * col;
}
row--;
d+=Two_a_Square * (3 - (row << 1));
}
Radius++;
}
}


void RandomSquares(int x)
{
int i,color;
POINT TopLeft,BottomRight; /** For Rectangle **/

for(i=0;i {
TopLeft.x = rand() % XRES;
TopLeft.y = rand() % YRES;
BottomRight.x = rand() % XRES;
BottomRight.y = rand() % YRES;
color = rand() % NUM_OF_COLOR;
Square(&TopLeft,&BottomRight,color);
}
}

void RandomLines(int x)
{
int i,color;
POINT Pt1,Pt2;

for(i=0;i {
Pt1.x = rand() % XRES;
Pt1.y = rand() % YRES;
Pt2.x = rand() % XRES;
Pt2.y = rand() % YRES;
color = rand() % NUM_OF_COLOR;
Line(&Pt1,&Pt2,color);
}
}

void RandomOvals(int x)
{
int i,Color,Aspect,Radius;
POINT Center;

for(i=0;i {
/** Calculate the Center,Radius,Color and Aspect for Oval **/
Center.x = rand() % XRES;
Center.y = rand() % YRES;
Radius = rand() % (XRES / 4);
Color = rand() % NUM_OF_COLOR;
Aspect = (rand() % ASPECT_RATIO) + 1;

Oval(&Center,Radius,Color,(float)Aspect);
}
}

void main()
{
int c;

SvgaMode(); /** Set Video card to SVGA (800x600x256) mode **/
RandomLines(NUM_OF_RANDOM_LINES);
c = getch();
SvgaMode();
RandomSquares(NUM_OF_RANDOM_RECTS);
c = getch();
SvgaMode();
RandomOvals(NUM_OF_RANDOM_OVALS);
c = getch();
TextMode(); /** Set to Color 80 Col Text **/
}



  3 Responses to “Category : Files from Magazines
Archive   : MAR91.ZIP
Filename : 2N03033A

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/