Code

Patch from Fridrich - LP #520532
[inkscape.git] / src / main.cpp
index 64fcb664dd431985aa5c35cbab3da214454d1dda..d11222203778b3728d0fec669d76494fae9bec3f 100644 (file)
 
 #include "gc-core.h"
 
+#ifdef AND
+#undef AND
+#endif
+
 #include "macros.h"
 #include "file.h"
 #include "document.h"
 #include <extension/system.h>
 #include <extension/db.h>
 #include <extension/output.h>
+#include <extension/input.h>
 
 #ifdef WIN32
-//#define REPLACEARGS_ANSI
-//#define REPLACEARGS_DEBUG
-
 #include "registrytool.h"
-
 #include "extension/internal/win32.h"
 using Inkscape::Extension::Internal::PrintWin32;
-
 #endif // WIN32
 
 #include "extension/init.h"
@@ -129,7 +129,7 @@ enum {
     SP_ARG_EXPORT_DPI,
     SP_ARG_EXPORT_AREA,
     SP_ARG_EXPORT_AREA_DRAWING,
-    SP_ARG_EXPORT_AREA_CANVAS,
+    SP_ARG_EXPORT_AREA_PAGE,
     SP_ARG_EXPORT_AREA_SNAP,
     SP_ARG_EXPORT_WIDTH,
     SP_ARG_EXPORT_HEIGHT,
@@ -142,6 +142,7 @@ enum {
     SP_ARG_EXPORT_PS,
     SP_ARG_EXPORT_EPS,
     SP_ARG_EXPORT_PDF,
+    SP_ARG_EXPORT_LATEX,
 #ifdef WIN32
     SP_ARG_EXPORT_EMF,
 #endif //WIN32
@@ -165,13 +166,13 @@ enum {
 
 int sp_main_gui(int argc, char const **argv);
 int sp_main_console(int argc, char const **argv);
-static void sp_do_export_png(Document *doc);
-static void do_export_ps_pdf(Document* doc, gchar const* uri, char const *mime);
+static void sp_do_export_png(SPDocument *doc);
+static void do_export_ps_pdf(SPDocument* doc, gchar const* uri, char const *mime);
 #ifdef WIN32
-static void do_export_emf(Document* doc, gchar const* uri, char const *mime);
+static void do_export_emf(SPDocument* doc, gchar const* uri, char const *mime);
 #endif //WIN32
-static void do_query_dimension (Document *doc, bool extent, Geom::Dim2 const axis, const gchar *id);
-static void do_query_all (Document *doc);
+static void do_query_dimension (SPDocument *doc, bool extent, Geom::Dim2 const axis, const gchar *id);
+static void do_query_all (SPDocument *doc);
 static void do_query_all_recurse (SPObject *o);
 
 static gchar *sp_global_printer = NULL;
@@ -179,7 +180,8 @@ static gchar *sp_export_png = NULL;
 static gchar *sp_export_dpi = NULL;
 static gchar *sp_export_area = NULL;
 static gboolean sp_export_area_drawing = FALSE;
-static gboolean sp_export_area_canvas = FALSE;
+static gboolean sp_export_area_page = FALSE;
+static gboolean sp_export_latex = FALSE;
 static gchar *sp_export_width = NULL;
 static gchar *sp_export_height = NULL;
 static gchar *sp_export_id = NULL;
@@ -222,7 +224,8 @@ static void resetCommandlineGlobals() {
         sp_export_dpi = NULL;
         sp_export_area = NULL;
         sp_export_area_drawing = FALSE;
-        sp_export_area_canvas = FALSE;
+        sp_export_area_page = FALSE;
+        sp_export_latex = FALSE;
         sp_export_width = NULL;
         sp_export_height = NULL;
         sp_export_id = NULL;
@@ -296,17 +299,17 @@ struct poptOption options[] = {
 
     {"export-area", 'a',
      POPT_ARG_STRING, &sp_export_area, SP_ARG_EXPORT_AREA,
-     N_("Exported area in SVG user units (default is the canvas; 0,0 is lower-left corner)"),
+     N_("Exported area in SVG user units (default is the page; 0,0 is lower-left corner)"),
      N_("x0:y0:x1:y1")},
 
     {"export-area-drawing", 'D',
      POPT_ARG_NONE, &sp_export_area_drawing, SP_ARG_EXPORT_AREA_DRAWING,
-     N_("Exported area is the entire drawing (not canvas)"),
+     N_("Exported area is the entire drawing (not page)"),
      NULL},
 
-    {"export-area-canvas", 'C',
-     POPT_ARG_NONE, &sp_export_area_canvas, SP_ARG_EXPORT_AREA_CANVAS,
-     N_("Exported area is the entire canvas"),
+    {"export-area-page", 'C',
+     POPT_ARG_NONE, &sp_export_area_page, SP_ARG_EXPORT_AREA_PAGE,
+     N_("Exported area is the entire page"),
      NULL},
 
     {"export-area-snap", 0,
@@ -371,6 +374,11 @@ struct poptOption options[] = {
      N_("Export document to a PDF file"),
      N_("FILENAME")},
 
+    {"export-latex", 0,
+     POPT_ARG_NONE, &sp_export_latex, SP_ARG_EXPORT_LATEX,
+     N_("Export PDF/PS/EPS without text. Besides the PDF/PS/EPS, a LaTeX file is exported, putting the text on top of the PDF/PS/EPS file. Include the result in LaTeX like: \\input{latexfile.tex}"),
+     NULL},
+
 #ifdef WIN32
     {"export-emf", 'M',
      POPT_ARG_STRING, &sp_export_emf, SP_ARG_EXPORT_EMF,
@@ -565,8 +573,12 @@ main(int argc, char **argv)
     // TODO these should use xxxW() calls explicitly and convert UTF-16 <--> UTF-8
     SetCurrentDirectory(homedir.c_str());
     _win32_set_inkscape_env(homedir);
-    RegistryTool rt;
-    rt.setPathInfo();
+    // Don't touch the registry (works fine without it) for Inkscape Portable
+    gchar const *val = g_getenv("INKSCAPE_PORTABLE_PROFILE_DIR");
+    if (!val) {
+        RegistryTool rt;
+        rt.setPathInfo();
+    }
 #endif
 
     // Prevents errors like "Unable to wrap GdkPixbuf..." (in nr-filter-image.cpp for example)
@@ -628,19 +640,20 @@ main(int argc, char **argv)
             || !strcmp(argv[i], "-e")
             || !strncmp(argv[i], "--export-png", 12)
             || !strcmp(argv[i], "-l")
-            || !strncmp(argv[i], "--export-plain-svg", 12)
+            || !strncmp(argv[i], "--export-plain-svg", 18)
             || !strcmp(argv[i], "-i")
             || !strncmp(argv[i], "--export-area-drawing", 21)
             || !strcmp(argv[i], "-D")
-            || !strncmp(argv[i], "--export-area-canvas", 20)
+            || !strncmp(argv[i], "--export-area-page", 18)
             || !strcmp(argv[i], "-C")
-            || !strncmp(argv[i], "--export-id", 12)
+            || !strncmp(argv[i], "--export-id", 11)
             || !strcmp(argv[i], "-P")
             || !strncmp(argv[i], "--export-ps", 11)
             || !strcmp(argv[i], "-E")
             || !strncmp(argv[i], "--export-eps", 12)
             || !strcmp(argv[i], "-A")
             || !strncmp(argv[i], "--export-pdf", 12)
+            || !strncmp(argv[i], "--export-latex", 14)
 #ifdef WIN32
             || !strcmp(argv[i], "-M")
             || !strncmp(argv[i], "--export-emf", 12)
@@ -652,11 +665,11 @@ main(int argc, char **argv)
             || !strcmp(argv[i], "-S")
             || !strncmp(argv[i], "--query-all", 11)
             || !strcmp(argv[i], "-X")
-            || !strncmp(argv[i], "--query-x", 13)
+            || !strncmp(argv[i], "--query-x", 9)
             || !strcmp(argv[i], "-Y")
-            || !strncmp(argv[i], "--query-y", 14)
+            || !strncmp(argv[i], "--query-y", 9)
             || !strcmp(argv[i], "--vacuum-defs")
-            || !strncmp(argv[i], "--shell", 7)
+            || !strcmp(argv[i], "--shell")
            )
         {
             /* main_console handles any exports -- not the gui */
@@ -962,12 +975,27 @@ void sp_process_file_list(GSList *fl)
 {
     while (fl) {
         const gchar *filename = (gchar *)fl->data;
-        Document *doc = Inkscape::Extension::open(NULL, filename);
+
+        SPDocument *doc = NULL;
+        try {
+            doc = Inkscape::Extension::open(NULL, filename);
+        } catch (Inkscape::Extension::Input::no_extension_found &e) {
+            doc = NULL;
+        } catch (Inkscape::Extension::Input::open_failed &e) {
+            doc = NULL;
+        }
+
         if (doc == NULL) {
-            doc = Inkscape::Extension::open(Inkscape::Extension::db.get(SP_MODULE_KEY_INPUT_SVG), filename);
+            try {
+                doc = Inkscape::Extension::open(Inkscape::Extension::db.get(SP_MODULE_KEY_INPUT_SVG), filename);
+            } catch (Inkscape::Extension::Input::no_extension_found &e) {
+                doc = NULL;
+            } catch (Inkscape::Extension::Input::open_failed &e) {
+                doc = NULL;
+            }
         }
         if (doc == NULL) {
-            g_warning("Specified document %s cannot be opened (is it a valid SVG file?)", filename);
+            g_warning("Specified document %s cannot be opened (does not exist or not a valid SVG file)", filename);
         } else {
             if (sp_vacuum_defs) {
                 vacuum_document(doc);
@@ -979,7 +1007,7 @@ void sp_process_file_list(GSList *fl)
             if (sp_global_printer) {
                 sp_print_document_to_file(doc, sp_global_printer);
             }
-            if (sp_export_png) {
+            if (sp_export_png || (sp_export_id && sp_export_use_hints)) {
                 sp_do_export_png(doc);
             }
             if (sp_export_svg) {
@@ -1127,7 +1155,7 @@ int sp_main_console(int argc, char const **argv)
 }
 
 static void
-do_query_dimension (Document *doc, bool extent, Geom::Dim2 const axis, const gchar *id)
+do_query_dimension (SPDocument *doc, bool extent, Geom::Dim2 const axis, const gchar *id)
 {
     SPObject *o = NULL;
 
@@ -1167,7 +1195,7 @@ do_query_dimension (Document *doc, bool extent, Geom::Dim2 const axis, const gch
 }
 
 static void
-do_query_all (Document *doc)
+do_query_all (SPDocument *doc)
 {
     SPObject *o = NULL;
 
@@ -1183,11 +1211,11 @@ static void
 do_query_all_recurse (SPObject *o)
 {
     SPItem *item = ((SPItem *) o);
-    if (o->id && SP_IS_ITEM(item)) {
+    if (o->getId() && SP_IS_ITEM(item)) {
         Geom::OptRect area = item->getBounds(sp_item_i2doc_affine(item));
         if (area) {
             Inkscape::SVGOStringStream os;
-            os << o->id;
+            os << o->getId();
             os << "," << area->min()[Geom::X];
             os << "," << area->min()[Geom::Y];
             os << "," << area->dimensions()[Geom::X];
@@ -1205,9 +1233,10 @@ do_query_all_recurse (SPObject *o)
 
 
 static void
-sp_do_export_png(Document *doc)
+sp_do_export_png(SPDocument *doc)
 {
     const gchar *filename = NULL;
+    bool filename_from_hint = false;
     gdouble dpi = 0.0;
 
     if (sp_export_use_hints && (!sp_export_id && !sp_export_area_drawing)) {
@@ -1254,6 +1283,7 @@ sp_do_export_png(Document *doc)
                         filename = sp_export_png;
                     } else {
                         filename = fn_hint;
+                        filename_from_hint = true;
                     }
                 } else {
                     g_warning ("Export filename hint not found for the object.");
@@ -1298,8 +1328,8 @@ sp_do_export_png(Document *doc)
             return;
         }
         area = Geom::Rect(Geom::Interval(x0,x1), Geom::Interval(y0,y1));
-    } else if (sp_export_area_canvas || !(sp_export_id || sp_export_area_drawing)) {
-        /* Export the whole canvas */
+    } else if (sp_export_area_page || !(sp_export_id || sp_export_area_drawing)) {
+        /* Export the whole page: note: Inkscape uses 'page' in all menus and dialogs, not 'canvas' */
         sp_document_ensure_up_to_date (doc);
         Geom::Point origin (SP_ROOT(doc->root)->x.computed, SP_ROOT(doc->root)->y.computed);
         area = Geom::Rect(origin, origin + sp_document_dimensions(doc));
@@ -1393,6 +1423,23 @@ sp_do_export_png(Document *doc)
         }
     }
 
+    gchar *path = 0;
+    if (filename_from_hint) {
+        //Make relative paths go from the document location, if possible:
+        if (!g_path_is_absolute(filename) && doc->uri) {
+            gchar *dirname = g_path_get_dirname(doc->uri);
+            if (dirname) {
+                path = g_build_filename(dirname, filename, NULL);
+                g_free(dirname);
+            }
+        }
+        if (!path) {
+            path = g_strdup(filename);
+        }
+    } else {
+        path = g_strdup(filename);
+    }
+
     g_print("Background RRGGBBAA: %08x\n", bgcolor);
 
     g_print("Area %g:%g:%g:%g exported to %lu x %lu pixels (%g dpi)\n", area[Geom::X][0], area[Geom::Y][0], area[Geom::X][1], area[Geom::Y][1], width, height, dpi);
@@ -1400,11 +1447,12 @@ sp_do_export_png(Document *doc)
     g_print("Bitmap saved as: %s\n", filename);
 
     if ((width >= 1) && (height >= 1) && (width <= PNG_UINT_31_MAX) && (height <= PNG_UINT_31_MAX)) {
-        sp_export_png_file(doc, filename, area, width, height, dpi, dpi, bgcolor, NULL, NULL, true, sp_export_id_only ? items : NULL);
+        sp_export_png_file(doc, path, area, width, height, dpi, dpi, bgcolor, NULL, NULL, true, sp_export_id_only ? items : NULL);
     } else {
         g_warning("Calculated bitmap dimensions %lu %lu are out of range (1 - %lu). Nothing exported.", width, height, (unsigned long int)PNG_UINT_31_MAX);
     }
 
+    g_free (path);
     g_slist_free (items);
 }
 
@@ -1417,7 +1465,7 @@ sp_do_export_png(Document *doc)
  *  \param mime MIME type to export as.
  */
 
-static void do_export_ps_pdf(Document* doc, gchar const* uri, char const* mime)
+static void do_export_ps_pdf(SPDocument* doc, gchar const* uri, char const* mime)
 {
     Inkscape::Extension::DB::OutputList o;
     Inkscape::Extension::db.get_output_list(o);
@@ -1443,8 +1491,8 @@ static void do_export_ps_pdf(Document* doc, gchar const* uri, char const* mime)
         (*i)->set_param_string ("exportId", "");
     }
 
-    if (sp_export_area_canvas && sp_export_area_drawing) {
-        g_warning ("You cannot use --export-area-canvas and --export-area-drawing at the same time; only the former will take effect.");
+    if (sp_export_area_page && sp_export_area_drawing) {
+        g_warning ("You cannot use --export-area-page and --export-area-drawing at the same time; only the former will take effect.");
         sp_export_area_drawing = false;
     }
 
@@ -1454,17 +1502,17 @@ static void do_export_ps_pdf(Document* doc, gchar const* uri, char const* mime)
         (*i)->set_param_bool ("areaDrawing", FALSE);
     }
 
-    if (sp_export_area_canvas) {
+    if (sp_export_area_page) {
         if (sp_export_eps) {
-            g_warning ("EPS cannot have its bounding box extend beyond its content, so if your drawing is smaller than the canvas, --export-area-canvas will clip it to drawing.");
+            g_warning ("EPS cannot have its bounding box extend beyond its content, so if your drawing is smaller than the page, --export-area-page will clip it to drawing.");
         }
-        (*i)->set_param_bool ("areaCanvas", TRUE);
+        (*i)->set_param_bool ("areaPage", TRUE);
     } else {
-        (*i)->set_param_bool ("areaCanvas", FALSE);
+        (*i)->set_param_bool ("areaPage", FALSE);
     }
 
-    if (!sp_export_area_drawing && !sp_export_area_canvas && !sp_export_id) {
-        // neither is set, set canvas as default for ps/pdf and drawing for eps
+    if (!sp_export_area_drawing && !sp_export_area_page && !sp_export_id) {
+        // neither is set, set page as default for ps/pdf and drawing for eps
         if (sp_export_eps) {
             try {
                (*i)->set_param_bool("areaDrawing", TRUE);
@@ -1478,6 +1526,12 @@ static void do_export_ps_pdf(Document* doc, gchar const* uri, char const* mime)
         (*i)->set_param_bool("textToPath", FALSE);
     }
 
+    if (sp_export_latex) {
+        (*i)->set_param_bool("textToLaTeX", TRUE);
+    } else {
+        (*i)->set_param_bool("textToLaTeX", FALSE);
+    }
+
     if (sp_export_ignore_filters) {
         (*i)->set_param_bool("blurToBitmap", FALSE);
     } else {
@@ -1507,7 +1561,7 @@ static void do_export_ps_pdf(Document* doc, gchar const* uri, char const* mime)
  *  \param mime MIME type to export as (should be "image/x-emf")
  */
 
-static void do_export_emf(Document* doc, gchar const* uri, char const* mime)
+static void do_export_emf(SPDocument* doc, gchar const* uri, char const* mime)
 {
     Inkscape::Extension::DB::OutputList o;
     Inkscape::Extension::db.get_output_list(o);