summaryrefslogtreecommitdiffstats
path: root/src/gui/PatchCanvas.cpp
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2010-02-02 20:37:50 +0000
committerDavid Robillard <d@drobilla.net>2010-02-02 20:37:50 +0000
commita645d2b8be4d7d31f6eef1649156b166a01e0c31 (patch)
tree3d83c08e9a5460cc6582482bcfc673dff956a1e7 /src/gui/PatchCanvas.cpp
parent653679e967f11a0e008521885fcaf6994d2961fa (diff)
downloadingen-a645d2b8be4d7d31f6eef1649156b166a01e0c31.tar.gz
ingen-a645d2b8be4d7d31f6eef1649156b166a01e0c31.tar.bz2
ingen-a645d2b8be4d7d31f6eef1649156b166a01e0c31.zip
Use Glib string interning (quarks) to make Path/URI operator== very fast.
This avoids a ton of string comparison overhead in Ingen when setting various properties (e.g. "ingen:value" was compared several times every time a port value was changed, now this is just a single pointer comparison and the full round trip of a value change does no string comparison at all, but is still property based and RDFey). git-svn-id: http://svn.drobilla.net/lad/trunk/ingen@2408 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/gui/PatchCanvas.cpp')
-rw-r--r--src/gui/PatchCanvas.cpp43
1 files changed, 25 insertions, 18 deletions
diff --git a/src/gui/PatchCanvas.cpp b/src/gui/PatchCanvas.cpp
index 6e7374d0..45e6ec66 100644
--- a/src/gui/PatchCanvas.cpp
+++ b/src/gui/PatchCanvas.cpp
@@ -22,6 +22,7 @@
#include "flowcanvas/Canvas.hpp"
#include "flowcanvas/Ellipse.hpp"
#include "interface/EngineInterface.hpp"
+#include "shared/LV2URIMap.hpp"
#include "shared/Builder.hpp"
#include "shared/ClashAvoider.hpp"
#include "serialisation/Serialiser.hpp"
@@ -651,12 +652,14 @@ PatchCanvas::paste()
ClientStore clipboard;
clipboard.set_plugins(App::instance().store()->plugins());
+ const LV2URIMap& uris = App::instance().uris();
+
// mkdir -p
string to_create = _patch->path().chop_scheme().substr(1);
string created = "/";
Resource::Properties props;
- props.insert(make_pair("rdf:type", Raul::Atom(Raul::Atom::URI, "ingen:Patch")));
- props.insert(make_pair("ingen:polyphony", Raul::Atom(int32_t(_patch->poly()))));
+ props.insert(make_pair(uris.rdf_type, uris.ingen_Patch));
+ props.insert(make_pair(uris.ingen_polyphony, Raul::Atom(int32_t(_patch->poly()))));
clipboard.put(Path(), props);
size_t first_slash;
while (to_create != "/" && to_create != ""
@@ -685,18 +688,18 @@ PatchCanvas::paste()
for (Store::iterator i = clipboard.begin(); i != clipboard.end(); ++i) {
if (_patch->path().is_root() && i->first.is_root())
continue;
- GraphObject::Properties::iterator x = i->second->properties().find("ingenui:canvas-x");
+ GraphObject::Properties::iterator x = i->second->properties().find(uris.ingenui_canvas_x);
if (x != i->second->properties().end())
x->second = x->second.get_float() + (20.0f * _paste_count);
- GraphObject::Properties::iterator y = i->second->properties().find("ingenui:canvas-y");
+ GraphObject::Properties::iterator y = i->second->properties().find(uris.ingenui_canvas_y);
if (y != i->second->properties().end())
y->second = y->second.get_float() + (20.0f * _paste_count);
if (i->first.parent().is_root()) {
- GraphObject::Properties::iterator s = i->second->properties().find("ingen:selected");
+ GraphObject::Properties::iterator s = i->second->properties().find(uris.ingen_selected);
if (s != i->second->properties().end())
s->second = true;
else
- i->second->properties().insert(make_pair("ingen:selected", true));
+ i->second->properties().insert(make_pair(uris.ingen_selected, true));
}
builder.build(i->second);
}
@@ -737,18 +740,20 @@ PatchCanvas::generate_port_name(
void
PatchCanvas::menu_add_port(const string& sym_base, const string& name_base,
- const string& type, bool is_output)
+ const Raul::URI& type, bool is_output)
{
string sym, name;
generate_port_name(sym_base, sym, name_base, name);
const Path& path = _patch->path().base() + sym;
+ const LV2URIMap& uris = App::instance().uris();
+
Resource::Properties props = get_initial_data();
- props.insert(make_pair("rdf:type", Atom(Atom::URI, type)));
- props.insert(make_pair("rdf:type",
+ props.insert(make_pair(uris.rdf_type, type));
+ props.insert(make_pair(uris.rdf_type,
Atom(Atom::URI, is_output ? "lv2:OutputPort" : "lv2:InputPort")));
- props.insert(make_pair("lv2:index", Atom(int32_t(_patch->num_ports()))));
- props.insert(make_pair("lv2:name", Atom(name.c_str())));
+ props.insert(make_pair(uris.lv2_index, Atom(int32_t(_patch->num_ports()))));
+ props.insert(make_pair(uris.lv2_name, Atom(name.c_str())));
App::instance().engine()->put(path, props);
}
@@ -760,19 +765,21 @@ PatchCanvas::load_plugin(WeakPtr<PluginModel> weak_plugin)
if (!plugin)
return;
- string name = plugin->default_node_symbol();
- unsigned offset = App::instance().store()->child_name_offset(_patch->path(), name);
+ Raul::Symbol symbol = plugin->default_node_symbol();
+ unsigned offset = App::instance().store()->child_name_offset(_patch->path(), symbol);
if (offset != 0) {
std::stringstream ss;
- ss << name << "_" << offset;
- name = ss.str();
+ ss << symbol << "_" << offset;
+ symbol = ss.str();
}
- const Path path = _patch->path().base() + name;
+ const LV2URIMap& uris = App::instance().uris();
+
+ const Path path = _patch->path().child(symbol);
// FIXME: polyphony?
GraphObject::Properties props = get_initial_data();
- props.insert(make_pair("rdf:type", Raul::Atom(Raul::Atom::URI, "ingen:Node")));
- props.insert(make_pair("rdf:instanceOf", Raul::Atom(Raul::Atom::URI, plugin->uri().str())));
+ props.insert(make_pair(uris.rdf_type, uris.ingen_Node));
+ props.insert(make_pair(uris.rdf_instanceOf, plugin->uri()));
App::instance().engine()->put(path, props);
}