gtk2/gtk/gen-paper-names.c
Alexander Larsson 27f746fbd0 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.
2006-04-21 15:09:32 +00:00

239 lines
5.1 KiB
C

/* 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;
}