]> www.fi.muni.cz Git - evince.git/blob - dvi/font.cc
512370e96c276cf5eb159fee61b0c700dafc0a09
[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     result = run_program ("mktexpk", NULL, bdpistr, dpistr, namestr, NULL);
124     if (result)
125         g_free (result);
126
127     g_free (dpistr);
128     g_free (bdpistr);
129     g_free (namestr);
130 }
131
132 AbstractFont *
133 FontFactory::create_font (std::string name, 
134                           int dpi,
135                           int at_size)
136 {
137     char *filename;
138
139     /* Find VF */
140     filename = run_kpsewhich (dpi, "vf", name);
141
142     if (filename)
143         return new VfFont (*new FileLoader (filename), at_size);
144
145     /* Try PK */
146     
147     filename = run_kpsewhich (dpi, "pk", name);
148
149     if (filename)
150         return new PkFont (*new FileLoader (filename), at_size);
151
152     /* Generate PK */
153     
154     run_mktexpk (dpi, name);
155
156     cout << "birnan" << endl;
157     
158     /* Try PK again */
159     filename = run_kpsewhich (dpi, "pk", name);
160
161     if (filename)
162         return new PkFont (*new FileLoader (filename), at_size);
163
164     cout << "no luck" << endl;
165     
166     throw (string ("bad font"));
167     
168     return NULL;
169 }