From 6c3ca0cf2c626fce12897ea0937c07f2d7863d2f Mon Sep 17 00:00:00 2001 From: Martin Kretzschmar Date: Thu, 23 Dec 2004 01:08:19 +0000 Subject: [PATCH] add GnomePrintJob to EvPrintJob constructor arguments. * shell/ev-window.c (ev_window_print): add GnomePrintJob to EvPrintJob constructor arguments. * backend/ev-ps-exporter.c, backend/ev-ps-exporter.h: interface for documents that can export PostScript (page by page). * backend/Makefile.am (libevbackend_la_SOURCES): add them. * pdf/xpdf/pdf-document.cc (pdf_document_ps_export_begin) (pdf_document_ps_export_do_page, pdf_document_ps_export_end) (pdf_document_ps_exporter_iface_init: Implement EvPSExporter. * pdf/xpdf/Makefile.am (libxpdf_la_SOURCES): build PSOutputDev. --- ChangeLog | 17 ++++++++++ backend/Makefile.am | 2 ++ backend/ev-ps-exporter.c | 71 ++++++++++++++++++++++++++++++++++++++++ backend/ev-ps-exporter.h | 58 ++++++++++++++++++++++++++++++++ pdf/xpdf/Makefile.am | 2 ++ pdf/xpdf/pdf-document.cc | 54 ++++++++++++++++++++++++++++-- shell/ev-window.c | 3 +- 7 files changed, 204 insertions(+), 3 deletions(-) create mode 100644 backend/ev-ps-exporter.c create mode 100644 backend/ev-ps-exporter.h diff --git a/ChangeLog b/ChangeLog index 49ac93b6..c92c80fd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,20 @@ +2004-12-23 Martin Kretzschmar + + * shell/ev-window.c (ev_window_print): add GnomePrintJob to + EvPrintJob constructor arguments. + + * backend/ev-ps-exporter.c, backend/ev-ps-exporter.h: interface + for documents that can export PostScript (page by page). + + * backend/Makefile.am (libevbackend_la_SOURCES): add them. + + * pdf/xpdf/pdf-document.cc (pdf_document_ps_export_begin) + (pdf_document_ps_export_do_page, pdf_document_ps_export_end) + (pdf_document_ps_exporter_iface_init: + Implement EvPSExporter. + + * pdf/xpdf/Makefile.am (libxpdf_la_SOURCES): build PSOutputDev. + 2004-12-22 Anders Carlsson * backend/Makefile.am: diff --git a/backend/Makefile.am b/backend/Makefile.am index 2f54157c..5ccd5a10 100644 --- a/backend/Makefile.am +++ b/backend/Makefile.am @@ -17,6 +17,8 @@ libevbackend_la_SOURCES= \ ev-document-thumbnails.h \ ev-document-bookmarks.c \ ev-document-bookmarks.h \ + ev-ps-exporter.c \ + ev-ps-exporter.h \ $(NULL) ev-backend-marshalers.h: ev-backend-marshalers.list diff --git a/backend/ev-ps-exporter.c b/backend/ev-ps-exporter.c new file mode 100644 index 00000000..f5b55683 --- /dev/null +++ b/backend/ev-ps-exporter.c @@ -0,0 +1,71 @@ +/* this file is part of evince, a gnome document viewer + * + * Copyright (C) 2004 Martin Kretzschmar + * + * Author: + * Martin Kretzschmar + * + * Evince is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Evince 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 + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include "ev-ps-exporter.h" + +GType +ev_ps_exporter_get_type (void) +{ + static GType type = 0; + + if (G_UNLIKELY (type == 0)) + { + static const GTypeInfo our_info = + { + sizeof (EvPSExporterIface), + NULL, + NULL, + }; + + type = g_type_register_static (G_TYPE_INTERFACE, + "EvPSExporter", + &our_info, (GTypeFlags)0); + } + + return type; +} + +void +ev_ps_exporter_begin (EvPSExporter *exporter, const char *filename) +{ + EvPSExporterIface *iface = EV_PS_EXPORTER_GET_IFACE (exporter); + + iface->begin (exporter, filename); +} + +void +ev_ps_exporter_do_page (EvPSExporter *exporter, int page) +{ + EvPSExporterIface *iface = EV_PS_EXPORTER_GET_IFACE (exporter); + + iface->do_page (exporter, page); +} + +void +ev_ps_exporter_end (EvPSExporter *exporter) +{ + EvPSExporterIface *iface = EV_PS_EXPORTER_GET_IFACE (exporter); + + iface->end (exporter); +} diff --git a/backend/ev-ps-exporter.h b/backend/ev-ps-exporter.h new file mode 100644 index 00000000..58917e8d --- /dev/null +++ b/backend/ev-ps-exporter.h @@ -0,0 +1,58 @@ +/* this file is part of evince, a gnome document viewer + * + * Copyright (C) 2004 Martin Kretzschmar + * + * Author: + * Martin Kretzschmar + * + * Evince is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Evince 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 + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef EV_PS_EXPORTER_H +#define EV_PS_EXPORTER_H + +#include + +G_BEGIN_DECLS + +#define EV_TYPE_PS_EXPORTER (ev_ps_exporter_get_type ()) +#define EV_PS_EXPORTER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), EV_TYPE_PS_EXPORTER, EvPSExporter)) +#define EV_PS_EXPORTER_IFACE(k) (G_TYPE_CHECK_CLASS_CAST((k), EV_TYPE_PS_EXPORTER, EvPSExporterIface)) +#define EV_IS_PS_EXPORTER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), EV_TYPE_PS_EXPORTER)) +#define EV_IS_PS_EXPORTER_IFACE(k) (G_TYPE_CHECK_CLASS_TYPE ((k), EV_TYPE_PS_EXPORTER)) +#define EV_PS_EXPORTER_GET_IFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), EV_TYPE_PS_EXPORTER, EvPSExporterIface)) + +typedef struct _EvPSExporter EvPSExporter; +typedef struct _EvPSExporterIface EvPSExporterIface; + +struct _EvPSExporterIface { + GTypeInterface base_iface; + + /* Methods */ + void (* begin) (EvPSExporter *exporter, + const char *filename); + void (* do_page) (EvPSExporter *exporter, + int page); + void (* end) (EvPSExporter *exporter); +}; + +GType ev_ps_exporter_get_type (void); +void ev_ps_exporter_begin (EvPSExporter *exporter, const char *filename); +void ev_ps_exporter_do_page (EvPSExporter *exporter, int page); +void ev_ps_exporter_end (EvPSExporter *exporter); + +G_END_DECLS + +#endif diff --git a/pdf/xpdf/Makefile.am b/pdf/xpdf/Makefile.am index 7c1b6437..9676c009 100644 --- a/pdf/xpdf/Makefile.am +++ b/pdf/xpdf/Makefile.am @@ -93,6 +93,8 @@ libxpdf_la_SOURCES = \ NameToUnicodeTable.h \ GDKSplashOutputDev.cc \ GDKSplashOutputDev.h \ + PSOutputDev.cc \ + PSOutputDev.h \ TextOutputDev.cc \ TextOutputDev.h \ UTF8.h diff --git a/pdf/xpdf/pdf-document.cc b/pdf/xpdf/pdf-document.cc index 9deda49e..8323ebe3 100644 --- a/pdf/xpdf/pdf-document.cc +++ b/pdf/xpdf/pdf-document.cc @@ -19,11 +19,13 @@ #include "gpdf-g-switch.h" #include "pdf-document.h" +#include "ev-ps-exporter.h" #include "gpdf-g-switch.h" #include "GlobalParams.h" #include "GDKSplashOutputDev.h" #include "PDFDoc.h" +#include "PSOutputDev.h" typedef struct _PdfDocumentClass PdfDocumentClass; @@ -47,16 +49,22 @@ struct _PdfDocument GdkDrawable *target; GDKSplashOutputDev *out; + PSOutputDev *ps_out; PDFDoc *doc; gboolean page_valid; }; static void pdf_document_document_iface_init (EvDocumentIface *iface); +static void pdf_document_ps_exporter_iface_init (EvPSExporterIface *iface); G_DEFINE_TYPE_WITH_CODE (PdfDocument, pdf_document, G_TYPE_OBJECT, - { G_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT, - pdf_document_document_iface_init) }); + { + G_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT, + pdf_document_document_iface_init); + G_IMPLEMENT_INTERFACE (EV_TYPE_PS_EXPORTER, + pdf_document_ps_exporter_iface_init); + }); static gboolean document_validate_page (PdfDocument *pdf_document) @@ -354,6 +362,38 @@ pdf_document_end_find (EvDocument *document) ev_document_found (document, NULL, 0, 1.0); } +static void +pdf_document_ps_export_begin (EvPSExporter *exporter, const char *filename) +{ + PdfDocument *document = PDF_DOCUMENT (exporter); + + if (document->ps_out) + delete document->ps_out; + + document->ps_out = new PSOutputDev ((char *)filename, document->doc->getXRef(), + document->doc->getCatalog(), 1, + ev_document_get_n_pages (EV_DOCUMENT (document)), + psModePS); +} + +static void +pdf_document_ps_export_do_page (EvPSExporter *exporter, int page) +{ + PdfDocument *document = PDF_DOCUMENT (exporter); + + document->doc->displayPage (document->ps_out, page, + 72.0, 72.0, 0, gTrue, gFalse); +} + +static void +pdf_document_ps_export_end (EvPSExporter *exporter) +{ + PdfDocument *document = PDF_DOCUMENT (exporter); + + delete document->ps_out; + document->ps_out = NULL; +} + static void pdf_document_finalize (GObject *object) { @@ -364,6 +404,8 @@ pdf_document_finalize (GObject *object) if (pdf_document->out) delete pdf_document->out; + if (pdf_document->ps_out) + delete pdf_document->ps_out; if (pdf_document->doc) delete pdf_document->doc; @@ -393,6 +435,14 @@ pdf_document_document_iface_init (EvDocumentIface *iface) iface->end_find = pdf_document_end_find; } +static void +pdf_document_ps_exporter_iface_init (EvPSExporterIface *iface) +{ + iface->begin = pdf_document_ps_export_begin; + iface->do_page = pdf_document_ps_export_do_page; + iface->end = pdf_document_ps_export_end; +} + static void pdf_document_init (PdfDocument *pdf_document) { diff --git a/shell/ev-window.c b/shell/ev-window.c index 0ca5df0b..e0445c67 100644 --- a/shell/ev-window.c +++ b/shell/ev-window.c @@ -377,8 +377,9 @@ ev_window_print (EvWindow *ev_window) } print_job = g_object_new (EV_TYPE_PRINT_JOB, + "gnome_print_job", job, "document", ev_window->priv->document, - "print-dialog", print_dialog, + "print_dialog", print_dialog, NULL); break; } -- 2.43.5