mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			146 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			146 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#include "2D.h"
 | 
						|
#include <math.h>
 | 
						|
 | 
						|
void set_vgabasemem(void)
 | 
						|
{
 | 
						|
    ULONG vgabase;
 | 
						|
    SELECTOR tmp;
 | 
						|
    asm mov [tmp], ds
 | 
						|
    dpmi_get_sel_base(&vgabase, tmp);
 | 
						|
    vgabasemem = (char *)(-vgabase + 0xa0000);
 | 
						|
}
 | 
						|
 | 
						|
void drw_chdis(int mode) // change the display!
 | 
						|
{
 | 
						|
    regs.b.ah = 0x00;   // seet theh display moode
 | 
						|
    regs.b.al = mode;  // change it to the mode like innit
 | 
						|
    regs.h.flags = 0x72;// Set the dingoes kidneys out of FLAGS eh?
 | 
						|
    regs.h.ss = 0;     // Like, totally set the stack segment
 | 
						|
    regs.h.sp = 0;     // Set tha stack pointaaaaahhhhh!!!
 | 
						|
    dpmi_simulate_real_interrupt(0x10, ®s);
 | 
						|
}
 | 
						|
 | 
						|
void drw_pix(int x, int y, enum COLORS col)
 | 
						|
{
 | 
						|
    *VGAPIX(x, y) = col;
 | 
						|
}
 | 
						|
 | 
						|
void drw_line(int x0, int y0, int x1, int y1, enum COLORS col)
 | 
						|
{
 | 
						|
    // Going for the optimized version of bresenham's line algo.        
 | 
						|
    int stp = (abs(y0 - y1) > abs(x0 - x1));
 | 
						|
    int tmp, dx, dy, err, yi, i, j; // yi = y excrement
 | 
						|
    if (stp) {
 | 
						|
        // swappity swap
 | 
						|
        tmp = y0;
 | 
						|
        y0 = x0;
 | 
						|
        x0 = tmp;
 | 
						|
        
 | 
						|
        tmp = y1;
 | 
						|
        y1 = x1;
 | 
						|
        x1 = tmp;
 | 
						|
    }
 | 
						|
    // AAAAND NOW WE MUST DO ZEES AGAIN :(
 | 
						|
    // I'm sure there was a func somewhere that does this? :P
 | 
						|
    if (x0 > x1) {
 | 
						|
        tmp = x0;
 | 
						|
        x0 = x1;
 | 
						|
        x1 = tmp;
 | 
						|
        
 | 
						|
        tmp = y0;
 | 
						|
        y0 = y1;
 | 
						|
        y1 = tmp;
 | 
						|
    }
 | 
						|
    dx = (x1 - x0);
 | 
						|
    dy = (abs(y1 - y0));
 | 
						|
    err = (dx / 2);
 | 
						|
 | 
						|
    if (y0 < y1)
 | 
						|
        yi = 1;
 | 
						|
    else
 | 
						|
        yi = -1;
 | 
						|
    j = y0;
 | 
						|
    for (i = x0; i < x1; i++)
 | 
						|
    {
 | 
						|
        if (stp)
 | 
						|
            *VGAPIX(j, i) = col;
 | 
						|
        else
 | 
						|
            *VGAPIX(i, j) = col;
 | 
						|
 | 
						|
        err -= dy;
 | 
						|
        if (err < 0) {
 | 
						|
            j += yi;
 | 
						|
            err += dx;
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void drw_rectl(int x, int y, int w, int h, enum COLORS col)
 | 
						|
{
 | 
						|
    drw_line(x, y, x+w, y, col);
 | 
						|
    drw_line(x+w, y, x+w, y+h, col);
 | 
						|
 | 
						|
    drw_line(x, y, x, y+h, col);
 | 
						|
    drw_line(x, y+h, x+w+1, y+h, col);
 | 
						|
}
 | 
						|
 | 
						|
void drw_rectf(int x, int y, int w, int h, enum COLORS col)
 | 
						|
{
 | 
						|
    int i, j;
 | 
						|
    for (j = y; j < x+h; j++) {
 | 
						|
        for (i = x; i < y+w; i++) {
 | 
						|
            *VGAPIX(i, j) = col;
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void drw_circl(int x, int y, int rad, enum COLORS col)
 | 
						|
{
 | 
						|
    int mang, i; // max angle, haha
 | 
						|
    int px, py;
 | 
						|
    mang = 360; // Yeah yeah I'll switch to rad later
 | 
						|
    for (i = 0; i <= mang; i++)
 | 
						|
    {   
 | 
						|
        px = cos(i)*rad + x; // + px; // causes some really cools effects! :D
 | 
						|
        py = sin(i)*rad + y; // + py;
 | 
						|
        *VGAPIX(px, py) = col;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void drw_tex(int x, int y, int w, int h, enum COLORS tex[])
 | 
						|
{   // i*w+j
 | 
						|
    int i, j;
 | 
						|
    for (i = 0; i < w; i++)
 | 
						|
    {
 | 
						|
        for (j = 0; j < h; j++)
 | 
						|
        {
 | 
						|
            *VGAPIX(x+i, y+j) = tex[j*w+i];
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void 2D_init(void)
 | 
						|
{
 | 
						|
    set_vgabasemem();
 | 
						|
    drw_chdis(0x13);
 | 
						|
}
 | 
						|
 | 
						|
void 2D_exit(void)
 | 
						|
{
 | 
						|
    drw_chdis(3);
 | 
						|
}
 | 
						|
/*
 | 
						|
int main()
 | 
						|
{
 | 
						|
    set_vgabasemem();
 | 
						|
    drw_chdis(0x13);
 | 
						|
 | 
						|
    while(!kbhit()) {
 | 
						|
        if ((getch()) == 0x1b) // escape
 | 
						|
            break;
 | 
						|
    }
 | 
						|
    drw_chdis(3);
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
*/
 |