#include "../screen.h"

#include <math.h>

u16 transparent_color = 0xf01e;

void screen_draw_line(short int x1, short int y1, short int x2, short int y2, u16 color)
{
	short int dx, dy, sdx, sdy, x, y, px, py;

	x = 0;
	y = 0;
	dx = x2 - x1;
	dy = y2 - y1;
	sdx = (dx < 0) ? -1 : 1;
	sdy = (dy < 0) ? -1 : 1;
	dx = sdx * dx + 1;
	dy = sdy * dy + 1;
	px = x1;
	py = y1;

	if (dx >= dy)
		for (x = 0; x < dx; x++)
		{
			screen_put_pixel(px,py,color);
			y += dy;
			if (y >= dx)
			{
				y -= dx;
				py += sdy;
			}
			px += sdx;
		}
	else
		for (y = 0; y < dy; y++)
		{
			screen_put_pixel(px,py,color);
			x += dx;
			if (x >= dy)
			{
				x -= dy;
				px += sdx;
			}
			py += sdy;
		}
}

void screen_draw_rectangle(int x, int y, int widht, int hight, u16 color, int filled)
{
	int i;
	if(filled==0)
	{
		screen_draw_line(x, y, x + widht, y, color);
		screen_draw_line(x, y, x, y + hight, color);
		screen_draw_line(x, y+ hight, x + widht, y + hight, color);
		screen_draw_line(x + widht, y, x + widht, y + hight, color);
	}
	else
	{
		for(i=0;i<=hight;i++)
			screen_draw_line(x, y+i, x + widht, y+i, color);
	}
}
void screen_draw_triangle(int x, int y, int xa, int ya, int xb, int yb, u16 color)
{
	screen_draw_line(x, y, xa, ya, color);
	screen_draw_line(x, y, xb, yb, color);
	screen_draw_line(xa, ya, xb, yb, color);
}
void screen_draw_image(int xpos, int ypos, int width, int high, const u16 data[], float rad_ang, float rapport ){
 int ni=0;
 int mx, my, mxdest, mydest;    /* Coordonnées des centres des surfaces */
 int i=0, j;                    /* Coordonnées de travail lors du parcourt de la surface de destination */
 unsigned int bx, by;           /* Coordonnées de travail, correspondent à i et j dans l'image d'origine */
 int x, y;                      /* valeurs de travail (bx et by avant arrondit */
 int ligne_x, ligne_y;          /* valeurs au debut des lignes (retour de i à 0) */
 int dxi, dyi, dxj, dyj;        /* increments des x et y suivant i et j (compteurs des x et y) */
 float tcos, tsin;              /* cos et sin de angle_radian */
 int largeurdest, hauteurdest;  /* Dimentions de la surface de destination */

   if((rad_ang==0)&(rapport==1)){
	 for(y=ypos;y<ypos+high;y++){
                for(x=xpos;x<xpos+width;x++){
					if(data[ni]!=transparent_color) //if not is magenta
                        screen_put_pixel(x,y,data[ni]);
                        ni++;
                }
        }	
   }
   else{
        tcos = cos(rad_ang);
        tsin = sin(rad_ang);

        largeurdest = (int) ceil( (width * fabs(tcos) + high * fabs(tsin)) * rapport );
        hauteurdest = (int) ceil( (width * fabs(tsin) + high * fabs(tcos)) * rapport );

        mxdest = (int) largeurdest/2;
        mydest = (int) hauteurdest/2;
        mx = (int) width/2;
        my = (int) high/2;

        /* Initialisation et calculs des incréments */
        ligne_x = mx*65536 + (-tcos * mxdest - tsin * mydest) / rapport * 65536.0;
        ligne_y = my*65536 + ( tsin * mxdest - tcos * mydest) / rapport * 65536.0;
        dxi = tcos / rapport * 65536.0;
        dxj = tsin / rapport * 65536.0;
        dyi = -tsin / rapport * 65536.0;
        dyj = tcos / rapport * 65536.0;

        for(j=0;j<hauteurdest;j++){
                x = ligne_x;
                y = ligne_y;
                for(i=0;i<largeurdest;i++) {
                        bx = ((unsigned int) x) >> 16;
                        by = ((unsigned int) y) >> 16;
                        /* on vérifie que l'on ne sort pas des bords*/
                        if (bx>=0 && bx< width && by>=0 && by< high){
							if(data[by*width+bx]!=transparent_color)//if not is magenta
                                screen_put_pixel(i+xpos-mxdest+mx,j+ypos-mydest+my,data[by*width+bx]);
                        }

                                /* On incrémente les coordonnées dans l'image d'origine */
                        x += dxi;
                        y += dyi;
                }
                /* incrément pour le changement de ligne */
                ligne_x += dxj;
                ligne_y += dyj;
        }

   }
}
