From f0b76079535de65a7cd4f9467b5cabc40c12cf54 Mon Sep 17 00:00:00 2001 From: rachytski Date: Sun, 11 Mar 2012 16:57:51 +0400 Subject: [PATCH] optimizing OverlayElements packing. more elements should be displayed without additional drawing penalty. --- yg/info_layer.cpp | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/yg/info_layer.cpp b/yg/info_layer.cpp index d044ec8076..c47c64ad25 100644 --- a/yg/info_layer.cpp +++ b/yg/info_layer.cpp @@ -214,17 +214,27 @@ namespace yg } } - void InfoLayer::merge(InfoLayer const & layer, math::Matrix const & m) - { - layer.m_tree.ForEach(bind(&InfoLayer::processOverlayElement, this, _1, cref(m))); - } - bool greater_priority(shared_ptr const & l, shared_ptr const & r) { return l->visualRank() > r->visualRank(); } + void InfoLayer::merge(InfoLayer const & layer, math::Matrix const & m) + { + vector > v; + + /// 1. collecting all elements from tree + layer.m_tree.ForEach(MakeBackInsertFunctor(v)); + + /// 2. sorting by priority, so the more important ones comes first + sort(v.begin(), v.end(), &greater_priority); + + /// 3. merging them into the infoLayer starting from most + /// important one to optimize the space usage. + for_each(v.begin(), v.end(), bind(&InfoLayer::processOverlayElement, this, _1, cref(m))); + } + void InfoLayer::cache(ResourceStyleCache * stylesCache) { /// collecting elements into vector sorted by visualPriority