From a8673632fd967db5986ba4963969497d3fd922a4 Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Date: Sat, 2 Dec 2017 12:42:02 +0100 Subject: Clear meassure when dragging knots --- src/ui/tools/measure-tool.cpp | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'src') diff --git a/src/ui/tools/measure-tool.cpp b/src/ui/tools/measure-tool.cpp index bd2964d94..7df4ccbc3 100644 --- a/src/ui/tools/measure-tool.cpp +++ b/src/ui/tools/measure-tool.cpp @@ -602,6 +602,12 @@ bool MeasureTool::root_handler(GdkEvent* event) showInfoBox(motion_w, false); } } else { + SPDesktop *desktop = SP_ACTIVE_DESKTOP; + Inkscape::Util::Unit const * unit = desktop->getNamedView()->getDisplayUnit(); + for (size_t idx = 0; idx < measure_item.size(); ++idx) { + sp_canvas_item_destroy(measure_item[idx]); + } + measure_item.clear(); ret = TRUE; Inkscape::Preferences *prefs = Inkscape::Preferences::get(); tolerance = prefs->getIntLimited("/options/dragtolerance/value", 0, 0, 100); -- cgit v1.2.3 From 914e21feed1e2f9981455b5a527b269f325188f6 Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Date: Sat, 2 Dec 2017 16:12:07 +0100 Subject: Optionaly measure only selected elements --- src/ui/tools/measure-tool.cpp | 14 +++++++++++++- src/widgets/measure-toolbar.cpp | 30 ++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/ui/tools/measure-tool.cpp b/src/ui/tools/measure-tool.cpp index 7df4ccbc3..8037a02a9 100644 --- a/src/ui/tools/measure-tool.cpp +++ b/src/ui/tools/measure-tool.cpp @@ -1159,6 +1159,7 @@ void MeasureTool::showInfoBox(Geom::Point cursor, bool into_groups) double scale = prefs->getDouble("/tools/measure/scale", 100.0) / 100.0; int precision = prefs->getInt("/tools/measure/precision", 2); Glib::ustring unit_name = prefs->getString("/tools/measure/unit"); + bool only_selected = prefs->getBool("/tools/measure/only_selected", false); if (!unit_name.compare("")) { unit_name = "px"; } @@ -1191,6 +1192,14 @@ void MeasureTool::showInfoBox(Geom::Point cursor, bool into_groups) Geom::Point rel_position = Geom::Point(origin, origin); Geom::Point pos = desktop->w2d(cursor); double gap = Inkscape::Util::Quantity::convert(7 + fontsize, "px", unit->abbr); + if (only_selected) { + if (desktop->getSelection()->includes(over)) { + showItemInfoText(pos + (rel_position * zoom),_("Selected"),fontsize); + } else { + showItemInfoText(pos + (rel_position * zoom),_("Not selected"),fontsize); + } + rel_position = Geom::Point(rel_position[Geom::X], rel_position[Geom::Y] + gap); + } if (SP_IS_SHAPE(over)) { precision_str << _("Length") << ": %." << precision << "f %s"; measure_str = g_strdup_printf(precision_str.str().c_str(), item_length, unit_name.c_str()); @@ -1202,7 +1211,6 @@ void MeasureTool::showInfoBox(Geom::Point cursor, bool into_groups) showItemInfoText(pos + (rel_position * zoom),measure_str,fontsize); rel_position = Geom::Point(rel_position[Geom::X], rel_position[Geom::Y] + gap); } - precision_str << "Y: %." << precision << "f %s"; measure_str = g_strdup_printf(precision_str.str().c_str(), item_y, unit_name.c_str()); precision_str.str(""); @@ -1274,8 +1282,12 @@ void MeasureTool::showCanvasItems(bool to_guides, bool to_item, bool to_phantom, current_layer = desktop->currentLayer(); } std::vector intersection_times; + bool only_selected = prefs->getBool("/tools/measure/only_selected", false); for (std::vector::const_iterator i=items.begin(); i!=items.end(); ++i) { SPItem *item = *i; + if (!desktop->getSelection()->includes(*i) && only_selected) { + continue; + } if(all_layers || (layer_model && layer_model->layerForObject(item) == current_layer)){ if (SP_IS_SHAPE(item)) { calculate_intersections(desktop, item, lineseg, SP_SHAPE(item)->getCurve(), intersection_times); diff --git a/src/widgets/measure-toolbar.cpp b/src/widgets/measure-toolbar.cpp index fc6cfdb11..f031414a4 100644 --- a/src/widgets/measure-toolbar.cpp +++ b/src/widgets/measure-toolbar.cpp @@ -164,6 +164,24 @@ sp_toggle_ignore_1st_and_last( GtkToggleAction* act, gpointer data ) } } +static void +sp_toggle_only_selected( GtkToggleAction* act, gpointer data ) +{ + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + gboolean active = gtk_toggle_action_get_active(act); + prefs->setBool("/tools/measure/only_selected", active); + SPDesktop *desktop = static_cast(data); + if ( active ) { + desktop->messageStack()->flash(Inkscape::INFORMATION_MESSAGE, _("Measures only selected.")); + } else { + desktop->messageStack()->flash(Inkscape::INFORMATION_MESSAGE, _("Measure all.")); + } + MeasureTool *mt = get_measure_tool(); + if (mt) { + mt->showCanvasItems(); + } +} + static void sp_toggle_show_hidden( GtkToggleAction* act, gpointer data ) { @@ -335,6 +353,18 @@ void sp_measure_toolbox_prep(SPDesktop * desktop, GtkActionGroup* mainActions, G gtk_action_group_add_action( mainActions, GTK_ACTION(eact) ); } + /* measure only selected */ + { + InkToggleAction* act = ink_toggle_action_new( "MeasureOnlySelected", + _("Measure only selected"), + _("Measure only selected"), + INKSCAPE_ICON("snap-bounding-box-center"), + secondarySize ); + gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), prefs->getBool("/tools/measure/only_selected", false) ); + g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(sp_toggle_only_selected), desktop) ; + gtk_action_group_add_action( mainActions, GTK_ACTION(act) ); + } + /* ignore_1st_and_last */ { InkToggleAction* act = ink_toggle_action_new( "MeasureIgnore1stAndLast", -- cgit v1.2.3 From 1e043f9d8731e891394cc3077a6ef419bb6c2406 Mon Sep 17 00:00:00 2001 From: Moini Date: Sun, 3 Dec 2017 21:25:08 +0100 Subject: Add canvas flipping/rotation reset to the menu, improve strings --- src/verbs.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/verbs.cpp b/src/verbs.cpp index d0975af16..f01a3c79c 100644 --- a/src/verbs.cpp +++ b/src/verbs.cpp @@ -3028,11 +3028,11 @@ Verb *Verb::_base_verbs[] = { new ZoomVerb(SP_VERB_ROTATE_CW, "RotateClockwise", N_("Rotate Clockwise"), N_("Rotate canvas clockwise"), NULL), new ZoomVerb(SP_VERB_ROTATE_CCW, "RotateCounterClockwise", N_("Rotate Counter-Clockwise"), N_("Rotate canvas counter-clockwise"), NULL), - new ZoomVerb(SP_VERB_ROTATE_ZERO, "RotateZero", N_("Rotate Zero"), N_("Reset canvas rotation to zero"), NULL), + new ZoomVerb(SP_VERB_ROTATE_ZERO, "RotateZero", N_("Reset Rotation"), N_("Reset canvas rotation to zero"), NULL), - new ZoomVerb(SP_VERB_FLIP_HORIZONTAL, "FlipHorizontal", N_("Flip Horizontal"), N_("Flip canvas horizontally"), INKSCAPE_ICON("object-flip-horizontal")), - new ZoomVerb(SP_VERB_FLIP_VERTICAL, "FlipVertical", N_("Flip Vertical"), N_("Flip canvas vertically"), INKSCAPE_ICON("object-flip-vertical")), - new ZoomVerb(SP_VERB_FLIP_NONE, "FlipNone", N_("Flip None"), N_("Undo any flip"), NULL), + new ZoomVerb(SP_VERB_FLIP_HORIZONTAL, "FlipHorizontal", N_("Flip Horizontally"), N_("Flip canvas horizontally"), INKSCAPE_ICON("object-flip-horizontal")), + new ZoomVerb(SP_VERB_FLIP_VERTICAL, "FlipVertical", N_("Flip Vertically"), N_("Flip canvas vertically"), INKSCAPE_ICON("object-flip-vertical")), + new ZoomVerb(SP_VERB_FLIP_NONE, "FlipNone", N_("Reset Flip"), N_("Undo any flip"), NULL), // WHY ARE THE FOLLOWING ZoomVerbs??? -- cgit v1.2.3 From eb07ba085151be60d518ce6310a33e413d699a32 Mon Sep 17 00:00:00 2001 From: luzpaz Date: Fri, 1 Dec 2017 13:07:34 -0500 Subject: Misc. typos Please confirm typos in the following `doc/nr-filter-interface.txt` `share/symbols/BalloonSymbols.svg` . --- src/attribute-rel-util.cpp | 2 +- src/display/drawing-pattern.cpp | 4 ++-- src/gc-finalized.h | 2 +- src/io/resource.cpp | 2 +- src/libnrtype/Layout-TNG-Output.cpp | 2 +- src/style-internal.h | 4 ++-- src/ui/clipboard.cpp | 2 +- src/ui/dialog/xml-tree.cpp | 2 +- src/ui/tools/pencil-tool.cpp | 8 ++++---- 9 files changed, 14 insertions(+), 14 deletions(-) (limited to 'src') diff --git a/src/attribute-rel-util.cpp b/src/attribute-rel-util.cpp index 5e770d4ae..42b6bebf2 100644 --- a/src/attribute-rel-util.cpp +++ b/src/attribute-rel-util.cpp @@ -309,7 +309,7 @@ bool sp_attribute_check_attribute(Glib::ustring element, Glib::ustring id, Glib: // First check if it is a presentation attribute. Presentation attributes can be applied to // any element. At the moment, we are only going to check if it is a possibly useful - // attribute. Note, we don't explicitely check against the list of elements where presentation + // attribute. Note, we don't explicitly check against the list of elements where presentation // attributes are allowed (See SVG1.1 spec, Appendix M.2). if( !SPAttributeRelCSS::findIfValid( attribute, element ) ) { diff --git a/src/display/drawing-pattern.cpp b/src/display/drawing-pattern.cpp index d0bf5de58..b590a59c5 100644 --- a/src/display/drawing-pattern.cpp +++ b/src/display/drawing-pattern.cpp @@ -165,8 +165,8 @@ unsigned DrawingPattern::_updateItem(Geom::IntRect const &area, UpdateContext co const double oversampling = 2.0; double scale = det_ctm*det_ps2user*det_child_transform * oversampling; //FIXME: When scale is too big (zooming in a hatch), cairo doesn't render the pattern - //More precisely it fails when seting pattern matrix in DrawingPattern::renderPattern - //Fully correct solution should make use of visible area bbox and change hach tile rect + //More precisely it fails when setting pattern matrix in DrawingPattern::renderPattern + //Fully correct solution should make use of visible area bbox and change hatch tile rect //accordingly if (scale > 25) { scale = 25; diff --git a/src/gc-finalized.h b/src/gc-finalized.h index d39338643..887603806 100644 --- a/src/gc-finalized.h +++ b/src/gc-finalized.h @@ -36,7 +36,7 @@ namespace GC { * 1. The garbage collector uses strictly topologically-ordered * finalization; if objects with finalizers reference each other * directly or indirectly, the collector will refuse to finalize (and - * therefor free) them. You'll see a warning on the console if this + * therefore free) them. You'll see a warning on the console if this * happens. * * The best way to limit this effect is to only make "leaf" objects diff --git a/src/io/resource.cpp b/src/io/resource.cpp index 13da37d7a..0b242cc31 100644 --- a/src/io/resource.cpp +++ b/src/io/resource.cpp @@ -209,7 +209,7 @@ Glib::ustring get_filename(Glib::ustring path, Glib::ustring filename) } /* - * Get's all the files in a given type, for all domain types. + * Gets all the files in a given type, for all domain types. * * domain - Optional domain (overload), will check return domains if not. * type - The type of files, e.g. TEMPLATES diff --git a/src/libnrtype/Layout-TNG-Output.cpp b/src/libnrtype/Layout-TNG-Output.cpp index 9a73b9eca..984c2dd1a 100644 --- a/src/libnrtype/Layout-TNG-Output.cpp +++ b/src/libnrtype/Layout-TNG-Output.cpp @@ -625,7 +625,7 @@ Glib::ustring Layout::dumpAsText() const + Glib::ustring::compose(" direction %1, block-progression %2\n", direction_to_text(_spans[span_index].direction), direction_to_text(_spans[span_index].block_progression)) + " ** characters:\n"; Glib::ustring::const_iterator iter_char = _spans[span_index].input_stream_first_character; - // very inefficent code. what the hell, it's only debug stuff. + // very inefficient code. what the hell, it's only debug stuff. for (unsigned char_index = 0 ; char_index < _characters.size() ; char_index++) { union {const PangoLogAttr* pattr; const unsigned* uattr;} u; u.pattr = &_characters[char_index].char_attributes; diff --git a/src/style-internal.h b/src/style-internal.h index 5c22c093d..33e71d5b4 100644 --- a/src/style-internal.h +++ b/src/style-internal.h @@ -116,7 +116,7 @@ enum SPStyleSrc { * */ -/// Virtual base class for all SPStyle interal classes +/// Virtual base class for all SPStyle internal classes class SPIBase { @@ -733,7 +733,7 @@ public: gchar *value_default; }; -/// Color type interal to SPStyle, FIXME Add string value to store SVG named color. +/// Color type internal to SPStyle, FIXME Add string value to store SVG named color. class SPIColor : public SPIBase { diff --git a/src/ui/clipboard.cpp b/src/ui/clipboard.cpp index 118d7ae1f..a0f1fa09c 100644 --- a/src/ui/clipboard.cpp +++ b/src/ui/clipboard.cpp @@ -672,7 +672,7 @@ std::vector ClipboardManagerImpl::getElementsOfType(SPDesktop *de root->removeChild(tempdoc->getDefs()->getRepr()); std::vector reprs; if (strcmp(type, "*") == 0){ - //TODO:Fill vector with all posible elements + //TODO:Fill vector with all possible elements std::vector types; types.push_back((Glib::ustring)"svg:path"); types.push_back((Glib::ustring)"svg:circle"); diff --git a/src/ui/dialog/xml-tree.cpp b/src/ui/dialog/xml-tree.cpp index 5747c7726..6429e655d 100644 --- a/src/ui/dialog/xml-tree.cpp +++ b/src/ui/dialog/xml-tree.cpp @@ -447,7 +447,7 @@ void XmlTree::set_tree_select(Inkscape::XML::Node *repr) gtk_tree_selection_select_iter(selection, &node); } else { - g_message("XmlTree::set_tree_select : Couldnt find repr node"); + g_message("XmlTree::set_tree_select : Couldn't find repr node"); } } else { GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree)); diff --git a/src/ui/tools/pencil-tool.cpp b/src/ui/tools/pencil-tool.cpp index 6f64e8e26..fb50898ed 100644 --- a/src/ui/tools/pencil-tool.cpp +++ b/src/ui/tools/pencil-tool.cpp @@ -115,7 +115,7 @@ void PencilTool::_endpointSnap(Geom::Point &p, guint const state) { } } else { if (!(state & GDK_SHIFT_MASK)) { //SHIFT disables all snapping, except the angular snapping above - //After all, the user explicitely asked for angular snapping by + //After all, the user explicitly asked for angular snapping by //pressing CTRL boost::optional origin = this->npoints > 0 ? this->p[0] : boost::optional(); spdc_endpoint_snap_free(this, p, origin, state); @@ -322,7 +322,7 @@ bool PencilTool::_handleMotionNotify(GdkEventMotion const &mevent) { // Only in freehand mode we have to add the first point also to this->ps (apparently) // - We cannot add this point in spdc_set_startpoint, because we only need it for freehand // - We cannot do this in the button press handler because at that point we don't know yet - // wheter we're going into freehand mode or not + // whether we're going into freehand mode or not this->ps.push_back(this->p[0]); this->wps.push_back(this->pressure); } @@ -769,9 +769,9 @@ PencilTool::addPowerStrokePencil(SPCurve * c) bool start = true; auto pressure = this->wps.begin(); for (auto point = this->ps.begin(); point != this->ps.end(); ++point,++pressure) { - //Maybe the 12 POW can be moved to a preferences 12 give a good results of sensibility on my tablet + //Maybe the 12 POW can be moved to a preferences 12 gives a good results of sensibility on my tablet //But maybe is a tweakable value. less number = less sensibility - //8 give an aceptable max witht to powerstoke + //8 give an acceptable max width to powerstoke double pressure_base = pow(*pressure, pressure_sensibility); double pressure_shirnked = (pressure_base * (max - min)) + min; double pressure_factor = pressure_base/pressure_shirnked; -- cgit v1.2.3 From e95f21d655898563072d224e58aba9abcced3115 Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Sun, 26 Nov 2017 17:51:10 +0100 Subject: Pull custom code from prefix.h/cpp These files are actually part of BinReloc Inkscape specific code is in path-prefix.h (and now path-prefix.cpp) --- src/CMakeLists.txt | 1 + src/path-prefix.cpp | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++++ src/path-prefix.h | 13 +++++---- src/prefix.cpp | 40 ---------------------------- src/prefix.h | 7 ----- 5 files changed, 83 insertions(+), 54 deletions(-) create mode 100644 src/path-prefix.cpp (limited to 'src') diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 4c56b211d..c6ef78a4f 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -233,6 +233,7 @@ set(inkscape_SRC object-set.cpp object-snapper.cpp path-chemistry.cpp + path-prefix.cpp persp3d-reference.cpp persp3d.cpp perspective-line.cpp diff --git a/src/path-prefix.cpp b/src/path-prefix.cpp new file mode 100644 index 000000000..a8a09b9db --- /dev/null +++ b/src/path-prefix.cpp @@ -0,0 +1,76 @@ +/* + * path-prefix.cpp - Inkscape specific prefix handling + * + * Authors: + * Eduard Braun + * + * Copyright (C) 2017 Authors + * + * This file is part of Inkscape. + * + * Inkscape is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * See the file COPYING for details. + * + */ + + +#ifdef __WIN32__ + +#ifdef HAVE_CONFIG_H +#include +#endif + + +#include +#include "path-prefix.h" + + +/** + * Provide a similar mechanism for Win32. Enable a macro, + * WIN32_DATADIR, that can look up subpaths for inkscape resources + */ + +/** + * Get the Windows-equivalent of INKSCAPE_DATADIR and append a relative path + * + * - by default INKSCAPE_DATADIR will be relative to the called executable + * (typically inkscape/share but also handles the case where the executable is in a /bin subfolder) + * - to override set the INKSCAPE_DATADIR environment variable + */ +char *win32_append_datadir(const char *relative_path) +{ + static gchar *datadir; + if (!datadir) { + gchar const *inkscape_datadir = g_getenv("INKSCAPE_DATADIR"); + if (inkscape_datadir) { + datadir = g_strdup(inkscape_datadir); + } else { + gchar *module_path = g_win32_get_package_installation_directory_of_module(NULL); + datadir = g_build_filename(module_path, "share", NULL); + g_free(module_path); + } + } + + if (!relative_path) { + relative_path = ""; + } + + return g_build_filename(datadir, relative_path, NULL); +} +#endif /* __WIN32__ */ + + +/* + Local Variables: + mode:c++ + c-file-style:"stroustrup" + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) + indent-tabs-mode:nil + fill-column:99 + End: +*/ +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 : diff --git a/src/path-prefix.h b/src/path-prefix.h index d6514d832..429b0ba72 100644 --- a/src/path-prefix.h +++ b/src/path-prefix.h @@ -18,9 +18,12 @@ #endif #include "prefix.h" -//#ifdef __cplusplus -//extern "C" { -//#endif /* __cplusplus */ +#ifdef __WIN32__ +char *win32_append_datadir(const char *relative_path); +#define WIN32_DATADIR(suffix) (win32_append_datadir(suffix)) +#undef INKSCAPE_DATADIR +#define INKSCAPE_DATADIR WIN32_DATADIR(NULL) +#endif #ifdef ENABLE_BINRELOC /* The way that we're building now is with a shared library between Inkscape @@ -127,8 +130,4 @@ # endif #endif -//#ifdef __cplusplus -//} -//#endif /* __cplusplus */ - #endif /* _PATH_PREFIX_H_ */ diff --git a/src/prefix.cpp b/src/prefix.cpp index c8bf7abec..14fdd04df 100644 --- a/src/prefix.cpp +++ b/src/prefix.cpp @@ -416,44 +416,4 @@ br_extract_prefix (const char *path) } #endif /* __cplusplus */ - - -#ifdef __WIN32__ -/** - * Provide a similar mechanism for Win32. Enable a macro, - * WIN32_DATADIR, that can look up subpaths for inkscape resources - */ - -/** - * Get the Windows-equivalent of INKSCAPE_DATADIR and append a relative path - * - * - by default INKSCAPE_DATADIR will be relative to the called executable - * (typically inkscape/share but also handles the case where the executable is in a /bin subfolder) - * - to override set the INKSCAPE_DATADIR environment variable - */ -char *win32_append_datadir(const char *relative_path) -{ - static gchar *datadir; - if (!datadir) { - gchar const *inkscape_datadir = g_getenv("INKSCAPE_DATADIR"); - if (inkscape_datadir) { - datadir = g_strdup(inkscape_datadir); - } else { - gchar *module_path = g_win32_get_package_installation_directory_of_module(NULL); - datadir = g_build_filename(module_path, "share", NULL); - g_free(module_path); - } - } - - if (!relative_path) { - relative_path = ""; - } - - return g_build_filename(datadir, relative_path, NULL); -} -#endif /* __WIN32__ */ - - - - #endif /* _PREFIX_C */ diff --git a/src/prefix.h b/src/prefix.h index d28e896d0..bdf3b6df4 100644 --- a/src/prefix.h +++ b/src/prefix.h @@ -118,11 +118,4 @@ char *br_extract_prefix(const char *path); } #endif /* __cplusplus */ -#ifdef __WIN32__ -char *win32_append_datadir(const char *relative_path); -#undef INKSCAPE_DATADIR -#define INKSCAPE_DATADIR win32_append_datadir(NULL) -#define WIN32_DATADIR(suffix) (win32_append_datadir(suffix)) -#endif - #endif /* _PREFIX_H_ */ -- cgit v1.2.3 From 99c4a240d3c084e1abcfd802fadb5ae7235b9018 Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Sun, 26 Nov 2017 19:18:26 +0100 Subject: Generalize support for INKSCAPE_DATADIR environment variable Now works unless configured with ENABLE_BINRELOC or ENABLE_OSX_APP_LOCATIONS --- src/path-prefix.cpp | 36 +++++++++---------- src/path-prefix.h | 101 ++++++++++++++++++++++++++-------------------------- 2 files changed, 68 insertions(+), 69 deletions(-) (limited to 'src') diff --git a/src/path-prefix.cpp b/src/path-prefix.cpp index a8a09b9db..bffba500f 100644 --- a/src/path-prefix.cpp +++ b/src/path-prefix.cpp @@ -18,8 +18,6 @@ */ -#ifdef __WIN32__ - #ifdef HAVE_CONFIG_H #include #endif @@ -30,28 +28,29 @@ /** - * Provide a similar mechanism for Win32. Enable a macro, - * WIN32_DATADIR, that can look up subpaths for inkscape resources - */ - -/** - * Get the Windows-equivalent of INKSCAPE_DATADIR and append a relative path + * Determine the location of the Inkscape data directory (typically the share/ folder + * from where Inkscape should be loading resources) and append a relative path * - * - by default INKSCAPE_DATADIR will be relative to the called executable + * - by default use the compile time value of INKSCAPE_DATADIR + * - on Windows inkscape_datadir will be relative to the called executable by default * (typically inkscape/share but also handles the case where the executable is in a /bin subfolder) - * - to override set the INKSCAPE_DATADIR environment variable + * - if the environment variable INKSCAPE_DATADIR is set it will override all of the above */ -char *win32_append_datadir(const char *relative_path) +char *append_inkscape_datadir(const char *relative_path) { - static gchar *datadir; - if (!datadir) { - gchar const *inkscape_datadir = g_getenv("INKSCAPE_DATADIR"); - if (inkscape_datadir) { - datadir = g_strdup(inkscape_datadir); + static gchar *inkscape_datadir; + if (!inkscape_datadir) { + gchar const *datadir_env = g_getenv("INKSCAPE_DATADIR"); + if (datadir_env) { + inkscape_datadir = g_strdup(datadir_env); } else { +#ifdef _WIN32 gchar *module_path = g_win32_get_package_installation_directory_of_module(NULL); - datadir = g_build_filename(module_path, "share", NULL); + inkscape_datadir = g_build_filename(module_path, "share", NULL); g_free(module_path); +#else + inkscape_datadir = INKSCAPE_DATADIR; +#endif } } @@ -59,9 +58,8 @@ char *win32_append_datadir(const char *relative_path) relative_path = ""; } - return g_build_filename(datadir, relative_path, NULL); + return g_build_filename(inkscape_datadir, relative_path, NULL); } -#endif /* __WIN32__ */ /* diff --git a/src/path-prefix.h b/src/path-prefix.h index 429b0ba72..b69ad3753 100644 --- a/src/path-prefix.h +++ b/src/path-prefix.h @@ -18,11 +18,12 @@ #endif #include "prefix.h" -#ifdef __WIN32__ -char *win32_append_datadir(const char *relative_path); -#define WIN32_DATADIR(suffix) (win32_append_datadir(suffix)) + +char *append_inkscape_datadir(const char *relative_path); + +#ifdef _WIN32 #undef INKSCAPE_DATADIR -#define INKSCAPE_DATADIR WIN32_DATADIR(NULL) +#define INKSCAPE_DATADIR append_inkscape_datadir(NULL) #endif #ifdef ENABLE_BINRELOC @@ -55,30 +56,30 @@ char *win32_append_datadir(const char *relative_path); # define CREATE_PALETTESDIR BR_DATADIR( INKSCAPE_LIBPREFIX "/share/create/swatches" ) # define CREATE_PATTERNSDIR BR_DATADIR( INKSCAPE_LIBPREFIX "/share/create/patterns/vector" ) #else -# ifdef WIN32 -# define INKSCAPE_APPICONDIR WIN32_DATADIR("pixmaps") -# define INKSCAPE_ATTRRELDIR WIN32_DATADIR("attributes") -# define INKSCAPE_BINDDIR WIN32_DATADIR("bind") -# define INKSCAPE_EXAMPLESDIR WIN32_DATADIR("examples") -# define INKSCAPE_EXTENSIONDIR WIN32_DATADIR("extensions") -# define INKSCAPE_FILTERDIR WIN32_DATADIR("filters") -# define INKSCAPE_FONTSDIR WIN32_DATADIR("fonts") -# define INKSCAPE_GRADIENTSDIR WIN32_DATADIR("gradients") -# define INKSCAPE_KEYSDIR WIN32_DATADIR("keys") -# define INKSCAPE_PIXMAPDIR WIN32_DATADIR("icons") -# define INKSCAPE_MARKERSDIR WIN32_DATADIR("markers") -# define INKSCAPE_PALETTESDIR WIN32_DATADIR("palettes") -# define INKSCAPE_PATTERNSDIR WIN32_DATADIR("patterns") -# define INKSCAPE_SCREENSDIR WIN32_DATADIR("screens") -# define INKSCAPE_SYMBOLSDIR WIN32_DATADIR("symbols") -# define INKSCAPE_THEMEDIR INKSCAPE_PIXMAPDIR -# define INKSCAPE_TUTORIALSDIR WIN32_DATADIR("tutorials") -# define INKSCAPE_TEMPLATESDIR WIN32_DATADIR("templates") -# define INKSCAPE_UIDIR WIN32_DATADIR("ui") +# ifdef _WIN32 +# define INKSCAPE_APPICONDIR append_inkscape_datadir("pixmaps") +# define INKSCAPE_ATTRRELDIR append_inkscape_datadir("attributes") +# define INKSCAPE_BINDDIR append_inkscape_datadir("bind") +# define INKSCAPE_EXAMPLESDIR append_inkscape_datadir("examples") +# define INKSCAPE_EXTENSIONDIR append_inkscape_datadir("extensions") +# define INKSCAPE_FILTERDIR append_inkscape_datadir("filters") +# define INKSCAPE_FONTSDIR append_inkscape_datadir("fonts") +# define INKSCAPE_GRADIENTSDIR append_inkscape_datadir("gradients") +# define INKSCAPE_KEYSDIR append_inkscape_datadir("keys") +# define INKSCAPE_PIXMAPDIR append_inkscape_datadir("icons") +# define INKSCAPE_MARKERSDIR append_inkscape_datadir("markers") +# define INKSCAPE_PALETTESDIR append_inkscape_datadir("palettes") +# define INKSCAPE_PATTERNSDIR append_inkscape_datadir("patterns") +# define INKSCAPE_SCREENSDIR append_inkscape_datadir("screens") +# define INKSCAPE_SYMBOLSDIR append_inkscape_datadir("symbols") +# define INKSCAPE_THEMEDIR append_inkscape_datadir("icons") +# define INKSCAPE_TUTORIALSDIR append_inkscape_datadir("tutorials") +# define INKSCAPE_TEMPLATESDIR append_inkscape_datadir("templates") +# define INKSCAPE_UIDIR append_inkscape_datadir("ui") //CREATE V0.1 WIN32 support -# define CREATE_GRADIENTSDIR WIN32_DATADIR("create\\gradients\\gimp") -# define CREATE_PALETTESDIR WIN32_DATADIR("create\\swatches") -# define CREATE_PATTERNSDIR WIN32_DATADIR("create\\patterns\\vector") +# define CREATE_GRADIENTSDIR append_inkscape_datadir("create\\gradients\\gimp") +# define CREATE_PALETTESDIR append_inkscape_datadir("create\\swatches") +# define CREATE_PATTERNSDIR append_inkscape_datadir("create\\patterns\\vector") # elif defined ENABLE_OSX_APP_LOCATIONS # define INKSCAPE_APPICONDIR "Contents/Resources/share/pixmaps" # define INKSCAPE_ATTRRELDIR "Contents/Resources/share/inkscape/attributes" @@ -104,30 +105,30 @@ char *win32_append_datadir(const char *relative_path); # define CREATE_PALETTESDIR "/Library/Application Support/create/swatches" # define CREATE_PATTERNSDIR "/Library/Application Support/create/patterns/vector" # else -# define INKSCAPE_APPICONDIR INKSCAPE_DATADIR "/pixmaps" -# define INKSCAPE_ATTRRELDIR INKSCAPE_DATADIR "/inkscape/attributes" -# define INKSCAPE_BINDDIR INKSCAPE_DATADIR "/inkscape/bind" -# define INKSCAPE_EXAMPLESDIR INKSCAPE_DATADIR "/inkscape/examples" -# define INKSCAPE_EXTENSIONDIR INKSCAPE_DATADIR "/inkscape/extensions" -# define INKSCAPE_FILTERDIR INKSCAPE_DATADIR "/inkscape/filters" -# define INKSCAPE_FONTSDIR INKSCAPE_DATADIR "/inkscape/fonts" -# define INKSCAPE_GRADIENTSDIR INKSCAPE_DATADIR "/inkscape/gradients" -# define INKSCAPE_KEYSDIR INKSCAPE_DATADIR "/inkscape/keys" -# define INKSCAPE_PIXMAPDIR INKSCAPE_DATADIR "/inkscape/icons" -# define INKSCAPE_MARKERSDIR INKSCAPE_DATADIR "/inkscape/markers" -# define INKSCAPE_PALETTESDIR INKSCAPE_DATADIR "/inkscape/palettes" -# define INKSCAPE_PATTERNSDIR INKSCAPE_DATADIR "/inkscape/patterns" -# define INKSCAPE_SCREENSDIR INKSCAPE_DATADIR "/inkscape/screens" -# define INKSCAPE_SYMBOLSDIR INKSCAPE_DATADIR "/inkscape/symbols" -# define INKSCAPE_THEMEDIR INKSCAPE_DATADIR "/icons" -# define INKSCAPE_TUTORIALSDIR INKSCAPE_DATADIR "/inkscape/tutorials" -# define INKSCAPE_TEMPLATESDIR INKSCAPE_DATADIR "/inkscape/templates" -# define INKSCAPE_UIDIR INKSCAPE_DATADIR "/inkscape/ui" +# define INKSCAPE_APPICONDIR append_inkscape_datadir("pixmaps") +# define INKSCAPE_ATTRRELDIR append_inkscape_datadir("inkscape/attributes") +# define INKSCAPE_BINDDIR append_inkscape_datadir("inkscape/bind") +# define INKSCAPE_EXAMPLESDIR append_inkscape_datadir("inkscape/examples") +# define INKSCAPE_EXTENSIONDIR append_inkscape_datadir("inkscape/extensions") +# define INKSCAPE_FILTERDIR append_inkscape_datadir("inkscape/filters") +# define INKSCAPE_FONTSDIR append_inkscape_datadir("inkscape/fonts") +# define INKSCAPE_GRADIENTSDIR append_inkscape_datadir("inkscape/gradients") +# define INKSCAPE_KEYSDIR append_inkscape_datadir("inkscape/keys") +# define INKSCAPE_PIXMAPDIR append_inkscape_datadir("inkscape/icons") +# define INKSCAPE_MARKERSDIR append_inkscape_datadir("inkscape/markers") +# define INKSCAPE_PALETTESDIR append_inkscape_datadir("inkscape/palettes") +# define INKSCAPE_PATTERNSDIR append_inkscape_datadir("inkscape/patterns") +# define INKSCAPE_SCREENSDIR append_inkscape_datadir("inkscape/screens") +# define INKSCAPE_SYMBOLSDIR append_inkscape_datadir("inkscape/symbols") +# define INKSCAPE_THEMEDIR append_inkscape_datadir("icons") +# define INKSCAPE_TUTORIALSDIR append_inkscape_datadir("inkscape/tutorials") +# define INKSCAPE_TEMPLATESDIR append_inkscape_datadir("inkscape/templates") +# define INKSCAPE_UIDIR append_inkscape_datadir("inkscape/ui") //CREATE V0.1 support -# define CREATE_GRADIENTSDIR INKSCAPE_DATADIR "/create/gradients/gimp" -# define CREATE_PALETTESDIR INKSCAPE_DATADIR "/create/swatches" -# define CREATE_PATTERNSDIR INKSCAPE_DATADIR "/create/patterns/vector" -# endif +# define CREATE_GRADIENTSDIR append_inkscape_datadir("create/gradients/gimp") +# define CREATE_PALETTESDIR append_inkscape_datadir("create/swatches") +# define CREATE_PATTERNSDIR append_inkscape_datadir("create/patterns/vector") +# endif #endif #endif /* _PATH_PREFIX_H_ */ -- cgit v1.2.3 From aa4eb4467739b0b05812d680e05e7b83edf89561 Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Sun, 26 Nov 2017 23:31:39 +0100 Subject: Fix a compiler warning --- src/path-prefix.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/path-prefix.cpp b/src/path-prefix.cpp index bffba500f..87b756eb4 100644 --- a/src/path-prefix.cpp +++ b/src/path-prefix.cpp @@ -38,7 +38,7 @@ */ char *append_inkscape_datadir(const char *relative_path) { - static gchar *inkscape_datadir; + static gchar const *inkscape_datadir; if (!inkscape_datadir) { gchar const *datadir_env = g_getenv("INKSCAPE_DATADIR"); if (datadir_env) { -- cgit v1.2.3 From 4da6c3db24a9370ddefa6b9d26ceb19166d6df92 Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Wed, 22 Nov 2017 23:18:24 +0100 Subject: Revert "Fix PDF+TeX output for text inside groups with clip/mask" This reverts commit e4dea66a338824037b6c35b262aa8db4004b6581. --- src/extension/internal/cairo-render-context.cpp | 35 +++---------------------- src/extension/internal/cairo-render-context.h | 1 - 2 files changed, 3 insertions(+), 33 deletions(-) (limited to 'src') diff --git a/src/extension/internal/cairo-render-context.cpp b/src/extension/internal/cairo-render-context.cpp index 4869472da..791073e90 100644 --- a/src/extension/internal/cairo-render-context.cpp +++ b/src/extension/internal/cairo-render-context.cpp @@ -128,8 +128,7 @@ CairoRenderContext::CairoRenderContext(CairoRenderer *parent) : _renderer(parent), _render_mode(RENDER_MODE_NORMAL), _clip_mode(CLIP_MODE_MASK), - _omittext_state(EMPTY), - _omittext_missing_pages(0) + _omittext_state(EMPTY) { } @@ -885,13 +884,6 @@ CairoRenderContext::finish(bool finish_surface) if (_vector_based_target && finish_surface) cairo_show_page(_cr); - // PDF+TeX Output, see CairoRenderContext::_prepareRenderGraphic() - while (_omittext_missing_pages > 0) { - _omittext_missing_pages--; - g_warning("PDF+TeX output: issuing blank PDF page at end (workaround for previous error)"); - cairo_show_page(_cr); - } - cairo_destroy(_cr); _cr = NULL; @@ -1445,29 +1437,8 @@ CairoRenderContext::_prepareRenderGraphic() // Only PDFLaTeX supports importing a single page of a graphics file, // so only PDF backend gets interleaved text/graphics if (_is_omittext && _target == CAIRO_SURFACE_TYPE_PDF) { - if (_omittext_state == NEW_PAGE_ON_GRAPHIC) { - if (cairo_get_group_target(_cr) != cairo_get_target(_cr)) { - // we are in the middle of a group, i. e., between cairo_push_group() and cairo_pop_group(). - // cairo_show_page() has no effect here! - // To ensure that the the generated TeX source doesn't try to include non-existing pages, - // we will later output an extra blank page. - // This is a workaround for bug #1417470. - g_warning("PDF+TeX output: Found text inside a clipped/masked group. This is not supported, the Z-order will be incorrect. Blank pages will be added to the PDF output to work around bug #1417470."); - _omittext_missing_pages++; - } else { - // no group is active, create new page - cairo_show_page(_cr); - // Output missing pages (workaround for the 'if' case above). - // With this solution, the Z-order is more wrong than necessary. - // It would be better to print the blank pages first, and then the actual current page. - // However, this isn't easily possible with cairo. - while (_omittext_missing_pages > 0) { - _omittext_missing_pages--; - g_warning("PDF+TeX output: issuing blank PDF page (workaround for previous error)"); - cairo_show_page(_cr); - } - } - } + if (_omittext_state == NEW_PAGE_ON_GRAPHIC) + cairo_show_page(_cr); _omittext_state = GRAPHIC_ON_TOP; } } diff --git a/src/extension/internal/cairo-render-context.h b/src/extension/internal/cairo-render-context.h index a0ca2665b..f75d05ea7 100644 --- a/src/extension/internal/cairo-render-context.h +++ b/src/extension/internal/cairo-render-context.h @@ -207,7 +207,6 @@ protected: CairoClipMode _clip_mode; CairoOmitTextPageState _omittext_state; - int _omittext_missing_pages; cairo_pattern_t *_createPatternForPaintServer(SPPaintServer const *const paintserver, Geom::OptRect const &pbox, float alpha); -- cgit v1.2.3 From dae7facca7b1bf5ce99aaf9dc71b2da8b46f56c8 Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Mon, 4 Dec 2017 20:03:13 +0100 Subject: Proper fix for multipage PDF+Latex export The previous implementation [1] allowed to sandwich text between graphical objects by outputting multiple (partial) PDF pages which are then stacked in the final document to reveal the full image. However this code failed for clipped/masked/transparent objects as those are treated specially by the renderer resulting in missing pages in the output causing [2]. The attempt to workaround this issue which was committed in e4dea66a338824037b6c35b262aa8db4004b6581 (now reverted) fixed document creation in LaTeX by inserting blank pages but did not actually fix the issue with clipped/masked/transparent objects typically resulting in a single page with the full image and all text put on top. This commit resolves the underlying issue, making the former workaround unnecessary and allowing for proper overlaying of text and arbitrarily clipped/masked/transparent objects Fixed bugs: - https://bugs.launchpad.net/inkscape/+bug/771957 [1] - https://bugs.launchpad.net/inkscape/+bug/1417470 [2] --- src/extension/internal/cairo-render-context.cpp | 35 +++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/extension/internal/cairo-render-context.cpp b/src/extension/internal/cairo-render-context.cpp index 791073e90..87c726832 100644 --- a/src/extension/internal/cairo-render-context.cpp +++ b/src/extension/internal/cairo-render-context.cpp @@ -1436,9 +1436,40 @@ CairoRenderContext::_prepareRenderGraphic() { // Only PDFLaTeX supports importing a single page of a graphics file, // so only PDF backend gets interleaved text/graphics - if (_is_omittext && _target == CAIRO_SURFACE_TYPE_PDF) { - if (_omittext_state == NEW_PAGE_ON_GRAPHIC) + if (_is_omittext && _target == CAIRO_SURFACE_TYPE_PDF && _render_mode != RENDER_MODE_CLIP) { + if (_omittext_state == NEW_PAGE_ON_GRAPHIC) { + // better set this immediately (not sure if masks applied during "popLayer" could call + // this function, too, triggering the same code again in error + _omittext_state = GRAPHIC_ON_TOP; + + // As we can not emit the page in the middle of a layer (aka group) - it will not be fully painted yet! - + // the following basically mirrors the calls in CairoRenderer::renderItem (but in reversed order) + // - first traverse all saved states in reversed order (i.e. from deepest nesting to the top) + // and apply clipping / masking to layers on the way (this is done in popLayer) + // - then emit the page using cairo_show_page() + // - finally restore the previous state with proper transforms and appropriate layers again + // + // TODO: While this appears to be an ugly hack it seems to work + // Somebody with a more intimate understanding of cairo and the renderer implementation might + // be able to implement this in a cleaner way, though. + int stack_size = _state_stack.size(); + for (int i = stack_size-1; i > 0; i--) { + if (_state_stack[i]->need_layer) + popLayer(); + cairo_restore(_cr); + _state = _state_stack[i-1]; + } + cairo_show_page(_cr); + + for (int i = 1; i < stack_size; i++) { + cairo_save(_cr); + _state = _state_stack[i]; + if (_state->need_layer) + pushLayer(); + setTransform(_state->transform); + } + } _omittext_state = GRAPHIC_ON_TOP; } } -- cgit v1.2.3 From c40b0c3259279aba0bc79d4dcc09c70abb71aa34 Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Mon, 4 Dec 2017 20:03:57 +0100 Subject: CairoRenderer: print warning if rendering failed It happen often that the rendering was interrupted early but the final "cairo_surface_status" claims success which results in incomplete output but no user-visible warning. --- src/extension/internal/cairo-render-context.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/extension/internal/cairo-render-context.cpp b/src/extension/internal/cairo-render-context.cpp index 87c726832..b631f8c04 100644 --- a/src/extension/internal/cairo-render-context.cpp +++ b/src/extension/internal/cairo-render-context.cpp @@ -884,12 +884,16 @@ CairoRenderContext::finish(bool finish_surface) if (_vector_based_target && finish_surface) cairo_show_page(_cr); + cairo_status_t status = cairo_status(_cr); + if (status != CAIRO_STATUS_SUCCESS) + g_critical("error while rendering output: %s", cairo_status_to_string(status)); + cairo_destroy(_cr); _cr = NULL; if (finish_surface) cairo_surface_finish(_surface); - cairo_status_t status = cairo_surface_status(_surface); + status = cairo_surface_status(_surface); cairo_surface_destroy(_surface); _surface = NULL; -- cgit v1.2.3