#include "font.h"

uint8_t everRead=0;//记录Flash是否初始化	0没有初始化，1初始化

sFONT Font8x16 = {
  10*1024, /*数据在Flash开始地址*/
  8, /* Width */
  16, /* Height */
#if !FLASH_FONT	//当使用内存中的字库时，字体内存地址
  ASCII8x16_Table,	/* 字体内存地址 */
#endif
};

sFONT Font16x24 = {
  12*1024, /*开始地址*/
  16, /* Width */
  24, /* Height */
#if !FLASH_FONT	//当使用内存中的字库时，字体内存地址
  ASCII16x24_Table,	/* 字体内存地址 */
#endif
};

sFONT Font24x32 = {
  17*1024, /*开始地址*/
  24, /* Width */
  32, /* Height */
#if !FLASH_FONT	//当使用内存中的字库时，字体内存地址
  ASCII24x32_Table,	/* 字体内存地址 */
#endif
};
sFONT GB2312_H1616 = {
  256*1024, /*开始地址*/
  WIDTH_CH_CHAR, /* Width */
  HEIGHT_CH_CHAR, /* Height */
  /* 中文没有内存地址，内存占用太大了 */
};


//选择使用FLASH字模还是SD卡的字模
#if GBKCODE_FLASH


// 0：HZLIB字模(旧版，不建议使用), 1：GB2312字模
#if 1

/**
  * @brief  获取FLASH中文显示字库数据
  * @param  pBuffer:存储字库矩阵的缓冲区
  * @param  c ： 要获取的文字
  * @retval None.
  */
uint8_t GetGBKCode_from_EXFlash( uint8_t * pBuffer, uint16_t c)
{
#if FLASH_FONT	//当使用内存中的字库时，不支持中文
	unsigned char High8bit,Low8bit;
	unsigned int pos,datnum;
	
	High8bit= c >> 8;     /* 取高8位数据 */
	Low8bit= c & 0x00FF;  /* 取低8位数据 */
	
	//要读取的字节数量
	datnum=GB2312_H1616.Width*GB2312_H1616.Height/8;
	/*GB2312 公式*/	
	pos = ( (High8bit-0xa1)*94 + Low8bit-0xa1 )*datnum;
	//读取字库数据  
	SPI_FLASH_BufferRead(pBuffer , GB2312_H1616.AddrStart + pos , datnum);
#else
	FONT_Bebug("当前字体不支持中文\n");
#endif
	return 0;  
}

/**
  * @brief  获取Flash中的英文字符
  * @param  pBuffer:存储字库矩阵的缓冲区
  * @param  c ： 要获取的文字
  * @param  Fonts： 文字字体
  * @retval None.
  */
uint8_t GetConslonsCode_from_EXFlash( uint8_t * pBuffer, const char c , sFONT *Fonts)
{
	unsigned char chr;
	unsigned int pos,datnum;
	
	chr = c - ' ';
	
	//要读取的字节数量(该字体下占datnum个字节)
	datnum = (Fonts->Width * Fonts->Height)/8;
	/*字模偏移地址*/
	pos = chr*datnum;
	#if FLASH_FONT
	//读取字库数据  
	SPI_FLASH_BufferRead(pBuffer , Fonts->AddrStart + pos , datnum);
	#else
	for(uint16_t i=0;i<datnum;i++)
	{
		*(pBuffer+i) = (Fonts->Font_Table[pos+i]);//获取该字体的某个字符编码首地址
	}
	#endif
	return 0;  
}


#else	//旧版字模HZLIB 配套的函数

	/*HZLIB中文字库存储在FLASH的起始地址*/
	#define HZLIB_START_ADDRESS   1*4096

	//旧版HZLIB字库使用的函数，HZLIB不支持标点
	//本函数使用的寻址公式跟GB2312的也稍有区别
	int GetGBKCode_from_EXFlash( uint8_t * pBuffer, uint16_t c)
	{ 
		unsigned char High8bit,Low8bit;
		unsigned int pos;
		static uint8_t everRead=0;
		
		High8bit= c >> 8;     /* 取高8位数据 */
		Low8bit= c & 0x00FF;  /* 取低8位数据 */	
		
		//本字模使用的寻址公式跟GB2312的稍有区别
		pos = ((High8bit-0xa0-16)*94+Low8bit-0xa1)*WIDTH_CH_CHAR*HEIGHT_CH_CHAR/8;
		//地址指向HZLIB字模的地址HZLIB_START_ADDRESS
		SPI_FLASH_BufferRead(pBuffer,HZLIB_START_ADDRESS+pos,WIDTH_CH_CHAR*HEIGHT_CH_CHAR/8);
		//printf ( "%02x %02x %02x %02x\n", pBuffer[0],pBuffer[1],pBuffer[2],pBuffer[3]);
		
		return 0;
	}
	#endif

#else //SD卡字模

	static FIL fnew;	/* file objects */
	static FATFS fs;	/* Work area (file system object) for logical drives */
	static FRESULT res_sd; 
	static UINT br;		/* File R/W count */

	/**
	  * @brief  获取SD卡中文显示字库数据
		* @param  pBuffer:存储字库矩阵的缓冲区
		* @param  c ： 要获取的文字
	  * @retval None.
	  */
	int GetGBKCode_from_sd ( uint8_t * pBuffer, uint16_t c)
	{ 
		unsigned char High8bit,Low8bit;
		unsigned int pos;
		static uint8_t everRead = 0;
		
		High8bit= c >> 8;     /* 取高8位数据 */
		Low8bit= c & 0x00FF;  /* 取低8位数据 */
			
		pos = ((High8bit-0xa1)*94+Low8bit-0xa1)*WIDTH_CH_CHAR*HEIGHT_CH_CHAR/8;
		
		/*第一次使用，挂载文件系统，初始化sd*/
		if(everRead == 0)
		{
			res_sd = f_mount(&fs,"0:",1);
			everRead = 1;
		}
		res_sd = f_open(&fnew , GBKCODE_FILE_NAME, FA_OPEN_EXISTING | FA_READ);
		if ( res_sd == FR_OK ) 
		{
			f_lseek (&fnew, pos);		//指针偏移
			f_read( &fnew, pBuffer, WIDTH_CH_CHAR*HEIGHT_CH_CHAR/8, &br );//16*16大小的汉字 其字模 占用16*16/8个字节
			f_close(&fnew);
			return 0;  
		}
		else
			return -1;    
	}

#endif






