Code

Reverting revision 13615
[inkscape.git] / src / main.cpp
index f78b1f5ae47749a9d52fe90bc103aef7c757ffdd..13c052d274ed9eb6381903db7c28f98aa624f2fc 100644 (file)
@@ -65,6 +65,7 @@
 #include "unit-constants.h"
 
 #include "svg/svg.h"
+#include "svg/svg-color.h"
 #include "svg/stringstream.h"
 
 #include "inkscape-private.h"
@@ -80,6 +81,8 @@
 
 #include "debug/logger.h"
 
+#include "helper/png-write.h"
+
 #include <extension/extension.h>
 #include <extension/system.h>
 #include <extension/db.h>
@@ -117,6 +120,7 @@ enum {
     SP_ARG_EXPORT_DPI,
     SP_ARG_EXPORT_AREA,
     SP_ARG_EXPORT_AREA_DRAWING,
+    SP_ARG_EXPORT_AREA_CANVAS,
     SP_ARG_EXPORT_AREA_SNAP,
     SP_ARG_EXPORT_WIDTH,
     SP_ARG_EXPORT_HEIGHT,
@@ -128,7 +132,9 @@ enum {
     SP_ARG_EXPORT_SVG,
     SP_ARG_EXPORT_PS,
     SP_ARG_EXPORT_EPS,
+    SP_ARG_EXPORT_PDF,
     SP_ARG_EXPORT_TEXT_TO_PATH,
+    SP_ARG_EXPORT_FONT,
     SP_ARG_EXPORT_BBOX_PAGE,
     SP_ARG_EXTENSIONDIR,
     SP_ARG_SLIDESHOW,
@@ -138,7 +144,6 @@ enum {
     SP_ARG_QUERY_HEIGHT,
     SP_ARG_QUERY_ID,
     SP_ARG_VERSION,
-    SP_ARG_NEW_GUI,
     SP_ARG_VACUUM_DEFS,
     SP_ARG_LAST
 };
@@ -147,6 +152,7 @@ int sp_main_gui(int argc, char const **argv);
 int sp_main_console(int argc, char const **argv);
 static void sp_do_export_png(SPDocument *doc);
 static void do_export_ps(SPDocument* doc, gchar const* uri, char const *mime);
+static void do_export_pdf(SPDocument* doc, gchar const* uri, char const *mime);
 static void do_query_dimension (SPDocument *doc, bool extent, NR::Dim2 const axis, const gchar *id);
 
 
@@ -156,6 +162,7 @@ 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 gchar *sp_export_width = NULL;
 static gchar *sp_export_height = NULL;
 static gchar *sp_export_id = NULL;
@@ -167,7 +174,9 @@ static gboolean sp_export_id_only = FALSE;
 static gchar *sp_export_svg = NULL;
 static gchar *sp_export_ps = NULL;
 static gchar *sp_export_eps = NULL;
+static gchar *sp_export_pdf = NULL;
 static gboolean sp_export_text_to_path = FALSE;
+static gboolean sp_export_font = FALSE;
 static gboolean sp_export_bbox_page = FALSE;
 static gboolean sp_query_x = FALSE;
 static gboolean sp_query_y = FALSE;
@@ -231,6 +240,11 @@ struct poptOption options[] = {
      N_("Exported area is the entire drawing (not canvas)"),
      NULL},
 
+    {"export-area-canvas", 'C',
+     POPT_ARG_NONE, &sp_export_area_canvas, SP_ARG_EXPORT_AREA_CANVAS,
+     N_("Exported area is the entire canvas"),
+     NULL},
+
     {"export-area-snap", 0,
      POPT_ARG_NONE, &sp_export_area_snap, SP_ARG_EXPORT_AREA_SNAP,
      N_("Snap the bitmap export area outwards to the nearest integer values (in SVG user units)"),
@@ -248,7 +262,7 @@ struct poptOption options[] = {
 
     {"export-id", 'i',
      POPT_ARG_STRING, &sp_export_id, SP_ARG_EXPORT_ID,
-     N_("The ID of the object to export (overrides export-area)"),
+     N_("The ID of the object to export"),
      N_("ID")},
 
     {"export-id-only", 'j',
@@ -288,11 +302,21 @@ struct poptOption options[] = {
      N_("Export document to an EPS file"),
      N_("FILENAME")},
 
+    {"export-pdf", 'A',
+     POPT_ARG_STRING, &sp_export_pdf, SP_ARG_EXPORT_PDF,
+     N_("Export document to a PDF file"),
+     N_("FILENAME")},
+
     {"export-text-to-path", 'T',
      POPT_ARG_NONE, &sp_export_text_to_path, SP_ARG_EXPORT_TEXT_TO_PATH,
      N_("Convert text object to paths on export (EPS)"),
      NULL},
 
+    {"export-embed-fonts", 'F',
+     POPT_ARG_NONE, &sp_export_font, SP_ARG_EXPORT_FONT,
+     N_("Embed fonts on export (Type 1 only) (EPS)"),
+     NULL},
+
     {"export-bbox-page", 'B',
      POPT_ARG_NONE, &sp_export_bbox_page, SP_ARG_EXPORT_BBOX_PAGE,
      N_("Export files with the bounding box set to the page size (EPS)"),
@@ -338,11 +362,6 @@ struct poptOption options[] = {
      N_("Show given files one-by-one, switch to next on any key/mouse event"),
      NULL},
 
-    {"new-gui", 'G',
-     POPT_ARG_NONE, &sp_new_gui, SP_ARG_NEW_GUI,
-     N_("Use the new Gtkmm GUI interface"),
-     NULL},
-
     {"vacuum-defs", 0,
      POPT_ARG_NONE, &sp_vacuum_defs, SP_ARG_VACUUM_DEFS,
      N_("Remove unused definitions from the defs section(s) of the document"),
@@ -423,11 +442,15 @@ main(int argc, char **argv)
             || !strcmp(argv[i], "-i")
             || !strncmp(argv[i], "--export-area-drawing", 21)
             || !strcmp(argv[i], "-D")
+            || !strncmp(argv[i], "--export-area-canvas", 20)
+            || !strcmp(argv[i], "-C")
             || !strncmp(argv[i], "--export-id", 12)
             || !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)
             || !strcmp(argv[i], "-W")
             || !strncmp(argv[i], "--query-width", 13)
             || !strcmp(argv[i], "-H")
@@ -445,9 +468,6 @@ main(int argc, char **argv)
         } else if (!strcmp(argv[i], "-g") || !strcmp(argv[i], "--with-gui")) {
             use_gui = TRUE;
             break;
-        } else if (!strcmp(argv[i], "-G") || !strcmp(argv[i], "--new-gui")) {
-            sp_new_gui = TRUE;
-            break;
         }
     }
 
@@ -702,6 +722,9 @@ sp_main_console(int argc, char const **argv)
             if (sp_export_eps) {
                 do_export_ps(doc, sp_export_eps, "image/x-e-postscript");
             }
+            if (sp_export_pdf) {
+                do_export_pdf(doc, sp_export_pdf, "application/pdf");
+            }
             if (sp_query_width || sp_query_height) {
                 do_query_dimension (doc, true, sp_query_width? NR::X : NR::Y, sp_query_id);
             } else if (sp_query_x || sp_query_y) {
@@ -738,7 +761,8 @@ do_query_dimension (SPDocument *doc, bool extent, NR::Dim2 const axis, const gch
 
     if (o) {
         sp_document_ensure_up_to_date (doc);
-        NR::Rect area = sp_item_bbox_desktop((SPItem *) o);
+        SPItem *item = ((SPItem *) o);
+        NR::Rect area = item->invokeBbox(sp_item_i2doc_affine(item)); // "true" SVG bbox for scripting
 
         Inkscape::SVGOStringStream os;
         if (extent) {
@@ -746,7 +770,7 @@ do_query_dimension (SPDocument *doc, bool extent, NR::Dim2 const axis, const gch
         } else {
             os << area.min()[axis];
         }
-        g_print ("%s\n", os.str().c_str());
+        g_print ("%s", os.str().c_str());
     }
 }
 
@@ -767,20 +791,23 @@ sp_do_export_png(SPDocument *doc)
     if (sp_export_id || sp_export_area_drawing) {
 
         SPObject *o = NULL;
-        if (sp_export_id) {
+        SPObject *o_area = NULL;
+        if (sp_export_id && sp_export_area_drawing) {
+            o = doc->getObjectById(sp_export_id);
+            o_area = SP_DOCUMENT_ROOT (doc);
+        } else if (sp_export_id) {
             o = doc->getObjectById(sp_export_id);
+            o_area = o;
         } else if (sp_export_area_drawing) {
             o = SP_DOCUMENT_ROOT (doc);
-        }
+            o_area = o;
+        } 
 
         if (o) {
             if (!SP_IS_ITEM (o)) {
                 g_warning("Object with id=\"%s\" is not a visible item. Nothing exported.", sp_export_id);
                 return;
             }
-            if (sp_export_area) {
-                g_warning ("Object with id=\"%s\" is being exported; --export-area is ignored.", sp_export_id);
-            }
 
             items = g_slist_prepend (items, SP_ITEM(o));
 
@@ -820,12 +847,14 @@ sp_do_export_png(SPDocument *doc)
 
             // write object bbox to area
             sp_document_ensure_up_to_date (doc);
-            sp_item_invoke_bbox((SPItem *) o, &area, sp_item_i2r_affine((SPItem *) o), TRUE);
+            sp_item_invoke_bbox((SPItem *) o_area, &area, sp_item_i2r_affine((SPItem *) o_area), TRUE);
         } else {
             g_warning("Object with id=\"%s\" was not found in the document. Nothing exported.", sp_export_id);
             return;
         }
-    } else if (sp_export_area) {
+    }
+    
+    if (sp_export_area) {
         /* Try to parse area (given in SVG pixels) */
         if (!sscanf(sp_export_area, "%lg:%lg:%lg:%lg", &area.x0, &area.y0, &area.x1, &area.y1) == 4) {
             g_warning("Cannot parse export area '%s'; use 'x0:y0:x1:y1'. Nothing exported.", sp_export_area);
@@ -835,7 +864,7 @@ sp_do_export_png(SPDocument *doc)
             g_warning("Export area '%s' has negative width or height. Nothing exported.", sp_export_area);
             return;
         }
-    } else {
+    } else if (sp_export_area_canvas || !(sp_export_id || sp_export_area_drawing)) {
         /* Export the whole canvas */
         sp_document_ensure_up_to_date (doc);
         area.x0 = SP_ROOT(doc->root)->x.computed;
@@ -939,7 +968,7 @@ sp_do_export_png(SPDocument *doc)
     g_print("Bitmap saved as: %s\n", filename);
 
     if ((width >= 1) && (height >= 1) && (width < 65536) && (height < 65536)) {
-        sp_export_png_file(doc, filename, area.x0, area.y0, area.x1, area.y1, width, height, bgcolor, NULL, NULL, true, sp_export_id_only ? items : NULL);
+        sp_export_png_file(doc, filename, area.x0, area.y0, area.x1, area.y1, width, height, dpi, dpi, bgcolor, NULL, NULL, true, sp_export_id_only ? items : NULL);
     } else {
         g_warning("Calculated bitmap dimensions %d %d are out of range (1 - 65535). Nothing exported.", width, height);
     }
@@ -958,12 +987,6 @@ sp_do_export_png(SPDocument *doc)
 
 static void do_export_ps(SPDocument* doc, gchar const* uri, char const* mime)
 {
-    /** \todo
-     * FIXME: I've no idea if this is the `proper' way to do this.
-     * If anyone feels qualified to say that it is, perhaps they
-     * could remove this comment.
-     */
-
     Inkscape::Extension::DB::OutputList o;
     Inkscape::Extension::db.get_output_list(o);
     Inkscape::Extension::DB::OutputList::const_iterator i = o.begin();
@@ -978,6 +1001,7 @@ static void do_export_ps(SPDocument* doc, gchar const* uri, char const* mime)
     }
 
     bool old_text_to_path = false;
+    bool old_font_embedded = false;
     bool old_bbox_page = false;
 
     try {
@@ -988,6 +1012,14 @@ static void do_export_ps(SPDocument* doc, gchar const* uri, char const* mime)
         g_warning ("Could not set export-text-to-path option for this export.");
     }
 
+    try {
+        old_font_embedded = (*i)->get_param_bool("fontEmbedded");
+        (*i)->set_param_bool("fontEmbedded", sp_export_font);
+    }
+    catch (...) {
+        g_warning ("Could not set export-font option for this export.");
+    }
+
     try {
         old_bbox_page = (*i)->get_param_bool("pageBoundingBox");
         (*i)->set_param_bool("pageBoundingBox", sp_export_bbox_page);
@@ -1000,6 +1032,7 @@ static void do_export_ps(SPDocument* doc, gchar const* uri, char const* mime)
 
     try {
         (*i)->set_param_bool("textToPath", old_text_to_path);
+        (*i)->set_param_bool("fontEmbedded", old_font_embedded);
         (*i)->set_param_bool("pageBoundingBox", old_bbox_page);
     }
     catch (...) {
@@ -1007,6 +1040,32 @@ static void do_export_ps(SPDocument* doc, gchar const* uri, char const* mime)
     }
 }
 
+/**
+ *  Perform a PDF export
+ *
+ *  \param doc Document to export.
+ *  \param uri URI to export to.
+ *  \param mime MIME type to export as.
+ */
+
+static void do_export_pdf(SPDocument* doc, gchar const* uri, char const* mime)
+{
+    Inkscape::Extension::DB::OutputList o;
+    Inkscape::Extension::db.get_output_list(o);
+    Inkscape::Extension::DB::OutputList::const_iterator i = o.begin();
+    while (i != o.end() && strcmp( (*i)->get_mimetype(), mime ) != 0) {
+        i++;
+    }
+
+    if (i == o.end())
+    {
+        g_warning ("Could not find an extension to export this file.");
+        return;
+    }
+
+    (*i)->save(doc, uri);
+}
+
 #ifdef WIN32
 bool replaceArgs( int& argc, char**& argv )
 {