-- 

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;
USE ieee.std_logic_unsigned.all;


ENTITY colorize IS
	PORT(
		r		: OUT	std_logic_vector(7 downto 0);
		g		: OUT	std_logic_vector(7 downto 0);
		b		: OUT	std_logic_vector(7 downto 0);
		code	: IN	STD_LOGIC_VECTOR(2 DOWNTO 0);
		test : in std_logic_vector(7 downto 0);
		cpt_line	: IN  integer range 0 to 511;
		cpt_row	    : IN  integer range 0 to 1023;
		clk : in std_logic
	);
END colorize;

ARCHITECTURE a OF colorize IS

signal codeb : std_logic_vector(2 downto 0);
signal coded : std_logic_vector(2 downto 0);
signal cpt_bis : integer range 0 to 1023;
signal cpt_a : integer range 0 to 1023;
signal cpt_b : integer range 0 to 63;
signal row : std_logic_vector(9 downto 0);

begin

	row <= std_logic_vector(to_unsigned(cpt_row,10));

	generator : process(code, codeb, cpt_row, coded, row, test)
	begin
		if (test = "00000000") then
			r(0) <= code(0);
			r(1) <= code(0);
			r(2) <= code(0);
			r(3) <= code(0);
			r(4) <= code(0);
			r(5) <= code(0);
			r(6) <= code(0);
			r(7) <= code(0);

			g(0) <= code(1);
			g(1) <= code(1);
			g(2) <= code(1);
			g(3) <= code(1);
			g(4) <= code(1);
			g(5) <= code(1);
			g(6) <= code(1);
			g(7) <= code(1);

			b(0) <= code(2);
			b(1) <= code(2);
			b(2) <= code(2);
			b(3) <= code(2);
			b(4) <= code(2);
			b(5) <= code(2);
			b(6) <= code(2);
			b(7) <= code(2);
		elsif (test = "00000001") then
			r(0) <= row(6);
			r(1) <= row(6);
			r(2) <= row(6);
			r(3) <= row(6);
			r(4) <= row(6);
			r(5) <= row(6);
			r(6) <= row(6);
			r(7) <= row(6);

			g(0) <= row(7);
			g(1) <= row(7);
			g(2) <= row(7);
			g(3) <= row(7);
			g(4) <= row(7);
			g(5) <= row(7);
			g(6) <= row(7);
			g(7) <= row(7);

			b(0) <= row(8);
			b(1) <= row(8);
			b(2) <= row(8);
			b(3) <= row(8);
			b(4) <= row(8);
			b(5) <= row(8);
			b(6) <= row(8);
			b(7) <= row(8);
		elsif (test = "00000010") then
			r(0) <= codeb(0);
			r(1) <= codeb(0);
			r(2) <= codeb(0);
			r(3) <= codeb(0);
			r(4) <= codeb(0);
			r(5) <= codeb(0);
			r(6) <= codeb(0);
			r(7) <= codeb(0);

			g(0) <= codeb(1);
			g(1) <= codeb(1);
			g(2) <= codeb(1);
			g(3) <= codeb(1);
			g(4) <= codeb(1);
			g(5) <= codeb(1);
			g(6) <= codeb(1);
			g(7) <= codeb(1);

			b(0) <= codeb(2);
			b(1) <= codeb(2);
			b(2) <= codeb(2);
			b(3) <= codeb(2);
			b(4) <= codeb(2);
			b(5) <= codeb(2);
			b(6) <= codeb(2);
			b(7) <= codeb(2);
		else
			r(0) <= coded(0);
			r(1) <= coded(0);
			r(2) <= coded(0);
			r(3) <= coded(0);
			r(4) <= coded(0);
			r(5) <= coded(0);
			r(6) <= coded(0);
			r(7) <= coded(0);

			g(0) <= coded(1);
			g(1) <= coded(1);
			g(2) <= coded(1);
			g(3) <= coded(1);
			g(4) <= coded(1);
			g(5) <= coded(1);
			g(6) <= coded(1);
			g(7) <= coded(1);

			b(0) <= coded(2);
			b(1) <= coded(2);
			b(2) <= coded(2);
			b(3) <= coded(2);
			b(4) <= coded(2);
			b(5) <= coded(2);
			b(6) <= coded(2);
			b(7) <= coded(2);
		end if;
	end process;

	codeurA : process(cpt_line, cpt_row, clk, coded)
	begin
		if (cpt_row = 0) then
			coded <= "000";
			cpt_bis <= 0;
		elsif rising_edge(clk) then
			if (cpt_bis < cpt_line) then
				cpt_bis <= cpt_bis + 1; -- on compte le nombre de pixel dans la ligne
			else
				cpt_bis <= 0; -- quand on atteind cpt_bis = cpt_line, on change de couleur;
				
				case coded is
					when "000" => coded <= "100";
					when "100" => coded <= "010";
					when "010" => coded <= "001";
					when "001" => coded <= "011";
					when "011" => coded <= "101";
					when "101" => coded <= "110";
					when "110" => coded <= "111";
					when "111" => coded <= "000";
				end case;
				
			end if;
		end if;
	end process;

	codeurB : process(cpt_line, cpt_row, clk, codeb)
	begin
		if (cpt_row = 0) then
			codeb <= "000";
			cpt_b <= 32;
			cpt_a <= 32;
		elsif rising_edge(clk) then
			if (cpt_row > cpt_a) then
				codeb <= codeb + 1; -- on change de couleur
				cpt_a <= cpt_a + cpt_b;
				if codeb = "111" then
					cpt_b <= cpt_b / 2;
				end if;
			end if;
		end if;
	end process;

END a;
