summaryrefslogtreecommitdiff
path: root/gtk/gen-paper-names.c
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2006-04-21 15:09:32 +0000
committerAlexander Larsson <alexl@src.gnome.org>2006-04-21 15:09:32 +0000
commit27f746fbd0e56872a8d3b4bfff2588ad0b7cd7c4 (patch)
treedcf0769596bd36a76b7dcea7eed46b378a634f72 /gtk/gen-paper-names.c
parentea32742b93348e1ce47cd92a26afe5317b37dd73 (diff)
downloadgtk+-27f746fbd0e56872a8d3b4bfff2588ad0b7cd7c4.tar.gz
Merge the gtk-printing branch. For more detailed ChangeLog entries, see
2006-04-21 Alexander Larsson <alexl@redhat.com> Merge the gtk-printing branch. For more detailed ChangeLog entries, see the branch. * .cvsignore: * Makefile.am: * configure.in: * docs/tools/widgets.c: * gtk+-unix-print-2.0.pc.in: * gtk/Makefile.am: * gtk/gen-paper-names.c: * gtk/gtk.h: * gtk/gtk.symbols: * gtk/gtkenums.h: * gtk/gtkiconfactory.c: * gtk/gtkmarshalers.list: * gtk/gtkpagesetup.[ch]: * gtk/gtkpagesetupunixdialog.[ch]: * gtk/gtkpapersize.[ch]: * gtk/gtkprint-win32.[ch]: * gtk/gtkprintbackend.[ch]: * gtk/gtkprintcontext.[ch]: * gtk/gtkprinter-private.h: * gtk/gtkprinter.[ch]: * gtk/gtkprinteroption.[ch]: * gtk/gtkprinteroptionset.[ch]: * gtk/gtkprinteroptionwidget.[ch]: * gtk/gtkprintjob.[ch]: * gtk/gtkprintoperation-private.h: * gtk/gtkprintoperation-unix.c: * gtk/gtkprintoperation-win32.c: * gtk/gtkprintoperation.[ch]: * gtk/gtkprintsettings.[ch]: * gtk/gtkprintunixdialog.[ch]: * gtk/paper_names.c: * gtk/paper_names_offsets.c: Platform independent printing API and implementations for unix and windows. * gtk/gtkstock.h: * gtk/stock-icons/24/gtk-orientation-landscape.png: * gtk/stock-icons/24/gtk-orientation-portrait.png: * gtk/stock-icons/24/gtk-orientation-reverse-landscape.png: Add stock icons for page orientation. * modules/Makefile.am: * modules/printbackends/Makefile.am: * modules/printbackends/cups/Makefile.am: * modules/printbackends/cups/gtkcupsutils.[ch]: * modules/printbackends/cups/gtkprintbackendcups.[ch]: * modules/printbackends/cups/gtkprintercups.[ch]: Cups printing backend for unix. * modules/printbackends/lpr/Makefile.am: * modules/printbackends/lpr/gtkprintbackendlpr.[ch]: lpr printing backend for unix. * modules/printbackends/pdf/Makefile.am: * modules/printbackends/pdf/gtkprintbackendpdf.[ch]: print-to-pdf printing backend for unix. * tests/.cvsignore: * tests/Makefile.am: * tests/print-editor.c: Test application for printing. * gdk/gdk.symbols: * gdk/win32/gdkevents-win32.c: * gdk/win32/gdkwin32.h: Add gdk_win32_set_modal_dialog_libgtk_only so that we can pump the mainloop while displaying a win32 common dialog. * gdk/directfb/Makefile.am: Whitespace cleanup.
Diffstat (limited to 'gtk/gen-paper-names.c')
-rw-r--r--gtk/gen-paper-names.c238
1 files changed, 238 insertions, 0 deletions
diff --git a/gtk/gen-paper-names.c b/gtk/gen-paper-names.c
new file mode 100644
index 0000000000..ef9aebfb35
--- /dev/null
+++ b/gtk/gen-paper-names.c
@@ -0,0 +1,238 @@
+/* GTK - The GIMP Toolkit
+ * Copyright (C) 2006 Matthias Clasen
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <glib.h>
+
+#include "paper_names.c"
+
+static const gint n_infos = G_N_ELEMENTS (standard_names);
+static const gint n_extra = G_N_ELEMENTS (extra_ppd_names);
+
+typedef struct {
+ const gchar *s;
+ gint len;
+ gint suffix;
+ gint offset;
+} NameInfo;
+
+static NameInfo *names = NULL;
+static gint n_names = 0;
+
+static void
+add_name (const gchar *name)
+{
+ names[n_names].s = name;
+ names[n_names].len = strlen (name);
+ names[n_names].suffix = -1;
+ names[n_names].offset = 0;
+
+ n_names++;
+}
+
+static gint
+find_name (const gchar *name)
+{
+ gint i;
+
+ if (!name)
+ return -1;
+
+ for (i = 0; i < n_names; i++)
+ {
+ if (strcmp (names[i].s, name) == 0)
+ return names[i].offset;
+ }
+
+ fprintf (stderr, "BOO! %s not found\n", name);
+
+ return -2;
+}
+
+#define MM_PER_INCH 25.4
+#define POINTS_PER_INCH 72
+
+static gboolean
+parse_media_size (const gchar *size,
+ gdouble *width_mm,
+ gdouble *height_mm)
+{
+ const gchar *p;
+ gchar *e;
+ gdouble short_dim, long_dim;
+
+ p = size;
+
+ short_dim = g_ascii_strtod (p, &e);
+
+ if (p == e || *e != 'x')
+ return FALSE;
+
+ p = e + 1; /* Skip x */
+
+ long_dim = g_ascii_strtod (p, &e);
+
+ if (p == e)
+ return TRUE;
+
+ p = e;
+
+ if (strcmp (p, "in") == 0)
+ {
+ short_dim = short_dim * MM_PER_INCH;
+ long_dim = long_dim * MM_PER_INCH;
+ }
+ else if (strcmp (p, "mm") != 0)
+ return FALSE;
+
+ if (width_mm)
+ *width_mm = short_dim;
+ if (height_mm)
+ *height_mm = long_dim;
+
+ return TRUE;
+}
+
+int
+main (int argc, char *argv[])
+{
+ gint i, j, offset;
+ gdouble width, height;
+
+ names = (NameInfo *) malloc (sizeof (NameInfo) * (4 + n_infos + 2 * n_extra));
+ n_names = 0;
+
+ /* collect names */
+ for (i = 0; i < n_infos; i++)
+ {
+ add_name (standard_names[i].name);
+ add_name (standard_names[i].display_name);
+ if (standard_names[i].ppd_name)
+ add_name (standard_names[i].ppd_name);
+ }
+
+ for (i = 0; i < n_extra; i++)
+ {
+ add_name (extra_ppd_names[i].ppd_name);
+ add_name (extra_ppd_names[i].standard_name);
+ }
+
+ /* find suffixes and dupes */
+ for (i = 0; i < n_names; i++)
+ for (j = 0; j < n_names; j++)
+ {
+ if (i == j) continue;
+
+ if (names[i].len < names[j].len ||
+ (names[i].len == names[j].len && j < i))
+ {
+ if (strcmp (names[i].s, names[j].s + names[j].len - names[i].len) == 0)
+ {
+ names[i].suffix = j;
+ break;
+ }
+ }
+ }
+
+ /* calculate offsets for regular entries */
+ offset = 0;
+ for (i = 0; i < n_names; i++)
+ {
+ if (names[i].suffix == -1)
+ {
+ names[i].offset = offset;
+ offset += names[i].len + 1;
+ }
+ }
+
+ /* calculate offsets for suffixes */
+ for (i = 0; i < n_names; i++)
+ {
+ if (names[i].suffix != -1)
+ {
+ j = names[i].suffix;
+ names[i].offset = names[j].offset + names[j].len - names[i].len;
+ }
+ }
+
+ printf ("/* Generated by gen-paper-names */\n\n");
+
+ /* write N_ marked names */
+
+ printf ("#if 0\n");
+ for (i = 0; i < n_infos; i++)
+ printf ("N_(\"%s\")\n", standard_names[i].display_name);
+ printf ("#endif\n\n");
+
+ /* write strings */
+ printf ("const char paper_names[] =");
+ for (i = 0; i < n_names; i++)
+ {
+ if (names[i].suffix == -1)
+ printf ("\n \"%s\\0\"", names[i].s);
+ }
+ printf (";\n\n");
+
+ /* dump PaperInfo array */
+ printf ("typedef struct {\n"
+ " int name;\n"
+ " float width;\n"
+ " float height;\n"
+ " int display_name;\n"
+ " int ppd_name;\n"
+ "} PaperInfo;\n\n"
+ "const PaperInfo standard_names_offsets[] = {\n");
+
+ for (i = 0; i < n_infos; i++)
+ {
+ width = height = 0.0;
+ if (!parse_media_size (standard_names[i].size, &width, &height))
+ printf ("failed to parse size %s\n", standard_names[i].size);
+
+ printf (" { %4d, %g, %g, %4d, %4d },\n",
+ find_name (standard_names[i].name),
+ width, height,
+ find_name (standard_names[i].display_name),
+ find_name (standard_names[i].ppd_name));
+ }
+
+ printf ("};\n\n");
+
+
+ /* dump extras */
+
+ printf ("const struct {\n"
+ " int ppd_name;\n"
+ " int standard_name;\n"
+ "} extra_ppd_names_offsets[] = {\n");
+
+ for (i = 0; i < n_extra; i++)
+ {
+ printf (" { %4d, %4d },\n",
+ find_name (extra_ppd_names[i].ppd_name),
+ find_name (extra_ppd_names[i].standard_name));
+ }
+
+ printf ("};\n\n");
+
+ return 0;
+}