Code

C++fied SPDocument added
[inkscape.git] / src / extension / internal / cairo-ps-out.cpp
index 735c3cf7a87b7ad31e98dedd6cbc7e96dcd4d31e..76b68bf2c0ffb92a9e5d1c2ee4738cd23b0a29a9 100644 (file)
@@ -21,6 +21,7 @@
 #include "cairo-ps-out.h"
 #include "cairo-render-context.h"
 #include "cairo-renderer.h"
 #include "cairo-ps-out.h"
 #include "cairo-render-context.h"
 #include "cairo-renderer.h"
+#include "latex-text-renderer.h"
 #include <print.h>
 #include "extension/system.h"
 #include "extension/print.h"
 #include <print.h>
 #include "extension/system.h"
 #include "extension/print.h"
@@ -42,57 +43,80 @@ namespace Inkscape {
 namespace Extension {
 namespace Internal {
 
 namespace Extension {
 namespace Internal {
 
-bool
-CairoPsOutput::check (Inkscape::Extension::Extension * module)
+bool CairoPsOutput::check (Inkscape::Extension::Extension * /*module*/)
 {
 {
-       if (NULL == Inkscape::Extension::db.get(SP_MODULE_KEY_PRINT_CAIRO_PS))
-               return FALSE;
+    if (NULL == Inkscape::Extension::db.get(SP_MODULE_KEY_PRINT_CAIRO_PS)) {
+        return FALSE;
+    } else {
+        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;
+    } else {
+        return TRUE;
+    }
+}
 
 static bool
 
 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 omittext,
+                          bool filtertobitmap, int resolution, const gchar * const exportId, bool exportDrawing, bool exportCanvas, bool eps = false)
 {
 {
-    CairoRenderer *renderer;
-    CairoRenderContext *ctx;
+    doc->ensure_up_to_date();
 
 
-    sp_document_ensure_up_to_date(doc);
+    SPItem *base = NULL;
+
+    bool pageBoundingBox = TRUE;
+    if (exportId && strcmp(exportId, "")) {
+        // we want to export the given item only
+        base = SP_ITEM(doc->getObjectById(exportId));
+        pageBoundingBox = exportCanvas;
+    }
+    else {
+        // we want to export the entire document from root
+        base = SP_ITEM(sp_document_root(doc));
+        pageBoundingBox = !exportDrawing;
+    }
+
+    if (!base)
+        return false;
 
 
-/* Start */
     /* Create new arena */
     /* Create new arena */
-    SPItem *base = SP_ITEM(sp_document_root(doc));
     NRArena *arena = NRArena::create();
     NRArena *arena = NRArena::create();
-    unsigned dkey = sp_item_display_key_new(1);
-    NRArenaItem *root = sp_item_invoke_show(base, arena, dkey, SP_ITEM_SHOW_DISPLAY);
+    unsigned dkey = SPItem::display_key_new(1);
+    base->invoke_show(arena, dkey, SP_ITEM_SHOW_DISPLAY);
 
     /* Create renderer and context */
 
     /* Create renderer and context */
-    renderer = new CairoRenderer();
-    ctx = renderer->createContext();
+    CairoRenderer *renderer = new CairoRenderer();
+    CairoRenderContext *ctx = renderer->createContext();
     ctx->setPSLevel(level);
     ctx->setPSLevel(level);
+    ctx->setEPS(eps);
     ctx->setTextToPath(texttopath);
     ctx->setTextToPath(texttopath);
+    renderer->_omitText = omittext;
     ctx->setFilterToBitmap(filtertobitmap);
     ctx->setBitmapResolution(resolution);
 
     bool ret = ctx->setPsTarget(filename);
     if(ret) {
         /* Render document */
     ctx->setFilterToBitmap(filtertobitmap);
     ctx->setBitmapResolution(resolution);
 
     bool ret = ctx->setPsTarget(filename);
     if(ret) {
         /* Render document */
-        ret = renderer->setupDocument(ctx, doc);
+        ret = renderer->setupDocument(ctx, doc, pageBoundingBox, base);
         if (ret) {
             renderer->renderItem(ctx, base);
             ret = ctx->finish();
         }
     }
         if (ret) {
             renderer->renderItem(ctx, base);
             ret = ctx->finish();
         }
     }
-    renderer->destroyContext(ctx);
 
     /* Release arena */
 
     /* Release arena */
-    sp_item_invoke_hide(base, dkey);
-    nr_arena_item_unref(root);
+    base->invoke_hide(dkey);
     nr_object_unref((NRObject *) arena);
     nr_object_unref((NRObject *) arena);
-/* end */
+
+    renderer->destroyContext(ctx);
     delete renderer;
 
     return ret;
     delete renderer;
 
     return ret;
-
 }
 
 
 }
 
 
@@ -100,10 +124,10 @@ ps_print_document_to_file(SPDocument *doc, gchar const *filename, unsigned int l
     \brief  This function calls the output module with the filename
        \param  mod   unused
        \param  doc   Document to be saved
     \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)
+    \param  filename   Filename to save to (probably will end in .ps)
 */
 void
 */
 void
-CairoPsOutput::save (Inkscape::Extension::Output *mod, SPDocument *doc, const gchar *uri)
+CairoPsOutput::save(Inkscape::Extension::Output *mod, SPDocument *doc, gchar const *filename)
 {
     Inkscape::Extension::Extension * ext;
     unsigned int ret;
 {
     Inkscape::Extension::Extension * ext;
     unsigned int ret;
@@ -112,97 +136,178 @@ CairoPsOutput::save (Inkscape::Extension::Output *mod, SPDocument *doc, const gc
     if (ext == NULL)
         return;
 
     if (ext == NULL)
         return;
 
-    const gchar *old_level = NULL;
     const gchar *new_level = NULL;
     const gchar *new_level = NULL;
-    int level = 1;
+    int level = CAIRO_PS_LEVEL_2;
     try {
     try {
-        old_level = ext->get_param_enum("PSlevel");
         new_level = mod->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");
-    }
+        if((new_level != NULL) && !(g_ascii_strcasecmp("PS3", new_level) == 0))
+            level = CAIRO_PS_LEVEL_3;
+    } catch(...) {}
 
 
-    bool old_textToPath  = FALSE;
     bool new_textToPath  = FALSE;
     try {
     bool new_textToPath  = FALSE;
     try {
-        old_textToPath  = ext->get_param_bool("textToPath");
         new_textToPath  = mod->get_param_bool("textToPath");
         new_textToPath  = mod->get_param_bool("textToPath");
-        ext->set_param_bool("textToPath", new_textToPath);
+    } catch(...) {}
+
+    bool new_textToLaTeX  = FALSE;
+    try {
+        new_textToLaTeX  = mod->get_param_bool("textToLaTeX");
     }
     catch(...) {
     }
     catch(...) {
-        g_warning("Parameter <textToPath> might not exists");
+        g_warning("Parameter <textToLaTeX> might not exist");
     }
 
     }
 
-    bool old_blurToBitmap  = FALSE;
     bool new_blurToBitmap  = FALSE;
     try {
     bool new_blurToBitmap  = FALSE;
     try {
-        old_blurToBitmap  = ext->get_param_bool("blurToBitmap");
         new_blurToBitmap  = mod->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");
-    }
+    } catch(...) {}
 
 
-    int old_bitmapResolution  = 72;
     int new_bitmapResolution  = 72;
     try {
     int new_bitmapResolution  = 72;
     try {
-        old_bitmapResolution  = ext->get_param_int("resolution");
         new_bitmapResolution = mod->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");
-    }
+    } catch(...) {}
 
 
-       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);
-       g_free(final_name);
+    bool new_areaPage  = true;
+    try {
+        new_areaPage = mod->get_param_bool("areaPage");
+    } catch(...) {}
 
 
+    bool new_areaDrawing  = true;
     try {
     try {
-        ext->set_param_int("resolution", old_bitmapResolution);
-    }
-    catch(...) {
-        g_warning("Parameter <resolution> might not exists");
-    }
+        new_areaDrawing = mod->get_param_bool("areaDrawing");
+    } catch(...) {}
+
+    const gchar *new_exportId = NULL;
     try {
     try {
-        ext->set_param_bool("blurToBitmap", old_blurToBitmap);
+        new_exportId = mod->get_param_string("exportId");
+    } catch(...) {}
+
+    // Create PS
+    {
+        gchar * final_name;
+        final_name = g_strdup_printf("> %s", filename);
+        ret = ps_print_document_to_file(doc, final_name, level, new_textToPath, new_textToLaTeX, new_blurToBitmap, new_bitmapResolution, new_exportId, new_areaDrawing, new_areaPage);
+        g_free(final_name);
+
+        if (!ret)
+            throw Inkscape::Extension::Output::save_failed();
     }
     }
-    catch(...) {
-        g_warning("Parameter <blurToBitmap> might not exists");
+
+    // Create LaTeX file (if requested)
+    if (new_textToLaTeX) {
+        gchar * tex_filename;
+        //strip filename of ".ps", do not add ".tex" here.
+        gsize n = g_str_has_suffix(filename, ".ps") ? strlen(filename)-3 : strlen(filename);
+        tex_filename = g_strndup(filename, n);
+        ret = latex_render_document_text_to_file(doc, tex_filename, new_exportId, new_areaDrawing, new_areaPage, false);
+        g_free(tex_filename);
+
+        if (!ret)
+            throw Inkscape::Extension::Output::save_failed();
     }
     }
+}
+
+
+/**
+    \brief  This function calls the output module with the filename
+       \param  mod   unused
+       \param  doc   Document to be saved
+    \param  filename   Filename to save to (probably will end in .ps)
+*/
+void
+CairoEpsOutput::save(Inkscape::Extension::Output *mod, SPDocument *doc, gchar const *filename)
+{
+    Inkscape::Extension::Extension * ext;
+    unsigned int ret;
+
+    ext = Inkscape::Extension::db.get(SP_MODULE_KEY_PRINT_CAIRO_PS);
+    if (ext == NULL)
+        return;
+
+    const gchar *new_level = NULL;
+    int level = CAIRO_PS_LEVEL_2;
     try {
     try {
-        ext->set_param_bool("textToPath", old_textToPath);
-    }
-    catch(...) {
-        g_warning("Parameter <textToPath> might not exists");
-    }
+        new_level = mod->get_param_enum("PSlevel");
+        if((new_level != NULL) && !(g_ascii_strcasecmp("PS3", new_level) == 0))
+            level = CAIRO_PS_LEVEL_3;
+    } catch(...) {}
+
+    bool new_textToPath  = FALSE;
     try {
     try {
-//        ext->set_param_enum("PSlevel", old_level);
+        new_textToPath  = mod->get_param_bool("textToPath");
+    } catch(...) {}
+
+    bool new_textToLaTeX  = FALSE;
+    try {
+        new_textToLaTeX  = mod->get_param_bool("textToLaTeX");
     }
     catch(...) {
     }
     catch(...) {
-        g_warning("Parameter <PSlevel> might not exists");
+        g_warning("Parameter <textToLaTeX> might not exist");
     }
 
     }
 
+    bool new_blurToBitmap  = FALSE;
+    try {
+        new_blurToBitmap  = mod->get_param_bool("blurToBitmap");
+    } catch(...) {}
+
+    int new_bitmapResolution  = 72;
+    try {
+        new_bitmapResolution = mod->get_param_int("resolution");
+    } catch(...) {}
+
+    bool new_areaPage  = true;
+    try {
+        new_areaPage = mod->get_param_bool("areaPage");
+    } catch(...) {}
 
 
-       if (!ret)
-           throw Inkscape::Extension::Output::save_failed();
+    bool new_areaDrawing  = true;
+    try {
+        new_areaDrawing = mod->get_param_bool("areaDrawing");
+    } catch(...) {}
 
 
-       return;
+    const gchar *new_exportId = NULL;
+    try {
+        new_exportId = mod->get_param_string("exportId");
+    } catch(...) {}
+
+    // Create EPS
+    {
+        gchar * final_name;
+        final_name = g_strdup_printf("> %s", filename);
+        ret = ps_print_document_to_file(doc, final_name, level, new_textToPath, new_textToLaTeX, new_blurToBitmap, new_bitmapResolution, new_exportId, new_areaDrawing, new_areaPage, true);
+        g_free(final_name);
+
+        if (!ret)
+            throw Inkscape::Extension::Output::save_failed();
+    }
 
 
+    // Create LaTeX file (if requested)
+    if (new_textToLaTeX) {
+        gchar * tex_filename;
+        //strip filename of ".eps", do not add ".tex" here.
+        gsize n = g_str_has_suffix(filename, ".eps") ? strlen(filename)-4 : strlen(filename);
+        tex_filename = g_strndup(filename, n);
+        ret = latex_render_document_text_to_file(doc, tex_filename, new_exportId, new_areaDrawing, new_areaPage, false);
+        g_free(tex_filename);
+
+        if (!ret)
+            throw Inkscape::Extension::Output::save_failed();
+    }
 }
 
 }
 
+
 bool
 CairoPsOutput::textToPath(Inkscape::Extension::Print * ext)
 {
     return ext->get_param_bool("textToPath");
 }
 
 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"
 
 /**
 #include "clear-n_.h"
 
 /**
@@ -217,7 +322,7 @@ CairoPsOutput::init (void)
 {
        Inkscape::Extension::build_from_mem(
                "<inkscape-extension xmlns=\"" INKSCAPE_EXTENSION_URI "\">\n"
 {
        Inkscape::Extension::build_from_mem(
                "<inkscape-extension xmlns=\"" INKSCAPE_EXTENSION_URI "\">\n"
-                       "<name>" N_("Cairo PS Output") "</name>\n"
+                       "<name>" N_("PostScript") "</name>\n"
                        "<id>" SP_MODULE_KEY_PRINT_CAIRO_PS "</id>\n"
                        "<param name=\"PSlevel\" gui-text=\"" N_("Restrict to PS level") "\" type=\"enum\" >\n"
                                "<_item value='PS3'>" N_("PostScript level 3") "</_item>\n"
                        "<id>" SP_MODULE_KEY_PRINT_CAIRO_PS "</id>\n"
                        "<param name=\"PSlevel\" gui-text=\"" N_("Restrict to PS level") "\" type=\"enum\" >\n"
                                "<_item value='PS3'>" N_("PostScript level 3") "</_item>\n"
@@ -226,12 +331,16 @@ CairoPsOutput::init (void)
 #endif
             "</param>\n"
                        "<param name=\"textToPath\" gui-text=\"" N_("Convert texts to paths") "\" type=\"boolean\">false</param>\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"
+                       "<param name=\"textToLaTeX\" gui-text=\"" N_("PS+LaTeX: Omit text in PS, and create LaTeX file") "\" type=\"boolean\">false</param>\n"
+                       "<param name=\"blurToBitmap\" gui-text=\"" N_("Rasterize filter effects") "\" type=\"boolean\">true</param>\n"
+                       "<param name=\"resolution\" gui-text=\"" N_("Resolution for rasterization (dpi)") "\" type=\"int\" min=\"1\" max=\"10000\">90</param>\n"
+                       "<param name=\"areaDrawing\" gui-text=\"" N_("Export area is drawing") "\" type=\"boolean\">true</param>\n"
+                       "<param name=\"areaPage\" gui-text=\"" N_("Export area is page") "\" type=\"boolean\">true</param>\n"
+                       "<param name=\"exportId\" gui-text=\"" N_("Limit export to the object with ID") "\" type=\"string\"></param>\n"
                        "<output>\n"
                                "<extension>.ps</extension>\n"
                        "<output>\n"
                                "<extension>.ps</extension>\n"
-                "<mimetype>application/ps</mimetype>\n"
-                               "<filetypename>" N_("PostScript via Cairo (*.ps)") "</filetypename>\n"
+                                "<mimetype>image/x-postscript</mimetype>\n"
+                               "<filetypename>" N_("PostScript (*.ps)") "</filetypename>\n"
                                "<filetypetooltip>" N_("PostScript File") "</filetypetooltip>\n"
                        "</output>\n"
                "</inkscape-extension>", new CairoPsOutput());
                                "<filetypetooltip>" N_("PostScript File") "</filetypetooltip>\n"
                        "</output>\n"
                "</inkscape-extension>", new CairoPsOutput());
@@ -239,6 +348,44 @@ CairoPsOutput::init (void)
        return;
 }
 
        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=\"textToLaTeX\" gui-text=\"" N_("EPS+LaTeX: Omit text in EPS, and create LaTeX file") "\" type=\"boolean\">false</param>\n"
+                       "<param name=\"blurToBitmap\" gui-text=\"" N_("Rasterize filter effects") "\" type=\"boolean\">true</param>\n"
+                       "<param name=\"resolution\" gui-text=\"" N_("Resolution for rasterization (dpi)") "\" type=\"int\" min=\"1\" max=\"10000\">90</param>\n"
+                       "<param name=\"areaDrawing\" gui-text=\"" N_("Export area is drawing") "\" type=\"boolean\">true</param>\n"
+                       "<param name=\"areaPage\" gui-text=\"" N_("Export area is page") "\" type=\"boolean\">true</param>\n"
+                       "<param name=\"exportId\" gui-text=\"" N_("Limit export to the object with ID") "\" type=\"string\"></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 */
 } } }  /* namespace Inkscape, Extension, Implementation */
 
 #endif /* HAVE_CAIRO_PDF */