aboutsummaryrefslogtreecommitdiffstats
path: root/e-util/e-font.c
blob: 35b9d4db72d725a1c5e2693d71a08fbdce73c383 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#define _E_FONT_C_

/*
 * e-font
 *
 * Temporary wrappers around GdkFonts to get unicode displaying
 *
 * Author: Lauris Kaplinski <lauris@helixcode.com>
 *
 * Copyright (C) 2000 Helix Code, Inc.
 *
 */

#include <unicode.h>
#include "e-font.h"

struct _EFont {
    GdkFont font;
};

EFont *
e_font_from_gdk_name (const gchar *name)
{
    GdkFont *font;

    font = gdk_fontset_load (name);

    return (EFont *) font;
}

EFont *
e_font_from_gdk_font (GdkFont *font)
{
    gdk_font_ref (font);

    return (EFont *) font;
}

void
e_font_ref (EFont *font)
{
    gdk_font_ref (&font->font);
}

void
e_font_unref (EFont *font)
{
    gdk_font_unref (&font->font);
}

gint
e_font_ascent (EFont * font)
{
    return font->font.ascent;
}

gint
e_font_descent (EFont * font)
{
    return font->font.descent;
}

void
e_font_draw_utf8_text (GdkDrawable *drawable, EFont *font, EFontStyle style, GdkGC *gc, gint x, gint y, gchar *text, gint numbytes)
{
    guchar *iso;
    gchar *p;
    gint uni, len;

    g_return_if_fail (drawable != NULL);
    g_return_if_fail (font != NULL);
    g_return_if_fail (gc != NULL);
    g_return_if_fail (text != NULL);

    if (numbytes < 1) return;

    iso = alloca (numbytes);

    for (len = 0, p = text; p != NULL && p < (text + numbytes); len++, p = unicode_next_utf8 (p)) {
        unicode_get_utf8 (p, &uni);
        if ((uni < ' ') || (uni > 255)) uni = ' ';
        iso[len] = uni;
    }

    gdk_draw_text (drawable, &font->font, gc, x, y, iso, len);

    if (style & E_FONT_BOLD)
        gdk_draw_text (drawable, &font->font, gc, x + 1, y, iso, len);
}

gint
e_font_utf8_text_width (EFont *font, EFontStyle style, char *text, int numbytes)
{
    guchar *iso;
    gchar *p;
    gint uni, len;

    g_return_val_if_fail (font != NULL, 0);
    g_return_val_if_fail (text != NULL, 0);

    iso = alloca (numbytes);

    for (len = 0, p = text; p != NULL && p < (text + numbytes); len++, p = unicode_next_utf8 (p)) {
        unicode_get_utf8 (p, &uni);
        if ((uni < ' ') || (uni > 255)) uni = ' ';
        iso[len] = uni;
    }

    return gdk_text_width (&font->font, iso, len);
}

gint
e_font_utf8_char_width (EFont *font, EFontStyle style, char *text)
{
    unicode_char_t uni;
    guchar iso;

    g_return_val_if_fail (font != NULL, 0);
    g_return_val_if_fail (text != NULL, 0);

    if (!unicode_get_utf8 (text, &uni)) return 0;

    if ((uni < ' ') || (uni > 255)) uni = ' ';

    iso = uni;

    return gdk_text_width (&font->font, &iso, 1);
}