Code

noop: reverted one line of commit #17642 (it's safe to call g_free with NULL)
[inkscape.git] / src / main.cpp
index cc359793a518983bdec6b68639fe8777cce17d10..4580b7271a4e1cef1f7e27ec3b66d82c785a5285 100644 (file)
@@ -33,7 +33,8 @@
 #ifdef HAVE_IEEEFP_H
 #include <ieeefp.h>
 #endif
-#include <string.h>
+#include <cstring>
+#include <string>
 #include <locale.h>
 
 #include <popt.h>
@@ -110,6 +111,9 @@ using Inkscape::Extension::Internal::PrintWin32;
 
 #include "main-cmdlineact.h"
 
+#include <png.h>
+#include <errno.h>
+
 enum {
     SP_ARG_NONE,
     SP_ARG_NOGUI,
@@ -133,6 +137,9 @@ enum {
     SP_ARG_EXPORT_PS,
     SP_ARG_EXPORT_EPS,
     SP_ARG_EXPORT_PDF,
+#ifdef WIN32
+    SP_ARG_EXPORT_EMF,
+#endif //WIN32
     SP_ARG_EXPORT_TEXT_TO_PATH,
     SP_ARG_EXPORT_FONT,
     SP_ARG_EXPORT_BBOX_PAGE,
@@ -142,6 +149,7 @@ enum {
     SP_ARG_QUERY_Y,
     SP_ARG_QUERY_WIDTH,
     SP_ARG_QUERY_HEIGHT,
+    SP_ARG_QUERY_ALL,
     SP_ARG_QUERY_ID,
     SP_ARG_VERSION,
     SP_ARG_VACUUM_DEFS,
@@ -156,8 +164,12 @@ 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);
+#ifdef WIN32
+static void do_export_emf(SPDocument* doc, gchar const* uri, char const *mime);
+#endif //WIN32
 static void do_query_dimension (SPDocument *doc, bool extent, NR::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;
 static gchar *sp_export_png = NULL;
@@ -177,6 +189,9 @@ static gchar *sp_export_svg = NULL;
 static gchar *sp_export_ps = NULL;
 static gchar *sp_export_eps = NULL;
 static gchar *sp_export_pdf = NULL;
+#ifdef WIN32
+static gchar *sp_export_emf = NULL;
+#endif //WIN32
 static gboolean sp_export_text_to_path = FALSE;
 static gboolean sp_export_font = FALSE;
 static gboolean sp_export_bbox_page = FALSE;
@@ -184,6 +199,7 @@ static gboolean sp_query_x = FALSE;
 static gboolean sp_query_y = FALSE;
 static gboolean sp_query_width = FALSE;
 static gboolean sp_query_height = FALSE;
+static gboolean sp_query_all = FALSE;
 static gchar *sp_query_id = NULL;
 static int sp_new_gui = FALSE;
 static gboolean sp_vacuum_defs = FALSE;
@@ -309,6 +325,13 @@ struct poptOption options[] = {
      N_("Export document to a PDF file"),
      N_("FILENAME")},
 
+#ifdef WIN32
+    {"export-emf", 'M',
+     POPT_ARG_STRING, &sp_export_emf, SP_ARG_EXPORT_EMF,
+     N_("Export document to an Enhanced Metafile (EMF) File"),
+     N_("FILENAME")},
+#endif //WIN32
+
     {"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)"),
@@ -348,6 +371,11 @@ struct poptOption options[] = {
      N_("Query the height of the drawing or, if specified, of the object with --query-id"),
      NULL},
 
+    {"query-all", 'S',
+     POPT_ARG_NONE, &sp_query_all, SP_ARG_QUERY_ALL,
+     N_("List id,x,y,w,h for all objects"),
+     NULL},
+
     {"query-id", 'I',
      POPT_ARG_STRING, &sp_query_id, SP_ARG_QUERY_ID,
      N_("The ID of the object whose dimensions are queried"),
@@ -409,7 +437,7 @@ main(int argc, char **argv)
     bindtextdomain(GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR);
 #endif
 #endif
-    // Allow the user to override the locale directory by setting 
+    // Allow the user to override the locale directory by setting
     // the environment variable INKSCAPE_LOCALEDIR.
     char *inkscape_localedir = getenv("INKSCAPE_LOCALEDIR");
     if (inkscape_localedir != NULL) {
@@ -469,10 +497,16 @@ main(int argc, char **argv)
             || !strncmp(argv[i], "--export-eps", 12)
             || !strcmp(argv[i], "-A")
             || !strncmp(argv[i], "--export-pdf", 12)
+#ifdef WIN32
+            || !strcmp(argv[i], "-M")
+            || !strncmp(argv[i], "--export-emf", 12)
+#endif //WIN32
             || !strcmp(argv[i], "-W")
             || !strncmp(argv[i], "--query-width", 13)
             || !strcmp(argv[i], "-H")
             || !strncmp(argv[i], "--query-height", 14)
+            || !strcmp(argv[i], "-S")
+            || !strncmp(argv[i], "--query-all", 11)
             || !strcmp(argv[i], "-X")
             || !strncmp(argv[i], "--query-x", 13)
             || !strcmp(argv[i], "-Y")
@@ -621,7 +655,7 @@ int sp_common_main( int argc, char const **argv, GSList **flDest )
 }
 
 static void
-snooper(GdkEvent *event, gpointer data) { 
+snooper(GdkEvent *event, gpointer /*data*/) {
     if(inkscape_mapalt())  /* returns the map of the keyboard modifier to map to Alt, zero if no mapping */
     {
         GdkModifierType mapping=(GdkModifierType)inkscape_mapalt();
@@ -630,17 +664,17 @@ snooper(GdkEvent *event, gpointer data) {
                 if(event->motion.state & mapping) {
                     event->motion.state|=GDK_MOD1_MASK;
                 }
-                break;       
+                break;
             case GDK_BUTTON_PRESS:
                 if(event->button.state & mapping) {
                     event->button.state|=GDK_MOD1_MASK;
                 }
-                break;       
+                break;
              case GDK_KEY_PRESS:
                  if(event->key.state & mapping) {
                      event->key.state|=GDK_MOD1_MASK;
                  }
-                 break;                
+                 break;
         default:
             break;
         }
@@ -763,7 +797,14 @@ sp_main_console(int argc, char const **argv)
             if (sp_export_pdf) {
                 do_export_pdf(doc, sp_export_pdf, "application/pdf");
             }
-            if (sp_query_width || sp_query_height) {
+#ifdef WIN32
+            if (sp_export_emf) {
+                do_export_emf(doc, sp_export_emf, "image/x-emf");
+            }
+#endif //WIN32
+            if (sp_query_all) {
+                do_query_all (doc);
+            } else 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) {
                 do_query_dimension (doc, false, sp_query_x? NR::X : NR::Y, sp_query_id);
@@ -818,6 +859,43 @@ do_query_dimension (SPDocument *doc, bool extent, NR::Dim2 const axis, const gch
     }
 }
 
+static void
+do_query_all (SPDocument *doc)
+{
+    SPObject *o = NULL;
+
+    o = SP_DOCUMENT_ROOT(doc);
+
+    if (o) {
+        sp_document_ensure_up_to_date (doc);
+        do_query_all_recurse(o);
+    }
+}
+
+static void
+do_query_all_recurse (SPObject *o)
+{
+    SPItem *item = ((SPItem *) o);
+    if (o->id && SP_IS_ITEM(item)) {
+        NR::Maybe<NR::Rect> area = item->getBounds(sp_item_i2doc_affine(item));
+        if (area) {
+            Inkscape::SVGOStringStream os;
+            os << o->id;
+            os << "," << area->min()[NR::X];
+            os << "," << area->min()[NR::Y];
+            os << "," << area->extent(NR::X);
+            os << "," << area->extent(NR::Y);
+            g_print ("%s\n", os.str().c_str());
+        }
+    }
+
+    SPObject *child = o->children;
+    while (child) {
+        do_query_all_recurse (child);
+        child = child->next;
+    }
+}
+
 
 static void
 sp_do_export_png(SPDocument *doc)
@@ -845,7 +923,7 @@ sp_do_export_png(SPDocument *doc)
         } else if (sp_export_area_drawing) {
             o = SP_DOCUMENT_ROOT (doc);
             o_area = o;
-        } 
+        }
 
         if (o) {
             if (!SP_IS_ITEM (o)) {
@@ -897,7 +975,7 @@ sp_do_export_png(SPDocument *doc)
             return;
         }
     }
-    
+
     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) {
@@ -946,33 +1024,33 @@ sp_do_export_png(SPDocument *doc)
     if (dpi == 0.0)
         dpi = PX_PER_IN;
 
-    gint width = 0;
-    gint height = 0;
+    unsigned long int width = 0;
+    unsigned long int height = 0;
 
     if (sp_export_width) {
-        width = atoi(sp_export_width);
-        if ((width < 1) || (width > 65536)) {
-            g_warning("Export width %d out of range (1 - 65536). Nothing exported.", width);
+        width = strtoul(sp_export_width, NULL, 0);
+        if ((width < 1) || (width > PNG_UINT_31_MAX) || (errno == ERANGE) ) {
+            g_warning("Export width %lu out of range (1 - %lu). Nothing exported.", width, (unsigned long int)PNG_UINT_31_MAX);
             return;
         }
         dpi = (gdouble) width * PX_PER_IN / (area.x1 - area.x0);
     }
 
     if (sp_export_height) {
-        height = atoi(sp_export_height);
-        if ((height < 1) || (height > 65536)) {
-            g_warning("Export height %d out of range (1 - 65536). Nothing exported.", width);
+        height = strtoul(sp_export_height, NULL, 0);
+        if ((height < 1) || (height > PNG_UINT_31_MAX)) {
+            g_warning("Export height %lu out of range (1 - %lu). Nothing exported.", height, (unsigned long int)PNG_UINT_31_MAX);
             return;
         }
         dpi = (gdouble) height * PX_PER_IN / (area.y1 - area.y0);
     }
 
     if (!sp_export_width) {
-        width = (gint) ((area.x1 - area.x0) * dpi / PX_PER_IN + 0.5);
+        width = (unsigned long int) ((area.x1 - area.x0) * dpi / PX_PER_IN + 0.5);
     }
 
     if (!sp_export_height) {
-        height = (gint) ((area.y1 - area.y0) * dpi / PX_PER_IN + 0.5);
+        height = (unsigned long int) ((area.y1 - area.y0) * dpi / PX_PER_IN + 0.5);
     }
 
     guint32 bgcolor = 0x00000000;
@@ -1007,14 +1085,14 @@ sp_do_export_png(SPDocument *doc)
 
     g_print("Background RRGGBBAA: %08x\n", bgcolor);
 
-    g_print("Area %g:%g:%g:%g exported to %d x %d pixels (%g dpi)\n", area.x0, area.y0, area.x1, area.y1, width, height, dpi);
+    g_print("Area %g:%g:%g:%g exported to %lu x %lu pixels (%g dpi)\n", area.x0, area.y0, area.x1, area.y1, width, height, dpi);
 
     g_print("Bitmap saved as: %s\n", filename);
 
-    if ((width >= 1) && (height >= 1) && (width < 65536) && (height < 65536)) {
+    if ((width >= 1) && (height >= 1) && (width <= PNG_UINT_31_MAX) && (height <= PNG_UINT_31_MAX)) {
         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);
+        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_slist_free (items);
@@ -1110,6 +1188,34 @@ static void do_export_pdf(SPDocument* doc, gchar const* uri, char const* mime)
     (*i)->save(doc, uri);
 }
 
+#ifdef WIN32
+/**
+ *  Export a document to EMF
+ *
+ *  \param doc Document to export.
+ *  \param uri URI to export to.
+ *  \param mime MIME type to export as (should be "image/x-emf")
+ */
+
+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);
+    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);
+}
+#endif //WIN32
+
 #ifdef WIN32
 bool replaceArgs( int& argc, char**& argv )
 {