1 #include <stdio.h>
2 #include <string.h>
3 
4 #include <grass/gis.h>
5 #include "driver.h"
6 #include "driverlib.h"
7 
8 static int font_type = GFONT_STROKE;
9 static char *encoding;
10 
stroke_set(const char * filename)11 static void stroke_set(const char *filename)
12 {
13     if (font_init(filename) == 0)
14 	font_type = GFONT_STROKE;
15 }
16 
freetype_set(const char * filename,int index)17 static void freetype_set(const char *filename, int index)
18 {
19     if (font_init_freetype(filename, index) == 0)
20 	font_type = GFONT_FREETYPE;
21 }
22 
driver_set(const char * name)23 static void driver_set(const char *name)
24 {
25     (*driver->Set_font)(name);
26     font_type = GFONT_DRIVER;
27 }
28 
font_get_type(void)29 int font_get_type(void)
30 {
31     return font_type;
32 }
33 
font_get_encoding(void)34 const char *font_get_encoding(void)
35 {
36     if (!encoding)
37 	encoding = G_store("ISO-8859-1");
38     return encoding;
39 }
40 
font_list(char *** list,int * count,int verbose)41 static void font_list(char ***list, int *count, int verbose)
42 {
43     char **fonts;
44     int num_fonts;
45     int i;
46 
47     for (i = 0; ftcap[i].name; i++)
48 	;
49     num_fonts = i;
50 
51     G_debug(2, "font_list: num_fonts=%d", num_fonts);
52     fonts = G_malloc(num_fonts * sizeof(const char *));
53 
54     for (i = 0; i < num_fonts; i++) {
55 	struct GFONT_CAP *p = &ftcap[i];
56 
57 	G_debug(4, "font: %d (%s)", i, p->name);
58 	if (verbose) {
59 	    char buf[GPATH_MAX];
60 
61 	    sprintf(buf, "%s|%s|%d|%s|%d|%s|",
62 		    p->name, p->longname, p->type,
63 		    p->path, p->index, p->encoding);
64 
65 	    fonts[i] = G_store(buf);
66 	}
67 	else
68 	    fonts[i] = G_store(p->name);
69     }
70 
71     *list = fonts;
72     *count = num_fonts;
73 }
74 
free_font_list(char ** fonts,int count)75 static void free_font_list(char **fonts, int count)
76 {
77     int i;
78 
79     for (i = 0; i < count; i++)
80 	G_free(fonts[i]);
81 
82     G_free(fonts);
83 }
84 
COM_Set_font(const char * name)85 void COM_Set_font(const char *name)
86 {
87     int i;
88 
89     if (G_is_absolute_path(name)) {
90 	if (font_exists(name))
91 	    freetype_set(name, 0);
92 	return;
93     }
94 
95     for (i = 0; ftcap[i].name; i++) {
96 	struct GFONT_CAP *cap = &ftcap[i];
97 
98 	if (strcmp(name, cap->name) != 0)
99 	    continue;
100 
101 	switch (cap->type) {
102 	case GFONT_FREETYPE:
103 	    freetype_set(cap->path, cap->index);
104 	    COM_Set_encoding(cap->encoding);
105 	    break;
106 	case GFONT_STROKE:
107 	    stroke_set(cap->name);
108 	    break;
109 	}
110 	return;
111     }
112 
113 
114     if (driver->Font_info && driver->Set_font) {
115 	char **list = NULL;
116 	int count = 0;
117 
118 	(*driver->Font_info)(&list, &count);
119 
120 	for (i = 0; i < count; i++) {
121 	    struct GFONT_CAP cap;
122 
123 	    if (!parse_fontcap_entry(&cap, list[i]))
124 		continue;
125 
126 	    if (cap.type != GFONT_DRIVER || strcmp(name, cap.name) != 0)
127 		continue;
128 
129 	    driver_set(cap.name);
130 	    COM_Set_encoding(cap.encoding);
131 	    break;
132 	}
133 
134 	free_font_list(list, count);
135 	return;
136     }
137 
138     stroke_set("romans");
139 }
140 
COM_Set_encoding(const char * enc)141 void COM_Set_encoding(const char *enc)
142 {
143     if (encoding)
144 	G_free(encoding);
145 
146     encoding = G_store(enc);
147 }
148 
COM_Font_list(char *** list,int * count)149 void COM_Font_list(char ***list, int *count)
150 {
151     font_list(list, count, 0);
152     if (driver->Font_list)
153 	(*driver->Font_list)(list, count);
154 }
155 
COM_Font_info(char *** list,int * count)156 void COM_Font_info(char ***list, int *count)
157 {
158     font_list(list, count, 1);
159     if (driver->Font_info)
160 	(*driver->Font_info)(list, count);
161 }
162