font.c 3.9 KB
Newer Older
B
bernard.xiong 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/*
 * File      : font.c
 * This file is part of RT-Thread RTOS
 * COPYRIGHT (C) 2006 - 2009, 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
 * 2009-10-16     Bernard      first version
 */
#include <rtgui/font.h>
#include <rtgui/dc.h>

static rtgui_list_t _rtgui_font_list;
18
static struct rtgui_font *rtgui_default_font;
B
bernard.xiong 已提交
19 20

extern struct rtgui_font rtgui_font_asc16;
B
bernard.xiong 已提交
21
extern struct rtgui_font rtgui_font_arial16;
B
bernard.xiong 已提交
22
extern struct rtgui_font rtgui_font_asc12;
B
bernard.xiong 已提交
23
extern struct rtgui_font rtgui_font_arial12;
B
bernard.xiong 已提交
24 25 26 27 28 29 30
#ifdef RTGUI_USING_FONTHZ
extern struct rtgui_font rtgui_font_hz16;
extern struct rtgui_font rtgui_font_hz12;
#endif

void rtgui_font_system_init()
{
31
    rtgui_list_init(&(_rtgui_font_list));
B
bernard.xiong 已提交
32

33 34
    /* set default font to NULL */
    rtgui_default_font = RT_NULL;
B
bernard.xiong 已提交
35 36

#ifdef RTGUI_USING_FONT16
37
    rtgui_font_system_add_font(&rtgui_font_asc16);
B
bernard.xiong 已提交
38
#ifdef RTGUI_USING_FONTHZ
39
    rtgui_font_system_add_font(&rtgui_font_hz16);
B
bernard.xiong 已提交
40
#endif
41 42 43
#endif

#ifdef RTGUI_USING_FONT12
44
    rtgui_font_system_add_font(&rtgui_font_asc12);
B
bernard.xiong 已提交
45
#ifdef RTGUI_USING_FONTHZ
46
    rtgui_font_system_add_font(&rtgui_font_hz12);
B
bernard.xiong 已提交
47
#endif
48
#endif
B
bernard.xiong 已提交
49

50
#ifdef RTGUI_USING_FONT12
51 52
    if (rtgui_default_font == RT_NULL)
        rtgui_font_set_defaut(&rtgui_font_asc12);
53 54
#endif
#ifdef RTGUI_USING_FONT16
55 56
    if (rtgui_default_font == RT_NULL)
        rtgui_font_set_defaut(&rtgui_font_asc16);
57
#endif
B
bernard.xiong 已提交
58 59
}

60
void rtgui_font_system_add_font(struct rtgui_font *font)
B
bernard.xiong 已提交
61
{
62 63
    rtgui_list_init(&(font->list));
    rtgui_list_append(&_rtgui_font_list, &(font->list));
64

65 66 67
    /* init font */
    if (font->engine->font_init != RT_NULL)
        font->engine->font_init(font);
68

69 70 71
    /* first refer, load it */
    if (font->engine->font_load != RT_NULL)
        font->engine->font_load(font);
B
bernard.xiong 已提交
72
}
73
RTM_EXPORT(rtgui_font_system_add_font);
B
bernard.xiong 已提交
74

75
void rtgui_font_system_remove_font(struct rtgui_font *font)
B
bernard.xiong 已提交
76
{
77
    rtgui_list_remove(&_rtgui_font_list, &(font->list));
B
bernard.xiong 已提交
78
}
79
RTM_EXPORT(rtgui_font_system_remove_font);
B
bernard.xiong 已提交
80

81
struct rtgui_font *rtgui_font_default()
B
bernard.xiong 已提交
82
{
83
    return rtgui_default_font;
B
bernard.xiong 已提交
84 85
}

86
void rtgui_font_set_defaut(struct rtgui_font *font)
B
bernard.xiong 已提交
87
{
88
    rtgui_default_font = font;
B
bernard.xiong 已提交
89 90
}

91
struct rtgui_font *rtgui_font_refer(const char *family, rt_uint16_t height)
B
bernard.xiong 已提交
92
{
93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
    /* search font */
    struct rtgui_list_node *node;
    struct rtgui_font *font;

    rtgui_list_foreach(node, &_rtgui_font_list)
    {
        font = rtgui_list_entry(node, struct rtgui_font, list);
        if ((rt_strncmp(font->family, family, RTGUI_NAME_MAX) == 0) &&
                font->height == height)
        {
            font->refer_count ++;
            return font;
        }
    }

    return RT_NULL;
B
bernard.xiong 已提交
109
}
110
RTM_EXPORT(rtgui_font_refer);
B
bernard.xiong 已提交
111

112
void rtgui_font_derefer(struct rtgui_font *font)
B
bernard.xiong 已提交
113
{
114
    RT_ASSERT(font != RT_NULL);
B
bernard.xiong 已提交
115

116
    font->refer_count --;
B
bernard.xiong 已提交
117

118 119 120 121 122
    /* no refer, remove font */
    if (font->refer_count == 0)
    {
        rtgui_font_system_remove_font(font);
    }
B
bernard.xiong 已提交
123 124 125
}

/* draw a text */
126
void rtgui_font_draw(struct rtgui_font *font, struct rtgui_dc *dc, const char *text, rt_ubase_t len, struct rtgui_rect *rect)
B
bernard.xiong 已提交
127
{
128
    RT_ASSERT(font != RT_NULL);
B
bernard.xiong 已提交
129

130 131 132 133 134
    if (font->engine != RT_NULL &&
            font->engine->font_draw_text != RT_NULL)
    {
        font->engine->font_draw_text(font, dc, text, len, rect);
    }
B
bernard.xiong 已提交
135 136
}

137
int rtgui_font_get_string_width(struct rtgui_font *font, const char *text)
B
bernard.xiong 已提交
138
{
139
    rtgui_rect_t rect;
B
bernard.xiong 已提交
140

141 142
    /* get metrics */
    rtgui_font_get_metrics(font, text, &rect);
B
bernard.xiong 已提交
143

144
    return rect.x2 - rect.x1;
B
bernard.xiong 已提交
145 146
}

147
void rtgui_font_get_metrics(struct rtgui_font *font, const char *text, rtgui_rect_t *rect)
B
bernard.xiong 已提交
148
{
149 150 151 152 153 154 155 156 157 158 159 160
    RT_ASSERT(font != RT_NULL);

    if (font->engine != RT_NULL &&
            font->engine->font_get_metrics != RT_NULL)
    {
        font->engine->font_get_metrics(font, text, rect);
    }
    else
    {
        /* no font engine found, set rect to zero */
        rt_memset(rect, 0, sizeof(rtgui_rect_t));
    }
B
bernard.xiong 已提交
161
}