mirror of https://github.com/yaz0r/FITD.git
186 lines
3.3 KiB
C++
186 lines
3.3 KiB
C++
#include "common.h"
|
|
|
|
#define ENTER
|
|
#define LEAVE
|
|
|
|
#include <math.h>
|
|
#include <stdlib.h>
|
|
|
|
unsigned char* polyBackBuffer = NULL;
|
|
|
|
void swapFunc(int* a, int* b)
|
|
{
|
|
int temp;
|
|
temp = *a;
|
|
*a = *b;
|
|
*b = temp;
|
|
}
|
|
|
|
#define MIN(a,b) (a<b?a:b)
|
|
#define MAX(a,b) (a>b?a:b)
|
|
#define SWAP(a,b) (swapFunc(&a,&b))
|
|
|
|
void pixel(int x,int y, unsigned char c)
|
|
{
|
|
if(x>=0 && x<320 && y>=0 && y<200)
|
|
{
|
|
*(polyBackBuffer+y*320+x) = c;
|
|
}
|
|
}
|
|
|
|
void hline(int x1, int x2, int y, unsigned char c)
|
|
{
|
|
int i;
|
|
|
|
for(i=x1; i < (x2 + 1);i++)
|
|
{
|
|
pixel(i,y,c);
|
|
}
|
|
}
|
|
|
|
void vline(int x, int y1, int y2, unsigned char c)
|
|
{
|
|
int i;
|
|
|
|
for(i=y1; i< (y2 + 1);i++)
|
|
{
|
|
pixel(x,i,c);
|
|
}
|
|
}
|
|
|
|
void bsubline_1(int x1, int y1, int x2, int y2, unsigned char c) {
|
|
int x, y, ddx, ddy, e;
|
|
ddx = abs(x2 - x1);
|
|
ddy = abs(y2 - y1) << 1;
|
|
e = ddx - ddy;
|
|
ddx <<= 1;
|
|
|
|
if (x1 > x2) {
|
|
SWAP(x1, x2);
|
|
SWAP(y1, y2);
|
|
}
|
|
|
|
ENTER;
|
|
|
|
for (x = x1, y = y1; x <= x2; x++) {
|
|
pixel(x, y, c);
|
|
if (e < 0) {
|
|
y++;
|
|
e += ddx - ddy;
|
|
} else {
|
|
e -= ddy;
|
|
}
|
|
}
|
|
|
|
LEAVE;
|
|
}
|
|
|
|
void bsubline_2(int x1, int y1, int x2, int y2, unsigned char c) {
|
|
int x, y, ddx, ddy, e;
|
|
ddx = abs(x2 - x1) << 1;
|
|
ddy = abs(y2 - y1);
|
|
e = ddy - ddx;
|
|
ddy <<= 1;
|
|
|
|
if (y1 > y2) {
|
|
SWAP(x1, x2);
|
|
SWAP(y1, y2);
|
|
}
|
|
|
|
ENTER;
|
|
|
|
for (y = y1, x = x1; y <= y2; y++) {
|
|
pixel(x, y, c);
|
|
if (e < 0) {
|
|
x++;
|
|
e += ddy - ddx;
|
|
} else {
|
|
e -= ddx;
|
|
}
|
|
}
|
|
|
|
LEAVE;
|
|
}
|
|
|
|
void bsubline_3(int x1, int y1, int x2, int y2, unsigned char c) {
|
|
int x, y, ddx, ddy, e;
|
|
ddx = abs(x1 - x2) << 1;
|
|
ddy = abs(y2 - y1);
|
|
e = ddy - ddx;
|
|
ddy <<= 1;
|
|
|
|
if (y1 > y2) {
|
|
SWAP(x1, x2);
|
|
SWAP(y1, y2);
|
|
}
|
|
|
|
ENTER;
|
|
|
|
for (y = y1, x = x1; y <= y2; y++) {
|
|
pixel(x, y, c);
|
|
if (e < 0) {
|
|
x--;
|
|
e += ddy - ddx;
|
|
} else {
|
|
e -= ddx;
|
|
}
|
|
}
|
|
|
|
LEAVE;
|
|
}
|
|
|
|
void bsubline_4(int x1, int y1, int x2, int y2, unsigned char c) {
|
|
int x, y, ddx, ddy, e;
|
|
ddy = abs(y2 - y1) << 1;
|
|
ddx = abs(x1 - x2);
|
|
e = ddx - ddy;
|
|
ddx <<= 1;
|
|
|
|
if (x1 > x2) {
|
|
SWAP(x1, x2);
|
|
SWAP(y1, y2);
|
|
}
|
|
|
|
for (x = x1, y = y1; x <= x2; x++) {
|
|
pixel(x, y, c);
|
|
if (e < 0) {
|
|
y--;
|
|
e += ddx - ddy;
|
|
} else {
|
|
e -= ddy;
|
|
}
|
|
}
|
|
}
|
|
|
|
void line(int x1, int y1, int x2, int y2, unsigned char c) {
|
|
float k;
|
|
if ((x1 == x2) && (y1 == y2)) {
|
|
pixel(x1, y1, c);
|
|
return;
|
|
}
|
|
|
|
if (x1 == x2) {
|
|
vline(x1, MIN(y1, y2), MAX(y1, y2), c);
|
|
return;
|
|
}
|
|
|
|
if (y1 == y2) {
|
|
hline(MIN(x1, x2), MAX(x1, x2), y1, c);
|
|
return;
|
|
}
|
|
|
|
k = (float)(y2 - y1) / (float)(x2 - x1);
|
|
|
|
if ((k >= 0) && (k <= 1)) {
|
|
bsubline_1(x1, y1, x2, y2, c);
|
|
} else if (k > 1) {
|
|
bsubline_2(x1, y1, x2, y2, c);
|
|
} else if ((k < 0) && (k >= -1)) {
|
|
bsubline_4(x1, y1, x2, y2, c);
|
|
} else {
|
|
bsubline_3(x1, y1, x2, y2, c);
|
|
}
|
|
}
|
|
|
|
#undef SWAP
|