diff --git a/src/main.cpp b/src/main.cpp
index 67c5a84e87f43faf521ddbcc7a60bfc70c723fd1..d6f0ae9e827a49c93d7257673ed8db6da96061dd 100644 (file)
--- a/src/main.cpp
+++ b/src/main.cpp
#ifdef HAVE_IEEEFP_H
#include <ieeefp.h>
#endif
-#include <string.h>
+#include <cstring>
+#include <string>
#include <locale.h>
#include <popt.h>
#include "main-cmdlineact.h"
+#include <png.h>
+#include <errno.h>
+
enum {
SP_ARG_NONE,
SP_ARG_NOGUI,
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,
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;
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;
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"),
};
static bool needToRecodeParams = true;
-gchar* blankParam = "";
+gchar * blankParam = g_strdup("");
+
+
+
+#ifdef WIN32
+
+/**
+ * Return the directory of the .exe that is currently running
+ */
+static Glib::ustring _win32_getExePath()
+{
+ char exeName[MAX_PATH+1];
+ GetModuleFileName(NULL, exeName, MAX_PATH);
+ char *slashPos = strrchr(exeName, '\\');
+ if (slashPos)
+ *slashPos = '\0';
+ Glib::ustring s = exeName;
+ return s;
+}
+
+/**
+ * Set up the PATH and PYTHONPATH environment variables on
+ * win32
+ */
+static int _win32_set_inkscape_env(const Glib::ustring &exePath)
+{
+
+ char *oldenv = getenv("PATH");
+ Glib::ustring tmp = "PATH=";
+ tmp += exePath;
+ tmp += ";";
+ tmp += exePath;
+ tmp += "\\python;";
+ tmp += exePath;
+ tmp += "\\python\\Scripts;"; // for uniconv.cmd
+ tmp += exePath;
+ tmp += "\\perl";
+ if(oldenv != NULL) {
+ tmp += ";";
+ tmp += oldenv;
+ }
+ _putenv(tmp.c_str());
+
+ oldenv = getenv("PYTHONPATH");
+ tmp = "PYTHONPATH=";
+ tmp += exePath;
+ tmp += "\\python;";
+ tmp += exePath;
+ tmp += "\\python\\Lib;";
+ tmp += exePath;
+ tmp += "\\python\\DLLs";
+ if(oldenv != NULL) {
+ tmp += ";";
+ tmp += oldenv;
+ }
+ _putenv(tmp.c_str());
+
+ return 0;
+}
+#endif
+
+
+/**
+ * This is the classic main() entry point of the program, though on some
+ * architectures it might be called by something else.
+ */
int
main(int argc, char **argv)
{
fpsetmask(fpgetmask() & ~(FP_X_DZ | FP_X_INV));
#endif
-#ifdef ENABLE_NLS
#ifdef WIN32
+ /*
+ Set the current directory to the directory of the
+ executable. This seems redundant, but is needed for
+ when inkscape.exe is executed from another directory.
+ We use relative paths on win32.
+ HKCR\svgfile\shell\open\command is a good example
+ */
+ Glib::ustring homedir = _win32_getExePath();
+ SetCurrentDirectory(homedir.c_str());
+ _win32_set_inkscape_env(homedir);
RegistryTool rt;
rt.setPathInfo();
- gchar *pathBuf = g_strconcat(g_path_get_dirname(argv[0]), "\\", PACKAGE_LOCALE_DIR, NULL);
- bindtextdomain(GETTEXT_PACKAGE, pathBuf);
- g_free(pathBuf);
+#endif
+
+ /**
+ * Call bindtextdomain() for various machines's paths
+ */
+#ifdef ENABLE_NLS
+#ifdef WIN32
+ Glib::ustring localePath = homedir;
+ localePath += "\\";
+ localePath += PACKAGE_LOCALE_DIR;
+ bindtextdomain(GETTEXT_PACKAGE, localePath.c_str());
#else
#ifdef ENABLE_BINRELOC
bindtextdomain(GETTEXT_PACKAGE, BR_LOCALEDIR(""));
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) {
Inkscape::Debug::Logger::init();
gboolean use_gui;
+
#ifndef WIN32
use_gui = (getenv("DISPLAY") != NULL);
#else
- /*
- Set the current directory to the directory of the
- executable. This seems redundant, but is needed for
- when inkscape.exe is executed from another directory.
- We use relative paths on win32.
- HKCR\svgfile\shell\open\command is a good example
- */
- /// \todo FIXME BROKEN - non-UTF-8 sneaks in here.
- char *homedir = g_path_get_dirname(argv[0]);
- SetCurrentDirectory(homedir);
- g_free(homedir);
-
use_gui = TRUE;
#endif
/* Test whether with/without GUI is forced */
|| !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")
return app.run();
}
+
+
+
void fixupSingleFilename( gchar **orig, gchar **spare )
{
if ( orig && *orig && **orig ) {
}
}
+
+
GSList *fixupFilenameEncoding( GSList* fl )
{
GSList *newFl = NULL;
}
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();
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;
}
if (sp_global_printer) {
sp_print_document_to_file(doc, sp_global_printer);
}
- if (sp_export_png || sp_export_id || sp_export_area_drawing) {
+ if (sp_export_png) {
sp_do_export_png(doc);
}
if (sp_export_svg) {
Inkscape::XML::Node *repr;
rdoc = sp_repr_document_new("svg:svg");
repr = rdoc->root();
- repr = sp_document_root(doc)->updateRepr(repr, SP_OBJECT_WRITE_BUILD);
+ repr = sp_document_root(doc)->updateRepr(rdoc, repr, SP_OBJECT_WRITE_BUILD);
sp_repr_save_file(repr->document(), sp_export_svg, SP_SVG_NS_URI);
}
if (sp_export_ps) {
do_export_emf(doc, sp_export_emf, "image/x-emf");
}
#endif //WIN32
- if (sp_query_width || sp_query_height) {
+ 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);
@@ -828,7 +920,7 @@ do_query_dimension (SPDocument *doc, bool extent, NR::Dim2 const axis, const gch
SPItem *item = ((SPItem *) o);
// "true" SVG bbox for scripting
- NR::Maybe<NR::Rect> area = item->getBounds(sp_item_i2doc_affine(item));
+ boost::optional<NR::Rect> area = item->getBounds(from_2geom(sp_item_i2doc_affine(item)));
if (area) {
Inkscape::SVGOStringStream os;
if (extent) {
@@ -843,6 +935,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)) {
+ boost::optional<NR::Rect> area = item->getBounds(from_2geom(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)
} else if (sp_export_area_drawing) {
o = SP_DOCUMENT_ROOT (doc);
o_area = o;
- }
+ }
if (o) {
if (!SP_IS_ITEM (o)) {
// write object bbox to area
sp_document_ensure_up_to_date (doc);
- sp_item_invoke_bbox((SPItem *) o_area, &area, sp_item_i2r_affine((SPItem *) o_area), TRUE);
+ sp_item_invoke_bbox((SPItem *) o_area, &area, from_2geom(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;
}
}
-
+
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) {
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;
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);
if (i == o.end())
{
- g_warning ("Could not find an extension to export this file.");
+ g_warning ("Could not find an extension to export to MIME type %s.", mime);
return;
}
@@ -1128,10 +1257,39 @@ static void do_export_pdf(SPDocument* doc, gchar const* uri, char const* mime)
if (i == o.end())
{
- g_warning ("Could not find an extension to export this file.");
+ g_warning ("Could not find an extension to export to MIME type %s.", mime);
return;
}
+ if (sp_export_id) {
+ SPObject *o = doc->getObjectById(sp_export_id);
+ if (o == NULL) {
+ g_warning("Object with id=\"%s\" was not found in the document. Nothing exported.", sp_export_id);
+ return;
+ }
+ (*i)->set_param_string ("exportId", sp_export_id);
+ } else {
+ (*i)->set_param_string ("exportId", "");
+ }
+
+ if (sp_export_area_drawing) {
+ (*i)->set_param_bool ("exportDrawing", TRUE);
+ } else {
+ (*i)->set_param_bool ("exportDrawing", FALSE);
+ }
+
+ if (sp_export_area_canvas) {
+ (*i)->set_param_bool ("exportCanvas", TRUE);
+ } else {
+ (*i)->set_param_bool ("exportCanvas", FALSE);
+ }
+
+ if (sp_export_text_to_path) {
+ (*i)->set_param_bool("textToPath", TRUE);
+ } else {
+ (*i)->set_param_bool("textToPath", FALSE);
+ }
+
(*i)->save(doc, uri);
}
@@ -1155,7 +1313,7 @@ static void do_export_emf(SPDocument* doc, gchar const* uri, char const* mime)
if (i == o.end())
{
- g_warning ("Could not find an extension to export this file.");
+ g_warning ("Could not find an extension to export to MIME type %s.", mime);
return;
}
if ( wildcarded )
{
#ifdef REPLACEARGS_ANSI
- WIN32_FIND_DATAA data = {0};
+ WIN32_FIND_DATAA data;
#else
- WIN32_FIND_DATAW data = {0};
+ WIN32_FIND_DATAW data;
#endif // REPLACEARGS_ANSI
+ memset((void *)&data, 0, sizeof(data));
+
int baseLen = wcslen(parsed[i1]) + 2;
wchar_t* base = new wchar_t[baseLen];
wcsncpy( base, parsed[i1], baseLen );