cairo-renderer-pdf-out.cpp revision 00f8f5fca7184b0662b859af3ca2d2986119dd6a
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński/*
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński * A quick hack to use the Cairo renderer to write out a file. This
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński * then makes 'save as...' PDF.
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen *
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński * Authors:
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński * Ted Gould <ted@gould.cx>
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen * Ulf Erikson <ulferikson@users.sf.net>
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński *
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen * Copyright (C) 2004-2006 Authors
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen *
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen * Released under GNU GPL, read the file 'COPYING' for more information
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen */
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen#ifdef HAVE_CONFIG_H
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen# include <config.h>
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen#endif
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen#ifdef HAVE_CAIRO_PDF
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen#include "cairo-renderer-pdf-out.h"
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen#include "cairo-render-context.h"
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen#include "cairo-renderer.h"
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen#include <print.h>
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen#include "extension/system.h"
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen#include "extension/print.h"
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen#include "extension/db.h"
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen#include "extension/output.h"
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen#include "display/nr-arena.h"
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen#include "display/nr-arena-item.h"
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen#include "display/curve.h"
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen#include "display/canvas-bpath.h"
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen#include "sp-item.h"
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen#include "sp-root.h"
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosińskinamespace Inkscape {
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelennamespace Extension {
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelennamespace Internal {
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosińskibool
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelenCairoRendererPdfOutput::check (Inkscape::Extension::Extension * module)
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński{
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński return TRUE;
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński}
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosińskistatic bool
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosińskipdf_render_document_to_file(SPDocument *doc, gchar const *filename)
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński{
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński sp_document_ensure_up_to_date(doc);
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński/* Start */
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen /* Create new arena */
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen SPItem *base = SP_ITEM(sp_document_root(doc));
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen NRArena *arena = NRArena::create();
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen unsigned dkey = sp_item_display_key_new(1);
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen NRArenaItem *root = sp_item_invoke_show(base, arena, dkey, SP_ITEM_SHOW_DISPLAY);
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński /* Create renderer and context */
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński CairoRenderer *renderer = new CairoRenderer();
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen CairoRenderContext *ctx = renderer->createContext();
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński ctx->setPdfTarget (filename);
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński bool ret = renderer->setupDocument(ctx, doc);
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński if (ret) {
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen renderer->renderItem(ctx, base);
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński ret = ctx->finish();
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen }
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen /* Release arena */
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński sp_item_invoke_hide(base, dkey);
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen nr_arena_item_unref(root);
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen nr_object_unref((NRObject *) arena);
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński/* end */
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński renderer->destroyContext(ctx);
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński delete renderer;
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński return ret;
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński}
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński/**
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen \brief This function calls the output module with the filename
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński \param mod unused
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński \param doc Document to be saved
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński \param uri Filename to save to (probably will end in .png)
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński The most interesting thing that this function does is just attach
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński an '>' on the front of the filename. This is the syntax used to
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński tell the printing system to save to file.
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński*/
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosińskivoid
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof KosińskiCairoRendererPdfOutput::save (Inkscape::Extension::Output *mod, SPDocument *doc, const gchar *uri)
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński{
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński gchar * final_name;
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński final_name = g_strdup_printf("> %s", uri);
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński bool ret = pdf_render_document_to_file(doc, final_name);
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński g_free(final_name);
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen if (!ret)
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński throw Inkscape::Extension::Output::save_failed();
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński return;
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński}
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński
e4369b05aaa20df73a37f4d319ce456865cc74f3Krzysztof Kosiński/**
e4369b05aaa20df73a37f4d319ce456865cc74f3Krzysztof Kosiński \brief A function allocate a copy of this function.
e4369b05aaa20df73a37f4d319ce456865cc74f3Krzysztof Kosiński
e4369b05aaa20df73a37f4d319ce456865cc74f3Krzysztof Kosiński This is the definition of Cairo PDF out. This function just
e4369b05aaa20df73a37f4d319ce456865cc74f3Krzysztof Kosiński calls the extension system with the memory allocated XML that
e4369b05aaa20df73a37f4d319ce456865cc74f3Krzysztof Kosiński describes the data.
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński*/
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosińskivoid
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof KosińskiCairoRendererPdfOutput::init (void)
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński{
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński Inkscape::Extension::build_from_mem(
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński "<inkscape-extension xmlns=\"" INKSCAPE_EXTENSION_URI "\">\n"
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński "<name>Cairo PDF Output (experimental)</name>\n"
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński "<id>org.inkscape.output.pdf.cairorenderer</id>\n"
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński "<output>\n"
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński "<extension>.pdf</extension>\n"
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński "<mimetype>application/pdf</mimetype>\n"
e4369b05aaa20df73a37f4d319ce456865cc74f3Krzysztof Kosiński "<filetypename>Cairo PDF experimental (*.pdf)</filetypename>\n"
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński "<filetypetooltip>PDF File</filetypetooltip>\n"
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński "</output>\n"
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński "</inkscape-extension>", new CairoRendererPdfOutput());
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński return;
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński}
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński} } } /* namespace Inkscape, Extension, Internal */
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński#endif /* HAVE_CAIRO_PDF */
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński