#define __SP_PRINT_C__ /* * Frontend to printing * * Author: * Lauris Kaplinski <lauris@kaplinski.com> * * This code is in public domain */ #include <config.h> #include <string.h> #include <ctype.h> #include <libnr/nr-rect.h> #include <libnr/nr-matrix.h> #include <libnr/nr-pixblock.h> #include <glibmm/i18n.h> #include "enums.h" #include "document.h" #include "sp-item.h" #include "style.h" #include "sp-paint-server.h" #include "extension/print.h" #include "extension/system.h" #include "print.h" #if 0 #include <extension/internal/ps.h> #ifdef WIN32 #include <extension/internal/win32.h> #endif #ifdef WITH_GNOME_PRINT #include <extension/internal/gnome.h> #endif #endif /* Identity typedef */ unsigned int sp_print_bind(SPPrintContext *ctx, NR::Matrix const &transform, float opacity) { NRMatrix const ntransform(transform); return sp_print_bind(ctx, &ntransform, opacity); } unsigned int sp_print_bind (SPPrintContext *ctx, const NRMatrix *transform, float opacity) { return ctx->module->bind(transform, opacity); } unsigned int sp_print_release (SPPrintContext *ctx) { return ctx->module->release(); } unsigned int sp_print_comment(SPPrintContext *ctx, const char * comment) { return ctx->module->comment(comment); } unsigned int sp_print_fill (SPPrintContext *ctx, const NRBPath *bpath, const NRMatrix *ctm, const SPStyle *style, const NRRect *pbox, const NRRect *dbox, const NRRect *bbox) { return ctx->module->fill(bpath, ctm, style, pbox, dbox, bbox); } unsigned int sp_print_stroke (SPPrintContext *ctx, const NRBPath *bpath, const NRMatrix *ctm, const SPStyle *style, const NRRect *pbox, const NRRect *dbox, const NRRect *bbox) { return ctx->module->stroke(bpath, ctm, style, pbox, dbox, bbox); } unsigned int sp_print_image_R8G8B8A8_N (SPPrintContext *ctx, guchar *px, unsigned int w, unsigned int h, unsigned int rs, const NRMatrix *transform, const SPStyle *style) { return ctx->module->image(px, w, h, rs, transform, style); } unsigned int sp_print_text (SPPrintContext* ctx, const char* text, NR::Point p, const SPStyle* style) { return ctx->module->text(text, p, style); } #include "display/nr-arena.h" #include "display/nr-arena-item.h" /* UI */ void sp_print_preview_document (SPDocument *doc) { Inkscape::Extension::Print *mod; unsigned int ret; sp_document_ensure_up_to_date (doc); mod = Inkscape::Extension::get_print(SP_MODULE_KEY_PRINT_DEFAULT); ret = mod->set_preview (); if (ret) { SPPrintContext context; 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); 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; } return; } void sp_print_document (SPDocument *doc, unsigned int direct) { Inkscape::Extension::Print *mod; unsigned int ret; sp_document_ensure_up_to_date (doc); if (direct) { mod = Inkscape::Extension::get_print(SP_MODULE_KEY_PRINT_PS); } else { mod = Inkscape::Extension::get_print(SP_MODULE_KEY_PRINT_DEFAULT); } ret = mod->setup(); if (ret) { SPPrintContext context; 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); 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; } return; } void sp_print_document_to_file (SPDocument *doc, const gchar *filename) { Inkscape::Extension::Print *mod; SPPrintContext context; const gchar * oldconst; gchar * oldoutput; unsigned int ret; sp_document_ensure_up_to_date (doc); mod = Inkscape::Extension::get_print(SP_MODULE_KEY_PRINT_PS); 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); 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; }