GRASS GIS 7 Programmer's Manual  7.0.4(2016)-r00000
font.c
Go to the documentation of this file.
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 
11 static void stroke_set(const char *filename)
12 {
13  if (font_init(filename) == 0)
14  font_type = GFONT_STROKE;
15 }
16 
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 
23 static void driver_set(const char *name)
24 {
25  (*driver->Set_font)(name);
26  font_type = GFONT_DRIVER;
27 }
28 
29 int font_get_type(void)
30 {
31  return font_type;
32 }
33 
34 const char *font_get_encoding(void)
35 {
36  if (!encoding)
37  encoding = G_store("ISO-8859-1");
38  return encoding;
39 }
40 
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  fonts = G_malloc(num_fonts * sizeof(const char *));
52 
53  for (i = 0; i < num_fonts; i++) {
54  struct GFONT_CAP *p = &ftcap[i];
55 
56  if (verbose) {
57  char buf[GPATH_MAX];
58 
59  sprintf(buf, "%s|%s|%d|%s|%d|%s|",
60  p->name, p->longname, p->type,
61  p->path, p->index, p->encoding);
62 
63  fonts[i] = G_store(buf);
64  }
65  else
66  fonts[i] = G_store(p->name);
67  }
68 
69  *list = fonts;
70  *count = num_fonts;
71 }
72 
73 static void free_font_list(char **fonts, int count)
74 {
75  int i;
76 
77  for (i = 0; i < count; i++)
78  G_free(fonts[i]);
79 
80  G_free(fonts);
81 }
82 
83 void COM_Set_font(const char *name)
84 {
85  int i;
86 
87  if (G_is_absolute_path(name)) {
88  if (font_exists(name))
89  freetype_set(name, 0);
90  return;
91  }
92 
93  for (i = 0; ftcap[i].name; i++) {
94  struct GFONT_CAP *cap = &ftcap[i];
95 
96  if (strcmp(name, cap->name) != 0)
97  continue;
98 
99  switch (cap->type) {
100  case GFONT_FREETYPE:
101  freetype_set(cap->path, cap->index);
102  COM_Set_encoding(cap->encoding);
103  break;
104  case GFONT_STROKE:
105  stroke_set(cap->name);
106  break;
107  }
108  return;
109  }
110 
111 
112  if (driver->Font_info && driver->Set_font) {
113  char **list = NULL;
114  int count = 0;
115 
116  (*driver->Font_info)(&list, &count);
117 
118  for (i = 0; i < count; i++) {
119  struct GFONT_CAP cap;
120 
121  if (!parse_fontcap_entry(&cap, list[i]))
122  continue;
123 
124  if (cap.type != GFONT_DRIVER || strcmp(name, cap.name) != 0)
125  continue;
126 
127  driver_set(cap.name);
128  COM_Set_encoding(cap.encoding);
129  break;
130  }
131 
132  free_font_list(list, count);
133  return;
134  }
135 
136  stroke_set("romans");
137 }
138 
139 void COM_Set_encoding(const char *enc)
140 {
141  if (encoding)
142  G_free(encoding);
143 
144  encoding = G_store(enc);
145 }
146 
147 void COM_Font_list(char ***list, int *count)
148 {
149  font_list(list, count, 0);
150  if (driver->Font_list)
151  (*driver->Font_list)(list, count);
152 }
153 
154 void COM_Font_info(char ***list, int *count)
155 {
156  font_list(list, count, 1);
157  if (driver->Font_info)
158  (*driver->Font_info)(list, count);
159 }
int font_exists(const char *)
Check if font exists.
Definition: parse_ftcap.c:27
int font_init(const char *)
Definition: font2.c:180
int count
char * G_store(const char *s)
Copy string to allocated memory.
Definition: strings.c:86
const char * font_get_encoding(void)
Definition: font.c:34
int font_get_type(void)
Definition: font.c:29
#define NULL
Definition: ccmath.h:32
struct GFONT_CAP * ftcap
Definition: driver/init.c:27
void COM_Font_list(char ***list, int *count)
Definition: font.c:147
void COM_Set_encoding(const char *enc)
Definition: font.c:139
int font_init_freetype(const char *, int)
Definition: font_freetype.c:9
struct list * list
Definition: read_list.c:24
void COM_Font_info(char ***list, int *count)
Definition: font.c:154
void(* Font_list)(char ***, int *)
Definition: driver.h:53
Definition: driver.h:22
void COM_Set_font(const char *name)
Definition: font.c:83
void(* Font_info)(char ***, int *)
Definition: driver.h:54
int parse_fontcap_entry(struct GFONT_CAP *, const char *)
Parse fontcap entry.
Definition: parse_ftcap.c:41
int G_is_absolute_path(const char *path)
Checks if a specified path looks like an absolute path on the host system.
Definition: paths.c:62
const char * name
Definition: named_colr.c:7
void(* Set_font)(const char *)
Definition: driver.h:52
void G_free(void *buf)
Free allocated memory.
Definition: alloc.c:149