#ifndef __FONT_ALL_H__
#define __FONT_ALL_H__

#include "generic/typedef.h"
#include "font/font_sdfs.h"

typedef struct {
    u8  width;
    u8  size;
    u16 addr;
} ASCSTRUCT;

//标志位
#define FONT_GET_WIDTH    		0x01
#define FONT_SHOW_PIXEL   		0x02
#define FONT_SHOW_MULTI_LINE 	0x04 /* 显示多行文本(默认显示一行) */
#define FONT_SHOW_SCROLL    	0x08 /* 滚动显示*/
#define FONT_HIGHLIGHT_SCROLL 	0x10 /* 高亮滚动显示*/
#define FONT_DEFAULT			(FONT_SHOW_PIXEL)

#define FONT_ENCODE_ANSI		0x00
#define FONT_ENCODE_UNICODE		0x01
#define FONT_ENCODE_UTF8		0x02

#define FONT_ENDIAN_BIG			0x00
#define FONT_ENDIAN_SMALL		0x01

struct font_file {
    char *name;
    FILE *fd;
};

struct font {
    struct font_file file;
    u16 nbytes;
    u8 size;
    u8 *pixelbuf;
};
struct dispbuf {
    int format;
    u32 color;
    void *rect;
    void *map;
};

enum FONT_STATUS {
    FT_ERROR_NONE,
    FT_ERROR_NOPIXFILE = 0x01,			//没有字模文件
    FT_ERROR_NOASCPIXFILE = 0x02,		//没有ASCII字模文件
    FT_ERROR_NOTABFILE = 0x04,			//没有TAB文件
    FT_ERROR_NOMEM = 0x08,				//内存不足
    FT_ERROR_CODEPAGE = 0x10,			//代码页错误
};

struct font_info {
    struct font ascpixel;		//ASCII像素
    struct font pixel;			//像素
    struct font_file tabfile;	//UNICODE转内码文件
    u8 sta;						//状态
    u8 ratio;					//放大倍数,默认为1
    u8 language_id;				//语言ID
    u8 bigendian;				//大端模式(unicode编码)
    u8 isgb2312;                //是否GB2312,用以区分GBK以及GB2312字库
    u8 codepage;				//代码页
    u16 x;
    u16 y;
    u16 text_width;				//文本宽度
    u16 text_height;			//文本高度
    u16 string_width;			//字符串宽度
    u16 offset;                 //显示偏移
    u32 flags;					//标志位
    struct dispbuf disp;		//显示相关信息
    void (*putchar)(struct font_info *info, u8 *pixel, u16 width, u16 height, u16 x, u16 y);
    void *dc;
};

#define font_ntohl(x) (unsigned long)((x>>24)|((x>>8)&0xff00)|(x<<24)|((x&0xff00)<<8))
#define font_ntoh(x) (unsigned short int )((x>>8&0x00ff)|x<<8&0xff00)

extern const struct font_info font_info_table[];

#endif
