diff --git a/src/main.cpp b/src/main.cpp
index f8c87b5a621a95277f04246f99fb1f58ddc79518..7bbe691d70f9abc871efc78a27d6141453db6be3 100644 (file)
--- a/src/main.cpp
+++ b/src/main.cpp
#include <cstring>
#include <string>
#include <locale.h>
+#include <stdlib.h>
#include <popt.h>
#ifndef POPT_TABLEEND
#include "inkscape-private.h"
#include "inkscape-stock.h"
-#include "inkscape_version.h"
+#include "inkscape-version.h"
#include "sp-namedview.h"
#include "sp-guide.h"
#include "debug/log-display-config.h"
#include "helper/png-write.h"
+#include "helper/geom.h"
#include <extension/extension.h>
#include <extension/system.h>
SP_ARG_EXPORT_EMF,
#endif //WIN32
SP_ARG_EXPORT_TEXT_TO_PATH,
- SP_ARG_EXPORT_FONT,
- SP_ARG_EXPORT_BBOX_PAGE,
+ SP_ARG_EXPORT_IGNORE_FILTERS,
SP_ARG_EXTENSIONDIR,
- SP_ARG_FIT_PAGE_TO_DRAWING,
SP_ARG_QUERY_X,
SP_ARG_QUERY_Y,
SP_ARG_QUERY_WIDTH,
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_export_ps_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_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_export_emf = NULL;
#endif //WIN32
static gboolean sp_export_text_to_path = FALSE;
+static gboolean sp_export_ignore_filters = 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;
static gboolean sp_query_width = FALSE;
sp_export_emf = NULL;
#endif //WIN32
sp_export_text_to_path = FALSE;
+ sp_export_ignore_filters = FALSE;
sp_export_font = FALSE;
- sp_export_bbox_page = FALSE;
sp_query_x = FALSE;
sp_query_y = FALSE;
sp_query_width = FALSE;
{"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)"),
+ N_("Convert text object to paths on export (PS, EPS, PDF)"),
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)"),
+ {"export-ignore-filters", 0,
+ POPT_ARG_NONE, &sp_export_ignore_filters, SP_ARG_EXPORT_IGNORE_FILTERS,
+ N_("Render filtered objects without filters, instead of rasterizing (PS, EPS, PDF)"),
NULL},
{"query-x", 'X',
}
#endif
+/**
+ * Add INKSCAPE_EXTENSIONDIR to PYTHONPATH so that extensions in users home
+ * can find inkex.py et al. (Bug #197475)
+ */
+static int set_extensions_env()
+{
+ char *oldenv = getenv("PYTHONPATH");
+ Glib::ustring tmp = INKSCAPE_EXTENSIONDIR;
+ if (oldenv != NULL) {
+ tmp += G_SEARCHPATH_SEPARATOR;
+ tmp += oldenv;
+ }
+ g_setenv("PYTHONPATH", tmp.c_str(), TRUE);
+
+ return 0;
+}
/**
rt.setPathInfo();
#endif
+ // Prevents errors like "Unable to wrap GdkPixbuf..." (in nr-filter-image.cpp for example)
+ Gtk::Main::init_gtkmm_internals();
+
+ // Bug #197475
+ set_extensions_env();
+
/**
* Call bindtextdomain() for various machines's paths
*/
sp_repr_save_file(repr->document(), sp_export_svg, SP_SVG_NS_URI);
}
if (sp_export_ps) {
- do_export_ps(doc, sp_export_ps, "image/x-postscript");
+ do_export_ps_pdf(doc, sp_export_ps, "image/x-postscript");
}
if (sp_export_eps) {
- do_export_ps(doc, sp_export_eps, "image/x-e-postscript");
+ do_export_ps_pdf(doc, sp_export_eps, "image/x-e-postscript");
}
if (sp_export_pdf) {
- do_export_pdf(doc, sp_export_pdf, "application/pdf");
- }
+ do_export_ps_pdf(doc, sp_export_pdf, "application/pdf");
+ }
#ifdef WIN32
- if (sp_export_emf) {
- do_export_emf(doc, sp_export_emf, "image/x-emf");
- }
+ 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);
+ do_query_dimension (doc, true, sp_query_width? Geom::X : Geom::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);
+ do_query_dimension (doc, false, sp_query_x? Geom::X : Geom::Y, sp_query_id);
}
+
+ delete doc;
}
- delete doc; /// \todo: Check the proper way to delete a SPDocument.
fl = g_slist_remove(fl, fl->data);
}
}
gsize sizeLeft = buffer_size - offset;
gchar *useme = command_line + offset;
- fprintf(stdout, "Inkscape %s interactive shell mode. Type 'quit' to quit.\n", INKSCAPE_VERSION);
+ fprintf(stdout, "Inkscape %s interactive shell mode. Type 'quit' to quit.\n", Inkscape::version_string);
fflush(stdout);
char* linedata = 0;
do {
resetCommandlineGlobals();
g_strfreev(argv);
} else {
- g_warning("problem parsing commandline: %s", useme);
+ g_warning("Cannot parse commandline: %s", useme);
}
}
}
} else {
sp_process_file_list(fl); // Normal command line invokation
}
- inkscape_unref();
return 0;
}
static void
-do_query_dimension (SPDocument *doc, bool extent, NR::Dim2 const axis, const gchar *id)
+do_query_dimension (SPDocument *doc, bool extent, Geom::Dim2 const axis, const gchar *id)
{
SPObject *o = NULL;
@@ -1052,11 +1068,11 @@ do_query_dimension (SPDocument *doc, bool extent, NR::Dim2 const axis, const gch
SPItem *item = ((SPItem *) o);
// "true" SVG bbox for scripting
- boost::optional<NR::Rect> area = item->getBounds(sp_item_i2doc_affine(item));
+ Geom::OptRect area = item->getBounds(sp_item_i2doc_affine(item));
if (area) {
Inkscape::SVGOStringStream os;
if (extent) {
- os << area->extent(axis);
+ os << area->dimensions()[axis];
} else {
os << area->min()[axis];
}
{
SPItem *item = ((SPItem *) o);
if (o->id && SP_IS_ITEM(item)) {
- boost::optional<NR::Rect> area = item->getBounds(sp_item_i2doc_affine(item));
+ Geom::OptRect 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);
+ os << "," << area->min()[Geom::X];
+ os << "," << area->min()[Geom::Y];
+ os << "," << area->dimensions()[Geom::X];
+ os << "," << area->dimensions()[Geom::Y];
g_print ("%s\n", os.str().c_str());
}
}
GSList *items = NULL;
- NRRect area;
+ Geom::Rect area;
if (sp_export_id || sp_export_area_drawing) {
SPObject *o = NULL;
// write object bbox to area
sp_document_ensure_up_to_date (doc);
- boost::optional<NR::Rect> areaMaybe;
- sp_item_invoke_bbox((SPItem *) o_area, areaMaybe, sp_item_i2r_affine((SPItem *) o_area), TRUE);
+ Geom::OptRect areaMaybe;
+ sp_item_invoke_bbox((SPItem *) o_area, areaMaybe, sp_item_i2d_affine((SPItem *) o_area), TRUE);
if (areaMaybe) {
- area = NRRect(areaMaybe);
+ area = *areaMaybe;
} else {
g_warning("Unable to determine a valid bounding box. Nothing exported.");
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) {
+ gdouble x0,y0,x1,y1;
+ if (!sscanf(sp_export_area, "%lg:%lg:%lg:%lg", &x0, &y0, &x1, &y1) == 4) {
g_warning("Cannot parse export area '%s'; use 'x0:y0:x1:y1'. Nothing exported.", sp_export_area);
return;
}
- if ((area.x0 >= area.x1) || (area.y0 >= area.y1)) {
- g_warning("Export area '%s' has negative width or height. Nothing exported.", sp_export_area);
- 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 */
sp_document_ensure_up_to_date (doc);
- area.x0 = SP_ROOT(doc->root)->x.computed;
- area.y0 = SP_ROOT(doc->root)->y.computed;
- area.x1 = area.x0 + sp_document_width (doc);
- area.y1 = area.y0 + sp_document_height (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));
}
// set filename and dpi from options, if not yet set from the hints
}
if (sp_export_area_snap) {
- area.x0 = std::floor (area.x0);
- area.y0 = std::floor (area.y0);
- area.x1 = std::ceil (area.x1);
- area.y1 = std::ceil (area.y1);
+ round_rectangle_outwards(area);
}
// default dpi
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);
+ dpi = (gdouble) width * PX_PER_IN / area.width();
}
if (sp_export_height) {
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);
+ dpi = (gdouble) height * PX_PER_IN / area.height();
}
if (!sp_export_width) {
- width = (unsigned long int) ((area.x1 - area.x0) * dpi / PX_PER_IN + 0.5);
+ width = (unsigned long int) (area.width() * dpi / PX_PER_IN + 0.5);
}
if (!sp_export_height) {
- height = (unsigned long int) ((area.y1 - area.y0) * dpi / PX_PER_IN + 0.5);
+ height = (unsigned long int) (area.height() * 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 %lu x %lu 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[Geom::X][0], area[Geom::Y][0], area[Geom::X][1], area[Geom::Y][1], width, height, dpi);
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.x0, area.y0, area.x1, area.y1, width, height, dpi, dpi, bgcolor, NULL, NULL, true, sp_export_id_only ? items : NULL);
+ sp_export_png_file(doc, filename, 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);
}
/**
- * Perform an export of either PS or EPS.
+ * Perform a PDF/PS/EPS export
*
* \param doc Document to export.
* \param uri URI to export to.
* \param mime MIME type to export as.
*/
-static void do_export_ps(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 to MIME type %s.", mime);
- return;
- }
-
- bool old_text_to_path = false;
- bool old_font_embedded = false;
- bool old_bbox_page = false;
-
- try {
- old_text_to_path = (*i)->get_param_bool("textToPath");
- (*i)->set_param_bool("textToPath", sp_export_text_to_path);
- }
- catch (...) {
- 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);
- }
- catch (...) {
- g_warning ("Could not set export-bbox-page option for this export.");
- }
-
- (*i)->save(doc, uri);
-
- 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 (...) {
-
- }
-}
-
-/**
- * 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)
+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);
@@ -1414,16 +1360,33 @@ static void do_export_pdf(SPDocument* 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.");
+ sp_export_area_drawing = false;
+ }
+
if (sp_export_area_drawing) {
- (*i)->set_param_bool ("exportDrawing", TRUE);
+ (*i)->set_param_bool ("areaDrawing", TRUE);
} else {
- (*i)->set_param_bool ("exportDrawing", FALSE);
+ (*i)->set_param_bool ("areaDrawing", FALSE);
}
if (sp_export_area_canvas) {
- (*i)->set_param_bool ("exportCanvas", TRUE);
+ 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.");
+ }
+ (*i)->set_param_bool ("areaCanvas", TRUE);
} else {
- (*i)->set_param_bool ("exportCanvas", FALSE);
+ (*i)->set_param_bool ("areaCanvas", 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_eps) {
+ try {
+ (*i)->set_param_bool("areaDrawing", TRUE);
+ } catch (...) {}
+ }
}
if (sp_export_text_to_path) {
@@ -1432,6 +1395,12 @@ static void do_export_pdf(SPDocument* doc, gchar const* uri, char const* mime)
(*i)->set_param_bool("textToPath", FALSE);
}
+ if (sp_export_ignore_filters) {
+ (*i)->set_param_bool("blurToBitmap", FALSE);
+ } else {
+ (*i)->set_param_bool("blurToBitmap", TRUE);
+ }
+
(*i)->save(doc, uri);
}
GSList *fl = NULL;
gint a;
- while ((a = poptGetNextOpt(ctx)) >= 0) {
+ while ((a = poptGetNextOpt(ctx)) != -1) {
switch (a) {
case SP_ARG_FILE: {
gchar const *fn = poptGetOptArg(ctx);
break;
}
case SP_ARG_VERSION: {
- printf("Inkscape %s (%s)\n", INKSCAPE_VERSION, __DATE__);
+ printf("Inkscape %s (%s)\n", Inkscape::version_string, __DATE__);
exit(0);
break;
}
}
break;
}
+ case POPT_ERROR_BADOPT: {
+ g_warning ("Invalid option %s", poptBadOption(ctx, 0));
+ exit(1);
+ break;
+ }
default: {
break;
}