add none-fixed font support.
git-svn-id: https://rt-thread.googlecode.com/svn/trunk@961 bbd45198-f89e-11dd-88c7-29a3b14d5316
This commit is contained in:
parent
03072ba689
commit
74a97349d2
|
@ -20,6 +20,7 @@ common/image.c
|
|||
common/image_xpm.c
|
||||
common/image_hdc.c
|
||||
common/font.c
|
||||
common/font_bmp.c
|
||||
common/font_hz_file.c
|
||||
common/font_hz_bmp.c
|
||||
common/asc12font.c
|
||||
|
|
|
@ -211,6 +211,8 @@ const rt_uint8_t asc12_font[] = {
|
|||
const struct rtgui_font_bitmap asc12 =
|
||||
{
|
||||
asc12_font, /* bmp */
|
||||
RT_NULL, /* each character width, NULL for fixed font */
|
||||
RT_NULL, /* offset for each character */
|
||||
6, /* width */
|
||||
12, /* height */
|
||||
0, /* first char */
|
||||
|
|
|
@ -276,6 +276,8 @@ const unsigned char asc16_font[] = {
|
|||
struct rtgui_font_bitmap asc16 =
|
||||
{
|
||||
(const rt_uint8_t*)asc16_font, /* bmp */
|
||||
RT_NULL, /* each character width, NULL for fixed font */
|
||||
RT_NULL, /* offset for each character */
|
||||
8, /* width */
|
||||
16, /* height */
|
||||
0, /* first char */
|
||||
|
|
|
@ -156,75 +156,3 @@ void rtgui_font_get_metrics(struct rtgui_font* font, const char* text, rtgui_rec
|
|||
rt_memset(rect, 0, sizeof(rtgui_rect_t));
|
||||
}
|
||||
}
|
||||
|
||||
static void rtgui_bitmap_font_draw_text(struct rtgui_font* font, struct rtgui_dc* dc, const char* text, rt_ubase_t len, struct rtgui_rect* rect);
|
||||
static void rtgui_bitmap_font_get_metrics(struct rtgui_font* font, const char* text, rtgui_rect_t* rect);
|
||||
struct rtgui_font_engine bmp_font_engine =
|
||||
{
|
||||
RT_NULL,
|
||||
RT_NULL,
|
||||
rtgui_bitmap_font_draw_text,
|
||||
rtgui_bitmap_font_get_metrics
|
||||
};
|
||||
|
||||
void rtgui_bitmap_font_draw_char(struct rtgui_font_bitmap* font, struct rtgui_dc* dc, const char ch,
|
||||
rtgui_rect_t* rect)
|
||||
{
|
||||
const rt_uint8_t* font_ptr;
|
||||
rt_uint16_t x, y, h;
|
||||
register rt_base_t i, j, k, word_bytes;
|
||||
|
||||
/* check first and last char */
|
||||
if (ch < font->first_char || ch > font->last_char) return;
|
||||
|
||||
x = rect->x1;
|
||||
y = rect->y1;
|
||||
word_bytes = (((font->width - 1) / 8) + 1);
|
||||
|
||||
font_ptr = font->bmp + (ch - font->first_char) * word_bytes * font->height;
|
||||
|
||||
h = (font->height + y > rect->y2) ? rect->y2 - rect->y1 : font->height;
|
||||
|
||||
for (i = 0; i < h; i++)
|
||||
{
|
||||
for (j = 0; j < word_bytes; j++)
|
||||
{
|
||||
for (k = 0; k < 8; k++)
|
||||
{
|
||||
if (((font_ptr[i * word_bytes + j] >> (7 - k)) & 0x01) != 0)
|
||||
{
|
||||
/* draw a pixel */
|
||||
rtgui_dc_draw_point(dc, k + 8 * j + x, i + y);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void rtgui_bitmap_font_draw_text(struct rtgui_font* font, struct rtgui_dc* dc, const char* text, rt_ubase_t len, struct rtgui_rect* rect)
|
||||
{
|
||||
struct rtgui_font_bitmap* bmp_font = (struct rtgui_font_bitmap*)(font->data);
|
||||
|
||||
RT_ASSERT(bmp_font != RT_NULL);
|
||||
|
||||
while (len-- && rect->x1 < rect->x2)
|
||||
{
|
||||
rtgui_bitmap_font_draw_char(bmp_font, dc, *text, rect);
|
||||
|
||||
/* move x to next character */
|
||||
rect->x1 += bmp_font->width;
|
||||
text ++;
|
||||
}
|
||||
}
|
||||
|
||||
static void rtgui_bitmap_font_get_metrics(struct rtgui_font* font, const char* text, rtgui_rect_t* rect)
|
||||
{
|
||||
struct rtgui_font_bitmap* bmp_font = (struct rtgui_font_bitmap*)(font->data);
|
||||
|
||||
RT_ASSERT(bmp_font != RT_NULL);
|
||||
|
||||
/* set metrics rect */
|
||||
rect->x1 = rect->y1 = 0;
|
||||
rect->x2 = bmp_font->width * (rt_int16_t)rt_strlen((const char*)text);
|
||||
rect->y2 = bmp_font->height;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,118 @@
|
|||
/*
|
||||
* File : font.c
|
||||
* This file is part of RT-Thread RTOS
|
||||
* COPYRIGHT (C) 2006 - 2010, RT-Thread Development Team
|
||||
*
|
||||
* The license and distribution terms for this file may be
|
||||
* found in the file LICENSE in this distribution or at
|
||||
* http://www.rt-thread.org/license/LICENSE
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2010-09-15 Bernard first version
|
||||
*/
|
||||
#include <rtgui/font.h>
|
||||
#include <rtgui/dc.h>
|
||||
|
||||
/* bitmap font private data */
|
||||
|
||||
static void rtgui_bitmap_font_draw_text(struct rtgui_font* font, struct rtgui_dc* dc, const char* text, rt_ubase_t len, struct rtgui_rect* rect);
|
||||
static void rtgui_bitmap_font_get_metrics(struct rtgui_font* font, const char* text, rtgui_rect_t* rect);
|
||||
const struct rtgui_font_engine bmp_font_engine =
|
||||
{
|
||||
RT_NULL,
|
||||
RT_NULL,
|
||||
rtgui_bitmap_font_draw_text,
|
||||
rtgui_bitmap_font_get_metrics
|
||||
};
|
||||
|
||||
void rtgui_bitmap_font_draw_char(struct rtgui_font_bitmap* font, struct rtgui_dc* dc, const char ch,
|
||||
rtgui_rect_t* rect)
|
||||
{
|
||||
const rt_uint8_t* font_ptr;
|
||||
rt_uint16_t x, y, h;
|
||||
register rt_base_t i, j, k, word_bytes;
|
||||
|
||||
/* check first and last char */
|
||||
if (ch < font->first_char || ch > font->last_char) return;
|
||||
|
||||
x = rect->x1;
|
||||
y = rect->y1;
|
||||
/* get width */
|
||||
if (font->char_width == RT_NULL)
|
||||
{
|
||||
word_bytes = (((font->width - 1) / 8) + 1);
|
||||
font_ptr = font->bmp + (ch - font->first_char) * word_bytes * font->height;
|
||||
}
|
||||
else
|
||||
{
|
||||
word_bytes = ((font->char_width[ch - font->first_char] - 1)/8) + 1;
|
||||
font_ptr = font->bmp + font->offset[ch - font->first_char];
|
||||
}
|
||||
|
||||
h = (font->height + y > rect->y2) ? rect->y2 - rect->y1 : font->height;
|
||||
|
||||
for (i = 0; i < h; i++)
|
||||
{
|
||||
for (j = 0; j < word_bytes; j++)
|
||||
{
|
||||
for (k = 0; k < 8; k++)
|
||||
{
|
||||
if (((font_ptr[i * word_bytes + j] >> (7 - k)) & 0x01) != 0)
|
||||
{
|
||||
/* draw a pixel */
|
||||
rtgui_dc_draw_point(dc, k + 8 * j + x, i + y);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void rtgui_bitmap_font_draw_text(struct rtgui_font* font, struct rtgui_dc* dc, const char* text, rt_ubase_t len, struct rtgui_rect* rect)
|
||||
{
|
||||
struct rtgui_font_bitmap* bmp_font = (struct rtgui_font_bitmap*)(font->data);
|
||||
|
||||
RT_ASSERT(bmp_font != RT_NULL);
|
||||
|
||||
while (len-- && rect->x1 < rect->x2)
|
||||
{
|
||||
rtgui_bitmap_font_draw_char(bmp_font, dc, *text, rect);
|
||||
|
||||
/* move x to next character */
|
||||
if (bmp_font->char_width == RT_NULL)
|
||||
rect->x1 += bmp_font->width;
|
||||
else
|
||||
rect->x1 += bmp_font->char_width[*text - bmp_font->first_char];
|
||||
text ++;
|
||||
}
|
||||
}
|
||||
|
||||
static void rtgui_bitmap_font_get_metrics(struct rtgui_font* font, const char* text, rtgui_rect_t* rect)
|
||||
{
|
||||
struct rtgui_font_bitmap* bmp_font = (struct rtgui_font_bitmap*)(font->data);
|
||||
|
||||
RT_ASSERT(bmp_font != RT_NULL);
|
||||
|
||||
if (bmp_font->char_width != NULL)
|
||||
{
|
||||
rt_uint32_t index;
|
||||
|
||||
/* set metrics rect */
|
||||
rect->x1 = rect->y1 = 0;rect->x2 = 0;
|
||||
rect->y2 = bmp_font->height;
|
||||
|
||||
/* get width for each character */
|
||||
while (*text)
|
||||
{
|
||||
rect->x2 += bmp_font->char_width[*text - bmp_font->first_char];
|
||||
text ++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* set metrics rect */
|
||||
rect->x1 = rect->y1 = 0;
|
||||
rect->x2 = bmp_font->width * (rt_int16_t)rt_strlen((const char*)text);
|
||||
rect->y2 = bmp_font->height;
|
||||
}
|
||||
}
|
|
@ -12275,6 +12275,8 @@ const unsigned char hz12_font[] = {
|
|||
const struct rtgui_font_bitmap hz12 =
|
||||
{
|
||||
hz12_font, /* bmp */
|
||||
RT_NULL, /* each character width, NULL for fixed font */
|
||||
RT_NULL, /* offset for each character */
|
||||
12, /* width */
|
||||
12, /* height */
|
||||
0, /* first char */
|
||||
|
|
|
@ -16733,6 +16733,8 @@ const unsigned char hz16_font[] = {
|
|||
const struct rtgui_font_bitmap hz16 =
|
||||
{
|
||||
hz16_font, /* bmp */
|
||||
RT_NULL, /* each character width, NULL for fixed font */
|
||||
RT_NULL, /* offset for each character */
|
||||
16, /* width */
|
||||
16, /* height */
|
||||
0, /* first char */
|
||||
|
@ -16746,7 +16748,7 @@ struct rtgui_font rtgui_font_hz16 =
|
|||
16, /* height */
|
||||
1, /* refer count */
|
||||
&hz_bmp_font_engine,/* font engine */
|
||||
(void *)&hz16, /* font private data */
|
||||
(void *)&hz16, /* font private data */
|
||||
};
|
||||
|
||||
/* size = 267616 bytes */
|
||||
|
|
|
@ -35,19 +35,19 @@ struct rtgui_font_engine
|
|||
/*
|
||||
* bitmap font engine
|
||||
*/
|
||||
/* bitmap font private data */
|
||||
struct rtgui_font_bitmap
|
||||
{
|
||||
/* bitmap data */
|
||||
const rt_uint8_t* bmp;
|
||||
|
||||
rt_uint16_t width;
|
||||
rt_uint16_t height;
|
||||
|
||||
rt_uint8_t first_char;
|
||||
rt_uint8_t last_char;
|
||||
struct rtgui_font_bitmap
|
||||
{
|
||||
const rt_uint8_t* bmp; /* bitmap font data */
|
||||
const rt_uint8_t* char_width; /* each character width, NULL for fixed font */
|
||||
const rt_uint32_t* offset; /* offset for each character */
|
||||
|
||||
rt_uint16_t width; /* font width */
|
||||
rt_uint16_t height; /* font height */
|
||||
|
||||
rt_uint8_t first_char;
|
||||
rt_uint8_t last_char;
|
||||
};
|
||||
extern struct rtgui_font_engine bmp_font_engine;
|
||||
extern const struct rtgui_font_engine bmp_font_engine;
|
||||
|
||||
#include <rtgui/tree.h>
|
||||
SPLAY_HEAD(cache_tree, hz_cache);
|
||||
|
@ -87,7 +87,7 @@ struct rtgui_font
|
|||
rt_uint32_t refer_count;
|
||||
|
||||
/* font engine */
|
||||
struct rtgui_font_engine* engine;
|
||||
const struct rtgui_font_engine* engine;
|
||||
|
||||
/* font private data */
|
||||
void* data;
|
||||
|
|
Loading…
Reference in New Issue