我们知道,不像汉字,每个英文字母宽度是不同的,如果直接采用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<