英文变宽字体的压缩存储和显示

我们知道,不像汉字,每个英文字母宽度是不同的,如果直接采用24x24的点阵位图, 会浪费不少空间,于是我们可以根据实际宽度按行紧挨着存储。如果不是8倍数长,比如是11x22,剩余的比特位填零补齐。 由于一般cpu 字长都是32位的,下面的表示使用32bit一个,内存对齐的存储更快。

/*英文变宽字体的压缩存储和显示*/
#include 
   
   
    
    
#include 
    
    
     
     

static const unsigned char s_asc_width[] =
{
	10,	6,	8,	14,	10,	18,	12,	4,	8,	8,	8,	12,	4,	8,	4,	8,
	10,	8,	10,	10,	12,	10,	10,	10,	10,	10,	4,	4,	10,	10,	10,	10,
	18,	14,	12,	12,	12,	12,	12,	14,	12,	4,	10,	12,	10,	16,	12,	14,
	12,	14,	14,	12,	12,	12,	14,	18,	14,	14,	12,	6,	8,	6,	10,	12,
	6,	10,	10,	10,	10,	10,	8,	10,	10,	4,	6,	10,	4,	14,	10,	10,
	10,	10,	8,	10,	8,	10,	12,	16,	10,	12,	10,	8,	4,	8,	10,	20
};

static const unsigned int s_asc_font[] =
{
	0x00000000,  	0x00000000,  	0x00000000,  	0x00000000,  /*0x0020*/
	0x00000000,  	0x00000000,  	0x00000000,
	0x00030c30,  	0xc30c30c3,  	0x0c30000c,  	0x30000000,  /*0x0021*/
	0x00000000,
	0x00006c6c,  	0x24244800,  	0x00000000,  	0x00000000,  /*0x0022*/
	0x00000000,  	0x00000000,
	0x00000000,  	0x63018c06,  	0x303187ff,  	0x1ffc0c60,  /*0x0023*/
	0x73818c1f,  	0xfc7ff063,  	0x039c0c60,  	0x31800000,
	0x00000000,  	0x00000000,
	0x000101e0,  	0xfc759966,  	0x41d03c07,  	0xc0781605,  /*0x0024*/
	0x996758fc,  	0x1e010040,  	0x00000000,
	0x00000000,  	0x018000f0,  	0x60661819,  	0x8c066301,  /*0x0025*/
	0x99803cc0,  	0x06330019,  	0xe006cc03,  	0x3300ccc0,
	0x63303078,  	0x0c0c0000,  	0x00000000,  	0x00000000,
	0x00000000,
	0x0000000f,  	0x00f81981,  	0x981980f0,  	0x0e01e033,  /*0x0026*/
	0xc61c6186,  	0x0c71c3f6,  	0x1e000000,  	0x00000000,
	0x00000000,
	0x00662240,  	0x00000000,  	0x00000000,                  /*0x0027*/
	0x00000c18,  	0x18303030,  	0x60606060,  	0x60606030,  /*0x0028*/
	0x30301818,  	0x0c000000,
	0x00003018,  	0x180c0c0c,  	0x06060606,  	0x0606060c,  /*0x0029*/
	0x0c0c1818,  	0x30000000,
	0x0000185a,  	0x7e183c24,  	0x00000000,  	0x00000000,  /*0x002a*/
	0x00000000,  	0x00000000,
	0x00000000,  	0x00000000,  	0x00000060,  	0x0600607f,  /*0x002b*/
	0xe7fe0600,  	0x60060000,  	0x00000000,  	0x00000000,
	0x00000000,
	0x00000000,  	0x00000006,  	0x62240000,                  /*0x002c*/
	0x00000000,  	0x00000000,  	0x00007c7c,  	0x00000000,  /*0x002d*/
	0x00000000,  	0x00000000,
	0x00000000,  	0x00000006,  	0x60000000,                  /*0x002e*/
	0x00000606,  	0x060c0c0c,  	0x0c181818,  	0x30303030,  /*0x002f*/
	0x60000000,  	0x00000000,
	0x000001e0,  	0xfc331866,  	0x19866198,  	0x66198661,  /*0x0030*/
	0x986330fc,  	0x1e000000,  	0x00000000,
	0x00000c0c,  	0x1c3c6c4c,  	0x0c0c0c0c,  	0x0c0c0c0c,  /*0x0031*/
	0x0c000000,  	0x00000000,
	0x000001e0,  	0xfc739860,  	0x18060300,  	0xc0603018,  /*0x0032*/
	0x0c0201fe,  	0x7f800000,  	0x00000000,
	0x000001e0,  	0xfc739860,  	0x180c0e03,  	0xc0380601,  /*0x0033*/
	0x986738fc,  	0x1e000000,  	0x00000000,
	0x00000007,  	0x00700f00,  	0xf01b01b0,  	0x33033063,  /*0x0034*/
	0x07fc7fc0,  	0x30030030,  	0x03000000,  	0x00000000,
	0x00000000,
	0x000003f0,  	0xfc300c06,  	0x01f87f18,  	0xe0180601,  /*0x0035*/
	0x986730fc,  	0x1e000000,  	0x00000000,
	0x000000e0,  	0xfc339866,  	0x01b87f1c,  	0xe6198661,  /*0x0036*/
	0x986338fc,  	0x1e000000,  	0x00000000,
	0x000007f9,  	0xfe0100c0,  	0x20180603,  	0x00c0300c,  /*0x0037*/
	0x06018060,  	0x18000000,  	0x00000000,
	0x000001e0,  	0xfc739866,  	0x19ce3f0f,  	0xc7398661,  /*0x0038*/
	0x986738fc,  	0x1e000000,  	0x00000000,
	0x000001e0,  	0xfc731866,  	0x1986619c,  	0xe3f87601,  /*0x0039*/
	0x984730fc,  	0x1c000000,  	0x00000000,
	0x00000066,  	0x00000006,  	0x60000000,                  /*0x003a*/
	0x00000066,  	0x00000006,  	0x62240000,                  /*0x003b*/
	0x00000000,  	0x000080e0,  	0x70707818,  	0x07807007,  /*0x003c*/
	0x00e00800,  	0x00000000,  	0x00000000,
	0x00000000,  	0x00000007,  	0xf9fe0000,  	0x0001fe7f,  /*0x003d*/
	0x80000000,  	0x00000000,  	0x00000000,
	0x00000000,  	0x00401c03,  	0x80380780,  	0x60783838,  /*0x003e*/
	0x1c040000,  	0x00000000,  	0x00000000,
	0x000001e0,  	0xfc739860,  	0x18060301,  	0xc060300c,  /*0x003f*/
	0x03000030,  	0x0c000000,  	0x00000000,
	0x00000000,  	0x001f001f,  	0xf00e0e07,  	0x01c38db0,  /*0x0040*/
	0xc7e63339,  	0x98c66661,  	0x99986666,  	0x31998cc6,
	0x77718ff8,  	0x33bc0c00,  	0x61803078,  	0x380ffc00,
	0x00000000,
	0x00000000,  	0x7001c00d,  	0x803600d8,  	0x077018c0,  /*0x0041*/
	0x63018c0f,  	0xf83fe0c1,  	0x8306180c,  	0x60300000,
	0x00000000,  	0x00000000,
	0x0000007f,  	0x07f861c6,  	0x0c60c618,  	0x7f07f861,  /*0x0042*/
	0xc60c60c6,  	0x0c61c7f8,  	0x7f000000,  	0x00000000,
	0x00000000,
	0x0000000f,  	0x01fc38c3,  	0x0e606600,  	0x60060060,  /*0x0043*/
	0x06066063,  	0x0c39c1f8,  	0x0f000000,  	0x00000000,
	0x00000000,
	0x0000007f,  	0x07f861c6,  	0x0c606606,  	0x60660660,  /*0x0044*/
	0x66066066,  	0x0c61c7f8,  	0x7f000000,  	0x00000000,
	0x00000000,
	0x0000007f,  	0xc7fc6006,  	0x00600600,  	0x7fc7fc60,  /*0x0045*/
	0x06006006,  	0x006007fc,  	0x7fc00000,  	0x00000000,
	0x00000000,
	0x0000007f,  	0xc7fc6006,  	0x00600600,  	0x7f87f860,  /*0x0046*/
	0x06006006,  	0x00600600,  	0x60000000,  	0x00000000,
	0x00000000,
	0x00000000,  	0x7807f838,  	0x60c0c603,  	0x18006001,  /*0x0047*/
	0x87c61f18,  	0x0c6030c0,  	0xc38707f8,  	0x07800000,
	0x00000000,  	0x00000000,
	0x00000060,  	0x66066066,  	0x06606606,  	0x7fe7fe60,  /*0x0048*/
	0x66066066,  	0x06606606,  	0x60600000,  	0x00000000,
	0x00000000,
	0x00666666,  	0x66666666,  	0x60000000,                  /*0x0049*/
	0x00000030,  	0x0c0300c0,  	0x300c0300,  	0xc0300c63,  /*0x004a*/
	0x18c730f8,  	0x1c000000,  	0x00000000,
	0x00000060,  	0xc60c6186,  	0x306606c0,  	0x6c07e076,  /*0x004b*/
	0x06306306,  	0x1860c60c,  	0x60600000,  	0x00000000,
	0x00000000,
	0x00000601,  	0x80601806,  	0x01806018,  	0x06018060,  /*0x004c*/
	0x180601fe,  	0x7f800000,  	0x00000000,
	0x00000000,  	0x701c701c,  	0x781c783c,  	0x783c783c,  /*0x004d*/
	0x6c6c6c6c,  	0x6c6c66ec,  	0x66cc66cc,  	0x66cc638c,
	0x638c0000,  	0x00000000,  	0x00000000,
	0x00000060,  	0x67067067,  	0x867866c6,  	0x6e666667,  /*0x004e*/
	0x663661e6,  	0x1e60e60e,  	0x60600000,  	0x00000000,
	0x00000000,
	0x00000000,  	0xf807f038,  	0xe0c18603,  	0x180c6031,  /*0x004f*/
	0x80c60318,  	0x0c6030c1,  	0x838e07f0,  	0x0f800000,
	0x00000000,  	0x00000000,
	0x0000007f,  	0x07f861c6,  	0x0c60c60c,  	0x61c7f87f,  /*0x0050*/
	0x06006006,  	0x00600600,  	0x60000000,  	0x00000000,
	0x00000000,
	0x00000000,  	0xf807f038,  	0xe0c18603,  	0x180c6031,  /*0x0051*/
	0x80c60318,  	0x0c6020c5,  	0x838c07f8,  	0x0f300040,
	0x00000000,  	0x00000000,
	0x00000007,  	0xf81ff060,  	0xe1818606,  	0x18387fc1,  /*0x0052*/
	0xf8063018,  	0x6060c183,  	0x06061818,  	0x60300000,
	0x00000000,  	0x00000000,
	0x0000001f,  	0x03f871c6,  	0x0c600700,  	0x3c00f003,  /*0x0053*/
	0x801c00c6,  	0x0c71c3f8,  	0x1f000000,  	0x00000000,
	0x00000000,
	0x0000007f,  	0xe7fe0600,  	0x60060060,  	0x06006006,  /*0x0054*/
	0x00600600,  	0x60060060,  	0x06000000,  	0x00000000,
	0x00000000,
	0x00000060,  	0x66066066,  	0x06606606,  	0x60660660,  /*0x0055*/
	0x66066066,  	0x0630c3fc,  	0x1f000000,  	0x00000000,
	0x00000000,
	0x00000006,  	0x03180c30,  	0x60c18306,  	0x0c1818c0,  /*0x0056*/
	0x63018c03,  	0x600d8036,  	0x00d801c0,  	0x07000000,
	0x00000000,  	0x00000000,
	0x00000000,  	0x061c3187,  	0x0c61430c,  	0xd9c33660,  /*0x0057*/
	0xcd983366,  	0x0cd981b6,  	0xc06db01b,  	0x6c06db01,
	0xa2c038e0,  	0x0e380000,  	0x00000000,  	0x00000000,
	0x00000000,
	0x00000006,  	0x030c1838,  	0xc06300d8,  	0x03600700,  /*0x0058*/
	0x1c007003,  	0x600d8063,  	0x038e0c18,  	0x60300000,
	0x00000000,  	0x00000000,
	0x00000006,  	0x018c0c38,  	0x306180cc,  	0x03300780,  /*0x0059*/
	0x1e003000,  	0xc003000c,  	0x003000c0,  	0x03000000,
	0x00000000,  	0x00000000,
	0x0000007f,  	0xe7fe0060,  	0x0c018030,  	0x0300600c,  /*0x005a*/
	0x01c01803,  	0x006007fe,  	0x7fe00000,  	0x00000000,
	0x00000000,
	0x00079e61,  	0x86186186,  	0x18618618,  	0x61861e78,  /*0x005b*/
	0x00000000,
	0x00006060,  	0x70303030,  	0x30381818,  	0x18181c0c,  /*0x005c*/
	0x0c000000,  	0x00000000,
	0x00079e18,  	0x61861861,  	0x86186186,  	0x18619e78,  /*0x005d*/
	0x00000000,
	0x000001c0,  	0x70360d83,  	0x60d86318,  	0xc0000000,  /*0x005e*/
	0x00000000,  	0x00000000,  	0x00000000,
	0x00000000,  	0x00000000,  	0x00000000,  	0x00000000,  /*0x005f*/
	0x00000000,  	0x00000000,  	0x0000007f,  	0xe7fe0000,
	0x00000000,
	0x00060c10,  	0x00000000,  	0x00000000,  	0x00000000,  /*0x0060*/
	0x00000000,
	0x00000000,  	0x00000001,  	0xf0fe6180,  	0xe1f8f661,  /*0x0061*/
	0x986639fe,  	0x39800000,  	0x00000000,
	0x00000601,  	0x80601806,  	0xe1fc7398,  	0x66198661,  /*0x0062*/
	0x986731fc,  	0x6e000000,  	0x00000000,
	0x00000000,  	0x00000001,  	0xe0f87318,  	0x06018060,  /*0x0063*/
	0x18c730f8,  	0x1c000000,  	0x00000000,
	0x00000018,  	0x06018061,  	0xd8fe7398,  	0x66198661,  /*0x0064*/
	0x986338fe,  	0x1d800000,  	0x00000000,
	0x00000000,  	0x00000001,  	0xe0fc3398,  	0x67f9fe60,  /*0x0065*/
	0x180718fc,  	0x1e000000,  	0x00000000,
	0x00001e3e,  	0x30307c7c,  	0x30303030,  	0x30303030,  /*0x0066*/
	0x30000000,  	0x00000000,
	0x00000000,  	0x00000001,  	0xd8fe3398,  	0x66198661,  /*0x0067*/
	0x986738fe,  	0x1d806639,  	0xfc3e0000,
	0x00000601,  	0x80601806,  	0xf1fe7398,  	0x66198661,  /*0x0068*/
	0x98661986,  	0x61800000,  	0x00000000,
	0x00660066,  	0x66666666,  	0x60000000,                  /*0x0069*/
	0x00018600,  	0x01861861,  	0x86186186,  	0x18619e70,  /*0x006a*/
	0x00000000,
	0x00000601,  	0x80601806,  	0x31986c1a,  	0x0781f06c,  /*0x006b*/
	0x1986618c,  	0x63000000,  	0x00000000,
	0x00666666,  	0x66666666,  	0x60000000,                  /*0x006c*/
	0x00000000,  	0x00000000,  	0x000006e7,  	0x1fbe7399,  /*0x006d*/
	0x8c663198,  	0xc663198c,  	0x663198c6,  	0x63180000,
	0x00000000,  	0x00000000,
	0x00000000,  	0x00000006,  	0xf1fe7398,  	0x66198661,  /*0x006e*/
	0x98661986,  	0x61800000,  	0x00000000,
	0x00000000,  	0x00000001,  	0xe0fc7398,  	0x66198661,  /*0x006f*/
	0x986738fc,  	0x1e000000,  	0x00000000,
	0x00000000,  	0x00000006,  	0xe1fc7398,  	0x66198661,  /*0x0070*/
	0x986731fc,  	0x6e180601,  	0x80600000,
	0x00000000,  	0x00000001,  	0xd8fe7398,  	0x66198661,  /*0x0071*/
	0x986338fe,  	0x1d806018,  	0x06018000,
	0x00000000,  	0x00006c7c,  	0x60606060,  	0x60606060,  /*0x0072*/
	0x60000000,  	0x00000000,
	0x00000000,  	0x00000003,  	0xc0f86318,  	0x03c07803,  /*0x0073*/
	0x00c631f8,  	0x3c000000,  	0x00000000,
	0x00001030,  	0x30307c7c,  	0x30303030,  	0x3030303c,  /*0x0074*/
	0x1c000000,  	0x00000000,
	0x00000000,  	0x00000006,  	0x19866198,  	0x66198661,  /*0x0075*/
	0x986739fe,  	0x3d800000,  	0x00000000,
	0x00000000,  	0x00000000,  	0x0060c60c,  	0x31831831,  /*0x0076*/
	0x83b81b01,  	0xb01b00e0,  	0x0e000000,  	0x00000000,
	0x00000000,
	0x00000000,  	0x00000000,  	0x00000000,  	0x638c638c,  /*0x0077*/
	0x638c36d8,  	0x36d836d8,  	0x36d836d8,  	0x34d81c70,
	0x1c700000,  	0x00000000,  	0x00000000,
	0x00000000,  	0x00000006,  	0x18cc3307,  	0x81e0301e,  /*0x0078*/
	0x078330cc,  	0x61800000,  	0x00000000,
	0x00000000,  	0x00000000,  	0x0060c318,  	0x3183181b,  /*0x0079*/
	0x01b01b00,  	0xe00e00e0,  	0x0c00c00c,  	0x03803000,
	0x00000000,
	0x00000000,  	0x00000007,  	0xf9fe0180,  	0xc0603018,  /*0x007a*/
	0x0c0601fe,  	0x7f800000,  	0x00000000,
	0x00000e1e,  	0x18181818,  	0x18386070,  	0x38181818,  /*0x007b*/
	0x1818181e,  	0x0e000000,
	0x00666666,  	0x66666666,  	0x66666000,                  /*0x007c*/
	0x00007078,  	0x18181818,  	0x180c060e,  	0x1c181818,  /*0x007d*/
	0x18181878,  	0x70000000,
	0x00000000,  	0x00000000,  	0x0000389f,  	0xe4700000,  /*0x007e*/
	0x00000000,  	0x00000000,  	0x00000000,
	0x00000000,  	0x00000000,  	0x00000000,  	0x00000006,  /*0x007F*/
	0x0000e000,  	0x1c000380,  	0x007fff87,  	0xfff83800,
	0x01c0000e,  	0x00006000,  	0x00000000,  	0x00000000,
	0x00000000,  	0x00000000
};

static int osd_font_get(char ch, int *w, int *h, const unsigned int **bits)
{
	int idx, i, j;
	const int height = 22;
	int num = sizeof(s_asc_width)/sizeof(s_asc_width[0]);

	idx = ch -  ' ';
	if(idx < 0 || idx >= num)return printf("unkown ch 0x%x\n", ch);

	j = 0;
	for(i = 0; i < idx; ++i){
		j += (s_asc_width[i] * height + 31)/32;
	}	
	if(bits)*bits =  s_asc_font + j;
	if(w)*w = s_asc_width[idx];
	if(h)*h = height;	
	return 0;
}

int osd_draw_char_en(char ch, unsigned int *fb, int stride, int x, int y, int w, int h, unsigned int color, unsigned int bgcolor)
{
	unsigned int *ptr = fb + (y*stride) + x;
	const unsigned int *bits = NULL;
	int height;
	int i, j, k, total_bits, width;	

	if(osd_font_get(ch, &width, &height, &bits))return 0;
	total_bits = width * height;

	for(i = 0, j = 31, k = 0; i < total_bits; ++i){
		ptr[k++] = (*bits & (1<
     
     
    
    
   
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值