diff options
author | Alexander Larsson <alexl@redhat.com> | 2006-04-21 15:09:32 +0000 |
---|---|---|
committer | Alexander Larsson <alexl@src.gnome.org> | 2006-04-21 15:09:32 +0000 |
commit | 27f746fbd0e56872a8d3b4bfff2588ad0b7cd7c4 (patch) | |
tree | dcf0769596bd36a76b7dcea7eed46b378a634f72 /gtk/gen-paper-names.c | |
parent | ea32742b93348e1ce47cd92a26afe5317b37dd73 (diff) | |
download | gtk+-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.c | 238 |
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; +} |