summaryrefslogtreecommitdiff
path: root/components/rtgui
diff options
context:
space:
mode:
authorkyle.hu.gz <[email protected]>2010-05-21 17:42:10 +0000
committerkyle.hu.gz <[email protected]>2010-05-21 17:42:10 +0000
commit0b02a2ebcae2f00bcfa0330a6d32859137ef7d85 (patch)
treeebc207328f16eb986b6037670a6c03de7017b132 /components/rtgui
parent0ce26895a515dbee47f8ceb272f56dbe89f684e8 (diff)
Add ASCII large font support.
git-svn-id: https://rt-thread.googlecode.com/svn/trunk@723 bbd45198-f89e-11dd-88c7-29a3b14d5316
Diffstat (limited to 'components/rtgui')
-rw-r--r--components/rtgui/common/font.c28
1 files changed, 16 insertions, 12 deletions
diff --git a/components/rtgui/common/font.c b/components/rtgui/common/font.c
index 9e9f63c7e4..07c7030831 100644
--- a/components/rtgui/common/font.c
+++ b/components/rtgui/common/font.c
@@ -171,27 +171,31 @@ void rtgui_bitmap_font_draw_char(struct rtgui_font_bitmap* font, struct rtgui_dc
rtgui_rect_t* rect)
{
const rt_uint8_t* font_ptr;
- rt_uint16_t x, y, w, h;
- register rt_base_t i, j;
+ 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);
- /* check first and last char */
- if (ch < font->first_char || ch > font->last_char) return;
- font_ptr = font->bmp + (ch - font->first_char) * font->height;
+ font_ptr = font->bmp + (ch - font->first_char) * word_bytes * font->height;
- w = (font->width + x > rect->x2)? rect->x2 - rect->x1 : font->width;
- h = (font->height + y > rect->y2)? rect->y2 - rect->y1 : font->height;
+ h = (font->height + y > rect->y2) ? rect->y2 - rect->y1 : font->height;
- for (i = 0; i < h; i ++ )
+ for (i = 0; i < h; i++)
{
- for (j = 0; j < w; j ++)
+ for (j = 0; j < word_bytes; j++)
{
- if ( ((font_ptr[i] >> (7-j)) & 0x01) != 0)
+ for (k = 0; k < 8; k++)
{
- /* draw a pixel */
- rtgui_dc_draw_point(dc, j + x, i + y);
+ 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);
+ }
}
}
}