From 87a23fa19c86ba74549937cbdc0c8d661f1e4409 Mon Sep 17 00:00:00 2001 From: buliabyak Date: Mon, 1 Sep 2008 01:30:46 +0000 Subject: [PATCH] enable EPS export via cairo, use it instead of the old native one --- src/extension/init.cpp | 3 +- src/extension/internal/cairo-ps-out.cpp | 158 +++++++++++++++++- src/extension/internal/cairo-ps-out.h | 12 ++ .../internal/cairo-render-context.cpp | 7 + src/extension/internal/cairo-render-context.h | 2 + 5 files changed, 179 insertions(+), 3 deletions(-) diff --git a/src/extension/init.cpp b/src/extension/init.cpp index b3f9bb405..940726df5 100644 --- a/src/extension/init.cpp +++ b/src/extension/init.cpp @@ -158,7 +158,7 @@ init() Internal::Svg::init(); Internal::Svgz::init(); //Internal::PsOutput::init(); // disabled, to be deleted, replaced by CairoPsOutput - Internal::EpsOutput::init(); + //Internal::EpsOutput::init(); // disabled, to be deleted, replaced by CairoEpsOutput Internal::PrintPS::init(); #ifdef HAVE_CAIRO_PDF if (prefs_get_int_attribute("options.useoldpdfexporter", "value", 1) == 1) { @@ -171,6 +171,7 @@ init() Internal::CairoRendererOutput::init(); } Internal::CairoPsOutput::init(); + Internal::CairoEpsOutput::init(); #endif #ifdef HAVE_POPPLER Internal::PdfInput::init(); diff --git a/src/extension/internal/cairo-ps-out.cpp b/src/extension/internal/cairo-ps-out.cpp index 61273b784..9776dafca 100644 --- a/src/extension/internal/cairo-ps-out.cpp +++ b/src/extension/internal/cairo-ps-out.cpp @@ -48,10 +48,20 @@ CairoPsOutput::check (Inkscape::Extension::Extension * module) if (NULL == Inkscape::Extension::db.get(SP_MODULE_KEY_PRINT_CAIRO_PS)) return FALSE; - return TRUE;} + return TRUE; +} + +bool +CairoEpsOutput::check (Inkscape::Extension::Extension * module) +{ + if (NULL == Inkscape::Extension::db.get(SP_MODULE_KEY_PRINT_CAIRO_EPS)) + return FALSE; + + return TRUE; +} static bool -ps_print_document_to_file(SPDocument *doc, gchar const *filename, unsigned int level, bool texttopath, bool filtertobitmap, int resolution) +ps_print_document_to_file(SPDocument *doc, gchar const *filename, unsigned int level, bool texttopath, bool filtertobitmap, int resolution, bool eps = false) { CairoRenderer *renderer; CairoRenderContext *ctx; @@ -69,6 +79,7 @@ ps_print_document_to_file(SPDocument *doc, gchar const *filename, unsigned int l renderer = new CairoRenderer(); ctx = renderer->createContext(); ctx->setPSLevel(level); + ctx->setEPS(eps); ctx->setTextToPath(texttopath); ctx->setFilterToBitmap(filtertobitmap); ctx->setBitmapResolution(resolution); @@ -197,12 +208,121 @@ CairoPsOutput::save (Inkscape::Extension::Output *mod, SPDocument *doc, const gc } + +/** + \brief This function calls the output module with the filename + \param mod unused + \param doc Document to be saved + \param uri Filename to save to (probably will end in .ps) +*/ +void +CairoEpsOutput::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_PS); + if (ext == NULL) + return; + + const gchar *old_level = NULL; + const gchar *new_level = NULL; + int level = 1; + try { + old_level = ext->get_param_enum("PSlevel"); + new_level = mod->get_param_enum("PSlevel"); + if((new_level != NULL) && (g_ascii_strcasecmp("PS2", new_level) == 0)) + level = 0; +// ext->set_param_enum("PSlevel", new_level); + } + catch(...) { + g_warning("Parameter might not exists"); + } + + bool old_textToPath = FALSE; + bool new_textToPath = FALSE; + try { + old_textToPath = ext->get_param_bool("textToPath"); + new_textToPath = mod->get_param_bool("textToPath"); + ext->set_param_bool("textToPath", new_textToPath); + } + catch(...) { + g_warning("Parameter might not exists"); + } + + bool old_blurToBitmap = FALSE; + bool new_blurToBitmap = FALSE; + try { + old_blurToBitmap = ext->get_param_bool("blurToBitmap"); + new_blurToBitmap = mod->get_param_bool("blurToBitmap"); + ext->set_param_bool("blurToBitmap", new_blurToBitmap); + } + catch(...) { + g_warning("Parameter might not exists"); + } + + int old_bitmapResolution = 72; + int new_bitmapResolution = 72; + try { + old_bitmapResolution = ext->get_param_int("resolution"); + new_bitmapResolution = mod->get_param_int("resolution"); + ext->set_param_int("resolution", new_bitmapResolution); + } + catch(...) { + g_warning("Parameter might not exists"); + } + + gchar * final_name; + final_name = g_strdup_printf("> %s", uri); + ret = ps_print_document_to_file(doc, final_name, level, new_textToPath, new_blurToBitmap, new_bitmapResolution, true); + g_free(final_name); + + try { + ext->set_param_int("resolution", old_bitmapResolution); + } + catch(...) { + g_warning("Parameter might not exists"); + } + try { + ext->set_param_bool("blurToBitmap", old_blurToBitmap); + } + catch(...) { + g_warning("Parameter might not exists"); + } + try { + ext->set_param_bool("textToPath", old_textToPath); + } + catch(...) { + g_warning("Parameter might not exists"); + } + try { +// ext->set_param_enum("PSlevel", old_level); + } + catch(...) { + g_warning("Parameter might not exists"); + } + + + if (!ret) + throw Inkscape::Extension::Output::save_failed(); + + return; + +} + + bool CairoPsOutput::textToPath(Inkscape::Extension::Print * ext) { return ext->get_param_bool("textToPath"); } +bool +CairoEpsOutput::textToPath(Inkscape::Extension::Print * ext) +{ + return ext->get_param_bool("textToPath"); +} + #include "clear-n_.h" /** @@ -239,6 +359,40 @@ CairoPsOutput::init (void) return; } +/** + \brief A function allocate a copy of this function. + + This is the definition of Cairo EPS out. This function just + calls the extension system with the memory allocated XML that + describes the data. +*/ +void +CairoEpsOutput::init (void) +{ + Inkscape::Extension::build_from_mem( + "\n" + "" N_("Encapsulated PostScript") "\n" + "" SP_MODULE_KEY_PRINT_CAIRO_EPS "\n" + "\n" + "<_item value='PS3'>" N_("PostScript level 3") "\n" +#if (CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 5, 2)) + "<_item value='PS2'>" N_("PostScript level 2") "\n" +#endif + "\n" + "false\n" + "false\n" + "90\n" + "\n" + ".eps\n" + "image/x-e-postscript\n" + "" N_("Encapsulated PostScript (*.eps)") "\n" + "" N_("Encapsulated PostScript File") "\n" + "\n" + "", new CairoEpsOutput()); + + return; +} + } } } /* namespace Inkscape, Extension, Implementation */ #endif /* HAVE_CAIRO_PDF */ diff --git a/src/extension/internal/cairo-ps-out.h b/src/extension/internal/cairo-ps-out.h index 14fc0ba69..d6730c9ce 100644 --- a/src/extension/internal/cairo-ps-out.h +++ b/src/extension/internal/cairo-ps-out.h @@ -35,6 +35,18 @@ public: }; +class CairoEpsOutput : Inkscape::Extension::Implementation::Implementation { + +public: + bool check(Inkscape::Extension::Extension *module); + void save(Inkscape::Extension::Output *mod, + SPDocument *doc, + gchar const *uri); + static void init(); + bool textToPath(Inkscape::Extension::Print *ext); + +}; + } } } /* namespace Inkscape, Extension, Implementation */ #endif /* HAVE_CAIRO_PDF */ diff --git a/src/extension/internal/cairo-render-context.cpp b/src/extension/internal/cairo-render-context.cpp index 2434e454b..4a3dd11a6 100644 --- a/src/extension/internal/cairo-render-context.cpp +++ b/src/extension/internal/cairo-render-context.cpp @@ -109,6 +109,7 @@ CairoRenderContext::CairoRenderContext(CairoRenderer *parent) : _dpi(72), _pdf_level(0), _ps_level(1), + _eps(false), _is_texttopath(FALSE), _is_filtertobitmap(FALSE), _bitmapresolution(72), @@ -398,6 +399,11 @@ void CairoRenderContext::setPSLevel(unsigned int level) _ps_level = level; } +void CairoRenderContext::setEPS(bool eps) +{ + _eps = eps; +} + unsigned int CairoRenderContext::getPSLevel(void) { return _ps_level; @@ -722,6 +728,7 @@ CairoRenderContext::setupSurface(double width, double height) return FALSE; } cairo_ps_surface_restrict_to_level (surface, (cairo_ps_level_t)_ps_level); + cairo_ps_surface_set_eps (surface, (cairo_bool_t) _eps); #endif break; #endif diff --git a/src/extension/internal/cairo-render-context.h b/src/extension/internal/cairo-render-context.h index d3d4ddd56..535ab572f 100644 --- a/src/extension/internal/cairo-render-context.h +++ b/src/extension/internal/cairo-render-context.h @@ -90,6 +90,7 @@ public: bool setSurfaceTarget(cairo_surface_t *surface, bool is_vector); void setPSLevel(unsigned int level); + void setEPS(bool eps); unsigned int getPSLevel(void); void setPDFLevel(unsigned int level); void setTextToPath(bool texttopath); @@ -156,6 +157,7 @@ protected: unsigned short _dpi; unsigned int _pdf_level; unsigned int _ps_level; + bool _eps; bool _is_texttopath; bool _is_filtertobitmap; int _bitmapresolution; -- 2.30.2