summaryrefslogtreecommitdiffstats
path: root/src/Canvas.cpp
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2013-12-18 19:59:01 +0000
committerDavid Robillard <d@drobilla.net>2013-12-18 19:59:01 +0000
commit1dffad8f3b0d7919357bc3a10ccfd3f66b3c38ba (patch)
tree6a4b38efa2052e08365c0dc3ed8a5e9ba7354d2f /src/Canvas.cpp
parent63c2c34dd2b4ae5be99284b94c0b99d39600bd6f (diff)
downloadganv-1dffad8f3b0d7919357bc3a10ccfd3f66b3c38ba.tar.gz
ganv-1dffad8f3b0d7919357bc3a10ccfd3f66b3c38ba.tar.bz2
ganv-1dffad8f3b0d7919357bc3a10ccfd3f66b3c38ba.zip
Shorter code.
git-svn-id: http://svn.drobilla.net/lad/trunk/ganv@5182 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/Canvas.cpp')
-rw-r--r--src/Canvas.cpp42
1 files changed, 16 insertions, 26 deletions
diff --git a/src/Canvas.cpp b/src/Canvas.cpp
index a0d956f..58f1e9e 100644
--- a/src/Canvas.cpp
+++ b/src/Canvas.cpp
@@ -708,18 +708,20 @@ GanvCanvasImpl::layout_dot(const std::string& filename)
#ifdef GANV_FDGL
-static void
-get_pos_area(const GanvNode* node, Vector* pos, Vector* area)
+inline Region
+get_region(const GanvNode* node)
{
double x1, y1, x2, y2;
ganv_item_get_bounds(GANV_ITEM(node), &x1, &y1, &x2, &y2);
- area->x = x2 - x1;
- area->y = y2 - y1;
- pos->x = x1 + (area->x / 2.0);
- pos->y = y1 + (area->y / 2.0);
+ Region reg;
+ reg.area.x = x2 - x1;
+ reg.area.y = y2 - y1;
+ reg.pos.x = x1 + (reg.area.x / 2.0);
+ reg.pos.y = y1 + (reg.area.y / 2.0);
- ganv_item_i2w(GANV_ITEM(node), &pos->x, &pos->y);
+ ganv_item_i2w(GANV_ITEM(node), &reg.pos.x, &reg.pos.y);
+ return reg;
}
inline void
@@ -737,36 +739,24 @@ GanvCanvasImpl::layout_iteration()
if (!GANV_IS_MODULE(*i) && !GANV_IS_CIRCLE(*i)) {
continue;
}
-
GanvNode* const node = GANV_NODE(*i);
- Vector pos;
- Vector area;
- get_pos_area(node, &pos, &area);
+ const Region reg = get_region(node);
FOREACH_ITEM(_items, j) {
- if (i == j || !GANV_IS_NODE(*j)) {
+ if (i == j || (!GANV_IS_MODULE(*i) && !GANV_IS_CIRCLE(*i))) {
continue;
}
-
GanvNode* const node2 = GANV_NODE(*j);
- Vector pos2;
- Vector area2;
- get_pos_area(node2, &pos2, &area2);
-
- const Vector f = repel_force(pos, area, pos2, area2);
-
- apply_force(node, node2, f);
+ const Region reg2 = get_region(node2);
+ apply_force(node, node2, repel_force(reg, reg2));
}
// Add fake long spring to partner to line up as if connected
GanvNode* partner = ganv_node_get_partner(node);
if (partner) {
- Vector ppos;
- Vector parea;
- get_pos_area(partner, &ppos, &parea);
-
- const Vector f = spring_force(ppos, pos, parea.x);
- apply_force(node, partner, f);
+ const Region preg = get_region(partner);
+ apply_force(node, partner,
+ spring_force(preg.pos, reg.pos, preg.area.x));
}
}