Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/dvi/font.cc
diff options
context:
space:
mode:
authorSøren Sandmann <sandmann@redhat.com>2004-12-21 23:57:26 (GMT)
committer Søren Sandmann Pedersen <ssp@src.gnome.org>2004-12-21 23:57:26 (GMT)
commit4296951e94a43c723e9522b588cab178eb66d144 (patch)
tree63ba229741d10df67fe87f24b6241903e16e9764 /dvi/font.cc
parent3e73e947a3a8c03da8f35f52e2a42ba066e2be2a (diff)
New directory with the beginning of a .dvi backend.
Tue Dec 21 18:55:06 2004 Søren Sandmann <sandmann@redhat.com> * dvi/*: New directory with the beginning of a .dvi backend.
Diffstat (limited to 'dvi/font.cc')
-rwxr-xr-xdvi/font.cc169
1 files changed, 169 insertions, 0 deletions
diff --git a/dvi/font.cc b/dvi/font.cc
new file mode 100755
index 0000000..512370e
--- /dev/null
+++ b/dvi/font.cc
@@ -0,0 +1,169 @@
+#include "font.hh"
+
+#include "painter.hh"
+#include "dl-pkfont.hh"
+#include "dl-vffont.hh"
+
+using DviLib::FileLoader;
+using DviLib::AbstractFont;
+using DviLib::VfChar;
+using DviLib::PkChar;
+using DviLib::PkFont;
+using DviLib::VfFont;
+
+static char *
+do_run_program (const char *program,
+ GList *args,
+ GError **err)
+{
+ char **argv = g_new (char *, g_list_length (args) + 2);
+ GList *l;
+ int i;
+ char *result;
+
+ i = 0;
+ argv[i++] = g_strdup (program);
+ for (l = args; l; l = l->next)
+ argv[i++] = g_strdup ((char *)l->data);
+ argv[i++] = NULL;
+
+ g_list_free (args);
+
+
+ /* run it */
+ g_spawn_sync (NULL, /* working directory */
+ argv, /* arguments */
+ NULL, /* environment */
+ G_SPAWN_SEARCH_PATH, /* flags */
+ NULL, /* child setup */
+ NULL, /* user data for child setup */
+ &result, /* stdout */
+ NULL, /* stderr */
+ NULL, /* exit status */
+ err /* GError */);
+
+ g_strfreev (argv);
+
+ return result;
+}
+
+
+static char *
+run_program (const char *program,
+ GError **err,
+ const char *arg1,
+ ...)
+{
+ va_list arg_list;
+ GList *arguments = NULL;
+ char *s;
+
+ va_start (arg_list, arg1);
+
+ arguments = g_list_append (arguments, (gpointer)arg1);
+
+ s = va_arg (arg_list, gchar*);
+ while (s)
+ {
+ arguments = g_list_append (arguments, s);
+ s = va_arg (arg_list, gchar*);
+ }
+
+ va_end (arg_list);
+
+ return do_run_program (program, arguments, err);
+}
+
+static char *
+run_kpsewhich (int dpi,
+ string format,
+ string name)
+{
+ char *dpistr = g_strdup_printf ("--dpi=%d", dpi);
+ char *formatstr = g_strdup_printf ("--format=%s", format.c_str());
+ char *namestr = g_strdup (name.c_str());
+ GError *err = NULL;
+ char *result;
+
+ result = run_program ("kpsewhich", &err, dpistr, formatstr, namestr, NULL);
+
+ if (!result)
+ {
+ cout << err->message << endl;
+ }
+ else
+ {
+ g_strstrip (result);
+
+ if (*result == '\0')
+ {
+ /* Nothing useful returned */
+ g_free (result);
+ result = NULL;
+ }
+ }
+
+ cout << "kpsewhich " << dpistr << " " << formatstr << " " << namestr << " " << endl;
+
+ g_free (dpistr);
+ g_free (formatstr);
+ g_free (namestr);
+
+ return result;
+}
+
+static void
+run_mktexpk (int dpi, string name)
+{
+ char *dpistr = g_strdup_printf ("--bdpi=%d", dpi);
+ char *bdpistr = g_strdup_printf ("--dpi=%d", dpi);
+ char *namestr = g_strdup (name.c_str());
+ char *result;
+
+ result = run_program ("mktexpk", NULL, bdpistr, dpistr, namestr, NULL);
+ if (result)
+ g_free (result);
+
+ g_free (dpistr);
+ g_free (bdpistr);
+ g_free (namestr);
+}
+
+AbstractFont *
+FontFactory::create_font (std::string name,
+ int dpi,
+ int at_size)
+{
+ char *filename;
+
+ /* Find VF */
+ filename = run_kpsewhich (dpi, "vf", name);
+
+ if (filename)
+ return new VfFont (*new FileLoader (filename), at_size);
+
+ /* Try PK */
+
+ filename = run_kpsewhich (dpi, "pk", name);
+
+ if (filename)
+ return new PkFont (*new FileLoader (filename), at_size);
+
+ /* Generate PK */
+
+ run_mktexpk (dpi, name);
+
+ cout << "birnan" << endl;
+
+ /* Try PK again */
+ filename = run_kpsewhich (dpi, "pk", name);
+
+ if (filename)
+ return new PkFont (*new FileLoader (filename), at_size);
+
+ cout << "no luck" << endl;
+
+ throw (string ("bad font"));
+
+ return NULL;
+}