Code

enable EPS export via cairo, use it instead of the old native one
authorbuliabyak <buliabyak@users.sourceforge.net>
Mon, 1 Sep 2008 01:30:46 +0000 (01:30 +0000)
committerbuliabyak <buliabyak@users.sourceforge.net>
Mon, 1 Sep 2008 01:30:46 +0000 (01:30 +0000)
src/extension/init.cpp
src/extension/internal/cairo-ps-out.cpp
src/extension/internal/cairo-ps-out.h
src/extension/internal/cairo-render-context.cpp
src/extension/internal/cairo-render-context.h

index b3f9bb405cfbbc88beb1a39cca6469685b0fa4a0..940726df58e095386c212b1d0b2790f5d92b65d6 100644 (file)
@@ -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();
index 61273b784fc044c0e810149d08434b33ca1bd7ae..9776dafca88d39051bce0f5739b7433dae9c12b4 100644 (file)
@@ -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 <PSlevel> 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 <textToPath> 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 <blurToBitmap> 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 <resolution> 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 <resolution> might not exists");
+    }
+    try {
+        ext->set_param_bool("blurToBitmap", old_blurToBitmap);
+    }
+    catch(...) {
+        g_warning("Parameter <blurToBitmap> might not exists");
+    }
+    try {
+        ext->set_param_bool("textToPath", old_textToPath);
+    }
+    catch(...) {
+        g_warning("Parameter <textToPath> might not exists");
+    }
+    try {
+//        ext->set_param_enum("PSlevel", old_level);
+    }
+    catch(...) {
+        g_warning("Parameter <PSlevel> 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(
+               "<inkscape-extension xmlns=\"" INKSCAPE_EXTENSION_URI "\">\n"
+                       "<name>" N_("Encapsulated PostScript") "</name>\n"
+                       "<id>" SP_MODULE_KEY_PRINT_CAIRO_EPS "</id>\n"
+                       "<param name=\"PSlevel\" gui-text=\"" N_("Restrict to PS level") "\" type=\"enum\" >\n"
+                               "<_item value='PS3'>" N_("PostScript level 3") "</_item>\n"
+#if (CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 5, 2))
+                "<_item value='PS2'>" N_("PostScript level 2") "</_item>\n"
+#endif
+            "</param>\n"
+                       "<param name=\"textToPath\" gui-text=\"" N_("Convert texts to paths") "\" type=\"boolean\">false</param>\n"
+                       "<param name=\"blurToBitmap\" gui-text=\"" N_("Convert blur effects to bitmaps") "\" type=\"boolean\">false</param>\n"
+                       "<param name=\"resolution\" gui-text=\"" N_("Preferred resolution (DPI) of bitmaps") "\" type=\"int\" min=\"72\" max=\"2400\">90</param>\n"
+                       "<output>\n"
+                               "<extension>.eps</extension>\n"
+                                "<mimetype>image/x-e-postscript</mimetype>\n"
+                               "<filetypename>" N_("Encapsulated PostScript (*.eps)") "</filetypename>\n"
+                               "<filetypetooltip>" N_("Encapsulated PostScript File") "</filetypetooltip>\n"
+                       "</output>\n"
+               "</inkscape-extension>", new CairoEpsOutput());
+
+       return;
+}
+
 } } }  /* namespace Inkscape, Extension, Implementation */
 
 #endif /* HAVE_CAIRO_PDF */
index 14fc0ba69573ee5bc53f83ca40d6b81881852d47..d6730c9cea8484a5142ad80700b9323e7486391c 100644 (file)
@@ -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 */
index 2434e454b6cc266592ad6b6403980a0f49ee3258..4a3dd11a65abefac4fa6cd9cb5ef9429847f9b75 100644 (file)
@@ -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
index d3d4ddd56000e0af8167f61590e42c5fb409c3df..535ab572f8103f6a523d8b13a9837caadfcfeb08 100644 (file)
@@ -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;