summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt1
-rw-r--r--CMakeScripts/ConfigCompileFlags.cmake21
-rw-r--r--src/object-set.cpp9
-rw-r--r--src/object-set.h45
-rw-r--r--src/selection-chemistry.cpp20
-rw-r--r--src/splivarot.cpp2
-rw-r--r--src/ui/dialog/export.cpp9
-rw-r--r--src/ui/dialog/filter-effects-dialog.cpp2
-rw-r--r--testfiles/src/object-set-test.cpp15
9 files changed, 73 insertions, 51 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 94dbf60df..79fea4f71 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -104,6 +104,7 @@ else()
message("No gmock/gtest found! Perhaps you wish to run 'bash download-gtest.sh' to download it.")
endif()
+include(CMakeScripts/ConfigCompileFlags.cmake)
include(CMakeScripts/ConfigPaths.cmake) # Installation Paths
include(CMakeScripts/DefineDependsandFlags.cmake) # Includes, Compiler Flags, and Link Libraries
include(CMakeScripts/HelperMacros.cmake) # Misc Utility Macros
diff --git a/CMakeScripts/ConfigCompileFlags.cmake b/CMakeScripts/ConfigCompileFlags.cmake
index 602886219..85a8a151c 100644
--- a/CMakeScripts/ConfigCompileFlags.cmake
+++ b/CMakeScripts/ConfigCompileFlags.cmake
@@ -1,28 +1,21 @@
-set(CMAKE_C_FLAGS "${CMAKE_CXX_FLAGS}")
-add_definitions(-Wall -Wformat-security -W -Wpointer-arith -Wcast-align -Wsign-compare -Woverloaded-virtual -Wswitch)
-# TODO temporary flag
-add_definitions(-O0)
-add_definitions(-std=c++11)
-
# Define the flags for profiling if desired:
if(WITH_PROFILING)
set(COMPILE_PROFILING_FLAGS "-pg")
set(LINK_PROFILING_FLAGS "-pg")
endif()
-add_definitions(-DVERSION=\\\"${INKSCAPE_VERSION}\\\")
+# add_definitions(-DVERSION=\\\"${INKSCAPE_VERSION}\\\")
add_definitions(${DEFINE_FLAGS} -DHAVE_CONFIG_H -D_INTL_REDIRECT_INLINE)
if(WIN32)
add_definitions(-DXP_WIN)
endif(WIN32)
-# For Inkboard:
-add_definitions(-DHAVE_SSL "-DRELAYTOOL_SSL=\"static const int libssl_is_present=1; static int __attribute__((unused)) libssl_symbol_is_present(char *s){ return 1; }\"")
-
-set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMPILE_PROFILING_FLAGS} ")
-set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COMPILE_PROFILING_FLAGS} ")
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2 ${COMPILE_PROFILING_FLAGS} ")
+set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2 ${COMPILE_PROFILING_FLAGS} ")
+# TODO
+add_definitions("-std=c++11")
-set(CMAKE_MAKE_PROGRAM "${CMAKE_MAKE_PROGRAM} ")
+#set(CMAKE_MAKE_PROGRAM "${CMAKE_MAKE_PROGRAM} ")
-# message(STATUS "${CMAKE_CXX_FLAGS}")
+message(STATUS "${CMAKE_CXX_FLAGS}")
diff --git a/src/object-set.cpp b/src/object-set.cpp
index 518ce15a3..1240e5198 100644
--- a/src/object-set.cpp
+++ b/src/object-set.cpp
@@ -15,6 +15,8 @@
#include "box3d.h"
#include "persp3d.h"
#include "preferences.h"
+#include <boost/range/adaptor/filtered.hpp>
+#include <boost/range/adaptor/transformed.hpp>
namespace Inkscape {
@@ -233,13 +235,6 @@ std::vector<SPItem*> ObjectSet::items() {
return result;
}
-std::vector<XML::Node*> ObjectSet::xmlNodes() {
- std::vector<SPItem*> list = items();
- std::vector<XML::Node*> result;
- std::transform(list.begin(), list.end(), std::back_inserter(result), [](SPItem* item) { return item->getRepr(); });
- return result;
-}
-
Inkscape::XML::Node *ObjectSet::singleRepr() {
SPObject *obj = single();
return obj ? obj->getRepr() : nullptr;
diff --git a/src/object-set.h b/src/object-set.h
index 29083863b..ea6534350 100644
--- a/src/object-set.h
+++ b/src/object-set.h
@@ -19,6 +19,8 @@
#include <boost/multi_index/sequenced_index.hpp>
#include <boost/multi_index/hashed_index.hpp>
#include <boost/multi_index/random_access_index.hpp>
+#include <boost/range/adaptor/filtered.hpp>
+#include <boost/range/adaptor/transformed.hpp>
#include <boost/range/sub_range.hpp>
#include <boost/range/any_range.hpp>
#include <boost/type_traits.hpp>
@@ -39,6 +41,26 @@ class Node;
struct hashed{};
struct random_access{};
+struct is_item {
+ bool operator()(SPObject* obj) {
+ return SP_IS_ITEM(obj);
+ }
+};
+
+struct object_to_item {
+ typedef SPItem* result_type;
+ SPItem* operator()(SPObject* obj) const {
+ return SP_ITEM(obj);
+ }
+};
+
+struct object_to_node {
+ typedef XML::Node* result_type;
+ XML::Node* operator()(SPObject* obj) const {
+ return obj->getRepr();
+ }
+};
+
typedef boost::multi_index_container<
SPObject*,
boost::multi_index::indexed_by<
@@ -56,21 +78,11 @@ typedef boost::any_range<
SPObject* const&,
std::ptrdiff_t> SPObjectRange;
-typedef boost::any_range<
- SPItem*,
- boost::random_access_traversal_tag,
- SPItem* const&,
- std::ptrdiff_t> SPItemRange;
-
-typedef boost::any_range<
- XML::Node*,
- boost::random_access_traversal_tag,
- XML::Node* const&,
- std::ptrdiff_t> XMLNodeRange;
-
class ObjectSet {
public:
enum CompareSize {HORIZONTAL, VERTICAL, AREA};
+ typedef decltype(multi_index_container().get<random_access>() | boost::adaptors::filtered(is_item()) | boost::adaptors::transformed(object_to_item())) SPItemRange;
+ typedef decltype(multi_index_container().get<random_access>() | boost::adaptors::filtered(is_item()) | boost::adaptors::transformed(object_to_node())) XMLNodeRange;
ObjectSet() {};
virtual ~ObjectSet();
@@ -169,7 +181,11 @@ public:
std::vector<SPItem*> items();
/** Returns a list of the xml nodes of all selected objects. */
- std::vector<XML::Node*> xmlNodes();
+ XMLNodeRange xmlNodes() {
+ return XMLNodeRange(container.get<random_access>()
+ | boost::adaptors::filtered(is_item())
+ | boost::adaptors::transformed(object_to_node()));
+ }
/**
* Returns a single selected object's xml node.
@@ -255,6 +271,9 @@ protected:
};
+typedef ObjectSet::SPItemRange SPItemRange;
+typedef ObjectSet::XMLNodeRange XMLNodeRange;
+
} // namespace Inkscape
#endif //INKSCAPE_PROTOTYPE_OBJECTSET_H
diff --git a/src/selection-chemistry.cpp b/src/selection-chemistry.cpp
index ded776fea..82f89c03a 100644
--- a/src/selection-chemistry.cpp
+++ b/src/selection-chemistry.cpp
@@ -454,7 +454,7 @@ void sp_selection_duplicate(SPDesktop *desktop, bool suppressDone, bool duplicat
desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Select <b>object(s)</b> to duplicate."));
return;
}
- std::vector<Inkscape::XML::Node*> reprs(selection->xmlNodes());
+ std::vector<Inkscape::XML::Node*> reprs(selection->xmlNodes().begin(), selection->xmlNodes().end());
if(duplicateLayer){
reprs.clear();
@@ -763,7 +763,7 @@ void sp_selection_group(Inkscape::Selection *selection, SPDesktop *desktop)
return;
}
- std::vector<Inkscape::XML::Node*> p (selection->xmlNodes());
+ std::vector<Inkscape::XML::Node*> p (selection->xmlNodes().begin(), selection->xmlNodes().end());
selection->clear();
@@ -1048,7 +1048,7 @@ void sp_selection_raise_to_top(Inkscape::Selection *selection, SPDesktop *deskto
return;
}
- std::vector<Inkscape::XML::Node*> rl(selection->xmlNodes());
+ std::vector<Inkscape::XML::Node*> rl(selection->xmlNodes().begin(), selection->xmlNodes().end());
sort(rl.begin(),rl.end(),sp_repr_compare_position_bool);
for (std::vector<Inkscape::XML::Node*>::const_iterator l=rl.begin(); l!=rl.end();++l) {
@@ -1132,7 +1132,7 @@ void sp_selection_lower_to_bottom(Inkscape::Selection *selection, SPDesktop *des
return;
}
- std::vector<Inkscape::XML::Node*> rl(selection->xmlNodes());
+ std::vector<Inkscape::XML::Node*> rl(selection->xmlNodes().begin(), selection->xmlNodes().end());
sort(rl.begin(),rl.end(),sp_repr_compare_position_bool);
for (std::vector<Inkscape::XML::Node*>::const_reverse_iterator l=rl.rbegin();l!=rl.rend();++l) {
@@ -1722,8 +1722,8 @@ void sp_selection_remove_transform(SPDesktop *desktop)
Inkscape::Selection *selection = desktop->getSelection();
- std::vector<Inkscape::XML::Node*> items = selection->xmlNodes();
- for (std::vector<Inkscape::XML::Node*>::const_iterator l=items.begin();l!=items.end() ;++l) {
+ auto items = selection->xmlNodes();
+ for (auto l=items.begin();l!=items.end() ;++l) {
(*l)->setAttribute("transform", NULL, false);
}
@@ -2603,7 +2603,7 @@ void sp_selection_clone(SPDesktop *desktop)
return;
}
- std::vector<Inkscape::XML::Node*> reprs (selection->xmlNodes());
+ std::vector<Inkscape::XML::Node*> reprs(selection->xmlNodes().begin(), selection->xmlNodes().end());
selection->clear();
@@ -3472,12 +3472,12 @@ void sp_selection_get_export_hints(Inkscape::Selection *selection, Glib::ustring
return;
}
- std::vector<Inkscape::XML::Node*> const reprlst = selection->xmlNodes();
+ auto reprlst = selection->xmlNodes();
bool filename_search = TRUE;
bool xdpi_search = TRUE;
bool ydpi_search = TRUE;
- for (std::vector<Inkscape::XML::Node*>::const_iterator i=reprlst.begin();filename_search&&xdpi_search&&ydpi_search&&i!=reprlst.end();++i){
+ for (auto i=reprlst.begin();filename_search&&xdpi_search&&ydpi_search&&i!=reprlst.end();++i){
gchar const *dpi_string;
Inkscape::XML::Node *repr = *i;
@@ -3765,7 +3765,7 @@ void sp_selection_set_clipgroup(SPDesktop *desktop)
return;
}
- std::vector<Inkscape::XML::Node*> p(selection->xmlNodes());
+ std::vector<Inkscape::XML::Node*> p(selection->xmlNodes().begin(), selection->xmlNodes().end());
sort(p.begin(),p.end(),sp_repr_compare_position_bool);
diff --git a/src/splivarot.cpp b/src/splivarot.cpp
index d4ef3f9c2..09d74a010 100644
--- a/src/splivarot.cpp
+++ b/src/splivarot.cpp
@@ -689,7 +689,7 @@ sp_selected_path_boolop(Inkscape::Selection *selection, SPDesktop *desktop, bool
}
} else {
// find out the bottom object
- std::vector<Inkscape::XML::Node*> sorted(selection->xmlNodes());
+ std::vector<Inkscape::XML::Node*> sorted(selection->xmlNodes().begin(), selection->xmlNodes().end());
sort(sorted.begin(),sorted.end(),sp_repr_compare_position_bool);
diff --git a/src/ui/dialog/export.cpp b/src/ui/dialog/export.cpp
index 6d2842511..dbee80af9 100644
--- a/src/ui/dialog/export.cpp
+++ b/src/ui/dialog/export.cpp
@@ -820,8 +820,8 @@ void Export::onAreaToggled ()
one that's nice */
if (filename.empty()) {
const gchar * id = "object";
- const std::vector<XML::Node*> reprlst = SP_ACTIVE_DESKTOP->getSelection()->xmlNodes();
- for(std::vector<XML::Node*>::const_iterator i=reprlst.begin(); reprlst.end() != i; ++i) {
+ auto reprlst = SP_ACTIVE_DESKTOP->getSelection()->xmlNodes();
+ for(auto i=reprlst.begin(); reprlst.end() != i; ++i) {
Inkscape::XML::Node * repr = *i;
if (repr->attribute("id")) {
id = repr->attribute("id");
@@ -1231,15 +1231,14 @@ void Export::onExport ()
break;
}
case SELECTION_SELECTION: {
- std::vector<XML::Node*> reprlst;
SPDocument * doc = SP_ACTIVE_DOCUMENT;
bool modified = false;
bool saved = DocumentUndo::getUndoSensitive(doc);
DocumentUndo::setUndoSensitive(doc, false);
- reprlst = desktop->getSelection()->xmlNodes();
+ auto reprlst = desktop->getSelection()->xmlNodes();
- for(std::vector<Inkscape::XML::Node*>::const_iterator i=reprlst.begin(); reprlst.end() != i; ++i) {
+ for(auto i=reprlst.begin(); reprlst.end() != i; ++i) {
Inkscape::XML::Node * repr = *i;
const gchar * temp_string;
Glib::ustring dir = Glib::path_get_dirname(filename.c_str());
diff --git a/src/ui/dialog/filter-effects-dialog.cpp b/src/ui/dialog/filter-effects-dialog.cpp
index dfc19f3cc..ccba5a278 100644
--- a/src/ui/dialog/filter-effects-dialog.cpp
+++ b/src/ui/dialog/filter-effects-dialog.cpp
@@ -691,7 +691,7 @@ private:
void select_svg_element(){
Inkscape::Selection* sel = _desktop->getSelection();
if (sel->isEmpty()) return;
- Inkscape::XML::Node* node = sel->xmlNodes()[0];
+ Inkscape::XML::Node* node = sel->xmlNodes().front();
if (!node || !node->matchAttributeName("id")) return;
std::ostringstream xlikhref;
diff --git a/testfiles/src/object-set-test.cpp b/testfiles/src/object-set-test.cpp
index e294a5a51..ea3471bf0 100644
--- a/testfiles/src/object-set-test.cpp
+++ b/testfiles/src/object-set-test.cpp
@@ -13,6 +13,7 @@
#include <src/sp-factory.h>
#include <src/sp-rect.h>
#include "object-set.h"
+#include <xml/node.h>
using namespace Inkscape;
@@ -123,6 +124,8 @@ TEST_F(ObjectSetTest, Advanced) {
}
TEST_F(ObjectSetTest, Items) {
+ // cannot test smallestItem and largestItem functions due to too many dependencies
+ // uncomment if the problem is fixed
SPRect* rect10x100 = (SPRect *) SPFactory::createObject("svg:rect");
// rect10x100->invoke_build(_doc, _doc->rroot, 1);
SPRect* rect20x40 = (SPRect *) SPFactory::createObject("svg:rect");
@@ -161,6 +164,18 @@ TEST_F(ObjectSetTest, Ranges) {
EXPECT_EQ(E, *it++);
EXPECT_EQ(C, *it++);
EXPECT_EQ(set->objects().end(), it);
+ SPObject* rect1 = SPFactory::createObject("svg:rect");
+ SPObject* rect2 = SPFactory::createObject("svg:rect");
+ SPObject* rect3 = SPFactory::createObject("svg:rect");
+ set->add(rect1);
+ set->add(rect2);
+ set->add(rect3);
+ EXPECT_EQ(7, set->size());
+ auto xmlNode = set->xmlNodes().begin();
+ EXPECT_EQ(rect1->getRepr(), *xmlNode++);
+ EXPECT_EQ(rect2->getRepr(), *xmlNode++);
+ EXPECT_EQ(rect3->getRepr(), *xmlNode++);
+ EXPECT_EQ(set->xmlNodes().end(), xmlNode);
}
TEST_F(ObjectSetTest, Autoremoving) {