File: font.c

package info (click to toggle)
afterstep 2.2.12-19
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 33,168 kB
  • sloc: ansic: 201,695; sh: 5,894; xml: 3,721; makefile: 2,095; perl: 1,558; cpp: 811
file content (113 lines) | stat: -rw-r--r-- 2,942 bytes parent folder | download | duplicates (6)
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
#include "../configure.h"
#include "asapp.h"
#include "screen.h"
#include "../libAfterImage/afterimage.h"

const char *default_font = "fixed";

/***************************************************************
 *
 * load a font into a MyFont structure
 * if name == NULL, loads default font
 *
 **************************************************************/
#if defined(LOG_FONT_CALLS) && defined(DEBUG_ALLOCS)
Bool
l_load_font (const char *file, int line, const char *name, MyFont * font)
#else
Bool load_font (const char *name_in, MyFont * font)
#endif
{
	char *name;
	char *clean_name;
	int font_size = asxml_var_get ("font.size");

	if (font == NULL)
		return False;

	if (font_size <= 0)
		font_size = 14;

#if defined(LOG_FONT_CALLS) && defined(DEBUG_ALLOCS)
	log_call (file, line, "load_font", name);
#endif
	if (ASDefaultScr->font_manager == NULL) {
		char *path = getenv ("FONT_PATH");

		if (path == NULL)
			path = getenv ("PATH");
		ASDefaultScr->font_manager = create_font_manager (dpy, path, NULL);
	}

	name = name_in ? (char *)name_in : font->name;

	clean_name = name;
	if (clean_name != NULL) {
		int i = 0;
		register char *ptr = clean_name;

		while (ptr[i])
			++i;
		while (--i >= 0)
			if (!isdigit (ptr[i]))
				break;
		if ((isspace (ptr[i]) || ptr[i] == '-') && ptr[i + 1]) {
			font_size = atoi (&(ptr[i + 1]));
			while (i > 0 && isspace (ptr[i - 1]))
				--i;
			clean_name = mystrndup (name, i);
		}
	}
	if (clean_name != NULL) {
		if ((font->as_font =
				 get_asfont (ASDefaultScr->font_manager, clean_name, 0, font_size,
										 ASF_Freetype)) != NULL)
			show_progress ("Successfully loaded freetype font \"%s\"",
										 clean_name);
	}
	if (font->as_font == NULL && name != NULL) {
		if ((font->as_font =
				 get_asfont (ASDefaultScr->font_manager, name, 0, font_size,
										 ASF_GuessWho)) != NULL)
			show_progress ("Successfully loaded font \"%s\"", name);
	}
	if (font->as_font == NULL) {
		font->as_font =
				get_asfont (ASDefaultScr->font_manager, default_font, 0, font_size,
										ASF_GuessWho);
		show_warning ("failed to load font \"%s\" - using default instead",
									name);
	}

	if (clean_name && clean_name != name)
		free (clean_name);

	if (font->as_font != NULL && name != font->name)
		set_string (&(font->name), mystrdup (name));

	return (font->as_font != NULL);
}

/***************************************************************
 *
 * unload a font from a MyFont structure
 *
 **************************************************************/
#if defined(LOG_FONT_CALLS) && defined(DEBUG_ALLOCS)
void l_unload_font (const char *file, int line, MyFont * font)
#else
void unload_font (MyFont * font)
#endif
{
#if defined(LOG_FONT_CALLS) && defined(DEBUG_ALLOCS)
	log_call (file, line, "unload_font", font->name);
#endif
	if (font->as_font) {
		release_font (font->as_font);
		font->as_font = NULL;
	}

	if (font->name != NULL)
		free (font->name);
	font->name = NULL;
}