Code

Initial commit of native poppler-based PDF import.
[inkscape.git] / src / extension / internal / cairo-pdf-out.cpp
index c73faaef60d7372717a53cb6a1b54cc9ffa597e8..88010e686a7e0c1110384c65a3765026a7e20ed9 100644 (file)
-/*\r
- * A quick hack to use the print output to write out a file.  This\r
- * then makes 'save as...' PDF.\r
- *\r
- * Authors:\r
- *   Ted Gould <ted@gould.cx>\r
- *   Ulf Erikson <ulferikson@users.sf.net>\r
- *\r
- * Copyright (C) 2004-2006 Authors\r
- *\r
- * Released under GNU GPL, read the file 'COPYING' for more information\r
- */\r
-\r
-#ifdef HAVE_CONFIG_H\r
-# include <config.h>\r
-#endif\r
-#include "cairo-pdf-out.h"\r
-#include <print.h>\r
-#include "extension/system.h"\r
-#include "extension/print.h"\r
-#include "extension/db.h"\r
-#include "extension/output.h"\r
-#include "display/nr-arena.h"\r
-#include "display/nr-arena-item.h"\r
-#include "sp-path.h"\r
-\r
-namespace Inkscape {\r
-namespace Extension {\r
-namespace Internal {\r
-\r
-bool\r
-CairoPdfOutput::check (Inkscape::Extension::Extension * module)\r
-{\r
-       if (NULL == Inkscape::Extension::db.get(SP_MODULE_KEY_PRINT_CAIRO_PDF))\r
-               return FALSE;\r
-\r
-       return TRUE;\r
-}\r
-\r
-\r
-static unsigned int\r
-pdf_print_document_to_file(SPDocument *doc, gchar const *filename)\r
-{\r
-    Inkscape::Extension::Print *mod;\r
-    SPPrintContext context;\r
-    gchar const *oldconst;\r
-    gchar *oldoutput;\r
-    unsigned int ret;\r
-\r
-    sp_document_ensure_up_to_date(doc);\r
-\r
-    mod = Inkscape::Extension::get_print(SP_MODULE_KEY_PRINT_CAIRO_PDF);\r
-    oldconst = mod->get_param_string("destination");\r
-    oldoutput = g_strdup(oldconst);\r
-    mod->set_param_string("destination", (gchar *)filename);\r
-\r
-/* Start */\r
-    context.module = mod;\r
-    /* fixme: This has to go into module constructor somehow */\r
-    /* Create new arena */\r
-    mod->base = SP_ITEM(sp_document_root(doc));\r
-    mod->arena = NRArena::create();\r
-    mod->dkey = sp_item_display_key_new(1);\r
-    mod->root = sp_item_invoke_show(mod->base, mod->arena, mod->dkey, SP_ITEM_SHOW_DISPLAY);\r
-    \r
-    /* Print document */\r
-    ret = mod->begin(doc);\r
-    if (ret) {\r
-        sp_item_invoke_print(mod->base, &context);\r
-        ret = mod->finish();\r
-    }\r
-    \r
-    /* Release arena */\r
-    sp_item_invoke_hide(mod->base, mod->dkey);\r
-    mod->base = NULL;\r
-    nr_arena_item_unref(mod->root);\r
-    mod->root = NULL;\r
-    nr_object_unref((NRObject *) mod->arena);\r
-    mod->arena = NULL;\r
-/* end */\r
-\r
-    mod->set_param_string("destination", oldoutput);\r
-    g_free(oldoutput);\r
-\r
-    return ret;\r
-}\r
-\r
-\r
-/**\r
-    \brief  This function calls the print system with the filename\r
-       \param  mod   unused\r
-       \param  doc   Document to be saved\r
-    \param  uri   Filename to save to (probably will end in .pdf)\r
-\r
-       The most interesting thing that this function does is just attach\r
-       an '>' on the front of the filename.  This is the syntax used to\r
-       tell the printing system to save to file.\r
-*/\r
-void\r
-CairoPdfOutput::save (Inkscape::Extension::Output *mod, SPDocument *doc, const gchar *uri)\r
-{\r
-    Inkscape::Extension::Extension * ext;\r
-    unsigned int ret;\r
-\r
-    ext = Inkscape::Extension::db.get(SP_MODULE_KEY_PRINT_CAIRO_PDF);\r
-    if (ext == NULL)\r
-        return;\r
-\r
-       gchar * final_name;\r
-       final_name = g_strdup_printf("> %s", uri);\r
-       ret = pdf_print_document_to_file(doc, final_name);\r
-       g_free(final_name);\r
-        \r
-       if (!ret)\r
-           throw Inkscape::Extension::Output::save_failed();\r
-\r
-       return;\r
-}\r
-\r
-/**\r
-       \brief   A function allocate a copy of this function.\r
-\r
-       This is the definition of PDF out.  This function just\r
-       calls the extension system with the memory allocated XML that\r
-       describes the data.\r
-*/\r
-void\r
-CairoPdfOutput::init (void)\r
-{\r
-       Inkscape::Extension::build_from_mem(\r
-               "<inkscape-extension>\n"\r
-                       "<name>Cairo PDF Output</name>\n"\r
-                       "<id>org.inkscape.output.pdf.cairo</id>\n"\r
-                       "<output>\n"\r
-                               "<extension>.pdf</extension>\n"\r
-                               "<mimetype>application/pdf</mimetype>\n"\r
-                               "<filetypename>Cairo PDF (*.pdf)</filetypename>\n"\r
-                               "<filetypetooltip>PDF File</filetypetooltip>\n"\r
-                       "</output>\n"\r
-               "</inkscape-extension>", new CairoPdfOutput());\r
-\r
-       return;\r
-}\r
-\r
-} } }  /* namespace Inkscape, Extension, Implementation */\r
+/*
+ * A quick hack to use the print output to write out a file.  This
+ * then makes 'save as...' PDF.
+ *
+ * Authors:
+ *   Ted Gould <ted@gould.cx>
+ *   Ulf Erikson <ulferikson@users.sf.net>
+ *
+ * Copyright (C) 2004-2006 Authors
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#ifdef HAVE_CAIRO_PDF
+
+#include "cairo-pdf-out.h"
+#include <print.h>
+#include "extension/system.h"
+#include "extension/print.h"
+#include "extension/db.h"
+#include "extension/output.h"
+#include "display/nr-arena.h"
+#include "display/nr-arena-item.h"
+#include "sp-path.h"
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+
+bool
+CairoPdfOutput::check (Inkscape::Extension::Extension * module)
+{
+       if (NULL == Inkscape::Extension::db.get(SP_MODULE_KEY_PRINT_CAIRO_PDF))
+               return FALSE;
+
+       return TRUE;
+}
+
+
+static unsigned int
+pdf_print_document_to_file(SPDocument *doc, gchar const *filename)
+{
+    Inkscape::Extension::Print *mod;
+    SPPrintContext context;
+    gchar const *oldconst;
+    gchar *oldoutput;
+    unsigned int ret;
+
+    sp_document_ensure_up_to_date(doc);
+
+    mod = Inkscape::Extension::get_print(SP_MODULE_KEY_PRINT_CAIRO_PDF);
+    oldconst = mod->get_param_string("destination");
+    oldoutput = g_strdup(oldconst);
+    mod->set_param_string("destination", (gchar *)filename);
+
+/* Start */
+    context.module = mod;
+    /* fixme: This has to go into module constructor somehow */
+    /* Create new arena */
+    mod->base = SP_ITEM(sp_document_root(doc));
+    mod->arena = NRArena::create();
+    mod->dkey = sp_item_display_key_new(1);
+    mod->root = sp_item_invoke_show(mod->base, mod->arena, mod->dkey, SP_ITEM_SHOW_DISPLAY);
+    
+    /* Print document */
+    ret = mod->begin(doc);
+    if (ret) {
+        sp_item_invoke_print(mod->base, &context);
+        ret = mod->finish();
+    }
+    
+    /* Release arena */
+    sp_item_invoke_hide(mod->base, mod->dkey);
+    mod->base = NULL;
+    nr_arena_item_unref(mod->root);
+    mod->root = NULL;
+    nr_object_unref((NRObject *) mod->arena);
+    mod->arena = NULL;
+/* end */
+
+    mod->set_param_string("destination", oldoutput);
+    g_free(oldoutput);
+
+    return ret;
+}
+
+
+/**
+    \brief  This function calls the print system with the filename
+       \param  mod   unused
+       \param  doc   Document to be saved
+    \param  uri   Filename to save to (probably will end in .pdf)
+
+       The most interesting thing that this function does is just attach
+       an '>' on the front of the filename.  This is the syntax used to
+       tell the printing system to save to file.
+*/
+void
+CairoPdfOutput::save (Inkscape::Extension::Output *mod, SPDocument *doc, const gchar *uri)
+{
+    Inkscape::Extension::Extension * ext;
+    unsigned int ret;
+
+    ext = Inkscape::Extension::db.get(SP_MODULE_KEY_PRINT_CAIRO_PDF);
+    if (ext == NULL)
+        return;
+
+       gchar * final_name;
+       final_name = g_strdup_printf("> %s", uri);
+       ret = pdf_print_document_to_file(doc, final_name);
+       g_free(final_name);
+        
+       if (!ret)
+           throw Inkscape::Extension::Output::save_failed();
+
+       return;
+}
+
+/**
+       \brief   A function allocate a copy of this function.
+
+       This is the definition of PDF out.  This function just
+       calls the extension system with the memory allocated XML that
+       describes the data.
+*/
+void
+CairoPdfOutput::init (void)
+{
+       Inkscape::Extension::build_from_mem(
+               "<inkscape-extension>\n"
+                       "<name>Cairo PDF Output</name>\n"
+                       "<id>org.inkscape.output.pdf.cairo</id>\n"
+                       "<output>\n"
+                               "<extension>.pdf</extension>\n"
+                               "<mimetype>application/pdf</mimetype>\n"
+                               "<filetypename>Cairo PDF (*.pdf)</filetypename>\n"
+                               "<filetypetooltip>PDF File</filetypetooltip>\n"
+                       "</output>\n"
+               "</inkscape-extension>", new CairoPdfOutput());
+
+       return;
+}
+
+} } }  /* namespace Inkscape, Extension, Implementation */
+
+#endif /* HAVE_CAIRO_PDF */