]> www.fi.muni.cz Git - evince.git/blob - dvi/font.cc
4494b5299fb116751cddad6076afdde197ef53c4
[evince.git] / dvi / font.cc
1 #include "font.hh"
2
3 #include "painter.hh"
4 #include "dl-pkfont.hh"
5 #include "dl-vffont.hh"
6
7 using DviLib::FileLoader;
8 using DviLib::AbstractFont;
9 using DviLib::VfChar;
10 using DviLib::PkChar;
11 using DviLib::PkFont;
12 using DviLib::VfFont;
13
14 static char *
15 do_run_program (const char *program,
16                 GList *args,
17                 GError **err)
18 {
19     char **argv = g_new (char *, g_list_length (args) + 2);
20     GList *l;
21     int i;
22     char *result;
23
24     i = 0;
25     argv[i++] = g_strdup (program);
26     for (l = args; l; l = l->next)
27         argv[i++] = g_strdup ((char *)l->data);
28     argv[i++] = NULL;
29     
30     g_list_free (args);
31
32
33     /* run it */
34     g_spawn_sync         (NULL, /* working directory */
35                           argv, /* arguments */
36                           NULL, /* environment */
37                           G_SPAWN_SEARCH_PATH, /* flags */
38                           NULL, /* child setup */
39                           NULL, /* user data for child setup */
40                           &result, /* stdout */
41                           NULL, /* stderr */
42                           NULL, /* exit status */
43                           err /* GError */);
44
45     g_strfreev (argv);
46     
47     return result;
48 }
49
50
51 static char *
52 run_program (const char *program,
53              GError **err,
54              const char *arg1,
55              ...)
56 {
57     va_list arg_list;
58     GList *arguments = NULL;
59     char *s;
60
61     va_start (arg_list, arg1);
62
63     arguments = g_list_append (arguments, (gpointer)arg1);
64     
65     s = va_arg (arg_list, gchar*);
66     while (s)
67     {
68         arguments = g_list_append (arguments, s);
69         s = va_arg (arg_list, gchar*);
70     }
71
72     va_end (arg_list);
73
74     return do_run_program (program, arguments, err);
75 }
76
77 static char *
78 run_kpsewhich (int dpi,
79                string format,
80                string name)
81 {
82     char *dpistr = g_strdup_printf ("--dpi=%d", dpi);
83     char *formatstr = g_strdup_printf ("--format=%s", format.c_str());
84     char *namestr = g_strdup (name.c_str());
85     GError *err = NULL;
86     char *result;
87
88     result = run_program ("kpsewhich", &err, dpistr, formatstr, namestr, NULL);
89
90     if (!result)
91     {
92         cout << err->message << endl;
93     }
94     else
95     {
96         g_strstrip (result);
97
98         if (*result == '\0')
99         {
100             /* Nothing useful returned */
101             g_free (result);
102             result = NULL;
103         }
104     }
105
106     cout << "kpsewhich " << dpistr << " " << formatstr << " " << namestr << " " << endl;
107     
108     g_free (dpistr);
109     g_free (formatstr);
110     g_free (namestr);
111
112     return result;
113 }
114
115 static void
116 run_mktexpk (int dpi, string name)
117 {
118     char *dpistr = g_strdup_printf ("--bdpi=%d", dpi);
119     char *bdpistr = g_strdup_printf ("--dpi=%d", dpi);
120     char *namestr = g_strdup (name.c_str());
121     char *result;
122
123     cout << "mktexpk " << bdpistr << " " << dpistr << " " << " " << namestr << " " << endl;
124     
125     result = run_program ("mktexpk", NULL, bdpistr, dpistr, namestr, NULL);
126     if (result)
127         g_free (result);
128
129     g_free (dpistr);
130     g_free (bdpistr);
131     g_free (namestr);
132 }
133
134 AbstractFont *
135 FontFactory::create_font (std::string name, 
136                           int dpi,
137                           int at_size)
138 {
139     char *filename;
140
141     cout << "at size: " << at_size << endl;
142     
143     /* Find VF */
144     filename = run_kpsewhich (dpi, "vf", name);
145
146     if (filename)
147         return new VfFont (*new FileLoader (filename), at_size);
148
149     /* Try PK */
150     
151     filename = run_kpsewhich (dpi, "pk", name);
152
153     if (filename)
154         return new PkFont (*new FileLoader (filename), at_size);
155
156     /* Generate PK */
157     
158     run_mktexpk (dpi, name);
159
160     cout << "birnan" << endl;
161     
162     /* Try PK again */
163     filename = run_kpsewhich (dpi, "pk", name);
164
165     if (filename)
166         return new PkFont (*new FileLoader (filename), at_size);
167
168     cout << "no luck" << endl;
169     
170     throw (string ("bad font"));
171     
172     return NULL;
173 }