#ifndef __TEXTCON_H
#define __TEXTCON_H

#include<menuet/sem.h>

#define COLOR_CONV_B_2_D	{ \
 0x000000, \
 0x000080, \
 0x800000, \
 0x008080, \
 0x800000, \
 0x808000, \
 0x404040, \
 0x808080, \
 0x606060, \
 0x0000FF, \
 0x00FF00, \
 0x00FFFF, \
 0xFF0000, \
 0xFFFF00, \
 0x00FFFF, \
 0xFFFFFF, \
}

#define CHAR_SIZE_X		5
#define CHAR_SIZE_Y		8

#define NR_CHARS_X		80
#define NR_CHARS_Y		25

#define CON_AT_X		10
#define CON_AT_Y		25

typedef struct
{
 unsigned char c_char;
 unsigned char c_back;
 unsigned char c_color;
} char_info_t;

typedef struct
{
 int esc[4];
} esc_info_t;

typedef struct
{
 unsigned char text_color,back_color;
 char_info_t char_table[NR_CHARS_X][NR_CHARS_Y];
 int id;
 int cur_x,cur_y;
 int cur_visible;
 unsigned char cur_color;
 esc_info_t esc_seq;
 DECLARE_SEMAPHORE_S(io_lock);
} console_t;

#define MAX_CONSOLES		4

extern console_t * consoles[MAX_CONSOLES];
extern console_t * visible_console;

void init_consoles(void);
void lcon_clrscr(console_t * con);
void lcon_flush_console(console_t * con);
void lcon_flushxy(console_t * con,int x,int y);
void lcon_scroll(console_t * con,int update);
void lcon_putch(console_t * con,char c);
void lcon_gotoxy(console_t * con,int x,int y);
void lcon_set_text_color(console_t * con,int color);
void lcon_set_back_color(console_t * con,int color);
void lcon_switch_to_console(int i);
unsigned char lcon_getcxy(console_t * con,int x,int y);
void lcon_putcxy(console_t * con,int x,int y,unsigned char c);

#define _lcon_clrscr()		lcon_clrscr(visible_console)
#define _lcon_flush_console()	lcon_flush_console(visible_console)
#define _lcon_flushxy(x,y)	lcon_flushxy(visible_console,(x),(y))
#define _lcon_scroll()		lcon_scroll(visible_console,1)
#define _lcon_putch(c)		lcon_putch(visible_console,(char)(c))
#define _lcon_gotoxy(x,y)	lcon_gotoxy(visible_console,(x),(y))
#define _lcon_set_text_color(c) lcon_set_text_color(visible_console,(c)&(1+2+4+8))
#define _lcon_set_back_color(c) lcon_set_back_color(visible_console,(c)&(1+2+4+8))
#define _lcon_switch(i)		lcon_switch_to_console((i))
#define _lcon_getcxy(x,y)	lcon_getcxy(visible_console,(x),(y))
#define _lcon_putcxy(x,y,c)	lcon_putcxy(visible_console,(x),(y),(c))

console_t * create_private_console(void);
void free_private_console(console_t * con);

#endif